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) => ( - setSelection({ file: comment.file, range: comment.selection })} - onClick={() => { - if (isCommentOpen(comment)) { - setOpened(null) - return - } - - openComment(comment) - }} - open={isCommentOpen(comment)} - comment={comment.comment} - selection={selectionLabel(comment.selection)} - /> - )} - - - - {(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) => ( + setSelection({ file: comment.file, range: comment.selection })} + onClick={() => { + if (isCommentOpen(comment)) { + setOpened(null) + return + } + + openComment(comment) }} + open={isCommentOpen(comment)} + comment={comment.comment} + selection={selectionLabel(comment.selection)} /> - - )} - -
-
- - ) - }} - - + )} + + + + {(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