@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
@@ -5,17 +5,17 @@ import { isPlainObject, readEnv, readFiniteNumber, readTrimmedString } from './p
5
5
 
6
6
  const DEFAULT_LINEAR_CLIENT_ID = '91bbe26a69a2c8568d3683f1e01e776c';
7
7
  const DEFAULT_LINEAR_SCOPES = 'read,write,comments:create';
8
- const DEFAULT_LINEAR_BROKER_URL = 'https://api.openchamber.dev/v1/oauth/linear';
8
+ const DEFAULT_LINEAR_BROKER_URL = 'https://api.aiworker.dev/v1/oauth/linear';
9
9
  const ACCESS_TOKEN_REFRESH_SKEW_MS = 2 * 60_000;
10
10
  const LEGACY_WORKSPACE_ID = 'legacy';
11
11
  const SESSION_COMMENTS_SETTING_KEY = 'linearSessionComments';
12
12
 
13
13
  function resolveDataDir() {
14
- const fromEnv = readEnv('OPENCHAMBER_DATA_DIR');
14
+ const fromEnv = readEnv('AIWORKER_DATA_DIR');
15
15
  if (fromEnv) {
16
16
  return path.resolve(fromEnv);
17
17
  }
18
- return path.join(os.homedir(), '.config', 'openchamber');
18
+ return path.join(os.homedir(), '.config', 'aiworker');
19
19
  }
20
20
 
21
21
  function storageFile() {
@@ -377,7 +377,7 @@ export function toLinearPublicStatus(auth, workspaces = getLinearAuthWorkspaces(
377
377
  }
378
378
 
379
379
  export function getLinearClientId() {
380
- const fromEnv = readEnv('OPENCHAMBER_LINEAR_CLIENT_ID');
380
+ const fromEnv = readEnv('AIWORKER_LINEAR_CLIENT_ID');
381
381
  if (fromEnv) return fromEnv;
382
382
  const stored = readSettingString('linearClientId');
383
383
  if (stored) return stored;
@@ -385,13 +385,13 @@ export function getLinearClientId() {
385
385
  }
386
386
 
387
387
  export function getLinearClientSecret() {
388
- const fromEnv = readEnv('OPENCHAMBER_LINEAR_CLIENT_SECRET');
388
+ const fromEnv = readEnv('AIWORKER_LINEAR_CLIENT_SECRET');
389
389
  if (fromEnv) return fromEnv;
390
390
  return readSettingString('linearClientSecret');
391
391
  }
392
392
 
393
393
  export function getLinearScopes() {
394
- const fromEnv = readEnv('OPENCHAMBER_LINEAR_SCOPES');
394
+ const fromEnv = readEnv('AIWORKER_LINEAR_SCOPES');
395
395
  if (fromEnv) return fromEnv;
396
396
  const stored = readSettingString('linearScopes');
397
397
  if (stored) return stored;
@@ -399,7 +399,7 @@ export function getLinearScopes() {
399
399
  }
400
400
 
401
401
  export function getLinearBrokerUrl() {
402
- const fromEnv = readEnv('OPENCHAMBER_LINEAR_BROKER_URL');
402
+ const fromEnv = readEnv('AIWORKER_LINEAR_BROKER_URL');
403
403
  if (fromEnv) return fromEnv.replace(/\/+$/, '');
404
404
  const stored = readSettingString('linearBrokerUrl');
405
405
  if (stored) return stored.replace(/\/+$/, '');
@@ -407,7 +407,7 @@ export function getLinearBrokerUrl() {
407
407
  }
408
408
 
409
409
  export function getLinearRedirectUri() {
410
- const fromEnv = readEnv('OPENCHAMBER_LINEAR_REDIRECT_URI');
410
+ const fromEnv = readEnv('AIWORKER_LINEAR_REDIRECT_URI');
411
411
  if (fromEnv) return fromEnv;
412
412
  const stored = readSettingString('linearRedirectUri');
413
413
  if (stored) return stored;
@@ -26,23 +26,23 @@ describe('Linear auth storage', () => {
26
26
  let previousRedirect;
27
27
 
28
28
  beforeEach(() => {
29
- previousDataDir = process.env.OPENCHAMBER_DATA_DIR;
30
- previousPort = process.env.OPENCHAMBER_PORT;
31
- previousClientId = process.env.OPENCHAMBER_LINEAR_CLIENT_ID;
32
- previousRedirect = process.env.OPENCHAMBER_LINEAR_REDIRECT_URI;
29
+ previousDataDir = process.env.AIWORKER_DATA_DIR;
30
+ previousPort = process.env.AIWORKER_PORT;
31
+ previousClientId = process.env.AIWORKER_LINEAR_CLIENT_ID;
32
+ previousRedirect = process.env.AIWORKER_LINEAR_REDIRECT_URI;
33
33
  dataDir = makeTempDir();
34
- process.env.OPENCHAMBER_DATA_DIR = dataDir;
35
- delete process.env.OPENCHAMBER_LINEAR_CLIENT_ID;
36
- delete process.env.OPENCHAMBER_LINEAR_SCOPES;
37
- delete process.env.OPENCHAMBER_LINEAR_REDIRECT_URI;
38
- delete process.env.OPENCHAMBER_PORT;
34
+ process.env.AIWORKER_DATA_DIR = dataDir;
35
+ delete process.env.AIWORKER_LINEAR_CLIENT_ID;
36
+ delete process.env.AIWORKER_LINEAR_SCOPES;
37
+ delete process.env.AIWORKER_LINEAR_REDIRECT_URI;
38
+ delete process.env.AIWORKER_PORT;
39
39
  });
40
40
 
41
41
  afterEach(() => {
42
- restoreEnv('OPENCHAMBER_DATA_DIR', previousDataDir);
43
- restoreEnv('OPENCHAMBER_PORT', previousPort);
44
- restoreEnv('OPENCHAMBER_LINEAR_CLIENT_ID', previousClientId);
45
- restoreEnv('OPENCHAMBER_LINEAR_REDIRECT_URI', previousRedirect);
42
+ restoreEnv('AIWORKER_DATA_DIR', previousDataDir);
43
+ restoreEnv('AIWORKER_PORT', previousPort);
44
+ restoreEnv('AIWORKER_LINEAR_CLIENT_ID', previousClientId);
45
+ restoreEnv('AIWORKER_LINEAR_REDIRECT_URI', previousRedirect);
46
46
  fs.rmSync(dataDir, { recursive: true, force: true });
47
47
  });
48
48
 
@@ -58,7 +58,7 @@ describe('Linear auth storage', () => {
58
58
  expiresAt: Date.now() + 60_000,
59
59
  scope: 'read,write',
60
60
  user: { id: 'user-1', name: 'Ada', displayName: 'Ada Lovelace', email: 'ada@example.com', avatarUrl: 'https://example.com/a.png' },
61
- organization: { id: 'org-1', name: 'OpenChamber', urlKey: 'openchamber' },
61
+ organization: { id: 'org-1', name: 'AiWorker', urlKey: 'aiworker' },
62
62
  });
63
63
 
64
64
  const stored = getLinearAuth();
@@ -75,12 +75,12 @@ describe('Linear auth storage', () => {
75
75
  email: 'ada@example.com',
76
76
  avatarUrl: 'https://example.com/a.png',
77
77
  },
78
- organization: { id: 'org-1', name: 'OpenChamber', urlKey: 'openchamber' },
78
+ organization: { id: 'org-1', name: 'AiWorker', urlKey: 'aiworker' },
79
79
  scope: 'read,write',
80
80
  workspaces: [{
81
81
  id: 'org-1',
82
- name: 'OpenChamber',
83
- urlKey: 'openchamber',
82
+ name: 'AiWorker',
83
+ urlKey: 'aiworker',
84
84
  current: true,
85
85
  user: {
86
86
  id: 'user-1',
@@ -137,14 +137,14 @@ describe('Linear auth storage', () => {
137
137
 
138
138
  it('uses the baked-in client id unless env or settings override it', () => {
139
139
  expect(getLinearClientId()).toBe(DEFAULT_LINEAR_CLIENT_ID_VALUE);
140
- process.env.OPENCHAMBER_LINEAR_CLIENT_ID = 'env-client';
140
+ process.env.AIWORKER_LINEAR_CLIENT_ID = 'env-client';
141
141
  expect(getLinearClientId()).toBe('env-client');
142
142
  });
143
143
 
144
144
  it('uses the stable public broker callback by default', () => {
145
- process.env.OPENCHAMBER_PORT = '3001';
146
- expect(getLinearRedirectUri()).toBe('https://api.openchamber.dev/v1/oauth/linear/callback');
147
- process.env.OPENCHAMBER_LINEAR_REDIRECT_URI = 'http://localhost:3000/linear/oauth/callback';
145
+ process.env.AIWORKER_PORT = '3001';
146
+ expect(getLinearRedirectUri()).toBe('https://api.aiworker.dev/v1/oauth/linear/callback');
147
+ process.env.AIWORKER_LINEAR_REDIRECT_URI = 'http://localhost:3000/linear/oauth/callback';
148
148
  expect(getLinearRedirectUri()).toBe('http://localhost:3000/linear/oauth/callback');
149
149
  });
150
150
 
@@ -161,7 +161,7 @@ describe('Linear auth storage', () => {
161
161
  accessToken: 'legacy-access',
162
162
  refreshToken: 'legacy-refresh',
163
163
  user: { id: 'user-1', name: 'Ada' },
164
- organization: { id: 'org-1', name: 'OpenChamber', urlKey: 'openchamber' },
164
+ organization: { id: 'org-1', name: 'AiWorker', urlKey: 'aiworker' },
165
165
  }), 'utf8');
166
166
 
167
167
  const stored = getLinearAuth();
@@ -216,7 +216,7 @@ describe('Linear auth storage', () => {
216
216
  setLinearAuth({
217
217
  accessToken: 'access-1',
218
218
  user: { id: 'user-1', name: 'Ada' },
219
- organization: { id: 'org-1', name: 'OpenChamber', urlKey: 'openchamber' },
219
+ organization: { id: 'org-1', name: 'AiWorker', urlKey: 'aiworker' },
220
220
  });
221
221
  const file = JSON.parse(fs.readFileSync(getLinearAuthFilePath(), 'utf8'));
222
222
  file.workspaces[0].authorizedAt = 111;
@@ -225,7 +225,7 @@ describe('Linear auth storage', () => {
225
225
  setLinearAuth({
226
226
  accessToken: 'access-1',
227
227
  user: { id: 'user-1', name: 'Ada' },
228
- organization: { id: 'org-1', name: 'OpenChamber', urlKey: 'openchamber' },
228
+ organization: { id: 'org-1', name: 'AiWorker', urlKey: 'aiworker' },
229
229
  workspaceId: 'org-1',
230
230
  }, { activate: false });
231
231
  expect(getLinearAuth().authorizedAt).toBe(111);
@@ -40,9 +40,9 @@ describe('Linear issue list/get', () => {
40
40
  let previousDataDir;
41
41
 
42
42
  beforeEach(() => {
43
- previousDataDir = process.env.OPENCHAMBER_DATA_DIR;
43
+ previousDataDir = process.env.AIWORKER_DATA_DIR;
44
44
  dataDir = makeTempDir();
45
- process.env.OPENCHAMBER_DATA_DIR = dataDir;
45
+ process.env.AIWORKER_DATA_DIR = dataDir;
46
46
  setLinearAuth({
47
47
  accessToken: 'access-1',
48
48
  refreshToken: 'refresh-1',
@@ -56,9 +56,9 @@ describe('Linear issue list/get', () => {
56
56
  vi.unstubAllGlobals();
57
57
  clearLinearAuth();
58
58
  if (previousDataDir === undefined) {
59
- delete process.env.OPENCHAMBER_DATA_DIR;
59
+ delete process.env.AIWORKER_DATA_DIR;
60
60
  } else {
61
- process.env.OPENCHAMBER_DATA_DIR = previousDataDir;
61
+ process.env.AIWORKER_DATA_DIR = previousDataDir;
62
62
  }
63
63
  fs.rmSync(dataDir, { recursive: true, force: true });
64
64
  });
@@ -336,7 +336,7 @@ describe('Linear issue list/get', () => {
336
336
  expect(body.query).toContain('mutation CommentCreate');
337
337
  expect(body.variables.input).toEqual({
338
338
  issueId: 'issue-uuid-1',
339
- body: 'OpenChamber session started.',
339
+ body: 'AiWorker session started.',
340
340
  });
341
341
  expect(options.headers.Authorization).toBe('Bearer access-1');
342
342
  return jsonResponse({
@@ -351,7 +351,7 @@ describe('Linear issue list/get', () => {
351
351
 
352
352
  const result = await createLinearIssueComment({
353
353
  issueId: 'ENG-12',
354
- body: 'OpenChamber session started.',
354
+ body: 'AiWorker session started.',
355
355
  });
356
356
  expect(result).toEqual({ connected: true, comment: { id: 'comment-9' } });
357
357
  expect(JSON.stringify(result)).not.toContain('access-1');
@@ -18,16 +18,16 @@ describe('Linear project mapping storage', () => {
18
18
  let previousDataDir;
19
19
 
20
20
  beforeEach(() => {
21
- previousDataDir = process.env.OPENCHAMBER_DATA_DIR;
21
+ previousDataDir = process.env.AIWORKER_DATA_DIR;
22
22
  dataDir = makeTempDir();
23
- process.env.OPENCHAMBER_DATA_DIR = dataDir;
23
+ process.env.AIWORKER_DATA_DIR = dataDir;
24
24
  });
25
25
 
26
26
  afterEach(() => {
27
27
  if (previousDataDir === undefined) {
28
- delete process.env.OPENCHAMBER_DATA_DIR;
28
+ delete process.env.AIWORKER_DATA_DIR;
29
29
  } else {
30
- process.env.OPENCHAMBER_DATA_DIR = previousDataDir;
30
+ process.env.AIWORKER_DATA_DIR = previousDataDir;
31
31
  }
32
32
  fs.rmSync(dataDir, { recursive: true, force: true });
33
33
  });
@@ -141,7 +141,7 @@ export async function startAuthorization({ origin } = {}) {
141
141
  const clientId = getLinearClientId();
142
142
  if (!clientId) {
143
143
  throw new LinearOAuthError(
144
- 'Linear OAuth client not configured. Set OPENCHAMBER_LINEAR_CLIENT_ID.',
144
+ 'Linear OAuth client not configured. Set AIWORKER_LINEAR_CLIENT_ID.',
145
145
  'LINEAR_CLIENT_ID_MISSING',
146
146
  );
147
147
  }
@@ -269,7 +269,7 @@ export async function consumeAuthorizationCallback({ code, state, error, errorDe
269
269
  }
270
270
  if (!pending?.codeVerifier) {
271
271
  throw failAuthorization(
272
- 'This authorization session has expired or is unknown to the running app. Return to OpenChamber and click Connect again.',
272
+ 'This authorization session has expired or is unknown to the running app. Return to AiWorker and click Connect again.',
273
273
  'UNKNOWN_STATE',
274
274
  );
275
275
  }
@@ -20,23 +20,23 @@ describe('Linear OAuth PKCE', () => {
20
20
  let previousRedirect;
21
21
 
22
22
  beforeEach(() => {
23
- previousDataDir = process.env.OPENCHAMBER_DATA_DIR;
24
- previousPort = process.env.OPENCHAMBER_PORT;
25
- previousRedirect = process.env.OPENCHAMBER_LINEAR_REDIRECT_URI;
23
+ previousDataDir = process.env.AIWORKER_DATA_DIR;
24
+ previousPort = process.env.AIWORKER_PORT;
25
+ previousRedirect = process.env.AIWORKER_LINEAR_REDIRECT_URI;
26
26
  dataDir = makeTempDir();
27
- process.env.OPENCHAMBER_DATA_DIR = dataDir;
28
- process.env.OPENCHAMBER_PORT = '3001';
29
- delete process.env.OPENCHAMBER_LINEAR_CLIENT_ID;
30
- process.env.OPENCHAMBER_LINEAR_REDIRECT_URI = 'http://127.0.0.1:3001/linear/oauth/callback';
27
+ process.env.AIWORKER_DATA_DIR = dataDir;
28
+ process.env.AIWORKER_PORT = '3001';
29
+ delete process.env.AIWORKER_LINEAR_CLIENT_ID;
30
+ process.env.AIWORKER_LINEAR_REDIRECT_URI = 'http://127.0.0.1:3001/linear/oauth/callback';
31
31
  clearPendingAuthorizationsForTests();
32
32
  });
33
33
 
34
34
  afterEach(() => {
35
35
  vi.unstubAllGlobals();
36
36
  clearPendingAuthorizationsForTests();
37
- restoreEnv('OPENCHAMBER_DATA_DIR', previousDataDir);
38
- restoreEnv('OPENCHAMBER_PORT', previousPort);
39
- restoreEnv('OPENCHAMBER_LINEAR_REDIRECT_URI', previousRedirect);
37
+ restoreEnv('AIWORKER_DATA_DIR', previousDataDir);
38
+ restoreEnv('AIWORKER_PORT', previousPort);
39
+ restoreEnv('AIWORKER_LINEAR_REDIRECT_URI', previousRedirect);
40
40
  fs.rmSync(dataDir, { recursive: true, force: true });
41
41
  });
42
42
 
@@ -113,7 +113,7 @@ describe('Linear OAuth PKCE', () => {
113
113
  });
114
114
 
115
115
  it('claims a broker callback and exchanges it locally with PKCE', async () => {
116
- delete process.env.OPENCHAMBER_LINEAR_REDIRECT_URI;
116
+ delete process.env.AIWORKER_LINEAR_REDIRECT_URI;
117
117
  const brokerAndTokenFetch = vi.fn(async (url, init) => {
118
118
  const target = String(url);
119
119
  if (target.endsWith('/start')) {
@@ -121,7 +121,7 @@ describe('Linear OAuth PKCE', () => {
121
121
  expect(body.state).toMatch(/^[A-Za-z0-9_-]{43}$/);
122
122
  expect(body.claimSecret).toMatch(/^[A-Za-z0-9_-]{43}$/);
123
123
  return new Response(JSON.stringify({
124
- redirectUri: 'https://api.openchamber.dev/v1/oauth/linear/callback',
124
+ redirectUri: 'https://api.aiworker.dev/v1/oauth/linear/callback',
125
125
  expiresIn: 600,
126
126
  }), { status: 200 });
127
127
  }
@@ -134,7 +134,7 @@ describe('Linear OAuth PKCE', () => {
134
134
  if (target === 'https://api.linear.app/oauth/token') {
135
135
  const body = new URLSearchParams(init.body);
136
136
  expect(body.get('code')).toBe('broker-code');
137
- expect(body.get('redirect_uri')).toBe('https://api.openchamber.dev/v1/oauth/linear/callback');
137
+ expect(body.get('redirect_uri')).toBe('https://api.aiworker.dev/v1/oauth/linear/callback');
138
138
  expect(body.get('code_verifier')).toMatch(/^[A-Za-z0-9_-]{43}$/);
139
139
  return new Response(JSON.stringify({
140
140
  access_token: 'broker-access',
@@ -148,7 +148,7 @@ describe('Linear OAuth PKCE', () => {
148
148
 
149
149
  const started = await startAuthorization({ origin: 'desktop' });
150
150
  const authorizationUrl = new URL(started.authorizationUrl);
151
- expect(authorizationUrl.searchParams.get('redirect_uri')).toBe('https://api.openchamber.dev/v1/oauth/linear/callback');
151
+ expect(authorizationUrl.searchParams.get('redirect_uri')).toBe('https://api.aiworker.dev/v1/oauth/linear/callback');
152
152
 
153
153
  const result = await pollAuthorizationBroker();
154
154
  expect(result).toMatchObject({ accessToken: 'broker-access', origin: 'desktop' });
@@ -29,7 +29,7 @@ function renderLinearOAuthCallbackPage({ title, message, desktopReturn }) {
29
29
  <head>
30
30
  <meta charset="utf-8">
31
31
  <meta name="viewport" content="width=device-width, initial-scale=1">
32
- <title>${escapeHtml(title)} — OpenChamber</title>
32
+ <title>${escapeHtml(title)} — AiWorker</title>
33
33
  <style>
34
34
  :root { color-scheme: light dark; }
35
35
  body { margin: 0; min-height: 100vh; display: flex; align-items: center; justify-content: center;
@@ -46,8 +46,8 @@ function renderLinearOAuthCallbackPage({ title, message, desktopReturn }) {
46
46
  <main>
47
47
  <h1>${escapeHtml(title)}</h1>
48
48
  <p>${escapeHtml(message)}</p>
49
- ${desktopReturn ? `<a class="return" href="openchamber://focus/linear-auth">Return to OpenChamber</a>
50
- <script>window.location.href = 'openchamber://focus/linear-auth';</script>` : ''}
49
+ ${desktopReturn ? `<a class="return" href="aiworker://focus/linear-auth">Return to AiWorker</a>
50
+ <script>window.location.href = 'aiworker://focus/linear-auth';</script>` : ''}
51
51
  </main>
52
52
  </body>
53
53
  </html>`;
@@ -103,7 +103,7 @@ export function registerLinearRoutes(app) {
103
103
 
104
104
  return finish(200, {
105
105
  title: 'Authorization Complete',
106
- message: 'You can close this tab and return to OpenChamber.',
106
+ message: 'You can close this tab and return to AiWorker.',
107
107
  desktopReturn: result.origin === 'desktop',
108
108
  });
109
109
  } catch (error) {
@@ -113,7 +113,7 @@ export function registerLinearRoutes(app) {
113
113
  : 502;
114
114
  return finish(status, {
115
115
  title: 'Authorization Failed',
116
- message: error instanceof Error ? error.message : 'Linear authorization failed. Return to OpenChamber and click Connect again.',
116
+ message: error instanceof Error ? error.message : 'Linear authorization failed. Return to AiWorker and click Connect again.',
117
117
  desktopReturn: error?.origin === 'desktop',
118
118
  });
119
119
  }
@@ -25,23 +25,23 @@ describe('Linear auth routes', () => {
25
25
  let previousDataDir;
26
26
 
27
27
  beforeEach(() => {
28
- previousDataDir = process.env.OPENCHAMBER_DATA_DIR;
28
+ previousDataDir = process.env.AIWORKER_DATA_DIR;
29
29
  dataDir = makeTempDir();
30
- process.env.OPENCHAMBER_DATA_DIR = dataDir;
31
- process.env.OPENCHAMBER_PORT = '3001';
32
- process.env.OPENCHAMBER_LINEAR_REDIRECT_URI = 'http://127.0.0.1:3001/linear/oauth/callback';
33
- delete process.env.OPENCHAMBER_LINEAR_CLIENT_ID;
30
+ process.env.AIWORKER_DATA_DIR = dataDir;
31
+ process.env.AIWORKER_PORT = '3001';
32
+ process.env.AIWORKER_LINEAR_REDIRECT_URI = 'http://127.0.0.1:3001/linear/oauth/callback';
33
+ delete process.env.AIWORKER_LINEAR_CLIENT_ID;
34
34
  });
35
35
 
36
36
  afterEach(() => {
37
37
  vi.unstubAllGlobals();
38
38
  if (previousDataDir === undefined) {
39
- delete process.env.OPENCHAMBER_DATA_DIR;
39
+ delete process.env.AIWORKER_DATA_DIR;
40
40
  } else {
41
- process.env.OPENCHAMBER_DATA_DIR = previousDataDir;
41
+ process.env.AIWORKER_DATA_DIR = previousDataDir;
42
42
  }
43
- delete process.env.OPENCHAMBER_PORT;
44
- delete process.env.OPENCHAMBER_LINEAR_REDIRECT_URI;
43
+ delete process.env.AIWORKER_PORT;
44
+ delete process.env.AIWORKER_LINEAR_REDIRECT_URI;
45
45
  fs.rmSync(dataDir, { recursive: true, force: true });
46
46
  });
47
47
 
@@ -76,7 +76,7 @@ describe('Linear auth routes', () => {
76
76
  email: 'ada@example.com',
77
77
  avatarUrl: 'https://example.com/a.png',
78
78
  },
79
- organization: { id: 'org-1', name: 'OpenChamber', urlKey: 'openchamber' },
79
+ organization: { id: 'org-1', name: 'AiWorker', urlKey: 'aiworker' },
80
80
  },
81
81
  });
82
82
  }
@@ -89,7 +89,7 @@ describe('Linear auth routes', () => {
89
89
  .expect(200);
90
90
 
91
91
  expect(callback.text).toContain('Authorization Complete');
92
- expect(callback.text).toContain('openchamber://focus/linear-auth');
92
+ expect(callback.text).toContain('aiworker://focus/linear-auth');
93
93
 
94
94
  const status = await request(app).get('/api/linear/auth/status').expect(200);
95
95
  expect(status.body.connected).toBe(true);
@@ -100,12 +100,12 @@ describe('Linear auth routes', () => {
100
100
  email: 'ada@example.com',
101
101
  avatarUrl: 'https://example.com/a.png',
102
102
  });
103
- expect(status.body.organization).toEqual({ id: 'org-1', name: 'OpenChamber', urlKey: 'openchamber' });
103
+ expect(status.body.organization).toEqual({ id: 'org-1', name: 'AiWorker', urlKey: 'aiworker' });
104
104
  expect(status.body.scope).toBe('read,write,comments:create');
105
105
  expect(status.body.workspaces).toEqual([{
106
106
  id: 'org-1',
107
- name: 'OpenChamber',
108
- urlKey: 'openchamber',
107
+ name: 'AiWorker',
108
+ urlKey: 'aiworker',
109
109
  current: true,
110
110
  user: {
111
111
  id: 'user-1',
@@ -133,7 +133,7 @@ describe('Linear auth routes', () => {
133
133
  .expect(400);
134
134
  expect(tokenFetch).not.toHaveBeenCalled();
135
135
  expect(response.text).toContain('Authorization Failed');
136
- expect(response.text).not.toContain('openchamber://');
136
+ expect(response.text).not.toContain('aiworker://');
137
137
  });
138
138
 
139
139
  it('omits the desktop deep link for flows started outside the desktop shell', async () => {
@@ -162,7 +162,7 @@ describe('Linear auth routes', () => {
162
162
  .get('/linear/oauth/callback')
163
163
  .query({ state, code: 'auth-code' })
164
164
  .expect(200);
165
- expect(response.text).not.toContain('openchamber://');
165
+ expect(response.text).not.toContain('aiworker://');
166
166
  });
167
167
 
168
168
  it('disconnects and revokes the refresh token', async () => {
@@ -50,11 +50,11 @@ describe('Linear session status runtime', () => {
50
50
  let previousPort;
51
51
 
52
52
  beforeEach(() => {
53
- previousDataDir = process.env.OPENCHAMBER_DATA_DIR;
54
- previousPort = process.env.OPENCHAMBER_PORT;
53
+ previousDataDir = process.env.AIWORKER_DATA_DIR;
54
+ previousPort = process.env.AIWORKER_PORT;
55
55
  dataDir = makeTempDir();
56
- process.env.OPENCHAMBER_DATA_DIR = dataDir;
57
- process.env.OPENCHAMBER_PORT = '3001';
56
+ process.env.AIWORKER_DATA_DIR = dataDir;
57
+ process.env.AIWORKER_PORT = '3001';
58
58
  setLinearAuth({
59
59
  accessToken: 'access-1',
60
60
  refreshToken: 'refresh-1',
@@ -69,14 +69,14 @@ describe('Linear session status runtime', () => {
69
69
  vi.unstubAllGlobals();
70
70
  clearLinearAuth();
71
71
  if (previousDataDir === undefined) {
72
- delete process.env.OPENCHAMBER_DATA_DIR;
72
+ delete process.env.AIWORKER_DATA_DIR;
73
73
  } else {
74
- process.env.OPENCHAMBER_DATA_DIR = previousDataDir;
74
+ process.env.AIWORKER_DATA_DIR = previousDataDir;
75
75
  }
76
76
  if (previousPort === undefined) {
77
- delete process.env.OPENCHAMBER_PORT;
77
+ delete process.env.AIWORKER_PORT;
78
78
  } else {
79
- process.env.OPENCHAMBER_PORT = previousPort;
79
+ process.env.AIWORKER_PORT = previousPort;
80
80
  }
81
81
  fs.rmSync(dataDir, { recursive: true, force: true });
82
82
  });
@@ -147,7 +147,7 @@ describe('Linear session status runtime', () => {
147
147
  });
148
148
  expect(commentCalls).toHaveLength(1);
149
149
  const body = JSON.parse(commentCalls[0][1].body).variables.input.body;
150
- expect(body).toContain('OpenChamber session failed');
150
+ expect(body).toContain('AiWorker session failed');
151
151
  });
152
152
  runtime.stop();
153
153
  });
@@ -117,7 +117,7 @@ function statusWord(kind) {
117
117
 
118
118
  export function buildLinearSessionStatusComment({ kind, sessionUrl }) {
119
119
  const url = readTrimmedString(sessionUrl);
120
- const label = `OpenChamber session ${statusWord(kind)}`;
120
+ const label = `AiWorker session ${statusWord(kind)}`;
121
121
  if (!url) return label;
122
122
  // The comment already lives on the issue, so it says only what happened and
123
123
  // links to the session. Issue titles routinely contain brackets ("[Bug] …"),
@@ -59,11 +59,11 @@ describe('Linear session status comments', () => {
59
59
  let previousPort;
60
60
 
61
61
  beforeEach(() => {
62
- previousDataDir = process.env.OPENCHAMBER_DATA_DIR;
63
- previousPort = process.env.OPENCHAMBER_PORT;
62
+ previousDataDir = process.env.AIWORKER_DATA_DIR;
63
+ previousPort = process.env.AIWORKER_PORT;
64
64
  dataDir = makeTempDir();
65
- process.env.OPENCHAMBER_DATA_DIR = dataDir;
66
- process.env.OPENCHAMBER_PORT = '3001';
65
+ process.env.AIWORKER_DATA_DIR = dataDir;
66
+ process.env.AIWORKER_PORT = '3001';
67
67
  setLinearAuth({
68
68
  accessToken: 'access-1',
69
69
  refreshToken: 'refresh-1',
@@ -78,14 +78,14 @@ describe('Linear session status comments', () => {
78
78
  vi.unstubAllGlobals();
79
79
  clearLinearAuth();
80
80
  if (previousDataDir === undefined) {
81
- delete process.env.OPENCHAMBER_DATA_DIR;
81
+ delete process.env.AIWORKER_DATA_DIR;
82
82
  } else {
83
- process.env.OPENCHAMBER_DATA_DIR = previousDataDir;
83
+ process.env.AIWORKER_DATA_DIR = previousDataDir;
84
84
  }
85
85
  if (previousPort === undefined) {
86
- delete process.env.OPENCHAMBER_PORT;
86
+ delete process.env.AIWORKER_PORT;
87
87
  } else {
88
- process.env.OPENCHAMBER_PORT = previousPort;
88
+ process.env.AIWORKER_PORT = previousPort;
89
89
  }
90
90
  fs.rmSync(dataDir, { recursive: true, force: true });
91
91
  });
@@ -95,7 +95,7 @@ describe('Linear session status comments', () => {
95
95
  expect(readSessionOrigin('http://127.0.0.1:3001/')).toBe('http://127.0.0.1:3001');
96
96
  expect(readSessionOrigin('javascript:alert(1)')).toBe('');
97
97
  expect(readSessionOrigin('https://app.example.com/secret')).toBe('');
98
- expect(readSessionOrigin('openchamber:')).toBe('');
98
+ expect(readSessionOrigin('aiworker:')).toBe('');
99
99
  expect(buildLinearSessionOpenUrl('ses_1', 'https://app.example.com'))
100
100
  .toBe('https://app.example.com/?session=ses_1');
101
101
  expect(buildLinearSessionOpenUrl('ses_1', '')).toBe('');
@@ -117,7 +117,7 @@ describe('Linear session status comments', () => {
117
117
  expect(isPublicSessionOrigin('http://macbook.local:3001')).toBe(false);
118
118
  expect(isPublicSessionOrigin('http://macbook:3001')).toBe(false);
119
119
  expect(isPublicSessionOrigin('http://[fd00::1]:3001')).toBe(false);
120
- expect(isPublicSessionOrigin('openchamber:')).toBe(false);
120
+ expect(isPublicSessionOrigin('aiworker:')).toBe(false);
121
121
  expect(isPublicSessionOrigin('')).toBe(false);
122
122
  });
123
123
 
@@ -164,15 +164,15 @@ describe('Linear session status comments', () => {
164
164
  expect(buildLinearSessionStatusComment({
165
165
  kind: 'started',
166
166
  sessionUrl: 'https://app.example.com/?session=ses_1',
167
- })).toBe('[OpenChamber session started](https://app.example.com/?session=ses_1)');
167
+ })).toBe('[AiWorker session started](https://app.example.com/?session=ses_1)');
168
168
  expect(buildLinearSessionStatusComment({
169
169
  kind: 'completed',
170
170
  sessionUrl: 'https://app.example.com/?session=ses_1',
171
- })).toBe('[OpenChamber session completed](https://app.example.com/?session=ses_1)');
171
+ })).toBe('[AiWorker session completed](https://app.example.com/?session=ses_1)');
172
172
  expect(buildLinearSessionStatusComment({
173
173
  kind: 'failure',
174
174
  sessionUrl: 'https://app.example.com/?session=ses_1',
175
- })).toBe('[OpenChamber session failed](https://app.example.com/?session=ses_1)');
175
+ })).toBe('[AiWorker session failed](https://app.example.com/?session=ses_1)');
176
176
  });
177
177
 
178
178
  it('cannot be broken by brackets in the issue title', async () => {
@@ -231,7 +231,7 @@ describe('Linear session status comments', () => {
231
231
  });
232
232
  expect(commentCalls).toHaveLength(1);
233
233
  const body = JSON.parse(commentCalls[0][1].body).variables.input.body;
234
- expect(body).toBe('[OpenChamber session started](https://app.example.com/?session=ses_1)');
234
+ expect(body).toBe('[AiWorker session started](https://app.example.com/?session=ses_1)');
235
235
  expect(JSON.stringify(first)).not.toContain('access-1');
236
236
  });
237
237
 
@@ -266,6 +266,6 @@ describe('Linear session status comments', () => {
266
266
  });
267
267
  expect(commentCalls).toHaveLength(1);
268
268
  const body = JSON.parse(commentCalls[0][1].body).variables.input.body;
269
- expect(body).toBe('[OpenChamber session completed](https://app.example.com/?session=ses_1)');
269
+ expect(body).toBe('[AiWorker session completed](https://app.example.com/?session=ses_1)');
270
270
  });
271
271
  });
@@ -17,9 +17,9 @@ describe('Linear teams list', () => {
17
17
  let previousDataDir;
18
18
 
19
19
  beforeEach(() => {
20
- previousDataDir = process.env.OPENCHAMBER_DATA_DIR;
20
+ previousDataDir = process.env.AIWORKER_DATA_DIR;
21
21
  dataDir = makeTempDir();
22
- process.env.OPENCHAMBER_DATA_DIR = dataDir;
22
+ process.env.AIWORKER_DATA_DIR = dataDir;
23
23
  setLinearAuth({
24
24
  accessToken: 'access-1',
25
25
  refreshToken: 'refresh-1',
@@ -33,9 +33,9 @@ describe('Linear teams list', () => {
33
33
  vi.unstubAllGlobals();
34
34
  clearLinearAuth();
35
35
  if (previousDataDir === undefined) {
36
- delete process.env.OPENCHAMBER_DATA_DIR;
36
+ delete process.env.AIWORKER_DATA_DIR;
37
37
  } else {
38
- process.env.OPENCHAMBER_DATA_DIR = previousDataDir;
38
+ process.env.AIWORKER_DATA_DIR = previousDataDir;
39
39
  }
40
40
  fs.rmSync(dataDir, { recursive: true, force: true });
41
41
  });
@@ -4,13 +4,13 @@ export const registerMagicPromptRoutes = (app, dependencies) => {
4
4
  const {
5
5
  fsPromises,
6
6
  path,
7
- openchamberDataDir,
7
+ aiworkerDataDir,
8
8
  } = dependencies;
9
9
 
10
10
  const runtime = createMagicPromptRuntime({
11
11
  fsPromises,
12
12
  path,
13
- filePath: path.join(openchamberDataDir, 'magic-prompts.json'),
13
+ filePath: path.join(aiworkerDataDir, 'magic-prompts.json'),
14
14
  });
15
15
 
16
16
  app.get('/api/magic-prompts', async (_req, res) => {