diff options
| author | Adam <[email protected]> | 2025-12-31 12:00:39 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-12-31 13:12:30 -0600 |
| commit | 65bc72098b737bee12f388215913808fa1629a4d (patch) | |
| tree | 5e392743dd2e4a5f7874d05bb99c20fe6f690bb2 /packages/app/src/context | |
| parent | b5546dce802a6befcb7e8b03577543399cef795b (diff) | |
| download | opencode-65bc72098b737bee12f388215913808fa1629a4d.tar.gz opencode-65bc72098b737bee12f388215913808fa1629a4d.zip | |
fix(desktop): more defensive access
Diffstat (limited to 'packages/app/src/context')
| -rw-r--r-- | packages/app/src/context/global-sync.tsx | 21 | ||||
| -rw-r--r-- | packages/app/src/context/sync.tsx | 13 |
2 files changed, 25 insertions, 9 deletions
diff --git a/packages/app/src/context/global-sync.tsx b/packages/app/src/context/global-sync.tsx index a6851aecb..dd040d8d5 100644 --- a/packages/app/src/context/global-sync.tsx +++ b/packages/app/src/context/global-sync.tsx @@ -115,13 +115,14 @@ function createGlobalSync() { .then((x) => { const fourHoursAgo = Date.now() - 4 * 60 * 60 * 1000 const nonArchived = (x.data ?? []) + .filter((s) => !!s?.id) + .filter((s) => !s.time?.archived) .slice() - .filter((s) => !s.time.archived) .sort((a, b) => a.id.localeCompare(b.id)) // Include up to the limit, plus any updated in the last 4 hours const sessions = nonArchived.filter((s, i) => { if (i < store.limit) return true - const updated = new Date(s.time.updated).getTime() + const updated = new Date(s.time?.updated ?? s.time?.created).getTime() return updated > fourHoursAgo }) setStore("session", reconcile(sessions, { key: "id" })) @@ -169,6 +170,7 @@ function createGlobalSync() { sdk.permission.list().then((x) => { const grouped: Record<string, Permission[]> = {} for (const perm of x.data ?? []) { + if (!perm?.id || !perm.sessionID) continue const existing = grouped[perm.sessionID] if (existing) { existing.push(perm) @@ -187,7 +189,10 @@ function createGlobalSync() { "permission", sessionID, reconcile( - permissions.slice().sort((a, b) => a.id.localeCompare(b.id)), + permissions + .filter((p) => !!p?.id) + .slice() + .sort((a, b) => a.id.localeCompare(b.id)), { key: "id" }, ), ) @@ -414,10 +419,12 @@ function createGlobalSync() { ), retry(() => globalSDK.client.project.list().then(async (x) => { - setGlobalStore( - "project", - x.data!.filter((p) => !p.worktree.includes("opencode-test")).sort((a, b) => a.id.localeCompare(b.id)), - ) + const projects = (x.data ?? []) + .filter((p) => !!p?.id) + .filter((p) => !!p.worktree && !p.worktree.includes("opencode-test")) + .slice() + .sort((a, b) => a.id.localeCompare(b.id)) + setGlobalStore("project", projects) }), ), retry(() => diff --git a/packages/app/src/context/sync.tsx b/packages/app/src/context/sync.tsx index 5291f1099..909af2447 100644 --- a/packages/app/src/context/sync.tsx +++ b/packages/app/src/context/sync.tsx @@ -56,7 +56,10 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ const result = Binary.search(messages, input.messageID, (m) => m.id) messages.splice(result.index, 0, message) } - draft.part[input.messageID] = input.parts.slice().sort((a, b) => a.id.localeCompare(b.id)) + draft.part[input.messageID] = input.parts + .filter((p) => !!p?.id) + .slice() + .sort((a, b) => a.id.localeCompare(b.id)) }), ) }, @@ -88,6 +91,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ reconcile( (messages.data ?? []) .map((x) => x.info) + .filter((m) => !!m?.id) .slice() .sort((a, b) => a.id.localeCompare(b.id)), { key: "id" }, @@ -95,11 +99,15 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ ) for (const message of messages.data ?? []) { + if (!message?.info?.id) continue setStore( "part", message.info.id, reconcile( - message.parts.slice().sort((a, b) => a.id.localeCompare(b.id)), + message.parts + .filter((p) => !!p?.id) + .slice() + .sort((a, b) => a.id.localeCompare(b.id)), { key: "id" }, ), ) @@ -112,6 +120,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ setStore("limit", (x) => x + count) await sdk.client.session.list().then((x) => { const sessions = (x.data ?? []) + .filter((s) => !!s?.id) .slice() .sort((a, b) => a.id.localeCompare(b.id)) .slice(0, store.limit) |
