@xopcai/xopc 0.0.124 → 0.0.126

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 (496) hide show
  1. package/README.md +56 -102
  2. package/README.zh-CN.md +51 -98
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
  5. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  6. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  7. package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
  8. package/dist/extensions/telegram/src/inbound-processor.js +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/src/workflow-progress.js +1 -1
  12. package/dist/extensions/telegram/xopc.extension.json +1 -1
  13. package/dist/extensions/weixin/src/api/api.js +1 -1
  14. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  15. package/dist/extensions/weixin/src/plugin.js +1 -1
  16. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  17. package/dist/gateway/static/root/assets/Combination-BzaXOLd9.js +41 -0
  18. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-B5uSVAyJ.js → agent-avatar-dicebear-C70vgt60.js} +1 -1
  19. package/dist/gateway/static/root/assets/agents-DRYVahI-.js +2 -0
  20. package/dist/gateway/static/root/assets/app-management-settings-panel-D9-HW6cy.js +1 -0
  21. package/dist/gateway/static/root/assets/appearance-settings-BHlahIDL.js +1 -0
  22. package/dist/gateway/static/root/assets/apps-page-BdJ1eQg3.js +1 -0
  23. package/dist/gateway/static/root/assets/{archive-plugin-CXUGRp2i.js → archive-plugin-B-aoIt0w.js} +1 -1
  24. package/dist/gateway/static/root/assets/{attachment-load-Cmiub3Wg.js → attachment-load-BD0G0FD5.js} +1 -1
  25. package/dist/gateway/static/root/assets/automation-suggestion-card-iJRVI7aZ.js +1 -0
  26. package/dist/gateway/static/root/assets/automations-page-D8hYQbkl.js +4 -0
  27. package/dist/gateway/static/root/assets/{binary-plugins-0Izz-N3p.js → binary-plugins-B0mNlVSz.js} +1 -1
  28. package/dist/gateway/static/root/assets/{block-editor-C1Kv0IkJ.js → block-editor-CJY9Lu5G.js} +3 -3
  29. package/dist/gateway/static/root/assets/browser-settings-page-CiWEO-Iy.js +8 -0
  30. package/dist/gateway/static/root/assets/capability-presets-api-Bgc8ag55.js +1 -0
  31. package/dist/gateway/static/root/assets/capability-presets-settings-panel-B1nIi0TC.js +1 -0
  32. package/dist/gateway/static/root/assets/{channel-recipient-api-BeA2aVor.js → channel-recipient-api-0sauApoC.js} +1 -1
  33. package/dist/gateway/static/root/assets/channels-settings-BddPdqVo.js +1 -0
  34. package/dist/gateway/static/root/assets/code-editor-gbRgS14t.js +1 -0
  35. package/dist/gateway/static/root/assets/connectors-page-Ba2GDhSE.js +2 -0
  36. package/dist/gateway/static/root/assets/{directory-picker-path-field-2rjzUu57.js → directory-picker-path-field-CiEc4KmY.js} +1 -1
  37. package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +1 -0
  38. package/dist/gateway/static/root/assets/dist-CkobR7mk.js +1 -0
  39. package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +1 -0
  40. package/dist/gateway/static/root/assets/dreaming-settings-4bvpk5wr.js +3 -0
  41. package/dist/gateway/static/root/assets/extension-debug-page-BbyczVZ3.js +1 -0
  42. package/dist/gateway/static/root/assets/extension-page-DLN1I3DR.js +1 -0
  43. package/dist/gateway/static/root/assets/extension-settings-page-D9VGHmYJ.js +1 -0
  44. package/dist/gateway/static/root/assets/{fetch-BU5S0Sn7.js → fetch-5V96dUz3.js} +1 -1
  45. package/dist/gateway/static/root/assets/{gateway-config-api-BIPGwrl1.js → gateway-config-api-BtIzObwp.js} +1 -1
  46. package/dist/gateway/static/root/assets/gateway-settings-KFsGGDhg.js +1 -0
  47. package/dist/gateway/static/root/assets/{gateway-startup-retry-Cd0Zz30N.js → gateway-startup-retry-DEMad2wt.js} +1 -1
  48. package/dist/gateway/static/root/assets/goal-create-dialog-4PcF6Sh6.js +1 -0
  49. package/dist/gateway/static/root/assets/goal-detail-page-B482PSaG.js +1 -0
  50. package/dist/gateway/static/root/assets/{goals-config-api-B95KdGMj.js → goals-config-api-CVN7-pdM.js} +1 -1
  51. package/dist/gateway/static/root/assets/goals-page-CUdgJuDn.js +2 -0
  52. package/dist/gateway/static/root/assets/goals-settings-IYCH3-Pi.js +1 -0
  53. package/dist/gateway/static/root/assets/heartbeat-settings-Cf_a2Bmz.js +1 -0
  54. package/dist/gateway/static/root/assets/{html-workspace-editor-CQLWDiwE.js → html-workspace-editor-DV90ddkE.js} +1 -1
  55. package/dist/gateway/static/root/assets/index-CA2tR2vm.js +256 -0
  56. package/dist/gateway/static/root/assets/index-Ds3u0LOk.css +1 -0
  57. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-lKTg6St7.js +1 -0
  58. package/dist/gateway/static/root/assets/logs-page-BCporcNH.js +2 -0
  59. package/dist/gateway/static/root/assets/{markdown-editor-AssmZFx4.js → markdown-editor-BFOjBBla.js} +2 -2
  60. package/dist/gateway/static/root/assets/markdown-split-Bv4k6iGJ.js +1 -0
  61. package/dist/gateway/static/root/assets/{media-plugins-BhIQU5yS.js → media-plugins-Bbi8g3N8.js} +1 -1
  62. package/dist/gateway/static/root/assets/messages-C22hxE1N.js +3 -0
  63. package/dist/gateway/static/root/assets/models-hub-panel-D68Pyow7.js +2 -0
  64. package/dist/gateway/static/root/assets/notes-page-CuUMOiyv.js +1 -0
  65. package/dist/gateway/static/root/assets/notes-workbench-Dx2N5zTk.js +2 -0
  66. package/dist/gateway/static/root/assets/page-tabs-Cp395RYD.js +1 -0
  67. package/dist/gateway/static/root/assets/{preview-open-alternatives-DGzet1d7.js → preview-open-alternatives-DqV5OM4m.js} +1 -1
  68. package/dist/gateway/static/root/assets/project-detail-page-sB8AzZi3.js +1 -0
  69. package/dist/gateway/static/root/assets/projects-page-LBnJqWK2.js +1 -0
  70. package/dist/gateway/static/root/assets/remote-access-hub-Dbj0o6SC.js +1 -0
  71. package/dist/gateway/static/root/assets/{save-bar-controls-Cqgb-jqa.js → save-bar-controls-BItmzAzI.js} +1 -1
  72. package/dist/gateway/static/root/assets/{schedule-field-DVZcI8Yt.js → schedule-field-BQ8IjjCn.js} +1 -1
  73. package/dist/gateway/static/root/assets/{schema-form-Bj7sOxC8.js → schema-form-BRpD6x3d.js} +1 -1
  74. package/dist/gateway/static/root/assets/sessions-page-DhDZKspB.js +1 -0
  75. package/dist/gateway/static/root/assets/settings-advanced-gate-BvXLMNL6.js +1 -0
  76. package/dist/gateway/static/root/assets/{settings-collapsible-section-BmXn-8N6.js → settings-collapsible-section-BKSPQM4R.js} +1 -1
  77. package/dist/gateway/static/root/assets/settings-form-section-BmyfthNQ.js +1 -0
  78. package/dist/gateway/static/root/assets/settings-page-Cfm9UxAr.js +1 -0
  79. package/dist/gateway/static/root/assets/settings-page-layout-Bls5tfbH.js +1 -0
  80. package/dist/gateway/static/root/assets/setup-status-panel-kQEsTGAs.js +1 -0
  81. package/dist/gateway/static/root/assets/{share-preview-page-IB1v8i86.js → share-preview-page-DbYZNAPb.js} +1 -1
  82. package/dist/gateway/static/root/assets/shares-settings-BtR4B0kn.js +1 -0
  83. package/dist/gateway/static/root/assets/skill-reload-api-CJNVOWoK.js +1 -0
  84. package/dist/gateway/static/root/assets/skills-page-DcWDHrt3.js +2 -0
  85. package/dist/gateway/static/root/assets/{system-settings-panel-BxQ384RC.js → system-settings-panel-DKDAojWM.js} +1 -1
  86. package/dist/gateway/static/root/assets/{typed-models-lib-BkcpvFYO.js → typed-models-lib-BCCV4Kkp.js} +1 -1
  87. package/dist/gateway/static/root/assets/{use-channel-catalog-Cd0FaEQ4.js → use-channel-catalog-NBqg3iFY.js} +1 -1
  88. package/dist/gateway/static/root/assets/{user-profile-settings-panel-DQ7NnRSY.js → user-profile-settings-panel-suQ2x-LB.js} +1 -1
  89. package/dist/gateway/static/root/assets/{utils-YKhVf7Ka.js → utils-DPGVr3tS.js} +1 -1
  90. package/dist/gateway/static/root/assets/{vendor-codemirror-CNP1wPe7.js → vendor-codemirror-BvNgyE1Q.js} +1 -1
  91. package/dist/gateway/static/root/assets/voice-api-key-field-DaJASKFP.js +1 -0
  92. package/dist/gateway/static/root/assets/work-item-detail-page-BrCZpAWh.js +1 -0
  93. package/dist/gateway/static/root/assets/workflow-run-setup-panel-BTkRVNAh.js +3 -0
  94. package/dist/gateway/static/root/assets/{workflow-start-dialog-BNJVCWoS.js → workflow-start-dialog-DAImVtdO.js} +1 -1
  95. package/dist/gateway/static/root/assets/workflows-page-vyJ8wSXm.js +18 -0
  96. package/dist/gateway/static/root/index.html +8 -7
  97. package/dist/package.js +1 -1
  98. package/dist/src/activity/context.d.ts +11 -0
  99. package/dist/src/activity/context.js +36 -0
  100. package/dist/src/activity/context.js.map +1 -0
  101. package/dist/src/activity/emitter.d.ts +6 -0
  102. package/dist/src/activity/emitter.js +43 -0
  103. package/dist/src/activity/emitter.js.map +1 -0
  104. package/dist/src/activity/index.d.ts +3 -0
  105. package/dist/src/activity/index.js +3 -0
  106. package/dist/src/activity/service.d.ts +12 -0
  107. package/dist/src/activity/service.js +59 -0
  108. package/dist/src/activity/service.js.map +1 -0
  109. package/dist/src/activity/types.d.ts +109 -0
  110. package/dist/src/activity/types.js +1 -0
  111. package/dist/src/agent/agent-manager.d.ts +7 -0
  112. package/dist/src/agent/agent-manager.js +12 -5
  113. package/dist/src/agent/agent-manager.js.map +1 -1
  114. package/dist/src/agent/child-agent-factory.d.ts +2 -0
  115. package/dist/src/agent/child-agent-factory.js +2 -0
  116. package/dist/src/agent/child-agent-factory.js.map +1 -1
  117. package/dist/src/agent/coding/index.d.ts +1 -0
  118. package/dist/src/agent/coding/index.js +2 -0
  119. package/dist/src/agent/coding/turn-diff-tracker.d.ts +67 -0
  120. package/dist/src/agent/coding/turn-diff-tracker.js +233 -0
  121. package/dist/src/agent/coding/turn-diff-tracker.js.map +1 -0
  122. package/dist/src/agent/context/project-context.js +2 -2
  123. package/dist/src/agent/context/workspace-seed.js +2 -2
  124. package/dist/src/agent/embedded/run-for-session.js +1 -1
  125. package/dist/src/agent/goals/post-turn.js +2 -2
  126. package/dist/src/agent/ipc/bus.js +1 -1
  127. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  128. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  129. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  130. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  131. package/dist/src/agent/memory/dreaming/config.d.ts +2 -2
  132. package/dist/src/agent/memory/dreaming/config.js +3 -3
  133. package/dist/src/agent/memory/dreaming/config.js.map +1 -1
  134. package/dist/src/agent/memory/dreaming/constants.d.ts +1 -1
  135. package/dist/src/agent/memory/dreaming/constants.js +1 -1
  136. package/dist/src/agent/memory/dreaming/constants.js.map +1 -1
  137. package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +1 -0
  138. package/dist/src/agent/memory/dreaming/deep-promotion.js +11 -20
  139. package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
  140. package/dist/src/agent/memory/dreaming/events.d.ts +3 -3
  141. package/dist/src/agent/memory/dreaming/events.js +6 -6
  142. package/dist/src/agent/memory/dreaming/events.js.map +1 -1
  143. package/dist/src/agent/memory/dreaming/last-run.d.ts +2 -2
  144. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  145. package/dist/src/agent/memory/dreaming/last-run.js.map +1 -1
  146. package/dist/src/agent/memory/dreaming/light-sweep.d.ts +1 -1
  147. package/dist/src/agent/memory/dreaming/light-sweep.js +3 -3
  148. package/dist/src/agent/memory/dreaming/light-sweep.js.map +1 -1
  149. package/dist/src/agent/memory/dreaming/preview.d.ts +1 -0
  150. package/dist/src/agent/memory/dreaming/preview.js +2 -2
  151. package/dist/src/agent/memory/dreaming/preview.js.map +1 -1
  152. package/dist/src/agent/memory/dreaming/rem-patterns.d.ts +1 -1
  153. package/dist/src/agent/memory/dreaming/rem-patterns.js +13 -13
  154. package/dist/src/agent/memory/dreaming/rem-patterns.js.map +1 -1
  155. package/dist/src/agent/memory/dreaming/scope.d.ts +14 -0
  156. package/dist/src/agent/memory/dreaming/scope.js +27 -0
  157. package/dist/src/agent/memory/dreaming/scope.js.map +1 -0
  158. package/dist/src/agent/memory/dreaming/short-term-store.d.ts +4 -4
  159. package/dist/src/agent/memory/dreaming/short-term-store.js +17 -17
  160. package/dist/src/agent/memory/dreaming/short-term-store.js.map +1 -1
  161. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  162. package/dist/src/agent/models/manager.js +1 -1
  163. package/dist/src/agent/orchestration/agent-event-handler.d.ts +2 -0
  164. package/dist/src/agent/orchestration/agent-event-handler.js +13 -0
  165. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  166. package/dist/src/agent/orchestration/agent-orchestrator.js +22 -12
  167. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  168. package/dist/src/agent/sandbox/command-validator.js +12 -0
  169. package/dist/src/agent/sandbox/command-validator.js.map +1 -1
  170. package/dist/src/agent/service.d.ts +2 -1
  171. package/dist/src/agent/service.js +24 -9
  172. package/dist/src/agent/service.js.map +1 -1
  173. package/dist/src/agent/service.types.d.ts +7 -0
  174. package/dist/src/agent/session/session-inspector.d.ts +5 -3
  175. package/dist/src/agent/session/session-inspector.js +17 -8
  176. package/dist/src/agent/session/session-inspector.js.map +1 -1
  177. package/dist/src/agent/skills/hub-pull.js +1 -1
  178. package/dist/src/agent/source-context/types.d.ts +1 -1
  179. package/dist/src/agent/source-context/types.js +1 -1
  180. package/dist/src/agent/source-context/types.js.map +1 -1
  181. package/dist/src/agent/tool-manuals/index.js +15 -6
  182. package/dist/src/agent/tool-manuals/index.js.map +1 -1
  183. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -0
  184. package/dist/src/agent/tool-manuals/xopc-use.js +204 -0
  185. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -0
  186. package/dist/src/agent/tools/apply-patch.js +116 -62
  187. package/dist/src/agent/tools/apply-patch.js.map +1 -1
  188. package/dist/src/agent/tools/concurrency.d.ts +8 -0
  189. package/dist/src/agent/tools/concurrency.js +31 -0
  190. package/dist/src/agent/tools/concurrency.js.map +1 -0
  191. package/dist/src/agent/tools/dreaming-tool.d.ts +2 -0
  192. package/dist/src/agent/tools/dreaming-tool.js +13 -10
  193. package/dist/src/agent/tools/dreaming-tool.js.map +1 -1
  194. package/dist/src/agent/tools/exec-command.js +4 -0
  195. package/dist/src/agent/tools/exec-command.js.map +1 -1
  196. package/dist/src/agent/tools/executor.d.ts +6 -4
  197. package/dist/src/agent/tools/executor.js +7 -4
  198. package/dist/src/agent/tools/executor.js.map +1 -1
  199. package/dist/src/agent/tools/factory.d.ts +10 -0
  200. package/dist/src/agent/tools/factory.js +16 -1
  201. package/dist/src/agent/tools/factory.js.map +1 -1
  202. package/dist/src/agent/tools/find.js +2 -0
  203. package/dist/src/agent/tools/find.js.map +1 -1
  204. package/dist/src/agent/tools/goal-tool.js +2 -2
  205. package/dist/src/agent/tools/grep.js +2 -0
  206. package/dist/src/agent/tools/grep.js.map +1 -1
  207. package/dist/src/agent/tools/index.d.ts +3 -0
  208. package/dist/src/agent/tools/index.js +4 -1
  209. package/dist/src/agent/tools/list-dir.js +2 -0
  210. package/dist/src/agent/tools/list-dir.js.map +1 -1
  211. package/dist/src/agent/tools/memory-tool.d.ts +1 -0
  212. package/dist/src/agent/tools/memory-tool.js +2 -2
  213. package/dist/src/agent/tools/memory-tool.js.map +1 -1
  214. package/dist/src/agent/tools/metadata.d.ts +15 -0
  215. package/dist/src/agent/tools/metadata.js +26 -0
  216. package/dist/src/agent/tools/metadata.js.map +1 -0
  217. package/dist/src/agent/tools/read.js +2 -0
  218. package/dist/src/agent/tools/read.js.map +1 -1
  219. package/dist/src/agent/tools/workflow-tool.js +1 -1
  220. package/dist/src/agent/tools/write.js +6 -0
  221. package/dist/src/agent/tools/write.js.map +1 -1
  222. package/dist/src/agent/tools/xopc-use-tool.d.ts +34 -0
  223. package/dist/src/agent/tools/xopc-use-tool.js +636 -0
  224. package/dist/src/agent/tools/xopc-use-tool.js.map +1 -0
  225. package/dist/src/agent/workflow/subagent-runner.d.ts +1 -0
  226. package/dist/src/agent/workflow/subagent-runner.js +5 -1
  227. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  228. package/dist/src/agent/workflow/workflow-child-tools.js +5 -0
  229. package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
  230. package/dist/src/agent-manifest/schema.d.ts +27 -27
  231. package/dist/src/automations/api/routes.js +1 -1
  232. package/dist/src/automations/domain/validation.d.ts +55 -55
  233. package/dist/src/automations/draft/automation-draft-validator.d.ts +25 -25
  234. package/dist/src/automations/service/action-executor.js +2 -2
  235. package/dist/src/browser/cdp-local-launcher.js +1 -1
  236. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  237. package/dist/src/browser/providers/cloakbrowser.js +2 -2
  238. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  239. package/dist/src/browser/stealth.js +1 -1
  240. package/dist/src/chat-commands/agent-edit.js +1 -1
  241. package/dist/src/chat-commands/builtins/config.js +1 -1
  242. package/dist/src/chat-commands/builtins/goal.js +2 -2
  243. package/dist/src/chat-commands/context.js +1 -1
  244. package/dist/src/cli/commands/agent.js +1 -1
  245. package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
  246. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  247. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  248. package/dist/src/cli/commands/extension-pack.js +1 -1
  249. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  250. package/dist/src/cli/commands/goal.js +3 -3
  251. package/dist/src/cli/commands/init.js +1 -1
  252. package/dist/src/cli/commands/project.js +4 -4
  253. package/dist/src/config/agent-profile.js +1 -1
  254. package/dist/src/config/gateway-bind.js +1 -1
  255. package/dist/src/config/index.js +1 -1
  256. package/dist/src/config/loader.js +1 -1
  257. package/dist/src/config/models-json.d.ts +14 -14
  258. package/dist/src/config/models-json.js +1 -1
  259. package/dist/src/config/schema.d.ts +60 -60
  260. package/dist/src/connectors/health.d.ts +2 -1
  261. package/dist/src/connectors/health.js +59 -1
  262. package/dist/src/connectors/health.js.map +1 -1
  263. package/dist/src/connectors/install.d.ts +1 -0
  264. package/dist/src/connectors/install.js +28 -1
  265. package/dist/src/connectors/install.js.map +1 -1
  266. package/dist/src/connectors/instances.js +7 -0
  267. package/dist/src/connectors/instances.js.map +1 -1
  268. package/dist/src/connectors/materialize.js +2 -1
  269. package/dist/src/connectors/materialize.js.map +1 -1
  270. package/dist/src/connectors/registries/modelscope.js +38 -13
  271. package/dist/src/connectors/registries/modelscope.js.map +1 -1
  272. package/dist/src/connectors/types.d.ts +2 -0
  273. package/dist/src/daemon/launchd.js +1 -1
  274. package/dist/src/daemon/systemd.js +1 -1
  275. package/dist/src/extensions/discover-extensions.js +1 -1
  276. package/dist/src/extensions/loader.js +2 -2
  277. package/dist/src/gateway/agents-admin.js +1 -1
  278. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +1 -0
  279. package/dist/src/gateway/dreaming-automation-reconciler.js +62 -42
  280. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
  281. package/dist/src/gateway/hono/app.js +7 -1
  282. package/dist/src/gateway/hono/app.js.map +1 -1
  283. package/dist/src/gateway/hono/lib/config-payload.d.ts +14 -14
  284. package/dist/src/gateway/hono/lib/static-ui.js +1 -1
  285. package/dist/src/gateway/hono/middleware/log-context.js +8 -1
  286. package/dist/src/gateway/hono/middleware/log-context.js.map +1 -1
  287. package/dist/src/gateway/hono/routes/activity.d.ts +14 -0
  288. package/dist/src/gateway/hono/routes/activity.js +72 -0
  289. package/dist/src/gateway/hono/routes/activity.js.map +1 -0
  290. package/dist/src/gateway/hono/routes/connectors.js +46 -2
  291. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  292. package/dist/src/gateway/hono/routes/dreaming.js +111 -66
  293. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  294. package/dist/src/gateway/hono/routes/goals.js +1 -1
  295. package/dist/src/gateway/hono/routes/index.js +2 -0
  296. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  297. package/dist/src/gateway/hono/routes/memory.js +2 -2
  298. package/dist/src/gateway/hono/routes/projects.js +903 -50
  299. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  300. package/dist/src/gateway/hono/routes/sessions.js +102 -2
  301. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  302. package/dist/src/gateway/hono/routes/workflows.js +2 -2
  303. package/dist/src/gateway/lock.js +1 -1
  304. package/dist/src/gateway/ports.js +1 -1
  305. package/dist/src/gateway/service/sessions-api.d.ts +10 -0
  306. package/dist/src/gateway/service/sessions-api.js +31 -0
  307. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  308. package/dist/src/gateway/service.js +28 -16
  309. package/dist/src/gateway/service.js.map +1 -1
  310. package/dist/src/goals/goal-store.js +1 -1
  311. package/dist/src/goals/goal-store.js.map +1 -1
  312. package/dist/src/goals/goal-workflow-judge.js +1 -1
  313. package/dist/src/infra/ports.js +1 -1
  314. package/dist/src/infra/ssh-tunnel.js +1 -1
  315. package/dist/src/infra/update-check.js +1 -1
  316. package/dist/src/infra/update-restart.js +1 -1
  317. package/dist/src/mcp/channel-bridge.js +1 -1
  318. package/dist/src/media/store.js +1 -1
  319. package/dist/src/media/store.js.map +1 -1
  320. package/dist/src/media/types.d.ts +1 -1
  321. package/dist/src/media/uri.js +2 -1
  322. package/dist/src/media/uri.js.map +1 -1
  323. package/dist/src/migrations/runner.js +1 -1
  324. package/dist/src/notes/service.js +65 -6
  325. package/dist/src/notes/service.js.map +1 -1
  326. package/dist/src/notes/store.js +1 -1
  327. package/dist/src/projects/project-service.d.ts +2 -1
  328. package/dist/src/projects/project-service.js +59 -2
  329. package/dist/src/projects/project-service.js.map +1 -1
  330. package/dist/src/projects/project-store.d.ts +2 -1
  331. package/dist/src/projects/project-store.js +43 -0
  332. package/dist/src/projects/project-store.js.map +1 -1
  333. package/dist/src/projects/types.d.ts +10 -0
  334. package/dist/src/projects/workspace.js +1 -1
  335. package/dist/src/routing/agent-session-key.js +1 -1
  336. package/dist/src/routing/resolve-route.js +1 -1
  337. package/dist/src/routing/resolve-tui-session-key.js +1 -1
  338. package/dist/src/session/client-history.d.ts +3 -0
  339. package/dist/src/session/client-history.js +24 -9
  340. package/dist/src/session/client-history.js.map +1 -1
  341. package/dist/src/session/init-session-turn.js +1 -1
  342. package/dist/src/session/resolve-session.js +1 -1
  343. package/dist/src/session/session-context-for-llm.d.ts +2 -0
  344. package/dist/src/session/session-context-for-llm.js +14 -1
  345. package/dist/src/session/session-context-for-llm.js.map +1 -1
  346. package/dist/src/session/session-title.js +2 -2
  347. package/dist/src/session/store.js +3 -3
  348. package/dist/src/session/store.js.map +1 -1
  349. package/dist/src/session/types.d.ts +4 -0
  350. package/dist/src/session/types.js.map +1 -1
  351. package/dist/src/storage/sqlite/activity-repository.d.ts +8 -0
  352. package/dist/src/storage/sqlite/activity-repository.js +208 -0
  353. package/dist/src/storage/sqlite/activity-repository.js.map +1 -0
  354. package/dist/src/storage/sqlite/connection.js +1 -1
  355. package/dist/src/storage/sqlite/index.d.ts +1 -0
  356. package/dist/src/storage/sqlite/index.js +2 -1
  357. package/dist/src/storage/sqlite/migrations/022_work_items.sql +61 -0
  358. package/dist/src/storage/sqlite/migrations/023_work_item_attachments.sql +15 -0
  359. package/dist/src/storage/sqlite/migrations/024_activity_events.sql +62 -0
  360. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  361. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  362. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  363. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  364. package/dist/src/storage/sqlite/row-mappers.js +1 -1
  365. package/dist/src/storage/sqlite/schema.js +1 -1
  366. package/dist/src/storage/sqlite/schema.sql +141 -0
  367. package/dist/src/storage/sqlite/session-repository.js +11 -0
  368. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  369. package/dist/src/tui/backends/embedded-backend.d.ts +13 -0
  370. package/dist/src/tui/backends/embedded-backend.js +76 -7
  371. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  372. package/dist/src/tui/backends/gateway-sse-backend.d.ts +13 -0
  373. package/dist/src/tui/backends/gateway-sse-backend.js +53 -0
  374. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  375. package/dist/src/tui/chat-history.js +16 -3
  376. package/dist/src/tui/chat-history.js.map +1 -1
  377. package/dist/src/tui/clipboard-image.js +1 -1
  378. package/dist/src/tui/components/assistant-message.js +12 -2
  379. package/dist/src/tui/components/assistant-message.js.map +1 -1
  380. package/dist/src/tui/components/chat-log.d.ts +23 -3
  381. package/dist/src/tui/components/chat-log.js +68 -9
  382. package/dist/src/tui/components/chat-log.js.map +1 -1
  383. package/dist/src/tui/components/tool-execution.d.ts +8 -0
  384. package/dist/src/tui/components/tool-execution.js +87 -77
  385. package/dist/src/tui/components/tool-execution.js.map +1 -1
  386. package/dist/src/tui/components/tui-bottom-bar.js +9 -5
  387. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  388. package/dist/src/tui/components/visual-truncate.d.ts +1 -0
  389. package/dist/src/tui/components/visual-truncate.js +28 -1
  390. package/dist/src/tui/components/visual-truncate.js.map +1 -1
  391. package/dist/src/tui/tool-summary.d.ts +22 -0
  392. package/dist/src/tui/tool-summary.js +212 -0
  393. package/dist/src/tui/tool-summary.js.map +1 -0
  394. package/dist/src/tui/tui-backend.d.ts +16 -0
  395. package/dist/src/tui/tui-command-formatters.js +2 -2
  396. package/dist/src/tui/tui-commands.d.ts +9 -0
  397. package/dist/src/tui/tui-commands.js +95 -6
  398. package/dist/src/tui/tui-commands.js.map +1 -1
  399. package/dist/src/tui/tui-picker-overlay.d.ts +1 -0
  400. package/dist/src/tui/tui-picker-overlay.js +36 -1
  401. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  402. package/dist/src/tui/tui-picker-services.d.ts +13 -0
  403. package/dist/src/tui/tui-run-state.js +11 -0
  404. package/dist/src/tui/tui-run-state.js.map +1 -1
  405. package/dist/src/tui/tui-run-status-format.d.ts +3 -0
  406. package/dist/src/tui/tui-run-status-format.js +33 -0
  407. package/dist/src/tui/tui-run-status-format.js.map +1 -0
  408. package/dist/src/tui/tui-session-actions.d.ts +5 -0
  409. package/dist/src/tui/tui-session-actions.js +24 -0
  410. package/dist/src/tui/tui-session-actions.js.map +1 -1
  411. package/dist/src/tui/tui-timeline-picker.d.ts +19 -0
  412. package/dist/src/tui/tui-timeline-picker.js +81 -0
  413. package/dist/src/tui/tui-timeline-picker.js.map +1 -0
  414. package/dist/src/tui/tui-timeline.d.ts +15 -0
  415. package/dist/src/tui/tui-timeline.js +65 -0
  416. package/dist/src/tui/tui-timeline.js.map +1 -0
  417. package/dist/src/tui/tui-tool-diff.d.ts +15 -0
  418. package/dist/src/tui/tui-tool-diff.js +178 -7
  419. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  420. package/dist/src/tui/tui-types.d.ts +1 -0
  421. package/dist/src/tui/tui-types.js +1 -0
  422. package/dist/src/tui/tui-types.js.map +1 -1
  423. package/dist/src/tui/tui.js +31 -25
  424. package/dist/src/tui/tui.js.map +1 -1
  425. package/dist/src/utils/index.js +1 -1
  426. package/dist/src/utils/logger/index.js +1 -1
  427. package/dist/src/utils/logger/stats.d.ts +3 -3
  428. package/dist/src/utils/logger.js +1 -1
  429. package/dist/src/work-items/agent-context.d.ts +7 -0
  430. package/dist/src/work-items/agent-context.js +75 -0
  431. package/dist/src/work-items/agent-context.js.map +1 -0
  432. package/dist/src/work-items/index.d.ts +4 -0
  433. package/dist/src/work-items/index.js +4 -0
  434. package/dist/src/work-items/types.d.ts +112 -0
  435. package/dist/src/work-items/types.js +1 -0
  436. package/dist/src/work-items/work-item-service.d.ts +35 -0
  437. package/dist/src/work-items/work-item-service.js +277 -0
  438. package/dist/src/work-items/work-item-service.js.map +1 -0
  439. package/dist/src/work-items/work-item-store.d.ts +21 -0
  440. package/dist/src/work-items/work-item-store.js +302 -0
  441. package/dist/src/work-items/work-item-store.js.map +1 -0
  442. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  443. package/dist/src/workflows/service/workflow-run-service.js +4 -3
  444. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  445. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  446. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  447. package/package.json +5 -5
  448. package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
  449. package/dist/gateway/static/root/assets/agents-BjIxt67Z.js +0 -2
  450. package/dist/gateway/static/root/assets/app-management-settings-panel-CYCONLIL.js +0 -1
  451. package/dist/gateway/static/root/assets/appearance-settings-Clw3ryKg.js +0 -1
  452. package/dist/gateway/static/root/assets/apps-page-QICTeGjX.js +0 -1
  453. package/dist/gateway/static/root/assets/automation-suggestion-card-CU0-4nQ-.js +0 -1
  454. package/dist/gateway/static/root/assets/automations-page-Car-jtiz.js +0 -1
  455. package/dist/gateway/static/root/assets/browser-settings-page-CMeBJzlS.js +0 -8
  456. package/dist/gateway/static/root/assets/capability-presets-api-BmQTM9Il.js +0 -1
  457. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DZEJEoCF.js +0 -1
  458. package/dist/gateway/static/root/assets/channels-settings-kkW-xFau.js +0 -1
  459. package/dist/gateway/static/root/assets/code-editor-dZTY2dRW.js +0 -1
  460. package/dist/gateway/static/root/assets/connectors-page-BvaQvO5F.js +0 -2
  461. package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +0 -1
  462. package/dist/gateway/static/root/assets/dist-wO9a2_ID.js +0 -1
  463. package/dist/gateway/static/root/assets/dreaming-settings-DnHO686d.js +0 -1
  464. package/dist/gateway/static/root/assets/extension-debug-page-BGLRuWVN.js +0 -1
  465. package/dist/gateway/static/root/assets/extension-page-D978ePp9.js +0 -1
  466. package/dist/gateway/static/root/assets/extension-settings-page-B6Ih4Swx.js +0 -1
  467. package/dist/gateway/static/root/assets/gateway-settings-CMEA3r5u.js +0 -1
  468. package/dist/gateway/static/root/assets/goal-create-dialog-B-KHKeXN.js +0 -1
  469. package/dist/gateway/static/root/assets/goal-detail-page-BxrSoWdj.js +0 -1
  470. package/dist/gateway/static/root/assets/goals-page-BTJzIl28.js +0 -2
  471. package/dist/gateway/static/root/assets/goals-settings-BJyEuLLm.js +0 -1
  472. package/dist/gateway/static/root/assets/heartbeat-settings-wkOjYNQT.js +0 -1
  473. package/dist/gateway/static/root/assets/index-BLaXr6Ev.css +0 -1
  474. package/dist/gateway/static/root/assets/index-c_9TVr_C.js +0 -191
  475. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BT8T4DyC.js +0 -1
  476. package/dist/gateway/static/root/assets/logs-page-CrxBJUgI.js +0 -2
  477. package/dist/gateway/static/root/assets/markdown-split-Dv66bO2b.js +0 -1
  478. package/dist/gateway/static/root/assets/messages-O6TAtdFC.js +0 -3
  479. package/dist/gateway/static/root/assets/models-hub-panel-DOOpz6y1.js +0 -2
  480. package/dist/gateway/static/root/assets/notes-page-Br16pK9v.js +0 -1
  481. package/dist/gateway/static/root/assets/notes-workbench-PSJAi0ZC.js +0 -2
  482. package/dist/gateway/static/root/assets/project-detail-page-CIGGgKuw.js +0 -1
  483. package/dist/gateway/static/root/assets/projects-page-B2grhsBt.js +0 -1
  484. package/dist/gateway/static/root/assets/remote-access-hub-CXMORxBD.js +0 -1
  485. package/dist/gateway/static/root/assets/sessions-page-Bi2wkBzU.js +0 -1
  486. package/dist/gateway/static/root/assets/settings-advanced-gate-B1L3G4IA.js +0 -1
  487. package/dist/gateway/static/root/assets/settings-form-section-BnqYMWHR.js +0 -1
  488. package/dist/gateway/static/root/assets/settings-page-BfRSHJmO.js +0 -1
  489. package/dist/gateway/static/root/assets/settings-page-layout-CdWZU1hd.js +0 -1
  490. package/dist/gateway/static/root/assets/setup-status-panel-CWtPM7RK.js +0 -1
  491. package/dist/gateway/static/root/assets/shares-settings-ngbsBgij.js +0 -1
  492. package/dist/gateway/static/root/assets/skill-reload-api-BIe442Gv.js +0 -1
  493. package/dist/gateway/static/root/assets/skills-page-BfchZRVa.js +0 -2
  494. package/dist/gateway/static/root/assets/voice-api-key-field-C5Ov8Uk_.js +0 -1
  495. package/dist/gateway/static/root/assets/workflow-run-setup-panel-BYD9BtOq.js +0 -3
  496. package/dist/gateway/static/root/assets/workflows-page-BYF29ANm.js +0 -18
@@ -1 +1 @@
1
- {"version":3,"file":"dreaming-automation-reconciler.js","names":[],"sources":["../../../src/gateway/dreaming-automation-reconciler.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { getWorkspacePath } from '../config/workspace-path-helpers.js';\nimport { resolveDefaultAgentId } from '../agent/agent-scope.js';\nimport { resolveDreamingConfig, type DreamingResolvedConfig } from '../agent/memory/dreaming/config.js';\nimport {\n DREAMING_CRON_NAME,\n DREAMING_CRON_TAG,\n DREAMING_LIGHT_CRON_NAME,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_REM_CRON_NAME,\n DREAMING_REM_SWEEP_TOKEN,\n DREAMING_SWEEP_TOKEN,\n type DreamingPhaseId,\n} from '../agent/memory/dreaming/constants.js';\nimport type { AutomationService } from '../automations/index.js';\nimport type { Automation, AutomationAction, AutomationTrigger } from '../automations/domain/types.js';\n\ntype DreamingAutomationSpec = {\n id: string;\n phase: DreamingPhaseId;\n name: string;\n token: string;\n};\n\nconst DREAMING_AUTOMATIONS: readonly DreamingAutomationSpec[] = [\n {\n id: 'system-dreaming-light',\n phase: 'light',\n name: DREAMING_LIGHT_CRON_NAME,\n token: DREAMING_LIGHT_SWEEP_TOKEN,\n },\n {\n id: 'system-dreaming-deep',\n phase: 'deep',\n name: DREAMING_CRON_NAME,\n token: DREAMING_SWEEP_TOKEN,\n },\n {\n id: 'system-dreaming-rem',\n phase: 'rem',\n name: DREAMING_REM_CRON_NAME,\n token: DREAMING_REM_SWEEP_TOKEN,\n },\n];\n\nexport type DreamingAutomationReconcileResult = {\n created: string[];\n updated: string[];\n disabled: string[];\n};\n\nfunction phaseDescription(phase: DreamingPhaseId): string {\n const label = phase === 'light' ? 'Light sweep' : phase === 'deep' ? 'Deep promotion' : 'REM pattern discovery';\n return `${label} for memory dreaming. ${DREAMING_CRON_TAG}`;\n}\n\nfunction buildTrigger(config: DreamingResolvedConfig, phase: DreamingPhaseId): AutomationTrigger {\n const phaseConfig = config.phases[phase];\n return {\n kind: 'schedule',\n schedule: {\n kind: 'cron',\n expr: phaseConfig.cron,\n ...(config.timezone ? { tz: config.timezone } : {}),\n },\n };\n}\n\nfunction buildAction(config: Config, agentId: string, token: string): AutomationAction {\n const workspaceDir = getWorkspacePath(config);\n return {\n kind: 'agent',\n agentId,\n instruction: token,\n ...(workspaceDir ? { workingDirectory: workspaceDir } : {}),\n timeoutSeconds: 3600,\n };\n}\n\nfunction automationNeedsUpdate(current: Automation, next: {\n name: string;\n description: string;\n enabled: boolean;\n trigger: AutomationTrigger;\n action: AutomationAction;\n}): boolean {\n return (\n current.name !== next.name ||\n current.description !== next.description ||\n current.enabled !== next.enabled ||\n JSON.stringify(current.trigger) !== JSON.stringify(next.trigger) ||\n JSON.stringify(current.action) !== JSON.stringify(next.action) ||\n current.safety?.mode !== 'auto_apply' ||\n current.afterRun?.kind !== 'none' ||\n current.reliability?.disableAfterConsecutiveFailures !== 3\n );\n}\n\nexport async function reconcileDreamingAutomations(params: {\n config: Config;\n automationService: AutomationService;\n}): Promise<DreamingAutomationReconcileResult> {\n const { config, automationService } = params;\n const resolved = resolveDreamingConfig(config);\n const agentId = resolveDefaultAgentId(config);\n const result: DreamingAutomationReconcileResult = { created: [], updated: [], disabled: [] };\n\n for (const spec of DREAMING_AUTOMATIONS) {\n const current = await automationService.get(spec.id);\n const enabled = resolved.enabled && resolved.phases[spec.phase].enabled;\n\n if (!resolved.enabled) {\n if (current?.enabled) {\n await automationService.update(spec.id, { enabled: false });\n result.disabled.push(spec.id);\n }\n continue;\n }\n\n const next = {\n name: spec.name,\n description: phaseDescription(spec.phase),\n enabled,\n trigger: buildTrigger(resolved, spec.phase),\n action: buildAction(config, agentId, spec.token),\n };\n\n if (!current) {\n await automationService.create({\n id: spec.id,\n ...next,\n safety: { mode: 'auto_apply' },\n afterRun: { kind: 'none' },\n reliability: { disableAfterConsecutiveFailures: 3 },\n });\n result.created.push(spec.id);\n continue;\n }\n\n if (automationNeedsUpdate(current, next)) {\n await automationService.update(spec.id, {\n ...next,\n safety: { mode: 'auto_apply' },\n afterRun: { kind: 'none' },\n reliability: { disableAfterConsecutiveFailures: 3 },\n });\n result.updated.push(spec.id);\n }\n }\n\n return result;\n}\n"],"mappings":";;;;;kBAEgE;AAsBhE,MAAM,uBAA0D;CAC9D;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,OAAO;EACR;CACD;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,OAAO;EACR;CACF;AAQD,SAAS,iBAAiB,OAAgC;AAExD,QAAO,GADO,UAAU,UAAU,gBAAgB,UAAU,SAAS,mBAAmB,wBACxE,wBAAwB;;AAG1C,SAAS,aAAa,QAAgC,OAA2C;AAE/F,QAAO;EACL,MAAM;EACN,UAAU;GACR,MAAM;GACN,MALgB,OAAO,OAAO,OAKZ;GAClB,GAAI,OAAO,WAAW,EAAE,IAAI,OAAO,UAAU,GAAG,EAAE;GACnD;EACF;;AAGH,SAAS,YAAY,QAAgB,SAAiB,OAAiC;CACrF,MAAM,eAAe,iBAAiB,OAAO;AAC7C,QAAO;EACL,MAAM;EACN;EACA,aAAa;EACb,GAAI,eAAe,EAAE,kBAAkB,cAAc,GAAG,EAAE;EAC1D,gBAAgB;EACjB;;AAGH,SAAS,sBAAsB,SAAqB,MAMxC;AACV,QACE,QAAQ,SAAS,KAAK,QACtB,QAAQ,gBAAgB,KAAK,eAC7B,QAAQ,YAAY,KAAK,WACzB,KAAK,UAAU,QAAQ,QAAQ,KAAK,KAAK,UAAU,KAAK,QAAQ,IAChE,KAAK,UAAU,QAAQ,OAAO,KAAK,KAAK,UAAU,KAAK,OAAO,IAC9D,QAAQ,QAAQ,SAAS,gBACzB,QAAQ,UAAU,SAAS,UAC3B,QAAQ,aAAa,oCAAoC;;AAI7D,eAAsB,6BAA6B,QAGJ;CAC7C,MAAM,EAAE,QAAQ,sBAAsB;CACtC,MAAM,WAAW,sBAAsB,OAAO;CAC9C,MAAM,UAAU,sBAAsB,OAAO;CAC7C,MAAM,SAA4C;EAAE,SAAS,EAAE;EAAE,SAAS,EAAE;EAAE,UAAU,EAAE;EAAE;AAE5F,MAAK,MAAM,QAAQ,sBAAsB;EACvC,MAAM,UAAU,MAAM,kBAAkB,IAAI,KAAK,GAAG;EACpD,MAAM,UAAU,SAAS,WAAW,SAAS,OAAO,KAAK,OAAO;AAEhE,MAAI,CAAC,SAAS,SAAS;AACrB,OAAI,SAAS,SAAS;AACpB,UAAM,kBAAkB,OAAO,KAAK,IAAI,EAAE,SAAS,OAAO,CAAC;AAC3D,WAAO,SAAS,KAAK,KAAK,GAAG;;AAE/B;;EAGF,MAAM,OAAO;GACX,MAAM,KAAK;GACX,aAAa,iBAAiB,KAAK,MAAM;GACzC;GACA,SAAS,aAAa,UAAU,KAAK,MAAM;GAC3C,QAAQ,YAAY,QAAQ,SAAS,KAAK,MAAM;GACjD;AAED,MAAI,CAAC,SAAS;AACZ,SAAM,kBAAkB,OAAO;IAC7B,IAAI,KAAK;IACT,GAAG;IACH,QAAQ,EAAE,MAAM,cAAc;IAC9B,UAAU,EAAE,MAAM,QAAQ;IAC1B,aAAa,EAAE,iCAAiC,GAAG;IACpD,CAAC;AACF,UAAO,QAAQ,KAAK,KAAK,GAAG;AAC5B;;AAGF,MAAI,sBAAsB,SAAS,KAAK,EAAE;AACxC,SAAM,kBAAkB,OAAO,KAAK,IAAI;IACtC,GAAG;IACH,QAAQ,EAAE,MAAM,cAAc;IAC9B,UAAU,EAAE,MAAM,QAAQ;IAC1B,aAAa,EAAE,iCAAiC,GAAG;IACpD,CAAC;AACF,UAAO,QAAQ,KAAK,KAAK,GAAG;;;AAIhC,QAAO"}
1
+ {"version":3,"file":"dreaming-automation-reconciler.js","names":[],"sources":["../../../src/gateway/dreaming-automation-reconciler.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { normalizeAgentId } from '../agent/agent-scope.js';\nimport { resolveDreamingConfig, type DreamingResolvedConfig } from '../agent/memory/dreaming/config.js';\nimport { resolveDreamingAgentScope } from '../agent/memory/dreaming/scope.js';\nimport {\n DREAMING_CRON_NAME,\n DREAMING_CRON_TAG,\n DREAMING_LIGHT_CRON_NAME,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_REM_CRON_NAME,\n DREAMING_REM_SWEEP_TOKEN,\n DREAMING_SWEEP_TOKEN,\n type DreamingPhaseId,\n} from '../agent/memory/dreaming/constants.js';\nimport type { AutomationService } from '../automations/index.js';\nimport type { Automation, AutomationAction, AutomationTrigger } from '../automations/domain/types.js';\n\ntype DreamingAutomationSpec = {\n id: string;\n phase: DreamingPhaseId;\n name: string;\n token: string;\n};\n\nconst DREAMING_AUTOMATIONS: readonly DreamingAutomationSpec[] = [\n {\n id: 'system-dreaming-light',\n phase: 'light',\n name: DREAMING_LIGHT_CRON_NAME,\n token: DREAMING_LIGHT_SWEEP_TOKEN,\n },\n {\n id: 'system-dreaming-deep',\n phase: 'deep',\n name: DREAMING_CRON_NAME,\n token: DREAMING_SWEEP_TOKEN,\n },\n {\n id: 'system-dreaming-rem',\n phase: 'rem',\n name: DREAMING_REM_CRON_NAME,\n token: DREAMING_REM_SWEEP_TOKEN,\n },\n];\n\nexport type DreamingAutomationReconcileResult = {\n created: string[];\n updated: string[];\n disabled: string[];\n removed: string[];\n};\n\nfunction phaseDescription(phase: DreamingPhaseId): string {\n const label = phase === 'light' ? 'Light sweep' : phase === 'deep' ? 'Deep promotion' : 'REM pattern discovery';\n return `${label} for memory dreaming. ${DREAMING_CRON_TAG}`;\n}\n\nfunction buildTrigger(config: DreamingResolvedConfig, phase: DreamingPhaseId): AutomationTrigger {\n const phaseConfig = config.phases[phase];\n return {\n kind: 'schedule',\n schedule: {\n kind: 'cron',\n expr: phaseConfig.cron,\n ...(config.timezone ? { tz: config.timezone } : {}),\n },\n };\n}\n\nfunction dreamingAutomationId(agentId: string, phase: DreamingPhaseId): string {\n return `system-dreaming:${normalizeAgentId(agentId)}:${phase}`;\n}\n\nfunction buildAction(config: Config, agentId: string, token: string): AutomationAction {\n const scope = resolveDreamingAgentScope(config, agentId);\n return {\n kind: 'agent',\n agentId: scope.agentId,\n instruction: token,\n workingDirectory: scope.workspaceDir,\n timeoutSeconds: 3600,\n };\n}\n\nfunction automationNeedsUpdate(current: Automation, next: {\n name: string;\n description: string;\n enabled: boolean;\n trigger: AutomationTrigger;\n action: AutomationAction;\n}): boolean {\n return (\n current.name !== next.name ||\n current.description !== next.description ||\n current.enabled !== next.enabled ||\n JSON.stringify(current.trigger) !== JSON.stringify(next.trigger) ||\n JSON.stringify(current.action) !== JSON.stringify(next.action) ||\n current.safety?.mode !== 'auto_apply' ||\n current.afterRun?.kind !== 'none' ||\n current.reliability?.disableAfterConsecutiveFailures !== 3\n );\n}\n\nexport async function reconcileDreamingAutomations(params: {\n config: Config;\n automationService: AutomationService;\n}): Promise<DreamingAutomationReconcileResult> {\n const { config, automationService } = params;\n const result: DreamingAutomationReconcileResult = { created: [], updated: [], disabled: [], removed: [] };\n\n for (const spec of DREAMING_AUTOMATIONS) {\n if (await automationService.remove(spec.id)) {\n result.removed.push(spec.id);\n }\n }\n\n const expectedIds = new Set<string>();\n const agents = config.agents.list.filter((agent) => agent.enabled !== false);\n\n for (const agent of agents) {\n const agentId = normalizeAgentId(agent.id);\n const resolved = resolveDreamingConfig(config, agentId);\n\n for (const spec of DREAMING_AUTOMATIONS) {\n const id = dreamingAutomationId(agentId, spec.phase);\n expectedIds.add(id);\n const current = await automationService.get(id);\n const enabled = resolved.enabled && resolved.phases[spec.phase].enabled;\n\n if (!resolved.enabled) {\n if (current?.enabled) {\n await automationService.update(id, { enabled: false });\n result.disabled.push(id);\n }\n continue;\n }\n\n const next = {\n name: `${spec.name} (${agentId})`,\n description: phaseDescription(spec.phase),\n enabled,\n trigger: buildTrigger(resolved, spec.phase),\n action: buildAction(config, agentId, spec.token),\n };\n\n if (!current) {\n await automationService.create({\n id,\n ...next,\n safety: { mode: 'auto_apply' },\n afterRun: { kind: 'none' },\n reliability: { disableAfterConsecutiveFailures: 3 },\n });\n result.created.push(id);\n continue;\n }\n\n if (automationNeedsUpdate(current, next)) {\n await automationService.update(id, {\n ...next,\n safety: { mode: 'auto_apply' },\n afterRun: { kind: 'none' },\n reliability: { disableAfterConsecutiveFailures: 3 },\n });\n result.updated.push(id);\n }\n }\n }\n\n const allAutomations = await automationService.list();\n for (const automation of allAutomations) {\n if (!automation.id.startsWith('system-dreaming:')) {\n continue;\n }\n if (expectedIds.has(automation.id)) {\n continue;\n }\n if (automation.enabled) {\n await automationService.update(automation.id, { enabled: false });\n result.disabled.push(automation.id);\n }\n }\n\n return result;\n}\n"],"mappings":"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"}
@@ -6,6 +6,8 @@ import { loadTunnelState } from "../../tunnel/tunnel-state.js";
6
6
  import { resolveReverseProxyPublicUrl } from "../public-url.js";
7
7
  import { maxWebchatAgentRequestBodyBytes } from "../chat-limits.js";
8
8
  import { isLoopbackIpAddress, isTrustedProxyAddress } from "../client-ip.js";
9
+ import { WORK_ITEM_ATTACHMENT_UPLOAD_BODY_MAX_BYTES } from "../../work-items/work-item-service.js";
10
+ import "../../work-items/index.js";
9
11
  import { buildGatewayConsoleCspHeader } from "../security/csp.js";
10
12
  import { checkBrowserOrigin } from "../security/origin-check.js";
11
13
  import { auth } from "./middleware/auth.js";
@@ -152,6 +154,10 @@ function createHonoApp(config) {
152
154
  if (/^\/api\/notes\/[^/]+\/media$/.test(path)) return true;
153
155
  return path === "/api/notes" && contentType?.includes("multipart/form-data") === true;
154
156
  };
157
+ const isWorkItemAttachmentUploadRequest = (path, method, contentType) => {
158
+ if (method !== "POST" || contentType?.includes("multipart/form-data") !== true) return false;
159
+ return /^\/api\/work-items\/[^/]+\/attachments$/.test(path) || /^\/api\/projects\/[^/]+\/work-items$/.test(path);
160
+ };
155
161
  app.use("/api/skills/upload", bodyLimit({
156
162
  maxSize: SKILL_UPLOAD_BODY_MAX,
157
163
  onError: (c) => {
@@ -167,7 +173,7 @@ function createHonoApp(config) {
167
173
  }));
168
174
  app.use("/api/*", async (c, next) => {
169
175
  const contentType = c.req.header("content-type");
170
- const maxSize = c.req.path === "/api/agent" ? WEBCHAT_AGENT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcribe" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : DEFAULT_API_BODY_MAX;
176
+ const maxSize = c.req.path === "/api/agent" ? WEBCHAT_AGENT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcribe" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : isWorkItemAttachmentUploadRequest(c.req.path, c.req.method, contentType) ? WORK_ITEM_ATTACHMENT_UPLOAD_BODY_MAX_BYTES : DEFAULT_API_BODY_MAX;
171
177
  const maxSizeMb = Math.ceil(maxSize / (1024 * 1024));
172
178
  return bodyLimit({
173
179
  maxSize,
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","names":[],"sources":["../../../../src/gateway/hono/app.ts"],"sourcesContent":["import { Hono } from 'hono';\nimport type { Context } from 'hono';\nimport { cors } from 'hono/cors';\nimport { createMiddleware } from 'hono/factory';\nimport { bodyLimit } from 'hono/body-limit';\nimport { getConnInfo } from '@hono/node-server/conninfo';\n\nimport { resolveGatewayEffectiveHost } from '../../config/gateway-bind.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { GatewayService } from '../service.js';\nimport { resolveAllowedBrowserOrigins, resolveGatewayServiceListenPort } from '../host.js';\nimport { loadTunnelState } from '../../tunnel/tunnel-state.js';\nimport { maxWebchatAgentRequestBodyBytes } from '../chat-limits.js';\nimport { buildGatewayConsoleCspHeader } from '../security/csp.js';\nimport { checkBrowserOrigin } from '../security/origin-check.js';\nimport { isLoopbackIpAddress, isTrustedProxyAddress } from '../client-ip.js';\nimport { resolveReverseProxyPublicUrl } from '../public-url.js';\nimport { auth } from './middleware/auth.js';\nimport { operatorScopes } from './middleware/scopes.js';\nimport {\n createChannelRateLimitMiddleware,\n createStrictRateLimitMiddleware,\n} from './middleware/strict-rate-limit.js';\nimport { logContextMiddleware } from './middleware/log-context.js';\nimport { logger } from './middleware/logger.js';\nimport { routeErrorMiddleware } from './middleware/route-errors.js';\nimport { registerPublicExtensionAssetRoutes } from './routes/auth-registry-extensions.js';\nimport { registerAuthenticatedRoutes } from './routes/index.js';\nimport { registerPublicGatewayRoutes } from './routes/public-gateway.js';\nimport { resetLazyRouteBundlesForTests } from './routes/lazy-fallback.js';\nimport { prewarmStaticUiCache } from './lib/static-ui.js';\nimport { registerSiteShareMiddleware } from '../../share/site-share-router.js';\nconst log = createLogger('Gateway:App');\n\nexport interface HonoAppConfig {\n service: GatewayService;\n token?: string;\n}\n\n/**\n * Extension sandbox HTML under `/api/extensions/:id/assets/*` ships its own CSP\n * (`frame-ancestors 'self'`). The global gateway middleware must not overwrite it\n * with `frame-ancestors 'none'` / `X-Frame-Options: DENY`, or the console cannot embed iframes.\n */\nexport function isExtensionGatewayUiAssetPath(path: string): boolean {\n return /^\\/api\\/extensions\\/[^/]+\\/assets\\//.test(path);\n}\n\nexport function createHonoApp(config: HonoAppConfig): Hono {\n if (process.env.VITEST) {\n resetLazyRouteBundlesForTests();\n }\n const { service, token } = config;\n const app = new Hono();\n\n const gatewayPort = resolveGatewayServiceListenPort(service);\n\n const resolveBrowserOrigins = (): string[] =>\n resolveAllowedBrowserOrigins({\n configuredOrigins: service.currentConfig.gateway.corsOrigins,\n port: gatewayPort,\n bindHost: resolveGatewayEffectiveHost(service.currentConfig),\n tunnelPublicUrl: loadTunnelState()?.publicUrl,\n reverseProxyPublicUrl: resolveReverseProxyPublicUrl(service.currentConfig),\n });\n\n /**\n * TCP source for the in-flight request, normalized for trusted-proxy checks.\n * Returns undefined when the runtime doesn't expose conninfo (tests, mocks).\n */\n const resolveRequestRemoteAddress = (c: Context): string | undefined => {\n try {\n return getConnInfo(c).remote.address;\n } catch {\n return undefined;\n }\n };\n\n /**\n * A request's TCP source qualifies as a \"trusted proxy hop\" when it's\n * loopback (the user's own machine, where any reverse proxy lives) or\n * listed in `gateway.trustedProxies`. We use this signal to safely\n * auto-allow same-host Origins through CSRF without requiring a manual\n * `corsOrigins` entry for every reverse-proxy hostname.\n */\n const isRequestFromTrustedProxy = (c: Context): boolean => {\n const remote = resolveRequestRemoteAddress(c);\n if (!remote) return false;\n if (isLoopbackIpAddress(remote)) return true;\n return isTrustedProxyAddress(remote, service.currentConfig.gateway?.trustedProxies);\n };\n\n app.use(logContextMiddleware());\n app.use(logger({\n trustedProxies: service.currentConfig.gateway?.trustedProxies,\n allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true,\n }));\n\n // Site-share middleware runs BEFORE CORS/CSP — it owns the request when the\n // Host header matches `*.<publicHostSuffix>` (default `*.share.xopc.ai`) or\n // the path starts with `/site/:token/`. Otherwise it falls through.\n registerSiteShareMiddleware(app, service);\n app.use(\n cors({\n origin: (origin) => {\n const allowed = resolveBrowserOrigins();\n if (!origin) {\n return allowed[0] ?? `http://127.0.0.1:${gatewayPort}`;\n }\n const normalized = origin.toLowerCase();\n const hit = allowed.find((entry) => entry.toLowerCase() === normalized);\n if (hit) return origin;\n return allowed.includes('*') ? '*' : '';\n },\n allowMethods: ['GET', 'POST', 'PATCH', 'DELETE', 'OPTIONS'],\n allowHeaders: ['Content-Type', 'Authorization', 'Accept', 'X-Session-Id', 'Last-Event-ID'],\n credentials: true,\n maxAge: 86400,\n }),\n );\n\n // Build CSP header once at startup (no inline script hashes needed for SPA)\n const gatewayConsoleCsp = buildGatewayConsoleCspHeader();\n\n // Security headers middleware\n app.use(createMiddleware(async (c, next) => {\n await next();\n if (isExtensionGatewayUiAssetPath(c.req.path)) {\n return;\n }\n c.header('X-Frame-Options', 'DENY');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('Referrer-Policy', 'strict-origin-when-cross-origin');\n c.header('X-XSS-Protection', '1; mode=block');\n // microphone=(self): allow same-origin chat voice (composer). microphone=() breaks packaged Electron loading the gateway SPA.\n c.header('Permissions-Policy', 'camera=(), microphone=(self), geolocation=()');\n c.header('Content-Security-Policy', gatewayConsoleCsp);\n }));\n\n // Browser Origin check middleware for API routes (CSRF protection).\n // Non-browser requests (no Origin header) pass through — they are\n // authenticated by the token middleware instead.\n const allowHostHeaderOriginFallback =\n service.currentConfig.gateway?.dangerouslyAllowHostHeaderOriginFallback === true;\n app.use('/api/*', createMiddleware(async (c, next) => {\n // Sandboxed extension iframes (no allow-same-origin) send `Origin: null`.\n // `checkBrowserOrigin` rejects that; these routes rely on CSP instead\n // (`registerPublicExtensionAssetRoutes`).\n if (isExtensionGatewayUiAssetPath(c.req.path)) {\n return next();\n }\n\n const origin = c.req.header('origin');\n if (!origin || origin.trim().toLowerCase() === 'null') {\n // Native apps / opaque origins — authenticated via Bearer token\n return next();\n }\n\n const result = checkBrowserOrigin({\n requestHost: c.req.header('host'),\n origin,\n allowedOrigins: resolveBrowserOrigins(),\n allowHostHeaderOriginFallback,\n autoAllowSameHostFromTrustedProxy: isRequestFromTrustedProxy(c),\n isLocalClient: false,\n });\n\n if (!result.ok) {\n log.warn(\n {\n origin,\n requestHost: c.req.header('host'),\n reason: 'reason' in result ? result.reason : 'unknown',\n path: c.req.path,\n method: c.req.method,\n },\n `Browser origin check failed: ${origin} not in allowed list`,\n );\n return c.json({ error: 'Forbidden', message: 'Origin not allowed' }, 403);\n }\n\n return next();\n }));\n\n const DEFAULT_API_BODY_MAX = 1 * 1024 * 1024;\n const SKILL_UPLOAD_BODY_MAX = 10 * 1024 * 1024;\n const NOTE_MEDIA_BODY_MAX = 25 * 1024 * 1024;\n const VOICE_TRANSCRIBE_BODY_MAX = 35 * 1024 * 1024;\n const WEBCHAT_AGENT_BODY_MAX = maxWebchatAgentRequestBodyBytes();\n\n const isNoteMediaUploadRequest = (path: string, method: string, contentType: string | undefined): boolean => {\n if (method !== 'POST') return false;\n if (/^\\/api\\/notes\\/[^/]+\\/media$/.test(path)) return true;\n return path === '/api/notes' && contentType?.includes('multipart/form-data') === true;\n };\n\n app.use('/api/skills/upload', bodyLimit({\n maxSize: SKILL_UPLOAD_BODY_MAX,\n onError: (c) => {\n log.warn({ path: c.req.path, maxSizeMb: 10 }, 'Request body too large: skills upload exceeds 10MB limit');\n return c.json({ error: 'Skill package too large', maxSize: '10MB' }, 413);\n },\n }));\n\n app.use('/api/*', async (c, next) => {\n const contentType = c.req.header('content-type');\n const maxSize = c.req.path === '/api/agent'\n ? WEBCHAT_AGENT_BODY_MAX\n : c.req.path === '/api/skills/upload'\n ? SKILL_UPLOAD_BODY_MAX\n : c.req.path === '/api/voice/transcribe'\n ? VOICE_TRANSCRIBE_BODY_MAX\n : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType)\n ? NOTE_MEDIA_BODY_MAX\n : DEFAULT_API_BODY_MAX;\n const maxSizeMb = Math.ceil(maxSize / (1024 * 1024));\n return bodyLimit({\n maxSize,\n onError: (ctx) => {\n log.warn({ path: ctx.req.path, maxSizeMb }, `Request body too large: exceeds ${maxSizeMb}MB limit`);\n return ctx.json({ error: 'Request body too large', maxSize: `${maxSizeMb}MB` }, 413);\n },\n })(c, next);\n });\n\n registerPublicGatewayRoutes(app, service);\n\n // Extension UI assets are served without auth: sandboxed iframes (no allow-same-origin)\n // have an opaque origin of `null` and cannot forward the ?token= from the parent HTML URL.\n // Security is enforced by the strict CSP (frame-ancestors 'self') on every response.\n registerPublicExtensionAssetRoutes(app, service);\n\n const authenticated = new Hono();\n authenticated.use(routeErrorMiddleware());\n authenticated.use(\n auth({\n token,\n getGatewayAuth: () => service.currentConfig.gateway?.auth,\n getResolvedAuth: () => {\n if (typeof service.getResolvedAuth === 'function') {\n return service.getResolvedAuth();\n }\n return token ? { mode: 'token', token } : { mode: 'none' };\n },\n getTrustedProxyContext: () => ({\n trustedProxies: service.currentConfig.gateway?.trustedProxies,\n allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true,\n }),\n }),\n );\n authenticated.use(operatorScopes());\n\n const strictRateLimitMiddleware = createStrictRateLimitMiddleware({\n getTrustedProxyContext: () => ({\n trustedProxies: service.currentConfig.gateway?.trustedProxies,\n allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true,\n }),\n });\n const channelRateLimitMiddleware = createChannelRateLimitMiddleware({\n getTrustedProxyContext: () => ({\n trustedProxies: service.currentConfig.gateway?.trustedProxies,\n allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true,\n }),\n });\n\n const sseConfig = {\n service,\n maxSseConnections: service.currentConfig.gateway.maxSseConnections,\n };\n\n registerAuthenticatedRoutes(app, authenticated, {\n service,\n strictRateLimitMiddleware,\n channelRateLimitMiddleware,\n sseConfig,\n });\n\n const prewarm = prewarmStaticUiCache();\n if (prewarm.loaded > 0) {\n log.debug({ loaded: prewarm.loaded, missing: prewarm.missing }, 'Static UI cache prewarmed');\n }\n\n app.route('/', authenticated);\n\n app.notFound((c) => {\n const isApiRoute = c.req.path.startsWith('/api/');\n const fields = { path: c.req.path, method: c.req.method };\n if (isApiRoute) {\n log.warn(fields, 'Route not found');\n } else {\n log.debug(fields, 'Route not found');\n }\n return c.json({ error: 'Not found' }, 404);\n });\n\n app.onError((err, c) => {\n log.error(\n {\n err,\n phase: 'gateway.http.unhandled',\n path: c.req.path,\n method: c.req.method,\n userAgent: c.req.header('user-agent'),\n },\n `Hono error on ${c.req.method} ${c.req.path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return c.json({ error: 'Internal server error' }, 500);\n });\n\n return app;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"app.js","names":[],"sources":["../../../../src/gateway/hono/app.ts"],"sourcesContent":["import { Hono } from 'hono';\nimport type { Context } from 'hono';\nimport { cors } from 'hono/cors';\nimport { createMiddleware } from 'hono/factory';\nimport { bodyLimit } from 'hono/body-limit';\nimport { getConnInfo } from '@hono/node-server/conninfo';\n\nimport { resolveGatewayEffectiveHost } from '../../config/gateway-bind.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { GatewayService } from '../service.js';\nimport { resolveAllowedBrowserOrigins, resolveGatewayServiceListenPort } from '../host.js';\nimport { loadTunnelState } from '../../tunnel/tunnel-state.js';\nimport { WORK_ITEM_ATTACHMENT_UPLOAD_BODY_MAX_BYTES } from '../../work-items/index.js';\nimport { maxWebchatAgentRequestBodyBytes } from '../chat-limits.js';\nimport { buildGatewayConsoleCspHeader } from '../security/csp.js';\nimport { checkBrowserOrigin } from '../security/origin-check.js';\nimport { isLoopbackIpAddress, isTrustedProxyAddress } from '../client-ip.js';\nimport { resolveReverseProxyPublicUrl } from '../public-url.js';\nimport { auth } from './middleware/auth.js';\nimport { operatorScopes } from './middleware/scopes.js';\nimport {\n createChannelRateLimitMiddleware,\n createStrictRateLimitMiddleware,\n} from './middleware/strict-rate-limit.js';\nimport { logContextMiddleware } from './middleware/log-context.js';\nimport { logger } from './middleware/logger.js';\nimport { routeErrorMiddleware } from './middleware/route-errors.js';\nimport { registerPublicExtensionAssetRoutes } from './routes/auth-registry-extensions.js';\nimport { registerAuthenticatedRoutes } from './routes/index.js';\nimport { registerPublicGatewayRoutes } from './routes/public-gateway.js';\nimport { resetLazyRouteBundlesForTests } from './routes/lazy-fallback.js';\nimport { prewarmStaticUiCache } from './lib/static-ui.js';\nimport { registerSiteShareMiddleware } from '../../share/site-share-router.js';\nconst log = createLogger('Gateway:App');\n\nexport interface HonoAppConfig {\n service: GatewayService;\n token?: string;\n}\n\n/**\n * Extension sandbox HTML under `/api/extensions/:id/assets/*` ships its own CSP\n * (`frame-ancestors 'self'`). The global gateway middleware must not overwrite it\n * with `frame-ancestors 'none'` / `X-Frame-Options: DENY`, or the console cannot embed iframes.\n */\nexport function isExtensionGatewayUiAssetPath(path: string): boolean {\n return /^\\/api\\/extensions\\/[^/]+\\/assets\\//.test(path);\n}\n\nexport function createHonoApp(config: HonoAppConfig): Hono {\n if (process.env.VITEST) {\n resetLazyRouteBundlesForTests();\n }\n const { service, token } = config;\n const app = new Hono();\n\n const gatewayPort = resolveGatewayServiceListenPort(service);\n\n const resolveBrowserOrigins = (): string[] =>\n resolveAllowedBrowserOrigins({\n configuredOrigins: service.currentConfig.gateway.corsOrigins,\n port: gatewayPort,\n bindHost: resolveGatewayEffectiveHost(service.currentConfig),\n tunnelPublicUrl: loadTunnelState()?.publicUrl,\n reverseProxyPublicUrl: resolveReverseProxyPublicUrl(service.currentConfig),\n });\n\n /**\n * TCP source for the in-flight request, normalized for trusted-proxy checks.\n * Returns undefined when the runtime doesn't expose conninfo (tests, mocks).\n */\n const resolveRequestRemoteAddress = (c: Context): string | undefined => {\n try {\n return getConnInfo(c).remote.address;\n } catch {\n return undefined;\n }\n };\n\n /**\n * A request's TCP source qualifies as a \"trusted proxy hop\" when it's\n * loopback (the user's own machine, where any reverse proxy lives) or\n * listed in `gateway.trustedProxies`. We use this signal to safely\n * auto-allow same-host Origins through CSRF without requiring a manual\n * `corsOrigins` entry for every reverse-proxy hostname.\n */\n const isRequestFromTrustedProxy = (c: Context): boolean => {\n const remote = resolveRequestRemoteAddress(c);\n if (!remote) return false;\n if (isLoopbackIpAddress(remote)) return true;\n return isTrustedProxyAddress(remote, service.currentConfig.gateway?.trustedProxies);\n };\n\n app.use(logContextMiddleware());\n app.use(logger({\n trustedProxies: service.currentConfig.gateway?.trustedProxies,\n allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true,\n }));\n\n // Site-share middleware runs BEFORE CORS/CSP — it owns the request when the\n // Host header matches `*.<publicHostSuffix>` (default `*.share.xopc.ai`) or\n // the path starts with `/site/:token/`. Otherwise it falls through.\n registerSiteShareMiddleware(app, service);\n app.use(\n cors({\n origin: (origin) => {\n const allowed = resolveBrowserOrigins();\n if (!origin) {\n return allowed[0] ?? `http://127.0.0.1:${gatewayPort}`;\n }\n const normalized = origin.toLowerCase();\n const hit = allowed.find((entry) => entry.toLowerCase() === normalized);\n if (hit) return origin;\n return allowed.includes('*') ? '*' : '';\n },\n allowMethods: ['GET', 'POST', 'PATCH', 'DELETE', 'OPTIONS'],\n allowHeaders: ['Content-Type', 'Authorization', 'Accept', 'X-Session-Id', 'Last-Event-ID'],\n credentials: true,\n maxAge: 86400,\n }),\n );\n\n // Build CSP header once at startup (no inline script hashes needed for SPA)\n const gatewayConsoleCsp = buildGatewayConsoleCspHeader();\n\n // Security headers middleware\n app.use(createMiddleware(async (c, next) => {\n await next();\n if (isExtensionGatewayUiAssetPath(c.req.path)) {\n return;\n }\n c.header('X-Frame-Options', 'DENY');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('Referrer-Policy', 'strict-origin-when-cross-origin');\n c.header('X-XSS-Protection', '1; mode=block');\n // microphone=(self): allow same-origin chat voice (composer). microphone=() breaks packaged Electron loading the gateway SPA.\n c.header('Permissions-Policy', 'camera=(), microphone=(self), geolocation=()');\n c.header('Content-Security-Policy', gatewayConsoleCsp);\n }));\n\n // Browser Origin check middleware for API routes (CSRF protection).\n // Non-browser requests (no Origin header) pass through — they are\n // authenticated by the token middleware instead.\n const allowHostHeaderOriginFallback =\n service.currentConfig.gateway?.dangerouslyAllowHostHeaderOriginFallback === true;\n app.use('/api/*', createMiddleware(async (c, next) => {\n // Sandboxed extension iframes (no allow-same-origin) send `Origin: null`.\n // `checkBrowserOrigin` rejects that; these routes rely on CSP instead\n // (`registerPublicExtensionAssetRoutes`).\n if (isExtensionGatewayUiAssetPath(c.req.path)) {\n return next();\n }\n\n const origin = c.req.header('origin');\n if (!origin || origin.trim().toLowerCase() === 'null') {\n // Native apps / opaque origins — authenticated via Bearer token\n return next();\n }\n\n const result = checkBrowserOrigin({\n requestHost: c.req.header('host'),\n origin,\n allowedOrigins: resolveBrowserOrigins(),\n allowHostHeaderOriginFallback,\n autoAllowSameHostFromTrustedProxy: isRequestFromTrustedProxy(c),\n isLocalClient: false,\n });\n\n if (!result.ok) {\n log.warn(\n {\n origin,\n requestHost: c.req.header('host'),\n reason: 'reason' in result ? result.reason : 'unknown',\n path: c.req.path,\n method: c.req.method,\n },\n `Browser origin check failed: ${origin} not in allowed list`,\n );\n return c.json({ error: 'Forbidden', message: 'Origin not allowed' }, 403);\n }\n\n return next();\n }));\n\n const DEFAULT_API_BODY_MAX = 1 * 1024 * 1024;\n const SKILL_UPLOAD_BODY_MAX = 10 * 1024 * 1024;\n const NOTE_MEDIA_BODY_MAX = 25 * 1024 * 1024;\n const VOICE_TRANSCRIBE_BODY_MAX = 35 * 1024 * 1024;\n const WEBCHAT_AGENT_BODY_MAX = maxWebchatAgentRequestBodyBytes();\n\n const isNoteMediaUploadRequest = (path: string, method: string, contentType: string | undefined): boolean => {\n if (method !== 'POST') return false;\n if (/^\\/api\\/notes\\/[^/]+\\/media$/.test(path)) return true;\n return path === '/api/notes' && contentType?.includes('multipart/form-data') === true;\n };\n\n const isWorkItemAttachmentUploadRequest = (path: string, method: string, contentType: string | undefined): boolean => {\n if (method !== 'POST' || contentType?.includes('multipart/form-data') !== true) return false;\n return /^\\/api\\/work-items\\/[^/]+\\/attachments$/.test(path)\n || /^\\/api\\/projects\\/[^/]+\\/work-items$/.test(path);\n };\n\n app.use('/api/skills/upload', bodyLimit({\n maxSize: SKILL_UPLOAD_BODY_MAX,\n onError: (c) => {\n log.warn({ path: c.req.path, maxSizeMb: 10 }, 'Request body too large: skills upload exceeds 10MB limit');\n return c.json({ error: 'Skill package too large', maxSize: '10MB' }, 413);\n },\n }));\n\n app.use('/api/*', async (c, next) => {\n const contentType = c.req.header('content-type');\n const maxSize = c.req.path === '/api/agent'\n ? WEBCHAT_AGENT_BODY_MAX\n : c.req.path === '/api/skills/upload'\n ? SKILL_UPLOAD_BODY_MAX\n : c.req.path === '/api/voice/transcribe'\n ? VOICE_TRANSCRIBE_BODY_MAX\n : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType)\n ? NOTE_MEDIA_BODY_MAX\n : isWorkItemAttachmentUploadRequest(c.req.path, c.req.method, contentType)\n ? WORK_ITEM_ATTACHMENT_UPLOAD_BODY_MAX_BYTES\n : DEFAULT_API_BODY_MAX;\n const maxSizeMb = Math.ceil(maxSize / (1024 * 1024));\n return bodyLimit({\n maxSize,\n onError: (ctx) => {\n log.warn({ path: ctx.req.path, maxSizeMb }, `Request body too large: exceeds ${maxSizeMb}MB limit`);\n return ctx.json({ error: 'Request body too large', maxSize: `${maxSizeMb}MB` }, 413);\n },\n })(c, next);\n });\n\n registerPublicGatewayRoutes(app, service);\n\n // Extension UI assets are served without auth: sandboxed iframes (no allow-same-origin)\n // have an opaque origin of `null` and cannot forward the ?token= from the parent HTML URL.\n // Security is enforced by the strict CSP (frame-ancestors 'self') on every response.\n registerPublicExtensionAssetRoutes(app, service);\n\n const authenticated = new Hono();\n authenticated.use(routeErrorMiddleware());\n authenticated.use(\n auth({\n token,\n getGatewayAuth: () => service.currentConfig.gateway?.auth,\n getResolvedAuth: () => {\n if (typeof service.getResolvedAuth === 'function') {\n return service.getResolvedAuth();\n }\n return token ? { mode: 'token', token } : { mode: 'none' };\n },\n getTrustedProxyContext: () => ({\n trustedProxies: service.currentConfig.gateway?.trustedProxies,\n allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true,\n }),\n }),\n );\n authenticated.use(operatorScopes());\n\n const strictRateLimitMiddleware = createStrictRateLimitMiddleware({\n getTrustedProxyContext: () => ({\n trustedProxies: service.currentConfig.gateway?.trustedProxies,\n allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true,\n }),\n });\n const channelRateLimitMiddleware = createChannelRateLimitMiddleware({\n getTrustedProxyContext: () => ({\n trustedProxies: service.currentConfig.gateway?.trustedProxies,\n allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true,\n }),\n });\n\n const sseConfig = {\n service,\n maxSseConnections: service.currentConfig.gateway.maxSseConnections,\n };\n\n registerAuthenticatedRoutes(app, authenticated, {\n service,\n strictRateLimitMiddleware,\n channelRateLimitMiddleware,\n sseConfig,\n });\n\n const prewarm = prewarmStaticUiCache();\n if (prewarm.loaded > 0) {\n log.debug({ loaded: prewarm.loaded, missing: prewarm.missing }, 'Static UI cache prewarmed');\n }\n\n app.route('/', authenticated);\n\n app.notFound((c) => {\n const isApiRoute = c.req.path.startsWith('/api/');\n const fields = { path: c.req.path, method: c.req.method };\n if (isApiRoute) {\n log.warn(fields, 'Route not found');\n } else {\n log.debug(fields, 'Route not found');\n }\n return c.json({ error: 'Not found' }, 404);\n });\n\n app.onError((err, c) => {\n log.error(\n {\n err,\n phase: 'gateway.http.unhandled',\n path: c.req.path,\n method: c.req.method,\n userAgent: c.req.header('user-agent'),\n },\n `Hono error on ${c.req.method} ${c.req.path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n return c.json({ error: 'Internal server error' }, 500);\n });\n\n return app;\n}\n"],"mappings":"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"}
@@ -61,13 +61,13 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
61
61
  };
62
62
  policy?: {
63
63
  allowFallbacks?: boolean;
64
- maxCostTier?: "low" | "medium" | "high";
64
+ maxCostTier?: "low" | "high" | "medium";
65
65
  };
66
66
  };
67
67
  tools: {
68
68
  builtin: Record<string, {
69
69
  mode: "allow" | "confirm" | "deny";
70
- scope?: "readonly" | "workspace" | "unrestricted";
70
+ scope?: "workspace" | "readonly" | "unrestricted";
71
71
  limits?: {
72
72
  maxCallsPerTurn?: number;
73
73
  timeoutMs?: number;
@@ -76,7 +76,7 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
76
76
  mcp?: {
77
77
  servers?: Record<string, {
78
78
  mode: "allow" | "confirm" | "deny";
79
- scope?: "readonly" | "workspace" | "unrestricted";
79
+ scope?: "workspace" | "readonly" | "unrestricted";
80
80
  limits?: {
81
81
  maxCallsPerTurn?: number;
82
82
  timeoutMs?: number;
@@ -84,7 +84,7 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
84
84
  }>;
85
85
  tools?: Record<string, {
86
86
  mode: "allow" | "confirm" | "deny";
87
- scope?: "readonly" | "workspace" | "unrestricted";
87
+ scope?: "workspace" | "readonly" | "unrestricted";
88
88
  limits?: {
89
89
  maxCallsPerTurn?: number;
90
90
  timeoutMs?: number;
@@ -98,8 +98,8 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
98
98
  deny?: string[];
99
99
  };
100
100
  memory: {
101
- mode: "off" | "readOnly" | "confirmWrite" | "auto";
102
- sources: ("workspace" | "session" | "userProfile" | "agentProfile" | "curated")[];
101
+ mode: "off" | "auto" | "readOnly" | "confirmWrite";
102
+ sources: ("session" | "workspace" | "userProfile" | "agentProfile" | "curated")[];
103
103
  writePolicy?: {
104
104
  userProfile?: "allow" | "confirm" | "deny";
105
105
  agentProfile?: "allow" | "confirm" | "deny";
@@ -195,13 +195,13 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
195
195
  };
196
196
  policy?: {
197
197
  allowFallbacks?: boolean;
198
- maxCostTier?: "low" | "medium" | "high";
198
+ maxCostTier?: "low" | "high" | "medium";
199
199
  };
200
200
  };
201
201
  tools?: {
202
202
  builtin: Record<string, {
203
203
  mode: "allow" | "confirm" | "deny";
204
- scope?: "readonly" | "workspace" | "unrestricted";
204
+ scope?: "workspace" | "readonly" | "unrestricted";
205
205
  limits?: {
206
206
  maxCallsPerTurn?: number;
207
207
  timeoutMs?: number;
@@ -210,7 +210,7 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
210
210
  mcp?: {
211
211
  servers?: Record<string, {
212
212
  mode: "allow" | "confirm" | "deny";
213
- scope?: "readonly" | "workspace" | "unrestricted";
213
+ scope?: "workspace" | "readonly" | "unrestricted";
214
214
  limits?: {
215
215
  maxCallsPerTurn?: number;
216
216
  timeoutMs?: number;
@@ -218,7 +218,7 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
218
218
  }>;
219
219
  tools?: Record<string, {
220
220
  mode: "allow" | "confirm" | "deny";
221
- scope?: "readonly" | "workspace" | "unrestricted";
221
+ scope?: "workspace" | "readonly" | "unrestricted";
222
222
  limits?: {
223
223
  maxCallsPerTurn?: number;
224
224
  timeoutMs?: number;
@@ -232,8 +232,8 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
232
232
  deny?: string[];
233
233
  };
234
234
  memory?: {
235
- mode: "off" | "readOnly" | "confirmWrite" | "auto";
236
- sources: ("workspace" | "session" | "userProfile" | "agentProfile" | "curated")[];
235
+ mode: "off" | "auto" | "readOnly" | "confirmWrite";
236
+ sources: ("session" | "workspace" | "userProfile" | "agentProfile" | "curated")[];
237
237
  writePolicy?: {
238
238
  userProfile?: "allow" | "confirm" | "deny";
239
239
  agentProfile?: "allow" | "confirm" | "deny";
@@ -334,7 +334,7 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
334
334
  strict: boolean;
335
335
  };
336
336
  auth: {
337
- mode: "none" | "token" | "password" | "trusted-proxy";
337
+ mode: "token" | "password" | "none" | "trusted-proxy";
338
338
  token: string;
339
339
  password: string;
340
340
  trustedProxy: {
@@ -367,7 +367,7 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
367
367
  };
368
368
  };
369
369
  maxSseConnections: number;
370
- channelConnectDeferMode: "off" | "auto" | "explicit";
370
+ channelConnectDeferMode: "explicit" | "off" | "auto";
371
371
  channelConnectDeferIds: string[];
372
372
  channelConnectDeferSkipIds: string[];
373
373
  share: import("../../../share/share-types.js").ShareConfig;
@@ -1,7 +1,7 @@
1
1
  import { dirname, resolve } from "node:path";
2
2
  import { readFileSync } from "node:fs";
3
- import { createHash } from "node:crypto";
4
3
  import { fileURLToPath } from "node:url";
4
+ import { createHash } from "node:crypto";
5
5
  //#region src/gateway/hono/lib/static-ui.ts
6
6
  const __dirname = dirname(fileURLToPath(import.meta.url));
7
7
  /**
@@ -1,4 +1,6 @@
1
1
  import { init_context, runWithLogContext } from "../../../utils/logger/context.js";
2
+ import { runWithActivityContext } from "../../../activity/context.js";
3
+ import "../../../activity/index.js";
2
4
  import { randomUUID } from "node:crypto";
3
5
  import { createMiddleware } from "hono/factory";
4
6
  //#region src/gateway/hono/middleware/log-context.ts
@@ -17,7 +19,12 @@ function logContextMiddleware() {
17
19
  requestId,
18
20
  ...sessionHeader ? { sessionId: sessionHeader } : {}
19
21
  }, async () => {
20
- await next();
22
+ await runWithActivityContext({ source: {
23
+ kind: "gateway_api",
24
+ requestId
25
+ } }, async () => {
26
+ await next();
27
+ });
21
28
  });
22
29
  });
23
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"log-context.js","names":[],"sources":["../../../../../src/gateway/hono/middleware/log-context.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { createMiddleware } from 'hono/factory';\n\nimport { runWithLogContext } from '../../../utils/logger/context.js';\n\n/**\n * Binds request (and optional session) correlation into AsyncLocalStorage so\n * all pino logs in the request inherit requestId / sessionId without a child logger.\n */\nexport function logContextMiddleware() {\n return createMiddleware(async (c, next) => {\n const headerRequestId = c.req.header('x-request-id')?.trim();\n const requestId = headerRequestId && headerRequestId.length > 0 ? headerRequestId : randomUUID();\n const sessionHeader = c.req.header('x-session-id')?.trim();\n\n c.header('X-Request-Id', requestId);\n\n return runWithLogContext(\n {\n requestId,\n ...(sessionHeader ? { sessionId: sessionHeader } : {}),\n },\n async () => {\n await next();\n },\n );\n });\n}\n"],"mappings":";;;;cAIqE;;;;;AAMrE,SAAgB,uBAAuB;AACrC,QAAO,iBAAiB,OAAO,GAAG,SAAS;EACzC,MAAM,kBAAkB,EAAE,IAAI,OAAO,eAAe,EAAE,MAAM;EAC5D,MAAM,YAAY,mBAAmB,gBAAgB,SAAS,IAAI,kBAAkB,YAAY;EAChG,MAAM,gBAAgB,EAAE,IAAI,OAAO,eAAe,EAAE,MAAM;AAE1D,IAAE,OAAO,gBAAgB,UAAU;AAEnC,SAAO,kBACL;GACE;GACA,GAAI,gBAAgB,EAAE,WAAW,eAAe,GAAG,EAAE;GACtD,EACD,YAAY;AACV,SAAM,MAAM;IAEf;GACD"}
1
+ {"version":3,"file":"log-context.js","names":[],"sources":["../../../../../src/gateway/hono/middleware/log-context.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { createMiddleware } from 'hono/factory';\n\nimport { runWithActivityContext } from '../../../activity/index.js';\nimport { runWithLogContext } from '../../../utils/logger/context.js';\n\n/**\n * Binds request (and optional session) correlation into AsyncLocalStorage so\n * all pino logs in the request inherit requestId / sessionId without a child logger.\n */\nexport function logContextMiddleware() {\n return createMiddleware(async (c, next) => {\n const headerRequestId = c.req.header('x-request-id')?.trim();\n const requestId = headerRequestId && headerRequestId.length > 0 ? headerRequestId : randomUUID();\n const sessionHeader = c.req.header('x-session-id')?.trim();\n\n c.header('X-Request-Id', requestId);\n\n return runWithLogContext(\n {\n requestId,\n ...(sessionHeader ? { sessionId: sessionHeader } : {}),\n },\n async () => {\n await runWithActivityContext(\n { source: { kind: 'gateway_api', requestId } },\n async () => {\n await next();\n },\n );\n },\n );\n });\n}\n"],"mappings":";;;;;;cAKqE;;;;;AAMrE,SAAgB,uBAAuB;AACrC,QAAO,iBAAiB,OAAO,GAAG,SAAS;EACzC,MAAM,kBAAkB,EAAE,IAAI,OAAO,eAAe,EAAE,MAAM;EAC5D,MAAM,YAAY,mBAAmB,gBAAgB,SAAS,IAAI,kBAAkB,YAAY;EAChG,MAAM,gBAAgB,EAAE,IAAI,OAAO,eAAe,EAAE,MAAM;AAE1D,IAAE,OAAO,gBAAgB,UAAU;AAEnC,SAAO,kBACL;GACE;GACA,GAAI,gBAAgB,EAAE,WAAW,eAAe,GAAG,EAAE;GACtD,EACD,YAAY;AACV,SAAM,uBACJ,EAAE,QAAQ;IAAE,MAAM;IAAe;IAAW,EAAE,EAC9C,YAAY;AACV,UAAM,MAAM;KAEf;IAEJ;GACD"}
@@ -0,0 +1,14 @@
1
+ import type { Hono } from 'hono';
2
+ import type { ActivityVisibility } from '../../../activity/types.js';
3
+ import type { AuthenticatedRouteDeps } from './deps.js';
4
+ export declare function parseActivityQuery(c: {
5
+ req: {
6
+ query(name: string): string | undefined;
7
+ };
8
+ }): {
9
+ visibility?: ActivityVisibility;
10
+ limit?: number;
11
+ offset?: number;
12
+ };
13
+ export declare function parseActivityIncludeRelated(raw: string | undefined): boolean;
14
+ export declare function registerActivityRoutes(authenticated: Hono, _deps: AuthenticatedRouteDeps): void;
@@ -0,0 +1,72 @@
1
+ import { ActivityService } from "../../../activity/service.js";
2
+ import "../../../activity/index.js";
3
+ //#region src/gateway/hono/routes/activity.ts
4
+ const ACTIVITY_OBJECT_KINDS = new Set([
5
+ "project",
6
+ "note",
7
+ "work_item",
8
+ "session",
9
+ "goal",
10
+ "workflow_run",
11
+ "automation"
12
+ ]);
13
+ function parseActivityVisibility(raw) {
14
+ return raw === "timeline" || raw === "audit" || raw === "debug" ? raw : void 0;
15
+ }
16
+ function parseActivityLimit(raw) {
17
+ if (!raw) return void 0;
18
+ const n = Number.parseInt(raw, 10);
19
+ return Number.isFinite(n) ? Math.min(100, Math.max(1, n)) : void 0;
20
+ }
21
+ function parseActivityOffset(raw) {
22
+ if (!raw) return void 0;
23
+ const n = Number.parseInt(raw, 10);
24
+ return Number.isFinite(n) ? Math.max(0, n) : void 0;
25
+ }
26
+ function parseActivityQuery(c) {
27
+ return {
28
+ visibility: parseActivityVisibility(c.req.query("visibility")),
29
+ limit: parseActivityLimit(c.req.query("limit")),
30
+ offset: parseActivityOffset(c.req.query("offset"))
31
+ };
32
+ }
33
+ function parseActivityIncludeRelated(raw) {
34
+ return raw === "true" || raw === "1";
35
+ }
36
+ function registerActivityRoutes(authenticated, _deps) {
37
+ const activity = new ActivityService();
38
+ authenticated.get("/api/activity", (c) => {
39
+ const result = activity.list(parseActivityQuery(c));
40
+ return c.json({
41
+ ok: true,
42
+ ...result
43
+ });
44
+ });
45
+ authenticated.get("/api/activity/objects/:kind/:id", (c) => {
46
+ const kind = c.req.param("kind");
47
+ if (!ACTIVITY_OBJECT_KINDS.has(kind)) return c.json({
48
+ ok: false,
49
+ error: "Unsupported activity object kind"
50
+ }, 400);
51
+ const id = c.req.param("id").trim();
52
+ if (!id) return c.json({
53
+ ok: false,
54
+ error: "Missing activity object id"
55
+ }, 400);
56
+ const result = activity.listForObject({
57
+ object: {
58
+ kind,
59
+ id
60
+ },
61
+ ...parseActivityQuery(c)
62
+ });
63
+ return c.json({
64
+ ok: true,
65
+ ...result
66
+ });
67
+ });
68
+ }
69
+ //#endregion
70
+ export { parseActivityIncludeRelated, parseActivityQuery, registerActivityRoutes };
71
+
72
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","names":[],"sources":["../../../../../src/gateway/hono/routes/activity.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { ActivityService } from '../../../activity/index.js';\nimport type { ActivityObjectKind, ActivityVisibility } from '../../../activity/types.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst ACTIVITY_OBJECT_KINDS = new Set<ActivityObjectKind>([\n 'project',\n 'note',\n 'work_item',\n 'session',\n 'goal',\n 'workflow_run',\n 'automation',\n]);\n\nfunction parseActivityVisibility(raw: string | undefined): ActivityVisibility | undefined {\n return raw === 'timeline' || raw === 'audit' || raw === 'debug' ? raw : undefined;\n}\n\nfunction parseActivityLimit(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) ? Math.min(100, Math.max(1, n)) : undefined;\n}\n\nfunction parseActivityOffset(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) ? Math.max(0, n) : undefined;\n}\n\nexport function parseActivityQuery(c: {\n req: { query(name: string): string | undefined };\n}): {\n visibility?: ActivityVisibility;\n limit?: number;\n offset?: number;\n} {\n return {\n visibility: parseActivityVisibility(c.req.query('visibility')),\n limit: parseActivityLimit(c.req.query('limit')),\n offset: parseActivityOffset(c.req.query('offset')),\n };\n}\n\nexport function parseActivityIncludeRelated(raw: string | undefined): boolean {\n return raw === 'true' || raw === '1';\n}\n\nexport function registerActivityRoutes(authenticated: Hono, _deps: AuthenticatedRouteDeps): void {\n const activity = new ActivityService();\n\n authenticated.get('/api/activity', (c) => {\n const result = activity.list(parseActivityQuery(c));\n return c.json({ ok: true, ...result });\n });\n\n authenticated.get('/api/activity/objects/:kind/:id', (c) => {\n const kind = c.req.param('kind') as ActivityObjectKind;\n if (!ACTIVITY_OBJECT_KINDS.has(kind)) {\n return c.json({ ok: false, error: 'Unsupported activity object kind' }, 400);\n }\n const id = c.req.param('id').trim();\n if (!id) return c.json({ ok: false, error: 'Missing activity object id' }, 400);\n const result = activity.listForObject({\n object: { kind, id },\n ...parseActivityQuery(c),\n });\n return c.json({ ok: true, ...result });\n });\n}\n"],"mappings":";;;AAMA,MAAM,wBAAwB,IAAI,IAAwB;CACxD;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,wBAAwB,KAAyD;AACxF,QAAO,QAAQ,cAAc,QAAQ,WAAW,QAAQ,UAAU,MAAM,KAAA;;AAG1E,SAAS,mBAAmB,KAA6C;AACvE,KAAI,CAAC,IAAK,QAAO,KAAA;CACjB,MAAM,IAAI,OAAO,SAAS,KAAK,GAAG;AAClC,QAAO,OAAO,SAAS,EAAE,GAAG,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,EAAE,CAAC,GAAG,KAAA;;AAG9D,SAAS,oBAAoB,KAA6C;AACxE,KAAI,CAAC,IAAK,QAAO,KAAA;CACjB,MAAM,IAAI,OAAO,SAAS,KAAK,GAAG;AAClC,QAAO,OAAO,SAAS,EAAE,GAAG,KAAK,IAAI,GAAG,EAAE,GAAG,KAAA;;AAG/C,SAAgB,mBAAmB,GAMjC;AACA,QAAO;EACL,YAAY,wBAAwB,EAAE,IAAI,MAAM,aAAa,CAAC;EAC9D,OAAO,mBAAmB,EAAE,IAAI,MAAM,QAAQ,CAAC;EAC/C,QAAQ,oBAAoB,EAAE,IAAI,MAAM,SAAS,CAAC;EACnD;;AAGH,SAAgB,4BAA4B,KAAkC;AAC5E,QAAO,QAAQ,UAAU,QAAQ;;AAGnC,SAAgB,uBAAuB,eAAqB,OAAqC;CAC/F,MAAM,WAAW,IAAI,iBAAiB;AAEtC,eAAc,IAAI,kBAAkB,MAAM;EACxC,MAAM,SAAS,SAAS,KAAK,mBAAmB,EAAE,CAAC;AACnD,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,GAAG;GAAQ,CAAC;GACtC;AAEF,eAAc,IAAI,oCAAoC,MAAM;EAC1D,MAAM,OAAO,EAAE,IAAI,MAAM,OAAO;AAChC,MAAI,CAAC,sBAAsB,IAAI,KAAK,CAClC,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;GAAoC,EAAE,IAAI;EAE9E,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,CAAC,MAAM;AACnC,MAAI,CAAC,GAAI,QAAO,EAAE,KAAK;GAAE,IAAI;GAAO,OAAO;GAA8B,EAAE,IAAI;EAC/E,MAAM,SAAS,SAAS,cAAc;GACpC,QAAQ;IAAE;IAAM;IAAI;GACpB,GAAG,mBAAmB,EAAE;GACzB,CAAC;AACF,SAAO,EAAE,KAAK;GAAE,IAAI;GAAM,GAAG;GAAQ,CAAC;GACtC"}
@@ -5,9 +5,9 @@ import { getConnectorDefinition, listConnectorCatalog } from "../../../connector
5
5
  import { appendComposioTriggerEvent, listComposioTriggerEvents } from "../../../connectors/composio-triggers.js";
6
6
  import { recordConnectorHealthUsage } from "../../../connectors/usage.js";
7
7
  import { getConnectorInstance, listConnectorInstances } from "../../../connectors/instances.js";
8
- import { testConnectorInstance } from "../../../connectors/health.js";
8
+ import { previewConnectorDefinition, testConnectorInstance } from "../../../connectors/health.js";
9
9
  import { completeConnectorOAuth, startConnectorOAuth } from "../../../connectors/oauth.js";
10
- import { installConnector, installConnectorDefinition, uninstallConnector } from "../../../connectors/install.js";
10
+ import { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from "../../../connectors/install.js";
11
11
  import { setConnectorEnabled } from "../../../connectors/lifecycle.js";
12
12
  import { isConnectorRegistrySource, listConnectorRegistries, searchConnectorRegistries } from "../../../connectors/registries/search.js";
13
13
  //#region src/gateway/hono/routes/connectors.ts
@@ -227,6 +227,27 @@ function registerConnectorRoutes(authenticated, deps) {
227
227
  }
228
228
  });
229
229
  });
230
+ authenticated.post("/api/connectors/preview", strictRateLimitMiddleware, async (c) => {
231
+ const body = await c.req.json().catch(() => ({}));
232
+ const definition = body && typeof body === "object" && !Array.isArray(body) && body.definition && typeof body.definition === "object" && !Array.isArray(body.definition) ? body.definition : void 0;
233
+ if (!definition) return c.json({
234
+ ok: false,
235
+ error: "Missing connector definition."
236
+ }, 400);
237
+ const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
238
+ try {
239
+ const preview = await previewConnectorDefinition(service.currentConfig, definition, input);
240
+ return c.json({
241
+ ok: true,
242
+ payload: { preview }
243
+ });
244
+ } catch (error) {
245
+ return c.json({
246
+ ok: false,
247
+ error: errorMessage(error)
248
+ }, 400);
249
+ }
250
+ });
230
251
  authenticated.post("/api/connectors/approvals/respond", async (c) => {
231
252
  const body = await c.req.json().catch(() => ({}));
232
253
  return c.json({
@@ -334,6 +355,29 @@ function registerConnectorRoutes(authenticated, deps) {
334
355
  }, 500);
335
356
  }
336
357
  });
358
+ authenticated.post("/api/connectors/:id/config", strictRateLimitMiddleware, async (c) => {
359
+ const instanceId = c.req.param("id");
360
+ const body = await c.req.json().catch(() => ({}));
361
+ const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
362
+ const config = service.currentConfig;
363
+ try {
364
+ const instance = updateConnectorConfig(config, instanceId, input);
365
+ const saved = await service.saveConfig(config);
366
+ if (!saved.saved) return c.json({
367
+ ok: false,
368
+ error: saved.error
369
+ }, 500);
370
+ return c.json({
371
+ ok: true,
372
+ payload: { instance }
373
+ });
374
+ } catch (error) {
375
+ return c.json({
376
+ ok: false,
377
+ error: errorMessage(error)
378
+ }, 400);
379
+ }
380
+ });
337
381
  authenticated.post("/api/connectors/:id/enable", strictRateLimitMiddleware, async (c) => {
338
382
  const instanceId = c.req.param("id");
339
383
  const config = service.currentConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"connectors.js","names":[],"sources":["../../../../../src/gateway/hono/routes/connectors.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport type { Config } from '../../../config/schema.js';\nimport { getConnectorDefinition, listConnectorCatalog, listConnectorProviders } from '../../../connectors/catalog.js';\nimport { executeComposioTool, getComposioToolkitScope, listComposioConnections, listComposioTools, setComposioToolkitScope, startComposioAuthorize, type ComposioScope } from '../../../connectors/composio.js';\nimport { appendComposioTriggerEvent, listComposioTriggerEvents } from '../../../connectors/composio-triggers.js';\nimport { testConnectorInstance } from '../../../connectors/health.js';\nimport { installConnector, installConnectorDefinition, uninstallConnector } from '../../../connectors/install.js';\nimport { getConnectorInstance, listConnectorInstances } from '../../../connectors/instances.js';\nimport { setConnectorEnabled } from '../../../connectors/lifecycle.js';\nimport { startConnectorOAuth, completeConnectorOAuth } from '../../../connectors/oauth.js';\nimport { isConnectorRegistrySource, listConnectorRegistries, searchConnectorRegistries } from '../../../connectors/registries/search.js';\nimport { createConnectorSetupSecretRequest, submitConnectorSetupSecret } from '../../../connectors/setup-secrets.js';\nimport { recordConnectorHealthUsage } from '../../../connectors/usage.js';\nimport type { ConnectorDefinition, ConnectorInstallInput } from '../../../connectors/types.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function registerConnectorRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.get('/api/connectors/catalog', (c) => {\n return c.json({\n ok: true,\n payload: {\n connectors: listConnectorCatalog(),\n providers: listConnectorProviders().map((provider) => ({\n id: provider.id,\n displayName: provider.displayName,\n })),\n registries: listConnectorRegistries(),\n },\n });\n });\n\n authenticated.get('/api/connectors/installed', (c) => {\n const config = service.currentConfig as Config;\n return c.json({ ok: true, payload: { instances: listConnectorInstances(config) } });\n });\n\n authenticated.get('/api/connectors/registry/search', async (c) => {\n const query = c.req.query('q') ?? c.req.query('query') ?? '';\n const sourceParam = c.req.query('source') ?? 'all';\n const source = sourceParam !== 'all' && isConnectorRegistrySource(sourceParam) ? sourceParam : 'all';\n const page = Number(c.req.query('page') ?? '1');\n const pageSize = Number(c.req.query('pageSize') ?? '24');\n const browse = c.req.query('browse') === '1' || c.req.query('browse') === 'true';\n const results = await searchConnectorRegistries({ query, source, page, pageSize, browse });\n return c.json({ ok: true, payload: { results, connectors: results.flatMap((result) => result.connectors) } });\n });\n\n authenticated.post('/api/connectors/setup/request-secret', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const key = body && typeof body === 'object' && !Array.isArray(body) && typeof body.key === 'string'\n ? body.key.trim()\n : '';\n if (!key) {\n return c.json({ ok: false, error: 'Missing secret key.' }, 400);\n }\n const label = body && typeof body === 'object' && !Array.isArray(body) && typeof body.label === 'string'\n ? body.label\n : undefined;\n return c.json({ ok: true, payload: { request: createConnectorSetupSecretRequest({ key, label }) } });\n });\n\n authenticated.post('/api/connectors/setup/submit-secret', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const ref = body && typeof body === 'object' && !Array.isArray(body) && typeof body.ref === 'string'\n ? body.ref\n : '';\n const value = body && typeof body === 'object' && !Array.isArray(body) && typeof body.value === 'string'\n ? body.value\n : '';\n const accepted = submitConnectorSetupSecret(ref, value);\n return c.json({ ok: accepted, payload: { accepted }, error: accepted ? undefined : 'Unknown, expired, or empty secret.' }, accepted ? 200 : 400);\n });\n\n authenticated.get('/api/connectors/composio/connections', async (c) => {\n try {\n return c.json({ ok: true, payload: { connections: await listComposioConnections() } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/composio/:toolkit/authorize', strictRateLimitMiddleware, async (c) => {\n try {\n const toolkit = c.req.param('toolkit');\n return c.json({ ok: true, payload: { oauth: await startComposioAuthorize(toolkit) } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.get('/api/connectors/composio/:toolkit/tools', async (c) => {\n try {\n const toolkit = c.req.param('toolkit');\n return c.json({ ok: true, payload: { tools: await listComposioTools(toolkit, service.currentConfig as Config) } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.get('/api/connectors/composio/:toolkit/scope', async (c) => {\n const toolkit = c.req.param('toolkit');\n return c.json({ ok: true, payload: { toolkit, scope: getComposioToolkitScope(service.currentConfig as Config, toolkit) } });\n });\n\n authenticated.post('/api/connectors/composio/:toolkit/scope', strictRateLimitMiddleware, async (c) => {\n const toolkit = c.req.param('toolkit');\n const body = await c.req.json().catch(() => ({}));\n const scope = body && typeof body === 'object' && !Array.isArray(body) && typeof body.scope === 'string'\n ? body.scope\n : '';\n if (scope !== 'read' && scope !== 'write' && scope !== 'admin') {\n return c.json({ ok: false, error: 'Scope must be read, write, or admin.' }, 400);\n }\n const config = service.currentConfig as Config;\n try {\n setComposioToolkitScope(config, toolkit, scope as ComposioScope);\n const saved = await service.saveConfig(config);\n if (!saved.saved) return c.json({ ok: false, error: saved.error }, 500);\n return c.json({ ok: true, payload: { toolkit, scope } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/composio/tools/:slug/execute', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json().catch(() => ({}));\n try {\n const slug = c.req.param('slug');\n const args = body && typeof body === 'object' && !Array.isArray(body) ? body.arguments : undefined;\n return c.json({ ok: true, payload: { result: await executeComposioTool({ slug, arguments: args, config: service.currentConfig as Config }) } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/composio/triggers', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json().catch(() => ({}));\n try {\n const event = await appendComposioTriggerEvent(service.currentConfig as Config, body);\n return c.json({ ok: true, payload: { event } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.get('/api/connectors/composio/triggers', async (c) => {\n const limit = Number(c.req.query('limit') ?? '50');\n try {\n const events = await listComposioTriggerEvents(service.currentConfig as Config, limit);\n return c.json({ ok: true, payload: { events } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.get('/api/connectors/:id', (c) => {\n const connectorId = c.req.param('id');\n const connector = getConnectorDefinition(connectorId);\n if (!connector) {\n return c.json({ ok: false, error: `Unknown connector: ${connectorId}` }, 404);\n }\n const config = service.currentConfig as Config;\n const instances = listConnectorInstances(config).filter((instance) => instance.connectorId === connectorId);\n return c.json({ ok: true, payload: { connector, instances } });\n });\n\n authenticated.post('/api/connectors/approvals/respond', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n return c.json({ ok: true, payload: { acknowledged: true, body } });\n });\n\n authenticated.post('/api/connectors/:id/oauth/start', strictRateLimitMiddleware, async (c) => {\n const connectorId = c.req.param('id');\n const connector = getConnectorDefinition(connectorId);\n if (!connector) {\n return c.json({ ok: false, error: `Unknown connector: ${connectorId}` }, 404);\n }\n try {\n const oauth = await startConnectorOAuth(connector);\n return c.json({ ok: true, payload: { oauth } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/:id/oauth/complete', strictRateLimitMiddleware, async (c) => {\n const connectorId = c.req.param('id');\n const connector = getConnectorDefinition(connectorId);\n if (!connector) {\n return c.json({ ok: false, error: `Unknown connector: ${connectorId}` }, 404);\n }\n const body = await c.req.json().catch(() => ({}));\n const deviceCode = body && typeof body === 'object' && !Array.isArray(body) && typeof body.deviceCode === 'string'\n ? body.deviceCode\n : '';\n try {\n const oauth = await completeConnectorOAuth(connector, { deviceCode });\n return c.json({ ok: true, payload: { oauth } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/:id/install', strictRateLimitMiddleware, async (c) => {\n const connectorId = c.req.param('id');\n const body = await c.req.json().catch(() => ({}));\n const input: ConnectorInstallInput = body && typeof body === 'object' && !Array.isArray(body) ? body : {};\n const registryDefinition = body && typeof body === 'object' && !Array.isArray(body) && body.definition && typeof body.definition === 'object' && !Array.isArray(body.definition)\n ? body.definition as ConnectorDefinition\n : undefined;\n const config = service.currentConfig as Config;\n try {\n const instance = registryDefinition?.id === connectorId\n ? await installConnectorDefinition(config, registryDefinition, input)\n : await installConnector(config, connectorId, input);\n const saved = await service.saveConfig(config);\n if (!saved.saved) {\n return c.json({ ok: false, error: saved.error }, 500);\n }\n return c.json({ ok: true, payload: { instance } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/:id/test', async (c) => {\n const instanceId = c.req.param('id');\n const config = service.currentConfig as Config;\n const instance = getConnectorInstance(config, instanceId);\n if (!instance) {\n return c.json({ ok: false, error: `Connector instance not found: ${instanceId}` }, 404);\n }\n if (instance.materialized.type !== 'mcp') {\n return c.json({ ok: false, error: `Connector type \"${instance.materialized.type}\" does not support MCP health checks.` }, 400);\n }\n try {\n const result = await testConnectorInstance(config, instance.materialized.serverId);\n recordConnectorHealthUsage(config, instance.instanceId, result);\n const saved = await service.saveConfig(config);\n if (!saved.saved) {\n return c.json({ ok: false, error: saved.error }, 500);\n }\n return c.json({ ok: true, payload: result });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 500);\n }\n });\n\n authenticated.post('/api/connectors/:id/enable', strictRateLimitMiddleware, async (c) => {\n const instanceId = c.req.param('id');\n const config = service.currentConfig as Config;\n try {\n const instance = setConnectorEnabled(config, instanceId, true);\n const saved = await service.saveConfig(config);\n if (!saved.saved) {\n return c.json({ ok: false, error: saved.error }, 500);\n }\n return c.json({ ok: true, payload: { instance } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/:id/disable', strictRateLimitMiddleware, async (c) => {\n const instanceId = c.req.param('id');\n const config = service.currentConfig as Config;\n try {\n const instance = setConnectorEnabled(config, instanceId, false);\n const saved = await service.saveConfig(config);\n if (!saved.saved) {\n return c.json({ ok: false, error: saved.error }, 500);\n }\n return c.json({ ok: true, payload: { instance } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.delete('/api/connectors/:id', strictRateLimitMiddleware, async (c) => {\n const instanceId = c.req.param('id');\n const config = service.currentConfig as Config;\n try {\n const instance = uninstallConnector(config, instanceId);\n const saved = await service.saveConfig(config);\n if (!saved.saved) {\n return c.json({ ok: false, error: saved.error }, 500);\n }\n return c.json({ ok: true, payload: { instance } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"connectors.js","names":[],"sources":["../../../../../src/gateway/hono/routes/connectors.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport type { Config } from '../../../config/schema.js';\nimport { getConnectorDefinition, listConnectorCatalog, listConnectorProviders } from '../../../connectors/catalog.js';\nimport { executeComposioTool, getComposioToolkitScope, listComposioConnections, listComposioTools, setComposioToolkitScope, startComposioAuthorize, type ComposioScope } from '../../../connectors/composio.js';\nimport { appendComposioTriggerEvent, listComposioTriggerEvents } from '../../../connectors/composio-triggers.js';\nimport { previewConnectorDefinition, testConnectorInstance } from '../../../connectors/health.js';\nimport { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from '../../../connectors/install.js';\nimport { getConnectorInstance, listConnectorInstances } from '../../../connectors/instances.js';\nimport { setConnectorEnabled } from '../../../connectors/lifecycle.js';\nimport { startConnectorOAuth, completeConnectorOAuth } from '../../../connectors/oauth.js';\nimport { isConnectorRegistrySource, listConnectorRegistries, searchConnectorRegistries } from '../../../connectors/registries/search.js';\nimport { createConnectorSetupSecretRequest, submitConnectorSetupSecret } from '../../../connectors/setup-secrets.js';\nimport { recordConnectorHealthUsage } from '../../../connectors/usage.js';\nimport type { ConnectorDefinition, ConnectorInstallInput } from '../../../connectors/types.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nexport function registerConnectorRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.get('/api/connectors/catalog', (c) => {\n return c.json({\n ok: true,\n payload: {\n connectors: listConnectorCatalog(),\n providers: listConnectorProviders().map((provider) => ({\n id: provider.id,\n displayName: provider.displayName,\n })),\n registries: listConnectorRegistries(),\n },\n });\n });\n\n authenticated.get('/api/connectors/installed', (c) => {\n const config = service.currentConfig as Config;\n return c.json({ ok: true, payload: { instances: listConnectorInstances(config) } });\n });\n\n authenticated.get('/api/connectors/registry/search', async (c) => {\n const query = c.req.query('q') ?? c.req.query('query') ?? '';\n const sourceParam = c.req.query('source') ?? 'all';\n const source = sourceParam !== 'all' && isConnectorRegistrySource(sourceParam) ? sourceParam : 'all';\n const page = Number(c.req.query('page') ?? '1');\n const pageSize = Number(c.req.query('pageSize') ?? '24');\n const browse = c.req.query('browse') === '1' || c.req.query('browse') === 'true';\n const results = await searchConnectorRegistries({ query, source, page, pageSize, browse });\n return c.json({ ok: true, payload: { results, connectors: results.flatMap((result) => result.connectors) } });\n });\n\n authenticated.post('/api/connectors/setup/request-secret', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const key = body && typeof body === 'object' && !Array.isArray(body) && typeof body.key === 'string'\n ? body.key.trim()\n : '';\n if (!key) {\n return c.json({ ok: false, error: 'Missing secret key.' }, 400);\n }\n const label = body && typeof body === 'object' && !Array.isArray(body) && typeof body.label === 'string'\n ? body.label\n : undefined;\n return c.json({ ok: true, payload: { request: createConnectorSetupSecretRequest({ key, label }) } });\n });\n\n authenticated.post('/api/connectors/setup/submit-secret', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const ref = body && typeof body === 'object' && !Array.isArray(body) && typeof body.ref === 'string'\n ? body.ref\n : '';\n const value = body && typeof body === 'object' && !Array.isArray(body) && typeof body.value === 'string'\n ? body.value\n : '';\n const accepted = submitConnectorSetupSecret(ref, value);\n return c.json({ ok: accepted, payload: { accepted }, error: accepted ? undefined : 'Unknown, expired, or empty secret.' }, accepted ? 200 : 400);\n });\n\n authenticated.get('/api/connectors/composio/connections', async (c) => {\n try {\n return c.json({ ok: true, payload: { connections: await listComposioConnections() } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/composio/:toolkit/authorize', strictRateLimitMiddleware, async (c) => {\n try {\n const toolkit = c.req.param('toolkit');\n return c.json({ ok: true, payload: { oauth: await startComposioAuthorize(toolkit) } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.get('/api/connectors/composio/:toolkit/tools', async (c) => {\n try {\n const toolkit = c.req.param('toolkit');\n return c.json({ ok: true, payload: { tools: await listComposioTools(toolkit, service.currentConfig as Config) } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.get('/api/connectors/composio/:toolkit/scope', async (c) => {\n const toolkit = c.req.param('toolkit');\n return c.json({ ok: true, payload: { toolkit, scope: getComposioToolkitScope(service.currentConfig as Config, toolkit) } });\n });\n\n authenticated.post('/api/connectors/composio/:toolkit/scope', strictRateLimitMiddleware, async (c) => {\n const toolkit = c.req.param('toolkit');\n const body = await c.req.json().catch(() => ({}));\n const scope = body && typeof body === 'object' && !Array.isArray(body) && typeof body.scope === 'string'\n ? body.scope\n : '';\n if (scope !== 'read' && scope !== 'write' && scope !== 'admin') {\n return c.json({ ok: false, error: 'Scope must be read, write, or admin.' }, 400);\n }\n const config = service.currentConfig as Config;\n try {\n setComposioToolkitScope(config, toolkit, scope as ComposioScope);\n const saved = await service.saveConfig(config);\n if (!saved.saved) return c.json({ ok: false, error: saved.error }, 500);\n return c.json({ ok: true, payload: { toolkit, scope } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/composio/tools/:slug/execute', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json().catch(() => ({}));\n try {\n const slug = c.req.param('slug');\n const args = body && typeof body === 'object' && !Array.isArray(body) ? body.arguments : undefined;\n return c.json({ ok: true, payload: { result: await executeComposioTool({ slug, arguments: args, config: service.currentConfig as Config }) } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/composio/triggers', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json().catch(() => ({}));\n try {\n const event = await appendComposioTriggerEvent(service.currentConfig as Config, body);\n return c.json({ ok: true, payload: { event } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.get('/api/connectors/composio/triggers', async (c) => {\n const limit = Number(c.req.query('limit') ?? '50');\n try {\n const events = await listComposioTriggerEvents(service.currentConfig as Config, limit);\n return c.json({ ok: true, payload: { events } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.get('/api/connectors/:id', (c) => {\n const connectorId = c.req.param('id');\n const connector = getConnectorDefinition(connectorId);\n if (!connector) {\n return c.json({ ok: false, error: `Unknown connector: ${connectorId}` }, 404);\n }\n const config = service.currentConfig as Config;\n const instances = listConnectorInstances(config).filter((instance) => instance.connectorId === connectorId);\n return c.json({ ok: true, payload: { connector, instances } });\n });\n\n authenticated.post('/api/connectors/preview', strictRateLimitMiddleware, async (c) => {\n const body = await c.req.json().catch(() => ({}));\n const definition = body && typeof body === 'object' && !Array.isArray(body) && body.definition && typeof body.definition === 'object' && !Array.isArray(body.definition)\n ? body.definition as ConnectorDefinition\n : undefined;\n if (!definition) {\n return c.json({ ok: false, error: 'Missing connector definition.' }, 400);\n }\n const input: ConnectorInstallInput = body && typeof body === 'object' && !Array.isArray(body) ? body : {};\n try {\n const preview = await previewConnectorDefinition(service.currentConfig as Config, definition, input);\n return c.json({ ok: true, payload: { preview } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/approvals/respond', async (c) => {\n const body = await c.req.json().catch(() => ({}));\n return c.json({ ok: true, payload: { acknowledged: true, body } });\n });\n\n authenticated.post('/api/connectors/:id/oauth/start', strictRateLimitMiddleware, async (c) => {\n const connectorId = c.req.param('id');\n const connector = getConnectorDefinition(connectorId);\n if (!connector) {\n return c.json({ ok: false, error: `Unknown connector: ${connectorId}` }, 404);\n }\n try {\n const oauth = await startConnectorOAuth(connector);\n return c.json({ ok: true, payload: { oauth } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/:id/oauth/complete', strictRateLimitMiddleware, async (c) => {\n const connectorId = c.req.param('id');\n const connector = getConnectorDefinition(connectorId);\n if (!connector) {\n return c.json({ ok: false, error: `Unknown connector: ${connectorId}` }, 404);\n }\n const body = await c.req.json().catch(() => ({}));\n const deviceCode = body && typeof body === 'object' && !Array.isArray(body) && typeof body.deviceCode === 'string'\n ? body.deviceCode\n : '';\n try {\n const oauth = await completeConnectorOAuth(connector, { deviceCode });\n return c.json({ ok: true, payload: { oauth } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/:id/install', strictRateLimitMiddleware, async (c) => {\n const connectorId = c.req.param('id');\n const body = await c.req.json().catch(() => ({}));\n const input: ConnectorInstallInput = body && typeof body === 'object' && !Array.isArray(body) ? body : {};\n const registryDefinition = body && typeof body === 'object' && !Array.isArray(body) && body.definition && typeof body.definition === 'object' && !Array.isArray(body.definition)\n ? body.definition as ConnectorDefinition\n : undefined;\n const config = service.currentConfig as Config;\n try {\n const instance = registryDefinition?.id === connectorId\n ? await installConnectorDefinition(config, registryDefinition, input)\n : await installConnector(config, connectorId, input);\n const saved = await service.saveConfig(config);\n if (!saved.saved) {\n return c.json({ ok: false, error: saved.error }, 500);\n }\n return c.json({ ok: true, payload: { instance } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/:id/test', async (c) => {\n const instanceId = c.req.param('id');\n const config = service.currentConfig as Config;\n const instance = getConnectorInstance(config, instanceId);\n if (!instance) {\n return c.json({ ok: false, error: `Connector instance not found: ${instanceId}` }, 404);\n }\n if (instance.materialized.type !== 'mcp') {\n return c.json({ ok: false, error: `Connector type \"${instance.materialized.type}\" does not support MCP health checks.` }, 400);\n }\n try {\n const result = await testConnectorInstance(config, instance.materialized.serverId);\n recordConnectorHealthUsage(config, instance.instanceId, result);\n const saved = await service.saveConfig(config);\n if (!saved.saved) {\n return c.json({ ok: false, error: saved.error }, 500);\n }\n return c.json({ ok: true, payload: result });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 500);\n }\n });\n\n authenticated.post('/api/connectors/:id/config', strictRateLimitMiddleware, async (c) => {\n const instanceId = c.req.param('id');\n const body = await c.req.json().catch(() => ({}));\n const input: ConnectorInstallInput = body && typeof body === 'object' && !Array.isArray(body) ? body : {};\n const config = service.currentConfig as Config;\n try {\n const instance = updateConnectorConfig(config, instanceId, input);\n const saved = await service.saveConfig(config);\n if (!saved.saved) {\n return c.json({ ok: false, error: saved.error }, 500);\n }\n return c.json({ ok: true, payload: { instance } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/:id/enable', strictRateLimitMiddleware, async (c) => {\n const instanceId = c.req.param('id');\n const config = service.currentConfig as Config;\n try {\n const instance = setConnectorEnabled(config, instanceId, true);\n const saved = await service.saveConfig(config);\n if (!saved.saved) {\n return c.json({ ok: false, error: saved.error }, 500);\n }\n return c.json({ ok: true, payload: { instance } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.post('/api/connectors/:id/disable', strictRateLimitMiddleware, async (c) => {\n const instanceId = c.req.param('id');\n const config = service.currentConfig as Config;\n try {\n const instance = setConnectorEnabled(config, instanceId, false);\n const saved = await service.saveConfig(config);\n if (!saved.saved) {\n return c.json({ ok: false, error: saved.error }, 500);\n }\n return c.json({ ok: true, payload: { instance } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n\n authenticated.delete('/api/connectors/:id', strictRateLimitMiddleware, async (c) => {\n const instanceId = c.req.param('id');\n const config = service.currentConfig as Config;\n try {\n const instance = uninstallConnector(config, instanceId);\n const saved = await service.saveConfig(config);\n if (!saved.saved) {\n return c.json({ ok: false, error: saved.error }, 500);\n }\n return c.json({ ok: true, payload: { instance } });\n } catch (error) {\n return c.json({ ok: false, error: errorMessage(error) }, 400);\n }\n });\n}\n"],"mappings":"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"}