mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-19 16:54:22 +01:00
fix sidebar modified files
This commit is contained in:
@@ -16,6 +16,7 @@ import { createStore, produce, reconcile } from "solid-js/store"
|
|||||||
import { useSDK } from "@tui/context/sdk"
|
import { useSDK } from "@tui/context/sdk"
|
||||||
import { Binary } from "@/util/binary"
|
import { Binary } from "@/util/binary"
|
||||||
import { createSimpleContext } from "./helper"
|
import { createSimpleContext } from "./helper"
|
||||||
|
import type { Snapshot } from "@/snapshot"
|
||||||
|
|
||||||
export const { use: useSync, provider: SyncProvider } = createSimpleContext({
|
export const { use: useSync, provider: SyncProvider } = createSimpleContext({
|
||||||
name: "Sync",
|
name: "Sync",
|
||||||
@@ -30,6 +31,9 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
|
|||||||
}
|
}
|
||||||
config: Config
|
config: Config
|
||||||
session: Session[]
|
session: Session[]
|
||||||
|
session_diff: {
|
||||||
|
[sessionID: string]: Snapshot.FileDiff[]
|
||||||
|
}
|
||||||
todo: {
|
todo: {
|
||||||
[sessionID: string]: Todo[]
|
[sessionID: string]: Todo[]
|
||||||
}
|
}
|
||||||
@@ -52,6 +56,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
|
|||||||
command: [],
|
command: [],
|
||||||
provider: [],
|
provider: [],
|
||||||
session: [],
|
session: [],
|
||||||
|
session_diff: {},
|
||||||
todo: {},
|
todo: {},
|
||||||
message: {},
|
message: {},
|
||||||
part: {},
|
part: {},
|
||||||
@@ -104,6 +109,10 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
|
|||||||
setStore("todo", event.properties.sessionID, event.properties.todos)
|
setStore("todo", event.properties.sessionID, event.properties.todos)
|
||||||
break
|
break
|
||||||
|
|
||||||
|
case "session.diff":
|
||||||
|
setStore("session_diff", event.properties.sessionID, event.properties.diff)
|
||||||
|
break
|
||||||
|
|
||||||
case "session.deleted": {
|
case "session.deleted": {
|
||||||
const result = Binary.search(store.session, event.properties.info.id, (s) => s.id)
|
const result = Binary.search(store.session, event.properties.info.id, (s) => s.id)
|
||||||
if (result.found) {
|
if (result.found) {
|
||||||
@@ -260,10 +269,11 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
|
|||||||
},
|
},
|
||||||
async sync(sessionID: string) {
|
async sync(sessionID: string) {
|
||||||
const now = Date.now()
|
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.get({ path: { id: sessionID }, throwOnError: true }),
|
||||||
sdk.client.session.messages({ path: { id: sessionID } }),
|
sdk.client.session.messages({ path: { id: sessionID } }),
|
||||||
sdk.client.session.todo({ 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)
|
console.log("fetched in " + (Date.now() - now), sessionID)
|
||||||
setStore(
|
setStore(
|
||||||
@@ -276,6 +286,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
|
|||||||
for (const message of messages.data!) {
|
for (const message of messages.data!) {
|
||||||
draft.part[message.info.id] = message.parts
|
draft.part[message.info.id] = message.parts
|
||||||
}
|
}
|
||||||
|
draft.session_diff[sessionID] = diff.data ?? []
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
console.log("synced in " + (Date.now() - now), sessionID)
|
console.log("synced in " + (Date.now() - now), sessionID)
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ export function Sidebar(props: { sessionID: string }) {
|
|||||||
const sync = useSync()
|
const sync = useSync()
|
||||||
const { theme } = useTheme()
|
const { theme } = useTheme()
|
||||||
const session = createMemo(() => sync.session.get(props.sessionID)!)
|
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 todo = createMemo(() => sync.data.todo[props.sessionID] ?? [])
|
||||||
const messages = createMemo(() => sync.data.message[props.sessionID] ?? [])
|
const messages = createMemo(() => sync.data.message[props.sessionID] ?? [])
|
||||||
|
|
||||||
@@ -122,12 +123,12 @@ export function Sidebar(props: { sessionID: string }) {
|
|||||||
</For>
|
</For>
|
||||||
</box>
|
</box>
|
||||||
</Show>
|
</Show>
|
||||||
<Show when={session().summary?.diffs}>
|
<Show when={diff().length > 0}>
|
||||||
<box>
|
<box>
|
||||||
<text fg={theme.text}>
|
<text fg={theme.text}>
|
||||||
<b>Modified Files</b>
|
<b>Modified Files</b>
|
||||||
</text>
|
</text>
|
||||||
<For each={session().summary?.diffs || []}>
|
<For each={diff() || []}>
|
||||||
{(item) => {
|
{(item) => {
|
||||||
const file = createMemo(() => {
|
const file = createMemo(() => {
|
||||||
const splits = item.file.split(path.sep).filter(Boolean)
|
const splits = item.file.split(path.sep).filter(Boolean)
|
||||||
|
|||||||
@@ -103,6 +103,13 @@ export namespace Session {
|
|||||||
info: Info,
|
info: Info,
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
|
Diff: Bus.event(
|
||||||
|
"session.diff",
|
||||||
|
z.object({
|
||||||
|
sessionID: z.string(),
|
||||||
|
diff: Snapshot.FileDiff.array(),
|
||||||
|
}),
|
||||||
|
),
|
||||||
Error: Bus.event(
|
Error: Bus.event(
|
||||||
"session.error",
|
"session.error",
|
||||||
z.object({
|
z.object({
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import { Log } from "@/util/log"
|
|||||||
import path from "path"
|
import path from "path"
|
||||||
import { Instance } from "@/project/instance"
|
import { Instance } from "@/project/instance"
|
||||||
import { Storage } from "@/storage/storage"
|
import { Storage } from "@/storage/storage"
|
||||||
|
import { Bus } from "@/bus"
|
||||||
|
|
||||||
export namespace SessionSummary {
|
export namespace SessionSummary {
|
||||||
const log = Log.create({ service: "session.summary" })
|
const log = Log.create({ service: "session.summary" })
|
||||||
@@ -51,6 +52,10 @@ export namespace SessionSummary {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
await Storage.write(["session_diff", input.sessionID], diffs)
|
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[] }) {
|
async function summarizeMessage(input: { messageID: string; messages: MessageV2.WithParts[] }) {
|
||||||
|
|||||||
@@ -1300,6 +1300,14 @@ export type EventSessionDeleted = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type EventSessionDiff = {
|
||||||
|
type: "session.diff"
|
||||||
|
properties: {
|
||||||
|
sessionID: string
|
||||||
|
diff: Array<FileDiff>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export type EventSessionError = {
|
export type EventSessionError = {
|
||||||
type: "session.error"
|
type: "session.error"
|
||||||
properties: {
|
properties: {
|
||||||
@@ -1346,6 +1354,7 @@ export type Event =
|
|||||||
| EventSessionCreated
|
| EventSessionCreated
|
||||||
| EventSessionUpdated
|
| EventSessionUpdated
|
||||||
| EventSessionDeleted
|
| EventSessionDeleted
|
||||||
|
| EventSessionDiff
|
||||||
| EventSessionError
|
| EventSessionError
|
||||||
| EventTuiPromptAppend
|
| EventTuiPromptAppend
|
||||||
| EventTuiCommandExecute
|
| EventTuiCommandExecute
|
||||||
|
|||||||
Reference in New Issue
Block a user