@xopcai/xopc 0.0.114 → 0.0.115

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 (375) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  4. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  5. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  6. package/dist/extensions/telegram/src/plugin.js +1 -1
  7. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  8. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  9. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  10. package/dist/extensions/telegram/xopc.extension.json +1 -1
  11. package/dist/extensions/weixin/src/api/api.js +2 -2
  12. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  13. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  14. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  15. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  16. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  18. package/dist/extensions/weixin/src/plugin.js +1 -1
  19. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  20. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  21. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Fp-p7bP1.js → agent-avatar-dicebear-DVnBfANm.js} +1 -1
  22. package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +6 -0
  23. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +1 -0
  24. package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +71 -0
  25. package/dist/gateway/static/root/assets/{app-management-settings-panel-v24i25Oj.js → app-management-settings-panel-DzGbdr04.js} +1 -1
  26. package/dist/gateway/static/root/assets/{appearance-settings-ycbdJRuZ.js → appearance-settings-BQpPSTHD.js} +1 -1
  27. package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +1 -0
  28. package/dist/gateway/static/root/assets/{archive-plugin-CJzSADJo.js → archive-plugin-CXu-Csep.js} +1 -1
  29. package/dist/gateway/static/root/assets/{attachment-load-BTAB4zGS.js → attachment-load-BAjgOoGY.js} +1 -1
  30. package/dist/gateway/static/root/assets/{binary-plugins-DXR1-mct.js → binary-plugins-BSBgB2hO.js} +1 -1
  31. package/dist/gateway/static/root/assets/{block-editor-CzQri9h2.js → block-editor-BpXw9TTR.js} +44 -44
  32. package/dist/gateway/static/root/assets/channels-settings-BbPUpzWB.js +1 -0
  33. package/dist/gateway/static/root/assets/{config-api-DRqjEvAx.js → config-api-NOoPiIYz.js} +1 -1
  34. package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +2 -0
  35. package/dist/gateway/static/root/assets/{cron-api-BXaZXv1o.js → cron-api-C9BOqAXd.js} +1 -1
  36. package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +3 -0
  37. package/dist/gateway/static/root/assets/dreaming-settings-DQ4DtiK1.js +1 -0
  38. package/dist/gateway/static/root/assets/{extension-debug-page-DSkqMYo7.js → extension-debug-page-D9kgUHCc.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-page-h2dGDbMN.js → extension-page-CGyhXqzR.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-settings-page-hN99RhOi.js → extension-settings-page-DL8Xquqd.js} +1 -1
  41. package/dist/gateway/static/root/assets/{fetch-D9QqUtzZ.js → fetch-D0VXA932.js} +1 -1
  42. package/dist/gateway/static/root/assets/{format-interval-label-D6E687rG.js → format-interval-label-Be8SmgUw.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-config-api-CLt_SKTC.js → gateway-config-api-C-xjn__h.js} +1 -1
  44. package/dist/gateway/static/root/assets/{gateway-settings-1PDi4lI0.js → gateway-settings-BMPwIjKI.js} +1 -1
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-N7Z_sz7p.js → gateway-startup-retry-DERUH61L.js} +1 -1
  46. package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +1 -0
  47. package/dist/gateway/static/root/assets/goals-config-api-BPmqWk90.js +1 -0
  48. package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +2 -0
  49. package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +1 -0
  50. package/dist/gateway/static/root/assets/{heartbeat-config-api-DGPadTw-.js → heartbeat-config-api-Bfdzr8oV.js} +1 -1
  51. package/dist/gateway/static/root/assets/{heartbeat-settings-BHHAs8ZX.js → heartbeat-settings-TbHgcjTn.js} +1 -1
  52. package/dist/gateway/static/root/assets/{index-DefIdW9q.js → index-AkTrf6Pb.js} +56 -56
  53. package/dist/gateway/static/root/assets/index-fh5sXTj9.css +1 -0
  54. package/dist/gateway/static/root/assets/{interval-presets-CEklPQ_r.js → interval-presets-utKbuCRY.js} +1 -1
  55. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Ce_aQ8Iv.js → keyboard-shortcuts-settings-CjqS6c6V.js} +1 -1
  56. package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +2 -0
  57. package/dist/gateway/static/root/assets/{markdown-split-BMz3xPXO.js → markdown-split-DW8C47iB.js} +1 -1
  58. package/dist/gateway/static/root/assets/{media-plugins-BalOSoz9.js → media-plugins-D6HwDhDT.js} +1 -1
  59. package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +3 -0
  60. package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +2 -0
  61. package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +2 -0
  62. package/dist/gateway/static/root/assets/{note-image-lightbox-C5D1Q5mY.js → note-image-lightbox-pJM35Pz5.js} +1 -1
  63. package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +1 -0
  64. package/dist/gateway/static/root/assets/{preview-open-alternatives-CYFR5U9l.js → preview-open-alternatives-CVwHuyN6.js} +1 -1
  65. package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +1 -0
  66. package/dist/gateway/static/root/assets/{save-bar-controls-BQ79Z5IP.js → save-bar-controls-Ba-UEk7x.js} +1 -1
  67. package/dist/gateway/static/root/assets/{schedule-field-Bgk6Emue.js → schedule-field-CNN9595U.js} +1 -1
  68. package/dist/gateway/static/root/assets/{schema-form-DzS36TMa.js → schema-form-DnNMmtD5.js} +1 -1
  69. package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +1 -0
  70. package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +1 -0
  71. package/dist/gateway/static/root/assets/{settings-collapsible-section-CdjFnSAy.js → settings-collapsible-section-CmOz80i5.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-form-section-DZLy_exu.js → settings-form-section-BmK7JJOV.js} +1 -1
  73. package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +1 -0
  74. package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +1 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-_qRDr4g_.js → share-preview-page-Dp2qGrHC.js} +1 -1
  76. package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +1 -0
  77. package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +1 -0
  78. package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +2 -0
  79. package/dist/gateway/static/root/assets/{system-settings-panel-hqaBF5aG.js → system-settings-panel-5jrIEr5b.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-agent-defaults-form-zbVIQLOA.js → use-agent-defaults-form-BuiXLIs5.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-channel-catalog-CbXq97rT.js → use-channel-catalog-CHlO8J9G.js} +1 -1
  82. package/dist/gateway/static/root/assets/{use-settings-tab-guard-DwS3drWK.js → use-settings-tab-guard-CW5JORnl.js} +1 -1
  83. package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +1 -0
  84. package/dist/gateway/static/root/assets/{voice-player-store-DSuOd9zy.js → voice-player-store-DDDWYHvg.js} +1 -1
  85. package/dist/gateway/static/root/assets/{workflow-page.utils-C0Uq3xyq.js → workflow-page.utils-CKjeEGqx.js} +1 -1
  86. package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +18 -0
  87. package/dist/gateway/static/root/index.html +5 -5
  88. package/dist/gateway/static/root/logo.svg +4 -3
  89. package/dist/package.js +1 -1
  90. package/dist/src/agent/agent-manager.js +6 -6
  91. package/dist/src/agent/agent-scope.js +1 -1
  92. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  93. package/dist/src/agent/bootstrap/project-agents-context.js +1 -1
  94. package/dist/src/agent/context/workspace-seed.js +2 -2
  95. package/dist/src/agent/context/workspace-state.js +1 -1
  96. package/dist/src/agent/context/workspace.js +1 -1
  97. package/dist/src/agent/embedded/session-tool-result-guard.js +8 -1
  98. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  99. package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
  100. package/dist/src/agent/goals/checklist-judge.js +3 -2
  101. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  102. package/dist/src/agent/goals/evaluate-turn.d.ts +1 -1
  103. package/dist/src/agent/goals/evaluate-turn.js +1 -0
  104. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  105. package/dist/src/agent/goals/goal-locale.js +2 -2
  106. package/dist/src/agent/goals/post-turn.d.ts +6 -1
  107. package/dist/src/agent/goals/post-turn.js +15 -6
  108. package/dist/src/agent/goals/post-turn.js.map +1 -1
  109. package/dist/src/agent/image/load-image-media.js +2 -2
  110. package/dist/src/agent/ipc/inbox.js +3 -3
  111. package/dist/src/agent/ipc/socket.js +1 -1
  112. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  113. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  114. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  115. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  116. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  117. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  118. package/dist/src/agent/memory/dreaming/events.js +1 -1
  119. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  120. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  121. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  122. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  123. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  124. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  125. package/dist/src/agent/memory/memory-flush.js +1 -1
  126. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  127. package/dist/src/agent/models/manager.js +1 -1
  128. package/dist/src/agent/prompt/memory/index.js +1 -1
  129. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  130. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  131. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  132. package/dist/src/agent/sandbox/path-policy.js +2 -2
  133. package/dist/src/agent/service.js +4 -4
  134. package/dist/src/agent/session/session-inspector.js +1 -1
  135. package/dist/src/agent/skills/config.js +2 -2
  136. package/dist/src/agent/skills/filesystem-watcher.js +1 -1
  137. package/dist/src/agent/skills/hub-hash.js +2 -2
  138. package/dist/src/agent/skills/hub-lock.js +1 -1
  139. package/dist/src/agent/skills/hub-pull.js +2 -2
  140. package/dist/src/agent/skills/index.js +2 -2
  141. package/dist/src/agent/skills/installer.js +2 -2
  142. package/dist/src/agent/skills/managed-store.js +1 -1
  143. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  144. package/dist/src/agent/skills/skill-manager.js +1 -1
  145. package/dist/src/agent/skills/skill-view-path.js +1 -1
  146. package/dist/src/agent/skills/test-framework.js +1 -1
  147. package/dist/src/agent/starter-agents.js +1 -1
  148. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  149. package/dist/src/agent/tools/find.js +1 -1
  150. package/dist/src/agent/tools/grep.js +1 -1
  151. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  152. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  153. package/dist/src/agent/tools/workflow-tool.js +1 -1
  154. package/dist/src/agent/workflow/catalog.js +1 -1
  155. package/dist/src/agent/workflow/snapshot.d.ts +10 -0
  156. package/dist/src/agent/workflow/snapshot.js +136 -1
  157. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  158. package/dist/src/ai-assist/text-assist.js +1 -1
  159. package/dist/src/auth/credentials.js +2 -2
  160. package/dist/src/auth/profiles/store.js +2 -2
  161. package/dist/src/auth/sync-provider-auth.js +1 -1
  162. package/dist/src/browser/cache-dir-policy.js +1 -1
  163. package/dist/src/browser/cdp-local-launcher.js +2 -2
  164. package/dist/src/browser/pipeline/source.js +1 -1
  165. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  166. package/dist/src/browser/providers/cloakbrowser.js +5 -5
  167. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  168. package/dist/src/browser/stealth.js +1 -1
  169. package/dist/src/channels/catalog/channel-catalog-service.d.ts +2 -1
  170. package/dist/src/channels/catalog/channel-catalog-service.js +133 -16
  171. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
  172. package/dist/src/channels/catalog/channel-catalog-types.d.ts +13 -0
  173. package/dist/src/channels/outbound/persist-store.js +1 -1
  174. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  175. package/dist/src/channels/pairing/pairing-store.js +2 -2
  176. package/dist/src/chat-commands/agent-edit.js +2 -2
  177. package/dist/src/chat-commands/builtins/config.js +2 -2
  178. package/dist/src/cli/commands/config.js +1 -1
  179. package/dist/src/cli/commands/doctor/checks/channel-config.js +14 -1
  180. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  181. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  182. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  183. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  184. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  185. package/dist/src/cli/commands/extension-create.js +1 -1
  186. package/dist/src/cli/commands/extension-dev.js +2 -2
  187. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  188. package/dist/src/cli/commands/extension-pack.js +2 -2
  189. package/dist/src/cli/commands/extension.js +3 -3
  190. package/dist/src/cli/commands/gateway/logs.js +1 -1
  191. package/dist/src/cli/commands/image.js +1 -1
  192. package/dist/src/cli/commands/init.js +2 -2
  193. package/dist/src/cli/commands/models.js +1 -1
  194. package/dist/src/cli/commands/skills-test.js +1 -1
  195. package/dist/src/cli/templates.js +1 -1
  196. package/dist/src/cli/utils/gateway-client.js +1 -1
  197. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  198. package/dist/src/config/agent-profile.js +1 -1
  199. package/dist/src/config/agent-typed-models.js +1 -1
  200. package/dist/src/config/gateway-bind.js +1 -1
  201. package/dist/src/config/index.js +7 -7
  202. package/dist/src/config/loader.js +4 -4
  203. package/dist/src/config/models-json.js +2 -2
  204. package/dist/src/config/paths-state.js +1 -1
  205. package/dist/src/config/paths.js +1 -1
  206. package/dist/src/config/profile.js +1 -1
  207. package/dist/src/config/reload.js +1 -1
  208. package/dist/src/config/schema.d.ts +8 -0
  209. package/dist/src/config/schema.js +7 -0
  210. package/dist/src/config/schema.js.map +1 -1
  211. package/dist/src/config/web-patch.d.ts +1 -0
  212. package/dist/src/config/web-patch.js +1 -0
  213. package/dist/src/config/web-patch.js.map +1 -1
  214. package/dist/src/config/workspace-path.js +1 -1
  215. package/dist/src/cron/executor.js +1 -1
  216. package/dist/src/cron/service.js +1 -1
  217. package/dist/src/daemon/constants.js +1 -1
  218. package/dist/src/daemon/install-plan.js +2 -2
  219. package/dist/src/daemon/launchd.js +2 -2
  220. package/dist/src/daemon/schtasks.js +2 -2
  221. package/dist/src/daemon/systemd.js +2 -2
  222. package/dist/src/extensions/bundle-mcp.js +1 -1
  223. package/dist/src/extensions/discover-extensions.js +2 -2
  224. package/dist/src/extensions/health.js +1 -1
  225. package/dist/src/extensions/install.js +2 -2
  226. package/dist/src/extensions/loader.js +2 -2
  227. package/dist/src/extensions/lockfile.js +3 -3
  228. package/dist/src/extensions/security.js +1 -1
  229. package/dist/src/extensions/update.js +2 -2
  230. package/dist/src/gateway/agents-admin.js +2 -2
  231. package/dist/src/gateway/file-path-classifier.js +2 -2
  232. package/dist/src/gateway/hono/app.js +5 -1
  233. package/dist/src/gateway/hono/app.js.map +1 -1
  234. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
  235. package/dist/src/gateway/hono/lib/config-payload.js +7 -4
  236. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  237. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  238. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  239. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  240. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +19 -5
  241. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -1
  242. package/dist/src/gateway/hono/routes/agents.js +1 -1
  243. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  244. package/dist/src/gateway/hono/routes/channels.js +18 -14
  245. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  246. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  247. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  248. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  249. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  250. package/dist/src/gateway/hono/routes/models.js +1 -1
  251. package/dist/src/gateway/hono/routes/shares.js +1 -1
  252. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  253. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  254. package/dist/src/gateway/lock.js +3 -3
  255. package/dist/src/gateway/ports.js +1 -1
  256. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  257. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  258. package/dist/src/gateway/rate-limit/buckets.js.map +1 -1
  259. package/dist/src/gateway/service/config-coordinator.js +1 -1
  260. package/dist/src/gateway/service/marketplace-service.js +2 -2
  261. package/dist/src/gateway/service.js +4 -4
  262. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  263. package/dist/src/goals/goal-workflow-judge.js +2 -2
  264. package/dist/src/i18n/goals-bundle.js +1 -1
  265. package/dist/src/i18n/index.js +1 -1
  266. package/dist/src/i18n/share-tool-bundle.js +2 -2
  267. package/dist/src/infra/brew.js +1 -1
  268. package/dist/src/infra/package-json.js +1 -1
  269. package/dist/src/infra/package-update-steps.js +1 -1
  270. package/dist/src/infra/path-env.js +2 -2
  271. package/dist/src/infra/restart.js +1 -1
  272. package/dist/src/infra/stable-node-path.js +1 -1
  273. package/dist/src/infra/update-check.js +1 -1
  274. package/dist/src/infra/update-global.js +1 -1
  275. package/dist/src/infra/update-lock.js +2 -2
  276. package/dist/src/infra/update-restart.js +1 -1
  277. package/dist/src/infra/update-runner.js +1 -1
  278. package/dist/src/infra/update-startup.js +1 -1
  279. package/dist/src/infra/write-file-atomic.js +2 -2
  280. package/dist/src/media/store.js +1 -1
  281. package/dist/src/notes/agent-context.js +1 -1
  282. package/dist/src/notes/service.js +1 -1
  283. package/dist/src/notes/store.js +2 -2
  284. package/dist/src/project-trust/trust-store.js +2 -2
  285. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  286. package/dist/src/providers/index.js +1 -1
  287. package/dist/src/providers/model-registry.js +4 -4
  288. package/dist/src/session/init-session-turn.js +1 -1
  289. package/dist/src/session/resolve-session.js +1 -1
  290. package/dist/src/session/session-title.js +2 -2
  291. package/dist/src/session/store.js +1 -1
  292. package/dist/src/share/share-auto.js +2 -2
  293. package/dist/src/share/share-store.js +3 -3
  294. package/dist/src/share/share-thumbnail.js +2 -2
  295. package/dist/src/share/share-zip.js +1 -1
  296. package/dist/src/share/site-share-store.js +3 -3
  297. package/dist/src/share/site-static-serve.js +1 -1
  298. package/dist/src/storage/sqlite/connection.js +1 -1
  299. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  300. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  301. package/dist/src/storage/sqlite/migrations/runner.js +1 -1
  302. package/dist/src/storage/sqlite/schema.js +1 -1
  303. package/dist/src/tui/backends/embedded-backend.d.ts +8 -1
  304. package/dist/src/tui/backends/embedded-backend.js +73 -0
  305. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  306. package/dist/src/tui/backends/gateway-sse-backend.d.ts +2 -1
  307. package/dist/src/tui/backends/gateway-sse-backend.js +24 -0
  308. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  309. package/dist/src/tui/clipboard-image.js +3 -3
  310. package/dist/src/tui/components/chat-log.d.ts +2 -0
  311. package/dist/src/tui/components/chat-log.js +19 -0
  312. package/dist/src/tui/components/chat-log.js.map +1 -1
  313. package/dist/src/tui/extension-host/autocomplete.d.ts +3 -2
  314. package/dist/src/tui/extension-host/autocomplete.js +17 -3
  315. package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
  316. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  317. package/dist/src/tui/extension-host/runtime.d.ts +5 -0
  318. package/dist/src/tui/extension-host/runtime.js +1 -1
  319. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  320. package/dist/src/tui/theme-manager.js +1 -1
  321. package/dist/src/tui/tui-backend.d.ts +14 -0
  322. package/dist/src/tui/tui-command-formatters.js +4 -4
  323. package/dist/src/tui/tui-commands.d.ts +16 -3
  324. package/dist/src/tui/tui-commands.js +49 -21
  325. package/dist/src/tui/tui-commands.js.map +1 -1
  326. package/dist/src/tui/tui-keybindings-file.js +1 -1
  327. package/dist/src/tui/tui-scoped-models.js +2 -2
  328. package/dist/src/tui/tui-settings.js +1 -1
  329. package/dist/src/tui/tui-startup-resources.js +1 -1
  330. package/dist/src/tui/tui-startup-text.js +1 -1
  331. package/dist/src/tui/tui-startup-text.js.map +1 -1
  332. package/dist/src/tui/tui.js +78 -7
  333. package/dist/src/tui/tui.js.map +1 -1
  334. package/dist/src/tunnel/frpc-binary.js +4 -4
  335. package/dist/src/tunnel/frpc-config.js +1 -1
  336. package/dist/src/tunnel/frpc-extract.js +1 -1
  337. package/dist/src/tunnel/tunnel-state.js +1 -1
  338. package/dist/src/utils/logger/audit.js +1 -1
  339. package/dist/src/utils/logger/log-store.js +1 -1
  340. package/dist/src/utils/logger/rotation.js +1 -1
  341. package/dist/src/utils/logger/streams.js +1 -1
  342. package/dist/src/voice/tts/audio.js +1 -1
  343. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  344. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  345. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  346. package/dist/src/workflows/store/event-store.js +1 -1
  347. package/dist/src/workflows/store/run-store.js +1 -1
  348. package/package.json +1 -1
  349. package/dist/gateway/static/root/assets/agent-browser-settings-page-CWh7trjd.js +0 -6
  350. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-kC8OuLoj.js +0 -1
  351. package/dist/gateway/static/root/assets/agents-DJWG26Si.js +0 -71
  352. package/dist/gateway/static/root/assets/apps-page-0V3DXZ7J.js +0 -1
  353. package/dist/gateway/static/root/assets/channels-settings-CIKOkYdO.js +0 -1
  354. package/dist/gateway/static/root/assets/connectors-settings-ClrDS5jH.js +0 -2
  355. package/dist/gateway/static/root/assets/cron-page-Chi_4u4P.js +0 -3
  356. package/dist/gateway/static/root/assets/dreaming-settings-B0_rs2tj.js +0 -1
  357. package/dist/gateway/static/root/assets/goal-detail-page-D_wwXL-t.js +0 -1
  358. package/dist/gateway/static/root/assets/goals-page-DZ2toZ8y.js +0 -2
  359. package/dist/gateway/static/root/assets/goals-settings-LFlwtIKE.js +0 -1
  360. package/dist/gateway/static/root/assets/index-DzmWBkq-.css +0 -1
  361. package/dist/gateway/static/root/assets/logs-page-j_D2QTuQ.js +0 -2
  362. package/dist/gateway/static/root/assets/messages-BN_WiUg0.js +0 -3
  363. package/dist/gateway/static/root/assets/models-hub-panel-CMH_TmZz.js +0 -2
  364. package/dist/gateway/static/root/assets/note-detail-page-O18BrQPq.js +0 -2
  365. package/dist/gateway/static/root/assets/notes-page-B_ZYCmY9.js +0 -1
  366. package/dist/gateway/static/root/assets/remote-access-hub-CwKgWixY.js +0 -1
  367. package/dist/gateway/static/root/assets/sessions-page-C4fcD-7B.js +0 -1
  368. package/dist/gateway/static/root/assets/settings-advanced-gate-Ad2OJ86w.js +0 -1
  369. package/dist/gateway/static/root/assets/settings-page-D2BMY5wo.js +0 -1
  370. package/dist/gateway/static/root/assets/setup-status-panel-aWwxl_E1.js +0 -1
  371. package/dist/gateway/static/root/assets/shares-settings-DUE83uIf.js +0 -1
  372. package/dist/gateway/static/root/assets/skill-reload-api-mWKJcrog.js +0 -1
  373. package/dist/gateway/static/root/assets/skills-page-0Sx1Q58n.js +0 -2
  374. package/dist/gateway/static/root/assets/voice-api-key-field-D6HR0hR2.js +0 -1
  375. package/dist/gateway/static/root/assets/workflows-page-DW0fmWhQ.js +0 -18
@@ -1,4 +1,4 @@
1
- import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot, init_channel_catalog_service, isChannelConfigured } from "../../../channels/catalog/channel-catalog-service.js";
1
+ import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot, getChannelSetupStatus, init_channel_catalog_service } from "../../../channels/catalog/channel-catalog-service.js";
2
2
  import { approveChannelPairing, approveChannelPairingBySender, dismissChannelPairingPending, listChannelPairingState, listChannelPairingSummary, revokeChannelPairingPaired } from "../../../channels/pairing/pairing-service.js";
3
3
  //#region src/gateway/hono/routes/channels.ts
4
4
  init_channel_catalog_service();
@@ -16,20 +16,24 @@ function localeFromRequest(c) {
16
16
  }
17
17
  function registerChannelRoutes(authenticated, deps) {
18
18
  const { service, strictRateLimitMiddleware } = deps;
19
+ const channelRateLimitMiddleware = deps.channelRateLimitMiddleware ?? strictRateLimitMiddleware;
19
20
  authenticated.get("/api/channels/catalog", (c) => {
20
21
  const snapshot = service.getExtensionLoader()?.getManifestSnapshot();
21
22
  const locale = localeFromRequest(c);
22
23
  const catalog = snapshot ? buildChannelCatalogFromSnapshot(snapshot, { locale }) : buildChannelCatalogForConfig(service.currentConfig, { locale });
23
- const channelsCfg = service.currentConfig.channels;
24
24
  const running = new Set(service.getRunningChannelIds());
25
25
  return c.json({
26
26
  ok: true,
27
- payload: { channels: catalog.entries.map((entry) => ({
28
- ...entry,
29
- enabled: channelsCfg?.[entry.id]?.enabled === true,
30
- configured: isChannelConfigured(service.currentConfig, entry.id),
31
- runtime: running.has(entry.id) ? "loaded" : "missing"
32
- })) }
27
+ payload: { channels: catalog.entries.map((entry) => {
28
+ const setupStatus = getChannelSetupStatus(service.currentConfig, entry.id, entry);
29
+ return {
30
+ ...entry,
31
+ enabled: setupStatus.enabled,
32
+ configured: setupStatus.ready,
33
+ setupStatus,
34
+ runtime: running.has(entry.id) ? "loaded" : "missing"
35
+ };
36
+ }) }
33
37
  });
34
38
  });
35
39
  authenticated.get("/api/channels/status", (c) => {
@@ -61,7 +65,7 @@ function registerChannelRoutes(authenticated, deps) {
61
65
  payload: { config: value }
62
66
  });
63
67
  });
64
- authenticated.post("/api/channels/:channelId/actions/:actionId", strictRateLimitMiddleware, async (c) => {
68
+ authenticated.post("/api/channels/:channelId/actions/:actionId", channelRateLimitMiddleware, async (c) => {
65
69
  const channel = channelIdParam(c.req.param("channelId"));
66
70
  const action = c.req.param("actionId")?.trim() ?? "";
67
71
  if (!channel || !action) return c.json({
@@ -162,7 +166,7 @@ function registerChannelRoutes(authenticated, deps) {
162
166
  payload: { summary }
163
167
  });
164
168
  });
165
- authenticated.post("/api/channels/:channelId/pairing/approve", strictRateLimitMiddleware, async (c) => {
169
+ authenticated.post("/api/channels/:channelId/pairing/approve", channelRateLimitMiddleware, async (c) => {
166
170
  const channel = channelIdParam(c.req.param("channelId"));
167
171
  const body = await c.req.json().catch(() => ({}));
168
172
  const result = approveChannelPairing({
@@ -185,7 +189,7 @@ function registerChannelRoutes(authenticated, deps) {
185
189
  }
186
190
  });
187
191
  });
188
- authenticated.post("/api/channels/:channelId/pairing/approve-sender", strictRateLimitMiddleware, async (c) => {
192
+ authenticated.post("/api/channels/:channelId/pairing/approve-sender", channelRateLimitMiddleware, async (c) => {
189
193
  const channel = channelIdParam(c.req.param("channelId"));
190
194
  const body = await c.req.json().catch(() => ({}));
191
195
  const result = approveChannelPairingBySender({
@@ -208,7 +212,7 @@ function registerChannelRoutes(authenticated, deps) {
208
212
  }
209
213
  });
210
214
  });
211
- authenticated.delete("/api/channels/:channelId/pairing/paired", strictRateLimitMiddleware, async (c) => {
215
+ authenticated.delete("/api/channels/:channelId/pairing/paired", channelRateLimitMiddleware, async (c) => {
212
216
  const channel = channelIdParam(c.req.param("channelId"));
213
217
  const body = await c.req.json().catch(() => ({}));
214
218
  const result = revokeChannelPairingPaired({
@@ -228,7 +232,7 @@ function registerChannelRoutes(authenticated, deps) {
228
232
  payload: { changed: result.changed }
229
233
  });
230
234
  });
231
- authenticated.delete("/api/channels/:channelId/pairing/pending", strictRateLimitMiddleware, async (c) => {
235
+ authenticated.delete("/api/channels/:channelId/pairing/pending", channelRateLimitMiddleware, async (c) => {
232
236
  const channel = channelIdParam(c.req.param("channelId"));
233
237
  const body = await c.req.json().catch(() => ({}));
234
238
  const result = dismissChannelPairingPending({
@@ -261,7 +265,7 @@ function registerChannelRoutes(authenticated, deps) {
261
265
  payload: { checks }
262
266
  });
263
267
  });
264
- authenticated.post("/api/channels/:channelId/restart", strictRateLimitMiddleware, async (c) => {
268
+ authenticated.post("/api/channels/:channelId/restart", channelRateLimitMiddleware, async (c) => {
265
269
  const channel = channelIdParam(c.req.param("channelId"));
266
270
  await service.restartChannel(channel);
267
271
  return c.json({
@@ -1 +1 @@
1
- {"version":3,"file":"channels.js","names":[],"sources":["../../../../../src/gateway/hono/routes/channels.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport {\n approveChannelPairing,\n approveChannelPairingBySender,\n dismissChannelPairingPending,\n listChannelPairingState,\n listChannelPairingSummary,\n revokeChannelPairingPaired,\n} from '../../../channels/pairing/pairing-service.js';\nimport {\n buildChannelCatalogForConfig,\n buildChannelCatalogFromSnapshot,\n isChannelConfigured,\n} from '../../../channels/catalog/channel-catalog-service.js';\nimport type { Config } from '../../../config/index.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport type { ChannelRuntimeActionPayload } from '../../../channels/plugins/types.adapters.js';\n\nfunction channelIdParam(raw: string | undefined): string {\n return (raw ?? '').trim().toLowerCase();\n}\n\nfunction accountIdFromQuery(raw: string | undefined): string {\n return raw?.trim() || 'default';\n}\n\nfunction actionPayloadChangedConfig(payload: ChannelRuntimeActionPayload | undefined): boolean {\n return Boolean(payload && 'configChanged' in payload && payload.configChanged === true);\n}\n\nfunction localeFromRequest(c: { req: { query(name: string): string | undefined; header(name: string): string | undefined } }): string | undefined {\n return c.req.query('locale') ?? c.req.header('X-XOPC-Locale') ?? c.req.header('Accept-Language')?.split(',')[0];\n}\n\nexport function registerChannelRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.get('/api/channels/catalog', (c) => {\n const snapshot = service.getExtensionLoader()?.getManifestSnapshot();\n const locale = localeFromRequest(c);\n const catalog = snapshot\n ? buildChannelCatalogFromSnapshot(snapshot, { locale })\n : buildChannelCatalogForConfig(service.currentConfig, { locale });\n const channelsCfg = service.currentConfig.channels as Record<string, { enabled?: boolean } | undefined> | undefined;\n const running = new Set(service.getRunningChannelIds());\n return c.json({\n ok: true,\n payload: {\n channels: catalog.entries.map((entry) => ({\n ...entry,\n enabled: channelsCfg?.[entry.id]?.enabled === true,\n configured: isChannelConfigured(service.currentConfig, entry.id),\n runtime: running.has(entry.id) ? 'loaded' : 'missing',\n })),\n },\n });\n });\n\n authenticated.get('/api/channels/status', (c) => {\n const channels = service.getChannelsStatus();\n return c.json({ ok: true, payload: { channels } });\n });\n\n authenticated.get('/api/channels/meta', (c) => {\n const channels = service.getChannelsHubMeta();\n return c.json({ ok: true, payload: { channels } });\n });\n\n authenticated.get('/api/channels/:channelId/config', (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n if (!channel) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: 'Missing channel id' } }, 400);\n }\n const plugin = service.getChannelRuntimePlugin(channel);\n const value =\n plugin?.configSurface?.buildConfigSurface(service.currentConfig) ??\n (service.currentConfig.channels as Record<string, unknown> | undefined)?.[channel] ??\n {};\n return c.json({ ok: true, payload: { config: value } });\n });\n\n authenticated.post('/api/channels/:channelId/actions/:actionId', strictRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const action = c.req.param('actionId')?.trim() ?? '';\n if (!channel || !action) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: 'Missing channel/action id' } }, 400);\n }\n const plugin = await service.ensureChannelRuntimePlugin(channel);\n if (!plugin) {\n return c.json({ ok: false, error: { code: 'CHANNEL_RUNTIME_MISSING', message: 'Channel runtime is not loaded' } }, 404);\n }\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : undefined;\n const input = body && typeof body === 'object' ? (body as { input?: unknown }).input : undefined;\n\n if (action === 'doctor.run' && plugin.doctor) {\n const checks = await plugin.doctor.check({ cfg: service.currentConfig, locale: localeFromRequest(c) });\n return c.json({ ok: true, payload: { type: 'diagnostics', checks } });\n }\n\n if (plugin.runtimeActions) {\n const result = await plugin.runtimeActions.runAction({\n cfg: service.currentConfig,\n locale: localeFromRequest(c),\n actionId: action,\n accountId,\n input,\n });\n if (!result.ok) {\n return c.json({ ok: false, error: { code: 'CHANNEL_ACTION_FAILED', message: result.message ?? 'Channel action failed' } }, 400);\n }\n if (result.nextConfig) {\n const saved = await service.saveConfig(result.nextConfig);\n if (!saved.saved) {\n return c.json({ ok: false, error: { code: 'CHANNEL_ACTION_FAILED', message: saved.error ?? 'Failed to save channel config' } }, 500);\n }\n } else if (actionPayloadChangedConfig(result.payload)) {\n await service.reloadConfig();\n }\n return c.json({ ok: true, payload: result.payload ?? {} });\n }\n\n return c.json(\n {\n ok: false,\n error: {\n code: 'ACTION_NOT_IMPLEMENTED',\n message: `Channel action \"${channel}.${action}\" is not implemented by the runtime adapter.`,\n },\n },\n 501,\n );\n });\n\n authenticated.get('/api/channels/:channelId/pairing', (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n if (!channel) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: 'Missing channel id' } }, 400);\n }\n const accountId = accountIdFromQuery(c.req.query('account'));\n const config = service.currentConfig as Config | undefined;\n const state = listChannelPairingState({ channel, accountId, config });\n return c.json({ ok: true, payload: state });\n });\n\n authenticated.get('/api/channels/pairing/summary', (c) => {\n const config = service.currentConfig as Config | undefined;\n const summary = listChannelPairingSummary(config);\n return c.json({ ok: true, payload: { summary } });\n });\n\n authenticated.post('/api/channels/:channelId/pairing/approve', strictRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const code =\n body && typeof body === 'object' && typeof (body as { code?: unknown }).code === 'string'\n ? (body as { code: string }).code.trim()\n : '';\n const result = approveChannelPairing({ channel, accountId, code });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'PAIRING_INVALID', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { senderId: result.senderId, alreadyPaired: result.alreadyPaired } });\n });\n\n authenticated.post('/api/channels/:channelId/pairing/approve-sender', strictRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const senderId =\n body && typeof body === 'object' && typeof (body as { senderId?: unknown }).senderId === 'string'\n ? (body as { senderId: string }).senderId.trim()\n : '';\n const result = approveChannelPairingBySender({ channel, accountId, senderId });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'PAIRING_INVALID', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { senderId: result.senderId, alreadyPaired: result.alreadyPaired } });\n });\n\n authenticated.delete('/api/channels/:channelId/pairing/paired', strictRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const senderId =\n body && typeof body === 'object' && typeof (body as { senderId?: unknown }).senderId === 'string'\n ? (body as { senderId: string }).senderId.trim()\n : '';\n const result = revokeChannelPairingPaired({ channel, accountId, senderId });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { changed: result.changed } });\n });\n\n authenticated.delete('/api/channels/:channelId/pairing/pending', strictRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const senderId =\n body && typeof body === 'object' && typeof (body as { senderId?: unknown }).senderId === 'string'\n ? (body as { senderId: string }).senderId.trim()\n : '';\n const result = dismissChannelPairingPending({ channel, accountId, senderId });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'PAIRING_INVALID', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { senderId: result.senderId } });\n });\n\n authenticated.get('/api/channels/:channelId/doctor', async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const plugin = service.getChannelRuntimePlugin(channel);\n if (!plugin?.doctor) {\n return c.json({ ok: true, payload: { checks: [] } });\n }\n const checks = await plugin.doctor.check({ cfg: service.currentConfig });\n return c.json({ ok: true, payload: { checks } });\n });\n\n authenticated.post('/api/channels/:channelId/restart', strictRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n await service.restartChannel(channel);\n return c.json({ ok: true, payload: { restarted: true } });\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"channels.js","names":[],"sources":["../../../../../src/gateway/hono/routes/channels.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport {\n approveChannelPairing,\n approveChannelPairingBySender,\n dismissChannelPairingPending,\n listChannelPairingState,\n listChannelPairingSummary,\n revokeChannelPairingPaired,\n} from '../../../channels/pairing/pairing-service.js';\nimport {\n buildChannelCatalogForConfig,\n buildChannelCatalogFromSnapshot,\n getChannelSetupStatus,\n} from '../../../channels/catalog/channel-catalog-service.js';\nimport type { Config } from '../../../config/index.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport type { ChannelRuntimeActionPayload } from '../../../channels/plugins/types.adapters.js';\n\nfunction channelIdParam(raw: string | undefined): string {\n return (raw ?? '').trim().toLowerCase();\n}\n\nfunction accountIdFromQuery(raw: string | undefined): string {\n return raw?.trim() || 'default';\n}\n\nfunction actionPayloadChangedConfig(payload: ChannelRuntimeActionPayload | undefined): boolean {\n return Boolean(payload && 'configChanged' in payload && payload.configChanged === true);\n}\n\nfunction localeFromRequest(c: { req: { query(name: string): string | undefined; header(name: string): string | undefined } }): string | undefined {\n return c.req.query('locale') ?? c.req.header('X-XOPC-Locale') ?? c.req.header('Accept-Language')?.split(',')[0];\n}\n\nexport function registerChannelRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n const channelRateLimitMiddleware = deps.channelRateLimitMiddleware ?? strictRateLimitMiddleware;\n\n authenticated.get('/api/channels/catalog', (c) => {\n const snapshot = service.getExtensionLoader()?.getManifestSnapshot();\n const locale = localeFromRequest(c);\n const catalog = snapshot\n ? buildChannelCatalogFromSnapshot(snapshot, { locale })\n : buildChannelCatalogForConfig(service.currentConfig, { locale });\n const running = new Set(service.getRunningChannelIds());\n return c.json({\n ok: true,\n payload: {\n channels: catalog.entries.map((entry) => {\n const setupStatus = getChannelSetupStatus(service.currentConfig, entry.id, entry);\n return {\n ...entry,\n enabled: setupStatus.enabled,\n configured: setupStatus.ready,\n setupStatus,\n runtime: running.has(entry.id) ? 'loaded' : 'missing',\n };\n }),\n },\n });\n });\n\n authenticated.get('/api/channels/status', (c) => {\n const channels = service.getChannelsStatus();\n return c.json({ ok: true, payload: { channels } });\n });\n\n authenticated.get('/api/channels/meta', (c) => {\n const channels = service.getChannelsHubMeta();\n return c.json({ ok: true, payload: { channels } });\n });\n\n authenticated.get('/api/channels/:channelId/config', (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n if (!channel) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: 'Missing channel id' } }, 400);\n }\n const plugin = service.getChannelRuntimePlugin(channel);\n const value =\n plugin?.configSurface?.buildConfigSurface(service.currentConfig) ??\n (service.currentConfig.channels as Record<string, unknown> | undefined)?.[channel] ??\n {};\n return c.json({ ok: true, payload: { config: value } });\n });\n\n authenticated.post('/api/channels/:channelId/actions/:actionId', channelRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const action = c.req.param('actionId')?.trim() ?? '';\n if (!channel || !action) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: 'Missing channel/action id' } }, 400);\n }\n const plugin = await service.ensureChannelRuntimePlugin(channel);\n if (!plugin) {\n return c.json({ ok: false, error: { code: 'CHANNEL_RUNTIME_MISSING', message: 'Channel runtime is not loaded' } }, 404);\n }\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : undefined;\n const input = body && typeof body === 'object' ? (body as { input?: unknown }).input : undefined;\n\n if (action === 'doctor.run' && plugin.doctor) {\n const checks = await plugin.doctor.check({ cfg: service.currentConfig, locale: localeFromRequest(c) });\n return c.json({ ok: true, payload: { type: 'diagnostics', checks } });\n }\n\n if (plugin.runtimeActions) {\n const result = await plugin.runtimeActions.runAction({\n cfg: service.currentConfig,\n locale: localeFromRequest(c),\n actionId: action,\n accountId,\n input,\n });\n if (!result.ok) {\n return c.json({ ok: false, error: { code: 'CHANNEL_ACTION_FAILED', message: result.message ?? 'Channel action failed' } }, 400);\n }\n if (result.nextConfig) {\n const saved = await service.saveConfig(result.nextConfig);\n if (!saved.saved) {\n return c.json({ ok: false, error: { code: 'CHANNEL_ACTION_FAILED', message: saved.error ?? 'Failed to save channel config' } }, 500);\n }\n } else if (actionPayloadChangedConfig(result.payload)) {\n await service.reloadConfig();\n }\n return c.json({ ok: true, payload: result.payload ?? {} });\n }\n\n return c.json(\n {\n ok: false,\n error: {\n code: 'ACTION_NOT_IMPLEMENTED',\n message: `Channel action \"${channel}.${action}\" is not implemented by the runtime adapter.`,\n },\n },\n 501,\n );\n });\n\n authenticated.get('/api/channels/:channelId/pairing', (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n if (!channel) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: 'Missing channel id' } }, 400);\n }\n const accountId = accountIdFromQuery(c.req.query('account'));\n const config = service.currentConfig as Config | undefined;\n const state = listChannelPairingState({ channel, accountId, config });\n return c.json({ ok: true, payload: state });\n });\n\n authenticated.get('/api/channels/pairing/summary', (c) => {\n const config = service.currentConfig as Config | undefined;\n const summary = listChannelPairingSummary(config);\n return c.json({ ok: true, payload: { summary } });\n });\n\n authenticated.post('/api/channels/:channelId/pairing/approve', channelRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const code =\n body && typeof body === 'object' && typeof (body as { code?: unknown }).code === 'string'\n ? (body as { code: string }).code.trim()\n : '';\n const result = approveChannelPairing({ channel, accountId, code });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'PAIRING_INVALID', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { senderId: result.senderId, alreadyPaired: result.alreadyPaired } });\n });\n\n authenticated.post('/api/channels/:channelId/pairing/approve-sender', channelRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const senderId =\n body && typeof body === 'object' && typeof (body as { senderId?: unknown }).senderId === 'string'\n ? (body as { senderId: string }).senderId.trim()\n : '';\n const result = approveChannelPairingBySender({ channel, accountId, senderId });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'PAIRING_INVALID', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { senderId: result.senderId, alreadyPaired: result.alreadyPaired } });\n });\n\n authenticated.delete('/api/channels/:channelId/pairing/paired', channelRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const senderId =\n body && typeof body === 'object' && typeof (body as { senderId?: unknown }).senderId === 'string'\n ? (body as { senderId: string }).senderId.trim()\n : '';\n const result = revokeChannelPairingPaired({ channel, accountId, senderId });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'BAD_REQUEST', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { changed: result.changed } });\n });\n\n authenticated.delete('/api/channels/:channelId/pairing/pending', channelRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const body = await c.req.json().catch(() => ({}));\n const accountId =\n body && typeof body === 'object' && typeof (body as { accountId?: unknown }).accountId === 'string'\n ? (body as { accountId: string }).accountId.trim()\n : 'default';\n const senderId =\n body && typeof body === 'object' && typeof (body as { senderId?: unknown }).senderId === 'string'\n ? (body as { senderId: string }).senderId.trim()\n : '';\n const result = dismissChannelPairingPending({ channel, accountId, senderId });\n if (result.ok === false) {\n return c.json({ ok: false, error: { code: 'PAIRING_INVALID', message: result.error } }, 400);\n }\n return c.json({ ok: true, payload: { senderId: result.senderId } });\n });\n\n authenticated.get('/api/channels/:channelId/doctor', async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n const plugin = service.getChannelRuntimePlugin(channel);\n if (!plugin?.doctor) {\n return c.json({ ok: true, payload: { checks: [] } });\n }\n const checks = await plugin.doctor.check({ cfg: service.currentConfig });\n return c.json({ ok: true, payload: { checks } });\n });\n\n authenticated.post('/api/channels/:channelId/restart', channelRateLimitMiddleware, async (c) => {\n const channel = channelIdParam(c.req.param('channelId'));\n await service.restartChannel(channel);\n return c.json({ ok: true, payload: { restarted: true } });\n });\n}\n"],"mappings":";;;8BAc8D;AAK9D,SAAS,eAAe,KAAiC;AACvD,SAAQ,OAAO,IAAI,MAAM,CAAC,aAAa;;AAGzC,SAAS,mBAAmB,KAAiC;AAC3D,QAAO,KAAK,MAAM,IAAI;;AAGxB,SAAS,2BAA2B,SAA2D;AAC7F,QAAO,QAAQ,WAAW,mBAAmB,WAAW,QAAQ,kBAAkB,KAAK;;AAGzF,SAAS,kBAAkB,GAAuH;AAChJ,QAAO,EAAE,IAAI,MAAM,SAAS,IAAI,EAAE,IAAI,OAAO,gBAAgB,IAAI,EAAE,IAAI,OAAO,kBAAkB,EAAE,MAAM,IAAI,CAAC;;AAG/G,SAAgB,sBAAsB,eAAqB,MAAoC;CAC7F,MAAM,EAAE,SAAS,8BAA8B;CAC/C,MAAM,6BAA6B,KAAK,8BAA8B;AAEtE,eAAc,IAAI,0BAA0B,MAAM;EAChD,MAAM,WAAW,QAAQ,oBAAoB,EAAE,qBAAqB;EACpE,MAAM,SAAS,kBAAkB,EAAE;EACnC,MAAM,UAAU,WACZ,gCAAgC,UAAU,EAAE,QAAQ,CAAC,GACrD,6BAA6B,QAAQ,eAAe,EAAE,QAAQ,CAAC;EACnE,MAAM,UAAU,IAAI,IAAI,QAAQ,sBAAsB,CAAC;AACvD,SAAO,EAAE,KAAK;GACZ,IAAI;GACJ,SAAS,EACP,UAAU,QAAQ,QAAQ,KAAK,UAAU;IACvC,MAAM,cAAc,sBAAsB,QAAQ,eAAe,MAAM,IAAI,MAAM;AACjF,WAAO;KACL,GAAG;KACH,SAAS,YAAY;KACrB,YAAY,YAAY;KACxB;KACA,SAAS,QAAQ,IAAI,MAAM,GAAG,GAAG,WAAW;KAC7C;KACD,EACH;GACF,CAAC;GACF;AAEF,eAAc,IAAI,yBAAyB,MAAM;EAC/C,MAAM,WAAW,QAAQ,mBAAmB;AAC5C,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,UAAU;GAAE,CAAC;GAClD;AAEF,eAAc,IAAI,uBAAuB,MAAM;EAC7C,MAAM,WAAW,QAAQ,oBAAoB;AAC7C,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,UAAU;GAAE,CAAC;GAClD;AAEF,eAAc,IAAI,oCAAoC,MAAM;EAC1D,MAAM,UAAU,eAAe,EAAE,IAAI,MAAM,YAAY,CAAC;AACxD,MAAI,CAAC,QACH,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;IAAE,MAAM;IAAe,SAAS;IAAsB;GAAE,EAAE,IAAI;EAGlG,MAAM,QADS,QAAQ,wBAAwB,QAEvC,EAAE,eAAe,mBAAmB,QAAQ,cAAc,IAC/D,QAAQ,cAAc,WAAmD,YAC1E,EAAE;AACJ,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,QAAQ,OAAO;GAAE,CAAC;GACvD;AAEF,eAAc,KAAK,8CAA8C,4BAA4B,OAAO,MAAM;EACxG,MAAM,UAAU,eAAe,EAAE,IAAI,MAAM,YAAY,CAAC;EACxD,MAAM,SAAS,EAAE,IAAI,MAAM,WAAW,EAAE,MAAM,IAAI;AAClD,MAAI,CAAC,WAAW,CAAC,OACf,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;IAAE,MAAM;IAAe,SAAS;IAA6B;GAAE,EAAE,IAAI;EAEzG,MAAM,SAAS,MAAM,QAAQ,2BAA2B,QAAQ;AAChE,MAAI,CAAC,OACH,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;IAAE,MAAM;IAA2B,SAAS;IAAiC;GAAE,EAAE,IAAI;EAEzH,MAAM,OAAO,MAAM,EAAE,IAAI,MAAM,CAAC,aAAa,EAAE,EAAE;EACjD,MAAM,YACJ,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAAiC,cAAc,WACtF,KAA+B,UAAU,MAAM,GAChD,KAAA;EACN,MAAM,QAAQ,QAAQ,OAAO,SAAS,WAAY,KAA6B,QAAQ,KAAA;AAEvF,MAAI,WAAW,gBAAgB,OAAO,QAAQ;GAC5C,MAAM,SAAS,MAAM,OAAO,OAAO,MAAM;IAAE,KAAK,QAAQ;IAAe,QAAQ,kBAAkB,EAAE;IAAE,CAAC;AACtG,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS;KAAE,MAAM;KAAe;KAAQ;IAAE,CAAC;;AAGvE,MAAI,OAAO,gBAAgB;GACzB,MAAM,SAAS,MAAM,OAAO,eAAe,UAAU;IACnD,KAAK,QAAQ;IACb,QAAQ,kBAAkB,EAAE;IAC5B,UAAU;IACV;IACA;IACD,CAAC;AACF,OAAI,CAAC,OAAO,GACV,QAAO,EAAE,KAAK;IAAE,IAAI;IAAO,OAAO;KAAE,MAAM;KAAyB,SAAS,OAAO,WAAW;KAAyB;IAAE,EAAE,IAAI;AAEjI,OAAI,OAAO,YAAY;IACrB,MAAM,QAAQ,MAAM,QAAQ,WAAW,OAAO,WAAW;AACzD,QAAI,CAAC,MAAM,MACT,QAAO,EAAE,KAAK;KAAE,IAAI;KAAO,OAAO;MAAE,MAAM;MAAyB,SAAS,MAAM,SAAS;MAAiC;KAAE,EAAE,IAAI;cAE7H,2BAA2B,OAAO,QAAQ,CACnD,OAAM,QAAQ,cAAc;AAE9B,UAAO,EAAE,KAAK;IAAE,IAAI;IAAM,SAAS,OAAO,WAAW,EAAE;IAAE,CAAC;;AAG5D,SAAO,EAAE,KACP;GACE,IAAI;GACJ,OAAO;IACL,MAAM;IACN,SAAS,mBAAmB,QAAQ,GAAG,OAAO;IAC/C;GACF,EACD,IACD;GACD;AAEF,eAAc,IAAI,qCAAqC,MAAM;EAC3D,MAAM,UAAU,eAAe,EAAE,IAAI,MAAM,YAAY,CAAC;AACxD,MAAI,CAAC,QACH,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;IAAE,MAAM;IAAe,SAAS;IAAsB;GAAE,EAAE,IAAI;EAElG,MAAM,YAAY,mBAAmB,EAAE,IAAI,MAAM,UAAU,CAAC;EAC5D,MAAM,SAAS,QAAQ;EACvB,MAAM,QAAQ,wBAAwB;GAAE;GAAS;GAAW;GAAQ,CAAC;AACrE,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS;GAAO,CAAC;GAC3C;AAEF,eAAc,IAAI,kCAAkC,MAAM;EACxD,MAAM,SAAS,QAAQ;EACvB,MAAM,UAAU,0BAA0B,OAAO;AACjD,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,SAAS;GAAE,CAAC;GACjD;AAEF,eAAc,KAAK,4CAA4C,4BAA4B,OAAO,MAAM;EACtG,MAAM,UAAU,eAAe,EAAE,IAAI,MAAM,YAAY,CAAC;EACxD,MAAM,OAAO,MAAM,EAAE,IAAI,MAAM,CAAC,aAAa,EAAE,EAAE;EASjD,MAAM,SAAS,sBAAsB;GAAE;GAAS,WAP9C,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAAiC,cAAc,WACtF,KAA+B,UAAU,MAAM,GAChD;GAKqD,MAHzD,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAA4B,SAAS,WAC5E,KAA0B,KAAK,MAAM,GACtC;GAC2D,CAAC;AAClE,MAAI,OAAO,OAAO,MAChB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;IAAE,MAAM;IAAmB,SAAS,OAAO;IAAO;GAAE,EAAE,IAAI;AAE9F,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS;IAAE,UAAU,OAAO;IAAU,eAAe,OAAO;IAAe;GAAE,CAAC;GACxG;AAEF,eAAc,KAAK,mDAAmD,4BAA4B,OAAO,MAAM;EAC7G,MAAM,UAAU,eAAe,EAAE,IAAI,MAAM,YAAY,CAAC;EACxD,MAAM,OAAO,MAAM,EAAE,IAAI,MAAM,CAAC,aAAa,EAAE,EAAE;EASjD,MAAM,SAAS,8BAA8B;GAAE;GAAS,WAPtD,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAAiC,cAAc,WACtF,KAA+B,UAAU,MAAM,GAChD;GAK6D,UAHjE,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAAgC,aAAa,WACpF,KAA8B,SAAS,MAAM,GAC9C;GACuE,CAAC;AAC9E,MAAI,OAAO,OAAO,MAChB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;IAAE,MAAM;IAAmB,SAAS,OAAO;IAAO;GAAE,EAAE,IAAI;AAE9F,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS;IAAE,UAAU,OAAO;IAAU,eAAe,OAAO;IAAe;GAAE,CAAC;GACxG;AAEF,eAAc,OAAO,2CAA2C,4BAA4B,OAAO,MAAM;EACvG,MAAM,UAAU,eAAe,EAAE,IAAI,MAAM,YAAY,CAAC;EACxD,MAAM,OAAO,MAAM,EAAE,IAAI,MAAM,CAAC,aAAa,EAAE,EAAE;EASjD,MAAM,SAAS,2BAA2B;GAAE;GAAS,WAPnD,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAAiC,cAAc,WACtF,KAA+B,UAAU,MAAM,GAChD;GAK0D,UAH9D,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAAgC,aAAa,WACpF,KAA8B,SAAS,MAAM,GAC9C;GACoE,CAAC;AAC3E,MAAI,OAAO,OAAO,MAChB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;IAAE,MAAM;IAAe,SAAS,OAAO;IAAO;GAAE,EAAE,IAAI;AAE1F,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,SAAS,OAAO,SAAS;GAAE,CAAC;GACjE;AAEF,eAAc,OAAO,4CAA4C,4BAA4B,OAAO,MAAM;EACxG,MAAM,UAAU,eAAe,EAAE,IAAI,MAAM,YAAY,CAAC;EACxD,MAAM,OAAO,MAAM,EAAE,IAAI,MAAM,CAAC,aAAa,EAAE,EAAE;EASjD,MAAM,SAAS,6BAA6B;GAAE;GAAS,WAPrD,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAAiC,cAAc,WACtF,KAA+B,UAAU,MAAM,GAChD;GAK4D,UAHhE,QAAQ,OAAO,SAAS,YAAY,OAAQ,KAAgC,aAAa,WACpF,KAA8B,SAAS,MAAM,GAC9C;GACsE,CAAC;AAC7E,MAAI,OAAO,OAAO,MAChB,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;IAAE,MAAM;IAAmB,SAAS,OAAO;IAAO;GAAE,EAAE,IAAI;AAE9F,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,UAAU,OAAO,UAAU;GAAE,CAAC;GACnE;AAEF,eAAc,IAAI,mCAAmC,OAAO,MAAM;EAChE,MAAM,UAAU,eAAe,EAAE,IAAI,MAAM,YAAY,CAAC;EACxD,MAAM,SAAS,QAAQ,wBAAwB,QAAQ;AACvD,MAAI,CAAC,QAAQ,OACX,QAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,QAAQ,EAAE,EAAE;GAAE,CAAC;EAEtD,MAAM,SAAS,MAAM,OAAO,OAAO,MAAM,EAAE,KAAK,QAAQ,eAAe,CAAC;AACxE,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,QAAQ;GAAE,CAAC;GAChD;AAEF,eAAc,KAAK,oCAAoC,4BAA4B,OAAO,MAAM;EAC9F,MAAM,UAAU,eAAe,EAAE,IAAI,MAAM,YAAY,CAAC;AACxD,QAAM,QAAQ,eAAe,QAAQ;AACrC,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,SAAS,EAAE,WAAW,MAAM;GAAE,CAAC;GACzD"}
@@ -1,5 +1,5 @@
1
- import { CredentialResolver, init_credentials } from "../../../../auth/credentials.js";
2
1
  import { BindingsConfigSchema, McpConfigSchema, init_schema } from "../../../../config/schema.js";
2
+ import { CredentialResolver, init_credentials } from "../../../../auth/credentials.js";
3
3
  import { canonicalizeConfiguredMcpServer } from "../../../../config/mcp-config-normalize.js";
4
4
  import { mergeCronConfigPatch, mergeGatewaySkillsMarketplacePatch, mergeGoalsConfigPatch, mergeSessionConfigPatch, mergeUpdateConfigPatch } from "../../../../config/web-patch.js";
5
5
  import { assertGatewayAuthConfigured, resolveGatewayAuth } from "../../../auth.js";
@@ -4,5 +4,6 @@ import type { SSEHandlerConfig } from '../sse.js';
4
4
  export interface AuthenticatedRouteDeps {
5
5
  service: GatewayService;
6
6
  strictRateLimitMiddleware: MiddlewareHandler;
7
+ channelRateLimitMiddleware?: MiddlewareHandler;
7
8
  sseConfig: SSEHandlerConfig;
8
9
  }
@@ -5,8 +5,8 @@ import { parseDreamingLastRunFile } from "../../../agent/memory/dreaming/last-ru
5
5
  import { readDreamingEvents } from "../../../agent/memory/dreaming/events.js";
6
6
  import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
7
7
  import { previewDreamingDeepPromotion } from "../../../agent/memory/dreaming/preview.js";
8
- import fs from "node:fs/promises";
9
8
  import path from "node:path";
9
+ import fs from "node:fs/promises";
10
10
  //#region src/gateway/hono/routes/dreaming.ts
11
11
  function isRecord(v) {
12
12
  return v !== null && typeof v === "object" && !Array.isArray(v);
@@ -1,7 +1,7 @@
1
1
  import { createGatewayRouteLogger } from "../lib/route-logger.js";
2
- import { readdir, realpath, stat } from "node:fs/promises";
3
- import * as path$1 from "node:path";
4
2
  import * as os$1 from "node:os";
3
+ import * as path$1 from "node:path";
4
+ import { readdir, realpath, stat } from "node:fs/promises";
5
5
  //#region src/gateway/hono/routes/host-fs.ts
6
6
  const log = createGatewayRouteLogger("HostFs");
7
7
  function jsonError(status, message) {
@@ -1,5 +1,5 @@
1
- import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
2
1
  import { resolveModelsJsonPath } from "../../../config/paths.js";
2
+ import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
3
3
  import { init_models_json, loadModelsJson, saveModelsJson, validateModelsConfig } from "../../../config/models-json.js";
4
4
  import { getModelRegistry } from "../../../providers/model-registry.js";
5
5
  import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
@@ -13,8 +13,8 @@ import { getClientIpFromHeaders } from "../../security/loopback.js";
13
13
  import { renderFolderLandingPage, renderShareExpiredPage, renderShareLandingPage } from "../../../share/share-landing.js";
14
14
  import { consumeSharePublicLimit } from "../../../share/share-rate-limit.js";
15
15
  import { createZipStream, planDirectoryFiles } from "../../../share/share-zip.js";
16
- import { createHash } from "node:crypto";
17
16
  import { createReadStream } from "node:fs";
17
+ import { createHash } from "node:crypto";
18
18
  import { stat } from "node:fs/promises";
19
19
  import { Readable } from "node:stream";
20
20
  //#region src/gateway/hono/routes/shares.ts
@@ -7,8 +7,8 @@ import "../../../workflows/domain/index.js";
7
7
  import { resolveWorkflowRunArtifactsDir } from "../../../workflows/store/paths.js";
8
8
  import { WorkflowDraftService } from "../../../workflows/draft/workflow-draft-service.js";
9
9
  import "../../../workflows/draft/index.js";
10
- import { readFile, stat } from "node:fs/promises";
11
10
  import { basename, join } from "node:path";
11
+ import { readFile, stat } from "node:fs/promises";
12
12
  //#region src/gateway/hono/routes/workflows.ts
13
13
  init_agent_scope();
14
14
  function registerWorkflowRoutes(authenticated, deps) {
@@ -8,10 +8,10 @@ import { resolveHeartbeatMdPath } from "../../workspace-heartbeat-path.js";
8
8
  import { createGatewayRouteLogger } from "../lib/route-logger.js";
9
9
  import { runRipgrepInDirectory } from "../../workspace-ripgrep.js";
10
10
  import { fuzzySearchWorkspaceFiles } from "../../workspace-file-search.js";
11
- import { randomUUID } from "node:crypto";
11
+ import { basename, dirname, join, resolve } from "node:path";
12
12
  import { constants } from "node:fs";
13
+ import { randomUUID } from "node:crypto";
13
14
  import { copyFile, link, mkdir, readFile, readdir, rename, stat, unlink, writeFile } from "node:fs/promises";
14
- import { basename, dirname, join, resolve } from "node:path";
15
15
  //#region src/gateway/hono/routes/workspace.ts
16
16
  init_agent_scope();
17
17
  const log = createGatewayRouteLogger("Workspace");
@@ -1,8 +1,8 @@
1
- import { createHash } from "node:crypto";
2
- import fs from "node:fs";
3
- import fs$1 from "node:fs/promises";
4
1
  import path from "node:path";
5
2
  import net from "node:net";
3
+ import fs from "node:fs";
4
+ import { createHash } from "node:crypto";
5
+ import fs$1 from "node:fs/promises";
6
6
  import { homedir } from "os";
7
7
  //#region src/gateway/lock.ts
8
8
  /**
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import fs from "node:fs";
4
3
  import net from "node:net";
4
+ import fs from "node:fs";
5
5
  import { execFileSync } from "node:child_process";
6
6
  //#region src/gateway/ports.ts
7
7
  /**
@@ -35,6 +35,7 @@ declare class BucketRegistry {
35
35
  private authFailureLimiter?;
36
36
  private authFailureSignature?;
37
37
  private strictApiLimiter?;
38
+ private channelApiLimiter?;
38
39
  private tunnelMutateLimiter?;
39
40
  private pairingExchangeLimiter?;
40
41
  private sharePublicShortLimiter?;
@@ -47,6 +48,8 @@ declare class BucketRegistry {
47
48
  authFailure(cfg: ResolvedAuthRateLimitConfig): FailureLimiter;
48
49
  /** Sensitive admin / mutation endpoints — 15 req / 60 s per client IP. */
49
50
  strictApi(): RateLimiter;
51
+ /** Channel mutation/action endpoints — 20 req / 60 s per client IP. */
52
+ channelApi(): RateLimiter;
50
53
  /** Tunnel mutation calls — 12 req / 5 min per gateway-token fingerprint. */
51
54
  tunnelMutate(): RateLimiter;
52
55
  /** Failed pairing-exchange attempts — 30 failures / 5 min per client IP. */
@@ -47,6 +47,7 @@ var BucketRegistry = class {
47
47
  authFailureLimiter;
48
48
  authFailureSignature;
49
49
  strictApiLimiter;
50
+ channelApiLimiter;
50
51
  tunnelMutateLimiter;
51
52
  pairingExchangeLimiter;
52
53
  sharePublicShortLimiter;
@@ -78,6 +79,14 @@ var BucketRegistry = class {
78
79
  });
79
80
  return this.strictApiLimiter;
80
81
  }
82
+ /** Channel mutation/action endpoints — 20 req / 60 s per client IP. */
83
+ channelApi() {
84
+ if (!this.channelApiLimiter) this.channelApiLimiter = new RateLimiter({
85
+ maxRequests: 20,
86
+ windowMs: 6e4
87
+ });
88
+ return this.channelApiLimiter;
89
+ }
81
90
  /** Tunnel mutation calls — 12 req / 5 min per gateway-token fingerprint. */
82
91
  tunnelMutate() {
83
92
  if (!this.tunnelMutateLimiter) this.tunnelMutateLimiter = new RateLimiter({
@@ -114,12 +123,14 @@ var BucketRegistry = class {
114
123
  destroyAll() {
115
124
  this.authFailureLimiter?.destroy();
116
125
  this.strictApiLimiter?.destroy();
126
+ this.channelApiLimiter?.destroy();
117
127
  this.tunnelMutateLimiter?.destroy();
118
128
  this.pairingExchangeLimiter?.destroy();
119
129
  this.sharePublicShortLimiter?.destroy();
120
130
  this.sharePublicLongLimiter?.destroy();
121
131
  this.authFailureLimiter = void 0;
122
132
  this.strictApiLimiter = void 0;
133
+ this.channelApiLimiter = void 0;
123
134
  this.tunnelMutateLimiter = void 0;
124
135
  this.pairingExchangeLimiter = void 0;
125
136
  this.sharePublicShortLimiter = void 0;
@@ -130,6 +141,7 @@ var BucketRegistry = class {
130
141
  resetAllForTests() {
131
142
  this.authFailureLimiter?.resetForTests();
132
143
  this.strictApiLimiter?.resetForTests();
144
+ this.channelApiLimiter?.resetForTests();
133
145
  this.tunnelMutateLimiter?.resetForTests();
134
146
  this.pairingExchangeLimiter?.resetForTests();
135
147
  this.sharePublicShortLimiter?.resetForTests();
@@ -1 +1 @@
1
- {"version":3,"file":"buckets.js","names":[],"sources":["../../../../src/gateway/rate-limit/buckets.ts"],"sourcesContent":["/**\n * Named rate-limit buckets used across the gateway. Each is a thin wrapper\n * over a primitive limiter ({@link RateLimiter} or {@link FailureLimiter})\n * that hard-codes its config and exposes a small surface.\n *\n * All buckets are owned by a process-level singleton {@link BucketRegistry}\n * so that:\n * - lifecycle (cleanup timers) is centralized — `destroyAll()` on shutdown,\n * - tests get one obvious reset entry point (`resetAllForTests`),\n * - new buckets are added in exactly one place.\n *\n * Tuning policy:\n * - `auth_failure` is read from runtime config because users tune it per\n * deployment. Other buckets keep static defaults until a real need\n * emerges to expose them. (YAGNI > premature configurability.)\n */\n\nimport { FailureLimiter, RateLimiter } from '../../infra/rate-limit/index.js';\n\nimport type { GatewayAuthRateLimitConfig } from '../../config/schema.js';\nimport type { AuthRateLimitPolicyConfig } from './auth-policy.js';\n\n/**\n * Auth-failure config validated/normalized into the shape both the limiter\n * primitive and the policy layer need.\n */\nexport type ResolvedAuthRateLimitConfig = {\n enabled: boolean;\n maxFailures: number;\n windowMs: number;\n blockDurationMs: number;\n burstCoalesceMs: number;\n exemptLoopback: boolean;\n};\n\nconst DEFAULT_AUTH_RATE_LIMIT: ResolvedAuthRateLimitConfig = {\n enabled: true,\n maxFailures: 5,\n windowMs: 15 * 60 * 1000,\n blockDurationMs: 5 * 60 * 1000,\n burstCoalesceMs: 1000,\n exemptLoopback: true,\n};\n\nexport function resolveAuthRateLimit(\n input: GatewayAuthRateLimitConfig | undefined,\n): ResolvedAuthRateLimitConfig {\n if (!input) return { ...DEFAULT_AUTH_RATE_LIMIT };\n const blockDurationMs =\n input.blockDurationMs ?? input.lockoutMs ?? DEFAULT_AUTH_RATE_LIMIT.blockDurationMs;\n return {\n enabled: input.enabled ?? DEFAULT_AUTH_RATE_LIMIT.enabled,\n maxFailures: Math.max(1, Math.floor(input.maxAttempts ?? DEFAULT_AUTH_RATE_LIMIT.maxFailures)),\n windowMs: Math.max(1000, Math.floor(input.windowMs ?? DEFAULT_AUTH_RATE_LIMIT.windowMs)),\n blockDurationMs: Math.max(1000, Math.floor(blockDurationMs)),\n burstCoalesceMs: Math.max(\n 0,\n Math.floor(input.burstCoalesceMs ?? DEFAULT_AUTH_RATE_LIMIT.burstCoalesceMs),\n ),\n exemptLoopback: input.exemptLoopback ?? DEFAULT_AUTH_RATE_LIMIT.exemptLoopback,\n };\n}\n\nexport function authPolicyConfig(\n cfg: ResolvedAuthRateLimitConfig,\n): AuthRateLimitPolicyConfig {\n return { enabled: cfg.enabled, exemptLoopback: cfg.exemptLoopback };\n}\n\nclass BucketRegistry {\n private authFailureLimiter?: FailureLimiter;\n private authFailureSignature?: string;\n\n private strictApiLimiter?: RateLimiter;\n private tunnelMutateLimiter?: RateLimiter;\n private pairingExchangeLimiter?: FailureLimiter;\n private sharePublicShortLimiter?: RateLimiter;\n private sharePublicLongLimiter?: RateLimiter;\n\n /**\n * Reconfigured on the fly when `gateway.auth.rateLimit` is reloaded —\n * compares a stable signature to avoid swapping out a hot bucket on every\n * config read.\n */\n authFailure(cfg: ResolvedAuthRateLimitConfig): FailureLimiter {\n const sig = `${cfg.maxFailures}|${cfg.windowMs}|${cfg.blockDurationMs}|${cfg.burstCoalesceMs}`;\n if (!this.authFailureLimiter || this.authFailureSignature !== sig) {\n this.authFailureLimiter?.destroy();\n this.authFailureLimiter = new FailureLimiter({\n maxFailures: cfg.maxFailures,\n windowMs: cfg.windowMs,\n blockDurationMs: cfg.blockDurationMs,\n burstCoalesceMs: cfg.burstCoalesceMs,\n });\n this.authFailureSignature = sig;\n }\n return this.authFailureLimiter;\n }\n\n /** Sensitive admin / mutation endpoints — 15 req / 60 s per client IP. */\n strictApi(): RateLimiter {\n if (!this.strictApiLimiter) {\n this.strictApiLimiter = new RateLimiter({ maxRequests: 15, windowMs: 60_000 });\n }\n return this.strictApiLimiter;\n }\n\n /** Tunnel mutation calls — 12 req / 5 min per gateway-token fingerprint. */\n tunnelMutate(): RateLimiter {\n if (!this.tunnelMutateLimiter) {\n this.tunnelMutateLimiter = new RateLimiter({\n maxRequests: 12,\n windowMs: 5 * 60_000,\n });\n }\n return this.tunnelMutateLimiter;\n }\n\n /** Failed pairing-exchange attempts — 30 failures / 5 min per client IP. */\n pairingExchange(): FailureLimiter {\n if (!this.pairingExchangeLimiter) {\n this.pairingExchangeLimiter = new FailureLimiter({\n maxFailures: 30,\n windowMs: 5 * 60_000,\n blockDurationMs: 5 * 60_000,\n });\n }\n return this.pairingExchangeLimiter;\n }\n\n /** Public share download short window — 60 req / min per client IP. */\n sharePublicShort(): RateLimiter {\n if (!this.sharePublicShortLimiter) {\n this.sharePublicShortLimiter = new RateLimiter({\n maxRequests: 60,\n windowMs: 60_000,\n });\n }\n return this.sharePublicShortLimiter;\n }\n\n /** Public share download long window — 300 req / 15 min per client IP. */\n sharePublicLong(): RateLimiter {\n if (!this.sharePublicLongLimiter) {\n this.sharePublicLongLimiter = new RateLimiter({\n maxRequests: 300,\n windowMs: 15 * 60_000,\n });\n }\n return this.sharePublicLongLimiter;\n }\n\n destroyAll(): void {\n this.authFailureLimiter?.destroy();\n this.strictApiLimiter?.destroy();\n this.tunnelMutateLimiter?.destroy();\n this.pairingExchangeLimiter?.destroy();\n this.sharePublicShortLimiter?.destroy();\n this.sharePublicLongLimiter?.destroy();\n this.authFailureLimiter = undefined;\n this.strictApiLimiter = undefined;\n this.tunnelMutateLimiter = undefined;\n this.pairingExchangeLimiter = undefined;\n this.sharePublicShortLimiter = undefined;\n this.sharePublicLongLimiter = undefined;\n this.authFailureSignature = undefined;\n }\n\n /** @internal */\n resetAllForTests(): void {\n this.authFailureLimiter?.resetForTests();\n this.strictApiLimiter?.resetForTests();\n this.tunnelMutateLimiter?.resetForTests();\n this.pairingExchangeLimiter?.resetForTests();\n this.sharePublicShortLimiter?.resetForTests();\n this.sharePublicLongLimiter?.resetForTests();\n }\n}\n\nexport const buckets = new BucketRegistry();\n"],"mappings":"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"}
1
+ {"version":3,"file":"buckets.js","names":[],"sources":["../../../../src/gateway/rate-limit/buckets.ts"],"sourcesContent":["/**\n * Named rate-limit buckets used across the gateway. Each is a thin wrapper\n * over a primitive limiter ({@link RateLimiter} or {@link FailureLimiter})\n * that hard-codes its config and exposes a small surface.\n *\n * All buckets are owned by a process-level singleton {@link BucketRegistry}\n * so that:\n * - lifecycle (cleanup timers) is centralized — `destroyAll()` on shutdown,\n * - tests get one obvious reset entry point (`resetAllForTests`),\n * - new buckets are added in exactly one place.\n *\n * Tuning policy:\n * - `auth_failure` is read from runtime config because users tune it per\n * deployment. Other buckets keep static defaults until a real need\n * emerges to expose them. (YAGNI > premature configurability.)\n */\n\nimport { FailureLimiter, RateLimiter } from '../../infra/rate-limit/index.js';\n\nimport type { GatewayAuthRateLimitConfig } from '../../config/schema.js';\nimport type { AuthRateLimitPolicyConfig } from './auth-policy.js';\n\n/**\n * Auth-failure config validated/normalized into the shape both the limiter\n * primitive and the policy layer need.\n */\nexport type ResolvedAuthRateLimitConfig = {\n enabled: boolean;\n maxFailures: number;\n windowMs: number;\n blockDurationMs: number;\n burstCoalesceMs: number;\n exemptLoopback: boolean;\n};\n\nconst DEFAULT_AUTH_RATE_LIMIT: ResolvedAuthRateLimitConfig = {\n enabled: true,\n maxFailures: 5,\n windowMs: 15 * 60 * 1000,\n blockDurationMs: 5 * 60 * 1000,\n burstCoalesceMs: 1000,\n exemptLoopback: true,\n};\n\nexport function resolveAuthRateLimit(\n input: GatewayAuthRateLimitConfig | undefined,\n): ResolvedAuthRateLimitConfig {\n if (!input) return { ...DEFAULT_AUTH_RATE_LIMIT };\n const blockDurationMs =\n input.blockDurationMs ?? input.lockoutMs ?? DEFAULT_AUTH_RATE_LIMIT.blockDurationMs;\n return {\n enabled: input.enabled ?? DEFAULT_AUTH_RATE_LIMIT.enabled,\n maxFailures: Math.max(1, Math.floor(input.maxAttempts ?? DEFAULT_AUTH_RATE_LIMIT.maxFailures)),\n windowMs: Math.max(1000, Math.floor(input.windowMs ?? DEFAULT_AUTH_RATE_LIMIT.windowMs)),\n blockDurationMs: Math.max(1000, Math.floor(blockDurationMs)),\n burstCoalesceMs: Math.max(\n 0,\n Math.floor(input.burstCoalesceMs ?? DEFAULT_AUTH_RATE_LIMIT.burstCoalesceMs),\n ),\n exemptLoopback: input.exemptLoopback ?? DEFAULT_AUTH_RATE_LIMIT.exemptLoopback,\n };\n}\n\nexport function authPolicyConfig(\n cfg: ResolvedAuthRateLimitConfig,\n): AuthRateLimitPolicyConfig {\n return { enabled: cfg.enabled, exemptLoopback: cfg.exemptLoopback };\n}\n\nclass BucketRegistry {\n private authFailureLimiter?: FailureLimiter;\n private authFailureSignature?: string;\n\n private strictApiLimiter?: RateLimiter;\n private channelApiLimiter?: RateLimiter;\n private tunnelMutateLimiter?: RateLimiter;\n private pairingExchangeLimiter?: FailureLimiter;\n private sharePublicShortLimiter?: RateLimiter;\n private sharePublicLongLimiter?: RateLimiter;\n\n /**\n * Reconfigured on the fly when `gateway.auth.rateLimit` is reloaded —\n * compares a stable signature to avoid swapping out a hot bucket on every\n * config read.\n */\n authFailure(cfg: ResolvedAuthRateLimitConfig): FailureLimiter {\n const sig = `${cfg.maxFailures}|${cfg.windowMs}|${cfg.blockDurationMs}|${cfg.burstCoalesceMs}`;\n if (!this.authFailureLimiter || this.authFailureSignature !== sig) {\n this.authFailureLimiter?.destroy();\n this.authFailureLimiter = new FailureLimiter({\n maxFailures: cfg.maxFailures,\n windowMs: cfg.windowMs,\n blockDurationMs: cfg.blockDurationMs,\n burstCoalesceMs: cfg.burstCoalesceMs,\n });\n this.authFailureSignature = sig;\n }\n return this.authFailureLimiter;\n }\n\n /** Sensitive admin / mutation endpoints — 15 req / 60 s per client IP. */\n strictApi(): RateLimiter {\n if (!this.strictApiLimiter) {\n this.strictApiLimiter = new RateLimiter({ maxRequests: 15, windowMs: 60_000 });\n }\n return this.strictApiLimiter;\n }\n\n /** Channel mutation/action endpoints — 20 req / 60 s per client IP. */\n channelApi(): RateLimiter {\n if (!this.channelApiLimiter) {\n this.channelApiLimiter = new RateLimiter({ maxRequests: 20, windowMs: 60_000 });\n }\n return this.channelApiLimiter;\n }\n\n /** Tunnel mutation calls — 12 req / 5 min per gateway-token fingerprint. */\n tunnelMutate(): RateLimiter {\n if (!this.tunnelMutateLimiter) {\n this.tunnelMutateLimiter = new RateLimiter({\n maxRequests: 12,\n windowMs: 5 * 60_000,\n });\n }\n return this.tunnelMutateLimiter;\n }\n\n /** Failed pairing-exchange attempts — 30 failures / 5 min per client IP. */\n pairingExchange(): FailureLimiter {\n if (!this.pairingExchangeLimiter) {\n this.pairingExchangeLimiter = new FailureLimiter({\n maxFailures: 30,\n windowMs: 5 * 60_000,\n blockDurationMs: 5 * 60_000,\n });\n }\n return this.pairingExchangeLimiter;\n }\n\n /** Public share download short window — 60 req / min per client IP. */\n sharePublicShort(): RateLimiter {\n if (!this.sharePublicShortLimiter) {\n this.sharePublicShortLimiter = new RateLimiter({\n maxRequests: 60,\n windowMs: 60_000,\n });\n }\n return this.sharePublicShortLimiter;\n }\n\n /** Public share download long window — 300 req / 15 min per client IP. */\n sharePublicLong(): RateLimiter {\n if (!this.sharePublicLongLimiter) {\n this.sharePublicLongLimiter = new RateLimiter({\n maxRequests: 300,\n windowMs: 15 * 60_000,\n });\n }\n return this.sharePublicLongLimiter;\n }\n\n destroyAll(): void {\n this.authFailureLimiter?.destroy();\n this.strictApiLimiter?.destroy();\n this.channelApiLimiter?.destroy();\n this.tunnelMutateLimiter?.destroy();\n this.pairingExchangeLimiter?.destroy();\n this.sharePublicShortLimiter?.destroy();\n this.sharePublicLongLimiter?.destroy();\n this.authFailureLimiter = undefined;\n this.strictApiLimiter = undefined;\n this.channelApiLimiter = undefined;\n this.tunnelMutateLimiter = undefined;\n this.pairingExchangeLimiter = undefined;\n this.sharePublicShortLimiter = undefined;\n this.sharePublicLongLimiter = undefined;\n this.authFailureSignature = undefined;\n }\n\n /** @internal */\n resetAllForTests(): void {\n this.authFailureLimiter?.resetForTests();\n this.strictApiLimiter?.resetForTests();\n this.channelApiLimiter?.resetForTests();\n this.tunnelMutateLimiter?.resetForTests();\n this.pairingExchangeLimiter?.resetForTests();\n this.sharePublicShortLimiter?.resetForTests();\n this.sharePublicLongLimiter?.resetForTests();\n }\n}\n\nexport const buckets = new BucketRegistry();\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { getModelRegistry } from "../../providers/model-registry.js";
4
3
  import { loadConfig, saveConfig } from "../../config/loader.js";
4
+ import { getModelRegistry } from "../../providers/model-registry.js";
5
5
  import { init_providers } from "../../providers/index.js";
6
6
  import { disposeAllSessionMcpRuntimes } from "../../agent/mcp/bundle-mcp-runtime.js";
7
7
  import "../../agent/mcp/bundle-mcp-tools.js";
@@ -1,7 +1,7 @@
1
1
  import { resolveStateDir } from "../../config/paths-state.js";
2
- import { init_paths, resolveExtensionsDir } from "../../config/paths.js";
3
2
  import { createLogger } from "../../utils/logger/index.js";
4
3
  import { init_logger } from "../../utils/logger.js";
4
+ import { init_paths, resolveExtensionsDir } from "../../config/paths.js";
5
5
  import { createSkillConfigManager } from "../../agent/skills/config.js";
6
6
  import { removeSkillsLockEntry } from "../../agent/skills/hub-lock.js";
7
7
  import { deleteManagedSkill, installSkillFromZip, listManagedSkillDirs } from "../../agent/skills/managed-store.js";
@@ -11,8 +11,8 @@ import { installExtensionFromStoreZip, peekExtensionIdFromStoreZip } from "../..
11
11
  import { downloadExtensionStoreZipBuffer, fetchMarketplacePackageDetail, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl } from "../../agent/skills/marketplace/adapters/store/store-api-client.js";
12
12
  import { getMarketplaceProviderDisplayName, resolveSkillsMarketplaceProvider } from "../../agent/skills/marketplace/resolve-adapter.js";
13
13
  import { downloadFromMarketplace, getMarketplacePackageDetail, listMarketplaceCategories, listMarketplacePackages } from "../../agent/skills/skills-marketplace.js";
14
- import { existsSync, mkdirSync, rmSync } from "node:fs";
15
14
  import { join } from "node:path";
15
+ import { existsSync, mkdirSync, rmSync } from "node:fs";
16
16
  //#region src/gateway/service/marketplace-service.ts
17
17
  /**
18
18
  * GatewayMarketplaceService — install / browse / remove for the two marketplaces
@@ -1,18 +1,18 @@
1
1
  import { __toCommonJS } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { PACKAGE_VERSION, init_package_version } from "../package-version.js";
3
3
  import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveDefaultAgentId } from "../agent/agent-scope.js";
4
- import { init_paths, resolveAgentDir, resolveConfigPath, resolveExtensionsDir } from "../config/paths.js";
4
+ import { buildSessionKey, init_session_key, sanitizeSegment } from "../routing/session-key.js";
5
+ import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
5
6
  import { getLogDir } from "../utils/logger/config.js";
6
7
  import { getRuntimeLogStats } from "../utils/logger/stats.js";
7
8
  import { createLogger } from "../utils/logger/index.js";
8
9
  import { init_logger } from "../utils/logger.js";
9
- import { prewarmModelRegistry } from "../providers/model-registry.js";
10
+ import { init_paths, resolveAgentDir, resolveConfigPath, resolveExtensionsDir } from "../config/paths.js";
10
11
  import { areExtensionsGloballyDisabled } from "../extensions/discover-extensions.js";
11
12
  import { buildExtensionMetadataSnapshot } from "../extensions/extension-metadata-snapshot.js";
12
13
  import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot, init_channel_catalog_service } from "../channels/catalog/channel-catalog-service.js";
13
14
  import { loadConfig, saveConfig } from "../config/loader.js";
14
- import { buildSessionKey, init_session_key, sanitizeSegment } from "../routing/session-key.js";
15
- import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
15
+ import { prewarmModelRegistry } from "../providers/model-registry.js";
16
16
  import { init_providers, providers_exports } from "../providers/index.js";
17
17
  import { closeXopcDatabase, openXopcDatabase } from "../storage/sqlite/connection.js";
18
18
  import "../storage/sqlite/index.js";
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { readdir } from "node:fs/promises";
4
3
  import { join, relative } from "node:path";
4
+ import { readdir } from "node:fs/promises";
5
5
  //#region src/gateway/workspace-fs-file-list.ts
6
6
  init_logger();
7
7
  const log = createLogger("WorkspaceFsFileList");
@@ -1,9 +1,9 @@
1
+ import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
1
2
  import { createLogger } from "../utils/logger/index.js";
2
3
  import { init_logger } from "../utils/logger.js";
3
- import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
4
- import { resolveGoalUiLocale } from "../agent/goals/goal-locale.js";
5
4
  import { renderWorkflowText } from "../agent/workflow/snapshot.js";
6
5
  import { GoalService } from "./goal-service.js";
6
+ import { resolveGoalUiLocale } from "../agent/goals/goal-locale.js";
7
7
  import { evaluateAfterTurnHermesLike } from "../agent/goals/evaluate-turn.js";
8
8
  import { runViewToSnapshot } from "../workflows/service/run-view-to-snapshot.js";
9
9
  //#region src/goals/goal-workflow-judge.ts
@@ -1,7 +1,7 @@
1
1
  import { formatI18n } from "./format.js";
2
+ import { serverLocaleOrFallback } from "./locale.js";
2
3
  import goals_en_default, { judgeReason } from "./locales/goals.en.js";
3
4
  import goals_zh_default from "./locales/goals.zh.js";
4
- import { serverLocaleOrFallback } from "./locale.js";
5
5
  //#region src/i18n/goals-bundle.ts
6
6
  /** Canonical English strings for judge parse / API contract (from `goals.en.json`). */
7
7
  const JUDGE_REASON_EN = judgeReason;
@@ -1,5 +1,5 @@
1
1
  import { formatI18n } from "./format.js";
2
2
  import { DEFAULT_SERVER_LOCALE, SERVER_LOCALES, isServerLocale, normalizeServerLocale, serverLocaleOrFallback } from "./locale.js";
3
- import { JUDGE_REASON_EN, goalsChecklistProgressSuffix, goalsContinuationChecklistTemplate, goalsContinuationPlainTemplate, goalsEvaluateCopy, goalsJudgeReason, goalsJudgeResponseLanguageNote, goalsMessages } from "./goals-bundle.js";
4
3
  import { resolveToolLocale, shareToolErrorLine, shareToolMessages, shareToolSuccessLines } from "./share-tool-bundle.js";
4
+ import { JUDGE_REASON_EN, goalsChecklistProgressSuffix, goalsContinuationChecklistTemplate, goalsContinuationPlainTemplate, goalsEvaluateCopy, goalsJudgeReason, goalsJudgeResponseLanguageNote, goalsMessages } from "./goals-bundle.js";
5
5
  export { DEFAULT_SERVER_LOCALE, JUDGE_REASON_EN, SERVER_LOCALES, formatI18n, goalsChecklistProgressSuffix, goalsContinuationChecklistTemplate, goalsContinuationPlainTemplate, goalsEvaluateCopy, goalsJudgeReason, goalsJudgeResponseLanguageNote, goalsMessages, isServerLocale, normalizeServerLocale, resolveToolLocale, serverLocaleOrFallback, shareToolErrorLine, shareToolMessages, shareToolSuccessLines };
@@ -1,7 +1,7 @@
1
- import { formatI18n } from "./format.js";
2
- import { normalizeServerLocale, serverLocaleOrFallback } from "./locale.js";
3
1
  import share_tool_en_default from "./locales/share-tool.en.js";
4
2
  import share_tool_zh_default from "./locales/share-tool.zh.js";
3
+ import { formatI18n } from "./format.js";
4
+ import { normalizeServerLocale, serverLocaleOrFallback } from "./locale.js";
5
5
  //#region src/i18n/share-tool-bundle.ts
6
6
  const byLocale = {
7
7
  en: share_tool_en_default,
@@ -1,5 +1,5 @@
1
- import path from "node:path";
2
1
  import os from "node:os";
2
+ import path from "node:path";
3
3
  //#region src/infra/brew.ts
4
4
  function normalizePathValue(value) {
5
5
  if (typeof value !== "string") return void 0;
@@ -1,5 +1,5 @@
1
- import fs from "node:fs/promises";
2
1
  import path from "node:path";
2
+ import fs from "node:fs/promises";
3
3
  //#region src/infra/package-json.ts
4
4
  async function readPackageVersion(root) {
5
5
  try {
@@ -1,7 +1,7 @@
1
1
  import { readPackageVersion } from "./package-json.js";
2
2
  import { XOPC_PACKAGE_NAME, collectInstalledGlobalPackageErrors, globalInstallArgs, globalInstallFallbackArgs, resolveExpectedInstalledVersionFromSpec, resolveGlobalInstallTarget, resolveNpmGlobalPrefixLayoutFromGlobalRoot, resolveNpmGlobalPrefixLayoutFromPrefix } from "./update-global.js";
3
- import fs from "node:fs/promises";
4
3
  import path from "node:path";
4
+ import fs from "node:fs/promises";
5
5
  //#region src/infra/package-update-steps.ts
6
6
  function formatError(err) {
7
7
  return err instanceof Error ? err.message : String(err);
@@ -1,7 +1,7 @@
1
1
  import { resolveBrewPathDirs } from "./brew.js";
2
- import fs from "node:fs";
3
- import path from "node:path";
4
2
  import os from "node:os";
3
+ import path from "node:path";
4
+ import fs from "node:fs";
5
5
  //#region src/infra/path-env.ts
6
6
  function isTruthyEnvValue(value) {
7
7
  if (!value) return false;
@@ -1,8 +1,8 @@
1
1
  import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
2
2
  import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
- import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
5
4
  import path from "node:path";
5
+ import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
6
6
  //#region src/infra/restart.ts
7
7
  /**
8
8
  * Gateway restart coordination — OpenClaw-aligned SIGUSR1 authorization and restart intent.
@@ -1,5 +1,5 @@
1
- import fs from "node:fs/promises";
2
1
  import path from "node:path";
2
+ import fs from "node:fs/promises";
3
3
  //#region src/infra/stable-node-path.ts
4
4
  /** Resolve Homebrew Cellar node paths to stable opt/bin symlinks. */
5
5
  async function resolveStableNodePath(nodePath) {
@@ -1,7 +1,7 @@
1
1
  import { PACKAGE_VERSION, init_package_version } from "../package-version.js";
2
2
  import { channelToNpmTag } from "./update-channels.js";
3
- import { access, readFile } from "node:fs/promises";
4
3
  import { dirname, join } from "node:path";
4
+ import { access, readFile } from "node:fs/promises";
5
5
  import { fileURLToPath } from "node:url";
6
6
  //#region src/infra/update-check.ts
7
7
  init_package_version();
@@ -2,9 +2,9 @@ import { resolveExecPathBinPrepend } from "./path-env.js";
2
2
  import { readPackageVersion } from "./package-json.js";
3
3
  import { applyPathPrepend } from "./path-prepend.js";
4
4
  import { createDefaultCommandRunner } from "./run-command.js";
5
+ import path from "node:path";
5
6
  import fs from "node:fs";
6
7
  import fs$1 from "node:fs/promises";
7
- import path from "node:path";
8
8
  //#region src/infra/update-global.ts
9
9
  const XOPC_PACKAGE_NAME = "@xopcai/xopc";
10
10
  const GLOBAL_RENAME_PREFIX = ".";
@@ -1,9 +1,9 @@
1
- import { init_write_file_atomic, writeTextAtomic } from "./write-file-atomic.js";
2
1
  import { init_paths_state, resolveUpdateLockPath } from "../config/paths-state.js";
3
2
  import { createLogger } from "../utils/logger/index.js";
4
3
  import { init_logger } from "../utils/logger.js";
5
- import { mkdir, readFile, unlink } from "node:fs/promises";
4
+ import { init_write_file_atomic, writeTextAtomic } from "./write-file-atomic.js";
6
5
  import { dirname } from "node:path";
6
+ import { mkdir, readFile, unlink } from "node:fs/promises";
7
7
  //#region src/infra/update-lock.ts
8
8
  init_write_file_atomic();
9
9
  init_paths_state();
@@ -1,6 +1,6 @@
1
- import { init_paths, resolveConfigPath } from "../config/paths.js";
2
1
  import { createLogger } from "../utils/logger/index.js";
3
2
  import { init_logger } from "../utils/logger.js";
3
+ import { init_paths, resolveConfigPath } from "../config/paths.js";
4
4
  import { init_loader, loadConfig } from "../config/loader.js";
5
5
  import { isRestartEnabled } from "../config/commands.flags.js";
6
6
  import { resolveGatewayService } from "../daemon/service.js";