@xopcai/xopc 0.0.142 → 0.0.143

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 (543) hide show
  1. package/README.md +1 -1
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/activity-center-store-jITiX2vJ.js +1 -0
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BawPxiu5.js → agent-avatar-dicebear-DiME9u_P.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-DzBXhZXO.js +2 -0
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-81xd1p9R.js → app-management-settings-panel-Cuo7SbUP.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-DYeQsYU8.js → appearance-settings-DUfdNQqk.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-CKuKK5AU.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-D_oa7oti.js → archive-plugin-B-Qk6cGr.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-Cd-bwI2N.js → attachment-load-Di6EEbQX.js} +1 -1
  12. package/dist/gateway/static/root/assets/automation-suggestion-card-DGxvRxtO.js +1 -0
  13. package/dist/gateway/static/root/assets/automations-page-D-FF_WKV.js +4 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-O8svLKWw.js → binary-plugins-ZaOZDH2I.js} +1 -1
  15. package/dist/gateway/static/root/assets/block-editor-BTFhjWfg.js +184 -0
  16. package/dist/gateway/static/root/assets/browser-settings-page-BvKLdEQt.js +8 -0
  17. package/dist/gateway/static/root/assets/{capability-presets-api-dJy1Eqgx.js → capability-presets-api-BU-pVZiZ.js} +1 -1
  18. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DgyeEwzh.js +2 -0
  19. package/dist/gateway/static/root/assets/{channel-recipient-api-Bfuhp2ty.js → channel-recipient-api-DuulnhIj.js} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-BbVsdD_I.js +1 -0
  21. package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +1 -0
  22. package/dist/gateway/static/root/assets/check-BODqo66o.js +1 -0
  23. package/dist/gateway/static/root/assets/chunk-QUQL4437-DXsxWP7r.js +4 -0
  24. package/dist/gateway/static/root/assets/circle-alert-RzVebuX2.js +1 -0
  25. package/dist/gateway/static/root/assets/connectors-page-B8QqVy3I.js +2 -0
  26. package/dist/gateway/static/root/assets/{desktop-pet-DFMfIb5F.js → desktop-pet---yzVxVR.js} +1 -1
  27. package/dist/gateway/static/root/assets/desktop-pet-settings-Dc3gqBJE.js +1 -0
  28. package/dist/gateway/static/root/assets/{directory-picker-path-field-BrYt1gAr.js → directory-picker-path-field-DCmOGLtK.js} +1 -1
  29. package/dist/gateway/static/root/assets/dreaming-settings-BgT5KZVe.js +3 -0
  30. package/dist/gateway/static/root/assets/{extension-debug-page-Bh630pLD.js → extension-debug-page-ByaKTTq4.js} +1 -1
  31. package/dist/gateway/static/root/assets/extension-page-BmRzHAZr.js +1 -0
  32. package/dist/gateway/static/root/assets/extension-settings-page-JUtwIhbF.js +1 -0
  33. package/dist/gateway/static/root/assets/{fetch-B1WtuprY.js → fetch-8QNN25Sh.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-config-api-De2N821l.js → gateway-config-api-CxicF50_.js} +1 -1
  35. package/dist/gateway/static/root/assets/gateway-settings-Bz2I_EO5.js +1 -0
  36. package/dist/gateway/static/root/assets/{gateway-startup-retry-nEujFSDj.js → gateway-startup-retry-5YBnS9Fj.js} +1 -1
  37. package/dist/gateway/static/root/assets/goal-create-dialog-VcoyuZGN.js +1 -0
  38. package/dist/gateway/static/root/assets/goal-detail-page-Cilkap2G.js +4 -0
  39. package/dist/gateway/static/root/assets/{goals-config-api-DUy3eEse.js → goals-config-api-CwcHRdC0.js} +1 -1
  40. package/dist/gateway/static/root/assets/goals-page-C6eoni4z.js +2 -0
  41. package/dist/gateway/static/root/assets/goals-settings-o4i-qAOS.js +1 -0
  42. package/dist/gateway/static/root/assets/heartbeat-settings-DQQkETX8.js +1 -0
  43. package/dist/gateway/static/root/assets/index-BKRqeRHm.js +257 -0
  44. package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
  45. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CVIwwM15.js → keyboard-shortcuts-settings-LT6qB-ua.js} +1 -1
  46. package/dist/gateway/static/root/assets/logs-page-Dli2e3fS.js +7 -0
  47. package/dist/gateway/static/root/assets/{markdown-split-B_6us9j7.js → markdown-split-Dw-yE2-y.js} +1 -1
  48. package/dist/gateway/static/root/assets/{media-plugins-D_fryIyj.js → media-plugins-D9NNNUgE.js} +1 -1
  49. package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
  50. package/dist/gateway/static/root/assets/models-hub-panel-DVn2Q1Ik.js +2 -0
  51. package/dist/gateway/static/root/assets/notes-page-CRgbJGgk.js +1 -0
  52. package/dist/gateway/static/root/assets/notes-workbench-BxZRHLWx.js +2 -0
  53. package/dist/gateway/static/root/assets/{page-tabs-D_8jGlqx.js → page-tabs-D4hkWVt_.js} +1 -1
  54. package/dist/gateway/static/root/assets/{preview-open-alternatives-BBLMK8Mp.js → preview-open-alternatives-CIckv0uy.js} +1 -1
  55. package/dist/gateway/static/root/assets/project-detail-page-Doz53xLn.js +1 -0
  56. package/dist/gateway/static/root/assets/projects-page-DoMtcRLg.js +1 -0
  57. package/dist/gateway/static/root/assets/remote-access-hub-BeHVEgrm.js +1 -0
  58. package/dist/gateway/static/root/assets/{save-bar-controls-DVS3FR5r.js → save-bar-controls-B0b42kB2.js} +1 -1
  59. package/dist/gateway/static/root/assets/{schedule-field-D6vKd6-T.js → schedule-field-BtjEkczK.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schema-form-BPy4lbIh.js → schema-form-Bf0bk3i6.js} +1 -1
  61. package/dist/gateway/static/root/assets/sessions-page-Bk4bQsBe.js +1 -0
  62. package/dist/gateway/static/root/assets/settings-advanced-gate-DdFyaRMm.js +1 -0
  63. package/dist/gateway/static/root/assets/{settings-collapsible-section-WzdikxPt.js → settings-collapsible-section-BTKTdTNX.js} +1 -1
  64. package/dist/gateway/static/root/assets/{settings-form-section-CvfzhBV-.js → settings-form-section-DL4P0sAj.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BxR-Ulhi.js → settings-loading-skeleton-BV6KFNj4.js} +1 -1
  66. package/dist/gateway/static/root/assets/settings-page-B_4DsX5W.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-page-layout-CKefvbYi.js → settings-page-layout-CyGlrInB.js} +1 -1
  68. package/dist/gateway/static/root/assets/setup-status-panel-DJ1_MLgX.js +1 -0
  69. package/dist/gateway/static/root/assets/share-preview-page-BQBV7YrV.js +2 -0
  70. package/dist/gateway/static/root/assets/shares-settings-0VuFLBeU.js +1 -0
  71. package/dist/gateway/static/root/assets/skill-reload-api-DO87Ckeo.js +1 -0
  72. package/dist/gateway/static/root/assets/skills-page-D3VdtxAn.js +2 -0
  73. package/dist/gateway/static/root/assets/{system-settings-panel-BokgAgf7.js → system-settings-panel-D85fBBuI.js} +1 -1
  74. package/dist/gateway/static/root/assets/{typed-models-lib-BwHlNL3L.js → typed-models-lib-CwEuYrHX.js} +1 -1
  75. package/dist/gateway/static/root/assets/{use-channel-catalog-DR11ap3A.js → use-channel-catalog-COXIfXcl.js} +1 -1
  76. package/dist/gateway/static/root/assets/user-context-page-m9JVQ73F.js +1 -0
  77. package/dist/gateway/static/root/assets/user-profile-fields-editor-DtQiuY7E.js +1 -0
  78. package/dist/gateway/static/root/assets/user-profile-settings-panel-CWM0fEpb.js +1 -0
  79. package/dist/gateway/static/root/assets/{utils-BKUWB-TT.js → utils--BO6xT3u.js} +1 -1
  80. package/dist/gateway/static/root/assets/voice-api-key-field-LoT3wgZ9.js +1 -0
  81. package/dist/gateway/static/root/assets/with-selector-aYPsXwdl.js +1 -0
  82. package/dist/gateway/static/root/assets/work-item-detail-page-DSTMz_mO.js +1 -0
  83. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CL_rnAUB.js → workflow-run-setup-panel-B35lJzvm.js} +2 -2
  84. package/dist/gateway/static/root/assets/workflows-page-BfSm9oR8.js +11 -0
  85. package/dist/gateway/static/root/assets/workflows-page-DLioOiRN.css +1 -0
  86. package/dist/gateway/static/root/connector-icons/README.md +11 -0
  87. package/dist/gateway/static/root/connector-icons/airtable.svg +13 -0
  88. package/dist/gateway/static/root/connector-icons/asana.svg +15 -0
  89. package/dist/gateway/static/root/connector-icons/brave-search.svg +1 -0
  90. package/dist/gateway/static/root/connector-icons/clickup.svg +19 -0
  91. package/dist/gateway/static/root/connector-icons/composio.svg +266 -0
  92. package/dist/gateway/static/root/connector-icons/discord.svg +15 -0
  93. package/dist/gateway/static/root/connector-icons/dropbox.svg +152 -0
  94. package/dist/gateway/static/root/connector-icons/excel.svg +56 -0
  95. package/dist/gateway/static/root/connector-icons/fetch.svg +6 -0
  96. package/dist/gateway/static/root/connector-icons/figma.svg +178 -0
  97. package/dist/gateway/static/root/connector-icons/filesystem.svg +6 -0
  98. package/dist/gateway/static/root/connector-icons/github.svg +10 -0
  99. package/dist/gateway/static/root/connector-icons/gmail.svg +3 -0
  100. package/dist/gateway/static/root/connector-icons/google-calendar.svg +3 -0
  101. package/dist/gateway/static/root/connector-icons/google-docs.svg +25 -0
  102. package/dist/gateway/static/root/connector-icons/google-drive.svg +25 -0
  103. package/dist/gateway/static/root/connector-icons/google-sheets.svg +1 -0
  104. package/dist/gateway/static/root/connector-icons/hubspot.svg +142 -0
  105. package/dist/gateway/static/root/connector-icons/jira.svg +15 -0
  106. package/dist/gateway/static/root/connector-icons/linear.svg +5 -0
  107. package/dist/gateway/static/root/connector-icons/memory.svg +5 -0
  108. package/dist/gateway/static/root/connector-icons/microsoft-teams.svg +33 -0
  109. package/dist/gateway/static/root/connector-icons/notion.svg +5 -0
  110. package/dist/gateway/static/root/connector-icons/one-drive.svg +13 -0
  111. package/dist/gateway/static/root/connector-icons/outlook.svg +76 -0
  112. package/dist/gateway/static/root/connector-icons/playwright.svg +9 -0
  113. package/dist/gateway/static/root/connector-icons/salesforce.svg +17 -0
  114. package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +8 -0
  115. package/dist/gateway/static/root/connector-icons/shopify.svg +5 -0
  116. package/dist/gateway/static/root/connector-icons/slack.svg +9 -0
  117. package/dist/gateway/static/root/connector-icons/spotify.svg +43 -0
  118. package/dist/gateway/static/root/connector-icons/stripe.svg +11 -0
  119. package/dist/gateway/static/root/connector-icons/telegram.svg +130 -0
  120. package/dist/gateway/static/root/connector-icons/time.svg +6 -0
  121. package/dist/gateway/static/root/connector-icons/todoist.svg +277 -0
  122. package/dist/gateway/static/root/connector-icons/trello.svg +19 -0
  123. package/dist/gateway/static/root/connector-icons/twitter.svg +128 -0
  124. package/dist/gateway/static/root/connector-icons/whatsapp.svg +61 -0
  125. package/dist/gateway/static/root/connector-icons/youtube.svg +11 -0
  126. package/dist/gateway/static/root/index.html +9 -6
  127. package/dist/package.js +1 -1
  128. package/dist/src/agent/agent-manager.d.ts +2 -0
  129. package/dist/src/agent/agent-manager.js +8 -0
  130. package/dist/src/agent/agent-manager.js.map +1 -1
  131. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  132. package/dist/src/agent/background-review/prompts.js +3 -2
  133. package/dist/src/agent/background-review/prompts.js.map +1 -1
  134. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  135. package/dist/src/agent/embedded/xopc-tools-bridge.d.ts +9 -0
  136. package/dist/src/agent/embedded/xopc-tools-bridge.js +71 -3
  137. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
  138. package/dist/src/agent/goals/post-turn.js +5 -4
  139. package/dist/src/agent/goals/post-turn.js.map +1 -1
  140. package/dist/src/agent/mcp/mcp-transport.js +4 -1
  141. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  142. package/dist/src/agent/memory/context/planner.d.ts +1 -0
  143. package/dist/src/agent/memory/context/planner.js +60 -14
  144. package/dist/src/agent/memory/context/planner.js.map +1 -1
  145. package/dist/src/agent/memory/context/types.d.ts +3 -1
  146. package/dist/src/agent/memory/lifecycle.d.ts +11 -0
  147. package/dist/src/agent/memory/lifecycle.js +50 -0
  148. package/dist/src/agent/memory/lifecycle.js.map +1 -0
  149. package/dist/src/agent/memory/source-origin.d.ts +3 -0
  150. package/dist/src/agent/memory/source-origin.js +19 -0
  151. package/dist/src/agent/memory/source-origin.js.map +1 -0
  152. package/dist/src/agent/memory/understanding/service.js +5 -0
  153. package/dist/src/agent/memory/understanding/service.js.map +1 -1
  154. package/dist/src/agent/memory/user-context-coordinator.js +7 -2
  155. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
  156. package/dist/src/agent/prompt/sections/behavior.d.ts +2 -0
  157. package/dist/src/agent/prompt/sections/behavior.js +30 -1
  158. package/dist/src/agent/prompt/sections/behavior.js.map +1 -1
  159. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  160. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  161. package/dist/src/agent/prompt/service-prompt-builder.js +8 -1
  162. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  163. package/dist/src/agent/prompt/system-prompt.d.ts +2 -0
  164. package/dist/src/agent/prompt/system-prompt.js +6 -3
  165. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  166. package/dist/src/agent/service/process-direct-streaming.js +22 -0
  167. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  168. package/dist/src/agent/service.d.ts +2 -0
  169. package/dist/src/agent/service.js +9 -3
  170. package/dist/src/agent/service.js.map +1 -1
  171. package/dist/src/agent/starter-agents.js +1 -1
  172. package/dist/src/agent/starter-agents.js.map +1 -1
  173. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
  174. package/dist/src/agent/tool-manuals/xopc-use.js +1 -1
  175. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -1
  176. package/dist/src/agent/tools/composio-tool.d.ts +18 -5
  177. package/dist/src/agent/tools/composio-tool.js +252 -35
  178. package/dist/src/agent/tools/composio-tool.js.map +1 -1
  179. package/dist/src/agent/tools/factory.js +7 -3
  180. package/dist/src/agent/tools/factory.js.map +1 -1
  181. package/dist/src/agent/tools/index.d.ts +1 -1
  182. package/dist/src/agent/tools/index.js +2 -2
  183. package/dist/src/agent/tools/workflow-tool.d.ts +0 -1
  184. package/dist/src/agent/tools/workflow-tool.js +3 -16
  185. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  186. package/dist/src/agent/workflow/builtins/index.d.ts +2 -28
  187. package/dist/src/agent/workflow/builtins/index.js +226 -41
  188. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  189. package/dist/src/agent/workflow/catalog.d.ts +32 -34
  190. package/dist/src/agent/workflow/catalog.js +158 -154
  191. package/dist/src/agent/workflow/catalog.js.map +1 -1
  192. package/dist/src/agent/workflow/index.d.ts +4 -6
  193. package/dist/src/agent/workflow/index.js +2 -5
  194. package/dist/src/agent/workflow/snapshot.d.ts +2 -2
  195. package/dist/src/agent/workflow/snapshot.js +2 -2
  196. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  197. package/dist/src/agent/workflow/structured-output-tool.d.ts +2 -2
  198. package/dist/src/agent/workflow/structured-output-tool.js +2 -2
  199. package/dist/src/agent/workflow/structured-output-tool.js.map +1 -1
  200. package/dist/src/agent/workflow/subagent-runner.js +1 -1
  201. package/dist/src/agent/workflow/types.d.ts +31 -26
  202. package/dist/src/agent-manifest/index.d.ts +1 -0
  203. package/dist/src/agent-manifest/index.js +3 -1
  204. package/dist/src/agent-manifest/index.js.map +1 -1
  205. package/dist/src/agent-manifest/preset-chain.d.ts +10 -0
  206. package/dist/src/agent-manifest/preset-chain.js +32 -0
  207. package/dist/src/agent-manifest/preset-chain.js.map +1 -0
  208. package/dist/src/agent-manifest/resolver.js +3 -10
  209. package/dist/src/agent-manifest/resolver.js.map +1 -1
  210. package/dist/src/agent-manifest/schema.d.ts +4 -4
  211. package/dist/src/automations/api/routes.js +13 -1
  212. package/dist/src/automations/api/routes.js.map +1 -1
  213. package/dist/src/automations/domain/validation.d.ts +14 -14
  214. package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
  215. package/dist/src/browser/providers/browser-ext-install.d.ts +11 -1
  216. package/dist/src/browser/providers/browser-ext-install.js +39 -14
  217. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  218. package/dist/src/capabilities/store-connector.d.ts +0 -1
  219. package/dist/src/capabilities/store-connector.js +3 -5
  220. package/dist/src/capabilities/store-connector.js.map +1 -1
  221. package/dist/src/chat-commands/builtins/review.js +72 -73
  222. package/dist/src/chat-commands/builtins/review.js.map +1 -1
  223. package/dist/src/chat-commands/builtins/workflow.js +9 -54
  224. package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
  225. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  226. package/dist/src/cli/commands/extension-create.js +2 -2
  227. package/dist/src/cli/commands/extension-create.js.map +1 -1
  228. package/dist/src/cli/commands/extension-marketplace.js +42 -36
  229. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  230. package/dist/src/cli/commands/extension-pack.d.ts +6 -0
  231. package/dist/src/cli/commands/extension-pack.js +3 -2
  232. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  233. package/dist/src/commands/agents.config.d.ts +1 -0
  234. package/dist/src/commands/agents.config.js +1 -0
  235. package/dist/src/commands/agents.config.js.map +1 -1
  236. package/dist/src/config/schema.d.ts +6 -6
  237. package/dist/src/config/schema.js +6 -22
  238. package/dist/src/config/schema.js.map +1 -1
  239. package/dist/src/config/web-patch.d.ts +1 -1
  240. package/dist/src/connectors/approval.d.ts +2 -0
  241. package/dist/src/connectors/approval.js +33 -0
  242. package/dist/src/connectors/approval.js.map +1 -0
  243. package/dist/src/connectors/auth-provider-registry.d.ts +9 -0
  244. package/dist/src/connectors/auth-provider-registry.js +17 -0
  245. package/dist/src/connectors/auth-provider-registry.js.map +1 -0
  246. package/dist/src/connectors/builtin-catalog.js +55 -116
  247. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  248. package/dist/src/connectors/catalog.js +7 -2
  249. package/dist/src/connectors/catalog.js.map +1 -1
  250. package/dist/src/connectors/composio-catalog.d.ts +19 -0
  251. package/dist/src/connectors/composio-catalog.js +237 -0
  252. package/dist/src/connectors/composio-catalog.js.map +1 -0
  253. package/dist/src/connectors/composio-logo.d.ts +1 -0
  254. package/dist/src/connectors/composio-logo.js +51 -0
  255. package/dist/src/connectors/composio-logo.js.map +1 -0
  256. package/dist/src/connectors/composio-sessions.d.ts +116 -0
  257. package/dist/src/connectors/composio-sessions.js +296 -0
  258. package/dist/src/connectors/composio-sessions.js.map +1 -0
  259. package/dist/src/connectors/composio-triggers.d.ts +17 -0
  260. package/dist/src/connectors/composio-triggers.js +48 -5
  261. package/dist/src/connectors/composio-triggers.js.map +1 -1
  262. package/dist/src/connectors/composio.d.ts +31 -2
  263. package/dist/src/connectors/composio.js +374 -151
  264. package/dist/src/connectors/composio.js.map +1 -1
  265. package/dist/src/connectors/connector-memory-sync.d.ts +15 -0
  266. package/dist/src/connectors/connector-memory-sync.js +90 -0
  267. package/dist/src/connectors/connector-memory-sync.js.map +1 -0
  268. package/dist/src/connectors/install.js +35 -92
  269. package/dist/src/connectors/install.js.map +1 -1
  270. package/dist/src/connectors/instances.js +6 -2
  271. package/dist/src/connectors/instances.js.map +1 -1
  272. package/dist/src/connectors/integration-strategy.d.ts +3 -0
  273. package/dist/src/connectors/integration-strategy.js +29 -0
  274. package/dist/src/connectors/integration-strategy.js.map +1 -0
  275. package/dist/src/connectors/policy.d.ts +13 -0
  276. package/dist/src/connectors/policy.js +48 -0
  277. package/dist/src/connectors/policy.js.map +1 -0
  278. package/dist/src/connectors/providers.js +1 -1
  279. package/dist/src/connectors/runtime-adapter-registry.d.ts +25 -0
  280. package/dist/src/connectors/runtime-adapter-registry.js +154 -0
  281. package/dist/src/connectors/runtime-adapter-registry.js.map +1 -0
  282. package/dist/src/connectors/types.d.ts +113 -4
  283. package/dist/src/connectors/workflow-preflight.d.ts +20 -0
  284. package/dist/src/connectors/workflow-preflight.js +70 -0
  285. package/dist/src/connectors/workflow-preflight.js.map +1 -0
  286. package/dist/src/extensions/install-transaction.d.ts +16 -0
  287. package/dist/src/extensions/install-transaction.js +76 -0
  288. package/dist/src/extensions/install-transaction.js.map +1 -0
  289. package/dist/src/extensions/install.d.ts +2 -0
  290. package/dist/src/extensions/install.js +23 -1
  291. package/dist/src/extensions/install.js.map +1 -1
  292. package/dist/src/gateway/agents-admin.d.ts +2 -0
  293. package/dist/src/gateway/agents-admin.js +7 -0
  294. package/dist/src/gateway/agents-admin.js.map +1 -1
  295. package/dist/src/gateway/capability-presets-admin.d.ts +11 -0
  296. package/dist/src/gateway/capability-presets-admin.js +11 -4
  297. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  298. package/dist/src/gateway/chat-stream/mapper.js +17 -0
  299. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  300. package/dist/src/gateway/chat-stream/protocol.d.ts +18 -1
  301. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -3
  302. package/dist/src/gateway/hono/routes/agents.js +3 -0
  303. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  304. package/dist/src/gateway/hono/routes/capability-presets.js +19 -1
  305. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
  306. package/dist/src/gateway/hono/routes/connectors.js +188 -25
  307. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  308. package/dist/src/gateway/hono/routes/goals.js +22 -3
  309. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  310. package/dist/src/gateway/hono/routes/home.d.ts +60 -1
  311. package/dist/src/gateway/hono/routes/home.js +244 -18
  312. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  313. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  314. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  315. package/dist/src/gateway/hono/routes/memory.js +14 -1
  316. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  317. package/dist/src/gateway/hono/routes/projects.js +103 -2
  318. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  319. package/dist/src/gateway/hono/routes/public-gateway.js +93 -0
  320. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  321. package/dist/src/gateway/hono/routes/workflows.js +137 -22
  322. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  323. package/dist/src/gateway/hono/routes/you.d.ts +23 -0
  324. package/dist/src/gateway/hono/routes/you.js +538 -0
  325. package/dist/src/gateway/hono/routes/you.js.map +1 -0
  326. package/dist/src/gateway/hono/sse.d.ts +2 -1
  327. package/dist/src/gateway/hono/sse.js +2 -1
  328. package/dist/src/gateway/hono/sse.js.map +1 -1
  329. package/dist/src/gateway/service/marketplace-service.d.ts +13 -1
  330. package/dist/src/gateway/service/marketplace-service.js +96 -40
  331. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  332. package/dist/src/gateway/service.d.ts +2 -0
  333. package/dist/src/gateway/service.js +7 -1
  334. package/dist/src/gateway/service.js.map +1 -1
  335. package/dist/src/goals/goal-service.d.ts +7 -5
  336. package/dist/src/goals/goal-service.js +25 -13
  337. package/dist/src/goals/goal-service.js.map +1 -1
  338. package/dist/src/goals/goal-store.js +46 -7
  339. package/dist/src/goals/goal-store.js.map +1 -1
  340. package/dist/src/goals/types.d.ts +24 -0
  341. package/dist/src/storage/sqlite/connector-repository.d.ts +49 -0
  342. package/dist/src/storage/sqlite/connector-repository.js +385 -0
  343. package/dist/src/storage/sqlite/connector-repository.js.map +1 -0
  344. package/dist/src/storage/sqlite/index.d.ts +3 -0
  345. package/dist/src/storage/sqlite/index.js +4 -1
  346. package/dist/src/storage/sqlite/migrations/030_connectors.sql +94 -0
  347. package/dist/src/storage/sqlite/migrations/031_connector_approvals.sql +24 -0
  348. package/dist/src/storage/sqlite/migrations/032_connector_webhook_deliveries.sql +15 -0
  349. package/dist/src/storage/sqlite/migrations/033_user_trust_policies.sql +6 -0
  350. package/dist/src/storage/sqlite/migrations/034_allow_global_auto_trust.sql +14 -0
  351. package/dist/src/storage/sqlite/migrations/035_user_profile_prompt_state.sql +7 -0
  352. package/dist/src/storage/sqlite/migrations/036_goal_outcome_metric.sql +12 -0
  353. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  354. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  355. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  356. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  357. package/dist/src/storage/sqlite/schema.js +1 -1
  358. package/dist/src/storage/sqlite/user-profile-setup-repository.d.ts +3 -0
  359. package/dist/src/storage/sqlite/user-profile-setup-repository.js +34 -0
  360. package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +1 -0
  361. package/dist/src/storage/sqlite/user-trust-repository.d.ts +3 -0
  362. package/dist/src/storage/sqlite/user-trust-repository.js +34 -0
  363. package/dist/src/storage/sqlite/user-trust-repository.js.map +1 -0
  364. package/dist/src/tui/components/assistant-message.js +15 -0
  365. package/dist/src/tui/components/assistant-message.js.map +1 -1
  366. package/dist/src/tui/tui-agent-events.js +85 -1
  367. package/dist/src/tui/tui-agent-events.js.map +1 -1
  368. package/dist/src/tui/tui-command-formatters.js +7 -7
  369. package/dist/src/tui/tui-command-formatters.js.map +1 -1
  370. package/dist/src/tui/tui-commands.js +1 -1
  371. package/dist/src/tui/tui-startup-resources.js +1 -1
  372. package/dist/src/user-context/import.d.ts +12 -0
  373. package/dist/src/user-context/import.js +48 -0
  374. package/dist/src/user-context/import.js.map +1 -0
  375. package/dist/src/user-context/profile.d.ts +37 -0
  376. package/dist/src/user-context/profile.js +165 -0
  377. package/dist/src/user-context/profile.js.map +1 -0
  378. package/dist/src/user-context/projection.d.ts +54 -0
  379. package/dist/src/user-context/projection.js +121 -0
  380. package/dist/src/user-context/projection.js.map +1 -0
  381. package/dist/src/user-context/source-recommendations.d.ts +13 -0
  382. package/dist/src/user-context/source-recommendations.js +86 -0
  383. package/dist/src/user-context/source-recommendations.js.map +1 -0
  384. package/dist/src/user-context/trust-policy.d.ts +11 -0
  385. package/dist/src/user-context/trust-policy.js +31 -0
  386. package/dist/src/user-context/trust-policy.js.map +1 -0
  387. package/dist/src/workflows/authoring/index.d.ts +1 -0
  388. package/dist/src/workflows/authoring/index.js +2 -0
  389. package/dist/src/workflows/authoring/workflow-draft-store.d.ts +33 -0
  390. package/dist/src/workflows/authoring/workflow-draft-store.js +74 -0
  391. package/dist/src/workflows/authoring/workflow-draft-store.js.map +1 -0
  392. package/dist/src/workflows/domain/definition-utils.d.ts +6 -4
  393. package/dist/src/workflows/domain/definition-utils.js +28 -26
  394. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  395. package/dist/src/workflows/domain/definition.d.ts +79 -6
  396. package/dist/src/workflows/domain/event.d.ts +18 -2
  397. package/dist/src/workflows/domain/index.js +3 -3
  398. package/dist/src/workflows/domain/run.d.ts +16 -2
  399. package/dist/src/workflows/domain/run.js.map +1 -1
  400. package/dist/src/workflows/domain/validation.d.ts +9 -5
  401. package/dist/src/workflows/domain/validation.js +183 -40
  402. package/dist/src/workflows/domain/validation.js.map +1 -1
  403. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +2 -3
  404. package/dist/src/workflows/draft/workflow-draft-prompt.js +31 -73
  405. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -1
  406. package/dist/src/workflows/draft/workflow-draft-service.js +4 -8
  407. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -1
  408. package/dist/src/workflows/draft/workflow-draft-validator.js +29 -37
  409. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -1
  410. package/dist/src/workflows/draft/workflow-draft.types.d.ts +4 -4
  411. package/dist/src/workflows/engine/projector.js +43 -1
  412. package/dist/src/workflows/engine/projector.js.map +1 -1
  413. package/dist/src/workflows/engine/workflow-engine.d.ts +2 -3
  414. package/dist/src/workflows/engine/workflow-engine.js +24 -4
  415. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  416. package/dist/src/workflows/index.js +4 -7
  417. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +1 -9
  418. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -1
  419. package/dist/src/workflows/runtime/graph-workflow-runtime.d.ts +10 -0
  420. package/dist/src/workflows/runtime/graph-workflow-runtime.js +295 -0
  421. package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +1 -0
  422. package/dist/src/workflows/runtime/index.d.ts +1 -2
  423. package/dist/src/workflows/runtime/index.js +2 -5
  424. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +5 -8
  425. package/dist/src/workflows/service/workflow-run-service.js +15 -1
  426. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  427. package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -1
  428. package/package.json +4 -3
  429. package/dist/gateway/static/root/assets/agents-CyvCIHnB.js +0 -2
  430. package/dist/gateway/static/root/assets/apps-page-DK_Vx6nl.js +0 -1
  431. package/dist/gateway/static/root/assets/automation-suggestion-card-B1LV3YYv.js +0 -1
  432. package/dist/gateway/static/root/assets/automations-page-fzrovqhv.js +0 -4
  433. package/dist/gateway/static/root/assets/block-editor-Dhj5f4Bx.js +0 -184
  434. package/dist/gateway/static/root/assets/browser-settings-page-BDn-n-UB.js +0 -8
  435. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Co5ipo_Q.js +0 -1
  436. package/dist/gateway/static/root/assets/channels-settings-BWlpaxg9.js +0 -1
  437. package/dist/gateway/static/root/assets/channels-status-swr-D_jkIZLV.js +0 -1
  438. package/dist/gateway/static/root/assets/connectors-page-BcekbW4q.js +0 -2
  439. package/dist/gateway/static/root/assets/desktop-pet-settings-BJCUuL8Y.js +0 -1
  440. package/dist/gateway/static/root/assets/dreaming-settings-BN1Z2mIo.js +0 -3
  441. package/dist/gateway/static/root/assets/extension-page-B-1KxvVy.js +0 -1
  442. package/dist/gateway/static/root/assets/extension-settings-page-BF9NACI3.js +0 -1
  443. package/dist/gateway/static/root/assets/gateway-settings-DN9sNREz.js +0 -1
  444. package/dist/gateway/static/root/assets/goal-create-dialog-BpoQW8cD.js +0 -1
  445. package/dist/gateway/static/root/assets/goal-detail-page-CBRSPd0b.js +0 -4
  446. package/dist/gateway/static/root/assets/goals-page-BCcBi407.js +0 -2
  447. package/dist/gateway/static/root/assets/goals-settings-pkTXzXkh.js +0 -1
  448. package/dist/gateway/static/root/assets/heartbeat-settings-ezsufgLQ.js +0 -1
  449. package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +0 -1
  450. package/dist/gateway/static/root/assets/index-DcUaXYeb.js +0 -262
  451. package/dist/gateway/static/root/assets/logs-page-DQtTRXtj.js +0 -7
  452. package/dist/gateway/static/root/assets/messages-BXNELNBa.js +0 -3
  453. package/dist/gateway/static/root/assets/models-hub-panel-BP2M9n6Q.js +0 -2
  454. package/dist/gateway/static/root/assets/notes-page-CspveYaO.js +0 -1
  455. package/dist/gateway/static/root/assets/notes-workbench-BHwzJ0OC.js +0 -2
  456. package/dist/gateway/static/root/assets/project-detail-page-Dy3rsobs.js +0 -1
  457. package/dist/gateway/static/root/assets/projects-page-CWKpPE0L.js +0 -1
  458. package/dist/gateway/static/root/assets/remote-access-hub-CqNRyXEo.js +0 -1
  459. package/dist/gateway/static/root/assets/sessions-page-MEME7ivF.js +0 -1
  460. package/dist/gateway/static/root/assets/settings-advanced-gate-JVd0qaSF.js +0 -1
  461. package/dist/gateway/static/root/assets/settings-page-DYEbB1EV.js +0 -1
  462. package/dist/gateway/static/root/assets/setup-status-panel-dWN8BJ3z.js +0 -1
  463. package/dist/gateway/static/root/assets/share-preview-page-D8foINzP.js +0 -2
  464. package/dist/gateway/static/root/assets/shares-settings-Tgbv1s7G.js +0 -1
  465. package/dist/gateway/static/root/assets/skill-reload-api-D_YK0b_Z.js +0 -1
  466. package/dist/gateway/static/root/assets/skills-page-DGytfoZK.js +0 -2
  467. package/dist/gateway/static/root/assets/toast-z0toXu32.js +0 -1
  468. package/dist/gateway/static/root/assets/user-profile-settings-panel-8YtygcJp.js +0 -1
  469. package/dist/gateway/static/root/assets/voice-api-key-field-BVH71EFf.js +0 -1
  470. package/dist/gateway/static/root/assets/work-item-detail-page-JeTE7XNM.js +0 -1
  471. package/dist/gateway/static/root/assets/workflow-start-dialog-_u8Uc1ze.js +0 -1
  472. package/dist/gateway/static/root/assets/workflows-page-ixgk_y1l.js +0 -18
  473. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +0 -13
  474. package/dist/src/agent/workflow/builtins/audit-repo.js +0 -183
  475. package/dist/src/agent/workflow/builtins/audit-repo.js.map +0 -1
  476. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +0 -12
  477. package/dist/src/agent/workflow/builtins/client-proposal.js +0 -164
  478. package/dist/src/agent/workflow/builtins/client-proposal.js.map +0 -1
  479. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +0 -12
  480. package/dist/src/agent/workflow/builtins/competitor-scan.js +0 -164
  481. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +0 -1
  482. package/dist/src/agent/workflow/builtins/content-draft.d.ts +0 -13
  483. package/dist/src/agent/workflow/builtins/content-draft.js +0 -159
  484. package/dist/src/agent/workflow/builtins/content-draft.js.map +0 -1
  485. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +0 -11
  486. package/dist/src/agent/workflow/builtins/content-repurpose.js +0 -146
  487. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +0 -1
  488. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +0 -13
  489. package/dist/src/agent/workflow/builtins/debug-incident.js +0 -177
  490. package/dist/src/agent/workflow/builtins/debug-incident.js.map +0 -1
  491. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +0 -13
  492. package/dist/src/agent/workflow/builtins/decision-compare.js +0 -187
  493. package/dist/src/agent/workflow/builtins/decision-compare.js.map +0 -1
  494. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +0 -12
  495. package/dist/src/agent/workflow/builtins/implementation-plan.js +0 -185
  496. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +0 -1
  497. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +0 -11
  498. package/dist/src/agent/workflow/builtins/inbox-triage.js +0 -158
  499. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +0 -1
  500. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +0 -12
  501. package/dist/src/agent/workflow/builtins/meeting-prep.js +0 -152
  502. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +0 -1
  503. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +0 -14
  504. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +0 -171
  505. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +0 -1
  506. package/dist/src/agent/workflow/builtins/offer-design.d.ts +0 -12
  507. package/dist/src/agent/workflow/builtins/offer-design.js +0 -170
  508. package/dist/src/agent/workflow/builtins/offer-design.js.map +0 -1
  509. package/dist/src/agent/workflow/builtins/pr-review.d.ts +0 -12
  510. package/dist/src/agent/workflow/builtins/pr-review.js +0 -178
  511. package/dist/src/agent/workflow/builtins/pr-review.js.map +0 -1
  512. package/dist/src/agent/workflow/builtins/release-check.d.ts +0 -11
  513. package/dist/src/agent/workflow/builtins/release-check.js +0 -174
  514. package/dist/src/agent/workflow/builtins/release-check.js.map +0 -1
  515. package/dist/src/agent/workflow/builtins/research.d.ts +0 -13
  516. package/dist/src/agent/workflow/builtins/research.js +0 -188
  517. package/dist/src/agent/workflow/builtins/research.js.map +0 -1
  518. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +0 -12
  519. package/dist/src/agent/workflow/builtins/weekly-review.js +0 -139
  520. package/dist/src/agent/workflow/builtins/weekly-review.js.map +0 -1
  521. package/dist/src/agent/workflow/last-run-memory.d.ts +0 -42
  522. package/dist/src/agent/workflow/last-run-memory.js +0 -60
  523. package/dist/src/agent/workflow/last-run-memory.js.map +0 -1
  524. package/dist/src/agent/workflow/lint.d.ts +0 -38
  525. package/dist/src/agent/workflow/lint.js +0 -74
  526. package/dist/src/agent/workflow/lint.js.map +0 -1
  527. package/dist/src/agent/workflow/meta-locale.d.ts +0 -12
  528. package/dist/src/agent/workflow/meta-locale.js +0 -62
  529. package/dist/src/agent/workflow/meta-locale.js.map +0 -1
  530. package/dist/src/agent/workflow/parser.d.ts +0 -20
  531. package/dist/src/agent/workflow/parser.js +0 -152
  532. package/dist/src/agent/workflow/parser.js.map +0 -1
  533. package/dist/src/agent/workflow/runtime.d.ts +0 -34
  534. package/dist/src/agent/workflow/runtime.js +0 -402
  535. package/dist/src/agent/workflow/runtime.js.map +0 -1
  536. package/dist/src/connectors/oauth.d.ts +0 -22
  537. package/dist/src/connectors/oauth.js +0 -99
  538. package/dist/src/connectors/oauth.js.map +0 -1
  539. package/dist/src/workflows/runtime/script-runtime.d.ts +0 -3
  540. package/dist/src/workflows/runtime/script-runtime.js +0 -3
  541. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +0 -5
  542. package/dist/src/workflows/runtime/script-workflow-runtime.js +0 -15
  543. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +0 -1
@@ -1,5 +1,10 @@
1
1
  import { PACKAGE_VERSION, init_package_version } from "../../../package-version.js";
2
+ import { claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, releaseConnectorWebhookDelivery } from "../../../storage/sqlite/connector-repository.js";
3
+ import "../../../storage/sqlite/index.js";
4
+ import { composioLogoResponse } from "../../../connectors/composio-logo.js";
5
+ import { appendComposioTriggerEvent, applyComposioConnectionLifecycleEvent, normalizeComposioTriggerPayload, verifyComposioWebhook } from "../../../connectors/composio-triggers.js";
2
6
  import { serveStaticFile } from "../lib/static-ui.js";
7
+ import { createHash } from "node:crypto";
3
8
  //#region src/gateway/hono/routes/public-gateway.ts
4
9
  init_package_version();
5
10
  function registerPublicGatewayRoutes(app, service) {
@@ -18,6 +23,78 @@ function registerPublicGatewayRoutes(app, service) {
18
23
  startupDurationMs: health.startupDurationMs
19
24
  });
20
25
  });
26
+ app.post("/api/connectors/composio/webhook", async (c) => {
27
+ const secret = process.env.COMPOSIO_WEBHOOK_SECRET?.trim();
28
+ if (!secret) return c.json({
29
+ ok: false,
30
+ error: "Composio webhook is not configured."
31
+ }, 503);
32
+ const webhookId = c.req.header("webhook-id")?.trim() ?? "";
33
+ const body = await c.req.text();
34
+ let payload;
35
+ try {
36
+ payload = verifyComposioWebhook({
37
+ body,
38
+ webhookId,
39
+ webhookTimestamp: c.req.header("webhook-timestamp")?.trim() ?? "",
40
+ signature: c.req.header("webhook-signature")?.trim() ?? "",
41
+ secret
42
+ });
43
+ } catch {
44
+ return c.json({
45
+ ok: false,
46
+ error: "Invalid Composio webhook."
47
+ }, 401);
48
+ }
49
+ try {
50
+ const claim = claimConnectorWebhookDelivery({
51
+ id: webhookId,
52
+ provider: "composio",
53
+ payloadHash: createHash("sha256").update(body).digest("hex")
54
+ });
55
+ if (claim !== "claimed") return c.json({
56
+ ok: true,
57
+ payload: {
58
+ eventId: webhookId,
59
+ duplicate: true,
60
+ status: claim
61
+ }
62
+ });
63
+ const archivedPayload = payload && typeof payload === "object" && !Array.isArray(payload) ? {
64
+ ...payload,
65
+ id: webhookId
66
+ } : {
67
+ id: webhookId,
68
+ data: payload
69
+ };
70
+ const normalized = normalizeComposioTriggerPayload(archivedPayload, webhookId);
71
+ applyComposioConnectionLifecycleEvent(archivedPayload);
72
+ const event = await appendComposioTriggerEvent(service.currentConfig, archivedPayload);
73
+ const runs = await service.automationServiceInstance.triggerEvent({
74
+ type: `connector.${normalized.trigger ?? normalized.type}`,
75
+ source: normalized.toolkit ? `composio:${normalized.toolkit}` : "composio",
76
+ payload: {
77
+ ...normalized.data,
78
+ connectorId: normalized.toolkit ? `composio-${normalized.toolkit}` : "composio",
79
+ webhookId
80
+ }
81
+ });
82
+ completeConnectorWebhookDelivery(webhookId);
83
+ return c.json({
84
+ ok: true,
85
+ payload: {
86
+ eventId: event.id,
87
+ automationRuns: runs.length
88
+ }
89
+ });
90
+ } catch (error) {
91
+ releaseConnectorWebhookDelivery(webhookId, error);
92
+ return c.json({
93
+ ok: false,
94
+ error: "Composio webhook processing failed."
95
+ }, 500);
96
+ }
97
+ });
21
98
  app.get("/api", (c) => {
22
99
  return c.json({
23
100
  service: "xopc-gateway",
@@ -67,6 +144,22 @@ function registerPublicGatewayRoutes(app, service) {
67
144
  if (response) return response;
68
145
  return c.text("Not found", 404);
69
146
  });
147
+ app.get("/connector-icons/composio/:toolkit", async (c) => {
148
+ try {
149
+ return await composioLogoResponse(c.req.param("toolkit"));
150
+ } catch {
151
+ return c.json({
152
+ ok: false,
153
+ error: "Connector logo is unavailable."
154
+ }, 404);
155
+ }
156
+ });
157
+ /** From `web/public/connector-icons/` (Vite copies to static root). Public: img requests send no Bearer token. */
158
+ app.get("/connector-icons/*", (c) => {
159
+ const response = serveStaticFile(`connector-icons/${c.req.path.replace("/connector-icons/", "")}`, c.req.raw);
160
+ if (response) return response;
161
+ return c.text("Not found", 404);
162
+ });
70
163
  app.get("/favicon.ico", (c) => {
71
164
  const response = serveStaticFile("favicon.ico", c.req.raw);
72
165
  if (response) return response;
@@ -1 +1 @@
1
- {"version":3,"file":"public-gateway.js","names":[],"sources":["../../../../../src/gateway/hono/routes/public-gateway.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { PACKAGE_VERSION } from '../../../package-version.js';\nimport type { GatewayService } from '../../service.js';\nimport { serveStaticFile } from '../lib/static-ui.js';\n\nexport function registerPublicGatewayRoutes(app: Hono, service: GatewayService): void {\n app.get('/health', (c) => {\n return c.json(service.getHealth());\n });\n\n /** Public liveness probe (no auth) — minimal payload for CLI / load balancers. */\n app.get('/api/health', (c) => {\n const health = service.getHealth();\n return c.json({\n status: health.ready ? 'ok' : 'starting',\n ready: health.ready,\n httpListening: health.httpListening,\n version: health.version,\n uptime: health.uptime,\n startupDurationMs: health.startupDurationMs,\n });\n });\n\n app.get('/api', (c) => {\n return c.json({\n service: 'xopc-gateway',\n version: PACKAGE_VERSION,\n transport: 'streamable-http',\n endpoints: [\n 'GET /health',\n 'GET /api/health',\n 'GET /status',\n 'GET /api/status',\n 'POST /api/agent (SSE stream / JSON)',\n 'POST /api/agent/abort',\n 'POST /api/agent/steer',\n 'POST /api/send',\n 'GET /api/events (SSE stream)',\n 'GET /api/channels/catalog',\n 'GET /api/channels/status',\n 'POST /api/channels/:channelId/actions/:actionId',\n 'GET /api/config',\n 'GET /api/agents',\n 'POST /api/agents',\n 'PATCH /api/agents/:id',\n 'DELETE /api/agents/:id',\n 'GET/PUT/DELETE /api/agents/:id/avatar',\n 'GET/PUT /api/agents/:id/files/...',\n 'DELETE /api/providers/:providerId/key',\n 'PATCH /api/config',\n 'POST /api/config/reload',\n 'POST /api/heartbeat/trigger',\n '... /api/automations/*',\n '... /api/automation-runs/*',\n 'GET/PATCH /api/sessions/:key/agent-config',\n '... /api/sessions/*',\n 'GET /api/host/fs/meta',\n 'GET /api/host/fs/list',\n ],\n });\n });\n\n app.get('/assets/*', (c) => {\n const path = c.req.path.replace('/assets/', '');\n const response = serveStaticFile(`assets/${path}`, c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n /** From `web/public/channel-icons/` (Vite copies to static root). Public: img requests send no Bearer token. */\n app.get('/channel-icons/*', (c) => {\n const path = c.req.path.replace('/channel-icons/', '');\n const response = serveStaticFile(`channel-icons/${path}`, c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/favicon.ico', (c) => {\n const response = serveStaticFile('favicon.ico', c.req.raw);\n if (response) return response;\n const fallback = serveStaticFile('logo.svg', c.req.raw);\n if (fallback) return fallback;\n return c.text('Not found', 404);\n });\n\n app.get('/logo.svg', (c) => {\n const response = serveStaticFile('logo.svg', c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/logo-dark.svg', (c) => {\n const response = serveStaticFile('logo-dark.svg', c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/', (c) => {\n const response = serveStaticFile('index.html', c.req.raw);\n if (response) return response;\n return c.text('UI not found', 404);\n });\n}\n"],"mappings":";;;sBAE8D;AAI9D,SAAgB,4BAA4B,KAAW,SAA+B;AACpF,KAAI,IAAI,YAAY,MAAM;AACxB,SAAO,EAAE,KAAK,QAAQ,WAAW,CAAC;GAClC;;AAGF,KAAI,IAAI,gBAAgB,MAAM;EAC5B,MAAM,SAAS,QAAQ,WAAW;AAClC,SAAO,EAAE,KAAK;GACZ,QAAQ,OAAO,QAAQ,OAAO;GAC9B,OAAO,OAAO;GACd,eAAe,OAAO;GACtB,SAAS,OAAO;GAChB,QAAQ,OAAO;GACf,mBAAmB,OAAO;GAC3B,CAAC;GACF;AAEF,KAAI,IAAI,SAAS,MAAM;AACrB,SAAO,EAAE,KAAK;GACZ,SAAS;GACT,SAAS;GACT,WAAW;GACX,WAAW;IACT;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACF,CAAC;GACF;AAEF,KAAI,IAAI,cAAc,MAAM;EAE1B,MAAM,WAAW,gBAAgB,UADpB,EAAE,IAAI,KAAK,QAAQ,YAAY,GACG,IAAI,EAAE,IAAI,IAAI;AAC7D,MAAI,SAAU,QAAO;AACrB,SAAO,EAAE,KAAK,aAAa,IAAI;GAC/B;;AAGF,KAAI,IAAI,qBAAqB,MAAM;EAEjC,MAAM,WAAW,gBAAgB,iBADpB,EAAE,IAAI,KAAK,QAAQ,mBAAmB,GACG,IAAI,EAAE,IAAI,IAAI;AACpE,MAAI,SAAU,QAAO;AACrB,SAAO,EAAE,KAAK,aAAa,IAAI;GAC/B;AAEF,KAAI,IAAI,iBAAiB,MAAM;EAC7B,MAAM,WAAW,gBAAgB,eAAe,EAAE,IAAI,IAAI;AAC1D,MAAI,SAAU,QAAO;EACrB,MAAM,WAAW,gBAAgB,YAAY,EAAE,IAAI,IAAI;AACvD,MAAI,SAAU,QAAO;AACrB,SAAO,EAAE,KAAK,aAAa,IAAI;GAC/B;AAEF,KAAI,IAAI,cAAc,MAAM;EAC1B,MAAM,WAAW,gBAAgB,YAAY,EAAE,IAAI,IAAI;AACvD,MAAI,SAAU,QAAO;AACrB,SAAO,EAAE,KAAK,aAAa,IAAI;GAC/B;AAEF,KAAI,IAAI,mBAAmB,MAAM;EAC/B,MAAM,WAAW,gBAAgB,iBAAiB,EAAE,IAAI,IAAI;AAC5D,MAAI,SAAU,QAAO;AACrB,SAAO,EAAE,KAAK,aAAa,IAAI;GAC/B;AAEF,KAAI,IAAI,MAAM,MAAM;EAClB,MAAM,WAAW,gBAAgB,cAAc,EAAE,IAAI,IAAI;AACzD,MAAI,SAAU,QAAO;AACrB,SAAO,EAAE,KAAK,gBAAgB,IAAI;GAClC"}
1
+ {"version":3,"file":"public-gateway.js","names":[],"sources":["../../../../../src/gateway/hono/routes/public-gateway.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nimport type { Hono } from 'hono';\n\nimport { composioLogoResponse } from '../../../connectors/composio-logo.js';\nimport {\n appendComposioTriggerEvent,\n applyComposioConnectionLifecycleEvent,\n normalizeComposioTriggerPayload,\n verifyComposioWebhook,\n} from '../../../connectors/composio-triggers.js';\nimport { PACKAGE_VERSION } from '../../../package-version.js';\nimport {\n claimConnectorWebhookDelivery,\n completeConnectorWebhookDelivery,\n releaseConnectorWebhookDelivery,\n} from '../../../storage/sqlite/index.js';\nimport type { GatewayService } from '../../service.js';\nimport { serveStaticFile } from '../lib/static-ui.js';\n\nexport function registerPublicGatewayRoutes(app: Hono, service: GatewayService): void {\n app.get('/health', (c) => {\n return c.json(service.getHealth());\n });\n\n /** Public liveness probe (no auth) — minimal payload for CLI / load balancers. */\n app.get('/api/health', (c) => {\n const health = service.getHealth();\n return c.json({\n status: health.ready ? 'ok' : 'starting',\n ready: health.ready,\n httpListening: health.httpListening,\n version: health.version,\n uptime: health.uptime,\n startupDurationMs: health.startupDurationMs,\n });\n });\n\n app.post('/api/connectors/composio/webhook', async (c) => {\n const secret = process.env.COMPOSIO_WEBHOOK_SECRET?.trim();\n if (!secret) return c.json({ ok: false, error: 'Composio webhook is not configured.' }, 503);\n const webhookId = c.req.header('webhook-id')?.trim() ?? '';\n const body = await c.req.text();\n let payload: unknown;\n try {\n payload = verifyComposioWebhook({\n body,\n webhookId,\n webhookTimestamp: c.req.header('webhook-timestamp')?.trim() ?? '',\n signature: c.req.header('webhook-signature')?.trim() ?? '',\n secret,\n });\n } catch {\n return c.json({ ok: false, error: 'Invalid Composio webhook.' }, 401);\n }\n try {\n const claim = claimConnectorWebhookDelivery({\n id: webhookId,\n provider: 'composio',\n payloadHash: createHash('sha256').update(body).digest('hex'),\n });\n if (claim !== 'claimed') {\n return c.json({ ok: true, payload: { eventId: webhookId, duplicate: true, status: claim } });\n }\n const archivedPayload = payload && typeof payload === 'object' && !Array.isArray(payload)\n ? { ...payload as Record<string, unknown>, id: webhookId }\n : { id: webhookId, data: payload };\n const normalized = normalizeComposioTriggerPayload(archivedPayload, webhookId);\n applyComposioConnectionLifecycleEvent(archivedPayload);\n const event = await appendComposioTriggerEvent(service.currentConfig, archivedPayload);\n const runs = await service.automationServiceInstance.triggerEvent({\n type: `connector.${normalized.trigger ?? normalized.type}`,\n source: normalized.toolkit ? `composio:${normalized.toolkit}` : 'composio',\n payload: {\n ...normalized.data,\n connectorId: normalized.toolkit ? `composio-${normalized.toolkit}` : 'composio',\n webhookId,\n },\n });\n completeConnectorWebhookDelivery(webhookId);\n return c.json({ ok: true, payload: { eventId: event.id, automationRuns: runs.length } });\n } catch (error) {\n releaseConnectorWebhookDelivery(webhookId, error);\n return c.json({ ok: false, error: 'Composio webhook processing failed.' }, 500);\n }\n });\n\n app.get('/api', (c) => {\n return c.json({\n service: 'xopc-gateway',\n version: PACKAGE_VERSION,\n transport: 'streamable-http',\n endpoints: [\n 'GET /health',\n 'GET /api/health',\n 'GET /status',\n 'GET /api/status',\n 'POST /api/agent (SSE stream / JSON)',\n 'POST /api/agent/abort',\n 'POST /api/agent/steer',\n 'POST /api/send',\n 'GET /api/events (SSE stream)',\n 'GET /api/channels/catalog',\n 'GET /api/channels/status',\n 'POST /api/channels/:channelId/actions/:actionId',\n 'GET /api/config',\n 'GET /api/agents',\n 'POST /api/agents',\n 'PATCH /api/agents/:id',\n 'DELETE /api/agents/:id',\n 'GET/PUT/DELETE /api/agents/:id/avatar',\n 'GET/PUT /api/agents/:id/files/...',\n 'DELETE /api/providers/:providerId/key',\n 'PATCH /api/config',\n 'POST /api/config/reload',\n 'POST /api/heartbeat/trigger',\n '... /api/automations/*',\n '... /api/automation-runs/*',\n 'GET/PATCH /api/sessions/:key/agent-config',\n '... /api/sessions/*',\n 'GET /api/host/fs/meta',\n 'GET /api/host/fs/list',\n ],\n });\n });\n\n app.get('/assets/*', (c) => {\n const path = c.req.path.replace('/assets/', '');\n const response = serveStaticFile(`assets/${path}`, c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n /** From `web/public/channel-icons/` (Vite copies to static root). Public: img requests send no Bearer token. */\n app.get('/channel-icons/*', (c) => {\n const path = c.req.path.replace('/channel-icons/', '');\n const response = serveStaticFile(`channel-icons/${path}`, c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/connector-icons/composio/:toolkit', async (c) => {\n try {\n return await composioLogoResponse(c.req.param('toolkit'));\n } catch {\n return c.json({ ok: false, error: 'Connector logo is unavailable.' }, 404);\n }\n });\n\n /** From `web/public/connector-icons/` (Vite copies to static root). Public: img requests send no Bearer token. */\n app.get('/connector-icons/*', (c) => {\n const path = c.req.path.replace('/connector-icons/', '');\n const response = serveStaticFile(`connector-icons/${path}`, c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/favicon.ico', (c) => {\n const response = serveStaticFile('favicon.ico', c.req.raw);\n if (response) return response;\n const fallback = serveStaticFile('logo.svg', c.req.raw);\n if (fallback) return fallback;\n return c.text('Not found', 404);\n });\n\n app.get('/logo.svg', (c) => {\n const response = serveStaticFile('logo.svg', c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/logo-dark.svg', (c) => {\n const response = serveStaticFile('logo-dark.svg', c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/', (c) => {\n const response = serveStaticFile('index.html', c.req.raw);\n if (response) return response;\n return c.text('UI not found', 404);\n });\n}\n"],"mappings":"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"}
@@ -1,13 +1,14 @@
1
1
  import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
2
- import { createWorkflowCatalog } from "../../../agent/workflow/catalog.js";
3
2
  import { resolveProjectAgentId } from "../../../projects/project-agent.js";
4
3
  import "../../../projects/index.js";
5
- import { messagesToClientHistory } from "../../../session/client-history.js";
6
- import { buildWorkflowDefinition } from "../../../workflows/domain/definition-utils.js";
7
4
  import { validateWorkflowDefinitionInput } from "../../../workflows/domain/validation.js";
5
+ import { WorkflowNameConflictError, WorkflowRevisionConflictError, createWorkflowCatalog } from "../../../agent/workflow/catalog.js";
6
+ import { messagesToClientHistory } from "../../../session/client-history.js";
8
7
  import "../../../workflows/domain/index.js";
9
8
  import { resolveWorkflowRunArtifactsDir } from "../../../workflows/store/paths.js";
10
9
  import { WorkflowDraftService } from "../../../workflows/draft/workflow-draft-service.js";
10
+ import { WorkflowDraftConflictError, WorkflowDraftStore } from "../../../workflows/authoring/workflow-draft-store.js";
11
+ import "../../../workflows/authoring/index.js";
11
12
  import "../../../workflows/draft/index.js";
12
13
  import { basename, join } from "node:path";
13
14
  import { readFile, stat } from "node:fs/promises";
@@ -20,7 +21,7 @@ function registerWorkflowRoutes(authenticated, deps) {
20
21
  const catalog = createWorkflowCatalog();
21
22
  const definitions = catalog.list().map((entry) => {
22
23
  try {
23
- return toWorkflowDefinition(catalog.load(entry.name));
24
+ return catalog.load(entry.name);
24
25
  } catch {
25
26
  return null;
26
27
  }
@@ -31,7 +32,7 @@ function registerWorkflowRoutes(authenticated, deps) {
31
32
  const id = c.req.param("id");
32
33
  const catalog = createWorkflowCatalog();
33
34
  try {
34
- const definition = toWorkflowDefinition(catalog.load(id));
35
+ const definition = catalog.load(id);
35
36
  return c.json({ definition });
36
37
  } catch (err) {
37
38
  return c.json({ error: err instanceof Error ? err.message : "Workflow definition not found" }, 404);
@@ -41,11 +42,11 @@ function registerWorkflowRoutes(authenticated, deps) {
41
42
  const body = await readJsonBody(c.req.raw);
42
43
  const result = validateWorkflowDefinitionInput({
43
44
  name: body.name,
44
- script: body.script
45
+ graph: body.graph
45
46
  });
46
47
  return c.json(result);
47
48
  });
48
- authenticated.post("/api/workflows/definitions/draft", async (c) => {
49
+ authenticated.post("/api/workflows/definitions/generate", async (c) => {
49
50
  const body = await readJsonBody(c.req.raw);
50
51
  const prompt = body.prompt?.trim();
51
52
  if (!prompt) return c.json({ error: "prompt is required" }, 400);
@@ -57,7 +58,7 @@ function registerWorkflowRoutes(authenticated, deps) {
57
58
  agentId,
58
59
  language: body.language,
59
60
  mode: body.mode,
60
- existingScript: body.existingScript,
61
+ existingGraph: body.existingGraph,
61
62
  constraints: body.constraints
62
63
  }, c.req.raw.signal);
63
64
  return c.json({ draft }, 201);
@@ -67,31 +68,146 @@ function registerWorkflowRoutes(authenticated, deps) {
67
68
  });
68
69
  authenticated.post("/api/workflows/definitions", async (c) => {
69
70
  const body = await readJsonBody(c.req.raw);
71
+ if (!Number.isSafeInteger(body.expectedRevision) || body.expectedRevision < 0) return c.json({ error: "expectedRevision is required" }, 400);
70
72
  const validation = validateWorkflowDefinitionInput({
71
73
  name: body.name,
72
- script: body.script
74
+ graph: body.graph
73
75
  });
74
76
  if (!validation.valid) return c.json({
75
77
  error: validation.errors[0]?.message ?? "Invalid workflow definition",
76
78
  validation
77
79
  }, 400);
78
80
  const name = body.name?.trim() ?? "";
79
- const script = body.script ?? "";
80
81
  const catalog = createWorkflowCatalog();
81
82
  try {
82
- catalog.save(name, script);
83
- const definition = toWorkflowDefinition(catalog.load(name));
84
- return c.json({ definition }, 201);
83
+ const { definition } = catalog.save({
84
+ name,
85
+ graph: body.graph,
86
+ manifest: body.manifest,
87
+ expectedRevision: body.expectedRevision,
88
+ intent: body.expectedRevision === 0 ? "create" : "update"
89
+ });
90
+ return c.json({ definition }, body.expectedRevision === 0 ? 201 : 200);
85
91
  } catch (err) {
92
+ if (err instanceof WorkflowNameConflictError) return c.json({
93
+ error: `Workflow name "${err.workflowName}" is already in use.`,
94
+ code: "WORKFLOW_NAME_EXISTS",
95
+ name: err.workflowName,
96
+ currentRevision: err.currentRevision,
97
+ suggestedName: suggestAvailableWorkflowName(err.workflowName, catalog.list().map((entry) => entry.name))
98
+ }, 409);
99
+ if (err instanceof WorkflowRevisionConflictError) return c.json({
100
+ error: err.message,
101
+ code: "WORKFLOW_REVISION_CONFLICT",
102
+ currentRevision: err.currentRevision
103
+ }, 409);
86
104
  return c.json({ error: err instanceof Error ? err.message : "Failed to save workflow" }, 400);
87
105
  }
88
106
  });
107
+ authenticated.put("/api/workflows/definitions/:id", async (c) => {
108
+ const id = c.req.param("id").trim();
109
+ const body = await readJsonBody(c.req.raw);
110
+ if (!Number.isSafeInteger(body.expectedRevision) || body.expectedRevision < 1) return c.json({ error: "expectedRevision is required" }, 400);
111
+ const validation = validateWorkflowDefinitionInput({
112
+ name: id,
113
+ graph: body.graph
114
+ });
115
+ if (!validation.valid) return c.json({
116
+ error: validation.errors[0]?.message ?? "Invalid workflow definition",
117
+ validation
118
+ }, 400);
119
+ const catalog = createWorkflowCatalog();
120
+ try {
121
+ const { definition } = catalog.save({
122
+ name: id,
123
+ graph: body.graph,
124
+ manifest: body.manifest,
125
+ expectedRevision: body.expectedRevision,
126
+ intent: "update"
127
+ });
128
+ return c.json({ definition });
129
+ } catch (err) {
130
+ if (err instanceof WorkflowRevisionConflictError) return c.json({
131
+ error: err.message,
132
+ code: "WORKFLOW_REVISION_CONFLICT",
133
+ currentRevision: err.currentRevision
134
+ }, 409);
135
+ return c.json({ error: err instanceof Error ? err.message : "Failed to save workflow" }, 400);
136
+ }
137
+ });
138
+ authenticated.get("/api/workflows/definitions/:id/revisions", (c) => {
139
+ const id = c.req.param("id");
140
+ try {
141
+ return c.json({ revisions: createWorkflowCatalog().listRevisions(id) });
142
+ } catch (err) {
143
+ return c.json({ error: err instanceof Error ? err.message : "Failed to list workflow revisions" }, 400);
144
+ }
145
+ });
146
+ authenticated.get("/api/workflows/definitions/:id/revisions/:revision", (c) => {
147
+ const id = c.req.param("id");
148
+ const revision = Number.parseInt(c.req.param("revision"), 10);
149
+ try {
150
+ return c.json({ definition: createWorkflowCatalog().loadRevision(id, revision) });
151
+ } catch (err) {
152
+ return c.json({ error: err instanceof Error ? err.message : "Workflow revision not found" }, 404);
153
+ }
154
+ });
155
+ authenticated.post("/api/workflows/definitions/:id/revisions/:revision/restore", async (c) => {
156
+ const id = c.req.param("id");
157
+ const revision = Number.parseInt(c.req.param("revision"), 10);
158
+ const body = await readJsonBody(c.req.raw);
159
+ if (!Number.isSafeInteger(body.expectedRevision)) return c.json({ error: "expectedRevision is required" }, 400);
160
+ try {
161
+ const { definition } = createWorkflowCatalog().restore(id, revision, body.expectedRevision);
162
+ return c.json({ definition }, 201);
163
+ } catch (err) {
164
+ if (err instanceof WorkflowRevisionConflictError) return c.json({
165
+ error: err.message,
166
+ currentRevision: err.currentRevision
167
+ }, 409);
168
+ return c.json({ error: err instanceof Error ? err.message : "Failed to restore workflow revision" }, 400);
169
+ }
170
+ });
171
+ authenticated.get("/api/workflows/drafts", (c) => {
172
+ const workflowName = c.req.query("workflowName")?.trim();
173
+ return c.json({ drafts: new WorkflowDraftStore().list(workflowName) });
174
+ });
175
+ authenticated.get("/api/workflows/drafts/:draftId", (c) => {
176
+ try {
177
+ const draft = new WorkflowDraftStore().get(c.req.param("draftId"));
178
+ return draft ? c.json({ draft }) : c.json({ error: "Workflow draft not found" }, 404);
179
+ } catch (err) {
180
+ return c.json({ error: err instanceof Error ? err.message : "Failed to load workflow draft" }, 400);
181
+ }
182
+ });
183
+ authenticated.post("/api/workflows/drafts", async (c) => {
184
+ const body = await readJsonBody(c.req.raw);
185
+ try {
186
+ const draft = new WorkflowDraftStore().save(body);
187
+ return c.json({ draft }, body.id ? 200 : 201);
188
+ } catch (err) {
189
+ if (err instanceof WorkflowDraftConflictError) return c.json({
190
+ error: err.message,
191
+ currentUpdatedAtMs: err.currentUpdatedAtMs
192
+ }, 409);
193
+ return c.json({ error: err instanceof Error ? err.message : "Failed to save workflow draft" }, 400);
194
+ }
195
+ });
196
+ authenticated.delete("/api/workflows/drafts/:draftId", (c) => {
197
+ try {
198
+ return new WorkflowDraftStore().remove(c.req.param("draftId")) ? c.json({ removed: true }) : c.json({ error: "Workflow draft not found" }, 404);
199
+ } catch (err) {
200
+ return c.json({ error: err instanceof Error ? err.message : "Failed to delete workflow draft" }, 400);
201
+ }
202
+ });
89
203
  authenticated.delete("/api/workflows/definitions/:id", (c) => {
90
204
  const id = c.req.param("id").trim();
91
205
  if (!id) return c.json({ error: "id is required" }, 400);
92
206
  const catalog = createWorkflowCatalog();
93
207
  try {
94
208
  if (!catalog.remove(id)) return c.json({ error: "User workflow not found or cannot delete built-in workflow" }, 404);
209
+ const drafts = new WorkflowDraftStore().list(id);
210
+ for (const draft of drafts) new WorkflowDraftStore().remove(draft.id);
95
211
  return c.json({ removed: true });
96
212
  } catch (err) {
97
213
  return c.json({ error: err instanceof Error ? err.message : "Failed to delete workflow" }, 400);
@@ -332,15 +448,6 @@ function getAgentId(rawAgentId, config) {
332
448
  if (trimmed) return trimmed;
333
449
  return resolveDefaultAgentId(config);
334
450
  }
335
- function toWorkflowDefinition(loaded) {
336
- return buildWorkflowDefinition({
337
- name: loaded.name,
338
- source: loaded.source,
339
- script: loaded.script,
340
- meta: loaded.meta,
341
- manifest: loaded.manifest
342
- });
343
- }
344
451
  function buildWorkflowStats(runs) {
345
452
  const activeStatuses = new Set(["queued", "running"]);
346
453
  const succeededStatuses = new Set(["succeeded"]);
@@ -387,6 +494,14 @@ function normalizePositiveInteger(value) {
387
494
  if (typeof value !== "number" || !Number.isFinite(value) || value < 1) return;
388
495
  return Math.floor(value);
389
496
  }
497
+ function suggestAvailableWorkflowName(name, existingNames) {
498
+ const used = new Set(existingNames);
499
+ for (let suffix = 2; suffix < 1e3; suffix += 1) {
500
+ const candidate = `${name}_${suffix}`;
501
+ if (!used.has(candidate)) return candidate;
502
+ }
503
+ return `${name}_${Date.now()}`;
504
+ }
390
505
  function findWorkflowArtifact(view, artifactId) {
391
506
  return [...view.artifacts ?? [], ...extractResultArtifacts(view.run?.result)].find((artifact) => artifact.id === artifactId) ?? null;
392
507
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workflows.js","names":[],"sources":["../../../../../src/gateway/hono/routes/workflows.ts"],"sourcesContent":["import { readFile, stat } from 'node:fs/promises';\nimport { basename, join } from 'node:path';\n\nimport type { Hono } from 'hono';\n\nimport { resolveDefaultAgentId } from '../../../agent/agent-scope.js';\nimport { createWorkflowCatalog } from '../../../agent/workflow/catalog.js';\nimport { messagesToClientHistory } from '../../../session/client-history.js';\nimport type {\n WorkflowDefinition,\n WorkflowArtifactRef,\n WorkflowRunInputEnvelope,\n WorkflowRunSource,\n WorkflowRunSummary,\n WorkflowRunView,\n} from '../../../workflows/domain/index.js';\nimport { buildWorkflowDefinition, validateWorkflowDefinitionInput } from '../../../workflows/domain/index.js';\nimport { WorkflowDraftService, type CreateWorkflowDraftRequest } from '../../../workflows/draft/index.js';\nimport { resolveWorkflowRunArtifactsDir } from '../../../workflows/store/paths.js';\nimport { resolveProjectAgentId } from '../../../projects/index.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\ninterface StartWorkflowRunRequestBody {\n definitionId?: string;\n input?: unknown;\n inputEnvelope?: WorkflowRunInputEnvelope;\n goal?: string;\n goalId?: string;\n projectId?: string;\n workItemId?: string;\n agentId?: string;\n parentSessionKey?: string;\n source?: WorkflowRunSource;\n concurrency?: number;\n maxSubagents?: number;\n tokenBudget?: number | null;\n idempotencyKey?: string;\n}\n\ninterface ReplayWorkflowRunRequestBody {\n scope?: 'failed_agents' | 'failed_phases';\n}\n\ninterface RetryWorkflowRunRequestBody {\n projectId?: string;\n}\n\ninterface WorkflowRunComparison {\n sourceRunId: string;\n replayRunId: string;\n sourceStatus: WorkflowRunView['run']['status'];\n replayStatus: WorkflowRunView['run']['status'];\n statusChanged: boolean;\n durationDeltaMs: number | null;\n failedAgentsBefore: number;\n failedAgentsAfter: number;\n fixedAgentIds: string[];\n stillFailingAgentIds: string[];\n targetAgents: Array<{\n agentId: string;\n label: string;\n beforeStatus?: string;\n afterStatus?: string;\n beforeError?: string;\n afterError?: string;\n beforePreview?: string;\n afterPreview?: string;\n }>;\n}\n\ninterface SaveWorkflowDefinitionRequestBody {\n name?: string;\n script?: string;\n}\n\ninterface CreateWorkflowDraftRequestBody extends Omit<CreateWorkflowDraftRequest, 'agentId'> {\n agentId?: string;\n}\n\nexport function registerWorkflowRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n const workflowRunService = service.createWorkflowRunService();\n\n authenticated.get('/api/workflows/definitions', (c) => {\n const catalog = createWorkflowCatalog();\n const definitions = catalog.list().map((entry) => {\n try {\n return toWorkflowDefinition(catalog.load(entry.name));\n } catch {\n return null;\n }\n }).filter((definition): definition is WorkflowDefinition => Boolean(definition));\n\n return c.json({ definitions });\n });\n\n authenticated.get('/api/workflows/definitions/:id', (c) => {\n const id = c.req.param('id');\n const catalog = createWorkflowCatalog();\n try {\n const definition = toWorkflowDefinition(catalog.load(id));\n return c.json({ definition });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Workflow definition not found' }, 404);\n }\n });\n\n authenticated.post('/api/workflows/definitions/validate', async (c) => {\n const body = await readJsonBody<SaveWorkflowDefinitionRequestBody>(c.req.raw);\n const result = validateWorkflowDefinitionInput({\n name: body.name,\n script: body.script,\n });\n return c.json(result);\n });\n\n authenticated.post('/api/workflows/definitions/draft', async (c) => {\n const body = await readJsonBody<CreateWorkflowDraftRequestBody>(c.req.raw);\n const prompt = body.prompt?.trim();\n if (!prompt) {\n return c.json({ error: 'prompt is required' }, 400);\n }\n const agentId = getAgentId(body.agentId ?? c.req.query('agentId'), service.currentConfig);\n const draftService = new WorkflowDraftService({ config: service.currentConfig });\n try {\n const draft = await draftService.createDraft({\n prompt,\n agentId,\n language: body.language,\n mode: body.mode,\n existingScript: body.existingScript,\n constraints: body.constraints,\n }, c.req.raw.signal);\n return c.json({ draft }, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to create workflow draft' }, 400);\n }\n });\n\n authenticated.post('/api/workflows/definitions', async (c) => {\n const body = await readJsonBody<SaveWorkflowDefinitionRequestBody>(c.req.raw);\n const validation = validateWorkflowDefinitionInput({\n name: body.name,\n script: body.script,\n });\n if (!validation.valid) {\n return c.json({ error: validation.errors[0]?.message ?? 'Invalid workflow definition', validation }, 400);\n }\n\n const name = body.name?.trim() ?? '';\n const script = body.script ?? '';\n const catalog = createWorkflowCatalog();\n try {\n catalog.save(name, script);\n const definition = toWorkflowDefinition(catalog.load(name));\n return c.json({ definition }, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to save workflow' }, 400);\n }\n });\n\n authenticated.delete('/api/workflows/definitions/:id', (c) => {\n const id = c.req.param('id').trim();\n if (!id) {\n return c.json({ error: 'id is required' }, 400);\n }\n\n const catalog = createWorkflowCatalog();\n try {\n const removed = catalog.remove(id);\n if (!removed) {\n return c.json({ error: 'User workflow not found or cannot delete built-in workflow' }, 404);\n }\n return c.json({ removed: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to delete workflow' }, 400);\n }\n });\n\n authenticated.get('/api/workflows/stats', async (c) => {\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const definitionId = c.req.query('definitionId')?.trim();\n const runStore = workflowRunService.createRunStore(agentId);\n const runs = await runStore.listRunSummaries(500);\n const filteredRuns = definitionId ? runs.filter((run) => run.definitionId === definitionId) : runs;\n return c.json({ stats: buildWorkflowStats(filteredRuns) });\n });\n\n authenticated.post('/api/workflows/runs', async (c) => {\n const body = await readJsonBody<StartWorkflowRunRequestBody>(c.req.raw);\n const definitionId = body.definitionId?.trim();\n if (!definitionId) {\n return c.json({ error: 'definitionId is required' }, 400);\n }\n\n const parentSessionKey = body.parentSessionKey?.trim() || undefined;\n const goalId = body.goalId?.trim();\n const projectId = body.projectId?.trim();\n if (projectId && !service.projects.get(projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const explicitAgentId = body.agentId ?? c.req.query('agentId');\n const agentId = projectId\n ? resolveProjectAgentId({\n config: service.currentConfig,\n projects: service.projects,\n explicitAgentId,\n projectId,\n })\n : getAgentId(explicitAgentId, service.currentConfig);\n const result = await workflowRunService.startWorkflowRun({\n agentId,\n definitionId,\n goalId,\n projectId,\n workItemId: typeof body.workItemId === 'string' ? body.workItemId : undefined,\n input: body.inputEnvelope ? undefined : body.input,\n inputEnvelope: body.inputEnvelope,\n goal: body.goal,\n parentSessionKey,\n source: normalizeWorkflowRunSource(body.source),\n concurrency: normalizePositiveInteger(body.concurrency),\n maxSubagents: normalizePositiveInteger(body.maxSubagents),\n tokenBudget: body.tokenBudget,\n idempotencyKey: body.idempotencyKey,\n });\n\n if (result.ok === false) {\n return c.json({ error: result.message, code: result.code }, result.httpStatus);\n }\n\n return c.json({ runId: result.runId, sessionKey: result.sessionKey }, 202);\n });\n\n authenticated.get('/api/workflows/runs', async (c) => {\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Number.parseInt(rawLimit, 10) : 50;\n const goalId = c.req.query('goalId')?.trim();\n const projectId = c.req.query('projectId')?.trim();\n if (projectId && !service.projects.get(projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const explicitAgentId = c.req.query('agentId');\n const agentId = projectId\n ? resolveProjectAgentId({\n config: service.currentConfig,\n projects: service.projects,\n explicitAgentId,\n projectId,\n })\n : getAgentId(explicitAgentId, service.currentConfig);\n const runStore = workflowRunService.createRunStore(agentId);\n const runs = goalId\n ? await runStore.listRunSummariesForGoal(goalId, Number.isFinite(limit) ? limit : 50)\n : await runStore.listRunSummaries(Number.isFinite(limit) ? limit : 50, { projectId });\n return c.json({ runs });\n });\n\n authenticated.post('/api/workflows/runs/:runId/cancel', async (c) => {\n const runId = c.req.param('runId');\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const result = await workflowRunService.cancelWorkflowRun({\n agentId,\n runId,\n reason: 'Cancelled by user',\n });\n if (result.ok === false) {\n return c.json({ error: result.message, code: result.code }, result.httpStatus);\n }\n return c.json({\n cancelled: result.cancelled,\n alreadyFinished: result.alreadyFinished,\n });\n });\n\n authenticated.get('/api/workflows/runs/:runId/agents/:agentId/session', async (c) => {\n const ownerAgentId = getAgentId(c.req.query('ownerAgentId') ?? c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const workflowAgentId = c.req.param('agentId');\n const runStore = workflowRunService.createRunStore(ownerAgentId);\n const view = await runStore.readRunView(runId);\n if (!view) {\n return c.json({ error: 'Workflow run not found' }, 404);\n }\n const normalizedWorkflowAgentId = workflowAgentId.startsWith('agent-')\n ? workflowAgentId\n : `agent-${workflowAgentId}`;\n const agent = view.agents.find(\n (item) => item.id === workflowAgentId || item.id === normalizedWorkflowAgentId,\n );\n if (!agent) {\n return c.json({ error: 'Workflow agent not found' }, 404);\n }\n const session = await service.sessions.getSession(agent.sessionKey);\n if (!session || session.sessionType !== 'workflow-subagent') {\n return c.json({ error: 'Workflow agent session not found' }, 404);\n }\n return c.json({\n sessionKey: agent.sessionKey,\n metadata: {\n sessionType: session.sessionType,\n workflowRunId: session.workflowRunId,\n workflowAgentId: session.workflowAgentId,\n workflowAgentLabel: session.workflowAgentLabel,\n },\n messages: messagesToClientHistory(session.messages),\n });\n });\n\n authenticated.get('/api/workflows/runs/:runId/comparison', async (c) => {\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const runStore = workflowRunService.createRunStore(agentId);\n const replayView = await runStore.readRunView(runId);\n if (!replayView) {\n return c.json({ error: 'Workflow run not found' }, 404);\n }\n const sourceRunId = c.req.query('sourceRunId')?.trim() || replayView.run.metadata?.replay?.sourceRunId;\n if (!sourceRunId) {\n return c.json({ error: 'Workflow run is not a replay run' }, 409);\n }\n const sourceView = await runStore.readRunView(sourceRunId);\n if (!sourceView) {\n return c.json({ error: 'Source workflow run not found' }, 404);\n }\n return c.json({ comparison: buildWorkflowRunComparison(sourceView, replayView) });\n });\n\n authenticated.get('/api/workflows/runs/:runId', async (c) => {\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const runStore = workflowRunService.createRunStore(agentId);\n const view = await runStore.readRunView(runId);\n if (!view) {\n return c.json({ error: 'Workflow run not found' }, 404);\n }\n return c.json({ view });\n });\n\n authenticated.get('/api/workflows/runs/:runId/artifacts/:artifactId', async (c) => {\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const artifactId = c.req.param('artifactId');\n const runStore = workflowRunService.createRunStore(agentId);\n const view = await runStore.readRunView(runId);\n if (!view) {\n return c.json({ error: 'Workflow run not found' }, 404);\n }\n\n const artifact = findWorkflowArtifact(view, artifactId);\n if (!artifact) {\n return c.json({ error: 'Workflow artifact not found' }, 404);\n }\n\n const artifactPath = join(resolveWorkflowRunArtifactsDir(service.currentConfig, agentId, runId), basename(artifact.name));\n let file: Buffer;\n try {\n const info = await stat(artifactPath);\n if (!info.isFile()) {\n return c.json({ error: 'Workflow artifact not found' }, 404);\n }\n file = await readFile(artifactPath);\n } catch {\n return c.json({ error: 'Workflow artifact not found' }, 404);\n }\n\n return new Response(new Uint8Array(file), {\n headers: {\n 'Content-Type': artifact.mimeType || 'application/octet-stream',\n 'Content-Length': String(file.byteLength),\n 'Content-Disposition': `attachment; filename=\"${encodeHeaderFilename(artifact.name)}\"`,\n },\n });\n });\n\n authenticated.post('/api/workflows/runs/:runId/rebuild', async (c) => {\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const runStore = workflowRunService.createRunStore(agentId);\n const view = await runStore.rebuildRunView(runId);\n if (!view) {\n return c.json({ error: 'Workflow run not found' }, 404);\n }\n service.emit('workflow.run.updated', { runId, view });\n return c.json({ view });\n });\n\n authenticated.post('/api/workflows/runs/:runId/retry', async (c) => {\n const body = await readJsonBody<RetryWorkflowRunRequestBody>(c.req.raw);\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const projectId = body.projectId?.trim();\n if (projectId && !service.projects.get(projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const result = await workflowRunService.retryWorkflowRun({ agentId, runId, projectId });\n if (result.ok === false) {\n return c.json({ error: result.message, code: result.code }, result.httpStatus);\n }\n\n return c.json({ runId: result.runId, sessionKey: result.sessionKey }, 202);\n });\n\n authenticated.post('/api/workflows/runs/:runId/replay', async (c) => {\n const body = await readJsonBody<ReplayWorkflowRunRequestBody>(c.req.raw);\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const scope = body.scope === 'failed_phases' ? 'failed_phases' : 'failed_agents';\n const result = await workflowRunService.replayWorkflowRun({ agentId, runId, scope });\n if (result.ok === false) {\n return c.json({ error: result.message, code: result.code }, result.httpStatus);\n }\n\n return c.json({ runId: result.runId, sessionKey: result.sessionKey }, 202);\n });\n}\n\nfunction buildWorkflowRunComparison(sourceView: WorkflowRunView, replayView: WorkflowRunView): WorkflowRunComparison {\n const targetAgentIds = replayView.run.metadata?.replay?.agentIds ?? replayView.agents.map((agent) => agent.id);\n const sourceAgents = new Map(sourceView.agents.map((agent) => [agent.id, agent]));\n const replayAgents = new Map(replayView.agents.map((agent) => [agent.id, agent]));\n const targetAgents = targetAgentIds.map((agentId) => {\n const before = sourceAgents.get(agentId);\n const after = replayAgents.get(agentId);\n return {\n agentId,\n label: after?.label ?? before?.label ?? agentId,\n beforeStatus: before?.status,\n afterStatus: after?.status,\n beforeError: before?.error,\n afterError: after?.error,\n beforePreview: before?.resultPreview,\n afterPreview: after?.resultPreview,\n };\n });\n const fixedAgentIds = targetAgents\n .filter((agent) => (agent.beforeStatus === 'error' || agent.beforeStatus === 'skipped') && agent.afterStatus === 'done')\n .map((agent) => agent.agentId);\n const stillFailingAgentIds = targetAgents\n .filter((agent) => agent.afterStatus === 'error' || agent.afterStatus === 'skipped')\n .map((agent) => agent.agentId);\n const durationDeltaMs =\n typeof sourceView.run.metrics.durationMs === 'number' && typeof replayView.run.metrics.durationMs === 'number'\n ? replayView.run.metrics.durationMs - sourceView.run.metrics.durationMs\n : null;\n\n return {\n sourceRunId: sourceView.run.id,\n replayRunId: replayView.run.id,\n sourceStatus: sourceView.run.status,\n replayStatus: replayView.run.status,\n statusChanged: sourceView.run.status !== replayView.run.status,\n durationDeltaMs,\n failedAgentsBefore: targetAgents.filter((agent) => agent.beforeStatus === 'error' || agent.beforeStatus === 'skipped').length,\n failedAgentsAfter: stillFailingAgentIds.length,\n fixedAgentIds,\n stillFailingAgentIds,\n targetAgents,\n };\n}\n\nfunction getAgentId(rawAgentId: string | undefined, config: AuthenticatedRouteDeps['service']['currentConfig']): string {\n const trimmed = rawAgentId?.trim();\n if (trimmed) {\n return trimmed;\n }\n return resolveDefaultAgentId(config);\n}\n\nfunction toWorkflowDefinition(loaded: ReturnType<ReturnType<typeof createWorkflowCatalog>['load']>): WorkflowDefinition {\n return buildWorkflowDefinition({\n name: loaded.name,\n source: loaded.source,\n script: loaded.script,\n meta: loaded.meta,\n manifest: loaded.manifest,\n });\n}\n\nfunction buildWorkflowStats(runs: WorkflowRunSummary[]): {\n totalRuns: number;\n activeRuns: number;\n succeededRuns: number;\n failedRuns: number;\n averageDurationMs: number | null;\n topDefinitions: Array<{ definitionId: string; count: number }>;\n} {\n const activeStatuses = new Set(['queued', 'running']);\n const succeededStatuses = new Set(['succeeded']);\n const failedStatuses = new Set(['failed', 'timeout', 'cancelled']);\n\n let durationTotal = 0;\n let durationCount = 0;\n const definitionCounts = new Map<string, number>();\n\n for (const run of runs) {\n definitionCounts.set(run.definitionId, (definitionCounts.get(run.definitionId) ?? 0) + 1);\n if (run.metrics.durationMs != null && Number.isFinite(run.metrics.durationMs)) {\n durationTotal += run.metrics.durationMs;\n durationCount += 1;\n }\n }\n\n const topDefinitions = [...definitionCounts.entries()]\n .sort((left, right) => right[1] - left[1])\n .slice(0, 5)\n .map(([definitionId, count]) => ({ definitionId, count }));\n\n return {\n totalRuns: runs.length,\n activeRuns: runs.filter((run) => activeStatuses.has(run.status)).length,\n succeededRuns: runs.filter((run) => succeededStatuses.has(run.status)).length,\n failedRuns: runs.filter((run) => failedStatuses.has(run.status)).length,\n averageDurationMs: durationCount > 0 ? Math.round(durationTotal / durationCount) : null,\n topDefinitions,\n };\n}\n\nasync function readJsonBody<T>(request: Request): Promise<T> {\n try {\n return await request.json() as T;\n } catch {\n return {} as T;\n }\n}\n\nfunction normalizeWorkflowRunSource(source: WorkflowRunSource | undefined): WorkflowRunSource {\n if (!source) {\n return { kind: 'webui' };\n }\n return source;\n}\n\nfunction normalizePositiveInteger(value: number | undefined): number | undefined {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 1) {\n return undefined;\n }\n return Math.floor(value);\n}\n\nfunction findWorkflowArtifact(\n view: { artifacts?: WorkflowArtifactRef[]; run?: { result?: unknown } },\n artifactId: string,\n): WorkflowArtifactRef | null {\n const all = [...(view.artifacts ?? []), ...extractResultArtifacts(view.run?.result)];\n return all.find((artifact) => artifact.id === artifactId) ?? null;\n}\n\nfunction extractResultArtifacts(result: unknown): WorkflowArtifactRef[] {\n if (!result || typeof result !== 'object' || Array.isArray(result)) {\n return [];\n }\n const maybeArtifacts = (result as { artifacts?: unknown }).artifacts;\n if (!Array.isArray(maybeArtifacts)) {\n return [];\n }\n return maybeArtifacts.filter(isWorkflowArtifactRef);\n}\n\nfunction isWorkflowArtifactRef(value: unknown): value is WorkflowArtifactRef {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const record = value as Partial<WorkflowArtifactRef>;\n return (\n typeof record.id === 'string' &&\n typeof record.name === 'string' &&\n typeof record.mimeType === 'string'\n );\n}\n\nfunction encodeHeaderFilename(value: string): string {\n return basename(value).replace(/[\"\\\\\\r\\n]/g, '_');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"workflows.js","names":[],"sources":["../../../../../src/gateway/hono/routes/workflows.ts"],"sourcesContent":["import { readFile, stat } from 'node:fs/promises';\nimport { basename, join } from 'node:path';\n\nimport type { Hono } from 'hono';\n\nimport { resolveDefaultAgentId } from '../../../agent/agent-scope.js';\nimport {\n createWorkflowCatalog,\n WorkflowNameConflictError,\n WorkflowRevisionConflictError,\n} from '../../../agent/workflow/catalog.js';\nimport { messagesToClientHistory } from '../../../session/client-history.js';\nimport type {\n WorkflowDefinition,\n WorkflowDefinitionManifest,\n WorkflowGraph,\n WorkflowArtifactRef,\n WorkflowRunInputEnvelope,\n WorkflowRunSource,\n WorkflowRunSummary,\n WorkflowRunView,\n} from '../../../workflows/domain/index.js';\nimport { validateWorkflowDefinitionInput } from '../../../workflows/domain/index.js';\nimport { WorkflowDraftService, type CreateWorkflowDraftRequest } from '../../../workflows/draft/index.js';\nimport { WorkflowDraftConflictError, WorkflowDraftStore, type SaveWorkflowAuthoringDraftInput } from '../../../workflows/authoring/index.js';\nimport { resolveWorkflowRunArtifactsDir } from '../../../workflows/store/paths.js';\nimport { resolveProjectAgentId } from '../../../projects/index.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\ninterface StartWorkflowRunRequestBody {\n definitionId?: string;\n input?: unknown;\n inputEnvelope?: WorkflowRunInputEnvelope;\n goal?: string;\n goalId?: string;\n projectId?: string;\n workItemId?: string;\n agentId?: string;\n parentSessionKey?: string;\n source?: WorkflowRunSource;\n concurrency?: number;\n maxSubagents?: number;\n tokenBudget?: number | null;\n idempotencyKey?: string;\n}\n\ninterface ReplayWorkflowRunRequestBody {\n scope?: 'failed_agents' | 'failed_phases';\n}\n\ninterface RetryWorkflowRunRequestBody {\n projectId?: string;\n}\n\ninterface WorkflowRunComparison {\n sourceRunId: string;\n replayRunId: string;\n sourceStatus: WorkflowRunView['run']['status'];\n replayStatus: WorkflowRunView['run']['status'];\n statusChanged: boolean;\n durationDeltaMs: number | null;\n failedAgentsBefore: number;\n failedAgentsAfter: number;\n fixedAgentIds: string[];\n stillFailingAgentIds: string[];\n targetAgents: Array<{\n agentId: string;\n label: string;\n beforeStatus?: string;\n afterStatus?: string;\n beforeError?: string;\n afterError?: string;\n beforePreview?: string;\n afterPreview?: string;\n }>;\n}\n\ninterface SaveWorkflowDefinitionRequestBody {\n name?: string;\n graph?: WorkflowGraph;\n manifest?: WorkflowDefinitionManifest;\n expectedRevision?: number;\n}\n\ninterface CreateWorkflowDraftRequestBody extends Omit<CreateWorkflowDraftRequest, 'agentId'> {\n agentId?: string;\n}\n\ninterface SaveWorkflowAuthoringDraftRequestBody extends Omit<SaveWorkflowAuthoringDraftInput, 'id'> {\n id?: string;\n}\n\ninterface RestoreWorkflowRevisionRequestBody {\n expectedRevision?: number;\n}\n\nexport function registerWorkflowRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n const workflowRunService = service.createWorkflowRunService();\n\n authenticated.get('/api/workflows/definitions', (c) => {\n const catalog = createWorkflowCatalog();\n const definitions = catalog.list().map((entry) => {\n try {\n return catalog.load(entry.name);\n } catch {\n return null;\n }\n }).filter((definition): definition is WorkflowDefinition => Boolean(definition));\n\n return c.json({ definitions });\n });\n\n authenticated.get('/api/workflows/definitions/:id', (c) => {\n const id = c.req.param('id');\n const catalog = createWorkflowCatalog();\n try {\n const definition = catalog.load(id);\n return c.json({ definition });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Workflow definition not found' }, 404);\n }\n });\n\n authenticated.post('/api/workflows/definitions/validate', async (c) => {\n const body = await readJsonBody<SaveWorkflowDefinitionRequestBody>(c.req.raw);\n const result = validateWorkflowDefinitionInput({\n name: body.name,\n graph: body.graph,\n });\n return c.json(result);\n });\n\n authenticated.post('/api/workflows/definitions/generate', async (c) => {\n const body = await readJsonBody<CreateWorkflowDraftRequestBody>(c.req.raw);\n const prompt = body.prompt?.trim();\n if (!prompt) {\n return c.json({ error: 'prompt is required' }, 400);\n }\n const agentId = getAgentId(body.agentId ?? c.req.query('agentId'), service.currentConfig);\n const draftService = new WorkflowDraftService({ config: service.currentConfig });\n try {\n const draft = await draftService.createDraft({\n prompt,\n agentId,\n language: body.language,\n mode: body.mode,\n existingGraph: body.existingGraph,\n constraints: body.constraints,\n }, c.req.raw.signal);\n return c.json({ draft }, 201);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to create workflow draft' }, 400);\n }\n });\n\n authenticated.post('/api/workflows/definitions', async (c) => {\n const body = await readJsonBody<SaveWorkflowDefinitionRequestBody>(c.req.raw);\n if (!Number.isSafeInteger(body.expectedRevision) || body.expectedRevision! < 0) {\n return c.json({ error: 'expectedRevision is required' }, 400);\n }\n const validation = validateWorkflowDefinitionInput({\n name: body.name,\n graph: body.graph,\n });\n if (!validation.valid) {\n return c.json({ error: validation.errors[0]?.message ?? 'Invalid workflow definition', validation }, 400);\n }\n\n const name = body.name?.trim() ?? '';\n const catalog = createWorkflowCatalog();\n try {\n const { definition } = catalog.save({\n name,\n graph: body.graph!,\n manifest: body.manifest,\n expectedRevision: body.expectedRevision,\n // Keep revision > 0 compatible with older clients while new clients use PUT for updates.\n intent: body.expectedRevision === 0 ? 'create' : 'update',\n });\n return c.json({ definition }, body.expectedRevision === 0 ? 201 : 200);\n } catch (err) {\n if (err instanceof WorkflowNameConflictError) {\n return c.json({\n error: `Workflow name \"${err.workflowName}\" is already in use.`,\n code: 'WORKFLOW_NAME_EXISTS',\n name: err.workflowName,\n currentRevision: err.currentRevision,\n suggestedName: suggestAvailableWorkflowName(err.workflowName, catalog.list().map((entry) => entry.name)),\n }, 409);\n }\n if (err instanceof WorkflowRevisionConflictError) {\n return c.json({ error: err.message, code: 'WORKFLOW_REVISION_CONFLICT', currentRevision: err.currentRevision }, 409);\n }\n return c.json({ error: err instanceof Error ? err.message : 'Failed to save workflow' }, 400);\n }\n });\n\n authenticated.put('/api/workflows/definitions/:id', async (c) => {\n const id = c.req.param('id').trim();\n const body = await readJsonBody<SaveWorkflowDefinitionRequestBody>(c.req.raw);\n if (!Number.isSafeInteger(body.expectedRevision) || body.expectedRevision! < 1) {\n return c.json({ error: 'expectedRevision is required' }, 400);\n }\n const validation = validateWorkflowDefinitionInput({ name: id, graph: body.graph });\n if (!validation.valid) {\n return c.json({ error: validation.errors[0]?.message ?? 'Invalid workflow definition', validation }, 400);\n }\n const catalog = createWorkflowCatalog();\n try {\n const { definition } = catalog.save({\n name: id,\n graph: body.graph!,\n manifest: body.manifest,\n expectedRevision: body.expectedRevision,\n intent: 'update',\n });\n return c.json({ definition });\n } catch (err) {\n if (err instanceof WorkflowRevisionConflictError) {\n return c.json({\n error: err.message,\n code: 'WORKFLOW_REVISION_CONFLICT',\n currentRevision: err.currentRevision,\n }, 409);\n }\n return c.json({ error: err instanceof Error ? err.message : 'Failed to save workflow' }, 400);\n }\n });\n\n authenticated.get('/api/workflows/definitions/:id/revisions', (c) => {\n const id = c.req.param('id');\n try {\n return c.json({ revisions: createWorkflowCatalog().listRevisions(id) });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to list workflow revisions' }, 400);\n }\n });\n\n authenticated.get('/api/workflows/definitions/:id/revisions/:revision', (c) => {\n const id = c.req.param('id');\n const revision = Number.parseInt(c.req.param('revision'), 10);\n try {\n return c.json({ definition: createWorkflowCatalog().loadRevision(id, revision) });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Workflow revision not found' }, 404);\n }\n });\n\n authenticated.post('/api/workflows/definitions/:id/revisions/:revision/restore', async (c) => {\n const id = c.req.param('id');\n const revision = Number.parseInt(c.req.param('revision'), 10);\n const body = await readJsonBody<RestoreWorkflowRevisionRequestBody>(c.req.raw);\n if (!Number.isSafeInteger(body.expectedRevision)) return c.json({ error: 'expectedRevision is required' }, 400);\n try {\n const { definition } = createWorkflowCatalog().restore(id, revision, body.expectedRevision!);\n return c.json({ definition }, 201);\n } catch (err) {\n if (err instanceof WorkflowRevisionConflictError) return c.json({ error: err.message, currentRevision: err.currentRevision }, 409);\n return c.json({ error: err instanceof Error ? err.message : 'Failed to restore workflow revision' }, 400);\n }\n });\n\n authenticated.get('/api/workflows/drafts', (c) => {\n const workflowName = c.req.query('workflowName')?.trim();\n return c.json({ drafts: new WorkflowDraftStore().list(workflowName) });\n });\n\n authenticated.get('/api/workflows/drafts/:draftId', (c) => {\n try {\n const draft = new WorkflowDraftStore().get(c.req.param('draftId'));\n return draft ? c.json({ draft }) : c.json({ error: 'Workflow draft not found' }, 404);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to load workflow draft' }, 400);\n }\n });\n\n authenticated.post('/api/workflows/drafts', async (c) => {\n const body = await readJsonBody<SaveWorkflowAuthoringDraftRequestBody>(c.req.raw);\n try {\n const draft = new WorkflowDraftStore().save(body);\n return c.json({ draft }, body.id ? 200 : 201);\n } catch (err) {\n if (err instanceof WorkflowDraftConflictError) return c.json({ error: err.message, currentUpdatedAtMs: err.currentUpdatedAtMs }, 409);\n return c.json({ error: err instanceof Error ? err.message : 'Failed to save workflow draft' }, 400);\n }\n });\n\n authenticated.delete('/api/workflows/drafts/:draftId', (c) => {\n try {\n const removed = new WorkflowDraftStore().remove(c.req.param('draftId'));\n return removed ? c.json({ removed: true }) : c.json({ error: 'Workflow draft not found' }, 404);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to delete workflow draft' }, 400);\n }\n });\n\n authenticated.delete('/api/workflows/definitions/:id', (c) => {\n const id = c.req.param('id').trim();\n if (!id) {\n return c.json({ error: 'id is required' }, 400);\n }\n\n const catalog = createWorkflowCatalog();\n try {\n const removed = catalog.remove(id);\n if (!removed) {\n return c.json({ error: 'User workflow not found or cannot delete built-in workflow' }, 404);\n }\n const drafts = new WorkflowDraftStore().list(id);\n for (const draft of drafts) new WorkflowDraftStore().remove(draft.id);\n return c.json({ removed: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to delete workflow' }, 400);\n }\n });\n\n authenticated.get('/api/workflows/stats', async (c) => {\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const definitionId = c.req.query('definitionId')?.trim();\n const runStore = workflowRunService.createRunStore(agentId);\n const runs = await runStore.listRunSummaries(500);\n const filteredRuns = definitionId ? runs.filter((run) => run.definitionId === definitionId) : runs;\n return c.json({ stats: buildWorkflowStats(filteredRuns) });\n });\n\n authenticated.post('/api/workflows/runs', async (c) => {\n const body = await readJsonBody<StartWorkflowRunRequestBody>(c.req.raw);\n const definitionId = body.definitionId?.trim();\n if (!definitionId) {\n return c.json({ error: 'definitionId is required' }, 400);\n }\n\n const parentSessionKey = body.parentSessionKey?.trim() || undefined;\n const goalId = body.goalId?.trim();\n const projectId = body.projectId?.trim();\n if (projectId && !service.projects.get(projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const explicitAgentId = body.agentId ?? c.req.query('agentId');\n const agentId = projectId\n ? resolveProjectAgentId({\n config: service.currentConfig,\n projects: service.projects,\n explicitAgentId,\n projectId,\n })\n : getAgentId(explicitAgentId, service.currentConfig);\n const result = await workflowRunService.startWorkflowRun({\n agentId,\n definitionId,\n goalId,\n projectId,\n workItemId: typeof body.workItemId === 'string' ? body.workItemId : undefined,\n input: body.inputEnvelope ? undefined : body.input,\n inputEnvelope: body.inputEnvelope,\n goal: body.goal,\n parentSessionKey,\n source: normalizeWorkflowRunSource(body.source),\n concurrency: normalizePositiveInteger(body.concurrency),\n maxSubagents: normalizePositiveInteger(body.maxSubagents),\n tokenBudget: body.tokenBudget,\n idempotencyKey: body.idempotencyKey,\n });\n\n if (result.ok === false) {\n return c.json({ error: result.message, code: result.code }, result.httpStatus);\n }\n\n return c.json({ runId: result.runId, sessionKey: result.sessionKey }, 202);\n });\n\n authenticated.get('/api/workflows/runs', async (c) => {\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Number.parseInt(rawLimit, 10) : 50;\n const goalId = c.req.query('goalId')?.trim();\n const projectId = c.req.query('projectId')?.trim();\n if (projectId && !service.projects.get(projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const explicitAgentId = c.req.query('agentId');\n const agentId = projectId\n ? resolveProjectAgentId({\n config: service.currentConfig,\n projects: service.projects,\n explicitAgentId,\n projectId,\n })\n : getAgentId(explicitAgentId, service.currentConfig);\n const runStore = workflowRunService.createRunStore(agentId);\n const runs = goalId\n ? await runStore.listRunSummariesForGoal(goalId, Number.isFinite(limit) ? limit : 50)\n : await runStore.listRunSummaries(Number.isFinite(limit) ? limit : 50, { projectId });\n return c.json({ runs });\n });\n\n authenticated.post('/api/workflows/runs/:runId/cancel', async (c) => {\n const runId = c.req.param('runId');\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const result = await workflowRunService.cancelWorkflowRun({\n agentId,\n runId,\n reason: 'Cancelled by user',\n });\n if (result.ok === false) {\n return c.json({ error: result.message, code: result.code }, result.httpStatus);\n }\n return c.json({\n cancelled: result.cancelled,\n alreadyFinished: result.alreadyFinished,\n });\n });\n\n authenticated.get('/api/workflows/runs/:runId/agents/:agentId/session', async (c) => {\n const ownerAgentId = getAgentId(c.req.query('ownerAgentId') ?? c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const workflowAgentId = c.req.param('agentId');\n const runStore = workflowRunService.createRunStore(ownerAgentId);\n const view = await runStore.readRunView(runId);\n if (!view) {\n return c.json({ error: 'Workflow run not found' }, 404);\n }\n const normalizedWorkflowAgentId = workflowAgentId.startsWith('agent-')\n ? workflowAgentId\n : `agent-${workflowAgentId}`;\n const agent = view.agents.find(\n (item) => item.id === workflowAgentId || item.id === normalizedWorkflowAgentId,\n );\n if (!agent) {\n return c.json({ error: 'Workflow agent not found' }, 404);\n }\n const session = await service.sessions.getSession(agent.sessionKey);\n if (!session || session.sessionType !== 'workflow-subagent') {\n return c.json({ error: 'Workflow agent session not found' }, 404);\n }\n return c.json({\n sessionKey: agent.sessionKey,\n metadata: {\n sessionType: session.sessionType,\n workflowRunId: session.workflowRunId,\n workflowAgentId: session.workflowAgentId,\n workflowAgentLabel: session.workflowAgentLabel,\n },\n messages: messagesToClientHistory(session.messages),\n });\n });\n\n authenticated.get('/api/workflows/runs/:runId/comparison', async (c) => {\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const runStore = workflowRunService.createRunStore(agentId);\n const replayView = await runStore.readRunView(runId);\n if (!replayView) {\n return c.json({ error: 'Workflow run not found' }, 404);\n }\n const sourceRunId = c.req.query('sourceRunId')?.trim() || replayView.run.metadata?.replay?.sourceRunId;\n if (!sourceRunId) {\n return c.json({ error: 'Workflow run is not a replay run' }, 409);\n }\n const sourceView = await runStore.readRunView(sourceRunId);\n if (!sourceView) {\n return c.json({ error: 'Source workflow run not found' }, 404);\n }\n return c.json({ comparison: buildWorkflowRunComparison(sourceView, replayView) });\n });\n\n authenticated.get('/api/workflows/runs/:runId', async (c) => {\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const runStore = workflowRunService.createRunStore(agentId);\n const view = await runStore.readRunView(runId);\n if (!view) {\n return c.json({ error: 'Workflow run not found' }, 404);\n }\n return c.json({ view });\n });\n\n authenticated.get('/api/workflows/runs/:runId/artifacts/:artifactId', async (c) => {\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const artifactId = c.req.param('artifactId');\n const runStore = workflowRunService.createRunStore(agentId);\n const view = await runStore.readRunView(runId);\n if (!view) {\n return c.json({ error: 'Workflow run not found' }, 404);\n }\n\n const artifact = findWorkflowArtifact(view, artifactId);\n if (!artifact) {\n return c.json({ error: 'Workflow artifact not found' }, 404);\n }\n\n const artifactPath = join(resolveWorkflowRunArtifactsDir(service.currentConfig, agentId, runId), basename(artifact.name));\n let file: Buffer;\n try {\n const info = await stat(artifactPath);\n if (!info.isFile()) {\n return c.json({ error: 'Workflow artifact not found' }, 404);\n }\n file = await readFile(artifactPath);\n } catch {\n return c.json({ error: 'Workflow artifact not found' }, 404);\n }\n\n return new Response(new Uint8Array(file), {\n headers: {\n 'Content-Type': artifact.mimeType || 'application/octet-stream',\n 'Content-Length': String(file.byteLength),\n 'Content-Disposition': `attachment; filename=\"${encodeHeaderFilename(artifact.name)}\"`,\n },\n });\n });\n\n authenticated.post('/api/workflows/runs/:runId/rebuild', async (c) => {\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const runStore = workflowRunService.createRunStore(agentId);\n const view = await runStore.rebuildRunView(runId);\n if (!view) {\n return c.json({ error: 'Workflow run not found' }, 404);\n }\n service.emit('workflow.run.updated', { runId, view });\n return c.json({ view });\n });\n\n authenticated.post('/api/workflows/runs/:runId/retry', async (c) => {\n const body = await readJsonBody<RetryWorkflowRunRequestBody>(c.req.raw);\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const projectId = body.projectId?.trim();\n if (projectId && !service.projects.get(projectId)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n const result = await workflowRunService.retryWorkflowRun({ agentId, runId, projectId });\n if (result.ok === false) {\n return c.json({ error: result.message, code: result.code }, result.httpStatus);\n }\n\n return c.json({ runId: result.runId, sessionKey: result.sessionKey }, 202);\n });\n\n authenticated.post('/api/workflows/runs/:runId/replay', async (c) => {\n const body = await readJsonBody<ReplayWorkflowRunRequestBody>(c.req.raw);\n const agentId = getAgentId(c.req.query('agentId'), service.currentConfig);\n const runId = c.req.param('runId');\n const scope = body.scope === 'failed_phases' ? 'failed_phases' : 'failed_agents';\n const result = await workflowRunService.replayWorkflowRun({ agentId, runId, scope });\n if (result.ok === false) {\n return c.json({ error: result.message, code: result.code }, result.httpStatus);\n }\n\n return c.json({ runId: result.runId, sessionKey: result.sessionKey }, 202);\n });\n}\n\nfunction buildWorkflowRunComparison(sourceView: WorkflowRunView, replayView: WorkflowRunView): WorkflowRunComparison {\n const targetAgentIds = replayView.run.metadata?.replay?.agentIds ?? replayView.agents.map((agent) => agent.id);\n const sourceAgents = new Map(sourceView.agents.map((agent) => [agent.id, agent]));\n const replayAgents = new Map(replayView.agents.map((agent) => [agent.id, agent]));\n const targetAgents = targetAgentIds.map((agentId) => {\n const before = sourceAgents.get(agentId);\n const after = replayAgents.get(agentId);\n return {\n agentId,\n label: after?.label ?? before?.label ?? agentId,\n beforeStatus: before?.status,\n afterStatus: after?.status,\n beforeError: before?.error,\n afterError: after?.error,\n beforePreview: before?.resultPreview,\n afterPreview: after?.resultPreview,\n };\n });\n const fixedAgentIds = targetAgents\n .filter((agent) => (agent.beforeStatus === 'error' || agent.beforeStatus === 'skipped') && agent.afterStatus === 'done')\n .map((agent) => agent.agentId);\n const stillFailingAgentIds = targetAgents\n .filter((agent) => agent.afterStatus === 'error' || agent.afterStatus === 'skipped')\n .map((agent) => agent.agentId);\n const durationDeltaMs =\n typeof sourceView.run.metrics.durationMs === 'number' && typeof replayView.run.metrics.durationMs === 'number'\n ? replayView.run.metrics.durationMs - sourceView.run.metrics.durationMs\n : null;\n\n return {\n sourceRunId: sourceView.run.id,\n replayRunId: replayView.run.id,\n sourceStatus: sourceView.run.status,\n replayStatus: replayView.run.status,\n statusChanged: sourceView.run.status !== replayView.run.status,\n durationDeltaMs,\n failedAgentsBefore: targetAgents.filter((agent) => agent.beforeStatus === 'error' || agent.beforeStatus === 'skipped').length,\n failedAgentsAfter: stillFailingAgentIds.length,\n fixedAgentIds,\n stillFailingAgentIds,\n targetAgents,\n };\n}\n\nfunction getAgentId(rawAgentId: string | undefined, config: AuthenticatedRouteDeps['service']['currentConfig']): string {\n const trimmed = rawAgentId?.trim();\n if (trimmed) {\n return trimmed;\n }\n return resolveDefaultAgentId(config);\n}\n\nfunction buildWorkflowStats(runs: WorkflowRunSummary[]): {\n totalRuns: number;\n activeRuns: number;\n succeededRuns: number;\n failedRuns: number;\n averageDurationMs: number | null;\n topDefinitions: Array<{ definitionId: string; count: number }>;\n} {\n const activeStatuses = new Set(['queued', 'running']);\n const succeededStatuses = new Set(['succeeded']);\n const failedStatuses = new Set(['failed', 'timeout', 'cancelled']);\n\n let durationTotal = 0;\n let durationCount = 0;\n const definitionCounts = new Map<string, number>();\n\n for (const run of runs) {\n definitionCounts.set(run.definitionId, (definitionCounts.get(run.definitionId) ?? 0) + 1);\n if (run.metrics.durationMs != null && Number.isFinite(run.metrics.durationMs)) {\n durationTotal += run.metrics.durationMs;\n durationCount += 1;\n }\n }\n\n const topDefinitions = [...definitionCounts.entries()]\n .sort((left, right) => right[1] - left[1])\n .slice(0, 5)\n .map(([definitionId, count]) => ({ definitionId, count }));\n\n return {\n totalRuns: runs.length,\n activeRuns: runs.filter((run) => activeStatuses.has(run.status)).length,\n succeededRuns: runs.filter((run) => succeededStatuses.has(run.status)).length,\n failedRuns: runs.filter((run) => failedStatuses.has(run.status)).length,\n averageDurationMs: durationCount > 0 ? Math.round(durationTotal / durationCount) : null,\n topDefinitions,\n };\n}\n\nasync function readJsonBody<T>(request: Request): Promise<T> {\n try {\n return await request.json() as T;\n } catch {\n return {} as T;\n }\n}\n\nfunction normalizeWorkflowRunSource(source: WorkflowRunSource | undefined): WorkflowRunSource {\n if (!source) {\n return { kind: 'webui' };\n }\n return source;\n}\n\nfunction normalizePositiveInteger(value: number | undefined): number | undefined {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 1) {\n return undefined;\n }\n return Math.floor(value);\n}\n\nfunction suggestAvailableWorkflowName(name: string, existingNames: string[]): string {\n const used = new Set(existingNames);\n for (let suffix = 2; suffix < 1_000; suffix += 1) {\n const candidate = `${name}_${suffix}`;\n if (!used.has(candidate)) return candidate;\n }\n return `${name}_${Date.now()}`;\n}\n\nfunction findWorkflowArtifact(\n view: { artifacts?: WorkflowArtifactRef[]; run?: { result?: unknown } },\n artifactId: string,\n): WorkflowArtifactRef | null {\n const all = [...(view.artifacts ?? []), ...extractResultArtifacts(view.run?.result)];\n return all.find((artifact) => artifact.id === artifactId) ?? null;\n}\n\nfunction extractResultArtifacts(result: unknown): WorkflowArtifactRef[] {\n if (!result || typeof result !== 'object' || Array.isArray(result)) {\n return [];\n }\n const maybeArtifacts = (result as { artifacts?: unknown }).artifacts;\n if (!Array.isArray(maybeArtifacts)) {\n return [];\n }\n return maybeArtifacts.filter(isWorkflowArtifactRef);\n}\n\nfunction isWorkflowArtifactRef(value: unknown): value is WorkflowArtifactRef {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const record = value as Partial<WorkflowArtifactRef>;\n return (\n typeof record.id === 'string' &&\n typeof record.name === 'string' &&\n typeof record.mimeType === 'string'\n );\n}\n\nfunction encodeHeaderFilename(value: string): string {\n return basename(value).replace(/[\"\\\\\\r\\n]/g, '_');\n}\n"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Hono } from 'hono';
2
+ import type { MemoryRecord } from '../../../agent/memory/types.js';
3
+ import type { AuthenticatedRouteDeps } from './deps.js';
4
+ export declare function buildPersonalPlaybooks(records: MemoryRecord[]): {
5
+ id: "communication" | "execution" | "routines";
6
+ enabled: boolean;
7
+ rules: {
8
+ id: string;
9
+ statement: string;
10
+ origin: import("../../../agent/memory/types.js").MemoryExplicitness;
11
+ }[];
12
+ updatedAt: string;
13
+ }[];
14
+ export declare function buildInsightSuggestions(records: MemoryRecord[]): {
15
+ id: string;
16
+ insight: string;
17
+ kind: import("../../../agent/memory/types.js").MemoryKind;
18
+ action: "make_repeatable" | "start_progress";
19
+ evidenceCount: number;
20
+ confidence: number;
21
+ sourceName: string;
22
+ }[];
23
+ export declare function registerYouRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void;