From 222bddc41a945aec8f18536bda09c0e596748bbd Mon Sep 17 00:00:00 2001
From: Adam <2363879+adamdotdevin@users.noreply.github.com>
Date: Wed, 4 Feb 2026 13:50:56 -0600
Subject: fix(app): last turn changes rendered in review pane (#12182)
---
packages/ui/src/components/session-review.css | 6 +-
packages/ui/src/components/session-review.tsx | 611 +++++++++++++-------------
packages/ui/src/components/session-turn.tsx | 106 +----
packages/ui/src/i18n/ar.ts | 1 +
packages/ui/src/i18n/br.ts | 1 +
packages/ui/src/i18n/da.ts | 1 +
packages/ui/src/i18n/de.ts | 1 +
packages/ui/src/i18n/en.ts | 1 +
packages/ui/src/i18n/es.ts | 1 +
packages/ui/src/i18n/fr.ts | 1 +
packages/ui/src/i18n/ja.ts | 1 +
packages/ui/src/i18n/ko.ts | 1 +
packages/ui/src/i18n/no.ts | 1 +
packages/ui/src/i18n/pl.ts | 1 +
packages/ui/src/i18n/ru.ts | 1 +
packages/ui/src/i18n/th.ts | 1 +
packages/ui/src/i18n/zh.ts | 1 +
packages/ui/src/i18n/zht.ts | 1 +
18 files changed, 329 insertions(+), 409 deletions(-)
(limited to 'packages/ui/src')
diff --git a/packages/ui/src/components/session-review.css b/packages/ui/src/components/session-review.css
index 363343f91..df6df4649 100644
--- a/packages/ui/src/components/session-review.css
+++ b/packages/ui/src/components/session-review.css
@@ -10,9 +10,9 @@
display: none;
}
- /* [data-slot="session-review-container"] { */
- /* height: 100%; */
- /* } */
+ [data-slot="session-review-container"] {
+ flex: 1 1 auto;
+ }
[data-slot="session-review-header"] {
position: sticky;
diff --git a/packages/ui/src/components/session-review.tsx b/packages/ui/src/components/session-review.tsx
index 84ec934e2..70d9fe802 100644
--- a/packages/ui/src/components/session-review.tsx
+++ b/packages/ui/src/components/session-review.tsx
@@ -36,6 +36,8 @@ export type SessionReviewLineComment = {
export type SessionReviewFocus = { file: string; id: string }
export interface SessionReviewProps {
+ title?: JSX.Element
+ empty?: JSX.Element
split?: boolean
diffStyle?: SessionReviewDiffStyle
onDiffStyleChange?: (diffStyle: SessionReviewDiffStyle) => void
@@ -184,6 +186,7 @@ export const SessionReview = (props: SessionReviewProps) => {
const open = () => props.open ?? store.open
const diffStyle = () => props.diffStyle ?? (props.split ? "split" : "unified")
+ const hasDiffs = () => props.diffs.length > 0
const handleChange = (open: string[]) => {
props.onOpenChange?.(open)
@@ -287,9 +290,9 @@ export const SessionReview = (props: SessionReviewProps) => {
[props.classes?.header ?? ""]: !!props.classes?.header,
}}
>
-
{i18n.t("ui.sessionReview.title")}
+ {props.title ?? i18n.t("ui.sessionReview.title")}
-
+
{
onSelect={(style) => style && props.onDiffStyleChange?.(style)}
/>
-
+
+
+
{props.actions}
@@ -315,322 +320,324 @@ export const SessionReview = (props: SessionReviewProps) => {
[props.classes?.container ?? ""]: !!props.classes?.container,
}}
>
-
-
- {(diff) => {
- let wrapper: HTMLDivElement | undefined
-
- const comments = createMemo(() => (props.comments ?? []).filter((c) => c.file === diff.file))
- const commentedLines = createMemo(() => comments().map((c) => c.selection))
-
- const beforeText = () => (typeof diff.before === "string" ? diff.before : "")
- const afterText = () => (typeof diff.after === "string" ? diff.after : "")
-
- const isAdded = () => beforeText().length === 0 && afterText().length > 0
- const isDeleted = () => afterText().length === 0 && beforeText().length > 0
- const isImage = () => isImageFile(diff.file)
- const isAudio = () => isAudioFile(diff.file)
-
- const diffImageSrc = dataUrlFromValue(diff.after) ?? dataUrlFromValue(diff.before)
- const [imageSrc, setImageSrc] = createSignal(diffImageSrc)
- const [imageStatus, setImageStatus] = createSignal<"idle" | "loading" | "error">("idle")
-
- const diffAudioSrc = dataUrlFromValue(diff.after) ?? dataUrlFromValue(diff.before)
- const [audioSrc, setAudioSrc] = createSignal(diffAudioSrc)
- const [audioStatus, setAudioStatus] = createSignal<"idle" | "loading" | "error">("idle")
- const [audioMime, setAudioMime] = createSignal(undefined)
-
- const selectedLines = createMemo(() => {
- const current = selection()
- if (!current || current.file !== diff.file) return null
- return current.range
- })
-
- const draftRange = createMemo(() => {
- const current = commenting()
- if (!current || current.file !== diff.file) return null
- return current.range
- })
-
- const [draft, setDraft] = createSignal("")
- const [positions, setPositions] = createSignal>({})
- const [draftTop, setDraftTop] = createSignal(undefined)
-
- const getRoot = () => {
- const el = wrapper
- if (!el) return
-
- const host = el.querySelector("diffs-container")
- if (!(host instanceof HTMLElement)) return
- return host.shadowRoot ?? undefined
- }
-
- const updateAnchors = () => {
- const el = wrapper
- if (!el) return
-
- const root = getRoot()
- if (!root) return
-
- const next: Record = {}
- for (const item of comments()) {
- const marker = findMarker(root, item.selection)
- if (!marker) continue
- next[item.id] = markerTop(el, marker)
+
+
+
+ {(diff) => {
+ let wrapper: HTMLDivElement | undefined
+
+ const comments = createMemo(() => (props.comments ?? []).filter((c) => c.file === diff.file))
+ const commentedLines = createMemo(() => comments().map((c) => c.selection))
+
+ const beforeText = () => (typeof diff.before === "string" ? diff.before : "")
+ const afterText = () => (typeof diff.after === "string" ? diff.after : "")
+
+ const isAdded = () => beforeText().length === 0 && afterText().length > 0
+ const isDeleted = () => afterText().length === 0 && beforeText().length > 0
+ const isImage = () => isImageFile(diff.file)
+ const isAudio = () => isAudioFile(diff.file)
+
+ const diffImageSrc = dataUrlFromValue(diff.after) ?? dataUrlFromValue(diff.before)
+ const [imageSrc, setImageSrc] = createSignal(diffImageSrc)
+ const [imageStatus, setImageStatus] = createSignal<"idle" | "loading" | "error">("idle")
+
+ const diffAudioSrc = dataUrlFromValue(diff.after) ?? dataUrlFromValue(diff.before)
+ const [audioSrc, setAudioSrc] = createSignal(diffAudioSrc)
+ const [audioStatus, setAudioStatus] = createSignal<"idle" | "loading" | "error">("idle")
+ const [audioMime, setAudioMime] = createSignal(undefined)
+
+ const selectedLines = createMemo(() => {
+ const current = selection()
+ if (!current || current.file !== diff.file) return null
+ return current.range
+ })
+
+ const draftRange = createMemo(() => {
+ const current = commenting()
+ if (!current || current.file !== diff.file) return null
+ return current.range
+ })
+
+ const [draft, setDraft] = createSignal("")
+ const [positions, setPositions] = createSignal>({})
+ const [draftTop, setDraftTop] = createSignal(undefined)
+
+ const getRoot = () => {
+ const el = wrapper
+ if (!el) return
+
+ const host = el.querySelector("diffs-container")
+ if (!(host instanceof HTMLElement)) return
+ return host.shadowRoot ?? undefined
}
- setPositions(next)
- const range = draftRange()
- if (!range) {
- setDraftTop(undefined)
- return
+ const updateAnchors = () => {
+ const el = wrapper
+ if (!el) return
+
+ const root = getRoot()
+ if (!root) return
+
+ const next: Record = {}
+ for (const item of comments()) {
+ const marker = findMarker(root, item.selection)
+ if (!marker) continue
+ next[item.id] = markerTop(el, marker)
+ }
+ setPositions(next)
+
+ const range = draftRange()
+ if (!range) {
+ setDraftTop(undefined)
+ return
+ }
+
+ const marker = findMarker(root, range)
+ if (!marker) {
+ setDraftTop(undefined)
+ return
+ }
+
+ setDraftTop(markerTop(el, marker))
}
- const marker = findMarker(root, range)
- if (!marker) {
- setDraftTop(undefined)
- return
+ const scheduleAnchors = () => {
+ requestAnimationFrame(updateAnchors)
}
- setDraftTop(markerTop(el, marker))
- }
-
- const scheduleAnchors = () => {
- requestAnimationFrame(updateAnchors)
- }
-
- createEffect(() => {
- comments()
- scheduleAnchors()
- })
-
- createEffect(() => {
- const range = draftRange()
- if (!range) return
- setDraft("")
- scheduleAnchors()
- })
-
- createEffect(() => {
- if (!open().includes(diff.file)) return
- if (!isImage()) return
- if (imageSrc()) return
- if (imageStatus() !== "idle") return
-
- const reader = props.readFile
- if (!reader) return
-
- setImageStatus("loading")
- reader(diff.file)
- .then((result) => {
- const src = dataUrl(result)
- if (!src) {
+ createEffect(() => {
+ comments()
+ scheduleAnchors()
+ })
+
+ createEffect(() => {
+ const range = draftRange()
+ if (!range) return
+ setDraft("")
+ scheduleAnchors()
+ })
+
+ createEffect(() => {
+ if (!open().includes(diff.file)) return
+ if (!isImage()) return
+ if (imageSrc()) return
+ if (imageStatus() !== "idle") return
+
+ const reader = props.readFile
+ if (!reader) return
+
+ setImageStatus("loading")
+ reader(diff.file)
+ .then((result) => {
+ const src = dataUrl(result)
+ if (!src) {
+ setImageStatus("error")
+ return
+ }
+ setImageSrc(src)
+ setImageStatus("idle")
+ })
+ .catch(() => {
setImageStatus("error")
- return
- }
- setImageSrc(src)
- setImageStatus("idle")
- })
- .catch(() => {
- setImageStatus("error")
- })
- })
-
- createEffect(() => {
- if (!open().includes(diff.file)) return
- if (!isAudio()) return
- if (audioSrc()) return
- if (audioStatus() !== "idle") return
-
- const reader = props.readFile
- if (!reader) return
-
- setAudioStatus("loading")
- reader(diff.file)
- .then((result) => {
- const src = dataUrl(result)
- if (!src) {
+ })
+ })
+
+ createEffect(() => {
+ if (!open().includes(diff.file)) return
+ if (!isAudio()) return
+ if (audioSrc()) return
+ if (audioStatus() !== "idle") return
+
+ const reader = props.readFile
+ if (!reader) return
+
+ setAudioStatus("loading")
+ reader(diff.file)
+ .then((result) => {
+ const src = dataUrl(result)
+ if (!src) {
+ setAudioStatus("error")
+ return
+ }
+ setAudioMime(normalizeMimeType(result?.mimeType))
+ setAudioSrc(src)
+ setAudioStatus("idle")
+ })
+ .catch(() => {
setAudioStatus("error")
- return
- }
- setAudioMime(normalizeMimeType(result?.mimeType))
- setAudioSrc(src)
- setAudioStatus("idle")
- })
- .catch(() => {
- setAudioStatus("error")
- })
- })
-
- const handleLineSelected = (range: SelectedLineRange | null) => {
- if (!props.onLineComment) return
-
- if (!range) {
- setSelection(null)
- return
- }
+ })
+ })
- setSelection({ file: diff.file, range })
- }
+ const handleLineSelected = (range: SelectedLineRange | null) => {
+ if (!props.onLineComment) return
- const handleLineSelectionEnd = (range: SelectedLineRange | null) => {
- if (!props.onLineComment) return
+ if (!range) {
+ setSelection(null)
+ return
+ }
- if (!range) {
- setCommenting(null)
- return
+ setSelection({ file: diff.file, range })
}
- setSelection({ file: diff.file, range })
- setCommenting({ file: diff.file, range })
- }
+ const handleLineSelectionEnd = (range: SelectedLineRange | null) => {
+ if (!props.onLineComment) return
- const openComment = (comment: SessionReviewComment) => {
- setOpened({ file: comment.file, id: comment.id })
- setSelection({ file: comment.file, range: comment.selection })
- }
+ if (!range) {
+ setCommenting(null)
+ return
+ }
- const isCommentOpen = (comment: SessionReviewComment) => {
- const current = opened()
- if (!current) return false
- return current.file === comment.file && current.id === comment.id
- }
+ setSelection({ file: diff.file, range })
+ setCommenting({ file: diff.file, range })
+ }
- return (
-
-
-
-
-
-
-
-
- {`\u202A${getDirectory(diff.file)}\u202C`}
-
-
{getFilename(diff.file)}
-
-
-
+ const openComment = (comment: SessionReviewComment) => {
+ setOpened({ file: comment.file, id: comment.id })
+ setSelection({ file: comment.file, range: comment.selection })
+ }
+
+ const isCommentOpen = (comment: SessionReviewComment) => {
+ const current = opened()
+ if (!current) return false
+ return current.file === comment.file && current.id === comment.id
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ {`\u202A${getDirectory(diff.file)}\u202C`}
+
+ {getFilename(diff.file)}
+
+
+
+
+
+
+
+
+
+ {i18n.t("ui.sessionReview.change.added")}
+
+
+
+
+ {i18n.t("ui.sessionReview.change.removed")}
+
+
+
+
+
+
+
-
-
-
-
- {i18n.t("ui.sessionReview.change.added")}
-
-
-
-
- {i18n.t("ui.sessionReview.change.removed")}
-
-
-
-
-
-
-
-
-
-
-
-
- {
- wrapper = el
- anchors.set(diff.file, el)
- scheduleAnchors()
- }}
- >
-
{
- props.onDiffRendered?.()
+
+
+
+ {
+ wrapper = el
+ anchors.set(diff.file, el)
scheduleAnchors()
}}
- enableLineSelection={props.onLineComment != null}
- onLineSelected={handleLineSelected}
- onLineSelectionEnd={handleLineSelectionEnd}
- selectedLines={selectedLines()}
- commentedLines={commentedLines()}
- before={{
- name: diff.file!,
- contents: typeof diff.before === "string" ? diff.before : "",
- }}
- after={{
- name: diff.file!,
- contents: typeof diff.after === "string" ? diff.after : "",
- }}
- />
-
-
- {(comment) => (
-
-
-
- {(range) => (
-
- setCommenting(null)}
- onSubmit={(comment) => {
- props.onLineComment?.({
- file: diff.file,
- selection: range(),
- comment,
- preview: selectionPreview(diff, range()),
- })
- setCommenting(null)
+ >
+ {
+ props.onDiffRendered?.()
+ scheduleAnchors()
+ }}
+ enableLineSelection={props.onLineComment != null}
+ onLineSelected={handleLineSelected}
+ onLineSelectionEnd={handleLineSelectionEnd}
+ selectedLines={selectedLines()}
+ commentedLines={commentedLines()}
+ before={{
+ name: diff.file!,
+ contents: typeof diff.before === "string" ? diff.before : "",
+ }}
+ after={{
+ name: diff.file!,
+ contents: typeof diff.after === "string" ? diff.after : "",
+ }}
+ />
+
+
+ {(comment) => (
+
- )}
-
-
-
-
- )
- }}
-
-
+ )}
+
+
+
+ {(range) => (
+
+ setCommenting(null)}
+ onSubmit={(comment) => {
+ props.onLineComment?.({
+ file: diff.file,
+ selection: range(),
+ comment,
+ preview: selectionPreview(diff, range()),
+ })
+ setCommenting(null)
+ }}
+ />
+
+ )}
+
+
+
+
+ )
+ }}
+
+
+
)
diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx
index d878bd245..7c5694ba5 100644
--- a/packages/ui/src/components/session-turn.tsx
+++ b/packages/ui/src/components/session-turn.tsx
@@ -8,25 +8,16 @@ import {
TextPart,
ToolPart,
} from "@opencode-ai/sdk/v2/client"
-import { type FileDiff } from "@opencode-ai/sdk/v2"
import { useData } from "../context"
-import { useDiffComponent } from "../context/diff"
import { type UiI18nKey, type UiI18nParams, useI18n } from "../context/i18n"
import { findLast } from "@opencode-ai/util/array"
-import { getDirectory, getFilename } from "@opencode-ai/util/path"
import { Binary } from "@opencode-ai/util/binary"
import { createEffect, createMemo, createSignal, For, Match, on, onCleanup, ParentProps, Show, Switch } from "solid-js"
-import { DiffChanges } from "./diff-changes"
import { Message, Part } from "./message-part"
import { Markdown } from "./markdown"
-import { Accordion } from "./accordion"
-import { StickyAccordionHeader } from "./sticky-accordion-header"
-import { FileIcon } from "./file-icon"
-import { Icon } from "./icon"
import { IconButton } from "./icon-button"
import { Card } from "./card"
-import { Dynamic } from "solid-js/web"
import { Button } from "./button"
import { Spinner } from "./spinner"
import { Tooltip } from "./tooltip"
@@ -143,7 +134,6 @@ export function SessionTurn(
) {
const i18n = useI18n()
const data = useData()
- const diffComponent = useDiffComponent()
const emptyMessages: MessageType[] = []
const emptyParts: PartType[] = []
@@ -153,7 +143,6 @@ export function SessionTurn(
const emptyPermissionParts: { part: ToolPart; message: AssistantMessage }[] = []
const emptyQuestions: QuestionRequest[] = []
const emptyQuestionParts: { part: ToolPart; message: AssistantMessage }[] = []
- const emptyDiffs: FileDiff[] = []
const idle = { type: "idle" as const }
const allMessages = createMemo(() => data.store.message[props.sessionID] ?? emptyMessages)
@@ -409,8 +398,7 @@ export function SessionTurn(
const response = createMemo(() => lastTextPart()?.text)
const responsePartId = createMemo(() => lastTextPart()?.id)
- const messageDiffs = createMemo(() => message()?.summary?.diffs ?? emptyDiffs)
- const hasDiffs = createMemo(() => messageDiffs().length > 0)
+ const hasDiffs = createMemo(() => (message()?.summary?.diffs?.length ?? 0) > 0)
const hideResponsePart = createMemo(() => !working() && !!responsePartId())
const [copied, setCopied] = createSignal(false)
@@ -476,28 +464,12 @@ export function SessionTurn(
updateStickyHeight(sticky.getBoundingClientRect().height)
})
- const diffInit = 20
- const diffBatch = 20
-
const [store, setStore] = createStore({
retrySeconds: 0,
- diffsOpen: [] as string[],
- diffLimit: diffInit,
status: rawStatus(),
duration: duration(),
})
- createEffect(
- on(
- () => message()?.id,
- () => {
- setStore("diffsOpen", [])
- setStore("diffLimit", diffInit)
- },
- { defer: true },
- ),
- )
-
createEffect(() => {
const r = retry()
if (!r) {
@@ -727,7 +699,7 @@ export function SessionTurn(
{!working() && response() ? response() : ""}
-
+
{i18n.t("ui.sessionTurn.summary.response")}
@@ -760,80 +732,6 @@ export function SessionTurn(
- {
- if (!Array.isArray(value)) return
- setStore("diffsOpen", value)
- }}
- >
-
- {(diff) => (
-
-
-
-
-
-
-
-
-
- {`\u202A${getDirectory(diff.file)}\u202C`}
-
-
- {getFilename(diff.file)}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )}
-
-
- store.diffLimit}>
-
-
diff --git a/packages/ui/src/i18n/ar.ts b/packages/ui/src/i18n/ar.ts
index fc99bdacb..d1abf5de3 100644
--- a/packages/ui/src/i18n/ar.ts
+++ b/packages/ui/src/i18n/ar.ts
@@ -1,5 +1,6 @@
export const dict = {
"ui.sessionReview.title": "تغييرات الجلسة",
+ "ui.sessionReview.title.lastTurn": "تغييرات آخر دور",
"ui.sessionReview.diffStyle.unified": "موجد",
"ui.sessionReview.diffStyle.split": "منقسم",
"ui.sessionReview.expandAll": "توسيع الكل",
diff --git a/packages/ui/src/i18n/br.ts b/packages/ui/src/i18n/br.ts
index fdec9138a..36bef2650 100644
--- a/packages/ui/src/i18n/br.ts
+++ b/packages/ui/src/i18n/br.ts
@@ -1,5 +1,6 @@
export const dict = {
"ui.sessionReview.title": "Alterações da sessão",
+ "ui.sessionReview.title.lastTurn": "Alterações do último turno",
"ui.sessionReview.diffStyle.unified": "Unificado",
"ui.sessionReview.diffStyle.split": "Dividido",
"ui.sessionReview.expandAll": "Expandir tudo",
diff --git a/packages/ui/src/i18n/da.ts b/packages/ui/src/i18n/da.ts
index fbe34e03f..0142d161f 100644
--- a/packages/ui/src/i18n/da.ts
+++ b/packages/ui/src/i18n/da.ts
@@ -1,5 +1,6 @@
export const dict = {
"ui.sessionReview.title": "Sessionsændringer",
+ "ui.sessionReview.title.lastTurn": "Ændringer fra sidste tur",
"ui.sessionReview.diffStyle.unified": "Samlet",
"ui.sessionReview.diffStyle.split": "Opdelt",
"ui.sessionReview.expandAll": "Udvid alle",
diff --git a/packages/ui/src/i18n/de.ts b/packages/ui/src/i18n/de.ts
index d74cd5d22..e004233f6 100644
--- a/packages/ui/src/i18n/de.ts
+++ b/packages/ui/src/i18n/de.ts
@@ -4,6 +4,7 @@ type Keys = keyof typeof en
export const dict = {
"ui.sessionReview.title": "Sitzungsänderungen",
+ "ui.sessionReview.title.lastTurn": "Änderungen der letzten Runde",
"ui.sessionReview.diffStyle.unified": "Vereinheitlicht",
"ui.sessionReview.diffStyle.split": "Geteilt",
"ui.sessionReview.expandAll": "Alle erweitern",
diff --git a/packages/ui/src/i18n/en.ts b/packages/ui/src/i18n/en.ts
index 8c0f09cb3..a92a498c9 100644
--- a/packages/ui/src/i18n/en.ts
+++ b/packages/ui/src/i18n/en.ts
@@ -1,5 +1,6 @@
export const dict = {
"ui.sessionReview.title": "Session changes",
+ "ui.sessionReview.title.lastTurn": "Last turn changes",
"ui.sessionReview.diffStyle.unified": "Unified",
"ui.sessionReview.diffStyle.split": "Split",
"ui.sessionReview.expandAll": "Expand all",
diff --git a/packages/ui/src/i18n/es.ts b/packages/ui/src/i18n/es.ts
index 3f71a98ac..283548bb3 100644
--- a/packages/ui/src/i18n/es.ts
+++ b/packages/ui/src/i18n/es.ts
@@ -1,5 +1,6 @@
export const dict = {
"ui.sessionReview.title": "Cambios de la sesión",
+ "ui.sessionReview.title.lastTurn": "Cambios del último turno",
"ui.sessionReview.diffStyle.unified": "Unificado",
"ui.sessionReview.diffStyle.split": "Dividido",
"ui.sessionReview.expandAll": "Expandir todo",
diff --git a/packages/ui/src/i18n/fr.ts b/packages/ui/src/i18n/fr.ts
index 0ec70509a..e9ab8bf8a 100644
--- a/packages/ui/src/i18n/fr.ts
+++ b/packages/ui/src/i18n/fr.ts
@@ -1,5 +1,6 @@
export const dict = {
"ui.sessionReview.title": "Modifications de la session",
+ "ui.sessionReview.title.lastTurn": "Modifications du dernier tour",
"ui.sessionReview.diffStyle.unified": "Unifié",
"ui.sessionReview.diffStyle.split": "Divisé",
"ui.sessionReview.expandAll": "Tout développer",
diff --git a/packages/ui/src/i18n/ja.ts b/packages/ui/src/i18n/ja.ts
index fd3f24ab3..4da2578d3 100644
--- a/packages/ui/src/i18n/ja.ts
+++ b/packages/ui/src/i18n/ja.ts
@@ -1,5 +1,6 @@
export const dict = {
"ui.sessionReview.title": "セッションの変更",
+ "ui.sessionReview.title.lastTurn": "前回ターンの変更",
"ui.sessionReview.diffStyle.unified": "Unified",
"ui.sessionReview.diffStyle.split": "Split",
"ui.sessionReview.expandAll": "すべて展開",
diff --git a/packages/ui/src/i18n/ko.ts b/packages/ui/src/i18n/ko.ts
index e419f730a..9fb120b5e 100644
--- a/packages/ui/src/i18n/ko.ts
+++ b/packages/ui/src/i18n/ko.ts
@@ -1,5 +1,6 @@
export const dict = {
"ui.sessionReview.title": "세션 변경 사항",
+ "ui.sessionReview.title.lastTurn": "마지막 턴 변경 사항",
"ui.sessionReview.diffStyle.unified": "통합 보기",
"ui.sessionReview.diffStyle.split": "분할 보기",
"ui.sessionReview.expandAll": "모두 펼치기",
diff --git a/packages/ui/src/i18n/no.ts b/packages/ui/src/i18n/no.ts
index 4433b8114..e578e3cdf 100644
--- a/packages/ui/src/i18n/no.ts
+++ b/packages/ui/src/i18n/no.ts
@@ -3,6 +3,7 @@ type Keys = keyof typeof en
export const dict: Record = {
"ui.sessionReview.title": "Sesjonsendringer",
+ "ui.sessionReview.title.lastTurn": "Endringer i siste tur",
"ui.sessionReview.diffStyle.unified": "Samlet",
"ui.sessionReview.diffStyle.split": "Delt",
"ui.sessionReview.expandAll": "Utvid alle",
diff --git a/packages/ui/src/i18n/pl.ts b/packages/ui/src/i18n/pl.ts
index efe4bf6cf..0690a7581 100644
--- a/packages/ui/src/i18n/pl.ts
+++ b/packages/ui/src/i18n/pl.ts
@@ -1,5 +1,6 @@
export const dict = {
"ui.sessionReview.title": "Zmiany w sesji",
+ "ui.sessionReview.title.lastTurn": "Zmiany z ostatniej tury",
"ui.sessionReview.diffStyle.unified": "Ujednolicony",
"ui.sessionReview.diffStyle.split": "Podzielony",
"ui.sessionReview.expandAll": "Rozwiń wszystko",
diff --git a/packages/ui/src/i18n/ru.ts b/packages/ui/src/i18n/ru.ts
index 60e63455d..d5a5b59fa 100644
--- a/packages/ui/src/i18n/ru.ts
+++ b/packages/ui/src/i18n/ru.ts
@@ -1,5 +1,6 @@
export const dict = {
"ui.sessionReview.title": "Изменения сессии",
+ "ui.sessionReview.title.lastTurn": "Изменения последнего хода",
"ui.sessionReview.diffStyle.unified": "Объединённый",
"ui.sessionReview.diffStyle.split": "Разделённый",
"ui.sessionReview.expandAll": "Развернуть всё",
diff --git a/packages/ui/src/i18n/th.ts b/packages/ui/src/i18n/th.ts
index 9c7e6fae5..097a2dab0 100644
--- a/packages/ui/src/i18n/th.ts
+++ b/packages/ui/src/i18n/th.ts
@@ -1,5 +1,6 @@
export const dict = {
"ui.sessionReview.title": "การเปลี่ยนแปลงเซสชัน",
+ "ui.sessionReview.title.lastTurn": "การเปลี่ยนแปลงของเทิร์นล่าสุด",
"ui.sessionReview.diffStyle.unified": "แบบรวม",
"ui.sessionReview.diffStyle.split": "แบบแยก",
"ui.sessionReview.expandAll": "ขยายทั้งหมด",
diff --git a/packages/ui/src/i18n/zh.ts b/packages/ui/src/i18n/zh.ts
index 4ea477792..25f36b3cd 100644
--- a/packages/ui/src/i18n/zh.ts
+++ b/packages/ui/src/i18n/zh.ts
@@ -4,6 +4,7 @@ type Keys = keyof typeof en
export const dict = {
"ui.sessionReview.title": "会话变更",
+ "ui.sessionReview.title.lastTurn": "上一轮变更",
"ui.sessionReview.diffStyle.unified": "统一",
"ui.sessionReview.diffStyle.split": "拆分",
"ui.sessionReview.expandAll": "全部展开",
diff --git a/packages/ui/src/i18n/zht.ts b/packages/ui/src/i18n/zht.ts
index c5ef99cda..ebc096cbf 100644
--- a/packages/ui/src/i18n/zht.ts
+++ b/packages/ui/src/i18n/zht.ts
@@ -4,6 +4,7 @@ type Keys = keyof typeof en
export const dict = {
"ui.sessionReview.title": "工作階段變更",
+ "ui.sessionReview.title.lastTurn": "上一輪變更",
"ui.sessionReview.diffStyle.unified": "整合",
"ui.sessionReview.diffStyle.split": "拆分",
"ui.sessionReview.expandAll": "全部展開",
--
cgit v1.2.3