@aiworker/web 1.22.0 → 1.23.0

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 (415) hide show
  1. package/README.md +4 -4
  2. package/bin/cli.js +14 -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-B1Gizi3a.js} +1 -1
  28. package/dist/assets/DiffView-DXjVsEOw.js +4 -0
  29. package/dist/assets/DirtyBranchSwitchDialog-aig6zJjg.js +1 -0
  30. package/dist/assets/FilesView-CJdG0-wk.js +17 -0
  31. package/dist/assets/GitView-BXsS3jG6.js +6 -0
  32. package/dist/assets/{JsonTreeView-B0BdZEHG.js → JsonTreeView-D_hpXBnF.js} +1 -1
  33. package/dist/assets/LinearIssuesView-BoUiLQG1.js +1 -0
  34. package/dist/assets/MarkdownImageGallery-B_B_a9KS.js +1 -0
  35. package/dist/assets/MarkdownRendererImpl-xgyyLiBM.js +12 -0
  36. package/dist/assets/OnboardingScreen-DIp84OWt.js +1 -0
  37. package/dist/assets/{PatchDiff-DvfqDql7.js → PatchDiff-8p6nLJaU.js} +1 -1
  38. package/dist/assets/PierreDiffViewer-DjC8nTk9.js +161 -0
  39. package/dist/assets/PlanView-CJTmOF6I.js +5 -0
  40. package/dist/assets/SettingsView-DD-JqIJx.js +28 -0
  41. package/dist/assets/{SettingsWindow-i45U1Cy1.js → SettingsWindow-Cpb4hM6q.js} +1 -1
  42. package/dist/assets/SymbolsNerdFontMono-Regular-aK5vsLov.woff2 +0 -0
  43. package/dist/assets/{ToolOutputDialog-BTwyh5OF.js → ToolOutputDialog-DfaKZXNU.js} +6 -6
  44. package/dist/assets/ToolPartDiffPreview-DtZLzrSK.js +8 -0
  45. package/dist/assets/{VirtualizedFileDiff-DD8lDVej.js → VirtualizedFileDiff-C8i9HpTB.js} +1 -1
  46. package/dist/assets/WalkthroughView-DeKMvZlL.js +4 -0
  47. package/dist/assets/{computeVirtualFileMetrics-BMIRgMHv.js → computeVirtualFileMetrics-BBI7ZwrC.js} +2 -2
  48. package/dist/assets/contextPanelEmbeddedChat-BdA6bdky.js +1 -0
  49. package/dist/assets/de-DCrsQ5zS.js +10 -0
  50. package/dist/assets/es-Dwv4YfH6.js +16 -0
  51. package/dist/assets/fr-BCWg4Cnx.js +14 -0
  52. package/dist/assets/ghostty-vt-DdA0Zryv.wasm +0 -0
  53. package/dist/assets/index-B68h5S5B.css +1 -0
  54. package/dist/assets/index-DVwMarHI.js +39 -0
  55. package/dist/assets/{index-CODwDsU_.js → index-jXSK5RrB.js} +1 -1
  56. package/dist/assets/{isDiffPlainText-BqayB8d3.js → isDiffPlainText-B_x_rVon.js} +1 -1
  57. package/dist/assets/{isFilePlainText-QfoiKJNY.js → isFilePlainText-DW_xMer1.js} +1 -1
  58. package/dist/assets/ja-Bruw3RYC.js +16 -0
  59. package/dist/assets/ko-idhXGF8j.js +16 -0
  60. package/dist/assets/main-BkyaQhJX.js +930 -0
  61. package/dist/assets/{main-C5DVOxc6.js → main-CzdPuL0s.js} +2 -2
  62. package/dist/assets/markdownCore-Cn4Tyejo.js +5 -0
  63. package/dist/assets/{miniChat-DUJ4irZc.js → miniChat-CCkqKOLp.js} +2 -2
  64. package/dist/assets/{mobile-CcaxB0n4.js → mobile-mvxTo055.js} +2 -2
  65. package/dist/assets/patchFileDiff-Csk4iNUi.js +13 -0
  66. package/dist/assets/pl-CGZWUqZJ.js +16 -0
  67. package/dist/assets/pt-BR-B8V7u7tA.js +16 -0
  68. package/dist/assets/renderElectronMiniChatApp-BxoyujA5.js +2 -0
  69. package/dist/assets/renderMobileApp-B48CsP4r.js +25 -0
  70. package/dist/assets/runtimeEndpointReset-Bg5gx18H.js +17 -0
  71. package/dist/assets/scheduledTasksApi-BW0Etzwz.js +1 -0
  72. package/dist/assets/{shikiHighlight-DYOWuY65.js → shikiHighlight-CRl0SUC9.js} +1 -1
  73. package/dist/assets/surface-oMvhsog3.js +1 -0
  74. package/dist/assets/tr-BK_KiO2V.js +7 -0
  75. package/dist/assets/uk-CG74xV8N.js +16 -0
  76. package/dist/assets/useAppFontEffects-CPKeOpUo.js +7284 -0
  77. package/dist/assets/useGitComparison-DH220WmO.js +1 -0
  78. package/dist/assets/useInlineCommentController-BiWz4AVb.js +2 -0
  79. package/dist/assets/useRootScrollLock-BS4-kr7P.js +1 -0
  80. package/dist/assets/{vendor-base-ui-BeMD8X_w.js → vendor-base-ui-DdV8vhHn.js} +1 -1
  81. package/dist/assets/{vendor-codemirror-language-data-DFZik9R2.js → vendor-codemirror-language-data-Bg4AEeCr.js} +2 -2
  82. package/dist/assets/vendor-zod-BPAANqvH.js +39 -0
  83. package/dist/assets/{web-components-Bhg83tjf.js → web-components-z7hfnS8n.js} +1 -1
  84. package/dist/assets/zh-CN-T4AXofZI.js +16 -0
  85. package/dist/assets/zh-TW-Dte40sxp.js +16 -0
  86. package/dist/index.html +21 -59
  87. package/dist/mini-chat.html +7 -7
  88. package/dist/mobile.html +5 -5
  89. package/package.json +3 -4
  90. package/server/index.d.ts +15 -0
  91. package/server/index.js +158 -89
  92. package/server/lib/agent-memory/actions.js +2 -2
  93. package/server/lib/agent-memory/feature-flag.js +1 -1
  94. package/server/lib/agent-memory/feature-flag.test.js +8 -8
  95. package/server/lib/agent-memory/routes.js +2 -2
  96. package/server/lib/agent-tool/runtime.js +37 -54
  97. package/server/lib/agent-tool/runtime.test.js +59 -59
  98. package/server/lib/browser-control/broker.js +3 -3
  99. package/server/lib/browser-control/broker.test.js +1 -1
  100. package/server/lib/changelog/update-notes.js +82 -0
  101. package/server/lib/changelog/update-notes.test.js +59 -0
  102. package/server/lib/client-auth/remote-clients.test.js +5 -5
  103. package/server/lib/context-obligatory/runtime.js +7 -7
  104. package/server/lib/context-obligatory/runtime.test.js +5 -5
  105. package/server/lib/data-dir-migration.js +40 -0
  106. package/server/lib/data-dir-migration.test.js +59 -0
  107. package/server/lib/dev-servers/parse.js +2 -2
  108. package/server/lib/dev-servers/parse.test.js +2 -2
  109. package/server/lib/dev-servers/routes.js +1 -1
  110. package/server/lib/dev-tunnel/DOCUMENTATION.md +13 -4
  111. package/server/lib/dev-tunnel/client.js +1 -1
  112. package/server/lib/dev-tunnel/runtime.js +5 -5
  113. package/server/lib/dev-tunnel/tunnel.test.js +21 -1
  114. package/server/lib/dictation/local/model-catalog.js +1 -1
  115. package/server/lib/dictation/local/worker-process.js +2 -2
  116. package/server/lib/event-stream/directory-ws-bridge.js +1 -1
  117. package/server/lib/event-stream/global-ws-bridge.js +1 -1
  118. package/server/lib/event-stream/protocol.test.js +4 -4
  119. package/server/lib/event-stream/runtime.test.js +18 -18
  120. package/server/lib/fs/DOCUMENTATION.md +5 -0
  121. package/server/lib/fs/routes.js +68 -26
  122. package/server/lib/fs/routes.test.js +208 -22
  123. package/server/lib/git/DOCUMENTATION.md +32 -6
  124. package/server/lib/git/identity-storage.js +1 -1
  125. package/server/lib/git/issue-2746-longpaths.test.js +4 -4
  126. package/server/lib/git/routes.js +41 -5
  127. package/server/lib/git/service.js +300 -224
  128. package/server/lib/git/service.test.js +596 -28
  129. package/server/lib/github/auth.js +8 -8
  130. package/server/lib/github/pr-status.js +1 -1
  131. package/server/lib/github/routes.js +2 -2
  132. package/server/lib/inherited-env.js +17 -10
  133. package/server/lib/inherited-env.test.js +10 -11
  134. package/server/lib/linear/auth.js +8 -8
  135. package/server/lib/linear/auth.test.js +24 -24
  136. package/server/lib/linear/issues.test.js +6 -6
  137. package/server/lib/linear/mapping.test.js +4 -4
  138. package/server/lib/linear/oauth.js +2 -2
  139. package/server/lib/linear/oauth.test.js +14 -14
  140. package/server/lib/linear/routes.js +5 -5
  141. package/server/lib/linear/routes.test.js +16 -16
  142. package/server/lib/linear/status-runtime.test.js +9 -9
  143. package/server/lib/linear/status.js +1 -1
  144. package/server/lib/linear/status.test.js +15 -15
  145. package/server/lib/linear/teams.test.js +4 -4
  146. package/server/lib/magic-prompts/routes.js +2 -2
  147. package/server/lib/mcp-reconnect/DOCUMENTATION.md +55 -0
  148. package/server/lib/mcp-reconnect/runtime.js +122 -0
  149. package/server/lib/mcp-reconnect/runtime.test.js +140 -0
  150. package/server/lib/message-queue/DOCUMENTATION.md +161 -0
  151. package/server/lib/message-queue/runtime.js +870 -0
  152. package/server/lib/message-queue/runtime.test.js +482 -0
  153. package/server/lib/network-defaults.js +23 -0
  154. package/server/lib/network-defaults.test.js +52 -0
  155. package/server/lib/notifications/apns-runtime.js +17 -17
  156. package/server/lib/notifications/apns-runtime.test.js +11 -11
  157. package/server/lib/notifications/emitter-runtime.js +1 -1
  158. package/server/lib/notifications/emitter-runtime.test.js +1 -1
  159. package/server/lib/notifications/push-runtime.js +7 -7
  160. package/server/lib/notifications/routes.js +1 -1
  161. package/server/lib/notifications/runtime.js +1 -1
  162. package/server/lib/openchamber-control/action-resolution.test.js +10 -10
  163. package/server/lib/openchamber-control/actions.js +24 -24
  164. package/server/lib/openchamber-control/error.js +4 -4
  165. package/server/lib/openchamber-control/routes.js +2 -2
  166. package/server/lib/openchamber-control/routes.test.js +5 -5
  167. package/server/lib/openchamber-control/screenshots.js +1 -1
  168. package/server/lib/openchamber-control/screenshots.test.js +1 -1
  169. package/server/lib/openchamber-control/service.js +50 -50
  170. package/server/lib/openchamber-control/service.test.js +5 -5
  171. package/server/lib/openchamber-sessions/routes.js +124 -22
  172. package/server/lib/openchamber-sessions/routes.test.js +99 -11
  173. package/server/lib/opencode/DOCUMENTATION.md +30 -6
  174. package/server/lib/opencode/auth.js +1 -1
  175. package/server/lib/opencode/bootstrap-runtime.js +8 -6
  176. package/server/lib/opencode/cli-options.js +8 -8
  177. package/server/lib/opencode/config-paths.test.js +116 -0
  178. package/server/lib/opencode/core-routes.js +8 -7
  179. package/server/lib/opencode/core-routes.test.js +11 -11
  180. package/server/lib/opencode/env-config.js +5 -5
  181. package/server/lib/opencode/env-config.test.js +7 -7
  182. package/server/lib/opencode/env-runtime.js +10 -10
  183. package/server/lib/opencode/env-runtime.test.js +18 -18
  184. package/server/lib/opencode/feature-routes-runtime.js +19 -12
  185. package/server/lib/opencode/hmr-state-runtime.js +2 -2
  186. package/server/lib/opencode/hmr-state-runtime.test.js +1 -1
  187. package/server/lib/opencode/input-history-scope.js +14 -0
  188. package/server/lib/opencode/lifecycle.js +8 -8
  189. package/server/lib/opencode/lifecycle.test.js +4 -4
  190. package/server/lib/opencode/managed-plugin-config.js +35 -0
  191. package/server/lib/opencode/managed-process-registry.js +3 -3
  192. package/server/lib/opencode/mcp-oauth-callback.test.js +2 -2
  193. package/server/lib/opencode/openchamber-routes.js +79 -19
  194. package/server/lib/opencode/openchamber-routes.test.js +139 -12
  195. package/server/lib/opencode/plugins.js +2 -2
  196. package/server/lib/opencode/plugins.test.js +1 -1
  197. package/server/lib/opencode/project-icon-routes.js +2 -2
  198. package/server/lib/opencode/project-icon-routes.test.js +1 -1
  199. package/server/lib/opencode/providers.js +44 -2
  200. package/server/lib/opencode/providers.test.js +131 -4
  201. package/server/lib/opencode/proxy.js +2 -2
  202. package/server/lib/opencode/pwa-manifest-routes.js +1 -1
  203. package/server/lib/opencode/restart-session-recovery.test.js +1 -1
  204. package/server/lib/opencode/routes-upgrade.test.js +4 -4
  205. package/server/lib/opencode/routes.js +19 -17
  206. package/server/lib/opencode/server-startup-runtime.js +6 -6
  207. package/server/lib/opencode/session-runtime.js +3 -3
  208. package/server/lib/opencode/session-runtime.test.js +6 -6
  209. package/server/lib/opencode/settings-files.js +214 -0
  210. package/server/lib/opencode/settings-helpers.js +116 -44
  211. package/server/lib/opencode/settings-helpers.test.js +354 -12
  212. package/server/lib/opencode/settings-registry.json +747 -0
  213. package/server/lib/opencode/settings-runtime.js +141 -20
  214. package/server/lib/opencode/settings-runtime.test.js +191 -4
  215. package/server/lib/opencode/shared.js +5 -2
  216. package/server/lib/opencode/shared.test.js +7 -7
  217. package/server/lib/opencode/shutdown-runtime.js +2 -0
  218. package/server/lib/opencode/skill-routes.js +2 -1
  219. package/server/lib/opencode/snippets.js +1 -2
  220. package/server/lib/opencode/startup-performance.js +1 -1
  221. package/server/lib/opencode/startup-performance.test.js +6 -6
  222. package/server/lib/opencode/static-routes-runtime.js +8 -8
  223. package/server/lib/opencode/static-routes-runtime.test.js +7 -7
  224. package/server/lib/opencode/upgrade-capability.js +2 -2
  225. package/server/lib/opencode/upgrade-capability.test.js +3 -3
  226. package/server/lib/package-manager.js +17 -42
  227. package/server/lib/package-manager.test.js +19 -19
  228. package/server/lib/permission-auto-accept/runtime.js +1 -1
  229. package/server/lib/project-context/DOCUMENTATION.md +25 -1
  230. package/server/lib/project-context/routes.http.test.js +18 -0
  231. package/server/lib/project-context/routes.js +16 -1
  232. package/server/lib/project-context/runtime.js +248 -23
  233. package/server/lib/project-context/runtime.test.js +106 -3
  234. package/server/lib/projects/DOCUMENTATION.md +76 -0
  235. package/server/lib/projects/project-config.js +144 -11
  236. package/server/lib/projects/project-id.js +17 -0
  237. package/server/lib/projects/project-setup.js +409 -0
  238. package/server/lib/projects/project-setup.test.js +557 -0
  239. package/server/lib/projects/routes.js +59 -0
  240. package/server/lib/quota/DOCUMENTATION.md +40 -2
  241. package/server/lib/quota/credentials/providers.js +4 -0
  242. package/server/lib/quota/credentials/store.js +4 -4
  243. package/server/lib/quota/credentials/store.test.js +8 -8
  244. package/server/lib/quota/index.js +1 -0
  245. package/server/lib/quota/providers/cline-pass.js +125 -0
  246. package/server/lib/quota/providers/cline-pass.test.js +103 -0
  247. package/server/lib/quota/providers/exe-dev.js +75 -0
  248. package/server/lib/quota/providers/exe-dev.test.js +47 -0
  249. package/server/lib/quota/providers/hyper.js +118 -0
  250. package/server/lib/quota/providers/hyper.test.js +126 -0
  251. package/server/lib/quota/providers/index.js +22 -0
  252. package/server/lib/quota/providers/neuralwatt.js +3 -6
  253. package/server/lib/quota/providers/neuralwatt.test.js +7 -7
  254. package/server/lib/quota/providers/ollama-cloud.js +32 -1
  255. package/server/lib/quota/providers/ollama-cloud.test.js +33 -1
  256. package/server/lib/quota/providers/opencode-go.js +3 -2
  257. package/server/lib/quota/providers/opencode-go.test.js +35 -6
  258. package/server/lib/quota/providers/openrouter.js +119 -24
  259. package/server/lib/quota/providers/openrouter.test.js +330 -0
  260. package/server/lib/quota/providers/xai.js +1 -1
  261. package/server/lib/quota/routes.js +2 -0
  262. package/server/lib/quota/utils/auth.js +1 -1
  263. package/server/lib/relay/DOCUMENTATION.md +56 -1
  264. package/server/lib/relay/cross-compat.test.js +26 -0
  265. package/server/lib/relay/downstream-scheduler.js +154 -0
  266. package/server/lib/relay/downstream-scheduler.test.js +162 -0
  267. package/server/lib/relay/e2ee.js +10 -8
  268. package/server/lib/relay/flow-control.test.js +177 -0
  269. package/server/lib/relay/host-client.js +38 -9
  270. package/server/lib/relay/host-client.test.js +9 -1
  271. package/server/lib/relay/host-lock.js +1 -1
  272. package/server/lib/relay/service.js +5 -5
  273. package/server/lib/relay/tunnel-codec.js +9 -0
  274. package/server/lib/relay/tunnel-host.js +69 -18
  275. package/server/lib/relay/tunnel-host.test.js +9 -1
  276. package/server/lib/scheduled-tasks/issue-2710-double-execution.test.js +2 -2
  277. package/server/lib/scheduled-tasks/routes.js +5 -5
  278. package/server/lib/scheduled-tasks/service.js +25 -25
  279. package/server/lib/scheduled-tasks/service.test.js +1 -1
  280. package/server/lib/security/bind-host.js +4 -4
  281. package/server/lib/security/bind-host.test.js +1 -1
  282. package/server/lib/security/request-security.js +11 -5
  283. package/server/lib/security/request-security.test.js +14 -14
  284. package/server/lib/session-assist/runtime.js +15 -18
  285. package/server/lib/session-folders/routes.js +2 -2
  286. package/server/lib/session-folders/routes.test.js +8 -8
  287. package/server/lib/session-goal/DOCUMENTATION.md +20 -7
  288. package/server/lib/session-goal/create.js +4 -2
  289. package/server/lib/session-goal/create.test.js +1 -1
  290. package/server/lib/session-goal/objectives.js +4 -4
  291. package/server/lib/session-goal/routes.js +1 -1
  292. package/server/lib/session-goal/runtime.js +91 -30
  293. package/server/lib/session-goal/runtime.test.js +428 -2
  294. package/server/lib/session-knowledge/runtime.js +11 -11
  295. package/server/lib/session-knowledge/runtime.test.js +5 -5
  296. package/server/lib/skills-catalog/DOCUMENTATION.md +1 -1
  297. package/server/lib/skills-catalog/cache.test.js +2 -2
  298. package/server/lib/skills-catalog/disk-cache.js +5 -5
  299. package/server/lib/skills-catalog/github-meta.test.js +2 -2
  300. package/server/lib/skills-catalog/install.js +3 -2
  301. package/server/lib/small-model/DOCUMENTATION.md +7 -2
  302. package/server/lib/small-model/call.js +18 -7
  303. package/server/lib/small-model/call.test.js +58 -6
  304. package/server/lib/small-model/index.js +12 -16
  305. package/server/lib/small-model/index.test.js +1 -1
  306. package/server/lib/small-model/resolve.js +1 -1
  307. package/server/lib/small-model/resolve.test.js +1 -1
  308. package/server/lib/small-model/routes.js +2 -1
  309. package/server/lib/small-model/runtime-providers.js +15 -7
  310. package/server/lib/small-model/runtime-providers.test.js +7 -1
  311. package/server/lib/system-prompt/runtime.js +3 -22
  312. package/server/lib/system-prompt/runtime.test.js +3 -3
  313. package/server/lib/terminal/DOCUMENTATION.md +14 -10
  314. package/server/lib/terminal/runtime.js +190 -31
  315. package/server/lib/terminal/runtime.test.js +572 -38
  316. package/server/lib/terminal/shells.js +20 -3
  317. package/server/lib/terminal/shells.test.js +33 -2
  318. package/server/lib/tts/base-url.js +3 -3
  319. package/server/lib/tts/routes.test.js +20 -20
  320. package/server/lib/ui-auth/ui-auth.js +12 -9
  321. package/server/lib/ui-auth/ui-auth.test.js +19 -3
  322. package/server/lib/ui-auth/ui-passkeys.js +7 -7
  323. package/server/lib/walkthrough/DOCUMENTATION.md +33 -14
  324. package/server/lib/walkthrough/index.js +1 -0
  325. package/server/lib/walkthrough/jobs.test.js +1 -1
  326. package/server/lib/walkthrough/language.test.js +1 -1
  327. package/server/lib/walkthrough/model-settings.js +11 -15
  328. package/server/lib/walkthrough/model-settings.test.js +1 -1
  329. package/server/lib/walkthrough/prompt.js +3 -1
  330. package/server/lib/walkthrough/pull-request.test.js +5 -5
  331. package/server/lib/walkthrough/reproduce-2607.test.js +2 -2
  332. package/server/lib/walkthrough/routes.test.js +26 -5
  333. package/server/lib/walkthrough/sources.js +23 -2
  334. package/server/lib/walkthrough/store.js +3 -3
  335. package/server/lib/walkthrough/store.test.js +1 -1
  336. package/server/opencode-proxy.test.js +2 -2
  337. package/server/proxy-headers.js +1 -1
  338. package/server/sse-routes.test.js +4 -4
  339. package/README.md.bak +0 -250
  340. package/bin/lib/DOCUMENTATION.md.bak +0 -163
  341. package/dist/assets/CommitSection-SGBCAW0w.js +0 -1
  342. package/dist/assets/DiffView-DluiRSla.js +0 -4
  343. package/dist/assets/FilesView-Bdq8ppva.js +0 -17
  344. package/dist/assets/GitView-Znn7VJcP.js +0 -6
  345. package/dist/assets/LinearIssuesView-jP-hXyac.js +0 -1
  346. package/dist/assets/MarkdownImageGallery-ClOvuZxC.js +0 -1
  347. package/dist/assets/MarkdownRendererImpl-Dt9mjTRN.js +0 -12
  348. package/dist/assets/OnboardingScreen-D2DG7K6b.js +0 -1
  349. package/dist/assets/PierreDiffViewer-B7m3f0d7.js +0 -157
  350. package/dist/assets/PlanView-B0F3BtPZ.js +0 -5
  351. package/dist/assets/SettingsView-BBW-S-gh.js +0 -28
  352. package/dist/assets/ToolPartDiffPreview-CUNe28U1.js +0 -8
  353. package/dist/assets/WalkthroughView-egQgxel3.js +0 -4
  354. package/dist/assets/contextPanelEmbeddedChat-C3fjDbdg.js +0 -1
  355. package/dist/assets/de-C1P6X5Rs.js +0 -9
  356. package/dist/assets/es-CDgaF1_t.js +0 -15
  357. package/dist/assets/fr-Bgxqvvz_.js +0 -13
  358. package/dist/assets/index-C57jT0Sa.css +0 -1
  359. package/dist/assets/index-DW_E3rnL.js +0 -7
  360. package/dist/assets/ja-BDRrEcNP.js +0 -15
  361. package/dist/assets/ko-Ba8sQV79.js +0 -15
  362. package/dist/assets/main-Bv5Pkngh.js +0 -928
  363. package/dist/assets/markdownCore-CZwzz5gw.js +0 -3
  364. package/dist/assets/patchFileDiff-yNfWXN4E.js +0 -10
  365. package/dist/assets/pl-Dioz29BI.js +0 -15
  366. package/dist/assets/pt-BR-DIs6ElwV.js +0 -15
  367. package/dist/assets/renderElectronMiniChatApp-BcKLHXKe.js +0 -2
  368. package/dist/assets/renderMobileApp-D9yQJy0L.js +0 -25
  369. package/dist/assets/runtimeEndpointReset-CjhvxLH0.js +0 -16
  370. package/dist/assets/scheduledTasksApi-DLW0mkQK.js +0 -1
  371. package/dist/assets/tr-DFnMlPxY.js +0 -6
  372. package/dist/assets/uk-ZrCNjM7Y.js +0 -15
  373. package/dist/assets/useAppFontEffects-CjrntdL0.js +0 -7310
  374. package/dist/assets/useInlineCommentController-CDEuSlPH.js +0 -2
  375. package/dist/assets/useRootScrollLock-BHYPkrLv.js +0 -1
  376. package/dist/assets/vendor-ghostty-web-CrxinGGH.js +0 -13
  377. package/dist/assets/vendor-zod-BLfBSgBh.js +0 -39
  378. package/dist/assets/zh-CN-iv_AV4EC.js +0 -15
  379. package/dist/assets/zh-TW-CzEUk38j.js +0 -15
  380. package/server/index.d.ts.bak +0 -39
  381. package/server/lib/agent-tool/DOCUMENTATION.md.bak +0 -119
  382. package/server/lib/browser-control/DOCUMENTATION.md.bak +0 -50
  383. package/server/lib/context-obligatory/DOCUMENTATION.md.bak +0 -19
  384. package/server/lib/dev-tunnel/DOCUMENTATION.md.bak +0 -57
  385. package/server/lib/dictation/DOCUMENTATION.md.bak +0 -100
  386. package/server/lib/event-stream/DOCUMENTATION.md.bak +0 -62
  387. package/server/lib/fs/DOCUMENTATION.md.bak +0 -47
  388. package/server/lib/git/DOCUMENTATION.md.bak +0 -193
  389. package/server/lib/github/DOCUMENTATION.md.bak +0 -183
  390. package/server/lib/linear/DOCUMENTATION.md.bak +0 -97
  391. package/server/lib/linear/OAUTH-BROKER-HANDOFF.md.bak +0 -91
  392. package/server/lib/markdown-image-grants/DOCUMENTATION.md.bak +0 -40
  393. package/server/lib/notifications/APNS.md.bak +0 -135
  394. package/server/lib/notifications/DOCUMENTATION.md.bak +0 -138
  395. package/server/lib/openchamber-control/DOCUMENTATION.md.bak +0 -64
  396. package/server/lib/opencode/DOCUMENTATION.md.bak +0 -431
  397. package/server/lib/opencode/managed-process-registry.d.ts.bak +0 -13
  398. package/server/lib/opencode/provider-env-aliases.d.ts.bak +0 -3
  399. package/server/lib/permission-auto-accept/DOCUMENTATION.md.bak +0 -34
  400. package/server/lib/project-context/DOCUMENTATION.md.bak +0 -160
  401. package/server/lib/quota/DOCUMENTATION.md.bak +0 -123
  402. package/server/lib/relay/DOCUMENTATION.md.bak +0 -100
  403. package/server/lib/scheduled-tasks/DOCUMENTATION.md.bak +0 -182
  404. package/server/lib/session-assist/DOCUMENTATION.md.bak +0 -66
  405. package/server/lib/session-goal/DOCUMENTATION.md.bak +0 -213
  406. package/server/lib/session-knowledge/DOCUMENTATION.md.bak +0 -89
  407. package/server/lib/skills-catalog/DOCUMENTATION.md.bak +0 -151
  408. package/server/lib/small-model/DOCUMENTATION.md.bak +0 -212
  409. package/server/lib/system-prompt/DOCUMENTATION.md.bak +0 -36
  410. package/server/lib/terminal/DOCUMENTATION.md.bak +0 -50
  411. package/server/lib/text/DOCUMENTATION.md.bak +0 -35
  412. package/server/lib/tts/DOCUMENTATION.md.bak +0 -147
  413. package/server/lib/tunnels/DOCUMENTATION.md.bak +0 -21
  414. package/server/lib/ui-auth/DOCUMENTATION.md.bak +0 -44
  415. package/server/lib/walkthrough/DOCUMENTATION.md.bak +0 -411
@@ -84,18 +84,18 @@ describe('event stream broadcaster', () => {
84
84
  },
85
85
  });
86
86
 
87
- broadcast({ type: 'openchamber:session-status' }, { eventId: 'evt-1', directory: '/tmp/project' });
87
+ broadcast({ type: 'aiworker:session-status' }, { eventId: 'evt-1', directory: '/tmp/project' });
88
88
 
89
89
  expect(sseEvents).toEqual([
90
90
  {
91
91
  res: sseClient,
92
- payload: { type: 'openchamber:session-status' },
92
+ payload: { type: 'aiworker:session-status' },
93
93
  },
94
94
  ]);
95
95
  expect(wsPayloads).toEqual([
96
96
  {
97
97
  type: 'event',
98
- payload: { type: 'openchamber:session-status' },
98
+ payload: { type: 'aiworker:session-status' },
99
99
  eventId: 'evt-1',
100
100
  directory: '/tmp/project',
101
101
  },
@@ -120,7 +120,7 @@ describe('event stream broadcaster', () => {
120
120
  },
121
121
  });
122
122
 
123
- broadcast({ type: 'openchamber:notification' });
123
+ broadcast({ type: 'aiworker:notification' });
124
124
 
125
125
  expect(wsClients.size).toBe(0);
126
126
  });
@@ -446,18 +446,18 @@ describe('message stream websocket runtime', () => {
446
446
  const socket = new FakeSocket();
447
447
  runtime.wsServer.emit('connection', socket, { url: '/api/global/event/ws' });
448
448
 
449
- await new Promise((resolve) => setTimeout(resolve, 35));
450
-
451
- const readyFrames = socket.sent.filter((frame) => frame.type === 'ready');
452
- const eventFrames = socket.sent.filter((frame) => frame.type === 'event' && frame.payload?.type === 'server.connected');
453
-
454
- expect(readyFrames.length).toBeGreaterThanOrEqual(2);
455
- expect(eventFrames.length).toBeGreaterThanOrEqual(2);
456
- expect(fetchCalls.slice(0, 2)).toEqual([null, 'evt-1']);
457
- expect(triggerHealthCheckCalls).toBe(0);
458
-
459
- socket.close();
460
- await runtime.close();
449
+ try {
450
+ // Wait for the reconnect event itself; a 35ms sleep raced the event
451
+ // loop when the workspace build and test workers ran together.
452
+ await expect.poll(() => socket.sent.filter((frame) => frame.type === 'ready').length).toBeGreaterThanOrEqual(2);
453
+ const eventFrames = socket.sent.filter((frame) => frame.type === 'event' && frame.payload?.type === 'server.connected');
454
+ expect(eventFrames.length).toBeGreaterThanOrEqual(2);
455
+ expect(fetchCalls.slice(0, 2)).toEqual([null, 'evt-1']);
456
+ expect(triggerHealthCheckCalls).toBe(0);
457
+ } finally {
458
+ socket.close();
459
+ await runtime.close();
460
+ }
461
461
  });
462
462
 
463
463
  it('keeps synthetic event processing on forwarded upstream events', async () => {
@@ -475,7 +475,7 @@ describe('message stream websocket runtime', () => {
475
475
  getOpenCodeAuthHeaders: () => ({}),
476
476
  processForwardedEventPayload(payload, emitSynthetic) {
477
477
  if (payload.type === 'session.updated') {
478
- emitSynthetic({ type: 'openchamber:session-status', sessionID: 'ses_1' });
478
+ emitSynthetic({ type: 'aiworker:session-status', sessionID: 'ses_1' });
479
479
  }
480
480
  },
481
481
  wsClients,
@@ -502,7 +502,7 @@ describe('message stream websocket runtime', () => {
502
502
  });
503
503
  expect(socket.sent).toContainEqual({
504
504
  type: 'event',
505
- payload: { type: 'openchamber:session-status', sessionID: 'ses_1' },
505
+ payload: { type: 'aiworker:session-status', sessionID: 'ses_1' },
506
506
  directory: 'global',
507
507
  });
508
508
 
@@ -14,6 +14,8 @@ Own filesystem API behavior for the web server runtime, including workspace-boun
14
14
  - `POST /api/fs/mkdir`
15
15
  - `GET /api/fs/read`
16
16
  - `GET /api/fs/raw`
17
+ - `GET /api/fs/stat`
18
+ - `GET /api/fs/directory-stat`
17
19
  - `GET /api/fs/serve/:path(*)`
18
20
  - `POST /api/fs/write`
19
21
  - `POST /api/fs/upload`
@@ -40,7 +42,10 @@ Own filesystem API behavior for the web server runtime, including workspace-boun
40
42
 
41
43
  ## Notes for contributors
42
44
  - Keep filesystem policy (workspace root checks, error mapping, exec timeout behavior) inside this module, not in the composition root.
45
+ - Workspace checks accept, besides the active workspace and its worktrees, the **managed roots**: the AiWorker config root and the managed chats root (`managedChatsRoot` dependency; `AIWORKER_CHATS_DIR` upstream, default `<config root>/chats`). Chat worktrees may legitimately live outside every project workspace.
46
+ - `GET /api/fs/home` answers `{ home, chatsRoot }`. `chatsRoot` is the server-resolved managed chats root; clients must use it instead of joining `home` + the well-known segment (a relocated root does not contain that segment).
43
47
  - Filesystem `EPERM`/`EACCES` failures use the stable `reason: "os-permission"` response marker. Policy denials such as workspace-boundary or missing-grant failures must not use that marker because a native folder picker cannot remediate them.
48
+ - `GET /api/fs/directory-stat?path=...` uses one `stat` without listing contents or resolving project topology. It follows the same authenticated directory-discovery path policy as `/api/fs/list`, including targets outside the active workspace. A directory returns `{ isDirectory: true }`; `ENOENT` returns `not-found`, and a file or `ENOTDIR` returns `not-directory`. Permission and other failures remain distinct from a missing path. VS Code explicitly returns 501, so the shared client treats its probe as unknown.
44
49
  - Read-only routes authorize the requested path against the workspace before resolving symlinks. A symlink reached through the workspace may therefore target a file outside it, while a directly requested outside path still requires an exact-path grant. Write routes keep canonical-target boundary checks.
45
50
  - If adding new `/api/fs/*` endpoints, add them in `routes.js` and extend this document.
46
51
  - `GET /api/fs/list` may resolve symlinks with `realpath` to read directory contents, but the response `path` and each entry `path` must stay in the caller's requested path space (`path.join(requestedPath, name)`). Returning real paths breaks file-tree expansion for directories reached through workspace symlinks.
@@ -87,7 +87,7 @@ const resolveOutsideFileGrant = async ({ token, targetPath, scope, fsPromises })
87
87
  };
88
88
 
89
89
  const createCommandTimeoutMs = () => {
90
- const raw = Number(process.env.OPENCHAMBER_FS_EXEC_TIMEOUT_MS);
90
+ const raw = Number(process.env.AIWORKER_FS_EXEC_TIMEOUT_MS);
91
91
  if (Number.isFinite(raw) && raw > 0) return raw;
92
92
  return 5 * 60 * 1000;
93
93
  };
@@ -97,19 +97,19 @@ const createCommandTimeoutMs = () => {
97
97
  // absorbs the burst of identical lookups a fresh client (e.g. right after a
98
98
  // page reload) fires for every project. Set to 0 to disable caching.
99
99
  const createGitReadCacheTtlMs = () => {
100
- const raw = Number(process.env.OPENCHAMBER_GIT_READ_CACHE_TTL_MS);
100
+ const raw = Number(process.env.AIWORKER_GIT_READ_CACHE_TTL_MS);
101
101
  if (Number.isFinite(raw) && raw >= 0) return raw;
102
102
  return 30 * 1000;
103
103
  };
104
104
 
105
105
  const createGitCheckIgnoreTimeoutMs = () => {
106
- const raw = Number(process.env.OPENCHAMBER_GIT_CHECK_IGNORE_TIMEOUT_MS);
106
+ const raw = Number(process.env.AIWORKER_GIT_CHECK_IGNORE_TIMEOUT_MS);
107
107
  if (Number.isFinite(raw) && raw >= 0) return raw;
108
108
  return 2500;
109
109
  };
110
110
 
111
111
  const createUploadMaxBytes = () => {
112
- const raw = Number(process.env.OPENCHAMBER_FS_UPLOAD_MAX_BYTES);
112
+ const raw = Number(process.env.AIWORKER_FS_UPLOAD_MAX_BYTES);
113
113
  if (Number.isFinite(raw) && raw > 0) return Math.floor(raw);
114
114
  return 100 * 1024 * 1024;
115
115
  };
@@ -196,7 +196,7 @@ const isPathWithinRoot = (resolvedPath, rootPath, path, os) => {
196
196
  return true;
197
197
  };
198
198
 
199
- const resolveWorkspacePath = ({ targetPath, baseDirectory, path, os, normalizeDirectoryPath, openchamberUserConfigRoot }) => {
199
+ const resolveWorkspacePath = ({ targetPath, baseDirectory, path, os, normalizeDirectoryPath, managedRoots }) => {
200
200
  const normalized = normalizeDirectoryPath(targetPath);
201
201
  if (!normalized || typeof normalized !== 'string') {
202
202
  return { ok: false, error: 'Path is required' };
@@ -209,8 +209,12 @@ const resolveWorkspacePath = ({ targetPath, baseDirectory, path, os, normalizeDi
209
209
  return { ok: true, base: resolvedBase, resolved };
210
210
  }
211
211
 
212
- if (isPathWithinRoot(resolved, openchamberUserConfigRoot, path, os)) {
213
- return { ok: true, base: path.resolve(openchamberUserConfigRoot), resolved };
212
+ // Managed roots (config root, relocated chats root) stay valid targets
213
+ // even outside the active workspace.
214
+ for (const root of managedRoots) {
215
+ if (isPathWithinRoot(resolved, root, path, os)) {
216
+ return { ok: true, base: path.resolve(root), resolved };
217
+ }
214
218
  }
215
219
 
216
220
  return { ok: false, error: 'Path is outside of active workspace' };
@@ -249,7 +253,7 @@ const resolveWorkspacePathFromWorktrees = async ({ targetPath, baseDirectory, pa
249
253
  return { ok: false, error: 'Path is outside of active workspace' };
250
254
  };
251
255
 
252
- const resolveWorkspacePathFromContext = async ({ req, targetPath, resolveProjectDirectory, path, os, normalizeDirectoryPath, openchamberUserConfigRoot }) => {
256
+ const resolveWorkspacePathFromContext = async ({ req, targetPath, resolveProjectDirectory, path, os, normalizeDirectoryPath, managedRoots }) => {
253
257
  const resolvedProject = await resolveProjectDirectory(req);
254
258
  if (!resolvedProject.directory) {
255
259
  return { ok: false, error: resolvedProject.error || 'Active workspace is required' };
@@ -261,7 +265,7 @@ const resolveWorkspacePathFromContext = async ({ req, targetPath, resolveProject
261
265
  path,
262
266
  os,
263
267
  normalizeDirectoryPath,
264
- openchamberUserConfigRoot,
268
+ managedRoots,
265
269
  });
266
270
  if (resolved.ok || resolved.error !== 'Path is outside of active workspace') {
267
271
  return resolved;
@@ -281,7 +285,7 @@ const resolveWorkspacePathFromContext = async ({ req, targetPath, resolveProject
281
285
  path,
282
286
  os,
283
287
  normalizeDirectoryPath,
284
- openchamberUserConfigRoot,
288
+ managedRoots,
285
289
  });
286
290
  if (lexical.ok) {
287
291
  return lexical;
@@ -412,7 +416,7 @@ const escapeCloneSshKeyPath = (sshKeyPath) => {
412
416
  return `'${normalized.replace(/'/g, "'\\''")}'`;
413
417
  };
414
418
 
415
- const resolveReadPathFromContext = async ({ req, targetPath, scope, resolveProjectDirectory, path, os, fsPromises, normalizeDirectoryPath, openchamberUserConfigRoot }) => {
419
+ const resolveReadPathFromContext = async ({ req, targetPath, scope, resolveProjectDirectory, path, os, fsPromises, normalizeDirectoryPath, managedRoots }) => {
416
420
  if (req.query?.allowOutsideWorkspace === 'true') {
417
421
  const normalized = normalizeDirectoryPath(targetPath);
418
422
  if (!normalized || typeof normalized !== 'string') {
@@ -434,7 +438,7 @@ const resolveReadPathFromContext = async ({ req, targetPath, scope, resolveProje
434
438
  path,
435
439
  os,
436
440
  normalizeDirectoryPath,
437
- openchamberUserConfigRoot,
441
+ managedRoots,
438
442
  });
439
443
  };
440
444
 
@@ -519,8 +523,15 @@ export const registerFsRoutes = (app, dependencies) => {
519
523
  resolveProjectDirectory,
520
524
  buildAugmentedPath,
521
525
  resolveGitBinaryForSpawn,
522
- openchamberUserConfigRoot,
526
+ aiworkerUserConfigRoot,
527
+ managedChatsRoot,
523
528
  } = dependencies;
529
+ // Chat worktrees may live outside every project workspace; both managed
530
+ // roots stay valid filesystem targets.
531
+ const chatsRoot = typeof managedChatsRoot === 'string' && managedChatsRoot.trim()
532
+ ? path.resolve(managedChatsRoot.trim())
533
+ : path.join(aiworkerUserConfigRoot, 'chats');
534
+ const managedRoots = [path.resolve(aiworkerUserConfigRoot), chatsRoot];
524
535
  const realpathCache = createRealpathCache({
525
536
  realpath: fsPromises.realpath.bind(fsPromises),
526
537
  });
@@ -699,7 +710,7 @@ export const registerFsRoutes = (app, dependencies) => {
699
710
  if (!home || typeof home !== 'string' || home.length === 0) {
700
711
  return res.status(500).json({ error: 'Failed to resolve home directory' });
701
712
  }
702
- return res.json({ home });
713
+ return res.json({ home, chatsRoot });
703
714
  } catch (error) {
704
715
  console.error('Failed to resolve home directory:', error);
705
716
  return res.status(500).json({ error: (error && error.message) || 'Failed to resolve home directory' });
@@ -725,7 +736,7 @@ export const registerFsRoutes = (app, dependencies) => {
725
736
  path,
726
737
  os,
727
738
  normalizeDirectoryPath,
728
- openchamberUserConfigRoot,
739
+ managedRoots,
729
740
  });
730
741
  if (!resolved.ok) {
731
742
  return res.status(400).json({ error: resolved.error });
@@ -853,6 +864,37 @@ export const registerFsRoutes = (app, dependencies) => {
853
864
  }
854
865
  });
855
866
 
867
+ app.get('/api/fs/directory-stat', async (req, res) => {
868
+ res.setHeader('Cache-Control', 'no-store');
869
+ const paths = new URL(req.url, 'http://openchamber.local').searchParams.getAll('path');
870
+ const directoryPath = paths.length === 1 ? paths[0].trim() : '';
871
+ if (!directoryPath) {
872
+ return res.status(400).json({ error: 'Path is required' });
873
+ }
874
+
875
+ try {
876
+ // Directory discovery uses the same path policy as /api/fs/list, including
877
+ // paths outside the current workspace. stat follows symlinks without readdir.
878
+ const resolvedPath = path.resolve(normalizeDirectoryPath(directoryPath));
879
+ const stats = await fsPromises.stat(resolvedPath);
880
+ if (!stats.isDirectory()) {
881
+ return res.status(400).json({ error: 'Specified path is not a directory', reason: 'not-directory' });
882
+ }
883
+ return res.json({ isDirectory: true });
884
+ } catch (error) {
885
+ if (error.code === 'ENOENT' || error.code === 'ENOTDIR') {
886
+ return res.status(error.code === 'ENOENT' ? 404 : 400).json({
887
+ error: error.code === 'ENOENT' ? 'Directory not found' : 'Specified path is not a directory',
888
+ reason: error.code === 'ENOENT' ? 'not-found' : 'not-directory',
889
+ });
890
+ }
891
+ if (isOsPermissionError(error)) {
892
+ return sendOsPermissionDenied(res, 'Access to directory denied');
893
+ }
894
+ return res.status(500).json({ error: 'Failed to stat directory' });
895
+ }
896
+ });
897
+
856
898
  app.get('/api/fs/stat', async (req, res) => {
857
899
  const filePath = typeof req.query.path === 'string' ? req.query.path.trim() : '';
858
900
  const optional = req.query.optional === 'true';
@@ -870,7 +912,7 @@ export const registerFsRoutes = (app, dependencies) => {
870
912
  os,
871
913
  fsPromises,
872
914
  normalizeDirectoryPath,
873
- openchamberUserConfigRoot,
915
+ managedRoots,
874
916
  });
875
917
  if (!resolved.ok) {
876
918
  if (req.query?.allowOutsideWorkspace === 'true') {
@@ -920,7 +962,7 @@ export const registerFsRoutes = (app, dependencies) => {
920
962
  os,
921
963
  fsPromises,
922
964
  normalizeDirectoryPath,
923
- openchamberUserConfigRoot,
965
+ managedRoots,
924
966
  });
925
967
  if (!resolved.ok) {
926
968
  if (req.query?.allowOutsideWorkspace === 'true') {
@@ -984,7 +1026,7 @@ export const registerFsRoutes = (app, dependencies) => {
984
1026
  os,
985
1027
  fsPromises,
986
1028
  normalizeDirectoryPath,
987
- openchamberUserConfigRoot,
1029
+ managedRoots,
988
1030
  });
989
1031
  if (!resolved.ok) {
990
1032
  if (req.query?.allowOutsideWorkspace === 'true') {
@@ -1065,7 +1107,7 @@ export const registerFsRoutes = (app, dependencies) => {
1065
1107
  path,
1066
1108
  os,
1067
1109
  normalizeDirectoryPath,
1068
- openchamberUserConfigRoot,
1110
+ managedRoots,
1069
1111
  });
1070
1112
  if (!resolved.ok) {
1071
1113
  return res.status(400).json({ error: resolved.error });
@@ -1117,7 +1159,7 @@ export const registerFsRoutes = (app, dependencies) => {
1117
1159
  path,
1118
1160
  os,
1119
1161
  normalizeDirectoryPath,
1120
- openchamberUserConfigRoot,
1162
+ managedRoots,
1121
1163
  });
1122
1164
  if (!resolved.ok) {
1123
1165
  return res.status(400).json({ error: resolved.error });
@@ -1187,7 +1229,7 @@ export const registerFsRoutes = (app, dependencies) => {
1187
1229
  path,
1188
1230
  os,
1189
1231
  normalizeDirectoryPath,
1190
- openchamberUserConfigRoot,
1232
+ managedRoots,
1191
1233
  });
1192
1234
  if (!resolved.ok) {
1193
1235
  return res.status(400).json({ error: resolved.error });
@@ -1294,7 +1336,7 @@ export const registerFsRoutes = (app, dependencies) => {
1294
1336
  path,
1295
1337
  os,
1296
1338
  normalizeDirectoryPath,
1297
- openchamberUserConfigRoot,
1339
+ managedRoots,
1298
1340
  });
1299
1341
  if (!resolved.ok) {
1300
1342
  return res.status(400).json({ error: resolved.error });
@@ -1332,7 +1374,7 @@ export const registerFsRoutes = (app, dependencies) => {
1332
1374
  path,
1333
1375
  os,
1334
1376
  normalizeDirectoryPath,
1335
- openchamberUserConfigRoot,
1377
+ managedRoots,
1336
1378
  });
1337
1379
  if (!resolvedOld.ok) {
1338
1380
  return res.status(400).json({ error: resolvedOld.error });
@@ -1345,7 +1387,7 @@ export const registerFsRoutes = (app, dependencies) => {
1345
1387
  path,
1346
1388
  os,
1347
1389
  normalizeDirectoryPath,
1348
- openchamberUserConfigRoot,
1390
+ managedRoots,
1349
1391
  });
1350
1392
  if (!resolvedNew.ok) {
1351
1393
  return res.status(400).json({ error: resolvedNew.error });
@@ -1451,7 +1493,7 @@ export const registerFsRoutes = (app, dependencies) => {
1451
1493
  path,
1452
1494
  os,
1453
1495
  normalizeDirectoryPath,
1454
- openchamberUserConfigRoot,
1496
+ managedRoots,
1455
1497
  });
1456
1498
  if (!resolvedForWorkspace.ok) {
1457
1499
  console.warn(`Rejected /api/fs/exec outside workspace: ${resolvedForWorkspace.error}`);
@@ -1689,7 +1731,7 @@ export const registerFsRoutes = (app, dependencies) => {
1689
1731
  path,
1690
1732
  os,
1691
1733
  normalizeDirectoryPath,
1692
- openchamberUserConfigRoot,
1734
+ managedRoots,
1693
1735
  });
1694
1736
  if (!resolved.ok) {
1695
1737
  return res.status(400).json({ error: resolved.error });