Dax Raad 3 месяцев назад
Родитель
Сommit
05ae99a09b

+ 12 - 1
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)

+ 3 - 2
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 }) {
               </For>
             </box>
           </Show>
-          <Show when={session().summary?.diffs}>
+          <Show when={diff().length > 0}>
             <box>
               <text fg={theme.text}>
                 <b>Modified Files</b>
               </text>
-              <For each={session().summary?.diffs || []}>
+              <For each={diff() || []}>
                 {(item) => {
                   const file = createMemo(() => {
                     const splits = item.file.split(path.sep).filter(Boolean)

+ 7 - 0
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({

+ 5 - 0
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[] }) {

+ 9 - 0
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<FileDiff>
+  }
+}
+
 export type EventSessionError = {
   type: "session.error"
   properties: {
@@ -1346,6 +1354,7 @@ export type Event =
   | EventSessionCreated
   | EventSessionUpdated
   | EventSessionDeleted
+  | EventSessionDiff
   | EventSessionError
   | EventTuiPromptAppend
   | EventTuiCommandExecute