@vantran-se/openchamber-web 1.24.4 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -8
- package/bin/lib/commands-connect-url.js +3 -8
- package/bin/lib/commands-tunnel.js +3 -0
- package/dist/assets/{CodeMirrorCommentWidgets-B4a0JkUz.js → CodeMirrorCommentWidgets-ntXIbhV2.js} +1 -1
- package/dist/assets/DiffView-CjxUovbM.js +4 -0
- package/dist/assets/FilesView-DFWD0RQR.js +17 -0
- package/dist/assets/{GitView-Byu2DY7s.js → GitView-BWa7e5vw.js} +4 -4
- package/dist/assets/{GuestAttachDialog-B808E0-d.js → GuestAttachDialog-DdOuyZzp.js} +1 -1
- package/dist/assets/GuestSurfacePane-DDfzid3U.js +1 -0
- package/dist/assets/{JsonTreeView-VW_7czo3.js → JsonTreeView-3sGwqexh.js} +1 -1
- package/dist/assets/LinearIssuesView-C6dpIdjw.js +1 -0
- package/dist/assets/MarkdownImageGallery-Q7YR_tl4.js +1 -0
- package/dist/assets/MarkdownRendererImpl-DxDV56bL.js +12 -0
- package/dist/assets/OnboardingScreen-rK4Stg__.js +1 -0
- package/dist/assets/{PatchDiff-DCjGhlYV.js → PatchDiff-DS-IMU1j.js} +1 -1
- package/dist/assets/{PierreDiffViewer-CEDZNkU2.js → PierreDiffViewer-DW23KWKZ.js} +1 -1
- package/dist/assets/PlanView-BCk_VobP.js +5 -0
- package/dist/assets/PluginPane-BPP1dbck.js +3 -0
- package/dist/assets/SettingsView-kMmrpn43.js +29 -0
- package/dist/assets/SettingsWindow-BpvD6IYQ.js +1 -0
- package/dist/assets/SubmoduleDiffSummary-BLttSS1X.js +1 -0
- package/dist/assets/ToolOutputDialog-CtqDqbyr.js +15 -0
- package/dist/assets/ToolPartDiffPreview-5FcKdyRy.js +8 -0
- package/dist/assets/{VirtualizedFileDiff-NU0FHFhT.js → VirtualizedFileDiff-C763hNCR.js} +4 -4
- package/dist/assets/{WalkthroughView-BZyjhqHv.js → WalkthroughView-lap5btCF.js} +2 -2
- package/dist/assets/appThemeRegistry-u4zw1l0B.js +1 -0
- package/dist/assets/{commitAndPush-BDftrjr6.js → commitAndPush-CwGJfJG-.js} +1 -1
- package/dist/assets/{computeVirtualFileMetrics-DlWlEM3x.js → computeVirtualFileMetrics-DW5jjX4n.js} +1 -1
- package/dist/assets/de-CndEg67T.js +10 -0
- package/dist/assets/es-DglvPlaC.js +16 -0
- package/dist/assets/fr-DejPCpbS.js +14 -0
- package/dist/assets/index-C2r64QfD.js +1 -0
- package/dist/assets/index-CLcM8HKx.css +1 -0
- package/dist/assets/index-CvLgnuNI.js +41 -0
- package/dist/assets/{isDiffPlainText-CO4e5J_S.js → isDiffPlainText-D47a6hMP.js} +1 -1
- package/dist/assets/{isFilePlainText-ue6kCou7.js → isFilePlainText-B-mGgeKl.js} +1 -1
- package/dist/assets/ja-CVpQawCd.js +16 -0
- package/dist/assets/ko-Bw446h9j.js +16 -0
- package/dist/assets/main-Bz4WWXbr.js +2 -0
- package/dist/assets/main-oreqDsOV.js +896 -0
- package/dist/assets/{markdownCore-CK48LG0z.js → markdownCore-D2e5sp9y.js} +4 -4
- package/dist/assets/miniChat-D1v2gsBI.js +2 -0
- package/dist/assets/mobile-DBj3lCf2.js +2 -0
- package/dist/assets/{patchFileDiff-D7QVlovD.js → patchFileDiff-BpeUOV91.js} +3 -3
- package/dist/assets/pl-BYNlPdhm.js +16 -0
- package/dist/assets/pt-BR-CL-Yfv9H.js +16 -0
- package/dist/assets/renderElectronMiniChatApp-DVtfEB2z.js +2 -0
- package/dist/assets/renderMobileApp-DFp9-xbG.js +25 -0
- package/dist/assets/runtimeEndpointReset-CsIpUep1.js +27 -0
- package/dist/assets/scheduledTasksApi-B5OHVpPM.js +1 -0
- package/dist/assets/{shikiHighlight-BPu3JiQs.js → shikiHighlight-DNm2Z_Jc.js} +1 -1
- package/dist/assets/{textMateThemeFromAppTheme-DWqRPo9A.js → textMateThemeFromAppTheme-DGF2kG7g.js} +1 -1
- package/dist/assets/tr-DzmbxLy-.js +7 -0
- package/dist/assets/uk-C7vQnwro.js +16 -0
- package/dist/assets/useAppFontEffects-Ci3FEaPf.js +7337 -0
- package/dist/assets/{useInlineCommentController-CgS0fnw_.js → useInlineCommentController-CuUuakrt.js} +2 -2
- package/dist/assets/useRootScrollLock-CQIsyERq.js +2 -0
- package/dist/assets/{vendor-codemirror-language-data-Bx2EHc1O.js → vendor-codemirror-language-data-CQa7_1cr.js} +2 -2
- package/dist/assets/vendor-cron-parser-CjvYVigk.js +2 -0
- package/dist/assets/vendor-opencode-client-_BAHQo4R.js +12 -0
- package/dist/assets/{vendor-remixicon-react-BDmGmFCA.js → vendor-remixicon-react-D6dZ0UwF.js} +1 -1
- package/dist/assets/{vendor-zod-CgAdXWZO.js → vendor-zod-Gea9uBlY.js} +1 -1
- package/dist/assets/{web-components-DxX8bZ1o.js → web-components-B6tKQyJN.js} +2 -2
- package/dist/assets/zh-CN-Cl0srS-z.js +16 -0
- package/dist/assets/zh-TW-DtII5bDb.js +16 -0
- package/dist/index.html +13 -7
- package/dist/mini-chat.html +5 -5
- package/dist/mobile.html +5 -5
- package/package.json +6 -5
- package/server/index.d.ts +1 -0
- package/server/index.js +246 -91
- package/server/lib/agent-tool/DOCUMENTATION.md +32 -15
- package/server/lib/agent-tool/runtime.js +135 -54
- package/server/lib/agent-tool/runtime.test.js +155 -87
- package/server/lib/browser-control/DOCUMENTATION.md +37 -2
- package/server/lib/browser-control/provider.js +217 -0
- package/server/lib/browser-control/provider.test.js +251 -0
- package/server/lib/context-obligatory/runtime.js +61 -50
- package/server/lib/context-obligatory/runtime.test.js +62 -162
- package/server/lib/event-stream/DOCUMENTATION.md +12 -1
- package/server/lib/event-stream/delta-coalescer.js +0 -0
- package/server/lib/event-stream/delta-coalescer.test.js +68 -57
- package/server/lib/event-stream/directory-ws-bridge.js +1 -1
- package/server/lib/event-stream/global-hub.js +10 -1
- package/server/lib/event-stream/global-hub.test.js +27 -26
- package/server/lib/event-stream/index.js +6 -0
- package/server/lib/event-stream/protocol.js +26 -19
- package/server/lib/event-stream/protocol.test.js +18 -7
- package/server/lib/event-stream/rebind.test.js +5 -5
- package/server/lib/event-stream/runtime.test.js +17 -15
- package/server/lib/event-stream/translate-v2.js +313 -0
- package/server/lib/event-stream/translate-v2.test.js +209 -0
- package/server/lib/event-stream/upstream-reader.test.js +16 -16
- package/server/lib/fs/DOCUMENTATION.md +4 -2
- package/server/lib/fs/byte-range.js +35 -0
- package/server/lib/fs/byte-range.test.js +31 -0
- package/server/lib/fs/routes.js +47 -42
- package/server/lib/fs/routes.test.js +123 -18
- package/server/lib/git/service.js +12 -0
- package/server/lib/github/DOCUMENTATION.md +1 -1
- package/server/lib/github/pr-status.js +22 -2
- package/server/lib/github/pr-status.test.js +27 -14
- package/server/lib/guests/DOCUMENTATION.md +13 -0
- package/server/lib/guests/catalog.js +12 -0
- package/server/lib/guests/catalog.test.js +33 -0
- package/server/lib/guests/routes.js +10 -1
- package/server/lib/guests/service.js +192 -14
- package/server/lib/guests/service.test.js +201 -1
- package/server/lib/guests/surface.js +630 -0
- package/server/lib/guests/surface.test.js +486 -0
- package/server/lib/markdown-image-grants/routes.js +18 -5
- package/server/lib/markdown-image-grants/routes.test.js +9 -6
- package/server/lib/message-queue/DOCUMENTATION.md +33 -22
- package/server/lib/message-queue/runtime.js +155 -100
- package/server/lib/message-queue/runtime.test.js +168 -82
- package/server/lib/notifications/DOCUMENTATION.md +28 -0
- package/server/lib/notifications/control-stream.http.test.js +68 -0
- package/server/lib/notifications/emitter-runtime.js +15 -0
- package/server/lib/notifications/emitter-runtime.test.js +32 -0
- package/server/lib/notifications/push-runtime.js +5 -1
- package/server/lib/notifications/push-runtime.test.js +2 -2
- package/server/lib/notifications/routes.js +1 -1
- package/server/lib/notifications/runtime.js +115 -26
- package/server/lib/notifications/template-runtime.js +13 -15
- package/server/lib/notifications/template-runtime.test.js +16 -9
- package/server/lib/notifications/trigger-runtime.test.js +187 -0
- package/server/lib/openchamber-control/DOCUMENTATION.md +10 -0
- package/server/lib/openchamber-control/actions.js +3 -2
- package/server/lib/openchamber-control/error.js +1 -1
- package/server/lib/openchamber-control/file-open.js +59 -0
- package/server/lib/openchamber-control/file-open.test.js +57 -0
- package/server/lib/openchamber-control/routes.test.js +12 -0
- package/server/lib/openchamber-control/service.js +102 -49
- package/server/lib/openchamber-control/service.test.js +84 -44
- package/server/lib/openchamber-sessions/archive-store.js +224 -0
- package/server/lib/openchamber-sessions/archive-store.test.js +187 -0
- package/server/lib/openchamber-sessions/opencode-client.js +22 -0
- package/server/lib/openchamber-sessions/routes.js +398 -328
- package/server/lib/openchamber-sessions/routes.test.js +777 -740
- package/server/lib/openchamber-sessions/session-metadata-store.js +285 -0
- package/server/lib/openchamber-sessions/session-metadata-store.test.js +259 -0
- package/server/lib/opencode/DOCUMENTATION.md +449 -29
- package/server/lib/opencode/agents.js +233 -327
- package/server/lib/opencode/auth.js +41 -44
- package/server/lib/opencode/auth.test.js +92 -0
- package/server/lib/opencode/cli-upgrade.d.ts +4 -0
- package/server/lib/opencode/cli-upgrade.js +18 -0
- package/server/lib/opencode/cli-upgrade.test.js +36 -0
- package/server/lib/opencode/commands.js +164 -145
- package/server/lib/opencode/compatibility.d.ts +16 -0
- package/server/lib/opencode/compatibility.js +88 -0
- package/server/lib/opencode/compatibility.test.js +62 -0
- package/server/lib/opencode/config-entity-routes.js +58 -29
- package/server/lib/opencode/config-entity-v2.test.js +290 -0
- package/server/lib/opencode/config-mutation-response.js +17 -7
- package/server/lib/opencode/config-mutation-response.test.js +4 -7
- package/server/lib/opencode/config-paths.test.js +2 -2
- package/server/lib/opencode/config-v2.d.ts +183 -0
- package/server/lib/opencode/config-v2.js +801 -0
- package/server/lib/opencode/config-v2.test.js +466 -0
- package/server/lib/opencode/credential-db.js +144 -0
- package/server/lib/opencode/credential-db.test.js +104 -0
- package/server/lib/opencode/env-runtime.js +48 -9
- package/server/lib/opencode/env-runtime.test.js +45 -0
- package/server/lib/opencode/feature-routes-runtime.js +15 -5
- package/server/lib/opencode/lifecycle-process.test.js +7 -4
- package/server/lib/opencode/lifecycle.js +85 -30
- package/server/lib/opencode/lifecycle.test.js +80 -8
- package/server/lib/opencode/login-shell-env.js +27 -0
- package/server/lib/opencode/managed-config-file.js +119 -0
- package/server/lib/opencode/managed-config-file.test.js +152 -0
- package/server/lib/opencode/managed-plugin-config.js +33 -13
- package/server/lib/opencode/mcp.js +43 -149
- package/server/lib/opencode/network-runtime.js +6 -7
- package/server/lib/opencode/openchamber-routes.test.js +2 -5
- package/server/lib/opencode/plugin-routes.js +3 -3
- package/server/lib/opencode/plugin-routes.test.js +6 -24
- package/server/lib/opencode/plugins.js +91 -40
- package/server/lib/opencode/plugins.test.js +28 -15
- package/server/lib/opencode/providers.js +63 -83
- package/server/lib/opencode/providers.test.js +128 -59
- package/server/lib/opencode/proxy-agent-wiring.test.js +4 -2
- package/server/lib/opencode/proxy.js +179 -129
- package/server/lib/opencode/pwa-manifest-routes.js +4 -2
- package/server/lib/opencode/pwa-manifest-routes.test.js +3 -2
- package/server/lib/opencode/response-envelope.js +14 -0
- package/server/lib/opencode/response-envelope.test.js +23 -0
- package/server/lib/opencode/routes-upgrade.test.js +73 -116
- package/server/lib/opencode/routes.js +121 -428
- package/server/lib/opencode/server-utils-runtime.js +10 -4
- package/server/lib/opencode/session-activity.js +78 -0
- package/server/lib/opencode/session-runtime.js +21 -10
- package/server/lib/opencode/session-runtime.test.js +9 -9
- package/server/lib/opencode/settings-helpers.js +9 -9
- package/server/lib/opencode/settings-helpers.test.js +7 -12
- package/server/lib/opencode/settings-registry.json +6 -8
- package/server/lib/opencode/settings-runtime.js +18 -1
- package/server/lib/opencode/settings-runtime.test.js +31 -2
- package/server/lib/opencode/shared.js +54 -22
- package/server/lib/opencode/shared.test.js +8 -4
- package/server/lib/opencode/shutdown-runtime.js +54 -7
- package/server/lib/opencode/shutdown-runtime.test.js +224 -30
- package/server/lib/opencode/skill-routes.js +23 -24
- package/server/lib/opencode/skills.js +7 -5
- package/server/lib/opencode/tunnel-wiring-runtime.js +2 -1
- package/server/lib/opencode/upgrade-capability.test.js +1 -1
- package/server/lib/opencode/v1-migration-topup.js +288 -0
- package/server/lib/opencode/v1-migration-topup.test.js +266 -0
- package/server/lib/opencode/v2-install.d.ts +8 -0
- package/server/lib/opencode/v2-install.js +158 -0
- package/server/lib/opencode/v2-install.test.js +124 -0
- package/server/lib/opencode/watcher.js +10 -3
- package/server/lib/opencode/watcher.test.js +17 -21
- package/server/lib/opencode/websearch-config.js +66 -0
- package/server/lib/package-manager.js +55 -68
- package/server/lib/package-manager.test.js +241 -75
- package/server/lib/permission-auto-accept/runtime.js +38 -22
- package/server/lib/permission-auto-accept/runtime.test.js +39 -17
- package/server/lib/quota/DOCUMENTATION.md +4 -0
- package/server/lib/quota/providers/xai.js +4 -4
- package/server/lib/relay/tunnel-host.js +4 -1
- package/server/lib/relay/tunnel-host.test.js +7 -0
- package/server/lib/routing/DOCUMENTATION.md +52 -21
- package/server/lib/routing/defaults.js +23 -6
- package/server/lib/routing/jev.js +17 -7
- package/server/lib/routing/routes.http.test.js +68 -33
- package/server/lib/routing/routes.js +65 -22
- package/server/lib/routing/runtime.js +145 -48
- package/server/lib/routing/runtime.test.js +79 -55
- package/server/lib/scheduled-tasks/DOCUMENTATION.md +4 -0
- package/server/lib/scheduled-tasks/issue-2710-double-execution.test.js +51 -46
- package/server/lib/scheduled-tasks/runtime.js +81 -74
- package/server/lib/scheduled-tasks/runtime.test.js +53 -1
- package/server/lib/session-assist/DOCUMENTATION.md +8 -3
- package/server/lib/session-assist/context.js +122 -46
- package/server/lib/session-assist/context.test.js +117 -49
- package/server/lib/session-assist/runtime.js +52 -22
- package/server/lib/session-assist/runtime.test.js +145 -173
- package/server/lib/session-goal/DOCUMENTATION.md +23 -15
- package/server/lib/session-goal/create.js +9 -12
- package/server/lib/session-goal/create.test.js +27 -28
- package/server/lib/session-goal/runtime.js +164 -77
- package/server/lib/session-goal/runtime.test.js +271 -519
- package/server/lib/session-knowledge/DOCUMENTATION.md +5 -0
- package/server/lib/session-knowledge/runtime.js +59 -41
- package/server/lib/session-knowledge/runtime.test.js +90 -20
- package/server/lib/small-model/DOCUMENTATION.md +154 -208
- package/server/lib/small-model/client.js +113 -0
- package/server/lib/small-model/index.js +296 -158
- package/server/lib/small-model/index.test.js +423 -256
- package/server/lib/small-model/routes.js +1 -1
- package/server/lib/spaces/DOCUMENTATION.md +807 -0
- package/server/lib/spaces/code-in-bait.js +185 -0
- package/server/lib/spaces/code-in.js +641 -0
- package/server/lib/spaces/code-in.test.js +1048 -0
- package/server/lib/spaces/errors.js +8 -0
- package/server/lib/spaces/exec-http.js +94 -0
- package/server/lib/spaces/gatekeeper-channel.js +202 -0
- package/server/lib/spaces/gatekeeper-channel.test.js +215 -0
- package/server/lib/spaces/gatekeeper-program.cjs +914 -0
- package/server/lib/spaces/gatekeeper-program.test.js +1391 -0
- package/server/lib/spaces/hardening.js +457 -0
- package/server/lib/spaces/hardening.test.js +368 -0
- package/server/lib/spaces/host-git.js +127 -0
- package/server/lib/spaces/host-git.test.js +137 -0
- package/server/lib/spaces/labels.js +234 -0
- package/server/lib/spaces/labels.test.js +219 -0
- package/server/lib/spaces/layout.js +184 -0
- package/server/lib/spaces/layout.test.js +30 -0
- package/server/lib/spaces/manager.js +82 -0
- package/server/lib/spaces/manager.test.js +114 -0
- package/server/lib/spaces/places/code-in.docker.live.test.js +216 -0
- package/server/lib/spaces/places/contract-suite.js +156 -0
- package/server/lib/spaces/places/contract.docker.live.test.js +7 -0
- package/server/lib/spaces/places/contract.test.js +6 -0
- package/server/lib/spaces/places/docker-engine.js +126 -0
- package/server/lib/spaces/places/docker-live-support.js +202 -0
- package/server/lib/spaces/places/docker-tools.js +186 -0
- package/server/lib/spaces/places/docker.js +587 -0
- package/server/lib/spaces/places/docker.test.js +1610 -0
- package/server/lib/spaces/places/escape-suite.js +1018 -0
- package/server/lib/spaces/places/escape.docker.live.test.js +7 -0
- package/server/lib/spaces/places/fake-docker.js +375 -0
- package/server/lib/spaces/places/memory-place.js +103 -0
- package/server/lib/spaces/places/packed.docker.live.test.js +77 -0
- package/server/lib/spaces/places/registry.js +43 -0
- package/server/lib/spaces/places/registry.test.js +50 -0
- package/server/lib/spaces/places/server.docker.live.test.js +225 -0
- package/server/lib/spaces/run-command.js +261 -0
- package/server/lib/spaces/run-command.test.js +396 -0
- package/server/lib/spaces/space-server.js +190 -0
- package/server/lib/spaces/space-server.test.js +335 -0
- package/server/lib/spaces/tools-filler.js +82 -0
- package/server/lib/spaces/tools-filler.test.js +148 -0
- package/server/lib/spaces/tools-pack.js +49 -0
- package/server/lib/spaces/tools-pack.test.js +57 -0
- package/server/lib/spaces/tools.js +138 -0
- package/server/lib/spaces/tools.test.js +153 -0
- package/server/lib/tts/openai-sdk.js +11 -0
- package/server/lib/tts/service.js +7 -5
- package/server/lib/tts/stt.js +3 -2
- package/server/lib/tunnels/DOCUMENTATION.md +2 -0
- package/server/lib/tunnels/routes.js +7 -0
- package/server/lib/tunnels/routes.test.js +55 -0
- package/server/lib/ui-auth/ui-auth.js +38 -2
- package/server/lib/ui-auth/ui-auth.test.js +42 -0
- package/server/lib/ui-auth/ui-passkeys.js +12 -10
- package/server/lib/walkthrough/DOCUMENTATION.md +10 -1
- package/server/lib/walkthrough/pull-request.js +61 -8
- package/server/lib/walkthrough/pull-request.test.js +54 -1
- package/server/lib/walkthrough/routes.js +20 -0
- package/server/lib/walkthrough/routes.test.js +19 -0
- package/server/opencode-proxy.test.js +190 -166
- package/server/opencode-worktree-readiness.test.js +5 -4
- package/dist/assets/DiffView-B2CD9wC8.js +0 -4
- package/dist/assets/FilesView-C4vMFclc.js +0 -13
- package/dist/assets/LinearIssuesView-EzGNCGrd.js +0 -1
- package/dist/assets/MarkdownImageGallery-B2YUDFaB.js +0 -1
- package/dist/assets/MarkdownRendererImpl-B4ikIzR3.js +0 -12
- package/dist/assets/OnboardingScreen-CQHBSTEi.js +0 -1
- package/dist/assets/PlanView-D3x-pTkZ.js +0 -5
- package/dist/assets/PluginPane-DEcgDQ9h.js +0 -3
- package/dist/assets/SettingsView-CSinuH-1.js +0 -29
- package/dist/assets/SettingsWindow-B5CHoJFZ.js +0 -1
- package/dist/assets/SubmoduleDiffSummary-oxeACCWs.js +0 -1
- package/dist/assets/ToolOutputDialog-tLNWmfcW.js +0 -15
- package/dist/assets/ToolPartDiffPreview-CflzmK-x.js +0 -8
- package/dist/assets/appThemeRegistry-DLicw4dH.js +0 -1
- package/dist/assets/de-Bro6_zyl.js +0 -10
- package/dist/assets/es-Bb9XQZvd.js +0 -16
- package/dist/assets/fr-Dgfzn-IL.js +0 -14
- package/dist/assets/index-CtQNmqUL.js +0 -1
- package/dist/assets/index-DqaMWNrC.css +0 -1
- package/dist/assets/index-Dqc6USl3.js +0 -40
- package/dist/assets/ja-BYsakGFh.js +0 -16
- package/dist/assets/ko-BSaQz9aN.js +0 -16
- package/dist/assets/main-B62_pjL5.js +0 -2
- package/dist/assets/main-BEdcOI2P.js +0 -896
- package/dist/assets/miniChat-LT8Rqofr.js +0 -2
- package/dist/assets/mobile-CqarEynh.js +0 -2
- package/dist/assets/pl-OIviPdoj.js +0 -16
- package/dist/assets/pt-BR-Cltg-E6s.js +0 -16
- package/dist/assets/renderElectronMiniChatApp-COyLTtZx.js +0 -2
- package/dist/assets/renderMobileApp-BC1MHg6g.js +0 -25
- package/dist/assets/runtimeEndpointReset-DdrazOVH.js +0 -25
- package/dist/assets/scheduledTasksApi-B2SWMGEU.js +0 -1
- package/dist/assets/tr-CQI-KPre.js +0 -7
- package/dist/assets/uk-CqW7R4DA.js +0 -16
- package/dist/assets/useAppFontEffects-ne84JBVL.js +0 -7333
- package/dist/assets/useRootScrollLock-Cpf1qoGp.js +0 -2
- package/dist/assets/vendor-cron-parser-CUcP7OfX.js +0 -2
- package/dist/assets/vendor-opencode-sdk-BJ73u-bH.js +0 -7
- package/dist/assets/zh-CN-CVZG_o_J.js +0 -16
- package/dist/assets/zh-TW-D5ZxzCZp.js +0 -16
- package/server/lib/opencode/mcp-oauth-callback.test.js +0 -111
- package/server/lib/routing/feature-flag.js +0 -11
- package/server/lib/small-model/call.js +0 -851
- package/server/lib/small-model/call.test.js +0 -1292
- package/server/lib/small-model/catalog.js +0 -13
- package/server/lib/small-model/resolve.js +0 -131
- package/server/lib/small-model/resolve.test.js +0 -197
- package/server/lib/small-model/runtime-providers.js +0 -164
- package/server/lib/small-model/runtime-providers.test.js +0 -118
- package/server/lib/system-prompt/DOCUMENTATION.md +0 -36
- package/server/lib/system-prompt/runtime.js +0 -49
- package/server/lib/system-prompt/runtime.test.js +0 -76
- package/server/lib/walkthrough/reproduce-2607.test.js +0 -148
|
@@ -1,16 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* READ-ONLY view of OpenCode's provider credentials.
|
|
3
|
+
*
|
|
4
|
+
* OpenCode 2.x imports the legacy `auth.json` once into its own database and
|
|
5
|
+
* never writes the file again; credentials live behind `/api/integration` and
|
|
6
|
+
* `/api/credential`, and there is no HTTP route that hands a key back.
|
|
7
|
+
* OpenChamber needs the raw credential for provider quota lookups, voice keys
|
|
8
|
+
* and the GitHub and Linear helpers, so `readAuthFile()` answers from the
|
|
9
|
+
* database OpenCode actually uses (`credential-db.js`). A successful database
|
|
10
|
+
* read is authoritative, including an empty one: OpenCode never clears
|
|
11
|
+
* `auth.json` after importing it, and a credential the user removed in
|
|
12
|
+
* OpenCode disappears only from the database, so mixing the file back in
|
|
13
|
+
* would hand out the deleted key again. The legacy file is read only when the
|
|
14
|
+
* database cannot be read at all (no sqlite runtime, no file, unknown
|
|
15
|
+
* schema). The shape is the legacy `auth.json` map either way. Nothing here
|
|
16
|
+
* writes: a write would be invisible to the running OpenCode and drift from
|
|
17
|
+
* what it uses.
|
|
18
|
+
*/
|
|
19
|
+
|
|
1
20
|
import fs from 'fs';
|
|
2
21
|
import path from 'path';
|
|
3
22
|
import os from 'os';
|
|
23
|
+
import { readCredentialsFromDb, resolveCredentialDbPath } from './credential-db.js';
|
|
4
24
|
|
|
5
25
|
const OPENCODE_DATA_DIR = path.join(os.homedir(), '.local', 'share', 'opencode');
|
|
6
26
|
const AUTH_FILE = path.join(OPENCODE_DATA_DIR, 'auth.json');
|
|
7
27
|
|
|
8
|
-
function
|
|
9
|
-
if (!
|
|
28
|
+
function readLegacyAuthFile(authFile, fileSystem) {
|
|
29
|
+
if (!fileSystem.existsSync(authFile)) {
|
|
10
30
|
return {};
|
|
11
31
|
}
|
|
12
32
|
try {
|
|
13
|
-
const content =
|
|
33
|
+
const content = fileSystem.readFileSync(authFile, 'utf8');
|
|
14
34
|
const trimmed = content.trim();
|
|
15
35
|
if (!trimmed) {
|
|
16
36
|
return {};
|
|
@@ -22,45 +42,24 @@ function readAuthFile() {
|
|
|
22
42
|
}
|
|
23
43
|
}
|
|
24
44
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
console.error('Failed to write auth file:', error);
|
|
44
|
-
throw new Error('Failed to write OpenCode auth configuration');
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function removeProviderAuth(providerId) {
|
|
49
|
-
if (!providerId || typeof providerId !== 'string') {
|
|
50
|
-
throw new Error('Provider ID is required');
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const auth = readAuthFile();
|
|
54
|
-
|
|
55
|
-
if (!auth[providerId]) {
|
|
56
|
-
console.log(`Provider ${providerId} not found in auth file, nothing to remove`);
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
delete auth[providerId];
|
|
61
|
-
writeAuthFile(auth);
|
|
62
|
-
console.log(`Removed provider auth: ${providerId}`);
|
|
63
|
-
return true;
|
|
45
|
+
/**
|
|
46
|
+
* The credentials OpenCode uses, keyed by provider id, in the legacy entry
|
|
47
|
+
* shape. The database answer is authoritative whenever it can be read, `{}`
|
|
48
|
+
* included; the legacy file is consulted only when it cannot. A corrupt
|
|
49
|
+
* legacy file therefore never blocks a healthy database, and only throws when
|
|
50
|
+
* it is the sole source left.
|
|
51
|
+
*
|
|
52
|
+
* @param {{ dbPath?: string, authFile?: string, fileSystem?: typeof fs }} [options] test seams; production callers pass nothing.
|
|
53
|
+
*/
|
|
54
|
+
function readAuthFile(options = {}) {
|
|
55
|
+
const {
|
|
56
|
+
dbPath = resolveCredentialDbPath({ dataDir: OPENCODE_DATA_DIR, path }),
|
|
57
|
+
authFile = AUTH_FILE,
|
|
58
|
+
fileSystem = fs,
|
|
59
|
+
} = options;
|
|
60
|
+
const stored = readCredentialsFromDb({ dbPath, fs: fileSystem });
|
|
61
|
+
if (stored) return stored;
|
|
62
|
+
return readLegacyAuthFile(authFile, fileSystem);
|
|
64
63
|
}
|
|
65
64
|
|
|
66
65
|
function getProviderAuth(providerId) {
|
|
@@ -75,8 +74,6 @@ function listProviderAuths() {
|
|
|
75
74
|
|
|
76
75
|
export {
|
|
77
76
|
readAuthFile,
|
|
78
|
-
writeAuthFile,
|
|
79
|
-
removeProviderAuth,
|
|
80
77
|
getProviderAuth,
|
|
81
78
|
listProviderAuths,
|
|
82
79
|
AUTH_FILE,
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { createRequire } from 'node:module';
|
|
6
|
+
|
|
7
|
+
import { readAuthFile } from './auth.js';
|
|
8
|
+
|
|
9
|
+
const sqlite = (() => {
|
|
10
|
+
try {
|
|
11
|
+
return createRequire(import.meta.url)('node:sqlite');
|
|
12
|
+
} catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
})();
|
|
16
|
+
|
|
17
|
+
let dir;
|
|
18
|
+
let dbPath;
|
|
19
|
+
let authFile;
|
|
20
|
+
|
|
21
|
+
const seedDb = (rows) => {
|
|
22
|
+
const db = new sqlite.DatabaseSync(dbPath);
|
|
23
|
+
db.exec(
|
|
24
|
+
'CREATE TABLE credential (id TEXT PRIMARY KEY, integration_id TEXT, label TEXT NOT NULL, value TEXT NOT NULL, ' +
|
|
25
|
+
'active INTEGER, time_created INTEGER NOT NULL, time_updated INTEGER NOT NULL)',
|
|
26
|
+
);
|
|
27
|
+
const insert = db.prepare(
|
|
28
|
+
'INSERT INTO credential (id, integration_id, label, value, active, time_created, time_updated) VALUES (?, ?, ?, ?, ?, ?, ?)',
|
|
29
|
+
);
|
|
30
|
+
for (const [index, row] of rows.entries()) {
|
|
31
|
+
insert.run(`c${index}`, row.integration, 'default', JSON.stringify(row.value), 1, 1, 1);
|
|
32
|
+
}
|
|
33
|
+
db.close();
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const read = () => readAuthFile({ dbPath, authFile, fileSystem: fs });
|
|
37
|
+
|
|
38
|
+
beforeEach(() => {
|
|
39
|
+
dir = fs.mkdtempSync(path.join(os.tmpdir(), 'oc-auth-'));
|
|
40
|
+
dbPath = path.join(dir, 'opencode.db');
|
|
41
|
+
authFile = path.join(dir, 'auth.json');
|
|
42
|
+
vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
43
|
+
vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
afterEach(() => {
|
|
47
|
+
vi.restoreAllMocks();
|
|
48
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
describe.skipIf(!sqlite)('readAuthFile', () => {
|
|
52
|
+
it('answers from the database alone when it can be read, so a credential deleted in OpenCode stays deleted', () => {
|
|
53
|
+
// OpenCode never clears auth.json after importing it; the stale key must not come back.
|
|
54
|
+
fs.writeFileSync(authFile, JSON.stringify({ openai: { type: 'api', key: 'stale' }, deepseek: { type: 'api', key: 'removed' } }));
|
|
55
|
+
seedDb([{ integration: 'openai', value: { type: 'key', key: 'fresh' } }]);
|
|
56
|
+
expect(read()).toEqual({ openai: { type: 'api', key: 'fresh' } });
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('treats an empty database as authoritative', () => {
|
|
60
|
+
fs.writeFileSync(authFile, JSON.stringify({ openai: { type: 'api', key: 'stale' } }));
|
|
61
|
+
seedDb([]);
|
|
62
|
+
expect(read()).toEqual({});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('does not let a corrupt legacy file block a healthy database', () => {
|
|
66
|
+
fs.writeFileSync(authFile, '{ not json');
|
|
67
|
+
seedDb([{ integration: 'openai', value: { type: 'key', key: 'fresh' } }]);
|
|
68
|
+
expect(read()).toEqual({ openai: { type: 'api', key: 'fresh' } });
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('falls back to the legacy file only when the database is unavailable', () => {
|
|
72
|
+
fs.writeFileSync(authFile, JSON.stringify({ openai: { type: 'api', key: 'legacy' } }));
|
|
73
|
+
expect(read()).toEqual({ openai: { type: 'api', key: 'legacy' } });
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('falls back to the legacy file when the database schema is not what it expects', () => {
|
|
77
|
+
const db = new sqlite.DatabaseSync(dbPath);
|
|
78
|
+
db.exec('CREATE TABLE credential (id TEXT PRIMARY KEY)');
|
|
79
|
+
db.close();
|
|
80
|
+
fs.writeFileSync(authFile, JSON.stringify({ openai: { type: 'api', key: 'legacy' } }));
|
|
81
|
+
expect(read()).toEqual({ openai: { type: 'api', key: 'legacy' } });
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('reports a corrupt legacy file when it is the only source left', () => {
|
|
85
|
+
fs.writeFileSync(authFile, '{ not json');
|
|
86
|
+
expect(() => read()).toThrow('Failed to read OpenCode auth configuration');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('answers empty with neither source present', () => {
|
|
90
|
+
expect(read()).toEqual({});
|
|
91
|
+
});
|
|
92
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
|
|
3
|
+
// The resolved launch target can be a native CLI or a runtime plus script.
|
|
4
|
+
// No request-supplied command, version, or installer method reaches this process.
|
|
5
|
+
export const runOpenCodeCliUpgrade = (launch, options = {}) => new Promise((resolve, reject) => {
|
|
6
|
+
const child = execFile(launch.binary, [...launch.args, 'upgrade'], {
|
|
7
|
+
cwd: options.cwd,
|
|
8
|
+
env: options.env,
|
|
9
|
+
windowsHide: true,
|
|
10
|
+
maxBuffer: 1024 * 1024,
|
|
11
|
+
}, (error) => {
|
|
12
|
+
// Installer output can contain registry credentials. Do not log or return it.
|
|
13
|
+
if (error) reject(new Error('OpenCode CLI upgrade failed. Run opencode upgrade in a terminal for details.'));
|
|
14
|
+
else resolve();
|
|
15
|
+
});
|
|
16
|
+
// Package managers must receive EOF instead of waiting for interactive input.
|
|
17
|
+
child.stdin?.end();
|
|
18
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { mkdtemp, writeFile, readFile, rm, realpath } from 'node:fs/promises';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import { runOpenCodeCliUpgrade } from './cli-upgrade.js';
|
|
6
|
+
|
|
7
|
+
describe('OpenCode CLI upgrade process', () => {
|
|
8
|
+
it('runs the resolved executable and wrapper arguments, with EOF and the supplied environment', async () => {
|
|
9
|
+
const directory = await mkdtemp(path.join(tmpdir(), 'oc upgrade '));
|
|
10
|
+
try {
|
|
11
|
+
const script = path.join(directory, 'cli fixture.cjs');
|
|
12
|
+
const result = path.join(directory, 'result.json');
|
|
13
|
+
await writeFile(script, `process.stdin.resume(); process.stdin.on('end', () => {
|
|
14
|
+
require('node:fs').writeFileSync(process.env.RESULT, JSON.stringify({ args: process.argv.slice(2), cwd: process.cwd() }));
|
|
15
|
+
});`);
|
|
16
|
+
await runOpenCodeCliUpgrade({ binary: process.execPath, args: [script] }, {
|
|
17
|
+
cwd: directory, env: { ...process.env, RESULT: result },
|
|
18
|
+
});
|
|
19
|
+
expect(JSON.parse(await readFile(result, 'utf8'))).toEqual({ args: ['upgrade'], cwd: await realpath(directory) });
|
|
20
|
+
} finally { await rm(directory, { recursive: true, force: true }); }
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('reports nonzero exits without exposing installer output', async () => {
|
|
24
|
+
await expect(runOpenCodeCliUpgrade({ binary: process.execPath, args: ['-e', 'console.error("private-registry-token"); process.exit(1)', '--'] }))
|
|
25
|
+
.rejects.toThrow('OpenCode CLI upgrade failed. Run opencode upgrade in a terminal for details.');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('reports spawn errors', async () => {
|
|
29
|
+
await expect(runOpenCodeCliUpgrade({ binary: '/nonexistent/opencode-upgrade-fixture', args: [] })).rejects.toThrow('OpenCode CLI upgrade failed');
|
|
30
|
+
});
|
|
31
|
+
it('treats a signal exit as failure', async () => {
|
|
32
|
+
await expect(runOpenCodeCliUpgrade({ binary: process.execPath, args: ['-e', 'process.kill(process.pid, "SIGTERM")', '--'] }))
|
|
33
|
+
.rejects.toThrow('OpenCode CLI upgrade failed');
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
});
|