@vantran-se/openchamber-web 1.24.3 → 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-BjJHrzmU.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-CDOJy5Ay.js → GitView-BWa7e5vw.js} +4 -4
- package/dist/assets/{GuestAttachDialog-D3S0Rjic.js → GuestAttachDialog-DdOuyZzp.js} +1 -1
- package/dist/assets/GuestSurfacePane-DDfzid3U.js +1 -0
- package/dist/assets/{JsonTreeView-D0C9nU7K.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-DnEhjXcC.js → PatchDiff-DS-IMU1j.js} +1 -1
- package/dist/assets/{PierreDiffViewer-DyxZVVVR.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-0pyr_mHY.js → VirtualizedFileDiff-C763hNCR.js} +4 -4
- package/dist/assets/{WalkthroughView-yNj4nOP5.js → WalkthroughView-lap5btCF.js} +2 -2
- package/dist/assets/appThemeRegistry-u4zw1l0B.js +1 -0
- package/dist/assets/{commitAndPush-DvJKa3Ks.js → commitAndPush-CwGJfJG-.js} +1 -1
- package/dist/assets/{computeVirtualFileMetrics-DxTBMuu-.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-D7FkBMP6.js → isDiffPlainText-D47a6hMP.js} +1 -1
- package/dist/assets/{isFilePlainText-CL2vsrIZ.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-Dh7WEsdM.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-Bsba8KFp.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-8_3csmr6.js → shikiHighlight-DNm2Z_Jc.js} +1 -1
- package/dist/assets/{textMateThemeFromAppTheme-CHo2fCgW.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-DkQ_gqpn.js → useInlineCommentController-CuUuakrt.js} +2 -2
- package/dist/assets/useRootScrollLock-CQIsyERq.js +2 -0
- package/dist/assets/{vendor-codemirror-language-data-CdzUmUyZ.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-B8IcVQAA.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-COVQhWGd.js +0 -4
- package/dist/assets/FilesView-B1V5JxFX.js +0 -13
- package/dist/assets/LinearIssuesView-D7FKg1XJ.js +0 -1
- package/dist/assets/MarkdownImageGallery-BrFjAVEf.js +0 -1
- package/dist/assets/MarkdownRendererImpl-DWepTafh.js +0 -12
- package/dist/assets/OnboardingScreen-Dyxxiqdt.js +0 -1
- package/dist/assets/PlanView-LW2z_EAP.js +0 -5
- package/dist/assets/PluginPane-B4tKno2h.js +0 -3
- package/dist/assets/SettingsView-DEaMulN9.js +0 -29
- package/dist/assets/SettingsWindow-FLDJXOgQ.js +0 -1
- package/dist/assets/SubmoduleDiffSummary-CvVwD-Vi.js +0 -1
- package/dist/assets/ToolOutputDialog-BiP0x2Rw.js +0 -15
- package/dist/assets/ToolPartDiffPreview-CkR4msKP.js +0 -8
- package/dist/assets/appThemeRegistry-BuUKhbYQ.js +0 -1
- package/dist/assets/de-DgxgFyGG.js +0 -10
- package/dist/assets/es-BFsZj5F_.js +0 -16
- package/dist/assets/fr-jdZ5KKQi.js +0 -14
- package/dist/assets/index-CKHjPKbq.js +0 -1
- package/dist/assets/index-Cbci4i1W.js +0 -40
- package/dist/assets/index-DqaMWNrC.css +0 -1
- package/dist/assets/ja-C5kKrhO4.js +0 -16
- package/dist/assets/ko-DXDTT_0O.js +0 -16
- package/dist/assets/main-CZALtVek.js +0 -896
- package/dist/assets/main-CgXMBNvG.js +0 -2
- package/dist/assets/miniChat-CwTmDixi.js +0 -2
- package/dist/assets/mobile-CLf2vCtO.js +0 -2
- package/dist/assets/pl-D-7x4Y8Q.js +0 -16
- package/dist/assets/pt-BR-CSBZrHa8.js +0 -16
- package/dist/assets/renderElectronMiniChatApp-C5gAFBk0.js +0 -2
- package/dist/assets/renderMobileApp-V4hYd32H.js +0 -25
- package/dist/assets/runtimeEndpointReset-DhlHCn-2.js +0 -25
- package/dist/assets/scheduledTasksApi-DzjbLd8P.js +0 -1
- package/dist/assets/tr-Dr-oJ22L.js +0 -7
- package/dist/assets/uk-9Nx83UcI.js +0 -16
- package/dist/assets/useAppFontEffects-khZXpFL_.js +0 -7333
- package/dist/assets/useRootScrollLock-DdvHf9Pt.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-Bxy_Hj3r.js +0 -16
- package/dist/assets/zh-TW-0BB4gpHM.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
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
|
|
14
14
|
import fs from 'fs';
|
|
15
15
|
import path from 'path';
|
|
16
|
+
import { unwrapOpenCodeResponse } from '../opencode/response-envelope.js';
|
|
17
|
+
import { createSessionActivityProbe } from '../opencode/session-activity.js';
|
|
16
18
|
|
|
17
19
|
const QUEUE_FILE_NAME = 'message-queue.json';
|
|
18
20
|
const QUEUE_FILE_VERSION = 1;
|
|
@@ -27,6 +29,9 @@ const DISPATCH_QUIET_MS = 500;
|
|
|
27
29
|
// After a user abort the UI held the queue for two seconds so the stop is not
|
|
28
30
|
// immediately followed by the next prompt; the server keeps that window.
|
|
29
31
|
const ABORT_HOLD_MS = 2_000;
|
|
32
|
+
// While a background subagent keeps the turn open, how often the head is
|
|
33
|
+
// rechecked in case the parent's rerun idle event is missed.
|
|
34
|
+
const SUBAGENT_RECHECK_MS = 5_000;
|
|
30
35
|
const RETRY_BASE_DELAY_MS = 2_000;
|
|
31
36
|
const RETRY_MAX_DELAY_MS = 60_000;
|
|
32
37
|
// A hold is asserted by a UI-driven process (auto-review) that dies with the
|
|
@@ -193,11 +198,22 @@ const extractAssistantMessageUpdate = (payload) => {
|
|
|
193
198
|
if (!sessionId) return null;
|
|
194
199
|
return {
|
|
195
200
|
sessionId,
|
|
196
|
-
aborted: asRecord(info.error)?.name === 'MessageAbortedError',
|
|
197
201
|
completed: asCount(asRecord(info.time)?.completed) !== null,
|
|
198
202
|
};
|
|
199
203
|
};
|
|
200
204
|
|
|
205
|
+
/**
|
|
206
|
+
* A user abort no longer arrives as an assistant message carrying
|
|
207
|
+
* `MessageAbortedError`: v2 reports `session.execution.interrupted`, which the
|
|
208
|
+
* translator turns into `session.idle` with `aborted: true`.
|
|
209
|
+
*/
|
|
210
|
+
const extractAbortedSessionId = (payload) => {
|
|
211
|
+
if (payload.type !== 'session.idle') return null;
|
|
212
|
+
const properties = asRecord(payload.properties) ?? {};
|
|
213
|
+
if (properties.aborted !== true) return null;
|
|
214
|
+
return asNonEmptyString(properties.sessionID);
|
|
215
|
+
};
|
|
216
|
+
|
|
201
217
|
const extractDeletedSessionId = (payload) => {
|
|
202
218
|
if (payload.type !== 'session.deleted') return null;
|
|
203
219
|
const properties = asRecord(payload.properties) ?? {};
|
|
@@ -211,9 +227,9 @@ export function createMessageQueueRuntime({
|
|
|
211
227
|
sessionKnowledgeRuntime = null,
|
|
212
228
|
broadcastGlobalUiEvent,
|
|
213
229
|
onPromptSent,
|
|
214
|
-
//
|
|
215
|
-
// absent means the queue never sees the sentinel.
|
|
216
|
-
|
|
230
|
+
// Resolves the `openchamber/auto` sentinel into a real model and agent right
|
|
231
|
+
// before the send; absent means the queue never sees the sentinel.
|
|
232
|
+
resolveAutoSelection = null,
|
|
217
233
|
dataDir,
|
|
218
234
|
fetchImpl = fetch,
|
|
219
235
|
now = Date.now,
|
|
@@ -382,29 +398,43 @@ export function createMessageQueueRuntime({
|
|
|
382
398
|
const detail = await response.text().catch(() => '');
|
|
383
399
|
throw httpError(`OpenCode ${method} ${fetchPath} failed with ${response.status}${detail ? `: ${detail.slice(0, 200)}` : ''}`, response.status);
|
|
384
400
|
}
|
|
385
|
-
return response.json().catch(() => null);
|
|
401
|
+
return unwrapOpenCodeResponse(await response.json().catch(() => null));
|
|
386
402
|
};
|
|
387
403
|
|
|
388
404
|
/**
|
|
389
405
|
* Live idleness, or null when it could not be established. Unknown is never
|
|
390
406
|
* idle: a fetch failure re-arms instead of sending into a running turn.
|
|
391
407
|
*/
|
|
408
|
+
const activityProbe = createSessionActivityProbe({ buildOpenCodeUrl, getOpenCodeAuthHeaders, timeoutMs: FETCH_TIMEOUT_MS, fetchImpl });
|
|
409
|
+
|
|
410
|
+
/** True while a subagent of the session runs; null when it could not be checked. */
|
|
411
|
+
const hasWorkingSubagents = async (sessionId) => {
|
|
412
|
+
const statuses = await activityProbe.fetchActiveSessionStatuses();
|
|
413
|
+
if (!statuses) return null;
|
|
414
|
+
return activityProbe.hasWorkingChildren(sessionId, statuses);
|
|
415
|
+
};
|
|
416
|
+
|
|
392
417
|
const isSessionIdle = async (sessionId, directory) => {
|
|
393
|
-
|
|
418
|
+
// `/api/session/active` is global and lists only the sessions that are
|
|
419
|
+
// running right now, so an absent entry means idle.
|
|
420
|
+
// The route answers `{ data: { [id]: { type: 'running' } } }`; the shared
|
|
421
|
+
// unwrap hands over the map, and an envelope is still accepted.
|
|
422
|
+
const body = asRecord(await openCodeFetch('/api/session/active').catch(() => null));
|
|
423
|
+
const statuses = asRecord(body && 'data' in body ? body.data : body);
|
|
394
424
|
if (!statuses) return null;
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
//
|
|
398
|
-
//
|
|
399
|
-
|
|
400
|
-
const messages = asList(await openCodeFetch(`/session/${encodeURIComponent(sessionId)}/message`, {
|
|
425
|
+
if (asRecord(statuses[sessionId])) return false;
|
|
426
|
+
// A missed event leaves no entry while a turn still streams. The trailing
|
|
427
|
+
// unfinished assistant message is the live evidence of that turn (mirrors
|
|
428
|
+
// the UI gate). v2 lists messages newest first.
|
|
429
|
+
const page = await openCodeFetch(`/api/session/${encodeURIComponent(sessionId)}/message`, {
|
|
401
430
|
directory,
|
|
402
431
|
query: { limit: String(MESSAGE_TAIL_LIMIT) },
|
|
403
|
-
}).catch(() => null)
|
|
432
|
+
}).catch(() => null);
|
|
433
|
+
const messages = asList(asRecord(page)?.data);
|
|
404
434
|
if (!messages) return null;
|
|
405
|
-
const last = asRecord(
|
|
435
|
+
const last = asRecord(messages[0]);
|
|
406
436
|
const lastTime = asRecord(last?.time);
|
|
407
|
-
if (last?.
|
|
437
|
+
if (last?.type === 'assistant' && asCount(lastTime?.completed) === null) {
|
|
408
438
|
const created = asCount(lastTime?.created);
|
|
409
439
|
if (created === null || created >= runtimeStartedAt) return false;
|
|
410
440
|
// Unfinished tail from before this runtime started: its run died with
|
|
@@ -420,112 +450,122 @@ export function createMessageQueueRuntime({
|
|
|
420
450
|
const [head, ...tail] = text.split(' ');
|
|
421
451
|
const name = head.slice(1);
|
|
422
452
|
if (!name) return null;
|
|
423
|
-
const commands = asList(await openCodeFetch('/command', { directory })) ?? [];
|
|
453
|
+
const commands = asList(await openCodeFetch('/api/command', { directory })) ?? [];
|
|
424
454
|
const match = commands.map(asRecord).find((command) => command?.name === name);
|
|
425
455
|
if (!match) return null;
|
|
426
456
|
return {
|
|
427
457
|
name,
|
|
428
458
|
arguments: tail.join(' '),
|
|
429
|
-
isSkill: match.source === 'skill',
|
|
430
|
-
template: asNonEmptyString(match.template),
|
|
431
459
|
};
|
|
432
460
|
};
|
|
433
461
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
* no placeholder gets the arguments appended. Twin of the UI's
|
|
439
|
-
* `expandSlashCommandGoalObjective` in `packages/ui/src/sync/session-ui-store.ts`.
|
|
440
|
-
*/
|
|
441
|
-
const expandCommandTemplate = (template, argumentsText) => {
|
|
442
|
-
if (template.includes('$ARGUMENTS')) return template.replaceAll('$ARGUMENTS', argumentsText);
|
|
443
|
-
const positions = [...template.matchAll(/\$(\d+)/g)].map((match) => Number(match[1]));
|
|
444
|
-
if (positions.length > 0) {
|
|
445
|
-
const parsed = [...argumentsText.matchAll(/"([^"]*)"|'([^']*)'|(\S+)/g)]
|
|
446
|
-
.map((match) => match[1] ?? match[2] ?? match[3] ?? '');
|
|
447
|
-
const last = Math.max(...positions);
|
|
448
|
-
return template.replace(/\$(\d+)/g, (_match, value) => {
|
|
449
|
-
const position = Number(value);
|
|
450
|
-
return position === last ? parsed.slice(position - 1).join(' ') : (parsed[position - 1] ?? '');
|
|
451
|
-
});
|
|
452
|
-
}
|
|
453
|
-
return argumentsText ? `${template}\n\n${argumentsText}` : template;
|
|
454
|
-
};
|
|
455
|
-
|
|
456
|
-
const toFilePart = (attachment) => ({
|
|
457
|
-
type: 'file',
|
|
458
|
-
mime: attachment.mimeType,
|
|
459
|
-
filename: attachment.filename,
|
|
460
|
-
url: attachment.dataUrl,
|
|
462
|
+
// v2 takes prompt attachments as URIs; a data URL is one.
|
|
463
|
+
const toPromptFile = (attachment) => ({
|
|
464
|
+
uri: attachment.dataUrl,
|
|
465
|
+
...(attachment.filename ? { name: attachment.filename } : {}),
|
|
461
466
|
});
|
|
462
467
|
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
468
|
+
/**
|
|
469
|
+
* Captured context travels as synthetic messages in v2 — the composer's
|
|
470
|
+
* inline `synthetic: true` text parts are gone. One message per entry, an
|
|
471
|
+
* attached item's metadata riding along, and its reading instructions (a
|
|
472
|
+
* linked PR) going first.
|
|
473
|
+
*/
|
|
474
|
+
const toContextMessages = (part) => {
|
|
475
|
+
const body = { text: part.text, resume: false };
|
|
476
|
+
if (part.kind !== 'context') return [body];
|
|
477
|
+
const withMetadata = part.metadata ? { ...body, metadata: part.metadata } : body;
|
|
470
478
|
return part.instructions
|
|
471
|
-
? [{
|
|
472
|
-
: [
|
|
479
|
+
? [{ text: part.instructions, resume: false }, withMetadata]
|
|
480
|
+
: [withMetadata];
|
|
473
481
|
};
|
|
474
482
|
|
|
475
483
|
const sendItem = async (sessionId, directory, item) => {
|
|
476
|
-
const { providerID, modelID,
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
//
|
|
483
|
-
//
|
|
484
|
-
const
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
484
|
+
const { providerID, modelID, variant } = item.sendConfig;
|
|
485
|
+
let agent = item.sendConfig.agent;
|
|
486
|
+
let model = { id: modelID, providerID, ...(variant ? { variant } : {}) };
|
|
487
|
+
const promptFiles = item.attachments.map(toPromptFile);
|
|
488
|
+
const contextMessages = item.context.flatMap(toContextMessages);
|
|
489
|
+
|
|
490
|
+
// Jev routing, when the queued send named the Auto sentinel. A failure
|
|
491
|
+
// inside resolves to the fallback model; only a missing fallback throws.
|
|
492
|
+
const routed = await resolveAutoSelection?.({
|
|
493
|
+
sessionId,
|
|
494
|
+
directory,
|
|
495
|
+
model,
|
|
496
|
+
agent,
|
|
497
|
+
requestText: item.text,
|
|
498
|
+
});
|
|
499
|
+
if (routed) {
|
|
500
|
+
model = routed.model;
|
|
501
|
+
agent = routed.agent ?? agent;
|
|
493
502
|
}
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
503
|
+
|
|
504
|
+
// v2 selects model and agent on the session, not per prompt: the choice is
|
|
505
|
+
// switched once and then persists.
|
|
506
|
+
await openCodeFetch(`/api/session/${encodeURIComponent(sessionId)}/model`, {
|
|
507
|
+
directory,
|
|
508
|
+
method: 'POST',
|
|
509
|
+
body: { model },
|
|
510
|
+
});
|
|
511
|
+
if (agent) {
|
|
512
|
+
await openCodeFetch(`/api/session/${encodeURIComponent(sessionId)}/agent`, {
|
|
513
|
+
directory,
|
|
514
|
+
method: 'POST',
|
|
515
|
+
body: { agent },
|
|
501
516
|
});
|
|
502
|
-
} else if (command?.template) {
|
|
503
|
-
text = expandCommandTemplate(command.template, command.arguments);
|
|
504
517
|
}
|
|
505
518
|
|
|
506
|
-
//
|
|
519
|
+
// Resolved before anything is admitted: a failed command lookup fails the
|
|
520
|
+
// whole send, so a retry does not admit the context twice.
|
|
521
|
+
const command = await resolveSlashCommand(item.text, directory);
|
|
522
|
+
|
|
523
|
+
// Standing project context rides the send exactly as a UI send would
|
|
507
524
|
// attach it; a failed lookup sends without it rather than not at all.
|
|
508
525
|
const knowledge = sessionKnowledgeRuntime
|
|
509
526
|
? await sessionKnowledgeRuntime.resolvePendingForSession(sessionId, directory)
|
|
510
527
|
.catch(() => ({ text: '', signature: '' }))
|
|
511
528
|
: { text: '', signature: '' };
|
|
512
|
-
|
|
513
|
-
//
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
if (knowledge.text)
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
529
|
+
|
|
530
|
+
// Same order as a UI send: everything attached to the message is admitted
|
|
531
|
+
// before the message itself, so the model reads it as background. This
|
|
532
|
+
// holds for a command too: its route takes file attachments only, and
|
|
533
|
+
// sending "/name args" as a prompt instead would skip the template
|
|
534
|
+
// OpenCode 2.x expands only on the command route.
|
|
535
|
+
const preamble = [...contextMessages];
|
|
536
|
+
if (knowledge.text) preamble.push({ text: knowledge.text, resume: false });
|
|
537
|
+
for (const synthetic of preamble) {
|
|
538
|
+
await openCodeFetch(`/api/session/${encodeURIComponent(sessionId)}/synthetic`, {
|
|
539
|
+
directory,
|
|
540
|
+
method: 'POST',
|
|
541
|
+
body: synthetic,
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
if (command) {
|
|
546
|
+
await openCodeFetch(`/api/session/${encodeURIComponent(sessionId)}/command`, {
|
|
547
|
+
directory,
|
|
548
|
+
method: 'POST',
|
|
549
|
+
body: {
|
|
550
|
+
// OpenCode 2.0.8 renamed the command body field `command` to `name`.
|
|
551
|
+
name: command.name,
|
|
552
|
+
text: command.arguments,
|
|
553
|
+
...(promptFiles.length > 0 ? { files: promptFiles } : {}),
|
|
554
|
+
},
|
|
555
|
+
});
|
|
556
|
+
} else {
|
|
557
|
+
await openCodeFetch(`/api/session/${encodeURIComponent(sessionId)}/prompt`, {
|
|
558
|
+
directory,
|
|
559
|
+
method: 'POST',
|
|
560
|
+
body: {
|
|
561
|
+
text: item.text,
|
|
562
|
+
...(promptFiles.length > 0 ? { files: promptFiles } : {}),
|
|
563
|
+
...(item.agentMention ? { agents: [{ name: item.agentMention }] } : {}),
|
|
564
|
+
},
|
|
565
|
+
});
|
|
566
|
+
}
|
|
527
567
|
if (knowledge.text && sessionKnowledgeRuntime) {
|
|
528
|
-
// After the
|
|
568
|
+
// After the send is accepted, so a rejected dispatch carries it again.
|
|
529
569
|
await sessionKnowledgeRuntime.recordDelivered(sessionId, directory, knowledge.signature).catch(() => undefined);
|
|
530
570
|
}
|
|
531
571
|
};
|
|
@@ -588,6 +628,16 @@ export function createMessageQueueRuntime({
|
|
|
588
628
|
// Busy: the next idle status event re-arms the loop.
|
|
589
629
|
if (!idle) return;
|
|
590
630
|
|
|
631
|
+
// A queued message waits for the whole turn. A parent idles while a
|
|
632
|
+
// background subagent works and runs again when OpenCode hands the
|
|
633
|
+
// result back, so the turn is only over once no subagent runs. That rerun
|
|
634
|
+
// re-arms through its idle event; the recheck covers a missed one.
|
|
635
|
+
const subagentsWorking = await hasWorkingSubagents(sessionId);
|
|
636
|
+
if (subagentsWorking !== false) {
|
|
637
|
+
armDispatch(sessionId, subagentsWorking === null ? retryDelayMs(1) : SUBAGENT_RECHECK_MS);
|
|
638
|
+
return;
|
|
639
|
+
}
|
|
640
|
+
|
|
591
641
|
// Re-read after the awaits — the user may have edited the queue meanwhile.
|
|
592
642
|
const current = queues.get(sessionId);
|
|
593
643
|
const item = current?.items[0];
|
|
@@ -771,9 +821,14 @@ export function createMessageQueueRuntime({
|
|
|
771
821
|
return;
|
|
772
822
|
}
|
|
773
823
|
|
|
824
|
+
const abortedSessionId = extractAbortedSessionId(payload);
|
|
825
|
+
if (abortedSessionId) {
|
|
826
|
+
if (queues.has(abortedSessionId)) abortedAt.set(abortedSessionId, now());
|
|
827
|
+
return;
|
|
828
|
+
}
|
|
829
|
+
|
|
774
830
|
const assistant = extractAssistantMessageUpdate(payload);
|
|
775
831
|
if (assistant && queues.has(assistant.sessionId)) {
|
|
776
|
-
if (assistant.aborted) abortedAt.set(assistant.sessionId, now());
|
|
777
832
|
// A completed reply without a following idle status (missed event)
|
|
778
833
|
// must still drain the queue; the tick verifies idleness itself.
|
|
779
834
|
if (assistant.completed && !timers.has(assistant.sessionId)) armDispatch(assistant.sessionId);
|
|
@@ -781,8 +836,8 @@ export function createMessageQueueRuntime({
|
|
|
781
836
|
};
|
|
782
837
|
|
|
783
838
|
const processEvent = (event) => {
|
|
784
|
-
|
|
785
|
-
|
|
839
|
+
// The hub translates v2 wire events into the server's vocabulary once.
|
|
840
|
+
for (const payload of event?.translated?.() ?? []) processPayload(payload);
|
|
786
841
|
};
|
|
787
842
|
|
|
788
843
|
const start = () => {
|