@xopcai/xopc 0.0.81 → 0.0.83

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 (709) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +2 -3
  5. package/dist/extensions/feishu/src/outbound/media-load.js.map +1 -1
  6. package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
  7. package/dist/extensions/telegram/src/config-schema.d.ts +6 -6
  8. package/dist/extensions/telegram/src/plugin.d.ts +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  11. package/dist/extensions/telegram/xopc.extension.json +1 -1
  12. package/dist/extensions/weixin/src/api/api.js +3 -3
  13. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  14. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  15. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  16. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  18. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  19. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  20. package/dist/extensions/weixin/src/plugin.js +1 -1
  21. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  22. package/dist/gateway/static/root/assets/agents-CrpYTHJS.js +222 -0
  23. package/dist/gateway/static/root/assets/{apps-page-Ci17oA_o.js → apps-page-1mcKh5Rh.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-zd6QNKPx.js +1 -0
  25. package/dist/gateway/static/root/assets/{channels-status-swr-CUU3faST.js → channels-status-swr-uRAuhiUo.js} +1 -1
  26. package/dist/gateway/static/root/assets/{cron-api-BVQ2n75R.js → cron-api-O2Q_ruV6.js} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-page-x582Y6D5.js → cron-page-By09AQD-.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dist-XT96cQdR.js → dist-BpQxde0t.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-debug-page-Czzfrtt5.js → extension-debug-page-CY27wj_p.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-B_c5UIqX.js → extension-page-C-Ed5ZmP.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-Ckvjgw0_.js → extension-settings-page-raLux7E7.js} +1 -1
  32. package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
  33. package/dist/gateway/static/root/assets/{field-primitives-DQpT8iVa.js → field-primitives-fa_hiQcX.js} +1 -1
  34. package/dist/gateway/static/root/assets/{heartbeat-config-api-DKqOuQ0V.js → heartbeat-config-api-BVl5VHvL.js} +1 -1
  35. package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
  36. package/dist/gateway/static/root/assets/{index-Bq3Lg4bG.js → index-Y-iqo-gL.js} +95 -86
  37. package/dist/gateway/static/root/assets/{logs-page-B3CwJNBq.js → logs-page-BdH2n7ZW.js} +1 -1
  38. package/dist/gateway/static/root/assets/sessions-page-Vpchzdp-.js +1 -0
  39. package/dist/gateway/static/root/assets/{settings-form-section-CjjEpVYM.js → settings-form-section-Kk1yAGBl.js} +1 -1
  40. package/dist/gateway/static/root/assets/settings-page-KBm0u6Dz.js +3 -0
  41. package/dist/gateway/static/root/assets/skills-page-BjeXXaOn.js +2 -0
  42. package/dist/gateway/static/root/assets/{theme-store-DnwYutiX.js → theme-store-D01dJt95.js} +1 -1
  43. package/dist/gateway/static/root/assets/{utils-DQehHvlm.js → utils-DpTxN4AF.js} +1 -1
  44. package/dist/gateway/static/root/assets/voice-api-key-field-CwO8Cf01.js +1 -0
  45. package/dist/gateway/static/root/index.html +4 -4
  46. package/dist/package.js +1 -1
  47. package/dist/src/agent/agent-instance-gateway.d.ts +50 -0
  48. package/dist/src/agent/agent-instance-gateway.js +1 -0
  49. package/dist/src/agent/agent-manager.d.ts +20 -14
  50. package/dist/src/agent/agent-manager.js +74 -186
  51. package/dist/src/agent/agent-manager.js.map +1 -1
  52. package/dist/src/agent/background-review/coordinator.d.ts +61 -0
  53. package/dist/src/agent/background-review/coordinator.js +120 -0
  54. package/dist/src/agent/background-review/coordinator.js.map +1 -0
  55. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  56. package/dist/src/agent/child-agent-factory.d.ts +14 -0
  57. package/dist/src/agent/child-agent-factory.js +2 -8
  58. package/dist/src/agent/child-agent-factory.js.map +1 -1
  59. package/dist/src/agent/context/workspace-seed.js +3 -3
  60. package/dist/src/agent/embedded/index.d.ts +1 -2
  61. package/dist/src/agent/embedded/index.js +2 -3
  62. package/dist/src/agent/embedded/run-for-session.d.ts +2 -2
  63. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  64. package/dist/src/agent/embedded/runs.d.ts +32 -0
  65. package/dist/src/agent/embedded/runs.js +79 -19
  66. package/dist/src/agent/embedded/runs.js.map +1 -1
  67. package/dist/src/agent/embedded/session-manager-cache.d.ts +14 -0
  68. package/dist/src/agent/embedded/session-manager-cache.js +32 -11
  69. package/dist/src/agent/embedded/session-manager-cache.js.map +1 -1
  70. package/dist/src/agent/embedded/session-runner.d.ts +37 -7
  71. package/dist/src/agent/embedded/session-runner.js +184 -153
  72. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  73. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +57 -9
  74. package/dist/src/agent/embedded/session-tool-result-guard.js +159 -67
  75. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  76. package/dist/src/agent/goals/goal-run-store.js +4 -4
  77. package/dist/src/agent/goals/persistent-goal-service.d.ts +84 -0
  78. package/dist/src/agent/goals/persistent-goal-service.js +139 -0
  79. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -0
  80. package/dist/src/agent/goals/post-turn.js +2 -2
  81. package/dist/src/agent/goals/state.d.ts +1 -1
  82. package/dist/src/agent/goals/state.js.map +1 -1
  83. package/dist/src/agent/image/load-image-media.js +1 -1
  84. package/dist/src/agent/inbound/inbound-loop.d.ts +77 -0
  85. package/dist/src/agent/inbound/inbound-loop.js +226 -0
  86. package/dist/src/agent/inbound/inbound-loop.js.map +1 -0
  87. package/dist/src/agent/inbound/turn-dispatcher.d.ts +80 -0
  88. package/dist/src/agent/inbound/turn-dispatcher.js +138 -0
  89. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -0
  90. package/dist/src/agent/ipc/bus.js +1 -1
  91. package/dist/src/agent/ipc/inbox.js +2 -2
  92. package/dist/src/agent/ipc/socket.js +1 -1
  93. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -1
  94. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  95. package/dist/src/agent/lifecycle/manager.d.ts +1 -1
  96. package/dist/src/agent/lifecycle/manager.js.map +1 -1
  97. package/dist/src/agent/lifecycle/types.d.ts +1 -1
  98. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  99. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  100. package/dist/src/agent/memory/dreaming/events.js +1 -1
  101. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  102. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  103. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  104. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  105. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  106. package/dist/src/agent/memory/dreaming/utils.d.ts +12 -2
  107. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  108. package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
  109. package/dist/src/agent/memory/index.js +3 -3
  110. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  111. package/dist/src/agent/memory/prefetch-coordinator.d.ts +37 -0
  112. package/dist/src/agent/memory/prefetch-coordinator.js +45 -0
  113. package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -0
  114. package/dist/src/agent/messaging/command-handler.d.ts +5 -1
  115. package/dist/src/agent/messaging/command-handler.js +24 -96
  116. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  117. package/dist/src/agent/messaging/index.d.ts +1 -0
  118. package/dist/src/agent/messaging/index.js +2 -1
  119. package/dist/src/agent/messaging/message-router.d.ts +1 -1
  120. package/dist/src/agent/messaging/message-router.js.map +1 -1
  121. package/dist/src/agent/messaging/outbound-coordinator.d.ts +82 -0
  122. package/dist/src/agent/messaging/outbound-coordinator.js +123 -0
  123. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -0
  124. package/dist/src/agent/models/manager.js +1 -1
  125. package/dist/src/agent/orchestration/agent-event-handler.d.ts +36 -33
  126. package/dist/src/agent/orchestration/agent-event-handler.js +212 -174
  127. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  128. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +4 -4
  129. package/dist/src/agent/orchestration/agent-orchestrator.js +4 -8
  130. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  131. package/dist/src/agent/orchestration/index.d.ts +1 -1
  132. package/dist/src/agent/orchestration/index.js +2 -2
  133. package/dist/src/agent/prompt/service-prompt-builder.js +4 -4
  134. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  135. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  136. package/dist/src/agent/sandbox/path-policy.js +1 -1
  137. package/dist/src/agent/service/async-queue.d.ts +20 -0
  138. package/dist/src/agent/service/async-queue.js +53 -0
  139. package/dist/src/agent/service/async-queue.js.map +1 -0
  140. package/dist/src/agent/service/build-direct-message-content.d.ts +2 -2
  141. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  142. package/dist/src/agent/service/direct-turn-helpers.d.ts +70 -0
  143. package/dist/src/agent/service/direct-turn-helpers.js +90 -0
  144. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -0
  145. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  146. package/dist/src/agent/service/process-direct-one-shot.js +17 -34
  147. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  148. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  149. package/dist/src/agent/service/process-direct-streaming.js +133 -167
  150. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  151. package/dist/src/agent/service/webchat-tts.d.ts +2 -2
  152. package/dist/src/agent/service/webchat-tts.js +1 -1
  153. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  154. package/dist/src/agent/service.d.ts +62 -167
  155. package/dist/src/agent/service.js +177 -786
  156. package/dist/src/agent/service.js.map +1 -1
  157. package/dist/src/agent/session/index.d.ts +4 -0
  158. package/dist/src/agent/session/index.js +5 -1
  159. package/dist/src/agent/session/session-config-service.d.ts +68 -0
  160. package/dist/src/agent/session/session-config-service.js +172 -0
  161. package/dist/src/agent/session/session-config-service.js.map +1 -0
  162. package/dist/src/agent/session/session-context.d.ts +27 -19
  163. package/dist/src/agent/session/session-context.js +39 -24
  164. package/dist/src/agent/session/session-context.js.map +1 -1
  165. package/dist/src/agent/session/session-hydrator.d.ts +42 -0
  166. package/dist/src/agent/session/session-hydrator.js +66 -0
  167. package/dist/src/agent/session/session-hydrator.js.map +1 -0
  168. package/dist/src/agent/session/session-inspector.d.ts +80 -0
  169. package/dist/src/agent/session/session-inspector.js +119 -0
  170. package/dist/src/agent/session/session-inspector.js.map +1 -0
  171. package/dist/src/agent/session/session-state-bag.d.ts +83 -0
  172. package/dist/src/agent/session/session-state-bag.js +192 -0
  173. package/dist/src/agent/session/session-state-bag.js.map +1 -0
  174. package/dist/src/agent/skills/config.js +1 -1
  175. package/dist/src/agent/skills/hub-hash.js +2 -2
  176. package/dist/src/agent/skills/hub-lock.js +1 -1
  177. package/dist/src/agent/skills/hub-pull.js +2 -2
  178. package/dist/src/agent/skills/index.d.ts +0 -2
  179. package/dist/src/agent/skills/index.js +3 -5
  180. package/dist/src/agent/skills/index.js.map +1 -1
  181. package/dist/src/agent/skills/managed-store.js +1 -1
  182. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
  183. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  184. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
  185. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  186. package/dist/src/agent/skills/scanner.js +1 -1
  187. package/dist/src/agent/skills/skill-manage-ops.js +2 -2
  188. package/dist/src/agent/skills/skill-manager.js +1 -1
  189. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
  190. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
  191. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  192. package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
  193. package/dist/src/agent/tools/delegate-tool.js +2 -1
  194. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  195. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  196. package/dist/src/agent/tools/executor.d.ts +34 -15
  197. package/dist/src/agent/tools/executor.js +44 -79
  198. package/dist/src/agent/tools/executor.js.map +1 -1
  199. package/dist/src/agent/tools/factory.d.ts +6 -0
  200. package/dist/src/agent/tools/factory.js +63 -4
  201. package/dist/src/agent/tools/factory.js.map +1 -1
  202. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  203. package/dist/src/agent/tools/send-media.js +1 -1
  204. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  205. package/dist/src/agent/tools/skills-tools.js +1 -1
  206. package/dist/src/agent/tools/tts-tool.js +1 -1
  207. package/dist/src/agent/tools/write.js +1 -1
  208. package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
  209. package/dist/src/agent/workspace-runtime/registry.js +59 -0
  210. package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
  211. package/dist/src/auth/credentials.js +3 -3
  212. package/dist/src/auth/profiles/store.js +1 -1
  213. package/dist/src/auth/sync-provider-auth.js +1 -1
  214. package/dist/src/browser/cdp-local-launcher.js +4 -3
  215. package/dist/src/browser/cdp-local-launcher.js.map +1 -1
  216. package/dist/src/browser/index.d.ts +1 -0
  217. package/dist/src/browser/index.js +2 -1
  218. package/dist/src/browser/manager.js +3 -2
  219. package/dist/src/browser/manager.js.map +1 -1
  220. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  221. package/dist/src/browser/providers/browser-use.js +2 -1
  222. package/dist/src/browser/providers/browser-use.js.map +1 -1
  223. package/dist/src/browser/providers/browserbase.js +2 -1
  224. package/dist/src/browser/providers/browserbase.js.map +1 -1
  225. package/dist/src/browser/providers/cloakbrowser.js +7 -6
  226. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  227. package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
  228. package/dist/src/browser/providers/playwright-doctor.js +7 -3
  229. package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
  230. package/dist/src/browser/readiness.d.ts +33 -0
  231. package/dist/src/browser/readiness.js +138 -0
  232. package/dist/src/browser/readiness.js.map +1 -0
  233. package/dist/src/browser/stealth.js +2 -2
  234. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  235. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  236. package/dist/src/channels/channel-domain.d.ts +1 -1
  237. package/dist/src/channels/config-helpers.d.ts +1 -1
  238. package/dist/src/channels/config-helpers.js.map +1 -1
  239. package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
  240. package/dist/src/channels/heartbeat-scheduler.js +94 -0
  241. package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
  242. package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
  243. package/dist/src/channels/lifecycle-supervisor.js +263 -0
  244. package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
  245. package/dist/src/channels/manager.d.ts +34 -68
  246. package/dist/src/channels/manager.js +107 -477
  247. package/dist/src/channels/manager.js.map +1 -1
  248. package/dist/src/channels/outbound/deliver.d.ts +1 -1
  249. package/dist/src/channels/outbound/deliver.js.map +1 -1
  250. package/dist/src/channels/outbound/persist-store.js +1 -1
  251. package/dist/src/channels/outbound-sender.d.ts +51 -0
  252. package/dist/src/channels/outbound-sender.js +125 -0
  253. package/dist/src/channels/outbound-sender.js.map +1 -0
  254. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  255. package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
  256. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  257. package/dist/src/channels/pairing/pairing-store.js +2 -2
  258. package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
  259. package/dist/src/channels/pairing/pairing-types.js +1 -0
  260. package/dist/src/channels/plugin-registry.d.ts +22 -0
  261. package/dist/src/channels/plugin-registry.js +44 -0
  262. package/dist/src/channels/plugin-registry.js.map +1 -0
  263. package/dist/src/channels/plugin-types.d.ts +1 -1
  264. package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
  265. package/dist/src/channels/security-helpers.d.ts +1 -1
  266. package/dist/src/channels/security-helpers.js.map +1 -1
  267. package/dist/src/channels/setup-wizard.d.ts +1 -1
  268. package/dist/src/chat-commands/builtins/config.js +2 -2
  269. package/dist/src/chat-commands/context.js +1 -1
  270. package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
  271. package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
  272. package/dist/src/cli/commands/agent.js +4 -4
  273. package/dist/src/cli/commands/agent.js.map +1 -1
  274. package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
  275. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  276. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  277. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  278. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  279. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  280. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  281. package/dist/src/cli/commands/extension-dev.js +2 -2
  282. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  283. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  284. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  285. package/dist/src/cli/commands/extension-pack.js +1 -1
  286. package/dist/src/cli/commands/gateway/call.js +1 -1
  287. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  288. package/dist/src/cli/commands/gateway/health.js +1 -1
  289. package/dist/src/cli/commands/gateway/health.js.map +1 -1
  290. package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
  291. package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
  292. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  293. package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
  294. package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
  295. package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
  296. package/dist/src/cli/commands/gateway/logs.js +1 -1
  297. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  298. package/dist/src/cli/commands/gateway/probe.js +1 -1
  299. package/dist/src/cli/commands/gateway/probe.js.map +1 -1
  300. package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
  301. package/dist/src/cli/commands/gateway/restart-health.js +45 -1
  302. package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
  303. package/dist/src/cli/commands/gateway/restart.js +3 -3
  304. package/dist/src/cli/commands/gateway/restart.js.map +1 -1
  305. package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
  306. package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
  307. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  308. package/dist/src/cli/commands/gateway/service.js +1 -1
  309. package/dist/src/cli/commands/gateway/service.js.map +1 -1
  310. package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
  311. package/dist/src/cli/commands/gateway/shared.js +54 -0
  312. package/dist/src/cli/commands/gateway/shared.js.map +1 -0
  313. package/dist/src/cli/commands/gateway/status.js +1 -1
  314. package/dist/src/cli/commands/gateway/status.js.map +1 -1
  315. package/dist/src/cli/commands/gateway/stop.js +2 -2
  316. package/dist/src/cli/commands/gateway/stop.js.map +1 -1
  317. package/dist/src/cli/commands/gateway/token.js +1 -1
  318. package/dist/src/cli/commands/gateway/token.js.map +1 -1
  319. package/dist/src/cli/commands/gateway.js +5 -5
  320. package/dist/src/cli/commands/gateway.js.map +1 -1
  321. package/dist/src/cli/commands/image.js +2 -2
  322. package/dist/src/cli/commands/image.js.map +1 -1
  323. package/dist/src/cli/commands/init.js +4 -4
  324. package/dist/src/cli/commands/models.js +1 -1
  325. package/dist/src/cli/commands/models.js.map +1 -1
  326. package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
  327. package/dist/src/cli/commands/onboard/gateway.js +48 -49
  328. package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
  329. package/dist/src/cli/commands/onboard.js +9 -64
  330. package/dist/src/cli/commands/onboard.js.map +1 -1
  331. package/dist/src/cli/commands/session/utils.js +1 -1
  332. package/dist/src/cli/commands/session/utils.js.map +1 -1
  333. package/dist/src/cli/commands/skills.js +1 -1
  334. package/dist/src/cli/commands/tailscale.js +1 -1
  335. package/dist/src/cli/commands/tailscale.js.map +1 -1
  336. package/dist/src/cli/context.d.ts +20 -0
  337. package/dist/src/cli/context.js +23 -0
  338. package/dist/src/cli/context.js.map +1 -0
  339. package/dist/src/cli/extension-cli-register.js +3 -3
  340. package/dist/src/cli/gateway-run-argv.js +1 -4
  341. package/dist/src/cli/gateway-run-argv.js.map +1 -1
  342. package/dist/src/cli/gateway-run-fast-path.js +1 -1
  343. package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
  344. package/dist/src/cli/index.d.ts +1 -7
  345. package/dist/src/cli/index.js +4 -6
  346. package/dist/src/cli/index.js.map +1 -1
  347. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  348. package/dist/src/config/commands.flags.d.ts +3 -0
  349. package/dist/src/config/commands.flags.js +11 -0
  350. package/dist/src/config/commands.flags.js.map +1 -0
  351. package/dist/src/config/index.d.ts +1 -0
  352. package/dist/src/config/index.js +6 -5
  353. package/dist/src/config/index.js.map +1 -1
  354. package/dist/src/config/loader.js +2 -2
  355. package/dist/src/config/models-json.js +2 -2
  356. package/dist/src/config/profile.js +2 -2
  357. package/dist/src/config/schema.d.ts +11 -4
  358. package/dist/src/config/schema.js +13 -12
  359. package/dist/src/config/schema.js.map +1 -1
  360. package/dist/src/config/workspace-path-helpers.d.ts +15 -0
  361. package/dist/src/config/workspace-path-helpers.js +14 -0
  362. package/dist/src/config/workspace-path-helpers.js.map +1 -0
  363. package/dist/src/cron/executor.js +4 -4
  364. package/dist/src/cron/executor.js.map +1 -1
  365. package/dist/src/cron/persistence.js +1 -1
  366. package/dist/src/cron/run-log-store.js +1 -1
  367. package/dist/src/daemon/index.d.ts +0 -1
  368. package/dist/src/daemon/index.js +1 -2
  369. package/dist/src/daemon/install-plan.js +3 -2
  370. package/dist/src/daemon/install-plan.js.map +1 -1
  371. package/dist/src/daemon/launchd.js +2 -2
  372. package/dist/src/daemon/systemd.js +2 -2
  373. package/dist/src/daemon/types.d.ts +0 -6
  374. package/dist/src/extensions/api.d.ts +1 -1
  375. package/dist/src/extensions/api.js +2 -2
  376. package/dist/src/extensions/api.js.map +1 -1
  377. package/dist/src/extensions/bundle-mcp.js +1 -1
  378. package/dist/src/extensions/discover-extensions.js +1 -1
  379. package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
  380. package/dist/src/extensions/extension-registry-impl.js +117 -0
  381. package/dist/src/extensions/extension-registry-impl.js.map +1 -0
  382. package/dist/src/extensions/health.js +1 -1
  383. package/dist/src/extensions/index.js +3 -2
  384. package/dist/src/extensions/loader.d.ts +3 -43
  385. package/dist/src/extensions/loader.js +3 -110
  386. package/dist/src/extensions/loader.js.map +1 -1
  387. package/dist/src/extensions/lockfile.js +2 -2
  388. package/dist/src/extensions/sdk/index.js +2 -1
  389. package/dist/src/extensions/sdk/index.js.map +1 -1
  390. package/dist/src/extensions/types/events.d.ts +7 -1
  391. package/dist/src/gateway/agents-admin.js +2 -2
  392. package/dist/src/gateway/file-path-classifier.js +2 -2
  393. package/dist/src/gateway/heartbeat/service.js +2 -2
  394. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  395. package/dist/src/gateway/hono/app.js +40 -37
  396. package/dist/src/gateway/hono/app.js.map +1 -1
  397. package/dist/src/gateway/hono/lib/extension-store.js +1 -1
  398. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  399. package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
  400. package/dist/src/gateway/hono/middleware/auth.js +92 -105
  401. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  402. package/dist/src/gateway/hono/middleware/logger.d.ts +5 -1
  403. package/dist/src/gateway/hono/middleware/logger.js +41 -5
  404. package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
  405. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
  406. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
  407. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
  408. package/dist/src/gateway/hono/oauth.js +1 -1
  409. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
  410. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  411. package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
  412. package/dist/src/gateway/hono/routes/browser.js +626 -0
  413. package/dist/src/gateway/hono/routes/browser.js.map +1 -0
  414. package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
  415. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  416. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
  417. package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
  418. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
  419. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
  420. package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
  421. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
  422. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
  423. package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
  424. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
  425. package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
  426. package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
  427. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
  428. package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
  429. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
  430. package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
  431. package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
  432. package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
  433. package/dist/src/gateway/hono/routes/config.js +20 -1764
  434. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  435. package/dist/src/gateway/hono/routes/dreaming.js +2 -3
  436. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  437. package/dist/src/gateway/hono/routes/exposure.js +2 -1
  438. package/dist/src/gateway/hono/routes/exposure.js.map +1 -1
  439. package/dist/src/gateway/hono/routes/host-fs.js +1 -1
  440. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
  441. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  442. package/dist/src/gateway/hono/routes/mcp.js +1 -2
  443. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  444. package/dist/src/gateway/hono/routes/models.js +1 -1
  445. package/dist/src/gateway/hono/routes/sessions.js +32 -32
  446. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  447. package/dist/src/gateway/hono/routes/shares.js +4 -4
  448. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  449. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  450. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  451. package/dist/src/gateway/hono/routes/workspace.js +6 -7
  452. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  453. package/dist/src/gateway/hono/sse.d.ts +1 -0
  454. package/dist/src/gateway/hono/sse.js +3 -2
  455. package/dist/src/gateway/hono/sse.js.map +1 -1
  456. package/dist/src/gateway/index.d.ts +1 -1
  457. package/dist/src/gateway/index.js +4 -2
  458. package/dist/src/gateway/lock.js +3 -3
  459. package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
  460. package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
  461. package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
  462. package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
  463. package/dist/src/gateway/rate-limit/buckets.js +143 -0
  464. package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
  465. package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
  466. package/dist/src/gateway/rate-limit/env-flags.js +16 -0
  467. package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
  468. package/dist/src/gateway/rate-limit/index.d.ts +3 -0
  469. package/dist/src/gateway/rate-limit/index.js +4 -0
  470. package/dist/src/gateway/run-loop.d.ts +1 -1
  471. package/dist/src/gateway/run-loop.js +24 -4
  472. package/dist/src/gateway/run-loop.js.map +1 -1
  473. package/dist/src/gateway/runtime-config.js +2 -1
  474. package/dist/src/gateway/runtime-config.js.map +1 -1
  475. package/dist/src/gateway/security/audit.js +2 -1
  476. package/dist/src/gateway/security/audit.js.map +1 -1
  477. package/dist/src/gateway/security/index.d.ts +0 -1
  478. package/dist/src/gateway/security/index.js +1 -2
  479. package/dist/src/gateway/security/loopback.d.ts +13 -0
  480. package/dist/src/gateway/security/loopback.js +45 -0
  481. package/dist/src/gateway/security/loopback.js.map +1 -0
  482. package/dist/src/gateway/service/agent-runner.d.ts +108 -0
  483. package/dist/src/gateway/service/agent-runner.js +184 -0
  484. package/dist/src/gateway/service/agent-runner.js.map +1 -0
  485. package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
  486. package/dist/src/gateway/service/config-coordinator.js +351 -0
  487. package/dist/src/gateway/service/config-coordinator.js.map +1 -0
  488. package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
  489. package/dist/src/gateway/service/marketplace-service.js +239 -0
  490. package/dist/src/gateway/service/marketplace-service.js.map +1 -0
  491. package/dist/src/gateway/service/run-gateway-agent.js +5 -5
  492. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  493. package/dist/src/gateway/service/sessions-api.d.ts +125 -0
  494. package/dist/src/gateway/service/sessions-api.js +135 -0
  495. package/dist/src/gateway/service/sessions-api.js.map +1 -0
  496. package/dist/src/gateway/service.d.ts +30 -360
  497. package/dist/src/gateway/service.js +122 -904
  498. package/dist/src/gateway/service.js.map +1 -1
  499. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  500. package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
  501. package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
  502. package/dist/src/heartbeat/index.js +1 -1
  503. package/dist/src/infra/gateway-process-argv.d.ts +4 -0
  504. package/dist/src/infra/gateway-process-argv.js +26 -0
  505. package/dist/src/infra/gateway-process-argv.js.map +1 -0
  506. package/dist/src/infra/gateway-processes.d.ts +5 -0
  507. package/dist/src/infra/gateway-processes.js +65 -0
  508. package/dist/src/infra/gateway-processes.js.map +1 -0
  509. package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
  510. package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
  511. package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
  512. package/dist/src/infra/rate-limit/index.d.ts +5 -0
  513. package/dist/src/infra/rate-limit/index.js +3 -0
  514. package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
  515. package/dist/src/infra/rate-limit/keyed-store.js +44 -0
  516. package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
  517. package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
  518. package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
  519. package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
  520. package/dist/src/infra/restart.d.ts +21 -0
  521. package/dist/src/infra/restart.js +122 -0
  522. package/dist/src/infra/restart.js.map +1 -0
  523. package/dist/src/infra/update-check.js +1 -1
  524. package/dist/src/infra/update-lock.js +3 -3
  525. package/dist/src/infra/update-runner.js +1 -1
  526. package/dist/src/infra/update-startup.js +2 -2
  527. package/dist/src/infra/write-file-atomic.js +2 -2
  528. package/dist/src/mcp/channel-bridge.d.ts +0 -6
  529. package/dist/src/mcp/channel-bridge.js +1 -5
  530. package/dist/src/mcp/channel-bridge.js.map +1 -1
  531. package/dist/src/media-shared/http/ssrf-guard.js +1 -1
  532. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  533. package/dist/src/providers/index.js +2 -2
  534. package/dist/src/providers/model-registry.js +1 -1
  535. package/dist/src/session/config-store.js +2 -2
  536. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  537. package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
  538. package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
  539. package/dist/src/session/parity/sessions-json-file.js +1 -1
  540. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  541. package/dist/src/session/parity/transcript-paths.js +1 -1
  542. package/dist/src/session/search-index-cache.js +1 -1
  543. package/dist/src/session/search-index.js +1 -1
  544. package/dist/src/session/session-title.js +1 -1
  545. package/dist/src/session/store.js +5 -5
  546. package/dist/src/share/share-rate-limit.d.ts +10 -2
  547. package/dist/src/share/share-rate-limit.js +39 -27
  548. package/dist/src/share/share-rate-limit.js.map +1 -1
  549. package/dist/src/share/share-store.js +3 -3
  550. package/dist/src/tui/backends/embedded-backend.js +16 -12
  551. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  552. package/dist/src/tui/clipboard-image.js +2 -2
  553. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  554. package/dist/src/tui/format-tui-hotkeys.js +1 -1
  555. package/dist/src/tui/theme-manager.js +1 -1
  556. package/dist/src/tui/tui-keybindings-file.js +1 -1
  557. package/dist/src/tui/tui-scoped-models.js +1 -1
  558. package/dist/src/tui/tui-settings.js +1 -1
  559. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  560. package/dist/src/tui/tui.js +1 -2
  561. package/dist/src/tui/tui.js.map +1 -1
  562. package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
  563. package/dist/src/tui/xopc-tui-keybindings.js +1 -2
  564. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  565. package/dist/src/tunnel/frpc-binary.js +2 -2
  566. package/dist/src/tunnel/frpc-config.js +1 -1
  567. package/dist/src/tunnel/frpc-extract.js +1 -1
  568. package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
  569. package/dist/src/tunnel/pairing-rate-limit.js +19 -15
  570. package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
  571. package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
  572. package/dist/src/tunnel/tunnel-rate-limit.js +19 -18
  573. package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
  574. package/dist/src/tunnel/tunnel-state.js +1 -1
  575. package/dist/src/utils/logger/audit.js +1 -1
  576. package/dist/src/utils/logger/log-store.js +1 -1
  577. package/dist/src/utils/logger/rotation.js +1 -1
  578. package/dist/src/utils/logger/stats.d.ts +1 -1
  579. package/dist/src/voice/tts/audio.js +1 -1
  580. package/dist/src/voice/tts/factory.js +1 -1
  581. package/dist/src/voice/tts/index.js +2 -2
  582. package/dist/src/voice/tts/merge-config.js +1 -1
  583. package/dist/src/voice/tts/providers/edge-speech.js +1 -1
  584. package/dist/src/voice/tts/service.js +1 -1
  585. package/dist/src/voice/tts/service.js.map +1 -1
  586. package/dist/src/voice/tts/speak-core.js +1 -1
  587. package/package.json +10 -5
  588. package/dist/gateway/static/root/assets/agents-DOONGaKz.js +0 -222
  589. package/dist/gateway/static/root/assets/channels-settings-CARdL-ys.js +0 -1
  590. package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
  591. package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
  592. package/dist/gateway/static/root/assets/sessions-page-BCNnhz9g.js +0 -1
  593. package/dist/gateway/static/root/assets/settings-page-B7_PjiHL.js +0 -3
  594. package/dist/gateway/static/root/assets/skills-page-VrL9TeVF.js +0 -2
  595. package/dist/gateway/static/root/assets/voice-api-key-field-k4FWwgkk.js +0 -1
  596. package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
  597. package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
  598. package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
  599. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
  600. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
  601. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
  602. package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
  603. package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
  604. package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
  605. package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
  606. package/dist/src/daemon/launchd-restart-handoff.js +0 -132
  607. package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
  608. package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
  609. package/dist/src/gateway/auth-rate-limit.js +0 -192
  610. package/dist/src/gateway/auth-rate-limit.js.map +0 -1
  611. package/dist/src/gateway/restart-handler.d.ts +0 -14
  612. package/dist/src/gateway/restart-handler.js +0 -64
  613. package/dist/src/gateway/restart-handler.js.map +0 -1
  614. package/dist/src/gateway/security/flood-guard.d.ts +0 -28
  615. package/dist/src/gateway/security/flood-guard.js +0 -42
  616. package/dist/src/gateway/security/flood-guard.js.map +0 -1
  617. package/dist/src/infra/rate-limit.d.ts +0 -38
  618. package/dist/src/infra/rate-limit.js +0 -60
  619. package/dist/src/infra/rate-limit.js.map +0 -1
  620. package/dist/src/infra/restart-intent.d.ts +0 -13
  621. package/dist/src/infra/restart-intent.js +0 -40
  622. package/dist/src/infra/restart-intent.js.map +0 -1
  623. package/dist/src/infra/restart-sentinel.d.ts +0 -23
  624. package/dist/src/infra/restart-sentinel.js +0 -75
  625. package/dist/src/infra/restart-sentinel.js.map +0 -1
  626. package/skills/creative/canvas-design/LICENSE.txt +0 -202
  627. package/skills/creative/canvas-design/SKILL-zh.md +0 -130
  628. package/skills/creative/canvas-design/SKILL.md +0 -130
  629. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  630. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  631. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  632. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  633. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  634. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  635. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  636. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  637. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  638. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  639. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  640. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  641. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  642. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  643. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  644. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  645. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  646. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  647. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  648. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  649. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  650. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  651. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  652. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  653. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  654. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  655. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  656. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  657. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  658. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  659. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  660. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  661. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  662. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  663. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  664. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  665. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  666. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  667. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  668. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  669. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  670. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  671. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  672. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  673. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  674. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  675. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  676. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  677. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  678. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  679. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  680. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  681. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  682. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  683. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  684. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  685. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  686. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  687. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  688. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  689. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  690. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  691. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  692. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  693. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  694. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  695. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  696. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  697. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  698. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  699. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  700. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  701. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  702. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  703. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  704. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  705. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  706. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  707. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  708. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  709. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":[],"sources":["../../../../../src/gateway/hono/routes/config.ts"],"sourcesContent":["import type { Hono } from 'hono';\nimport net from 'node:net';\n\nimport { type Config, BindingsConfigSchema, McpConfigSchema, type GatewayBindMode } from '../../../config/schema.js';\nimport {\n isValidIPv4,\n} from '../../../config/gateway-bind.js';\nimport { assertGatewayRuntimeConfig } from '../../runtime-config.js';\nimport { resolveGatewayAuth, assertGatewayAuthConfigured } from '../../auth.js';\nimport { canonicalizeConfiguredMcpServer } from '../../../config/mcp-config-normalize.js';\nimport { CredentialResolver } from '../../../auth/credentials.js';\nimport { applyToolsWebPatch } from '../../config-tools-web.js';\nimport { mergeTunnelConfigPatch } from '../../../tunnel/tunnel-config.js';\nimport { mergeShareConfigPatch } from '../../../share/share-config.js';\nimport {\n mergeCronConfigPatch,\n mergeGatewaySkillsMarketplacePatch,\n mergeGoalsConfigPatch,\n mergeSessionConfigPatch,\n mergeUpdateConfigPatch,\n} from '../../../config/web-patch.js';\nimport { buildSafeWebConfigPayload } from '../lib/config-payload.js';\nimport { mergeSttConfigPatch, mergeTtsConfigPatch } from '../lib/safe-voice-config.js';\nimport {\n normalizePatchAgentImageGenerationModel,\n normalizePatchAgentModel,\n} from '../lib/agent-model.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst DEFAULT_EXTENSION_PORT = 19820;\nconst DEFAULT_EXTENSION_HOST = '127.0.0.1';\n\n/**\n * Optional manual hold on the extension WS server kept alive from the UI so\n * users can pair the extension before saving config / running a browser tool.\n * Module-scoped so repeat Start calls are idempotent and the bridge survives\n * config patches.\n */\ntype ManualHandle = { release: () => Promise<void>; host: string; port: number };\nlet manualExtensionHandle: ManualHandle | null = null;\n\nfunction loopbackHostnameFromUrl(input: string): string | null {\n let parsed: URL;\n try {\n parsed = new URL(input);\n } catch {\n return null;\n }\n const proto = parsed.protocol;\n if (proto !== 'ws:' && proto !== 'wss:' && proto !== 'http:' && proto !== 'https:') {\n return null;\n }\n const host = parsed.hostname.toLowerCase();\n if (host === '127.0.0.1' || host === 'localhost' || host === '::1') return host;\n return null;\n}\n\nfunction isLoopbackHost(host: string): boolean {\n const h = host.trim().toLowerCase();\n return h === '127.0.0.1' || h === 'localhost' || h === '::1' || h === '[::1]';\n}\n\nfunction parseExtensionProbePort(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const n = Number.parseInt(raw, 10);\n if (!Number.isFinite(n) || n < 1024 || n > 65_535) return undefined;\n return n;\n}\n\nfunction isLoopbackPortOpen(host: string, port: number, timeoutMs = 500): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = net.connect({ host, port });\n const finish = (open: boolean) => {\n socket.removeAllListeners();\n try {\n socket.destroy();\n } catch {\n /* */\n }\n resolve(open);\n };\n socket.setTimeout(timeoutMs);\n socket.once('connect', () => finish(true));\n socket.once('timeout', () => finish(false));\n socket.once('error', () => finish(false));\n });\n}\n\nasync function readExtensionBridgeSnapshot() {\n const { getExtensionBrowserServerSnapshot } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n return getExtensionBrowserServerSnapshot();\n}\n\nasync function stopExtensionBridgeFromSettings(service: AuthenticatedRouteDeps['service']): Promise<{\n forcedShutdown: boolean;\n}> {\n if (manualExtensionHandle) {\n try {\n await manualExtensionHandle.release();\n } catch {\n /* refcount underflow should not surface */\n }\n manualExtensionHandle = null;\n }\n await service.releaseBrowserExtensionBridge();\n const { forceShutdownExtensionBrowserServer } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const forcedShutdown = await forceShutdownExtensionBrowserServer();\n return { forcedShutdown };\n}\n\nfunction resolveExtensionStatusTarget(\n browser: Record<string, unknown> | undefined,\n query: { probe?: string; host?: string; port?: string },\n): { host: string; port: number; backend: string } | null {\n const backend = typeof browser?.backend === 'string' ? browser.backend : 'extension';\n const probe = query.probe === '1' || query.probe === 'true';\n if (!probe && backend !== 'extension') {\n return null;\n }\n\n const ext = browser?.extension as Record<string, unknown> | undefined;\n const configPort =\n typeof ext?.port === 'number' && ext.port >= 1024 && ext.port <= 65_535\n ? Math.floor(ext.port)\n : DEFAULT_EXTENSION_PORT;\n const configHost =\n typeof ext?.host === 'string' && ext.host.trim() ? ext.host.trim() : DEFAULT_EXTENSION_HOST;\n\n const port = parseExtensionProbePort(query.port) ?? configPort;\n const host =\n typeof query.host === 'string' && query.host.trim() ? query.host.trim() : configHost;\n if (!isLoopbackHost(host)) {\n return null;\n }\n\n return { host, port, backend: probe && backend !== 'extension' ? 'extension' : backend };\n}\n\nexport function registerConfigRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n // Browser extension bridge status — gateway-side check so frontend doesn't cross-origin fetch.\n authenticated.get('/api/browser/extension-status', async (c) => {\n const config: Config = service.currentConfig as Config;\n const browser = config?.agents?.defaults?.browser as Record<string, unknown> | undefined;\n const target = resolveExtensionStatusTarget(browser, {\n probe: c.req.query('probe'),\n host: c.req.query('host'),\n port: c.req.query('port'),\n });\n\n let artifacts: Record<string, unknown> | undefined;\n try {\n const { browserExtDoctor } = await import('../../../browser/providers/browser-ext-install.js');\n const doctor = await browserExtDoctor();\n artifacts = {\n installed: doctor.installed,\n extensionDir: doctor.extensionDir,\n xopcVersion: doctor.xopcVersion,\n installedVersion: doctor.installedVersion,\n needsRefresh: doctor.needsRefresh,\n needsChromeReload: doctor.needsChromeReload,\n };\n } catch {\n /* optional */\n }\n\n if (!target) {\n const backend = typeof browser?.backend === 'string' ? browser.backend : 'extension';\n return c.json({ running: false, connected: false, backend, artifacts });\n }\n const snapshot = await readExtensionBridgeSnapshot();\n let probeRunning = false;\n let probeConnected = false;\n try {\n const res = await fetch(`http://${target.host}:${target.port}/`, { signal: AbortSignal.timeout(2000) });\n const data = (await res.json()) as { ok?: boolean; connected?: boolean };\n probeRunning = Boolean(data.ok);\n probeConnected = Boolean(data.connected);\n } catch {\n /* probe failed — fall through to snapshot / port check */\n }\n const running = probeRunning || snapshot.active;\n const portConflict =\n !running && !snapshot.active\n ? await isLoopbackPortOpen(target.host, target.port)\n : false;\n return c.json({\n running,\n connected: probeConnected,\n backend: target.backend,\n artifacts,\n bridgeHeld: snapshot.active,\n refCount: snapshot.refCount,\n manualBridge: manualExtensionHandle !== null,\n portConflict,\n });\n });\n\n authenticated.get('/api/browser/extension/doctor', async (c) => {\n const cacheDirRaw = c.req.query('cacheDir');\n try {\n const { browserExtDoctor } = await import('../../../browser/providers/browser-ext-install.js');\n const status = await browserExtDoctor({\n cacheDir: cacheDirRaw && cacheDirRaw.trim() ? cacheDirRaw.trim() : undefined,\n });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 400);\n }\n });\n\n authenticated.post('/api/browser/extension/install', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const force = input.force === true;\n\n try {\n const { ensureBrowserExtensionArtifacts, browserExtDoctor } = await import(\n '../../../browser/providers/browser-ext-install.js'\n );\n const result = await ensureBrowserExtensionArtifacts({ cacheDir, force });\n const doctor = await browserExtDoctor({ cacheDir });\n return c.json({ ok: true, payload: { ...result, doctor } });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/open', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const actionRaw = typeof input.action === 'string' ? input.action.trim() : 'both';\n const action =\n actionRaw === 'chrome' || actionRaw === 'folder' || actionRaw === 'both' ? actionRaw : 'both';\n\n try {\n const { openBrowserExtensionInstallUi } = await import(\n '../../../browser/providers/browser-ext-install.js'\n );\n const result = await openBrowserExtensionInstallUi({ action, cacheDir });\n return c.json({ ok: true, payload: result });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Start the extension WS bridge eagerly so the user can pair the extension\n // before saving config / running any tool. Idempotent (returns current state\n // if already running).\n authenticated.post('/api/browser/extension/start', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const port =\n typeof input.port === 'number' && input.port >= 1024 && input.port <= 65535\n ? Math.floor(input.port)\n : DEFAULT_EXTENSION_PORT;\n const hostRaw = typeof input.host === 'string' && input.host.trim() ? input.host.trim() : DEFAULT_EXTENSION_HOST;\n if (!isLoopbackHost(hostRaw)) {\n return c.json({ ok: false, error: 'extension bridge host must be loopback' }, 400);\n }\n\n try {\n if (manualExtensionHandle && (manualExtensionHandle.host !== hostRaw || manualExtensionHandle.port !== port)) {\n await manualExtensionHandle.release();\n manualExtensionHandle = null;\n }\n if (!manualExtensionHandle) {\n const { acquireExtensionBrowserServer } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const { release } = await acquireExtensionBrowserServer({ host: hostRaw, port });\n manualExtensionHandle = { release, host: hostRaw, port };\n }\n return c.json({ ok: true, payload: { running: true, host: hostRaw, port } });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/stop', strictRateLimitMiddleware, async (c) => {\n try {\n const { forcedShutdown } = await stopExtensionBridgeFromSettings(service);\n return c.json({\n ok: true,\n payload: { running: false, forcedShutdown },\n });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n authenticated.post('/api/browser/extension/disconnect', strictRateLimitMiddleware, async (c) => {\n try {\n const { getExtensionBrowserProvider } = await import(\n '../../../browser/providers/extension-ws-acquire.js'\n );\n const provider = getExtensionBrowserProvider();\n if (!provider?.isConnected()) {\n return c.json({\n ok: true,\n payload: { connected: false, alreadyDisconnected: true },\n });\n }\n provider.disconnectClient();\n return c.json({ ok: true, payload: { connected: false } });\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, 500);\n }\n });\n\n // Doctor: does Playwright have a runnable Chromium on disk?\n authenticated.get('/api/browser/playwright/doctor', async (c) => {\n try {\n const { playwrightChromiumDoctor } = await import('../../../browser/providers/playwright-doctor.js');\n const payload = await playwrightChromiumDoctor();\n return c.json({ ok: true, payload });\n } catch (e) {\n return c.json(\n { ok: false, error: e instanceof Error ? e.message : String(e) },\n 500,\n );\n }\n });\n\n // Doctor: CloakBrowser installed?\n authenticated.get('/api/browser/cloakbrowser/doctor', async (c) => {\n const cacheDirRaw = c.req.query('cacheDir');\n const binaryPathRaw = c.req.query('binaryPath');\n try {\n const { cloakBrowserDoctor } = await import('../../../browser/providers/cloakbrowser.js');\n const status = await cloakBrowserDoctor({\n cacheDir: cacheDirRaw && cacheDirRaw.trim() ? cacheDirRaw.trim() : undefined,\n binaryPath: binaryPathRaw && binaryPathRaw.trim() ? binaryPathRaw.trim() : undefined,\n });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 400);\n }\n });\n\n // Runtime status for CloakBrowser (CDP port + profile dir from saved agent defaults).\n authenticated.get('/api/browser/cloakbrowser/status', async (c) => {\n try {\n const { cloakBrowserConfigFromAgentDefaults } = await import('../../../browser/backend-from-config.js');\n const { probeCloakBrowserRuntime } = await import('../../../browser/providers/cloakbrowser.js');\n const config = cloakBrowserConfigFromAgentDefaults(service.currentConfig as Config);\n const status = await probeCloakBrowserRuntime(config);\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Open CloakBrowser with the same profile/settings agents use (saved config, headed).\n authenticated.post('/api/browser/cloakbrowser/launch', strictRateLimitMiddleware, async (c) => {\n try {\n const { cloakBrowserConfigFromAgentDefaults } = await import('../../../browser/backend-from-config.js');\n const { launchCloakBrowser } = await import('../../../browser/providers/cloakbrowser.js');\n const config = cloakBrowserConfigFromAgentDefaults(service.currentConfig as Config);\n const result = await launchCloakBrowser({\n ...config,\n skipPlaywrightConnect: true,\n });\n return c.json({\n ok: true,\n payload: {\n running: true,\n reused: result.reused,\n port: result.cdpPort,\n pid: result.pid,\n userDataDir: result.userDataDir,\n temporaryProfile: config.temporaryProfile === true,\n },\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n // Ping a user-supplied CDP endpoint — loopback only (SSRF guard).\n authenticated.post('/api/browser/cdp/ping', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cdpUrl = typeof input.cdpUrl === 'string' ? input.cdpUrl.trim() : '';\n if (!cdpUrl) return c.json({ ok: false, error: 'cdpUrl is required' }, 400);\n\n const loopback = loopbackHostnameFromUrl(cdpUrl);\n if (!loopback) {\n return c.json(\n { ok: false, error: 'CDP ping only allowed for loopback hosts (127.0.0.1 / localhost / ::1)' },\n 403,\n );\n }\n let httpBase: URL;\n try {\n httpBase = new URL(cdpUrl);\n httpBase.protocol = httpBase.protocol === 'wss:' ? 'https:' : 'http:';\n httpBase.pathname = '/json/version';\n httpBase.search = '';\n httpBase.hash = '';\n } catch (e) {\n return c.json({ ok: false, error: e instanceof Error ? e.message : 'invalid cdpUrl' }, 400);\n }\n try {\n const res = await fetch(httpBase.toString(), { signal: AbortSignal.timeout(2000) });\n if (!res.ok) {\n return c.json({ ok: true, payload: { reachable: false, status: res.status } });\n }\n const data = (await res.json()) as { Browser?: string; 'Protocol-Version'?: string; webSocketDebuggerUrl?: string };\n return c.json({\n ok: true,\n payload: {\n reachable: true,\n browser: data.Browser ?? null,\n protocolVersion: data['Protocol-Version'] ?? null,\n webSocketDebuggerUrl: data.webSocketDebuggerUrl ?? null,\n },\n });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: true, payload: { reachable: false, error: message } });\n }\n });\n\n // Spawn a local debuggable Chrome and return its WS endpoint.\n authenticated.post('/api/browser/cdp/launch', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const executablePath =\n typeof input.executablePath === 'string' && input.executablePath.trim()\n ? input.executablePath.trim()\n : undefined;\n try {\n const { launchLocalCdpChrome } = await import('../../../browser/cdp-local-launcher.js');\n const result = await launchLocalCdpChrome({ executablePath });\n return c.json({ ok: true, payload: result });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n authenticated.post('/api/browser/cdp/stop', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const port = typeof input.port === 'number' && Number.isInteger(input.port) ? input.port : NaN;\n if (!Number.isFinite(port) || port < 1024 || port > 65535) {\n return c.json({ ok: false, error: 'port must be an integer in [1024, 65535]' }, 400);\n }\n const { stopLocalCdpChrome } = await import('../../../browser/cdp-local-launcher.js');\n const stopped = await stopLocalCdpChrome(port);\n return c.json({ ok: true, payload: { stopped } });\n });\n\n authenticated.get('/api/browser/cdp/instances', async (c) => {\n const { listLocalCdpInstances } = await import('../../../browser/cdp-local-launcher.js');\n return c.json({ ok: true, payload: { instances: listLocalCdpInstances() } });\n });\n\n // Cloud provider connection test.\n authenticated.post('/api/browser/cloud/test-connection', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ ok: false, error: 'invalid JSON body' }, 400);\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const provider = input.provider;\n const apiKeyRaw = typeof input.apiKey === 'string' ? input.apiKey.trim() : '';\n\n // The masked sentinel means \"use the stored config key\".\n let apiKey = apiKeyRaw;\n if (apiKey === '***' || apiKey === '••••••••••••') {\n const stored =\n (service.currentConfig as Config)?.agents?.defaults?.browser?.cloud?.apiKey;\n apiKey = typeof stored === 'string' ? stored.trim() : '';\n }\n if (!apiKey) {\n if (provider === 'browserbase') apiKey = process.env.BROWSERBASE_API_KEY ?? '';\n else if (provider === 'browser-use') apiKey = process.env.BROWSER_USE_API_KEY ?? '';\n }\n if (!apiKey) {\n return c.json({ ok: true, payload: { reachable: false, error: 'No API key configured' } });\n }\n\n try {\n if (provider === 'browserbase') {\n const res = await fetch('https://api.browserbase.com/v1/projects', {\n headers: { 'x-bb-api-key': apiKey },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) {\n return c.json({\n ok: true,\n payload: { reachable: false, status: res.status, error: await res.text().catch(() => '') },\n });\n }\n const data = (await res.json().catch(() => null)) as unknown;\n const projects = Array.isArray(data) ? data : Array.isArray((data as { data?: unknown[] })?.data) ? (data as { data: unknown[] }).data : [];\n return c.json({ ok: true, payload: { reachable: true, projectCount: projects.length } });\n }\n if (provider === 'browser-use') {\n const res = await fetch('https://api.browser-use.com/api/v1/users/me', {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) {\n return c.json({\n ok: true,\n payload: { reachable: false, status: res.status, error: await res.text().catch(() => '') },\n });\n }\n return c.json({ ok: true, payload: { reachable: true } });\n }\n return c.json({ ok: false, error: 'provider must be browserbase or browser-use' }, 400);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: true, payload: { reachable: false, error: message } });\n }\n });\n\n authenticated.post('/api/browser/playwright/install', strictRateLimitMiddleware, async (c) => {\n try {\n const { installPlaywrightChromium } = await import('../../../browser/providers/playwright-install.js');\n const payload = await installPlaywrightChromium();\n return c.json({ ok: true, payload });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message || 'Failed to install Playwright Chromium' }, 500);\n }\n });\n\n authenticated.post('/api/browser/cloakbrowser/install', strictRateLimitMiddleware, async (c) => {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const input = body && typeof body === 'object' && !Array.isArray(body)\n ? (body as Record<string, unknown>)\n : {};\n const cacheDir = typeof input.cacheDir === 'string' && input.cacheDir.trim()\n ? input.cacheDir.trim()\n : undefined;\n const binaryPath = typeof input.binaryPath === 'string' && input.binaryPath.trim()\n ? input.binaryPath.trim()\n : undefined;\n\n try {\n const { installCloakBrowser } = await import('../../../browser/providers/cloakbrowser.js');\n const status = await installCloakBrowser({ cacheDir, binaryPath });\n return c.json({ ok: true, payload: status });\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n return c.json({ ok: false, error: message }, 500);\n }\n });\n\n authenticated.post('/api/config/reload', strictRateLimitMiddleware, async (c) => {\n const result = await service.reloadConfig();\n return c.json({ ok: true, payload: result });\n });\n\n authenticated.post('/api/heartbeat/trigger', strictRateLimitMiddleware, async (c) => {\n let reason = 'manual';\n try {\n const body = await c.req.json();\n if (body && typeof body === 'object' && typeof (body as { reason?: unknown }).reason === 'string') {\n const r = (body as { reason: string }).reason.trim();\n if (r) reason = r.slice(0, 120);\n }\n } catch {\n /* empty or invalid body */\n }\n service.requestHeartbeatNow({ reason });\n return c.json({ ok: true, payload: { scheduled: true } });\n });\n\n authenticated.get('/api/config', async (c) => {\n const safeConfig = await buildSafeWebConfigPayload(service);\n return c.json({ ok: true, payload: { config: safeConfig } });\n });\n\n authenticated.patch('/api/config', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json();\n \n // Merge updates into current config\n const config: Config = service.currentConfig as Config;\n \n // Update agent defaults\n if (body.agents?.defaults) {\n if (!config.agents) config.agents = { defaults: { workspace: '~/.xopc/workspace', model: 'anthropic/claude-sonnet-4-5', maxTokens: 8192, temperature: 0.7, maxToolIterations: 20, maxRequestsPerTurn: 50, maxToolFailuresPerTurn: 3, thinkingDefault: 'medium', reasoningDefault: 'stream', verboseDefault: 'full' } };\n if (!config.agents.defaults) config.agents.defaults = {} as any;\n \n if (body.agents.defaults.model !== undefined) {\n config.agents.defaults.model = normalizePatchAgentModel(body.agents.defaults.model) as Config['agents']['defaults']['model'];\n }\n if (body.agents.defaults.maxTokens !== undefined) {\n config.agents.defaults.maxTokens = body.agents.defaults.maxTokens;\n }\n if (body.agents.defaults.temperature !== undefined) {\n config.agents.defaults.temperature = body.agents.defaults.temperature;\n }\n if (body.agents.defaults.maxToolIterations !== undefined) {\n config.agents.defaults.maxToolIterations = body.agents.defaults.maxToolIterations;\n }\n if (body.agents.defaults.workspace !== undefined) {\n config.agents.defaults.workspace = body.agents.defaults.workspace;\n }\n if (body.agents.defaults.thinkingDefault !== undefined) {\n config.agents.defaults.thinkingDefault = body.agents.defaults.thinkingDefault;\n }\n if (body.agents.defaults.reasoningDefault !== undefined) {\n config.agents.defaults.reasoningDefault = body.agents.defaults.reasoningDefault;\n }\n if (body.agents.defaults.verboseDefault !== undefined) {\n config.agents.defaults.verboseDefault = body.agents.defaults.verboseDefault;\n }\n if (body.agents.defaults.imageModel !== undefined) {\n const v = body.agents.defaults.imageModel;\n if (v === '' || v === null) {\n delete (config.agents.defaults as Record<string, unknown>).imageModel;\n } else {\n config.agents.defaults.imageModel = normalizePatchAgentModel(v) as Config['agents']['defaults']['imageModel'];\n }\n }\n if (body.agents.defaults.imageGenerationModel !== undefined) {\n const v = body.agents.defaults.imageGenerationModel;\n if (v === '' || v === null) {\n delete (config.agents.defaults as Record<string, unknown>).imageGenerationModel;\n } else {\n const normalized = normalizePatchAgentImageGenerationModel(v);\n if (normalized === undefined) {\n delete (config.agents.defaults as Record<string, unknown>).imageGenerationModel;\n } else {\n config.agents.defaults.imageGenerationModel =\n normalized as Config['agents']['defaults']['imageGenerationModel'];\n }\n }\n }\n if (body.agents.defaults.mediaMaxMb !== undefined) {\n const v = body.agents.defaults.mediaMaxMb;\n if (v === null) {\n delete (config.agents.defaults as Record<string, unknown>).mediaMaxMb;\n } else {\n const n = typeof v === 'number' ? v : Number(v);\n if (!Number.isNaN(n) && n > 0) {\n config.agents.defaults.mediaMaxMb = n;\n }\n }\n }\n if (body.agents.defaults.browser !== undefined) {\n const b = body.agents.defaults.browser;\n if (b === null) {\n delete (config.agents.defaults as Record<string, unknown>).browser;\n } else if (typeof b === 'object' && !Array.isArray(b)) {\n const br = b as Record<string, unknown>;\n if (!config.agents.defaults.browser) {\n config.agents.defaults.browser = { enabled: false, headless: false };\n }\n const target = config.agents.defaults.browser as Record<string, unknown>;\n if (br.enabled !== undefined) {\n if (br.enabled === null) delete target.enabled;\n else target.enabled = Boolean(br.enabled);\n }\n if (br.headless !== undefined) {\n if (br.headless === null) delete target.headless;\n else target.headless = Boolean(br.headless);\n }\n if (br.allowPrivateUrls !== undefined) {\n if (br.allowPrivateUrls === null) delete target.allowPrivateUrls;\n else target.allowPrivateUrls = Boolean(br.allowPrivateUrls);\n }\n if (br.commandTimeout !== undefined) {\n if (br.commandTimeout === null) {\n delete target.commandTimeout;\n } else if (typeof br.commandTimeout === 'number' && Number.isFinite(br.commandTimeout)) {\n const n = Math.floor(br.commandTimeout);\n if (n >= 5 && n <= 900) {\n target.commandTimeout = n;\n }\n }\n }\n if (br.backend !== undefined) {\n if (br.backend === null || br.backend === '' || br.backend === 'extension') {\n delete target.backend;\n } else if (\n br.backend === 'local' ||\n br.backend === 'cdp' ||\n br.backend === 'cloud' ||\n br.backend === 'cloakbrowser'\n ) {\n target.backend = br.backend;\n }\n }\n if (br.cloudProvider !== undefined) {\n if (br.cloudProvider === null || br.cloudProvider === '') {\n delete target.cloudProvider;\n } else if (br.cloudProvider === 'browserbase' || br.cloudProvider === 'browser-use') {\n target.cloudProvider = br.cloudProvider;\n }\n }\n if (br.cloud !== undefined) {\n if (br.cloud === null) {\n delete target.cloud;\n } else if (typeof br.cloud === 'object' && !Array.isArray(br.cloud)) {\n const cloudPatch = br.cloud as Record<string, unknown>;\n const existingCloud =\n target.cloud && typeof target.cloud === 'object' && !Array.isArray(target.cloud)\n ? (target.cloud as Record<string, unknown>)\n : {};\n const cloudTarget: Record<string, unknown> = { ...existingCloud };\n if (cloudPatch.apiKey !== undefined) {\n if (cloudPatch.apiKey === null || cloudPatch.apiKey === '') {\n delete cloudTarget.apiKey;\n } else if (cloudPatch.apiKey === '***') {\n // Keep the existing stored key when the web UI sends the masked sentinel.\n } else if (typeof cloudPatch.apiKey === 'string') {\n cloudTarget.apiKey = cloudPatch.apiKey.trim();\n }\n }\n for (const key of ['projectId', 'region']) {\n const value = cloudPatch[key];\n if (value === null || value === '') {\n delete cloudTarget[key];\n } else if (typeof value === 'string' && value.trim()) {\n cloudTarget[key] = value.trim();\n }\n }\n if (Object.keys(cloudTarget).length > 0) {\n target.cloud = cloudTarget;\n } else {\n delete target.cloud;\n }\n }\n }\n if (br.cdpUrl !== undefined) {\n if (br.cdpUrl === null || br.cdpUrl === '') {\n delete target.cdpUrl;\n } else if (typeof br.cdpUrl === 'string') {\n target.cdpUrl = br.cdpUrl.trim();\n }\n }\n if (br.extension !== undefined) {\n if (br.extension === null) {\n delete target.extension;\n } else if (typeof br.extension === 'object' && !Array.isArray(br.extension)) {\n const ext = br.extension as Record<string, unknown>;\n const extTarget: Record<string, unknown> = {};\n if (ext.port === null || ext.port === '') {\n // explicit clear: leave unset (consumers fall back to default)\n } else if (typeof ext.port === 'number' && ext.port >= 1024 && ext.port <= 65535) {\n extTarget.port = Math.floor(ext.port);\n }\n if (ext.host === null || ext.host === '') {\n // explicit clear\n } else if (typeof ext.host === 'string' && ext.host.trim()) {\n extTarget.host = ext.host.trim();\n }\n if (\n ext.connectionTimeout === null ||\n ext.connectionTimeout === ''\n ) {\n // explicit clear\n } else if (\n typeof ext.connectionTimeout === 'number' &&\n Number.isFinite(ext.connectionTimeout) &&\n ext.connectionTimeout >= 1000\n ) {\n extTarget.connectionTimeout = Math.floor(ext.connectionTimeout);\n }\n if (Object.keys(extTarget).length > 0) {\n target.extension = extTarget;\n } else {\n delete target.extension;\n }\n }\n }\n if (br.cloakbrowser !== undefined) {\n if (br.cloakbrowser === null) {\n delete target.cloakbrowser;\n } else if (typeof br.cloakbrowser === 'object' && !Array.isArray(br.cloakbrowser)) {\n const cloakbrowserPatch = br.cloakbrowser as Record<string, unknown>;\n const cloakbrowserTarget: Record<string, unknown> = {};\n if (typeof cloakbrowserPatch.keepOpen === 'boolean') {\n cloakbrowserTarget.keepOpen = cloakbrowserPatch.keepOpen;\n }\n if (typeof cloakbrowserPatch.temporaryProfile === 'boolean') {\n cloakbrowserTarget.temporaryProfile = cloakbrowserPatch.temporaryProfile;\n }\n for (const key of ['cacheDir', 'binaryPath', 'timezone', 'locale', 'webrtcIp', 'fingerprintPlatform']) {\n const value = cloakbrowserPatch[key];\n if (typeof value === 'string' && value.trim()) {\n cloakbrowserTarget[key] = value.trim();\n }\n }\n if (\n Array.isArray(cloakbrowserPatch.extraArgs) &&\n cloakbrowserPatch.extraArgs.every((value) => typeof value === 'string')\n ) {\n cloakbrowserTarget.extraArgs = cloakbrowserPatch.extraArgs;\n }\n if (Object.keys(cloakbrowserTarget).length > 0) {\n target.cloakbrowser = cloakbrowserTarget;\n } else {\n delete target.cloakbrowser;\n }\n }\n }\n if (br.humanize !== undefined) {\n if (br.humanize === null) {\n delete target.humanize;\n } else {\n target.humanize = Boolean(br.humanize);\n }\n }\n if (br.humanPreset !== undefined) {\n if (br.humanPreset === null) {\n delete target.humanPreset;\n } else if (br.humanPreset === 'default' || br.humanPreset === 'careful') {\n target.humanPreset = br.humanPreset;\n }\n }\n if (br.dialogPolicy !== undefined) {\n if (br.dialogPolicy === null) {\n delete target.dialogPolicy;\n } else if (\n br.dialogPolicy === 'must_respond' ||\n br.dialogPolicy === 'auto_dismiss' ||\n br.dialogPolicy === 'auto_accept'\n ) {\n target.dialogPolicy = br.dialogPolicy;\n }\n }\n if (br.dialogTimeoutSeconds !== undefined) {\n if (br.dialogTimeoutSeconds === null) {\n delete target.dialogTimeoutSeconds;\n } else if (typeof br.dialogTimeoutSeconds === 'number' && Number.isFinite(br.dialogTimeoutSeconds)) {\n const n = Math.floor(br.dialogTimeoutSeconds);\n if (n >= 1 && n <= 86_400) {\n target.dialogTimeoutSeconds = n;\n }\n }\n }\n }\n }\n\n const dPatch = body.agents.defaults as Record<string, unknown>;\n const def = config.agents.defaults as Record<string, unknown>;\n\n if (dPatch.maxTaskDurationMs !== undefined) {\n const v = dPatch.maxTaskDurationMs;\n if (v === null) {\n delete def.maxTaskDurationMs;\n } else if (typeof v === 'number' && Number.isFinite(v)) {\n const ms = Math.floor(v);\n if (ms >= 60_000 && ms <= 14_400_000) {\n def.maxTaskDurationMs = ms;\n }\n }\n }\n if (dPatch.maxRequestsPerTurn !== undefined) {\n const v = dPatch.maxRequestsPerTurn;\n if (v === null) {\n delete def.maxRequestsPerTurn;\n } else if (typeof v === 'number' && Number.isFinite(v)) {\n const n = Math.floor(v);\n if (n >= 10 && n <= 200) {\n def.maxRequestsPerTurn = n;\n }\n }\n }\n if (dPatch.maxToolFailuresPerTurn !== undefined) {\n const v = dPatch.maxToolFailuresPerTurn;\n if (v === null) {\n delete def.maxToolFailuresPerTurn;\n } else if (typeof v === 'number' && Number.isFinite(v)) {\n const n = Math.floor(v);\n if (n >= 1 && n <= 20) {\n def.maxToolFailuresPerTurn = n;\n }\n }\n }\n\n if (dPatch.compaction !== undefined) {\n const c = dPatch.compaction;\n if (c === null) {\n delete def.compaction;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.compaction || typeof def.compaction !== 'object') {\n def.compaction = {};\n }\n const t = def.compaction as Record<string, unknown>;\n if (p.enabled !== undefined) t.enabled = Boolean(p.enabled);\n if (p.mode === 'default' || p.mode === 'safeguard') t.mode = p.mode;\n if (typeof p.reserveTokens === 'number' && Number.isFinite(p.reserveTokens)) {\n t.reserveTokens = Math.floor(p.reserveTokens);\n }\n if (typeof p.triggerThreshold === 'number' && Number.isFinite(p.triggerThreshold)) {\n const x = p.triggerThreshold;\n if (x >= 0.5 && x <= 0.95) t.triggerThreshold = x;\n }\n if (typeof p.minMessagesBeforeCompact === 'number' && Number.isFinite(p.minMessagesBeforeCompact)) {\n t.minMessagesBeforeCompact = Math.floor(p.minMessagesBeforeCompact);\n }\n if (typeof p.keepRecentMessages === 'number' && Number.isFinite(p.keepRecentMessages)) {\n t.keepRecentMessages = Math.floor(p.keepRecentMessages);\n }\n if (typeof p.evictionWindow === 'number' && Number.isFinite(p.evictionWindow)) {\n const x = p.evictionWindow;\n if (x >= 0.1 && x <= 0.5) t.evictionWindow = x;\n }\n if (typeof p.retentionWindow === 'number' && Number.isFinite(p.retentionWindow)) {\n const n = Math.floor(p.retentionWindow);\n if (n >= 3 && n <= 20) t.retentionWindow = n;\n }\n }\n }\n\n if (dPatch.pruning !== undefined) {\n const c = dPatch.pruning;\n if (c === null) {\n delete def.pruning;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.pruning || typeof def.pruning !== 'object') {\n def.pruning = {};\n }\n const t = def.pruning as Record<string, unknown>;\n if (p.enabled !== undefined) t.enabled = Boolean(p.enabled);\n if (typeof p.maxToolResultChars === 'number' && Number.isFinite(p.maxToolResultChars)) {\n t.maxToolResultChars = Math.floor(p.maxToolResultChars);\n }\n if (typeof p.headKeepRatio === 'number' && Number.isFinite(p.headKeepRatio)) {\n t.headKeepRatio = p.headKeepRatio;\n }\n if (typeof p.tailKeepRatio === 'number' && Number.isFinite(p.tailKeepRatio)) {\n t.tailKeepRatio = p.tailKeepRatio;\n }\n }\n }\n\n if (dPatch.memory !== undefined) {\n const c = dPatch.memory;\n if (c === null) {\n delete def.memory;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.memory || typeof def.memory !== 'object') {\n def.memory = {};\n }\n const t = def.memory as Record<string, unknown>;\n if (p.enabled !== undefined) {\n if (p.enabled === null) delete t.enabled;\n else t.enabled = Boolean(p.enabled);\n }\n if (p.useEnhancedSystem !== undefined) {\n if (p.useEnhancedSystem === null) delete t.useEnhancedSystem;\n else t.useEnhancedSystem = Boolean(p.useEnhancedSystem);\n }\n if (p.userProfileEnabled !== undefined) {\n if (p.userProfileEnabled === null) delete t.userProfileEnabled;\n else t.userProfileEnabled = Boolean(p.userProfileEnabled);\n }\n if (p.memoryCharLimit !== undefined) {\n if (p.memoryCharLimit === null) delete t.memoryCharLimit;\n else if (typeof p.memoryCharLimit === 'number' && p.memoryCharLimit > 0) {\n t.memoryCharLimit = Math.floor(p.memoryCharLimit);\n }\n }\n if (p.userCharLimit !== undefined) {\n if (p.userCharLimit === null) delete t.userCharLimit;\n else if (typeof p.userCharLimit === 'number' && p.userCharLimit > 0) {\n t.userCharLimit = Math.floor(p.userCharLimit);\n }\n }\n if (p.provider === 'none' || p.provider === 'stub') {\n t.provider = p.provider;\n } else if (p.provider === null) {\n delete t.provider;\n }\n if (p.injectionFrequency === 'every-turn' || p.injectionFrequency === 'first-turn') {\n t.injectionFrequency = p.injectionFrequency;\n } else if (p.injectionFrequency === null) {\n delete t.injectionFrequency;\n }\n if (p.contextCadence !== undefined) {\n if (p.contextCadence === null) delete t.contextCadence;\n else if (typeof p.contextCadence === 'number' && p.contextCadence >= 1) {\n t.contextCadence = Math.floor(p.contextCadence);\n }\n }\n if (p.dialecticCadence !== undefined) {\n if (p.dialecticCadence === null) delete t.dialecticCadence;\n else if (typeof p.dialecticCadence === 'number' && p.dialecticCadence >= 1) {\n t.dialecticCadence = Math.floor(p.dialecticCadence);\n }\n }\n\n // Dreaming (schemaless patch): agents.defaults.memory.dreaming\n if (p.dreaming !== undefined) {\n const d0 = p.dreaming;\n if (d0 === null) {\n delete (t as { dreaming?: unknown }).dreaming;\n } else if (typeof d0 === 'object' && d0 !== null && !Array.isArray(d0)) {\n if (!('dreaming' in t) || typeof (t as { dreaming?: unknown }).dreaming !== 'object') {\n (t as { dreaming?: Record<string, unknown> }).dreaming = {};\n }\n const dt = (t as { dreaming: Record<string, unknown> }).dreaming;\n const dp = d0 as Record<string, unknown>;\n\n if (dp.enabled !== undefined) {\n if (dp.enabled === null) delete dt.enabled;\n else dt.enabled = Boolean(dp.enabled);\n }\n if (dp.frequency !== undefined) {\n const v = dp.frequency;\n if (v === null || v === '') delete dt.frequency;\n else if (typeof v === 'string') dt.frequency = v;\n }\n if (dp.timezone !== undefined) {\n const v = dp.timezone;\n if (v === null || v === '') delete dt.timezone;\n else if (typeof v === 'string') dt.timezone = v;\n }\n\n // Accept either `phases.deep` or `deep`.\n if (dp.phases !== undefined || dp.deep !== undefined) {\n if (!('phases' in dt) || typeof (dt as { phases?: unknown }).phases !== 'object' || (dt as { phases?: unknown }).phases === null) {\n dt.phases = {};\n }\n const phases = (dt as { phases: Record<string, unknown> }).phases;\n if (!('deep' in phases) || typeof phases.deep !== 'object' || phases.deep === null) {\n phases.deep = {};\n }\n const deep = phases.deep as Record<string, unknown>;\n\n const deepPatchRaw =\n typeof dp.phases === 'object' && dp.phases !== null && !Array.isArray(dp.phases)\n ? (dp.phases as Record<string, unknown>).deep\n : dp.deep;\n const deepPatch =\n typeof deepPatchRaw === 'object' && deepPatchRaw !== null && !Array.isArray(deepPatchRaw)\n ? (deepPatchRaw as Record<string, unknown>)\n : null;\n\n if (deepPatch) {\n if (deepPatch.enabled !== undefined) {\n if (deepPatch.enabled === null) delete deep.enabled;\n else deep.enabled = Boolean(deepPatch.enabled);\n }\n if (deepPatch.minScore !== undefined) {\n const v = deepPatch.minScore;\n if (v === null) delete deep.minScore;\n else if (typeof v === 'number' && Number.isFinite(v)) deep.minScore = v;\n }\n if (deepPatch.minRecallCount !== undefined) {\n const v = deepPatch.minRecallCount;\n if (v === null) delete deep.minRecallCount;\n else if (typeof v === 'number' && Number.isFinite(v)) deep.minRecallCount = Math.floor(v);\n }\n if (deepPatch.limit !== undefined) {\n const v = deepPatch.limit;\n if (v === null) delete deep.limit;\n else if (typeof v === 'number' && Number.isFinite(v)) deep.limit = Math.floor(v);\n }\n }\n }\n }\n }\n }\n }\n\n if (dPatch.sessionSearch !== undefined) {\n const c = dPatch.sessionSearch;\n if (c === null) {\n delete def.sessionSearch;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.sessionSearch || typeof def.sessionSearch !== 'object') {\n def.sessionSearch = {};\n }\n const t = def.sessionSearch as Record<string, unknown>;\n if (p.summaryModel !== undefined) {\n if (p.summaryModel === null || p.summaryModel === '') {\n delete t.summaryModel;\n } else if (typeof p.summaryModel === 'string') {\n t.summaryModel = p.summaryModel;\n }\n }\n }\n }\n\n if (dPatch.backgroundReview !== undefined) {\n const c = dPatch.backgroundReview;\n if (c === null) {\n delete def.backgroundReview;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.backgroundReview || typeof def.backgroundReview !== 'object') {\n def.backgroundReview = {};\n }\n const t = def.backgroundReview as Record<string, unknown>;\n if (p.enabled !== undefined) {\n if (p.enabled === null) delete t.enabled;\n else t.enabled = Boolean(p.enabled);\n }\n if (p.memoryNudgeInterval !== undefined) {\n if (p.memoryNudgeInterval === null) delete t.memoryNudgeInterval;\n else if (typeof p.memoryNudgeInterval === 'number' && p.memoryNudgeInterval >= 0) {\n t.memoryNudgeInterval = Math.floor(p.memoryNudgeInterval);\n }\n }\n if (p.skillNudgeInterval !== undefined) {\n if (p.skillNudgeInterval === null) delete t.skillNudgeInterval;\n else if (typeof p.skillNudgeInterval === 'number' && p.skillNudgeInterval >= 0) {\n t.skillNudgeInterval = Math.floor(p.skillNudgeInterval);\n }\n }\n if (p.maxToolRounds !== undefined) {\n if (p.maxToolRounds === null) delete t.maxToolRounds;\n else if (typeof p.maxToolRounds === 'number' && p.maxToolRounds >= 1 && p.maxToolRounds <= 32) {\n t.maxToolRounds = Math.floor(p.maxToolRounds);\n }\n }\n if (p.maxHistoryMessages !== undefined) {\n if (p.maxHistoryMessages === null) delete t.maxHistoryMessages;\n else if (typeof p.maxHistoryMessages === 'number' && p.maxHistoryMessages >= 10 && p.maxHistoryMessages <= 200) {\n t.maxHistoryMessages = Math.floor(p.maxHistoryMessages);\n }\n }\n if (p.maxDurationMs !== undefined) {\n if (p.maxDurationMs === null) delete t.maxDurationMs;\n else if (typeof p.maxDurationMs === 'number' && p.maxDurationMs >= 30_000 && p.maxDurationMs <= 600_000) {\n t.maxDurationMs = Math.floor(p.maxDurationMs);\n }\n }\n }\n }\n\n if (dPatch.webExtract !== undefined) {\n const c = dPatch.webExtract;\n if (c === null) {\n delete def.webExtract;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.webExtract || typeof def.webExtract !== 'object') {\n def.webExtract = {};\n }\n const t = def.webExtract as Record<string, unknown>;\n if (p.model !== undefined) {\n if (p.model === null || p.model === '') {\n delete t.model;\n } else if (typeof p.model === 'string') {\n t.model = p.model;\n }\n }\n if (p.maxLength !== undefined) {\n if (p.maxLength === null) delete t.maxLength;\n else if (typeof p.maxLength === 'number' && p.maxLength > 0) {\n t.maxLength = p.maxLength;\n }\n }\n }\n }\n\n if (dPatch.delegate !== undefined) {\n const c = dPatch.delegate;\n if (c === null) {\n delete def.delegate;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.delegate || typeof def.delegate !== 'object') {\n def.delegate = {};\n }\n const t = def.delegate as Record<string, unknown>;\n if (p.enabled !== undefined) {\n if (p.enabled === null) delete t.enabled;\n else t.enabled = Boolean(p.enabled);\n }\n }\n }\n\n if (dPatch.executeCode !== undefined) {\n const c = dPatch.executeCode;\n if (c === null) {\n delete def.executeCode;\n } else if (typeof c === 'object' && !Array.isArray(c)) {\n const p = c as Record<string, unknown>;\n if (!def.executeCode || typeof def.executeCode !== 'object') {\n def.executeCode = {};\n }\n const t = def.executeCode as Record<string, unknown>;\n if (p.enabled !== undefined) {\n if (p.enabled === null) delete t.enabled;\n else t.enabled = Boolean(p.enabled);\n }\n }\n }\n\n if (dPatch.systemPromptOverride !== undefined) {\n const v = dPatch.systemPromptOverride;\n if (v === null || v === '') {\n delete def.systemPromptOverride;\n } else if (typeof v === 'string') {\n def.systemPromptOverride = v;\n }\n }\n\n if (dPatch.skills !== undefined) {\n const v = dPatch.skills;\n if (v === null) {\n delete def.skills;\n } else if (Array.isArray(v) && v.every((x) => typeof x === 'string')) {\n def.skills = v;\n }\n }\n\n if (dPatch.tools !== undefined) {\n const t0 = dPatch.tools;\n if (t0 === null) {\n delete def.tools;\n } else if (typeof t0 === 'object' && !Array.isArray(t0)) {\n const p = t0 as { disable?: unknown };\n if (!def.tools || typeof def.tools !== 'object') {\n def.tools = {};\n }\n const t = def.tools as { disable?: string[] };\n if (p.disable !== undefined) {\n if (p.disable === null || (Array.isArray(p.disable) && p.disable.length === 0)) {\n delete t.disable;\n } else if (Array.isArray(p.disable) && p.disable.every((x) => typeof x === 'string')) {\n t.disable = p.disable;\n }\n }\n }\n }\n\n if (dPatch.params !== undefined) {\n const v = dPatch.params;\n if (v === null) {\n delete def.params;\n } else if (typeof v === 'object' && !Array.isArray(v) && v !== null) {\n def.params = v as Record<string, unknown>;\n }\n }\n }\n \n // Update channels — use `in` / null so `weixin: null` removes the block; avoid `if (ch.weixin)` missing null.\n const patchChannels = body.channels;\n if (patchChannels != null && typeof patchChannels === 'object' && !Array.isArray(patchChannels)) {\n if ('telegram' in patchChannels) {\n const tgRaw = patchChannels.telegram;\n if (tgRaw === null) {\n if (config.channels) delete config.channels.telegram;\n } else if (typeof tgRaw === 'object' && !Array.isArray(tgRaw)) {\n const bodyTg = tgRaw as Record<string, unknown>;\n if (!config.channels) {\n config.channels = {\n telegram: {\n enabled: false,\n allowFrom: [],\n groupAllowFrom: [],\n debug: false,\n accounts: {\n default: {\n accountId: 'default',\n enabled: true,\n botToken: '',\n allowFrom: [],\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n streamMode: 'partial' as const,\n },\n },\n dmPolicy: 'pairing' as const,\n groupPolicy: 'open' as const,\n replyToMode: 'off' as const,\n historyLimit: 50,\n textChunkLimit: 4000,\n },\n };\n }\n if (!config.channels.telegram) config.channels.telegram = {} as any;\n const tg = config.channels.telegram as Record<string, unknown>;\n\n if (bodyTg.enabled !== undefined) {\n tg.enabled = bodyTg.enabled;\n }\n if (bodyTg.botToken !== undefined) {\n const accRaw = tg.accounts;\n const acc =\n accRaw && typeof accRaw === 'object' && !Array.isArray(accRaw)\n ? { ...(accRaw as Record<string, unknown>) }\n : {};\n const defRaw = acc.default;\n const def =\n defRaw && typeof defRaw === 'object' && !Array.isArray(defRaw)\n ? { ...(defRaw as Record<string, unknown>) }\n : {};\n acc.default = {\n ...def,\n accountId: 'default',\n botToken: bodyTg.botToken,\n };\n tg.accounts = acc;\n }\n if (bodyTg.allowFrom !== undefined) {\n tg.allowFrom = bodyTg.allowFrom;\n }\n if ('apiRoot' in bodyTg) {\n const ar = bodyTg.apiRoot;\n if (ar === null || ar === undefined || (typeof ar === 'string' && !ar.trim())) {\n delete tg.apiRoot;\n } else {\n tg.apiRoot = String(ar).trim();\n }\n }\n if (bodyTg.debug !== undefined) {\n tg.debug = bodyTg.debug;\n }\n if (bodyTg.streamMode !== undefined) {\n tg.streamMode = bodyTg.streamMode;\n }\n if ('groupAllowFrom' in bodyTg) {\n const ga = bodyTg.groupAllowFrom;\n if (ga === null || (Array.isArray(ga) && ga.length === 0)) {\n delete tg.groupAllowFrom;\n } else {\n tg.groupAllowFrom = ga;\n }\n }\n if (bodyTg.dmPolicy !== undefined) {\n tg.dmPolicy = bodyTg.dmPolicy;\n }\n if (bodyTg.groupPolicy !== undefined) {\n tg.groupPolicy = bodyTg.groupPolicy;\n }\n if (bodyTg.replyToMode !== undefined) {\n tg.replyToMode = bodyTg.replyToMode;\n }\n if (bodyTg.historyLimit !== undefined) {\n tg.historyLimit = bodyTg.historyLimit;\n }\n if (bodyTg.textChunkLimit !== undefined) {\n tg.textChunkLimit = bodyTg.textChunkLimit;\n }\n if ('proxy' in bodyTg) {\n const pr = bodyTg.proxy;\n if (pr === null || pr === undefined || (typeof pr === 'string' && !pr.trim())) {\n delete tg.proxy;\n } else {\n tg.proxy = String(pr).trim();\n }\n }\n if (bodyTg.accounts !== undefined) {\n tg.accounts = bodyTg.accounts;\n }\n }\n }\n\n if ('weixin' in patchChannels) {\n const wxRaw = patchChannels.weixin;\n if (wxRaw === null) {\n if (config.channels) delete config.channels.weixin;\n } else if (typeof wxRaw === 'object' && !Array.isArray(wxRaw)) {\n const wx = wxRaw as Record<string, unknown>;\n if (!config.channels) config.channels = {} as any;\n if (!config.channels.weixin) {\n config.channels.weixin = {\n enabled: false,\n dmPolicy: 'open',\n allowFrom: [],\n debug: false,\n historyLimit: 50,\n textChunkLimit: 4000,\n };\n }\n const wxTarget = config.channels.weixin as Record<string, unknown>;\n if (wx.enabled !== undefined) wxTarget.enabled = wx.enabled;\n if (wx.dmPolicy !== undefined) wxTarget.dmPolicy = wx.dmPolicy;\n if (wx.allowFrom !== undefined) wxTarget.allowFrom = wx.allowFrom;\n if (wx.debug !== undefined) wxTarget.debug = wx.debug;\n if (wx.streamMode !== undefined) wxTarget.streamMode = wx.streamMode;\n if (wx.historyLimit !== undefined) wxTarget.historyLimit = wx.historyLimit;\n if (wx.textChunkLimit !== undefined) wxTarget.textChunkLimit = wx.textChunkLimit;\n if ('routeTag' in wx) {\n const rt = wx.routeTag;\n if (rt === null || rt === undefined || rt === '') {\n delete wxTarget.routeTag;\n } else {\n wxTarget.routeTag = rt as string | number;\n }\n }\n if (wx.accounts !== undefined) wxTarget.accounts = wx.accounts;\n }\n }\n\n if ('feishu' in patchChannels) {\n const fsRaw = patchChannels.feishu;\n if (fsRaw === null) {\n if (config.channels) delete config.channels.feishu;\n } else if (typeof fsRaw === 'object' && !Array.isArray(fsRaw)) {\n const fs = fsRaw as Record<string, unknown>;\n if (!config.channels) config.channels = {} as any;\n if (!config.channels.feishu) {\n config.channels.feishu = {\n enabled: false,\n appId: '',\n appSecret: '',\n domain: 'feishu',\n connectionMode: 'websocket',\n dmPolicy: 'open',\n groupPolicy: 'allowlist',\n allowFrom: [],\n groupAllowFrom: [],\n requireMention: true,\n historyLimit: 50,\n textChunkLimit: 4000,\n accounts: {},\n };\n }\n const fsTarget = config.channels.feishu as Record<string, unknown>;\n\n if (fs.enabled !== undefined) fsTarget.enabled = fs.enabled;\n if (fs.defaultAccount !== undefined) {\n const da = fs.defaultAccount;\n if (da === null || da === '') delete fsTarget.defaultAccount;\n else fsTarget.defaultAccount = String(da);\n }\n if (fs.appId !== undefined) fsTarget.appId = fs.appId;\n if ('appSecret' in fs) {\n const v = fs.appSecret;\n if (v === null || (typeof v === 'string' && !String(v).trim())) {\n delete fsTarget.appSecret;\n } else {\n fsTarget.appSecret = v;\n }\n }\n if (fs.domain !== undefined) fsTarget.domain = fs.domain;\n if (fs.connectionMode !== undefined) fsTarget.connectionMode = fs.connectionMode;\n if (fs.verificationToken !== undefined) {\n const v = fs.verificationToken;\n if (v === null || (typeof v === 'string' && !String(v).trim())) delete fsTarget.verificationToken;\n else fsTarget.verificationToken = v;\n }\n if (fs.encryptKey !== undefined) {\n const v = fs.encryptKey;\n if (v === null || (typeof v === 'string' && !String(v).trim())) delete fsTarget.encryptKey;\n else fsTarget.encryptKey = v;\n }\n if (fs.webhookHost !== undefined) {\n const v = fs.webhookHost;\n if (v === null || (typeof v === 'string' && !String(v).trim())) delete fsTarget.webhookHost;\n else fsTarget.webhookHost = v;\n }\n if (fs.webhookPort !== undefined) fsTarget.webhookPort = fs.webhookPort;\n if (fs.webhookPath !== undefined) {\n const v = fs.webhookPath;\n if (v === null || (typeof v === 'string' && !String(v).trim())) delete fsTarget.webhookPath;\n else fsTarget.webhookPath = v;\n }\n if (fs.dmPolicy !== undefined) fsTarget.dmPolicy = fs.dmPolicy;\n if (fs.groupPolicy !== undefined) fsTarget.groupPolicy = fs.groupPolicy;\n if (fs.allowFrom !== undefined) fsTarget.allowFrom = fs.allowFrom;\n if (fs.groupAllowFrom !== undefined) {\n const ga = fs.groupAllowFrom;\n if (ga === null || (Array.isArray(ga) && ga.length === 0)) delete fsTarget.groupAllowFrom;\n else fsTarget.groupAllowFrom = ga;\n }\n if (fs.requireMention !== undefined) fsTarget.requireMention = fs.requireMention;\n if (fs.historyLimit !== undefined) fsTarget.historyLimit = fs.historyLimit;\n if (fs.textChunkLimit !== undefined) fsTarget.textChunkLimit = fs.textChunkLimit;\n if (fs.renderMode !== undefined) fsTarget.renderMode = fs.renderMode;\n if (fs.streaming !== undefined) fsTarget.streaming = fs.streaming;\n if (fs.reactionNotifications !== undefined) {\n fsTarget.reactionNotifications = fs.reactionNotifications;\n }\n if (fs.tools !== undefined) fsTarget.tools = fs.tools;\n if (fs.actions !== undefined) fsTarget.actions = fs.actions;\n if (fs.accounts !== undefined) fsTarget.accounts = fs.accounts;\n }\n }\n }\n \n // Update gateway heartbeat (partial merge)\n if (body.gateway?.heartbeat !== undefined && typeof body.gateway.heartbeat === 'object') {\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: ['*'],\n };\n }\n if (!config.gateway.heartbeat) {\n config.gateway.heartbeat = { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false };\n }\n const h = config.gateway.heartbeat;\n const p = body.gateway.heartbeat as Record<string, unknown>;\n if (p.enabled !== undefined) h.enabled = Boolean(p.enabled);\n if (p.intervalMs !== undefined && typeof p.intervalMs === 'number' && Number.isFinite(p.intervalMs)) {\n h.intervalMs = p.intervalMs;\n }\n if (p.includeSystemPromptSection !== undefined) {\n h.includeSystemPromptSection = Boolean(p.includeSystemPromptSection);\n }\n if (p.target !== undefined) {\n if (p.target === null || p.target === '') delete (h as { target?: string }).target;\n else (h as { target?: string }).target = String(p.target);\n }\n if (p.targetChatId !== undefined) {\n if (p.targetChatId === null || p.targetChatId === '') delete (h as { targetChatId?: string }).targetChatId;\n else (h as { targetChatId?: string }).targetChatId = String(p.targetChatId);\n }\n if (p.prompt !== undefined) {\n if (p.prompt === null || p.prompt === '') delete (h as { prompt?: string }).prompt;\n else (h as { prompt?: string }).prompt = String(p.prompt);\n }\n if (p.ackMaxChars !== undefined) {\n if (p.ackMaxChars === null || p.ackMaxChars === '') delete (h as { ackMaxChars?: number }).ackMaxChars;\n else if (typeof p.ackMaxChars === 'number' && Number.isFinite(p.ackMaxChars)) {\n (h as { ackMaxChars?: number }).ackMaxChars = p.ackMaxChars;\n }\n }\n if (p.isolatedSession !== undefined) {\n if (p.isolatedSession === null || p.isolatedSession === false) {\n delete (h as { isolatedSession?: boolean }).isolatedSession;\n } else {\n (h as { isolatedSession?: boolean }).isolatedSession = Boolean(p.isolatedSession);\n }\n }\n if (p.activeHours !== undefined) {\n if (p.activeHours === null) {\n delete (h as { activeHours?: unknown }).activeHours;\n } else if (typeof p.activeHours === 'object' && p.activeHours !== null) {\n const ah = p.activeHours as Record<string, unknown>;\n const start = typeof ah.start === 'string' ? ah.start : '';\n const end = typeof ah.end === 'string' ? ah.end : '';\n if (start && end) {\n (h as { activeHours?: { start: string; end: string; timezone?: string } }).activeHours = {\n start,\n end,\n ...(typeof ah.timezone === 'string' && ah.timezone.trim() ? { timezone: ah.timezone } : {}),\n };\n } else {\n delete (h as { activeHours?: unknown }).activeHours;\n }\n }\n }\n }\n if (body.gateway?.bind !== undefined) {\n const bindModes = new Set(['auto', 'loopback', 'lan', 'tailnet', 'custom']);\n const bind = body.gateway.bind;\n if (typeof bind !== 'string' || !bindModes.has(bind)) {\n return c.json(\n { ok: false, error: { message: 'gateway.bind must be one of: auto, loopback, lan, tailnet, custom' } },\n 400,\n );\n }\n if (!config.gateway) {\n config.gateway = {\n bind: bind as GatewayBindMode,\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n } else {\n config.gateway.bind = bind as GatewayBindMode;\n }\n if (bind !== 'custom') {\n delete config.gateway.customBindHost;\n }\n }\n if (body.gateway?.customBindHost !== undefined) {\n if (body.gateway.customBindHost === null || body.gateway.customBindHost === '') {\n if (config.gateway) {\n delete config.gateway.customBindHost;\n }\n } else if (typeof body.gateway.customBindHost !== 'string' || !isValidIPv4(body.gateway.customBindHost.trim())) {\n return c.json(\n { ok: false, error: { message: 'gateway.customBindHost must be a valid IPv4 address' } },\n 400,\n );\n } else if (config.gateway) {\n config.gateway.customBindHost = body.gateway.customBindHost.trim();\n config.gateway.bind = 'custom';\n }\n }\n if (body.gateway?.port !== undefined) {\n if (\n typeof body.gateway.port !== 'number' ||\n !Number.isFinite(body.gateway.port) ||\n body.gateway.port < 1 ||\n body.gateway.port > 65535\n ) {\n return c.json({ ok: false, error: { message: 'gateway.port must be an integer from 1 to 65535' } }, 400);\n }\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: Math.floor(body.gateway.port),\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n } else {\n config.gateway.port = Math.floor(body.gateway.port);\n }\n }\n if (body.gateway?.tailscale !== undefined && typeof body.gateway.tailscale === 'object') {\n const ts = body.gateway.tailscale as Record<string, unknown>;\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n auth: { mode: 'token' },\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n config.gateway.tailscale = {\n ...(config.gateway.tailscale ?? { mode: 'off', resetOnExit: true }),\n };\n if (ts.mode !== undefined) {\n if (ts.mode !== 'off' && ts.mode !== 'serve' && ts.mode !== 'funnel') {\n return c.json(\n { ok: false, error: { message: 'gateway.tailscale.mode must be off, serve, or funnel' } },\n 400,\n );\n }\n config.gateway.tailscale.mode = ts.mode as 'off' | 'serve' | 'funnel';\n }\n if (ts.resetOnExit !== undefined) {\n config.gateway.tailscale.resetOnExit = ts.resetOnExit === true;\n }\n }\n if (body.gateway?.auth !== undefined) {\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n if (!config.gateway.auth) config.gateway.auth = { mode: 'token' };\n const a = body.gateway.auth;\n if (a.mode !== undefined) {\n if (\n a.mode !== 'none' &&\n a.mode !== 'token' &&\n a.mode !== 'password' &&\n a.mode !== 'trusted-proxy'\n ) {\n return c.json(\n { ok: false, error: { message: 'gateway.auth.mode must be none, token, password, or trusted-proxy' } },\n 400,\n );\n }\n config.gateway.auth.mode = a.mode;\n }\n if (a.token !== undefined) {\n if (a.token === null || (typeof a.token === 'string' && !a.token.trim())) {\n delete config.gateway.auth.token;\n } else if (typeof a.token === 'string') {\n config.gateway.auth.token = a.token;\n }\n }\n if (a.password !== undefined) {\n if (a.password === null || (typeof a.password === 'string' && !a.password.trim())) {\n delete config.gateway.auth.password;\n } else if (\n typeof a.password === 'string' &&\n a.password !== '***' &&\n a.password !== '••••••••••••'\n ) {\n config.gateway.auth.password = a.password;\n }\n }\n if (a.rateLimit !== undefined && typeof a.rateLimit === 'object' && a.rateLimit !== null) {\n const rlIn = a.rateLimit as Record<string, unknown>;\n if (!config.gateway.auth.rateLimit) {\n config.gateway.auth.rateLimit = {\n enabled: true,\n maxAttempts: 5,\n windowMs: 900_000,\n blockDurationMs: 300_000,\n exemptLoopback: true,\n };\n }\n const rl = config.gateway.auth.rateLimit!;\n if (rlIn.enabled !== undefined) rl.enabled = Boolean(rlIn.enabled);\n if (typeof rlIn.maxAttempts === 'number' && Number.isFinite(rlIn.maxAttempts)) {\n rl.maxAttempts = Math.max(1, Math.floor(rlIn.maxAttempts));\n }\n if (typeof rlIn.windowMs === 'number' && Number.isFinite(rlIn.windowMs) && rlIn.windowMs > 0) {\n rl.windowMs = Math.floor(rlIn.windowMs);\n }\n if (\n typeof rlIn.blockDurationMs === 'number' &&\n Number.isFinite(rlIn.blockDurationMs) &&\n rlIn.blockDurationMs > 0\n ) {\n rl.blockDurationMs = Math.floor(rlIn.blockDurationMs);\n }\n if (\n typeof rlIn.lockoutMs === 'number' &&\n Number.isFinite(rlIn.lockoutMs) &&\n rlIn.lockoutMs > 0\n ) {\n rl.blockDurationMs = Math.floor(rlIn.lockoutMs);\n }\n if (rlIn.exemptLoopback !== undefined) {\n rl.exemptLoopback = Boolean(rlIn.exemptLoopback);\n }\n }\n if (a.trustedProxy !== undefined) {\n if (a.trustedProxy === null) {\n delete config.gateway.auth.trustedProxy;\n } else if (typeof a.trustedProxy === 'object' && a.trustedProxy !== null) {\n const tpIn = a.trustedProxy as Record<string, unknown>;\n const userHeader =\n typeof tpIn.userHeader === 'string' ? tpIn.userHeader.trim() : '';\n if (!userHeader) {\n return c.json(\n { ok: false, error: { message: 'gateway.auth.trustedProxy.userHeader is required' } },\n 400,\n );\n }\n const trustedProxy: NonNullable<(typeof config.gateway.auth)['trustedProxy']> = {\n userHeader,\n };\n if (tpIn.requiredHeaders !== undefined) {\n if (!Array.isArray(tpIn.requiredHeaders)) {\n return c.json(\n { ok: false, error: { message: 'gateway.auth.trustedProxy.requiredHeaders must be an array' } },\n 400,\n );\n }\n trustedProxy.requiredHeaders = tpIn.requiredHeaders\n .filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((x) => x.trim());\n }\n if (tpIn.allowUsers !== undefined) {\n if (!Array.isArray(tpIn.allowUsers)) {\n return c.json(\n { ok: false, error: { message: 'gateway.auth.trustedProxy.allowUsers must be an array' } },\n 400,\n );\n }\n trustedProxy.allowUsers = tpIn.allowUsers\n .filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((x) => x.trim());\n }\n if (tpIn.allowLoopback !== undefined) {\n trustedProxy.allowLoopback = Boolean(tpIn.allowLoopback);\n }\n config.gateway.auth.trustedProxy = trustedProxy;\n }\n }\n }\n if (body.gateway?.trustedProxies !== undefined) {\n if (!Array.isArray(body.gateway.trustedProxies)) {\n return c.json({ ok: false, error: { message: 'gateway.trustedProxies must be an array' } }, 400);\n }\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n config.gateway.trustedProxies = body.gateway.trustedProxies\n .filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((x) => x.trim());\n }\n if (body.gateway?.allowRealIpFallback !== undefined) {\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n config.gateway.allowRealIpFallback = Boolean(body.gateway.allowRealIpFallback);\n }\n if (body.gateway?.dangerouslyAllowHostHeaderOriginFallback !== undefined) {\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n config.gateway.dangerouslyAllowHostHeaderOriginFallback = Boolean(\n body.gateway.dangerouslyAllowHostHeaderOriginFallback,\n );\n }\n if (body.gateway?.security !== undefined) {\n if (typeof body.gateway.security !== 'object' || body.gateway.security === null) {\n return c.json({ ok: false, error: { message: 'gateway.security must be an object' } }, 400);\n }\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n const secIn = body.gateway.security as Record<string, unknown>;\n if (!config.gateway.security) {\n config.gateway.security = {};\n }\n if (secIn.strict !== undefined) {\n config.gateway.security.strict = Boolean(secIn.strict);\n }\n }\n if (body.gateway?.share !== undefined) {\n if (typeof body.gateway.share !== 'object' || body.gateway.share === null || Array.isArray(body.gateway.share)) {\n return c.json({ ok: false, error: { message: 'gateway.share must be an object' } }, 400);\n }\n const shareResult = mergeShareConfigPatch(config, body.gateway.share as Record<string, unknown>);\n if (shareResult.ok === false) {\n return c.json({ ok: false, error: { message: shareResult.message } }, 400);\n }\n }\n if (body.gateway?.corsOrigins !== undefined) {\n if (!Array.isArray(body.gateway.corsOrigins)) {\n return c.json({ ok: false, error: { message: 'gateway.corsOrigins must be an array' } }, 400);\n }\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n config.gateway.corsOrigins = body.gateway.corsOrigins\n .filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((x) => x.trim());\n }\n if (body.gateway?.maxSseConnections !== undefined) {\n if (\n typeof body.gateway.maxSseConnections !== 'number' ||\n !Number.isFinite(body.gateway.maxSseConnections) ||\n body.gateway.maxSseConnections < 1\n ) {\n return c.json(\n { ok: false, error: { message: 'gateway.maxSseConnections must be a positive integer' } },\n 400,\n );\n }\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: Math.floor(body.gateway.maxSseConnections),\n corsOrigins: [],\n };\n } else {\n config.gateway.maxSseConnections = Math.floor(body.gateway.maxSseConnections);\n }\n }\n if (body.gateway?.channelConnectDeferMode !== undefined) {\n const mode = body.gateway.channelConnectDeferMode;\n if (mode !== 'auto' && mode !== 'off' && mode !== 'explicit') {\n return c.json(\n {\n ok: false,\n error: { message: 'gateway.channelConnectDeferMode must be auto, off, or explicit' },\n },\n 400,\n );\n }\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n config.gateway.channelConnectDeferMode = mode;\n }\n const parseDeferIdList = (raw: unknown): string[] | null => {\n if (!Array.isArray(raw)) return null;\n const ids = raw\n .filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n .map((x) => x.trim());\n if (ids.length > 24) return null;\n return ids;\n };\n if (body.gateway?.channelConnectDeferIds !== undefined) {\n const ids = parseDeferIdList(body.gateway.channelConnectDeferIds);\n if (ids === null) {\n return c.json(\n { ok: false, error: { message: 'gateway.channelConnectDeferIds must be an array of up to 24 strings' } },\n 400,\n );\n }\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n config.gateway.channelConnectDeferIds = ids;\n }\n if (body.gateway?.channelConnectDeferSkipIds !== undefined) {\n const ids = parseDeferIdList(body.gateway.channelConnectDeferSkipIds);\n if (ids === null) {\n return c.json(\n {\n ok: false,\n error: { message: 'gateway.channelConnectDeferSkipIds must be an array of up to 24 strings' },\n },\n 400,\n );\n }\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n config.gateway.channelConnectDeferSkipIds = ids;\n }\n\n if (body.update !== undefined && typeof body.update === 'object' && body.update !== null) {\n const updateResult = mergeUpdateConfigPatch(config, body.update as Record<string, unknown>);\n if (updateResult.ok === false) {\n return c.json({ ok: false, error: { message: updateResult.message } }, 400);\n }\n }\n\n if (body.cron !== undefined) {\n if (typeof body.cron !== 'object' || body.cron === null || Array.isArray(body.cron)) {\n return c.json({ ok: false, error: { message: 'cron must be an object' } }, 400);\n }\n const cronResult = mergeCronConfigPatch(config, body.cron as Record<string, unknown>);\n if (cronResult.ok === false) {\n return c.json({ ok: false, error: { message: cronResult.message } }, 400);\n }\n }\n\n if (body.goals !== undefined) {\n if (typeof body.goals !== 'object' || body.goals === null || Array.isArray(body.goals)) {\n return c.json({ ok: false, error: { message: 'goals must be an object' } }, 400);\n }\n const goalsResult = mergeGoalsConfigPatch(config, body.goals as Record<string, unknown>);\n if (goalsResult.ok === false) {\n return c.json({ ok: false, error: { message: goalsResult.message } }, 400);\n }\n }\n\n if (body.session !== undefined) {\n if (typeof body.session !== 'object' || body.session === null || Array.isArray(body.session)) {\n return c.json({ ok: false, error: { message: 'session must be an object' } }, 400);\n }\n const sessionResult = mergeSessionConfigPatch(config, body.session as Record<string, unknown>);\n if (sessionResult.ok === false) {\n return c.json({ ok: false, error: { message: sessionResult.message } }, 400);\n }\n }\n\n if (\n body.gateway !== undefined &&\n typeof body.gateway === 'object' &&\n body.gateway !== null &&\n !Array.isArray(body.gateway)\n ) {\n const gwPatch = body.gateway as Record<string, unknown>;\n if (gwPatch.skillsMarketplaceProvider !== undefined || gwPatch.skillsStoreBaseUrl !== undefined) {\n const skillsResult = mergeGatewaySkillsMarketplacePatch(config, {\n ...(gwPatch.skillsMarketplaceProvider !== undefined\n ? { skillsMarketplaceProvider: gwPatch.skillsMarketplaceProvider }\n : {}),\n ...(gwPatch.skillsStoreBaseUrl !== undefined\n ? { skillsStoreBaseUrl: gwPatch.skillsStoreBaseUrl }\n : {}),\n });\n if (skillsResult.ok === false) {\n return c.json({ ok: false, error: { message: skillsResult.message } }, 400);\n }\n }\n }\n\n // Update providers config - save to credential system instead of config\n if (body.providers) {\n const resolver = new CredentialResolver();\n for (const [key, apiKey] of Object.entries(body.providers)) {\n if (\n apiKey !== undefined &&\n typeof apiKey === 'string' &&\n apiKey.trim() &&\n apiKey !== '***' &&\n apiKey !== '••••••••••••'\n ) {\n await resolver.saveApiKey(key, apiKey, { profileName: 'default' });\n }\n }\n }\n\n // Structured per-vendor provider config (cfg.providers.<id>) for capability\n // providers (image / audio / video). Distinct from `body.providers` above\n // which targets the LLM-side credential resolver.\n if (body.providersConfig && typeof body.providersConfig === 'object' && !Array.isArray(body.providersConfig)) {\n const cfgProviders = (config as { providers?: Record<string, Record<string, unknown>> }).providers ?? {};\n for (const [vendorId, raw] of Object.entries(body.providersConfig as Record<string, unknown>)) {\n if (!vendorId || typeof vendorId !== 'string') continue;\n if (raw === null) {\n delete cfgProviders[vendorId];\n continue;\n }\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) continue;\n const next = (cfgProviders[vendorId] ?? {}) as Record<string, unknown>;\n const patch = raw as Record<string, unknown>;\n for (const field of ['apiKey', 'baseUrl', 'region', 'imageBaseUrl'] as const) {\n if (patch[field] === null || patch[field] === '') {\n delete next[field];\n } else if (typeof patch[field] === 'string') {\n next[field] = (patch[field] as string).trim();\n }\n }\n if (patch.azure === null) {\n delete next.azure;\n } else if (patch.azure && typeof patch.azure === 'object' && !Array.isArray(patch.azure)) {\n next.azure = { ...(next.azure as Record<string, unknown> ?? {}), ...(patch.azure as Record<string, unknown>) };\n }\n if (patch.request === null) {\n delete next.request;\n } else if (patch.request && typeof patch.request === 'object' && !Array.isArray(patch.request)) {\n next.request = { ...(next.request as Record<string, unknown> ?? {}), ...(patch.request as Record<string, unknown>) };\n }\n cfgProviders[vendorId] = next;\n }\n (config as { providers?: Record<string, Record<string, unknown>> }).providers = cfgProviders;\n }\n\n // PATCH `stt` writes to tools.media.audio; PATCH `tts` writes to messages.tts.\n if (body.stt !== undefined) {\n config.tools = config.tools ?? {};\n config.tools.media = config.tools.media ?? {};\n (config.tools.media as Record<string, unknown>).audio = mergeSttConfigPatch(\n config.tools.media.audio,\n body.stt,\n );\n }\n if (body.tts !== undefined) {\n config.messages = config.messages ?? {};\n (config.messages as Record<string, unknown>).tts = mergeTtsConfigPatch(\n config.messages.tts,\n body.tts,\n );\n }\n\n const toolsPatchErr = applyToolsWebPatch(config, body as Record<string, unknown>);\n if (toolsPatchErr) {\n return c.json({ ok: false, error: { message: toolsPatchErr } }, 400);\n }\n\n if (body.tunnel !== undefined) {\n if (!body.tunnel || typeof body.tunnel !== 'object' || Array.isArray(body.tunnel)) {\n return c.json({ ok: false, error: { message: 'tunnel must be an object' } }, 400);\n }\n const tunnelResult = mergeTunnelConfigPatch(config, body.tunnel as Record<string, unknown>);\n if (tunnelResult.ok === false) {\n return c.json({ ok: false, error: { message: tunnelResult.message } }, 400);\n }\n }\n\n if (body.bindings !== undefined) {\n if (!Array.isArray(body.bindings)) {\n return c.json({ ok: false, error: { message: 'bindings must be an array' } }, 400);\n }\n const parsed = BindingsConfigSchema.safeParse(body.bindings);\n if (!parsed.success) {\n return c.json(\n { ok: false, error: { message: parsed.error.issues.map((i) => i.message).join('; ') } },\n 400,\n );\n }\n config.bindings = parsed.data;\n }\n\n if (body.mcp !== undefined) {\n if (body.mcp === null) {\n delete config.mcp;\n } else if (typeof body.mcp !== 'object' || Array.isArray(body.mcp)) {\n return c.json({ ok: false, error: { message: 'mcp must be an object' } }, 400);\n } else {\n const parsed = McpConfigSchema.safeParse(body.mcp);\n if (!parsed.success) {\n return c.json(\n {\n ok: false,\n error: { message: parsed.error.issues.map((i) => i.message).join('; ') },\n },\n 400,\n );\n }\n if (parsed.data === undefined) {\n delete config.mcp;\n } else {\n const next = { ...parsed.data };\n if (next.servers) {\n next.servers = Object.fromEntries(\n Object.entries(next.servers).map(([name, server]) => [\n name,\n canonicalizeConfiguredMcpServer(server as Record<string, unknown>),\n ]),\n );\n }\n config.mcp = next;\n }\n }\n }\n\n if (body.gateway !== undefined) {\n try {\n const auth = resolveGatewayAuth({ authConfig: config.gateway?.auth });\n assertGatewayAuthConfigured(auth);\n assertGatewayRuntimeConfig({\n cfg: config,\n auth,\n port: config.gateway?.port ?? 18790,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 400);\n }\n }\n\n // Save config\n const result = await service.saveConfig(config);\n if (!result.saved) {\n return c.json({ ok: false, error: result.error }, 500);\n }\n\n if (body.gateway?.heartbeat !== undefined && typeof body.gateway.heartbeat === 'object') {\n service.reloadHeartbeatFromCurrentConfig();\n }\n\n const safeConfig = await buildSafeWebConfigPayload(service);\n return c.json({ ok: true, payload: { config: safeConfig } });\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"config.js","names":[],"sources":["../../../../../src/gateway/hono/routes/config.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport type { Config } from '../../../config/schema.js';\nimport { buildSafeWebConfigPayload } from '../lib/config-payload.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n applyAgentsPatch,\n applyChannelsPatch,\n applyGatewayPatch,\n applyMiscPatch,\n validateGatewayAfterPatch,\n} from './config-patch/index.js';\n\nexport function registerConfigRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.post('/api/config/reload', strictRateLimitMiddleware, async (c) => {\n const result = await service.reloadConfig();\n return c.json({ ok: true, payload: result });\n });\n\n authenticated.post('/api/heartbeat/trigger', strictRateLimitMiddleware, async (c) => {\n let reason = 'manual';\n try {\n const body = await c.req.json();\n if (body && typeof body === 'object' && typeof (body as { reason?: unknown }).reason === 'string') {\n const r = (body as { reason: string }).reason.trim();\n if (r) reason = r.slice(0, 120);\n }\n } catch {\n /* empty or invalid body */\n }\n service.requestHeartbeatNow({ reason });\n return c.json({ ok: true, payload: { scheduled: true } });\n });\n\n authenticated.get('/api/config', async (c) => {\n const safeConfig = await buildSafeWebConfigPayload(service);\n return c.json({ ok: true, payload: { config: safeConfig } });\n });\n\n // PATCH /api/config — section patchers run sequentially against the live\n // config object (mutate-in-place is intentional: the route handler reads\n // `service.currentConfig` and rewrites it through `saveConfig`). Each\n // patcher only touches the keys it owns and returns `{ ok: false }` with a\n // 400 body when validation fails; we surface the first failure verbatim.\n authenticated.patch('/api/config', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json();\n const config: Config = service.currentConfig as Config;\n\n applyAgentsPatch(config, body);\n applyChannelsPatch(config, body);\n\n const gatewayResult = applyGatewayPatch(config, body);\n if (gatewayResult.ok === false) {\n return c.json({ ok: false, error: gatewayResult.error }, gatewayResult.status as 400 | 500);\n }\n\n const miscResult = await applyMiscPatch(config, body);\n if (miscResult.ok === false) {\n return c.json({ ok: false, error: miscResult.error }, miscResult.status as 400 | 500);\n }\n\n const finalGwCheck = validateGatewayAfterPatch(config, body);\n if (finalGwCheck.ok === false) {\n return c.json({ ok: false, error: finalGwCheck.error }, finalGwCheck.status as 400 | 500);\n }\n\n const result = await service.saveConfig(config);\n if (!result.saved) {\n return c.json({ ok: false, error: result.error }, 500);\n }\n\n if (body.gateway?.heartbeat !== undefined && typeof body.gateway.heartbeat === 'object') {\n service.reloadHeartbeatFromCurrentConfig();\n }\n\n const safeConfig = await buildSafeWebConfigPayload(service);\n return c.json({ ok: true, payload: { config: safeConfig } });\n });\n}\n"],"mappings":";;;;;;;AAaA,SAAgB,qBAAqB,eAAqB,MAAoC;CAC5F,MAAM,EAAE,SAAS,8BAA8B;AAE/C,eAAc,KAAK,sBAAsB,2BAA2B,OAAO,MAAM;EAC/E,MAAM,SAAS,MAAM,QAAQ,cAAc;AAC3C,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS;GAAQ,CAAC;GAC5C;AAEF,eAAc,KAAK,0BAA0B,2BAA2B,OAAO,MAAM;EACnF,IAAI,SAAS;AACb,MAAI;GACF,MAAM,OAAO,MAAM,EAAE,IAAI,MAAM;AAC/B,OAAI,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAA8B,WAAW,UAAU;IACjG,MAAM,IAAK,KAA4B,OAAO,MAAM;AACpD,QAAI,EAAG,UAAS,EAAE,MAAM,GAAG,IAAI;;UAE3B;AAGR,UAAQ,oBAAoB,EAAE,QAAQ,CAAC;AACvC,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,WAAW,MAAM;GAAE,CAAC;GACzD;AAEF,eAAc,IAAI,eAAe,OAAO,MAAM;EAC5C,MAAM,aAAa,MAAM,0BAA0B,QAAQ;AAC3D,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,QAAQ,YAAY;GAAE,CAAC;GAC5D;AAOF,eAAc,MAAM,eAAe,2BAA2B,OAAO,MAAM;EACzE,MAAM,OAAO,MAAM,EAAE,IAAI,MAAM;EAC/B,MAAM,SAAiB,QAAQ;AAE/B,mBAAiB,QAAQ,KAAK;AAC9B,qBAAmB,QAAQ,KAAK;EAEhC,MAAM,gBAAgB,kBAAkB,QAAQ,KAAK;AACrD,MAAI,cAAc,OAAO,MACvB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,cAAc;GAAO,EAAE,cAAc,OAAoB;EAG7F,MAAM,aAAa,MAAM,eAAe,QAAQ,KAAK;AACrD,MAAI,WAAW,OAAO,MACpB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,WAAW;GAAO,EAAE,WAAW,OAAoB;EAGvF,MAAM,eAAe,0BAA0B,QAAQ,KAAK;AAC5D,MAAI,aAAa,OAAO,MACtB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,aAAa;GAAO,EAAE,aAAa,OAAoB;EAG3F,MAAM,SAAS,MAAM,QAAQ,WAAW,OAAO;AAC/C,MAAI,CAAC,OAAO,MACV,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO,OAAO;GAAO,EAAE,IAAI;AAGxD,MAAI,KAAK,SAAS,cAAc,KAAA,KAAa,OAAO,KAAK,QAAQ,cAAc,SAC7E,SAAQ,kCAAkC;EAG5C,MAAM,aAAa,MAAM,0BAA0B,QAAQ;AAC3D,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,QAAQ,YAAY;GAAE,CAAC;GAC5D"}
@@ -1,14 +1,13 @@
1
- import { getWorkspacePath, init_schema } from "../../../config/schema.js";
2
1
  import { DREAMING_CRON_NAME, DREAMING_DIR_RELATIVE, DREAMING_LAST_RUN_RELATIVE, DREAMING_LIGHT_CRON_NAME, DREAMING_LIGHT_SWEEP_TOKEN, DREAMING_REM_CRON_NAME, DREAMING_REM_SWEEP_TOKEN, DREAMING_SWEEP_TOKEN, SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "../../../agent/memory/dreaming/constants.js";
3
2
  import { loadDreamingStore, saveDreamingStore } from "../../../agent/memory/dreaming/short-term-store.js";
4
3
  import { resolveDreamingConfig } from "../../../agent/memory/dreaming/config.js";
4
+ import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
5
5
  import { parseDreamingLastRunFile } from "../../../agent/memory/dreaming/last-run.js";
6
6
  import { readDreamingEvents } from "../../../agent/memory/dreaming/events.js";
7
7
  import { previewDreamingDeepPromotion } from "../../../agent/memory/dreaming/preview.js";
8
- import path from "node:path";
9
8
  import fs from "node:fs/promises";
9
+ import path from "node:path";
10
10
  //#region src/gateway/hono/routes/dreaming.ts
11
- init_schema();
12
11
  function isRecord(v) {
13
12
  return v !== null && typeof v === "object" && !Array.isArray(v);
14
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dreaming.js","names":[],"sources":["../../../../../src/gateway/hono/routes/dreaming.ts"],"sourcesContent":["import type { Hono } from 'hono';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { getWorkspacePath, type Config } from '../../../config/schema.js';\nimport { resolveDreamingConfig } from '../../../agent/memory/dreaming/config.js';\nimport {\n DREAMING_CRON_NAME,\n DREAMING_CRON_TAG,\n DREAMING_DIR_RELATIVE,\n DREAMING_LAST_RUN_RELATIVE,\n DREAMING_LIGHT_CRON_NAME,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_REM_CRON_NAME,\n DREAMING_REM_SWEEP_TOKEN,\n DREAMING_SWEEP_TOKEN,\n SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n SHORT_TERM_RECALL_STORE_RELATIVE,\n type DreamingPhaseId,\n} from '../../../agent/memory/dreaming/constants.js';\nimport { readDreamingEvents } from '../../../agent/memory/dreaming/events.js';\nimport { previewDreamingDeepPromotion } from '../../../agent/memory/dreaming/preview.js';\nimport { parseDreamingLastRunFile, type DreamingDeepLastRun } from '../../../agent/memory/dreaming/last-run.js';\nimport {\n loadDreamingStore,\n saveDreamingStore,\n type DreamingStore,\n} from '../../../agent/memory/dreaming/short-term-store.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nasync function readLockInfo(workspaceDir: string): Promise<\n | { locked: false }\n | { locked: true; path: string; content: string; mtimeMs?: number }\n> {\n const lockPath = path.join(workspaceDir, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n try {\n const [content, st] = await Promise.all([fs.readFile(lockPath, 'utf-8'), fs.stat(lockPath)]);\n return {\n locked: true,\n path: SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n content: content.trim(),\n mtimeMs: st.mtimeMs,\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { locked: false };\n return { locked: true, path: SHORT_TERM_PROMOTION_LOCK_RELATIVE, content: 'unknown', mtimeMs: undefined };\n }\n}\n\nasync function readLastRun(\n workspaceDir: string,\n): Promise<\n | { exists: false }\n | {\n exists: true;\n path: string;\n raw: unknown;\n record: DreamingDeepLastRun | null;\n parseError: string | null;\n }\n> {\n const fullPath = path.join(workspaceDir, DREAMING_LAST_RUN_RELATIVE);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n let raw: unknown;\n try {\n raw = JSON.parse(text) as unknown;\n } catch (parseErr) {\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: parseErr instanceof Error ? parseErr.message : String(parseErr),\n };\n }\n const record = parseDreamingLastRunFile(raw);\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw,\n record,\n parseError: record ? null : 'Invalid or unsupported last-run.json (expected v2 deep record).',\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nasync function readPhaseLastRun(\n workspaceDir: string,\n filename: string,\n): Promise<{ exists: false } | { exists: true; path: string; raw: unknown }> {\n const relPath = path.join(DREAMING_DIR_RELATIVE, filename);\n const fullPath = path.join(workspaceDir, relPath);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n const raw = JSON.parse(text) as unknown;\n return { exists: true, path: relPath, raw };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return { exists: false };\n }\n}\n\nfunction storeStats(store: DreamingStore): {\n version: number;\n updatedAt: string;\n entryCount: number;\n promotedCount: number;\n lastPromotedAt: string | null;\n} {\n const entries = Object.values(store.entries ?? {});\n const promoted = entries.filter((e) => typeof e.promotedAt === 'string' && e.promotedAt.trim());\n const lastPromotedAt = promoted\n .map((e) => e.promotedAt!)\n .sort((a, b) => (a < b ? 1 : a > b ? -1 : 0))[0];\n return {\n version: store.version,\n updatedAt: store.updatedAt,\n entryCount: entries.length,\n promotedCount: promoted.length,\n lastPromotedAt: lastPromotedAt ?? null,\n };\n}\n\nfunction payloadMessageFromJob(job: any): string {\n const p = job?.payload;\n if (!p) return '';\n if (p.kind === 'agentTurn' && typeof p.message === 'string') return p.message;\n if (typeof p.text === 'string') return p.text;\n if (typeof p.message === 'string') return p.message;\n return '';\n}\n\nexport function registerDreamingRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n authenticated.get('/api/dreaming', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n const resolved = resolveDreamingConfig(cfg);\n const { store } = await loadDreamingStore({ workspaceDir });\n const lock = await readLockInfo(workspaceDir);\n\n // Read all three phase last-run files in parallel.\n const [lastRun, lightLastRun, remLastRun] = await Promise.all([\n readLastRun(workspaceDir),\n readPhaseLastRun(workspaceDir, 'last-run-light.json'),\n readPhaseLastRun(workspaceDir, 'last-run-rem.json'),\n ]);\n\n return c.json({\n ok: true,\n payload: {\n workspaceDir,\n config: resolved,\n storePath: SHORT_TERM_RECALL_STORE_RELATIVE,\n store: storeStats(store),\n lock,\n lastRun,\n lightLastRun,\n remLastRun,\n },\n });\n });\n\n authenticated.get('/api/dreaming/preview', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n const resolved = resolveDreamingConfig(cfg);\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Number(rawLimit) : 20;\n\n const preview = await previewDreamingDeepPromotion({\n workspaceDir,\n config: resolved.deep,\n limit: Number.isFinite(limit) ? limit : 20,\n });\n\n return c.json({ ok: true, payload: preview });\n });\n\n authenticated.post('/api/dreaming/run', async (c) => {\n let body: unknown;\n try { body = await c.req.json(); } catch { body = {}; }\n const requestedPhase: DreamingPhaseId =\n isRecord(body) && typeof body.phase === 'string' && ['light', 'deep', 'rem'].includes(body.phase)\n ? (body.phase as DreamingPhaseId)\n : 'deep';\n\n // Map phase → token + cron name for job lookup.\n const phaseTokenMap: Record<DreamingPhaseId, { token: string; cronName: string }> = {\n light: { token: DREAMING_LIGHT_SWEEP_TOKEN, cronName: DREAMING_LIGHT_CRON_NAME },\n deep: { token: DREAMING_SWEEP_TOKEN, cronName: DREAMING_CRON_NAME },\n rem: { token: DREAMING_REM_SWEEP_TOKEN, cronName: DREAMING_REM_CRON_NAME },\n };\n const { token, cronName } = phaseTokenMap[requestedPhase];\n\n const jobs = await service.cronServiceInstance.listJobs();\n const primary =\n jobs.find((job) => payloadMessageFromJob(job) === token) ??\n jobs.find((job) => job.name === cronName) ??\n (requestedPhase === 'deep'\n ? jobs.find((job) => (job.name?.includes?.(DREAMING_CRON_TAG) ?? false))\n : undefined);\n\n if (!primary) {\n const dreaming = resolveDreamingConfig(service.currentConfig as Config);\n const phaseEnabled = dreaming.enabled && dreaming.phases[requestedPhase].enabled;\n const hint = phaseEnabled\n ? `Dreaming ${requestedPhase} phase is enabled, but no cron job was found yet. Restart the gateway/agent process so it can reconcile managed cron jobs.`\n : `Dreaming ${requestedPhase} phase is disabled in config. Enable it first.`;\n return c.json({ ok: false, error: { message: `Dreaming ${requestedPhase} cron job not found. ${hint}` } }, 404);\n }\n\n try {\n // Broadcast phase start to all SSE subscribers (drives dreaming animation overlay).\n service.emit('dreaming.phase.start', { phase: requestedPhase, timestamp: new Date().toISOString() });\n\n await service.cronServiceInstance.runJobNow(primary.id);\n\n // Broadcast phase end (the cron job runs async, so this only marks \"triggered\").\n service.emit('dreaming.phase.end', { phase: requestedPhase, ok: true, timestamp: new Date().toISOString() });\n\n return c.json({ ok: true, payload: { triggered: true, jobId: primary.id, phase: requestedPhase } });\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n service.emit('dreaming.phase.end', { phase: requestedPhase, ok: false, error: em, timestamp: new Date().toISOString() });\n return c.json({ ok: false, error: { message: em || 'Failed to trigger job' } }, 400);\n }\n });\n\n authenticated.post('/api/dreaming/action', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const action = isRecord(body) && typeof body.action === 'string' ? body.action.trim() : '';\n\n if (action !== 'reset_store' && action !== 'clear_lock') {\n return c.json({ ok: false, error: { message: 'Invalid action' } }, 400);\n }\n\n if (action === 'reset_store') {\n const nowIso = new Date().toISOString();\n const next: DreamingStore = { version: 1, updatedAt: nowIso, entries: {} };\n await saveDreamingStore({ workspaceDir, store: next });\n return c.json({ ok: true, payload: { reset: true, storePath: SHORT_TERM_RECALL_STORE_RELATIVE } });\n }\n\n const lockPath = path.join(workspaceDir, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n await fs.unlink(lockPath).catch(() => undefined);\n return c.json({ ok: true, payload: { cleared: true, lockPath: SHORT_TERM_PROMOTION_LOCK_RELATIVE } });\n });\n\n authenticated.get('/api/dreaming/events', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Math.min(Math.max(Number(rawLimit) || 50, 1), 200) : 50;\n\n const events = await readDreamingEvents(workspaceDir, limit);\n return c.json({ ok: true, payload: { events } });\n });\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"dreaming.js","names":[],"sources":["../../../../../src/gateway/hono/routes/dreaming.ts"],"sourcesContent":["import type { Hono } from 'hono';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { type Config } from '../../../config/schema.js';\nimport { getWorkspacePath } from '../../../config/workspace-path-helpers.js';\nimport { resolveDreamingConfig } from '../../../agent/memory/dreaming/config.js';\nimport {\n DREAMING_CRON_NAME,\n DREAMING_CRON_TAG,\n DREAMING_DIR_RELATIVE,\n DREAMING_LAST_RUN_RELATIVE,\n DREAMING_LIGHT_CRON_NAME,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_REM_CRON_NAME,\n DREAMING_REM_SWEEP_TOKEN,\n DREAMING_SWEEP_TOKEN,\n SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n SHORT_TERM_RECALL_STORE_RELATIVE,\n type DreamingPhaseId,\n} from '../../../agent/memory/dreaming/constants.js';\nimport { readDreamingEvents } from '../../../agent/memory/dreaming/events.js';\nimport { previewDreamingDeepPromotion } from '../../../agent/memory/dreaming/preview.js';\nimport { parseDreamingLastRunFile, type DreamingDeepLastRun } from '../../../agent/memory/dreaming/last-run.js';\nimport {\n loadDreamingStore,\n saveDreamingStore,\n type DreamingStore,\n} from '../../../agent/memory/dreaming/short-term-store.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nasync function readLockInfo(workspaceDir: string): Promise<\n | { locked: false }\n | { locked: true; path: string; content: string; mtimeMs?: number }\n> {\n const lockPath = path.join(workspaceDir, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n try {\n const [content, st] = await Promise.all([fs.readFile(lockPath, 'utf-8'), fs.stat(lockPath)]);\n return {\n locked: true,\n path: SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n content: content.trim(),\n mtimeMs: st.mtimeMs,\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { locked: false };\n return { locked: true, path: SHORT_TERM_PROMOTION_LOCK_RELATIVE, content: 'unknown', mtimeMs: undefined };\n }\n}\n\nasync function readLastRun(\n workspaceDir: string,\n): Promise<\n | { exists: false }\n | {\n exists: true;\n path: string;\n raw: unknown;\n record: DreamingDeepLastRun | null;\n parseError: string | null;\n }\n> {\n const fullPath = path.join(workspaceDir, DREAMING_LAST_RUN_RELATIVE);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n let raw: unknown;\n try {\n raw = JSON.parse(text) as unknown;\n } catch (parseErr) {\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: parseErr instanceof Error ? parseErr.message : String(parseErr),\n };\n }\n const record = parseDreamingLastRunFile(raw);\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw,\n record,\n parseError: record ? null : 'Invalid or unsupported last-run.json (expected v2 deep record).',\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nasync function readPhaseLastRun(\n workspaceDir: string,\n filename: string,\n): Promise<{ exists: false } | { exists: true; path: string; raw: unknown }> {\n const relPath = path.join(DREAMING_DIR_RELATIVE, filename);\n const fullPath = path.join(workspaceDir, relPath);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n const raw = JSON.parse(text) as unknown;\n return { exists: true, path: relPath, raw };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return { exists: false };\n }\n}\n\nfunction storeStats(store: DreamingStore): {\n version: number;\n updatedAt: string;\n entryCount: number;\n promotedCount: number;\n lastPromotedAt: string | null;\n} {\n const entries = Object.values(store.entries ?? {});\n const promoted = entries.filter((e) => typeof e.promotedAt === 'string' && e.promotedAt.trim());\n const lastPromotedAt = promoted\n .map((e) => e.promotedAt!)\n .sort((a, b) => (a < b ? 1 : a > b ? -1 : 0))[0];\n return {\n version: store.version,\n updatedAt: store.updatedAt,\n entryCount: entries.length,\n promotedCount: promoted.length,\n lastPromotedAt: lastPromotedAt ?? null,\n };\n}\n\nfunction payloadMessageFromJob(job: any): string {\n const p = job?.payload;\n if (!p) return '';\n if (p.kind === 'agentTurn' && typeof p.message === 'string') return p.message;\n if (typeof p.text === 'string') return p.text;\n if (typeof p.message === 'string') return p.message;\n return '';\n}\n\nexport function registerDreamingRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n authenticated.get('/api/dreaming', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n const resolved = resolveDreamingConfig(cfg);\n const { store } = await loadDreamingStore({ workspaceDir });\n const lock = await readLockInfo(workspaceDir);\n\n // Read all three phase last-run files in parallel.\n const [lastRun, lightLastRun, remLastRun] = await Promise.all([\n readLastRun(workspaceDir),\n readPhaseLastRun(workspaceDir, 'last-run-light.json'),\n readPhaseLastRun(workspaceDir, 'last-run-rem.json'),\n ]);\n\n return c.json({\n ok: true,\n payload: {\n workspaceDir,\n config: resolved,\n storePath: SHORT_TERM_RECALL_STORE_RELATIVE,\n store: storeStats(store),\n lock,\n lastRun,\n lightLastRun,\n remLastRun,\n },\n });\n });\n\n authenticated.get('/api/dreaming/preview', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n const resolved = resolveDreamingConfig(cfg);\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Number(rawLimit) : 20;\n\n const preview = await previewDreamingDeepPromotion({\n workspaceDir,\n config: resolved.deep,\n limit: Number.isFinite(limit) ? limit : 20,\n });\n\n return c.json({ ok: true, payload: preview });\n });\n\n authenticated.post('/api/dreaming/run', async (c) => {\n let body: unknown;\n try { body = await c.req.json(); } catch { body = {}; }\n const requestedPhase: DreamingPhaseId =\n isRecord(body) && typeof body.phase === 'string' && ['light', 'deep', 'rem'].includes(body.phase)\n ? (body.phase as DreamingPhaseId)\n : 'deep';\n\n // Map phase → token + cron name for job lookup.\n const phaseTokenMap: Record<DreamingPhaseId, { token: string; cronName: string }> = {\n light: { token: DREAMING_LIGHT_SWEEP_TOKEN, cronName: DREAMING_LIGHT_CRON_NAME },\n deep: { token: DREAMING_SWEEP_TOKEN, cronName: DREAMING_CRON_NAME },\n rem: { token: DREAMING_REM_SWEEP_TOKEN, cronName: DREAMING_REM_CRON_NAME },\n };\n const { token, cronName } = phaseTokenMap[requestedPhase];\n\n const jobs = await service.cronServiceInstance.listJobs();\n const primary =\n jobs.find((job) => payloadMessageFromJob(job) === token) ??\n jobs.find((job) => job.name === cronName) ??\n (requestedPhase === 'deep'\n ? jobs.find((job) => (job.name?.includes?.(DREAMING_CRON_TAG) ?? false))\n : undefined);\n\n if (!primary) {\n const dreaming = resolveDreamingConfig(service.currentConfig as Config);\n const phaseEnabled = dreaming.enabled && dreaming.phases[requestedPhase].enabled;\n const hint = phaseEnabled\n ? `Dreaming ${requestedPhase} phase is enabled, but no cron job was found yet. Restart the gateway/agent process so it can reconcile managed cron jobs.`\n : `Dreaming ${requestedPhase} phase is disabled in config. Enable it first.`;\n return c.json({ ok: false, error: { message: `Dreaming ${requestedPhase} cron job not found. ${hint}` } }, 404);\n }\n\n try {\n // Broadcast phase start to all SSE subscribers (drives dreaming animation overlay).\n service.emit('dreaming.phase.start', { phase: requestedPhase, timestamp: new Date().toISOString() });\n\n await service.cronServiceInstance.runJobNow(primary.id);\n\n // Broadcast phase end (the cron job runs async, so this only marks \"triggered\").\n service.emit('dreaming.phase.end', { phase: requestedPhase, ok: true, timestamp: new Date().toISOString() });\n\n return c.json({ ok: true, payload: { triggered: true, jobId: primary.id, phase: requestedPhase } });\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n service.emit('dreaming.phase.end', { phase: requestedPhase, ok: false, error: em, timestamp: new Date().toISOString() });\n return c.json({ ok: false, error: { message: em || 'Failed to trigger job' } }, 400);\n }\n });\n\n authenticated.post('/api/dreaming/action', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const action = isRecord(body) && typeof body.action === 'string' ? body.action.trim() : '';\n\n if (action !== 'reset_store' && action !== 'clear_lock') {\n return c.json({ ok: false, error: { message: 'Invalid action' } }, 400);\n }\n\n if (action === 'reset_store') {\n const nowIso = new Date().toISOString();\n const next: DreamingStore = { version: 1, updatedAt: nowIso, entries: {} };\n await saveDreamingStore({ workspaceDir, store: next });\n return c.json({ ok: true, payload: { reset: true, storePath: SHORT_TERM_RECALL_STORE_RELATIVE } });\n }\n\n const lockPath = path.join(workspaceDir, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n await fs.unlink(lockPath).catch(() => undefined);\n return c.json({ ok: true, payload: { cleared: true, lockPath: SHORT_TERM_PROMOTION_LOCK_RELATIVE } });\n });\n\n authenticated.get('/api/dreaming/events', async (c) => {\n const cfg = service.currentConfig as Config;\n const workspaceDir = getWorkspacePath(cfg);\n if (!workspaceDir) {\n return c.json({ ok: false, error: { message: 'Workspace not configured' } }, 400);\n }\n\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Math.min(Math.max(Number(rawLimit) || 50, 1), 200) : 50;\n\n const events = await readDreamingEvents(workspaceDir, limit);\n return c.json({ ok: true, payload: { events } });\n });\n}\n\n"],"mappings":"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"}
@@ -11,7 +11,8 @@ function createExposureMutationRateLimitMiddleware() {
11
11
  if (!token) return c.json({ error: "Gateway token required" }, 401);
12
12
  const result = consumeTunnelMutationLimit(token);
13
13
  if (!result.allowed) {
14
- c.header("Retry-After", String(Math.ceil(result.retryAfterMs / 1e3)));
14
+ const retryAfterSec = Math.ceil(result.retryAfterMs / 1e3);
15
+ c.header("Retry-After", String(retryAfterSec));
15
16
  return c.json({
16
17
  error: "Rate limit exceeded",
17
18
  retryAfterMs: result.retryAfterMs
@@ -1 +1 @@
1
- {"version":3,"file":"exposure.js","names":[],"sources":["../../../../../src/gateway/hono/routes/exposure.ts"],"sourcesContent":["import type { Hono, MiddlewareHandler } from 'hono';\n\nimport type { Config } from '../../../config/schema.js';\nimport { extractToken } from '../../auth.js';\nimport { getExposureManager } from '../../../remote-access/exposure-manager.js';\nimport type { GatewayTailscaleMode } from '../../server-tailscale.js';\nimport { consumeTunnelMutationLimit } from '../../../tunnel/tunnel-rate-limit.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction requireGatewayToken(c: { req: { header: (name: string) => string | undefined } }): string | null {\n return (\n extractToken({\n authorization: c.req.header('authorization') ?? undefined,\n }) ?? null\n );\n}\n\nfunction createExposureMutationRateLimitMiddleware(): MiddlewareHandler {\n return async (c, next) => {\n const token = requireGatewayToken(c);\n if (!token) {\n return c.json({ error: 'Gateway token required' }, 401);\n }\n const result = consumeTunnelMutationLimit(token);\n if (!result.allowed) {\n c.header('Retry-After', String(Math.ceil(result.retryAfterMs / 1000)));\n return c.json(\n { error: 'Rate limit exceeded', retryAfterMs: result.retryAfterMs },\n 429,\n );\n }\n return next();\n };\n}\n\nfunction resolveGatewayPort(config: Config): number {\n return config.gateway?.port ?? 18790;\n}\n\nexport function registerExposureRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const manager = getExposureManager();\n\n authenticated.get('/api/exposure/status', async (c) => {\n const status = await manager.getStatus(deps.service.currentConfig);\n return c.json(status);\n });\n\n const mutationLimit = createExposureMutationRateLimitMiddleware();\n\n authenticated.post('/api/exposure/tailscale/start', mutationLimit, async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as { mode?: GatewayTailscaleMode };\n const mode = body.mode === 'funnel' ? 'funnel' : 'serve';\n const config = deps.service.currentConfig;\n const port = resolveGatewayPort(config);\n try {\n await manager.startTailscale(config, port, mode);\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n return c.json({ error: em }, 400);\n }\n return c.json(await manager.getStatus(config));\n });\n\n authenticated.post('/api/exposure/tailscale/stop', mutationLimit, async (c) => {\n await manager.stopTailscale();\n return c.json(await manager.getStatus(deps.service.currentConfig));\n });\n}\n"],"mappings":";;;;AASA,SAAS,oBAAoB,GAA6E;AACxG,QACE,aAAa,EACX,eAAe,EAAE,IAAI,OAAO,gBAAgB,IAAI,KAAA,GACjD,CAAC,IAAI;;AAIV,SAAS,4CAA+D;AACtE,QAAO,OAAO,GAAG,SAAS;EACxB,MAAM,QAAQ,oBAAoB,EAAE;AACpC,MAAI,CAAC,MACH,QAAO,EAAE,KAAK,EAAE,OAAO,0BAA0B,EAAE,IAAI;EAEzD,MAAM,SAAS,2BAA2B,MAAM;AAChD,MAAI,CAAC,OAAO,SAAS;AACnB,KAAE,OAAO,eAAe,OAAO,KAAK,KAAK,OAAO,eAAe,IAAK,CAAC,CAAC;AACtE,UAAO,EAAE,KACP;IAAE,OAAO;IAAuB,cAAc,OAAO;IAAc,EACnE,IACD;;AAEH,SAAO,MAAM;;;AAIjB,SAAS,mBAAmB,QAAwB;AAClD,QAAO,OAAO,SAAS,QAAQ;;AAGjC,SAAgB,uBAAuB,eAAqB,MAAoC;CAC9F,MAAM,UAAU,oBAAoB;AAEpC,eAAc,IAAI,wBAAwB,OAAO,MAAM;EACrD,MAAM,SAAS,MAAM,QAAQ,UAAU,KAAK,QAAQ,cAAc;AAClE,SAAO,EAAE,KAAK,OAAO;GACrB;CAEF,MAAM,gBAAgB,2CAA2C;AAEjE,eAAc,KAAK,iCAAiC,eAAe,OAAO,MAAM;EAE9E,MAAM,QAAO,MADO,EAAE,IAAI,MAAM,CAAC,aAAa,EAAE,EAAE,EAChC,SAAS,WAAW,WAAW;EACjD,MAAM,SAAS,KAAK,QAAQ;EAC5B,MAAM,OAAO,mBAAmB,OAAO;AACvC,MAAI;AACF,SAAM,QAAQ,eAAe,QAAQ,MAAM,KAAK;WACzC,KAAK;GACZ,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC3D,UAAO,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,IAAI;;AAEnC,SAAO,EAAE,KAAK,MAAM,QAAQ,UAAU,OAAO,CAAC;GAC9C;AAEF,eAAc,KAAK,gCAAgC,eAAe,OAAO,MAAM;AAC7E,QAAM,QAAQ,eAAe;AAC7B,SAAO,EAAE,KAAK,MAAM,QAAQ,UAAU,KAAK,QAAQ,cAAc,CAAC;GAClE"}
1
+ {"version":3,"file":"exposure.js","names":[],"sources":["../../../../../src/gateway/hono/routes/exposure.ts"],"sourcesContent":["import type { Hono, MiddlewareHandler } from 'hono';\n\nimport type { Config } from '../../../config/schema.js';\nimport { extractToken } from '../../auth.js';\nimport { getExposureManager } from '../../../remote-access/exposure-manager.js';\nimport type { GatewayTailscaleMode } from '../../server-tailscale.js';\nimport { consumeTunnelMutationLimit } from '../../../tunnel/tunnel-rate-limit.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction requireGatewayToken(c: { req: { header: (name: string) => string | undefined } }): string | null {\n return (\n extractToken({\n authorization: c.req.header('authorization') ?? undefined,\n }) ?? null\n );\n}\n\nfunction createExposureMutationRateLimitMiddleware(): MiddlewareHandler {\n return async (c, next) => {\n const token = requireGatewayToken(c);\n if (!token) {\n return c.json({ error: 'Gateway token required' }, 401);\n }\n const result = consumeTunnelMutationLimit(token);\n if (!result.allowed) {\n const retryAfterSec = Math.ceil(result.retryAfterMs / 1000);\n c.header('Retry-After', String(retryAfterSec));\n return c.json(\n { error: 'Rate limit exceeded', retryAfterMs: result.retryAfterMs },\n 429,\n );\n }\n return next();\n };\n}\n\nfunction resolveGatewayPort(config: Config): number {\n return config.gateway?.port ?? 18790;\n}\n\nexport function registerExposureRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const manager = getExposureManager();\n\n authenticated.get('/api/exposure/status', async (c) => {\n const status = await manager.getStatus(deps.service.currentConfig);\n return c.json(status);\n });\n\n const mutationLimit = createExposureMutationRateLimitMiddleware();\n\n authenticated.post('/api/exposure/tailscale/start', mutationLimit, async (c) => {\n const body = (await c.req.json().catch(() => ({}))) as { mode?: GatewayTailscaleMode };\n const mode = body.mode === 'funnel' ? 'funnel' : 'serve';\n const config = deps.service.currentConfig;\n const port = resolveGatewayPort(config);\n try {\n await manager.startTailscale(config, port, mode);\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n return c.json({ error: em }, 400);\n }\n return c.json(await manager.getStatus(config));\n });\n\n authenticated.post('/api/exposure/tailscale/stop', mutationLimit, async (c) => {\n await manager.stopTailscale();\n return c.json(await manager.getStatus(deps.service.currentConfig));\n });\n}\n"],"mappings":";;;;AASA,SAAS,oBAAoB,GAA6E;AACxG,QACE,aAAa,EACX,eAAe,EAAE,IAAI,OAAO,gBAAgB,IAAI,KAAA,GACjD,CAAC,IAAI;;AAIV,SAAS,4CAA+D;AACtE,QAAO,OAAO,GAAG,SAAS;EACxB,MAAM,QAAQ,oBAAoB,EAAE;AACpC,MAAI,CAAC,MACH,QAAO,EAAE,KAAK,EAAE,OAAO,0BAA0B,EAAE,IAAI;EAEzD,MAAM,SAAS,2BAA2B,MAAM;AAChD,MAAI,CAAC,OAAO,SAAS;GACnB,MAAM,gBAAgB,KAAK,KAAK,OAAO,eAAe,IAAK;AAC3D,KAAE,OAAO,eAAe,OAAO,cAAc,CAAC;AAC9C,UAAO,EAAE,KACP;IAAE,OAAO;IAAuB,cAAc,OAAO;IAAc,EACnE,IACD;;AAEH,SAAO,MAAM;;;AAIjB,SAAS,mBAAmB,QAAwB;AAClD,QAAO,OAAO,SAAS,QAAQ;;AAGjC,SAAgB,uBAAuB,eAAqB,MAAoC;CAC9F,MAAM,UAAU,oBAAoB;AAEpC,eAAc,IAAI,wBAAwB,OAAO,MAAM;EACrD,MAAM,SAAS,MAAM,QAAQ,UAAU,KAAK,QAAQ,cAAc;AAClE,SAAO,EAAE,KAAK,OAAO;GACrB;CAEF,MAAM,gBAAgB,2CAA2C;AAEjE,eAAc,KAAK,iCAAiC,eAAe,OAAO,MAAM;EAE9E,MAAM,QAAO,MADO,EAAE,IAAI,MAAM,CAAC,aAAa,EAAE,EAAE,EAChC,SAAS,WAAW,WAAW;EACjD,MAAM,SAAS,KAAK,QAAQ;EAC5B,MAAM,OAAO,mBAAmB,OAAO;AACvC,MAAI;AACF,SAAM,QAAQ,eAAe,QAAQ,MAAM,KAAK;WACzC,KAAK;GACZ,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC3D,UAAO,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,IAAI;;AAEnC,SAAO,EAAE,KAAK,MAAM,QAAQ,UAAU,OAAO,CAAC;GAC9C;AAEF,eAAc,KAAK,gCAAgC,eAAe,OAAO,MAAM;AAC7E,QAAM,QAAQ,eAAe;AAC7B,SAAO,EAAE,KAAK,MAAM,QAAQ,UAAU,KAAK,QAAQ,cAAc,CAAC;GAClE"}
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../../../utils/logger/index.js";
2
2
  import { init_logger } from "../../../utils/logger.js";
3
+ import { readdir, realpath, stat } from "node:fs/promises";
3
4
  import * as path$1 from "node:path";
4
5
  import * as os$1 from "node:os";
5
- import { readdir, realpath, stat } from "node:fs/promises";
6
6
  //#region src/gateway/hono/routes/host-fs.ts
7
7
  init_logger();
8
8
  const log = createLogger("HostFs");
@@ -35,13 +35,17 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
35
35
  return { register: registerBrowserInstallRoutes };
36
36
  }
37
37
  },
38
+ {
39
+ id: "browser",
40
+ match: (path) => startsWithAny(path, ["/api/browser"]),
41
+ load: async () => {
42
+ const { registerBrowserRoutes } = await import("./browser.js");
43
+ return { register: registerBrowserRoutes };
44
+ }
45
+ },
38
46
  {
39
47
  id: "config",
40
- match: (path) => startsWithAny(path, [
41
- "/api/config",
42
- "/api/browser",
43
- "/api/heartbeat/trigger"
44
- ]),
48
+ match: (path) => startsWithAny(path, ["/api/config", "/api/heartbeat/trigger"]),
45
49
  load: async () => {
46
50
  const { registerConfigRoutes } = await import("./config.js");
47
51
  return { register: registerConfigRoutes };
@@ -89,6 +93,7 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
89
93
  id: "models",
90
94
  match: (path) => startsWithAny(path, [
91
95
  "/api/models",
96
+ "/api/models-json",
92
97
  "/api/providers",
93
98
  "/api/image"
94
99
  ]),