@xopcai/xopc 0.0.82 → 0.0.84

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 (740) hide show
  1. package/README.md +3 -1
  2. package/README.zh-CN.md +3 -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-tR-nNP04.js +222 -0
  23. package/dist/gateway/static/root/assets/{apps-page-pJ27dsqn.js → apps-page-BDw6SP-d.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-DEFd-jj1.js +1 -0
  25. package/dist/gateway/static/root/assets/{channels-status-swr-D1KYmOmi.js → channels-status-swr-DI5FHdGe.js} +1 -1
  26. package/dist/gateway/static/root/assets/{cron-api-Y2wfSJVI.js → cron-api-BSqY8LwW.js} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-page-B97KU_RG.js → cron-page-D7lVDjcR.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dist-CboA_Css.js → dist-CqNMNhJM.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-debug-page-DN_zNmpo.js → extension-debug-page-gf2L0kY_.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-BUXtOzv5.js → extension-page-CQo2Xsmg.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-C2dX4KCW.js → extension-settings-page-CZf0WoZg.js} +1 -1
  32. package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
  33. package/dist/gateway/static/root/assets/{field-primitives-B9rOLqdm.js → field-primitives-DTtlp-l8.js} +1 -1
  34. package/dist/gateway/static/root/assets/{heartbeat-config-api-DvfiRVrc.js → heartbeat-config-api-B0drdQEJ.js} +1 -1
  35. package/dist/gateway/static/root/assets/{index-DQuaMye9.js → index-0Gt3TG4j.js} +94 -85
  36. package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
  37. package/dist/gateway/static/root/assets/{logs-page-BQuBpHcc.js → logs-page-DMuORLfC.js} +1 -1
  38. package/dist/gateway/static/root/assets/sessions-page-_UO8g6NN.js +1 -0
  39. package/dist/gateway/static/root/assets/{settings-form-section-2Yu-FASs.js → settings-form-section-DkmHkknc.js} +1 -1
  40. package/dist/gateway/static/root/assets/settings-page-Cz8FoW_A.js +3 -0
  41. package/dist/gateway/static/root/assets/skills-page-HrUOxF7H.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-D2Gn2qod.js → utils-BFwcR6pL.js} +1 -1
  44. package/dist/gateway/static/root/assets/voice-api-key-field-JF8-aqc5.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 +122 -168
  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/command-catalog.js +110 -8
  271. package/dist/src/cli/command-catalog.js.map +1 -1
  272. package/dist/src/cli/command-loaders.js +2 -0
  273. package/dist/src/cli/command-loaders.js.map +1 -1
  274. package/dist/src/cli/command-manifest.js +9 -1
  275. package/dist/src/cli/command-manifest.js.map +1 -1
  276. package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
  277. package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
  278. package/dist/src/cli/commands/agent.js +4 -4
  279. package/dist/src/cli/commands/agent.js.map +1 -1
  280. package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
  281. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  282. package/dist/src/cli/commands/config.js +70 -19
  283. package/dist/src/cli/commands/config.js.map +1 -1
  284. package/dist/src/cli/commands/cron-cli.d.ts +2 -0
  285. package/dist/src/cli/commands/cron-cli.js +15 -0
  286. package/dist/src/cli/commands/cron-cli.js.map +1 -0
  287. package/dist/src/cli/commands/cron.d.ts +4 -1
  288. package/dist/src/cli/commands/cron.js +76 -41
  289. package/dist/src/cli/commands/cron.js.map +1 -1
  290. package/dist/src/cli/commands/doctor/checks/channel-config.js +1 -1
  291. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  292. package/dist/src/cli/commands/doctor/checks/config-health.js +2 -2
  293. package/dist/src/cli/commands/doctor/checks/config-health.js.map +1 -1
  294. package/dist/src/cli/commands/doctor/checks/cron-health.js +1 -1
  295. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -1
  296. package/dist/src/cli/commands/doctor/checks/gateway-health.js +2 -2
  297. package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +1 -1
  298. package/dist/src/cli/commands/doctor/checks/gateway-service.js +2 -2
  299. package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +1 -1
  300. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  301. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  302. package/dist/src/cli/commands/doctor/checks/state-integrity.js +2 -2
  303. package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +1 -1
  304. package/dist/src/cli/commands/doctor/checks/workspace-status.js +4 -4
  305. package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -1
  306. package/dist/src/cli/commands/extension-dev.js +2 -2
  307. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  308. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  309. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  310. package/dist/src/cli/commands/extension-pack.js +1 -1
  311. package/dist/src/cli/commands/gateway/call.js +1 -1
  312. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  313. package/dist/src/cli/commands/gateway/health.js +1 -1
  314. package/dist/src/cli/commands/gateway/health.js.map +1 -1
  315. package/dist/src/cli/commands/gateway/index.d.ts +1 -1
  316. package/dist/src/cli/commands/gateway/index.js +2 -2
  317. package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
  318. package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
  319. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  320. package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
  321. package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
  322. package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
  323. package/dist/src/cli/commands/gateway/logs.js +1 -1
  324. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  325. package/dist/src/cli/commands/gateway/probe.js +1 -1
  326. package/dist/src/cli/commands/gateway/probe.js.map +1 -1
  327. package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
  328. package/dist/src/cli/commands/gateway/restart-health.js +45 -1
  329. package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
  330. package/dist/src/cli/commands/gateway/restart.js +3 -3
  331. package/dist/src/cli/commands/gateway/restart.js.map +1 -1
  332. package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
  333. package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
  334. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  335. package/dist/src/cli/commands/gateway/service.d.ts +4 -0
  336. package/dist/src/cli/commands/gateway/service.js +18 -3
  337. package/dist/src/cli/commands/gateway/service.js.map +1 -1
  338. package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
  339. package/dist/src/cli/commands/gateway/shared.js +54 -0
  340. package/dist/src/cli/commands/gateway/shared.js.map +1 -0
  341. package/dist/src/cli/commands/gateway/status.js +1 -1
  342. package/dist/src/cli/commands/gateway/status.js.map +1 -1
  343. package/dist/src/cli/commands/gateway/stop.js +2 -2
  344. package/dist/src/cli/commands/gateway/stop.js.map +1 -1
  345. package/dist/src/cli/commands/gateway/subcommands.js +1 -4
  346. package/dist/src/cli/commands/gateway/subcommands.js.map +1 -1
  347. package/dist/src/cli/commands/gateway/token.js +1 -1
  348. package/dist/src/cli/commands/gateway/token.js.map +1 -1
  349. package/dist/src/cli/commands/gateway.js +5 -5
  350. package/dist/src/cli/commands/gateway.js.map +1 -1
  351. package/dist/src/cli/commands/image.js +2 -2
  352. package/dist/src/cli/commands/image.js.map +1 -1
  353. package/dist/src/cli/commands/init.js +31 -4
  354. package/dist/src/cli/commands/init.js.map +1 -1
  355. package/dist/src/cli/commands/models.d.ts +4 -1
  356. package/dist/src/cli/commands/models.js +87 -75
  357. package/dist/src/cli/commands/models.js.map +1 -1
  358. package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
  359. package/dist/src/cli/commands/onboard/gateway.js +48 -49
  360. package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
  361. package/dist/src/cli/commands/onboard.js +11 -64
  362. package/dist/src/cli/commands/onboard.js.map +1 -1
  363. package/dist/src/cli/commands/profile.d.ts +3 -5
  364. package/dist/src/cli/commands/profile.js +31 -31
  365. package/dist/src/cli/commands/profile.js.map +1 -1
  366. package/dist/src/cli/commands/session/utils.js +1 -1
  367. package/dist/src/cli/commands/session/utils.js.map +1 -1
  368. package/dist/src/cli/commands/setup.js +6 -1
  369. package/dist/src/cli/commands/setup.js.map +1 -1
  370. package/dist/src/cli/commands/skills.js +1 -1
  371. package/dist/src/cli/commands/tailscale.js +1 -1
  372. package/dist/src/cli/commands/tailscale.js.map +1 -1
  373. package/dist/src/cli/context.d.ts +20 -0
  374. package/dist/src/cli/context.js +23 -0
  375. package/dist/src/cli/context.js.map +1 -0
  376. package/dist/src/cli/extension-cli-register.js +3 -3
  377. package/dist/src/cli/gateway-run-argv.js +16 -9
  378. package/dist/src/cli/gateway-run-argv.js.map +1 -1
  379. package/dist/src/cli/gateway-run-fast-path.js +1 -1
  380. package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
  381. package/dist/src/cli/index.d.ts +1 -7
  382. package/dist/src/cli/index.js +4 -6
  383. package/dist/src/cli/index.js.map +1 -1
  384. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  385. package/dist/src/config/commands.flags.d.ts +3 -0
  386. package/dist/src/config/commands.flags.js +11 -0
  387. package/dist/src/config/commands.flags.js.map +1 -0
  388. package/dist/src/config/index.d.ts +1 -0
  389. package/dist/src/config/index.js +6 -5
  390. package/dist/src/config/index.js.map +1 -1
  391. package/dist/src/config/loader.js +2 -2
  392. package/dist/src/config/models-json.js +2 -2
  393. package/dist/src/config/profile.js +2 -2
  394. package/dist/src/config/schema.d.ts +11 -4
  395. package/dist/src/config/schema.js +13 -12
  396. package/dist/src/config/schema.js.map +1 -1
  397. package/dist/src/config/workspace-path-helpers.d.ts +15 -0
  398. package/dist/src/config/workspace-path-helpers.js +14 -0
  399. package/dist/src/config/workspace-path-helpers.js.map +1 -0
  400. package/dist/src/cron/executor.js +4 -4
  401. package/dist/src/cron/executor.js.map +1 -1
  402. package/dist/src/cron/persistence.js +1 -1
  403. package/dist/src/cron/run-log-store.js +1 -1
  404. package/dist/src/daemon/index.d.ts +0 -1
  405. package/dist/src/daemon/index.js +1 -2
  406. package/dist/src/daemon/install-plan.js +3 -2
  407. package/dist/src/daemon/install-plan.js.map +1 -1
  408. package/dist/src/daemon/launchd.js +2 -2
  409. package/dist/src/daemon/systemd.js +2 -2
  410. package/dist/src/daemon/types.d.ts +0 -6
  411. package/dist/src/extensions/api.d.ts +1 -1
  412. package/dist/src/extensions/api.js +2 -2
  413. package/dist/src/extensions/api.js.map +1 -1
  414. package/dist/src/extensions/bundle-mcp.js +1 -1
  415. package/dist/src/extensions/discover-extensions.js +1 -1
  416. package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
  417. package/dist/src/extensions/extension-registry-impl.js +117 -0
  418. package/dist/src/extensions/extension-registry-impl.js.map +1 -0
  419. package/dist/src/extensions/health.js +1 -1
  420. package/dist/src/extensions/index.js +3 -2
  421. package/dist/src/extensions/loader.d.ts +3 -43
  422. package/dist/src/extensions/loader.js +3 -110
  423. package/dist/src/extensions/loader.js.map +1 -1
  424. package/dist/src/extensions/lockfile.js +2 -2
  425. package/dist/src/extensions/sdk/index.js +2 -1
  426. package/dist/src/extensions/sdk/index.js.map +1 -1
  427. package/dist/src/extensions/types/events.d.ts +7 -1
  428. package/dist/src/gateway/agents-admin.js +2 -2
  429. package/dist/src/gateway/file-path-classifier.js +2 -2
  430. package/dist/src/gateway/heartbeat/service.js +1 -1
  431. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  432. package/dist/src/gateway/hono/app.js +5 -53
  433. package/dist/src/gateway/hono/app.js.map +1 -1
  434. package/dist/src/gateway/hono/lib/extension-store.js +1 -1
  435. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  436. package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
  437. package/dist/src/gateway/hono/middleware/auth.js +89 -126
  438. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  439. package/dist/src/gateway/hono/middleware/logger.js +1 -1
  440. package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
  441. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
  442. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
  443. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
  444. package/dist/src/gateway/hono/oauth.js +1 -1
  445. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
  446. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  447. package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
  448. package/dist/src/gateway/hono/routes/browser.js +626 -0
  449. package/dist/src/gateway/hono/routes/browser.js.map +1 -0
  450. package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
  451. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  452. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
  453. package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
  454. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
  455. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
  456. package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
  457. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
  458. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
  459. package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
  460. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
  461. package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
  462. package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
  463. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
  464. package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
  465. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
  466. package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
  467. package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
  468. package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
  469. package/dist/src/gateway/hono/routes/config.js +20 -1764
  470. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  471. package/dist/src/gateway/hono/routes/dreaming.js +2 -3
  472. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  473. package/dist/src/gateway/hono/routes/host-fs.js +1 -1
  474. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
  475. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  476. package/dist/src/gateway/hono/routes/mcp.js +1 -2
  477. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  478. package/dist/src/gateway/hono/routes/models.js +1 -1
  479. package/dist/src/gateway/hono/routes/sessions.js +32 -32
  480. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  481. package/dist/src/gateway/hono/routes/shares.js +4 -4
  482. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  483. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  484. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  485. package/dist/src/gateway/hono/routes/workspace.js +6 -7
  486. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  487. package/dist/src/gateway/hono/sse.js +2 -2
  488. package/dist/src/gateway/index.d.ts +1 -1
  489. package/dist/src/gateway/index.js +4 -2
  490. package/dist/src/gateway/lock.js +3 -3
  491. package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
  492. package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
  493. package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
  494. package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
  495. package/dist/src/gateway/rate-limit/buckets.js +143 -0
  496. package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
  497. package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
  498. package/dist/src/gateway/rate-limit/env-flags.js +16 -0
  499. package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
  500. package/dist/src/gateway/rate-limit/index.d.ts +3 -0
  501. package/dist/src/gateway/rate-limit/index.js +4 -0
  502. package/dist/src/gateway/run-loop.d.ts +1 -1
  503. package/dist/src/gateway/run-loop.js +24 -4
  504. package/dist/src/gateway/run-loop.js.map +1 -1
  505. package/dist/src/gateway/runtime-config.js +2 -1
  506. package/dist/src/gateway/runtime-config.js.map +1 -1
  507. package/dist/src/gateway/security/audit.js +2 -1
  508. package/dist/src/gateway/security/audit.js.map +1 -1
  509. package/dist/src/gateway/security/index.d.ts +0 -1
  510. package/dist/src/gateway/security/index.js +1 -2
  511. package/dist/src/gateway/security/loopback.d.ts +13 -0
  512. package/dist/src/gateway/security/loopback.js +45 -0
  513. package/dist/src/gateway/security/loopback.js.map +1 -0
  514. package/dist/src/gateway/service/agent-runner.d.ts +108 -0
  515. package/dist/src/gateway/service/agent-runner.js +184 -0
  516. package/dist/src/gateway/service/agent-runner.js.map +1 -0
  517. package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
  518. package/dist/src/gateway/service/config-coordinator.js +351 -0
  519. package/dist/src/gateway/service/config-coordinator.js.map +1 -0
  520. package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
  521. package/dist/src/gateway/service/marketplace-service.js +239 -0
  522. package/dist/src/gateway/service/marketplace-service.js.map +1 -0
  523. package/dist/src/gateway/service/run-gateway-agent.js +5 -5
  524. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  525. package/dist/src/gateway/service/sessions-api.d.ts +125 -0
  526. package/dist/src/gateway/service/sessions-api.js +135 -0
  527. package/dist/src/gateway/service/sessions-api.js.map +1 -0
  528. package/dist/src/gateway/service.d.ts +30 -360
  529. package/dist/src/gateway/service.js +122 -904
  530. package/dist/src/gateway/service.js.map +1 -1
  531. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  532. package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
  533. package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
  534. package/dist/src/infra/gateway-process-argv.d.ts +4 -0
  535. package/dist/src/infra/gateway-process-argv.js +26 -0
  536. package/dist/src/infra/gateway-process-argv.js.map +1 -0
  537. package/dist/src/infra/gateway-processes.d.ts +5 -0
  538. package/dist/src/infra/gateway-processes.js +65 -0
  539. package/dist/src/infra/gateway-processes.js.map +1 -0
  540. package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
  541. package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
  542. package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
  543. package/dist/src/infra/rate-limit/index.d.ts +5 -0
  544. package/dist/src/infra/rate-limit/index.js +3 -0
  545. package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
  546. package/dist/src/infra/rate-limit/keyed-store.js +44 -0
  547. package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
  548. package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
  549. package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
  550. package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
  551. package/dist/src/infra/restart.d.ts +21 -0
  552. package/dist/src/infra/restart.js +122 -0
  553. package/dist/src/infra/restart.js.map +1 -0
  554. package/dist/src/infra/update-check.js +1 -1
  555. package/dist/src/infra/update-lock.js +3 -3
  556. package/dist/src/infra/update-runner.js +1 -1
  557. package/dist/src/infra/update-startup.js +2 -2
  558. package/dist/src/infra/write-file-atomic.js +2 -2
  559. package/dist/src/mcp/channel-bridge.d.ts +0 -6
  560. package/dist/src/mcp/channel-bridge.js +1 -5
  561. package/dist/src/mcp/channel-bridge.js.map +1 -1
  562. package/dist/src/media-shared/http/ssrf-guard.js +1 -1
  563. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  564. package/dist/src/providers/index.js +2 -2
  565. package/dist/src/providers/model-registry.js +1 -1
  566. package/dist/src/session/config-store.js +2 -2
  567. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  568. package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
  569. package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
  570. package/dist/src/session/parity/sessions-json-file.js +1 -1
  571. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  572. package/dist/src/session/parity/transcript-paths.js +1 -1
  573. package/dist/src/session/search-index-cache.js +1 -1
  574. package/dist/src/session/search-index.js +1 -1
  575. package/dist/src/session/session-title.js +1 -1
  576. package/dist/src/session/store.js +5 -5
  577. package/dist/src/share/share-rate-limit.d.ts +10 -2
  578. package/dist/src/share/share-rate-limit.js +33 -42
  579. package/dist/src/share/share-rate-limit.js.map +1 -1
  580. package/dist/src/share/share-store.js +3 -3
  581. package/dist/src/tui/backends/embedded-backend.js +16 -12
  582. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  583. package/dist/src/tui/clipboard-image.js +2 -2
  584. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  585. package/dist/src/tui/format-tui-hotkeys.js +1 -1
  586. package/dist/src/tui/theme-manager.js +1 -1
  587. package/dist/src/tui/tui-keybindings-file.js +1 -1
  588. package/dist/src/tui/tui-scoped-models.js +1 -1
  589. package/dist/src/tui/tui-settings.js +1 -1
  590. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  591. package/dist/src/tui/tui.js +1 -2
  592. package/dist/src/tui/tui.js.map +1 -1
  593. package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
  594. package/dist/src/tui/xopc-tui-keybindings.js +1 -2
  595. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  596. package/dist/src/tunnel/frpc-binary.js +2 -2
  597. package/dist/src/tunnel/frpc-config.js +1 -1
  598. package/dist/src/tunnel/frpc-extract.js +1 -1
  599. package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
  600. package/dist/src/tunnel/pairing-rate-limit.js +19 -15
  601. package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
  602. package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
  603. package/dist/src/tunnel/tunnel-rate-limit.js +11 -22
  604. package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
  605. package/dist/src/tunnel/tunnel-state.js +1 -1
  606. package/dist/src/utils/logger/audit.js +1 -1
  607. package/dist/src/utils/logger/log-store.js +1 -1
  608. package/dist/src/utils/logger/rotation.js +1 -1
  609. package/dist/src/utils/logger/stats.d.ts +1 -1
  610. package/dist/src/voice/tts/audio.js +1 -1
  611. package/dist/src/voice/tts/factory.js +1 -1
  612. package/dist/src/voice/tts/index.js +2 -2
  613. package/dist/src/voice/tts/merge-config.js +1 -1
  614. package/dist/src/voice/tts/providers/edge-speech.js +1 -1
  615. package/dist/src/voice/tts/service.js +1 -1
  616. package/dist/src/voice/tts/service.js.map +1 -1
  617. package/dist/src/voice/tts/speak-core.js +1 -1
  618. package/package.json +10 -5
  619. package/dist/gateway/static/root/assets/agents-Cqh1ts38.js +0 -222
  620. package/dist/gateway/static/root/assets/channels-settings-wTiWStg9.js +0 -1
  621. package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
  622. package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
  623. package/dist/gateway/static/root/assets/sessions-page-BeiFm0Ms.js +0 -1
  624. package/dist/gateway/static/root/assets/settings-page-RPAz_Wg_.js +0 -3
  625. package/dist/gateway/static/root/assets/skills-page-Wu4aNWDx.js +0 -2
  626. package/dist/gateway/static/root/assets/voice-api-key-field-BxIGhhEL.js +0 -1
  627. package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
  628. package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
  629. package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
  630. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
  631. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
  632. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
  633. package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
  634. package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
  635. package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
  636. package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
  637. package/dist/src/daemon/launchd-restart-handoff.js +0 -132
  638. package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
  639. package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
  640. package/dist/src/gateway/auth-rate-limit.js +0 -192
  641. package/dist/src/gateway/auth-rate-limit.js.map +0 -1
  642. package/dist/src/gateway/restart-handler.d.ts +0 -14
  643. package/dist/src/gateway/restart-handler.js +0 -64
  644. package/dist/src/gateway/restart-handler.js.map +0 -1
  645. package/dist/src/gateway/security/flood-guard.d.ts +0 -28
  646. package/dist/src/gateway/security/flood-guard.js +0 -42
  647. package/dist/src/gateway/security/flood-guard.js.map +0 -1
  648. package/dist/src/infra/rate-limit.d.ts +0 -38
  649. package/dist/src/infra/rate-limit.js +0 -60
  650. package/dist/src/infra/rate-limit.js.map +0 -1
  651. package/dist/src/infra/restart-intent.d.ts +0 -13
  652. package/dist/src/infra/restart-intent.js +0 -40
  653. package/dist/src/infra/restart-intent.js.map +0 -1
  654. package/dist/src/infra/restart-sentinel.d.ts +0 -23
  655. package/dist/src/infra/restart-sentinel.js +0 -75
  656. package/dist/src/infra/restart-sentinel.js.map +0 -1
  657. package/skills/creative/canvas-design/LICENSE.txt +0 -202
  658. package/skills/creative/canvas-design/SKILL-zh.md +0 -130
  659. package/skills/creative/canvas-design/SKILL.md +0 -130
  660. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  661. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  662. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  663. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  664. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  665. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  666. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  667. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  668. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  669. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  670. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  671. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  672. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  673. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  674. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  675. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  676. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  677. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  678. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  679. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  680. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  681. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  682. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  683. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  684. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  685. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  686. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  687. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  688. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  689. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  690. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  691. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  692. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  693. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  694. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  695. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  696. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  697. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  698. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  699. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  700. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  701. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  702. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  703. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  704. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  705. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  706. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  707. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  708. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  709. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  710. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  711. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  712. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  713. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  714. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  715. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  716. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  717. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  718. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  719. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  720. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  721. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  722. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  723. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  724. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  725. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  726. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  727. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  728. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  729. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  730. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  731. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  732. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  733. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  734. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  735. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  736. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  737. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  738. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  739. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  740. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
@@ -1,639 +1,12 @@
1
- import { BindingsConfigSchema, McpConfigSchema, init_schema } from "../../../config/schema.js";
2
- import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
3
- import { canonicalizeConfiguredMcpServer } from "../../../config/mcp-config-normalize.js";
4
- import { isValidIPv4 } from "../../../config/gateway-bind.js";
5
- import { mergeCronConfigPatch, mergeGatewaySkillsMarketplacePatch, mergeGoalsConfigPatch, mergeSessionConfigPatch, mergeUpdateConfigPatch } from "../../../config/web-patch.js";
6
- import { assertGatewayAuthConfigured, resolveGatewayAuth } from "../../auth.js";
7
- import { applyToolsWebPatch } from "../../config-tools-web.js";
8
- import { mergeTunnelConfigPatch } from "../../../tunnel/tunnel-config.js";
9
- import { assertGatewayRuntimeConfig } from "../../runtime-config.js";
10
- import { mergeShareConfigPatch } from "../../../share/share-config.js";
11
- import { normalizePatchAgentImageGenerationModel, normalizePatchAgentModel } from "../lib/agent-model.js";
12
- import { mergeSttConfigPatch, mergeTtsConfigPatch } from "../lib/safe-voice-config.js";
13
1
  import { buildSafeWebConfigPayload } from "../lib/config-payload.js";
14
- import net from "node:net";
2
+ import { applyAgentsPatch } from "./config-patch/agents.js";
3
+ import { applyChannelsPatch } from "./config-patch/channels.js";
4
+ import { applyGatewayPatch } from "./config-patch/gateway.js";
5
+ import { applyMiscPatch, validateGatewayAfterPatch } from "./config-patch/misc.js";
6
+ import "./config-patch/index.js";
15
7
  //#region src/gateway/hono/routes/config.ts
16
- init_schema();
17
- init_credentials();
18
- const DEFAULT_EXTENSION_PORT = 19820;
19
- const DEFAULT_EXTENSION_HOST = "127.0.0.1";
20
- let manualExtensionHandle = null;
21
- function loopbackHostnameFromUrl(input) {
22
- let parsed;
23
- try {
24
- parsed = new URL(input);
25
- } catch {
26
- return null;
27
- }
28
- const proto = parsed.protocol;
29
- if (proto !== "ws:" && proto !== "wss:" && proto !== "http:" && proto !== "https:") return null;
30
- const host = parsed.hostname.toLowerCase();
31
- if (host === "127.0.0.1" || host === "localhost" || host === "::1") return host;
32
- return null;
33
- }
34
- function isLoopbackHost(host) {
35
- const h = host.trim().toLowerCase();
36
- return h === "127.0.0.1" || h === "localhost" || h === "::1" || h === "[::1]";
37
- }
38
- function parseExtensionProbePort(raw) {
39
- if (!raw) return void 0;
40
- const n = Number.parseInt(raw, 10);
41
- if (!Number.isFinite(n) || n < 1024 || n > 65535) return void 0;
42
- return n;
43
- }
44
- function isLoopbackPortOpen(host, port, timeoutMs = 500) {
45
- return new Promise((resolve) => {
46
- const socket = net.connect({
47
- host,
48
- port
49
- });
50
- const finish = (open) => {
51
- socket.removeAllListeners();
52
- try {
53
- socket.destroy();
54
- } catch {}
55
- resolve(open);
56
- };
57
- socket.setTimeout(timeoutMs);
58
- socket.once("connect", () => finish(true));
59
- socket.once("timeout", () => finish(false));
60
- socket.once("error", () => finish(false));
61
- });
62
- }
63
- async function readExtensionBridgeSnapshot() {
64
- const { getExtensionBrowserServerSnapshot } = await import("../../../browser/providers/extension-ws-acquire.js");
65
- return getExtensionBrowserServerSnapshot();
66
- }
67
- async function stopExtensionBridgeFromSettings(service) {
68
- if (manualExtensionHandle) {
69
- try {
70
- await manualExtensionHandle.release();
71
- } catch {}
72
- manualExtensionHandle = null;
73
- }
74
- await service.releaseBrowserExtensionBridge();
75
- const { forceShutdownExtensionBrowserServer } = await import("../../../browser/providers/extension-ws-acquire.js");
76
- return { forcedShutdown: await forceShutdownExtensionBrowserServer() };
77
- }
78
- function resolveExtensionStatusTarget(browser, query) {
79
- const backend = typeof browser?.backend === "string" ? browser.backend : "extension";
80
- const probe = query.probe === "1" || query.probe === "true";
81
- if (!probe && backend !== "extension") return null;
82
- const ext = browser?.extension;
83
- const configPort = typeof ext?.port === "number" && ext.port >= 1024 && ext.port <= 65535 ? Math.floor(ext.port) : DEFAULT_EXTENSION_PORT;
84
- const configHost = typeof ext?.host === "string" && ext.host.trim() ? ext.host.trim() : DEFAULT_EXTENSION_HOST;
85
- const port = parseExtensionProbePort(query.port) ?? configPort;
86
- const host = typeof query.host === "string" && query.host.trim() ? query.host.trim() : configHost;
87
- if (!isLoopbackHost(host)) return null;
88
- return {
89
- host,
90
- port,
91
- backend: probe && backend !== "extension" ? "extension" : backend
92
- };
93
- }
94
8
  function registerConfigRoutes(authenticated, deps) {
95
9
  const { service, strictRateLimitMiddleware } = deps;
96
- authenticated.get("/api/browser/extension-status", async (c) => {
97
- const browser = service.currentConfig?.agents?.defaults?.browser;
98
- const target = resolveExtensionStatusTarget(browser, {
99
- probe: c.req.query("probe"),
100
- host: c.req.query("host"),
101
- port: c.req.query("port")
102
- });
103
- let artifacts;
104
- try {
105
- const { browserExtDoctor } = await import("../../../browser/providers/browser-ext-install.js");
106
- const doctor = await browserExtDoctor();
107
- artifacts = {
108
- installed: doctor.installed,
109
- extensionDir: doctor.extensionDir,
110
- xopcVersion: doctor.xopcVersion,
111
- installedVersion: doctor.installedVersion,
112
- needsRefresh: doctor.needsRefresh,
113
- needsChromeReload: doctor.needsChromeReload
114
- };
115
- } catch {}
116
- if (!target) {
117
- const backend = typeof browser?.backend === "string" ? browser.backend : "extension";
118
- return c.json({
119
- running: false,
120
- connected: false,
121
- backend,
122
- artifacts
123
- });
124
- }
125
- const snapshot = await readExtensionBridgeSnapshot();
126
- let probeRunning = false;
127
- let probeConnected = false;
128
- try {
129
- const data = await (await fetch(`http://${target.host}:${target.port}/`, { signal: AbortSignal.timeout(2e3) })).json();
130
- probeRunning = Boolean(data.ok);
131
- probeConnected = Boolean(data.connected);
132
- } catch {}
133
- const running = probeRunning || snapshot.active;
134
- const portConflict = !running && !snapshot.active ? await isLoopbackPortOpen(target.host, target.port) : false;
135
- return c.json({
136
- running,
137
- connected: probeConnected,
138
- backend: target.backend,
139
- artifacts,
140
- bridgeHeld: snapshot.active,
141
- refCount: snapshot.refCount,
142
- manualBridge: manualExtensionHandle !== null,
143
- portConflict
144
- });
145
- });
146
- authenticated.get("/api/browser/extension/doctor", async (c) => {
147
- const cacheDirRaw = c.req.query("cacheDir");
148
- try {
149
- const { browserExtDoctor } = await import("../../../browser/providers/browser-ext-install.js");
150
- const status = await browserExtDoctor({ cacheDir: cacheDirRaw && cacheDirRaw.trim() ? cacheDirRaw.trim() : void 0 });
151
- return c.json({
152
- ok: true,
153
- payload: status
154
- });
155
- } catch (e) {
156
- const message = e instanceof Error ? e.message : String(e);
157
- return c.json({
158
- ok: false,
159
- error: message
160
- }, 400);
161
- }
162
- });
163
- authenticated.post("/api/browser/extension/install", strictRateLimitMiddleware, async (c) => {
164
- let body;
165
- try {
166
- body = await c.req.json();
167
- } catch {
168
- body = {};
169
- }
170
- const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
171
- const cacheDir = typeof input.cacheDir === "string" && input.cacheDir.trim() ? input.cacheDir.trim() : void 0;
172
- const force = input.force === true;
173
- try {
174
- const { ensureBrowserExtensionArtifacts, browserExtDoctor } = await import("../../../browser/providers/browser-ext-install.js");
175
- const result = await ensureBrowserExtensionArtifacts({
176
- cacheDir,
177
- force
178
- });
179
- const doctor = await browserExtDoctor({ cacheDir });
180
- return c.json({
181
- ok: true,
182
- payload: {
183
- ...result,
184
- doctor
185
- }
186
- });
187
- } catch (e) {
188
- const message = e instanceof Error ? e.message : String(e);
189
- return c.json({
190
- ok: false,
191
- error: message
192
- }, 500);
193
- }
194
- });
195
- authenticated.post("/api/browser/extension/open", strictRateLimitMiddleware, async (c) => {
196
- let body;
197
- try {
198
- body = await c.req.json();
199
- } catch {
200
- body = {};
201
- }
202
- const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
203
- const cacheDir = typeof input.cacheDir === "string" && input.cacheDir.trim() ? input.cacheDir.trim() : void 0;
204
- const actionRaw = typeof input.action === "string" ? input.action.trim() : "both";
205
- const action = actionRaw === "chrome" || actionRaw === "folder" || actionRaw === "both" ? actionRaw : "both";
206
- try {
207
- const { openBrowserExtensionInstallUi } = await import("../../../browser/providers/browser-ext-install.js");
208
- const result = await openBrowserExtensionInstallUi({
209
- action,
210
- cacheDir
211
- });
212
- return c.json({
213
- ok: true,
214
- payload: result
215
- });
216
- } catch (e) {
217
- const message = e instanceof Error ? e.message : String(e);
218
- return c.json({
219
- ok: false,
220
- error: message
221
- }, 500);
222
- }
223
- });
224
- authenticated.post("/api/browser/extension/start", strictRateLimitMiddleware, async (c) => {
225
- let body;
226
- try {
227
- body = await c.req.json();
228
- } catch {
229
- body = {};
230
- }
231
- const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
232
- const port = typeof input.port === "number" && input.port >= 1024 && input.port <= 65535 ? Math.floor(input.port) : DEFAULT_EXTENSION_PORT;
233
- const hostRaw = typeof input.host === "string" && input.host.trim() ? input.host.trim() : DEFAULT_EXTENSION_HOST;
234
- if (!isLoopbackHost(hostRaw)) return c.json({
235
- ok: false,
236
- error: "extension bridge host must be loopback"
237
- }, 400);
238
- try {
239
- if (manualExtensionHandle && (manualExtensionHandle.host !== hostRaw || manualExtensionHandle.port !== port)) {
240
- await manualExtensionHandle.release();
241
- manualExtensionHandle = null;
242
- }
243
- if (!manualExtensionHandle) {
244
- const { acquireExtensionBrowserServer } = await import("../../../browser/providers/extension-ws-acquire.js");
245
- const { release } = await acquireExtensionBrowserServer({
246
- host: hostRaw,
247
- port
248
- });
249
- manualExtensionHandle = {
250
- release,
251
- host: hostRaw,
252
- port
253
- };
254
- }
255
- return c.json({
256
- ok: true,
257
- payload: {
258
- running: true,
259
- host: hostRaw,
260
- port
261
- }
262
- });
263
- } catch (e) {
264
- return c.json({
265
- ok: false,
266
- error: e instanceof Error ? e.message : String(e)
267
- }, 500);
268
- }
269
- });
270
- authenticated.post("/api/browser/extension/stop", strictRateLimitMiddleware, async (c) => {
271
- try {
272
- const { forcedShutdown } = await stopExtensionBridgeFromSettings(service);
273
- return c.json({
274
- ok: true,
275
- payload: {
276
- running: false,
277
- forcedShutdown
278
- }
279
- });
280
- } catch (e) {
281
- return c.json({
282
- ok: false,
283
- error: e instanceof Error ? e.message : String(e)
284
- }, 500);
285
- }
286
- });
287
- authenticated.post("/api/browser/extension/disconnect", strictRateLimitMiddleware, async (c) => {
288
- try {
289
- const { getExtensionBrowserProvider } = await import("../../../browser/providers/extension-ws-acquire.js");
290
- const provider = getExtensionBrowserProvider();
291
- if (!provider?.isConnected()) return c.json({
292
- ok: true,
293
- payload: {
294
- connected: false,
295
- alreadyDisconnected: true
296
- }
297
- });
298
- provider.disconnectClient();
299
- return c.json({
300
- ok: true,
301
- payload: { connected: false }
302
- });
303
- } catch (e) {
304
- return c.json({
305
- ok: false,
306
- error: e instanceof Error ? e.message : String(e)
307
- }, 500);
308
- }
309
- });
310
- authenticated.get("/api/browser/playwright/doctor", async (c) => {
311
- try {
312
- const { playwrightChromiumDoctor } = await import("../../../browser/providers/playwright-doctor.js");
313
- const payload = await playwrightChromiumDoctor();
314
- return c.json({
315
- ok: true,
316
- payload
317
- });
318
- } catch (e) {
319
- return c.json({
320
- ok: false,
321
- error: e instanceof Error ? e.message : String(e)
322
- }, 500);
323
- }
324
- });
325
- authenticated.get("/api/browser/cloakbrowser/doctor", async (c) => {
326
- const cacheDirRaw = c.req.query("cacheDir");
327
- const binaryPathRaw = c.req.query("binaryPath");
328
- try {
329
- const { cloakBrowserDoctor } = await import("../../../browser/providers/cloakbrowser.js");
330
- const status = await cloakBrowserDoctor({
331
- cacheDir: cacheDirRaw && cacheDirRaw.trim() ? cacheDirRaw.trim() : void 0,
332
- binaryPath: binaryPathRaw && binaryPathRaw.trim() ? binaryPathRaw.trim() : void 0
333
- });
334
- return c.json({
335
- ok: true,
336
- payload: status
337
- });
338
- } catch (e) {
339
- const message = e instanceof Error ? e.message : String(e);
340
- return c.json({
341
- ok: false,
342
- error: message
343
- }, 400);
344
- }
345
- });
346
- authenticated.get("/api/browser/cloakbrowser/status", async (c) => {
347
- try {
348
- const { cloakBrowserConfigFromAgentDefaults } = await import("../../../browser/backend-from-config.js");
349
- const { probeCloakBrowserRuntime } = await import("../../../browser/providers/cloakbrowser.js");
350
- const status = await probeCloakBrowserRuntime(cloakBrowserConfigFromAgentDefaults(service.currentConfig));
351
- return c.json({
352
- ok: true,
353
- payload: status
354
- });
355
- } catch (e) {
356
- const message = e instanceof Error ? e.message : String(e);
357
- return c.json({
358
- ok: false,
359
- error: message
360
- }, 500);
361
- }
362
- });
363
- authenticated.post("/api/browser/cloakbrowser/launch", strictRateLimitMiddleware, async (c) => {
364
- try {
365
- const { cloakBrowserConfigFromAgentDefaults } = await import("../../../browser/backend-from-config.js");
366
- const { launchCloakBrowser } = await import("../../../browser/providers/cloakbrowser.js");
367
- const config = cloakBrowserConfigFromAgentDefaults(service.currentConfig);
368
- const result = await launchCloakBrowser({
369
- ...config,
370
- skipPlaywrightConnect: true
371
- });
372
- return c.json({
373
- ok: true,
374
- payload: {
375
- running: true,
376
- reused: result.reused,
377
- port: result.cdpPort,
378
- pid: result.pid,
379
- userDataDir: result.userDataDir,
380
- temporaryProfile: config.temporaryProfile === true
381
- }
382
- });
383
- } catch (e) {
384
- const message = e instanceof Error ? e.message : String(e);
385
- return c.json({
386
- ok: false,
387
- error: message
388
- }, 500);
389
- }
390
- });
391
- authenticated.post("/api/browser/cdp/ping", strictRateLimitMiddleware, async (c) => {
392
- let body;
393
- try {
394
- body = await c.req.json();
395
- } catch {
396
- return c.json({
397
- ok: false,
398
- error: "invalid JSON body"
399
- }, 400);
400
- }
401
- const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
402
- const cdpUrl = typeof input.cdpUrl === "string" ? input.cdpUrl.trim() : "";
403
- if (!cdpUrl) return c.json({
404
- ok: false,
405
- error: "cdpUrl is required"
406
- }, 400);
407
- if (!loopbackHostnameFromUrl(cdpUrl)) return c.json({
408
- ok: false,
409
- error: "CDP ping only allowed for loopback hosts (127.0.0.1 / localhost / ::1)"
410
- }, 403);
411
- let httpBase;
412
- try {
413
- httpBase = new URL(cdpUrl);
414
- httpBase.protocol = httpBase.protocol === "wss:" ? "https:" : "http:";
415
- httpBase.pathname = "/json/version";
416
- httpBase.search = "";
417
- httpBase.hash = "";
418
- } catch (e) {
419
- return c.json({
420
- ok: false,
421
- error: e instanceof Error ? e.message : "invalid cdpUrl"
422
- }, 400);
423
- }
424
- try {
425
- const res = await fetch(httpBase.toString(), { signal: AbortSignal.timeout(2e3) });
426
- if (!res.ok) return c.json({
427
- ok: true,
428
- payload: {
429
- reachable: false,
430
- status: res.status
431
- }
432
- });
433
- const data = await res.json();
434
- return c.json({
435
- ok: true,
436
- payload: {
437
- reachable: true,
438
- browser: data.Browser ?? null,
439
- protocolVersion: data["Protocol-Version"] ?? null,
440
- webSocketDebuggerUrl: data.webSocketDebuggerUrl ?? null
441
- }
442
- });
443
- } catch (e) {
444
- const message = e instanceof Error ? e.message : String(e);
445
- return c.json({
446
- ok: true,
447
- payload: {
448
- reachable: false,
449
- error: message
450
- }
451
- });
452
- }
453
- });
454
- authenticated.post("/api/browser/cdp/launch", strictRateLimitMiddleware, async (c) => {
455
- let body;
456
- try {
457
- body = await c.req.json();
458
- } catch {
459
- body = {};
460
- }
461
- const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
462
- const executablePath = typeof input.executablePath === "string" && input.executablePath.trim() ? input.executablePath.trim() : void 0;
463
- try {
464
- const { launchLocalCdpChrome } = await import("../../../browser/cdp-local-launcher.js");
465
- const result = await launchLocalCdpChrome({ executablePath });
466
- return c.json({
467
- ok: true,
468
- payload: result
469
- });
470
- } catch (e) {
471
- const message = e instanceof Error ? e.message : String(e);
472
- return c.json({
473
- ok: false,
474
- error: message
475
- }, 500);
476
- }
477
- });
478
- authenticated.post("/api/browser/cdp/stop", strictRateLimitMiddleware, async (c) => {
479
- let body;
480
- try {
481
- body = await c.req.json();
482
- } catch {
483
- return c.json({
484
- ok: false,
485
- error: "invalid JSON body"
486
- }, 400);
487
- }
488
- const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
489
- const port = typeof input.port === "number" && Number.isInteger(input.port) ? input.port : NaN;
490
- if (!Number.isFinite(port) || port < 1024 || port > 65535) return c.json({
491
- ok: false,
492
- error: "port must be an integer in [1024, 65535]"
493
- }, 400);
494
- const { stopLocalCdpChrome } = await import("../../../browser/cdp-local-launcher.js");
495
- const stopped = await stopLocalCdpChrome(port);
496
- return c.json({
497
- ok: true,
498
- payload: { stopped }
499
- });
500
- });
501
- authenticated.get("/api/browser/cdp/instances", async (c) => {
502
- const { listLocalCdpInstances } = await import("../../../browser/cdp-local-launcher.js");
503
- return c.json({
504
- ok: true,
505
- payload: { instances: listLocalCdpInstances() }
506
- });
507
- });
508
- authenticated.post("/api/browser/cloud/test-connection", strictRateLimitMiddleware, async (c) => {
509
- let body;
510
- try {
511
- body = await c.req.json();
512
- } catch {
513
- return c.json({
514
- ok: false,
515
- error: "invalid JSON body"
516
- }, 400);
517
- }
518
- const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
519
- const provider = input.provider;
520
- let apiKey = typeof input.apiKey === "string" ? input.apiKey.trim() : "";
521
- if (apiKey === "***" || apiKey === "••••••••••••") {
522
- const stored = service.currentConfig?.agents?.defaults?.browser?.cloud?.apiKey;
523
- apiKey = typeof stored === "string" ? stored.trim() : "";
524
- }
525
- if (!apiKey) {
526
- if (provider === "browserbase") apiKey = process.env.BROWSERBASE_API_KEY ?? "";
527
- else if (provider === "browser-use") apiKey = process.env.BROWSER_USE_API_KEY ?? "";
528
- }
529
- if (!apiKey) return c.json({
530
- ok: true,
531
- payload: {
532
- reachable: false,
533
- error: "No API key configured"
534
- }
535
- });
536
- try {
537
- if (provider === "browserbase") {
538
- const res = await fetch("https://api.browserbase.com/v1/projects", {
539
- headers: { "x-bb-api-key": apiKey },
540
- signal: AbortSignal.timeout(5e3)
541
- });
542
- if (!res.ok) return c.json({
543
- ok: true,
544
- payload: {
545
- reachable: false,
546
- status: res.status,
547
- error: await res.text().catch(() => "")
548
- }
549
- });
550
- const data = await res.json().catch(() => null);
551
- const projects = Array.isArray(data) ? data : Array.isArray(data?.data) ? data.data : [];
552
- return c.json({
553
- ok: true,
554
- payload: {
555
- reachable: true,
556
- projectCount: projects.length
557
- }
558
- });
559
- }
560
- if (provider === "browser-use") {
561
- const res = await fetch("https://api.browser-use.com/api/v1/users/me", {
562
- headers: { Authorization: `Bearer ${apiKey}` },
563
- signal: AbortSignal.timeout(5e3)
564
- });
565
- if (!res.ok) return c.json({
566
- ok: true,
567
- payload: {
568
- reachable: false,
569
- status: res.status,
570
- error: await res.text().catch(() => "")
571
- }
572
- });
573
- return c.json({
574
- ok: true,
575
- payload: { reachable: true }
576
- });
577
- }
578
- return c.json({
579
- ok: false,
580
- error: "provider must be browserbase or browser-use"
581
- }, 400);
582
- } catch (e) {
583
- const message = e instanceof Error ? e.message : String(e);
584
- return c.json({
585
- ok: true,
586
- payload: {
587
- reachable: false,
588
- error: message
589
- }
590
- });
591
- }
592
- });
593
- authenticated.post("/api/browser/playwright/install", strictRateLimitMiddleware, async (c) => {
594
- try {
595
- const { installPlaywrightChromium } = await import("../../../browser/providers/playwright-install.js");
596
- const payload = await installPlaywrightChromium();
597
- return c.json({
598
- ok: true,
599
- payload
600
- });
601
- } catch (e) {
602
- const message = e instanceof Error ? e.message : String(e);
603
- return c.json({
604
- ok: false,
605
- error: message || "Failed to install Playwright Chromium"
606
- }, 500);
607
- }
608
- });
609
- authenticated.post("/api/browser/cloakbrowser/install", strictRateLimitMiddleware, async (c) => {
610
- let body;
611
- try {
612
- body = await c.req.json();
613
- } catch {
614
- body = {};
615
- }
616
- const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
617
- const cacheDir = typeof input.cacheDir === "string" && input.cacheDir.trim() ? input.cacheDir.trim() : void 0;
618
- const binaryPath = typeof input.binaryPath === "string" && input.binaryPath.trim() ? input.binaryPath.trim() : void 0;
619
- try {
620
- const { installCloakBrowser } = await import("../../../browser/providers/cloakbrowser.js");
621
- const status = await installCloakBrowser({
622
- cacheDir,
623
- binaryPath
624
- });
625
- return c.json({
626
- ok: true,
627
- payload: status
628
- });
629
- } catch (e) {
630
- const message = e instanceof Error ? e.message : String(e);
631
- return c.json({
632
- ok: false,
633
- error: message
634
- }, 500);
635
- }
636
- });
637
10
  authenticated.post("/api/config/reload", strictRateLimitMiddleware, async (c) => {
638
11
  const result = await service.reloadConfig();
639
12
  return c.json({
@@ -666,1140 +39,23 @@ function registerConfigRoutes(authenticated, deps) {
666
39
  authenticated.patch("/api/config", strictRateLimitMiddleware, async (c) => {
667
40
  const body = await c.req.json();
668
41
  const config = service.currentConfig;
669
- if (body.agents?.defaults) {
670
- if (!config.agents) config.agents = { defaults: {
671
- workspace: "~/.xopc/workspace",
672
- model: "anthropic/claude-sonnet-4-5",
673
- maxTokens: 8192,
674
- temperature: .7,
675
- maxToolIterations: 20,
676
- maxRequestsPerTurn: 50,
677
- maxToolFailuresPerTurn: 3,
678
- thinkingDefault: "medium",
679
- reasoningDefault: "stream",
680
- verboseDefault: "full"
681
- } };
682
- if (!config.agents.defaults) config.agents.defaults = {};
683
- if (body.agents.defaults.model !== void 0) config.agents.defaults.model = normalizePatchAgentModel(body.agents.defaults.model);
684
- if (body.agents.defaults.maxTokens !== void 0) config.agents.defaults.maxTokens = body.agents.defaults.maxTokens;
685
- if (body.agents.defaults.temperature !== void 0) config.agents.defaults.temperature = body.agents.defaults.temperature;
686
- if (body.agents.defaults.maxToolIterations !== void 0) config.agents.defaults.maxToolIterations = body.agents.defaults.maxToolIterations;
687
- if (body.agents.defaults.workspace !== void 0) config.agents.defaults.workspace = body.agents.defaults.workspace;
688
- if (body.agents.defaults.thinkingDefault !== void 0) config.agents.defaults.thinkingDefault = body.agents.defaults.thinkingDefault;
689
- if (body.agents.defaults.reasoningDefault !== void 0) config.agents.defaults.reasoningDefault = body.agents.defaults.reasoningDefault;
690
- if (body.agents.defaults.verboseDefault !== void 0) config.agents.defaults.verboseDefault = body.agents.defaults.verboseDefault;
691
- if (body.agents.defaults.imageModel !== void 0) {
692
- const v = body.agents.defaults.imageModel;
693
- if (v === "" || v === null) delete config.agents.defaults.imageModel;
694
- else config.agents.defaults.imageModel = normalizePatchAgentModel(v);
695
- }
696
- if (body.agents.defaults.imageGenerationModel !== void 0) {
697
- const v = body.agents.defaults.imageGenerationModel;
698
- if (v === "" || v === null) delete config.agents.defaults.imageGenerationModel;
699
- else {
700
- const normalized = normalizePatchAgentImageGenerationModel(v);
701
- if (normalized === void 0) delete config.agents.defaults.imageGenerationModel;
702
- else config.agents.defaults.imageGenerationModel = normalized;
703
- }
704
- }
705
- if (body.agents.defaults.mediaMaxMb !== void 0) {
706
- const v = body.agents.defaults.mediaMaxMb;
707
- if (v === null) delete config.agents.defaults.mediaMaxMb;
708
- else {
709
- const n = typeof v === "number" ? v : Number(v);
710
- if (!Number.isNaN(n) && n > 0) config.agents.defaults.mediaMaxMb = n;
711
- }
712
- }
713
- if (body.agents.defaults.browser !== void 0) {
714
- const b = body.agents.defaults.browser;
715
- if (b === null) delete config.agents.defaults.browser;
716
- else if (typeof b === "object" && !Array.isArray(b)) {
717
- const br = b;
718
- if (!config.agents.defaults.browser) config.agents.defaults.browser = {
719
- enabled: false,
720
- headless: false
721
- };
722
- const target = config.agents.defaults.browser;
723
- if (br.enabled !== void 0) if (br.enabled === null) delete target.enabled;
724
- else target.enabled = Boolean(br.enabled);
725
- if (br.headless !== void 0) if (br.headless === null) delete target.headless;
726
- else target.headless = Boolean(br.headless);
727
- if (br.allowPrivateUrls !== void 0) if (br.allowPrivateUrls === null) delete target.allowPrivateUrls;
728
- else target.allowPrivateUrls = Boolean(br.allowPrivateUrls);
729
- if (br.commandTimeout !== void 0) {
730
- if (br.commandTimeout === null) delete target.commandTimeout;
731
- else if (typeof br.commandTimeout === "number" && Number.isFinite(br.commandTimeout)) {
732
- const n = Math.floor(br.commandTimeout);
733
- if (n >= 5 && n <= 900) target.commandTimeout = n;
734
- }
735
- }
736
- if (br.backend !== void 0) {
737
- if (br.backend === null || br.backend === "" || br.backend === "extension") delete target.backend;
738
- else if (br.backend === "local" || br.backend === "cdp" || br.backend === "cloud" || br.backend === "cloakbrowser") target.backend = br.backend;
739
- }
740
- if (br.cloudProvider !== void 0) {
741
- if (br.cloudProvider === null || br.cloudProvider === "") delete target.cloudProvider;
742
- else if (br.cloudProvider === "browserbase" || br.cloudProvider === "browser-use") target.cloudProvider = br.cloudProvider;
743
- }
744
- if (br.cloud !== void 0) {
745
- if (br.cloud === null) delete target.cloud;
746
- else if (typeof br.cloud === "object" && !Array.isArray(br.cloud)) {
747
- const cloudPatch = br.cloud;
748
- const cloudTarget = { ...target.cloud && typeof target.cloud === "object" && !Array.isArray(target.cloud) ? target.cloud : {} };
749
- if (cloudPatch.apiKey !== void 0) {
750
- if (cloudPatch.apiKey === null || cloudPatch.apiKey === "") delete cloudTarget.apiKey;
751
- else if (cloudPatch.apiKey === "***") {} else if (typeof cloudPatch.apiKey === "string") cloudTarget.apiKey = cloudPatch.apiKey.trim();
752
- }
753
- for (const key of ["projectId", "region"]) {
754
- const value = cloudPatch[key];
755
- if (value === null || value === "") delete cloudTarget[key];
756
- else if (typeof value === "string" && value.trim()) cloudTarget[key] = value.trim();
757
- }
758
- if (Object.keys(cloudTarget).length > 0) target.cloud = cloudTarget;
759
- else delete target.cloud;
760
- }
761
- }
762
- if (br.cdpUrl !== void 0) {
763
- if (br.cdpUrl === null || br.cdpUrl === "") delete target.cdpUrl;
764
- else if (typeof br.cdpUrl === "string") target.cdpUrl = br.cdpUrl.trim();
765
- }
766
- if (br.extension !== void 0) {
767
- if (br.extension === null) delete target.extension;
768
- else if (typeof br.extension === "object" && !Array.isArray(br.extension)) {
769
- const ext = br.extension;
770
- const extTarget = {};
771
- if (ext.port === null || ext.port === "") {} else if (typeof ext.port === "number" && ext.port >= 1024 && ext.port <= 65535) extTarget.port = Math.floor(ext.port);
772
- if (ext.host === null || ext.host === "") {} else if (typeof ext.host === "string" && ext.host.trim()) extTarget.host = ext.host.trim();
773
- if (ext.connectionTimeout === null || ext.connectionTimeout === "") {} else if (typeof ext.connectionTimeout === "number" && Number.isFinite(ext.connectionTimeout) && ext.connectionTimeout >= 1e3) extTarget.connectionTimeout = Math.floor(ext.connectionTimeout);
774
- if (Object.keys(extTarget).length > 0) target.extension = extTarget;
775
- else delete target.extension;
776
- }
777
- }
778
- if (br.cloakbrowser !== void 0) {
779
- if (br.cloakbrowser === null) delete target.cloakbrowser;
780
- else if (typeof br.cloakbrowser === "object" && !Array.isArray(br.cloakbrowser)) {
781
- const cloakbrowserPatch = br.cloakbrowser;
782
- const cloakbrowserTarget = {};
783
- if (typeof cloakbrowserPatch.keepOpen === "boolean") cloakbrowserTarget.keepOpen = cloakbrowserPatch.keepOpen;
784
- if (typeof cloakbrowserPatch.temporaryProfile === "boolean") cloakbrowserTarget.temporaryProfile = cloakbrowserPatch.temporaryProfile;
785
- for (const key of [
786
- "cacheDir",
787
- "binaryPath",
788
- "timezone",
789
- "locale",
790
- "webrtcIp",
791
- "fingerprintPlatform"
792
- ]) {
793
- const value = cloakbrowserPatch[key];
794
- if (typeof value === "string" && value.trim()) cloakbrowserTarget[key] = value.trim();
795
- }
796
- if (Array.isArray(cloakbrowserPatch.extraArgs) && cloakbrowserPatch.extraArgs.every((value) => typeof value === "string")) cloakbrowserTarget.extraArgs = cloakbrowserPatch.extraArgs;
797
- if (Object.keys(cloakbrowserTarget).length > 0) target.cloakbrowser = cloakbrowserTarget;
798
- else delete target.cloakbrowser;
799
- }
800
- }
801
- if (br.humanize !== void 0) if (br.humanize === null) delete target.humanize;
802
- else target.humanize = Boolean(br.humanize);
803
- if (br.humanPreset !== void 0) {
804
- if (br.humanPreset === null) delete target.humanPreset;
805
- else if (br.humanPreset === "default" || br.humanPreset === "careful") target.humanPreset = br.humanPreset;
806
- }
807
- if (br.dialogPolicy !== void 0) {
808
- if (br.dialogPolicy === null) delete target.dialogPolicy;
809
- else if (br.dialogPolicy === "must_respond" || br.dialogPolicy === "auto_dismiss" || br.dialogPolicy === "auto_accept") target.dialogPolicy = br.dialogPolicy;
810
- }
811
- if (br.dialogTimeoutSeconds !== void 0) {
812
- if (br.dialogTimeoutSeconds === null) delete target.dialogTimeoutSeconds;
813
- else if (typeof br.dialogTimeoutSeconds === "number" && Number.isFinite(br.dialogTimeoutSeconds)) {
814
- const n = Math.floor(br.dialogTimeoutSeconds);
815
- if (n >= 1 && n <= 86400) target.dialogTimeoutSeconds = n;
816
- }
817
- }
818
- }
819
- }
820
- const dPatch = body.agents.defaults;
821
- const def = config.agents.defaults;
822
- if (dPatch.maxTaskDurationMs !== void 0) {
823
- const v = dPatch.maxTaskDurationMs;
824
- if (v === null) delete def.maxTaskDurationMs;
825
- else if (typeof v === "number" && Number.isFinite(v)) {
826
- const ms = Math.floor(v);
827
- if (ms >= 6e4 && ms <= 144e5) def.maxTaskDurationMs = ms;
828
- }
829
- }
830
- if (dPatch.maxRequestsPerTurn !== void 0) {
831
- const v = dPatch.maxRequestsPerTurn;
832
- if (v === null) delete def.maxRequestsPerTurn;
833
- else if (typeof v === "number" && Number.isFinite(v)) {
834
- const n = Math.floor(v);
835
- if (n >= 10 && n <= 200) def.maxRequestsPerTurn = n;
836
- }
837
- }
838
- if (dPatch.maxToolFailuresPerTurn !== void 0) {
839
- const v = dPatch.maxToolFailuresPerTurn;
840
- if (v === null) delete def.maxToolFailuresPerTurn;
841
- else if (typeof v === "number" && Number.isFinite(v)) {
842
- const n = Math.floor(v);
843
- if (n >= 1 && n <= 20) def.maxToolFailuresPerTurn = n;
844
- }
845
- }
846
- if (dPatch.compaction !== void 0) {
847
- const c = dPatch.compaction;
848
- if (c === null) delete def.compaction;
849
- else if (typeof c === "object" && !Array.isArray(c)) {
850
- const p = c;
851
- if (!def.compaction || typeof def.compaction !== "object") def.compaction = {};
852
- const t = def.compaction;
853
- if (p.enabled !== void 0) t.enabled = Boolean(p.enabled);
854
- if (p.mode === "default" || p.mode === "safeguard") t.mode = p.mode;
855
- if (typeof p.reserveTokens === "number" && Number.isFinite(p.reserveTokens)) t.reserveTokens = Math.floor(p.reserveTokens);
856
- if (typeof p.triggerThreshold === "number" && Number.isFinite(p.triggerThreshold)) {
857
- const x = p.triggerThreshold;
858
- if (x >= .5 && x <= .95) t.triggerThreshold = x;
859
- }
860
- if (typeof p.minMessagesBeforeCompact === "number" && Number.isFinite(p.minMessagesBeforeCompact)) t.minMessagesBeforeCompact = Math.floor(p.minMessagesBeforeCompact);
861
- if (typeof p.keepRecentMessages === "number" && Number.isFinite(p.keepRecentMessages)) t.keepRecentMessages = Math.floor(p.keepRecentMessages);
862
- if (typeof p.evictionWindow === "number" && Number.isFinite(p.evictionWindow)) {
863
- const x = p.evictionWindow;
864
- if (x >= .1 && x <= .5) t.evictionWindow = x;
865
- }
866
- if (typeof p.retentionWindow === "number" && Number.isFinite(p.retentionWindow)) {
867
- const n = Math.floor(p.retentionWindow);
868
- if (n >= 3 && n <= 20) t.retentionWindow = n;
869
- }
870
- }
871
- }
872
- if (dPatch.pruning !== void 0) {
873
- const c = dPatch.pruning;
874
- if (c === null) delete def.pruning;
875
- else if (typeof c === "object" && !Array.isArray(c)) {
876
- const p = c;
877
- if (!def.pruning || typeof def.pruning !== "object") def.pruning = {};
878
- const t = def.pruning;
879
- if (p.enabled !== void 0) t.enabled = Boolean(p.enabled);
880
- if (typeof p.maxToolResultChars === "number" && Number.isFinite(p.maxToolResultChars)) t.maxToolResultChars = Math.floor(p.maxToolResultChars);
881
- if (typeof p.headKeepRatio === "number" && Number.isFinite(p.headKeepRatio)) t.headKeepRatio = p.headKeepRatio;
882
- if (typeof p.tailKeepRatio === "number" && Number.isFinite(p.tailKeepRatio)) t.tailKeepRatio = p.tailKeepRatio;
883
- }
884
- }
885
- if (dPatch.memory !== void 0) {
886
- const c = dPatch.memory;
887
- if (c === null) delete def.memory;
888
- else if (typeof c === "object" && !Array.isArray(c)) {
889
- const p = c;
890
- if (!def.memory || typeof def.memory !== "object") def.memory = {};
891
- const t = def.memory;
892
- if (p.enabled !== void 0) if (p.enabled === null) delete t.enabled;
893
- else t.enabled = Boolean(p.enabled);
894
- if (p.useEnhancedSystem !== void 0) if (p.useEnhancedSystem === null) delete t.useEnhancedSystem;
895
- else t.useEnhancedSystem = Boolean(p.useEnhancedSystem);
896
- if (p.userProfileEnabled !== void 0) if (p.userProfileEnabled === null) delete t.userProfileEnabled;
897
- else t.userProfileEnabled = Boolean(p.userProfileEnabled);
898
- if (p.memoryCharLimit !== void 0) {
899
- if (p.memoryCharLimit === null) delete t.memoryCharLimit;
900
- else if (typeof p.memoryCharLimit === "number" && p.memoryCharLimit > 0) t.memoryCharLimit = Math.floor(p.memoryCharLimit);
901
- }
902
- if (p.userCharLimit !== void 0) {
903
- if (p.userCharLimit === null) delete t.userCharLimit;
904
- else if (typeof p.userCharLimit === "number" && p.userCharLimit > 0) t.userCharLimit = Math.floor(p.userCharLimit);
905
- }
906
- if (p.provider === "none" || p.provider === "stub") t.provider = p.provider;
907
- else if (p.provider === null) delete t.provider;
908
- if (p.injectionFrequency === "every-turn" || p.injectionFrequency === "first-turn") t.injectionFrequency = p.injectionFrequency;
909
- else if (p.injectionFrequency === null) delete t.injectionFrequency;
910
- if (p.contextCadence !== void 0) {
911
- if (p.contextCadence === null) delete t.contextCadence;
912
- else if (typeof p.contextCadence === "number" && p.contextCadence >= 1) t.contextCadence = Math.floor(p.contextCadence);
913
- }
914
- if (p.dialecticCadence !== void 0) {
915
- if (p.dialecticCadence === null) delete t.dialecticCadence;
916
- else if (typeof p.dialecticCadence === "number" && p.dialecticCadence >= 1) t.dialecticCadence = Math.floor(p.dialecticCadence);
917
- }
918
- if (p.dreaming !== void 0) {
919
- const d0 = p.dreaming;
920
- if (d0 === null) delete t.dreaming;
921
- else if (typeof d0 === "object" && d0 !== null && !Array.isArray(d0)) {
922
- if (!("dreaming" in t) || typeof t.dreaming !== "object") t.dreaming = {};
923
- const dt = t.dreaming;
924
- const dp = d0;
925
- if (dp.enabled !== void 0) if (dp.enabled === null) delete dt.enabled;
926
- else dt.enabled = Boolean(dp.enabled);
927
- if (dp.frequency !== void 0) {
928
- const v = dp.frequency;
929
- if (v === null || v === "") delete dt.frequency;
930
- else if (typeof v === "string") dt.frequency = v;
931
- }
932
- if (dp.timezone !== void 0) {
933
- const v = dp.timezone;
934
- if (v === null || v === "") delete dt.timezone;
935
- else if (typeof v === "string") dt.timezone = v;
936
- }
937
- if (dp.phases !== void 0 || dp.deep !== void 0) {
938
- if (!("phases" in dt) || typeof dt.phases !== "object" || dt.phases === null) dt.phases = {};
939
- const phases = dt.phases;
940
- if (!("deep" in phases) || typeof phases.deep !== "object" || phases.deep === null) phases.deep = {};
941
- const deep = phases.deep;
942
- const deepPatchRaw = typeof dp.phases === "object" && dp.phases !== null && !Array.isArray(dp.phases) ? dp.phases.deep : dp.deep;
943
- const deepPatch = typeof deepPatchRaw === "object" && deepPatchRaw !== null && !Array.isArray(deepPatchRaw) ? deepPatchRaw : null;
944
- if (deepPatch) {
945
- if (deepPatch.enabled !== void 0) if (deepPatch.enabled === null) delete deep.enabled;
946
- else deep.enabled = Boolean(deepPatch.enabled);
947
- if (deepPatch.minScore !== void 0) {
948
- const v = deepPatch.minScore;
949
- if (v === null) delete deep.minScore;
950
- else if (typeof v === "number" && Number.isFinite(v)) deep.minScore = v;
951
- }
952
- if (deepPatch.minRecallCount !== void 0) {
953
- const v = deepPatch.minRecallCount;
954
- if (v === null) delete deep.minRecallCount;
955
- else if (typeof v === "number" && Number.isFinite(v)) deep.minRecallCount = Math.floor(v);
956
- }
957
- if (deepPatch.limit !== void 0) {
958
- const v = deepPatch.limit;
959
- if (v === null) delete deep.limit;
960
- else if (typeof v === "number" && Number.isFinite(v)) deep.limit = Math.floor(v);
961
- }
962
- }
963
- }
964
- }
965
- }
966
- }
967
- }
968
- if (dPatch.sessionSearch !== void 0) {
969
- const c = dPatch.sessionSearch;
970
- if (c === null) delete def.sessionSearch;
971
- else if (typeof c === "object" && !Array.isArray(c)) {
972
- const p = c;
973
- if (!def.sessionSearch || typeof def.sessionSearch !== "object") def.sessionSearch = {};
974
- const t = def.sessionSearch;
975
- if (p.summaryModel !== void 0) {
976
- if (p.summaryModel === null || p.summaryModel === "") delete t.summaryModel;
977
- else if (typeof p.summaryModel === "string") t.summaryModel = p.summaryModel;
978
- }
979
- }
980
- }
981
- if (dPatch.backgroundReview !== void 0) {
982
- const c = dPatch.backgroundReview;
983
- if (c === null) delete def.backgroundReview;
984
- else if (typeof c === "object" && !Array.isArray(c)) {
985
- const p = c;
986
- if (!def.backgroundReview || typeof def.backgroundReview !== "object") def.backgroundReview = {};
987
- const t = def.backgroundReview;
988
- if (p.enabled !== void 0) if (p.enabled === null) delete t.enabled;
989
- else t.enabled = Boolean(p.enabled);
990
- if (p.memoryNudgeInterval !== void 0) {
991
- if (p.memoryNudgeInterval === null) delete t.memoryNudgeInterval;
992
- else if (typeof p.memoryNudgeInterval === "number" && p.memoryNudgeInterval >= 0) t.memoryNudgeInterval = Math.floor(p.memoryNudgeInterval);
993
- }
994
- if (p.skillNudgeInterval !== void 0) {
995
- if (p.skillNudgeInterval === null) delete t.skillNudgeInterval;
996
- else if (typeof p.skillNudgeInterval === "number" && p.skillNudgeInterval >= 0) t.skillNudgeInterval = Math.floor(p.skillNudgeInterval);
997
- }
998
- if (p.maxToolRounds !== void 0) {
999
- if (p.maxToolRounds === null) delete t.maxToolRounds;
1000
- else if (typeof p.maxToolRounds === "number" && p.maxToolRounds >= 1 && p.maxToolRounds <= 32) t.maxToolRounds = Math.floor(p.maxToolRounds);
1001
- }
1002
- if (p.maxHistoryMessages !== void 0) {
1003
- if (p.maxHistoryMessages === null) delete t.maxHistoryMessages;
1004
- else if (typeof p.maxHistoryMessages === "number" && p.maxHistoryMessages >= 10 && p.maxHistoryMessages <= 200) t.maxHistoryMessages = Math.floor(p.maxHistoryMessages);
1005
- }
1006
- if (p.maxDurationMs !== void 0) {
1007
- if (p.maxDurationMs === null) delete t.maxDurationMs;
1008
- else if (typeof p.maxDurationMs === "number" && p.maxDurationMs >= 3e4 && p.maxDurationMs <= 6e5) t.maxDurationMs = Math.floor(p.maxDurationMs);
1009
- }
1010
- }
1011
- }
1012
- if (dPatch.webExtract !== void 0) {
1013
- const c = dPatch.webExtract;
1014
- if (c === null) delete def.webExtract;
1015
- else if (typeof c === "object" && !Array.isArray(c)) {
1016
- const p = c;
1017
- if (!def.webExtract || typeof def.webExtract !== "object") def.webExtract = {};
1018
- const t = def.webExtract;
1019
- if (p.model !== void 0) {
1020
- if (p.model === null || p.model === "") delete t.model;
1021
- else if (typeof p.model === "string") t.model = p.model;
1022
- }
1023
- if (p.maxLength !== void 0) {
1024
- if (p.maxLength === null) delete t.maxLength;
1025
- else if (typeof p.maxLength === "number" && p.maxLength > 0) t.maxLength = p.maxLength;
1026
- }
1027
- }
1028
- }
1029
- if (dPatch.delegate !== void 0) {
1030
- const c = dPatch.delegate;
1031
- if (c === null) delete def.delegate;
1032
- else if (typeof c === "object" && !Array.isArray(c)) {
1033
- const p = c;
1034
- if (!def.delegate || typeof def.delegate !== "object") def.delegate = {};
1035
- const t = def.delegate;
1036
- if (p.enabled !== void 0) if (p.enabled === null) delete t.enabled;
1037
- else t.enabled = Boolean(p.enabled);
1038
- }
1039
- }
1040
- if (dPatch.executeCode !== void 0) {
1041
- const c = dPatch.executeCode;
1042
- if (c === null) delete def.executeCode;
1043
- else if (typeof c === "object" && !Array.isArray(c)) {
1044
- const p = c;
1045
- if (!def.executeCode || typeof def.executeCode !== "object") def.executeCode = {};
1046
- const t = def.executeCode;
1047
- if (p.enabled !== void 0) if (p.enabled === null) delete t.enabled;
1048
- else t.enabled = Boolean(p.enabled);
1049
- }
1050
- }
1051
- if (dPatch.systemPromptOverride !== void 0) {
1052
- const v = dPatch.systemPromptOverride;
1053
- if (v === null || v === "") delete def.systemPromptOverride;
1054
- else if (typeof v === "string") def.systemPromptOverride = v;
1055
- }
1056
- if (dPatch.skills !== void 0) {
1057
- const v = dPatch.skills;
1058
- if (v === null) delete def.skills;
1059
- else if (Array.isArray(v) && v.every((x) => typeof x === "string")) def.skills = v;
1060
- }
1061
- if (dPatch.tools !== void 0) {
1062
- const t0 = dPatch.tools;
1063
- if (t0 === null) delete def.tools;
1064
- else if (typeof t0 === "object" && !Array.isArray(t0)) {
1065
- const p = t0;
1066
- if (!def.tools || typeof def.tools !== "object") def.tools = {};
1067
- const t = def.tools;
1068
- if (p.disable !== void 0) {
1069
- if (p.disable === null || Array.isArray(p.disable) && p.disable.length === 0) delete t.disable;
1070
- else if (Array.isArray(p.disable) && p.disable.every((x) => typeof x === "string")) t.disable = p.disable;
1071
- }
1072
- }
1073
- }
1074
- if (dPatch.params !== void 0) {
1075
- const v = dPatch.params;
1076
- if (v === null) delete def.params;
1077
- else if (typeof v === "object" && !Array.isArray(v) && v !== null) def.params = v;
1078
- }
1079
- }
1080
- const patchChannels = body.channels;
1081
- if (patchChannels != null && typeof patchChannels === "object" && !Array.isArray(patchChannels)) {
1082
- if ("telegram" in patchChannels) {
1083
- const tgRaw = patchChannels.telegram;
1084
- if (tgRaw === null) {
1085
- if (config.channels) delete config.channels.telegram;
1086
- } else if (typeof tgRaw === "object" && !Array.isArray(tgRaw)) {
1087
- const bodyTg = tgRaw;
1088
- if (!config.channels) config.channels = { telegram: {
1089
- enabled: false,
1090
- allowFrom: [],
1091
- groupAllowFrom: [],
1092
- debug: false,
1093
- accounts: { default: {
1094
- accountId: "default",
1095
- enabled: true,
1096
- botToken: "",
1097
- allowFrom: [],
1098
- dmPolicy: "pairing",
1099
- groupPolicy: "open",
1100
- replyToMode: "off",
1101
- historyLimit: 50,
1102
- textChunkLimit: 4e3,
1103
- streamMode: "partial"
1104
- } },
1105
- dmPolicy: "pairing",
1106
- groupPolicy: "open",
1107
- replyToMode: "off",
1108
- historyLimit: 50,
1109
- textChunkLimit: 4e3
1110
- } };
1111
- if (!config.channels.telegram) config.channels.telegram = {};
1112
- const tg = config.channels.telegram;
1113
- if (bodyTg.enabled !== void 0) tg.enabled = bodyTg.enabled;
1114
- if (bodyTg.botToken !== void 0) {
1115
- const accRaw = tg.accounts;
1116
- const acc = accRaw && typeof accRaw === "object" && !Array.isArray(accRaw) ? { ...accRaw } : {};
1117
- const defRaw = acc.default;
1118
- acc.default = {
1119
- ...defRaw && typeof defRaw === "object" && !Array.isArray(defRaw) ? { ...defRaw } : {},
1120
- accountId: "default",
1121
- botToken: bodyTg.botToken
1122
- };
1123
- tg.accounts = acc;
1124
- }
1125
- if (bodyTg.allowFrom !== void 0) tg.allowFrom = bodyTg.allowFrom;
1126
- if ("apiRoot" in bodyTg) {
1127
- const ar = bodyTg.apiRoot;
1128
- if (ar === null || ar === void 0 || typeof ar === "string" && !ar.trim()) delete tg.apiRoot;
1129
- else tg.apiRoot = String(ar).trim();
1130
- }
1131
- if (bodyTg.debug !== void 0) tg.debug = bodyTg.debug;
1132
- if (bodyTg.streamMode !== void 0) tg.streamMode = bodyTg.streamMode;
1133
- if ("groupAllowFrom" in bodyTg) {
1134
- const ga = bodyTg.groupAllowFrom;
1135
- if (ga === null || Array.isArray(ga) && ga.length === 0) delete tg.groupAllowFrom;
1136
- else tg.groupAllowFrom = ga;
1137
- }
1138
- if (bodyTg.dmPolicy !== void 0) tg.dmPolicy = bodyTg.dmPolicy;
1139
- if (bodyTg.groupPolicy !== void 0) tg.groupPolicy = bodyTg.groupPolicy;
1140
- if (bodyTg.replyToMode !== void 0) tg.replyToMode = bodyTg.replyToMode;
1141
- if (bodyTg.historyLimit !== void 0) tg.historyLimit = bodyTg.historyLimit;
1142
- if (bodyTg.textChunkLimit !== void 0) tg.textChunkLimit = bodyTg.textChunkLimit;
1143
- if ("proxy" in bodyTg) {
1144
- const pr = bodyTg.proxy;
1145
- if (pr === null || pr === void 0 || typeof pr === "string" && !pr.trim()) delete tg.proxy;
1146
- else tg.proxy = String(pr).trim();
1147
- }
1148
- if (bodyTg.accounts !== void 0) tg.accounts = bodyTg.accounts;
1149
- }
1150
- }
1151
- if ("weixin" in patchChannels) {
1152
- const wxRaw = patchChannels.weixin;
1153
- if (wxRaw === null) {
1154
- if (config.channels) delete config.channels.weixin;
1155
- } else if (typeof wxRaw === "object" && !Array.isArray(wxRaw)) {
1156
- const wx = wxRaw;
1157
- if (!config.channels) config.channels = {};
1158
- if (!config.channels.weixin) config.channels.weixin = {
1159
- enabled: false,
1160
- dmPolicy: "open",
1161
- allowFrom: [],
1162
- debug: false,
1163
- historyLimit: 50,
1164
- textChunkLimit: 4e3
1165
- };
1166
- const wxTarget = config.channels.weixin;
1167
- if (wx.enabled !== void 0) wxTarget.enabled = wx.enabled;
1168
- if (wx.dmPolicy !== void 0) wxTarget.dmPolicy = wx.dmPolicy;
1169
- if (wx.allowFrom !== void 0) wxTarget.allowFrom = wx.allowFrom;
1170
- if (wx.debug !== void 0) wxTarget.debug = wx.debug;
1171
- if (wx.streamMode !== void 0) wxTarget.streamMode = wx.streamMode;
1172
- if (wx.historyLimit !== void 0) wxTarget.historyLimit = wx.historyLimit;
1173
- if (wx.textChunkLimit !== void 0) wxTarget.textChunkLimit = wx.textChunkLimit;
1174
- if ("routeTag" in wx) {
1175
- const rt = wx.routeTag;
1176
- if (rt === null || rt === void 0 || rt === "") delete wxTarget.routeTag;
1177
- else wxTarget.routeTag = rt;
1178
- }
1179
- if (wx.accounts !== void 0) wxTarget.accounts = wx.accounts;
1180
- }
1181
- }
1182
- if ("feishu" in patchChannels) {
1183
- const fsRaw = patchChannels.feishu;
1184
- if (fsRaw === null) {
1185
- if (config.channels) delete config.channels.feishu;
1186
- } else if (typeof fsRaw === "object" && !Array.isArray(fsRaw)) {
1187
- const fs = fsRaw;
1188
- if (!config.channels) config.channels = {};
1189
- if (!config.channels.feishu) config.channels.feishu = {
1190
- enabled: false,
1191
- appId: "",
1192
- appSecret: "",
1193
- domain: "feishu",
1194
- connectionMode: "websocket",
1195
- dmPolicy: "open",
1196
- groupPolicy: "allowlist",
1197
- allowFrom: [],
1198
- groupAllowFrom: [],
1199
- requireMention: true,
1200
- historyLimit: 50,
1201
- textChunkLimit: 4e3,
1202
- accounts: {}
1203
- };
1204
- const fsTarget = config.channels.feishu;
1205
- if (fs.enabled !== void 0) fsTarget.enabled = fs.enabled;
1206
- if (fs.defaultAccount !== void 0) {
1207
- const da = fs.defaultAccount;
1208
- if (da === null || da === "") delete fsTarget.defaultAccount;
1209
- else fsTarget.defaultAccount = String(da);
1210
- }
1211
- if (fs.appId !== void 0) fsTarget.appId = fs.appId;
1212
- if ("appSecret" in fs) {
1213
- const v = fs.appSecret;
1214
- if (v === null || typeof v === "string" && !String(v).trim()) delete fsTarget.appSecret;
1215
- else fsTarget.appSecret = v;
1216
- }
1217
- if (fs.domain !== void 0) fsTarget.domain = fs.domain;
1218
- if (fs.connectionMode !== void 0) fsTarget.connectionMode = fs.connectionMode;
1219
- if (fs.verificationToken !== void 0) {
1220
- const v = fs.verificationToken;
1221
- if (v === null || typeof v === "string" && !String(v).trim()) delete fsTarget.verificationToken;
1222
- else fsTarget.verificationToken = v;
1223
- }
1224
- if (fs.encryptKey !== void 0) {
1225
- const v = fs.encryptKey;
1226
- if (v === null || typeof v === "string" && !String(v).trim()) delete fsTarget.encryptKey;
1227
- else fsTarget.encryptKey = v;
1228
- }
1229
- if (fs.webhookHost !== void 0) {
1230
- const v = fs.webhookHost;
1231
- if (v === null || typeof v === "string" && !String(v).trim()) delete fsTarget.webhookHost;
1232
- else fsTarget.webhookHost = v;
1233
- }
1234
- if (fs.webhookPort !== void 0) fsTarget.webhookPort = fs.webhookPort;
1235
- if (fs.webhookPath !== void 0) {
1236
- const v = fs.webhookPath;
1237
- if (v === null || typeof v === "string" && !String(v).trim()) delete fsTarget.webhookPath;
1238
- else fsTarget.webhookPath = v;
1239
- }
1240
- if (fs.dmPolicy !== void 0) fsTarget.dmPolicy = fs.dmPolicy;
1241
- if (fs.groupPolicy !== void 0) fsTarget.groupPolicy = fs.groupPolicy;
1242
- if (fs.allowFrom !== void 0) fsTarget.allowFrom = fs.allowFrom;
1243
- if (fs.groupAllowFrom !== void 0) {
1244
- const ga = fs.groupAllowFrom;
1245
- if (ga === null || Array.isArray(ga) && ga.length === 0) delete fsTarget.groupAllowFrom;
1246
- else fsTarget.groupAllowFrom = ga;
1247
- }
1248
- if (fs.requireMention !== void 0) fsTarget.requireMention = fs.requireMention;
1249
- if (fs.historyLimit !== void 0) fsTarget.historyLimit = fs.historyLimit;
1250
- if (fs.textChunkLimit !== void 0) fsTarget.textChunkLimit = fs.textChunkLimit;
1251
- if (fs.renderMode !== void 0) fsTarget.renderMode = fs.renderMode;
1252
- if (fs.streaming !== void 0) fsTarget.streaming = fs.streaming;
1253
- if (fs.reactionNotifications !== void 0) fsTarget.reactionNotifications = fs.reactionNotifications;
1254
- if (fs.tools !== void 0) fsTarget.tools = fs.tools;
1255
- if (fs.actions !== void 0) fsTarget.actions = fs.actions;
1256
- if (fs.accounts !== void 0) fsTarget.accounts = fs.accounts;
1257
- }
1258
- }
1259
- }
1260
- if (body.gateway?.heartbeat !== void 0 && typeof body.gateway.heartbeat === "object") {
1261
- if (!config.gateway) config.gateway = {
1262
- bind: "loopback",
1263
- port: 18790,
1264
- heartbeat: {
1265
- enabled: true,
1266
- intervalMs: 18e5,
1267
- includeSystemPromptSection: false
1268
- },
1269
- maxSseConnections: 100,
1270
- corsOrigins: ["*"]
1271
- };
1272
- if (!config.gateway.heartbeat) config.gateway.heartbeat = {
1273
- enabled: true,
1274
- intervalMs: 18e5,
1275
- includeSystemPromptSection: false
1276
- };
1277
- const h = config.gateway.heartbeat;
1278
- const p = body.gateway.heartbeat;
1279
- if (p.enabled !== void 0) h.enabled = Boolean(p.enabled);
1280
- if (p.intervalMs !== void 0 && typeof p.intervalMs === "number" && Number.isFinite(p.intervalMs)) h.intervalMs = p.intervalMs;
1281
- if (p.includeSystemPromptSection !== void 0) h.includeSystemPromptSection = Boolean(p.includeSystemPromptSection);
1282
- if (p.target !== void 0) if (p.target === null || p.target === "") delete h.target;
1283
- else h.target = String(p.target);
1284
- if (p.targetChatId !== void 0) if (p.targetChatId === null || p.targetChatId === "") delete h.targetChatId;
1285
- else h.targetChatId = String(p.targetChatId);
1286
- if (p.prompt !== void 0) if (p.prompt === null || p.prompt === "") delete h.prompt;
1287
- else h.prompt = String(p.prompt);
1288
- if (p.ackMaxChars !== void 0) {
1289
- if (p.ackMaxChars === null || p.ackMaxChars === "") delete h.ackMaxChars;
1290
- else if (typeof p.ackMaxChars === "number" && Number.isFinite(p.ackMaxChars)) h.ackMaxChars = p.ackMaxChars;
1291
- }
1292
- if (p.isolatedSession !== void 0) if (p.isolatedSession === null || p.isolatedSession === false) delete h.isolatedSession;
1293
- else h.isolatedSession = Boolean(p.isolatedSession);
1294
- if (p.activeHours !== void 0) {
1295
- if (p.activeHours === null) delete h.activeHours;
1296
- else if (typeof p.activeHours === "object" && p.activeHours !== null) {
1297
- const ah = p.activeHours;
1298
- const start = typeof ah.start === "string" ? ah.start : "";
1299
- const end = typeof ah.end === "string" ? ah.end : "";
1300
- if (start && end) h.activeHours = {
1301
- start,
1302
- end,
1303
- ...typeof ah.timezone === "string" && ah.timezone.trim() ? { timezone: ah.timezone } : {}
1304
- };
1305
- else delete h.activeHours;
1306
- }
1307
- }
1308
- }
1309
- if (body.gateway?.bind !== void 0) {
1310
- const bindModes = new Set([
1311
- "auto",
1312
- "loopback",
1313
- "lan",
1314
- "tailnet",
1315
- "custom"
1316
- ]);
1317
- const bind = body.gateway.bind;
1318
- if (typeof bind !== "string" || !bindModes.has(bind)) return c.json({
1319
- ok: false,
1320
- error: { message: "gateway.bind must be one of: auto, loopback, lan, tailnet, custom" }
1321
- }, 400);
1322
- if (!config.gateway) config.gateway = {
1323
- bind,
1324
- port: 18790,
1325
- heartbeat: {
1326
- enabled: true,
1327
- intervalMs: 18e5,
1328
- includeSystemPromptSection: false
1329
- },
1330
- maxSseConnections: 100,
1331
- corsOrigins: []
1332
- };
1333
- else config.gateway.bind = bind;
1334
- if (bind !== "custom") delete config.gateway.customBindHost;
1335
- }
1336
- if (body.gateway?.customBindHost !== void 0) {
1337
- if (body.gateway.customBindHost === null || body.gateway.customBindHost === "") {
1338
- if (config.gateway) delete config.gateway.customBindHost;
1339
- } else if (typeof body.gateway.customBindHost !== "string" || !isValidIPv4(body.gateway.customBindHost.trim())) return c.json({
1340
- ok: false,
1341
- error: { message: "gateway.customBindHost must be a valid IPv4 address" }
1342
- }, 400);
1343
- else if (config.gateway) {
1344
- config.gateway.customBindHost = body.gateway.customBindHost.trim();
1345
- config.gateway.bind = "custom";
1346
- }
1347
- }
1348
- if (body.gateway?.port !== void 0) {
1349
- if (typeof body.gateway.port !== "number" || !Number.isFinite(body.gateway.port) || body.gateway.port < 1 || body.gateway.port > 65535) return c.json({
1350
- ok: false,
1351
- error: { message: "gateway.port must be an integer from 1 to 65535" }
1352
- }, 400);
1353
- if (!config.gateway) config.gateway = {
1354
- bind: "loopback",
1355
- port: Math.floor(body.gateway.port),
1356
- heartbeat: {
1357
- enabled: true,
1358
- intervalMs: 18e5,
1359
- includeSystemPromptSection: false
1360
- },
1361
- maxSseConnections: 100,
1362
- corsOrigins: []
1363
- };
1364
- else config.gateway.port = Math.floor(body.gateway.port);
1365
- }
1366
- if (body.gateway?.tailscale !== void 0 && typeof body.gateway.tailscale === "object") {
1367
- const ts = body.gateway.tailscale;
1368
- if (!config.gateway) config.gateway = {
1369
- bind: "loopback",
1370
- port: 18790,
1371
- auth: { mode: "token" },
1372
- heartbeat: {
1373
- enabled: true,
1374
- intervalMs: 18e5,
1375
- includeSystemPromptSection: false
1376
- },
1377
- maxSseConnections: 100,
1378
- corsOrigins: []
1379
- };
1380
- config.gateway.tailscale = { ...config.gateway.tailscale ?? {
1381
- mode: "off",
1382
- resetOnExit: true
1383
- } };
1384
- if (ts.mode !== void 0) {
1385
- if (ts.mode !== "off" && ts.mode !== "serve" && ts.mode !== "funnel") return c.json({
1386
- ok: false,
1387
- error: { message: "gateway.tailscale.mode must be off, serve, or funnel" }
1388
- }, 400);
1389
- config.gateway.tailscale.mode = ts.mode;
1390
- }
1391
- if (ts.resetOnExit !== void 0) config.gateway.tailscale.resetOnExit = ts.resetOnExit === true;
1392
- }
1393
- if (body.gateway?.auth !== void 0) {
1394
- if (!config.gateway) config.gateway = {
1395
- bind: "loopback",
1396
- port: 18790,
1397
- heartbeat: {
1398
- enabled: true,
1399
- intervalMs: 18e5,
1400
- includeSystemPromptSection: false
1401
- },
1402
- maxSseConnections: 100,
1403
- corsOrigins: []
1404
- };
1405
- if (!config.gateway.auth) config.gateway.auth = { mode: "token" };
1406
- const a = body.gateway.auth;
1407
- if (a.mode !== void 0) {
1408
- if (a.mode !== "none" && a.mode !== "token" && a.mode !== "password" && a.mode !== "trusted-proxy") return c.json({
1409
- ok: false,
1410
- error: { message: "gateway.auth.mode must be none, token, password, or trusted-proxy" }
1411
- }, 400);
1412
- config.gateway.auth.mode = a.mode;
1413
- }
1414
- if (a.token !== void 0) {
1415
- if (a.token === null || typeof a.token === "string" && !a.token.trim()) delete config.gateway.auth.token;
1416
- else if (typeof a.token === "string") config.gateway.auth.token = a.token;
1417
- }
1418
- if (a.password !== void 0) {
1419
- if (a.password === null || typeof a.password === "string" && !a.password.trim()) delete config.gateway.auth.password;
1420
- else if (typeof a.password === "string" && a.password !== "***" && a.password !== "••••••••••••") config.gateway.auth.password = a.password;
1421
- }
1422
- if (a.rateLimit !== void 0 && typeof a.rateLimit === "object" && a.rateLimit !== null) {
1423
- const rlIn = a.rateLimit;
1424
- if (!config.gateway.auth.rateLimit) config.gateway.auth.rateLimit = {
1425
- enabled: true,
1426
- maxAttempts: 5,
1427
- windowMs: 9e5,
1428
- blockDurationMs: 3e5,
1429
- exemptLoopback: true
1430
- };
1431
- const rl = config.gateway.auth.rateLimit;
1432
- if (rlIn.enabled !== void 0) rl.enabled = Boolean(rlIn.enabled);
1433
- if (typeof rlIn.maxAttempts === "number" && Number.isFinite(rlIn.maxAttempts)) rl.maxAttempts = Math.max(1, Math.floor(rlIn.maxAttempts));
1434
- if (typeof rlIn.windowMs === "number" && Number.isFinite(rlIn.windowMs) && rlIn.windowMs > 0) rl.windowMs = Math.floor(rlIn.windowMs);
1435
- if (typeof rlIn.blockDurationMs === "number" && Number.isFinite(rlIn.blockDurationMs) && rlIn.blockDurationMs > 0) rl.blockDurationMs = Math.floor(rlIn.blockDurationMs);
1436
- if (typeof rlIn.lockoutMs === "number" && Number.isFinite(rlIn.lockoutMs) && rlIn.lockoutMs > 0) rl.blockDurationMs = Math.floor(rlIn.lockoutMs);
1437
- if (rlIn.exemptLoopback !== void 0) rl.exemptLoopback = Boolean(rlIn.exemptLoopback);
1438
- }
1439
- if (a.trustedProxy !== void 0) {
1440
- if (a.trustedProxy === null) delete config.gateway.auth.trustedProxy;
1441
- else if (typeof a.trustedProxy === "object" && a.trustedProxy !== null) {
1442
- const tpIn = a.trustedProxy;
1443
- const userHeader = typeof tpIn.userHeader === "string" ? tpIn.userHeader.trim() : "";
1444
- if (!userHeader) return c.json({
1445
- ok: false,
1446
- error: { message: "gateway.auth.trustedProxy.userHeader is required" }
1447
- }, 400);
1448
- const trustedProxy = { userHeader };
1449
- if (tpIn.requiredHeaders !== void 0) {
1450
- if (!Array.isArray(tpIn.requiredHeaders)) return c.json({
1451
- ok: false,
1452
- error: { message: "gateway.auth.trustedProxy.requiredHeaders must be an array" }
1453
- }, 400);
1454
- trustedProxy.requiredHeaders = tpIn.requiredHeaders.filter((x) => typeof x === "string" && x.trim().length > 0).map((x) => x.trim());
1455
- }
1456
- if (tpIn.allowUsers !== void 0) {
1457
- if (!Array.isArray(tpIn.allowUsers)) return c.json({
1458
- ok: false,
1459
- error: { message: "gateway.auth.trustedProxy.allowUsers must be an array" }
1460
- }, 400);
1461
- trustedProxy.allowUsers = tpIn.allowUsers.filter((x) => typeof x === "string" && x.trim().length > 0).map((x) => x.trim());
1462
- }
1463
- if (tpIn.allowLoopback !== void 0) trustedProxy.allowLoopback = Boolean(tpIn.allowLoopback);
1464
- config.gateway.auth.trustedProxy = trustedProxy;
1465
- }
1466
- }
1467
- }
1468
- if (body.gateway?.trustedProxies !== void 0) {
1469
- if (!Array.isArray(body.gateway.trustedProxies)) return c.json({
1470
- ok: false,
1471
- error: { message: "gateway.trustedProxies must be an array" }
1472
- }, 400);
1473
- if (!config.gateway) config.gateway = {
1474
- bind: "loopback",
1475
- port: 18790,
1476
- heartbeat: {
1477
- enabled: true,
1478
- intervalMs: 18e5,
1479
- includeSystemPromptSection: false
1480
- },
1481
- maxSseConnections: 100,
1482
- corsOrigins: []
1483
- };
1484
- config.gateway.trustedProxies = body.gateway.trustedProxies.filter((x) => typeof x === "string" && x.trim().length > 0).map((x) => x.trim());
1485
- }
1486
- if (body.gateway?.allowRealIpFallback !== void 0) {
1487
- if (!config.gateway) config.gateway = {
1488
- bind: "loopback",
1489
- port: 18790,
1490
- heartbeat: {
1491
- enabled: true,
1492
- intervalMs: 18e5,
1493
- includeSystemPromptSection: false
1494
- },
1495
- maxSseConnections: 100,
1496
- corsOrigins: []
1497
- };
1498
- config.gateway.allowRealIpFallback = Boolean(body.gateway.allowRealIpFallback);
1499
- }
1500
- if (body.gateway?.dangerouslyAllowHostHeaderOriginFallback !== void 0) {
1501
- if (!config.gateway) config.gateway = {
1502
- bind: "loopback",
1503
- port: 18790,
1504
- heartbeat: {
1505
- enabled: true,
1506
- intervalMs: 18e5,
1507
- includeSystemPromptSection: false
1508
- },
1509
- maxSseConnections: 100,
1510
- corsOrigins: []
1511
- };
1512
- config.gateway.dangerouslyAllowHostHeaderOriginFallback = Boolean(body.gateway.dangerouslyAllowHostHeaderOriginFallback);
1513
- }
1514
- if (body.gateway?.security !== void 0) {
1515
- if (typeof body.gateway.security !== "object" || body.gateway.security === null) return c.json({
1516
- ok: false,
1517
- error: { message: "gateway.security must be an object" }
1518
- }, 400);
1519
- if (!config.gateway) config.gateway = {
1520
- bind: "loopback",
1521
- port: 18790,
1522
- heartbeat: {
1523
- enabled: true,
1524
- intervalMs: 18e5,
1525
- includeSystemPromptSection: false
1526
- },
1527
- maxSseConnections: 100,
1528
- corsOrigins: []
1529
- };
1530
- const secIn = body.gateway.security;
1531
- if (!config.gateway.security) config.gateway.security = {};
1532
- if (secIn.strict !== void 0) config.gateway.security.strict = Boolean(secIn.strict);
1533
- }
1534
- if (body.gateway?.share !== void 0) {
1535
- if (typeof body.gateway.share !== "object" || body.gateway.share === null || Array.isArray(body.gateway.share)) return c.json({
1536
- ok: false,
1537
- error: { message: "gateway.share must be an object" }
1538
- }, 400);
1539
- const shareResult = mergeShareConfigPatch(config, body.gateway.share);
1540
- if (shareResult.ok === false) return c.json({
1541
- ok: false,
1542
- error: { message: shareResult.message }
1543
- }, 400);
1544
- }
1545
- if (body.gateway?.corsOrigins !== void 0) {
1546
- if (!Array.isArray(body.gateway.corsOrigins)) return c.json({
1547
- ok: false,
1548
- error: { message: "gateway.corsOrigins must be an array" }
1549
- }, 400);
1550
- if (!config.gateway) config.gateway = {
1551
- bind: "loopback",
1552
- port: 18790,
1553
- heartbeat: {
1554
- enabled: true,
1555
- intervalMs: 18e5,
1556
- includeSystemPromptSection: false
1557
- },
1558
- maxSseConnections: 100,
1559
- corsOrigins: []
1560
- };
1561
- config.gateway.corsOrigins = body.gateway.corsOrigins.filter((x) => typeof x === "string" && x.trim().length > 0).map((x) => x.trim());
1562
- }
1563
- if (body.gateway?.maxSseConnections !== void 0) {
1564
- if (typeof body.gateway.maxSseConnections !== "number" || !Number.isFinite(body.gateway.maxSseConnections) || body.gateway.maxSseConnections < 1) return c.json({
1565
- ok: false,
1566
- error: { message: "gateway.maxSseConnections must be a positive integer" }
1567
- }, 400);
1568
- if (!config.gateway) config.gateway = {
1569
- bind: "loopback",
1570
- port: 18790,
1571
- heartbeat: {
1572
- enabled: true,
1573
- intervalMs: 18e5,
1574
- includeSystemPromptSection: false
1575
- },
1576
- maxSseConnections: Math.floor(body.gateway.maxSseConnections),
1577
- corsOrigins: []
1578
- };
1579
- else config.gateway.maxSseConnections = Math.floor(body.gateway.maxSseConnections);
1580
- }
1581
- if (body.gateway?.channelConnectDeferMode !== void 0) {
1582
- const mode = body.gateway.channelConnectDeferMode;
1583
- if (mode !== "auto" && mode !== "off" && mode !== "explicit") return c.json({
1584
- ok: false,
1585
- error: { message: "gateway.channelConnectDeferMode must be auto, off, or explicit" }
1586
- }, 400);
1587
- if (!config.gateway) config.gateway = {
1588
- bind: "loopback",
1589
- port: 18790,
1590
- heartbeat: {
1591
- enabled: true,
1592
- intervalMs: 18e5,
1593
- includeSystemPromptSection: false
1594
- },
1595
- maxSseConnections: 100,
1596
- corsOrigins: []
1597
- };
1598
- config.gateway.channelConnectDeferMode = mode;
1599
- }
1600
- const parseDeferIdList = (raw) => {
1601
- if (!Array.isArray(raw)) return null;
1602
- const ids = raw.filter((x) => typeof x === "string" && x.trim().length > 0).map((x) => x.trim());
1603
- if (ids.length > 24) return null;
1604
- return ids;
1605
- };
1606
- if (body.gateway?.channelConnectDeferIds !== void 0) {
1607
- const ids = parseDeferIdList(body.gateway.channelConnectDeferIds);
1608
- if (ids === null) return c.json({
1609
- ok: false,
1610
- error: { message: "gateway.channelConnectDeferIds must be an array of up to 24 strings" }
1611
- }, 400);
1612
- if (!config.gateway) config.gateway = {
1613
- bind: "loopback",
1614
- port: 18790,
1615
- heartbeat: {
1616
- enabled: true,
1617
- intervalMs: 18e5,
1618
- includeSystemPromptSection: false
1619
- },
1620
- maxSseConnections: 100,
1621
- corsOrigins: []
1622
- };
1623
- config.gateway.channelConnectDeferIds = ids;
1624
- }
1625
- if (body.gateway?.channelConnectDeferSkipIds !== void 0) {
1626
- const ids = parseDeferIdList(body.gateway.channelConnectDeferSkipIds);
1627
- if (ids === null) return c.json({
1628
- ok: false,
1629
- error: { message: "gateway.channelConnectDeferSkipIds must be an array of up to 24 strings" }
1630
- }, 400);
1631
- if (!config.gateway) config.gateway = {
1632
- bind: "loopback",
1633
- port: 18790,
1634
- heartbeat: {
1635
- enabled: true,
1636
- intervalMs: 18e5,
1637
- includeSystemPromptSection: false
1638
- },
1639
- maxSseConnections: 100,
1640
- corsOrigins: []
1641
- };
1642
- config.gateway.channelConnectDeferSkipIds = ids;
1643
- }
1644
- if (body.update !== void 0 && typeof body.update === "object" && body.update !== null) {
1645
- const updateResult = mergeUpdateConfigPatch(config, body.update);
1646
- if (updateResult.ok === false) return c.json({
1647
- ok: false,
1648
- error: { message: updateResult.message }
1649
- }, 400);
1650
- }
1651
- if (body.cron !== void 0) {
1652
- if (typeof body.cron !== "object" || body.cron === null || Array.isArray(body.cron)) return c.json({
1653
- ok: false,
1654
- error: { message: "cron must be an object" }
1655
- }, 400);
1656
- const cronResult = mergeCronConfigPatch(config, body.cron);
1657
- if (cronResult.ok === false) return c.json({
1658
- ok: false,
1659
- error: { message: cronResult.message }
1660
- }, 400);
1661
- }
1662
- if (body.goals !== void 0) {
1663
- if (typeof body.goals !== "object" || body.goals === null || Array.isArray(body.goals)) return c.json({
1664
- ok: false,
1665
- error: { message: "goals must be an object" }
1666
- }, 400);
1667
- const goalsResult = mergeGoalsConfigPatch(config, body.goals);
1668
- if (goalsResult.ok === false) return c.json({
1669
- ok: false,
1670
- error: { message: goalsResult.message }
1671
- }, 400);
1672
- }
1673
- if (body.session !== void 0) {
1674
- if (typeof body.session !== "object" || body.session === null || Array.isArray(body.session)) return c.json({
1675
- ok: false,
1676
- error: { message: "session must be an object" }
1677
- }, 400);
1678
- const sessionResult = mergeSessionConfigPatch(config, body.session);
1679
- if (sessionResult.ok === false) return c.json({
1680
- ok: false,
1681
- error: { message: sessionResult.message }
1682
- }, 400);
1683
- }
1684
- if (body.gateway !== void 0 && typeof body.gateway === "object" && body.gateway !== null && !Array.isArray(body.gateway)) {
1685
- const gwPatch = body.gateway;
1686
- if (gwPatch.skillsMarketplaceProvider !== void 0 || gwPatch.skillsStoreBaseUrl !== void 0) {
1687
- const skillsResult = mergeGatewaySkillsMarketplacePatch(config, {
1688
- ...gwPatch.skillsMarketplaceProvider !== void 0 ? { skillsMarketplaceProvider: gwPatch.skillsMarketplaceProvider } : {},
1689
- ...gwPatch.skillsStoreBaseUrl !== void 0 ? { skillsStoreBaseUrl: gwPatch.skillsStoreBaseUrl } : {}
1690
- });
1691
- if (skillsResult.ok === false) return c.json({
1692
- ok: false,
1693
- error: { message: skillsResult.message }
1694
- }, 400);
1695
- }
1696
- }
1697
- if (body.providers) {
1698
- const resolver = new CredentialResolver();
1699
- for (const [key, apiKey] of Object.entries(body.providers)) if (apiKey !== void 0 && typeof apiKey === "string" && apiKey.trim() && apiKey !== "***" && apiKey !== "••••••••••••") await resolver.saveApiKey(key, apiKey, { profileName: "default" });
1700
- }
1701
- if (body.providersConfig && typeof body.providersConfig === "object" && !Array.isArray(body.providersConfig)) {
1702
- const cfgProviders = config.providers ?? {};
1703
- for (const [vendorId, raw] of Object.entries(body.providersConfig)) {
1704
- if (!vendorId || typeof vendorId !== "string") continue;
1705
- if (raw === null) {
1706
- delete cfgProviders[vendorId];
1707
- continue;
1708
- }
1709
- if (!raw || typeof raw !== "object" || Array.isArray(raw)) continue;
1710
- const next = cfgProviders[vendorId] ?? {};
1711
- const patch = raw;
1712
- for (const field of [
1713
- "apiKey",
1714
- "baseUrl",
1715
- "region",
1716
- "imageBaseUrl"
1717
- ]) if (patch[field] === null || patch[field] === "") delete next[field];
1718
- else if (typeof patch[field] === "string") next[field] = patch[field].trim();
1719
- if (patch.azure === null) delete next.azure;
1720
- else if (patch.azure && typeof patch.azure === "object" && !Array.isArray(patch.azure)) next.azure = {
1721
- ...next.azure ?? {},
1722
- ...patch.azure
1723
- };
1724
- if (patch.request === null) delete next.request;
1725
- else if (patch.request && typeof patch.request === "object" && !Array.isArray(patch.request)) next.request = {
1726
- ...next.request ?? {},
1727
- ...patch.request
1728
- };
1729
- cfgProviders[vendorId] = next;
1730
- }
1731
- config.providers = cfgProviders;
1732
- }
1733
- if (body.stt !== void 0) {
1734
- config.tools = config.tools ?? {};
1735
- config.tools.media = config.tools.media ?? {};
1736
- config.tools.media.audio = mergeSttConfigPatch(config.tools.media.audio, body.stt);
1737
- }
1738
- if (body.tts !== void 0) {
1739
- config.messages = config.messages ?? {};
1740
- config.messages.tts = mergeTtsConfigPatch(config.messages.tts, body.tts);
1741
- }
1742
- const toolsPatchErr = applyToolsWebPatch(config, body);
1743
- if (toolsPatchErr) return c.json({
42
+ applyAgentsPatch(config, body);
43
+ applyChannelsPatch(config, body);
44
+ const gatewayResult = applyGatewayPatch(config, body);
45
+ if (gatewayResult.ok === false) return c.json({
1744
46
  ok: false,
1745
- error: { message: toolsPatchErr }
1746
- }, 400);
1747
- if (body.tunnel !== void 0) {
1748
- if (!body.tunnel || typeof body.tunnel !== "object" || Array.isArray(body.tunnel)) return c.json({
1749
- ok: false,
1750
- error: { message: "tunnel must be an object" }
1751
- }, 400);
1752
- const tunnelResult = mergeTunnelConfigPatch(config, body.tunnel);
1753
- if (tunnelResult.ok === false) return c.json({
1754
- ok: false,
1755
- error: { message: tunnelResult.message }
1756
- }, 400);
1757
- }
1758
- if (body.bindings !== void 0) {
1759
- if (!Array.isArray(body.bindings)) return c.json({
1760
- ok: false,
1761
- error: { message: "bindings must be an array" }
1762
- }, 400);
1763
- const parsed = BindingsConfigSchema.safeParse(body.bindings);
1764
- if (!parsed.success) return c.json({
1765
- ok: false,
1766
- error: { message: parsed.error.issues.map((i) => i.message).join("; ") }
1767
- }, 400);
1768
- config.bindings = parsed.data;
1769
- }
1770
- if (body.mcp !== void 0) if (body.mcp === null) delete config.mcp;
1771
- else if (typeof body.mcp !== "object" || Array.isArray(body.mcp)) return c.json({
47
+ error: gatewayResult.error
48
+ }, gatewayResult.status);
49
+ const miscResult = await applyMiscPatch(config, body);
50
+ if (miscResult.ok === false) return c.json({
1772
51
  ok: false,
1773
- error: { message: "mcp must be an object" }
1774
- }, 400);
1775
- else {
1776
- const parsed = McpConfigSchema.safeParse(body.mcp);
1777
- if (!parsed.success) return c.json({
1778
- ok: false,
1779
- error: { message: parsed.error.issues.map((i) => i.message).join("; ") }
1780
- }, 400);
1781
- if (parsed.data === void 0) delete config.mcp;
1782
- else {
1783
- const next = { ...parsed.data };
1784
- if (next.servers) next.servers = Object.fromEntries(Object.entries(next.servers).map(([name, server]) => [name, canonicalizeConfiguredMcpServer(server)]));
1785
- config.mcp = next;
1786
- }
1787
- }
1788
- if (body.gateway !== void 0) try {
1789
- const auth = resolveGatewayAuth({ authConfig: config.gateway?.auth });
1790
- assertGatewayAuthConfigured(auth);
1791
- assertGatewayRuntimeConfig({
1792
- cfg: config,
1793
- auth,
1794
- port: config.gateway?.port ?? 18790
1795
- });
1796
- } catch (err) {
1797
- const message = err instanceof Error ? err.message : String(err);
1798
- return c.json({
1799
- ok: false,
1800
- error: { message }
1801
- }, 400);
1802
- }
52
+ error: miscResult.error
53
+ }, miscResult.status);
54
+ const finalGwCheck = validateGatewayAfterPatch(config, body);
55
+ if (finalGwCheck.ok === false) return c.json({
56
+ ok: false,
57
+ error: finalGwCheck.error
58
+ }, finalGwCheck.status);
1803
59
  const result = await service.saveConfig(config);
1804
60
  if (!result.saved) return c.json({
1805
61
  ok: false,