@xopcai/xopc 0.0.110 → 0.0.112

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 (583) hide show
  1. package/README.md +46 -4
  2. package/README.zh-CN.md +46 -4
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  5. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  6. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  7. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  8. package/dist/extensions/telegram/src/plugin.js +1 -1
  9. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  10. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  11. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  12. package/dist/extensions/telegram/xopc.extension.json +1 -1
  13. package/dist/extensions/weixin/src/api/api.js +2 -2
  14. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  15. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  16. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  18. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  19. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  20. package/dist/extensions/weixin/src/plugin.js +1 -1
  21. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  22. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  23. package/dist/gateway/static/root/apple-touch-icon.png +0 -0
  24. package/dist/gateway/static/root/assets/Combination-BzaXOLd9.js +41 -0
  25. package/dist/gateway/static/root/assets/agent-avatar-dicebear-EhRp-ZMa.js +1 -0
  26. package/dist/gateway/static/root/assets/agent-browser-settings-page-H4foVCiS.js +6 -0
  27. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-DDNw2oNU.js +1 -0
  28. package/dist/gateway/static/root/assets/agents-E_X2kzS1.js +71 -0
  29. package/dist/gateway/static/root/assets/app-management-settings-panel-BIy7KEsM.js +1 -0
  30. package/dist/gateway/static/root/assets/appearance-settings-DGQG8NwA.js +1 -0
  31. package/dist/gateway/static/root/assets/apps-page-BZLvInLr.js +1 -0
  32. package/dist/gateway/static/root/assets/archive-plugin-uuQPupqx.js +1 -0
  33. package/dist/gateway/static/root/assets/attachment-load-DBkv0cAv.js +2 -0
  34. package/dist/gateway/static/root/assets/{attachment-preview-renderer-CybMSIoS.js → attachment-preview-renderer-DonnL2dL.js} +1 -1
  35. package/dist/gateway/static/root/assets/binary-plugins-DxxN_VAR.js +2 -0
  36. package/dist/gateway/static/root/assets/block-editor-CwnUlRmO.js +180 -0
  37. package/dist/gateway/static/root/assets/channels-settings-BHvUKlzw.js +1 -0
  38. package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +1 -0
  39. package/dist/gateway/static/root/assets/code-editor-dZTY2dRW.js +1 -0
  40. package/dist/gateway/static/root/assets/config-api-BD-NcD5d.js +3 -0
  41. package/dist/gateway/static/root/assets/config-reload-event-Bjh2zoKp.js +1 -0
  42. package/dist/gateway/static/root/assets/connectors-settings-VBzXcEXL.js +2 -0
  43. package/dist/gateway/static/root/assets/cron-api-C5DoipZA.js +1 -0
  44. package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +1 -0
  45. package/dist/gateway/static/root/assets/cron-page-BLTpdm34.js +3 -0
  46. package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +1 -0
  47. package/dist/gateway/static/root/assets/dist-CkobR7mk.js +1 -0
  48. package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +1 -0
  49. package/dist/gateway/static/root/assets/dreaming-scene-BHMRVEUS.js +4585 -0
  50. package/dist/gateway/static/root/assets/dreaming-settings-DSVhXTPq.js +1 -0
  51. package/dist/gateway/static/root/assets/extension-debug-page-BDHA9o_e.js +1 -0
  52. package/dist/gateway/static/root/assets/{extension-page-W1wiG38F.js → extension-page-DmDLVSPE.js} +1 -1
  53. package/dist/gateway/static/root/assets/extension-settings-page-1124aHw_.js +1 -0
  54. package/dist/gateway/static/root/assets/fetch-DOe56Wmy.js +1 -0
  55. package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +2 -0
  56. package/dist/gateway/static/root/assets/format-interval-label-tsMSvBSR.js +1 -0
  57. package/dist/gateway/static/root/assets/gateway-config-api-CsD4FC9D.js +1 -0
  58. package/dist/gateway/static/root/assets/gateway-settings-HQ8FBhY2.js +1 -0
  59. package/dist/gateway/static/root/assets/gateway-startup-retry-C1zg7pH3.js +1 -0
  60. package/dist/gateway/static/root/assets/goal-detail-page-BG3Onph0.js +1 -0
  61. package/dist/gateway/static/root/assets/goals-page-DgeKn8zL.js +2 -0
  62. package/dist/gateway/static/root/assets/goals-settings-B5nI6lgz.js +1 -0
  63. package/dist/gateway/static/root/assets/heartbeat-config-api-CIv42nJD.js +1 -0
  64. package/dist/gateway/static/root/assets/heartbeat-settings-DFcVuJ3M.js +1 -0
  65. package/dist/gateway/static/root/assets/html-workspace-editor-CQLWDiwE.js +1 -0
  66. package/dist/gateway/static/root/assets/index-5A_ZaABy.css +1 -0
  67. package/dist/gateway/static/root/assets/index-BTmbp2AU.js +121 -0
  68. package/dist/gateway/static/root/assets/interval-presets-DGP3S7OB.js +1 -0
  69. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-fETaDYQP.js +1 -0
  70. package/dist/gateway/static/root/assets/locale-store-DjbfSsfA.js +1 -0
  71. package/dist/gateway/static/root/assets/logs-page-B1-b27lK.js +2 -0
  72. package/dist/gateway/static/root/assets/markdown-editor-AssmZFx4.js +2 -0
  73. package/dist/gateway/static/root/assets/markdown-split-CgeBJMOD.js +1 -0
  74. package/dist/gateway/static/root/assets/media-plugins-C30GzlV2.js +1 -0
  75. package/dist/gateway/static/root/assets/mermaid-render-BbqDc_LQ.js +134 -0
  76. package/dist/gateway/static/root/assets/messages-BUUfPaZ9.js +3 -0
  77. package/dist/gateway/static/root/assets/middleware-Pd0e8Igk.js +1 -0
  78. package/dist/gateway/static/root/assets/models-hub-panel-DPcTS1-u.js +2 -0
  79. package/dist/gateway/static/root/assets/note-detail-page-xeGb4owe.js +2 -0
  80. package/dist/gateway/static/root/assets/note-image-lightbox-t1g0qZYh.js +1 -0
  81. package/dist/gateway/static/root/assets/note-time-hm6JO_Wi.js +1 -0
  82. package/dist/gateway/static/root/assets/notes-page-C_TdnKBe.js +1 -0
  83. package/dist/gateway/static/root/assets/preview-open-alternatives-DeWp9x5g.js +1 -0
  84. package/dist/gateway/static/root/assets/remote-access-hub-BtkPmJIN.js +1 -0
  85. package/dist/gateway/static/root/assets/save-bar-controls-BOaAOJI3.js +1 -0
  86. package/dist/gateway/static/root/assets/schedule-field-BLWLKqgw.js +1 -0
  87. package/dist/gateway/static/root/assets/schema-form-plqRFYT8.js +1 -0
  88. package/dist/gateway/static/root/assets/sessions-page-DOUjxzJm.js +1 -0
  89. package/dist/gateway/static/root/assets/settings-advanced-gate-qK_bnTrw.js +1 -0
  90. package/dist/gateway/static/root/assets/settings-collapsible-section-BP5zRrDI.js +1 -0
  91. package/dist/gateway/static/root/assets/settings-form-section-Bv8MZplG.js +1 -0
  92. package/dist/gateway/static/root/assets/settings-page-DmDfE1ww.js +1 -0
  93. package/dist/gateway/static/root/assets/setup-status-panel-BEFwNcIZ.js +1 -0
  94. package/dist/gateway/static/root/assets/share-preview-page-4OX1YCgp.js +2 -0
  95. package/dist/gateway/static/root/assets/shares-settings-CbKmJZot.js +1 -0
  96. package/dist/gateway/static/root/assets/skill-reload-api-YdtnUHtK.js +1 -0
  97. package/dist/gateway/static/root/assets/skills-page-DwW1IzQ0.js +2 -0
  98. package/dist/gateway/static/root/assets/system-settings-panel-CGy4f_s2.js +1 -0
  99. package/dist/gateway/static/root/assets/theme-store-CD2wtgZV.js +1 -0
  100. package/dist/gateway/static/root/assets/use-agent-defaults-form-BMuMvzl_.js +1 -0
  101. package/dist/gateway/static/root/assets/use-blob-object-url-D4BFuzZB.js +1 -0
  102. package/dist/gateway/static/root/assets/use-channel-catalog-CjGHnDvN.js +1 -0
  103. package/dist/gateway/static/root/assets/use-settings-tab-guard-BMMFa0oA.js +1 -0
  104. package/dist/gateway/static/root/assets/vendor-codemirror-CNP1wPe7.js +45 -0
  105. package/dist/gateway/static/root/assets/voice-api-key-field-DnRbhMNq.js +1 -0
  106. package/dist/gateway/static/root/assets/voice-player-store-D5vzWwls.js +1 -0
  107. package/dist/gateway/static/root/assets/{workflow-page.utils-EYg_xBQS.js → workflow-page.utils-tjGpRVnw.js} +1 -1
  108. package/dist/gateway/static/root/assets/workflows-page-DqqHKGj2.js +18 -0
  109. package/dist/gateway/static/root/favicon-16x16.png +0 -0
  110. package/dist/gateway/static/root/favicon-32x32.png +0 -0
  111. package/dist/gateway/static/root/favicon.ico +0 -0
  112. package/dist/gateway/static/root/favicon.svg +14 -12
  113. package/dist/gateway/static/root/index.html +18 -15
  114. package/dist/package.js +1 -1
  115. package/dist/src/agent/agent-manager.d.ts +28 -2
  116. package/dist/src/agent/agent-manager.js +82 -11
  117. package/dist/src/agent/agent-manager.js.map +1 -1
  118. package/dist/src/agent/agent-scope.js +1 -1
  119. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  120. package/dist/src/agent/context/workspace-seed.js +2 -2
  121. package/dist/src/agent/context/workspace-state.js +1 -1
  122. package/dist/src/agent/context/workspace.js +1 -1
  123. package/dist/src/agent/goals/checklist-judge.d.ts +5 -0
  124. package/dist/src/agent/goals/checklist-judge.js +26 -2
  125. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  126. package/dist/src/agent/goals/evaluate-turn.d.ts +5 -1
  127. package/dist/src/agent/goals/evaluate-turn.js +29 -3
  128. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  129. package/dist/src/agent/goals/goal-locale.d.ts +0 -2
  130. package/dist/src/agent/goals/goal-locale.js +3 -16
  131. package/dist/src/agent/goals/goal-locale.js.map +1 -1
  132. package/dist/src/agent/goals/persistent-goal-service.d.ts +9 -0
  133. package/dist/src/agent/goals/persistent-goal-service.js +3 -2
  134. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  135. package/dist/src/agent/goals/post-turn.d.ts +7 -0
  136. package/dist/src/agent/goals/post-turn.js +70 -25
  137. package/dist/src/agent/goals/post-turn.js.map +1 -1
  138. package/dist/src/agent/goals/state.d.ts +0 -5
  139. package/dist/src/agent/goals/state.js +1 -96
  140. package/dist/src/agent/goals/state.js.map +1 -1
  141. package/dist/src/agent/image/load-image-media.js +2 -2
  142. package/dist/src/agent/ipc/inbox.js +3 -3
  143. package/dist/src/agent/ipc/socket.js +1 -1
  144. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  145. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  146. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  147. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  148. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  149. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  150. package/dist/src/agent/memory/dreaming/events.js +1 -1
  151. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  152. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  153. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  154. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  155. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  156. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  157. package/dist/src/agent/memory/memory-flush.js +1 -1
  158. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  159. package/dist/src/agent/messaging/command-handler.d.ts +7 -0
  160. package/dist/src/agent/messaging/command-handler.js +11 -2
  161. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  162. package/dist/src/agent/models/manager.js +1 -1
  163. package/dist/src/agent/prompt/memory/index.js +1 -1
  164. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  165. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  166. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  167. package/dist/src/agent/sandbox/path-policy.js +2 -2
  168. package/dist/src/agent/service/direct-turn-helpers.d.ts +2 -0
  169. package/dist/src/agent/service/direct-turn-helpers.js +3 -2
  170. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  171. package/dist/src/agent/service/process-direct-streaming.js +10 -1
  172. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  173. package/dist/src/agent/service/reconcile-dreaming-cron.js +8 -5
  174. package/dist/src/agent/service/reconcile-dreaming-cron.js.map +1 -1
  175. package/dist/src/agent/service.d.ts +2 -1
  176. package/dist/src/agent/service.js +30 -6
  177. package/dist/src/agent/service.js.map +1 -1
  178. package/dist/src/agent/service.types.d.ts +12 -0
  179. package/dist/src/agent/session/session-config-service.d.ts +8 -0
  180. package/dist/src/agent/session/session-config-service.js +20 -0
  181. package/dist/src/agent/session/session-config-service.js.map +1 -1
  182. package/dist/src/agent/session/session-inspector.js +1 -1
  183. package/dist/src/agent/skills/config.js +2 -2
  184. package/dist/src/agent/skills/filesystem-watcher.d.ts +19 -0
  185. package/dist/src/agent/skills/filesystem-watcher.js +182 -0
  186. package/dist/src/agent/skills/filesystem-watcher.js.map +1 -0
  187. package/dist/src/agent/skills/hub-hash.js +2 -2
  188. package/dist/src/agent/skills/hub-lock.js +1 -1
  189. package/dist/src/agent/skills/hub-pull.js +30 -36
  190. package/dist/src/agent/skills/hub-pull.js.map +1 -1
  191. package/dist/src/agent/skills/index.js +82 -38
  192. package/dist/src/agent/skills/index.js.map +1 -1
  193. package/dist/src/agent/skills/installer.js +2 -2
  194. package/dist/src/agent/skills/managed-store.d.ts +19 -0
  195. package/dist/src/agent/skills/managed-store.js +97 -38
  196. package/dist/src/agent/skills/managed-store.js.map +1 -1
  197. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  198. package/dist/src/agent/skills/skill-manager.d.ts +16 -6
  199. package/dist/src/agent/skills/skill-manager.js +79 -24
  200. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  201. package/dist/src/agent/skills/skill-view-path.js +1 -1
  202. package/dist/src/agent/skills/test-framework.js +1 -1
  203. package/dist/src/agent/skills/types.d.ts +11 -0
  204. package/dist/src/agent/skills/watcher.js +1 -1
  205. package/dist/src/agent/starter-agents.js +1 -1
  206. package/dist/src/agent/tools/cronjob-tool.d.ts +8 -3
  207. package/dist/src/agent/tools/cronjob-tool.js +82 -24
  208. package/dist/src/agent/tools/cronjob-tool.js.map +1 -1
  209. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  210. package/dist/src/agent/tools/edit.d.ts +2 -0
  211. package/dist/src/agent/tools/edit.js +10 -0
  212. package/dist/src/agent/tools/edit.js.map +1 -1
  213. package/dist/src/agent/tools/factory.js +17 -4
  214. package/dist/src/agent/tools/factory.js.map +1 -1
  215. package/dist/src/agent/tools/find.js +1 -1
  216. package/dist/src/agent/tools/goal-evidence-recorder.d.ts +6 -0
  217. package/dist/src/agent/tools/goal-evidence-recorder.js +34 -0
  218. package/dist/src/agent/tools/goal-evidence-recorder.js.map +1 -0
  219. package/dist/src/agent/tools/goal-tool.d.ts +19 -0
  220. package/dist/src/agent/tools/goal-tool.js +101 -0
  221. package/dist/src/agent/tools/goal-tool.js.map +1 -0
  222. package/dist/src/agent/tools/grep.js +1 -1
  223. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  224. package/dist/src/agent/tools/index.d.ts +1 -0
  225. package/dist/src/agent/tools/index.js +2 -1
  226. package/dist/src/agent/tools/shell.d.ts +2 -0
  227. package/dist/src/agent/tools/shell.js +17 -2
  228. package/dist/src/agent/tools/shell.js.map +1 -1
  229. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  230. package/dist/src/agent/tools/workflow-tool.d.ts +1 -0
  231. package/dist/src/agent/tools/workflow-tool.js +11 -3
  232. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  233. package/dist/src/agent/tools/write.d.ts +2 -0
  234. package/dist/src/agent/tools/write.js +11 -0
  235. package/dist/src/agent/tools/write.js.map +1 -1
  236. package/dist/src/agent/workflow/catalog.js +1 -1
  237. package/dist/src/agent/workspace-runtime/registry.d.ts +5 -0
  238. package/dist/src/agent/workspace-runtime/registry.js +7 -0
  239. package/dist/src/agent/workspace-runtime/registry.js.map +1 -1
  240. package/dist/src/ai-assist/text-assist.d.ts +39 -0
  241. package/dist/src/ai-assist/text-assist.js +234 -0
  242. package/dist/src/ai-assist/text-assist.js.map +1 -0
  243. package/dist/src/auth/credentials.js +2 -2
  244. package/dist/src/auth/profiles/store.js +2 -2
  245. package/dist/src/auth/sync-provider-auth.js +1 -1
  246. package/dist/src/browser/cache-dir-policy.js +1 -1
  247. package/dist/src/browser/cdp-local-launcher.js +2 -2
  248. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  249. package/dist/src/browser/providers/cloakbrowser.js +5 -5
  250. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  251. package/dist/src/browser/stealth.js +1 -1
  252. package/dist/src/channels/attachments/inbound-persist.d.ts +7 -0
  253. package/dist/src/channels/attachments/inbound-persist.js +20 -2
  254. package/dist/src/channels/attachments/inbound-persist.js.map +1 -1
  255. package/dist/src/channels/outbound/persist-store.js +1 -1
  256. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  257. package/dist/src/channels/pairing/pairing-store.js +2 -2
  258. package/dist/src/chat-commands/agent-edit.js +2 -2
  259. package/dist/src/chat-commands/builtins/config.js +3 -3
  260. package/dist/src/chat-commands/builtins/goal.d.ts +1 -1
  261. package/dist/src/chat-commands/builtins/goal.js +55 -97
  262. package/dist/src/chat-commands/builtins/goal.js.map +1 -1
  263. package/dist/src/chat-commands/builtins/subgoal.d.ts +1 -1
  264. package/dist/src/chat-commands/builtins/subgoal.js +49 -108
  265. package/dist/src/chat-commands/builtins/subgoal.js.map +1 -1
  266. package/dist/src/chat-commands/builtins/system.js +11 -4
  267. package/dist/src/chat-commands/builtins/system.js.map +1 -1
  268. package/dist/src/chat-commands/builtins/workflow.js +132 -8
  269. package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
  270. package/dist/src/chat-commands/context.d.ts +6 -0
  271. package/dist/src/chat-commands/context.js +12 -0
  272. package/dist/src/chat-commands/context.js.map +1 -1
  273. package/dist/src/chat-commands/types.d.ts +7 -0
  274. package/dist/src/cli/command-catalog.js +43 -0
  275. package/dist/src/cli/command-catalog.js.map +1 -1
  276. package/dist/src/cli/command-loaders.js +1 -0
  277. package/dist/src/cli/command-loaders.js.map +1 -1
  278. package/dist/src/cli/command-manifest.js +4 -0
  279. package/dist/src/cli/command-manifest.js.map +1 -1
  280. package/dist/src/cli/commands/config.js +1 -1
  281. package/dist/src/cli/commands/cron.js +55 -16
  282. package/dist/src/cli/commands/cron.js.map +1 -1
  283. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  284. package/dist/src/cli/commands/doctor/checks/cron-health.js +2 -83
  285. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -1
  286. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  287. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  288. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  289. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  290. package/dist/src/cli/commands/extension-create.js +1 -1
  291. package/dist/src/cli/commands/extension-dev.js +2 -2
  292. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  293. package/dist/src/cli/commands/extension-pack.js +2 -2
  294. package/dist/src/cli/commands/extension.js +3 -3
  295. package/dist/src/cli/commands/gateway/logs.js +1 -1
  296. package/dist/src/cli/commands/goal.d.ts +4 -0
  297. package/dist/src/cli/commands/goal.js +213 -0
  298. package/dist/src/cli/commands/goal.js.map +1 -0
  299. package/dist/src/cli/commands/image.js +1 -1
  300. package/dist/src/cli/commands/init.js +2 -2
  301. package/dist/src/cli/commands/models.js +1 -1
  302. package/dist/src/cli/commands/onboard.js +11 -5
  303. package/dist/src/cli/commands/onboard.js.map +1 -1
  304. package/dist/src/cli/commands/skills-test.js +1 -1
  305. package/dist/src/cli/templates.js +1 -1
  306. package/dist/src/cli/utils/gateway-client.js +1 -1
  307. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  308. package/dist/src/config/agent-profile.js +1 -1
  309. package/dist/src/config/agent-typed-models.js +1 -1
  310. package/dist/src/config/gateway-bind.js +1 -1
  311. package/dist/src/config/index.js +8 -8
  312. package/dist/src/config/loader.js +4 -4
  313. package/dist/src/config/models-json.js +2 -2
  314. package/dist/src/config/paths-state.js +1 -1
  315. package/dist/src/config/paths.js +1 -1
  316. package/dist/src/config/profile.js +1 -1
  317. package/dist/src/config/reload.js +1 -1
  318. package/dist/src/config/schema.d.ts +115 -2
  319. package/dist/src/config/schema.js +63 -7
  320. package/dist/src/config/schema.js.map +1 -1
  321. package/dist/src/config/web-patch.d.ts +14 -1
  322. package/dist/src/config/web-patch.js +45 -8
  323. package/dist/src/config/web-patch.js.map +1 -1
  324. package/dist/src/config/workspace-path.js +1 -1
  325. package/dist/src/cron/executor.d.ts +2 -0
  326. package/dist/src/cron/executor.js +126 -70
  327. package/dist/src/cron/executor.js.map +1 -1
  328. package/dist/src/cron/index.d.ts +1 -1
  329. package/dist/src/cron/index.js +3 -3
  330. package/dist/src/cron/job-content.js +1 -0
  331. package/dist/src/cron/job-content.js.map +1 -1
  332. package/dist/src/cron/run-log-store.d.ts +1 -0
  333. package/dist/src/cron/run-log-store.js +4 -2
  334. package/dist/src/cron/run-log-store.js.map +1 -1
  335. package/dist/src/cron/schedule.d.ts +10 -0
  336. package/dist/src/cron/schedule.js +85 -0
  337. package/dist/src/cron/schedule.js.map +1 -0
  338. package/dist/src/cron/service.d.ts +34 -77
  339. package/dist/src/cron/service.js +327 -264
  340. package/dist/src/cron/service.js.map +1 -1
  341. package/dist/src/cron/types.d.ts +97 -49
  342. package/dist/src/cron/validation.d.ts +374 -86
  343. package/dist/src/cron/validation.js +156 -129
  344. package/dist/src/cron/validation.js.map +1 -1
  345. package/dist/src/cron/workflow-run-completion.js +1 -1
  346. package/dist/src/daemon/constants.js +1 -1
  347. package/dist/src/daemon/install-plan.js +2 -2
  348. package/dist/src/daemon/launchd.js +2 -2
  349. package/dist/src/daemon/schtasks.js +2 -2
  350. package/dist/src/daemon/systemd.js +2 -2
  351. package/dist/src/extensions/bundle-mcp.js +1 -1
  352. package/dist/src/extensions/discover-extensions.js +2 -2
  353. package/dist/src/extensions/health.js +1 -1
  354. package/dist/src/extensions/install.js +2 -2
  355. package/dist/src/extensions/loader.js +2 -2
  356. package/dist/src/extensions/lockfile.js +3 -3
  357. package/dist/src/extensions/security.js +1 -1
  358. package/dist/src/extensions/update.js +2 -2
  359. package/dist/src/gateway/agents-admin.js +2 -2
  360. package/dist/src/gateway/chat-stream/mapper.d.ts +1 -0
  361. package/dist/src/gateway/chat-stream/mapper.js +6 -2
  362. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  363. package/dist/src/gateway/chat-stream/protocol.d.ts +2 -0
  364. package/dist/src/gateway/file-path-classifier.js +2 -2
  365. package/dist/src/gateway/hono/lib/config-payload.d.ts +14 -1
  366. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  367. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  368. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  369. package/dist/src/gateway/hono/oauth-async.js +1 -1
  370. package/dist/src/gateway/hono/routes/agents.js +1 -1
  371. package/dist/src/gateway/hono/routes/ai-assist.d.ts +3 -0
  372. package/dist/src/gateway/hono/routes/ai-assist.js +66 -0
  373. package/dist/src/gateway/hono/routes/ai-assist.js.map +1 -0
  374. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  375. package/dist/src/gateway/hono/routes/commands-skills.js +7 -0
  376. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  377. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  378. package/dist/src/gateway/hono/routes/cron.js +24 -5
  379. package/dist/src/gateway/hono/routes/cron.js.map +1 -1
  380. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  381. package/dist/src/gateway/hono/routes/goals.d.ts +1 -1
  382. package/dist/src/gateway/hono/routes/goals.js +670 -173
  383. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  384. package/dist/src/gateway/hono/routes/home.d.ts +5 -0
  385. package/dist/src/gateway/hono/routes/home.js +90 -3
  386. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  387. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  388. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  389. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  390. package/dist/src/gateway/hono/routes/models.js +1 -1
  391. package/dist/src/gateway/hono/routes/notes.js +20 -14
  392. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  393. package/dist/src/gateway/hono/routes/shares.js +1 -1
  394. package/dist/src/gateway/hono/routes/workflows.js +8 -4
  395. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  396. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  397. package/dist/src/gateway/hono/sse.js.map +1 -1
  398. package/dist/src/gateway/lock.js +3 -3
  399. package/dist/src/gateway/ports.js +1 -1
  400. package/dist/src/gateway/service/agent-runner.d.ts +2 -0
  401. package/dist/src/gateway/service/agent-runner.js +8 -4
  402. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  403. package/dist/src/gateway/service/config-coordinator.js +1 -1
  404. package/dist/src/gateway/service/marketplace-service.d.ts +22 -10
  405. package/dist/src/gateway/service/marketplace-service.js +46 -5
  406. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  407. package/dist/src/gateway/service/run-gateway-agent.d.ts +3 -0
  408. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  409. package/dist/src/gateway/service.d.ts +8 -0
  410. package/dist/src/gateway/service.js +79 -6
  411. package/dist/src/gateway/service.js.map +1 -1
  412. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  413. package/dist/src/goals/goal-notifications.d.ts +29 -0
  414. package/dist/src/goals/goal-notifications.js +154 -0
  415. package/dist/src/goals/goal-notifications.js.map +1 -0
  416. package/dist/src/goals/goal-queue-store.d.ts +16 -0
  417. package/dist/src/goals/goal-queue-store.js +131 -0
  418. package/dist/src/goals/goal-queue-store.js.map +1 -0
  419. package/dist/src/goals/goal-queue-types.d.ts +31 -0
  420. package/dist/src/goals/goal-queue-types.js +1 -0
  421. package/dist/src/goals/goal-runner.d.ts +17 -0
  422. package/dist/src/goals/goal-runner.js +127 -0
  423. package/dist/src/goals/goal-runner.js.map +1 -0
  424. package/dist/src/goals/goal-service.d.ts +77 -0
  425. package/dist/src/goals/goal-service.js +261 -0
  426. package/dist/src/goals/goal-service.js.map +1 -0
  427. package/dist/src/goals/goal-store.d.ts +38 -0
  428. package/dist/src/goals/goal-store.js +404 -0
  429. package/dist/src/goals/goal-store.js.map +1 -0
  430. package/dist/src/goals/goal-workflow-judge.d.ts +13 -0
  431. package/dist/src/goals/goal-workflow-judge.js +147 -0
  432. package/dist/src/goals/goal-workflow-judge.js.map +1 -0
  433. package/dist/src/goals/index.d.ts +10 -0
  434. package/dist/src/goals/index.js +7 -0
  435. package/dist/src/goals/types.d.ts +119 -0
  436. package/dist/src/goals/types.js +1 -0
  437. package/dist/src/i18n/goals-bundle.js +1 -1
  438. package/dist/src/i18n/index.js +1 -1
  439. package/dist/src/i18n/share-tool-bundle.js +2 -2
  440. package/dist/src/infra/brew.js +1 -1
  441. package/dist/src/infra/package-json.js +1 -1
  442. package/dist/src/infra/package-update-steps.js +1 -1
  443. package/dist/src/infra/path-env.js +2 -2
  444. package/dist/src/infra/restart.js +1 -1
  445. package/dist/src/infra/stable-node-path.js +1 -1
  446. package/dist/src/infra/update-check.js +1 -1
  447. package/dist/src/infra/update-global.js +1 -1
  448. package/dist/src/infra/update-lock.js +2 -2
  449. package/dist/src/infra/update-restart.js +1 -1
  450. package/dist/src/infra/update-runner.js +1 -1
  451. package/dist/src/infra/update-startup.js +1 -1
  452. package/dist/src/infra/write-file-atomic.js +2 -2
  453. package/dist/src/media/store.js +1 -1
  454. package/dist/src/notes/agent-context.js +1 -1
  455. package/dist/src/notes/service.js +1 -1
  456. package/dist/src/notes/store.js +2 -2
  457. package/dist/src/project-trust/trust-store.js +2 -2
  458. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  459. package/dist/src/providers/index.js +1 -1
  460. package/dist/src/providers/model-registry.js +4 -4
  461. package/dist/src/session/init-session-turn.js +2 -2
  462. package/dist/src/session/resolve-session.js +3 -3
  463. package/dist/src/session/session-title.js +2 -2
  464. package/dist/src/session/store.js +1 -1
  465. package/dist/src/share/share-auto.js +2 -2
  466. package/dist/src/share/share-store.js +3 -3
  467. package/dist/src/share/share-thumbnail.js +2 -2
  468. package/dist/src/share/share-zip.js +1 -1
  469. package/dist/src/share/site-share-store.js +3 -3
  470. package/dist/src/share/site-static-serve.js +1 -1
  471. package/dist/src/storage/sqlite/connection.js +1 -1
  472. package/dist/src/storage/sqlite/cron-job-repository.d.ts +6 -0
  473. package/dist/src/storage/sqlite/cron-job-repository.js +70 -0
  474. package/dist/src/storage/sqlite/cron-job-repository.js.map +1 -0
  475. package/dist/src/storage/sqlite/cron-run-repository.js +0 -1
  476. package/dist/src/storage/sqlite/cron-run-repository.js.map +1 -1
  477. package/dist/src/storage/sqlite/index.d.ts +1 -0
  478. package/dist/src/storage/sqlite/index.js +2 -1
  479. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  480. package/dist/src/storage/sqlite/migrations/006_add_goals.sql +108 -0
  481. package/dist/src/storage/sqlite/migrations/007_goal_run_judge_schema.sql +4 -0
  482. package/dist/src/storage/sqlite/migrations/008_goal_queue_workflow_runs.sql +53 -0
  483. package/dist/src/storage/sqlite/migrations/009_cron_jobs.sql +24 -0
  484. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  485. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  486. package/dist/src/storage/sqlite/migrations/runner.js +4 -4
  487. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  488. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  489. package/dist/src/storage/sqlite/schema.js +2 -2
  490. package/dist/src/storage/sqlite/schema.sql +188 -0
  491. package/dist/src/tui/clipboard-image.js +3 -3
  492. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  493. package/dist/src/tui/theme-manager.js +1 -1
  494. package/dist/src/tui/tui-command-formatters.js +4 -4
  495. package/dist/src/tui/tui-commands.js +2 -2
  496. package/dist/src/tui/tui-keybindings-file.js +1 -1
  497. package/dist/src/tui/tui-scoped-models.js +2 -2
  498. package/dist/src/tui/tui-settings.js +1 -1
  499. package/dist/src/tui/tui-startup-resources.js +1 -1
  500. package/dist/src/tui/tui.js +6 -6
  501. package/dist/src/tunnel/frpc-binary.js +4 -4
  502. package/dist/src/tunnel/frpc-config.js +1 -1
  503. package/dist/src/tunnel/frpc-extract.js +1 -1
  504. package/dist/src/tunnel/tunnel-state.js +1 -1
  505. package/dist/src/utils/logger/audit.js +1 -1
  506. package/dist/src/utils/logger/log-store.js +1 -1
  507. package/dist/src/utils/logger/rotation.js +1 -1
  508. package/dist/src/utils/logger/stats.d.ts +1 -1
  509. package/dist/src/utils/logger/streams.js +1 -1
  510. package/dist/src/voice/tts/audio.js +1 -1
  511. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  512. package/dist/src/workflows/domain/run.d.ts +1 -0
  513. package/dist/src/workflows/domain/run.js.map +1 -1
  514. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  515. package/dist/src/workflows/engine/projector.js +23 -14
  516. package/dist/src/workflows/engine/projector.js.map +1 -1
  517. package/dist/src/workflows/engine/workflow-engine.d.ts +1 -0
  518. package/dist/src/workflows/engine/workflow-engine.js +36 -0
  519. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  520. package/dist/src/workflows/index.js +1 -1
  521. package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
  522. package/dist/src/workflows/service/workflow-run-service.js +7 -3
  523. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  524. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -0
  525. package/dist/src/workflows/service/workflow-session-bridge.js +8 -1
  526. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  527. package/dist/src/workflows/store/event-store.js +1 -1
  528. package/dist/src/workflows/store/run-index-store.d.ts +8 -0
  529. package/dist/src/workflows/store/run-index-store.js +58 -0
  530. package/dist/src/workflows/store/run-index-store.js.map +1 -0
  531. package/dist/src/workflows/store/run-store.d.ts +2 -0
  532. package/dist/src/workflows/store/run-store.js +15 -22
  533. package/dist/src/workflows/store/run-store.js.map +1 -1
  534. package/package.json +10 -5
  535. package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
  536. package/dist/gateway/static/root/assets/agents-CFFioJCI.js +0 -78
  537. package/dist/gateway/static/root/assets/apps-page-BYDmkbzG.js +0 -1
  538. package/dist/gateway/static/root/assets/channels-settings-CsbDaMvd.js +0 -1
  539. package/dist/gateway/static/root/assets/circle-check-C23XjkUj.js +0 -1
  540. package/dist/gateway/static/root/assets/copy-Dv6d4Dvw.js +0 -1
  541. package/dist/gateway/static/root/assets/cron-page-Apk-7p4p.js +0 -1
  542. package/dist/gateway/static/root/assets/dist-DmGDgpy2.js +0 -1
  543. package/dist/gateway/static/root/assets/extension-debug-page-pxFC-tUa.js +0 -1
  544. package/dist/gateway/static/root/assets/extension-settings-page-COXSv6xP.js +0 -1
  545. package/dist/gateway/static/root/assets/fetch-CFdKBnE6.js +0 -1
  546. package/dist/gateway/static/root/assets/gateway-startup-retry-DdngdObI.js +0 -1
  547. package/dist/gateway/static/root/assets/heartbeat-config-api-DcmAMYmN.js +0 -1
  548. package/dist/gateway/static/root/assets/index-C_2yKRJX.js +0 -4845
  549. package/dist/gateway/static/root/assets/index-DI5_GsZt.css +0 -1
  550. package/dist/gateway/static/root/assets/logs-page-DvTWUOzd.js +0 -2
  551. package/dist/gateway/static/root/assets/note-detail-page-CZbdugWZ.js +0 -180
  552. package/dist/gateway/static/root/assets/note-time-RdyBZxj3.js +0 -1
  553. package/dist/gateway/static/root/assets/notes-page-mEAwy3e1.js +0 -1
  554. package/dist/gateway/static/root/assets/schema-form-DEvdni_r.js +0 -1
  555. package/dist/gateway/static/root/assets/sessions-page-BsgffzV4.js +0 -1
  556. package/dist/gateway/static/root/assets/settings-advanced-gate-t6v8Dwb8.js +0 -2
  557. package/dist/gateway/static/root/assets/settings-form-section-BoYYZmJG.js +0 -1
  558. package/dist/gateway/static/root/assets/settings-page-ClIthYF8.js +0 -3
  559. package/dist/gateway/static/root/assets/share-preview-page-Dd9et7KD.js +0 -2
  560. package/dist/gateway/static/root/assets/skills-page-DEXtxyfQ.js +0 -2
  561. package/dist/gateway/static/root/assets/theme-store-BZozwAeK.js +0 -1
  562. package/dist/gateway/static/root/assets/url-DQRqHuL-.js +0 -3
  563. package/dist/gateway/static/root/assets/vendor-codemirror-DYoKfS8f.js +0 -45
  564. package/dist/gateway/static/root/assets/voice-api-key-field-CNrKzQrf.js +0 -1
  565. package/dist/gateway/static/root/assets/workflows-page-EMZkzJNN.js +0 -18
  566. package/dist/gateway/static/root/favicon-16.png +0 -0
  567. package/dist/gateway/static/root/favicon-32.png +0 -0
  568. package/dist/src/agent/goals/checklist-user.d.ts +0 -24
  569. package/dist/src/agent/goals/checklist-user.js +0 -92
  570. package/dist/src/agent/goals/checklist-user.js.map +0 -1
  571. package/dist/src/agent/goals/goal-run-store.d.ts +0 -19
  572. package/dist/src/agent/goals/goal-run-store.js +0 -138
  573. package/dist/src/agent/goals/goal-run-store.js.map +0 -1
  574. package/dist/src/agent/goals/goal-run-types.d.ts +0 -28
  575. package/dist/src/agent/goals/goal-run-types.js +0 -6
  576. package/dist/src/agent/goals/goal-run-types.js.map +0 -1
  577. package/dist/src/agent/goals/patch-from-user-action.d.ts +0 -20
  578. package/dist/src/agent/goals/patch-from-user-action.js +0 -103
  579. package/dist/src/agent/goals/patch-from-user-action.js.map +0 -1
  580. package/dist/src/cron/persistence.d.ts +0 -62
  581. package/dist/src/cron/persistence.js +0 -188
  582. package/dist/src/cron/persistence.js.map +0 -1
  583. /package/dist/gateway/static/root/assets/{note-detail-page-D4ZIVQbk.css → block-editor-D4ZIVQbk.css} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-engine.js","names":[],"sources":["../../../../src/workflows/engine/workflow-engine.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { WorkflowDefinition } from '../domain/definition.js';\nimport type { WorkflowEventEnvelope, WorkflowEventPayload, WorkflowEventType } from '../domain/event.js';\nimport type { WorkflowRun, WorkflowRunError, WorkflowRunMetadata, WorkflowRunSource, WorkflowRunView } from '../domain/run.js';\nimport type { WorkflowResultEnvelope } from '../domain/result.js';\nimport { validateWorkflowJsonSchema } from '../domain/schema-validation.js';\nimport { WorkflowEventStore } from '../store/event-store.js';\nimport { WorkflowRunStore } from '../store/run-store.js';\nimport { createScriptWorkflowRuntime } from '../runtime/script-workflow-runtime.js';\nimport type { WorkflowRuntime } from '../runtime/workflow-runtime-port.js';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\nimport { workflowStepLabel } from '../../agent/workflow/step-labels.js';\nimport type { SubagentProgressEvent } from '../../agent/workflow/types.js';\nimport type { WorkflowScriptSubagentRunner } from '../runtime/script-runtime.js';\nimport type { WorkflowAgentInvocationSnapshot } from '../domain/index.js';\n\nexport interface WorkflowEngineOptions {\n cwd: string;\n eventStore: WorkflowEventStore;\n runStore: WorkflowRunStore;\n runner: WorkflowScriptSubagentRunner;\n runtime?: WorkflowRuntime;\n hooks?: WorkflowEngineHook[];\n subagentSessionKeyFactory?: (ctx: { runId: string; agentId: string }) => string;\n parentSessionKey?: string;\n onEventAppended?: (event: WorkflowEventEnvelope) => void;\n onRunViewUpdated?: (view: WorkflowRunView) => void;\n resolveModelId?: (modelId: string) => Model<Api>;\n}\n\nexport interface WorkflowEngineHook {\n beforeRun?(ctx: WorkflowRunHookContext): Promise<void> | void;\n beforeAgent?(ctx: WorkflowAgentHookContext): Promise<void> | void;\n afterAgent?(ctx: WorkflowAgentCompletedHookContext): Promise<void> | void;\n afterRun?(ctx: WorkflowRunCompletedHookContext): Promise<void> | void;\n}\n\nexport interface WorkflowRunHookContext {\n definition: WorkflowDefinition;\n run: WorkflowRun;\n}\n\nexport interface WorkflowAgentHookContext {\n runId: string;\n agentId: string;\n label: string;\n phaseId?: string;\n prompt: string;\n}\n\nexport interface WorkflowAgentCompletedHookContext {\n runId: string;\n agentId: string;\n status: 'done' | 'error' | 'skipped';\n resultPreview?: string;\n}\n\nexport interface WorkflowRunCompletedHookContext {\n runId: string;\n status: 'succeeded' | 'failed' | 'cancelled';\n}\n\nexport interface StartWorkflowRunOptions {\n input?: unknown;\n source: WorkflowRunSource;\n metadata?: WorkflowRunMetadata;\n goal?: string;\n runId?: string;\n signal?: AbortSignal;\n concurrency?: number;\n maxSubagents?: number;\n tokenBudget?: number | null;\n timeoutSec?: number;\n}\n\nexport interface WorkflowReplayAgentTarget {\n agentId: string;\n label: string;\n phaseId?: string;\n phaseTitle?: string;\n prompt: string;\n invocation?: WorkflowAgentInvocationSnapshot;\n}\n\nexport interface StartWorkflowReplayRunOptions extends StartWorkflowRunOptions {\n sourceRunId: string;\n replayScope: 'failed_agents' | 'failed_phases';\n targets: WorkflowReplayAgentTarget[];\n}\n\nexport class WorkflowEngine {\n constructor(private readonly options: WorkflowEngineOptions) {}\n\n async startRun(definition: WorkflowDefinition, options: StartWorkflowRunOptions): Promise<WorkflowRunView> {\n const runId = options.runId ?? randomUUID();\n const createdAtMs = Date.now();\n const phaseTitleToId = buildPhaseTitleToId(definition);\n let currentPhaseId: string | undefined;\n let eventQueue = Promise.resolve();\n const progressRecorders = new Map<number, AgentProgressRecorder>();\n const subagentSessionKeys = new Map<number, string>();\n\n const run: WorkflowRun = {\n id: runId,\n definitionId: definition.id,\n definitionVersion: definition.version,\n title: definition.title,\n goal: options.goal ?? definition.description,\n input: options.input ?? {},\n status: 'queued',\n source: options.source,\n metadata: options.metadata,\n metrics: {\n agentCount: 0,\n doneAgentCount: 0,\n errorAgentCount: 0,\n skippedAgentCount: 0,\n artifactCount: 0,\n },\n createdAtMs,\n };\n\n const appendEvent = (type: WorkflowEventType, payload: WorkflowEventPayload, createdAtMsOverride?: number) => {\n eventQueue = eventQueue\n .then(() =>\n this.options.eventStore.append({\n runId,\n type,\n payload,\n createdAtMs: createdAtMsOverride,\n }),\n )\n .then(async (event) => {\n this.options.onEventAppended?.(event);\n const view = await this.options.runStore.rebuildRunView(runId);\n if (view) {\n this.options.onRunViewUpdated?.(view);\n }\n });\n return eventQueue;\n };\n\n await appendEvent('run_queued', { run }, createdAtMs);\n await this.callHooks((hook) => hook.beforeRun?.({ definition, run }));\n await appendEvent('run_started', { startedAtMs: Date.now() });\n\n try {\n const runtime = this.options.runtime ?? createScriptWorkflowRuntime();\n const runtimeResult = await withWorkflowTimeout(\n runtime.run<unknown>(\n definition.runtime.source,\n {\n runner: this.options.runner,\n resolveModelId: this.options.resolveModelId,\n },\n {\n cwd: this.options.cwd,\n args: options.input,\n signal: options.signal,\n concurrency: options.concurrency ?? definition.defaults.concurrency,\n maxSubagents: options.maxSubagents ?? definition.defaults.maxSubagents,\n tokenBudget: options.tokenBudget,\n onPhase: (title) => {\n const nextPhaseId = phaseTitleToId.get(title) ?? normalizePhaseId(title);\n if (currentPhaseId && currentPhaseId !== nextPhaseId) {\n void appendEvent('phase_completed', { phaseId: currentPhaseId });\n }\n currentPhaseId = nextPhaseId;\n void appendEvent('phase_started', { phaseId: nextPhaseId, title });\n },\n onLog: (message) => {\n void appendEvent('log_appended', { message });\n },\n onAgentQueued: (event) => {\n const agentId = formatRuntimeAgentId(event.id);\n const subagentSessionKey = this.options.subagentSessionKeyFactory?.({ runId, agentId }) ?? defaultSubagentSessionKey(runId, agentId);\n subagentSessionKeys.set(event.id, subagentSessionKey);\n const phaseId = event.phase ? (phaseTitleToId.get(event.phase) ?? normalizePhaseId(event.phase)) : currentPhaseId;\n void this.callHooks((hook) => hook.beforeAgent?.({\n runId,\n agentId,\n label: event.label,\n phaseId,\n prompt: event.prompt,\n }));\n void appendEvent('agent_queued', {\n agentId,\n label: event.label,\n phaseId,\n prompt: event.prompt,\n sessionKey: subagentSessionKey,\n invocation: event.invocation,\n });\n },\n onAgentStart: (event) => {\n void appendEvent('agent_started', { agentId: formatRuntimeAgentId(event.id) });\n },\n onAgentEnd: (event) => {\n const agentId = formatRuntimeAgentId(event.id);\n const completedStatus = normalizeCompletedAgentStatus(event.status);\n const resultPreview = previewWorkflowValue(event.result);\n progressRecorders.get(event.id)?.completeOpenSteps(completedStatus === 'done' ? 'done' : 'error');\n progressRecorders.delete(event.id);\n void appendEvent('agent_completed', {\n agentId,\n status: completedStatus,\n resultPreview,\n error: completedStatus === 'error' ? 'Subagent failed' : undefined,\n }).then(() => this.callHooks((hook) => hook.afterAgent?.({\n runId,\n agentId,\n status: completedStatus,\n resultPreview,\n })).catch(() => undefined));\n },\n enhanceSubagentRun: (ctx) => {\n const recorder = new AgentProgressRecorder({\n agentId: formatRuntimeAgentId(ctx.id),\n appendEvent,\n });\n progressRecorders.set(ctx.id, recorder);\n const agentId = formatRuntimeAgentId(ctx.id);\n const sessionKey = subagentSessionKeys.get(ctx.id)\n ?? this.options.subagentSessionKeyFactory?.({ runId, agentId })\n ?? defaultSubagentSessionKey(runId, agentId);\n subagentSessionKeys.set(ctx.id, sessionKey);\n return {\n sessionKey,\n sessionMetadata: {\n parentSessionKey: this.options.parentSessionKey,\n workflowRunId: runId,\n workflowDefinitionId: definition.id,\n workflowAgentId: agentId,\n workflowAgentLabel: ctx.label,\n },\n onProgress: (event) => recorder.onProgress(event),\n };\n },\n },\n ),\n options.timeoutSec ?? definition.defaults.timeoutSec,\n );\n\n await eventQueue;\n if (currentPhaseId) {\n await appendEvent('phase_completed', { phaseId: currentPhaseId });\n }\n assertWorkflowOutput(definition, runtimeResult.result);\n await appendEvent('run_completed', { result: toWorkflowResultEnvelope(runtimeResult.result) });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'succeeded' }));\n } catch (err) {\n await eventQueue;\n const error = toWorkflowRunError(err, options.signal?.aborted === true, options.signal?.reason);\n if (error.code === 'cancelled') {\n await appendEvent('run_cancelled', { reason: error.message });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'cancelled' }));\n } else {\n await appendEvent('run_failed', { error });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'failed' }));\n }\n }\n\n const view = await this.options.runStore.readRunView(runId);\n if (!view) {\n throw new Error(`workflow run view was not created for ${runId}`);\n }\n return view;\n }\n\n async startReplayRun(definition: WorkflowDefinition, options: StartWorkflowReplayRunOptions): Promise<WorkflowRunView> {\n const runId = options.runId ?? randomUUID();\n const createdAtMs = Date.now();\n let eventQueue = Promise.resolve();\n const progressRecorders = new Map<string, AgentProgressRecorder>();\n\n const run: WorkflowRun = {\n id: runId,\n definitionId: definition.id,\n definitionVersion: definition.version,\n title: `${definition.title} replay`,\n goal: options.goal ?? definition.description,\n input: options.input ?? {},\n status: 'queued',\n source: options.source,\n metadata: options.metadata,\n metrics: {\n agentCount: 0,\n doneAgentCount: 0,\n errorAgentCount: 0,\n skippedAgentCount: 0,\n artifactCount: 0,\n },\n createdAtMs,\n };\n\n const appendEvent = (type: WorkflowEventType, payload: WorkflowEventPayload, createdAtMsOverride?: number) => {\n eventQueue = eventQueue\n .then(() =>\n this.options.eventStore.append({\n runId,\n type,\n payload,\n createdAtMs: createdAtMsOverride,\n }),\n )\n .then(async (event) => {\n this.options.onEventAppended?.(event);\n const view = await this.options.runStore.rebuildRunView(runId);\n if (view) {\n this.options.onRunViewUpdated?.(view);\n }\n });\n return eventQueue;\n };\n\n await appendEvent('run_queued', { run }, createdAtMs);\n await this.callHooks((hook) => hook.beforeRun?.({ definition, run }));\n await appendEvent('run_started', { startedAtMs: Date.now() });\n\n try {\n const result = await withWorkflowTimeout(\n this.runReplayTargets({\n definition,\n runId,\n targets: options.targets,\n signal: options.signal,\n appendEvent,\n progressRecorders,\n }),\n options.timeoutSec ?? definition.defaults.timeoutSec,\n );\n\n await eventQueue;\n if (result.errors.length > 0) {\n await appendEvent('run_failed', {\n error: {\n code: 'runtime_error',\n message: `Replay completed with ${result.errors.length} failed target${result.errors.length === 1 ? '' : 's'}.`,\n detail: result.errors.join('\\n'),\n recoverable: true,\n },\n });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'failed' }));\n } else {\n await appendEvent('run_completed', { result: buildReplayResultEnvelope(options, result.results) });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'succeeded' }));\n }\n } catch (err) {\n await eventQueue;\n const error = toWorkflowRunError(err, options.signal?.aborted === true, options.signal?.reason);\n if (error.code === 'cancelled') {\n await appendEvent('run_cancelled', { reason: error.message });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'cancelled' }));\n } else {\n await appendEvent('run_failed', { error });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'failed' }));\n }\n }\n\n const view = await this.options.runStore.readRunView(runId);\n if (!view) {\n throw new Error(`workflow replay run view was not created for ${runId}`);\n }\n return view;\n }\n\n private async runReplayTargets(params: {\n definition: WorkflowDefinition;\n runId: string;\n targets: WorkflowReplayAgentTarget[];\n signal?: AbortSignal;\n appendEvent: AppendWorkflowEvent;\n progressRecorders: Map<string, AgentProgressRecorder>;\n }): Promise<{ results: WorkflowReplayTargetResult[]; errors: string[] }> {\n const results: WorkflowReplayTargetResult[] = [];\n const errors: string[] = [];\n const targetsByPhase = groupReplayTargetsByPhase(params.targets);\n\n for (const group of targetsByPhase) {\n throwIfSignalAborted(params.signal);\n if (group.phaseId && group.phaseTitle) {\n await params.appendEvent('phase_started', { phaseId: group.phaseId, title: group.phaseTitle });\n }\n\n const phaseResults = await Promise.all(\n group.targets.map((target) => this.runReplayTarget({ ...params, target })),\n );\n results.push(...phaseResults);\n errors.push(...phaseResults.filter((item) => item.status === 'error').map((item) => `${item.label}: ${item.error ?? 'failed'}`));\n\n if (group.phaseId && phaseResults.every((item) => item.status === 'done')) {\n await params.appendEvent('phase_completed', { phaseId: group.phaseId });\n }\n }\n\n return { results, errors };\n }\n\n private async runReplayTarget(params: {\n definition: WorkflowDefinition;\n runId: string;\n target: WorkflowReplayAgentTarget;\n signal?: AbortSignal;\n appendEvent: AppendWorkflowEvent;\n progressRecorders: Map<string, AgentProgressRecorder>;\n }): Promise<WorkflowReplayTargetResult> {\n const { target } = params;\n const invocation = normalizeReplayInvocation(target);\n const sessionKey = this.options.subagentSessionKeyFactory?.({ runId: params.runId, agentId: target.agentId })\n ?? defaultSubagentSessionKey(params.runId, target.agentId);\n await this.callHooks((hook) => hook.beforeAgent?.({\n runId: params.runId,\n agentId: target.agentId,\n label: invocation.label,\n phaseId: target.phaseId,\n prompt: invocation.prompt,\n }));\n await params.appendEvent('agent_queued', {\n agentId: target.agentId,\n label: invocation.label,\n phaseId: target.phaseId,\n prompt: invocation.prompt,\n sessionKey,\n invocation,\n });\n await params.appendEvent('agent_started', { agentId: target.agentId });\n\n const recorder = new AgentProgressRecorder({\n agentId: target.agentId,\n appendEvent: params.appendEvent,\n });\n params.progressRecorders.set(target.agentId, recorder);\n\n try {\n throwIfSignalAborted(params.signal);\n const model = resolveReplayModel(invocation, this.options.resolveModelId);\n const result = await this.options.runner.run<unknown>(invocation.prompt, {\n label: invocation.label,\n schema: invocation.schema as never,\n allowedToolNames: invocation.toolset,\n maxIterations: invocation.maxIterations,\n phase: invocation.phase ?? target.phaseTitle,\n signal: params.signal,\n model,\n sessionKey,\n sessionMetadata: {\n parentSessionKey: this.options.parentSessionKey,\n workflowRunId: params.runId,\n workflowDefinitionId: params.definition.id,\n workflowAgentId: target.agentId,\n workflowAgentLabel: invocation.label,\n },\n onProgress: (event) => recorder.onProgress(event),\n });\n throwIfSignalAborted(params.signal);\n const status = result === null ? 'error' : 'done';\n const resultPreview = previewWorkflowValue(result);\n recorder.completeOpenSteps(status === 'done' ? 'done' : 'error');\n await params.appendEvent('agent_completed', {\n agentId: target.agentId,\n status,\n resultPreview,\n error: status === 'error' ? 'Replay target failed' : undefined,\n });\n await this.callHooks((hook) => hook.afterAgent?.({\n runId: params.runId,\n agentId: target.agentId,\n status,\n resultPreview,\n }));\n return { agentId: target.agentId, label: invocation.label, phaseId: target.phaseId, status, resultPreview };\n } catch (err) {\n if (params.signal?.aborted) throw err;\n const message = err instanceof Error ? err.message : String(err);\n recorder.completeOpenSteps('error');\n await params.appendEvent('agent_completed', {\n agentId: target.agentId,\n status: 'error',\n error: message,\n });\n await this.callHooks((hook) => hook.afterAgent?.({\n runId: params.runId,\n agentId: target.agentId,\n status: 'error',\n }));\n return { agentId: target.agentId, label: invocation.label, phaseId: target.phaseId, status: 'error', error: message };\n } finally {\n params.progressRecorders.delete(target.agentId);\n }\n }\n\n private async callHooks(call: (hook: WorkflowEngineHook) => Promise<void> | void | undefined): Promise<void> {\n for (const hook of this.options.hooks ?? []) {\n try {\n await call(hook);\n } catch {\n // Hooks are extension points; workflow execution remains authoritative.\n }\n }\n }\n}\n\ninterface WorkflowReplayTargetResult {\n agentId: string;\n label: string;\n phaseId?: string;\n status: 'done' | 'error';\n resultPreview?: string;\n error?: string;\n}\n\nclass WorkflowEngineRunError extends Error {\n constructor(\n readonly code: WorkflowRunError['code'],\n message: string,\n readonly recoverable: boolean,\n readonly detail?: string,\n ) {\n super(message);\n this.name = 'WorkflowEngineRunError';\n }\n}\n\ntype AppendWorkflowEvent = (\n type: WorkflowEventType,\n payload: WorkflowEventPayload,\n createdAtMsOverride?: number,\n) => Promise<void>;\n\nclass AgentProgressRecorder {\n private readonly activeToolStepIds = new Map<string, string>();\n private activeIterationStepId: string | null = null;\n private activeThinkingStepId: string | null = null;\n private activeLlmStepId: string | null = null;\n private sequence = 0;\n\n constructor(\n private readonly options: {\n agentId: string;\n appendEvent: AppendWorkflowEvent;\n },\n ) {}\n\n onProgress(event: SubagentProgressEvent): void {\n switch (event.type) {\n case 'tool_start':\n this.startToolStep(event);\n return;\n case 'tool_end':\n this.completeToolStep(event);\n return;\n case 'iteration':\n this.replaceSingletonStep('iteration', this.buildIterationLabel(event.count, event.max), 'llm');\n return;\n case 'thinking_delta':\n this.ensureSingletonStep('thinking', 'Thinking', 'thinking');\n return;\n case 'text_delta':\n this.ensureSingletonStep('llm', 'Writing response', 'llm');\n return;\n default:\n return;\n }\n }\n\n completeOpenSteps(status: 'done' | 'error'): void {\n for (const stepId of this.activeToolStepIds.values()) {\n void this.options.appendEvent('agent_step_completed', {\n agentId: this.options.agentId,\n stepId,\n status,\n });\n }\n this.activeToolStepIds.clear();\n this.completeSingletonStep('iteration', status);\n this.completeSingletonStep('thinking', status);\n this.completeSingletonStep('llm', status);\n }\n\n private startToolStep(event: Extract<SubagentProgressEvent, { type: 'tool_start' }>): void {\n const stepId = this.nextStepId('tool');\n const { label, detail } = workflowStepLabel(event.toolName, event.args);\n this.activeToolStepIds.set(event.toolCallId, stepId);\n void this.options.appendEvent('agent_step_started', {\n agentId: this.options.agentId,\n stepId,\n label,\n kind: 'tool',\n toolName: event.toolName,\n detail: detail ?? previewWorkflowValue(event.args),\n });\n }\n\n private completeToolStep(event: Extract<SubagentProgressEvent, { type: 'tool_end' }>): void {\n const stepId = this.activeToolStepIds.get(event.toolCallId);\n if (!stepId) return;\n this.activeToolStepIds.delete(event.toolCallId);\n void this.options.appendEvent('agent_step_completed', {\n agentId: this.options.agentId,\n stepId,\n status: event.isError ? 'error' : 'done',\n resultPreview: event.resultPreview,\n error: event.error,\n });\n }\n\n private replaceSingletonStep(\n slot: 'iteration' | 'thinking' | 'llm',\n label: string,\n kind: 'tool' | 'llm' | 'thinking',\n ): void {\n this.completeSingletonStep(slot, 'done');\n this.ensureSingletonStep(slot, label, kind);\n }\n\n private ensureSingletonStep(\n slot: 'iteration' | 'thinking' | 'llm',\n label: string,\n kind: 'tool' | 'llm' | 'thinking',\n ): void {\n if (this.getSingletonStepId(slot)) return;\n const stepId = this.nextStepId(slot);\n this.setSingletonStepId(slot, stepId);\n void this.options.appendEvent('agent_step_started', {\n agentId: this.options.agentId,\n stepId,\n label,\n kind,\n });\n }\n\n private completeSingletonStep(slot: 'iteration' | 'thinking' | 'llm', status: 'done' | 'error'): void {\n const stepId = this.getSingletonStepId(slot);\n if (!stepId) return;\n this.setSingletonStepId(slot, null);\n void this.options.appendEvent('agent_step_completed', {\n agentId: this.options.agentId,\n stepId,\n status,\n });\n }\n\n private getSingletonStepId(slot: 'iteration' | 'thinking' | 'llm'): string | null {\n if (slot === 'iteration') return this.activeIterationStepId;\n if (slot === 'thinking') return this.activeThinkingStepId;\n return this.activeLlmStepId;\n }\n\n private setSingletonStepId(slot: 'iteration' | 'thinking' | 'llm', stepId: string | null): void {\n if (slot === 'iteration') {\n this.activeIterationStepId = stepId;\n return;\n }\n if (slot === 'thinking') {\n this.activeThinkingStepId = stepId;\n return;\n }\n this.activeLlmStepId = stepId;\n }\n\n private buildIterationLabel(count: number, max: number): string {\n if (max > 0) return `Iteration ${count}/${max}`;\n return `Iteration ${count}`;\n }\n\n private nextStepId(kind: string): string {\n this.sequence += 1;\n return `${this.options.agentId}-${kind}-${this.sequence}`;\n }\n}\n\nfunction buildPhaseTitleToId(definition: WorkflowDefinition): Map<string, string> {\n const phaseTitleToId = new Map<string, string>();\n for (const phase of definition.phases) {\n phaseTitleToId.set(phase.title, phase.id);\n }\n return phaseTitleToId;\n}\n\nfunction normalizePhaseId(title: string): string {\n const normalized = title\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return normalized || 'phase';\n}\n\nfunction withWorkflowTimeout<T>(promise: Promise<T>, timeoutSec: number | undefined): Promise<T> {\n if (typeof timeoutSec !== 'number' || !Number.isFinite(timeoutSec) || timeoutSec <= 0) {\n return promise;\n }\n\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_resolve, reject) => {\n timeout = setTimeout(() => {\n reject(new Error(`workflow timed out after ${timeoutSec}s`));\n }, timeoutSec * 1000);\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n if (timeout) clearTimeout(timeout);\n });\n}\n\nfunction throwIfSignalAborted(signal: AbortSignal | undefined): void {\n if (!signal?.aborted) return;\n const reason = signal.reason;\n if (reason instanceof Error) throw reason;\n if (reason) throw new Error(String(reason));\n throw new Error('workflow aborted');\n}\n\nfunction groupReplayTargetsByPhase(targets: WorkflowReplayAgentTarget[]): Array<{\n phaseId?: string;\n phaseTitle?: string;\n targets: WorkflowReplayAgentTarget[];\n}> {\n const groups: Array<{\n key: string;\n phaseId?: string;\n phaseTitle?: string;\n targets: WorkflowReplayAgentTarget[];\n }> = [];\n\n for (const target of targets) {\n const key = target.phaseId ?? '';\n let group = groups.find((item) => item.key === key);\n if (!group) {\n group = {\n key,\n phaseId: target.phaseId,\n phaseTitle: target.phaseTitle,\n targets: [],\n };\n groups.push(group);\n }\n group.targets.push(target);\n }\n\n return groups.map(({ key: _key, ...group }) => group);\n}\n\nfunction buildReplayResultEnvelope(\n options: StartWorkflowReplayRunOptions,\n results: WorkflowReplayTargetResult[],\n): WorkflowResultEnvelope {\n const done = results.filter((item) => item.status === 'done').length;\n return {\n summary: `Replay completed for ${done}/${results.length} target${results.length === 1 ? '' : 's'}.`,\n sections: [\n {\n kind: 'json',\n title: 'Replay targets',\n value: {\n sourceRunId: options.sourceRunId,\n scope: options.replayScope,\n targets: results,\n },\n },\n ],\n structuredOutput: {\n replay: {\n sourceRunId: options.sourceRunId,\n scope: options.replayScope,\n targets: results,\n },\n },\n };\n}\n\nfunction normalizeReplayInvocation(target: WorkflowReplayAgentTarget): WorkflowAgentInvocationSnapshot {\n return {\n prompt: target.invocation?.prompt ?? target.prompt,\n label: target.invocation?.label ?? target.label,\n phase: target.invocation?.phase ?? target.phaseTitle,\n modelRef: target.invocation?.modelRef,\n resolvedModelRef: target.invocation?.resolvedModelRef,\n schema: target.invocation?.schema,\n toolset: target.invocation?.toolset ? [...target.invocation.toolset] : undefined,\n maxIterations: target.invocation?.maxIterations,\n };\n}\n\nfunction resolveReplayModel(\n invocation: WorkflowAgentInvocationSnapshot,\n resolveModelId: ((modelId: string) => Model<Api>) | undefined,\n): Model<Api> | undefined {\n const modelRef = invocation.resolvedModelRef ?? invocation.modelRef;\n if (!modelRef) return undefined;\n if (!resolveModelId) {\n throw new Error(`workflow replay missing resolveModelId; cannot resolve model '${modelRef}'`);\n }\n return resolveModelId(modelRef);\n}\n\nfunction formatRuntimeAgentId(id: number): string {\n return `agent-${id}`;\n}\n\nfunction defaultSubagentSessionKey(runId: string, agentId: string): string {\n return `workflow:${runId}:subagent:${agentId}`;\n}\n\nfunction normalizeCompletedAgentStatus(status: string): 'done' | 'error' | 'skipped' {\n if (status === 'done' || status === 'error' || status === 'skipped') {\n return status;\n }\n return 'error';\n}\n\nfunction previewWorkflowValue(value: unknown): string | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === 'string') {\n return truncate(value, 300);\n }\n try {\n return truncate(JSON.stringify(value), 300);\n } catch {\n return truncate(String(value), 300);\n }\n}\n\nfunction truncate(value: string, maxLength: number): string {\n const trimmed = value.trim();\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n return `${trimmed.slice(0, maxLength - 1)}…`;\n}\n\nfunction toWorkflowResultEnvelope(value: unknown): WorkflowResultEnvelope {\n if (isWorkflowResultEnvelope(value)) {\n return value;\n }\n if (typeof value === 'string') {\n return {\n summary: truncate(value, 800),\n sections: [{ kind: 'text', title: 'Result', content: value }],\n raw: value,\n };\n }\n return {\n summary: 'Workflow completed.',\n sections: [{ kind: 'json', title: 'Result', value }],\n raw: value,\n };\n}\n\nfunction assertWorkflowOutput(definition: WorkflowDefinition, value: unknown): void {\n const validation = validateWorkflowJsonSchema(definition.outputSchema, value);\n if (validation.ok) return;\n throw new WorkflowEngineRunError(\n 'result_validation_failed',\n validation.message ?? 'Workflow result did not match output schema',\n false,\n JSON.stringify(validation.errors ?? []),\n );\n}\n\nfunction isWorkflowResultEnvelope(value: unknown): value is WorkflowResultEnvelope {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const record = value as Partial<WorkflowResultEnvelope>;\n return typeof record.summary === 'string' && Array.isArray(record.sections);\n}\n\nfunction toWorkflowRunError(err: unknown, wasAborted: boolean, abortReason?: unknown): WorkflowRunError {\n if (err instanceof WorkflowEngineRunError) {\n return {\n code: err.code,\n message: err.message,\n detail: err.detail,\n recoverable: err.recoverable,\n };\n }\n const abortMessage = abortReason instanceof Error ? abortReason.message : abortReason ? String(abortReason) : '';\n const message = abortMessage || (err instanceof Error ? err.message : String(err));\n if (/timeout|timed out/i.test(message)) {\n return {\n code: 'timeout',\n message,\n recoverable: true,\n };\n }\n if (wasAborted || /aborted|cancelled/i.test(message)) {\n return {\n code: 'cancelled',\n message: message || 'Workflow run cancelled',\n recoverable: true,\n };\n }\n if (/quota/i.test(message)) {\n return {\n code: 'agent_quota_exceeded',\n message,\n recoverable: true,\n };\n }\n return {\n code: 'runtime_error',\n message,\n recoverable: false,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"workflow-engine.js","names":[],"sources":["../../../../src/workflows/engine/workflow-engine.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { WorkflowDefinition } from '../domain/definition.js';\nimport type { WorkflowEventEnvelope, WorkflowEventPayload, WorkflowEventType } from '../domain/event.js';\nimport type { WorkflowAgentStatus, WorkflowRun, WorkflowRunError, WorkflowRunMetadata, WorkflowRunSource, WorkflowRunView } from '../domain/run.js';\nimport type { WorkflowResultEnvelope } from '../domain/result.js';\nimport { validateWorkflowJsonSchema } from '../domain/schema-validation.js';\nimport { WorkflowEventStore } from '../store/event-store.js';\nimport { WorkflowRunStore } from '../store/run-store.js';\nimport { createScriptWorkflowRuntime } from '../runtime/script-workflow-runtime.js';\nimport type { WorkflowRuntime } from '../runtime/workflow-runtime-port.js';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\nimport { workflowStepLabel } from '../../agent/workflow/step-labels.js';\nimport type { SubagentProgressEvent } from '../../agent/workflow/types.js';\nimport type { WorkflowScriptSubagentRunner } from '../runtime/script-runtime.js';\nimport type { WorkflowAgentInvocationSnapshot } from '../domain/index.js';\n\nexport interface WorkflowEngineOptions {\n cwd: string;\n eventStore: WorkflowEventStore;\n runStore: WorkflowRunStore;\n runner: WorkflowScriptSubagentRunner;\n runtime?: WorkflowRuntime;\n hooks?: WorkflowEngineHook[];\n subagentSessionKeyFactory?: (ctx: { runId: string; agentId: string }) => string;\n parentSessionKey?: string;\n onEventAppended?: (event: WorkflowEventEnvelope) => void;\n onRunViewUpdated?: (view: WorkflowRunView) => void;\n resolveModelId?: (modelId: string) => Model<Api>;\n}\n\nexport interface WorkflowEngineHook {\n beforeRun?(ctx: WorkflowRunHookContext): Promise<void> | void;\n beforeAgent?(ctx: WorkflowAgentHookContext): Promise<void> | void;\n afterAgent?(ctx: WorkflowAgentCompletedHookContext): Promise<void> | void;\n afterRun?(ctx: WorkflowRunCompletedHookContext): Promise<void> | void;\n}\n\nexport interface WorkflowRunHookContext {\n definition: WorkflowDefinition;\n run: WorkflowRun;\n}\n\nexport interface WorkflowAgentHookContext {\n runId: string;\n agentId: string;\n label: string;\n phaseId?: string;\n prompt: string;\n}\n\nexport interface WorkflowAgentCompletedHookContext {\n runId: string;\n agentId: string;\n status: 'done' | 'error' | 'skipped';\n resultPreview?: string;\n}\n\nexport interface WorkflowRunCompletedHookContext {\n runId: string;\n status: 'succeeded' | 'failed' | 'cancelled';\n}\n\nexport interface StartWorkflowRunOptions {\n input?: unknown;\n source: WorkflowRunSource;\n metadata?: WorkflowRunMetadata;\n goal?: string;\n runId?: string;\n signal?: AbortSignal;\n concurrency?: number;\n maxSubagents?: number;\n tokenBudget?: number | null;\n timeoutSec?: number;\n}\n\nexport interface WorkflowReplayAgentTarget {\n agentId: string;\n label: string;\n phaseId?: string;\n phaseTitle?: string;\n prompt: string;\n invocation?: WorkflowAgentInvocationSnapshot;\n}\n\nexport interface StartWorkflowReplayRunOptions extends StartWorkflowRunOptions {\n sourceRunId: string;\n replayScope: 'failed_agents' | 'failed_phases';\n targets: WorkflowReplayAgentTarget[];\n}\n\nexport class WorkflowEngine {\n constructor(private readonly options: WorkflowEngineOptions) {}\n\n async startRun(definition: WorkflowDefinition, options: StartWorkflowRunOptions): Promise<WorkflowRunView> {\n const runId = options.runId ?? randomUUID();\n const createdAtMs = Date.now();\n const phaseTitleToId = buildPhaseTitleToId(definition);\n let currentPhaseId: string | undefined;\n let eventQueue = Promise.resolve();\n const progressRecorders = new Map<number, AgentProgressRecorder>();\n const runtimeAgentStatuses = new Map<number, WorkflowAgentStatus | 'queued'>();\n const subagentSessionKeys = new Map<number, string>();\n\n const run: WorkflowRun = {\n id: runId,\n definitionId: definition.id,\n definitionVersion: definition.version,\n title: definition.title,\n goal: options.goal ?? definition.description,\n input: options.input ?? {},\n status: 'queued',\n source: options.source,\n metadata: options.metadata,\n metrics: {\n agentCount: 0,\n doneAgentCount: 0,\n errorAgentCount: 0,\n skippedAgentCount: 0,\n artifactCount: 0,\n },\n createdAtMs,\n };\n\n const appendEvent = (type: WorkflowEventType, payload: WorkflowEventPayload, createdAtMsOverride?: number) => {\n eventQueue = eventQueue\n .then(() =>\n this.options.eventStore.append({\n runId,\n type,\n payload,\n createdAtMs: createdAtMsOverride,\n }),\n )\n .then(async (event) => {\n this.options.onEventAppended?.(event);\n const view = await this.options.runStore.rebuildRunView(runId);\n if (view) {\n this.options.onRunViewUpdated?.(view);\n }\n });\n return eventQueue;\n };\n\n await appendEvent('run_queued', { run }, createdAtMs);\n await this.callHooks((hook) => hook.beforeRun?.({ definition, run }));\n await appendEvent('run_started', { startedAtMs: Date.now() });\n\n try {\n const runtime = this.options.runtime ?? createScriptWorkflowRuntime();\n const runtimeResult = await withWorkflowTimeout(\n runtime.run<unknown>(\n definition.runtime.source,\n {\n runner: this.options.runner,\n resolveModelId: this.options.resolveModelId,\n },\n {\n cwd: this.options.cwd,\n args: options.input,\n signal: options.signal,\n concurrency: options.concurrency ?? definition.defaults.concurrency,\n maxSubagents: options.maxSubagents ?? definition.defaults.maxSubagents,\n tokenBudget: options.tokenBudget,\n onPhase: (title) => {\n const nextPhaseId = phaseTitleToId.get(title) ?? normalizePhaseId(title);\n if (currentPhaseId && currentPhaseId !== nextPhaseId) {\n void appendEvent('phase_completed', { phaseId: currentPhaseId });\n }\n currentPhaseId = nextPhaseId;\n void appendEvent('phase_started', { phaseId: nextPhaseId, title });\n },\n onLog: (message) => {\n void appendEvent('log_appended', { message });\n },\n onAgentQueued: (event) => {\n const agentId = formatRuntimeAgentId(event.id);\n const subagentSessionKey = this.options.subagentSessionKeyFactory?.({ runId, agentId }) ?? defaultSubagentSessionKey(runId, agentId);\n subagentSessionKeys.set(event.id, subagentSessionKey);\n runtimeAgentStatuses.set(event.id, 'queued');\n const phaseId = event.phase ? (phaseTitleToId.get(event.phase) ?? normalizePhaseId(event.phase)) : currentPhaseId;\n void this.callHooks((hook) => hook.beforeAgent?.({\n runId,\n agentId,\n label: event.label,\n phaseId,\n prompt: event.prompt,\n }));\n void appendEvent('agent_queued', {\n agentId,\n label: event.label,\n phaseId,\n prompt: event.prompt,\n sessionKey: subagentSessionKey,\n invocation: event.invocation,\n });\n },\n onAgentStart: (event) => {\n const currentStatus = runtimeAgentStatuses.get(event.id);\n if (currentStatus && currentStatus !== 'queued' && currentStatus !== 'running') {\n return;\n }\n runtimeAgentStatuses.set(event.id, 'running');\n void appendEvent('agent_started', { agentId: formatRuntimeAgentId(event.id) });\n },\n onAgentEnd: (event) => {\n const currentStatus = runtimeAgentStatuses.get(event.id);\n if (currentStatus && currentStatus !== 'queued' && currentStatus !== 'running') {\n return;\n }\n const agentId = formatRuntimeAgentId(event.id);\n const completedStatus = normalizeCompletedAgentStatus(event.status);\n runtimeAgentStatuses.set(event.id, completedStatus);\n const resultPreview = previewWorkflowValue(event.result);\n progressRecorders.get(event.id)?.completeOpenSteps(completedStatus === 'done' ? 'done' : 'error');\n progressRecorders.delete(event.id);\n void appendEvent('agent_completed', {\n agentId,\n status: completedStatus,\n resultPreview,\n error: completedStatus === 'error' ? 'Subagent failed' : undefined,\n }).then(() => this.callHooks((hook) => hook.afterAgent?.({\n runId,\n agentId,\n status: completedStatus,\n resultPreview,\n })).catch(() => undefined));\n },\n enhanceSubagentRun: (ctx) => {\n const recorder = new AgentProgressRecorder({\n agentId: formatRuntimeAgentId(ctx.id),\n appendEvent,\n });\n progressRecorders.set(ctx.id, recorder);\n const agentId = formatRuntimeAgentId(ctx.id);\n const sessionKey = subagentSessionKeys.get(ctx.id)\n ?? this.options.subagentSessionKeyFactory?.({ runId, agentId })\n ?? defaultSubagentSessionKey(runId, agentId);\n subagentSessionKeys.set(ctx.id, sessionKey);\n return {\n sessionKey,\n sessionMetadata: {\n parentSessionKey: this.options.parentSessionKey,\n workflowRunId: runId,\n workflowDefinitionId: definition.id,\n workflowAgentId: agentId,\n workflowAgentLabel: ctx.label,\n },\n onProgress: (event) => recorder.onProgress(event),\n };\n },\n },\n ),\n options.timeoutSec ?? definition.defaults.timeoutSec,\n );\n\n await eventQueue;\n if (currentPhaseId) {\n await appendEvent('phase_completed', { phaseId: currentPhaseId });\n }\n assertWorkflowOutput(definition, runtimeResult.result);\n await appendEvent('run_completed', { result: toWorkflowResultEnvelope(runtimeResult.result) });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'succeeded' }));\n } catch (err) {\n await eventQueue;\n const error = toWorkflowRunError(err, options.signal?.aborted === true, options.signal?.reason);\n const terminalAgentStatus: WorkflowAgentStatus = error.code === 'cancelled' || error.code === 'timeout' ? 'skipped' : 'error';\n await this.completeOutstandingRuntimeAgents({\n runId,\n statuses: runtimeAgentStatuses,\n progressRecorders,\n appendEvent,\n status: terminalAgentStatus,\n error: terminalAgentStatus === 'error' ? error.message : undefined,\n });\n if (error.code === 'cancelled') {\n await appendEvent('run_cancelled', { reason: error.message });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'cancelled' }));\n } else {\n await appendEvent('run_failed', { error });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'failed' }));\n }\n }\n\n const view = await this.options.runStore.readRunView(runId);\n if (!view) {\n throw new Error(`workflow run view was not created for ${runId}`);\n }\n return view;\n }\n\n async startReplayRun(definition: WorkflowDefinition, options: StartWorkflowReplayRunOptions): Promise<WorkflowRunView> {\n const runId = options.runId ?? randomUUID();\n const createdAtMs = Date.now();\n let eventQueue = Promise.resolve();\n const progressRecorders = new Map<string, AgentProgressRecorder>();\n\n const run: WorkflowRun = {\n id: runId,\n definitionId: definition.id,\n definitionVersion: definition.version,\n title: `${definition.title} replay`,\n goal: options.goal ?? definition.description,\n input: options.input ?? {},\n status: 'queued',\n source: options.source,\n metadata: options.metadata,\n metrics: {\n agentCount: 0,\n doneAgentCount: 0,\n errorAgentCount: 0,\n skippedAgentCount: 0,\n artifactCount: 0,\n },\n createdAtMs,\n };\n\n const appendEvent = (type: WorkflowEventType, payload: WorkflowEventPayload, createdAtMsOverride?: number) => {\n eventQueue = eventQueue\n .then(() =>\n this.options.eventStore.append({\n runId,\n type,\n payload,\n createdAtMs: createdAtMsOverride,\n }),\n )\n .then(async (event) => {\n this.options.onEventAppended?.(event);\n const view = await this.options.runStore.rebuildRunView(runId);\n if (view) {\n this.options.onRunViewUpdated?.(view);\n }\n });\n return eventQueue;\n };\n\n await appendEvent('run_queued', { run }, createdAtMs);\n await this.callHooks((hook) => hook.beforeRun?.({ definition, run }));\n await appendEvent('run_started', { startedAtMs: Date.now() });\n\n try {\n const result = await withWorkflowTimeout(\n this.runReplayTargets({\n definition,\n runId,\n targets: options.targets,\n signal: options.signal,\n appendEvent,\n progressRecorders,\n }),\n options.timeoutSec ?? definition.defaults.timeoutSec,\n );\n\n await eventQueue;\n if (result.errors.length > 0) {\n await appendEvent('run_failed', {\n error: {\n code: 'runtime_error',\n message: `Replay completed with ${result.errors.length} failed target${result.errors.length === 1 ? '' : 's'}.`,\n detail: result.errors.join('\\n'),\n recoverable: true,\n },\n });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'failed' }));\n } else {\n await appendEvent('run_completed', { result: buildReplayResultEnvelope(options, result.results) });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'succeeded' }));\n }\n } catch (err) {\n await eventQueue;\n const error = toWorkflowRunError(err, options.signal?.aborted === true, options.signal?.reason);\n if (error.code === 'cancelled') {\n await appendEvent('run_cancelled', { reason: error.message });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'cancelled' }));\n } else {\n await appendEvent('run_failed', { error });\n await this.callHooks((hook) => hook.afterRun?.({ runId, status: 'failed' }));\n }\n }\n\n const view = await this.options.runStore.readRunView(runId);\n if (!view) {\n throw new Error(`workflow replay run view was not created for ${runId}`);\n }\n return view;\n }\n\n private async runReplayTargets(params: {\n definition: WorkflowDefinition;\n runId: string;\n targets: WorkflowReplayAgentTarget[];\n signal?: AbortSignal;\n appendEvent: AppendWorkflowEvent;\n progressRecorders: Map<string, AgentProgressRecorder>;\n }): Promise<{ results: WorkflowReplayTargetResult[]; errors: string[] }> {\n const results: WorkflowReplayTargetResult[] = [];\n const errors: string[] = [];\n const targetsByPhase = groupReplayTargetsByPhase(params.targets);\n\n for (const group of targetsByPhase) {\n throwIfSignalAborted(params.signal);\n if (group.phaseId && group.phaseTitle) {\n await params.appendEvent('phase_started', { phaseId: group.phaseId, title: group.phaseTitle });\n }\n\n const phaseResults = await Promise.all(\n group.targets.map((target) => this.runReplayTarget({ ...params, target })),\n );\n results.push(...phaseResults);\n errors.push(...phaseResults.filter((item) => item.status === 'error').map((item) => `${item.label}: ${item.error ?? 'failed'}`));\n\n if (group.phaseId && phaseResults.every((item) => item.status === 'done')) {\n await params.appendEvent('phase_completed', { phaseId: group.phaseId });\n }\n }\n\n return { results, errors };\n }\n\n private async runReplayTarget(params: {\n definition: WorkflowDefinition;\n runId: string;\n target: WorkflowReplayAgentTarget;\n signal?: AbortSignal;\n appendEvent: AppendWorkflowEvent;\n progressRecorders: Map<string, AgentProgressRecorder>;\n }): Promise<WorkflowReplayTargetResult> {\n const { target } = params;\n const invocation = normalizeReplayInvocation(target);\n const sessionKey = this.options.subagentSessionKeyFactory?.({ runId: params.runId, agentId: target.agentId })\n ?? defaultSubagentSessionKey(params.runId, target.agentId);\n await this.callHooks((hook) => hook.beforeAgent?.({\n runId: params.runId,\n agentId: target.agentId,\n label: invocation.label,\n phaseId: target.phaseId,\n prompt: invocation.prompt,\n }));\n await params.appendEvent('agent_queued', {\n agentId: target.agentId,\n label: invocation.label,\n phaseId: target.phaseId,\n prompt: invocation.prompt,\n sessionKey,\n invocation,\n });\n await params.appendEvent('agent_started', { agentId: target.agentId });\n\n const recorder = new AgentProgressRecorder({\n agentId: target.agentId,\n appendEvent: params.appendEvent,\n });\n params.progressRecorders.set(target.agentId, recorder);\n\n try {\n throwIfSignalAborted(params.signal);\n const model = resolveReplayModel(invocation, this.options.resolveModelId);\n const result = await this.options.runner.run<unknown>(invocation.prompt, {\n label: invocation.label,\n schema: invocation.schema as never,\n allowedToolNames: invocation.toolset,\n maxIterations: invocation.maxIterations,\n phase: invocation.phase ?? target.phaseTitle,\n signal: params.signal,\n model,\n sessionKey,\n sessionMetadata: {\n parentSessionKey: this.options.parentSessionKey,\n workflowRunId: params.runId,\n workflowDefinitionId: params.definition.id,\n workflowAgentId: target.agentId,\n workflowAgentLabel: invocation.label,\n },\n onProgress: (event) => recorder.onProgress(event),\n });\n throwIfSignalAborted(params.signal);\n const status = result === null ? 'error' : 'done';\n const resultPreview = previewWorkflowValue(result);\n recorder.completeOpenSteps(status === 'done' ? 'done' : 'error');\n await params.appendEvent('agent_completed', {\n agentId: target.agentId,\n status,\n resultPreview,\n error: status === 'error' ? 'Replay target failed' : undefined,\n });\n await this.callHooks((hook) => hook.afterAgent?.({\n runId: params.runId,\n agentId: target.agentId,\n status,\n resultPreview,\n }));\n return { agentId: target.agentId, label: invocation.label, phaseId: target.phaseId, status, resultPreview };\n } catch (err) {\n if (params.signal?.aborted) throw err;\n const message = err instanceof Error ? err.message : String(err);\n recorder.completeOpenSteps('error');\n await params.appendEvent('agent_completed', {\n agentId: target.agentId,\n status: 'error',\n error: message,\n });\n await this.callHooks((hook) => hook.afterAgent?.({\n runId: params.runId,\n agentId: target.agentId,\n status: 'error',\n }));\n return { agentId: target.agentId, label: invocation.label, phaseId: target.phaseId, status: 'error', error: message };\n } finally {\n params.progressRecorders.delete(target.agentId);\n }\n }\n\n private async completeOutstandingRuntimeAgents(params: {\n runId: string;\n statuses: Map<number, WorkflowAgentStatus | 'queued'>;\n progressRecorders: Map<number, AgentProgressRecorder>;\n appendEvent: AppendWorkflowEvent;\n status: Extract<WorkflowAgentStatus, 'done' | 'error' | 'skipped'>;\n error?: string;\n }): Promise<void> {\n for (const [id, currentStatus] of params.statuses) {\n if (currentStatus !== 'queued' && currentStatus !== 'running') {\n continue;\n }\n params.statuses.set(id, params.status);\n const recorder = params.progressRecorders.get(id);\n recorder?.completeOpenSteps(params.status === 'done' ? 'done' : 'error');\n params.progressRecorders.delete(id);\n const agentId = formatRuntimeAgentId(id);\n await params.appendEvent('agent_completed', {\n agentId,\n status: params.status,\n error: params.error,\n });\n await this.callHooks((hook) => hook.afterAgent?.({\n runId: params.runId,\n agentId,\n status: params.status,\n }));\n }\n }\n\n private async callHooks(call: (hook: WorkflowEngineHook) => Promise<void> | void | undefined): Promise<void> {\n for (const hook of this.options.hooks ?? []) {\n try {\n await call(hook);\n } catch {\n // Hooks are extension points; workflow execution remains authoritative.\n }\n }\n }\n}\n\ninterface WorkflowReplayTargetResult {\n agentId: string;\n label: string;\n phaseId?: string;\n status: 'done' | 'error';\n resultPreview?: string;\n error?: string;\n}\n\nclass WorkflowEngineRunError extends Error {\n constructor(\n readonly code: WorkflowRunError['code'],\n message: string,\n readonly recoverable: boolean,\n readonly detail?: string,\n ) {\n super(message);\n this.name = 'WorkflowEngineRunError';\n }\n}\n\ntype AppendWorkflowEvent = (\n type: WorkflowEventType,\n payload: WorkflowEventPayload,\n createdAtMsOverride?: number,\n) => Promise<void>;\n\nclass AgentProgressRecorder {\n private readonly activeToolStepIds = new Map<string, string>();\n private activeIterationStepId: string | null = null;\n private activeThinkingStepId: string | null = null;\n private activeLlmStepId: string | null = null;\n private sequence = 0;\n\n constructor(\n private readonly options: {\n agentId: string;\n appendEvent: AppendWorkflowEvent;\n },\n ) {}\n\n onProgress(event: SubagentProgressEvent): void {\n switch (event.type) {\n case 'tool_start':\n this.startToolStep(event);\n return;\n case 'tool_end':\n this.completeToolStep(event);\n return;\n case 'iteration':\n this.replaceSingletonStep('iteration', this.buildIterationLabel(event.count, event.max), 'llm');\n return;\n case 'thinking_delta':\n this.ensureSingletonStep('thinking', 'Thinking', 'thinking');\n return;\n case 'text_delta':\n this.ensureSingletonStep('llm', 'Writing response', 'llm');\n return;\n default:\n return;\n }\n }\n\n completeOpenSteps(status: 'done' | 'error'): void {\n for (const stepId of this.activeToolStepIds.values()) {\n void this.options.appendEvent('agent_step_completed', {\n agentId: this.options.agentId,\n stepId,\n status,\n });\n }\n this.activeToolStepIds.clear();\n this.completeSingletonStep('iteration', status);\n this.completeSingletonStep('thinking', status);\n this.completeSingletonStep('llm', status);\n }\n\n private startToolStep(event: Extract<SubagentProgressEvent, { type: 'tool_start' }>): void {\n const stepId = this.nextStepId('tool');\n const { label, detail } = workflowStepLabel(event.toolName, event.args);\n this.activeToolStepIds.set(event.toolCallId, stepId);\n void this.options.appendEvent('agent_step_started', {\n agentId: this.options.agentId,\n stepId,\n label,\n kind: 'tool',\n toolName: event.toolName,\n detail: detail ?? previewWorkflowValue(event.args),\n });\n }\n\n private completeToolStep(event: Extract<SubagentProgressEvent, { type: 'tool_end' }>): void {\n const stepId = this.activeToolStepIds.get(event.toolCallId);\n if (!stepId) return;\n this.activeToolStepIds.delete(event.toolCallId);\n void this.options.appendEvent('agent_step_completed', {\n agentId: this.options.agentId,\n stepId,\n status: event.isError ? 'error' : 'done',\n resultPreview: event.resultPreview,\n error: event.error,\n });\n }\n\n private replaceSingletonStep(\n slot: 'iteration' | 'thinking' | 'llm',\n label: string,\n kind: 'tool' | 'llm' | 'thinking',\n ): void {\n this.completeSingletonStep(slot, 'done');\n this.ensureSingletonStep(slot, label, kind);\n }\n\n private ensureSingletonStep(\n slot: 'iteration' | 'thinking' | 'llm',\n label: string,\n kind: 'tool' | 'llm' | 'thinking',\n ): void {\n if (this.getSingletonStepId(slot)) return;\n const stepId = this.nextStepId(slot);\n this.setSingletonStepId(slot, stepId);\n void this.options.appendEvent('agent_step_started', {\n agentId: this.options.agentId,\n stepId,\n label,\n kind,\n });\n }\n\n private completeSingletonStep(slot: 'iteration' | 'thinking' | 'llm', status: 'done' | 'error'): void {\n const stepId = this.getSingletonStepId(slot);\n if (!stepId) return;\n this.setSingletonStepId(slot, null);\n void this.options.appendEvent('agent_step_completed', {\n agentId: this.options.agentId,\n stepId,\n status,\n });\n }\n\n private getSingletonStepId(slot: 'iteration' | 'thinking' | 'llm'): string | null {\n if (slot === 'iteration') return this.activeIterationStepId;\n if (slot === 'thinking') return this.activeThinkingStepId;\n return this.activeLlmStepId;\n }\n\n private setSingletonStepId(slot: 'iteration' | 'thinking' | 'llm', stepId: string | null): void {\n if (slot === 'iteration') {\n this.activeIterationStepId = stepId;\n return;\n }\n if (slot === 'thinking') {\n this.activeThinkingStepId = stepId;\n return;\n }\n this.activeLlmStepId = stepId;\n }\n\n private buildIterationLabel(count: number, max: number): string {\n if (max > 0) return `Iteration ${count}/${max}`;\n return `Iteration ${count}`;\n }\n\n private nextStepId(kind: string): string {\n this.sequence += 1;\n return `${this.options.agentId}-${kind}-${this.sequence}`;\n }\n}\n\nfunction buildPhaseTitleToId(definition: WorkflowDefinition): Map<string, string> {\n const phaseTitleToId = new Map<string, string>();\n for (const phase of definition.phases) {\n phaseTitleToId.set(phase.title, phase.id);\n }\n return phaseTitleToId;\n}\n\nfunction normalizePhaseId(title: string): string {\n const normalized = title\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return normalized || 'phase';\n}\n\nfunction withWorkflowTimeout<T>(promise: Promise<T>, timeoutSec: number | undefined): Promise<T> {\n if (typeof timeoutSec !== 'number' || !Number.isFinite(timeoutSec) || timeoutSec <= 0) {\n return promise;\n }\n\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_resolve, reject) => {\n timeout = setTimeout(() => {\n reject(new Error(`workflow timed out after ${timeoutSec}s`));\n }, timeoutSec * 1000);\n });\n\n return Promise.race([promise, timeoutPromise]).finally(() => {\n if (timeout) clearTimeout(timeout);\n });\n}\n\nfunction throwIfSignalAborted(signal: AbortSignal | undefined): void {\n if (!signal?.aborted) return;\n const reason = signal.reason;\n if (reason instanceof Error) throw reason;\n if (reason) throw new Error(String(reason));\n throw new Error('workflow aborted');\n}\n\nfunction groupReplayTargetsByPhase(targets: WorkflowReplayAgentTarget[]): Array<{\n phaseId?: string;\n phaseTitle?: string;\n targets: WorkflowReplayAgentTarget[];\n}> {\n const groups: Array<{\n key: string;\n phaseId?: string;\n phaseTitle?: string;\n targets: WorkflowReplayAgentTarget[];\n }> = [];\n\n for (const target of targets) {\n const key = target.phaseId ?? '';\n let group = groups.find((item) => item.key === key);\n if (!group) {\n group = {\n key,\n phaseId: target.phaseId,\n phaseTitle: target.phaseTitle,\n targets: [],\n };\n groups.push(group);\n }\n group.targets.push(target);\n }\n\n return groups.map(({ key: _key, ...group }) => group);\n}\n\nfunction buildReplayResultEnvelope(\n options: StartWorkflowReplayRunOptions,\n results: WorkflowReplayTargetResult[],\n): WorkflowResultEnvelope {\n const done = results.filter((item) => item.status === 'done').length;\n return {\n summary: `Replay completed for ${done}/${results.length} target${results.length === 1 ? '' : 's'}.`,\n sections: [\n {\n kind: 'json',\n title: 'Replay targets',\n value: {\n sourceRunId: options.sourceRunId,\n scope: options.replayScope,\n targets: results,\n },\n },\n ],\n structuredOutput: {\n replay: {\n sourceRunId: options.sourceRunId,\n scope: options.replayScope,\n targets: results,\n },\n },\n };\n}\n\nfunction normalizeReplayInvocation(target: WorkflowReplayAgentTarget): WorkflowAgentInvocationSnapshot {\n return {\n prompt: target.invocation?.prompt ?? target.prompt,\n label: target.invocation?.label ?? target.label,\n phase: target.invocation?.phase ?? target.phaseTitle,\n modelRef: target.invocation?.modelRef,\n resolvedModelRef: target.invocation?.resolvedModelRef,\n schema: target.invocation?.schema,\n toolset: target.invocation?.toolset ? [...target.invocation.toolset] : undefined,\n maxIterations: target.invocation?.maxIterations,\n };\n}\n\nfunction resolveReplayModel(\n invocation: WorkflowAgentInvocationSnapshot,\n resolveModelId: ((modelId: string) => Model<Api>) | undefined,\n): Model<Api> | undefined {\n const modelRef = invocation.resolvedModelRef ?? invocation.modelRef;\n if (!modelRef) return undefined;\n if (!resolveModelId) {\n throw new Error(`workflow replay missing resolveModelId; cannot resolve model '${modelRef}'`);\n }\n return resolveModelId(modelRef);\n}\n\nfunction formatRuntimeAgentId(id: number): string {\n return `agent-${id}`;\n}\n\nfunction defaultSubagentSessionKey(runId: string, agentId: string): string {\n return `workflow:${runId}:subagent:${agentId}`;\n}\n\nfunction normalizeCompletedAgentStatus(status: string): 'done' | 'error' | 'skipped' {\n if (status === 'done' || status === 'error' || status === 'skipped') {\n return status;\n }\n return 'error';\n}\n\nfunction previewWorkflowValue(value: unknown): string | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n if (typeof value === 'string') {\n return truncate(value, 300);\n }\n try {\n return truncate(JSON.stringify(value), 300);\n } catch {\n return truncate(String(value), 300);\n }\n}\n\nfunction truncate(value: string, maxLength: number): string {\n const trimmed = value.trim();\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n return `${trimmed.slice(0, maxLength - 1)}…`;\n}\n\nfunction toWorkflowResultEnvelope(value: unknown): WorkflowResultEnvelope {\n if (isWorkflowResultEnvelope(value)) {\n return value;\n }\n if (typeof value === 'string') {\n return {\n summary: truncate(value, 800),\n sections: [{ kind: 'text', title: 'Result', content: value }],\n raw: value,\n };\n }\n return {\n summary: 'Workflow completed.',\n sections: [{ kind: 'json', title: 'Result', value }],\n raw: value,\n };\n}\n\nfunction assertWorkflowOutput(definition: WorkflowDefinition, value: unknown): void {\n const validation = validateWorkflowJsonSchema(definition.outputSchema, value);\n if (validation.ok) return;\n throw new WorkflowEngineRunError(\n 'result_validation_failed',\n validation.message ?? 'Workflow result did not match output schema',\n false,\n JSON.stringify(validation.errors ?? []),\n );\n}\n\nfunction isWorkflowResultEnvelope(value: unknown): value is WorkflowResultEnvelope {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const record = value as Partial<WorkflowResultEnvelope>;\n return typeof record.summary === 'string' && Array.isArray(record.sections);\n}\n\nfunction toWorkflowRunError(err: unknown, wasAborted: boolean, abortReason?: unknown): WorkflowRunError {\n if (err instanceof WorkflowEngineRunError) {\n return {\n code: err.code,\n message: err.message,\n detail: err.detail,\n recoverable: err.recoverable,\n };\n }\n const abortMessage = abortReason instanceof Error ? abortReason.message : abortReason ? String(abortReason) : '';\n const message = abortMessage || (err instanceof Error ? err.message : String(err));\n if (/timeout|timed out/i.test(message)) {\n return {\n code: 'timeout',\n message,\n recoverable: true,\n };\n }\n if (wasAborted || /aborted|cancelled/i.test(message)) {\n return {\n code: 'cancelled',\n message: message || 'Workflow run cancelled',\n recoverable: true,\n };\n }\n if (/quota/i.test(message)) {\n return {\n code: 'agent_quota_exceeded',\n message,\n recoverable: true,\n };\n }\n return {\n code: 'runtime_error',\n message,\n recoverable: false,\n };\n}\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { parseWorkflowScript } from "../agent/workflow/parser.js";
2
2
  import { runWorkflow } from "../agent/workflow/runtime.js";
3
+ import { runViewToSnapshot } from "./service/run-view-to-snapshot.js";
3
4
  import { DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, buildWorkflowDefinition, hashWorkflowStableValue, normalizeWorkflowDefinitionId, toWorkflowDefinitionTitle } from "./domain/definition-utils.js";
4
5
  import { isTerminalWorkflowRunStatus } from "./domain/run.js";
5
6
  import { validateWorkflowDefinitionInput } from "./domain/validation.js";
6
7
  import { validateWorkflowJsonSchema } from "./domain/schema-validation.js";
7
8
  import "./domain/index.js";
8
- import { runViewToSnapshot } from "./service/run-view-to-snapshot.js";
9
9
  import { CatalogWorkflowDefinitionRegistry } from "./registry/catalog-workflow-definition-registry.js";
10
10
  import { projectWorkflowRunView } from "./engine/projector.js";
11
11
  import { ScriptWorkflowRuntime, createScriptWorkflowRuntime } from "./runtime/script-workflow-runtime.js";
@@ -36,6 +36,7 @@ export declare function buildWorkflowRunInputEnvelope(input: unknown, goal?: str
36
36
  export declare function buildWorkflowRunMetadata(params: {
37
37
  definition: WorkflowDefinition;
38
38
  agentId: string;
39
+ goalId?: string;
39
40
  sessionKey: string;
40
41
  source: WorkflowRunSource;
41
42
  input: WorkflowRunInputEnvelope;
@@ -1,10 +1,10 @@
1
- import { extractProfileAgentId } from "../../config/agent-profile.js";
2
1
  import { init_providers, resolveModel } from "../../providers/index.js";
2
+ import { extractProfileAgentId } from "../../config/agent-profile.js";
3
3
  import { DelegateSubagentRunner } from "../../agent/workflow/subagent-runner.js";
4
+ import { resolveModelRef } from "../../config/agent-typed-models.js";
4
5
  import { isTerminalWorkflowRunStatus } from "../domain/run.js";
5
6
  import { validateWorkflowJsonSchema } from "../domain/schema-validation.js";
6
7
  import "../domain/index.js";
7
- import { resolveModelRef } from "../../config/agent-typed-models.js";
8
8
  import { CatalogWorkflowDefinitionRegistry } from "../registry/catalog-workflow-definition-registry.js";
9
9
  import { WorkflowEngine } from "../engine/workflow-engine.js";
10
10
  import "../engine/index.js";
@@ -81,6 +81,7 @@ var WorkflowRunService = class {
81
81
  metadata: buildWorkflowRunMetadata({
82
82
  definition,
83
83
  agentId: params.agentId,
84
+ goalId: params.goalId,
84
85
  sessionKey,
85
86
  source,
86
87
  input: inputEnvelope,
@@ -188,6 +189,7 @@ var WorkflowRunService = class {
188
189
  metadata: buildWorkflowRunMetadata({
189
190
  definition,
190
191
  agentId: params.agentId,
192
+ goalId: existing.run.metadata?.goalId,
191
193
  sessionKey,
192
194
  source,
193
195
  input: inputEnvelope,
@@ -374,6 +376,7 @@ function buildWorkflowRunInputEnvelope(input, goal) {
374
376
  };
375
377
  }
376
378
  function buildWorkflowRunMetadata(params) {
379
+ const goalId = params.goalId?.trim() || void 0;
377
380
  return {
378
381
  sessionKey: params.sessionKey,
379
382
  triggerSource: params.source.kind,
@@ -387,7 +390,8 @@ function buildWorkflowRunMetadata(params) {
387
390
  schedule: params.source.kind === "cron" ? {
388
391
  scheduleId: params.source.scheduleId,
389
392
  fireId: params.source.fireId
390
- } : void 0
393
+ } : void 0,
394
+ goalId
391
395
  };
392
396
  }
393
397
  function resolveWorkflowReplayTargets(view, scope) {
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-run-service.js","names":["resolveModelById"],"sources":["../../../../src/workflows/service/workflow-run-service.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\n\nimport type { BuildChildToolsOptions } from '../../agent/child-agent-factory.js';\nimport { extractProfileAgentId } from '../../config/agent-profile.js';\nimport { resolveModelRef } from '../../config/agent-typed-models.js';\nimport type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';\nimport { resolveModel as resolveModelById } from '../../providers/index.js';\nimport { DelegateSubagentRunner } from '../../agent/workflow/subagent-runner.js';\nimport { CatalogWorkflowDefinitionRegistry } from '../registry/catalog-workflow-definition-registry.js';\nimport type { WorkflowDefinitionRegistry } from '../registry/workflow-definition-registry.js';\nimport { validateWorkflowJsonSchema } from '../domain/schema-validation.js';\nimport type {\n WorkflowDefinition,\n WorkflowRunDefinitionSnapshot,\n WorkflowRunInputEnvelope,\n WorkflowRunMetadata,\n WorkflowRunSource,\n} from '../domain/index.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/index.js';\nimport { WorkflowEngine } from '../engine/index.js';\nimport { WorkflowEventStore } from '../store/event-store.js';\nimport { WorkflowRunStore } from '../store/run-store.js';\nimport type { WorkflowSessionBridge } from './workflow-session-bridge.js';\nexport type {\n CancelWorkflowRunResult,\n CancelWorkflowRunServiceParams,\n CancelWorkflowRunServiceResult,\n ReplayWorkflowRunServiceParams,\n RetryWorkflowRunServiceParams,\n StartWorkflowRunServiceParams,\n StartWorkflowRunServiceResult,\n WorkflowRunServiceErrorCode,\n WorkflowRunServiceErrorResult,\n WorkflowRunServiceResult,\n} from './workflow-run-service.types.js';\n\nimport type {\n CancelWorkflowRunResult,\n CancelWorkflowRunServiceParams,\n ReplayWorkflowRunServiceParams,\n RetryWorkflowRunServiceParams,\n StartWorkflowRunServiceParams,\n WorkflowRunServiceResult,\n} from './workflow-run-service.types.js';\nimport type { WorkflowRunReplayMetadata, WorkflowRunReplayScope, WorkflowRunView } from '../domain/run.js';\nimport type { WorkflowReplayAgentTarget } from '../engine/index.js';\n\nexport interface WorkflowRunServiceOptions {\n service: GatewayWorkflowHost;\n sessionBridge: WorkflowSessionBridge;\n buildChildTools: (childOptions: BuildChildToolsOptions) => AgentTool<any, any>[];\n definitionRegistry?: WorkflowDefinitionRegistry;\n}\n\nexport class WorkflowRunService {\n private readonly activeRuns = new Map<string, AbortController>();\n private readonly timeoutHandles = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly definitionRegistry: WorkflowDefinitionRegistry;\n\n constructor(private readonly options: WorkflowRunServiceOptions) {\n this.definitionRegistry = options.definitionRegistry ?? new CatalogWorkflowDefinitionRegistry();\n }\n\n async startWorkflowRun(params: StartWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const definition = await this.loadDefinition(params.definitionId);\n if (!definition) {\n return {\n ok: false,\n code: 'definition_not_found',\n message: 'Workflow definition not found',\n httpStatus: 404,\n };\n }\n\n const inputEnvelope = params.inputEnvelope ?? buildWorkflowRunInputEnvelope(params.input, params.goal);\n const inputValidation = validateWorkflowJsonSchema(definition.inputSchema, inputEnvelope.payload);\n if (!inputValidation.ok) {\n return {\n ok: false,\n code: 'invalid_input',\n message: inputValidation.message ?? 'Workflow input did not match input schema',\n httpStatus: 400,\n };\n }\n\n const existingRun = params.idempotencyKey\n ? await this.findRunByIdempotencyKey(params.agentId, params.idempotencyKey)\n : null;\n if (existingRun) {\n return {\n ok: true,\n runId: existingRun.run.id,\n sessionKey: existingRun.run.metadata?.sessionKey ?? '',\n };\n }\n\n const runId = randomUUID();\n const goal = params.goal ?? '';\n const { sessionKey } = await this.options.sessionBridge.prepareRunSession({\n runId,\n agentId: params.agentId,\n definitionId: params.definitionId,\n definitionTitle: definition.title,\n goal,\n parentSessionKey: params.parentSessionKey,\n });\n const source = normalizeWorkflowRunSourceForSession(params.source, sessionKey, params.parentSessionKey);\n const abortController = new AbortController();\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n const runStore = new WorkflowRunStore(this.options.service.currentConfig, params.agentId, eventStore);\n const engine = this.createWorkflowEngine({\n eventStore,\n runStore,\n sessionKey,\n });\n const limits = resolveWorkflowRunLimits({\n config: this.options.service.currentConfig,\n definition,\n concurrency: params.concurrency,\n maxSubagents: params.maxSubagents,\n });\n\n this.activeRuns.set(runId, abortController);\n const timeoutHandle = setTimeout(() => {\n abortController.abort(new Error(`workflow timed out after ${limits.timeoutSec}s`));\n }, limits.timeoutSec * 1000);\n this.timeoutHandles.set(runId, timeoutHandle);\n void engine.startRun(definition, {\n runId,\n input: inputEnvelope.payload,\n goal: inputEnvelope.goal ?? params.goal,\n source,\n metadata: buildWorkflowRunMetadata({\n definition,\n agentId: params.agentId,\n sessionKey,\n source,\n input: inputEnvelope,\n retryOfRunId: params.retryOfRunId,\n idempotencyKey: params.idempotencyKey,\n }),\n signal: abortController.signal,\n concurrency: limits.concurrency,\n maxSubagents: limits.maxSubagents,\n tokenBudget: params.tokenBudget,\n timeoutSec: limits.timeoutSec,\n }).catch((err) => {\n this.options.service.emit('workflow.run.error', {\n runId,\n error: err instanceof Error ? err.message : String(err),\n });\n }).finally(() => {\n this.activeRuns.delete(runId);\n const handle = this.timeoutHandles.get(runId);\n if (handle) clearTimeout(handle);\n this.timeoutHandles.delete(runId);\n });\n\n return { ok: true, runId, sessionKey };\n }\n\n async retryWorkflowRun(params: RetryWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const runStore = this.createRunStore(params.agentId);\n const existing = await runStore.readRunView(params.runId);\n if (!existing) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n const parentSessionKey =\n existing.run.source.kind === 'chat' ? existing.run.source.sessionKey : undefined;\n\n return this.startWorkflowRun({\n agentId: params.agentId,\n definitionId: existing.run.definitionId,\n input: existing.run.input,\n goal: existing.run.goal,\n source: existing.run.source,\n parentSessionKey,\n retryOfRunId: existing.run.id,\n });\n }\n\n async replayWorkflowRun(params: ReplayWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const runStore = this.createRunStore(params.agentId);\n const existing = await runStore.readRunView(params.runId);\n if (!existing) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n const definition = await this.loadDefinition(existing.run.definitionId);\n if (!definition) {\n return {\n ok: false,\n code: 'definition_not_found',\n message: 'Workflow definition not found',\n httpStatus: 404,\n };\n }\n\n const targets = resolveWorkflowReplayTargets(existing, params.scope);\n if (targets.targets.length === 0) {\n return {\n ok: false,\n code: 'invalid_state',\n message: params.scope === 'failed_phases'\n ? 'No failed workflow phase is available to replay'\n : 'No failed workflow agent is available to replay',\n httpStatus: 409,\n };\n }\n\n const replayRunId = randomUUID();\n const goal = buildReplayGoal(existing, params.scope, targets.targets.length);\n const parentSessionKey =\n existing.run.source.kind === 'chat' ? existing.run.source.sessionKey : undefined;\n const { sessionKey } = await this.options.sessionBridge.prepareRunSession({\n runId: replayRunId,\n agentId: params.agentId,\n definitionId: existing.run.definitionId,\n definitionTitle: `${definition.title} replay`,\n goal,\n parentSessionKey,\n });\n const source = normalizeWorkflowRunSourceForSession(existing.run.source, sessionKey, parentSessionKey);\n const abortController = new AbortController();\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n const replayRunStore = new WorkflowRunStore(this.options.service.currentConfig, params.agentId, eventStore);\n const engine = this.createWorkflowEngine({\n eventStore,\n runStore: replayRunStore,\n sessionKey,\n });\n const limits = resolveWorkflowRunLimits({\n config: this.options.service.currentConfig,\n definition,\n });\n const inputEnvelope = existing.run.metadata?.input ?? buildWorkflowRunInputEnvelope(existing.run.input, existing.run.goal);\n\n this.activeRuns.set(replayRunId, abortController);\n const timeoutHandle = setTimeout(() => {\n abortController.abort(new Error(`workflow timed out after ${limits.timeoutSec}s`));\n }, limits.timeoutSec * 1000);\n this.timeoutHandles.set(replayRunId, timeoutHandle);\n void engine.startReplayRun(definition, {\n runId: replayRunId,\n input: inputEnvelope.payload,\n goal,\n source,\n metadata: buildWorkflowRunMetadata({\n definition,\n agentId: params.agentId,\n sessionKey,\n source,\n input: inputEnvelope,\n retryOfRunId: existing.run.id,\n replay: {\n sourceRunId: existing.run.id,\n scope: params.scope,\n phaseIds: targets.phaseIds,\n agentIds: targets.targets.map((target) => target.agentId),\n targetCount: targets.targets.length,\n createdAtMs: Date.now(),\n },\n }),\n signal: abortController.signal,\n concurrency: limits.concurrency,\n maxSubagents: limits.maxSubagents,\n timeoutSec: limits.timeoutSec,\n sourceRunId: existing.run.id,\n replayScope: params.scope,\n targets: targets.targets,\n }).catch((err) => {\n this.options.service.emit('workflow.run.error', {\n runId: replayRunId,\n error: err instanceof Error ? err.message : String(err),\n });\n }).finally(() => {\n this.activeRuns.delete(replayRunId);\n const handle = this.timeoutHandles.get(replayRunId);\n if (handle) clearTimeout(handle);\n this.timeoutHandles.delete(replayRunId);\n });\n\n return { ok: true, runId: replayRunId, sessionKey };\n }\n\n async cancelWorkflowRun(params: CancelWorkflowRunServiceParams): Promise<CancelWorkflowRunResult> {\n const controller = this.activeRuns.get(params.runId);\n if (controller) {\n controller.abort();\n this.activeRuns.delete(params.runId);\n const handle = this.timeoutHandles.get(params.runId);\n if (handle) clearTimeout(handle);\n this.timeoutHandles.delete(params.runId);\n return { ok: true, cancelled: true };\n }\n\n const runStore = this.createRunStore(params.agentId);\n const view = await runStore.readRunView(params.runId);\n if (!view) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n if (isTerminalWorkflowRunStatus(view.run.status)) {\n return { ok: true, cancelled: true, alreadyFinished: true };\n }\n\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n await eventStore.append({\n runId: params.runId,\n type: 'run_cancelled',\n payload: { reason: params.reason ?? 'Cancelled by user' },\n });\n const updated = await runStore.rebuildRunView(params.runId);\n if (updated) {\n this.options.service.emit('workflow.run.updated', { runId: params.runId, view: updated });\n void this.options.sessionBridge.handleRunViewUpdated(updated);\n }\n return { ok: true, cancelled: true };\n }\n\n createRunStore(agentId: string): WorkflowRunStore {\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, agentId);\n return new WorkflowRunStore(this.options.service.currentConfig, agentId, eventStore);\n }\n\n async readWorkflowRunView(agentId: string, runId: string) {\n return this.createRunStore(agentId).readRunView(runId);\n }\n\n async reconcileInterruptedRuns(agentId: string): Promise<number> {\n const runStore = this.createRunStore(agentId);\n const summaries = await runStore.listRunSummaries(500);\n let reconciled = 0;\n\n for (const summary of summaries) {\n if (isTerminalWorkflowRunStatus(summary.status) || this.activeRuns.has(summary.id)) {\n continue;\n }\n\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, agentId);\n await eventStore.append({\n runId: summary.id,\n type: 'run_failed',\n payload: {\n error: {\n code: 'runtime_error',\n message: 'Workflow run interrupted by gateway restart',\n recoverable: true,\n },\n },\n });\n const updated = await runStore.rebuildRunView(summary.id);\n if (updated) {\n this.options.service.emit('workflow.run.updated', { runId: summary.id, view: updated });\n void this.options.sessionBridge.handleRunViewUpdated(updated);\n }\n reconciled += 1;\n }\n\n return reconciled;\n }\n\n private loadDefinition(definitionId: string): Promise<WorkflowDefinition | null> {\n return this.definitionRegistry.get(definitionId);\n }\n\n private async findRunByIdempotencyKey(agentId: string, idempotencyKey: string) {\n const runStore = this.createRunStore(agentId);\n const summaries = await runStore.listRunSummaries(500);\n for (const summary of summaries) {\n if (summary.metadata?.correlation?.idempotencyKey !== idempotencyKey) {\n continue;\n }\n return runStore.readRunView(summary.id);\n }\n return null;\n }\n\n private createWorkflowEngine(params: {\n eventStore: WorkflowEventStore;\n runStore: WorkflowRunStore;\n sessionKey: string;\n }): WorkflowEngine {\n const gatewayService = this.options.service;\n const runner = new DelegateSubagentRunner({\n workspace: gatewayService.currentWorkspacePath,\n bus: gatewayService.messageBusInstance,\n getDefaultModel: () => resolveModelById(gatewayService.agentService.getModelForSession(params.sessionKey)),\n getConfig: () => gatewayService.currentConfig,\n sessionStore: gatewayService.sessionIndexInstance.getStore(),\n buildChildTools: (childOptions) => this.options.buildChildTools(childOptions),\n });\n\n return new WorkflowEngine({\n cwd: gatewayService.currentWorkspacePath,\n eventStore: params.eventStore,\n runStore: params.runStore,\n runner,\n resolveModelId: (modelId) => {\n const agentId = extractProfileAgentId(params.sessionKey, gatewayService.currentConfig);\n return resolveModelById(resolveModelRef(gatewayService.currentConfig, agentId, modelId));\n },\n parentSessionKey: params.sessionKey,\n subagentSessionKeyFactory: ({ runId, agentId }) => {\n const profileAgentId = extractProfileAgentId(params.sessionKey, gatewayService.currentConfig);\n return `agent:${profileAgentId}:workflow:${runId}:subagent:${agentId}`;\n },\n onEventAppended: (event) => {\n gatewayService.emit('workflow.event.appended', { runId: event.runId, event });\n },\n onRunViewUpdated: (view) => {\n gatewayService.emit('workflow.run.updated', { runId: view.run.id, view });\n void this.options.sessionBridge.handleRunViewUpdated(view);\n },\n });\n }\n}\n\nfunction normalizeWorkflowRunSourceForSession(\n source: WorkflowRunSource,\n workflowSessionKey: string,\n parentSessionKey?: string,\n): WorkflowRunSource {\n if (parentSessionKey?.trim()) {\n return { kind: 'chat', sessionKey: parentSessionKey.trim() };\n }\n if (source.kind === 'webui') {\n return { ...source, sessionKey: workflowSessionKey };\n }\n if (source.kind === 'chat') {\n return source;\n }\n return source;\n}\n\nexport function buildWorkflowRunInputEnvelope(input: unknown, goal?: string): WorkflowRunInputEnvelope {\n if (isWorkflowRunInputEnvelope(input)) {\n return input;\n }\n return {\n payload: input ?? {},\n goal,\n };\n}\n\nexport function buildWorkflowRunMetadata(params: {\n definition: WorkflowDefinition;\n agentId: string;\n sessionKey: string;\n source: WorkflowRunSource;\n input: WorkflowRunInputEnvelope;\n retryOfRunId?: string;\n idempotencyKey?: string;\n replay?: WorkflowRunReplayMetadata;\n}): WorkflowRunMetadata {\n return {\n sessionKey: params.sessionKey,\n triggerSource: params.source.kind,\n agentId: params.agentId,\n retryOfRunId: params.retryOfRunId,\n replay: params.replay,\n definition: buildWorkflowRunDefinitionSnapshot(params.definition),\n input: params.input,\n correlation: {\n idempotencyKey: params.idempotencyKey,\n },\n origin: buildWorkflowRunOrigin(params.source),\n schedule: params.source.kind === 'cron'\n ? { scheduleId: params.source.scheduleId, fireId: params.source.fireId }\n : undefined,\n };\n}\n\nexport function resolveWorkflowReplayTargets(\n view: WorkflowRunView,\n scope: WorkflowRunReplayScope,\n): { targets: WorkflowReplayAgentTarget[]; phaseIds?: string[] } {\n const phaseTitleById = new Map(view.phases.map((phase) => [phase.id, phase.title]));\n const failedStatuses = new Set(['error', 'skipped']);\n\n if (scope === 'failed_agents') {\n return {\n targets: view.agents\n .filter((agent) => failedStatuses.has(agent.status) && workflowAgentReplayPrompt(agent))\n .map((agent) => ({\n agentId: agent.id,\n label: agent.label,\n phaseId: agent.phaseId,\n phaseTitle: agent.phaseId ? phaseTitleById.get(agent.phaseId) : undefined,\n prompt: workflowAgentReplayPrompt(agent) ?? '',\n invocation: agent.invocation,\n })),\n };\n }\n\n const failedPhaseIds = view.phases\n .filter((phase) => phase.status === 'failed')\n .map((phase) => phase.id);\n const phaseIds = failedPhaseIds.length > 0\n ? failedPhaseIds\n : [...new Set(view.agents.filter((agent) => failedStatuses.has(agent.status) && agent.phaseId).map((agent) => agent.phaseId as string))];\n const phaseIdSet = new Set(phaseIds);\n\n return {\n phaseIds,\n targets: view.agents\n .filter((agent) => agent.phaseId && phaseIdSet.has(agent.phaseId) && workflowAgentReplayPrompt(agent))\n .map((agent) => ({\n agentId: agent.id,\n label: agent.label,\n phaseId: agent.phaseId,\n phaseTitle: agent.phaseId ? phaseTitleById.get(agent.phaseId) : undefined,\n prompt: workflowAgentReplayPrompt(agent) ?? '',\n invocation: agent.invocation,\n })),\n };\n}\n\nfunction workflowAgentReplayPrompt(agent: WorkflowRunView['agents'][number]): string | undefined {\n const invocationPrompt = agent.invocation?.prompt?.trim();\n if (invocationPrompt) return invocationPrompt;\n const prompt = agent.prompt?.trim();\n return prompt || undefined;\n}\n\nexport function buildWorkflowRunDefinitionSnapshot(definition: WorkflowDefinition): WorkflowRunDefinitionSnapshot {\n const snapshot: WorkflowRunDefinitionSnapshot = {\n id: definition.id,\n name: definition.name,\n title: definition.title,\n version: definition.version,\n source: definition.metadata.source,\n tags: [...definition.metadata.tags],\n phaseCount: definition.phases.length,\n defaults: { ...definition.defaults },\n estimatedAgents: definition.metadata.estimatedAgents,\n };\n if (definition.contentHash) snapshot.contentHash = definition.contentHash;\n if (definition.runtimeHash) snapshot.runtimeHash = definition.runtimeHash;\n if (definition.permissions) snapshot.permissions = structuredClone(definition.permissions);\n if (definition.resources) snapshot.resources = structuredClone(definition.resources);\n return snapshot;\n}\n\nfunction resolveWorkflowRunLimits(params: {\n config: import('../../config/schema.js').Config;\n definition: WorkflowDefinition;\n concurrency?: number;\n maxSubagents?: number;\n}): { concurrency: number; maxSubagents: number; timeoutSec: number } {\n const cfg = params.config.agents?.defaults?.workflow;\n const configuredMaxConcurrency = normalizePositiveInt(\n cfg?.maxConcurrency,\n params.definition.defaults.concurrency,\n );\n const configuredMaxSubagents = normalizePositiveInt(\n cfg?.maxSubagents,\n params.definition.defaults.maxSubagents,\n );\n const configuredTimeoutSec = normalizePositiveInt(\n cfg?.defaultTimeoutSec,\n params.definition.defaults.timeoutSec,\n );\n\n return {\n concurrency: Math.max(\n 1,\n Math.min(\n normalizePositiveInt(params.concurrency, params.definition.defaults.concurrency),\n configuredMaxConcurrency,\n ),\n ),\n maxSubagents: Math.max(\n 1,\n Math.min(\n normalizePositiveInt(params.maxSubagents, params.definition.defaults.maxSubagents),\n configuredMaxSubagents,\n ),\n ),\n timeoutSec: Math.max(1, Math.min(params.definition.defaults.timeoutSec, configuredTimeoutSec)),\n };\n}\n\nfunction normalizePositiveInt(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 1) {\n return fallback;\n }\n return Math.floor(value);\n}\n\nfunction buildReplayGoal(view: WorkflowRunView, scope: WorkflowRunReplayScope, targetCount: number): string {\n const scopeLabel = scope === 'failed_phases' ? 'failed phase' : 'failed agent';\n return `Replay ${targetCount} ${scopeLabel}${targetCount === 1 ? '' : 's'} from workflow run ${view.run.id}: ${view.run.goal}`;\n}\n\nexport function extractWorkflowRunSessionKey(source: WorkflowRunSource): string | null {\n if ('sessionKey' in source && typeof source.sessionKey === 'string' && source.sessionKey.trim()) {\n return source.sessionKey.trim();\n }\n return null;\n}\n\nfunction buildWorkflowRunOrigin(source: WorkflowRunSource): WorkflowRunMetadata['origin'] {\n switch (source.kind) {\n case 'chat':\n return { channel: 'chat', sessionKey: source.sessionKey, messageId: source.messageId };\n case 'webui':\n return { channel: 'webui', sessionKey: source.sessionKey };\n case 'cron':\n return { channel: 'cron', scheduleId: source.scheduleId, fireId: source.fireId };\n case 'api':\n return { channel: 'api', requestId: source.requestId };\n case 'im':\n return { channel: source.channel, chatId: source.chatId, messageId: source.messageId };\n }\n}\n\nfunction isWorkflowRunInputEnvelope(input: unknown): input is WorkflowRunInputEnvelope {\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return false;\n }\n return 'payload' in input || 'variables' in input || 'context' in input;\n}\n"],"mappings":";;;;;;;;;;;;;;gBAQ4E;AAgD5E,IAAa,qBAAb,MAAgC;CAC9B,6BAA8B,IAAI,KAA8B;CAChE,iCAAkC,IAAI,KAA4C;CAClF;CAEA,YAAY,SAAqD;AAApC,OAAA,UAAA;AAC3B,OAAK,qBAAqB,QAAQ,sBAAsB,IAAI,mCAAmC;;CAGjG,MAAM,iBAAiB,QAA0E;EAC/F,MAAM,aAAa,MAAM,KAAK,eAAe,OAAO,aAAa;AACjE,MAAI,CAAC,WACH,QAAO;GACL,IAAI;GACJ,MAAM;GACN,SAAS;GACT,YAAY;GACb;EAGH,MAAM,gBAAgB,OAAO,iBAAiB,8BAA8B,OAAO,OAAO,OAAO,KAAK;EACtG,MAAM,kBAAkB,2BAA2B,WAAW,aAAa,cAAc,QAAQ;AACjG,MAAI,CAAC,gBAAgB,GACnB,QAAO;GACL,IAAI;GACJ,MAAM;GACN,SAAS,gBAAgB,WAAW;GACpC,YAAY;GACb;EAGH,MAAM,cAAc,OAAO,iBACvB,MAAM,KAAK,wBAAwB,OAAO,SAAS,OAAO,eAAe,GACzE;AACJ,MAAI,YACF,QAAO;GACL,IAAI;GACJ,OAAO,YAAY,IAAI;GACvB,YAAY,YAAY,IAAI,UAAU,cAAc;GACrD;EAGH,MAAM,QAAQ,YAAY;EAC1B,MAAM,OAAO,OAAO,QAAQ;EAC5B,MAAM,EAAE,eAAe,MAAM,KAAK,QAAQ,cAAc,kBAAkB;GACxE;GACA,SAAS,OAAO;GAChB,cAAc,OAAO;GACrB,iBAAiB,WAAW;GAC5B;GACA,kBAAkB,OAAO;GAC1B,CAAC;EACF,MAAM,SAAS,qCAAqC,OAAO,QAAQ,YAAY,OAAO,iBAAiB;EACvG,MAAM,kBAAkB,IAAI,iBAAiB;EAC7C,MAAM,aAAa,IAAI,mBAAmB,KAAK,QAAQ,QAAQ,eAAe,OAAO,QAAQ;EAC7F,MAAM,WAAW,IAAI,iBAAiB,KAAK,QAAQ,QAAQ,eAAe,OAAO,SAAS,WAAW;EACrG,MAAM,SAAS,KAAK,qBAAqB;GACvC;GACA;GACA;GACD,CAAC;EACF,MAAM,SAAS,yBAAyB;GACtC,QAAQ,KAAK,QAAQ,QAAQ;GAC7B;GACA,aAAa,OAAO;GACpB,cAAc,OAAO;GACtB,CAAC;AAEF,OAAK,WAAW,IAAI,OAAO,gBAAgB;EAC3C,MAAM,gBAAgB,iBAAiB;AACrC,mBAAgB,sBAAM,IAAI,MAAM,4BAA4B,OAAO,WAAW,GAAG,CAAC;KACjF,OAAO,aAAa,IAAK;AAC5B,OAAK,eAAe,IAAI,OAAO,cAAc;AACxC,SAAO,SAAS,YAAY;GAC/B;GACA,OAAO,cAAc;GACrB,MAAM,cAAc,QAAQ,OAAO;GACnC;GACA,UAAU,yBAAyB;IACjC;IACA,SAAS,OAAO;IAChB;IACA;IACA,OAAO;IACP,cAAc,OAAO;IACrB,gBAAgB,OAAO;IACxB,CAAC;GACF,QAAQ,gBAAgB;GACxB,aAAa,OAAO;GACpB,cAAc,OAAO;GACrB,aAAa,OAAO;GACpB,YAAY,OAAO;GACpB,CAAC,CAAC,OAAO,QAAQ;AAChB,QAAK,QAAQ,QAAQ,KAAK,sBAAsB;IAC9C;IACA,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;IACxD,CAAC;IACF,CAAC,cAAc;AACf,QAAK,WAAW,OAAO,MAAM;GAC7B,MAAM,SAAS,KAAK,eAAe,IAAI,MAAM;AAC7C,OAAI,OAAQ,cAAa,OAAO;AAChC,QAAK,eAAe,OAAO,MAAM;IACjC;AAEF,SAAO;GAAE,IAAI;GAAM;GAAO;GAAY;;CAGxC,MAAM,iBAAiB,QAA0E;EAE/F,MAAM,WAAW,MADA,KAAK,eAAe,OAAO,QACb,CAAC,YAAY,OAAO,MAAM;AACzD,MAAI,CAAC,SACH,QAAO;GACL,IAAI;GACJ,MAAM;GACN,SAAS;GACT,YAAY;GACb;EAGH,MAAM,mBACJ,SAAS,IAAI,OAAO,SAAS,SAAS,SAAS,IAAI,OAAO,aAAa,KAAA;AAEzE,SAAO,KAAK,iBAAiB;GAC3B,SAAS,OAAO;GAChB,cAAc,SAAS,IAAI;GAC3B,OAAO,SAAS,IAAI;GACpB,MAAM,SAAS,IAAI;GACnB,QAAQ,SAAS,IAAI;GACrB;GACA,cAAc,SAAS,IAAI;GAC5B,CAAC;;CAGJ,MAAM,kBAAkB,QAA2E;EAEjG,MAAM,WAAW,MADA,KAAK,eAAe,OAAO,QACb,CAAC,YAAY,OAAO,MAAM;AACzD,MAAI,CAAC,SACH,QAAO;GACL,IAAI;GACJ,MAAM;GACN,SAAS;GACT,YAAY;GACb;EAGH,MAAM,aAAa,MAAM,KAAK,eAAe,SAAS,IAAI,aAAa;AACvE,MAAI,CAAC,WACH,QAAO;GACL,IAAI;GACJ,MAAM;GACN,SAAS;GACT,YAAY;GACb;EAGH,MAAM,UAAU,6BAA6B,UAAU,OAAO,MAAM;AACpE,MAAI,QAAQ,QAAQ,WAAW,EAC7B,QAAO;GACL,IAAI;GACJ,MAAM;GACN,SAAS,OAAO,UAAU,kBACtB,oDACA;GACJ,YAAY;GACb;EAGH,MAAM,cAAc,YAAY;EAChC,MAAM,OAAO,gBAAgB,UAAU,OAAO,OAAO,QAAQ,QAAQ,OAAO;EAC5E,MAAM,mBACJ,SAAS,IAAI,OAAO,SAAS,SAAS,SAAS,IAAI,OAAO,aAAa,KAAA;EACzE,MAAM,EAAE,eAAe,MAAM,KAAK,QAAQ,cAAc,kBAAkB;GACxE,OAAO;GACP,SAAS,OAAO;GAChB,cAAc,SAAS,IAAI;GAC3B,iBAAiB,GAAG,WAAW,MAAM;GACrC;GACA;GACD,CAAC;EACF,MAAM,SAAS,qCAAqC,SAAS,IAAI,QAAQ,YAAY,iBAAiB;EACtG,MAAM,kBAAkB,IAAI,iBAAiB;EAC7C,MAAM,aAAa,IAAI,mBAAmB,KAAK,QAAQ,QAAQ,eAAe,OAAO,QAAQ;EAC7F,MAAM,iBAAiB,IAAI,iBAAiB,KAAK,QAAQ,QAAQ,eAAe,OAAO,SAAS,WAAW;EAC3G,MAAM,SAAS,KAAK,qBAAqB;GACvC;GACA,UAAU;GACV;GACD,CAAC;EACF,MAAM,SAAS,yBAAyB;GACtC,QAAQ,KAAK,QAAQ,QAAQ;GAC7B;GACD,CAAC;EACF,MAAM,gBAAgB,SAAS,IAAI,UAAU,SAAS,8BAA8B,SAAS,IAAI,OAAO,SAAS,IAAI,KAAK;AAE1H,OAAK,WAAW,IAAI,aAAa,gBAAgB;EACjD,MAAM,gBAAgB,iBAAiB;AACrC,mBAAgB,sBAAM,IAAI,MAAM,4BAA4B,OAAO,WAAW,GAAG,CAAC;KACjF,OAAO,aAAa,IAAK;AAC5B,OAAK,eAAe,IAAI,aAAa,cAAc;AAC9C,SAAO,eAAe,YAAY;GACrC,OAAO;GACP,OAAO,cAAc;GACrB;GACA;GACA,UAAU,yBAAyB;IACjC;IACA,SAAS,OAAO;IAChB;IACA;IACA,OAAO;IACP,cAAc,SAAS,IAAI;IAC3B,QAAQ;KACN,aAAa,SAAS,IAAI;KAC1B,OAAO,OAAO;KACd,UAAU,QAAQ;KAClB,UAAU,QAAQ,QAAQ,KAAK,WAAW,OAAO,QAAQ;KACzD,aAAa,QAAQ,QAAQ;KAC7B,aAAa,KAAK,KAAK;KACxB;IACF,CAAC;GACF,QAAQ,gBAAgB;GACxB,aAAa,OAAO;GACpB,cAAc,OAAO;GACrB,YAAY,OAAO;GACnB,aAAa,SAAS,IAAI;GAC1B,aAAa,OAAO;GACpB,SAAS,QAAQ;GAClB,CAAC,CAAC,OAAO,QAAQ;AAChB,QAAK,QAAQ,QAAQ,KAAK,sBAAsB;IAC9C,OAAO;IACP,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;IACxD,CAAC;IACF,CAAC,cAAc;AACf,QAAK,WAAW,OAAO,YAAY;GACnC,MAAM,SAAS,KAAK,eAAe,IAAI,YAAY;AACnD,OAAI,OAAQ,cAAa,OAAO;AAChC,QAAK,eAAe,OAAO,YAAY;IACvC;AAEF,SAAO;GAAE,IAAI;GAAM,OAAO;GAAa;GAAY;;CAGrD,MAAM,kBAAkB,QAA0E;EAChG,MAAM,aAAa,KAAK,WAAW,IAAI,OAAO,MAAM;AACpD,MAAI,YAAY;AACd,cAAW,OAAO;AAClB,QAAK,WAAW,OAAO,OAAO,MAAM;GACpC,MAAM,SAAS,KAAK,eAAe,IAAI,OAAO,MAAM;AACpD,OAAI,OAAQ,cAAa,OAAO;AAChC,QAAK,eAAe,OAAO,OAAO,MAAM;AACxC,UAAO;IAAE,IAAI;IAAM,WAAW;IAAM;;EAGtC,MAAM,WAAW,KAAK,eAAe,OAAO,QAAQ;EACpD,MAAM,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM;AACrD,MAAI,CAAC,KACH,QAAO;GACL,IAAI;GACJ,MAAM;GACN,SAAS;GACT,YAAY;GACb;AAGH,MAAI,4BAA4B,KAAK,IAAI,OAAO,CAC9C,QAAO;GAAE,IAAI;GAAM,WAAW;GAAM,iBAAiB;GAAM;AAI7D,QAAM,IADiB,mBAAmB,KAAK,QAAQ,QAAQ,eAAe,OAAO,QACrE,CAAC,OAAO;GACtB,OAAO,OAAO;GACd,MAAM;GACN,SAAS,EAAE,QAAQ,OAAO,UAAU,qBAAqB;GAC1D,CAAC;EACF,MAAM,UAAU,MAAM,SAAS,eAAe,OAAO,MAAM;AAC3D,MAAI,SAAS;AACX,QAAK,QAAQ,QAAQ,KAAK,wBAAwB;IAAE,OAAO,OAAO;IAAO,MAAM;IAAS,CAAC;AACpF,QAAK,QAAQ,cAAc,qBAAqB,QAAQ;;AAE/D,SAAO;GAAE,IAAI;GAAM,WAAW;GAAM;;CAGtC,eAAe,SAAmC;EAChD,MAAM,aAAa,IAAI,mBAAmB,KAAK,QAAQ,QAAQ,eAAe,QAAQ;AACtF,SAAO,IAAI,iBAAiB,KAAK,QAAQ,QAAQ,eAAe,SAAS,WAAW;;CAGtF,MAAM,oBAAoB,SAAiB,OAAe;AACxD,SAAO,KAAK,eAAe,QAAQ,CAAC,YAAY,MAAM;;CAGxD,MAAM,yBAAyB,SAAkC;EAC/D,MAAM,WAAW,KAAK,eAAe,QAAQ;EAC7C,MAAM,YAAY,MAAM,SAAS,iBAAiB,IAAI;EACtD,IAAI,aAAa;AAEjB,OAAK,MAAM,WAAW,WAAW;AAC/B,OAAI,4BAA4B,QAAQ,OAAO,IAAI,KAAK,WAAW,IAAI,QAAQ,GAAG,CAChF;AAIF,SAAM,IADiB,mBAAmB,KAAK,QAAQ,QAAQ,eAAe,QAC9D,CAAC,OAAO;IACtB,OAAO,QAAQ;IACf,MAAM;IACN,SAAS,EACP,OAAO;KACL,MAAM;KACN,SAAS;KACT,aAAa;KACd,EACF;IACF,CAAC;GACF,MAAM,UAAU,MAAM,SAAS,eAAe,QAAQ,GAAG;AACzD,OAAI,SAAS;AACX,SAAK,QAAQ,QAAQ,KAAK,wBAAwB;KAAE,OAAO,QAAQ;KAAI,MAAM;KAAS,CAAC;AAClF,SAAK,QAAQ,cAAc,qBAAqB,QAAQ;;AAE/D,iBAAc;;AAGhB,SAAO;;CAGT,eAAuB,cAA0D;AAC/E,SAAO,KAAK,mBAAmB,IAAI,aAAa;;CAGlD,MAAc,wBAAwB,SAAiB,gBAAwB;EAC7E,MAAM,WAAW,KAAK,eAAe,QAAQ;EAC7C,MAAM,YAAY,MAAM,SAAS,iBAAiB,IAAI;AACtD,OAAK,MAAM,WAAW,WAAW;AAC/B,OAAI,QAAQ,UAAU,aAAa,mBAAmB,eACpD;AAEF,UAAO,SAAS,YAAY,QAAQ,GAAG;;AAEzC,SAAO;;CAGT,qBAA6B,QAIV;EACjB,MAAM,iBAAiB,KAAK,QAAQ;EACpC,MAAM,SAAS,IAAI,uBAAuB;GACxC,WAAW,eAAe;GAC1B,KAAK,eAAe;GACpB,uBAAuBA,aAAiB,eAAe,aAAa,mBAAmB,OAAO,WAAW,CAAC;GAC1G,iBAAiB,eAAe;GAChC,cAAc,eAAe,qBAAqB,UAAU;GAC5D,kBAAkB,iBAAiB,KAAK,QAAQ,gBAAgB,aAAa;GAC9E,CAAC;AAEF,SAAO,IAAI,eAAe;GACxB,KAAK,eAAe;GACpB,YAAY,OAAO;GACnB,UAAU,OAAO;GACjB;GACA,iBAAiB,YAAY;IAC3B,MAAM,UAAU,sBAAsB,OAAO,YAAY,eAAe,cAAc;AACtF,WAAOA,aAAiB,gBAAgB,eAAe,eAAe,SAAS,QAAQ,CAAC;;GAE1F,kBAAkB,OAAO;GACzB,4BAA4B,EAAE,OAAO,cAAc;AAEjD,WAAO,SADgB,sBAAsB,OAAO,YAAY,eAAe,cACjD,CAAC,YAAY,MAAM,YAAY;;GAE/D,kBAAkB,UAAU;AAC1B,mBAAe,KAAK,2BAA2B;KAAE,OAAO,MAAM;KAAO;KAAO,CAAC;;GAE/E,mBAAmB,SAAS;AAC1B,mBAAe,KAAK,wBAAwB;KAAE,OAAO,KAAK,IAAI;KAAI;KAAM,CAAC;AACpE,SAAK,QAAQ,cAAc,qBAAqB,KAAK;;GAE7D,CAAC;;;AAIN,SAAS,qCACP,QACA,oBACA,kBACmB;AACnB,KAAI,kBAAkB,MAAM,CAC1B,QAAO;EAAE,MAAM;EAAQ,YAAY,iBAAiB,MAAM;EAAE;AAE9D,KAAI,OAAO,SAAS,QAClB,QAAO;EAAE,GAAG;EAAQ,YAAY;EAAoB;AAEtD,KAAI,OAAO,SAAS,OAClB,QAAO;AAET,QAAO;;AAGT,SAAgB,8BAA8B,OAAgB,MAAyC;AACrG,KAAI,2BAA2B,MAAM,CACnC,QAAO;AAET,QAAO;EACL,SAAS,SAAS,EAAE;EACpB;EACD;;AAGH,SAAgB,yBAAyB,QASjB;AACtB,QAAO;EACL,YAAY,OAAO;EACnB,eAAe,OAAO,OAAO;EAC7B,SAAS,OAAO;EAChB,cAAc,OAAO;EACrB,QAAQ,OAAO;EACf,YAAY,mCAAmC,OAAO,WAAW;EACjE,OAAO,OAAO;EACd,aAAa,EACX,gBAAgB,OAAO,gBACxB;EACD,QAAQ,uBAAuB,OAAO,OAAO;EAC7C,UAAU,OAAO,OAAO,SAAS,SAC7B;GAAE,YAAY,OAAO,OAAO;GAAY,QAAQ,OAAO,OAAO;GAAQ,GACtE,KAAA;EACL;;AAGH,SAAgB,6BACd,MACA,OAC+D;CAC/D,MAAM,iBAAiB,IAAI,IAAI,KAAK,OAAO,KAAK,UAAU,CAAC,MAAM,IAAI,MAAM,MAAM,CAAC,CAAC;CACnF,MAAM,iBAAiB,IAAI,IAAI,CAAC,SAAS,UAAU,CAAC;AAEpD,KAAI,UAAU,gBACZ,QAAO,EACL,SAAS,KAAK,OACX,QAAQ,UAAU,eAAe,IAAI,MAAM,OAAO,IAAI,0BAA0B,MAAM,CAAC,CACvF,KAAK,WAAW;EACf,SAAS,MAAM;EACf,OAAO,MAAM;EACb,SAAS,MAAM;EACf,YAAY,MAAM,UAAU,eAAe,IAAI,MAAM,QAAQ,GAAG,KAAA;EAChE,QAAQ,0BAA0B,MAAM,IAAI;EAC5C,YAAY,MAAM;EACnB,EAAE,EACN;CAGH,MAAM,iBAAiB,KAAK,OACzB,QAAQ,UAAU,MAAM,WAAW,SAAS,CAC5C,KAAK,UAAU,MAAM,GAAG;CAC3B,MAAM,WAAW,eAAe,SAAS,IACrC,iBACA,CAAC,GAAG,IAAI,IAAI,KAAK,OAAO,QAAQ,UAAU,eAAe,IAAI,MAAM,OAAO,IAAI,MAAM,QAAQ,CAAC,KAAK,UAAU,MAAM,QAAkB,CAAC,CAAC;CAC1I,MAAM,aAAa,IAAI,IAAI,SAAS;AAEpC,QAAO;EACL;EACA,SAAS,KAAK,OACX,QAAQ,UAAU,MAAM,WAAW,WAAW,IAAI,MAAM,QAAQ,IAAI,0BAA0B,MAAM,CAAC,CACrG,KAAK,WAAW;GACf,SAAS,MAAM;GACf,OAAO,MAAM;GACb,SAAS,MAAM;GACf,YAAY,MAAM,UAAU,eAAe,IAAI,MAAM,QAAQ,GAAG,KAAA;GAChE,QAAQ,0BAA0B,MAAM,IAAI;GAC5C,YAAY,MAAM;GACnB,EAAE;EACN;;AAGH,SAAS,0BAA0B,OAA8D;CAC/F,MAAM,mBAAmB,MAAM,YAAY,QAAQ,MAAM;AACzD,KAAI,iBAAkB,QAAO;AAE7B,QADe,MAAM,QAAQ,MAAM,IAClB,KAAA;;AAGnB,SAAgB,mCAAmC,YAA+D;CAChH,MAAM,WAA0C;EAC9C,IAAI,WAAW;EACf,MAAM,WAAW;EACjB,OAAO,WAAW;EAClB,SAAS,WAAW;EACpB,QAAQ,WAAW,SAAS;EAC5B,MAAM,CAAC,GAAG,WAAW,SAAS,KAAK;EACnC,YAAY,WAAW,OAAO;EAC9B,UAAU,EAAE,GAAG,WAAW,UAAU;EACpC,iBAAiB,WAAW,SAAS;EACtC;AACD,KAAI,WAAW,YAAa,UAAS,cAAc,WAAW;AAC9D,KAAI,WAAW,YAAa,UAAS,cAAc,WAAW;AAC9D,KAAI,WAAW,YAAa,UAAS,cAAc,gBAAgB,WAAW,YAAY;AAC1F,KAAI,WAAW,UAAW,UAAS,YAAY,gBAAgB,WAAW,UAAU;AACpF,QAAO;;AAGT,SAAS,yBAAyB,QAKoC;CACpE,MAAM,MAAM,OAAO,OAAO,QAAQ,UAAU;CAC5C,MAAM,2BAA2B,qBAC/B,KAAK,gBACL,OAAO,WAAW,SAAS,YAC5B;CACD,MAAM,yBAAyB,qBAC7B,KAAK,cACL,OAAO,WAAW,SAAS,aAC5B;CACD,MAAM,uBAAuB,qBAC3B,KAAK,mBACL,OAAO,WAAW,SAAS,WAC5B;AAED,QAAO;EACL,aAAa,KAAK,IAChB,GACA,KAAK,IACH,qBAAqB,OAAO,aAAa,OAAO,WAAW,SAAS,YAAY,EAChF,yBACD,CACF;EACD,cAAc,KAAK,IACjB,GACA,KAAK,IACH,qBAAqB,OAAO,cAAc,OAAO,WAAW,SAAS,aAAa,EAClF,uBACD,CACF;EACD,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,WAAW,SAAS,YAAY,qBAAqB,CAAC;EAC/F;;AAGH,SAAS,qBAAqB,OAA2B,UAA0B;AACjF,KAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,MAAM,IAAI,QAAQ,EAClE,QAAO;AAET,QAAO,KAAK,MAAM,MAAM;;AAG1B,SAAS,gBAAgB,MAAuB,OAA+B,aAA6B;AAE1G,QAAO,UAAU,YAAY,GADV,UAAU,kBAAkB,iBAAiB,iBACnB,gBAAgB,IAAI,KAAK,IAAI,qBAAqB,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI;;AAG1H,SAAgB,6BAA6B,QAA0C;AACrF,KAAI,gBAAgB,UAAU,OAAO,OAAO,eAAe,YAAY,OAAO,WAAW,MAAM,CAC7F,QAAO,OAAO,WAAW,MAAM;AAEjC,QAAO;;AAGT,SAAS,uBAAuB,QAA0D;AACxF,SAAQ,OAAO,MAAf;EACE,KAAK,OACH,QAAO;GAAE,SAAS;GAAQ,YAAY,OAAO;GAAY,WAAW,OAAO;GAAW;EACxF,KAAK,QACH,QAAO;GAAE,SAAS;GAAS,YAAY,OAAO;GAAY;EAC5D,KAAK,OACH,QAAO;GAAE,SAAS;GAAQ,YAAY,OAAO;GAAY,QAAQ,OAAO;GAAQ;EAClF,KAAK,MACH,QAAO;GAAE,SAAS;GAAO,WAAW,OAAO;GAAW;EACxD,KAAK,KACH,QAAO;GAAE,SAAS,OAAO;GAAS,QAAQ,OAAO;GAAQ,WAAW,OAAO;GAAW;;;AAI5F,SAAS,2BAA2B,OAAmD;AACrF,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,QAAO;AAET,QAAO,aAAa,SAAS,eAAe,SAAS,aAAa"}
1
+ {"version":3,"file":"workflow-run-service.js","names":["resolveModelById"],"sources":["../../../../src/workflows/service/workflow-run-service.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\n\nimport type { BuildChildToolsOptions } from '../../agent/child-agent-factory.js';\nimport { extractProfileAgentId } from '../../config/agent-profile.js';\nimport { resolveModelRef } from '../../config/agent-typed-models.js';\nimport type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';\nimport { resolveModel as resolveModelById } from '../../providers/index.js';\nimport { DelegateSubagentRunner } from '../../agent/workflow/subagent-runner.js';\nimport { CatalogWorkflowDefinitionRegistry } from '../registry/catalog-workflow-definition-registry.js';\nimport type { WorkflowDefinitionRegistry } from '../registry/workflow-definition-registry.js';\nimport { validateWorkflowJsonSchema } from '../domain/schema-validation.js';\nimport type {\n WorkflowDefinition,\n WorkflowRunDefinitionSnapshot,\n WorkflowRunInputEnvelope,\n WorkflowRunMetadata,\n WorkflowRunSource,\n} from '../domain/index.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/index.js';\nimport { WorkflowEngine } from '../engine/index.js';\nimport { WorkflowEventStore } from '../store/event-store.js';\nimport { WorkflowRunStore } from '../store/run-store.js';\nimport type { WorkflowSessionBridge } from './workflow-session-bridge.js';\nexport type {\n CancelWorkflowRunResult,\n CancelWorkflowRunServiceParams,\n CancelWorkflowRunServiceResult,\n ReplayWorkflowRunServiceParams,\n RetryWorkflowRunServiceParams,\n StartWorkflowRunServiceParams,\n StartWorkflowRunServiceResult,\n WorkflowRunServiceErrorCode,\n WorkflowRunServiceErrorResult,\n WorkflowRunServiceResult,\n} from './workflow-run-service.types.js';\n\nimport type {\n CancelWorkflowRunResult,\n CancelWorkflowRunServiceParams,\n ReplayWorkflowRunServiceParams,\n RetryWorkflowRunServiceParams,\n StartWorkflowRunServiceParams,\n WorkflowRunServiceResult,\n} from './workflow-run-service.types.js';\nimport type { WorkflowRunReplayMetadata, WorkflowRunReplayScope, WorkflowRunView } from '../domain/run.js';\nimport type { WorkflowReplayAgentTarget } from '../engine/index.js';\n\nexport interface WorkflowRunServiceOptions {\n service: GatewayWorkflowHost;\n sessionBridge: WorkflowSessionBridge;\n buildChildTools: (childOptions: BuildChildToolsOptions) => AgentTool<any, any>[];\n definitionRegistry?: WorkflowDefinitionRegistry;\n}\n\nexport class WorkflowRunService {\n private readonly activeRuns = new Map<string, AbortController>();\n private readonly timeoutHandles = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly definitionRegistry: WorkflowDefinitionRegistry;\n\n constructor(private readonly options: WorkflowRunServiceOptions) {\n this.definitionRegistry = options.definitionRegistry ?? new CatalogWorkflowDefinitionRegistry();\n }\n\n async startWorkflowRun(params: StartWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const definition = await this.loadDefinition(params.definitionId);\n if (!definition) {\n return {\n ok: false,\n code: 'definition_not_found',\n message: 'Workflow definition not found',\n httpStatus: 404,\n };\n }\n\n const inputEnvelope = params.inputEnvelope ?? buildWorkflowRunInputEnvelope(params.input, params.goal);\n const inputValidation = validateWorkflowJsonSchema(definition.inputSchema, inputEnvelope.payload);\n if (!inputValidation.ok) {\n return {\n ok: false,\n code: 'invalid_input',\n message: inputValidation.message ?? 'Workflow input did not match input schema',\n httpStatus: 400,\n };\n }\n\n const existingRun = params.idempotencyKey\n ? await this.findRunByIdempotencyKey(params.agentId, params.idempotencyKey)\n : null;\n if (existingRun) {\n return {\n ok: true,\n runId: existingRun.run.id,\n sessionKey: existingRun.run.metadata?.sessionKey ?? '',\n };\n }\n\n const runId = randomUUID();\n const goal = params.goal ?? '';\n const { sessionKey } = await this.options.sessionBridge.prepareRunSession({\n runId,\n agentId: params.agentId,\n definitionId: params.definitionId,\n definitionTitle: definition.title,\n goal,\n parentSessionKey: params.parentSessionKey,\n });\n const source = normalizeWorkflowRunSourceForSession(params.source, sessionKey, params.parentSessionKey);\n const abortController = new AbortController();\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n const runStore = new WorkflowRunStore(this.options.service.currentConfig, params.agentId, eventStore);\n const engine = this.createWorkflowEngine({\n eventStore,\n runStore,\n sessionKey,\n });\n const limits = resolveWorkflowRunLimits({\n config: this.options.service.currentConfig,\n definition,\n concurrency: params.concurrency,\n maxSubagents: params.maxSubagents,\n });\n\n this.activeRuns.set(runId, abortController);\n const timeoutHandle = setTimeout(() => {\n abortController.abort(new Error(`workflow timed out after ${limits.timeoutSec}s`));\n }, limits.timeoutSec * 1000);\n this.timeoutHandles.set(runId, timeoutHandle);\n void engine.startRun(definition, {\n runId,\n input: inputEnvelope.payload,\n goal: inputEnvelope.goal ?? params.goal,\n source,\n metadata: buildWorkflowRunMetadata({\n definition,\n agentId: params.agentId,\n goalId: params.goalId,\n sessionKey,\n source,\n input: inputEnvelope,\n retryOfRunId: params.retryOfRunId,\n idempotencyKey: params.idempotencyKey,\n }),\n signal: abortController.signal,\n concurrency: limits.concurrency,\n maxSubagents: limits.maxSubagents,\n tokenBudget: params.tokenBudget,\n timeoutSec: limits.timeoutSec,\n }).catch((err) => {\n this.options.service.emit('workflow.run.error', {\n runId,\n error: err instanceof Error ? err.message : String(err),\n });\n }).finally(() => {\n this.activeRuns.delete(runId);\n const handle = this.timeoutHandles.get(runId);\n if (handle) clearTimeout(handle);\n this.timeoutHandles.delete(runId);\n });\n\n return { ok: true, runId, sessionKey };\n }\n\n async retryWorkflowRun(params: RetryWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const runStore = this.createRunStore(params.agentId);\n const existing = await runStore.readRunView(params.runId);\n if (!existing) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n const parentSessionKey =\n existing.run.source.kind === 'chat' ? existing.run.source.sessionKey : undefined;\n\n return this.startWorkflowRun({\n agentId: params.agentId,\n definitionId: existing.run.definitionId,\n input: existing.run.input,\n goal: existing.run.goal,\n source: existing.run.source,\n parentSessionKey,\n retryOfRunId: existing.run.id,\n });\n }\n\n async replayWorkflowRun(params: ReplayWorkflowRunServiceParams): Promise<WorkflowRunServiceResult> {\n const runStore = this.createRunStore(params.agentId);\n const existing = await runStore.readRunView(params.runId);\n if (!existing) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n const definition = await this.loadDefinition(existing.run.definitionId);\n if (!definition) {\n return {\n ok: false,\n code: 'definition_not_found',\n message: 'Workflow definition not found',\n httpStatus: 404,\n };\n }\n\n const targets = resolveWorkflowReplayTargets(existing, params.scope);\n if (targets.targets.length === 0) {\n return {\n ok: false,\n code: 'invalid_state',\n message: params.scope === 'failed_phases'\n ? 'No failed workflow phase is available to replay'\n : 'No failed workflow agent is available to replay',\n httpStatus: 409,\n };\n }\n\n const replayRunId = randomUUID();\n const goal = buildReplayGoal(existing, params.scope, targets.targets.length);\n const parentSessionKey =\n existing.run.source.kind === 'chat' ? existing.run.source.sessionKey : undefined;\n const { sessionKey } = await this.options.sessionBridge.prepareRunSession({\n runId: replayRunId,\n agentId: params.agentId,\n definitionId: existing.run.definitionId,\n definitionTitle: `${definition.title} replay`,\n goal,\n parentSessionKey,\n });\n const source = normalizeWorkflowRunSourceForSession(existing.run.source, sessionKey, parentSessionKey);\n const abortController = new AbortController();\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n const replayRunStore = new WorkflowRunStore(this.options.service.currentConfig, params.agentId, eventStore);\n const engine = this.createWorkflowEngine({\n eventStore,\n runStore: replayRunStore,\n sessionKey,\n });\n const limits = resolveWorkflowRunLimits({\n config: this.options.service.currentConfig,\n definition,\n });\n const inputEnvelope = existing.run.metadata?.input ?? buildWorkflowRunInputEnvelope(existing.run.input, existing.run.goal);\n\n this.activeRuns.set(replayRunId, abortController);\n const timeoutHandle = setTimeout(() => {\n abortController.abort(new Error(`workflow timed out after ${limits.timeoutSec}s`));\n }, limits.timeoutSec * 1000);\n this.timeoutHandles.set(replayRunId, timeoutHandle);\n void engine.startReplayRun(definition, {\n runId: replayRunId,\n input: inputEnvelope.payload,\n goal,\n source,\n metadata: buildWorkflowRunMetadata({\n definition,\n agentId: params.agentId,\n goalId: existing.run.metadata?.goalId,\n sessionKey,\n source,\n input: inputEnvelope,\n retryOfRunId: existing.run.id,\n replay: {\n sourceRunId: existing.run.id,\n scope: params.scope,\n phaseIds: targets.phaseIds,\n agentIds: targets.targets.map((target) => target.agentId),\n targetCount: targets.targets.length,\n createdAtMs: Date.now(),\n },\n }),\n signal: abortController.signal,\n concurrency: limits.concurrency,\n maxSubagents: limits.maxSubagents,\n timeoutSec: limits.timeoutSec,\n sourceRunId: existing.run.id,\n replayScope: params.scope,\n targets: targets.targets,\n }).catch((err) => {\n this.options.service.emit('workflow.run.error', {\n runId: replayRunId,\n error: err instanceof Error ? err.message : String(err),\n });\n }).finally(() => {\n this.activeRuns.delete(replayRunId);\n const handle = this.timeoutHandles.get(replayRunId);\n if (handle) clearTimeout(handle);\n this.timeoutHandles.delete(replayRunId);\n });\n\n return { ok: true, runId: replayRunId, sessionKey };\n }\n\n async cancelWorkflowRun(params: CancelWorkflowRunServiceParams): Promise<CancelWorkflowRunResult> {\n const controller = this.activeRuns.get(params.runId);\n if (controller) {\n controller.abort();\n this.activeRuns.delete(params.runId);\n const handle = this.timeoutHandles.get(params.runId);\n if (handle) clearTimeout(handle);\n this.timeoutHandles.delete(params.runId);\n return { ok: true, cancelled: true };\n }\n\n const runStore = this.createRunStore(params.agentId);\n const view = await runStore.readRunView(params.runId);\n if (!view) {\n return {\n ok: false,\n code: 'run_not_found',\n message: 'Workflow run not found',\n httpStatus: 404,\n };\n }\n\n if (isTerminalWorkflowRunStatus(view.run.status)) {\n return { ok: true, cancelled: true, alreadyFinished: true };\n }\n\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, params.agentId);\n await eventStore.append({\n runId: params.runId,\n type: 'run_cancelled',\n payload: { reason: params.reason ?? 'Cancelled by user' },\n });\n const updated = await runStore.rebuildRunView(params.runId);\n if (updated) {\n this.options.service.emit('workflow.run.updated', { runId: params.runId, view: updated });\n void this.options.sessionBridge.handleRunViewUpdated(updated);\n }\n return { ok: true, cancelled: true };\n }\n\n createRunStore(agentId: string): WorkflowRunStore {\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, agentId);\n return new WorkflowRunStore(this.options.service.currentConfig, agentId, eventStore);\n }\n\n async readWorkflowRunView(agentId: string, runId: string) {\n return this.createRunStore(agentId).readRunView(runId);\n }\n\n async reconcileInterruptedRuns(agentId: string): Promise<number> {\n const runStore = this.createRunStore(agentId);\n const summaries = await runStore.listRunSummaries(500);\n let reconciled = 0;\n\n for (const summary of summaries) {\n if (isTerminalWorkflowRunStatus(summary.status) || this.activeRuns.has(summary.id)) {\n continue;\n }\n\n const eventStore = new WorkflowEventStore(this.options.service.currentConfig, agentId);\n await eventStore.append({\n runId: summary.id,\n type: 'run_failed',\n payload: {\n error: {\n code: 'runtime_error',\n message: 'Workflow run interrupted by gateway restart',\n recoverable: true,\n },\n },\n });\n const updated = await runStore.rebuildRunView(summary.id);\n if (updated) {\n this.options.service.emit('workflow.run.updated', { runId: summary.id, view: updated });\n void this.options.sessionBridge.handleRunViewUpdated(updated);\n }\n reconciled += 1;\n }\n\n return reconciled;\n }\n\n private loadDefinition(definitionId: string): Promise<WorkflowDefinition | null> {\n return this.definitionRegistry.get(definitionId);\n }\n\n private async findRunByIdempotencyKey(agentId: string, idempotencyKey: string) {\n const runStore = this.createRunStore(agentId);\n const summaries = await runStore.listRunSummaries(500);\n for (const summary of summaries) {\n if (summary.metadata?.correlation?.idempotencyKey !== idempotencyKey) {\n continue;\n }\n return runStore.readRunView(summary.id);\n }\n return null;\n }\n\n private createWorkflowEngine(params: {\n eventStore: WorkflowEventStore;\n runStore: WorkflowRunStore;\n sessionKey: string;\n }): WorkflowEngine {\n const gatewayService = this.options.service;\n const runner = new DelegateSubagentRunner({\n workspace: gatewayService.currentWorkspacePath,\n bus: gatewayService.messageBusInstance,\n getDefaultModel: () => resolveModelById(gatewayService.agentService.getModelForSession(params.sessionKey)),\n getConfig: () => gatewayService.currentConfig,\n sessionStore: gatewayService.sessionIndexInstance.getStore(),\n buildChildTools: (childOptions) => this.options.buildChildTools(childOptions),\n });\n\n return new WorkflowEngine({\n cwd: gatewayService.currentWorkspacePath,\n eventStore: params.eventStore,\n runStore: params.runStore,\n runner,\n resolveModelId: (modelId) => {\n const agentId = extractProfileAgentId(params.sessionKey, gatewayService.currentConfig);\n return resolveModelById(resolveModelRef(gatewayService.currentConfig, agentId, modelId));\n },\n parentSessionKey: params.sessionKey,\n subagentSessionKeyFactory: ({ runId, agentId }) => {\n const profileAgentId = extractProfileAgentId(params.sessionKey, gatewayService.currentConfig);\n return `agent:${profileAgentId}:workflow:${runId}:subagent:${agentId}`;\n },\n onEventAppended: (event) => {\n gatewayService.emit('workflow.event.appended', { runId: event.runId, event });\n },\n onRunViewUpdated: (view) => {\n gatewayService.emit('workflow.run.updated', { runId: view.run.id, view });\n void this.options.sessionBridge.handleRunViewUpdated(view);\n },\n });\n }\n}\n\nfunction normalizeWorkflowRunSourceForSession(\n source: WorkflowRunSource,\n workflowSessionKey: string,\n parentSessionKey?: string,\n): WorkflowRunSource {\n if (parentSessionKey?.trim()) {\n return { kind: 'chat', sessionKey: parentSessionKey.trim() };\n }\n if (source.kind === 'webui') {\n return { ...source, sessionKey: workflowSessionKey };\n }\n if (source.kind === 'chat') {\n return source;\n }\n return source;\n}\n\nexport function buildWorkflowRunInputEnvelope(input: unknown, goal?: string): WorkflowRunInputEnvelope {\n if (isWorkflowRunInputEnvelope(input)) {\n return input;\n }\n return {\n payload: input ?? {},\n goal,\n };\n}\n\nexport function buildWorkflowRunMetadata(params: {\n definition: WorkflowDefinition;\n agentId: string;\n goalId?: string;\n sessionKey: string;\n source: WorkflowRunSource;\n input: WorkflowRunInputEnvelope;\n retryOfRunId?: string;\n idempotencyKey?: string;\n replay?: WorkflowRunReplayMetadata;\n}): WorkflowRunMetadata {\n const goalId = params.goalId?.trim() || undefined;\n return {\n sessionKey: params.sessionKey,\n triggerSource: params.source.kind,\n agentId: params.agentId,\n retryOfRunId: params.retryOfRunId,\n replay: params.replay,\n definition: buildWorkflowRunDefinitionSnapshot(params.definition),\n input: params.input,\n correlation: {\n idempotencyKey: params.idempotencyKey,\n },\n origin: buildWorkflowRunOrigin(params.source),\n schedule: params.source.kind === 'cron'\n ? { scheduleId: params.source.scheduleId, fireId: params.source.fireId }\n : undefined,\n goalId,\n };\n}\n\nexport function resolveWorkflowReplayTargets(\n view: WorkflowRunView,\n scope: WorkflowRunReplayScope,\n): { targets: WorkflowReplayAgentTarget[]; phaseIds?: string[] } {\n const phaseTitleById = new Map(view.phases.map((phase) => [phase.id, phase.title]));\n const failedStatuses = new Set(['error', 'skipped']);\n\n if (scope === 'failed_agents') {\n return {\n targets: view.agents\n .filter((agent) => failedStatuses.has(agent.status) && workflowAgentReplayPrompt(agent))\n .map((agent) => ({\n agentId: agent.id,\n label: agent.label,\n phaseId: agent.phaseId,\n phaseTitle: agent.phaseId ? phaseTitleById.get(agent.phaseId) : undefined,\n prompt: workflowAgentReplayPrompt(agent) ?? '',\n invocation: agent.invocation,\n })),\n };\n }\n\n const failedPhaseIds = view.phases\n .filter((phase) => phase.status === 'failed')\n .map((phase) => phase.id);\n const phaseIds = failedPhaseIds.length > 0\n ? failedPhaseIds\n : [...new Set(view.agents.filter((agent) => failedStatuses.has(agent.status) && agent.phaseId).map((agent) => agent.phaseId as string))];\n const phaseIdSet = new Set(phaseIds);\n\n return {\n phaseIds,\n targets: view.agents\n .filter((agent) => agent.phaseId && phaseIdSet.has(agent.phaseId) && workflowAgentReplayPrompt(agent))\n .map((agent) => ({\n agentId: agent.id,\n label: agent.label,\n phaseId: agent.phaseId,\n phaseTitle: agent.phaseId ? phaseTitleById.get(agent.phaseId) : undefined,\n prompt: workflowAgentReplayPrompt(agent) ?? '',\n invocation: agent.invocation,\n })),\n };\n}\n\nfunction workflowAgentReplayPrompt(agent: WorkflowRunView['agents'][number]): string | undefined {\n const invocationPrompt = agent.invocation?.prompt?.trim();\n if (invocationPrompt) return invocationPrompt;\n const prompt = agent.prompt?.trim();\n return prompt || undefined;\n}\n\nexport function buildWorkflowRunDefinitionSnapshot(definition: WorkflowDefinition): WorkflowRunDefinitionSnapshot {\n const snapshot: WorkflowRunDefinitionSnapshot = {\n id: definition.id,\n name: definition.name,\n title: definition.title,\n version: definition.version,\n source: definition.metadata.source,\n tags: [...definition.metadata.tags],\n phaseCount: definition.phases.length,\n defaults: { ...definition.defaults },\n estimatedAgents: definition.metadata.estimatedAgents,\n };\n if (definition.contentHash) snapshot.contentHash = definition.contentHash;\n if (definition.runtimeHash) snapshot.runtimeHash = definition.runtimeHash;\n if (definition.permissions) snapshot.permissions = structuredClone(definition.permissions);\n if (definition.resources) snapshot.resources = structuredClone(definition.resources);\n return snapshot;\n}\n\nfunction resolveWorkflowRunLimits(params: {\n config: import('../../config/schema.js').Config;\n definition: WorkflowDefinition;\n concurrency?: number;\n maxSubagents?: number;\n}): { concurrency: number; maxSubagents: number; timeoutSec: number } {\n const cfg = params.config.agents?.defaults?.workflow;\n const configuredMaxConcurrency = normalizePositiveInt(\n cfg?.maxConcurrency,\n params.definition.defaults.concurrency,\n );\n const configuredMaxSubagents = normalizePositiveInt(\n cfg?.maxSubagents,\n params.definition.defaults.maxSubagents,\n );\n const configuredTimeoutSec = normalizePositiveInt(\n cfg?.defaultTimeoutSec,\n params.definition.defaults.timeoutSec,\n );\n\n return {\n concurrency: Math.max(\n 1,\n Math.min(\n normalizePositiveInt(params.concurrency, params.definition.defaults.concurrency),\n configuredMaxConcurrency,\n ),\n ),\n maxSubagents: Math.max(\n 1,\n Math.min(\n normalizePositiveInt(params.maxSubagents, params.definition.defaults.maxSubagents),\n configuredMaxSubagents,\n ),\n ),\n timeoutSec: Math.max(1, Math.min(params.definition.defaults.timeoutSec, configuredTimeoutSec)),\n };\n}\n\nfunction normalizePositiveInt(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 1) {\n return fallback;\n }\n return Math.floor(value);\n}\n\nfunction buildReplayGoal(view: WorkflowRunView, scope: WorkflowRunReplayScope, targetCount: number): string {\n const scopeLabel = scope === 'failed_phases' ? 'failed phase' : 'failed agent';\n return `Replay ${targetCount} ${scopeLabel}${targetCount === 1 ? '' : 's'} from workflow run ${view.run.id}: ${view.run.goal}`;\n}\n\nexport function extractWorkflowRunSessionKey(source: WorkflowRunSource): string | null {\n if ('sessionKey' in source && typeof source.sessionKey === 'string' && source.sessionKey.trim()) {\n return source.sessionKey.trim();\n }\n return null;\n}\n\nfunction buildWorkflowRunOrigin(source: WorkflowRunSource): WorkflowRunMetadata['origin'] {\n switch (source.kind) {\n case 'chat':\n return { channel: 'chat', sessionKey: source.sessionKey, messageId: source.messageId };\n case 'webui':\n return { channel: 'webui', sessionKey: source.sessionKey };\n case 'cron':\n return { channel: 'cron', scheduleId: source.scheduleId, fireId: source.fireId };\n case 'api':\n return { channel: 'api', requestId: source.requestId };\n case 'im':\n return { channel: source.channel, chatId: source.chatId, messageId: source.messageId };\n }\n}\n\nfunction isWorkflowRunInputEnvelope(input: unknown): input is WorkflowRunInputEnvelope {\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return false;\n }\n return 'payload' in input || 'variables' in input || 'context' in input;\n}\n"],"mappings":"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"}
@@ -2,6 +2,7 @@ import type { WorkflowRunInputEnvelope, WorkflowRunReplayScope, WorkflowRunSourc
2
2
  export interface StartWorkflowRunServiceParams {
3
3
  agentId: string;
4
4
  definitionId: string;
5
+ goalId?: string;
5
6
  parentSessionKey?: string;
6
7
  input?: unknown;
7
8
  inputEnvelope?: WorkflowRunInputEnvelope;
@@ -1,8 +1,10 @@
1
1
  import "../../session/types.js";
2
2
  import { renderWorkflowText } from "../../agent/workflow/snapshot.js";
3
+ import { runViewToSnapshot } from "./run-view-to-snapshot.js";
4
+ import { GoalWorkflowJudge } from "../../goals/goal-workflow-judge.js";
5
+ import "../../goals/index.js";
3
6
  import { isTerminalWorkflowRunStatus } from "../domain/run.js";
4
7
  import "../domain/index.js";
5
- import { runViewToSnapshot } from "./run-view-to-snapshot.js";
6
8
  import { buildWorkflowRunSessionKey } from "./workflow-session-key.js";
7
9
  import { randomUUID } from "node:crypto";
8
10
  //#region src/workflows/service/workflow-session-bridge.ts
@@ -71,6 +73,11 @@ var WorkflowSessionBridge = class {
71
73
  goal: view.run.goal,
72
74
  status: view.run.status
73
75
  });
76
+ await new GoalWorkflowJudge().handleTerminalWorkflowRun({
77
+ config: this.gateway.currentConfig,
78
+ view,
79
+ sessionKey
80
+ });
74
81
  }
75
82
  async persistTerminalTranscript(sessionKey, view) {
76
83
  const store = this.gateway.sessionIndexInstance.getStore();
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-session-bridge.js","names":[],"sources":["../../../../src/workflows/service/workflow-session-bridge.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';\nimport { renderWorkflowText } from '../../agent/workflow/snapshot.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { SessionStatus } from '../../session/types.js';\nimport type { WorkflowRunView } from '../domain/index.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/index.js';\n\nimport { runViewToSnapshot } from './run-view-to-snapshot.js';\nimport { buildWorkflowRunSessionKey } from './workflow-session-key.js';\n\nexport const WORKFLOW_SESSION_TYPE = 'workflow-run';\nexport const WORKFLOW_RUN_LINK_CONTEXT_KIND = 'workflow-run-link';\n\nexport interface PrepareWorkflowRunSessionParams {\n runId: string;\n agentId: string;\n definitionId: string;\n definitionTitle: string;\n goal: string;\n parentSessionKey?: string;\n}\n\nexport interface PrepareWorkflowRunSessionResult {\n sessionKey: string;\n}\n\nexport class WorkflowSessionBridge {\n private readonly terminalPersistedRunIds = new Set<string>();\n\n constructor(private readonly gateway: GatewayWorkflowHost) {}\n\n async prepareRunSession(params: PrepareWorkflowRunSessionParams): Promise<PrepareWorkflowRunSessionResult> {\n const sessionKey = buildWorkflowRunSessionKey(params.agentId, params.runId);\n const goalText = formatWorkflowGoalUserMessage(params.definitionId, params.goal);\n const sessionName = truncateSessionName(params.goal.trim() || params.definitionTitle || params.definitionId);\n\n const store = this.gateway.sessionIndexInstance.getStore();\n await store.resolveTranscriptPath(sessionKey);\n await store.updateMetadata(sessionKey, {\n sessionType: WORKFLOW_SESSION_TYPE,\n hiddenFromSessionList: true,\n workflowRunId: params.runId,\n workflowDefinitionId: params.definitionId,\n name: sessionName,\n tags: ['workflow', params.definitionId],\n customData: {\n workflowRunId: params.runId,\n workflowDefinitionId: params.definitionId,\n workflowGoal: params.goal,\n ...(params.parentSessionKey ? { parentSessionKey: params.parentSessionKey } : {}),\n },\n });\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'user',\n content: [{ type: 'text', text: goalText }],\n timestamp: Date.now(),\n });\n\n if (params.parentSessionKey?.trim()) {\n await this.writeParentRunLink({\n parentSessionKey: params.parentSessionKey.trim(),\n runId: params.runId,\n workflowSessionKey: sessionKey,\n definitionId: params.definitionId,\n goal: params.goal,\n status: 'running',\n });\n }\n\n this.gateway.emit('session.updated', { key: sessionKey, name: sessionName });\n return { sessionKey };\n }\n\n async handleRunViewUpdated(view: WorkflowRunView): Promise<void> {\n const runId = view.run.id;\n const sessionKey = view.run.metadata?.sessionKey?.trim();\n if (!sessionKey || !isTerminalWorkflowRunStatus(view.run.status)) {\n return;\n }\n if (this.terminalPersistedRunIds.has(runId)) {\n return;\n }\n this.terminalPersistedRunIds.add(runId);\n\n await this.persistTerminalTranscript(sessionKey, view);\n\n const parentSessionKey = readParentSessionKey(view);\n if (parentSessionKey) {\n await this.writeParentRunLink({\n parentSessionKey,\n runId,\n workflowSessionKey: sessionKey,\n definitionId: view.run.definitionId,\n goal: view.run.goal,\n status: view.run.status,\n });\n }\n }\n\n private async persistTerminalTranscript(sessionKey: string, view: WorkflowRunView): Promise<void> {\n const store = this.gateway.sessionIndexInstance.getStore();\n const snapshot = runViewToSnapshot(view);\n const toolCallId = randomUUID();\n const completed = view.run.status === 'succeeded';\n const resultText = renderWorkflowText(snapshot, completed, { showResultPreviews: true });\n const envelope = {\n content: [{ type: 'text', text: resultText }],\n details: snapshot,\n };\n const isError = view.run.status === 'failed' || view.run.status === 'timeout';\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'assistant',\n content: [\n {\n type: 'toolCall',\n id: toolCallId,\n name: 'workflow',\n arguments: { name: view.run.definitionId },\n },\n ],\n timestamp: Date.now(),\n } as unknown as Parameters<SessionStore['appendTranscriptMessage']>[1]);\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'toolResult',\n toolCallId,\n content: [{ type: 'text', text: JSON.stringify(envelope) }],\n details: snapshot,\n isError,\n timestamp: Date.now(),\n } as unknown as Parameters<SessionStore['appendTranscriptMessage']>[1]);\n\n await store.updateMetadata(sessionKey, {\n status: SessionStatus.ACTIVE,\n });\n }\n\n private async writeParentRunLink(params: {\n parentSessionKey: string;\n runId: string;\n workflowSessionKey: string;\n definitionId: string;\n goal: string;\n status: WorkflowRunView['run']['status'];\n }): Promise<void> {\n const store = this.gateway.sessionIndexInstance.getStore();\n const text = formatParentRunLinkText(params);\n await store.appendTranscriptContextEntry(params.parentSessionKey, {\n kind: 'context',\n id: `workflow-run-link:${params.runId}`,\n text,\n data: {\n kind: WORKFLOW_RUN_LINK_CONTEXT_KIND,\n runId: params.runId,\n workflowSessionKey: params.workflowSessionKey,\n definitionId: params.definitionId,\n goal: params.goal,\n status: params.status,\n },\n createdAt: new Date().toISOString(),\n });\n }\n}\n\nfunction formatWorkflowGoalUserMessage(definitionId: string, goal: string): string {\n const trimmedGoal = goal.trim();\n if (trimmedGoal) {\n return `Run workflow \\`${definitionId}\\`:\\n\\n${trimmedGoal}`;\n }\n return `Run workflow \\`${definitionId}\\``;\n}\n\nfunction truncateSessionName(name: string): string {\n const trimmed = name.trim();\n if (trimmed.length <= 80) return trimmed;\n return `${trimmed.slice(0, 77)}…`;\n}\n\nfunction readParentSessionKey(view: WorkflowRunView): string | null {\n if (view.run.source.kind === 'chat') {\n const originKey = view.run.source.sessionKey?.trim();\n if (originKey) return originKey;\n }\n const customParent = view.run.metadata?.origin?.sessionKey?.trim();\n if (customParent && view.run.metadata?.triggerSource === 'chat') {\n return customParent;\n }\n return null;\n}\n\nexport function formatParentRunLinkText(params: {\n definitionId: string;\n goal: string;\n status: WorkflowRunView['run']['status'];\n}): string {\n const label = params.goal.trim() || params.definitionId;\n if (params.status === 'running' || params.status === 'queued') {\n return `Workflow \\`${params.definitionId}\\` is running: ${label}`;\n }\n if (params.status === 'succeeded') {\n return `Workflow \\`${params.definitionId}\\` completed: ${label}`;\n }\n return `Workflow \\`${params.definitionId}\\` finished (${params.status}): ${label}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"workflow-session-bridge.js","names":[],"sources":["../../../../src/workflows/service/workflow-session-bridge.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { GatewayWorkflowHost } from '../../gateway/gateway-workflow-host.types.js';\nimport { renderWorkflowText } from '../../agent/workflow/snapshot.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { SessionStatus } from '../../session/types.js';\nimport type { WorkflowRunView } from '../domain/index.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/index.js';\nimport { GoalWorkflowJudge } from '../../goals/index.js';\n\nimport { runViewToSnapshot } from './run-view-to-snapshot.js';\nimport { buildWorkflowRunSessionKey } from './workflow-session-key.js';\n\nexport const WORKFLOW_SESSION_TYPE = 'workflow-run';\nexport const WORKFLOW_RUN_LINK_CONTEXT_KIND = 'workflow-run-link';\n\nexport interface PrepareWorkflowRunSessionParams {\n runId: string;\n agentId: string;\n definitionId: string;\n definitionTitle: string;\n goal: string;\n parentSessionKey?: string;\n}\n\nexport interface PrepareWorkflowRunSessionResult {\n sessionKey: string;\n}\n\nexport class WorkflowSessionBridge {\n private readonly terminalPersistedRunIds = new Set<string>();\n\n constructor(private readonly gateway: GatewayWorkflowHost) {}\n\n async prepareRunSession(params: PrepareWorkflowRunSessionParams): Promise<PrepareWorkflowRunSessionResult> {\n const sessionKey = buildWorkflowRunSessionKey(params.agentId, params.runId);\n const goalText = formatWorkflowGoalUserMessage(params.definitionId, params.goal);\n const sessionName = truncateSessionName(params.goal.trim() || params.definitionTitle || params.definitionId);\n\n const store = this.gateway.sessionIndexInstance.getStore();\n await store.resolveTranscriptPath(sessionKey);\n await store.updateMetadata(sessionKey, {\n sessionType: WORKFLOW_SESSION_TYPE,\n hiddenFromSessionList: true,\n workflowRunId: params.runId,\n workflowDefinitionId: params.definitionId,\n name: sessionName,\n tags: ['workflow', params.definitionId],\n customData: {\n workflowRunId: params.runId,\n workflowDefinitionId: params.definitionId,\n workflowGoal: params.goal,\n ...(params.parentSessionKey ? { parentSessionKey: params.parentSessionKey } : {}),\n },\n });\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'user',\n content: [{ type: 'text', text: goalText }],\n timestamp: Date.now(),\n });\n\n if (params.parentSessionKey?.trim()) {\n await this.writeParentRunLink({\n parentSessionKey: params.parentSessionKey.trim(),\n runId: params.runId,\n workflowSessionKey: sessionKey,\n definitionId: params.definitionId,\n goal: params.goal,\n status: 'running',\n });\n }\n\n this.gateway.emit('session.updated', { key: sessionKey, name: sessionName });\n return { sessionKey };\n }\n\n async handleRunViewUpdated(view: WorkflowRunView): Promise<void> {\n const runId = view.run.id;\n const sessionKey = view.run.metadata?.sessionKey?.trim();\n if (!sessionKey || !isTerminalWorkflowRunStatus(view.run.status)) {\n return;\n }\n if (this.terminalPersistedRunIds.has(runId)) {\n return;\n }\n this.terminalPersistedRunIds.add(runId);\n\n await this.persistTerminalTranscript(sessionKey, view);\n\n const parentSessionKey = readParentSessionKey(view);\n if (parentSessionKey) {\n await this.writeParentRunLink({\n parentSessionKey,\n runId,\n workflowSessionKey: sessionKey,\n definitionId: view.run.definitionId,\n goal: view.run.goal,\n status: view.run.status,\n });\n }\n await new GoalWorkflowJudge().handleTerminalWorkflowRun({\n config: this.gateway.currentConfig,\n view,\n sessionKey,\n });\n }\n\n private async persistTerminalTranscript(sessionKey: string, view: WorkflowRunView): Promise<void> {\n const store = this.gateway.sessionIndexInstance.getStore();\n const snapshot = runViewToSnapshot(view);\n const toolCallId = randomUUID();\n const completed = view.run.status === 'succeeded';\n const resultText = renderWorkflowText(snapshot, completed, { showResultPreviews: true });\n const envelope = {\n content: [{ type: 'text', text: resultText }],\n details: snapshot,\n };\n const isError = view.run.status === 'failed' || view.run.status === 'timeout';\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'assistant',\n content: [\n {\n type: 'toolCall',\n id: toolCallId,\n name: 'workflow',\n arguments: { name: view.run.definitionId },\n },\n ],\n timestamp: Date.now(),\n } as unknown as Parameters<SessionStore['appendTranscriptMessage']>[1]);\n\n await store.appendTranscriptMessage(sessionKey, {\n role: 'toolResult',\n toolCallId,\n content: [{ type: 'text', text: JSON.stringify(envelope) }],\n details: snapshot,\n isError,\n timestamp: Date.now(),\n } as unknown as Parameters<SessionStore['appendTranscriptMessage']>[1]);\n\n await store.updateMetadata(sessionKey, {\n status: SessionStatus.ACTIVE,\n });\n }\n\n private async writeParentRunLink(params: {\n parentSessionKey: string;\n runId: string;\n workflowSessionKey: string;\n definitionId: string;\n goal: string;\n status: WorkflowRunView['run']['status'];\n }): Promise<void> {\n const store = this.gateway.sessionIndexInstance.getStore();\n const text = formatParentRunLinkText(params);\n await store.appendTranscriptContextEntry(params.parentSessionKey, {\n kind: 'context',\n id: `workflow-run-link:${params.runId}`,\n text,\n data: {\n kind: WORKFLOW_RUN_LINK_CONTEXT_KIND,\n runId: params.runId,\n workflowSessionKey: params.workflowSessionKey,\n definitionId: params.definitionId,\n goal: params.goal,\n status: params.status,\n },\n createdAt: new Date().toISOString(),\n });\n }\n}\n\nfunction formatWorkflowGoalUserMessage(definitionId: string, goal: string): string {\n const trimmedGoal = goal.trim();\n if (trimmedGoal) {\n return `Run workflow \\`${definitionId}\\`:\\n\\n${trimmedGoal}`;\n }\n return `Run workflow \\`${definitionId}\\``;\n}\n\nfunction truncateSessionName(name: string): string {\n const trimmed = name.trim();\n if (trimmed.length <= 80) return trimmed;\n return `${trimmed.slice(0, 77)}…`;\n}\n\nfunction readParentSessionKey(view: WorkflowRunView): string | null {\n if (view.run.source.kind === 'chat') {\n const originKey = view.run.source.sessionKey?.trim();\n if (originKey) return originKey;\n }\n const customParent = view.run.metadata?.origin?.sessionKey?.trim();\n if (customParent && view.run.metadata?.triggerSource === 'chat') {\n return customParent;\n }\n return null;\n}\n\nexport function formatParentRunLinkText(params: {\n definitionId: string;\n goal: string;\n status: WorkflowRunView['run']['status'];\n}): string {\n const label = params.goal.trim() || params.definitionId;\n if (params.status === 'running' || params.status === 'queued') {\n return `Workflow \\`${params.definitionId}\\` is running: ${label}`;\n }\n if (params.status === 'succeeded') {\n return `Workflow \\`${params.definitionId}\\` completed: ${label}`;\n }\n return `Workflow \\`${params.definitionId}\\` finished (${params.status}): ${label}`;\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { resolveWorkflowRunEventsPath, resolveWorkflowRunsDir } from "./paths.js";
4
- import { dirname } from "node:path";
5
4
  import { randomUUID } from "node:crypto";
6
5
  import { appendFile, mkdir, readFile, readdir } from "node:fs/promises";
6
+ import { dirname } from "node:path";
7
7
  //#region src/workflows/store/event-store.ts
8
8
  init_logger();
9
9
  const log = createLogger("WorkflowEventStore");
@@ -0,0 +1,8 @@
1
+ import type { WorkflowRunSummary, WorkflowRunView } from '../domain/run.js';
2
+ export declare class WorkflowRunIndexStore {
3
+ upsert(agentId: string, view: WorkflowRunView): void;
4
+ list(agentId: string, options?: {
5
+ limit?: number;
6
+ goalId?: string;
7
+ }): WorkflowRunSummary[];
8
+ }