@xopcai/xopc 0.0.142 → 0.0.143

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (543) hide show
  1. package/README.md +1 -1
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/activity-center-store-jITiX2vJ.js +1 -0
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BawPxiu5.js → agent-avatar-dicebear-DiME9u_P.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-DzBXhZXO.js +2 -0
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-81xd1p9R.js → app-management-settings-panel-Cuo7SbUP.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-DYeQsYU8.js → appearance-settings-DUfdNQqk.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-CKuKK5AU.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-D_oa7oti.js → archive-plugin-B-Qk6cGr.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-Cd-bwI2N.js → attachment-load-Di6EEbQX.js} +1 -1
  12. package/dist/gateway/static/root/assets/automation-suggestion-card-DGxvRxtO.js +1 -0
  13. package/dist/gateway/static/root/assets/automations-page-D-FF_WKV.js +4 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-O8svLKWw.js → binary-plugins-ZaOZDH2I.js} +1 -1
  15. package/dist/gateway/static/root/assets/block-editor-BTFhjWfg.js +184 -0
  16. package/dist/gateway/static/root/assets/browser-settings-page-BvKLdEQt.js +8 -0
  17. package/dist/gateway/static/root/assets/{capability-presets-api-dJy1Eqgx.js → capability-presets-api-BU-pVZiZ.js} +1 -1
  18. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DgyeEwzh.js +2 -0
  19. package/dist/gateway/static/root/assets/{channel-recipient-api-Bfuhp2ty.js → channel-recipient-api-DuulnhIj.js} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-BbVsdD_I.js +1 -0
  21. package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +1 -0
  22. package/dist/gateway/static/root/assets/check-BODqo66o.js +1 -0
  23. package/dist/gateway/static/root/assets/chunk-QUQL4437-DXsxWP7r.js +4 -0
  24. package/dist/gateway/static/root/assets/circle-alert-RzVebuX2.js +1 -0
  25. package/dist/gateway/static/root/assets/connectors-page-B8QqVy3I.js +2 -0
  26. package/dist/gateway/static/root/assets/{desktop-pet-DFMfIb5F.js → desktop-pet---yzVxVR.js} +1 -1
  27. package/dist/gateway/static/root/assets/desktop-pet-settings-Dc3gqBJE.js +1 -0
  28. package/dist/gateway/static/root/assets/{directory-picker-path-field-BrYt1gAr.js → directory-picker-path-field-DCmOGLtK.js} +1 -1
  29. package/dist/gateway/static/root/assets/dreaming-settings-BgT5KZVe.js +3 -0
  30. package/dist/gateway/static/root/assets/{extension-debug-page-Bh630pLD.js → extension-debug-page-ByaKTTq4.js} +1 -1
  31. package/dist/gateway/static/root/assets/extension-page-BmRzHAZr.js +1 -0
  32. package/dist/gateway/static/root/assets/extension-settings-page-JUtwIhbF.js +1 -0
  33. package/dist/gateway/static/root/assets/{fetch-B1WtuprY.js → fetch-8QNN25Sh.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-config-api-De2N821l.js → gateway-config-api-CxicF50_.js} +1 -1
  35. package/dist/gateway/static/root/assets/gateway-settings-Bz2I_EO5.js +1 -0
  36. package/dist/gateway/static/root/assets/{gateway-startup-retry-nEujFSDj.js → gateway-startup-retry-5YBnS9Fj.js} +1 -1
  37. package/dist/gateway/static/root/assets/goal-create-dialog-VcoyuZGN.js +1 -0
  38. package/dist/gateway/static/root/assets/goal-detail-page-Cilkap2G.js +4 -0
  39. package/dist/gateway/static/root/assets/{goals-config-api-DUy3eEse.js → goals-config-api-CwcHRdC0.js} +1 -1
  40. package/dist/gateway/static/root/assets/goals-page-C6eoni4z.js +2 -0
  41. package/dist/gateway/static/root/assets/goals-settings-o4i-qAOS.js +1 -0
  42. package/dist/gateway/static/root/assets/heartbeat-settings-DQQkETX8.js +1 -0
  43. package/dist/gateway/static/root/assets/index-BKRqeRHm.js +257 -0
  44. package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
  45. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CVIwwM15.js → keyboard-shortcuts-settings-LT6qB-ua.js} +1 -1
  46. package/dist/gateway/static/root/assets/logs-page-Dli2e3fS.js +7 -0
  47. package/dist/gateway/static/root/assets/{markdown-split-B_6us9j7.js → markdown-split-Dw-yE2-y.js} +1 -1
  48. package/dist/gateway/static/root/assets/{media-plugins-D_fryIyj.js → media-plugins-D9NNNUgE.js} +1 -1
  49. package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
  50. package/dist/gateway/static/root/assets/models-hub-panel-DVn2Q1Ik.js +2 -0
  51. package/dist/gateway/static/root/assets/notes-page-CRgbJGgk.js +1 -0
  52. package/dist/gateway/static/root/assets/notes-workbench-BxZRHLWx.js +2 -0
  53. package/dist/gateway/static/root/assets/{page-tabs-D_8jGlqx.js → page-tabs-D4hkWVt_.js} +1 -1
  54. package/dist/gateway/static/root/assets/{preview-open-alternatives-BBLMK8Mp.js → preview-open-alternatives-CIckv0uy.js} +1 -1
  55. package/dist/gateway/static/root/assets/project-detail-page-Doz53xLn.js +1 -0
  56. package/dist/gateway/static/root/assets/projects-page-DoMtcRLg.js +1 -0
  57. package/dist/gateway/static/root/assets/remote-access-hub-BeHVEgrm.js +1 -0
  58. package/dist/gateway/static/root/assets/{save-bar-controls-DVS3FR5r.js → save-bar-controls-B0b42kB2.js} +1 -1
  59. package/dist/gateway/static/root/assets/{schedule-field-D6vKd6-T.js → schedule-field-BtjEkczK.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schema-form-BPy4lbIh.js → schema-form-Bf0bk3i6.js} +1 -1
  61. package/dist/gateway/static/root/assets/sessions-page-Bk4bQsBe.js +1 -0
  62. package/dist/gateway/static/root/assets/settings-advanced-gate-DdFyaRMm.js +1 -0
  63. package/dist/gateway/static/root/assets/{settings-collapsible-section-WzdikxPt.js → settings-collapsible-section-BTKTdTNX.js} +1 -1
  64. package/dist/gateway/static/root/assets/{settings-form-section-CvfzhBV-.js → settings-form-section-DL4P0sAj.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BxR-Ulhi.js → settings-loading-skeleton-BV6KFNj4.js} +1 -1
  66. package/dist/gateway/static/root/assets/settings-page-B_4DsX5W.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-page-layout-CKefvbYi.js → settings-page-layout-CyGlrInB.js} +1 -1
  68. package/dist/gateway/static/root/assets/setup-status-panel-DJ1_MLgX.js +1 -0
  69. package/dist/gateway/static/root/assets/share-preview-page-BQBV7YrV.js +2 -0
  70. package/dist/gateway/static/root/assets/shares-settings-0VuFLBeU.js +1 -0
  71. package/dist/gateway/static/root/assets/skill-reload-api-DO87Ckeo.js +1 -0
  72. package/dist/gateway/static/root/assets/skills-page-D3VdtxAn.js +2 -0
  73. package/dist/gateway/static/root/assets/{system-settings-panel-BokgAgf7.js → system-settings-panel-D85fBBuI.js} +1 -1
  74. package/dist/gateway/static/root/assets/{typed-models-lib-BwHlNL3L.js → typed-models-lib-CwEuYrHX.js} +1 -1
  75. package/dist/gateway/static/root/assets/{use-channel-catalog-DR11ap3A.js → use-channel-catalog-COXIfXcl.js} +1 -1
  76. package/dist/gateway/static/root/assets/user-context-page-m9JVQ73F.js +1 -0
  77. package/dist/gateway/static/root/assets/user-profile-fields-editor-DtQiuY7E.js +1 -0
  78. package/dist/gateway/static/root/assets/user-profile-settings-panel-CWM0fEpb.js +1 -0
  79. package/dist/gateway/static/root/assets/{utils-BKUWB-TT.js → utils--BO6xT3u.js} +1 -1
  80. package/dist/gateway/static/root/assets/voice-api-key-field-LoT3wgZ9.js +1 -0
  81. package/dist/gateway/static/root/assets/with-selector-aYPsXwdl.js +1 -0
  82. package/dist/gateway/static/root/assets/work-item-detail-page-DSTMz_mO.js +1 -0
  83. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CL_rnAUB.js → workflow-run-setup-panel-B35lJzvm.js} +2 -2
  84. package/dist/gateway/static/root/assets/workflows-page-BfSm9oR8.js +11 -0
  85. package/dist/gateway/static/root/assets/workflows-page-DLioOiRN.css +1 -0
  86. package/dist/gateway/static/root/connector-icons/README.md +11 -0
  87. package/dist/gateway/static/root/connector-icons/airtable.svg +13 -0
  88. package/dist/gateway/static/root/connector-icons/asana.svg +15 -0
  89. package/dist/gateway/static/root/connector-icons/brave-search.svg +1 -0
  90. package/dist/gateway/static/root/connector-icons/clickup.svg +19 -0
  91. package/dist/gateway/static/root/connector-icons/composio.svg +266 -0
  92. package/dist/gateway/static/root/connector-icons/discord.svg +15 -0
  93. package/dist/gateway/static/root/connector-icons/dropbox.svg +152 -0
  94. package/dist/gateway/static/root/connector-icons/excel.svg +56 -0
  95. package/dist/gateway/static/root/connector-icons/fetch.svg +6 -0
  96. package/dist/gateway/static/root/connector-icons/figma.svg +178 -0
  97. package/dist/gateway/static/root/connector-icons/filesystem.svg +6 -0
  98. package/dist/gateway/static/root/connector-icons/github.svg +10 -0
  99. package/dist/gateway/static/root/connector-icons/gmail.svg +3 -0
  100. package/dist/gateway/static/root/connector-icons/google-calendar.svg +3 -0
  101. package/dist/gateway/static/root/connector-icons/google-docs.svg +25 -0
  102. package/dist/gateway/static/root/connector-icons/google-drive.svg +25 -0
  103. package/dist/gateway/static/root/connector-icons/google-sheets.svg +1 -0
  104. package/dist/gateway/static/root/connector-icons/hubspot.svg +142 -0
  105. package/dist/gateway/static/root/connector-icons/jira.svg +15 -0
  106. package/dist/gateway/static/root/connector-icons/linear.svg +5 -0
  107. package/dist/gateway/static/root/connector-icons/memory.svg +5 -0
  108. package/dist/gateway/static/root/connector-icons/microsoft-teams.svg +33 -0
  109. package/dist/gateway/static/root/connector-icons/notion.svg +5 -0
  110. package/dist/gateway/static/root/connector-icons/one-drive.svg +13 -0
  111. package/dist/gateway/static/root/connector-icons/outlook.svg +76 -0
  112. package/dist/gateway/static/root/connector-icons/playwright.svg +9 -0
  113. package/dist/gateway/static/root/connector-icons/salesforce.svg +17 -0
  114. package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +8 -0
  115. package/dist/gateway/static/root/connector-icons/shopify.svg +5 -0
  116. package/dist/gateway/static/root/connector-icons/slack.svg +9 -0
  117. package/dist/gateway/static/root/connector-icons/spotify.svg +43 -0
  118. package/dist/gateway/static/root/connector-icons/stripe.svg +11 -0
  119. package/dist/gateway/static/root/connector-icons/telegram.svg +130 -0
  120. package/dist/gateway/static/root/connector-icons/time.svg +6 -0
  121. package/dist/gateway/static/root/connector-icons/todoist.svg +277 -0
  122. package/dist/gateway/static/root/connector-icons/trello.svg +19 -0
  123. package/dist/gateway/static/root/connector-icons/twitter.svg +128 -0
  124. package/dist/gateway/static/root/connector-icons/whatsapp.svg +61 -0
  125. package/dist/gateway/static/root/connector-icons/youtube.svg +11 -0
  126. package/dist/gateway/static/root/index.html +9 -6
  127. package/dist/package.js +1 -1
  128. package/dist/src/agent/agent-manager.d.ts +2 -0
  129. package/dist/src/agent/agent-manager.js +8 -0
  130. package/dist/src/agent/agent-manager.js.map +1 -1
  131. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  132. package/dist/src/agent/background-review/prompts.js +3 -2
  133. package/dist/src/agent/background-review/prompts.js.map +1 -1
  134. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  135. package/dist/src/agent/embedded/xopc-tools-bridge.d.ts +9 -0
  136. package/dist/src/agent/embedded/xopc-tools-bridge.js +71 -3
  137. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
  138. package/dist/src/agent/goals/post-turn.js +5 -4
  139. package/dist/src/agent/goals/post-turn.js.map +1 -1
  140. package/dist/src/agent/mcp/mcp-transport.js +4 -1
  141. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  142. package/dist/src/agent/memory/context/planner.d.ts +1 -0
  143. package/dist/src/agent/memory/context/planner.js +60 -14
  144. package/dist/src/agent/memory/context/planner.js.map +1 -1
  145. package/dist/src/agent/memory/context/types.d.ts +3 -1
  146. package/dist/src/agent/memory/lifecycle.d.ts +11 -0
  147. package/dist/src/agent/memory/lifecycle.js +50 -0
  148. package/dist/src/agent/memory/lifecycle.js.map +1 -0
  149. package/dist/src/agent/memory/source-origin.d.ts +3 -0
  150. package/dist/src/agent/memory/source-origin.js +19 -0
  151. package/dist/src/agent/memory/source-origin.js.map +1 -0
  152. package/dist/src/agent/memory/understanding/service.js +5 -0
  153. package/dist/src/agent/memory/understanding/service.js.map +1 -1
  154. package/dist/src/agent/memory/user-context-coordinator.js +7 -2
  155. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
  156. package/dist/src/agent/prompt/sections/behavior.d.ts +2 -0
  157. package/dist/src/agent/prompt/sections/behavior.js +30 -1
  158. package/dist/src/agent/prompt/sections/behavior.js.map +1 -1
  159. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  160. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  161. package/dist/src/agent/prompt/service-prompt-builder.js +8 -1
  162. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  163. package/dist/src/agent/prompt/system-prompt.d.ts +2 -0
  164. package/dist/src/agent/prompt/system-prompt.js +6 -3
  165. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  166. package/dist/src/agent/service/process-direct-streaming.js +22 -0
  167. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  168. package/dist/src/agent/service.d.ts +2 -0
  169. package/dist/src/agent/service.js +9 -3
  170. package/dist/src/agent/service.js.map +1 -1
  171. package/dist/src/agent/starter-agents.js +1 -1
  172. package/dist/src/agent/starter-agents.js.map +1 -1
  173. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
  174. package/dist/src/agent/tool-manuals/xopc-use.js +1 -1
  175. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -1
  176. package/dist/src/agent/tools/composio-tool.d.ts +18 -5
  177. package/dist/src/agent/tools/composio-tool.js +252 -35
  178. package/dist/src/agent/tools/composio-tool.js.map +1 -1
  179. package/dist/src/agent/tools/factory.js +7 -3
  180. package/dist/src/agent/tools/factory.js.map +1 -1
  181. package/dist/src/agent/tools/index.d.ts +1 -1
  182. package/dist/src/agent/tools/index.js +2 -2
  183. package/dist/src/agent/tools/workflow-tool.d.ts +0 -1
  184. package/dist/src/agent/tools/workflow-tool.js +3 -16
  185. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  186. package/dist/src/agent/workflow/builtins/index.d.ts +2 -28
  187. package/dist/src/agent/workflow/builtins/index.js +226 -41
  188. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  189. package/dist/src/agent/workflow/catalog.d.ts +32 -34
  190. package/dist/src/agent/workflow/catalog.js +158 -154
  191. package/dist/src/agent/workflow/catalog.js.map +1 -1
  192. package/dist/src/agent/workflow/index.d.ts +4 -6
  193. package/dist/src/agent/workflow/index.js +2 -5
  194. package/dist/src/agent/workflow/snapshot.d.ts +2 -2
  195. package/dist/src/agent/workflow/snapshot.js +2 -2
  196. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  197. package/dist/src/agent/workflow/structured-output-tool.d.ts +2 -2
  198. package/dist/src/agent/workflow/structured-output-tool.js +2 -2
  199. package/dist/src/agent/workflow/structured-output-tool.js.map +1 -1
  200. package/dist/src/agent/workflow/subagent-runner.js +1 -1
  201. package/dist/src/agent/workflow/types.d.ts +31 -26
  202. package/dist/src/agent-manifest/index.d.ts +1 -0
  203. package/dist/src/agent-manifest/index.js +3 -1
  204. package/dist/src/agent-manifest/index.js.map +1 -1
  205. package/dist/src/agent-manifest/preset-chain.d.ts +10 -0
  206. package/dist/src/agent-manifest/preset-chain.js +32 -0
  207. package/dist/src/agent-manifest/preset-chain.js.map +1 -0
  208. package/dist/src/agent-manifest/resolver.js +3 -10
  209. package/dist/src/agent-manifest/resolver.js.map +1 -1
  210. package/dist/src/agent-manifest/schema.d.ts +4 -4
  211. package/dist/src/automations/api/routes.js +13 -1
  212. package/dist/src/automations/api/routes.js.map +1 -1
  213. package/dist/src/automations/domain/validation.d.ts +14 -14
  214. package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
  215. package/dist/src/browser/providers/browser-ext-install.d.ts +11 -1
  216. package/dist/src/browser/providers/browser-ext-install.js +39 -14
  217. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  218. package/dist/src/capabilities/store-connector.d.ts +0 -1
  219. package/dist/src/capabilities/store-connector.js +3 -5
  220. package/dist/src/capabilities/store-connector.js.map +1 -1
  221. package/dist/src/chat-commands/builtins/review.js +72 -73
  222. package/dist/src/chat-commands/builtins/review.js.map +1 -1
  223. package/dist/src/chat-commands/builtins/workflow.js +9 -54
  224. package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
  225. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  226. package/dist/src/cli/commands/extension-create.js +2 -2
  227. package/dist/src/cli/commands/extension-create.js.map +1 -1
  228. package/dist/src/cli/commands/extension-marketplace.js +42 -36
  229. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  230. package/dist/src/cli/commands/extension-pack.d.ts +6 -0
  231. package/dist/src/cli/commands/extension-pack.js +3 -2
  232. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  233. package/dist/src/commands/agents.config.d.ts +1 -0
  234. package/dist/src/commands/agents.config.js +1 -0
  235. package/dist/src/commands/agents.config.js.map +1 -1
  236. package/dist/src/config/schema.d.ts +6 -6
  237. package/dist/src/config/schema.js +6 -22
  238. package/dist/src/config/schema.js.map +1 -1
  239. package/dist/src/config/web-patch.d.ts +1 -1
  240. package/dist/src/connectors/approval.d.ts +2 -0
  241. package/dist/src/connectors/approval.js +33 -0
  242. package/dist/src/connectors/approval.js.map +1 -0
  243. package/dist/src/connectors/auth-provider-registry.d.ts +9 -0
  244. package/dist/src/connectors/auth-provider-registry.js +17 -0
  245. package/dist/src/connectors/auth-provider-registry.js.map +1 -0
  246. package/dist/src/connectors/builtin-catalog.js +55 -116
  247. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  248. package/dist/src/connectors/catalog.js +7 -2
  249. package/dist/src/connectors/catalog.js.map +1 -1
  250. package/dist/src/connectors/composio-catalog.d.ts +19 -0
  251. package/dist/src/connectors/composio-catalog.js +237 -0
  252. package/dist/src/connectors/composio-catalog.js.map +1 -0
  253. package/dist/src/connectors/composio-logo.d.ts +1 -0
  254. package/dist/src/connectors/composio-logo.js +51 -0
  255. package/dist/src/connectors/composio-logo.js.map +1 -0
  256. package/dist/src/connectors/composio-sessions.d.ts +116 -0
  257. package/dist/src/connectors/composio-sessions.js +296 -0
  258. package/dist/src/connectors/composio-sessions.js.map +1 -0
  259. package/dist/src/connectors/composio-triggers.d.ts +17 -0
  260. package/dist/src/connectors/composio-triggers.js +48 -5
  261. package/dist/src/connectors/composio-triggers.js.map +1 -1
  262. package/dist/src/connectors/composio.d.ts +31 -2
  263. package/dist/src/connectors/composio.js +374 -151
  264. package/dist/src/connectors/composio.js.map +1 -1
  265. package/dist/src/connectors/connector-memory-sync.d.ts +15 -0
  266. package/dist/src/connectors/connector-memory-sync.js +90 -0
  267. package/dist/src/connectors/connector-memory-sync.js.map +1 -0
  268. package/dist/src/connectors/install.js +35 -92
  269. package/dist/src/connectors/install.js.map +1 -1
  270. package/dist/src/connectors/instances.js +6 -2
  271. package/dist/src/connectors/instances.js.map +1 -1
  272. package/dist/src/connectors/integration-strategy.d.ts +3 -0
  273. package/dist/src/connectors/integration-strategy.js +29 -0
  274. package/dist/src/connectors/integration-strategy.js.map +1 -0
  275. package/dist/src/connectors/policy.d.ts +13 -0
  276. package/dist/src/connectors/policy.js +48 -0
  277. package/dist/src/connectors/policy.js.map +1 -0
  278. package/dist/src/connectors/providers.js +1 -1
  279. package/dist/src/connectors/runtime-adapter-registry.d.ts +25 -0
  280. package/dist/src/connectors/runtime-adapter-registry.js +154 -0
  281. package/dist/src/connectors/runtime-adapter-registry.js.map +1 -0
  282. package/dist/src/connectors/types.d.ts +113 -4
  283. package/dist/src/connectors/workflow-preflight.d.ts +20 -0
  284. package/dist/src/connectors/workflow-preflight.js +70 -0
  285. package/dist/src/connectors/workflow-preflight.js.map +1 -0
  286. package/dist/src/extensions/install-transaction.d.ts +16 -0
  287. package/dist/src/extensions/install-transaction.js +76 -0
  288. package/dist/src/extensions/install-transaction.js.map +1 -0
  289. package/dist/src/extensions/install.d.ts +2 -0
  290. package/dist/src/extensions/install.js +23 -1
  291. package/dist/src/extensions/install.js.map +1 -1
  292. package/dist/src/gateway/agents-admin.d.ts +2 -0
  293. package/dist/src/gateway/agents-admin.js +7 -0
  294. package/dist/src/gateway/agents-admin.js.map +1 -1
  295. package/dist/src/gateway/capability-presets-admin.d.ts +11 -0
  296. package/dist/src/gateway/capability-presets-admin.js +11 -4
  297. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  298. package/dist/src/gateway/chat-stream/mapper.js +17 -0
  299. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  300. package/dist/src/gateway/chat-stream/protocol.d.ts +18 -1
  301. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -3
  302. package/dist/src/gateway/hono/routes/agents.js +3 -0
  303. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  304. package/dist/src/gateway/hono/routes/capability-presets.js +19 -1
  305. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
  306. package/dist/src/gateway/hono/routes/connectors.js +188 -25
  307. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  308. package/dist/src/gateway/hono/routes/goals.js +22 -3
  309. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  310. package/dist/src/gateway/hono/routes/home.d.ts +60 -1
  311. package/dist/src/gateway/hono/routes/home.js +244 -18
  312. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  313. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  314. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  315. package/dist/src/gateway/hono/routes/memory.js +14 -1
  316. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  317. package/dist/src/gateway/hono/routes/projects.js +103 -2
  318. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  319. package/dist/src/gateway/hono/routes/public-gateway.js +93 -0
  320. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  321. package/dist/src/gateway/hono/routes/workflows.js +137 -22
  322. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  323. package/dist/src/gateway/hono/routes/you.d.ts +23 -0
  324. package/dist/src/gateway/hono/routes/you.js +538 -0
  325. package/dist/src/gateway/hono/routes/you.js.map +1 -0
  326. package/dist/src/gateway/hono/sse.d.ts +2 -1
  327. package/dist/src/gateway/hono/sse.js +2 -1
  328. package/dist/src/gateway/hono/sse.js.map +1 -1
  329. package/dist/src/gateway/service/marketplace-service.d.ts +13 -1
  330. package/dist/src/gateway/service/marketplace-service.js +96 -40
  331. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  332. package/dist/src/gateway/service.d.ts +2 -0
  333. package/dist/src/gateway/service.js +7 -1
  334. package/dist/src/gateway/service.js.map +1 -1
  335. package/dist/src/goals/goal-service.d.ts +7 -5
  336. package/dist/src/goals/goal-service.js +25 -13
  337. package/dist/src/goals/goal-service.js.map +1 -1
  338. package/dist/src/goals/goal-store.js +46 -7
  339. package/dist/src/goals/goal-store.js.map +1 -1
  340. package/dist/src/goals/types.d.ts +24 -0
  341. package/dist/src/storage/sqlite/connector-repository.d.ts +49 -0
  342. package/dist/src/storage/sqlite/connector-repository.js +385 -0
  343. package/dist/src/storage/sqlite/connector-repository.js.map +1 -0
  344. package/dist/src/storage/sqlite/index.d.ts +3 -0
  345. package/dist/src/storage/sqlite/index.js +4 -1
  346. package/dist/src/storage/sqlite/migrations/030_connectors.sql +94 -0
  347. package/dist/src/storage/sqlite/migrations/031_connector_approvals.sql +24 -0
  348. package/dist/src/storage/sqlite/migrations/032_connector_webhook_deliveries.sql +15 -0
  349. package/dist/src/storage/sqlite/migrations/033_user_trust_policies.sql +6 -0
  350. package/dist/src/storage/sqlite/migrations/034_allow_global_auto_trust.sql +14 -0
  351. package/dist/src/storage/sqlite/migrations/035_user_profile_prompt_state.sql +7 -0
  352. package/dist/src/storage/sqlite/migrations/036_goal_outcome_metric.sql +12 -0
  353. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  354. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  355. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  356. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  357. package/dist/src/storage/sqlite/schema.js +1 -1
  358. package/dist/src/storage/sqlite/user-profile-setup-repository.d.ts +3 -0
  359. package/dist/src/storage/sqlite/user-profile-setup-repository.js +34 -0
  360. package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +1 -0
  361. package/dist/src/storage/sqlite/user-trust-repository.d.ts +3 -0
  362. package/dist/src/storage/sqlite/user-trust-repository.js +34 -0
  363. package/dist/src/storage/sqlite/user-trust-repository.js.map +1 -0
  364. package/dist/src/tui/components/assistant-message.js +15 -0
  365. package/dist/src/tui/components/assistant-message.js.map +1 -1
  366. package/dist/src/tui/tui-agent-events.js +85 -1
  367. package/dist/src/tui/tui-agent-events.js.map +1 -1
  368. package/dist/src/tui/tui-command-formatters.js +7 -7
  369. package/dist/src/tui/tui-command-formatters.js.map +1 -1
  370. package/dist/src/tui/tui-commands.js +1 -1
  371. package/dist/src/tui/tui-startup-resources.js +1 -1
  372. package/dist/src/user-context/import.d.ts +12 -0
  373. package/dist/src/user-context/import.js +48 -0
  374. package/dist/src/user-context/import.js.map +1 -0
  375. package/dist/src/user-context/profile.d.ts +37 -0
  376. package/dist/src/user-context/profile.js +165 -0
  377. package/dist/src/user-context/profile.js.map +1 -0
  378. package/dist/src/user-context/projection.d.ts +54 -0
  379. package/dist/src/user-context/projection.js +121 -0
  380. package/dist/src/user-context/projection.js.map +1 -0
  381. package/dist/src/user-context/source-recommendations.d.ts +13 -0
  382. package/dist/src/user-context/source-recommendations.js +86 -0
  383. package/dist/src/user-context/source-recommendations.js.map +1 -0
  384. package/dist/src/user-context/trust-policy.d.ts +11 -0
  385. package/dist/src/user-context/trust-policy.js +31 -0
  386. package/dist/src/user-context/trust-policy.js.map +1 -0
  387. package/dist/src/workflows/authoring/index.d.ts +1 -0
  388. package/dist/src/workflows/authoring/index.js +2 -0
  389. package/dist/src/workflows/authoring/workflow-draft-store.d.ts +33 -0
  390. package/dist/src/workflows/authoring/workflow-draft-store.js +74 -0
  391. package/dist/src/workflows/authoring/workflow-draft-store.js.map +1 -0
  392. package/dist/src/workflows/domain/definition-utils.d.ts +6 -4
  393. package/dist/src/workflows/domain/definition-utils.js +28 -26
  394. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  395. package/dist/src/workflows/domain/definition.d.ts +79 -6
  396. package/dist/src/workflows/domain/event.d.ts +18 -2
  397. package/dist/src/workflows/domain/index.js +3 -3
  398. package/dist/src/workflows/domain/run.d.ts +16 -2
  399. package/dist/src/workflows/domain/run.js.map +1 -1
  400. package/dist/src/workflows/domain/validation.d.ts +9 -5
  401. package/dist/src/workflows/domain/validation.js +183 -40
  402. package/dist/src/workflows/domain/validation.js.map +1 -1
  403. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +2 -3
  404. package/dist/src/workflows/draft/workflow-draft-prompt.js +31 -73
  405. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -1
  406. package/dist/src/workflows/draft/workflow-draft-service.js +4 -8
  407. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -1
  408. package/dist/src/workflows/draft/workflow-draft-validator.js +29 -37
  409. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -1
  410. package/dist/src/workflows/draft/workflow-draft.types.d.ts +4 -4
  411. package/dist/src/workflows/engine/projector.js +43 -1
  412. package/dist/src/workflows/engine/projector.js.map +1 -1
  413. package/dist/src/workflows/engine/workflow-engine.d.ts +2 -3
  414. package/dist/src/workflows/engine/workflow-engine.js +24 -4
  415. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  416. package/dist/src/workflows/index.js +4 -7
  417. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +1 -9
  418. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -1
  419. package/dist/src/workflows/runtime/graph-workflow-runtime.d.ts +10 -0
  420. package/dist/src/workflows/runtime/graph-workflow-runtime.js +295 -0
  421. package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +1 -0
  422. package/dist/src/workflows/runtime/index.d.ts +1 -2
  423. package/dist/src/workflows/runtime/index.js +2 -5
  424. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +5 -8
  425. package/dist/src/workflows/service/workflow-run-service.js +15 -1
  426. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  427. package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -1
  428. package/package.json +4 -3
  429. package/dist/gateway/static/root/assets/agents-CyvCIHnB.js +0 -2
  430. package/dist/gateway/static/root/assets/apps-page-DK_Vx6nl.js +0 -1
  431. package/dist/gateway/static/root/assets/automation-suggestion-card-B1LV3YYv.js +0 -1
  432. package/dist/gateway/static/root/assets/automations-page-fzrovqhv.js +0 -4
  433. package/dist/gateway/static/root/assets/block-editor-Dhj5f4Bx.js +0 -184
  434. package/dist/gateway/static/root/assets/browser-settings-page-BDn-n-UB.js +0 -8
  435. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Co5ipo_Q.js +0 -1
  436. package/dist/gateway/static/root/assets/channels-settings-BWlpaxg9.js +0 -1
  437. package/dist/gateway/static/root/assets/channels-status-swr-D_jkIZLV.js +0 -1
  438. package/dist/gateway/static/root/assets/connectors-page-BcekbW4q.js +0 -2
  439. package/dist/gateway/static/root/assets/desktop-pet-settings-BJCUuL8Y.js +0 -1
  440. package/dist/gateway/static/root/assets/dreaming-settings-BN1Z2mIo.js +0 -3
  441. package/dist/gateway/static/root/assets/extension-page-B-1KxvVy.js +0 -1
  442. package/dist/gateway/static/root/assets/extension-settings-page-BF9NACI3.js +0 -1
  443. package/dist/gateway/static/root/assets/gateway-settings-DN9sNREz.js +0 -1
  444. package/dist/gateway/static/root/assets/goal-create-dialog-BpoQW8cD.js +0 -1
  445. package/dist/gateway/static/root/assets/goal-detail-page-CBRSPd0b.js +0 -4
  446. package/dist/gateway/static/root/assets/goals-page-BCcBi407.js +0 -2
  447. package/dist/gateway/static/root/assets/goals-settings-pkTXzXkh.js +0 -1
  448. package/dist/gateway/static/root/assets/heartbeat-settings-ezsufgLQ.js +0 -1
  449. package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +0 -1
  450. package/dist/gateway/static/root/assets/index-DcUaXYeb.js +0 -262
  451. package/dist/gateway/static/root/assets/logs-page-DQtTRXtj.js +0 -7
  452. package/dist/gateway/static/root/assets/messages-BXNELNBa.js +0 -3
  453. package/dist/gateway/static/root/assets/models-hub-panel-BP2M9n6Q.js +0 -2
  454. package/dist/gateway/static/root/assets/notes-page-CspveYaO.js +0 -1
  455. package/dist/gateway/static/root/assets/notes-workbench-BHwzJ0OC.js +0 -2
  456. package/dist/gateway/static/root/assets/project-detail-page-Dy3rsobs.js +0 -1
  457. package/dist/gateway/static/root/assets/projects-page-CWKpPE0L.js +0 -1
  458. package/dist/gateway/static/root/assets/remote-access-hub-CqNRyXEo.js +0 -1
  459. package/dist/gateway/static/root/assets/sessions-page-MEME7ivF.js +0 -1
  460. package/dist/gateway/static/root/assets/settings-advanced-gate-JVd0qaSF.js +0 -1
  461. package/dist/gateway/static/root/assets/settings-page-DYEbB1EV.js +0 -1
  462. package/dist/gateway/static/root/assets/setup-status-panel-dWN8BJ3z.js +0 -1
  463. package/dist/gateway/static/root/assets/share-preview-page-D8foINzP.js +0 -2
  464. package/dist/gateway/static/root/assets/shares-settings-Tgbv1s7G.js +0 -1
  465. package/dist/gateway/static/root/assets/skill-reload-api-D_YK0b_Z.js +0 -1
  466. package/dist/gateway/static/root/assets/skills-page-DGytfoZK.js +0 -2
  467. package/dist/gateway/static/root/assets/toast-z0toXu32.js +0 -1
  468. package/dist/gateway/static/root/assets/user-profile-settings-panel-8YtygcJp.js +0 -1
  469. package/dist/gateway/static/root/assets/voice-api-key-field-BVH71EFf.js +0 -1
  470. package/dist/gateway/static/root/assets/work-item-detail-page-JeTE7XNM.js +0 -1
  471. package/dist/gateway/static/root/assets/workflow-start-dialog-_u8Uc1ze.js +0 -1
  472. package/dist/gateway/static/root/assets/workflows-page-ixgk_y1l.js +0 -18
  473. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +0 -13
  474. package/dist/src/agent/workflow/builtins/audit-repo.js +0 -183
  475. package/dist/src/agent/workflow/builtins/audit-repo.js.map +0 -1
  476. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +0 -12
  477. package/dist/src/agent/workflow/builtins/client-proposal.js +0 -164
  478. package/dist/src/agent/workflow/builtins/client-proposal.js.map +0 -1
  479. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +0 -12
  480. package/dist/src/agent/workflow/builtins/competitor-scan.js +0 -164
  481. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +0 -1
  482. package/dist/src/agent/workflow/builtins/content-draft.d.ts +0 -13
  483. package/dist/src/agent/workflow/builtins/content-draft.js +0 -159
  484. package/dist/src/agent/workflow/builtins/content-draft.js.map +0 -1
  485. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +0 -11
  486. package/dist/src/agent/workflow/builtins/content-repurpose.js +0 -146
  487. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +0 -1
  488. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +0 -13
  489. package/dist/src/agent/workflow/builtins/debug-incident.js +0 -177
  490. package/dist/src/agent/workflow/builtins/debug-incident.js.map +0 -1
  491. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +0 -13
  492. package/dist/src/agent/workflow/builtins/decision-compare.js +0 -187
  493. package/dist/src/agent/workflow/builtins/decision-compare.js.map +0 -1
  494. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +0 -12
  495. package/dist/src/agent/workflow/builtins/implementation-plan.js +0 -185
  496. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +0 -1
  497. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +0 -11
  498. package/dist/src/agent/workflow/builtins/inbox-triage.js +0 -158
  499. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +0 -1
  500. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +0 -12
  501. package/dist/src/agent/workflow/builtins/meeting-prep.js +0 -152
  502. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +0 -1
  503. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +0 -14
  504. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +0 -171
  505. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +0 -1
  506. package/dist/src/agent/workflow/builtins/offer-design.d.ts +0 -12
  507. package/dist/src/agent/workflow/builtins/offer-design.js +0 -170
  508. package/dist/src/agent/workflow/builtins/offer-design.js.map +0 -1
  509. package/dist/src/agent/workflow/builtins/pr-review.d.ts +0 -12
  510. package/dist/src/agent/workflow/builtins/pr-review.js +0 -178
  511. package/dist/src/agent/workflow/builtins/pr-review.js.map +0 -1
  512. package/dist/src/agent/workflow/builtins/release-check.d.ts +0 -11
  513. package/dist/src/agent/workflow/builtins/release-check.js +0 -174
  514. package/dist/src/agent/workflow/builtins/release-check.js.map +0 -1
  515. package/dist/src/agent/workflow/builtins/research.d.ts +0 -13
  516. package/dist/src/agent/workflow/builtins/research.js +0 -188
  517. package/dist/src/agent/workflow/builtins/research.js.map +0 -1
  518. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +0 -12
  519. package/dist/src/agent/workflow/builtins/weekly-review.js +0 -139
  520. package/dist/src/agent/workflow/builtins/weekly-review.js.map +0 -1
  521. package/dist/src/agent/workflow/last-run-memory.d.ts +0 -42
  522. package/dist/src/agent/workflow/last-run-memory.js +0 -60
  523. package/dist/src/agent/workflow/last-run-memory.js.map +0 -1
  524. package/dist/src/agent/workflow/lint.d.ts +0 -38
  525. package/dist/src/agent/workflow/lint.js +0 -74
  526. package/dist/src/agent/workflow/lint.js.map +0 -1
  527. package/dist/src/agent/workflow/meta-locale.d.ts +0 -12
  528. package/dist/src/agent/workflow/meta-locale.js +0 -62
  529. package/dist/src/agent/workflow/meta-locale.js.map +0 -1
  530. package/dist/src/agent/workflow/parser.d.ts +0 -20
  531. package/dist/src/agent/workflow/parser.js +0 -152
  532. package/dist/src/agent/workflow/parser.js.map +0 -1
  533. package/dist/src/agent/workflow/runtime.d.ts +0 -34
  534. package/dist/src/agent/workflow/runtime.js +0 -402
  535. package/dist/src/agent/workflow/runtime.js.map +0 -1
  536. package/dist/src/connectors/oauth.d.ts +0 -22
  537. package/dist/src/connectors/oauth.js +0 -99
  538. package/dist/src/connectors/oauth.js.map +0 -1
  539. package/dist/src/workflows/runtime/script-runtime.d.ts +0 -3
  540. package/dist/src/workflows/runtime/script-runtime.js +0 -3
  541. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +0 -5
  542. package/dist/src/workflows/runtime/script-workflow-runtime.js +0 -15
  543. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +0 -1
@@ -1,97 +1,55 @@
1
1
  //#region src/workflows/draft/workflow-draft-prompt.ts
2
2
  function buildWorkflowDraftPrompt(params) {
3
- return `You generate xopc workflow drafts. Return ONLY a JSON object, no markdown.
4
-
5
- JSON shape:
6
- {
7
- "name": "lowercase_snake_case",
8
- "script": "workflow JavaScript DSL",
9
- "manifest": {
10
- "title": "Human title",
11
- "description": "What it does",
12
- "version": "1.0.0",
13
- "inputSchema": { "type": "object", "properties": {}, "required": [] },
14
- "outputSchema": { "type": "object", "properties": { "summary": { "type": "string" } }, "required": ["summary"] },
15
- "defaults": { "concurrency": 2, "timeoutSec": 1800, "maxSubagents": 8 },
16
- "permissions": { "network": false, "fileSystem": "read", "approvalRequired": false },
17
- "tags": ["custom"],
18
- "whenToUse": "When to use this workflow"
19
- },
20
- "explanation": "Short explanation",
21
- "assumptions": ["..."],
22
- "risks": ["..."]
23
- }
24
-
25
- DSL rules:
26
- - script MUST start with: export const meta = { name, description, phases, tags, estimatedAgents }
27
- - The top-level JSON "name" MUST exactly equal script meta.name.
28
- - Use only these globals: phase(title), agent(prompt, opts), parallel([() => agent(...)]), pipeline(items, ...stages), log(message), budget, args.
29
- - Read user inputs from args, e.g. args.goal, args.branch, args.audience.
30
- - Each agent needs a clear label.
31
- - Keep concurrency conservative; prefer 2-4.
32
- - Return a WorkflowResultEnvelope-like object: { summary, sections, followUps?, structuredOutput? }.
33
- - Do not use import, require, eval, Function, process.env, fs, http, fetch.
34
- - If network/write/destructive behavior is requested, mark manifest.permissions.approvalRequired = true.
35
- - Keep script self-contained and valid JavaScript.
3
+ return `${GRAPH_DESIGN_PROMPT}
36
4
 
37
5
  Mode: ${params.mode}
38
6
  Language for user-facing copy: ${params.language ?? "en"}
39
7
  Constraints:
40
8
  ${JSON.stringify(params.constraints ?? {}, null, 2)}
41
9
 
42
- ${params.existingScript ? `Existing script to improve:\n${params.existingScript.slice(0, 12e3)}\n` : ""}
10
+ ${params.existingGraph ? `Existing graph to improve:\n${JSON.stringify(params.existingGraph, null, 2).slice(0, 16e3)}\n` : ""}
11
+ User request:
12
+ ${params.prompt.slice(0, 8e3)}`;
13
+ }
14
+ function buildWorkflowDraftRepairPrompt(params) {
15
+ return `${GRAPH_DESIGN_PROMPT}
43
16
 
17
+ Repair the previous graph while preserving the user's intent. Fix every listed issue.
18
+ Language for user-facing copy: ${params.language ?? "en"}
19
+ Constraints:
20
+ ${JSON.stringify(params.constraints ?? {}, null, 2)}
21
+ Issues:
22
+ ${JSON.stringify(params.issues, null, 2)}
44
23
  User request:
45
24
  ${params.prompt.slice(0, 8e3)}
46
- `;
25
+ Previous output:
26
+ ${params.previousOutput.slice(0, 16e3)}`;
47
27
  }
48
- function buildWorkflowDraftRepairPrompt(params) {
49
- return `You must repair an xopc workflow draft so it passes validation. Return ONLY a corrected JSON object, no markdown.
28
+ const GRAPH_DESIGN_PROMPT = `You design xopc visual workflows for non-technical users. Return ONLY one JSON object, no markdown.
50
29
 
51
- Required JSON shape is unchanged:
30
+ Shape:
52
31
  {
53
32
  "name": "lowercase_snake_case",
54
- "script": "workflow JavaScript DSL",
33
+ "graph": { "schemaVersion": 1, "nodes": [], "edges": [] },
55
34
  "manifest": {
56
- "title": "Human title",
57
- "description": "What it does",
58
- "version": "1.0.0",
35
+ "title": "Human title", "description": "Outcome in plain language", "version": "1.0.0",
59
36
  "inputSchema": { "type": "object", "properties": {}, "required": [] },
60
- "outputSchema": { "type": "object", "properties": { "summary": { "type": "string" } }, "required": ["summary"] },
61
- "defaults": { "concurrency": 2, "timeoutSec": 1800, "maxSubagents": 8 },
37
+ "defaults": { "concurrency": 3, "timeoutSec": 1800, "maxSubagents": 8 },
62
38
  "permissions": { "network": false, "fileSystem": "read", "approvalRequired": false },
63
- "tags": ["custom"],
64
- "whenToUse": "When to use this workflow"
39
+ "tags": ["custom"], "whenToUse": "A concrete user situation"
65
40
  },
66
- "explanation": "Short explanation",
67
- "assumptions": ["..."],
68
- "risks": ["..."]
41
+ "explanation": "Short explanation", "assumptions": [], "risks": []
69
42
  }
70
43
 
71
- Hard requirements:
72
- - The output MUST be valid JSON.
73
- - JSON name MUST be lowercase snake_case and MUST exactly equal script meta.name.
74
- - script MUST be valid JavaScript for the xopc workflow DSL.
75
- - script MUST start with export const meta = { ... } and include phases, tags, estimatedAgents.
76
- - Use only these globals: phase(title), agent(prompt, opts), parallel([() => agent(...)]), pipeline(items, ...stages), log(message), budget, args.
77
- - Do not use import, require, eval, Function, process.env, fs, http, fetch.
78
- - Respect the constraints exactly. If network is disabled, manifest.permissions.network must be false.
79
- - Preserve the user's intent while making the smallest change needed to pass validation.
80
-
81
- Language for user-facing copy: ${params.language ?? "en"}
82
- Constraints:
83
- ${JSON.stringify(params.constraints ?? {}, null, 2)}
84
-
85
- Validation and lint issues to fix:
86
- ${JSON.stringify(params.issues, null, 2)}
87
-
88
- Original user request:
89
- ${params.prompt.slice(0, 8e3)}
90
-
91
- Previous model output:
92
- ${params.previousOutput.slice(0, 12e3)}
93
- `;
94
- }
44
+ Graph rules:
45
+ - Exactly one input node and one output node. Every node must be reachable from input and lead toward output.
46
+ - Node kinds are input, agent, decision, merge, output.
47
+ - Every node has id, kind, title, position {x,y}, config, and optional phaseId/description.
48
+ - input config: {schema?}; agent config: {prompt, model?, toolset?, maxIterations?, outputSchema?}; decision config: {rule:{path,operator,value?}}; merge config: {mode:"array"|"object"}; output config: {summary?,title?}.
49
+ - Edge shape: {id,source,target,sourcePort?}. Decision branch ports are true and false.
50
+ - Agent prompts may reference {{goal}}, {{input}}, {{input.field}}, {{nodes.nodeId}}, and {{predecessors.nodeId}}.
51
+ - Prefer a small, understandable graph: 3-8 nodes, short titles, clear descriptions. Parallel independent work should fan out and then merge.
52
+ - Do not create code or script fields. Do not request permissions the user did not need.`;
95
53
  //#endregion
96
54
  export { buildWorkflowDraftPrompt, buildWorkflowDraftRepairPrompt };
97
55
 
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-draft-prompt.js","names":[],"sources":["../../../../src/workflows/draft/workflow-draft-prompt.ts"],"sourcesContent":["import type { WorkflowDraftConstraints, WorkflowDraftMode } from './workflow-draft.types.js';\n\nexport interface WorkflowDraftRepairIssue {\n source: 'parse' | 'validation' | 'lint';\n severity: 'error' | 'warning';\n code: string;\n message: string;\n line?: number;\n column?: number;\n}\n\nexport function buildWorkflowDraftPrompt(params: {\n prompt: string;\n language?: 'en' | 'zh';\n mode: WorkflowDraftMode;\n existingScript?: string;\n constraints?: WorkflowDraftConstraints;\n}): string {\n return `You generate xopc workflow drafts. Return ONLY a JSON object, no markdown.\n\nJSON shape:\n{\n \"name\": \"lowercase_snake_case\",\n \"script\": \"workflow JavaScript DSL\",\n \"manifest\": {\n \"title\": \"Human title\",\n \"description\": \"What it does\",\n \"version\": \"1.0.0\",\n \"inputSchema\": { \"type\": \"object\", \"properties\": {}, \"required\": [] },\n \"outputSchema\": { \"type\": \"object\", \"properties\": { \"summary\": { \"type\": \"string\" } }, \"required\": [\"summary\"] },\n \"defaults\": { \"concurrency\": 2, \"timeoutSec\": 1800, \"maxSubagents\": 8 },\n \"permissions\": { \"network\": false, \"fileSystem\": \"read\", \"approvalRequired\": false },\n \"tags\": [\"custom\"],\n \"whenToUse\": \"When to use this workflow\"\n },\n \"explanation\": \"Short explanation\",\n \"assumptions\": [\"...\"],\n \"risks\": [\"...\"]\n}\n\nDSL rules:\n- script MUST start with: export const meta = { name, description, phases, tags, estimatedAgents }\n- The top-level JSON \"name\" MUST exactly equal script meta.name.\n- Use only these globals: phase(title), agent(prompt, opts), parallel([() => agent(...)]), pipeline(items, ...stages), log(message), budget, args.\n- Read user inputs from args, e.g. args.goal, args.branch, args.audience.\n- Each agent needs a clear label.\n- Keep concurrency conservative; prefer 2-4.\n- Return a WorkflowResultEnvelope-like object: { summary, sections, followUps?, structuredOutput? }.\n- Do not use import, require, eval, Function, process.env, fs, http, fetch.\n- If network/write/destructive behavior is requested, mark manifest.permissions.approvalRequired = true.\n- Keep script self-contained and valid JavaScript.\n\nMode: ${params.mode}\nLanguage for user-facing copy: ${params.language ?? 'en'}\nConstraints:\n${JSON.stringify(params.constraints ?? {}, null, 2)}\n\n${params.existingScript ? `Existing script to improve:\\n${params.existingScript.slice(0, 12000)}\\n` : ''}\n\nUser request:\n${params.prompt.slice(0, 8000)}\n`;\n}\n\nexport function buildWorkflowDraftRepairPrompt(params: {\n prompt: string;\n language?: 'en' | 'zh';\n constraints?: WorkflowDraftConstraints;\n previousOutput: string;\n issues: WorkflowDraftRepairIssue[];\n}): string {\n return `You must repair an xopc workflow draft so it passes validation. Return ONLY a corrected JSON object, no markdown.\n\nRequired JSON shape is unchanged:\n{\n \"name\": \"lowercase_snake_case\",\n \"script\": \"workflow JavaScript DSL\",\n \"manifest\": {\n \"title\": \"Human title\",\n \"description\": \"What it does\",\n \"version\": \"1.0.0\",\n \"inputSchema\": { \"type\": \"object\", \"properties\": {}, \"required\": [] },\n \"outputSchema\": { \"type\": \"object\", \"properties\": { \"summary\": { \"type\": \"string\" } }, \"required\": [\"summary\"] },\n \"defaults\": { \"concurrency\": 2, \"timeoutSec\": 1800, \"maxSubagents\": 8 },\n \"permissions\": { \"network\": false, \"fileSystem\": \"read\", \"approvalRequired\": false },\n \"tags\": [\"custom\"],\n \"whenToUse\": \"When to use this workflow\"\n },\n \"explanation\": \"Short explanation\",\n \"assumptions\": [\"...\"],\n \"risks\": [\"...\"]\n}\n\nHard requirements:\n- The output MUST be valid JSON.\n- JSON name MUST be lowercase snake_case and MUST exactly equal script meta.name.\n- script MUST be valid JavaScript for the xopc workflow DSL.\n- script MUST start with export const meta = { ... } and include phases, tags, estimatedAgents.\n- Use only these globals: phase(title), agent(prompt, opts), parallel([() => agent(...)]), pipeline(items, ...stages), log(message), budget, args.\n- Do not use import, require, eval, Function, process.env, fs, http, fetch.\n- Respect the constraints exactly. If network is disabled, manifest.permissions.network must be false.\n- Preserve the user's intent while making the smallest change needed to pass validation.\n\nLanguage for user-facing copy: ${params.language ?? 'en'}\nConstraints:\n${JSON.stringify(params.constraints ?? {}, null, 2)}\n\nValidation and lint issues to fix:\n${JSON.stringify(params.issues, null, 2)}\n\nOriginal user request:\n${params.prompt.slice(0, 8000)}\n\nPrevious model output:\n${params.previousOutput.slice(0, 12000)}\n`;\n}\n"],"mappings":";AAWA,SAAgB,yBAAyB,QAM9B;AACT,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkCD,OAAO,KAAK;iCACa,OAAO,YAAY,KAAK;;EAEvD,KAAK,UAAU,OAAO,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC;;EAElD,OAAO,iBAAiB,gCAAgC,OAAO,eAAe,MAAM,GAAG,KAAM,CAAC,MAAM,GAAG;;;EAGvG,OAAO,OAAO,MAAM,GAAG,IAAK,CAAC;;;AAI/B,SAAgB,+BAA+B,QAMpC;AACT,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAgCwB,OAAO,YAAY,KAAK;;EAEvD,KAAK,UAAU,OAAO,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC;;;EAGlD,KAAK,UAAU,OAAO,QAAQ,MAAM,EAAE,CAAC;;;EAGvC,OAAO,OAAO,MAAM,GAAG,IAAK,CAAC;;;EAG7B,OAAO,eAAe,MAAM,GAAG,KAAM,CAAC"}
1
+ {"version":3,"file":"workflow-draft-prompt.js","names":[],"sources":["../../../../src/workflows/draft/workflow-draft-prompt.ts"],"sourcesContent":["import type { WorkflowGraph } from '../domain/definition.js';\nimport type { WorkflowDraftConstraints, WorkflowDraftMode } from './workflow-draft.types.js';\n\nexport interface WorkflowDraftRepairIssue {\n source: 'parse' | 'validation' | 'lint';\n severity: 'error' | 'warning';\n code: string;\n message: string;\n}\n\nexport function buildWorkflowDraftPrompt(params: {\n prompt: string;\n language?: 'en' | 'zh';\n mode: WorkflowDraftMode;\n existingGraph?: WorkflowGraph;\n constraints?: WorkflowDraftConstraints;\n}): string {\n return `${GRAPH_DESIGN_PROMPT}\n\nMode: ${params.mode}\nLanguage for user-facing copy: ${params.language ?? 'en'}\nConstraints:\n${JSON.stringify(params.constraints ?? {}, null, 2)}\n\n${params.existingGraph ? `Existing graph to improve:\\n${JSON.stringify(params.existingGraph, null, 2).slice(0, 16000)}\\n` : ''}\nUser request:\n${params.prompt.slice(0, 8000)}`;\n}\n\nexport function buildWorkflowDraftRepairPrompt(params: {\n prompt: string;\n language?: 'en' | 'zh';\n constraints?: WorkflowDraftConstraints;\n previousOutput: string;\n issues: WorkflowDraftRepairIssue[];\n}): string {\n return `${GRAPH_DESIGN_PROMPT}\n\nRepair the previous graph while preserving the user's intent. Fix every listed issue.\nLanguage for user-facing copy: ${params.language ?? 'en'}\nConstraints:\n${JSON.stringify(params.constraints ?? {}, null, 2)}\nIssues:\n${JSON.stringify(params.issues, null, 2)}\nUser request:\n${params.prompt.slice(0, 8000)}\nPrevious output:\n${params.previousOutput.slice(0, 16000)}`;\n}\n\nconst GRAPH_DESIGN_PROMPT = `You design xopc visual workflows for non-technical users. Return ONLY one JSON object, no markdown.\n\nShape:\n{\n \"name\": \"lowercase_snake_case\",\n \"graph\": { \"schemaVersion\": 1, \"nodes\": [], \"edges\": [] },\n \"manifest\": {\n \"title\": \"Human title\", \"description\": \"Outcome in plain language\", \"version\": \"1.0.0\",\n \"inputSchema\": { \"type\": \"object\", \"properties\": {}, \"required\": [] },\n \"defaults\": { \"concurrency\": 3, \"timeoutSec\": 1800, \"maxSubagents\": 8 },\n \"permissions\": { \"network\": false, \"fileSystem\": \"read\", \"approvalRequired\": false },\n \"tags\": [\"custom\"], \"whenToUse\": \"A concrete user situation\"\n },\n \"explanation\": \"Short explanation\", \"assumptions\": [], \"risks\": []\n}\n\nGraph rules:\n- Exactly one input node and one output node. Every node must be reachable from input and lead toward output.\n- Node kinds are input, agent, decision, merge, output.\n- Every node has id, kind, title, position {x,y}, config, and optional phaseId/description.\n- input config: {schema?}; agent config: {prompt, model?, toolset?, maxIterations?, outputSchema?}; decision config: {rule:{path,operator,value?}}; merge config: {mode:\"array\"|\"object\"}; output config: {summary?,title?}.\n- Edge shape: {id,source,target,sourcePort?}. Decision branch ports are true and false.\n- Agent prompts may reference {{goal}}, {{input}}, {{input.field}}, {{nodes.nodeId}}, and {{predecessors.nodeId}}.\n- Prefer a small, understandable graph: 3-8 nodes, short titles, clear descriptions. Parallel independent work should fan out and then merge.\n- Do not create code or script fields. Do not request permissions the user did not need.`;\n"],"mappings":";AAUA,SAAgB,yBAAyB,QAM9B;AACT,QAAO,GAAG,oBAAoB;;QAExB,OAAO,KAAK;iCACa,OAAO,YAAY,KAAK;;EAEvD,KAAK,UAAU,OAAO,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC;;EAElD,OAAO,gBAAgB,+BAA+B,KAAK,UAAU,OAAO,eAAe,MAAM,EAAE,CAAC,MAAM,GAAG,KAAM,CAAC,MAAM,GAAG;;EAE7H,OAAO,OAAO,MAAM,GAAG,IAAK;;AAG9B,SAAgB,+BAA+B,QAMpC;AACT,QAAO,GAAG,oBAAoB;;;iCAGC,OAAO,YAAY,KAAK;;EAEvD,KAAK,UAAU,OAAO,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC;;EAElD,KAAK,UAAU,OAAO,QAAQ,MAAM,EAAE,CAAC;;EAEvC,OAAO,OAAO,MAAM,GAAG,IAAK,CAAC;;EAE7B,OAAO,eAAe,MAAM,GAAG,KAAM;;AAGvC,MAAM,sBAAsB"}
@@ -25,8 +25,8 @@ var WorkflowDraftService = class {
25
25
  let messageContent = buildWorkflowDraftPrompt({
26
26
  prompt,
27
27
  language: request.language,
28
- mode: request.mode ?? (request.existingScript ? "improve" : "create"),
29
- existingScript: request.existingScript,
28
+ mode: request.mode ?? (request.existingGraph ? "improve" : "create"),
29
+ existingGraph: request.existingGraph,
30
30
  constraints: request.constraints
31
31
  });
32
32
  let lastIssues = [];
@@ -102,16 +102,12 @@ function getBlockingDraftIssues(response) {
102
102
  source: "validation",
103
103
  severity: "error",
104
104
  code: issue.code,
105
- message: issue.message,
106
- line: issue.line,
107
- column: issue.column
105
+ message: issue.message
108
106
  })), ...response.validation.warnings.map((issue) => ({
109
107
  source: "validation",
110
108
  severity: "warning",
111
109
  code: issue.code,
112
- message: issue.message,
113
- line: issue.line,
114
- column: issue.column
110
+ message: issue.message
115
111
  }))];
116
112
  const lintIssues = response.lint.filter((issue) => issue.severity === "error").map((issue) => ({
117
113
  source: "lint",
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-draft-service.js","names":[],"sources":["../../../../src/workflows/draft/workflow-draft-service.ts"],"sourcesContent":["import { type UserMessage } from '@earendil-works/pi-ai/compat';\n\nimport { resolveModelRef } from '../../config/agent-typed-models.js';\nimport { getAgentDefaultModelRef } from '../../config/schema.js';\nimport type { Config } from '../../config/schema.js';\nimport { getDefaultModelSync, resolveModel } from '../../providers/index.js';\nimport { completeWithResolvedCredentials } from '../../providers/model-call.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport {\n buildWorkflowDraftPrompt,\n buildWorkflowDraftRepairPrompt,\n type WorkflowDraftRepairIssue,\n} from './workflow-draft-prompt.js';\nimport type { CreateWorkflowDraftRequest, WorkflowDraftResponse } from './workflow-draft.types.js';\nimport { buildWorkflowDraftResponse, parseGeneratedWorkflowDraft } from './workflow-draft-validator.js';\n\nconst log = createLogger('WorkflowDraft');\nconst DEFAULT_MAX_REPAIR_ATTEMPTS = 2;\n\nexport interface WorkflowDraftServiceOptions {\n config: Config;\n maxRepairAttempts?: number;\n}\n\nexport class WorkflowDraftService {\n constructor(private readonly options: WorkflowDraftServiceOptions) {}\n\n async createDraft(request: CreateWorkflowDraftRequest, signal?: AbortSignal): Promise<WorkflowDraftResponse> {\n const prompt = request.prompt.trim();\n if (!prompt) throw new Error('prompt is required');\n const modelRef = resolveDraftModelRef(this.options.config, request.agentId);\n const model = resolveModel(modelRef);\n const maxRepairAttempts = this.options.maxRepairAttempts ?? DEFAULT_MAX_REPAIR_ATTEMPTS;\n let messageContent = buildWorkflowDraftPrompt({\n prompt,\n language: request.language,\n mode: request.mode ?? (request.existingScript ? 'improve' : 'create'),\n existingScript: request.existingScript,\n constraints: request.constraints,\n });\n let lastIssues: WorkflowDraftRepairIssue[] = [];\n let lastText = '';\n\n for (let attempt = 0; attempt <= maxRepairAttempts; attempt += 1) {\n const userMsg: UserMessage = {\n role: 'user',\n content: messageContent,\n timestamp: Date.now(),\n };\n const result = await completeWithResolvedCredentials(\n model,\n { messages: [userMsg] },\n { maxTokens: 4096, temperature: attempt === 0 ? 0.25 : 0.1, signal: signal as AbortSignal },\n );\n lastText = extractText(result);\n try {\n const draft = parseGeneratedWorkflowDraft(lastText);\n const response = buildWorkflowDraftResponse(draft, request.constraints);\n const blockingIssues = getBlockingDraftIssues(response);\n if (blockingIssues.length === 0) {\n return { ...response, repairAttempts: attempt };\n }\n lastIssues = blockingIssues;\n } catch (err) {\n lastIssues = [{\n source: 'parse',\n severity: 'error',\n code: 'invalid_model_output',\n message: err instanceof Error ? err.message : String(err),\n }];\n }\n\n if (attempt >= maxRepairAttempts) break;\n log.warn(\n { modelRef, attempt: attempt + 1, issueCount: lastIssues.length, preview: lastText.slice(0, 500) },\n 'Workflow draft validation failed; asking model to repair',\n );\n messageContent = buildWorkflowDraftRepairPrompt({\n prompt,\n language: request.language,\n constraints: request.constraints,\n previousOutput: lastText,\n issues: lastIssues,\n });\n }\n\n const message = `Unable to generate a valid workflow draft after ${maxRepairAttempts + 1} attempts: ${formatRepairIssues(lastIssues)}`;\n log.warn({ modelRef, issues: lastIssues, preview: lastText.slice(0, 500) }, message);\n throw new Error(message);\n }\n}\n\nexport function resolveDraftModelRef(config: Config, agentId: string): string {\n try {\n return resolveModelRef(config, agentId, 'large');\n } catch {\n return getAgentDefaultModelRef(config) ?? getDefaultModelSync(config);\n }\n}\n\nfunction extractText(result: unknown): string {\n const content = (result as { content?: unknown }).content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content.map((item) => {\n if (item && typeof item === 'object' && (item as { type?: string }).type === 'text') {\n return String((item as { text?: string }).text ?? '');\n }\n return '';\n }).join('');\n }\n return '';\n}\n\nfunction getBlockingDraftIssues(response: WorkflowDraftResponse): WorkflowDraftRepairIssue[] {\n const validationIssues: WorkflowDraftRepairIssue[] = [\n ...response.validation.errors.map((issue) => ({\n source: 'validation' as const,\n severity: 'error' as const,\n code: issue.code,\n message: issue.message,\n line: issue.line,\n column: issue.column,\n })),\n ...response.validation.warnings.map((issue) => ({\n source: 'validation' as const,\n severity: 'warning' as const,\n code: issue.code,\n message: issue.message,\n line: issue.line,\n column: issue.column,\n })),\n ];\n const lintIssues = response.lint\n .filter((issue) => issue.severity === 'error')\n .map((issue) => ({\n source: 'lint' as const,\n severity: issue.severity,\n code: issue.code,\n message: issue.message,\n }));\n return [...validationIssues, ...lintIssues];\n}\n\nfunction formatRepairIssues(issues: WorkflowDraftRepairIssue[]): string {\n if (issues.length === 0) return 'unknown validation failure';\n return issues.slice(0, 5).map((issue) => `${issue.source}:${issue.code}: ${issue.message}`).join('; ');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"workflow-draft-service.js","names":[],"sources":["../../../../src/workflows/draft/workflow-draft-service.ts"],"sourcesContent":["import { type UserMessage } from '@earendil-works/pi-ai/compat';\n\nimport { resolveModelRef } from '../../config/agent-typed-models.js';\nimport { getAgentDefaultModelRef } from '../../config/schema.js';\nimport type { Config } from '../../config/schema.js';\nimport { getDefaultModelSync, resolveModel } from '../../providers/index.js';\nimport { completeWithResolvedCredentials } from '../../providers/model-call.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport {\n buildWorkflowDraftPrompt,\n buildWorkflowDraftRepairPrompt,\n type WorkflowDraftRepairIssue,\n} from './workflow-draft-prompt.js';\nimport type { CreateWorkflowDraftRequest, WorkflowDraftResponse } from './workflow-draft.types.js';\nimport { buildWorkflowDraftResponse, parseGeneratedWorkflowDraft } from './workflow-draft-validator.js';\n\nconst log = createLogger('WorkflowDraft');\nconst DEFAULT_MAX_REPAIR_ATTEMPTS = 2;\n\nexport interface WorkflowDraftServiceOptions {\n config: Config;\n maxRepairAttempts?: number;\n}\n\nexport class WorkflowDraftService {\n constructor(private readonly options: WorkflowDraftServiceOptions) {}\n\n async createDraft(request: CreateWorkflowDraftRequest, signal?: AbortSignal): Promise<WorkflowDraftResponse> {\n const prompt = request.prompt.trim();\n if (!prompt) throw new Error('prompt is required');\n const modelRef = resolveDraftModelRef(this.options.config, request.agentId);\n const model = resolveModel(modelRef);\n const maxRepairAttempts = this.options.maxRepairAttempts ?? DEFAULT_MAX_REPAIR_ATTEMPTS;\n let messageContent = buildWorkflowDraftPrompt({\n prompt,\n language: request.language,\n mode: request.mode ?? (request.existingGraph ? 'improve' : 'create'),\n existingGraph: request.existingGraph,\n constraints: request.constraints,\n });\n let lastIssues: WorkflowDraftRepairIssue[] = [];\n let lastText = '';\n\n for (let attempt = 0; attempt <= maxRepairAttempts; attempt += 1) {\n const userMsg: UserMessage = {\n role: 'user',\n content: messageContent,\n timestamp: Date.now(),\n };\n const result = await completeWithResolvedCredentials(\n model,\n { messages: [userMsg] },\n { maxTokens: 4096, temperature: attempt === 0 ? 0.25 : 0.1, signal: signal as AbortSignal },\n );\n lastText = extractText(result);\n try {\n const draft = parseGeneratedWorkflowDraft(lastText);\n const response = buildWorkflowDraftResponse(draft, request.constraints);\n const blockingIssues = getBlockingDraftIssues(response);\n if (blockingIssues.length === 0) {\n return { ...response, repairAttempts: attempt };\n }\n lastIssues = blockingIssues;\n } catch (err) {\n lastIssues = [{\n source: 'parse',\n severity: 'error',\n code: 'invalid_model_output',\n message: err instanceof Error ? err.message : String(err),\n }];\n }\n\n if (attempt >= maxRepairAttempts) break;\n log.warn(\n { modelRef, attempt: attempt + 1, issueCount: lastIssues.length, preview: lastText.slice(0, 500) },\n 'Workflow draft validation failed; asking model to repair',\n );\n messageContent = buildWorkflowDraftRepairPrompt({\n prompt,\n language: request.language,\n constraints: request.constraints,\n previousOutput: lastText,\n issues: lastIssues,\n });\n }\n\n const message = `Unable to generate a valid workflow draft after ${maxRepairAttempts + 1} attempts: ${formatRepairIssues(lastIssues)}`;\n log.warn({ modelRef, issues: lastIssues, preview: lastText.slice(0, 500) }, message);\n throw new Error(message);\n }\n}\n\nexport function resolveDraftModelRef(config: Config, agentId: string): string {\n try {\n return resolveModelRef(config, agentId, 'large');\n } catch {\n return getAgentDefaultModelRef(config) ?? getDefaultModelSync(config);\n }\n}\n\nfunction extractText(result: unknown): string {\n const content = (result as { content?: unknown }).content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content.map((item) => {\n if (item && typeof item === 'object' && (item as { type?: string }).type === 'text') {\n return String((item as { text?: string }).text ?? '');\n }\n return '';\n }).join('');\n }\n return '';\n}\n\nfunction getBlockingDraftIssues(response: WorkflowDraftResponse): WorkflowDraftRepairIssue[] {\n const validationIssues: WorkflowDraftRepairIssue[] = [\n ...response.validation.errors.map((issue) => ({\n source: 'validation' as const,\n severity: 'error' as const,\n code: issue.code,\n message: issue.message,\n })),\n ...response.validation.warnings.map((issue) => ({\n source: 'validation' as const,\n severity: 'warning' as const,\n code: issue.code,\n message: issue.message,\n })),\n ];\n const lintIssues = response.lint\n .filter((issue) => issue.severity === 'error')\n .map((issue) => ({\n source: 'lint' as const,\n severity: issue.severity,\n code: issue.code,\n message: issue.message,\n }));\n return [...validationIssues, ...lintIssues];\n}\n\nfunction formatRepairIssues(issues: WorkflowDraftRepairIssue[]): string {\n if (issues.length === 0) return 'unknown validation failure';\n return issues.slice(0, 5).map((issue) => `${issue.source}:${issue.code}: ${issue.message}`).join('; ');\n}\n"],"mappings":"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"}
@@ -2,11 +2,10 @@ import { validateWorkflowDefinitionInput } from "../domain/validation.js";
2
2
  import { randomUUID } from "node:crypto";
3
3
  //#region src/workflows/draft/workflow-draft-validator.ts
4
4
  function parseGeneratedWorkflowDraft(raw) {
5
- const json = extractJsonObject(raw);
6
- const parsed = JSON.parse(json);
5
+ const parsed = JSON.parse(extractJsonObject(raw));
7
6
  return {
8
7
  name: normalizeWorkflowName(String(parsed.name ?? "custom_workflow")),
9
- script: String(parsed.script ?? "").trim(),
8
+ graph: normalizeGraph(parsed.graph),
10
9
  manifest: normalizeManifest(parsed.manifest),
11
10
  explanation: String(parsed.explanation ?? ""),
12
11
  assumptions: stringArray(parsed.assumptions),
@@ -16,22 +15,21 @@ function parseGeneratedWorkflowDraft(raw) {
16
15
  function buildWorkflowDraftResponse(draft, constraints) {
17
16
  const validation = validateWorkflowDefinitionInput({
18
17
  name: draft.name,
19
- script: draft.script
18
+ graph: draft.graph
20
19
  });
21
- const lint = lintWorkflowDraft(draft, constraints);
22
20
  return {
23
21
  draftId: randomUUID(),
24
22
  repairAttempts: 0,
25
23
  ...draft,
26
24
  permissionsSummary: summarizePermissions(draft.manifest),
27
25
  validation,
28
- lint,
26
+ lint: lintWorkflowDraft(draft, constraints),
29
27
  suggestedInputs: suggestedInputsFromManifest(draft.manifest)
30
28
  };
31
29
  }
32
30
  function lintWorkflowDraft(draft, constraints) {
33
31
  const issues = [];
34
- const { manifest, script } = draft;
32
+ const { manifest, graph } = draft;
35
33
  if (!manifest.inputSchema) issues.push({
36
34
  severity: "warning",
37
35
  code: "missing_input_schema",
@@ -45,32 +43,27 @@ function lintWorkflowDraft(draft, constraints) {
45
43
  if (manifest.permissions?.network && constraints?.allowNetwork === false) issues.push({
46
44
  severity: "error",
47
45
  code: "unsafe_permission",
48
- message: "Draft requests network access, but network is disabled by constraints."
46
+ message: "Draft requests network access, but network is disabled."
49
47
  });
50
48
  if (manifest.permissions?.fileSystem === "write" && constraints?.fileSystem !== "write") issues.push({
51
49
  severity: "warning",
52
50
  code: "unsafe_permission",
53
51
  message: "Draft requests filesystem write access."
54
52
  });
55
- const phaseCount = (script.match(/\bphase\s*\(/g) ?? []).length;
56
- if (constraints?.maxPhases && phaseCount > constraints.maxPhases) issues.push({
53
+ const phases = new Set(graph.nodes.map((node) => node.phaseId).filter(Boolean));
54
+ if (constraints?.maxPhases && phases.size > constraints.maxPhases) issues.push({
57
55
  severity: "warning",
58
56
  code: "too_many_agents",
59
- message: `Draft has ${phaseCount} phases, above requested ${constraints.maxPhases}.`
57
+ message: `Draft has ${phases.size} phases, above the requested maximum.`
60
58
  });
61
- const agentCount = (script.match(/\bagent\s*\(/g) ?? []).length;
62
- if (constraints?.maxSubagents && agentCount > constraints.maxSubagents) issues.push({
59
+ const agents = graph.nodes.filter((node) => node.kind === "agent");
60
+ if (constraints?.maxSubagents && agents.length > constraints.maxSubagents) issues.push({
63
61
  severity: "warning",
64
62
  code: "too_many_agents",
65
- message: `Draft starts ${agentCount} agents, above requested ${constraints.maxSubagents}.`
66
- });
67
- if (/parallel\s*\([^[]/.test(script)) issues.push({
68
- severity: "warning",
69
- code: "unbounded_parallelism",
70
- message: "parallel() should receive a bounded array of thunks."
63
+ message: `Draft has ${agents.length} agents, above the requested maximum.`
71
64
  });
72
65
  if (constraints?.allowedTools?.length) {
73
- const unknown = collectToolsetNames(script).filter((tool) => !constraints.allowedTools.includes(tool));
66
+ const unknown = agents.flatMap((node) => node.config.toolset ?? []).filter((tool) => !constraints.allowedTools.includes(tool));
74
67
  for (const tool of [...new Set(unknown)]) issues.push({
75
68
  severity: "warning",
76
69
  code: "unknown_tool",
@@ -89,12 +82,19 @@ function extractJsonObject(raw) {
89
82
  if (start >= 0 && end > start) return trimmed.slice(start, end + 1);
90
83
  throw new Error("Model did not return a JSON object.");
91
84
  }
92
- function normalizeManifest(value) {
93
- if (!value || typeof value !== "object" || Array.isArray(value)) return {};
85
+ function normalizeGraph(value) {
86
+ if (!value || typeof value !== "object" || Array.isArray(value)) return {
87
+ schemaVersion: 1,
88
+ nodes: [],
89
+ edges: []
90
+ };
94
91
  return value;
95
92
  }
93
+ function normalizeManifest(value) {
94
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
95
+ }
96
96
  function stringArray(value) {
97
- return Array.isArray(value) ? value.map((item) => String(item)).filter(Boolean) : [];
97
+ return Array.isArray(value) ? value.map(String).filter(Boolean) : [];
98
98
  }
99
99
  function normalizeWorkflowName(value) {
100
100
  const normalized = value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "");
@@ -103,12 +103,12 @@ function normalizeWorkflowName(value) {
103
103
  function summarizePermissions(manifest) {
104
104
  const permissions = manifest.permissions;
105
105
  if (!permissions) return ["No explicit permissions requested."];
106
- const out = [];
107
- if (permissions.tools?.length) out.push(`Tools: ${permissions.tools.join(", ")}`);
108
- if (permissions.network != null) out.push(`Network: ${permissions.network ? "enabled" : "disabled"}`);
109
- if (permissions.fileSystem) out.push(`Filesystem: ${permissions.fileSystem}`);
110
- if (permissions.approvalRequired) out.push("Approval required");
111
- return out.length > 0 ? out : ["No explicit permissions requested."];
106
+ const values = [];
107
+ if (permissions.tools?.length) values.push(`Tools: ${permissions.tools.join(", ")}`);
108
+ if (permissions.network != null) values.push(`Network: ${permissions.network ? "enabled" : "disabled"}`);
109
+ if (permissions.fileSystem) values.push(`Filesystem: ${permissions.fileSystem}`);
110
+ if (permissions.approvalRequired) values.push("Approval required");
111
+ return values.length ? values : ["No explicit permissions requested."];
112
112
  }
113
113
  function suggestedInputsFromManifest(manifest) {
114
114
  const properties = manifest.inputSchema?.properties;
@@ -119,14 +119,6 @@ function suggestedInputsFromManifest(manifest) {
119
119
  example: typeof schema.default === "string" ? schema.default : schema.description ?? ""
120
120
  }));
121
121
  }
122
- function collectToolsetNames(script) {
123
- const out = [];
124
- for (const match of script.matchAll(/toolset\s*:\s*\[([^\]]*)\]/g)) {
125
- const body = match[1] ?? "";
126
- for (const item of body.matchAll(/['"]([^'"]+)['"]/g)) out.push(item[1] ?? "");
127
- }
128
- return out.filter(Boolean);
129
- }
130
122
  //#endregion
131
123
  export { buildWorkflowDraftResponse, lintWorkflowDraft, parseGeneratedWorkflowDraft };
132
124
 
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-draft-validator.js","names":[],"sources":["../../../../src/workflows/draft/workflow-draft-validator.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { validateWorkflowDefinitionInput } from '../domain/validation.js';\nimport type { WorkflowDefinitionManifest } from '../domain/definition.js';\n\nimport type {\n GeneratedWorkflowDraft,\n WorkflowDraftConstraints,\n WorkflowDraftLintIssue,\n WorkflowDraftResponse,\n} from './workflow-draft.types.js';\n\nexport function parseGeneratedWorkflowDraft(raw: string): GeneratedWorkflowDraft {\n const json = extractJsonObject(raw);\n const parsed = JSON.parse(json) as Partial<GeneratedWorkflowDraft>;\n const name = normalizeWorkflowName(String(parsed.name ?? 'custom_workflow'));\n const script = String(parsed.script ?? '').trim();\n const manifest = normalizeManifest(parsed.manifest);\n return {\n name,\n script,\n manifest,\n explanation: String(parsed.explanation ?? ''),\n assumptions: stringArray(parsed.assumptions),\n risks: stringArray(parsed.risks),\n };\n}\n\nexport function buildWorkflowDraftResponse(\n draft: GeneratedWorkflowDraft,\n constraints?: WorkflowDraftConstraints,\n): WorkflowDraftResponse {\n const validation = validateWorkflowDefinitionInput({ name: draft.name, script: draft.script });\n const lint = lintWorkflowDraft(draft, constraints);\n return {\n draftId: randomUUID(),\n repairAttempts: 0,\n ...draft,\n permissionsSummary: summarizePermissions(draft.manifest),\n validation,\n lint,\n suggestedInputs: suggestedInputsFromManifest(draft.manifest),\n };\n}\n\nexport function lintWorkflowDraft(\n draft: GeneratedWorkflowDraft,\n constraints?: WorkflowDraftConstraints,\n): WorkflowDraftLintIssue[] {\n const issues: WorkflowDraftLintIssue[] = [];\n const { manifest, script } = draft;\n if (!manifest.inputSchema) {\n issues.push({ severity: 'warning', code: 'missing_input_schema', message: 'Draft does not define an input schema.' });\n }\n if (!manifest.outputSchema) {\n issues.push({ severity: 'warning', code: 'missing_output_schema', message: 'Draft does not define an output schema.' });\n }\n if (manifest.permissions?.network && constraints?.allowNetwork === false) {\n issues.push({ severity: 'error', code: 'unsafe_permission', message: 'Draft requests network access, but network is disabled by constraints.' });\n }\n if (manifest.permissions?.fileSystem === 'write' && constraints?.fileSystem !== 'write') {\n issues.push({ severity: 'warning', code: 'unsafe_permission', message: 'Draft requests filesystem write access.' });\n }\n const phaseCount = (script.match(/\\bphase\\s*\\(/g) ?? []).length;\n if (constraints?.maxPhases && phaseCount > constraints.maxPhases) {\n issues.push({ severity: 'warning', code: 'too_many_agents', message: `Draft has ${phaseCount} phases, above requested ${constraints.maxPhases}.` });\n }\n const agentCount = (script.match(/\\bagent\\s*\\(/g) ?? []).length;\n if (constraints?.maxSubagents && agentCount > constraints.maxSubagents) {\n issues.push({ severity: 'warning', code: 'too_many_agents', message: `Draft starts ${agentCount} agents, above requested ${constraints.maxSubagents}.` });\n }\n if (/parallel\\s*\\([^[]/.test(script)) {\n issues.push({ severity: 'warning', code: 'unbounded_parallelism', message: 'parallel() should receive a bounded array of thunks.' });\n }\n if (constraints?.allowedTools?.length) {\n const unknown = collectToolsetNames(script).filter((tool) => !constraints.allowedTools!.includes(tool));\n for (const tool of [...new Set(unknown)]) {\n issues.push({ severity: 'warning', code: 'unknown_tool', message: `Tool '${tool}' is outside the requested allowlist.` });\n }\n }\n return issues;\n}\n\nfunction extractJsonObject(raw: string): string {\n const trimmed = raw.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) return trimmed;\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)```/i)?.[1]?.trim();\n if (fenced?.startsWith('{')) return fenced;\n const start = trimmed.indexOf('{');\n const end = trimmed.lastIndexOf('}');\n if (start >= 0 && end > start) return trimmed.slice(start, end + 1);\n throw new Error('Model did not return a JSON object.');\n}\n\nfunction normalizeManifest(value: unknown): WorkflowDefinitionManifest {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {};\n return value as WorkflowDefinitionManifest;\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.map((item) => String(item)).filter(Boolean) : [];\n}\n\nfunction normalizeWorkflowName(value: string): string {\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '');\n return /^[a-z]/.test(normalized) ? normalized : `workflow_${normalized || 'draft'}`;\n}\n\nfunction summarizePermissions(manifest: WorkflowDefinitionManifest): string[] {\n const permissions = manifest.permissions;\n if (!permissions) return ['No explicit permissions requested.'];\n const out: string[] = [];\n if (permissions.tools?.length) out.push(`Tools: ${permissions.tools.join(', ')}`);\n if (permissions.network != null) out.push(`Network: ${permissions.network ? 'enabled' : 'disabled'}`);\n if (permissions.fileSystem) out.push(`Filesystem: ${permissions.fileSystem}`);\n if (permissions.approvalRequired) out.push('Approval required');\n return out.length > 0 ? out : ['No explicit permissions requested.'];\n}\n\nfunction suggestedInputsFromManifest(manifest: WorkflowDefinitionManifest): WorkflowDraftResponse['suggestedInputs'] {\n const properties = manifest.inputSchema?.properties;\n if (!properties) return undefined;\n return Object.entries(properties).slice(0, 8).map(([key, schema]) => ({\n key,\n label: typeof schema.title === 'string' ? schema.title : key,\n example: typeof schema.default === 'string' ? schema.default : schema.description ?? '',\n }));\n}\n\nfunction collectToolsetNames(script: string): string[] {\n const out: string[] = [];\n const re = /toolset\\s*:\\s*\\[([^\\]]*)\\]/g;\n for (const match of script.matchAll(re)) {\n const body = match[1] ?? '';\n for (const item of body.matchAll(/['\"]([^'\"]+)['\"]/g)) {\n out.push(item[1] ?? '');\n }\n }\n return out.filter(Boolean);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"workflow-draft-validator.js","names":[],"sources":["../../../../src/workflows/draft/workflow-draft-validator.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { WorkflowDefinitionManifest, WorkflowGraph } from '../domain/definition.js';\nimport { validateWorkflowDefinitionInput } from '../domain/validation.js';\n\nimport type { GeneratedWorkflowDraft, WorkflowDraftConstraints, WorkflowDraftLintIssue, WorkflowDraftResponse } from './workflow-draft.types.js';\n\nexport function parseGeneratedWorkflowDraft(raw: string): GeneratedWorkflowDraft {\n const parsed = JSON.parse(extractJsonObject(raw)) as Partial<GeneratedWorkflowDraft>;\n return {\n name: normalizeWorkflowName(String(parsed.name ?? 'custom_workflow')),\n graph: normalizeGraph(parsed.graph),\n manifest: normalizeManifest(parsed.manifest),\n explanation: String(parsed.explanation ?? ''),\n assumptions: stringArray(parsed.assumptions),\n risks: stringArray(parsed.risks),\n };\n}\n\nexport function buildWorkflowDraftResponse(draft: GeneratedWorkflowDraft, constraints?: WorkflowDraftConstraints): WorkflowDraftResponse {\n const validation = validateWorkflowDefinitionInput({ name: draft.name, graph: draft.graph });\n return {\n draftId: randomUUID(),\n repairAttempts: 0,\n ...draft,\n permissionsSummary: summarizePermissions(draft.manifest),\n validation,\n lint: lintWorkflowDraft(draft, constraints),\n suggestedInputs: suggestedInputsFromManifest(draft.manifest),\n };\n}\n\nexport function lintWorkflowDraft(draft: GeneratedWorkflowDraft, constraints?: WorkflowDraftConstraints): WorkflowDraftLintIssue[] {\n const issues: WorkflowDraftLintIssue[] = [];\n const { manifest, graph } = draft;\n if (!manifest.inputSchema) issues.push({ severity: 'warning', code: 'missing_input_schema', message: 'Draft does not define an input schema.' });\n if (!manifest.outputSchema) issues.push({ severity: 'warning', code: 'missing_output_schema', message: 'Draft does not define an output schema.' });\n if (manifest.permissions?.network && constraints?.allowNetwork === false) issues.push({ severity: 'error', code: 'unsafe_permission', message: 'Draft requests network access, but network is disabled.' });\n if (manifest.permissions?.fileSystem === 'write' && constraints?.fileSystem !== 'write') issues.push({ severity: 'warning', code: 'unsafe_permission', message: 'Draft requests filesystem write access.' });\n const phases = new Set(graph.nodes.map((node) => node.phaseId).filter(Boolean));\n if (constraints?.maxPhases && phases.size > constraints.maxPhases) issues.push({ severity: 'warning', code: 'too_many_agents', message: `Draft has ${phases.size} phases, above the requested maximum.` });\n const agents = graph.nodes.filter((node) => node.kind === 'agent');\n if (constraints?.maxSubagents && agents.length > constraints.maxSubagents) issues.push({ severity: 'warning', code: 'too_many_agents', message: `Draft has ${agents.length} agents, above the requested maximum.` });\n if (constraints?.allowedTools?.length) {\n const unknown = agents.flatMap((node) => node.config.toolset ?? []).filter((tool) => !constraints.allowedTools!.includes(tool));\n for (const tool of [...new Set(unknown)]) issues.push({ severity: 'warning', code: 'unknown_tool', message: `Tool '${tool}' is outside the requested allowlist.` });\n }\n return issues;\n}\n\nfunction extractJsonObject(raw: string): string {\n const trimmed = raw.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) return trimmed;\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)```/i)?.[1]?.trim();\n if (fenced?.startsWith('{')) return fenced;\n const start = trimmed.indexOf('{');\n const end = trimmed.lastIndexOf('}');\n if (start >= 0 && end > start) return trimmed.slice(start, end + 1);\n throw new Error('Model did not return a JSON object.');\n}\n\nfunction normalizeGraph(value: unknown): WorkflowGraph {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return { schemaVersion: 1, nodes: [], edges: [] };\n return value as WorkflowGraph;\n}\n\nfunction normalizeManifest(value: unknown): WorkflowDefinitionManifest {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as WorkflowDefinitionManifest : {};\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.map(String).filter(Boolean) : [];\n}\n\nfunction normalizeWorkflowName(value: string): string {\n const normalized = value.trim().toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '');\n return /^[a-z]/.test(normalized) ? normalized : `workflow_${normalized || 'draft'}`;\n}\n\nfunction summarizePermissions(manifest: WorkflowDefinitionManifest): string[] {\n const permissions = manifest.permissions;\n if (!permissions) return ['No explicit permissions requested.'];\n const values: string[] = [];\n if (permissions.tools?.length) values.push(`Tools: ${permissions.tools.join(', ')}`);\n if (permissions.network != null) values.push(`Network: ${permissions.network ? 'enabled' : 'disabled'}`);\n if (permissions.fileSystem) values.push(`Filesystem: ${permissions.fileSystem}`);\n if (permissions.approvalRequired) values.push('Approval required');\n return values.length ? values : ['No explicit permissions requested.'];\n}\n\nfunction suggestedInputsFromManifest(manifest: WorkflowDefinitionManifest): WorkflowDraftResponse['suggestedInputs'] {\n const properties = manifest.inputSchema?.properties;\n if (!properties) return undefined;\n return Object.entries(properties).slice(0, 8).map(([key, schema]) => ({ key, label: typeof schema.title === 'string' ? schema.title : key, example: typeof schema.default === 'string' ? schema.default : schema.description ?? '' }));\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { WorkflowDefinitionManifest } from '../domain/definition.js';
1
+ import type { WorkflowDefinitionManifest, WorkflowGraph } from '../domain/definition.js';
2
2
  import type { WorkflowDefinitionValidationResult } from '../domain/validation.js';
3
3
  export type WorkflowDraftMode = 'create' | 'improve';
4
4
  export interface WorkflowDraftConstraints {
@@ -14,17 +14,17 @@ export interface CreateWorkflowDraftRequest {
14
14
  agentId: string;
15
15
  language?: 'en' | 'zh';
16
16
  mode?: WorkflowDraftMode;
17
- existingScript?: string;
17
+ existingGraph?: WorkflowGraph;
18
18
  constraints?: WorkflowDraftConstraints;
19
19
  }
20
20
  export interface WorkflowDraftLintIssue {
21
21
  severity: 'error' | 'warning';
22
- code: 'missing_input_schema' | 'missing_output_schema' | 'unsafe_permission' | 'too_many_agents' | 'unknown_tool' | 'weak_phase_names' | 'unbounded_parallelism';
22
+ code: 'missing_input_schema' | 'missing_output_schema' | 'unsafe_permission' | 'too_many_agents' | 'unknown_tool' | 'weak_phase_names';
23
23
  message: string;
24
24
  }
25
25
  export interface GeneratedWorkflowDraft {
26
26
  name: string;
27
- script: string;
27
+ graph: WorkflowGraph;
28
28
  manifest: WorkflowDefinitionManifest;
29
29
  explanation: string;
30
30
  assumptions: string[];
@@ -18,7 +18,18 @@ function buildTimelineItem(event) {
18
18
  };
19
19
  }
20
20
  function isAgentMutationEvent(type) {
21
- return type === "agent_queued" || type === "agent_started" || type === "agent_step_started" || type === "agent_step_completed" || type === "agent_completed";
21
+ return type === "node_started" || type === "node_completed" || type === "agent_queued" || type === "agent_started" || type === "agent_step_started" || type === "agent_step_completed" || type === "agent_completed";
22
+ }
23
+ function markOpenNodesTerminal(nodes, status, completedAtMs, error) {
24
+ for (const [nodeId, node] of nodes) {
25
+ if (node.status !== "running") continue;
26
+ nodes.set(nodeId, {
27
+ ...node,
28
+ status,
29
+ completedAtMs,
30
+ error: status === "error" ? error : node.error
31
+ });
32
+ }
22
33
  }
23
34
  function markOpenAgentsTerminal(agentIdToAgent, status, completedAtMs, error) {
24
35
  for (const [agentId, agent] of agentIdToAgent) {
@@ -50,6 +61,7 @@ function projectWorkflowRunView(events) {
50
61
  };
51
62
  const phaseIdToPhase = /* @__PURE__ */ new Map();
52
63
  const agentIdToAgent = /* @__PURE__ */ new Map();
64
+ const nodeIdToNode = /* @__PURE__ */ new Map();
53
65
  const logs = [];
54
66
  const artifacts = [];
55
67
  const timeline = [];
@@ -84,10 +96,37 @@ function projectWorkflowRunView(events) {
84
96
  });
85
97
  break;
86
98
  }
99
+ case "node_started": {
100
+ const payload = event.payload;
101
+ nodeIdToNode.set(payload.nodeId, {
102
+ id: payload.nodeId,
103
+ kind: payload.kind,
104
+ title: payload.title,
105
+ status: "running",
106
+ startedAtMs: event.createdAtMs
107
+ });
108
+ break;
109
+ }
110
+ case "node_completed": {
111
+ const payload = event.payload;
112
+ const existing = nodeIdToNode.get(payload.nodeId);
113
+ nodeIdToNode.set(payload.nodeId, {
114
+ id: payload.nodeId,
115
+ kind: payload.kind,
116
+ title: payload.title,
117
+ status: payload.status,
118
+ startedAtMs: existing?.startedAtMs,
119
+ completedAtMs: event.createdAtMs,
120
+ resultPreview: payload.resultPreview,
121
+ error: payload.error
122
+ });
123
+ break;
124
+ }
87
125
  case "agent_queued": {
88
126
  const payload = event.payload;
89
127
  agentIdToAgent.set(payload.agentId, {
90
128
  id: payload.agentId,
129
+ nodeId: payload.nodeId,
91
130
  label: payload.label,
92
131
  phaseId: payload.phaseId,
93
132
  status: "queued",
@@ -192,12 +231,14 @@ function projectWorkflowRunView(events) {
192
231
  run.error = payload.error;
193
232
  run.completedAtMs = event.createdAtMs;
194
233
  markOpenAgentsTerminal(agentIdToAgent, payload.error?.code === "timeout" ? "skipped" : "error", event.createdAtMs, payload.error?.message);
234
+ markOpenNodesTerminal(nodeIdToNode, payload.error?.code === "timeout" ? "skipped" : "error", event.createdAtMs, payload.error?.message);
195
235
  break;
196
236
  }
197
237
  case "run_cancelled":
198
238
  run.status = "cancelled";
199
239
  run.completedAtMs = event.createdAtMs;
200
240
  markOpenAgentsTerminal(agentIdToAgent, "skipped", event.createdAtMs);
241
+ markOpenNodesTerminal(nodeIdToNode, "skipped", event.createdAtMs);
201
242
  break;
202
243
  default: break;
203
244
  }
@@ -220,6 +261,7 @@ function projectWorkflowRunView(events) {
220
261
  };
221
262
  }),
222
263
  agents,
264
+ nodes: [...nodeIdToNode.values()],
223
265
  logs,
224
266
  artifacts,
225
267
  timeline,