From 05ae99a09bf90ea641e70b3f3539fd978d0eef3c Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Wed, 5 Nov 2025 16:49:17 -0500 Subject: [PATCH] fix sidebar modified files --- packages/opencode/src/cli/cmd/tui/context/sync.tsx | 13 ++++++++++++- .../src/cli/cmd/tui/routes/session/sidebar.tsx | 5 +++-- packages/opencode/src/session/index.ts | 7 +++++++ packages/opencode/src/session/summary.ts | 5 +++++ packages/sdk/js/src/gen/types.gen.ts | 9 +++++++++ 5 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx index 4b6b0affb..5d8f1dac8 100644 --- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx @@ -16,6 +16,7 @@ import { createStore, produce, reconcile } from "solid-js/store" import { useSDK } from "@tui/context/sdk" import { Binary } from "@/util/binary" import { createSimpleContext } from "./helper" +import type { Snapshot } from "@/snapshot" export const { use: useSync, provider: SyncProvider } = createSimpleContext({ name: "Sync", @@ -30,6 +31,9 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ } config: Config session: Session[] + session_diff: { + [sessionID: string]: Snapshot.FileDiff[] + } todo: { [sessionID: string]: Todo[] } @@ -52,6 +56,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ command: [], provider: [], session: [], + session_diff: {}, todo: {}, message: {}, part: {}, @@ -104,6 +109,10 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ setStore("todo", event.properties.sessionID, event.properties.todos) break + case "session.diff": + setStore("session_diff", event.properties.sessionID, event.properties.diff) + break + case "session.deleted": { const result = Binary.search(store.session, event.properties.info.id, (s) => s.id) if (result.found) { @@ -260,10 +269,11 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ }, async sync(sessionID: string) { const now = Date.now() - const [session, messages, todo] = await Promise.all([ + const [session, messages, todo, diff] = await Promise.all([ sdk.client.session.get({ path: { id: sessionID }, throwOnError: true }), sdk.client.session.messages({ path: { id: sessionID } }), sdk.client.session.todo({ path: { id: sessionID } }), + sdk.client.session.diff({ path: { id: sessionID } }), ]) console.log("fetched in " + (Date.now() - now), sessionID) setStore( @@ -276,6 +286,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ for (const message of messages.data!) { draft.part[message.info.id] = message.parts } + draft.session_diff[sessionID] = diff.data ?? [] }), ) console.log("synced in " + (Date.now() - now), sessionID) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx index 2f1451a5f..776b80bfd 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx @@ -9,6 +9,7 @@ export function Sidebar(props: { sessionID: string }) { const sync = useSync() const { theme } = useTheme() const session = createMemo(() => sync.session.get(props.sessionID)!) + const diff = createMemo(() => sync.data.session_diff[props.sessionID] ?? []) const todo = createMemo(() => sync.data.todo[props.sessionID] ?? []) const messages = createMemo(() => sync.data.message[props.sessionID] ?? []) @@ -122,12 +123,12 @@ export function Sidebar(props: { sessionID: string }) { - + 0}> Modified Files - + {(item) => { const file = createMemo(() => { const splits = item.file.split(path.sep).filter(Boolean) diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 90eee24e2..4b4d1f5a9 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -103,6 +103,13 @@ export namespace Session { info: Info, }), ), + Diff: Bus.event( + "session.diff", + z.object({ + sessionID: z.string(), + diff: Snapshot.FileDiff.array(), + }), + ), Error: Bus.event( "session.error", z.object({ diff --git a/packages/opencode/src/session/summary.ts b/packages/opencode/src/session/summary.ts index f7ab0fb52..377e75c73 100644 --- a/packages/opencode/src/session/summary.ts +++ b/packages/opencode/src/session/summary.ts @@ -12,6 +12,7 @@ import { Log } from "@/util/log" import path from "path" import { Instance } from "@/project/instance" import { Storage } from "@/storage/storage" +import { Bus } from "@/bus" export namespace SessionSummary { const log = Log.create({ service: "session.summary" }) @@ -51,6 +52,10 @@ export namespace SessionSummary { } }) await Storage.write(["session_diff", input.sessionID], diffs) + Bus.publish(Session.Event.Diff, { + sessionID: input.sessionID, + diff: diffs, + }) } async function summarizeMessage(input: { messageID: string; messages: MessageV2.WithParts[] }) { diff --git a/packages/sdk/js/src/gen/types.gen.ts b/packages/sdk/js/src/gen/types.gen.ts index b25c8bd73..78e98be59 100644 --- a/packages/sdk/js/src/gen/types.gen.ts +++ b/packages/sdk/js/src/gen/types.gen.ts @@ -1300,6 +1300,14 @@ export type EventSessionDeleted = { } } +export type EventSessionDiff = { + type: "session.diff" + properties: { + sessionID: string + diff: Array + } +} + export type EventSessionError = { type: "session.error" properties: { @@ -1346,6 +1354,7 @@ export type Event = | EventSessionCreated | EventSessionUpdated | EventSessionDeleted + | EventSessionDiff | EventSessionError | EventTuiPromptAppend | EventTuiCommandExecute