@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
|
@@ -3,11 +3,12 @@ import { describe, expect, it, vi } from 'vitest';
|
|
|
3
3
|
import { createGlobalMessageStreamHub } from './global-hub.js';
|
|
4
4
|
|
|
5
5
|
it('bounds a contiguous replay suffix by UTF-8 bytes and event count', async () => {
|
|
6
|
-
|
|
6
|
+
// v2 carries the event id inside the payload; there are no `id:` SSE lines.
|
|
7
|
+
const blocks = Array.from({ length: 8 }, (_, i) => `data: ${JSON.stringify({ id: `e${i}`, type: 'message', properties: { text: '界'.repeat(40) } })}\n\n`);
|
|
7
8
|
const received = [];
|
|
8
9
|
const hub = createGlobalMessageStreamHub({
|
|
9
10
|
buildOpenCodeUrl: path => `http://127.0.0.1:4096${path}`,
|
|
10
|
-
getOpenCodeAuthHeaders: () => ({}), replayLimit: 3, replayByteLimit:
|
|
11
|
+
getOpenCodeAuthHeaders: () => ({}), replayLimit: 3, replayByteLimit: 600,
|
|
11
12
|
upstreamReconnectDelayMs: 60_000,
|
|
12
13
|
fetchImpl: async () => createSseResponse({ blocks }),
|
|
13
14
|
});
|
|
@@ -19,8 +20,8 @@ it('bounds a contiguous replay suffix by UTF-8 bytes and event count', async ()
|
|
|
19
20
|
expect(hub.replayAfter('e5')).toBeNull();
|
|
20
21
|
const tail = hub.replayAfter('e6');
|
|
21
22
|
expect(tail.map(entry => entry.eventId)).toEqual(['e7']);
|
|
22
|
-
expect(Buffer.byteLength(tail[0].serializedFrame) * 2).toBeLessThanOrEqual(
|
|
23
|
-
expect(Buffer.byteLength(tail[0].serializedFrame) * 3).toBeGreaterThan(
|
|
23
|
+
expect(Buffer.byteLength(tail[0].serializedFrame) * 2).toBeLessThanOrEqual(600);
|
|
24
|
+
expect(Buffer.byteLength(tail[0].serializedFrame) * 3).toBeGreaterThan(600);
|
|
24
25
|
} finally { hub.stop(); }
|
|
25
26
|
});
|
|
26
27
|
|
|
@@ -62,9 +63,9 @@ async function waitForAssertion(assertion) {
|
|
|
62
63
|
throw lastError;
|
|
63
64
|
}
|
|
64
65
|
|
|
65
|
-
const deltaBlock = (id, text,
|
|
66
|
-
id, type: '
|
|
67
|
-
|
|
66
|
+
const deltaBlock = (id, text, ordinal = 1) => `id: ${id}\ndata: ${JSON.stringify({
|
|
67
|
+
id, type: 'session.text.delta',
|
|
68
|
+
data: { sessionID: 'ses_1', assistantMessageID: 'msg_1', ordinal, delta: text },
|
|
68
69
|
})}\n\n`;
|
|
69
70
|
|
|
70
71
|
const createDeltaHub = ({ blocks, deltaCoalesceWindowMs }) => createGlobalMessageStreamHub({
|
|
@@ -75,15 +76,15 @@ const createDeltaHub = ({ blocks, deltaCoalesceWindowMs }) => createGlobalMessag
|
|
|
75
76
|
fetchImpl: async () => createSseResponse({ blocks }),
|
|
76
77
|
});
|
|
77
78
|
|
|
78
|
-
// What a browser holds after applying frames in order: text per
|
|
79
|
-
// text each
|
|
79
|
+
// What a browser holds after applying frames in order: text per stream
|
|
80
|
+
// ordinal, and the text each stream had when a snapshot barrier passed.
|
|
80
81
|
const applyFrames = (frames) => {
|
|
81
82
|
const text = {};
|
|
82
83
|
const barriers = [];
|
|
83
84
|
for (const frame of frames) {
|
|
84
85
|
const payload = frame.payload;
|
|
85
|
-
if (payload.type === '
|
|
86
|
-
text[payload.
|
|
86
|
+
if (payload.type === 'session.text.delta') {
|
|
87
|
+
text[payload.data.ordinal] = (text[payload.data.ordinal] ?? '') + payload.data.delta;
|
|
87
88
|
} else {
|
|
88
89
|
barriers.push({ id: payload.id, seen: { ...text } });
|
|
89
90
|
}
|
|
@@ -99,7 +100,7 @@ describe('delta coalescing in the global hub', () => {
|
|
|
99
100
|
hub.subscribeEvent((event) => received.push(event));
|
|
100
101
|
try {
|
|
101
102
|
hub.start();
|
|
102
|
-
await waitForAssertion(() => expect(applyFrames(received).text
|
|
103
|
+
await waitForAssertion(() => expect(applyFrames(received).text[1]).toBe(words.join('')));
|
|
103
104
|
expect(received.length).toBeLessThanOrEqual(3);
|
|
104
105
|
expect(received.at(-1).eventId).toBe('e0119');
|
|
105
106
|
} finally { hub.stop(); }
|
|
@@ -109,9 +110,9 @@ describe('delta coalescing in the global hub', () => {
|
|
|
109
110
|
const blocks = [];
|
|
110
111
|
let id = 0;
|
|
111
112
|
const nextId = () => `e${String(id++).padStart(4, '0')}`;
|
|
112
|
-
for (let index = 0; index < 40; index += 1) blocks.push(deltaBlock(nextId(), `a${index}.`, index % 3 === 0 ?
|
|
113
|
+
for (let index = 0; index < 40; index += 1) blocks.push(deltaBlock(nextId(), `a${index}.`, index % 3 === 0 ? 2 : 1));
|
|
113
114
|
const snapshotId = nextId();
|
|
114
|
-
blocks.push(`id: ${snapshotId}\ndata: ${JSON.stringify({ id: snapshotId, type: '
|
|
115
|
+
blocks.push(`id: ${snapshotId}\ndata: ${JSON.stringify({ id: snapshotId, type: 'session.text.ended', data: { sessionID: 'ses_1', assistantMessageID: 'msg_1', ordinal: 1, text: '' } })}\n\n`);
|
|
115
116
|
for (let index = 0; index < 40; index += 1) blocks.push(deltaBlock(nextId(), `b${index}.`));
|
|
116
117
|
|
|
117
118
|
const hub = createDeltaHub({ blocks });
|
|
@@ -121,13 +122,13 @@ describe('delta coalescing in the global hub', () => {
|
|
|
121
122
|
hub.start();
|
|
122
123
|
const expectedA = [...Array(40).keys()].filter((index) => index % 3 !== 0).map((index) => `a${index}.`).join('')
|
|
123
124
|
+ [...Array(40).keys()].map((index) => `b${index}.`).join('');
|
|
124
|
-
await waitForAssertion(() => expect(applyFrames(received).text
|
|
125
|
+
await waitForAssertion(() => expect(applyFrames(received).text[1]).toBe(expectedA));
|
|
125
126
|
expect(received.length).toBeLessThan(blocks.length / 4);
|
|
126
127
|
|
|
127
128
|
const complete = applyFrames(received);
|
|
128
129
|
// The snapshot barrier saw exactly the text that arrived before it.
|
|
129
130
|
expect(complete.barriers).toHaveLength(1);
|
|
130
|
-
expect(complete.barriers[0].seen
|
|
131
|
+
expect(complete.barriers[0].seen[1]).toBe([...Array(40).keys()].filter((index) => index % 3 !== 0).map((index) => `a${index}.`).join(''));
|
|
131
132
|
|
|
132
133
|
// A socket that drops after any frame reconnects with that frame's id.
|
|
133
134
|
for (let cut = 0; cut < received.length; cut += 1) {
|
|
@@ -139,17 +140,17 @@ describe('delta coalescing in the global hub', () => {
|
|
|
139
140
|
} finally { hub.stop(); }
|
|
140
141
|
});
|
|
141
142
|
|
|
142
|
-
// OpenCode
|
|
143
|
+
// OpenCode sends no SSE ids at all. Before the hub numbered such events
|
|
143
144
|
// itself the replay buffer stayed empty and every reconnect lost its gap.
|
|
144
145
|
it('numbers id-less upstream events so a reconnect resumes from any cursor', async () => {
|
|
145
|
-
const idless = (type,
|
|
146
|
+
const idless = (type, data) => `data: ${JSON.stringify({ type, data })}\n\n`;
|
|
146
147
|
const blocks = [];
|
|
147
148
|
for (let index = 0; index < 30; index += 1) {
|
|
148
|
-
blocks.push(idless('
|
|
149
|
+
blocks.push(idless('session.text.delta', { sessionID: 'ses_1', assistantMessageID: 'msg_1', ordinal: 1, delta: `a${index}.` }));
|
|
149
150
|
}
|
|
150
|
-
blocks.push(idless('
|
|
151
|
+
blocks.push(idless('session.text.ended', { sessionID: 'ses_1', assistantMessageID: 'msg_1', ordinal: 1, text: '' }));
|
|
151
152
|
for (let index = 0; index < 30; index += 1) {
|
|
152
|
-
blocks.push(idless('
|
|
153
|
+
blocks.push(idless('session.text.delta', { sessionID: 'ses_1', assistantMessageID: 'msg_1', ordinal: 1, delta: `b${index}.` }));
|
|
153
154
|
}
|
|
154
155
|
|
|
155
156
|
const hub = createDeltaHub({ blocks });
|
|
@@ -158,7 +159,7 @@ describe('delta coalescing in the global hub', () => {
|
|
|
158
159
|
try {
|
|
159
160
|
hub.start();
|
|
160
161
|
const expected = [...Array(30).keys()].map((index) => `a${index}.`).join('') + [...Array(30).keys()].map((index) => `b${index}.`).join('');
|
|
161
|
-
await waitForAssertion(() => expect(applyFrames(received).text
|
|
162
|
+
await waitForAssertion(() => expect(applyFrames(received).text[1]).toBe(expected));
|
|
162
163
|
|
|
163
164
|
const ids = received.map((event) => event.eventId);
|
|
164
165
|
expect(ids.every((eventId) => typeof eventId === 'string' && eventId.length > 0)).toBe(true);
|
|
@@ -198,7 +199,7 @@ describe('delta coalescing in the global hub', () => {
|
|
|
198
199
|
hub.stop();
|
|
199
200
|
|
|
200
201
|
const tail = hub.replayAfter('e0').map((entry) => JSON.parse(entry.serializedFrame));
|
|
201
|
-
expect(applyFrames(tail).text
|
|
202
|
+
expect(applyFrames(tail).text[1]).toBe('two three');
|
|
202
203
|
expect(tail.at(-1).eventId).toBe('e2');
|
|
203
204
|
});
|
|
204
205
|
|
|
@@ -216,7 +217,7 @@ describe('delta coalescing in the global hub', () => {
|
|
|
216
217
|
|
|
217
218
|
hub.flushPending();
|
|
218
219
|
|
|
219
|
-
expect(applyFrames(received).text
|
|
220
|
+
expect(applyFrames(received).text[1]).toBe('one two three');
|
|
220
221
|
expect(hub.replayAfter('e2')).toEqual([]);
|
|
221
222
|
} finally { hub.stop(); }
|
|
222
223
|
});
|
|
@@ -232,7 +233,7 @@ describe('createGlobalMessageStreamHub', () => {
|
|
|
232
233
|
upstreamReconnectDelayMs: 100,
|
|
233
234
|
fetchImpl: async () => createSseResponse({
|
|
234
235
|
blocks: [
|
|
235
|
-
'id:
|
|
236
|
+
'data: {"id":"evt-1","type":"session.updated","properties":{}}\n\n',
|
|
236
237
|
],
|
|
237
238
|
}),
|
|
238
239
|
});
|
|
@@ -294,7 +295,7 @@ describe('createGlobalMessageStreamHub', () => {
|
|
|
294
295
|
upstreamReconnectDelayMs: 100,
|
|
295
296
|
fetchImpl: async () => createSseResponse({
|
|
296
297
|
blocks: [
|
|
297
|
-
'id:
|
|
298
|
+
'data: {"id":"evt-1","type":"session.updated","properties":{}}\n\n',
|
|
298
299
|
],
|
|
299
300
|
}),
|
|
300
301
|
});
|
|
@@ -11,17 +11,19 @@ export const MESSAGE_STREAM_WS_MAX_BUFFERED_BYTES = 16 * 1024 * 1024;
|
|
|
11
11
|
// proactively start shedding low-priority updates before the hard disconnect.
|
|
12
12
|
export const MESSAGE_STREAM_WS_BACKPRESSURE_WARN_BYTES = 12 * 1024 * 1024;
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Parses one SSE block from OpenCode's `/api/event` stream.
|
|
16
|
+
*
|
|
17
|
+
* OpenCode v2 sends no `id:` lines: the event id lives in the JSON payload as
|
|
18
|
+
* `payload.id` and the directory as `payload.location.directory`. Both are read
|
|
19
|
+
* from the payload here so the replay buffer and the per-directory routing keep
|
|
20
|
+
* working unchanged.
|
|
21
|
+
*/
|
|
14
22
|
export function parseSseEventEnvelope(block) {
|
|
15
23
|
if (!block || typeof block !== 'string') {
|
|
16
24
|
return null;
|
|
17
25
|
}
|
|
18
26
|
|
|
19
|
-
const eventId = block
|
|
20
|
-
.split('\n')
|
|
21
|
-
.find((line) => line.startsWith('id:'))
|
|
22
|
-
?.slice(3)
|
|
23
|
-
.trim() || null;
|
|
24
|
-
|
|
25
27
|
const dataLines = block
|
|
26
28
|
.split('\n')
|
|
27
29
|
.filter((line) => line.startsWith('data:'))
|
|
@@ -45,24 +47,17 @@ export function parseSseEventEnvelope(block) {
|
|
|
45
47
|
parsed.payload !== null
|
|
46
48
|
) {
|
|
47
49
|
return {
|
|
48
|
-
eventId,
|
|
49
|
-
directory: typeof parsed.directory === 'string' && parsed.directory.length > 0
|
|
50
|
+
eventId: readEventId(parsed.payload) ?? readEventId(parsed),
|
|
51
|
+
directory: typeof parsed.directory === 'string' && parsed.directory.length > 0
|
|
52
|
+
? parsed.directory
|
|
53
|
+
: readDirectory(parsed.payload),
|
|
50
54
|
payload: parsed.payload,
|
|
51
55
|
};
|
|
52
56
|
}
|
|
53
57
|
|
|
54
|
-
const directory =
|
|
55
|
-
typeof parsed?.directory === 'string' && parsed.directory.length > 0
|
|
56
|
-
? parsed.directory
|
|
57
|
-
: typeof parsed?.properties?.directory === 'string' && parsed.properties.directory.length > 0
|
|
58
|
-
? parsed.properties.directory
|
|
59
|
-
: typeof parsed?.properties?.info?.directory === 'string' && parsed.properties.info.directory.length > 0
|
|
60
|
-
? parsed.properties.info.directory
|
|
61
|
-
: null;
|
|
62
|
-
|
|
63
58
|
return {
|
|
64
|
-
eventId,
|
|
65
|
-
directory,
|
|
59
|
+
eventId: readEventId(parsed),
|
|
60
|
+
directory: readDirectory(parsed),
|
|
66
61
|
payload: parsed,
|
|
67
62
|
};
|
|
68
63
|
} catch {
|
|
@@ -70,6 +65,18 @@ export function parseSseEventEnvelope(block) {
|
|
|
70
65
|
}
|
|
71
66
|
}
|
|
72
67
|
|
|
68
|
+
function readEventId(payload) {
|
|
69
|
+
return payload && typeof payload === 'object' && typeof payload.id === 'string' && payload.id.length > 0
|
|
70
|
+
? payload.id
|
|
71
|
+
: null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function readDirectory(payload) {
|
|
75
|
+
if (!payload || typeof payload !== 'object') return null;
|
|
76
|
+
const directory = payload.location?.directory;
|
|
77
|
+
return typeof directory === 'string' && directory.length > 0 ? directory : null;
|
|
78
|
+
}
|
|
79
|
+
|
|
73
80
|
export function sendMessageStreamWsFrame(socket, payload) {
|
|
74
81
|
try {
|
|
75
82
|
return sendSerializedMessageStreamWsFrame(socket, JSON.stringify(payload));
|
|
@@ -16,28 +16,39 @@ describe('event stream protocol helpers', () => {
|
|
|
16
16
|
expect(MESSAGE_STREAM_DIRECTORY_WS_PATH).toBe('/api/event/ws');
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
-
it('
|
|
19
|
+
it('reads the event id and directory out of a v2 payload', () => {
|
|
20
|
+
// OpenCode 2.x sends no `id:` line: the id is `payload.id` and the
|
|
21
|
+
// directory is `payload.location.directory`.
|
|
22
|
+
const envelope = parseSseEventEnvelope(
|
|
23
|
+
'data: {"id":"evt_1","type":"session.renamed","location":{"directory":"/tmp/project"},"data":{"sessionID":"s1"}}\n'
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
expect(envelope.eventId).toBe('evt_1');
|
|
27
|
+
expect(envelope.directory).toBe('/tmp/project');
|
|
28
|
+
expect(envelope.payload.type).toBe('session.renamed');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('parses a wrapped payload, preferring the wrapper directory', () => {
|
|
20
32
|
const envelope = parseSseEventEnvelope(
|
|
21
|
-
'id: evt-1\n' +
|
|
22
33
|
'event: message\n' +
|
|
23
|
-
'data: {"directory":"/tmp/project","payload":{"type":"session.
|
|
34
|
+
'data: {"directory":"/tmp/project","payload":{"id":"evt_1","type":"session.renamed"}}\n'
|
|
24
35
|
);
|
|
25
36
|
|
|
26
37
|
expect(envelope).toEqual({
|
|
27
|
-
eventId: '
|
|
38
|
+
eventId: 'evt_1',
|
|
28
39
|
directory: '/tmp/project',
|
|
29
|
-
payload: { type: 'session.
|
|
40
|
+
payload: { id: 'evt_1', type: 'session.renamed' },
|
|
30
41
|
});
|
|
31
42
|
});
|
|
32
43
|
|
|
33
|
-
it('
|
|
44
|
+
it('has no directory when the payload carries no location', () => {
|
|
34
45
|
const envelope = parseSseEventEnvelope(
|
|
35
46
|
'data: {"type":"openchamber:notification","properties":{"directory":"/tmp/project"}}\n'
|
|
36
47
|
);
|
|
37
48
|
|
|
38
49
|
expect(envelope).toEqual({
|
|
39
50
|
eventId: null,
|
|
40
|
-
directory:
|
|
51
|
+
directory: null,
|
|
41
52
|
payload: {
|
|
42
53
|
type: 'openchamber:notification',
|
|
43
54
|
properties: { directory: '/tmp/project' },
|
|
@@ -74,20 +74,20 @@ describe('rebindUpstream (#2638)', () => {
|
|
|
74
74
|
|
|
75
75
|
// Port changes after a managed restart: buildOpenCodeUrl resolves the
|
|
76
76
|
// CURRENT port on every attempt, exactly like production network-runtime.
|
|
77
|
-
const buildOpenCodeUrl = vi.fn(() => `http://127.0.0.1:${port}/
|
|
77
|
+
const buildOpenCodeUrl = vi.fn(() => `http://127.0.0.1:${port}/api/event`);
|
|
78
78
|
const fetchImpl = vi.fn(async (_url, options) => {
|
|
79
79
|
fetchCalls += 1;
|
|
80
80
|
if (fetchCalls === 1) {
|
|
81
81
|
return createSseResponse({
|
|
82
82
|
signal: options.signal,
|
|
83
83
|
holdOpen: true,
|
|
84
|
-
blocks: ['id:
|
|
84
|
+
blocks: ['data: {"id":"evt-1","type":"server.connected","properties":{}}\n\n'],
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
87
|
return createSseResponse({
|
|
88
88
|
signal: options.signal,
|
|
89
89
|
holdOpen: true,
|
|
90
|
-
blocks: ['id:
|
|
90
|
+
blocks: ['data: {"id":"evt-2","type":"session.updated","properties":{"sessionID":"ses_1"}}\n\n'],
|
|
91
91
|
});
|
|
92
92
|
});
|
|
93
93
|
|
|
@@ -130,7 +130,7 @@ describe('rebindUpstream (#2638)', () => {
|
|
|
130
130
|
// The hub dialed the new port and the connected client received events
|
|
131
131
|
// from the new upstream without reconnecting its own socket.
|
|
132
132
|
expect(fetchCalls).toBe(2);
|
|
133
|
-
expect(fetchImpl.mock.calls[1][0]).toContain(':5000/
|
|
133
|
+
expect(fetchImpl.mock.calls[1][0]).toContain(':5000/api/event');
|
|
134
134
|
expect(socket.sent.some((frame) => frame.type === 'event' && frame.eventId === 'evt-2')).toBe(true);
|
|
135
135
|
|
|
136
136
|
socket.close();
|
|
@@ -149,7 +149,7 @@ describe('rebindUpstream (#2638)', () => {
|
|
|
149
149
|
return createSseResponse({
|
|
150
150
|
signal: options.signal,
|
|
151
151
|
holdOpen: true,
|
|
152
|
-
blocks: ['id:
|
|
152
|
+
blocks: ['data: {"id":"evt-1","type":"server.connected","properties":{}}\n\n'],
|
|
153
153
|
});
|
|
154
154
|
});
|
|
155
155
|
|
|
@@ -35,9 +35,9 @@ it('delivers oversized events live, but reports a replay gap instead of replayin
|
|
|
35
35
|
fetchImpl: async (_url, options) => createSseResponse({
|
|
36
36
|
signal: options.signal, holdOpen: true,
|
|
37
37
|
blocks: [
|
|
38
|
-
'
|
|
39
|
-
`
|
|
40
|
-
'
|
|
38
|
+
'data: {"id":"first","type":"first","properties":{}}\n\n',
|
|
39
|
+
`data: ${JSON.stringify({ id: 'large', type: 'large', properties: { text: '界'.repeat(1024) } })}\n\n`,
|
|
40
|
+
'data: {"id":"last","type":"last","properties":{}}\n\n',
|
|
41
41
|
],
|
|
42
42
|
}),
|
|
43
43
|
});
|
|
@@ -210,7 +210,7 @@ describe('message stream websocket runtime', () => {
|
|
|
210
210
|
signal: options.signal,
|
|
211
211
|
holdOpen: true,
|
|
212
212
|
blocks: [
|
|
213
|
-
'id:
|
|
213
|
+
'data: {"id":"evt-1","type":"server.connected","data":{}}\n\n',
|
|
214
214
|
],
|
|
215
215
|
});
|
|
216
216
|
},
|
|
@@ -228,13 +228,13 @@ describe('message stream websocket runtime', () => {
|
|
|
228
228
|
expect(secondSocket.sent).toContainEqual({ type: 'ready', scope: 'global' });
|
|
229
229
|
expect(firstSocket.sent).toContainEqual({
|
|
230
230
|
type: 'event',
|
|
231
|
-
payload: { type: 'server.connected',
|
|
231
|
+
payload: { id: 'evt-1', type: 'server.connected', data: {} },
|
|
232
232
|
eventId: 'evt-1',
|
|
233
233
|
directory: 'global',
|
|
234
234
|
});
|
|
235
235
|
expect(secondSocket.sent).toContainEqual({
|
|
236
236
|
type: 'event',
|
|
237
|
-
payload: { type: 'server.connected',
|
|
237
|
+
payload: { id: 'evt-1', type: 'server.connected', data: {} },
|
|
238
238
|
eventId: 'evt-1',
|
|
239
239
|
directory: 'global',
|
|
240
240
|
});
|
|
@@ -268,8 +268,8 @@ describe('message stream websocket runtime', () => {
|
|
|
268
268
|
signal: options.signal,
|
|
269
269
|
holdOpen: true,
|
|
270
270
|
blocks: [
|
|
271
|
-
'id:
|
|
272
|
-
'id:
|
|
271
|
+
'data: {"id":"evt-1","type":"server.connected","data":{}}\n\n',
|
|
272
|
+
'data: {"id":"evt-2","type":"session.renamed","location":{"directory":"/tmp/project"},"data":{"sessionID":"s1","title":"t"}}\n\n',
|
|
273
273
|
],
|
|
274
274
|
});
|
|
275
275
|
}
|
|
@@ -296,7 +296,7 @@ describe('message stream websocket runtime', () => {
|
|
|
296
296
|
expect(secondSocket.sent).toContainEqual({ type: 'ready', scope: 'global' });
|
|
297
297
|
expect(secondSocket.sent).toContainEqual({
|
|
298
298
|
type: 'event',
|
|
299
|
-
payload: { type: 'session.
|
|
299
|
+
payload: { id: 'evt-2', type: 'session.renamed', location: { directory: '/tmp/project' }, data: { sessionID: 's1', title: 't' } },
|
|
300
300
|
eventId: 'evt-2',
|
|
301
301
|
directory: '/tmp/project',
|
|
302
302
|
});
|
|
@@ -328,7 +328,7 @@ describe('message stream websocket runtime', () => {
|
|
|
328
328
|
signal: options.signal,
|
|
329
329
|
holdOpen: true,
|
|
330
330
|
blocks: [
|
|
331
|
-
'id:
|
|
331
|
+
'data: {"id":"evt-1","type":"server.connected","data":{}}\n\n',
|
|
332
332
|
],
|
|
333
333
|
});
|
|
334
334
|
},
|
|
@@ -488,7 +488,7 @@ describe('message stream websocket runtime', () => {
|
|
|
488
488
|
signal: options.signal,
|
|
489
489
|
holdOpen: true,
|
|
490
490
|
blocks: [
|
|
491
|
-
'id:
|
|
491
|
+
'data: {"id":"evt-1","type":"server.connected","data":{}}\n\n',
|
|
492
492
|
],
|
|
493
493
|
});
|
|
494
494
|
}
|
|
@@ -497,7 +497,7 @@ describe('message stream websocket runtime', () => {
|
|
|
497
497
|
signal: options.signal,
|
|
498
498
|
holdOpen: true,
|
|
499
499
|
blocks: [
|
|
500
|
-
'id:
|
|
500
|
+
'data: {"id":"evt-2","type":"server.connected","data":{}}\n\n',
|
|
501
501
|
],
|
|
502
502
|
});
|
|
503
503
|
},
|
|
@@ -534,7 +534,9 @@ describe('message stream websocket runtime', () => {
|
|
|
534
534
|
buildOpenCodeUrl: (path) => `http://127.0.0.1:4096${path}`,
|
|
535
535
|
getOpenCodeAuthHeaders: () => ({}),
|
|
536
536
|
processForwardedEventPayload(payload, emitSynthetic) {
|
|
537
|
-
|
|
537
|
+
// The bridge forwards the RAW v2 payload; the synthetic frames the UI
|
|
538
|
+
// also expects are derived from it in `index.js`.
|
|
539
|
+
if (payload.type === 'session.renamed') {
|
|
538
540
|
emitSynthetic({ type: 'openchamber:session-status', sessionID: 'ses_1' });
|
|
539
541
|
}
|
|
540
542
|
},
|
|
@@ -544,7 +546,7 @@ describe('message stream websocket runtime', () => {
|
|
|
544
546
|
signal: options.signal,
|
|
545
547
|
holdOpen: true,
|
|
546
548
|
blocks: [
|
|
547
|
-
'id:
|
|
549
|
+
'data: {"id":"evt-1","type":"session.renamed","location":{"directory":"/tmp/project"},"data":{"sessionID":"s1","title":"t"}}\n\n',
|
|
548
550
|
],
|
|
549
551
|
}),
|
|
550
552
|
});
|
|
@@ -556,7 +558,7 @@ describe('message stream websocket runtime', () => {
|
|
|
556
558
|
|
|
557
559
|
expect(socket.sent).toContainEqual({
|
|
558
560
|
type: 'event',
|
|
559
|
-
payload: { type: 'session.
|
|
561
|
+
payload: { id: 'evt-1', type: 'session.renamed', location: { directory: '/tmp/project' }, data: { sessionID: 's1', title: 't' } },
|
|
560
562
|
eventId: 'evt-1',
|
|
561
563
|
directory: '/tmp/project',
|
|
562
564
|
});
|