@xopcai/xopc 0.0.142 → 0.0.144

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 (622) hide show
  1. package/README.md +1 -1
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  4. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  5. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  6. package/dist/extensions/telegram/src/plugin.js +1 -1
  7. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  8. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  9. package/dist/extensions/telegram/xopc.extension.json +1 -1
  10. package/dist/extensions/weixin/src/api/api.js +1 -1
  11. package/dist/extensions/weixin/src/plugin.js +1 -1
  12. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  13. package/dist/gateway/static/root/assets/activity-center-store-jITiX2vJ.js +1 -0
  14. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BawPxiu5.js → agent-avatar-dicebear-EAVnrCAs.js} +1 -1
  15. package/dist/gateway/static/root/assets/agents-5rTuJOtT.js +2 -0
  16. package/dist/gateway/static/root/assets/{app-management-settings-panel-81xd1p9R.js → app-management-settings-panel-Bu568NpC.js} +1 -1
  17. package/dist/gateway/static/root/assets/{appearance-settings-DYeQsYU8.js → appearance-settings-DSkm9bp_.js} +1 -1
  18. package/dist/gateway/static/root/assets/apps-page-DWetalKp.js +1 -0
  19. package/dist/gateway/static/root/assets/{archive-plugin-D_oa7oti.js → archive-plugin-C99N0vV6.js} +1 -1
  20. package/dist/gateway/static/root/assets/{attachment-load-Cd-bwI2N.js → attachment-load-CHTDqME5.js} +1 -1
  21. package/dist/gateway/static/root/assets/automation-suggestion-card-CBt6U3-S.js +1 -0
  22. package/dist/gateway/static/root/assets/automations-page-ICUfxeOz.js +4 -0
  23. package/dist/gateway/static/root/assets/{binary-plugins-O8svLKWw.js → binary-plugins-BRtxOLlM.js} +1 -1
  24. package/dist/gateway/static/root/assets/block-editor-CUlXfgXd.js +184 -0
  25. package/dist/gateway/static/root/assets/browser-settings-page-D7Bj4MKi.js +8 -0
  26. package/dist/gateway/static/root/assets/{capability-presets-api-dJy1Eqgx.js → capability-presets-api-Bg1ntFSD.js} +1 -1
  27. package/dist/gateway/static/root/assets/capability-presets-settings-panel-C-8I-Ktn.js +2 -0
  28. package/dist/gateway/static/root/assets/{channel-recipient-api-Bfuhp2ty.js → channel-recipient-api-DuulnhIj.js} +1 -1
  29. package/dist/gateway/static/root/assets/channels-settings-Dm5EqQyK.js +1 -0
  30. package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +1 -0
  31. package/dist/gateway/static/root/assets/check-BODqo66o.js +1 -0
  32. package/dist/gateway/static/root/assets/chunk-QUQL4437-DXsxWP7r.js +4 -0
  33. package/dist/gateway/static/root/assets/circle-alert-RzVebuX2.js +1 -0
  34. package/dist/gateway/static/root/assets/connectors-page-BOzjh-OK.js +2 -0
  35. package/dist/gateway/static/root/assets/{desktop-pet-DFMfIb5F.js → desktop-pet-C-Drhqyk.js} +1 -1
  36. package/dist/gateway/static/root/assets/desktop-pet-settings-CRGiolqF.js +1 -0
  37. package/dist/gateway/static/root/assets/{directory-picker-path-field-BrYt1gAr.js → directory-picker-path-field-Dw1L3M84.js} +1 -1
  38. package/dist/gateway/static/root/assets/dist-SwiI0Xu3.js +1 -0
  39. package/dist/gateway/static/root/assets/dreaming-settings-CF21cbjo.js +3 -0
  40. package/dist/gateway/static/root/assets/{extension-debug-page-Bh630pLD.js → extension-debug-page-Dcl8LJG_.js} +1 -1
  41. package/dist/gateway/static/root/assets/extension-page-i_BXmO_x.js +1 -0
  42. package/dist/gateway/static/root/assets/extension-settings-page-CWIi7xsn.js +1 -0
  43. package/dist/gateway/static/root/assets/{fetch-B1WtuprY.js → fetch-8QNN25Sh.js} +1 -1
  44. package/dist/gateway/static/root/assets/{gateway-config-api-De2N821l.js → gateway-config-api-2sLP2kkA.js} +1 -1
  45. package/dist/gateway/static/root/assets/gateway-settings-DMHiZc-2.js +1 -0
  46. package/dist/gateway/static/root/assets/{gateway-startup-retry-nEujFSDj.js → gateway-startup-retry-5YBnS9Fj.js} +1 -1
  47. package/dist/gateway/static/root/assets/goal-create-dialog-CAODVDiA.js +1 -0
  48. package/dist/gateway/static/root/assets/goal-detail-page-_d4DjmeX.js +4 -0
  49. package/dist/gateway/static/root/assets/{goals-config-api-DUy3eEse.js → goals-config-api-B4qeLKQS.js} +1 -1
  50. package/dist/gateway/static/root/assets/goals-page-lgsop664.js +2 -0
  51. package/dist/gateway/static/root/assets/goals-settings-Dx_1ZNgb.js +1 -0
  52. package/dist/gateway/static/root/assets/heartbeat-settings-DeTseEk_.js +1 -0
  53. package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
  54. package/dist/gateway/static/root/assets/index-VWvztcst.js +257 -0
  55. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CVIwwM15.js → keyboard-shortcuts-settings-BpwpMmlk.js} +1 -1
  56. package/dist/gateway/static/root/assets/logs-page-9_hbTg3j.js +7 -0
  57. package/dist/gateway/static/root/assets/{markdown-split-B_6us9j7.js → markdown-split-BTRFTK0w.js} +1 -1
  58. package/dist/gateway/static/root/assets/{media-plugins-D_fryIyj.js → media-plugins-BABfIZPU.js} +1 -1
  59. package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
  60. package/dist/gateway/static/root/assets/models-hub-panel-B1CUvZxh.js +2 -0
  61. package/dist/gateway/static/root/assets/notes-page-88QBHW9a.js +1 -0
  62. package/dist/gateway/static/root/assets/notes-workbench-CerZOeLW.js +2 -0
  63. package/dist/gateway/static/root/assets/{page-tabs-D_8jGlqx.js → page-tabs-je95DZOf.js} +1 -1
  64. package/dist/gateway/static/root/assets/{preview-open-alternatives-BBLMK8Mp.js → preview-open-alternatives-BJbwi7Rc.js} +1 -1
  65. package/dist/gateway/static/root/assets/project-detail-page-BmrApldl.js +1 -0
  66. package/dist/gateway/static/root/assets/projects-page-tTn-k76N.js +1 -0
  67. package/dist/gateway/static/root/assets/remote-access-hub-DeA2-pOi.js +1 -0
  68. package/dist/gateway/static/root/assets/{save-bar-controls-DVS3FR5r.js → save-bar-controls-qWMQ9mod.js} +1 -1
  69. package/dist/gateway/static/root/assets/{schedule-field-D6vKd6-T.js → schedule-field-kxd270Gs.js} +1 -1
  70. package/dist/gateway/static/root/assets/{schema-form-BPy4lbIh.js → schema-form-DLnD-MuD.js} +1 -1
  71. package/dist/gateway/static/root/assets/sessions-page-D4kvvcL1.js +1 -0
  72. package/dist/gateway/static/root/assets/settings-advanced-gate-CI1OG4gq.js +1 -0
  73. package/dist/gateway/static/root/assets/{settings-collapsible-section-WzdikxPt.js → settings-collapsible-section-DQprvu5J.js} +1 -1
  74. package/dist/gateway/static/root/assets/{settings-form-section-CvfzhBV-.js → settings-form-section-Cqq7Y98y.js} +1 -1
  75. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BxR-Ulhi.js → settings-loading-skeleton-b6rXULL5.js} +1 -1
  76. package/dist/gateway/static/root/assets/settings-page-BtBVz3cX.js +1 -0
  77. package/dist/gateway/static/root/assets/{settings-page-layout-CKefvbYi.js → settings-page-layout-BNJbtklV.js} +1 -1
  78. package/dist/gateway/static/root/assets/setup-status-panel-cmclUJzS.js +1 -0
  79. package/dist/gateway/static/root/assets/share-preview-page--zO-A1W1.js +2 -0
  80. package/dist/gateway/static/root/assets/shares-settings-DNJvqA67.js +1 -0
  81. package/dist/gateway/static/root/assets/skill-reload-api-DWr_0Xgn.js +1 -0
  82. package/dist/gateway/static/root/assets/skills-page-DEGsTbJx.js +2 -0
  83. package/dist/gateway/static/root/assets/{system-settings-panel-BokgAgf7.js → system-settings-panel-Cq9J7i7v.js} +1 -1
  84. package/dist/gateway/static/root/assets/{typed-models-lib-BwHlNL3L.js → typed-models-lib-CdSwi1gT.js} +1 -1
  85. package/dist/gateway/static/root/assets/{use-channel-catalog-DR11ap3A.js → use-channel-catalog-COXIfXcl.js} +1 -1
  86. package/dist/gateway/static/root/assets/user-context-page-C-V73ZaJ.js +1 -0
  87. package/dist/gateway/static/root/assets/user-profile-fields-editor-B1cxoGkh.js +1 -0
  88. package/dist/gateway/static/root/assets/user-profile-settings-panel-B8hlamVB.js +1 -0
  89. package/dist/gateway/static/root/assets/{utils-BKUWB-TT.js → utils-Dx01V8qF.js} +1 -1
  90. package/dist/gateway/static/root/assets/voice-api-key-field-DGpIUelZ.js +1 -0
  91. package/dist/gateway/static/root/assets/with-selector-aYPsXwdl.js +1 -0
  92. package/dist/gateway/static/root/assets/work-item-detail-page-fzWTxF26.js +1 -0
  93. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CL_rnAUB.js → workflow-run-setup-panel-Dt_x8LGg.js} +2 -2
  94. package/dist/gateway/static/root/assets/workflows-page-Bg02zEUh.js +11 -0
  95. package/dist/gateway/static/root/assets/workflows-page-DLioOiRN.css +1 -0
  96. package/dist/gateway/static/root/connector-icons/README.md +11 -0
  97. package/dist/gateway/static/root/connector-icons/airtable.svg +13 -0
  98. package/dist/gateway/static/root/connector-icons/asana.svg +15 -0
  99. package/dist/gateway/static/root/connector-icons/brave-search.svg +1 -0
  100. package/dist/gateway/static/root/connector-icons/clickup.svg +19 -0
  101. package/dist/gateway/static/root/connector-icons/composio.svg +266 -0
  102. package/dist/gateway/static/root/connector-icons/discord.svg +15 -0
  103. package/dist/gateway/static/root/connector-icons/dropbox.svg +152 -0
  104. package/dist/gateway/static/root/connector-icons/excel.svg +56 -0
  105. package/dist/gateway/static/root/connector-icons/fetch.svg +6 -0
  106. package/dist/gateway/static/root/connector-icons/figma.svg +178 -0
  107. package/dist/gateway/static/root/connector-icons/filesystem.svg +6 -0
  108. package/dist/gateway/static/root/connector-icons/github.svg +10 -0
  109. package/dist/gateway/static/root/connector-icons/gmail.svg +3 -0
  110. package/dist/gateway/static/root/connector-icons/google-calendar.svg +3 -0
  111. package/dist/gateway/static/root/connector-icons/google-docs.svg +25 -0
  112. package/dist/gateway/static/root/connector-icons/google-drive.svg +25 -0
  113. package/dist/gateway/static/root/connector-icons/google-sheets.svg +1 -0
  114. package/dist/gateway/static/root/connector-icons/hubspot.svg +142 -0
  115. package/dist/gateway/static/root/connector-icons/jira.svg +15 -0
  116. package/dist/gateway/static/root/connector-icons/linear.svg +5 -0
  117. package/dist/gateway/static/root/connector-icons/memory.svg +5 -0
  118. package/dist/gateway/static/root/connector-icons/microsoft-teams.svg +33 -0
  119. package/dist/gateway/static/root/connector-icons/notion.svg +5 -0
  120. package/dist/gateway/static/root/connector-icons/one-drive.svg +13 -0
  121. package/dist/gateway/static/root/connector-icons/outlook.svg +76 -0
  122. package/dist/gateway/static/root/connector-icons/playwright.svg +9 -0
  123. package/dist/gateway/static/root/connector-icons/salesforce.svg +17 -0
  124. package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +8 -0
  125. package/dist/gateway/static/root/connector-icons/shopify.svg +5 -0
  126. package/dist/gateway/static/root/connector-icons/slack.svg +9 -0
  127. package/dist/gateway/static/root/connector-icons/spotify.svg +43 -0
  128. package/dist/gateway/static/root/connector-icons/stripe.svg +11 -0
  129. package/dist/gateway/static/root/connector-icons/telegram.svg +130 -0
  130. package/dist/gateway/static/root/connector-icons/time.svg +6 -0
  131. package/dist/gateway/static/root/connector-icons/todoist.svg +277 -0
  132. package/dist/gateway/static/root/connector-icons/trello.svg +19 -0
  133. package/dist/gateway/static/root/connector-icons/twitter.svg +128 -0
  134. package/dist/gateway/static/root/connector-icons/whatsapp.svg +61 -0
  135. package/dist/gateway/static/root/connector-icons/youtube.svg +11 -0
  136. package/dist/gateway/static/root/index.html +10 -7
  137. package/dist/package.js +1 -1
  138. package/dist/src/activity/emitter.js +1 -1
  139. package/dist/src/agent/agent-manager.d.ts +2 -0
  140. package/dist/src/agent/agent-manager.js +12 -4
  141. package/dist/src/agent/agent-manager.js.map +1 -1
  142. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  143. package/dist/src/agent/background-review/prompts.js +3 -2
  144. package/dist/src/agent/background-review/prompts.js.map +1 -1
  145. package/dist/src/agent/code-intelligence/binary.js +1 -1
  146. package/dist/src/agent/context/project-context.js +2 -2
  147. package/dist/src/agent/context/workspace-seed.js +2 -2
  148. package/dist/src/agent/embedded/run-for-session.js +1 -1
  149. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  150. package/dist/src/agent/embedded/xopc-tools-bridge.d.ts +9 -0
  151. package/dist/src/agent/embedded/xopc-tools-bridge.js +71 -3
  152. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
  153. package/dist/src/agent/goals/post-turn.js +7 -6
  154. package/dist/src/agent/goals/post-turn.js.map +1 -1
  155. package/dist/src/agent/ipc/bus.js +1 -1
  156. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  157. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  158. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  159. package/dist/src/agent/mcp/mcp-transport.js +5 -2
  160. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  161. package/dist/src/agent/memory/context/planner.d.ts +1 -0
  162. package/dist/src/agent/memory/context/planner.js +60 -14
  163. package/dist/src/agent/memory/context/planner.js.map +1 -1
  164. package/dist/src/agent/memory/context/types.d.ts +3 -1
  165. package/dist/src/agent/memory/lifecycle.d.ts +11 -0
  166. package/dist/src/agent/memory/lifecycle.js +50 -0
  167. package/dist/src/agent/memory/lifecycle.js.map +1 -0
  168. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  169. package/dist/src/agent/memory/source-origin.d.ts +3 -0
  170. package/dist/src/agent/memory/source-origin.js +19 -0
  171. package/dist/src/agent/memory/source-origin.js.map +1 -0
  172. package/dist/src/agent/memory/understanding/service.js +5 -0
  173. package/dist/src/agent/memory/understanding/service.js.map +1 -1
  174. package/dist/src/agent/memory/user-context-coordinator.js +7 -2
  175. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
  176. package/dist/src/agent/models/manager.js +1 -1
  177. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
  178. package/dist/src/agent/prompt/sections/behavior.d.ts +2 -0
  179. package/dist/src/agent/prompt/sections/behavior.js +30 -1
  180. package/dist/src/agent/prompt/sections/behavior.js.map +1 -1
  181. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  182. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  183. package/dist/src/agent/prompt/service-prompt-builder.js +8 -1
  184. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  185. package/dist/src/agent/prompt/system-prompt.d.ts +2 -0
  186. package/dist/src/agent/prompt/system-prompt.js +6 -3
  187. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  188. package/dist/src/agent/service/process-direct-streaming.js +22 -0
  189. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  190. package/dist/src/agent/service.d.ts +2 -0
  191. package/dist/src/agent/service.js +12 -6
  192. package/dist/src/agent/service.js.map +1 -1
  193. package/dist/src/agent/session/session-inspector.js +2 -2
  194. package/dist/src/agent/skills/hub-pull.js +1 -1
  195. package/dist/src/agent/starter-agents.js +1 -1
  196. package/dist/src/agent/starter-agents.js.map +1 -1
  197. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
  198. package/dist/src/agent/tool-manuals/xopc-use.js +1 -1
  199. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -1
  200. package/dist/src/agent/tools/composio-tool.d.ts +18 -5
  201. package/dist/src/agent/tools/composio-tool.js +252 -35
  202. package/dist/src/agent/tools/composio-tool.js.map +1 -1
  203. package/dist/src/agent/tools/factory.js +7 -3
  204. package/dist/src/agent/tools/factory.js.map +1 -1
  205. package/dist/src/agent/tools/goal-tool.js +2 -2
  206. package/dist/src/agent/tools/index.d.ts +1 -1
  207. package/dist/src/agent/tools/index.js +2 -2
  208. package/dist/src/agent/tools/workflow-tool.d.ts +0 -1
  209. package/dist/src/agent/tools/workflow-tool.js +4 -17
  210. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  211. package/dist/src/agent/tools/xopc-use-tool.js +1 -1
  212. package/dist/src/agent/workflow/builtins/index.d.ts +2 -28
  213. package/dist/src/agent/workflow/builtins/index.js +226 -41
  214. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  215. package/dist/src/agent/workflow/catalog.d.ts +32 -34
  216. package/dist/src/agent/workflow/catalog.js +158 -154
  217. package/dist/src/agent/workflow/catalog.js.map +1 -1
  218. package/dist/src/agent/workflow/index.d.ts +4 -6
  219. package/dist/src/agent/workflow/index.js +2 -5
  220. package/dist/src/agent/workflow/snapshot.d.ts +2 -2
  221. package/dist/src/agent/workflow/snapshot.js +2 -2
  222. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  223. package/dist/src/agent/workflow/structured-output-tool.d.ts +2 -2
  224. package/dist/src/agent/workflow/structured-output-tool.js +2 -2
  225. package/dist/src/agent/workflow/structured-output-tool.js.map +1 -1
  226. package/dist/src/agent/workflow/subagent-runner.js +1 -1
  227. package/dist/src/agent/workflow/types.d.ts +31 -26
  228. package/dist/src/agent/workspace-runtime/registry.js +2 -2
  229. package/dist/src/agent-manifest/index.d.ts +1 -0
  230. package/dist/src/agent-manifest/index.js +3 -1
  231. package/dist/src/agent-manifest/index.js.map +1 -1
  232. package/dist/src/agent-manifest/preset-chain.d.ts +10 -0
  233. package/dist/src/agent-manifest/preset-chain.js +32 -0
  234. package/dist/src/agent-manifest/preset-chain.js.map +1 -0
  235. package/dist/src/agent-manifest/resolver.js +3 -10
  236. package/dist/src/agent-manifest/resolver.js.map +1 -1
  237. package/dist/src/agent-manifest/schema.d.ts +4 -4
  238. package/dist/src/automations/api/routes.js +14 -2
  239. package/dist/src/automations/api/routes.js.map +1 -1
  240. package/dist/src/automations/domain/validation.d.ts +14 -14
  241. package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
  242. package/dist/src/automations/service/action-executor.js +2 -2
  243. package/dist/src/browser/cdp-local-launcher.js +1 -1
  244. package/dist/src/browser/providers/browser-ext-install.d.ts +11 -1
  245. package/dist/src/browser/providers/browser-ext-install.js +42 -17
  246. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  247. package/dist/src/browser/providers/cloakbrowser.js +2 -2
  248. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  249. package/dist/src/browser/stealth.js +1 -1
  250. package/dist/src/capabilities/store-connector.d.ts +0 -1
  251. package/dist/src/capabilities/store-connector.js +4 -6
  252. package/dist/src/capabilities/store-connector.js.map +1 -1
  253. package/dist/src/chat-commands/agent-edit.js +1 -1
  254. package/dist/src/chat-commands/builtins/config.js +1 -1
  255. package/dist/src/chat-commands/builtins/goal.js +2 -2
  256. package/dist/src/chat-commands/builtins/review.js +72 -73
  257. package/dist/src/chat-commands/builtins/review.js.map +1 -1
  258. package/dist/src/chat-commands/builtins/workflow.js +9 -54
  259. package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
  260. package/dist/src/chat-commands/context.js +1 -1
  261. package/dist/src/cli/commands/agent.js +1 -1
  262. package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
  263. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  264. package/dist/src/cli/commands/extension-create.js +2 -2
  265. package/dist/src/cli/commands/extension-create.js.map +1 -1
  266. package/dist/src/cli/commands/extension-marketplace.js +43 -37
  267. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  268. package/dist/src/cli/commands/extension-pack.d.ts +6 -0
  269. package/dist/src/cli/commands/extension-pack.js +4 -3
  270. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  271. package/dist/src/cli/commands/goal.js +2 -2
  272. package/dist/src/cli/commands/init.js +1 -1
  273. package/dist/src/cli/commands/project.js +3 -3
  274. package/dist/src/commands/agents.config.d.ts +1 -0
  275. package/dist/src/commands/agents.config.js +1 -0
  276. package/dist/src/commands/agents.config.js.map +1 -1
  277. package/dist/src/config/gateway-bind.js +1 -1
  278. package/dist/src/config/index.js +1 -1
  279. package/dist/src/config/loader.js +1 -1
  280. package/dist/src/config/models-json.js +1 -1
  281. package/dist/src/config/schema.d.ts +6 -6
  282. package/dist/src/config/schema.js +6 -22
  283. package/dist/src/config/schema.js.map +1 -1
  284. package/dist/src/config/web-patch.d.ts +1 -1
  285. package/dist/src/connectors/approval.d.ts +2 -0
  286. package/dist/src/connectors/approval.js +33 -0
  287. package/dist/src/connectors/approval.js.map +1 -0
  288. package/dist/src/connectors/auth-provider-registry.d.ts +9 -0
  289. package/dist/src/connectors/auth-provider-registry.js +17 -0
  290. package/dist/src/connectors/auth-provider-registry.js.map +1 -0
  291. package/dist/src/connectors/builtin-catalog.js +55 -116
  292. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  293. package/dist/src/connectors/catalog.js +7 -2
  294. package/dist/src/connectors/catalog.js.map +1 -1
  295. package/dist/src/connectors/composio-catalog.d.ts +19 -0
  296. package/dist/src/connectors/composio-catalog.js +237 -0
  297. package/dist/src/connectors/composio-catalog.js.map +1 -0
  298. package/dist/src/connectors/composio-logo.d.ts +1 -0
  299. package/dist/src/connectors/composio-logo.js +51 -0
  300. package/dist/src/connectors/composio-logo.js.map +1 -0
  301. package/dist/src/connectors/composio-sessions.d.ts +116 -0
  302. package/dist/src/connectors/composio-sessions.js +296 -0
  303. package/dist/src/connectors/composio-sessions.js.map +1 -0
  304. package/dist/src/connectors/composio-triggers.d.ts +17 -0
  305. package/dist/src/connectors/composio-triggers.js +48 -5
  306. package/dist/src/connectors/composio-triggers.js.map +1 -1
  307. package/dist/src/connectors/composio.d.ts +31 -2
  308. package/dist/src/connectors/composio.js +374 -151
  309. package/dist/src/connectors/composio.js.map +1 -1
  310. package/dist/src/connectors/connector-memory-sync.d.ts +15 -0
  311. package/dist/src/connectors/connector-memory-sync.js +90 -0
  312. package/dist/src/connectors/connector-memory-sync.js.map +1 -0
  313. package/dist/src/connectors/install.js +35 -92
  314. package/dist/src/connectors/install.js.map +1 -1
  315. package/dist/src/connectors/instances.js +6 -2
  316. package/dist/src/connectors/instances.js.map +1 -1
  317. package/dist/src/connectors/integration-strategy.d.ts +3 -0
  318. package/dist/src/connectors/integration-strategy.js +29 -0
  319. package/dist/src/connectors/integration-strategy.js.map +1 -0
  320. package/dist/src/connectors/policy.d.ts +13 -0
  321. package/dist/src/connectors/policy.js +48 -0
  322. package/dist/src/connectors/policy.js.map +1 -0
  323. package/dist/src/connectors/providers.js +1 -1
  324. package/dist/src/connectors/runtime-adapter-registry.d.ts +25 -0
  325. package/dist/src/connectors/runtime-adapter-registry.js +154 -0
  326. package/dist/src/connectors/runtime-adapter-registry.js.map +1 -0
  327. package/dist/src/connectors/types.d.ts +113 -4
  328. package/dist/src/connectors/workflow-preflight.d.ts +20 -0
  329. package/dist/src/connectors/workflow-preflight.js +70 -0
  330. package/dist/src/connectors/workflow-preflight.js.map +1 -0
  331. package/dist/src/daemon/launchd.js +1 -1
  332. package/dist/src/daemon/systemd.js +1 -1
  333. package/dist/src/extensions/discover-extensions.js +1 -1
  334. package/dist/src/extensions/install-transaction.d.ts +16 -0
  335. package/dist/src/extensions/install-transaction.js +76 -0
  336. package/dist/src/extensions/install-transaction.js.map +1 -0
  337. package/dist/src/extensions/install.d.ts +2 -0
  338. package/dist/src/extensions/install.js +23 -1
  339. package/dist/src/extensions/install.js.map +1 -1
  340. package/dist/src/extensions/loader.js +2 -2
  341. package/dist/src/gateway/agents-admin.d.ts +2 -0
  342. package/dist/src/gateway/agents-admin.js +7 -0
  343. package/dist/src/gateway/agents-admin.js.map +1 -1
  344. package/dist/src/gateway/capability-presets-admin.d.ts +11 -0
  345. package/dist/src/gateway/capability-presets-admin.js +11 -4
  346. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  347. package/dist/src/gateway/chat-stream/mapper.js +17 -0
  348. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  349. package/dist/src/gateway/chat-stream/protocol.d.ts +18 -1
  350. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -3
  351. package/dist/src/gateway/hono/lib/static-ui.js +1 -1
  352. package/dist/src/gateway/hono/routes/agents.js +3 -0
  353. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  354. package/dist/src/gateway/hono/routes/capability-presets.js +19 -1
  355. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
  356. package/dist/src/gateway/hono/routes/connectors.js +188 -25
  357. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  358. package/dist/src/gateway/hono/routes/goals.js +22 -3
  359. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  360. package/dist/src/gateway/hono/routes/home.d.ts +60 -1
  361. package/dist/src/gateway/hono/routes/home.js +244 -18
  362. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  363. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  364. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  365. package/dist/src/gateway/hono/routes/memory.js +17 -4
  366. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  367. package/dist/src/gateway/hono/routes/projects.js +106 -5
  368. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  369. package/dist/src/gateway/hono/routes/public-gateway.js +93 -0
  370. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  371. package/dist/src/gateway/hono/routes/workflows.js +137 -22
  372. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  373. package/dist/src/gateway/hono/routes/you.d.ts +23 -0
  374. package/dist/src/gateway/hono/routes/you.js +538 -0
  375. package/dist/src/gateway/hono/routes/you.js.map +1 -0
  376. package/dist/src/gateway/hono/sse.d.ts +2 -1
  377. package/dist/src/gateway/hono/sse.js +2 -1
  378. package/dist/src/gateway/hono/sse.js.map +1 -1
  379. package/dist/src/gateway/lock.js +1 -1
  380. package/dist/src/gateway/ports.js +1 -1
  381. package/dist/src/gateway/service/marketplace-service.d.ts +13 -1
  382. package/dist/src/gateway/service/marketplace-service.js +96 -40
  383. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  384. package/dist/src/gateway/service.d.ts +2 -0
  385. package/dist/src/gateway/service.js +13 -7
  386. package/dist/src/gateway/service.js.map +1 -1
  387. package/dist/src/goals/goal-service.d.ts +7 -5
  388. package/dist/src/goals/goal-service.js +25 -13
  389. package/dist/src/goals/goal-service.js.map +1 -1
  390. package/dist/src/goals/goal-store.js +46 -7
  391. package/dist/src/goals/goal-store.js.map +1 -1
  392. package/dist/src/goals/goal-workflow-judge.js +1 -1
  393. package/dist/src/goals/types.d.ts +24 -0
  394. package/dist/src/infra/ports.js +1 -1
  395. package/dist/src/infra/ssh-tunnel.js +1 -1
  396. package/dist/src/infra/update-check.js +1 -1
  397. package/dist/src/migrations/runner.js +1 -1
  398. package/dist/src/notes/service.js +3 -3
  399. package/dist/src/notes/store.js +1 -1
  400. package/dist/src/projects/project-service.js +1 -1
  401. package/dist/src/projects/workspace.js +1 -1
  402. package/dist/src/routing/agent-session-key.js +1 -1
  403. package/dist/src/routing/resolve-route.js +1 -1
  404. package/dist/src/routing/resolve-tui-session-key.js +1 -1
  405. package/dist/src/session/init-session-turn.js +1 -1
  406. package/dist/src/session/resolve-session.js +1 -1
  407. package/dist/src/session/session-title.js +2 -2
  408. package/dist/src/session/store.js +1 -1
  409. package/dist/src/storage/sqlite/connection.js +1 -1
  410. package/dist/src/storage/sqlite/connector-repository.d.ts +49 -0
  411. package/dist/src/storage/sqlite/connector-repository.js +385 -0
  412. package/dist/src/storage/sqlite/connector-repository.js.map +1 -0
  413. package/dist/src/storage/sqlite/index.d.ts +3 -0
  414. package/dist/src/storage/sqlite/index.js +4 -1
  415. package/dist/src/storage/sqlite/migrations/030_connectors.sql +94 -0
  416. package/dist/src/storage/sqlite/migrations/031_connector_approvals.sql +24 -0
  417. package/dist/src/storage/sqlite/migrations/032_connector_webhook_deliveries.sql +15 -0
  418. package/dist/src/storage/sqlite/migrations/033_user_trust_policies.sql +6 -0
  419. package/dist/src/storage/sqlite/migrations/034_allow_global_auto_trust.sql +14 -0
  420. package/dist/src/storage/sqlite/migrations/035_user_profile_prompt_state.sql +7 -0
  421. package/dist/src/storage/sqlite/migrations/036_goal_outcome_metric.sql +12 -0
  422. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  423. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  424. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  425. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  426. package/dist/src/storage/sqlite/row-mappers.js +1 -1
  427. package/dist/src/storage/sqlite/schema.js +1 -1
  428. package/dist/src/storage/sqlite/user-profile-setup-repository.d.ts +3 -0
  429. package/dist/src/storage/sqlite/user-profile-setup-repository.js +34 -0
  430. package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +1 -0
  431. package/dist/src/storage/sqlite/user-trust-repository.d.ts +3 -0
  432. package/dist/src/storage/sqlite/user-trust-repository.js +34 -0
  433. package/dist/src/storage/sqlite/user-trust-repository.js.map +1 -0
  434. package/dist/src/tui/backends/embedded-backend.js +4 -4
  435. package/dist/src/tui/clipboard-image.js +1 -1
  436. package/dist/src/tui/components/assistant-message.js +15 -0
  437. package/dist/src/tui/components/assistant-message.js.map +1 -1
  438. package/dist/src/tui/tui-agent-events.js +85 -1
  439. package/dist/src/tui/tui-agent-events.js.map +1 -1
  440. package/dist/src/tui/tui-command-formatters.js +9 -9
  441. package/dist/src/tui/tui-command-formatters.js.map +1 -1
  442. package/dist/src/tui/tui-commands.js +4 -4
  443. package/dist/src/tui/tui-startup-resources.js +1 -1
  444. package/dist/src/tui/tui.js +1 -1
  445. package/dist/src/user-context/import.d.ts +12 -0
  446. package/dist/src/user-context/import.js +48 -0
  447. package/dist/src/user-context/import.js.map +1 -0
  448. package/dist/src/user-context/profile.d.ts +37 -0
  449. package/dist/src/user-context/profile.js +165 -0
  450. package/dist/src/user-context/profile.js.map +1 -0
  451. package/dist/src/user-context/projection.d.ts +54 -0
  452. package/dist/src/user-context/projection.js +121 -0
  453. package/dist/src/user-context/projection.js.map +1 -0
  454. package/dist/src/user-context/source-recommendations.d.ts +13 -0
  455. package/dist/src/user-context/source-recommendations.js +86 -0
  456. package/dist/src/user-context/source-recommendations.js.map +1 -0
  457. package/dist/src/user-context/trust-policy.d.ts +11 -0
  458. package/dist/src/user-context/trust-policy.js +31 -0
  459. package/dist/src/user-context/trust-policy.js.map +1 -0
  460. package/dist/src/utils/index.js +1 -1
  461. package/dist/src/utils/logger/index.js +1 -1
  462. package/dist/src/utils/logger.js +1 -1
  463. package/dist/src/work-items/work-item-service.js +1 -1
  464. package/dist/src/workflows/authoring/index.d.ts +1 -0
  465. package/dist/src/workflows/authoring/index.js +2 -0
  466. package/dist/src/workflows/authoring/workflow-draft-store.d.ts +33 -0
  467. package/dist/src/workflows/authoring/workflow-draft-store.js +74 -0
  468. package/dist/src/workflows/authoring/workflow-draft-store.js.map +1 -0
  469. package/dist/src/workflows/domain/definition-utils.d.ts +6 -4
  470. package/dist/src/workflows/domain/definition-utils.js +28 -26
  471. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  472. package/dist/src/workflows/domain/definition.d.ts +79 -6
  473. package/dist/src/workflows/domain/event.d.ts +18 -2
  474. package/dist/src/workflows/domain/index.js +3 -3
  475. package/dist/src/workflows/domain/run.d.ts +16 -2
  476. package/dist/src/workflows/domain/run.js.map +1 -1
  477. package/dist/src/workflows/domain/validation.d.ts +9 -5
  478. package/dist/src/workflows/domain/validation.js +183 -40
  479. package/dist/src/workflows/domain/validation.js.map +1 -1
  480. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +2 -3
  481. package/dist/src/workflows/draft/workflow-draft-prompt.js +31 -73
  482. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -1
  483. package/dist/src/workflows/draft/workflow-draft-service.js +5 -9
  484. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -1
  485. package/dist/src/workflows/draft/workflow-draft-validator.js +29 -37
  486. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -1
  487. package/dist/src/workflows/draft/workflow-draft.types.d.ts +4 -4
  488. package/dist/src/workflows/engine/projector.js +43 -1
  489. package/dist/src/workflows/engine/projector.js.map +1 -1
  490. package/dist/src/workflows/engine/workflow-engine.d.ts +2 -3
  491. package/dist/src/workflows/engine/workflow-engine.js +24 -4
  492. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  493. package/dist/src/workflows/index.js +4 -7
  494. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +1 -9
  495. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -1
  496. package/dist/src/workflows/runtime/graph-workflow-runtime.d.ts +10 -0
  497. package/dist/src/workflows/runtime/graph-workflow-runtime.js +295 -0
  498. package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +1 -0
  499. package/dist/src/workflows/runtime/index.d.ts +1 -2
  500. package/dist/src/workflows/runtime/index.js +2 -5
  501. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +5 -8
  502. package/dist/src/workflows/service/workflow-run-service.js +15 -1
  503. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  504. package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -1
  505. package/dist/src/workflows/service/workflow-session-bridge.js +3 -3
  506. package/package.json +5 -4
  507. package/dist/gateway/static/root/assets/agents-CyvCIHnB.js +0 -2
  508. package/dist/gateway/static/root/assets/apps-page-DK_Vx6nl.js +0 -1
  509. package/dist/gateway/static/root/assets/automation-suggestion-card-B1LV3YYv.js +0 -1
  510. package/dist/gateway/static/root/assets/automations-page-fzrovqhv.js +0 -4
  511. package/dist/gateway/static/root/assets/block-editor-Dhj5f4Bx.js +0 -184
  512. package/dist/gateway/static/root/assets/browser-settings-page-BDn-n-UB.js +0 -8
  513. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Co5ipo_Q.js +0 -1
  514. package/dist/gateway/static/root/assets/channels-settings-BWlpaxg9.js +0 -1
  515. package/dist/gateway/static/root/assets/channels-status-swr-D_jkIZLV.js +0 -1
  516. package/dist/gateway/static/root/assets/connectors-page-BcekbW4q.js +0 -2
  517. package/dist/gateway/static/root/assets/desktop-pet-settings-BJCUuL8Y.js +0 -1
  518. package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +0 -1
  519. package/dist/gateway/static/root/assets/dreaming-settings-BN1Z2mIo.js +0 -3
  520. package/dist/gateway/static/root/assets/extension-page-B-1KxvVy.js +0 -1
  521. package/dist/gateway/static/root/assets/extension-settings-page-BF9NACI3.js +0 -1
  522. package/dist/gateway/static/root/assets/gateway-settings-DN9sNREz.js +0 -1
  523. package/dist/gateway/static/root/assets/goal-create-dialog-BpoQW8cD.js +0 -1
  524. package/dist/gateway/static/root/assets/goal-detail-page-CBRSPd0b.js +0 -4
  525. package/dist/gateway/static/root/assets/goals-page-BCcBi407.js +0 -2
  526. package/dist/gateway/static/root/assets/goals-settings-pkTXzXkh.js +0 -1
  527. package/dist/gateway/static/root/assets/heartbeat-settings-ezsufgLQ.js +0 -1
  528. package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +0 -1
  529. package/dist/gateway/static/root/assets/index-DcUaXYeb.js +0 -262
  530. package/dist/gateway/static/root/assets/logs-page-DQtTRXtj.js +0 -7
  531. package/dist/gateway/static/root/assets/messages-BXNELNBa.js +0 -3
  532. package/dist/gateway/static/root/assets/models-hub-panel-BP2M9n6Q.js +0 -2
  533. package/dist/gateway/static/root/assets/notes-page-CspveYaO.js +0 -1
  534. package/dist/gateway/static/root/assets/notes-workbench-BHwzJ0OC.js +0 -2
  535. package/dist/gateway/static/root/assets/project-detail-page-Dy3rsobs.js +0 -1
  536. package/dist/gateway/static/root/assets/projects-page-CWKpPE0L.js +0 -1
  537. package/dist/gateway/static/root/assets/remote-access-hub-CqNRyXEo.js +0 -1
  538. package/dist/gateway/static/root/assets/sessions-page-MEME7ivF.js +0 -1
  539. package/dist/gateway/static/root/assets/settings-advanced-gate-JVd0qaSF.js +0 -1
  540. package/dist/gateway/static/root/assets/settings-page-DYEbB1EV.js +0 -1
  541. package/dist/gateway/static/root/assets/setup-status-panel-dWN8BJ3z.js +0 -1
  542. package/dist/gateway/static/root/assets/share-preview-page-D8foINzP.js +0 -2
  543. package/dist/gateway/static/root/assets/shares-settings-Tgbv1s7G.js +0 -1
  544. package/dist/gateway/static/root/assets/skill-reload-api-D_YK0b_Z.js +0 -1
  545. package/dist/gateway/static/root/assets/skills-page-DGytfoZK.js +0 -2
  546. package/dist/gateway/static/root/assets/toast-z0toXu32.js +0 -1
  547. package/dist/gateway/static/root/assets/user-profile-settings-panel-8YtygcJp.js +0 -1
  548. package/dist/gateway/static/root/assets/voice-api-key-field-BVH71EFf.js +0 -1
  549. package/dist/gateway/static/root/assets/work-item-detail-page-JeTE7XNM.js +0 -1
  550. package/dist/gateway/static/root/assets/workflow-start-dialog-_u8Uc1ze.js +0 -1
  551. package/dist/gateway/static/root/assets/workflows-page-ixgk_y1l.js +0 -18
  552. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +0 -13
  553. package/dist/src/agent/workflow/builtins/audit-repo.js +0 -183
  554. package/dist/src/agent/workflow/builtins/audit-repo.js.map +0 -1
  555. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +0 -12
  556. package/dist/src/agent/workflow/builtins/client-proposal.js +0 -164
  557. package/dist/src/agent/workflow/builtins/client-proposal.js.map +0 -1
  558. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +0 -12
  559. package/dist/src/agent/workflow/builtins/competitor-scan.js +0 -164
  560. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +0 -1
  561. package/dist/src/agent/workflow/builtins/content-draft.d.ts +0 -13
  562. package/dist/src/agent/workflow/builtins/content-draft.js +0 -159
  563. package/dist/src/agent/workflow/builtins/content-draft.js.map +0 -1
  564. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +0 -11
  565. package/dist/src/agent/workflow/builtins/content-repurpose.js +0 -146
  566. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +0 -1
  567. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +0 -13
  568. package/dist/src/agent/workflow/builtins/debug-incident.js +0 -177
  569. package/dist/src/agent/workflow/builtins/debug-incident.js.map +0 -1
  570. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +0 -13
  571. package/dist/src/agent/workflow/builtins/decision-compare.js +0 -187
  572. package/dist/src/agent/workflow/builtins/decision-compare.js.map +0 -1
  573. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +0 -12
  574. package/dist/src/agent/workflow/builtins/implementation-plan.js +0 -185
  575. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +0 -1
  576. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +0 -11
  577. package/dist/src/agent/workflow/builtins/inbox-triage.js +0 -158
  578. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +0 -1
  579. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +0 -12
  580. package/dist/src/agent/workflow/builtins/meeting-prep.js +0 -152
  581. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +0 -1
  582. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +0 -14
  583. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +0 -171
  584. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +0 -1
  585. package/dist/src/agent/workflow/builtins/offer-design.d.ts +0 -12
  586. package/dist/src/agent/workflow/builtins/offer-design.js +0 -170
  587. package/dist/src/agent/workflow/builtins/offer-design.js.map +0 -1
  588. package/dist/src/agent/workflow/builtins/pr-review.d.ts +0 -12
  589. package/dist/src/agent/workflow/builtins/pr-review.js +0 -178
  590. package/dist/src/agent/workflow/builtins/pr-review.js.map +0 -1
  591. package/dist/src/agent/workflow/builtins/release-check.d.ts +0 -11
  592. package/dist/src/agent/workflow/builtins/release-check.js +0 -174
  593. package/dist/src/agent/workflow/builtins/release-check.js.map +0 -1
  594. package/dist/src/agent/workflow/builtins/research.d.ts +0 -13
  595. package/dist/src/agent/workflow/builtins/research.js +0 -188
  596. package/dist/src/agent/workflow/builtins/research.js.map +0 -1
  597. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +0 -12
  598. package/dist/src/agent/workflow/builtins/weekly-review.js +0 -139
  599. package/dist/src/agent/workflow/builtins/weekly-review.js.map +0 -1
  600. package/dist/src/agent/workflow/last-run-memory.d.ts +0 -42
  601. package/dist/src/agent/workflow/last-run-memory.js +0 -60
  602. package/dist/src/agent/workflow/last-run-memory.js.map +0 -1
  603. package/dist/src/agent/workflow/lint.d.ts +0 -38
  604. package/dist/src/agent/workflow/lint.js +0 -74
  605. package/dist/src/agent/workflow/lint.js.map +0 -1
  606. package/dist/src/agent/workflow/meta-locale.d.ts +0 -12
  607. package/dist/src/agent/workflow/meta-locale.js +0 -62
  608. package/dist/src/agent/workflow/meta-locale.js.map +0 -1
  609. package/dist/src/agent/workflow/parser.d.ts +0 -20
  610. package/dist/src/agent/workflow/parser.js +0 -152
  611. package/dist/src/agent/workflow/parser.js.map +0 -1
  612. package/dist/src/agent/workflow/runtime.d.ts +0 -34
  613. package/dist/src/agent/workflow/runtime.js +0 -402
  614. package/dist/src/agent/workflow/runtime.js.map +0 -1
  615. package/dist/src/connectors/oauth.d.ts +0 -22
  616. package/dist/src/connectors/oauth.js +0 -99
  617. package/dist/src/connectors/oauth.js.map +0 -1
  618. package/dist/src/workflows/runtime/script-runtime.d.ts +0 -3
  619. package/dist/src/workflows/runtime/script-runtime.js +0 -3
  620. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +0 -5
  621. package/dist/src/workflows/runtime/script-workflow-runtime.js +0 -15
  622. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +0 -1
@@ -1,200 +1,204 @@
1
1
  import { init_paths_state, resolveStateDir } from "../../config/paths-state.js";
2
+ import { buildWorkflowDefinition } from "../../workflows/domain/definition-utils.js";
3
+ import { validateWorkflowGraph } from "../../workflows/domain/validation.js";
2
4
  import { BUILTIN_WORKFLOWS } from "./builtins/index.js";
3
- import { parseWorkflowScript } from "./parser.js";
4
5
  import { join } from "node:path";
5
- import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, unlinkSync, writeFileSync } from "node:fs";
6
+ import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync } from "node:fs";
7
+ import { randomUUID } from "node:crypto";
6
8
  //#region src/agent/workflow/catalog.ts
7
- /**
8
- * Catalog for named workflows.
9
- *
10
- * Resolution order (built-ins are starting points, user workflows win):
11
- * 1. `~/.xopc/workflows/<name>/workflow.js` (+ optional `manifest.json`)
12
- * 2. `~/.xopc/workflows/<name>.js` (or `<name>.workflow.js`)
13
- * 3. {@link BUILTIN_WORKFLOWS}
14
- *
15
- * The user dir is discovered via {@link resolveStateDir}, so `XOPC_STATE_DIR`
16
- * overrides apply automatically (matches how skills / extensions are wired).
17
- *
18
- * Listing is filesystem-cheap (single `readdir`) and runs synchronously — the
19
- * `/workflows` slash command is interactive and should return immediately.
20
- *
21
- * Validation: on load we re-parse the script to make sure `meta.name` matches
22
- * the filename. This prevents copy-pasted scripts from being silently
23
- * mis-addressed when invoked by name.
24
- */
25
9
  init_paths_state();
26
10
  const NAME_RE = /^[a-z][a-z0-9_-]*$/;
27
11
  function createWorkflowCatalog(opts = {}) {
28
12
  const userDir = opts.userDir ?? defaultUserDir();
13
+ const loadUser = (name) => {
14
+ const path = join(userDir, `${name}.json`);
15
+ if (!existsSync(path)) return null;
16
+ const parsed = JSON.parse(readFileSync(path, "utf-8"));
17
+ assertStoredDefinition(parsed, name, path);
18
+ return parsed;
19
+ };
29
20
  const list = () => {
30
- const entries = /* @__PURE__ */ new Map();
31
- for (const b of BUILTIN_WORKFLOWS) {
32
- const meta = safeMeta(b.script);
33
- entries.set(b.name, {
34
- name: b.name,
35
- source: "builtin",
36
- path: null,
37
- description: meta?.description ?? "(unparseable)",
38
- whenToUse: meta?.whenToUse,
39
- tags: meta?.tags,
40
- estimatedAgents: meta?.estimatedAgents
41
- });
42
- }
43
- for (const entry of safeListUserEntries(userDir)) {
44
- const meta = safeMeta(readScript(entry.path));
45
- const manifest = readManifest(entry.manifestPath);
46
- entries.set(entry.name, {
47
- name: entry.name,
48
- source: "user",
49
- path: entry.path,
50
- description: manifest?.description ?? meta?.description ?? "(unparseable)",
51
- title: manifest?.title,
52
- version: manifest?.version,
53
- whenToUse: manifest?.whenToUse ?? meta?.whenToUse,
54
- tags: manifest?.tags ?? meta?.tags,
55
- estimatedAgents: meta?.estimatedAgents
21
+ const definitions = /* @__PURE__ */ new Map();
22
+ for (const definition of BUILTIN_WORKFLOWS) definitions.set(definition.name, {
23
+ definition,
24
+ path: null
25
+ });
26
+ for (const name of listUserNames(userDir)) try {
27
+ const definition = loadUser(name);
28
+ if (definition) definitions.set(name, {
29
+ definition,
30
+ path: join(userDir, `${name}.json`)
56
31
  });
57
- }
58
- return [...entries.values()].sort((a, b) => a.name.localeCompare(b.name));
32
+ } catch {}
33
+ return [...definitions.values()].map(({ definition, path }) => toCatalogEntry(definition, path)).sort((left, right) => left.name.localeCompare(right.name));
59
34
  };
60
35
  const load = (name) => {
61
36
  requireValidName(name);
62
- const userEntry = findUserEntry(userDir, name);
63
- if (userEntry) {
64
- const script = readScript(userEntry.path);
65
- const { meta } = parseWorkflowScript(script);
66
- ensureMetaNameMatches(meta, name, userEntry.path);
67
- return {
68
- name,
69
- source: "user",
70
- script,
71
- meta,
72
- path: userEntry.path,
73
- manifest: readManifest(userEntry.manifestPath)
74
- };
75
- }
76
- const builtin = BUILTIN_WORKFLOWS.find((b) => b.name === name);
77
- if (builtin) {
78
- const { meta } = parseWorkflowScript(builtin.script);
79
- ensureMetaNameMatches(meta, name, "<builtin>");
80
- return {
81
- name,
82
- source: "builtin",
83
- script: builtin.script,
84
- meta,
85
- path: null
86
- };
87
- }
88
- throw new Error(`workflow not found: ${name}. Drop a script at ${join(userDir, `${name}.js`)} or pick one of: ${list().map((e) => e.name).join(", ")}`);
37
+ const user = loadUser(name);
38
+ if (user) return structuredClone(user);
39
+ const builtin = BUILTIN_WORKFLOWS.find((definition) => definition.name === name);
40
+ if (builtin) return structuredClone(builtin);
41
+ throw new Error(`workflow not found: ${name}`);
89
42
  };
90
- const save = (name, script) => {
43
+ const save = (input) => {
44
+ const name = input.name.trim();
91
45
  requireValidName(name);
92
- const { meta } = parseWorkflowScript(script);
93
- if (meta.name !== name) throw new Error(`meta.name "${meta.name}" does not match save name "${name}". Adjust one to match the other.`);
46
+ const validation = validateWorkflowGraph(input.graph);
47
+ if (!validation.valid) throw new Error(validation.errors.map((issue) => issue.message).join(" "));
48
+ const existing = loadUser(name);
49
+ const builtin = BUILTIN_WORKFLOWS.find((definition) => definition.name === name);
50
+ if (input.intent === "create" && (existing || builtin)) throw new WorkflowNameConflictError(name, existing?.revision ?? builtin?.revision ?? 0);
51
+ if (input.expectedRevision !== void 0 && input.expectedRevision !== (existing?.revision ?? 0)) throw new WorkflowRevisionConflictError(existing?.revision ?? 0);
52
+ const definition = buildWorkflowDefinition({
53
+ name,
54
+ source: "user",
55
+ graph: input.graph,
56
+ manifest: input.manifest,
57
+ revision: (existing?.revision ?? 0) + 1,
58
+ createdAtMs: existing?.metadata.createdAtMs
59
+ });
94
60
  if (!existsSync(userDir)) mkdirSync(userDir, { recursive: true });
95
- const path = join(userDir, `${name}.js`);
96
- writeFileSync(path, normalizeNewlines(script), "utf-8");
97
- return { path };
61
+ const path = join(userDir, `${name}.json`);
62
+ const revisionsDir = join(userDir, ".revisions", name);
63
+ mkdirSync(revisionsDir, { recursive: true });
64
+ writeJsonAtomic(join(revisionsDir, `${definition.revision}.json`), definition);
65
+ writeJsonAtomic(path, definition);
66
+ return {
67
+ path,
68
+ definition
69
+ };
70
+ };
71
+ const listRevisions = (name) => {
72
+ requireValidName(name);
73
+ const dir = join(userDir, ".revisions", name);
74
+ if (!existsSync(dir)) return [];
75
+ return readdirSync(dir).filter((file) => /^\d+\.json$/.test(file)).map((file) => {
76
+ try {
77
+ const definition = JSON.parse(readFileSync(join(dir, file), "utf-8"));
78
+ assertStoredDefinition(definition, name, join(dir, file));
79
+ return {
80
+ revision: definition.revision,
81
+ title: definition.title,
82
+ contentHash: definition.contentHash,
83
+ createdAtMs: definition.metadata.updatedAtMs
84
+ };
85
+ } catch {
86
+ return null;
87
+ }
88
+ }).filter((item) => item !== null).sort((left, right) => right.revision - left.revision);
89
+ };
90
+ const loadRevision = (name, revision) => {
91
+ requireValidName(name);
92
+ if (!Number.isSafeInteger(revision) || revision < 1) throw new Error("invalid workflow revision");
93
+ const path = join(userDir, ".revisions", name, `${revision}.json`);
94
+ if (!existsSync(path)) throw new Error(`workflow revision not found: ${name}@${revision}`);
95
+ const definition = JSON.parse(readFileSync(path, "utf-8"));
96
+ assertStoredDefinition(definition, name, path);
97
+ return structuredClone(definition);
98
+ };
99
+ const restore = (name, revision, expectedRevision) => {
100
+ const selected = loadRevision(name, revision);
101
+ return save({
102
+ name,
103
+ graph: selected.graph,
104
+ manifest: definitionToManifest(selected),
105
+ expectedRevision
106
+ });
98
107
  };
99
108
  const remove = (name) => {
100
109
  requireValidName(name);
101
- const userEntry = findUserEntry(userDir, name);
102
- if (!userEntry) return false;
103
- unlinkSync(userEntry.path);
110
+ const path = join(userDir, `${name}.json`);
111
+ if (!existsSync(path)) return false;
112
+ unlinkSync(path);
113
+ const revisionsDir = join(userDir, ".revisions", name);
114
+ if (existsSync(revisionsDir)) rmSync(revisionsDir, {
115
+ recursive: true,
116
+ force: true
117
+ });
104
118
  return true;
105
119
  };
106
120
  return {
107
121
  list,
108
122
  load,
109
123
  save,
124
+ listRevisions,
125
+ loadRevision,
126
+ restore,
110
127
  remove,
111
128
  userDir
112
129
  };
113
130
  }
131
+ var WorkflowRevisionConflictError = class extends Error {
132
+ constructor(currentRevision) {
133
+ super(`workflow revision conflict; current revision is ${currentRevision}`);
134
+ this.currentRevision = currentRevision;
135
+ this.name = "WorkflowRevisionConflictError";
136
+ }
137
+ };
138
+ var WorkflowNameConflictError = class extends Error {
139
+ constructor(workflowName, currentRevision) {
140
+ super(`workflow name already exists: ${workflowName}`);
141
+ this.workflowName = workflowName;
142
+ this.currentRevision = currentRevision;
143
+ this.name = "WorkflowNameConflictError";
144
+ }
145
+ };
114
146
  function defaultUserDir() {
115
147
  return join(resolveStateDir(), "workflows");
116
148
  }
117
- function safeListUserEntries(dir) {
149
+ function listUserNames(dir) {
118
150
  try {
119
- if (!existsSync(dir)) return [];
120
- if (!statSync(dir).isDirectory()) return [];
121
- const entries = [];
122
- for (const file of readdirSync(dir)) {
123
- const full = join(dir, file);
124
- if (statSync(full).isDirectory()) {
125
- const workflowPath = join(full, "workflow.js");
126
- if (existsSync(workflowPath) && isValidName(file)) entries.push({
127
- name: file,
128
- path: workflowPath,
129
- manifestPath: join(full, "manifest.json")
130
- });
131
- continue;
132
- }
133
- if (!/\.(js|workflow\.js)$/i.test(file)) continue;
134
- const name = stripExt(file);
135
- if (!isValidName(name)) continue;
136
- entries.push({
137
- name,
138
- path: full
139
- });
140
- }
141
- return entries;
151
+ if (!existsSync(dir) || !statSync(dir).isDirectory()) return [];
152
+ return readdirSync(dir).filter((file) => file.endsWith(".json")).map((file) => file.slice(0, -5)).filter((name) => NAME_RE.test(name));
142
153
  } catch {
143
154
  return [];
144
155
  }
145
156
  }
146
- function findUserEntry(dir, name) {
147
- const dirWorkflowPath = join(dir, name, "workflow.js");
148
- if (existsSync(dirWorkflowPath)) return {
149
- name,
150
- path: dirWorkflowPath,
151
- manifestPath: join(dir, name, "manifest.json")
152
- };
153
- for (const candidate of [`${name}.js`, `${name}.workflow.js`]) {
154
- const full = join(dir, candidate);
155
- if (existsSync(full)) return {
156
- name,
157
- path: full
158
- };
159
- }
160
- return null;
157
+ function assertStoredDefinition(value, name, path) {
158
+ if (!value || typeof value !== "object" || value.name !== name || value.metadata?.source !== "user") throw new Error(`invalid workflow definition: ${path}`);
159
+ if (!validateWorkflowGraph(value.graph).valid) throw new Error(`invalid workflow graph: ${path}`);
161
160
  }
162
- function readScript(path) {
163
- return readFileSync(path, "utf-8");
164
- }
165
- function readManifest(path) {
166
- if (!path || !existsSync(path)) return void 0;
167
- try {
168
- const value = JSON.parse(readFileSync(path, "utf-8"));
169
- if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
170
- return value;
171
- } catch {
172
- return;
173
- }
174
- }
175
- function safeMeta(script) {
176
- try {
177
- return parseWorkflowScript(script).meta;
178
- } catch {
179
- return null;
180
- }
181
- }
182
- function stripExt(filename) {
183
- return filename.replace(/\.workflow\.js$/i, "").replace(/\.js$/i, "");
184
- }
185
- function isValidName(name) {
186
- return NAME_RE.test(name);
161
+ function toCatalogEntry(definition, path) {
162
+ return {
163
+ name: definition.name,
164
+ source: definition.metadata.source,
165
+ path,
166
+ description: definition.description,
167
+ title: definition.title,
168
+ version: definition.version,
169
+ revision: definition.revision,
170
+ whenToUse: definition.metadata.whenToUse,
171
+ tags: definition.metadata.tags,
172
+ estimatedAgents: definition.metadata.estimatedAgents
173
+ };
187
174
  }
188
175
  function requireValidName(name) {
189
- if (!isValidName(name)) throw new Error(`invalid workflow name "${name}". Use lowercase snake_case, e.g. "audit_repo".`);
176
+ if (!NAME_RE.test(name)) throw new Error(`invalid workflow name "${name}"; use lowercase letters, numbers, underscores, or hyphens`);
190
177
  }
191
- function ensureMetaNameMatches(meta, name, locator) {
192
- if (meta.name !== name) throw new Error(`workflow ${locator}: meta.name "${meta.name}" disagrees with addressable name "${name}". Rename the file or the meta.name to match.`);
178
+ function writeJsonAtomic(path, value) {
179
+ const temporaryPath = `${path}.${randomUUID()}.tmp`;
180
+ writeFileSync(temporaryPath, `${JSON.stringify(value, null, 2)}\n`, "utf-8");
181
+ renameSync(temporaryPath, path);
193
182
  }
194
- function normalizeNewlines(s) {
195
- return s.endsWith("\n") ? s : `${s}\n`;
183
+ function definitionToManifest(definition) {
184
+ return {
185
+ title: definition.title,
186
+ description: definition.description,
187
+ version: definition.version,
188
+ inputSchema: definition.inputSchema,
189
+ outputSchema: definition.outputSchema,
190
+ defaults: definition.defaults,
191
+ tags: definition.metadata.tags,
192
+ whenToUse: definition.metadata.whenToUse,
193
+ estimatedAgents: definition.metadata.estimatedAgents,
194
+ examplePrompts: definition.metadata.examplePrompts,
195
+ i18n: definition.metadata.i18n,
196
+ permissions: definition.permissions,
197
+ resources: definition.resources,
198
+ connectors: definition.connectors
199
+ };
196
200
  }
197
201
  //#endregion
198
- export { createWorkflowCatalog, defaultUserDir };
202
+ export { WorkflowNameConflictError, WorkflowRevisionConflictError, createWorkflowCatalog, defaultUserDir };
199
203
 
200
204
  //# sourceMappingURL=catalog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","names":[],"sources":["../../../../src/agent/workflow/catalog.ts"],"sourcesContent":["/**\n * Catalog for named workflows.\n *\n * Resolution order (built-ins are starting points, user workflows win):\n * 1. `~/.xopc/workflows/<name>/workflow.js` (+ optional `manifest.json`)\n * 2. `~/.xopc/workflows/<name>.js` (or `<name>.workflow.js`)\n * 3. {@link BUILTIN_WORKFLOWS}\n *\n * The user dir is discovered via {@link resolveStateDir}, so `XOPC_STATE_DIR`\n * overrides apply automatically (matches how skills / extensions are wired).\n *\n * Listing is filesystem-cheap (single `readdir`) and runs synchronously — the\n * `/workflows` slash command is interactive and should return immediately.\n *\n * Validation: on load we re-parse the script to make sure `meta.name` matches\n * the filename. This prevents copy-pasted scripts from being silently\n * mis-addressed when invoked by name.\n */\n\nimport {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { WorkflowDefinitionManifest } from '../../workflows/domain/definition.js';\n\nimport { resolveStateDir } from '../../config/paths-state.js';\n\nimport { BUILTIN_WORKFLOWS } from './builtins/index.js';\nimport { parseWorkflowScript } from './parser.js';\nimport type { WorkflowMeta } from './types.js';\n\nexport type WorkflowSource = 'user' | 'builtin';\n\nexport interface CatalogEntry {\n name: string;\n source: WorkflowSource;\n /** Absolute path for user entries; null for built-ins (in-memory). */\n path: string | null;\n description: string;\n title?: string;\n version?: string;\n whenToUse?: string;\n tags?: string[];\n estimatedAgents?: { min: number; max: number };\n}\n\nexport interface LoadedWorkflow {\n name: string;\n source: WorkflowSource;\n script: string;\n meta: WorkflowMeta;\n path: string | null;\n manifest?: WorkflowDefinitionManifest;\n}\n\nexport interface WorkflowCatalog {\n list(): CatalogEntry[];\n /** Load a named workflow. Throws if missing or meta.name disagrees with filename. */\n load(name: string): LoadedWorkflow;\n /** Save a script as a user workflow. Throws if the script fails to parse. */\n save(name: string, script: string): { path: string };\n /** Remove a user workflow. No-op if absent. Built-ins are never removed. */\n remove(name: string): boolean;\n /** Absolute path to the user workflows directory (created lazily on save). */\n userDir: string;\n}\n\nconst NAME_RE = /^[a-z][a-z0-9_-]*$/;\n\nexport function createWorkflowCatalog(opts: { userDir?: string } = {}): WorkflowCatalog {\n const userDir = opts.userDir ?? defaultUserDir();\n\n const list = (): CatalogEntry[] => {\n const entries = new Map<string, CatalogEntry>();\n for (const b of BUILTIN_WORKFLOWS) {\n const meta = safeMeta(b.script);\n entries.set(b.name, {\n name: b.name,\n source: 'builtin',\n path: null,\n description: meta?.description ?? '(unparseable)',\n whenToUse: meta?.whenToUse,\n tags: meta?.tags,\n estimatedAgents: meta?.estimatedAgents,\n });\n }\n for (const entry of safeListUserEntries(userDir)) {\n const meta = safeMeta(readScript(entry.path));\n const manifest = readManifest(entry.manifestPath);\n // User wins on collision.\n entries.set(entry.name, {\n name: entry.name,\n source: 'user',\n path: entry.path,\n description: manifest?.description ?? meta?.description ?? '(unparseable)',\n title: manifest?.title,\n version: manifest?.version,\n whenToUse: manifest?.whenToUse ?? meta?.whenToUse,\n tags: manifest?.tags ?? meta?.tags,\n estimatedAgents: meta?.estimatedAgents,\n });\n }\n return [...entries.values()].sort((a, b) => a.name.localeCompare(b.name));\n };\n\n const load = (name: string): LoadedWorkflow => {\n requireValidName(name);\n const userEntry = findUserEntry(userDir, name);\n if (userEntry) {\n const script = readScript(userEntry.path);\n const { meta } = parseWorkflowScript(script);\n ensureMetaNameMatches(meta, name, userEntry.path);\n return {\n name,\n source: 'user',\n script,\n meta,\n path: userEntry.path,\n manifest: readManifest(userEntry.manifestPath),\n };\n }\n const builtin = BUILTIN_WORKFLOWS.find((b) => b.name === name);\n if (builtin) {\n const { meta } = parseWorkflowScript(builtin.script);\n ensureMetaNameMatches(meta, name, '<builtin>');\n return { name, source: 'builtin', script: builtin.script, meta, path: null };\n }\n throw new Error(\n `workflow not found: ${name}. Drop a script at ${join(userDir, `${name}.js`)} or pick one of: ${list()\n .map((e) => e.name)\n .join(', ')}`,\n );\n };\n\n const save = (name: string, script: string): { path: string } => {\n requireValidName(name);\n const { meta } = parseWorkflowScript(script);\n if (meta.name !== name) {\n throw new Error(\n `meta.name \"${meta.name}\" does not match save name \"${name}\". Adjust one to match the other.`,\n );\n }\n if (!existsSync(userDir)) {\n mkdirSync(userDir, { recursive: true });\n }\n const path = join(userDir, `${name}.js`);\n writeFileSync(path, normalizeNewlines(script), 'utf-8');\n return { path };\n };\n\n const remove = (name: string): boolean => {\n requireValidName(name);\n const userEntry = findUserEntry(userDir, name);\n if (!userEntry) return false;\n unlinkSync(userEntry.path);\n return true;\n };\n\n return { list, load, save, remove, userDir };\n}\n\n// ---------------------------------------------------------------------------\n\nexport function defaultUserDir(): string {\n return join(resolveStateDir(), 'workflows');\n}\n\ninterface UserWorkflowEntry {\n name: string;\n path: string;\n manifestPath?: string;\n}\n\nfunction safeListUserEntries(dir: string): UserWorkflowEntry[] {\n try {\n if (!existsSync(dir)) return [];\n const st = statSync(dir);\n if (!st.isDirectory()) return [];\n const entries: UserWorkflowEntry[] = [];\n for (const file of readdirSync(dir)) {\n const full = join(dir, file);\n const fileStat = statSync(full);\n if (fileStat.isDirectory()) {\n const workflowPath = join(full, 'workflow.js');\n if (existsSync(workflowPath) && isValidName(file)) {\n entries.push({ name: file, path: workflowPath, manifestPath: join(full, 'manifest.json') });\n }\n continue;\n }\n if (!/\\.(js|workflow\\.js)$/i.test(file)) continue;\n const name = stripExt(file);\n if (!isValidName(name)) continue;\n entries.push({ name, path: full });\n }\n return entries;\n } catch {\n return [];\n }\n}\n\nfunction findUserEntry(dir: string, name: string): UserWorkflowEntry | null {\n const dirWorkflowPath = join(dir, name, 'workflow.js');\n if (existsSync(dirWorkflowPath)) {\n return { name, path: dirWorkflowPath, manifestPath: join(dir, name, 'manifest.json') };\n }\n for (const candidate of [`${name}.js`, `${name}.workflow.js`]) {\n const full = join(dir, candidate);\n if (existsSync(full)) return { name, path: full };\n }\n return null;\n}\n\nfunction readScript(path: string): string {\n return readFileSync(path, 'utf-8');\n}\n\nfunction readManifest(path: string | undefined): WorkflowDefinitionManifest | undefined {\n if (!path || !existsSync(path)) return undefined;\n try {\n const value = JSON.parse(readFileSync(path, 'utf-8')) as WorkflowDefinitionManifest;\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n return value;\n } catch {\n return undefined;\n }\n}\n\nfunction safeMeta(script: string): WorkflowMeta | null {\n try {\n return parseWorkflowScript(script).meta;\n } catch {\n return null;\n }\n}\n\nfunction stripExt(filename: string): string {\n return filename.replace(/\\.workflow\\.js$/i, '').replace(/\\.js$/i, '');\n}\n\nfunction isValidName(name: string): boolean {\n return NAME_RE.test(name);\n}\n\nfunction requireValidName(name: string): void {\n if (!isValidName(name)) {\n throw new Error(`invalid workflow name \"${name}\". Use lowercase snake_case, e.g. \"audit_repo\".`);\n }\n}\n\nfunction ensureMetaNameMatches(meta: WorkflowMeta, name: string, locator: string): void {\n if (meta.name !== name) {\n throw new Error(\n `workflow ${locator}: meta.name \"${meta.name}\" disagrees with addressable name \"${name}\". ` +\n 'Rename the file or the meta.name to match.',\n );\n }\n}\n\nfunction normalizeNewlines(s: string): string {\n return s.endsWith('\\n') ? s : `${s}\\n`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;kBAgC8D;AA0C9D,MAAM,UAAU;AAEhB,SAAgB,sBAAsB,OAA6B,EAAE,EAAmB;CACtF,MAAM,UAAU,KAAK,WAAW,gBAAgB;CAEhD,MAAM,aAA6B;EACjC,MAAM,0BAAU,IAAI,KAA2B;AAC/C,OAAK,MAAM,KAAK,mBAAmB;GACjC,MAAM,OAAO,SAAS,EAAE,OAAO;AAC/B,WAAQ,IAAI,EAAE,MAAM;IAClB,MAAM,EAAE;IACR,QAAQ;IACR,MAAM;IACN,aAAa,MAAM,eAAe;IAClC,WAAW,MAAM;IACjB,MAAM,MAAM;IACZ,iBAAiB,MAAM;IACxB,CAAC;;AAEJ,OAAK,MAAM,SAAS,oBAAoB,QAAQ,EAAE;GAChD,MAAM,OAAO,SAAS,WAAW,MAAM,KAAK,CAAC;GAC7C,MAAM,WAAW,aAAa,MAAM,aAAa;AAEjD,WAAQ,IAAI,MAAM,MAAM;IACtB,MAAM,MAAM;IACZ,QAAQ;IACR,MAAM,MAAM;IACZ,aAAa,UAAU,eAAe,MAAM,eAAe;IAC3D,OAAO,UAAU;IACjB,SAAS,UAAU;IACnB,WAAW,UAAU,aAAa,MAAM;IACxC,MAAM,UAAU,QAAQ,MAAM;IAC9B,iBAAiB,MAAM;IACxB,CAAC;;AAEJ,SAAO,CAAC,GAAG,QAAQ,QAAQ,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,KAAK,CAAC;;CAG3E,MAAM,QAAQ,SAAiC;AAC7C,mBAAiB,KAAK;EACtB,MAAM,YAAY,cAAc,SAAS,KAAK;AAC9C,MAAI,WAAW;GACb,MAAM,SAAS,WAAW,UAAU,KAAK;GACzC,MAAM,EAAE,SAAS,oBAAoB,OAAO;AAC5C,yBAAsB,MAAM,MAAM,UAAU,KAAK;AACjD,UAAO;IACL;IACA,QAAQ;IACR;IACA;IACA,MAAM,UAAU;IAChB,UAAU,aAAa,UAAU,aAAa;IAC/C;;EAEH,MAAM,UAAU,kBAAkB,MAAM,MAAM,EAAE,SAAS,KAAK;AAC9D,MAAI,SAAS;GACX,MAAM,EAAE,SAAS,oBAAoB,QAAQ,OAAO;AACpD,yBAAsB,MAAM,MAAM,YAAY;AAC9C,UAAO;IAAE;IAAM,QAAQ;IAAW,QAAQ,QAAQ;IAAQ;IAAM,MAAM;IAAM;;AAE9E,QAAM,IAAI,MACR,uBAAuB,KAAK,qBAAqB,KAAK,SAAS,GAAG,KAAK,KAAK,CAAC,mBAAmB,MAAM,CACnG,KAAK,MAAM,EAAE,KAAK,CAClB,KAAK,KAAK,GACd;;CAGH,MAAM,QAAQ,MAAc,WAAqC;AAC/D,mBAAiB,KAAK;EACtB,MAAM,EAAE,SAAS,oBAAoB,OAAO;AAC5C,MAAI,KAAK,SAAS,KAChB,OAAM,IAAI,MACR,cAAc,KAAK,KAAK,8BAA8B,KAAK,mCAC5D;AAEH,MAAI,CAAC,WAAW,QAAQ,CACtB,WAAU,SAAS,EAAE,WAAW,MAAM,CAAC;EAEzC,MAAM,OAAO,KAAK,SAAS,GAAG,KAAK,KAAK;AACxC,gBAAc,MAAM,kBAAkB,OAAO,EAAE,QAAQ;AACvD,SAAO,EAAE,MAAM;;CAGjB,MAAM,UAAU,SAA0B;AACxC,mBAAiB,KAAK;EACtB,MAAM,YAAY,cAAc,SAAS,KAAK;AAC9C,MAAI,CAAC,UAAW,QAAO;AACvB,aAAW,UAAU,KAAK;AAC1B,SAAO;;AAGT,QAAO;EAAE;EAAM;EAAM;EAAM;EAAQ;EAAS;;AAK9C,SAAgB,iBAAyB;AACvC,QAAO,KAAK,iBAAiB,EAAE,YAAY;;AAS7C,SAAS,oBAAoB,KAAkC;AAC7D,KAAI;AACF,MAAI,CAAC,WAAW,IAAI,CAAE,QAAO,EAAE;AAE/B,MAAI,CADO,SAAS,IACb,CAAC,aAAa,CAAE,QAAO,EAAE;EAChC,MAAM,UAA+B,EAAE;AACvC,OAAK,MAAM,QAAQ,YAAY,IAAI,EAAE;GACnC,MAAM,OAAO,KAAK,KAAK,KAAK;AAE5B,OADiB,SAAS,KACd,CAAC,aAAa,EAAE;IAC1B,MAAM,eAAe,KAAK,MAAM,cAAc;AAC9C,QAAI,WAAW,aAAa,IAAI,YAAY,KAAK,CAC/C,SAAQ,KAAK;KAAE,MAAM;KAAM,MAAM;KAAc,cAAc,KAAK,MAAM,gBAAgB;KAAE,CAAC;AAE7F;;AAEF,OAAI,CAAC,wBAAwB,KAAK,KAAK,CAAE;GACzC,MAAM,OAAO,SAAS,KAAK;AAC3B,OAAI,CAAC,YAAY,KAAK,CAAE;AACxB,WAAQ,KAAK;IAAE;IAAM,MAAM;IAAM,CAAC;;AAEpC,SAAO;SACD;AACN,SAAO,EAAE;;;AAIb,SAAS,cAAc,KAAa,MAAwC;CAC1E,MAAM,kBAAkB,KAAK,KAAK,MAAM,cAAc;AACtD,KAAI,WAAW,gBAAgB,CAC7B,QAAO;EAAE;EAAM,MAAM;EAAiB,cAAc,KAAK,KAAK,MAAM,gBAAgB;EAAE;AAExF,MAAK,MAAM,aAAa,CAAC,GAAG,KAAK,MAAM,GAAG,KAAK,cAAc,EAAE;EAC7D,MAAM,OAAO,KAAK,KAAK,UAAU;AACjC,MAAI,WAAW,KAAK,CAAE,QAAO;GAAE;GAAM,MAAM;GAAM;;AAEnD,QAAO;;AAGT,SAAS,WAAW,MAAsB;AACxC,QAAO,aAAa,MAAM,QAAQ;;AAGpC,SAAS,aAAa,MAAkE;AACtF,KAAI,CAAC,QAAQ,CAAC,WAAW,KAAK,CAAE,QAAO,KAAA;AACvC,KAAI;EACF,MAAM,QAAQ,KAAK,MAAM,aAAa,MAAM,QAAQ,CAAC;AACrD,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAAE,QAAO,KAAA;AACxE,SAAO;SACD;AACN;;;AAIJ,SAAS,SAAS,QAAqC;AACrD,KAAI;AACF,SAAO,oBAAoB,OAAO,CAAC;SAC7B;AACN,SAAO;;;AAIX,SAAS,SAAS,UAA0B;AAC1C,QAAO,SAAS,QAAQ,oBAAoB,GAAG,CAAC,QAAQ,UAAU,GAAG;;AAGvE,SAAS,YAAY,MAAuB;AAC1C,QAAO,QAAQ,KAAK,KAAK;;AAG3B,SAAS,iBAAiB,MAAoB;AAC5C,KAAI,CAAC,YAAY,KAAK,CACpB,OAAM,IAAI,MAAM,0BAA0B,KAAK,iDAAiD;;AAIpG,SAAS,sBAAsB,MAAoB,MAAc,SAAuB;AACtF,KAAI,KAAK,SAAS,KAChB,OAAM,IAAI,MACR,YAAY,QAAQ,eAAe,KAAK,KAAK,qCAAqC,KAAK,+CAExF;;AAIL,SAAS,kBAAkB,GAAmB;AAC5C,QAAO,EAAE,SAAS,KAAK,GAAG,IAAI,GAAG,EAAE"}
1
+ {"version":3,"file":"catalog.js","names":[],"sources":["../../../../src/agent/workflow/catalog.ts"],"sourcesContent":["import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\n\nimport type { WorkflowDefinition, WorkflowDefinitionManifest, WorkflowGraph } from '../../workflows/domain/definition.js';\nimport { buildWorkflowDefinition } from '../../workflows/domain/definition-utils.js';\nimport { validateWorkflowGraph } from '../../workflows/domain/validation.js';\nimport { resolveStateDir } from '../../config/paths-state.js';\n\nimport { BUILTIN_WORKFLOWS } from './builtins/index.js';\n\nexport type WorkflowSource = 'user' | 'builtin';\n\nexport interface CatalogEntry {\n name: string;\n source: WorkflowSource;\n path: string | null;\n description: string;\n title: string;\n version: string;\n revision: number;\n whenToUse?: string;\n tags?: string[];\n estimatedAgents?: { min: number; max: number };\n}\n\nexport interface SaveWorkflowInput {\n name: string;\n graph: WorkflowGraph;\n manifest?: WorkflowDefinitionManifest;\n expectedRevision?: number;\n intent?: 'create' | 'update';\n}\n\nexport interface WorkflowRevisionSummary {\n revision: number;\n title: string;\n contentHash?: string;\n createdAtMs: number;\n}\n\nexport interface WorkflowCatalog {\n list(): CatalogEntry[];\n load(name: string): WorkflowDefinition;\n save(input: SaveWorkflowInput): { path: string; definition: WorkflowDefinition };\n listRevisions(name: string): WorkflowRevisionSummary[];\n loadRevision(name: string, revision: number): WorkflowDefinition;\n restore(name: string, revision: number, expectedRevision: number): { path: string; definition: WorkflowDefinition };\n remove(name: string): boolean;\n userDir: string;\n}\n\nconst NAME_RE = /^[a-z][a-z0-9_-]*$/;\n\nexport function createWorkflowCatalog(opts: { userDir?: string } = {}): WorkflowCatalog {\n const userDir = opts.userDir ?? defaultUserDir();\n\n const loadUser = (name: string): WorkflowDefinition | null => {\n const path = join(userDir, `${name}.json`);\n if (!existsSync(path)) return null;\n const parsed = JSON.parse(readFileSync(path, 'utf-8')) as WorkflowDefinition;\n assertStoredDefinition(parsed, name, path);\n return parsed;\n };\n\n const list = (): CatalogEntry[] => {\n const definitions = new Map<string, { definition: WorkflowDefinition; path: string | null }>();\n for (const definition of BUILTIN_WORKFLOWS) definitions.set(definition.name, { definition, path: null });\n for (const name of listUserNames(userDir)) {\n try {\n const definition = loadUser(name);\n if (definition) definitions.set(name, { definition, path: join(userDir, `${name}.json`) });\n } catch {\n // Invalid files are not addressable workflows.\n }\n }\n return [...definitions.values()]\n .map(({ definition, path }) => toCatalogEntry(definition, path))\n .sort((left, right) => left.name.localeCompare(right.name));\n };\n\n const load = (name: string): WorkflowDefinition => {\n requireValidName(name);\n const user = loadUser(name);\n if (user) return structuredClone(user);\n const builtin = BUILTIN_WORKFLOWS.find((definition) => definition.name === name);\n if (builtin) return structuredClone(builtin);\n throw new Error(`workflow not found: ${name}`);\n };\n\n const save = (input: SaveWorkflowInput): { path: string; definition: WorkflowDefinition } => {\n const name = input.name.trim();\n requireValidName(name);\n const validation = validateWorkflowGraph(input.graph);\n if (!validation.valid) throw new Error(validation.errors.map((issue) => issue.message).join(' '));\n const existing = loadUser(name);\n const builtin = BUILTIN_WORKFLOWS.find((definition) => definition.name === name);\n if (input.intent === 'create' && (existing || builtin)) {\n throw new WorkflowNameConflictError(name, existing?.revision ?? builtin?.revision ?? 0);\n }\n if (input.expectedRevision !== undefined && input.expectedRevision !== (existing?.revision ?? 0)) {\n throw new WorkflowRevisionConflictError(existing?.revision ?? 0);\n }\n const definition = buildWorkflowDefinition({\n name,\n source: 'user',\n graph: input.graph,\n manifest: input.manifest,\n revision: (existing?.revision ?? 0) + 1,\n createdAtMs: existing?.metadata.createdAtMs,\n });\n if (!existsSync(userDir)) mkdirSync(userDir, { recursive: true });\n const path = join(userDir, `${name}.json`);\n const revisionsDir = join(userDir, '.revisions', name);\n mkdirSync(revisionsDir, { recursive: true });\n writeJsonAtomic(join(revisionsDir, `${definition.revision}.json`), definition);\n writeJsonAtomic(path, definition);\n return { path, definition };\n };\n\n const listRevisions = (name: string): WorkflowRevisionSummary[] => {\n requireValidName(name);\n const dir = join(userDir, '.revisions', name);\n if (!existsSync(dir)) return [];\n return readdirSync(dir)\n .filter((file) => /^\\d+\\.json$/.test(file))\n .map((file): WorkflowRevisionSummary | null => {\n try {\n const definition = JSON.parse(readFileSync(join(dir, file), 'utf-8')) as WorkflowDefinition;\n assertStoredDefinition(definition, name, join(dir, file));\n return { revision: definition.revision, title: definition.title, contentHash: definition.contentHash, createdAtMs: definition.metadata.updatedAtMs };\n } catch {\n return null;\n }\n })\n .filter((item): item is WorkflowRevisionSummary => item !== null)\n .sort((left, right) => right.revision - left.revision);\n };\n\n const loadRevision = (name: string, revision: number): WorkflowDefinition => {\n requireValidName(name);\n if (!Number.isSafeInteger(revision) || revision < 1) throw new Error('invalid workflow revision');\n const path = join(userDir, '.revisions', name, `${revision}.json`);\n if (!existsSync(path)) throw new Error(`workflow revision not found: ${name}@${revision}`);\n const definition = JSON.parse(readFileSync(path, 'utf-8')) as WorkflowDefinition;\n assertStoredDefinition(definition, name, path);\n return structuredClone(definition);\n };\n\n const restore = (name: string, revision: number, expectedRevision: number) => {\n const selected = loadRevision(name, revision);\n return save({ name, graph: selected.graph, manifest: definitionToManifest(selected), expectedRevision });\n };\n\n const remove = (name: string): boolean => {\n requireValidName(name);\n const path = join(userDir, `${name}.json`);\n if (!existsSync(path)) return false;\n unlinkSync(path);\n const revisionsDir = join(userDir, '.revisions', name);\n if (existsSync(revisionsDir)) rmSync(revisionsDir, { recursive: true, force: true });\n return true;\n };\n\n return { list, load, save, listRevisions, loadRevision, restore, remove, userDir };\n}\n\nexport class WorkflowRevisionConflictError extends Error {\n constructor(readonly currentRevision: number) {\n super(`workflow revision conflict; current revision is ${currentRevision}`);\n this.name = 'WorkflowRevisionConflictError';\n }\n}\n\nexport class WorkflowNameConflictError extends Error {\n constructor(readonly workflowName: string, readonly currentRevision: number) {\n super(`workflow name already exists: ${workflowName}`);\n this.name = 'WorkflowNameConflictError';\n }\n}\n\nexport function defaultUserDir(): string {\n return join(resolveStateDir(), 'workflows');\n}\n\nfunction listUserNames(dir: string): string[] {\n try {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return [];\n return readdirSync(dir)\n .filter((file) => file.endsWith('.json'))\n .map((file) => file.slice(0, -5))\n .filter((name) => NAME_RE.test(name));\n } catch {\n return [];\n }\n}\n\nfunction assertStoredDefinition(value: WorkflowDefinition, name: string, path: string): void {\n if (!value || typeof value !== 'object' || value.name !== name || value.metadata?.source !== 'user') {\n throw new Error(`invalid workflow definition: ${path}`);\n }\n const validation = validateWorkflowGraph(value.graph);\n if (!validation.valid) throw new Error(`invalid workflow graph: ${path}`);\n}\n\nfunction toCatalogEntry(definition: WorkflowDefinition, path: string | null): CatalogEntry {\n return {\n name: definition.name,\n source: definition.metadata.source,\n path,\n description: definition.description,\n title: definition.title,\n version: definition.version,\n revision: definition.revision,\n whenToUse: definition.metadata.whenToUse,\n tags: definition.metadata.tags,\n estimatedAgents: definition.metadata.estimatedAgents,\n };\n}\n\nfunction requireValidName(name: string): void {\n if (!NAME_RE.test(name)) throw new Error(`invalid workflow name \"${name}\"; use lowercase letters, numbers, underscores, or hyphens`);\n}\n\nfunction writeJsonAtomic(path: string, value: unknown): void {\n const temporaryPath = `${path}.${randomUUID()}.tmp`;\n writeFileSync(temporaryPath, `${JSON.stringify(value, null, 2)}\\n`, 'utf-8');\n renameSync(temporaryPath, path);\n}\n\nfunction definitionToManifest(definition: WorkflowDefinition): WorkflowDefinitionManifest {\n return {\n title: definition.title,\n description: definition.description,\n version: definition.version,\n inputSchema: definition.inputSchema,\n outputSchema: definition.outputSchema,\n defaults: definition.defaults,\n tags: definition.metadata.tags,\n whenToUse: definition.metadata.whenToUse,\n estimatedAgents: definition.metadata.estimatedAgents,\n examplePrompts: definition.metadata.examplePrompts,\n i18n: definition.metadata.i18n,\n permissions: definition.permissions,\n resources: definition.resources,\n connectors: definition.connectors,\n };\n}\n"],"mappings":"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"}
@@ -1,12 +1,10 @@
1
1
  export { applySubagentProgress } from './agent-progress.js';
2
- export { BUILTIN_WORKFLOWS, type BuiltinWorkflow } from './builtins/index.js';
3
- export { createWorkflowCatalog, defaultUserDir, type CatalogEntry, type LoadedWorkflow, type WorkflowCatalog, type WorkflowSource, } from './catalog.js';
4
- export { getLastWorkflowMemory, _resetLastWorkflowMemoryForTests, type LastWorkflowEntry, type LastWorkflowMemory, } from './last-run-memory.js';
2
+ export { BUILTIN_WORKFLOWS } from './builtins/index.js';
3
+ export { createWorkflowCatalog, defaultUserDir, type CatalogEntry, type SaveWorkflowInput, type WorkflowCatalog, type WorkflowSource, } from './catalog.js';
5
4
  export type { ChannelProgressCapability, WorkflowProgressMode, WorkflowProgressPostInput, WorkflowProgressPostResult, } from './channel-capability.js';
6
- export { parseWorkflowScript, type ParsedWorkflow } from './parser.js';
7
5
  export { WorkflowProgressBroker, getWorkflowProgressBroker, _resetWorkflowProgressBrokerForTests, type BrokerListenerHandle, type SessionBusLike, } from './progress-broker.js';
8
- export { emptySnapshotFor, runWorkflow, type RunWorkflowDeps, } from './runtime.js';
6
+ export { emptySnapshotFor } from './snapshot-empty.js';
9
7
  export { createWorkflowSnapshot, previewValue, recomputeCounts, renderWorkflowText, type RenderOptions, } from './snapshot.js';
10
8
  export { createStructuredOutputTool, STRUCTURED_OUTPUT_TOOL_NAME, type CreateStructuredOutputToolOptions, type StructuredOutputCapture, } from './structured-output-tool.js';
11
9
  export { DelegateSubagentRunner, type DelegateSubagentRunnerDeps, } from './subagent-runner.js';
12
- export type { AgentScriptOptions, JsonSchema, SubagentRunner, SubagentRunOptions, SubagentProgressEvent, WorkflowAgentSnapshot, WorkflowAgentStatus, WorkflowAgentStep, WorkflowMeta, WorkflowMetaEstimatedAgents, WorkflowMetaPhase, WorkflowRunOptions, WorkflowRunResult, WorkflowSnapshot, } from './types.js';
10
+ export type { JsonSchema, SubagentRunner, SubagentRunOptions, SubagentProgressEvent, WorkflowAgentSnapshot, WorkflowAgentStatus, WorkflowAgentStep, WorkflowRunOptions, WorkflowRunResult, WorkflowSnapshot, WorkflowSnapshotDefinition, } from './types.js';
@@ -1,12 +1,9 @@
1
1
  import { emptySnapshotFor } from "./snapshot-empty.js";
2
2
  import { createWorkflowSnapshot, previewValue, recomputeCounts, renderWorkflowText } from "./snapshot.js";
3
- import { applySubagentProgress } from "./agent-progress.js";
4
3
  import { BUILTIN_WORKFLOWS } from "./builtins/index.js";
5
- import { parseWorkflowScript } from "./parser.js";
6
4
  import { createWorkflowCatalog, defaultUserDir } from "./catalog.js";
7
- import { _resetLastWorkflowMemoryForTests, getLastWorkflowMemory } from "./last-run-memory.js";
5
+ import { applySubagentProgress } from "./agent-progress.js";
8
6
  import { WorkflowProgressBroker, _resetWorkflowProgressBrokerForTests, getWorkflowProgressBroker } from "./progress-broker.js";
9
- import { runWorkflow } from "./runtime.js";
10
7
  import { STRUCTURED_OUTPUT_TOOL_NAME, createStructuredOutputTool } from "./structured-output-tool.js";
11
8
  import { DelegateSubagentRunner } from "./subagent-runner.js";
12
- export { BUILTIN_WORKFLOWS, DelegateSubagentRunner, STRUCTURED_OUTPUT_TOOL_NAME, WorkflowProgressBroker, _resetLastWorkflowMemoryForTests, _resetWorkflowProgressBrokerForTests, applySubagentProgress, createStructuredOutputTool, createWorkflowCatalog, createWorkflowSnapshot, defaultUserDir, emptySnapshotFor, getLastWorkflowMemory, getWorkflowProgressBroker, parseWorkflowScript, previewValue, recomputeCounts, renderWorkflowText, runWorkflow };
9
+ export { BUILTIN_WORKFLOWS, DelegateSubagentRunner, STRUCTURED_OUTPUT_TOOL_NAME, WorkflowProgressBroker, _resetWorkflowProgressBrokerForTests, applySubagentProgress, createStructuredOutputTool, createWorkflowCatalog, createWorkflowSnapshot, defaultUserDir, emptySnapshotFor, getWorkflowProgressBroker, previewValue, recomputeCounts, renderWorkflowText };
@@ -6,8 +6,8 @@
6
6
  * a text rendering through `onUpdate` — keeping TUI / Gateway / IM consumers in
7
7
  * lock-step from a single source of truth.
8
8
  */
9
- import type { WorkflowMeta, WorkflowSnapshot } from './types.js';
10
- export declare function createWorkflowSnapshot(meta: WorkflowMeta): WorkflowSnapshot;
9
+ import type { WorkflowSnapshotDefinition, WorkflowSnapshot } from './types.js';
10
+ export declare function createWorkflowSnapshot(definition: WorkflowSnapshotDefinition): WorkflowSnapshot;
11
11
  export declare function recomputeCounts(snapshot: WorkflowSnapshot): void;
12
12
  export interface RenderOptions {
13
13
  maxAgentsPerPhase?: number;
@@ -1,7 +1,7 @@
1
1
  import { emptySnapshotFor } from "./snapshot-empty.js";
2
2
  //#region src/agent/workflow/snapshot.ts
3
- function createWorkflowSnapshot(meta) {
4
- return emptySnapshotFor(meta.name, meta.description, meta.phases?.map((p) => p.title));
3
+ function createWorkflowSnapshot(definition) {
4
+ return emptySnapshotFor(definition.name, definition.description, definition.phases?.map((phase) => phase.title));
5
5
  }
6
6
  function recomputeCounts(snapshot) {
7
7
  let running = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.js","names":[],"sources":["../../../../src/agent/workflow/snapshot.ts"],"sourcesContent":["/**\n * Workflow progress snapshot model + text renderers.\n *\n * The runtime emits per-event callbacks (`onPhase`, `onAgentStart`, `onAgentEnd`,\n * `onLog`). The workflow tool wraps those callbacks to mutate a snapshot and push\n * a text rendering through `onUpdate` — keeping TUI / Gateway / IM consumers in\n * lock-step from a single source of truth.\n */\n\nimport type {\n WorkflowAgentSnapshot,\n WorkflowAgentStatus,\n WorkflowMeta,\n WorkflowSnapshot,\n} from './types.js';\nimport { emptySnapshotFor } from './snapshot-empty.js';\n\nexport function createWorkflowSnapshot(meta: WorkflowMeta): WorkflowSnapshot {\n return emptySnapshotFor(\n meta.name,\n meta.description,\n meta.phases?.map((p) => p.title),\n );\n}\n\nexport function recomputeCounts(snapshot: WorkflowSnapshot): void {\n let running = 0;\n let done = 0;\n let error = 0;\n let skipped = 0;\n for (const agent of snapshot.agents) {\n switch (agent.status) {\n case 'running':\n running++;\n break;\n case 'done':\n done++;\n break;\n case 'error':\n error++;\n break;\n case 'skipped':\n skipped++;\n break;\n }\n }\n snapshot.agentCount = snapshot.agents.length;\n snapshot.runningCount = running;\n snapshot.doneCount = done;\n snapshot.errorCount = error;\n snapshot.skippedCount = skipped;\n}\n\nexport interface RenderOptions {\n maxAgentsPerPhase?: number;\n maxLogs?: number;\n showResultPreviews?: boolean;\n}\n\nexport type WorkflowPanelStatus =\n | 'queued'\n | 'running'\n | 'succeeded'\n | 'failed'\n | 'cancelled'\n | 'timeout'\n | string;\n\nexport interface WorkflowPanelOptions {\n status?: WorkflowPanelStatus;\n maxActiveAgents?: number;\n maxRecentAgents?: number;\n maxErrors?: number;\n nowMs?: number;\n}\n\nexport function renderWorkflowText(\n snapshot: WorkflowSnapshot,\n completed = false,\n options: RenderOptions = {},\n): string {\n const maxAgentsPerPhase = options.maxAgentsPerPhase ?? 6;\n const maxLogs = options.maxLogs ?? 2;\n const showPreviews = options.showResultPreviews ?? false;\n\n const state = stateSuffix(snapshot);\n const header = completed\n ? `◆ workflow ✓ ${snapshot.name} (${snapshot.doneCount}/${snapshot.agentCount} done${state})`\n : `◆ workflow: ${snapshot.name} (${snapshot.doneCount}/${snapshot.agentCount} done${state})`;\n const lines = [header];\n\n const phaseNames = uniqueOrdered([\n ...snapshot.phases,\n ...(snapshot.currentPhase ? [snapshot.currentPhase] : []),\n ...snapshot.agents.map((a) => a.phase).filter((p): p is string => Boolean(p)),\n ]);\n const rendered = new Set<WorkflowAgentSnapshot>();\n\n for (const phase of phaseNames) {\n const agents = snapshot.agents.filter((a) => a.phase === phase);\n if (agents.length === 0 && snapshot.currentPhase !== phase) continue;\n for (const a of agents) rendered.add(a);\n\n const counts = countAgents(agents);\n const completeHere = agents.length > 0 && counts.done + counts.error + counts.skipped === agents.length;\n const marker =\n counts.running > 0 || (!completeHere && snapshot.currentPhase === phase)\n ? '▶'\n : completeHere\n ? '✓'\n : ' ';\n\n const tail =\n (counts.running ? ` · ${counts.running} running` : '') +\n (counts.error ? ` · ${counts.error} errors` : '') +\n (counts.skipped ? ` · ${counts.skipped} skipped` : '');\n lines.push(` ${marker} ${phase} ${counts.done}/${agents.length}${tail}`);\n\n const visible = agents.slice(-maxAgentsPerPhase);\n for (const agent of visible) {\n const previewText = showPreviews && agent.resultPreview ? ` — ${agent.resultPreview}` : '';\n lines.push(\n ` #${agent.id} ${statusIcon(agent.status)} ${shorten(agent.label, 56)}${previewText}`,\n );\n }\n if (agents.length > visible.length) {\n lines.push(` … ${agents.length - visible.length} earlier agents`);\n }\n }\n\n const unphased = snapshot.agents.filter((a) => !rendered.has(a));\n if (unphased.length > 0) {\n lines.push(' unphased');\n for (const agent of unphased.slice(-maxAgentsPerPhase)) {\n const previewText = showPreviews && agent.resultPreview ? ` — ${agent.resultPreview}` : '';\n lines.push(\n ` #${agent.id} ${statusIcon(agent.status)} ${shorten(agent.label, 56)}${previewText}`,\n );\n }\n }\n\n const visibleLogs = snapshot.logs.slice(-maxLogs);\n if (visibleLogs.length > 0) {\n lines.push('');\n for (const log of visibleLogs) {\n lines.push(` log: ${shorten(log, 80)}`);\n }\n }\n return lines.join('\\n');\n}\n\nexport function previewValue(value: unknown, max = 80): string {\n if (value === null || value === undefined) return '';\n const text = typeof value === 'string' ? value : safeStringify(value);\n if (!text) return '';\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nexport function renderWorkflowPanel(\n snapshot: WorkflowSnapshot,\n options: WorkflowPanelOptions = {},\n): string {\n const status = options.status ?? inferPanelStatus(snapshot);\n const activeAgents = snapshot.agents.filter((agent) => agent.status === 'running');\n const queuedAgents = snapshot.agents.filter((agent) => agent.status === 'queued');\n const activeLimit = options.maxActiveAgents ?? 4;\n const recentLimit = options.maxRecentAgents ?? 4;\n const durationText = formatDuration(resolveElapsedMs(snapshot, options.nowMs));\n const counts = formatRunCounts(snapshot);\n\n const lines = [\n `◆ ${snapshot.name} ${statusText(status)} ${counts}${durationText ? ` ${durationText}` : ''}`,\n ];\n\n const phaseLines = renderPanelPhaseLines(snapshot);\n if (phaseLines.length > 0) {\n lines.push('', 'Phase', ...phaseLines);\n }\n\n const visibleActive = activeAgents.length > 0 ? activeAgents : queuedAgents;\n if (visibleActive.length > 0) {\n lines.push('', activeAgents.length > 0 ? 'Active' : 'Queued');\n for (const agent of visibleActive.slice(0, activeLimit)) {\n lines.push(...renderActiveAgentLines(agent));\n }\n if (visibleActive.length > activeLimit) {\n lines.push(` … ${visibleActive.length - activeLimit} more`);\n }\n }\n\n const recent = recentCompletedAgents(snapshot).slice(0, recentLimit);\n if (recent.length > 0) {\n lines.push('', 'Recent');\n for (const agent of recent) {\n lines.push(renderRecentAgentLine(agent));\n }\n }\n\n const errors = snapshot.agents.filter((agent) => agent.status === 'error' || agent.error);\n if (errors.length > 0) {\n lines.push('', 'Errors');\n for (const agent of errors.slice(0, options.maxErrors ?? 3)) {\n lines.push(\n ` ✗ #${agent.id} ${shorten(agent.label, 28)}${\n agent.error ? `: ${shorten(agent.error, 96)}` : ''\n }`,\n );\n }\n if (errors.length > (options.maxErrors ?? 3)) {\n lines.push(` … ${errors.length - (options.maxErrors ?? 3)} more`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function renderWorkflowFinalSummary(\n snapshot: WorkflowSnapshot,\n options: WorkflowPanelOptions = {},\n): string {\n const status = options.status ?? inferPanelStatus(snapshot);\n const durationText = formatDuration(resolveElapsedMs(snapshot, options.nowMs));\n const lines = [\n `◆ ${snapshot.name} ${statusText(status)} ${formatRunCounts(snapshot)}${durationText ? ` ${durationText}` : ''}`,\n ];\n\n const result = previewValue(snapshot.result, 280);\n if (result) {\n lines.push('', 'Result', ` ${result}`);\n } else {\n const fallback = recentCompletedAgents(snapshot)\n .map((agent) => agent.resultPreview)\n .find((value): value is string => Boolean(value));\n if (fallback) {\n lines.push('', 'Result', ` ${shorten(fallback, 280)}`);\n }\n }\n\n const errors = snapshot.agents.filter((agent) => agent.status === 'error' || agent.error);\n if (errors.length > 0) {\n lines.push('', 'Errors');\n for (const agent of errors.slice(0, options.maxErrors ?? 5)) {\n lines.push(\n ` ✗ #${agent.id} ${shorten(agent.label, 32)}${\n agent.error ? `: ${shorten(agent.error, 120)}` : ''\n }`,\n );\n }\n }\n\n const recent = recentCompletedAgents(snapshot).slice(0, options.maxRecentAgents ?? 5);\n if (recent.length > 0) {\n lines.push('', 'Completed');\n for (const agent of recent) {\n lines.push(renderRecentAgentLine(agent));\n }\n }\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n\nfunction countAgents(agents: WorkflowAgentSnapshot[]) {\n let done = 0;\n let running = 0;\n let error = 0;\n let skipped = 0;\n for (const a of agents) {\n if (a.status === 'done') done++;\n else if (a.status === 'running') running++;\n else if (a.status === 'error') error++;\n else if (a.status === 'skipped') skipped++;\n }\n return { done, running, error, skipped };\n}\n\nfunction statusIcon(status: WorkflowAgentStatus): string {\n switch (status) {\n case 'queued':\n return '○';\n case 'running':\n return '●';\n case 'done':\n return '✓';\n case 'error':\n return '✗';\n case 'skipped':\n return '-';\n }\n}\n\nfunction statusText(status: WorkflowPanelStatus): string {\n switch (status) {\n case 'queued':\n return 'queued';\n case 'running':\n return 'running';\n case 'succeeded':\n return '✓ completed';\n case 'failed':\n return '✗ failed';\n case 'cancelled':\n return 'cancelled';\n case 'timeout':\n return 'timeout';\n default:\n return String(status || 'running');\n }\n}\n\nfunction inferPanelStatus(snapshot: WorkflowSnapshot): WorkflowPanelStatus {\n if (snapshot.errorCount > 0) return 'failed';\n if (snapshot.runningCount > 0) return 'running';\n if (snapshot.doneCount + snapshot.skippedCount >= snapshot.agentCount && snapshot.agentCount > 0) {\n return 'succeeded';\n }\n return 'queued';\n}\n\nfunction formatRunCounts(snapshot: WorkflowSnapshot): string {\n const parts = [`${snapshot.doneCount}/${snapshot.agentCount} done`];\n if (snapshot.runningCount > 0) parts.push(`${snapshot.runningCount} running`);\n if (snapshot.errorCount > 0) parts.push(`${snapshot.errorCount} errors`);\n if (snapshot.skippedCount > 0) parts.push(`${snapshot.skippedCount} skipped`);\n return parts.join(' · ');\n}\n\nfunction resolveElapsedMs(snapshot: WorkflowSnapshot, nowMs = Date.now()): number | undefined {\n if (snapshot.durationMs != null) return snapshot.durationMs;\n const starts = snapshot.agents\n .map((agent) => agent.startedAtMs)\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n if (starts.length === 0) return undefined;\n return Math.max(0, nowMs - Math.min(...starts));\n}\n\nfunction formatDuration(ms: number | undefined): string {\n if (ms == null || !Number.isFinite(ms)) return '';\n const totalSeconds = Math.max(0, Math.floor(ms / 1000));\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes < 60) return `${minutes}:${String(seconds).padStart(2, '0')}`;\n const hours = Math.floor(minutes / 60);\n const restMinutes = minutes % 60;\n return `${hours}:${String(restMinutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n}\n\nfunction renderPanelPhaseLines(snapshot: WorkflowSnapshot): string[] {\n const phaseNames = uniqueOrdered([\n ...snapshot.phases,\n ...(snapshot.currentPhase ? [snapshot.currentPhase] : []),\n ...snapshot.agents.map((a) => a.phase).filter((p): p is string => Boolean(p)),\n ]);\n const out: string[] = [];\n for (const phase of phaseNames) {\n const agents = snapshot.agents.filter((agent) => agent.phase === phase);\n const counts = countAgents(agents);\n const complete = agents.length > 0 && counts.done + counts.error + counts.skipped === agents.length;\n const marker =\n counts.running > 0 || (!complete && snapshot.currentPhase === phase)\n ? '▶'\n : complete\n ? '✓'\n : '○';\n const tail = [\n counts.running > 0 ? `${counts.running} running` : '',\n counts.error > 0 ? `${counts.error} errors` : '',\n counts.skipped > 0 ? `${counts.skipped} skipped` : '',\n ].filter(Boolean).join(' · ');\n out.push(` ${marker} ${phase} ${counts.done}/${agents.length}${tail ? ` · ${tail}` : ''}`);\n }\n return out;\n}\n\nfunction renderActiveAgentLines(agent: WorkflowAgentSnapshot): string[] {\n const step = agent.currentStep || latestStepSummary(agent);\n const iteration =\n agent.iteration != null && agent.maxIterations != null\n ? ` [${agent.iteration}/${agent.maxIterations}]`\n : '';\n const head = ` ${agent.status === 'running' ? '●' : '○'} #${agent.id} ${shorten(agent.label, 32)}${iteration}`;\n return step ? [head, ` ${shorten(step, 96)}`] : [head];\n}\n\nfunction renderRecentAgentLine(agent: WorkflowAgentSnapshot): string {\n const preview = agent.error || agent.resultPreview || latestStepResult(agent);\n return ` ${statusIcon(agent.status)} #${agent.id} ${shorten(agent.label, 32)}${\n preview ? ` — ${shorten(preview, 96)}` : ''\n }`;\n}\n\nfunction recentCompletedAgents(snapshot: WorkflowSnapshot): WorkflowAgentSnapshot[] {\n return [...snapshot.agents]\n .filter((agent) => agent.status === 'done' || agent.status === 'error' || agent.status === 'skipped')\n .reverse();\n}\n\nfunction latestStepSummary(agent: WorkflowAgentSnapshot): string {\n const step =\n [...(agent.steps ?? [])].reverse().find((entry) => entry.status === 'running') ??\n agent.steps?.[agent.steps.length - 1];\n if (!step) return '';\n return step.detail ? `${step.label}: ${step.detail}` : step.label;\n}\n\nfunction latestStepResult(agent: WorkflowAgentSnapshot): string {\n const step = [...(agent.steps ?? [])].reverse().find((entry) => entry.resultPreview || entry.error);\n return step?.error || step?.resultPreview || '';\n}\n\nfunction stateSuffix(snapshot: WorkflowSnapshot): string {\n if (snapshot.errorCount > 0) return `, ${snapshot.errorCount} errors`;\n if (snapshot.skippedCount > 0) return `, ${snapshot.skippedCount} skipped`;\n if (snapshot.runningCount > 0) return `, ${snapshot.runningCount} running`;\n return '';\n}\n\nfunction uniqueOrdered(values: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const v of values) {\n if (!seen.has(v)) {\n seen.add(v);\n out.push(v);\n }\n }\n return out;\n}\n\nfunction shorten(value: string, max: number): string {\n const text = value.replace(/\\s+/g, ' ').trim();\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"snapshot.js","names":[],"sources":["../../../../src/agent/workflow/snapshot.ts"],"sourcesContent":["/**\n * Workflow progress snapshot model + text renderers.\n *\n * The runtime emits per-event callbacks (`onPhase`, `onAgentStart`, `onAgentEnd`,\n * `onLog`). The workflow tool wraps those callbacks to mutate a snapshot and push\n * a text rendering through `onUpdate` — keeping TUI / Gateway / IM consumers in\n * lock-step from a single source of truth.\n */\n\nimport type {\n WorkflowAgentSnapshot,\n WorkflowAgentStatus,\n WorkflowSnapshotDefinition,\n WorkflowSnapshot,\n} from './types.js';\nimport { emptySnapshotFor } from './snapshot-empty.js';\n\nexport function createWorkflowSnapshot(definition: WorkflowSnapshotDefinition): WorkflowSnapshot {\n return emptySnapshotFor(\n definition.name,\n definition.description,\n definition.phases?.map((phase) => phase.title),\n );\n}\n\nexport function recomputeCounts(snapshot: WorkflowSnapshot): void {\n let running = 0;\n let done = 0;\n let error = 0;\n let skipped = 0;\n for (const agent of snapshot.agents) {\n switch (agent.status) {\n case 'running':\n running++;\n break;\n case 'done':\n done++;\n break;\n case 'error':\n error++;\n break;\n case 'skipped':\n skipped++;\n break;\n }\n }\n snapshot.agentCount = snapshot.agents.length;\n snapshot.runningCount = running;\n snapshot.doneCount = done;\n snapshot.errorCount = error;\n snapshot.skippedCount = skipped;\n}\n\nexport interface RenderOptions {\n maxAgentsPerPhase?: number;\n maxLogs?: number;\n showResultPreviews?: boolean;\n}\n\nexport type WorkflowPanelStatus =\n | 'queued'\n | 'running'\n | 'succeeded'\n | 'failed'\n | 'cancelled'\n | 'timeout'\n | string;\n\nexport interface WorkflowPanelOptions {\n status?: WorkflowPanelStatus;\n maxActiveAgents?: number;\n maxRecentAgents?: number;\n maxErrors?: number;\n nowMs?: number;\n}\n\nexport function renderWorkflowText(\n snapshot: WorkflowSnapshot,\n completed = false,\n options: RenderOptions = {},\n): string {\n const maxAgentsPerPhase = options.maxAgentsPerPhase ?? 6;\n const maxLogs = options.maxLogs ?? 2;\n const showPreviews = options.showResultPreviews ?? false;\n\n const state = stateSuffix(snapshot);\n const header = completed\n ? `◆ workflow ✓ ${snapshot.name} (${snapshot.doneCount}/${snapshot.agentCount} done${state})`\n : `◆ workflow: ${snapshot.name} (${snapshot.doneCount}/${snapshot.agentCount} done${state})`;\n const lines = [header];\n\n const phaseNames = uniqueOrdered([\n ...snapshot.phases,\n ...(snapshot.currentPhase ? [snapshot.currentPhase] : []),\n ...snapshot.agents.map((a) => a.phase).filter((p): p is string => Boolean(p)),\n ]);\n const rendered = new Set<WorkflowAgentSnapshot>();\n\n for (const phase of phaseNames) {\n const agents = snapshot.agents.filter((a) => a.phase === phase);\n if (agents.length === 0 && snapshot.currentPhase !== phase) continue;\n for (const a of agents) rendered.add(a);\n\n const counts = countAgents(agents);\n const completeHere = agents.length > 0 && counts.done + counts.error + counts.skipped === agents.length;\n const marker =\n counts.running > 0 || (!completeHere && snapshot.currentPhase === phase)\n ? '▶'\n : completeHere\n ? '✓'\n : ' ';\n\n const tail =\n (counts.running ? ` · ${counts.running} running` : '') +\n (counts.error ? ` · ${counts.error} errors` : '') +\n (counts.skipped ? ` · ${counts.skipped} skipped` : '');\n lines.push(` ${marker} ${phase} ${counts.done}/${agents.length}${tail}`);\n\n const visible = agents.slice(-maxAgentsPerPhase);\n for (const agent of visible) {\n const previewText = showPreviews && agent.resultPreview ? ` — ${agent.resultPreview}` : '';\n lines.push(\n ` #${agent.id} ${statusIcon(agent.status)} ${shorten(agent.label, 56)}${previewText}`,\n );\n }\n if (agents.length > visible.length) {\n lines.push(` … ${agents.length - visible.length} earlier agents`);\n }\n }\n\n const unphased = snapshot.agents.filter((a) => !rendered.has(a));\n if (unphased.length > 0) {\n lines.push(' unphased');\n for (const agent of unphased.slice(-maxAgentsPerPhase)) {\n const previewText = showPreviews && agent.resultPreview ? ` — ${agent.resultPreview}` : '';\n lines.push(\n ` #${agent.id} ${statusIcon(agent.status)} ${shorten(agent.label, 56)}${previewText}`,\n );\n }\n }\n\n const visibleLogs = snapshot.logs.slice(-maxLogs);\n if (visibleLogs.length > 0) {\n lines.push('');\n for (const log of visibleLogs) {\n lines.push(` log: ${shorten(log, 80)}`);\n }\n }\n return lines.join('\\n');\n}\n\nexport function previewValue(value: unknown, max = 80): string {\n if (value === null || value === undefined) return '';\n const text = typeof value === 'string' ? value : safeStringify(value);\n if (!text) return '';\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nexport function renderWorkflowPanel(\n snapshot: WorkflowSnapshot,\n options: WorkflowPanelOptions = {},\n): string {\n const status = options.status ?? inferPanelStatus(snapshot);\n const activeAgents = snapshot.agents.filter((agent) => agent.status === 'running');\n const queuedAgents = snapshot.agents.filter((agent) => agent.status === 'queued');\n const activeLimit = options.maxActiveAgents ?? 4;\n const recentLimit = options.maxRecentAgents ?? 4;\n const durationText = formatDuration(resolveElapsedMs(snapshot, options.nowMs));\n const counts = formatRunCounts(snapshot);\n\n const lines = [\n `◆ ${snapshot.name} ${statusText(status)} ${counts}${durationText ? ` ${durationText}` : ''}`,\n ];\n\n const phaseLines = renderPanelPhaseLines(snapshot);\n if (phaseLines.length > 0) {\n lines.push('', 'Phase', ...phaseLines);\n }\n\n const visibleActive = activeAgents.length > 0 ? activeAgents : queuedAgents;\n if (visibleActive.length > 0) {\n lines.push('', activeAgents.length > 0 ? 'Active' : 'Queued');\n for (const agent of visibleActive.slice(0, activeLimit)) {\n lines.push(...renderActiveAgentLines(agent));\n }\n if (visibleActive.length > activeLimit) {\n lines.push(` … ${visibleActive.length - activeLimit} more`);\n }\n }\n\n const recent = recentCompletedAgents(snapshot).slice(0, recentLimit);\n if (recent.length > 0) {\n lines.push('', 'Recent');\n for (const agent of recent) {\n lines.push(renderRecentAgentLine(agent));\n }\n }\n\n const errors = snapshot.agents.filter((agent) => agent.status === 'error' || agent.error);\n if (errors.length > 0) {\n lines.push('', 'Errors');\n for (const agent of errors.slice(0, options.maxErrors ?? 3)) {\n lines.push(\n ` ✗ #${agent.id} ${shorten(agent.label, 28)}${\n agent.error ? `: ${shorten(agent.error, 96)}` : ''\n }`,\n );\n }\n if (errors.length > (options.maxErrors ?? 3)) {\n lines.push(` … ${errors.length - (options.maxErrors ?? 3)} more`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function renderWorkflowFinalSummary(\n snapshot: WorkflowSnapshot,\n options: WorkflowPanelOptions = {},\n): string {\n const status = options.status ?? inferPanelStatus(snapshot);\n const durationText = formatDuration(resolveElapsedMs(snapshot, options.nowMs));\n const lines = [\n `◆ ${snapshot.name} ${statusText(status)} ${formatRunCounts(snapshot)}${durationText ? ` ${durationText}` : ''}`,\n ];\n\n const result = previewValue(snapshot.result, 280);\n if (result) {\n lines.push('', 'Result', ` ${result}`);\n } else {\n const fallback = recentCompletedAgents(snapshot)\n .map((agent) => agent.resultPreview)\n .find((value): value is string => Boolean(value));\n if (fallback) {\n lines.push('', 'Result', ` ${shorten(fallback, 280)}`);\n }\n }\n\n const errors = snapshot.agents.filter((agent) => agent.status === 'error' || agent.error);\n if (errors.length > 0) {\n lines.push('', 'Errors');\n for (const agent of errors.slice(0, options.maxErrors ?? 5)) {\n lines.push(\n ` ✗ #${agent.id} ${shorten(agent.label, 32)}${\n agent.error ? `: ${shorten(agent.error, 120)}` : ''\n }`,\n );\n }\n }\n\n const recent = recentCompletedAgents(snapshot).slice(0, options.maxRecentAgents ?? 5);\n if (recent.length > 0) {\n lines.push('', 'Completed');\n for (const agent of recent) {\n lines.push(renderRecentAgentLine(agent));\n }\n }\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n\nfunction countAgents(agents: WorkflowAgentSnapshot[]) {\n let done = 0;\n let running = 0;\n let error = 0;\n let skipped = 0;\n for (const a of agents) {\n if (a.status === 'done') done++;\n else if (a.status === 'running') running++;\n else if (a.status === 'error') error++;\n else if (a.status === 'skipped') skipped++;\n }\n return { done, running, error, skipped };\n}\n\nfunction statusIcon(status: WorkflowAgentStatus): string {\n switch (status) {\n case 'queued':\n return '○';\n case 'running':\n return '●';\n case 'done':\n return '✓';\n case 'error':\n return '✗';\n case 'skipped':\n return '-';\n }\n}\n\nfunction statusText(status: WorkflowPanelStatus): string {\n switch (status) {\n case 'queued':\n return 'queued';\n case 'running':\n return 'running';\n case 'succeeded':\n return '✓ completed';\n case 'failed':\n return '✗ failed';\n case 'cancelled':\n return 'cancelled';\n case 'timeout':\n return 'timeout';\n default:\n return String(status || 'running');\n }\n}\n\nfunction inferPanelStatus(snapshot: WorkflowSnapshot): WorkflowPanelStatus {\n if (snapshot.errorCount > 0) return 'failed';\n if (snapshot.runningCount > 0) return 'running';\n if (snapshot.doneCount + snapshot.skippedCount >= snapshot.agentCount && snapshot.agentCount > 0) {\n return 'succeeded';\n }\n return 'queued';\n}\n\nfunction formatRunCounts(snapshot: WorkflowSnapshot): string {\n const parts = [`${snapshot.doneCount}/${snapshot.agentCount} done`];\n if (snapshot.runningCount > 0) parts.push(`${snapshot.runningCount} running`);\n if (snapshot.errorCount > 0) parts.push(`${snapshot.errorCount} errors`);\n if (snapshot.skippedCount > 0) parts.push(`${snapshot.skippedCount} skipped`);\n return parts.join(' · ');\n}\n\nfunction resolveElapsedMs(snapshot: WorkflowSnapshot, nowMs = Date.now()): number | undefined {\n if (snapshot.durationMs != null) return snapshot.durationMs;\n const starts = snapshot.agents\n .map((agent) => agent.startedAtMs)\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n if (starts.length === 0) return undefined;\n return Math.max(0, nowMs - Math.min(...starts));\n}\n\nfunction formatDuration(ms: number | undefined): string {\n if (ms == null || !Number.isFinite(ms)) return '';\n const totalSeconds = Math.max(0, Math.floor(ms / 1000));\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes < 60) return `${minutes}:${String(seconds).padStart(2, '0')}`;\n const hours = Math.floor(minutes / 60);\n const restMinutes = minutes % 60;\n return `${hours}:${String(restMinutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n}\n\nfunction renderPanelPhaseLines(snapshot: WorkflowSnapshot): string[] {\n const phaseNames = uniqueOrdered([\n ...snapshot.phases,\n ...(snapshot.currentPhase ? [snapshot.currentPhase] : []),\n ...snapshot.agents.map((a) => a.phase).filter((p): p is string => Boolean(p)),\n ]);\n const out: string[] = [];\n for (const phase of phaseNames) {\n const agents = snapshot.agents.filter((agent) => agent.phase === phase);\n const counts = countAgents(agents);\n const complete = agents.length > 0 && counts.done + counts.error + counts.skipped === agents.length;\n const marker =\n counts.running > 0 || (!complete && snapshot.currentPhase === phase)\n ? '▶'\n : complete\n ? '✓'\n : '○';\n const tail = [\n counts.running > 0 ? `${counts.running} running` : '',\n counts.error > 0 ? `${counts.error} errors` : '',\n counts.skipped > 0 ? `${counts.skipped} skipped` : '',\n ].filter(Boolean).join(' · ');\n out.push(` ${marker} ${phase} ${counts.done}/${agents.length}${tail ? ` · ${tail}` : ''}`);\n }\n return out;\n}\n\nfunction renderActiveAgentLines(agent: WorkflowAgentSnapshot): string[] {\n const step = agent.currentStep || latestStepSummary(agent);\n const iteration =\n agent.iteration != null && agent.maxIterations != null\n ? ` [${agent.iteration}/${agent.maxIterations}]`\n : '';\n const head = ` ${agent.status === 'running' ? '●' : '○'} #${agent.id} ${shorten(agent.label, 32)}${iteration}`;\n return step ? [head, ` ${shorten(step, 96)}`] : [head];\n}\n\nfunction renderRecentAgentLine(agent: WorkflowAgentSnapshot): string {\n const preview = agent.error || agent.resultPreview || latestStepResult(agent);\n return ` ${statusIcon(agent.status)} #${agent.id} ${shorten(agent.label, 32)}${\n preview ? ` — ${shorten(preview, 96)}` : ''\n }`;\n}\n\nfunction recentCompletedAgents(snapshot: WorkflowSnapshot): WorkflowAgentSnapshot[] {\n return [...snapshot.agents]\n .filter((agent) => agent.status === 'done' || agent.status === 'error' || agent.status === 'skipped')\n .reverse();\n}\n\nfunction latestStepSummary(agent: WorkflowAgentSnapshot): string {\n const step =\n [...(agent.steps ?? [])].reverse().find((entry) => entry.status === 'running') ??\n agent.steps?.[agent.steps.length - 1];\n if (!step) return '';\n return step.detail ? `${step.label}: ${step.detail}` : step.label;\n}\n\nfunction latestStepResult(agent: WorkflowAgentSnapshot): string {\n const step = [...(agent.steps ?? [])].reverse().find((entry) => entry.resultPreview || entry.error);\n return step?.error || step?.resultPreview || '';\n}\n\nfunction stateSuffix(snapshot: WorkflowSnapshot): string {\n if (snapshot.errorCount > 0) return `, ${snapshot.errorCount} errors`;\n if (snapshot.skippedCount > 0) return `, ${snapshot.skippedCount} skipped`;\n if (snapshot.runningCount > 0) return `, ${snapshot.runningCount} running`;\n return '';\n}\n\nfunction uniqueOrdered(values: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const v of values) {\n if (!seen.has(v)) {\n seen.add(v);\n out.push(v);\n }\n }\n return out;\n}\n\nfunction shorten(value: string, max: number): string {\n const text = value.replace(/\\s+/g, ' ').trim();\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * `structured_output` — terminating tool used to capture a subagent's final result.
3
3
  *
4
- * Injected into a subagent's toolset only when the workflow script asked for
5
- * structured output via `agent(prompt, { schema })`. The subagent is instructed
4
+ * Injected into a workflow agent node only when its output schema requires
5
+ * structured data. The subagent is instructed
6
6
  * to invoke this tool exactly once with its final result; the tool sets
7
7
  * `terminate: true` so the agent loop stops without paying for an extra
8
8
  * assistant turn.
@@ -3,8 +3,8 @@ import Ajv from "ajv";
3
3
  /**
4
4
  * `structured_output` — terminating tool used to capture a subagent's final result.
5
5
  *
6
- * Injected into a subagent's toolset only when the workflow script asked for
7
- * structured output via `agent(prompt, { schema })`. The subagent is instructed
6
+ * Injected into a workflow agent node only when its output schema requires
7
+ * structured data. The subagent is instructed
8
8
  * to invoke this tool exactly once with its final result; the tool sets
9
9
  * `terminate: true` so the agent loop stops without paying for an extra
10
10
  * assistant turn.