diff options
| author | Adam <[email protected]> | 2025-12-29 08:21:32 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-12-29 08:21:32 -0600 |
| commit | c0f9b136309f870e45412fdc733e1b989e8146c7 (patch) | |
| tree | 1fbe6d3612fb721be84d6979bf889840971fead8 /packages/app/src | |
| parent | 98fd53fd5f4e66140a2eb267e6cf7547836988e5 (diff) | |
| download | opencode-c0f9b136309f870e45412fdc733e1b989e8146c7.tar.gz opencode-c0f9b136309f870e45412fdc733e1b989e8146c7.zip | |
fix(desktop): more fine-grained state updates
Diffstat (limited to 'packages/app/src')
| -rw-r--r-- | packages/app/src/context/global-sync.tsx | 5 | ||||
| -rw-r--r-- | packages/app/src/context/sync.tsx | 60 | ||||
| -rw-r--r-- | packages/app/src/pages/session.tsx | 8 |
3 files changed, 46 insertions, 27 deletions
diff --git a/packages/app/src/context/global-sync.tsx b/packages/app/src/context/global-sync.tsx index a496d59cb..0296dfad3 100644 --- a/packages/app/src/context/global-sync.tsx +++ b/packages/app/src/context/global-sync.tsx @@ -71,21 +71,19 @@ function createGlobalSync() { project: Project[] provider: ProviderListResponse provider_auth: ProviderAuthResponse - children: Record<string, State> }>({ ready: false, path: { state: "", config: "", worktree: "", directory: "", home: "" }, project: [], provider: { all: [], connected: [], default: {} }, provider_auth: {}, - children: {}, }) const children: Record<string, ReturnType<typeof createStore<State>>> = {} function child(directory: string) { if (!directory) console.error("No directory provided") if (!children[directory]) { - setGlobalStore("children", directory, { + children[directory] = createStore<State>({ project: "", provider: { all: [], connected: [], default: {} }, config: {}, @@ -105,7 +103,6 @@ function createGlobalSync() { message: {}, part: {}, }) - children[directory] = createStore(globalStore.children[directory]) bootstrapInstance(directory) } return children[directory] diff --git a/packages/app/src/context/sync.tsx b/packages/app/src/context/sync.tsx index 941b8b629..dad035fb3 100644 --- a/packages/app/src/context/sync.tsx +++ b/packages/app/src/context/sync.tsx @@ -1,5 +1,5 @@ -import { produce } from "solid-js/store" -import { createMemo } from "solid-js" +import { batch, createMemo } from "solid-js" +import { produce, reconcile } from "solid-js/store" import { Binary } from "@opencode-ai/util/binary" import { retry } from "@opencode-ai/util/retry" import { createSimpleContext } from "@opencode-ai/ui/context" @@ -67,22 +67,46 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ retry(() => sdk.client.session.todo({ sessionID })), retry(() => sdk.client.session.diff({ sessionID })), ]) - setStore( - produce((draft) => { - const match = Binary.search(draft.session, sessionID, (s) => s.id) - if (match.found) draft.session[match.index] = session.data! - if (!match.found) draft.session.splice(match.index, 0, session.data!) - draft.todo[sessionID] = todo.data ?? [] - draft.message[sessionID] = messages - .data!.map((x) => x.info) - .slice() - .sort((a, b) => a.id.localeCompare(b.id)) - for (const message of messages.data!) { - draft.part[message.info.id] = message.parts.slice().sort((a, b) => a.id.localeCompare(b.id)) - } - draft.session_diff[sessionID] = diff.data ?? [] - }), - ) + + batch(() => { + setStore( + "session", + produce((draft) => { + const match = Binary.search(draft, sessionID, (s) => s.id) + if (match.found) { + draft[match.index] = session.data! + return + } + draft.splice(match.index, 0, session.data!) + }), + ) + + setStore("todo", sessionID, reconcile(todo.data ?? [])) + setStore( + "message", + sessionID, + reconcile( + (messages.data ?? []) + .map((x) => x.info) + .slice() + .sort((a, b) => a.id.localeCompare(b.id)), + { key: "id" }, + ), + ) + + for (const message of messages.data ?? []) { + setStore( + "part", + message.info.id, + reconcile( + message.parts.slice().sort((a, b) => a.id.localeCompare(b.id)), + { key: "id" }, + ), + ) + } + + setStore("session_diff", sessionID, reconcile(diff.data ?? [], { key: "file" })) + }) }, fetch: async (count = 10) => { setStore("limit", (x) => x + count) diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index ec55acf1e..6bc39daca 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -79,11 +79,7 @@ export default function Page() { const info = createMemo(() => (params.id ? sync.session.get(params.id) : undefined)) const revertMessageID = createMemo(() => info()?.revert?.messageID) const messages = createMemo(() => (params.id ? (sync.data.message[params.id] ?? []) : [])) - const userMessages = createMemo(() => - messages() - .filter((m) => m.role === "user") - .sort((a, b) => a.id.localeCompare(b.id)), - ) + const userMessages = createMemo(() => messages().filter((m) => m.role === "user")) const visibleUserMessages = createMemo(() => { const revert = revertMessageID() if (!revert) return userMessages() @@ -587,6 +583,7 @@ export default function Page() { <SessionTurn sessionID={params.id!} messageID={message.id} + lastUserMessageID={lastUserMessage()?.id} stepsExpanded={store.mobileStepsExpanded[message.id] ?? false} onStepsExpandedToggle={() => setStore("mobileStepsExpanded", message.id, (x) => !x)} onUserInteracted={() => setStore("userInteracted", true)} @@ -643,6 +640,7 @@ export default function Page() { <SessionTurn sessionID={params.id!} messageID={activeMessage()!.id} + lastUserMessageID={lastUserMessage()?.id} stepsExpanded={store.stepsExpanded} onStepsExpandedToggle={() => setStore("stepsExpanded", (x) => !x)} onUserInteracted={() => setStore("userInteracted", true)} |
