@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.
Files changed (367) hide show
  1. package/README.md +2 -8
  2. package/bin/lib/commands-connect-url.js +3 -8
  3. package/bin/lib/commands-tunnel.js +3 -0
  4. package/dist/assets/{CodeMirrorCommentWidgets-B4a0JkUz.js → CodeMirrorCommentWidgets-ntXIbhV2.js} +1 -1
  5. package/dist/assets/DiffView-CjxUovbM.js +4 -0
  6. package/dist/assets/FilesView-DFWD0RQR.js +17 -0
  7. package/dist/assets/{GitView-Byu2DY7s.js → GitView-BWa7e5vw.js} +4 -4
  8. package/dist/assets/{GuestAttachDialog-B808E0-d.js → GuestAttachDialog-DdOuyZzp.js} +1 -1
  9. package/dist/assets/GuestSurfacePane-DDfzid3U.js +1 -0
  10. package/dist/assets/{JsonTreeView-VW_7czo3.js → JsonTreeView-3sGwqexh.js} +1 -1
  11. package/dist/assets/LinearIssuesView-C6dpIdjw.js +1 -0
  12. package/dist/assets/MarkdownImageGallery-Q7YR_tl4.js +1 -0
  13. package/dist/assets/MarkdownRendererImpl-DxDV56bL.js +12 -0
  14. package/dist/assets/OnboardingScreen-rK4Stg__.js +1 -0
  15. package/dist/assets/{PatchDiff-DCjGhlYV.js → PatchDiff-DS-IMU1j.js} +1 -1
  16. package/dist/assets/{PierreDiffViewer-CEDZNkU2.js → PierreDiffViewer-DW23KWKZ.js} +1 -1
  17. package/dist/assets/PlanView-BCk_VobP.js +5 -0
  18. package/dist/assets/PluginPane-BPP1dbck.js +3 -0
  19. package/dist/assets/SettingsView-kMmrpn43.js +29 -0
  20. package/dist/assets/SettingsWindow-BpvD6IYQ.js +1 -0
  21. package/dist/assets/SubmoduleDiffSummary-BLttSS1X.js +1 -0
  22. package/dist/assets/ToolOutputDialog-CtqDqbyr.js +15 -0
  23. package/dist/assets/ToolPartDiffPreview-5FcKdyRy.js +8 -0
  24. package/dist/assets/{VirtualizedFileDiff-NU0FHFhT.js → VirtualizedFileDiff-C763hNCR.js} +4 -4
  25. package/dist/assets/{WalkthroughView-BZyjhqHv.js → WalkthroughView-lap5btCF.js} +2 -2
  26. package/dist/assets/appThemeRegistry-u4zw1l0B.js +1 -0
  27. package/dist/assets/{commitAndPush-BDftrjr6.js → commitAndPush-CwGJfJG-.js} +1 -1
  28. package/dist/assets/{computeVirtualFileMetrics-DlWlEM3x.js → computeVirtualFileMetrics-DW5jjX4n.js} +1 -1
  29. package/dist/assets/de-CndEg67T.js +10 -0
  30. package/dist/assets/es-DglvPlaC.js +16 -0
  31. package/dist/assets/fr-DejPCpbS.js +14 -0
  32. package/dist/assets/index-C2r64QfD.js +1 -0
  33. package/dist/assets/index-CLcM8HKx.css +1 -0
  34. package/dist/assets/index-CvLgnuNI.js +41 -0
  35. package/dist/assets/{isDiffPlainText-CO4e5J_S.js → isDiffPlainText-D47a6hMP.js} +1 -1
  36. package/dist/assets/{isFilePlainText-ue6kCou7.js → isFilePlainText-B-mGgeKl.js} +1 -1
  37. package/dist/assets/ja-CVpQawCd.js +16 -0
  38. package/dist/assets/ko-Bw446h9j.js +16 -0
  39. package/dist/assets/main-Bz4WWXbr.js +2 -0
  40. package/dist/assets/main-oreqDsOV.js +896 -0
  41. package/dist/assets/{markdownCore-CK48LG0z.js → markdownCore-D2e5sp9y.js} +4 -4
  42. package/dist/assets/miniChat-D1v2gsBI.js +2 -0
  43. package/dist/assets/mobile-DBj3lCf2.js +2 -0
  44. package/dist/assets/{patchFileDiff-D7QVlovD.js → patchFileDiff-BpeUOV91.js} +3 -3
  45. package/dist/assets/pl-BYNlPdhm.js +16 -0
  46. package/dist/assets/pt-BR-CL-Yfv9H.js +16 -0
  47. package/dist/assets/renderElectronMiniChatApp-DVtfEB2z.js +2 -0
  48. package/dist/assets/renderMobileApp-DFp9-xbG.js +25 -0
  49. package/dist/assets/runtimeEndpointReset-CsIpUep1.js +27 -0
  50. package/dist/assets/scheduledTasksApi-B5OHVpPM.js +1 -0
  51. package/dist/assets/{shikiHighlight-BPu3JiQs.js → shikiHighlight-DNm2Z_Jc.js} +1 -1
  52. package/dist/assets/{textMateThemeFromAppTheme-DWqRPo9A.js → textMateThemeFromAppTheme-DGF2kG7g.js} +1 -1
  53. package/dist/assets/tr-DzmbxLy-.js +7 -0
  54. package/dist/assets/uk-C7vQnwro.js +16 -0
  55. package/dist/assets/useAppFontEffects-Ci3FEaPf.js +7337 -0
  56. package/dist/assets/{useInlineCommentController-CgS0fnw_.js → useInlineCommentController-CuUuakrt.js} +2 -2
  57. package/dist/assets/useRootScrollLock-CQIsyERq.js +2 -0
  58. package/dist/assets/{vendor-codemirror-language-data-Bx2EHc1O.js → vendor-codemirror-language-data-CQa7_1cr.js} +2 -2
  59. package/dist/assets/vendor-cron-parser-CjvYVigk.js +2 -0
  60. package/dist/assets/vendor-opencode-client-_BAHQo4R.js +12 -0
  61. package/dist/assets/{vendor-remixicon-react-BDmGmFCA.js → vendor-remixicon-react-D6dZ0UwF.js} +1 -1
  62. package/dist/assets/{vendor-zod-CgAdXWZO.js → vendor-zod-Gea9uBlY.js} +1 -1
  63. package/dist/assets/{web-components-DxX8bZ1o.js → web-components-B6tKQyJN.js} +2 -2
  64. package/dist/assets/zh-CN-Cl0srS-z.js +16 -0
  65. package/dist/assets/zh-TW-DtII5bDb.js +16 -0
  66. package/dist/index.html +13 -7
  67. package/dist/mini-chat.html +5 -5
  68. package/dist/mobile.html +5 -5
  69. package/package.json +6 -5
  70. package/server/index.d.ts +1 -0
  71. package/server/index.js +246 -91
  72. package/server/lib/agent-tool/DOCUMENTATION.md +32 -15
  73. package/server/lib/agent-tool/runtime.js +135 -54
  74. package/server/lib/agent-tool/runtime.test.js +155 -87
  75. package/server/lib/browser-control/DOCUMENTATION.md +37 -2
  76. package/server/lib/browser-control/provider.js +217 -0
  77. package/server/lib/browser-control/provider.test.js +251 -0
  78. package/server/lib/context-obligatory/runtime.js +61 -50
  79. package/server/lib/context-obligatory/runtime.test.js +62 -162
  80. package/server/lib/event-stream/DOCUMENTATION.md +12 -1
  81. package/server/lib/event-stream/delta-coalescer.js +0 -0
  82. package/server/lib/event-stream/delta-coalescer.test.js +68 -57
  83. package/server/lib/event-stream/directory-ws-bridge.js +1 -1
  84. package/server/lib/event-stream/global-hub.js +10 -1
  85. package/server/lib/event-stream/global-hub.test.js +27 -26
  86. package/server/lib/event-stream/index.js +6 -0
  87. package/server/lib/event-stream/protocol.js +26 -19
  88. package/server/lib/event-stream/protocol.test.js +18 -7
  89. package/server/lib/event-stream/rebind.test.js +5 -5
  90. package/server/lib/event-stream/runtime.test.js +17 -15
  91. package/server/lib/event-stream/translate-v2.js +313 -0
  92. package/server/lib/event-stream/translate-v2.test.js +209 -0
  93. package/server/lib/event-stream/upstream-reader.test.js +16 -16
  94. package/server/lib/fs/DOCUMENTATION.md +4 -2
  95. package/server/lib/fs/byte-range.js +35 -0
  96. package/server/lib/fs/byte-range.test.js +31 -0
  97. package/server/lib/fs/routes.js +47 -42
  98. package/server/lib/fs/routes.test.js +123 -18
  99. package/server/lib/git/service.js +12 -0
  100. package/server/lib/github/DOCUMENTATION.md +1 -1
  101. package/server/lib/github/pr-status.js +22 -2
  102. package/server/lib/github/pr-status.test.js +27 -14
  103. package/server/lib/guests/DOCUMENTATION.md +13 -0
  104. package/server/lib/guests/catalog.js +12 -0
  105. package/server/lib/guests/catalog.test.js +33 -0
  106. package/server/lib/guests/routes.js +10 -1
  107. package/server/lib/guests/service.js +192 -14
  108. package/server/lib/guests/service.test.js +201 -1
  109. package/server/lib/guests/surface.js +630 -0
  110. package/server/lib/guests/surface.test.js +486 -0
  111. package/server/lib/markdown-image-grants/routes.js +18 -5
  112. package/server/lib/markdown-image-grants/routes.test.js +9 -6
  113. package/server/lib/message-queue/DOCUMENTATION.md +33 -22
  114. package/server/lib/message-queue/runtime.js +155 -100
  115. package/server/lib/message-queue/runtime.test.js +168 -82
  116. package/server/lib/notifications/DOCUMENTATION.md +28 -0
  117. package/server/lib/notifications/control-stream.http.test.js +68 -0
  118. package/server/lib/notifications/emitter-runtime.js +15 -0
  119. package/server/lib/notifications/emitter-runtime.test.js +32 -0
  120. package/server/lib/notifications/push-runtime.js +5 -1
  121. package/server/lib/notifications/push-runtime.test.js +2 -2
  122. package/server/lib/notifications/routes.js +1 -1
  123. package/server/lib/notifications/runtime.js +115 -26
  124. package/server/lib/notifications/template-runtime.js +13 -15
  125. package/server/lib/notifications/template-runtime.test.js +16 -9
  126. package/server/lib/notifications/trigger-runtime.test.js +187 -0
  127. package/server/lib/openchamber-control/DOCUMENTATION.md +10 -0
  128. package/server/lib/openchamber-control/actions.js +3 -2
  129. package/server/lib/openchamber-control/error.js +1 -1
  130. package/server/lib/openchamber-control/file-open.js +59 -0
  131. package/server/lib/openchamber-control/file-open.test.js +57 -0
  132. package/server/lib/openchamber-control/routes.test.js +12 -0
  133. package/server/lib/openchamber-control/service.js +102 -49
  134. package/server/lib/openchamber-control/service.test.js +84 -44
  135. package/server/lib/openchamber-sessions/archive-store.js +224 -0
  136. package/server/lib/openchamber-sessions/archive-store.test.js +187 -0
  137. package/server/lib/openchamber-sessions/opencode-client.js +22 -0
  138. package/server/lib/openchamber-sessions/routes.js +398 -328
  139. package/server/lib/openchamber-sessions/routes.test.js +777 -740
  140. package/server/lib/openchamber-sessions/session-metadata-store.js +285 -0
  141. package/server/lib/openchamber-sessions/session-metadata-store.test.js +259 -0
  142. package/server/lib/opencode/DOCUMENTATION.md +449 -29
  143. package/server/lib/opencode/agents.js +233 -327
  144. package/server/lib/opencode/auth.js +41 -44
  145. package/server/lib/opencode/auth.test.js +92 -0
  146. package/server/lib/opencode/cli-upgrade.d.ts +4 -0
  147. package/server/lib/opencode/cli-upgrade.js +18 -0
  148. package/server/lib/opencode/cli-upgrade.test.js +36 -0
  149. package/server/lib/opencode/commands.js +164 -145
  150. package/server/lib/opencode/compatibility.d.ts +16 -0
  151. package/server/lib/opencode/compatibility.js +88 -0
  152. package/server/lib/opencode/compatibility.test.js +62 -0
  153. package/server/lib/opencode/config-entity-routes.js +58 -29
  154. package/server/lib/opencode/config-entity-v2.test.js +290 -0
  155. package/server/lib/opencode/config-mutation-response.js +17 -7
  156. package/server/lib/opencode/config-mutation-response.test.js +4 -7
  157. package/server/lib/opencode/config-paths.test.js +2 -2
  158. package/server/lib/opencode/config-v2.d.ts +183 -0
  159. package/server/lib/opencode/config-v2.js +801 -0
  160. package/server/lib/opencode/config-v2.test.js +466 -0
  161. package/server/lib/opencode/credential-db.js +144 -0
  162. package/server/lib/opencode/credential-db.test.js +104 -0
  163. package/server/lib/opencode/env-runtime.js +48 -9
  164. package/server/lib/opencode/env-runtime.test.js +45 -0
  165. package/server/lib/opencode/feature-routes-runtime.js +15 -5
  166. package/server/lib/opencode/lifecycle-process.test.js +7 -4
  167. package/server/lib/opencode/lifecycle.js +85 -30
  168. package/server/lib/opencode/lifecycle.test.js +80 -8
  169. package/server/lib/opencode/login-shell-env.js +27 -0
  170. package/server/lib/opencode/managed-config-file.js +119 -0
  171. package/server/lib/opencode/managed-config-file.test.js +152 -0
  172. package/server/lib/opencode/managed-plugin-config.js +33 -13
  173. package/server/lib/opencode/mcp.js +43 -149
  174. package/server/lib/opencode/network-runtime.js +6 -7
  175. package/server/lib/opencode/openchamber-routes.test.js +2 -5
  176. package/server/lib/opencode/plugin-routes.js +3 -3
  177. package/server/lib/opencode/plugin-routes.test.js +6 -24
  178. package/server/lib/opencode/plugins.js +91 -40
  179. package/server/lib/opencode/plugins.test.js +28 -15
  180. package/server/lib/opencode/providers.js +63 -83
  181. package/server/lib/opencode/providers.test.js +128 -59
  182. package/server/lib/opencode/proxy-agent-wiring.test.js +4 -2
  183. package/server/lib/opencode/proxy.js +179 -129
  184. package/server/lib/opencode/pwa-manifest-routes.js +4 -2
  185. package/server/lib/opencode/pwa-manifest-routes.test.js +3 -2
  186. package/server/lib/opencode/response-envelope.js +14 -0
  187. package/server/lib/opencode/response-envelope.test.js +23 -0
  188. package/server/lib/opencode/routes-upgrade.test.js +73 -116
  189. package/server/lib/opencode/routes.js +121 -428
  190. package/server/lib/opencode/server-utils-runtime.js +10 -4
  191. package/server/lib/opencode/session-activity.js +78 -0
  192. package/server/lib/opencode/session-runtime.js +21 -10
  193. package/server/lib/opencode/session-runtime.test.js +9 -9
  194. package/server/lib/opencode/settings-helpers.js +9 -9
  195. package/server/lib/opencode/settings-helpers.test.js +7 -12
  196. package/server/lib/opencode/settings-registry.json +6 -8
  197. package/server/lib/opencode/settings-runtime.js +18 -1
  198. package/server/lib/opencode/settings-runtime.test.js +31 -2
  199. package/server/lib/opencode/shared.js +54 -22
  200. package/server/lib/opencode/shared.test.js +8 -4
  201. package/server/lib/opencode/shutdown-runtime.js +54 -7
  202. package/server/lib/opencode/shutdown-runtime.test.js +224 -30
  203. package/server/lib/opencode/skill-routes.js +23 -24
  204. package/server/lib/opencode/skills.js +7 -5
  205. package/server/lib/opencode/tunnel-wiring-runtime.js +2 -1
  206. package/server/lib/opencode/upgrade-capability.test.js +1 -1
  207. package/server/lib/opencode/v1-migration-topup.js +288 -0
  208. package/server/lib/opencode/v1-migration-topup.test.js +266 -0
  209. package/server/lib/opencode/v2-install.d.ts +8 -0
  210. package/server/lib/opencode/v2-install.js +158 -0
  211. package/server/lib/opencode/v2-install.test.js +124 -0
  212. package/server/lib/opencode/watcher.js +10 -3
  213. package/server/lib/opencode/watcher.test.js +17 -21
  214. package/server/lib/opencode/websearch-config.js +66 -0
  215. package/server/lib/package-manager.js +55 -68
  216. package/server/lib/package-manager.test.js +241 -75
  217. package/server/lib/permission-auto-accept/runtime.js +38 -22
  218. package/server/lib/permission-auto-accept/runtime.test.js +39 -17
  219. package/server/lib/quota/DOCUMENTATION.md +4 -0
  220. package/server/lib/quota/providers/xai.js +4 -4
  221. package/server/lib/relay/tunnel-host.js +4 -1
  222. package/server/lib/relay/tunnel-host.test.js +7 -0
  223. package/server/lib/routing/DOCUMENTATION.md +52 -21
  224. package/server/lib/routing/defaults.js +23 -6
  225. package/server/lib/routing/jev.js +17 -7
  226. package/server/lib/routing/routes.http.test.js +68 -33
  227. package/server/lib/routing/routes.js +65 -22
  228. package/server/lib/routing/runtime.js +145 -48
  229. package/server/lib/routing/runtime.test.js +79 -55
  230. package/server/lib/scheduled-tasks/DOCUMENTATION.md +4 -0
  231. package/server/lib/scheduled-tasks/issue-2710-double-execution.test.js +51 -46
  232. package/server/lib/scheduled-tasks/runtime.js +81 -74
  233. package/server/lib/scheduled-tasks/runtime.test.js +53 -1
  234. package/server/lib/session-assist/DOCUMENTATION.md +8 -3
  235. package/server/lib/session-assist/context.js +122 -46
  236. package/server/lib/session-assist/context.test.js +117 -49
  237. package/server/lib/session-assist/runtime.js +52 -22
  238. package/server/lib/session-assist/runtime.test.js +145 -173
  239. package/server/lib/session-goal/DOCUMENTATION.md +23 -15
  240. package/server/lib/session-goal/create.js +9 -12
  241. package/server/lib/session-goal/create.test.js +27 -28
  242. package/server/lib/session-goal/runtime.js +164 -77
  243. package/server/lib/session-goal/runtime.test.js +271 -519
  244. package/server/lib/session-knowledge/DOCUMENTATION.md +5 -0
  245. package/server/lib/session-knowledge/runtime.js +59 -41
  246. package/server/lib/session-knowledge/runtime.test.js +90 -20
  247. package/server/lib/small-model/DOCUMENTATION.md +154 -208
  248. package/server/lib/small-model/client.js +113 -0
  249. package/server/lib/small-model/index.js +296 -158
  250. package/server/lib/small-model/index.test.js +423 -256
  251. package/server/lib/small-model/routes.js +1 -1
  252. package/server/lib/spaces/DOCUMENTATION.md +807 -0
  253. package/server/lib/spaces/code-in-bait.js +185 -0
  254. package/server/lib/spaces/code-in.js +641 -0
  255. package/server/lib/spaces/code-in.test.js +1048 -0
  256. package/server/lib/spaces/errors.js +8 -0
  257. package/server/lib/spaces/exec-http.js +94 -0
  258. package/server/lib/spaces/gatekeeper-channel.js +202 -0
  259. package/server/lib/spaces/gatekeeper-channel.test.js +215 -0
  260. package/server/lib/spaces/gatekeeper-program.cjs +914 -0
  261. package/server/lib/spaces/gatekeeper-program.test.js +1391 -0
  262. package/server/lib/spaces/hardening.js +457 -0
  263. package/server/lib/spaces/hardening.test.js +368 -0
  264. package/server/lib/spaces/host-git.js +127 -0
  265. package/server/lib/spaces/host-git.test.js +137 -0
  266. package/server/lib/spaces/labels.js +234 -0
  267. package/server/lib/spaces/labels.test.js +219 -0
  268. package/server/lib/spaces/layout.js +184 -0
  269. package/server/lib/spaces/layout.test.js +30 -0
  270. package/server/lib/spaces/manager.js +82 -0
  271. package/server/lib/spaces/manager.test.js +114 -0
  272. package/server/lib/spaces/places/code-in.docker.live.test.js +216 -0
  273. package/server/lib/spaces/places/contract-suite.js +156 -0
  274. package/server/lib/spaces/places/contract.docker.live.test.js +7 -0
  275. package/server/lib/spaces/places/contract.test.js +6 -0
  276. package/server/lib/spaces/places/docker-engine.js +126 -0
  277. package/server/lib/spaces/places/docker-live-support.js +202 -0
  278. package/server/lib/spaces/places/docker-tools.js +186 -0
  279. package/server/lib/spaces/places/docker.js +587 -0
  280. package/server/lib/spaces/places/docker.test.js +1610 -0
  281. package/server/lib/spaces/places/escape-suite.js +1018 -0
  282. package/server/lib/spaces/places/escape.docker.live.test.js +7 -0
  283. package/server/lib/spaces/places/fake-docker.js +375 -0
  284. package/server/lib/spaces/places/memory-place.js +103 -0
  285. package/server/lib/spaces/places/packed.docker.live.test.js +77 -0
  286. package/server/lib/spaces/places/registry.js +43 -0
  287. package/server/lib/spaces/places/registry.test.js +50 -0
  288. package/server/lib/spaces/places/server.docker.live.test.js +225 -0
  289. package/server/lib/spaces/run-command.js +261 -0
  290. package/server/lib/spaces/run-command.test.js +396 -0
  291. package/server/lib/spaces/space-server.js +190 -0
  292. package/server/lib/spaces/space-server.test.js +335 -0
  293. package/server/lib/spaces/tools-filler.js +82 -0
  294. package/server/lib/spaces/tools-filler.test.js +148 -0
  295. package/server/lib/spaces/tools-pack.js +49 -0
  296. package/server/lib/spaces/tools-pack.test.js +57 -0
  297. package/server/lib/spaces/tools.js +138 -0
  298. package/server/lib/spaces/tools.test.js +153 -0
  299. package/server/lib/tts/openai-sdk.js +11 -0
  300. package/server/lib/tts/service.js +7 -5
  301. package/server/lib/tts/stt.js +3 -2
  302. package/server/lib/tunnels/DOCUMENTATION.md +2 -0
  303. package/server/lib/tunnels/routes.js +7 -0
  304. package/server/lib/tunnels/routes.test.js +55 -0
  305. package/server/lib/ui-auth/ui-auth.js +38 -2
  306. package/server/lib/ui-auth/ui-auth.test.js +42 -0
  307. package/server/lib/ui-auth/ui-passkeys.js +12 -10
  308. package/server/lib/walkthrough/DOCUMENTATION.md +10 -1
  309. package/server/lib/walkthrough/pull-request.js +61 -8
  310. package/server/lib/walkthrough/pull-request.test.js +54 -1
  311. package/server/lib/walkthrough/routes.js +20 -0
  312. package/server/lib/walkthrough/routes.test.js +19 -0
  313. package/server/opencode-proxy.test.js +190 -166
  314. package/server/opencode-worktree-readiness.test.js +5 -4
  315. package/dist/assets/DiffView-B2CD9wC8.js +0 -4
  316. package/dist/assets/FilesView-C4vMFclc.js +0 -13
  317. package/dist/assets/LinearIssuesView-EzGNCGrd.js +0 -1
  318. package/dist/assets/MarkdownImageGallery-B2YUDFaB.js +0 -1
  319. package/dist/assets/MarkdownRendererImpl-B4ikIzR3.js +0 -12
  320. package/dist/assets/OnboardingScreen-CQHBSTEi.js +0 -1
  321. package/dist/assets/PlanView-D3x-pTkZ.js +0 -5
  322. package/dist/assets/PluginPane-DEcgDQ9h.js +0 -3
  323. package/dist/assets/SettingsView-CSinuH-1.js +0 -29
  324. package/dist/assets/SettingsWindow-B5CHoJFZ.js +0 -1
  325. package/dist/assets/SubmoduleDiffSummary-oxeACCWs.js +0 -1
  326. package/dist/assets/ToolOutputDialog-tLNWmfcW.js +0 -15
  327. package/dist/assets/ToolPartDiffPreview-CflzmK-x.js +0 -8
  328. package/dist/assets/appThemeRegistry-DLicw4dH.js +0 -1
  329. package/dist/assets/de-Bro6_zyl.js +0 -10
  330. package/dist/assets/es-Bb9XQZvd.js +0 -16
  331. package/dist/assets/fr-Dgfzn-IL.js +0 -14
  332. package/dist/assets/index-CtQNmqUL.js +0 -1
  333. package/dist/assets/index-DqaMWNrC.css +0 -1
  334. package/dist/assets/index-Dqc6USl3.js +0 -40
  335. package/dist/assets/ja-BYsakGFh.js +0 -16
  336. package/dist/assets/ko-BSaQz9aN.js +0 -16
  337. package/dist/assets/main-B62_pjL5.js +0 -2
  338. package/dist/assets/main-BEdcOI2P.js +0 -896
  339. package/dist/assets/miniChat-LT8Rqofr.js +0 -2
  340. package/dist/assets/mobile-CqarEynh.js +0 -2
  341. package/dist/assets/pl-OIviPdoj.js +0 -16
  342. package/dist/assets/pt-BR-Cltg-E6s.js +0 -16
  343. package/dist/assets/renderElectronMiniChatApp-COyLTtZx.js +0 -2
  344. package/dist/assets/renderMobileApp-BC1MHg6g.js +0 -25
  345. package/dist/assets/runtimeEndpointReset-DdrazOVH.js +0 -25
  346. package/dist/assets/scheduledTasksApi-B2SWMGEU.js +0 -1
  347. package/dist/assets/tr-CQI-KPre.js +0 -7
  348. package/dist/assets/uk-CqW7R4DA.js +0 -16
  349. package/dist/assets/useAppFontEffects-ne84JBVL.js +0 -7333
  350. package/dist/assets/useRootScrollLock-Cpf1qoGp.js +0 -2
  351. package/dist/assets/vendor-cron-parser-CUcP7OfX.js +0 -2
  352. package/dist/assets/vendor-opencode-sdk-BJ73u-bH.js +0 -7
  353. package/dist/assets/zh-CN-CVZG_o_J.js +0 -16
  354. package/dist/assets/zh-TW-D5ZxzCZp.js +0 -16
  355. package/server/lib/opencode/mcp-oauth-callback.test.js +0 -111
  356. package/server/lib/routing/feature-flag.js +0 -11
  357. package/server/lib/small-model/call.js +0 -851
  358. package/server/lib/small-model/call.test.js +0 -1292
  359. package/server/lib/small-model/catalog.js +0 -13
  360. package/server/lib/small-model/resolve.js +0 -131
  361. package/server/lib/small-model/resolve.test.js +0 -197
  362. package/server/lib/small-model/runtime-providers.js +0 -164
  363. package/server/lib/small-model/runtime-providers.test.js +0 -118
  364. package/server/lib/system-prompt/DOCUMENTATION.md +0 -36
  365. package/server/lib/system-prompt/runtime.js +0 -49
  366. package/server/lib/system-prompt/runtime.test.js +0 -76
  367. 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
- const blocks = Array.from({ length: 8 }, (_, i) => `id: e${i}\ndata: ${JSON.stringify({ type: 'message', properties: { text: '界'.repeat(40) } })}\n\n`);
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: 550,
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(550);
23
- expect(Buffer.byteLength(tail[0].serializedFrame) * 3).toBeGreaterThan(550);
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, partID = 'prt_a') => `id: ${id}\ndata: ${JSON.stringify({
66
- id, type: 'message.part.delta',
67
- properties: { sessionID: 'ses_1', messageID: 'msg_1', partID, field: 'text', delta: text },
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 part, and the
79
- // text each part had when a snapshot barrier passed.
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 === 'message.part.delta') {
86
- text[payload.properties.partID] = (text[payload.properties.partID] ?? '') + payload.properties.delta;
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.prt_a).toBe(words.join('')));
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 ? 'prt_b' : 'prt_a'));
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: 'message.part.updated', properties: { part: { id: 'prt_a', messageID: 'msg_1' } } })}\n\n`);
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.prt_a).toBe(expectedA));
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.prt_a).toBe([...Array(40).keys()].filter((index) => index % 3 !== 0).map((index) => `a${index}.`).join(''));
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 1.18 sends no SSE ids at all. Before the hub numbered such events
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, properties) => `data: ${JSON.stringify({ type, properties })}\n\n`;
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('message.part.delta', { sessionID: 'ses_1', messageID: 'msg_1', partID: 'prt_a', field: 'text', delta: `a${index}.` }));
149
+ blocks.push(idless('session.text.delta', { sessionID: 'ses_1', assistantMessageID: 'msg_1', ordinal: 1, delta: `a${index}.` }));
149
150
  }
150
- blocks.push(idless('message.part.updated', { part: { id: 'prt_a', messageID: 'msg_1' } }));
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('message.part.delta', { sessionID: 'ses_1', messageID: 'msg_1', partID: 'prt_a', field: 'text', delta: `b${index}.` }));
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.prt_a).toBe(expected));
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.prt_a).toBe('two three');
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.prt_a).toBe('one two three');
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: evt-1\ndata: {"type":"session.updated","properties":{}}\n\n',
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: evt-1\ndata: {"type":"session.updated","properties":{}}\n\n',
298
+ 'data: {"id":"evt-1","type":"session.updated","properties":{}}\n\n',
298
299
  ],
299
300
  }),
300
301
  });
@@ -15,3 +15,9 @@ export {
15
15
  DEFAULT_UPSTREAM_STALL_TIMEOUT_MS,
16
16
  UPSTREAM_STALL_TIMEOUT_CONCURRENT_MS,
17
17
  } from './upstream-reader.js';
18
+
19
+ export {
20
+ forwardTranslatedWireEvent,
21
+ translateWireEvent,
22
+ wireEventDirectory,
23
+ } from './translate-v2.js';
@@ -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 ? parsed.directory : null,
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('parses wrapped SSE payloads with event id and directory', () => {
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.updated"}}\n'
34
+ 'data: {"directory":"/tmp/project","payload":{"id":"evt_1","type":"session.renamed"}}\n'
24
35
  );
25
36
 
26
37
  expect(envelope).toEqual({
27
- eventId: 'evt-1',
38
+ eventId: 'evt_1',
28
39
  directory: '/tmp/project',
29
- payload: { type: 'session.updated' },
40
+ payload: { id: 'evt_1', type: 'session.renamed' },
30
41
  });
31
42
  });
32
43
 
33
- it('derives directory from payload properties when not wrapped', () => {
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: '/tmp/project',
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}/global/event`);
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: evt-1\ndata: {"type":"server.connected","properties":{}}\n\n'],
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: evt-2\ndata: {"type":"session.updated","properties":{"sessionID":"ses_1"}}\n\n'],
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/global/event');
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: evt-1\ndata: {"type":"server.connected","properties":{}}\n\n'],
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
- 'id: first\ndata: {"type":"first","properties":{}}\n\n',
39
- `id: large\ndata: ${JSON.stringify({ type: 'large', properties: { text: '界'.repeat(1024) } })}\n\n`,
40
- 'id: last\ndata: {"type":"last","properties":{}}\n\n',
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: evt-1\ndata: {"type":"server.connected","properties":{}}\n\n',
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', properties: {} },
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', properties: {} },
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: evt-1\ndata: {"type":"server.connected","properties":{}}\n\n',
272
- 'id: evt-2\ndata: {"type":"session.updated","properties":{"directory":"/tmp/project"}}\n\n',
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.updated', properties: { directory: '/tmp/project' } },
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: evt-1\ndata: {"type":"server.connected","properties":{}}\n\n',
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: evt-1\ndata: {"type":"server.connected","properties":{}}\n\n',
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: evt-2\ndata: {"type":"server.connected","properties":{}}\n\n',
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
- if (payload.type === 'session.updated') {
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: evt-1\ndata: {"type":"session.updated","properties":{"directory":"/tmp/project"}}\n\n',
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.updated', properties: { directory: '/tmp/project' } },
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
  });