@aiworker/web 1.22.0 → 1.22.2

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 (354) hide show
  1. package/README.md +4 -4
  2. package/bin/cli.js +7 -4
  3. package/bin/cli.test.js +165 -73
  4. package/bin/lib/cli-api-target.js +2 -2
  5. package/bin/lib/cli-args.js +119 -119
  6. package/bin/lib/cli-lifecycle.js +9 -9
  7. package/bin/lib/cli-network.js +3 -3
  8. package/bin/lib/cli-paths.js +3 -3
  9. package/bin/lib/cli-ports.js +2 -2
  10. package/bin/lib/cli-process.js +4 -4
  11. package/bin/lib/cli-startup.js +64 -15
  12. package/bin/lib/cli-tunnel-profiles.js +1 -1
  13. package/bin/lib/cli-tunnel-utils.js +2 -2
  14. package/bin/lib/commands-connect-url.js +19 -19
  15. package/bin/lib/commands-lifecycle.js +27 -27
  16. package/bin/lib/commands-logs.js +5 -5
  17. package/bin/lib/commands-models.js +1 -1
  18. package/bin/lib/commands-projects.js +1 -1
  19. package/bin/lib/commands-schedule.js +1 -1
  20. package/bin/lib/commands-serve.js +29 -29
  21. package/bin/lib/commands-session.js +1 -1
  22. package/bin/lib/commands-startup.js +45 -10
  23. package/bin/lib/commands-status.js +1 -1
  24. package/bin/lib/commands-tunnel.js +40 -40
  25. package/bin/lib/commands-update.js +1 -1
  26. package/bin/lib/commands-update.test.js +6 -6
  27. package/dist/assets/{CodeMirrorCommentWidgets-B3u7UIcE.js → CodeMirrorCommentWidgets-CSICpWQD.js} +1 -1
  28. package/dist/assets/{DiffView-DluiRSla.js → DiffView-hDBKesA_.js} +3 -3
  29. package/dist/assets/DirtyBranchSwitchDialog-C22HdWj4.js +1 -0
  30. package/dist/assets/FilesView-CdWzeOp9.js +17 -0
  31. package/dist/assets/GitView-VQQkYuUw.js +6 -0
  32. package/dist/assets/{JsonTreeView-B0BdZEHG.js → JsonTreeView-6lrhwD3q.js} +1 -1
  33. package/dist/assets/LinearIssuesView-Ba6Q9569.js +1 -0
  34. package/dist/assets/{MarkdownImageGallery-ClOvuZxC.js → MarkdownImageGallery-Czv_mhvS.js} +1 -1
  35. package/dist/assets/MarkdownRendererImpl-BrMcswiy.js +12 -0
  36. package/dist/assets/{OnboardingScreen-D2DG7K6b.js → OnboardingScreen-ChxQoAkx.js} +1 -1
  37. package/dist/assets/{PatchDiff-DvfqDql7.js → PatchDiff-BzcZPlOq.js} +1 -1
  38. package/dist/assets/{PierreDiffViewer-B7m3f0d7.js → PierreDiffViewer-BchBtZlp.js} +2 -2
  39. package/dist/assets/PlanView-DyDt_nZ_.js +5 -0
  40. package/dist/assets/SettingsView-BKf5xBsP.js +28 -0
  41. package/dist/assets/{SettingsWindow-i45U1Cy1.js → SettingsWindow-DDQYaKWQ.js} +1 -1
  42. package/dist/assets/{ToolOutputDialog-BTwyh5OF.js → ToolOutputDialog-iYF8Y2bz.js} +6 -6
  43. package/dist/assets/ToolPartDiffPreview-CdjbOVMM.js +8 -0
  44. package/dist/assets/{VirtualizedFileDiff-DD8lDVej.js → VirtualizedFileDiff-fFFm2QgH.js} +1 -1
  45. package/dist/assets/{WalkthroughView-egQgxel3.js → WalkthroughView-DOeCsMju.js} +2 -2
  46. package/dist/assets/{computeVirtualFileMetrics-BMIRgMHv.js → computeVirtualFileMetrics-CzgLum_K.js} +2 -2
  47. package/dist/assets/{contextPanelEmbeddedChat-C3fjDbdg.js → contextPanelEmbeddedChat-C0ZLAepL.js} +1 -1
  48. package/dist/assets/{de-C1P6X5Rs.js → de-B5JaA3SA.js} +6 -5
  49. package/dist/assets/{es-CDgaF1_t.js → es-EPIH88ii.js} +6 -5
  50. package/dist/assets/{fr-Bgxqvvz_.js → fr-CAMfxUdZ.js} +6 -5
  51. package/dist/assets/{index-CODwDsU_.js → index-Bl3LSbjn.js} +1 -1
  52. package/dist/assets/index-DF5kMP-i.js +39 -0
  53. package/dist/assets/index-Dl3xbAB_.css +1 -0
  54. package/dist/assets/{isDiffPlainText-BqayB8d3.js → isDiffPlainText-Dx-dB_8l.js} +1 -1
  55. package/dist/assets/{isFilePlainText-QfoiKJNY.js → isFilePlainText-CWFPwmnU.js} +1 -1
  56. package/dist/assets/{ja-BDRrEcNP.js → ja-CifOE1VN.js} +7 -6
  57. package/dist/assets/{ko-Ba8sQV79.js → ko-BBDyAyYQ.js} +7 -6
  58. package/dist/assets/{main-C5DVOxc6.js → main-DnBAoktx.js} +2 -2
  59. package/dist/assets/main-MhSaOZoB.js +930 -0
  60. package/dist/assets/{markdownCore-CZwzz5gw.js → markdownCore-BrBwOOMn.js} +2 -2
  61. package/dist/assets/{miniChat-DUJ4irZc.js → miniChat-BKyvLseN.js} +2 -2
  62. package/dist/assets/{mobile-CcaxB0n4.js → mobile-DKjeFgMN.js} +2 -2
  63. package/dist/assets/{patchFileDiff-yNfWXN4E.js → patchFileDiff-o8ms1me8.js} +1 -1
  64. package/dist/assets/pl-DgEHYfFM.js +16 -0
  65. package/dist/assets/{pt-BR-DIs6ElwV.js → pt-BR-DuWHojUw.js} +6 -5
  66. package/dist/assets/{renderElectronMiniChatApp-BcKLHXKe.js → renderElectronMiniChatApp-CDgBwwCS.js} +2 -2
  67. package/dist/assets/renderMobileApp-DJIKIK1r.js +25 -0
  68. package/dist/assets/runtimeEndpointReset-CYJ9O_xX.js +17 -0
  69. package/dist/assets/{scheduledTasksApi-DLW0mkQK.js → scheduledTasksApi-D8yamh1b.js} +1 -1
  70. package/dist/assets/{shikiHighlight-DYOWuY65.js → shikiHighlight-TEQCmzW8.js} +1 -1
  71. package/dist/assets/tr-D5m2yIWL.js +7 -0
  72. package/dist/assets/{uk-ZrCNjM7Y.js → uk-D_q60oog.js} +6 -5
  73. package/dist/assets/{useAppFontEffects-CjrntdL0.js → useAppFontEffects-D7sNpuL2.js} +161 -190
  74. package/dist/assets/useInlineCommentController-Brz_cLcQ.js +2 -0
  75. package/dist/assets/{useRootScrollLock-BHYPkrLv.js → useRootScrollLock-lXEnWlaU.js} +1 -1
  76. package/dist/assets/{vendor-codemirror-language-data-DFZik9R2.js → vendor-codemirror-language-data-Dp3KMRQG.js} +2 -2
  77. package/dist/assets/vendor-zod-CK21ihK-.js +39 -0
  78. package/dist/assets/{web-components-Bhg83tjf.js → web-components-_mNEMjFY.js} +1 -1
  79. package/dist/assets/{zh-CN-iv_AV4EC.js → zh-CN-D8QvsVeg.js} +6 -5
  80. package/dist/assets/{zh-TW-CzEUk38j.js → zh-TW-B9t7rQQO.js} +6 -5
  81. package/dist/index.html +22 -22
  82. package/dist/mini-chat.html +7 -7
  83. package/dist/mobile.html +5 -5
  84. package/package.json +3 -3
  85. package/server/index.js +118 -85
  86. package/server/lib/agent-memory/actions.js +2 -2
  87. package/server/lib/agent-memory/feature-flag.js +1 -1
  88. package/server/lib/agent-memory/feature-flag.test.js +8 -8
  89. package/server/lib/agent-memory/routes.js +2 -2
  90. package/server/lib/agent-tool/runtime.js +37 -54
  91. package/server/lib/agent-tool/runtime.test.js +59 -59
  92. package/server/lib/browser-control/broker.js +3 -3
  93. package/server/lib/browser-control/broker.test.js +1 -1
  94. package/server/lib/changelog/update-notes.js +82 -0
  95. package/server/lib/changelog/update-notes.test.js +59 -0
  96. package/server/lib/client-auth/remote-clients.test.js +5 -5
  97. package/server/lib/context-obligatory/runtime.js +7 -7
  98. package/server/lib/context-obligatory/runtime.test.js +5 -5
  99. package/server/lib/dev-servers/parse.js +2 -2
  100. package/server/lib/dev-servers/parse.test.js +2 -2
  101. package/server/lib/dev-servers/routes.js +1 -1
  102. package/server/lib/dev-tunnel/DOCUMENTATION.md +13 -4
  103. package/server/lib/dev-tunnel/client.js +1 -1
  104. package/server/lib/dev-tunnel/runtime.js +5 -5
  105. package/server/lib/dev-tunnel/tunnel.test.js +21 -1
  106. package/server/lib/dictation/local/model-catalog.js +1 -1
  107. package/server/lib/dictation/local/worker-process.js +2 -2
  108. package/server/lib/event-stream/directory-ws-bridge.js +1 -1
  109. package/server/lib/event-stream/global-ws-bridge.js +1 -1
  110. package/server/lib/event-stream/protocol.test.js +4 -4
  111. package/server/lib/event-stream/runtime.test.js +6 -6
  112. package/server/lib/fs/DOCUMENTATION.md +2 -0
  113. package/server/lib/fs/routes.js +37 -26
  114. package/server/lib/fs/routes.test.js +98 -21
  115. package/server/lib/git/DOCUMENTATION.md +3 -1
  116. package/server/lib/git/identity-storage.js +1 -1
  117. package/server/lib/git/issue-2746-longpaths.test.js +4 -4
  118. package/server/lib/git/routes.js +17 -1
  119. package/server/lib/git/service.js +116 -26
  120. package/server/lib/git/service.test.js +174 -3
  121. package/server/lib/github/auth.js +8 -8
  122. package/server/lib/github/pr-status.js +1 -1
  123. package/server/lib/github/routes.js +2 -2
  124. package/server/lib/inherited-env.js +1 -1
  125. package/server/lib/inherited-env.test.js +2 -2
  126. package/server/lib/linear/auth.js +8 -8
  127. package/server/lib/linear/auth.test.js +24 -24
  128. package/server/lib/linear/issues.test.js +6 -6
  129. package/server/lib/linear/mapping.test.js +4 -4
  130. package/server/lib/linear/oauth.js +2 -2
  131. package/server/lib/linear/oauth.test.js +14 -14
  132. package/server/lib/linear/routes.js +5 -5
  133. package/server/lib/linear/routes.test.js +16 -16
  134. package/server/lib/linear/status-runtime.test.js +9 -9
  135. package/server/lib/linear/status.js +1 -1
  136. package/server/lib/linear/status.test.js +15 -15
  137. package/server/lib/linear/teams.test.js +4 -4
  138. package/server/lib/magic-prompts/routes.js +2 -2
  139. package/server/lib/mcp-reconnect/DOCUMENTATION.md +55 -0
  140. package/server/lib/mcp-reconnect/runtime.js +122 -0
  141. package/server/lib/mcp-reconnect/runtime.test.js +140 -0
  142. package/server/lib/message-queue/DOCUMENTATION.md +158 -0
  143. package/server/lib/message-queue/runtime.js +870 -0
  144. package/server/lib/message-queue/runtime.test.js +482 -0
  145. package/server/lib/notifications/apns-runtime.js +17 -17
  146. package/server/lib/notifications/apns-runtime.test.js +11 -11
  147. package/server/lib/notifications/emitter-runtime.js +1 -1
  148. package/server/lib/notifications/emitter-runtime.test.js +1 -1
  149. package/server/lib/notifications/push-runtime.js +7 -7
  150. package/server/lib/notifications/routes.js +1 -1
  151. package/server/lib/notifications/runtime.js +1 -1
  152. package/server/lib/openchamber-control/action-resolution.test.js +10 -10
  153. package/server/lib/openchamber-control/actions.js +24 -24
  154. package/server/lib/openchamber-control/error.js +4 -4
  155. package/server/lib/openchamber-control/routes.js +2 -2
  156. package/server/lib/openchamber-control/routes.test.js +5 -5
  157. package/server/lib/openchamber-control/screenshots.js +1 -1
  158. package/server/lib/openchamber-control/screenshots.test.js +1 -1
  159. package/server/lib/openchamber-control/service.js +50 -50
  160. package/server/lib/openchamber-control/service.test.js +5 -5
  161. package/server/lib/openchamber-sessions/routes.js +124 -22
  162. package/server/lib/openchamber-sessions/routes.test.js +99 -11
  163. package/server/lib/opencode/DOCUMENTATION.md +13 -5
  164. package/server/lib/opencode/auth.js +1 -1
  165. package/server/lib/opencode/bootstrap-runtime.js +6 -6
  166. package/server/lib/opencode/cli-options.js +8 -8
  167. package/server/lib/opencode/config-paths.test.js +116 -0
  168. package/server/lib/opencode/core-routes.js +8 -7
  169. package/server/lib/opencode/core-routes.test.js +11 -11
  170. package/server/lib/opencode/env-config.js +5 -5
  171. package/server/lib/opencode/env-config.test.js +7 -7
  172. package/server/lib/opencode/env-runtime.js +10 -10
  173. package/server/lib/opencode/env-runtime.test.js +18 -18
  174. package/server/lib/opencode/feature-routes-runtime.js +17 -12
  175. package/server/lib/opencode/hmr-state-runtime.js +2 -2
  176. package/server/lib/opencode/hmr-state-runtime.test.js +1 -1
  177. package/server/lib/opencode/input-history-scope.js +14 -0
  178. package/server/lib/opencode/lifecycle.js +8 -8
  179. package/server/lib/opencode/lifecycle.test.js +4 -4
  180. package/server/lib/opencode/managed-plugin-config.js +35 -0
  181. package/server/lib/opencode/managed-process-registry.js +3 -3
  182. package/server/lib/opencode/mcp-oauth-callback.test.js +2 -2
  183. package/server/lib/opencode/openchamber-routes.js +15 -15
  184. package/server/lib/opencode/openchamber-routes.test.js +11 -11
  185. package/server/lib/opencode/plugins.js +2 -2
  186. package/server/lib/opencode/plugins.test.js +1 -1
  187. package/server/lib/opencode/project-icon-routes.js +2 -2
  188. package/server/lib/opencode/project-icon-routes.test.js +1 -1
  189. package/server/lib/opencode/providers.js +44 -2
  190. package/server/lib/opencode/providers.test.js +131 -4
  191. package/server/lib/opencode/proxy.js +2 -2
  192. package/server/lib/opencode/pwa-manifest-routes.js +1 -1
  193. package/server/lib/opencode/restart-session-recovery.test.js +1 -1
  194. package/server/lib/opencode/routes-upgrade.test.js +4 -4
  195. package/server/lib/opencode/routes.js +14 -14
  196. package/server/lib/opencode/server-startup-runtime.js +6 -6
  197. package/server/lib/opencode/session-runtime.js +3 -3
  198. package/server/lib/opencode/session-runtime.test.js +6 -6
  199. package/server/lib/opencode/settings-helpers.js +31 -3
  200. package/server/lib/opencode/settings-helpers.test.js +189 -12
  201. package/server/lib/opencode/settings-runtime.js +2 -2
  202. package/server/lib/opencode/settings-runtime.test.js +29 -0
  203. package/server/lib/opencode/shared.js +5 -2
  204. package/server/lib/opencode/shared.test.js +7 -7
  205. package/server/lib/opencode/shutdown-runtime.js +2 -0
  206. package/server/lib/opencode/skill-routes.js +2 -1
  207. package/server/lib/opencode/snippets.js +1 -2
  208. package/server/lib/opencode/startup-performance.js +1 -1
  209. package/server/lib/opencode/startup-performance.test.js +6 -6
  210. package/server/lib/opencode/static-routes-runtime.js +8 -8
  211. package/server/lib/opencode/static-routes-runtime.test.js +7 -7
  212. package/server/lib/opencode/upgrade-capability.js +2 -2
  213. package/server/lib/opencode/upgrade-capability.test.js +3 -3
  214. package/server/lib/package-manager.js +17 -42
  215. package/server/lib/package-manager.test.js +19 -19
  216. package/server/lib/permission-auto-accept/runtime.js +1 -1
  217. package/server/lib/project-context/routes.js +1 -1
  218. package/server/lib/projects/project-config.js +2 -2
  219. package/server/lib/quota/DOCUMENTATION.md +9 -1
  220. package/server/lib/quota/credentials/providers.js +4 -0
  221. package/server/lib/quota/credentials/store.js +4 -4
  222. package/server/lib/quota/credentials/store.test.js +8 -8
  223. package/server/lib/quota/index.js +1 -0
  224. package/server/lib/quota/providers/exe-dev.js +75 -0
  225. package/server/lib/quota/providers/exe-dev.test.js +47 -0
  226. package/server/lib/quota/providers/hyper.js +118 -0
  227. package/server/lib/quota/providers/hyper.test.js +126 -0
  228. package/server/lib/quota/providers/index.js +15 -0
  229. package/server/lib/quota/providers/ollama-cloud.js +1 -1
  230. package/server/lib/quota/providers/opencode-go.js +2 -1
  231. package/server/lib/quota/providers/opencode-go.test.js +9 -5
  232. package/server/lib/quota/providers/xai.js +1 -1
  233. package/server/lib/quota/routes.js +2 -0
  234. package/server/lib/quota/utils/auth.js +1 -1
  235. package/server/lib/relay/DOCUMENTATION.md +1 -1
  236. package/server/lib/relay/host-client.js +1 -1
  237. package/server/lib/relay/host-client.test.js +9 -1
  238. package/server/lib/relay/host-lock.js +1 -1
  239. package/server/lib/relay/service.js +5 -5
  240. package/server/lib/relay/tunnel-host.js +3 -1
  241. package/server/lib/relay/tunnel-host.test.js +9 -1
  242. package/server/lib/scheduled-tasks/issue-2710-double-execution.test.js +2 -2
  243. package/server/lib/scheduled-tasks/routes.js +5 -5
  244. package/server/lib/scheduled-tasks/service.js +25 -25
  245. package/server/lib/scheduled-tasks/service.test.js +1 -1
  246. package/server/lib/security/bind-host.js +4 -4
  247. package/server/lib/security/bind-host.test.js +1 -1
  248. package/server/lib/security/request-security.js +11 -5
  249. package/server/lib/security/request-security.test.js +14 -14
  250. package/server/lib/session-assist/runtime.js +10 -9
  251. package/server/lib/session-folders/routes.js +2 -2
  252. package/server/lib/session-folders/routes.test.js +8 -8
  253. package/server/lib/session-goal/DOCUMENTATION.md +20 -7
  254. package/server/lib/session-goal/create.js +4 -2
  255. package/server/lib/session-goal/create.test.js +1 -1
  256. package/server/lib/session-goal/objectives.js +4 -4
  257. package/server/lib/session-goal/routes.js +1 -1
  258. package/server/lib/session-goal/runtime.js +88 -22
  259. package/server/lib/session-goal/runtime.test.js +428 -2
  260. package/server/lib/session-knowledge/runtime.js +11 -11
  261. package/server/lib/session-knowledge/runtime.test.js +5 -5
  262. package/server/lib/skills-catalog/DOCUMENTATION.md +1 -1
  263. package/server/lib/skills-catalog/cache.test.js +2 -2
  264. package/server/lib/skills-catalog/disk-cache.js +5 -5
  265. package/server/lib/skills-catalog/github-meta.test.js +2 -2
  266. package/server/lib/skills-catalog/install.js +3 -2
  267. package/server/lib/small-model/DOCUMENTATION.md +4 -0
  268. package/server/lib/small-model/call.js +9 -3
  269. package/server/lib/small-model/call.test.js +29 -6
  270. package/server/lib/small-model/index.js +8 -7
  271. package/server/lib/small-model/index.test.js +1 -1
  272. package/server/lib/small-model/resolve.js +1 -1
  273. package/server/lib/small-model/resolve.test.js +1 -1
  274. package/server/lib/small-model/routes.js +2 -1
  275. package/server/lib/system-prompt/runtime.js +3 -22
  276. package/server/lib/system-prompt/runtime.test.js +3 -3
  277. package/server/lib/terminal/DOCUMENTATION.md +11 -7
  278. package/server/lib/terminal/runtime.js +180 -26
  279. package/server/lib/terminal/runtime.test.js +554 -27
  280. package/server/lib/terminal/shells.js +20 -3
  281. package/server/lib/terminal/shells.test.js +33 -2
  282. package/server/lib/tts/base-url.js +3 -3
  283. package/server/lib/tts/routes.test.js +20 -20
  284. package/server/lib/ui-auth/ui-auth.js +12 -9
  285. package/server/lib/ui-auth/ui-auth.test.js +19 -3
  286. package/server/lib/ui-auth/ui-passkeys.js +7 -7
  287. package/server/lib/walkthrough/index.js +1 -0
  288. package/server/lib/walkthrough/jobs.test.js +1 -1
  289. package/server/lib/walkthrough/language.test.js +1 -1
  290. package/server/lib/walkthrough/model-settings.js +3 -3
  291. package/server/lib/walkthrough/model-settings.test.js +1 -1
  292. package/server/lib/walkthrough/pull-request.test.js +5 -5
  293. package/server/lib/walkthrough/reproduce-2607.test.js +2 -2
  294. package/server/lib/walkthrough/routes.test.js +26 -5
  295. package/server/lib/walkthrough/store.js +3 -3
  296. package/server/lib/walkthrough/store.test.js +1 -1
  297. package/server/opencode-proxy.test.js +2 -2
  298. package/server/proxy-headers.js +1 -1
  299. package/server/sse-routes.test.js +4 -4
  300. package/README.md.bak +0 -250
  301. package/bin/lib/DOCUMENTATION.md.bak +0 -163
  302. package/dist/assets/CommitSection-SGBCAW0w.js +0 -1
  303. package/dist/assets/FilesView-Bdq8ppva.js +0 -17
  304. package/dist/assets/GitView-Znn7VJcP.js +0 -6
  305. package/dist/assets/LinearIssuesView-jP-hXyac.js +0 -1
  306. package/dist/assets/MarkdownRendererImpl-Dt9mjTRN.js +0 -12
  307. package/dist/assets/PlanView-B0F3BtPZ.js +0 -5
  308. package/dist/assets/SettingsView-BBW-S-gh.js +0 -28
  309. package/dist/assets/ToolPartDiffPreview-CUNe28U1.js +0 -8
  310. package/dist/assets/index-C57jT0Sa.css +0 -1
  311. package/dist/assets/index-DW_E3rnL.js +0 -7
  312. package/dist/assets/main-Bv5Pkngh.js +0 -928
  313. package/dist/assets/pl-Dioz29BI.js +0 -15
  314. package/dist/assets/renderMobileApp-D9yQJy0L.js +0 -25
  315. package/dist/assets/runtimeEndpointReset-CjhvxLH0.js +0 -16
  316. package/dist/assets/tr-DFnMlPxY.js +0 -6
  317. package/dist/assets/useInlineCommentController-CDEuSlPH.js +0 -2
  318. package/dist/assets/vendor-zod-BLfBSgBh.js +0 -39
  319. package/server/index.d.ts.bak +0 -39
  320. package/server/lib/agent-tool/DOCUMENTATION.md.bak +0 -119
  321. package/server/lib/browser-control/DOCUMENTATION.md.bak +0 -50
  322. package/server/lib/context-obligatory/DOCUMENTATION.md.bak +0 -19
  323. package/server/lib/dev-tunnel/DOCUMENTATION.md.bak +0 -57
  324. package/server/lib/dictation/DOCUMENTATION.md.bak +0 -100
  325. package/server/lib/event-stream/DOCUMENTATION.md.bak +0 -62
  326. package/server/lib/fs/DOCUMENTATION.md.bak +0 -47
  327. package/server/lib/git/DOCUMENTATION.md.bak +0 -193
  328. package/server/lib/github/DOCUMENTATION.md.bak +0 -183
  329. package/server/lib/linear/DOCUMENTATION.md.bak +0 -97
  330. package/server/lib/linear/OAUTH-BROKER-HANDOFF.md.bak +0 -91
  331. package/server/lib/markdown-image-grants/DOCUMENTATION.md.bak +0 -40
  332. package/server/lib/notifications/APNS.md.bak +0 -135
  333. package/server/lib/notifications/DOCUMENTATION.md.bak +0 -138
  334. package/server/lib/openchamber-control/DOCUMENTATION.md.bak +0 -64
  335. package/server/lib/opencode/DOCUMENTATION.md.bak +0 -431
  336. package/server/lib/opencode/managed-process-registry.d.ts.bak +0 -13
  337. package/server/lib/opencode/provider-env-aliases.d.ts.bak +0 -3
  338. package/server/lib/permission-auto-accept/DOCUMENTATION.md.bak +0 -34
  339. package/server/lib/project-context/DOCUMENTATION.md.bak +0 -160
  340. package/server/lib/quota/DOCUMENTATION.md.bak +0 -123
  341. package/server/lib/relay/DOCUMENTATION.md.bak +0 -100
  342. package/server/lib/scheduled-tasks/DOCUMENTATION.md.bak +0 -182
  343. package/server/lib/session-assist/DOCUMENTATION.md.bak +0 -66
  344. package/server/lib/session-goal/DOCUMENTATION.md.bak +0 -213
  345. package/server/lib/session-knowledge/DOCUMENTATION.md.bak +0 -89
  346. package/server/lib/skills-catalog/DOCUMENTATION.md.bak +0 -151
  347. package/server/lib/small-model/DOCUMENTATION.md.bak +0 -212
  348. package/server/lib/system-prompt/DOCUMENTATION.md.bak +0 -36
  349. package/server/lib/terminal/DOCUMENTATION.md.bak +0 -50
  350. package/server/lib/text/DOCUMENTATION.md.bak +0 -35
  351. package/server/lib/tts/DOCUMENTATION.md.bak +0 -147
  352. package/server/lib/tunnels/DOCUMENTATION.md.bak +0 -21
  353. package/server/lib/ui-auth/DOCUMENTATION.md.bak +0 -44
  354. package/server/lib/walkthrough/DOCUMENTATION.md.bak +0 -411
@@ -1,24 +1,24 @@
1
- import { parse as parseJsonc } from 'jsonc-parser';
2
1
  import { pathToFileURL } from 'node:url';
2
+ import { appendManagedPlugin } from '../opencode/managed-plugin-config.js';
3
3
  import {
4
- OPENCHAMBER_AGENT_TOOL_ACTION_DEFINITIONS,
5
- OPENCHAMBER_AGENT_TOOL_ACTIONS,
6
- OPENCHAMBER_MEMORY_ACTION_DEFINITIONS,
7
- OPENCHAMBER_MEMORY_ACTIONS,
4
+ AIWORKER_AGENT_TOOL_ACTION_DEFINITIONS,
5
+ AIWORKER_AGENT_TOOL_ACTIONS,
6
+ AIWORKER_MEMORY_ACTION_DEFINITIONS,
7
+ AIWORKER_MEMORY_ACTIONS,
8
8
  resolveAgentToolAction,
9
- OPENCHAMBER_WEB_ACTION_DEFINITIONS,
10
- OPENCHAMBER_WEB_ACTIONS,
9
+ AIWORKER_WEB_ACTION_DEFINITIONS,
10
+ AIWORKER_WEB_ACTIONS,
11
11
  } from '../openchamber-control/actions.js';
12
12
 
13
13
  const TOOL_SCHEMA_VERSION = 1;
14
14
  // Everything either managed tool may ask for; the agent allowlist stays
15
15
  // narrower than the full control surface.
16
- const ACTIONS = new Set([...OPENCHAMBER_AGENT_TOOL_ACTIONS, ...OPENCHAMBER_WEB_ACTIONS, ...OPENCHAMBER_MEMORY_ACTIONS]);
16
+ const ACTIONS = new Set([...AIWORKER_AGENT_TOOL_ACTIONS, ...AIWORKER_WEB_ACTIONS, ...AIWORKER_MEMORY_ACTIONS]);
17
17
  const AGENT_TOOL_ACTION_TITLES = Object.fromEntries(
18
18
  [
19
- ...OPENCHAMBER_AGENT_TOOL_ACTION_DEFINITIONS,
20
- ...OPENCHAMBER_WEB_ACTION_DEFINITIONS,
21
- ...OPENCHAMBER_MEMORY_ACTION_DEFINITIONS,
19
+ ...AIWORKER_AGENT_TOOL_ACTION_DEFINITIONS,
20
+ ...AIWORKER_WEB_ACTION_DEFINITIONS,
21
+ ...AIWORKER_MEMORY_ACTION_DEFINITIONS,
22
22
  ].map(({ action, title }) => [action, title]),
23
23
  );
24
24
 
@@ -108,9 +108,9 @@ const MEMORY_PARAMETER_PROPERTIES = {
108
108
  ...MEMORY_PARAMETER_OVERRIDES,
109
109
  };
110
110
 
111
- const CONTROL_TOOL_DESCRIPTION = "Control OpenChamber projects, sessions, and scheduled tasks on the user's behalf. Sessions and scheduled tasks you create are for the user to follow and interact with; never use this tool to delegate parts of your own current task. Use one action per call. Scope with projectId or directory; omit both to use the current session directory. Session dispatches return immediately by default and you receive no notification when a dispatched session finishes, so never promise to report back on it; the user follows it in OpenChamber; a dispatched session needs no follow-up from you. If the user later asks how it went, use session.messages (add wait to block until it is idle, lastAssistant for just the final answer) — session.send always sends a NEW prompt and never just waits. Set wait only when the user asks or the next step requires the completed result. Session and worktree deletion are unavailable.";
111
+ const CONTROL_TOOL_DESCRIPTION = "Control AiWorker projects, sessions, and scheduled tasks on the user's behalf. Sessions and scheduled tasks you create are for the user to follow and interact with; never use this tool to delegate parts of your own current task. Use one action per call. Scope with projectId or directory; omit both to use the current session directory. Session dispatches return immediately by default and you receive no notification when a dispatched session finishes, so never promise to report back on it; the user follows it in AiWorker; a dispatched session needs no follow-up from you. If the user later asks how it went, use session.messages (add wait to block until it is idle, lastAssistant for just the final answer) — session.send always sends a NEW prompt and never just waits. Set wait only when the user asks or the next step requires the completed result. Session and worktree deletion are unavailable.";
112
112
 
113
- const WEB_TOOL_DESCRIPTION = "Look at and interact with a web page in OpenChamber's browser panel, so you can check your own work rather than describing what you expect. Use one action per call. Open a page, snapshot it to read its text and its interactive elements, then click, type or scroll using the selectors the snapshot returned; snapshots also report any errors the page logged. Pass a selector to browser.snapshot to read one part of a long page. browser.inspect returns computed styles when the question is how something renders. Set viewport to check a layout at mobile, tablet or desktop size. The page runs with the user's real logins, so treat what you see as their live session.";
113
+ const WEB_TOOL_DESCRIPTION = "Look at and interact with a web page in AiWorker's browser panel, so you can check your own work rather than describing what you expect. Use one action per call. Open a page, snapshot it to read its text and its interactive elements, then click, type or scroll using the selectors the snapshot returned; snapshots also report any errors the page logged. Pass a selector to browser.snapshot to read one part of a long page. browser.inspect returns computed styles when the question is how something renders. Set viewport to check a layout at mobile, tablet or desktop size. The page runs with the user's real logins, so treat what you see as their live session.";
114
114
 
115
115
  const MEMORY_TOOL_DESCRIPTION = "Keep what you learn across sessions, so the user does not have to explain the same thing twice. Use one action per call. The session already lists the titles of what is stored. A title is an abbreviation, not the memory: read the entry with memory.read before acting on it, because titles leave out the conditions and exceptions that decide how the memory applies, and the ones that look self-explanatory hide them most often. Save something only when it will still be true in a later session — a stable preference, a project convention, a decision and its reason, or a hard-won pointer. Do not save one-off task state, anything you can read from the code, secrets or credentials, or anything the user asked you not to keep. Choose the scope deliberately: global is about the user and reaches every project, so put a project's conventions in project scope. What you save is shown to the user as unreviewed until they confirm it, so save plainly and say what you saved when it matters.";
116
116
 
@@ -147,7 +147,7 @@ const isLoopbackAddress = (value) => {
147
147
  const createToolEntry = ({ name, description, actions, definitions, parameters }) => String.raw` ${name}: {
148
148
  description: ${JSON.stringify(description)},
149
149
  args: {
150
- action: { type: "string", enum: ${JSON.stringify(actions)}, oneOf: ${JSON.stringify(definitions.map((entry) => ({ const: entry.action, description: entry.description })))}, description: "OpenChamber action to perform" },
150
+ action: { type: "string", enum: ${JSON.stringify(actions)}, oneOf: ${JSON.stringify(definitions.map((entry) => ({ const: entry.action, description: entry.description })))}, description: "AiWorker action to perform" },
151
151
  parameters: { type: "object", properties: ${JSON.stringify(parameters)}, additionalProperties: false, description: "Inputs for the action; use an empty object when none are needed" },
152
152
  },
153
153
  async execute(input, context) {
@@ -169,15 +169,15 @@ const createToolEntry = ({ name, description, actions, definitions, parameters }
169
169
  },
170
170
  },
171
171
  })
172
- const endpoint = process.env.OPENCHAMBER_AGENT_TOOL_URL
173
- const token = process.env.OPENCHAMBER_AGENT_TOOL_TOKEN
172
+ const endpoint = process.env.AIWORKER_AGENT_TOOL_URL
173
+ const token = process.env.AIWORKER_AGENT_TOOL_TOKEN
174
174
  const failure = (payload) => ({
175
175
  title,
176
176
  output: JSON.stringify(payload),
177
- metadata: { openchamber: { schemaVersion: ${TOOL_SCHEMA_VERSION}, action: args.action, description: title, ok: false } },
177
+ metadata: { aiworker: { schemaVersion: ${TOOL_SCHEMA_VERSION}, action: args.action, description: title, ok: false } },
178
178
  })
179
179
  if (!endpoint || !token) {
180
- return failure({ schemaVersion: ${TOOL_SCHEMA_VERSION}, ok: false, action: args.action, error: { message: "OpenChamber managed tool connection is unavailable" } })
180
+ return failure({ schemaVersion: ${TOOL_SCHEMA_VERSION}, ok: false, action: args.action, error: { message: "AiWorker managed tool connection is unavailable" } })
181
181
  }
182
182
 
183
183
  try {
@@ -205,8 +205,8 @@ const createToolEntry = ({ name, description, actions, definitions, parameters }
205
205
  },
206
206
  },
207
207
  })
208
- if (valid) return { title, output, metadata: { openchamber: { schemaVersion: ${TOOL_SCHEMA_VERSION}, action: args.action, description: title, ok: result.ok === true } } }
209
- return failure({ schemaVersion: ${TOOL_SCHEMA_VERSION}, ok: false, action: args.action, error: { message: "OpenChamber returned an invalid response", kind: "runtime", status: response.status } })
208
+ if (valid) return { title, output, metadata: { aiworker: { schemaVersion: ${TOOL_SCHEMA_VERSION}, action: args.action, description: title, ok: result.ok === true } } }
209
+ return failure({ schemaVersion: ${TOOL_SCHEMA_VERSION}, ok: false, action: args.action, error: { message: "AiWorker returned an invalid response", kind: "runtime", status: response.status } })
210
210
  } catch (error) {
211
211
  if (context.abort.aborted) throw error
212
212
  return failure({ schemaVersion: ${TOOL_SCHEMA_VERSION}, ok: false, action: args.action, error: { message: error instanceof Error ? error.message : String(error), kind: "runtime" } })
@@ -219,56 +219,39 @@ const createPluginSource = ({ includeControl, includeWeb, includeMemory }) => {
219
219
  const entries = [];
220
220
  if (includeControl) {
221
221
  entries.push(createToolEntry({
222
- name: 'openchamber',
222
+ name: 'aiworker',
223
223
  description: CONTROL_TOOL_DESCRIPTION,
224
- actions: OPENCHAMBER_AGENT_TOOL_ACTIONS,
225
- definitions: OPENCHAMBER_AGENT_TOOL_ACTION_DEFINITIONS,
224
+ actions: AIWORKER_AGENT_TOOL_ACTIONS,
225
+ definitions: AIWORKER_AGENT_TOOL_ACTION_DEFINITIONS,
226
226
  parameters: CONTROL_PARAMETER_PROPERTIES,
227
227
  }));
228
228
  }
229
229
  if (includeWeb) {
230
230
  entries.push(createToolEntry({
231
- name: 'openchamber_web',
231
+ name: 'aiworker_web',
232
232
  description: WEB_TOOL_DESCRIPTION,
233
- actions: OPENCHAMBER_WEB_ACTIONS,
234
- definitions: OPENCHAMBER_WEB_ACTION_DEFINITIONS,
233
+ actions: AIWORKER_WEB_ACTIONS,
234
+ definitions: AIWORKER_WEB_ACTION_DEFINITIONS,
235
235
  parameters: WEB_PARAMETER_PROPERTIES,
236
236
  }));
237
237
  }
238
238
  if (includeMemory) {
239
239
  entries.push(createToolEntry({
240
- name: 'openchamber_memory',
240
+ name: 'aiworker_memory',
241
241
  description: MEMORY_TOOL_DESCRIPTION,
242
- actions: OPENCHAMBER_MEMORY_ACTIONS,
243
- definitions: OPENCHAMBER_MEMORY_ACTION_DEFINITIONS,
242
+ actions: AIWORKER_MEMORY_ACTIONS,
243
+ definitions: AIWORKER_MEMORY_ACTION_DEFINITIONS,
244
244
  parameters: MEMORY_PARAMETER_PROPERTIES,
245
245
  }));
246
246
  }
247
247
 
248
- return `export const OpenChamberPlugin = async () => ({
248
+ return `export const AiWorkerPlugin = async () => ({
249
249
  tool: {
250
250
  ${entries.join('')} },
251
251
  })
252
252
  `;
253
253
  };
254
254
 
255
- const mergePluginConfig = (rawConfig, pluginUrl) => {
256
- const errors = [];
257
- const parsed = asNonEmptyString(rawConfig) ? parseJsonc(rawConfig, errors, { allowTrailingComma: true }) : {};
258
- if (errors.length > 0 || !parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
259
- throw new Error('OPENCODE_CONFIG_CONTENT must contain a valid JSON object before OpenChamber can inject its managed tool');
260
- }
261
- if (parsed.plugin !== undefined && !Array.isArray(parsed.plugin)) {
262
- throw new Error('OPENCODE_CONFIG_CONTENT plugin must be an array before OpenChamber can inject its managed tool');
263
- }
264
- const configured = Array.isArray(parsed.plugin) ? parsed.plugin : [];
265
- parsed.plugin = [
266
- ...configured.filter((value) => value !== pluginUrl && (!Array.isArray(value) || value[0] !== pluginUrl)),
267
- pluginUrl,
268
- ];
269
- return JSON.stringify(parsed);
270
- };
271
-
272
255
  export const createAgentToolRuntime = (dependencies) => {
273
256
  const {
274
257
  crypto,
@@ -286,19 +269,19 @@ export const createAgentToolRuntime = (dependencies) => {
286
269
  const prepareManagedOpenCodeEnv = async ({ includeControl = true, includeWeb = true, includeMemory = true } = {}) => {
287
270
  const port = getActivePort();
288
271
  if (!Number.isInteger(port) || port <= 0) {
289
- throw new Error('OpenChamber listener port is unavailable for managed tool injection');
272
+ throw new Error('AiWorker listener port is unavailable for managed tool injection');
290
273
  }
291
274
  if (!includeControl && !includeWeb && !includeMemory) {
292
- throw new Error('At least one OpenChamber managed tool must be enabled to inject the plugin');
275
+ throw new Error('At least one AiWorker managed tool must be enabled to inject the plugin');
293
276
  }
294
277
  await fsPromises.mkdir(pluginDirectory, { recursive: true });
295
278
  await fsPromises.writeFile(pluginPath, createPluginSource({ includeControl, includeWeb, includeMemory }), { mode: 0o600 });
296
279
  activeToken = crypto.randomBytes(32).toString('base64url');
297
280
  const pluginUrl = pathToFileURL(pluginPath).href;
298
281
  return {
299
- OPENCODE_CONFIG_CONTENT: mergePluginConfig(env.OPENCODE_CONFIG_CONTENT, pluginUrl),
300
- OPENCHAMBER_AGENT_TOOL_URL: `http://127.0.0.1:${port}/api/openchamber/agent-tool`,
301
- OPENCHAMBER_AGENT_TOOL_TOKEN: activeToken,
282
+ OPENCODE_CONFIG_CONTENT: appendManagedPlugin(env.OPENCODE_CONFIG_CONTENT, pluginUrl, 'managed tool'),
283
+ AIWORKER_AGENT_TOOL_URL: `http://127.0.0.1:${port}/api/openchamber/agent-tool`,
284
+ AIWORKER_AGENT_TOOL_TOKEN: activeToken,
302
285
  };
303
286
  };
304
287
 
@@ -322,10 +305,10 @@ export const createAgentToolRuntime = (dependencies) => {
322
305
  }
323
306
  const action = resolution.action;
324
307
  if (!ACTIONS.has(action)) {
325
- return createResult({ ok: false, action, error: { message: `Unsupported OpenChamber action: ${action}`, kind: 'usage' } });
308
+ return createResult({ ok: false, action, error: { message: `Unsupported AiWorker action: ${action}`, kind: 'usage' } });
326
309
  }
327
310
  if (typeof executeAction !== 'function') {
328
- return createResult({ ok: false, action, error: { message: 'OpenChamber control service is unavailable', kind: 'runtime' } });
311
+ return createResult({ ok: false, action, error: { message: 'AiWorker control service is unavailable', kind: 'runtime' } });
329
312
  }
330
313
  try {
331
314
  const data = await executeAction(action, { ...payload.input, action }, payload.contextDirectory, options);
@@ -8,7 +8,7 @@ import request from 'supertest';
8
8
  import { afterEach, describe, expect, it, vi } from 'vitest';
9
9
 
10
10
  import { createAgentToolRuntime } from './runtime.js';
11
- import { OPENCHAMBER_AGENT_TOOL_ACTION_DEFINITIONS, OPENCHAMBER_CONTROL_ACTION_DEFINITIONS } from '../openchamber-control/actions.js';
11
+ import { AIWORKER_AGENT_TOOL_ACTION_DEFINITIONS, AIWORKER_CONTROL_ACTION_DEFINITIONS } from '../openchamber-control/actions.js';
12
12
 
13
13
  const temporaryDirectories = [];
14
14
 
@@ -36,7 +36,7 @@ const createRuntime = async (overrides = {}) => {
36
36
 
37
37
  describe('agent tool action allowlist', () => {
38
38
  it('defines a short title and agent description for every action', () => {
39
- expect(OPENCHAMBER_CONTROL_ACTION_DEFINITIONS.every(({ action, title, description }) => action && title && description)).toBe(true);
39
+ expect(AIWORKER_CONTROL_ACTION_DEFINITIONS.every(({ action, title, description }) => action && title && description)).toBe(true);
40
40
  });
41
41
 
42
42
  it.each([
@@ -90,28 +90,28 @@ describe('managed agent tool runtime', () => {
90
90
  ['example-plugin', { flag: true }],
91
91
  expect.stringContaining('/agent-tool/openchamber-plugin.js'),
92
92
  ]);
93
- expect(preparedEnv.OPENCHAMBER_AGENT_TOOL_URL).toBe('http://127.0.0.1:3901/api/openchamber/agent-tool');
94
- expect(preparedEnv.OPENCHAMBER_AGENT_TOOL_TOKEN).toMatch(/^[A-Za-z0-9_-]+$/);
95
- expect(source).toContain('openchamber: {');
96
- for (const { action, description } of OPENCHAMBER_AGENT_TOOL_ACTION_DEFINITIONS) {
93
+ expect(preparedEnv.AIWORKER_AGENT_TOOL_URL).toBe('http://127.0.0.1:3901/api/openchamber/agent-tool');
94
+ expect(preparedEnv.AIWORKER_AGENT_TOOL_TOKEN).toMatch(/^[A-Za-z0-9_-]+$/);
95
+ expect(source).toContain('aiworker: {');
96
+ for (const { action, description } of AIWORKER_AGENT_TOOL_ACTION_DEFINITIONS) {
97
97
  expect(source).toContain(JSON.stringify({ const: action, description }));
98
98
  }
99
99
  expect(source).not.toContain('"schedule.status"');
100
100
  const pluginModule = await import(`${pathToFileURL(pluginPath).href}?schema=${Date.now()}`);
101
- const hooks = await pluginModule.OpenChamberPlugin();
102
- expect(hooks.tool.openchamber.description).toContain('Session dispatches return immediately by default');
103
- expect(hooks.tool.openchamber.description).toContain('Set wait only when the user asks or the next step requires the completed result');
104
- expect(hooks.tool.openchamber.args.action.oneOf).toContainEqual({
101
+ const hooks = await pluginModule.AiWorkerPlugin();
102
+ expect(hooks.tool.aiworker.description).toContain('Session dispatches return immediately by default');
103
+ expect(hooks.tool.aiworker.description).toContain('Set wait only when the user asks or the next step requires the completed result');
104
+ expect(hooks.tool.aiworker.args.action.oneOf).toContainEqual({
105
105
  const: 'session.messages',
106
106
  description: 'Read text-only messages and current sessionStatus for sessionId; directory and limit 10 are defaults',
107
107
  });
108
- expect(hooks.tool.openchamber.args.parameters.properties.wait.description).toBe(
108
+ expect(hooks.tool.aiworker.args.parameters.properties.wait.description).toBe(
109
109
  'Wait for current session activity to become idle. Omit by default; use only when the user asks or the next step requires the completed result',
110
110
  );
111
- expect(hooks.tool.openchamber.args.parameters.properties.sessionId).toEqual({ type: 'string' });
112
- expect(source).not.toContain('title: "OpenChamber"');
111
+ expect(hooks.tool.aiworker.args.parameters.properties.sessionId).toEqual({ type: 'string' });
112
+ expect(source).not.toContain('title: "AiWorker"');
113
113
  expect(source).not.toContain('@opencode-ai/plugin');
114
- expect(source).not.toContain(preparedEnv.OPENCHAMBER_AGENT_TOOL_TOKEN);
114
+ expect(source).not.toContain(preparedEnv.AIWORKER_AGENT_TOOL_TOKEN);
115
115
  });
116
116
 
117
117
  it('emits both tools, each carrying only its own actions and inputs', async () => {
@@ -119,18 +119,18 @@ describe('managed agent tool runtime', () => {
119
119
  await runtime.prepareManagedOpenCodeEnv();
120
120
  const pluginPath = path.join(dataDir, 'agent-tool', 'openchamber-plugin.js');
121
121
  const pluginModule = await import(`${pathToFileURL(pluginPath).href}?both=${Date.now()}`);
122
- const { tool } = await pluginModule.OpenChamberPlugin();
122
+ const { tool } = await pluginModule.AiWorkerPlugin();
123
123
 
124
- const controlActions = tool.openchamber.args.action.enum;
125
- const webActions = tool.openchamber_web.args.action.enum;
124
+ const controlActions = tool.aiworker.args.action.enum;
125
+ const webActions = tool.aiworker_web.args.action.enum;
126
126
  expect(webActions).toContain('browser.open');
127
127
  expect(controlActions).not.toContain('browser.open');
128
128
  expect(webActions).not.toContain('session.create');
129
129
 
130
130
  // Turning one tool off has to remove its inputs too, not just its actions.
131
- expect(Object.keys(tool.openchamber_web.args.parameters.properties)).toContain('url');
132
- expect(Object.keys(tool.openchamber.args.parameters.properties)).not.toContain('url');
133
- expect(Object.keys(tool.openchamber.args.parameters.properties)).toContain('sessionId');
131
+ expect(Object.keys(tool.aiworker_web.args.parameters.properties)).toContain('url');
132
+ expect(Object.keys(tool.aiworker.args.parameters.properties)).not.toContain('url');
133
+ expect(Object.keys(tool.aiworker.args.parameters.properties)).toContain('sessionId');
134
134
  });
135
135
 
136
136
  it('accepts inputs passed beside the action, not only inside parameters', async () => {
@@ -138,14 +138,14 @@ describe('managed agent tool runtime', () => {
138
138
  const prepared = await runtime.prepareManagedOpenCodeEnv();
139
139
  const pluginPath = path.join(dataDir, 'agent-tool', 'openchamber-plugin.js');
140
140
  const pluginModule = await import(`${pathToFileURL(pluginPath).href}?flat=${Date.now()}`);
141
- const { tool } = await pluginModule.OpenChamberPlugin();
141
+ const { tool } = await pluginModule.AiWorkerPlugin();
142
142
 
143
143
  const sent = [];
144
144
  const originalFetch = globalThis.fetch;
145
- const originalUrl = process.env.OPENCHAMBER_AGENT_TOOL_URL;
146
- const originalToken = process.env.OPENCHAMBER_AGENT_TOOL_TOKEN;
147
- process.env.OPENCHAMBER_AGENT_TOOL_URL = prepared.OPENCHAMBER_AGENT_TOOL_URL;
148
- process.env.OPENCHAMBER_AGENT_TOOL_TOKEN = prepared.OPENCHAMBER_AGENT_TOOL_TOKEN;
145
+ const originalUrl = process.env.AIWORKER_AGENT_TOOL_URL;
146
+ const originalToken = process.env.AIWORKER_AGENT_TOOL_TOKEN;
147
+ process.env.AIWORKER_AGENT_TOOL_URL = prepared.AIWORKER_AGENT_TOOL_URL;
148
+ process.env.AIWORKER_AGENT_TOOL_TOKEN = prepared.AIWORKER_AGENT_TOOL_TOKEN;
149
149
  globalThis.fetch = async (_endpoint, init) => {
150
150
  sent.push(JSON.parse(init.body));
151
151
  return new Response(JSON.stringify({ schemaVersion: 1, ok: true, action: 'browser.open', data: {} }));
@@ -154,24 +154,24 @@ describe('managed agent tool runtime', () => {
154
154
 
155
155
  try {
156
156
  // The shape a model actually produced: url and viewport next to action.
157
- await tool.openchamber_web.execute(
157
+ await tool.aiworker_web.execute(
158
158
  { action: 'browser.open', url: 'https://example.test', viewport: 'mobile' },
159
159
  context,
160
160
  );
161
161
  // The documented shape must keep working, and win when both are present.
162
- await tool.openchamber_web.execute(
162
+ await tool.aiworker_web.execute(
163
163
  { action: 'browser.open', url: 'https://ignored.test', parameters: { url: 'https://example.test/nested' } },
164
164
  context,
165
165
  );
166
166
  // Both tools come from one template, so session control accepts it too.
167
- await tool.openchamber.execute(
167
+ await tool.aiworker.execute(
168
168
  { action: 'session.messages', sessionId: 'ses_1', limit: 3 },
169
169
  context,
170
170
  );
171
171
  } finally {
172
172
  globalThis.fetch = originalFetch;
173
- process.env.OPENCHAMBER_AGENT_TOOL_URL = originalUrl;
174
- process.env.OPENCHAMBER_AGENT_TOOL_TOKEN = originalToken;
173
+ process.env.AIWORKER_AGENT_TOOL_URL = originalUrl;
174
+ process.env.AIWORKER_AGENT_TOOL_TOKEN = originalToken;
175
175
  }
176
176
 
177
177
  expect(sent[0].input).toEqual({ action: 'browser.open', url: 'https://example.test', viewport: 'mobile' });
@@ -184,9 +184,9 @@ describe('managed agent tool runtime', () => {
184
184
  await runtime.prepareManagedOpenCodeEnv({ includeControl: false, includeWeb: true, includeMemory: false });
185
185
  const pluginPath = path.join(dataDir, 'agent-tool', 'openchamber-plugin.js');
186
186
  const pluginModule = await import(`${pathToFileURL(pluginPath).href}?web=${Date.now()}`);
187
- const { tool } = await pluginModule.OpenChamberPlugin();
187
+ const { tool } = await pluginModule.AiWorkerPlugin();
188
188
 
189
- expect(Object.keys(tool)).toEqual(['openchamber_web']);
189
+ expect(Object.keys(tool)).toEqual(['aiworker_web']);
190
190
  });
191
191
 
192
192
  it('exposes memory as its own tool carrying only its own inputs', async () => {
@@ -194,14 +194,14 @@ describe('managed agent tool runtime', () => {
194
194
  await runtime.prepareManagedOpenCodeEnv({ includeControl: true, includeWeb: false, includeMemory: true });
195
195
  const pluginPath = path.join(dataDir, 'agent-tool', 'openchamber-plugin.js');
196
196
  const pluginModule = await import(`${pathToFileURL(pluginPath).href}?memory=${Date.now()}`);
197
- const { tool } = await pluginModule.OpenChamberPlugin();
197
+ const { tool } = await pluginModule.AiWorkerPlugin();
198
198
 
199
- expect(Object.keys(tool)).toEqual(['openchamber', 'openchamber_memory']);
200
- expect(Object.keys(tool.openchamber_memory.args.parameters.properties).sort())
199
+ expect(Object.keys(tool)).toEqual(['aiworker', 'aiworker_memory']);
200
+ expect(Object.keys(tool.aiworker_memory.args.parameters.properties).sort())
201
201
  .toEqual(['body', 'memoryId', 'scope', 'title', 'type']);
202
202
  // Memory inputs must not leak into the control tool's schema, which the
203
203
  // model pays for on every unrelated call.
204
- expect(Object.keys(tool.openchamber.args.parameters.properties)).not.toContain('memoryId');
204
+ expect(Object.keys(tool.aiworker.args.parameters.properties)).not.toContain('memoryId');
205
205
  });
206
206
 
207
207
  it('omits memory entirely when the user turns it off', async () => {
@@ -209,9 +209,9 @@ describe('managed agent tool runtime', () => {
209
209
  await runtime.prepareManagedOpenCodeEnv({ includeControl: true, includeWeb: false, includeMemory: false });
210
210
  const pluginPath = path.join(dataDir, 'agent-tool', 'openchamber-plugin.js');
211
211
  const pluginModule = await import(`${pathToFileURL(pluginPath).href}?nomemory=${Date.now()}`);
212
- const { tool } = await pluginModule.OpenChamberPlugin();
212
+ const { tool } = await pluginModule.AiWorkerPlugin();
213
213
 
214
- expect(Object.keys(tool)).toEqual(['openchamber']);
214
+ expect(Object.keys(tool)).toEqual(['aiworker']);
215
215
  });
216
216
 
217
217
  it('injects the plugin when memory is the only tool left on', async () => {
@@ -219,9 +219,9 @@ describe('managed agent tool runtime', () => {
219
219
  await runtime.prepareManagedOpenCodeEnv({ includeControl: false, includeWeb: false, includeMemory: true });
220
220
  const pluginPath = path.join(dataDir, 'agent-tool', 'openchamber-plugin.js');
221
221
  const pluginModule = await import(`${pathToFileURL(pluginPath).href}?onlymemory=${Date.now()}`);
222
- const { tool } = await pluginModule.OpenChamberPlugin();
222
+ const { tool } = await pluginModule.AiWorkerPlugin();
223
223
 
224
- expect(Object.keys(tool)).toEqual(['openchamber_memory']);
224
+ expect(Object.keys(tool)).toEqual(['aiworker_memory']);
225
225
  });
226
226
 
227
227
  it('refuses to inject a plugin with no tools in it', async () => {
@@ -236,7 +236,7 @@ describe('managed agent tool runtime', () => {
236
236
  });
237
237
 
238
238
  it('accepts the bare action a tool name already qualifies', async () => {
239
- // Observed: the model called `read` on openchamber_memory, having taken the
239
+ // Observed: the model called `read` on aiworker_memory, having taken the
240
240
  // tool's own name for the namespace.
241
241
  const executeAction = vi.fn(async () => ({ memory: {} }));
242
242
  const { runtime } = await createRuntime({ executeAction });
@@ -244,7 +244,7 @@ describe('managed agent tool runtime', () => {
244
244
  const result = await runtime.execute({
245
245
  input: { action: 'read', title: 'Uses bun' },
246
246
  contextDirectory: '/work/project',
247
- tool: 'openchamber_memory',
247
+ tool: 'aiworker_memory',
248
248
  });
249
249
 
250
250
  expect(result.ok).toBe(true);
@@ -262,7 +262,7 @@ describe('managed agent tool runtime', () => {
262
262
 
263
263
  const result = await runtime.execute({
264
264
  input: { action: 'get' },
265
- tool: 'openchamber_memory',
265
+ tool: 'aiworker_memory',
266
266
  });
267
267
 
268
268
  expect(result.ok).toBe(false);
@@ -276,7 +276,7 @@ describe('managed agent tool runtime', () => {
276
276
 
277
277
  const result = await runtime.execute({
278
278
  input: { action: 'open', url: 'https://example.test' },
279
- tool: 'openchamber_memory',
279
+ tool: 'aiworker_memory',
280
280
  });
281
281
 
282
282
  expect(result.ok).toBe(false);
@@ -318,7 +318,7 @@ describe('managed agent tool runtime', () => {
318
318
  it('forwards cancellation to the shared control service', async () => {
319
319
  const executeAction = vi.fn(async (_action, _input, _directory, options) => {
320
320
  await new Promise((resolve, reject) => {
321
- options.signal.addEventListener('abort', () => reject(Object.assign(new Error('OpenChamber action was cancelled'), { statusCode: 499 })), { once: true });
321
+ options.signal.addEventListener('abort', () => reject(Object.assign(new Error('AiWorker action was cancelled'), { statusCode: 499 })), { once: true });
322
322
  });
323
323
  });
324
324
  const { runtime } = await createRuntime({ executeAction });
@@ -330,7 +330,7 @@ describe('managed agent tool runtime', () => {
330
330
  await expect(pending).resolves.toEqual(expect.objectContaining({
331
331
  ok: false,
332
332
  action: 'projects.list',
333
- error: { message: 'OpenChamber action was cancelled', kind: 'runtime' },
333
+ error: { message: 'AiWorker action was cancelled', kind: 'runtime' },
334
334
  }));
335
335
  expect(executeAction).toHaveBeenCalledWith('projects.list', { action: 'projects.list' }, undefined, { signal: controller.signal });
336
336
  });
@@ -348,7 +348,7 @@ describe('managed agent tool runtime', () => {
348
348
 
349
349
  const response = await request(app)
350
350
  .post('/api/openchamber/agent-tool')
351
- .set('authorization', `Bearer ${env.OPENCHAMBER_AGENT_TOOL_TOKEN}`)
351
+ .set('authorization', `Bearer ${env.AIWORKER_AGENT_TOOL_TOKEN}`)
352
352
  .send({ input: { action: 'projects.list' } })
353
353
  .expect(200);
354
354
  expect(response.body).toEqual(expect.objectContaining({ ok: true, action: 'projects.list' }));
@@ -364,18 +364,18 @@ describe('managed agent tool runtime', () => {
364
364
  });
365
365
  activePort = server.address().port;
366
366
 
367
- const previousUrl = process.env.OPENCHAMBER_AGENT_TOOL_URL;
368
- const previousToken = process.env.OPENCHAMBER_AGENT_TOOL_TOKEN;
367
+ const previousUrl = process.env.AIWORKER_AGENT_TOOL_URL;
368
+ const previousToken = process.env.AIWORKER_AGENT_TOOL_TOKEN;
369
369
  try {
370
370
  const env = await runtime.prepareManagedOpenCodeEnv();
371
- process.env.OPENCHAMBER_AGENT_TOOL_URL = env.OPENCHAMBER_AGENT_TOOL_URL;
372
- process.env.OPENCHAMBER_AGENT_TOOL_TOKEN = env.OPENCHAMBER_AGENT_TOOL_TOKEN;
371
+ process.env.AIWORKER_AGENT_TOOL_URL = env.AIWORKER_AGENT_TOOL_URL;
372
+ process.env.AIWORKER_AGENT_TOOL_TOKEN = env.AIWORKER_AGENT_TOOL_TOKEN;
373
373
  const pluginPath = path.join(dataDir, 'agent-tool', 'openchamber-plugin.js');
374
374
  const pluginModule = await import(`${pathToFileURL(pluginPath).href}?test=${Date.now()}`);
375
- const hooks = await pluginModule.OpenChamberPlugin();
375
+ const hooks = await pluginModule.AiWorkerPlugin();
376
376
  const metadata = vi.fn();
377
377
 
378
- const result = await hooks.tool.openchamber.execute(
378
+ const result = await hooks.tool.aiworker.execute(
379
379
  { action: 'projects.list', parameters: {} },
380
380
  { directory: '/work/project', abort: new AbortController().signal, metadata },
381
381
  );
@@ -387,18 +387,18 @@ describe('managed agent tool runtime', () => {
387
387
  data: { projects: [] },
388
388
  });
389
389
  expect(result.title).toBe('List configured projects');
390
- expect(result.metadata.openchamber.description).toBe('List configured projects');
390
+ expect(result.metadata.aiworker.description).toBe('List configured projects');
391
391
  expect(metadata).toHaveBeenCalledWith(expect.objectContaining({
392
392
  title: 'List configured projects',
393
393
  metadata: expect.objectContaining({
394
- openchamber: expect.objectContaining({ description: 'List configured projects' }),
394
+ aiworker: expect.objectContaining({ description: 'List configured projects' }),
395
395
  }),
396
396
  }));
397
397
  } finally {
398
- if (previousUrl === undefined) delete process.env.OPENCHAMBER_AGENT_TOOL_URL;
399
- else process.env.OPENCHAMBER_AGENT_TOOL_URL = previousUrl;
400
- if (previousToken === undefined) delete process.env.OPENCHAMBER_AGENT_TOOL_TOKEN;
401
- else process.env.OPENCHAMBER_AGENT_TOOL_TOKEN = previousToken;
398
+ if (previousUrl === undefined) delete process.env.AIWORKER_AGENT_TOOL_URL;
399
+ else process.env.AIWORKER_AGENT_TOOL_URL = previousUrl;
400
+ if (previousToken === undefined) delete process.env.AIWORKER_AGENT_TOOL_TOKEN;
401
+ else process.env.AIWORKER_AGENT_TOOL_TOKEN = previousToken;
402
402
  await new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
403
403
  }
404
404
  });
@@ -2,7 +2,7 @@
2
2
  * Request/response broker between the agent tool and the in-app browser.
3
3
  *
4
4
  * The browser lives in the renderer, not the server, so the server cannot act
5
- * on a page directly. It publishes a request over the existing OpenChamber
5
+ * on a page directly. It publishes a request over the existing AiWorker
6
6
  * event stream and waits for the client that owns the browser view to post the
7
7
  * result back.
8
8
  *
@@ -73,8 +73,8 @@ export const createBrowserControlBroker = ({
73
73
  // environment can do, and leave deciding whether it matters to the
74
74
  // caller rather than handing it an instruction it cannot carry out.
75
75
  return Promise.reject(new BrowserControlError(
76
- 'No OpenChamber client connected here can control a page. Reading and '
77
- + 'interacting with a page works when OpenChamber runs as its desktop '
76
+ 'No AiWorker client connected here can control a page. Reading and '
77
+ + 'interacting with a page works when AiWorker runs as its desktop '
78
78
  + 'application; a web browser tab can display a page but cannot be '
79
79
  + 'driven. Nothing was changed. Mention this to the user only if it '
80
80
  + 'affects what they asked for.',
@@ -102,7 +102,7 @@ describe('browser control broker', () => {
102
102
  test('fails everything in flight when the owning client disconnects', async () => {
103
103
  const { broker } = createBroker();
104
104
  const inflight = broker.request('browser.snapshot', {});
105
- broker.rejectAll('The OpenChamber client disconnected');
105
+ broker.rejectAll('The AiWorker client disconnected');
106
106
  await expect(inflight).rejects.toThrow('disconnected');
107
107
  expect(broker.pendingCount).toBe(0);
108
108
  });
@@ -0,0 +1,82 @@
1
+ // Release notes for the update dialog.
2
+ //
3
+ // The repo publishes `changelog/index.json` on `main`: one object per release,
4
+ // newest first, with the app notes grouped as New / Improvements / Fixes /
5
+ // Misc. This module fetches it and renders the releases between the installed
6
+ // version (exclusive) and the offered one (inclusive) as the Markdown the
7
+ // dialog already understands: a `## [x.y.z] - YYYY-MM-DD` header per release,
8
+ // the release title in bold, the intro, then the groups.
9
+ //
10
+ // Any failure (network, 404, unexpected shape) yields null: the update is
11
+ // still offered, only without notes.
12
+
13
+ export const CHANGELOG_INDEX_URL = 'https://raw.githubusercontent.com/openchamber/openchamber/main/changelog/index.json';
14
+
15
+ const GROUPS = [
16
+ ['new', 'New'],
17
+ ['improvements', 'Improvements'],
18
+ ['fixes', 'Fixes'],
19
+ ['misc', 'Misc'],
20
+ ];
21
+
22
+ const VERSION_PATTERN = /^\d+\.\d+\.\d+$/;
23
+ const DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
24
+
25
+ // The file crosses a network boundary with no schema library on this side, so
26
+ // each field is coerced into its domain shape here; a release without a valid
27
+ // version and date is dropped.
28
+ const text = (value) => (value === null || value === undefined ? null : String(value).trim() || null);
29
+ const bulletList = (value) => (Array.isArray(value) ? value.map((item) => String(item)) : []);
30
+
31
+ const parseRelease = (entry) => {
32
+ if (entry === null || entry === undefined) return null;
33
+ const version = text(entry.version);
34
+ const date = text(entry.date);
35
+ if (!version || !VERSION_PATTERN.test(version) || !date || !DATE_PATTERN.test(date)) return null;
36
+ const app = entry.app ?? {};
37
+ return {
38
+ version,
39
+ date,
40
+ title: text(entry.title),
41
+ intro: text(entry.intro),
42
+ groups: GROUPS.map(([key, heading]) => ({ heading, bullets: bulletList(app[key]) })),
43
+ };
44
+ };
45
+
46
+ const renderRelease = (release) => {
47
+ const lines = [`## [${release.version}] - ${release.date}`, ''];
48
+ if (release.title) lines.push(`**${release.title}**`, '');
49
+ if (release.intro) lines.push(release.intro, '');
50
+ for (const { heading, bullets } of release.groups) {
51
+ if (bullets.length === 0) continue;
52
+ lines.push(`### ${heading}`, '', ...bullets.map((bullet) => `- ${bullet}`), '');
53
+ }
54
+ return lines.join('\n').trim();
55
+ };
56
+
57
+ /**
58
+ * Markdown for the releases in (fromVersion, toVersion], newest first, or
59
+ * null when the index holds none of them.
60
+ */
61
+ export function renderUpdateNotes(index, fromVersion, toVersion, compareVersions) {
62
+ if (!Array.isArray(index)) return null;
63
+ const relevant = index
64
+ .map(parseRelease)
65
+ .filter((release) => release !== null)
66
+ .filter((release) => compareVersions(release.version, fromVersion) > 0 && compareVersions(release.version, toVersion) <= 0)
67
+ .sort((a, b) => compareVersions(b.version, a.version));
68
+ if (relevant.length === 0) return null;
69
+ return relevant.map(renderRelease).join('\n\n');
70
+ }
71
+
72
+ /** Fetch the index and render the notes for one update; null on any failure. */
73
+ export async function fetchUpdateNotes(fromVersion, toVersion, compareVersions, options = {}) {
74
+ const fetchImpl = options.fetch ?? fetch;
75
+ try {
76
+ const response = await fetchImpl(CHANGELOG_INDEX_URL, { signal: AbortSignal.timeout(options.timeoutMs ?? 10_000) });
77
+ if (!response.ok) return null;
78
+ return renderUpdateNotes(await response.json(), fromVersion, toVersion, compareVersions);
79
+ } catch {
80
+ return null;
81
+ }
82
+ }