From 4da3aa2eb261d59f5fe19b1f87b62990258738b2 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 24 Oct 2025 13:43:33 -0400 Subject: [PATCH 01/15] add missing dep --- bun.lock | 1 + packages/opencode/package.json | 1 + 2 files changed, 2 insertions(+) diff --git a/bun.lock b/bun.lock index 21530f9c2..4b58fa52c 100644 --- a/bun.lock +++ b/bun.lock @@ -183,6 +183,7 @@ "@opencode-ai/script": "workspace:*", "@opencode-ai/sdk": "workspace:*", "@parcel/watcher": "2.5.1", + "@pierre/precision-diffs": "0.0.2-alpha.1-1", "@standard-schema/spec": "1.0.0", "@zip.js/zip.js": "2.7.62", "ai": "catalog:", diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 981c3478c..44b023edd 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -46,6 +46,7 @@ "@opencode-ai/script": "workspace:*", "@opencode-ai/sdk": "workspace:*", "@parcel/watcher": "2.5.1", + "@pierre/precision-diffs": "0.0.2-alpha.1-1", "@standard-schema/spec": "1.0.0", "@zip.js/zip.js": "2.7.62", "ai": "catalog:", From e2920c06a389fc49b2e05601223995329dc30b82 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 24 Oct 2025 13:01:11 -0500 Subject: [PATCH 02/15] wip: desktop work --- packages/ui/src/components/list.css | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/components/list.css b/packages/ui/src/components/list.css index d60b55aeb..67db2c619 100644 --- a/packages/ui/src/components/list.css +++ b/packages/ui/src/components/list.css @@ -1,8 +1,5 @@ [data-component="list"] { - overflow-y: auto; - display: flex; - flex-direction: column; - gap: 6px; + /* overflow-y: auto; */ /* Hide scrollbar */ &::-webkit-scrollbar { @@ -13,6 +10,7 @@ [data-slot="item"] { width: 100%; + margin-bottom: 6px; padding: 4px 12px; text-align: left; From 5a0228897bc0d177b7433b6b787e8ff92cb4b658 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Fri, 24 Oct 2025 13:46:47 -0500 Subject: [PATCH 03/15] ignore: reword --- packages/opencode/src/tool/edit.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/src/tool/edit.ts b/packages/opencode/src/tool/edit.ts index c35f89697..c993c5fbf 100644 --- a/packages/opencode/src/tool/edit.ts +++ b/packages/opencode/src/tool/edit.ts @@ -621,6 +621,6 @@ export function replace(content: string, oldString: string, newString: string, r throw new Error("oldString not found in content") } throw new Error( - "Found multiple matches for oldString. Include more surrounding code lines in oldString to uniquely identify which occurrence to replace.", + "Found multiple matches for oldString. Provide more surrounding lines in oldString to identify the correct match.", ) } From 82249754e76780bcdbb4e5bbe347cbc9fdabd392 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 24 Oct 2025 13:51:24 -0500 Subject: [PATCH 04/15] fix: pierre dep --- bun.lock | 20 ++++++++++---------- package.json | 1 + packages/desktop/package.json | 1 + packages/opencode/package.json | 2 +- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/bun.lock b/bun.lock index 4b58fa52c..e964ec6a4 100644 --- a/bun.lock +++ b/bun.lock @@ -114,6 +114,7 @@ "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", "@opencode-ai/ui": "workspace:*", + "@pierre/precision-diffs": "catalog:", "@shikijs/transformers": "3.9.2", "@solid-primitives/active-element": "2.1.3", "@solid-primitives/event-bus": "1.1.2", @@ -183,7 +184,7 @@ "@opencode-ai/script": "workspace:*", "@opencode-ai/sdk": "workspace:*", "@parcel/watcher": "2.5.1", - "@pierre/precision-diffs": "0.0.2-alpha.1-1", + "@pierre/precision-diffs": "catalog:", "@standard-schema/spec": "1.0.0", "@zip.js/zip.js": "2.7.62", "ai": "catalog:", @@ -342,6 +343,7 @@ "@hono/zod-validator": "0.4.2", "@kobalte/core": "0.13.11", "@openauthjs/openauth": "0.0.0-20250322224806", + "@pierre/precision-diffs": "0.0.2-alpha.1-1", "@solidjs/meta": "0.29.4", "@tailwindcss/vite": "4.1.11", "@tsconfig/bun": "1.0.9", @@ -1073,7 +1075,7 @@ "@selderee/plugin-htmlparser2": ["@selderee/plugin-htmlparser2@0.11.0", "", { "dependencies": { "domhandler": "^5.0.3", "selderee": "^0.11.0" } }, "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ=="], - "@shikijs/core": ["@shikijs/core@3.9.2", "", { "dependencies": { "@shikijs/types": "3.9.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-3q/mzmw09B2B6PgFNeiaN8pkNOixWS726IHmJEpjDAcneDPMQmUg2cweT9cWXY4XcyQS3i6mOOUgQz9RRUP6HA=="], + "@shikijs/core": ["@shikijs/core@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA=="], "@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.9.2", "", { "dependencies": { "@shikijs/types": "3.9.2", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "sha512-kUTRVKPsB/28H5Ko6qEsyudBiWEDLst+Sfi+hwr59E0GLHV0h8RfgbQU7fdN5Lt9A8R1ulRiZyTvAizkROjwDA=="], @@ -3511,8 +3513,6 @@ "@parcel/watcher-wasm/napi-wasm": ["napi-wasm@1.1.3", "", { "bundled": true }, "sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg=="], - "@pierre/precision-diffs/@shikijs/core": ["@shikijs/core@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA=="], - "@pierre/precision-diffs/@shikijs/transformers": ["@shikijs/transformers@3.13.0", "", { "dependencies": { "@shikijs/core": "3.13.0", "@shikijs/types": "3.13.0" } }, "sha512-833lcuVzcRiG+fXvgslWsM2f4gHpjEgui1ipIknSizRuTgMkNZupiXE5/TVJ6eSYfhNBFhBZKkReKWO2GgYmqA=="], "@pierre/precision-diffs/shiki": ["shiki@3.13.0", "", { "dependencies": { "@shikijs/core": "3.13.0", "@shikijs/engine-javascript": "3.13.0", "@shikijs/engine-oniguruma": "3.13.0", "@shikijs/langs": "3.13.0", "@shikijs/themes": "3.13.0", "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g=="], @@ -3525,6 +3525,10 @@ "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + "@shikijs/core/@shikijs/types": ["@shikijs/types@3.13.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw=="], + + "@shikijs/transformers/@shikijs/core": ["@shikijs/core@3.9.2", "", { "dependencies": { "@shikijs/types": "3.9.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-3q/mzmw09B2B6PgFNeiaN8pkNOixWS726IHmJEpjDAcneDPMQmUg2cweT9cWXY4XcyQS3i6mOOUgQz9RRUP6HA=="], + "@slack/bolt/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], "@slack/oauth/@slack/logger": ["@slack/logger@3.0.0", "", { "dependencies": { "@types/node": ">=12.0.0" } }, "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA=="], @@ -3789,6 +3793,8 @@ "send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + "shiki/@shikijs/core": ["@shikijs/core@3.9.2", "", { "dependencies": { "@shikijs/types": "3.9.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-3q/mzmw09B2B6PgFNeiaN8pkNOixWS726IHmJEpjDAcneDPMQmUg2cweT9cWXY4XcyQS3i6mOOUgQz9RRUP6HA=="], + "sitemap/sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="], "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -3943,8 +3949,6 @@ "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], - "@expressive-code/plugin-shiki/shiki/@shikijs/core": ["@shikijs/core@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA=="], - "@expressive-code/plugin-shiki/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg=="], "@expressive-code/plugin-shiki/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg=="], @@ -4079,8 +4083,6 @@ "@opencode-ai/web/shiki/@shikijs/types": ["@shikijs/types@3.4.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-zHC1l7L+eQlDXLnxvM9R91Efh2V4+rN3oMVS2swCBssbj2U/FBwybD1eeLaq8yl/iwT+zih8iUbTBCgGZOYlVg=="], - "@pierre/precision-diffs/@shikijs/core/@shikijs/types": ["@shikijs/types@3.13.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw=="], - "@pierre/precision-diffs/@shikijs/transformers/@shikijs/types": ["@shikijs/types@3.13.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw=="], "@pierre/precision-diffs/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg=="], @@ -4343,8 +4345,6 @@ "@actions/github/@octokit/request/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@24.2.0", "", {}, "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="], - "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/core": ["@shikijs/core@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA=="], - "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg=="], "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.13.0", "", { "dependencies": { "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg=="], diff --git a/package.json b/package.json index 68e2d1f22..48afdc7c0 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@tsconfig/bun": "1.0.9", "@cloudflare/workers-types": "4.20251008.0", "@openauthjs/openauth": "0.0.0-20250322224806", + "@pierre/precision-diffs": "0.0.2-alpha.1-1", "@solidjs/meta": "0.29.4", "@tailwindcss/vite": "4.1.11", "diff": "8.0.2", diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 48c3aaced..40ad91780 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -26,6 +26,7 @@ "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", "@opencode-ai/ui": "workspace:*", + "@pierre/precision-diffs": "catalog:", "@shikijs/transformers": "3.9.2", "@solid-primitives/active-element": "2.1.3", "@solid-primitives/event-bus": "1.1.2", diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 44b023edd..20703af31 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -46,7 +46,7 @@ "@opencode-ai/script": "workspace:*", "@opencode-ai/sdk": "workspace:*", "@parcel/watcher": "2.5.1", - "@pierre/precision-diffs": "0.0.2-alpha.1-1", + "@pierre/precision-diffs": "catalog:", "@standard-schema/spec": "1.0.0", "@zip.js/zip.js": "2.7.62", "ai": "catalog:", From 18e549a47446b2eca5bf3c21cd59f0177c031568 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 24 Oct 2025 15:24:17 -0400 Subject: [PATCH 05/15] ignore: fix session activation after creation to ensure proper state management --- packages/desktop/src/pages/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/desktop/src/pages/index.tsx b/packages/desktop/src/pages/index.tsx index d7f32096e..47d03fe6c 100644 --- a/packages/desktop/src/pages/index.tsx +++ b/packages/desktop/src/pages/index.tsx @@ -167,7 +167,6 @@ export default function Page() { session = created.data ?? undefined } if (!session) return - local.session.setActive(session.id) interface SubmissionAttachment { path: string @@ -262,6 +261,7 @@ export default function Page() { ], }, }) + local.session.setActive(session.id) } const handleNewSession = () => { From 6646f7264aa04a656722c3f9c57920f162ead0f7 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 24 Oct 2025 15:27:20 -0400 Subject: [PATCH 06/15] ignore: highlight active session in sidebar to improve visual feedback --- packages/desktop/src/pages/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/desktop/src/pages/index.tsx b/packages/desktop/src/pages/index.tsx index 47d03fe6c..45fd67b47 100644 --- a/packages/desktop/src/pages/index.tsx +++ b/packages/desktop/src/pages/index.tsx @@ -371,6 +371,7 @@ export default function Page() { x.id} + current={local.session.active()} onSelect={(s) => local.session.setActive(s?.id)} onHover={(s) => (!!s ? sync.session.sync(s?.id) : undefined)} > From 74048ece2d06dd8c3b6f9be46a10ae0c927e13db Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 24 Oct 2025 15:35:53 -0400 Subject: [PATCH 07/15] ignore: fix new session message loading with retry logic to handle server processing delays --- packages/desktop/src/context/sync.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/desktop/src/context/sync.tsx b/packages/desktop/src/context/sync.tsx index 0fea4a421..12aa95878 100644 --- a/packages/desktop/src/context/sync.tsx +++ b/packages/desktop/src/context/sync.tsx @@ -134,11 +134,18 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ if (match.found) return store.session[match.index] return undefined }, - async sync(sessionID: string) { + async sync(sessionID: string, isRetry = false) { const [session, messages] = await Promise.all([ sdk.client.session.get({ path: { id: sessionID } }), sdk.client.session.messages({ path: { id: sessionID } }), ]) + + // If no messages and this might be a new session, retry after a delay + if (!isRetry && messages.data!.length === 0) { + setTimeout(() => this.sync(sessionID, true), 500) + return + } + setStore( produce((draft) => { const match = Binary.search(draft.session, sessionID, (s) => s.id) From e88b659545245888ee4091a0cc353f4d7bda7327 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Fri, 24 Oct 2025 14:40:36 -0500 Subject: [PATCH 08/15] make plan agent whitelist more conservative (#3424) --- packages/opencode/src/agent/agent.ts | 6 --- packages/opencode/test/util/wildcard.test.ts | 55 ++++++++++++++++++++ 2 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 packages/opencode/test/util/wildcard.test.ts diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts index 88e52aadf..3577a9176 100644 --- a/packages/opencode/src/agent/agent.ts +++ b/packages/opencode/src/agent/agent.ts @@ -52,9 +52,6 @@ export namespace Agent { { edit: "deny", bash: { - "awk -i inplace*": "ask", - "awk --inplace*": "ask", - "awk*": "allow", "cut*": "allow", "diff*": "allow", "du*": "allow", @@ -79,9 +76,6 @@ export namespace Agent { "more*": "allow", "pwd*": "allow", "rg*": "allow", - "sed --in-place*": "ask", - "sed -i*": "ask", - "sed -n *": "allow", "sort --output=*": "ask", "sort -o *": "ask", "sort*": "allow", diff --git a/packages/opencode/test/util/wildcard.test.ts b/packages/opencode/test/util/wildcard.test.ts new file mode 100644 index 000000000..f7f1e1545 --- /dev/null +++ b/packages/opencode/test/util/wildcard.test.ts @@ -0,0 +1,55 @@ +import { test, expect } from "bun:test" +import { Wildcard } from "../../src/util/wildcard" + +test("match handles glob tokens", () => { + expect(Wildcard.match("file1.txt", "file?.txt")).toBe(true) + expect(Wildcard.match("file12.txt", "file?.txt")).toBe(false) + expect(Wildcard.match("foo+bar", "foo+bar")).toBe(true) +}) + +test("all picks the most specific pattern", () => { + const rules = { + "*": "deny", + "git *": "ask", + "git status": "allow", + } + expect(Wildcard.all("git status", rules)).toBe("allow") + expect(Wildcard.all("git log", rules)).toBe("ask") + expect(Wildcard.all("echo hi", rules)).toBe("deny") +}) + +test("allStructured matches command sequences", () => { + const rules = { + "git *": "ask", + "git status*": "allow", + } + expect(Wildcard.allStructured({ head: "git", tail: ["status", "--short"] }, rules)).toBe("allow") + expect(Wildcard.allStructured({ head: "npm", tail: ["run", "build", "--watch"] }, { "npm run *": "allow" })).toBe( + "allow", + ) + expect(Wildcard.allStructured({ head: "ls", tail: ["-la"] }, rules)).toBeUndefined() +}) + +test("allStructured prioritizes flag-specific patterns", () => { + const rules = { + "find *": "allow", + "find * -delete*": "ask", + "sort*": "allow", + "sort -o *": "ask", + } + expect(Wildcard.allStructured({ head: "find", tail: ["src", "-delete"] }, rules)).toBe("ask") + expect(Wildcard.allStructured({ head: "find", tail: ["src", "-print"] }, rules)).toBe("allow") + expect(Wildcard.allStructured({ head: "sort", tail: ["-o", "out.txt"] }, rules)).toBe("ask") + expect(Wildcard.allStructured({ head: "sort", tail: ["--reverse"] }, rules)).toBe("allow") +}) + +test("allStructured handles sed flags", () => { + const rules = { + "sed * -i*": "ask", + "sed -n*": "allow", + } + expect(Wildcard.allStructured({ head: "sed", tail: ["-i", "file"] }, rules)).toBe("ask") + expect(Wildcard.allStructured({ head: "sed", tail: ["-i.bak", "file"] }, rules)).toBe("ask") + expect(Wildcard.allStructured({ head: "sed", tail: ["-n", "1p", "file"] }, rules)).toBe("allow") + expect(Wildcard.allStructured({ head: "sed", tail: ["-i", "-n", "/./p", "myfile.txt"] }, rules)).toBe("ask") +}) From 6ff0ce8bc52211d9df0242368872e3f04804a0f2 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 24 Oct 2025 15:45:26 -0400 Subject: [PATCH 09/15] ignore: improve session timeline debugging and message display functionality --- packages/desktop/src/components/session-timeline.tsx | 5 +++++ packages/desktop/src/pages/index.tsx | 12 ++++++------ packages/ui/src/components/list.tsx | 4 ++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/desktop/src/components/session-timeline.tsx b/packages/desktop/src/components/session-timeline.tsx index b751f2940..e1f3beae4 100644 --- a/packages/desktop/src/components/session-timeline.tsx +++ b/packages/desktop/src/components/session-timeline.tsx @@ -387,6 +387,11 @@ export default function SessionTimeline(props: { session: string; class?: string } } + createEffect(() => { + console.log("WHAT") + console.log(JSON.stringify(messagesWithValidParts())) + }) + return (
{(message) => { - const title = message.summary?.title - const prompt = local.session.getMessageText(message) - const summary = message.summary?.body + const title = createMemo(() => message.summary?.title) + const prompt = createMemo(() => local.session.getMessageText(message)) + const summary = createMemo(() => message.summary?.body) return (

- {title ?? prompt} + {title() ?? prompt()}

-
{prompt}
+
{prompt()}
{/* Summary */} @@ -594,7 +594,7 @@ export default function Page() {

Summary

-
{summary}
+
{summary()}
diff --git a/packages/ui/src/components/list.tsx b/packages/ui/src/components/list.tsx index cb212d1a8..aaba61fdf 100644 --- a/packages/ui/src/components/list.tsx +++ b/packages/ui/src/components/list.tsx @@ -23,6 +23,10 @@ export function List(props: ListProps) { initialActive: props.current ? props.key(props.current) : undefined, loop: true, }) + + createEffect(() => { + if (props.current) list.setActive(props.key(props.current)) + }) // const resetSelection = () => { // if (props.data.length === 0) return // list.setActive(props.key(props.data[0])) From e34042e17aedab9f8ccf083e3dbc87da54ffd7e3 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 24 Oct 2025 15:01:22 -0500 Subject: [PATCH 10/15] wip: accordion css not going to keep me down --- packages/ui/src/components/accordion.css | 67 +++++++++++++++++++----- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/packages/ui/src/components/accordion.css b/packages/ui/src/components/accordion.css index 07a76f902..500605867 100644 --- a/packages/ui/src/components/accordion.css +++ b/packages/ui/src/components/accordion.css @@ -4,9 +4,6 @@ align-items: flex-start; gap: 0px; align-self: stretch; - border-radius: 8px; - border: 1px solid var(--border-weak-base); - overflow: clip; [data-slot="accordion-item"] { width: 100%; @@ -15,6 +12,10 @@ align-items: flex-start; gap: 0px; align-self: stretch; + border: 1px solid var(--border-weak-base); + border-bottom: none; + border-top: none; + overflow: clip; [data-slot="accordion-header"] { width: 100%; @@ -36,6 +37,7 @@ background-color: var(--surface-base); border-bottom: 1px solid var(--border-weak-base); + overflow: clip; color: var(--text-strong); transition: background-color 0.15s ease; @@ -50,28 +52,69 @@ &:hover { background-color: var(--surface-base); } - &:focus-visible { outline: none; } - &[data-disabled] { cursor: not-allowed; } } } - &:last-child { - [data-slot="accordion-trigger"] { - border-bottom: none; + &[data-expanded] { + border: 1px solid var(--border-weak-base); + border-bottom: 1px solid var(--border-weak-base); + margin-top: 8px; + margin-bottom: 8px; + border-radius: 8px; + + /* previous */ + [data-slot="accordion-item"]:has(+ &) { + &[data-closed] { + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + [data-slot="accordion-trigger"] { + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + } + } + margin-bottom: 8px; } - &[data-expanded] { - border-bottom: none; + + /* next */ + & + [data-slot="accordion-item"] { + border-top: 1px solid var(--border-weak-base); + border-top-left-radius: 8px; + border-top-right-radius: 8px; + margin-top: 8px; } } - &[data-expanded] { - border-bottom: 1px solid var(--border-weak-base); + &:first-child { + margin-top: 0px; + border-top: 1px solid var(--border-weak-base); + border-top-left-radius: 8px; + border-top-right-radius: 8px; + + &[data-closed] { + [data-slot="accordion-trigger"] { + border-top-left-radius: 8px; + border-top-right-radius: 8px; + } + } + } + + &:last-child { + margin-bottom: 0px; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + + &[data-closed] { + [data-slot="accordion-trigger"] { + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + } + } } [data-slot="accordion-content"] { From 90515bc8c311c0e6159204f76c3b130ea7e80a78 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 24 Oct 2025 15:02:31 -0500 Subject: [PATCH 11/15] wip: desktop work --- packages/ui/src/components/accordion.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/ui/src/components/accordion.css b/packages/ui/src/components/accordion.css index 500605867..5524838bc 100644 --- a/packages/ui/src/components/accordion.css +++ b/packages/ui/src/components/accordion.css @@ -68,7 +68,6 @@ margin-bottom: 8px; border-radius: 8px; - /* previous */ [data-slot="accordion-item"]:has(+ &) { &[data-closed] { border-bottom-left-radius: 8px; @@ -81,7 +80,6 @@ margin-bottom: 8px; } - /* next */ & + [data-slot="accordion-item"] { border-top: 1px solid var(--border-weak-base); border-top-left-radius: 8px; From fa8e714d6922474f314c0c94f99ccca3ef66416f Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 24 Oct 2025 15:43:47 -0500 Subject: [PATCH 12/15] wip: desktop work --- packages/desktop/src/pages/index.tsx | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/desktop/src/pages/index.tsx b/packages/desktop/src/pages/index.tsx index 3b2aa1e4a..6702284b2 100644 --- a/packages/desktop/src/pages/index.tsx +++ b/packages/desktop/src/pages/index.tsx @@ -159,6 +159,20 @@ export default function Page() { setActiveItem(undefined) } + const scrollDiffItem = (element: HTMLElement) => { + element.scrollIntoView({ block: "start", behavior: "instant" }) + } + + const handleDiffTriggerClick = (event: MouseEvent) => { + const target = event.currentTarget as HTMLElement + queueMicrotask(() => { + if (target.getAttribute("aria-expanded") !== "true") return + const item = target.closest('[data-slot="accordion-item"]') as HTMLElement | null + if (!item) return + scrollDiffItem(item) + }) + } + const handlePromptSubmit = async (parts: ContentPart[]) => { const existingSession = local.session.active() let session = existingSession @@ -564,10 +578,7 @@ export default function Page() {
-
+
{(message) => { @@ -578,7 +589,7 @@ export default function Page() { return (
{/* Title */}
@@ -603,7 +614,7 @@ export default function Page() { {(diff) => ( - +
Date: Fri, 24 Oct 2025 15:51:31 -0500 Subject: [PATCH 13/15] wip: desktop work --- packages/desktop/src/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/desktop/src/index.tsx b/packages/desktop/src/index.tsx index b1c57bd6f..9c7a07fe6 100644 --- a/packages/desktop/src/index.tsx +++ b/packages/desktop/src/index.tsx @@ -14,6 +14,8 @@ import Home from "@/pages" const host = import.meta.env.VITE_OPENCODE_SERVER_HOST ?? "127.0.0.1" const port = import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096" +const url = new URLSearchParams(document.location.search).get("url") || `http://${host}:${port}` + const root = document.getElementById("root") if (import.meta.env.DEV && !(root instanceof HTMLElement)) { throw new Error( @@ -25,7 +27,7 @@ render( () => ( - + From fea6a357bc1a25a05d3bcbbeb7bacf6286d4a7de Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 24 Oct 2025 16:04:44 -0500 Subject: [PATCH 14/15] wip: desktop work --- packages/desktop/src/components/diff.tsx | 13 +- packages/desktop/src/components/theme.json | 558 +++++++++++++++++++++ packages/desktop/src/context/shiki.tsx | 179 +++---- 3 files changed, 659 insertions(+), 91 deletions(-) create mode 100644 packages/desktop/src/components/theme.json diff --git a/packages/desktop/src/components/diff.tsx b/packages/desktop/src/components/diff.tsx index 0facaba47..d8457b528 100644 --- a/packages/desktop/src/components/diff.tsx +++ b/packages/desktop/src/components/diff.tsx @@ -1,4 +1,10 @@ -import { type FileContents, FileDiff, type DiffLineAnnotation, DiffFileRendererOptions } from "@pierre/precision-diffs" +import { + type FileContents, + FileDiff, + type DiffLineAnnotation, + DiffFileRendererOptions, + registerCustomTheme, +} from "@pierre/precision-diffs" import { ComponentProps, createEffect, splitProps } from "solid-js" export type DiffProps = Omit, "themes"> & { @@ -9,6 +15,9 @@ export type DiffProps = Omit, "themes"> & { classList?: ComponentProps<"div">["classList"] } +// @ts-expect-error +registerCustomTheme("opencode", () => import("./theme.json")) + // interface ThreadMetadata { // threadId: string // } @@ -40,7 +49,7 @@ export function Diff(props: DiffProps) { // annotations and a container element to hold the diff createEffect(() => { const instance = new FileDiff({ - theme: "pierre-light", + theme: "opencode", // Or can also provide a 'themes' prop, which allows the code to adapt // to your OS light or dark theme // themes: { dark: 'pierre-night', light: 'pierre-light' }, diff --git a/packages/desktop/src/components/theme.json b/packages/desktop/src/components/theme.json new file mode 100644 index 000000000..36a4d020d --- /dev/null +++ b/packages/desktop/src/components/theme.json @@ -0,0 +1,558 @@ +{ + "colors": { + "actionBar.toggledBackground": "var(--surface-raised-base)", + "activityBarBadge.background": "var(--surface-brand-base)", + "checkbox.border": "var(--border-base)", + "editor.background": "transparent", + "editor.foreground": "var(--text-base)", + "editor.inactiveSelectionBackground": "var(--surface-raised-base)", + "editor.selectionHighlightBackground": "var(--border-active)", + "editorIndentGuide.activeBackground1": "var(--border-weak-base)", + "editorIndentGuide.background1": "var(--border-weak-base)", + "input.placeholderForeground": "var(--text-weak)", + "list.activeSelectionIconForeground": "var(--text-base)", + "list.dropBackground": "var(--surface-raised-base)", + "menu.background": "var(--surface-base)", + "menu.border": "var(--border-base)", + "menu.foreground": "var(--text-base)", + "menu.selectionBackground": "var(--surface-interactive-base)", + "menu.separatorBackground": "var(--border-base)", + "ports.iconRunningProcessForeground": "var(--icon-success-base)", + "sideBarSectionHeader.background": "transparent", + "sideBarSectionHeader.border": "var(--border-weak-base)", + "sideBarTitle.foreground": "var(--text-weak)", + "statusBarItem.remoteBackground": "var(--surface-success-base)", + "statusBarItem.remoteForeground": "var(--text-base)", + "tab.lastPinnedBorder": "var(--border-weak-base)", + "tab.selectedBackground": "var(--surface-raised-base)", + "tab.selectedForeground": "var(--text-weak)", + "terminal.inactiveSelectionBackground": "var(--surface-raised-base)", + "widget.border": "var(--border-base)" + }, + "displayName": "opencode", + "name": "opencode", + "semanticHighlighting": true, + "semanticTokenColors": { + "customLiteral": "var(--syntax-function)", + "newOperator": "var(--syntax-operator)", + "numberLiteral": "var(--syntax-number)", + "stringLiteral": "var(--syntax-string)" + }, + "tokenColors": [ + { + "scope": [ + "meta.embedded", + "source.groovy.embedded", + "string meta.image.inline.markdown", + "variable.legacy.builtin.python" + ], + "settings": { + "foreground": "var(--text-base)" + } + }, + { + "scope": "emphasis", + "settings": { + "fontStyle": "italic" + } + }, + { + "scope": "strong", + "settings": { + "fontStyle": "bold" + } + }, + { + "scope": "header", + "settings": { + "foreground": "var(--markdown-heading)" + } + }, + { + "scope": "comment", + "settings": { + "foreground": "var(--syntax-comment)" + } + }, + { + "scope": "constant.language", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": [ + "constant.numeric", + "variable.other.enummember", + "keyword.operator.plus.exponent", + "keyword.operator.minus.exponent" + ], + "settings": { + "foreground": "var(--syntax-number)" + } + }, + { + "scope": "constant.regexp", + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": "entity.name.tag", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": ["entity.name.tag.css", "entity.name.tag.less"], + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": "entity.other.attribute-name", + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": [ + "entity.other.attribute-name.class.css", + "source.css entity.other.attribute-name.class", + "entity.other.attribute-name.id.css", + "entity.other.attribute-name.parent-selector.css", + "entity.other.attribute-name.parent.less", + "source.css entity.other.attribute-name.pseudo-class", + "entity.other.attribute-name.pseudo-element.css", + "source.css.less entity.other.attribute-name.id", + "entity.other.attribute-name.scss" + ], + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": "invalid", + "settings": { + "foreground": "var(--syntax-critical)" + } + }, + { + "scope": "markup.underline", + "settings": { + "fontStyle": "underline" + } + }, + { + "scope": "markup.bold", + "settings": { + "fontStyle": "bold", + "foreground": "var(--markdown-strong)" + } + }, + { + "scope": "markup.heading", + "settings": { + "fontStyle": "bold", + "foreground": "var(--theme-markdown-heading)" + } + }, + { + "scope": "markup.italic", + "settings": { + "fontStyle": "italic" + } + }, + { + "scope": "markup.strikethrough", + "settings": { + "fontStyle": "strikethrough" + } + }, + { + "scope": "markup.inserted", + "settings": { + "foreground": "var(--text-diff-add-base)" + } + }, + { + "scope": "markup.deleted", + "settings": { + "foreground": "var(--text-diff-delete-base)" + } + }, + { + "scope": "markup.changed", + "settings": { + "foreground": "var(--text-base)" + } + }, + { + "scope": "punctuation.definition.quote.begin.markdown", + "settings": { + "foreground": "var(--markdown-block-quote)" + } + }, + { + "scope": "punctuation.definition.list.begin.markdown", + "settings": { + "foreground": "var(--markdown-list-enumeration)" + } + }, + { + "scope": "markup.inline.raw", + "settings": { + "foreground": "var(--markdown-code)" + } + }, + { + "scope": "punctuation.definition.tag", + "settings": { + "foreground": "var(--syntax-punctuation)" + } + }, + { + "scope": ["meta.preprocessor", "entity.name.function.preprocessor"], + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "meta.preprocessor.string", + "settings": { + "foreground": "var(--syntax-string)" + } + }, + { + "scope": "meta.preprocessor.numeric", + "settings": { + "foreground": "var(--syntax-number)" + } + }, + { + "scope": "meta.structure.dictionary.key.python", + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": "meta.diff.header", + "settings": { + "foreground": "var(--text-weak)" + } + }, + { + "scope": "storage", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "storage.type", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": ["storage.modifier", "keyword.operator.noexcept"], + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": ["string", "meta.embedded.assembly"], + "settings": { + "foreground": "var(--syntax-string)" + } + }, + { + "scope": "string.tag", + "settings": { + "foreground": "var(--syntax-string)" + } + }, + { + "scope": "string.value", + "settings": { + "foreground": "var(--syntax-string)" + } + }, + { + "scope": "string.regexp", + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": [ + "punctuation.definition.template-expression.begin", + "punctuation.definition.template-expression.end", + "punctuation.section.embedded" + ], + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": ["meta.template.expression"], + "settings": { + "foreground": "var(--text-base)" + } + }, + { + "scope": [ + "support.type.vendored.property-name", + "support.type.property-name", + "source.css variable", + "source.coffee.embedded" + ], + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": "keyword", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "keyword.control", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "keyword.operator", + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": [ + "keyword.operator.new", + "keyword.operator.expression", + "keyword.operator.cast", + "keyword.operator.sizeof", + "keyword.operator.alignof", + "keyword.operator.typeid", + "keyword.operator.alignas", + "keyword.operator.instanceof", + "keyword.operator.logical.python", + "keyword.operator.wordlike" + ], + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "keyword.other.unit", + "settings": { + "foreground": "var(--syntax-number)" + } + }, + { + "scope": ["punctuation.section.embedded.begin.php", "punctuation.section.embedded.end.php"], + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "support.function.git-rebase", + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": "constant.sha.git-rebase", + "settings": { + "foreground": "var(--syntax-number)" + } + }, + { + "scope": ["storage.modifier.import.java", "variable.language.wildcard.java", "storage.modifier.package.java"], + "settings": { + "foreground": "var(--text-base)" + } + }, + { + "scope": "variable.language", + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": [ + "entity.name.function", + "support.function", + "support.constant.handlebars", + "source.powershell variable.other.member", + "entity.name.operator.custom-literal" + ], + "settings": { + "foreground": "var(--syntax-function)" + } + }, + { + "scope": [ + "support.class", + "support.type", + "entity.name.type", + "entity.name.namespace", + "entity.other.attribute", + "entity.name.scope-resolution", + "entity.name.class", + "storage.type.numeric.go", + "storage.type.byte.go", + "storage.type.boolean.go", + "storage.type.string.go", + "storage.type.uintptr.go", + "storage.type.error.go", + "storage.type.rune.go", + "storage.type.cs", + "storage.type.generic.cs", + "storage.type.modifier.cs", + "storage.type.variable.cs", + "storage.type.annotation.java", + "storage.type.generic.java", + "storage.type.java", + "storage.type.object.array.java", + "storage.type.primitive.array.java", + "storage.type.primitive.java", + "storage.type.token.java", + "storage.type.groovy", + "storage.type.annotation.groovy", + "storage.type.parameters.groovy", + "storage.type.generic.groovy", + "storage.type.object.array.groovy", + "storage.type.primitive.array.groovy", + "storage.type.primitive.groovy" + ], + "settings": { + "foreground": "var(--syntax-type)" + } + }, + { + "scope": [ + "meta.type.cast.expr", + "meta.type.new.expr", + "support.constant.math", + "support.constant.dom", + "support.constant.json", + "entity.other.inherited-class", + "punctuation.separator.namespace.ruby" + ], + "settings": { + "foreground": "var(--syntax-type)" + } + }, + { + "scope": [ + "keyword.control", + "source.cpp keyword.operator.new", + "keyword.operator.delete", + "keyword.other.using", + "keyword.other.directive.using", + "keyword.other.operator", + "entity.name.operator" + ], + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": [ + "variable", + "meta.definition.variable.name", + "support.variable", + "entity.name.variable", + "constant.other.placeholder" + ], + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": ["variable.other.constant", "variable.other.enummember"], + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": ["meta.object-literal.key"], + "settings": { + "foreground": "var(--syntax-variable)" + } + }, + { + "scope": [ + "support.constant.property-value", + "support.constant.font-name", + "support.constant.media-type", + "support.constant.media", + "constant.other.color.rgb-value", + "constant.other.rgb-value", + "support.constant.color" + ], + "settings": { + "foreground": "var(--syntax-string)" + } + }, + { + "scope": [ + "punctuation.definition.group.regexp", + "punctuation.definition.group.assertion.regexp", + "punctuation.definition.character-class.regexp", + "punctuation.character.set.begin.regexp", + "punctuation.character.set.end.regexp", + "keyword.operator.negation.regexp", + "support.other.parenthesis.regexp" + ], + "settings": { + "foreground": "var(--syntax-string)" + } + }, + { + "scope": [ + "constant.character.character-class.regexp", + "constant.other.character-class.set.regexp", + "constant.other.character-class.regexp", + "constant.character.set.regexp" + ], + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": ["keyword.operator.or.regexp", "keyword.control.anchor.regexp"], + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": "keyword.operator.quantifier.regexp", + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": ["constant.character", "constant.other.option"], + "settings": { + "foreground": "var(--syntax-keyword)" + } + }, + { + "scope": "constant.character.escape", + "settings": { + "foreground": "var(--syntax-operator)" + } + }, + { + "scope": "entity.name.label", + "settings": { + "foreground": "var(--text-weak)" + } + } + ], + "type": "dark" +} diff --git a/packages/desktop/src/context/shiki.tsx b/packages/desktop/src/context/shiki.tsx index e70028419..b6c278bfe 100644 --- a/packages/desktop/src/context/shiki.tsx +++ b/packages/desktop/src/context/shiki.tsx @@ -3,43 +3,43 @@ import { createHighlighter, type ThemeInput } from "shiki" const theme: ThemeInput = { colors: { - "actionBar.toggledBackground": "var(--theme-background-element)", - "activityBarBadge.background": "var(--theme-accent)", - "checkbox.border": "var(--theme-border)", + "actionBar.toggledBackground": "var(--surface-raised-base)", + "activityBarBadge.background": "var(--surface-brand-base)", + "checkbox.border": "var(--border-base)", "editor.background": "transparent", - "editor.foreground": "var(--theme-text)", - "editor.inactiveSelectionBackground": "var(--theme-background-element)", - "editor.selectionHighlightBackground": "var(--theme-border-active)", - "editorIndentGuide.activeBackground1": "var(--theme-border-subtle)", - "editorIndentGuide.background1": "var(--theme-border-subtle)", - "input.placeholderForeground": "var(--theme-text-muted)", - "list.activeSelectionIconForeground": "var(--theme-text)", - "list.dropBackground": "var(--theme-background-element)", - "menu.background": "var(--theme-background-panel)", - "menu.border": "var(--theme-border)", - "menu.foreground": "var(--theme-text)", - "menu.selectionBackground": "var(--theme-primary)", - "menu.separatorBackground": "var(--theme-border)", - "ports.iconRunningProcessForeground": "var(--theme-success)", + "editor.foreground": "var(--text-base)", + "editor.inactiveSelectionBackground": "var(--surface-raised-base)", + "editor.selectionHighlightBackground": "var(--border-active)", + "editorIndentGuide.activeBackground1": "var(--border-weak-base)", + "editorIndentGuide.background1": "var(--border-weak-base)", + "input.placeholderForeground": "var(--text-weak)", + "list.activeSelectionIconForeground": "var(--text-base)", + "list.dropBackground": "var(--surface-raised-base)", + "menu.background": "var(--surface-base)", + "menu.border": "var(--border-base)", + "menu.foreground": "var(--text-base)", + "menu.selectionBackground": "var(--surface-interactive-base)", + "menu.separatorBackground": "var(--border-base)", + "ports.iconRunningProcessForeground": "var(--icon-success-base)", "sideBarSectionHeader.background": "transparent", - "sideBarSectionHeader.border": "var(--theme-border-subtle)", - "sideBarTitle.foreground": "var(--theme-text-muted)", - "statusBarItem.remoteBackground": "var(--theme-success)", - "statusBarItem.remoteForeground": "var(--theme-text)", - "tab.lastPinnedBorder": "var(--theme-border-subtle)", - "tab.selectedBackground": "var(--theme-background-element)", - "tab.selectedForeground": "var(--theme-text-muted)", - "terminal.inactiveSelectionBackground": "var(--theme-background-element)", - "widget.border": "var(--theme-border)", + "sideBarSectionHeader.border": "var(--border-weak-base)", + "sideBarTitle.foreground": "var(--text-weak)", + "statusBarItem.remoteBackground": "var(--surface-success-base)", + "statusBarItem.remoteForeground": "var(--text-base)", + "tab.lastPinnedBorder": "var(--border-weak-base)", + "tab.selectedBackground": "var(--surface-raised-base)", + "tab.selectedForeground": "var(--text-weak)", + "terminal.inactiveSelectionBackground": "var(--surface-raised-base)", + "widget.border": "var(--border-base)", }, displayName: "opencode", name: "opencode", semanticHighlighting: true, semanticTokenColors: { - customLiteral: "var(--theme-syntax-function)", - newOperator: "var(--theme-syntax-operator)", - numberLiteral: "var(--theme-syntax-number)", - stringLiteral: "var(--theme-syntax-string)", + customLiteral: "var(--syntax-function)", + newOperator: "var(--syntax-operator)", + numberLiteral: "var(--syntax-number)", + stringLiteral: "var(--syntax-string)", }, tokenColors: [ { @@ -50,7 +50,7 @@ const theme: ThemeInput = { "variable.legacy.builtin.python", ], settings: { - foreground: "var(--theme-text)", + foreground: "var(--text-base)", }, }, { @@ -68,19 +68,19 @@ const theme: ThemeInput = { { scope: "header", settings: { - foreground: "var(--theme-markdown-heading)", + foreground: "var(--markdown-heading)", }, }, { scope: "comment", settings: { - foreground: "var(--theme-syntax-comment)", + foreground: "var(--syntax-comment)", }, }, { scope: "constant.language", settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { @@ -91,31 +91,31 @@ const theme: ThemeInput = { "keyword.operator.minus.exponent", ], settings: { - foreground: "var(--theme-syntax-number)", + foreground: "var(--syntax-number)", }, }, { scope: "constant.regexp", settings: { - foreground: "var(--theme-syntax-operator)", + foreground: "var(--syntax-operator)", }, }, { scope: "entity.name.tag", settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { scope: ["entity.name.tag.css", "entity.name.tag.less"], settings: { - foreground: "var(--theme-syntax-operator)", + foreground: "var(--syntax-operator)", }, }, { scope: "entity.other.attribute-name", settings: { - foreground: "var(--theme-syntax-variable)", + foreground: "var(--syntax-variable)", }, }, { @@ -131,13 +131,13 @@ const theme: ThemeInput = { "entity.other.attribute-name.scss", ], settings: { - foreground: "var(--theme-syntax-operator)", + foreground: "var(--syntax-operator)", }, }, { scope: "invalid", settings: { - foreground: "var(--theme-error)", + foreground: "var(--syntax-critical)", }, }, { @@ -150,7 +150,7 @@ const theme: ThemeInput = { scope: "markup.bold", settings: { fontStyle: "bold", - foreground: "var(--theme-markdown-strong)", + foreground: "var(--markdown-strong)", }, }, { @@ -175,115 +175,115 @@ const theme: ThemeInput = { { scope: "markup.inserted", settings: { - foreground: "var(--theme-diff-added)", + foreground: "var(--text-diff-add-base)", }, }, { scope: "markup.deleted", settings: { - foreground: "var(--theme-diff-removed)", + foreground: "var(--text-diff-delete-base)", }, }, { scope: "markup.changed", settings: { - foreground: "var(--theme-diff-context)", + foreground: "var(--text-base)", }, }, { scope: "punctuation.definition.quote.begin.markdown", settings: { - foreground: "var(--theme-markdown-block-quote)", + foreground: "var(--markdown-block-quote)", }, }, { scope: "punctuation.definition.list.begin.markdown", settings: { - foreground: "var(--theme-markdown-list-enumeration)", + foreground: "var(--markdown-list-enumeration)", }, }, { scope: "markup.inline.raw", settings: { - foreground: "var(--theme-markdown-code)", + foreground: "var(--markdown-code)", }, }, { scope: "punctuation.definition.tag", settings: { - foreground: "var(--theme-syntax-punctuation)", + foreground: "var(--syntax-punctuation)", }, }, { scope: ["meta.preprocessor", "entity.name.function.preprocessor"], settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { scope: "meta.preprocessor.string", settings: { - foreground: "var(--theme-syntax-string)", + foreground: "var(--syntax-string)", }, }, { scope: "meta.preprocessor.numeric", settings: { - foreground: "var(--theme-syntax-number)", + foreground: "var(--syntax-number)", }, }, { scope: "meta.structure.dictionary.key.python", settings: { - foreground: "var(--theme-syntax-variable)", + foreground: "var(--syntax-variable)", }, }, { scope: "meta.diff.header", settings: { - foreground: "var(--theme-diff-hunk-header)", + foreground: "var(--text-weak)", }, }, { scope: "storage", settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { scope: "storage.type", settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { scope: ["storage.modifier", "keyword.operator.noexcept"], settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { scope: ["string", "meta.embedded.assembly"], settings: { - foreground: "var(--theme-syntax-string)", + foreground: "var(--syntax-string)", }, }, { scope: "string.tag", settings: { - foreground: "var(--theme-syntax-string)", + foreground: "var(--syntax-string)", }, }, { scope: "string.value", settings: { - foreground: "var(--theme-syntax-string)", + foreground: "var(--syntax-string)", }, }, { scope: "string.regexp", settings: { - foreground: "var(--theme-syntax-operator)", + foreground: "var(--syntax-operator)", }, }, { @@ -293,13 +293,13 @@ const theme: ThemeInput = { "punctuation.section.embedded", ], settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { scope: ["meta.template.expression"], settings: { - foreground: "var(--theme-text)", + foreground: "var(--text-base)", }, }, { @@ -310,25 +310,25 @@ const theme: ThemeInput = { "source.coffee.embedded", ], settings: { - foreground: "var(--theme-syntax-variable)", + foreground: "var(--syntax-variable)", }, }, { scope: "keyword", settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { scope: "keyword.control", settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { scope: "keyword.operator", settings: { - foreground: "var(--theme-syntax-operator)", + foreground: "var(--syntax-operator)", }, }, { @@ -345,43 +345,43 @@ const theme: ThemeInput = { "keyword.operator.wordlike", ], settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { scope: "keyword.other.unit", settings: { - foreground: "var(--theme-syntax-number)", + foreground: "var(--syntax-number)", }, }, { scope: ["punctuation.section.embedded.begin.php", "punctuation.section.embedded.end.php"], settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { scope: "support.function.git-rebase", settings: { - foreground: "var(--theme-syntax-variable)", + foreground: "var(--syntax-variable)", }, }, { scope: "constant.sha.git-rebase", settings: { - foreground: "var(--theme-syntax-number)", + foreground: "var(--syntax-number)", }, }, { scope: ["storage.modifier.import.java", "variable.language.wildcard.java", "storage.modifier.package.java"], settings: { - foreground: "var(--theme-text)", + foreground: "var(--text-base)", }, }, { scope: "variable.language", settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { @@ -393,7 +393,7 @@ const theme: ThemeInput = { "entity.name.operator.custom-literal", ], settings: { - foreground: "var(--theme-syntax-function)", + foreground: "var(--syntax-function)", }, }, { @@ -432,7 +432,7 @@ const theme: ThemeInput = { "storage.type.primitive.groovy", ], settings: { - foreground: "var(--theme-syntax-type)", + foreground: "var(--syntax-type)", }, }, { @@ -446,7 +446,7 @@ const theme: ThemeInput = { "punctuation.separator.namespace.ruby", ], settings: { - foreground: "var(--theme-syntax-type)", + foreground: "var(--syntax-type)", }, }, { @@ -460,7 +460,7 @@ const theme: ThemeInput = { "entity.name.operator", ], settings: { - foreground: "var(--theme-syntax-operator)", + foreground: "var(--syntax-operator)", }, }, { @@ -472,19 +472,19 @@ const theme: ThemeInput = { "constant.other.placeholder", ], settings: { - foreground: "var(--theme-syntax-variable)", + foreground: "var(--syntax-variable)", }, }, { scope: ["variable.other.constant", "variable.other.enummember"], settings: { - foreground: "var(--theme-syntax-variable)", + foreground: "var(--syntax-variable)", }, }, { scope: ["meta.object-literal.key"], settings: { - foreground: "var(--theme-syntax-variable)", + foreground: "var(--syntax-variable)", }, }, { @@ -498,7 +498,7 @@ const theme: ThemeInput = { "support.constant.color", ], settings: { - foreground: "var(--theme-syntax-string)", + foreground: "var(--syntax-string)", }, }, { @@ -512,7 +512,7 @@ const theme: ThemeInput = { "support.other.parenthesis.regexp", ], settings: { - foreground: "var(--theme-syntax-string)", + foreground: "var(--syntax-string)", }, }, { @@ -523,42 +523,43 @@ const theme: ThemeInput = { "constant.character.set.regexp", ], settings: { - foreground: "var(--theme-syntax-operator)", + foreground: "var(--syntax-operator)", }, }, { scope: ["keyword.operator.or.regexp", "keyword.control.anchor.regexp"], settings: { - foreground: "var(--theme-syntax-operator)", + foreground: "var(--syntax-operator)", }, }, { scope: "keyword.operator.quantifier.regexp", settings: { - foreground: "var(--theme-syntax-operator)", + foreground: "var(--syntax-operator)", }, }, { scope: ["constant.character", "constant.other.option"], settings: { - foreground: "var(--theme-syntax-keyword)", + foreground: "var(--syntax-keyword)", }, }, { scope: "constant.character.escape", settings: { - foreground: "var(--theme-syntax-operator)", + foreground: "var(--syntax-operator)", }, }, { scope: "entity.name.label", settings: { - foreground: "var(--theme-text-muted)", + foreground: "var(--text-weak)", }, }, ], type: "dark", } + const highlighter = await createHighlighter({ themes: [theme], langs: [], From 5fec5ff4249e820865e8b9c2b3bb92cdc3504a1e Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Fri, 24 Oct 2025 17:35:08 -0500 Subject: [PATCH 15/15] fix: bedrock reasoning --- packages/opencode/src/provider/transform.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 6ad39184a..73ff442ab 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -114,6 +114,10 @@ export namespace ProviderTransform { return { ["openai" as string]: options, } + case "@ai-sdk/amazon-bedrock": + return { + ["bedrock" as string]: options, + } case "@ai-sdk/anthropic": return { ["anthropic" as string]: options,