@xopcai/xopc 0.0.106 → 0.0.107

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 (370) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/dashscope/xopc.extension.json +7 -2
  3. package/dist/extensions/fal/xopc.extension.json +7 -2
  4. package/dist/extensions/feishu/src/adapters/gateway-setup.js +22 -26
  5. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -1
  6. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  7. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  8. package/dist/extensions/feishu/xopc.extension.json +458 -26
  9. package/dist/extensions/google/xopc.extension.json +7 -2
  10. package/dist/extensions/minimax/xopc.extension.json +8 -2
  11. package/dist/extensions/openai/xopc.extension.json +7 -2
  12. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  13. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  14. package/dist/extensions/telegram/src/plugin.js +1 -1
  15. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  16. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  17. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  18. package/dist/extensions/telegram/xopc.extension.json +10 -2
  19. package/dist/extensions/weixin/src/api/api.js +2 -2
  20. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  21. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  22. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  23. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  24. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  25. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  26. package/dist/extensions/weixin/src/plugin.js +1 -1
  27. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  28. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  29. package/dist/extensions/weixin/xopc.extension.json +57 -14
  30. package/dist/gateway/static/root/apple-touch-icon.png +0 -0
  31. package/dist/gateway/static/root/assets/agents-BXg2_mE4.js +78 -0
  32. package/dist/gateway/static/root/assets/apps-page-CJqQ-7Ss.js +1 -0
  33. package/dist/gateway/static/root/assets/channels-settings-DvMZ6NAd.js +1 -0
  34. package/dist/gateway/static/root/assets/cron-page-BPBlvSl5.js +1 -0
  35. package/dist/gateway/static/root/assets/{dist-OM9qGfm5.js → dist-CZh0c-s8.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-debug-page-D-WHrr_w.js → extension-debug-page-DyJQR0SR.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-page-CCgjSoKn.js → extension-page-CDTuUr9B.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-settings-page-BJH5a-Gn.js → extension-settings-page-DszZ8zHD.js} +1 -1
  39. package/dist/gateway/static/root/assets/{fetch-CkvRO30i.js → fetch-CFdKBnE6.js} +1 -1
  40. package/dist/gateway/static/root/assets/{gateway-startup-retry-BkKyRDrF.js → gateway-startup-retry-DdngdObI.js} +1 -1
  41. package/dist/gateway/static/root/assets/{heartbeat-config-api-CVyP6pFj.js → heartbeat-config-api-U10wnPdc.js} +1 -1
  42. package/dist/gateway/static/root/assets/index-DBc-bVOQ.js +4845 -0
  43. package/dist/gateway/static/root/assets/index-DI5_GsZt.css +1 -0
  44. package/dist/gateway/static/root/assets/{logs-page-R6Vv_Ja6.js → logs-page-B6js8Bfi.js} +2 -2
  45. package/dist/gateway/static/root/assets/{note-detail-page-BUDarLhh.js → note-detail-page-DFzAXR35.js} +4 -4
  46. package/dist/gateway/static/root/assets/{note-time-Cc2-T21g.js → note-time-DOiSU-10.js} +1 -1
  47. package/dist/gateway/static/root/assets/notes-page-DAuZJMT8.js +1 -0
  48. package/dist/gateway/static/root/assets/{schema-form-CrlOmEZt.js → schema-form-zM36dvbY.js} +1 -1
  49. package/dist/gateway/static/root/assets/sessions-page-CAsV03BY.js +1 -0
  50. package/dist/gateway/static/root/assets/{settings-advanced-gate-BBAQxxew.js → settings-advanced-gate-BCvObK1y.js} +1 -1
  51. package/dist/gateway/static/root/assets/{settings-form-section-DjPD-ErC.js → settings-form-section-Bvl-RInc.js} +1 -1
  52. package/dist/gateway/static/root/assets/settings-page-DuCJDd74.js +3 -0
  53. package/dist/gateway/static/root/assets/{share-preview-page-BjvPht3V.js → share-preview-page-rpL4DDTO.js} +1 -1
  54. package/dist/gateway/static/root/assets/skills-page--BioR9J4.js +2 -0
  55. package/dist/gateway/static/root/assets/{theme-store-DYgVdRB4.js → theme-store-BZozwAeK.js} +1 -1
  56. package/dist/gateway/static/root/assets/url-DQRqHuL-.js +3 -0
  57. package/dist/gateway/static/root/assets/voice-api-key-field-D2RJaoj_.js +1 -0
  58. package/dist/gateway/static/root/assets/{workflow-page.utils-D4sqR0yX.js → workflow-page.utils-BxacHYen.js} +1 -1
  59. package/dist/gateway/static/root/assets/workflows-page-B1B-est-.js +18 -0
  60. package/dist/gateway/static/root/favicon-16.png +0 -0
  61. package/dist/gateway/static/root/favicon-32.png +0 -0
  62. package/dist/gateway/static/root/favicon.ico +0 -0
  63. package/dist/gateway/static/root/favicon.svg +18 -0
  64. package/dist/gateway/static/root/index.html +11 -10
  65. package/dist/package.js +1 -1
  66. package/dist/src/agent/agent-manager.js +7 -7
  67. package/dist/src/agent/agent-scope.js +1 -1
  68. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  69. package/dist/src/agent/context/workspace-seed.js +2 -2
  70. package/dist/src/agent/context/workspace-state.js +1 -1
  71. package/dist/src/agent/goals/goal-run-store.js +4 -4
  72. package/dist/src/agent/goals/persistent-goal-service.js +1 -1
  73. package/dist/src/agent/goals/post-turn.js +2 -2
  74. package/dist/src/agent/image/load-image-media.js +2 -2
  75. package/dist/src/agent/ipc/bus.js +1 -1
  76. package/dist/src/agent/ipc/inbox.js +2 -2
  77. package/dist/src/agent/ipc/socket.js +1 -1
  78. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  79. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  80. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  81. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  82. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  83. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  84. package/dist/src/agent/memory/dreaming/events.js +1 -1
  85. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  86. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  87. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  88. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  89. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  90. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  91. package/dist/src/agent/memory/memory-flush.js +1 -1
  92. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  93. package/dist/src/agent/models/manager.js +1 -1
  94. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  95. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  96. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  97. package/dist/src/agent/sandbox/path-policy.js +2 -2
  98. package/dist/src/agent/service.js +4 -4
  99. package/dist/src/agent/session/session-inspector.js +1 -1
  100. package/dist/src/agent/skills/config.js +1 -1
  101. package/dist/src/agent/skills/hub-hash.js +2 -2
  102. package/dist/src/agent/skills/hub-lock.js +1 -1
  103. package/dist/src/agent/skills/hub-pull.js +2 -2
  104. package/dist/src/agent/skills/index.js +1 -1
  105. package/dist/src/agent/skills/managed-store.js +1 -1
  106. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +4 -0
  107. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +4 -2
  108. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  109. package/dist/src/agent/skills/scanner.js +1 -1
  110. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  111. package/dist/src/agent/skills/skill-manager.js +1 -1
  112. package/dist/src/agent/starter-agents.d.ts +19 -0
  113. package/dist/src/agent/starter-agents.js +190 -0
  114. package/dist/src/agent/starter-agents.js.map +1 -0
  115. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  116. package/dist/src/agent/tools/factory.js +1 -1
  117. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  118. package/dist/src/agent/tools/send-media.js +1 -1
  119. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  120. package/dist/src/agent/tools/workflow-tool.js +1 -1
  121. package/dist/src/agent/tools/write.js +1 -1
  122. package/dist/src/agent/workflow/catalog.js +1 -1
  123. package/dist/src/agent/workflow/runtime.js +49 -15
  124. package/dist/src/agent/workflow/runtime.js.map +1 -1
  125. package/dist/src/agent/workflow/types.d.ts +11 -0
  126. package/dist/src/auth/credentials.js +3 -3
  127. package/dist/src/auth/profiles/store.js +2 -2
  128. package/dist/src/auth/sync-provider-auth.js +1 -1
  129. package/dist/src/browser/cache-dir-policy.js +1 -1
  130. package/dist/src/browser/cdp-local-launcher.js +2 -2
  131. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  132. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  133. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  134. package/dist/src/browser/stealth.js +1 -1
  135. package/dist/src/channels/catalog/channel-catalog-service.js +13 -0
  136. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
  137. package/dist/src/channels/outbound/persist-store.js +1 -1
  138. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  139. package/dist/src/channels/pairing/pairing-store.js +2 -2
  140. package/dist/src/channels/plugins/types.adapters.d.ts +2 -0
  141. package/dist/src/chat-commands/agent-edit.js +2 -2
  142. package/dist/src/chat-commands/builtins/config.js +2 -2
  143. package/dist/src/chat-commands/context.js +1 -1
  144. package/dist/src/cli/commands/config.js +1 -1
  145. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  146. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  147. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  148. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  149. package/dist/src/cli/commands/extension-create.d.ts +2 -0
  150. package/dist/src/cli/commands/extension-create.js +165 -0
  151. package/dist/src/cli/commands/extension-create.js.map +1 -0
  152. package/dist/src/cli/commands/extension-dev.js +1 -3
  153. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  154. package/dist/src/cli/commands/extension-marketplace.js +105 -81
  155. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  156. package/dist/src/cli/commands/extension-pack.d.ts +13 -0
  157. package/dist/src/cli/commands/extension-pack.js +159 -91
  158. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  159. package/dist/src/cli/commands/extension.d.ts +2 -0
  160. package/dist/src/cli/commands/extension.js +375 -3
  161. package/dist/src/cli/commands/extension.js.map +1 -1
  162. package/dist/src/cli/commands/gateway/logs.js +1 -1
  163. package/dist/src/cli/commands/gateway/run-foreground.js +1 -2
  164. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  165. package/dist/src/cli/commands/image.js +1 -1
  166. package/dist/src/cli/commands/init.js +3 -3
  167. package/dist/src/cli/commands/models.js +1 -1
  168. package/dist/src/cli/commands/onboard/model.js +2 -2
  169. package/dist/src/cli/commands/onboard.js +0 -2
  170. package/dist/src/cli/commands/onboard.js.map +1 -1
  171. package/dist/src/cli/commands/setup.js +0 -2
  172. package/dist/src/cli/commands/setup.js.map +1 -1
  173. package/dist/src/cli/utils/init-workspace-core.js +10 -7
  174. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  175. package/dist/src/config/agent-profile.js +1 -1
  176. package/dist/src/config/agent-typed-models.js +1 -1
  177. package/dist/src/config/gateway-bind.js +1 -1
  178. package/dist/src/config/index.js +5 -5
  179. package/dist/src/config/loader.js +2 -2
  180. package/dist/src/config/models-json.js +2 -2
  181. package/dist/src/config/paths-state.js +1 -1
  182. package/dist/src/config/paths.d.ts +2 -2
  183. package/dist/src/config/paths.js +6 -5
  184. package/dist/src/config/paths.js.map +1 -1
  185. package/dist/src/config/profile.js +2 -2
  186. package/dist/src/config/schema.d.ts +2 -0
  187. package/dist/src/config/schema.js +3 -1
  188. package/dist/src/config/schema.js.map +1 -1
  189. package/dist/src/config/workspace-path.js +1 -1
  190. package/dist/src/cron/executor.js +2 -2
  191. package/dist/src/cron/persistence.js +1 -1
  192. package/dist/src/daemon/constants.js +1 -1
  193. package/dist/src/daemon/install-plan.js +2 -2
  194. package/dist/src/daemon/launchd.js +2 -2
  195. package/dist/src/daemon/schtasks.js +2 -2
  196. package/dist/src/daemon/systemd.js +2 -2
  197. package/dist/src/extensions/api.d.ts +4 -2
  198. package/dist/src/extensions/api.js +31 -12
  199. package/dist/src/extensions/api.js.map +1 -1
  200. package/dist/src/extensions/bundle-mcp.js +1 -1
  201. package/dist/src/extensions/discover-extensions.js +2 -1
  202. package/dist/src/extensions/discover-extensions.js.map +1 -1
  203. package/dist/src/extensions/health.js +1 -1
  204. package/dist/src/extensions/install.d.ts +1 -0
  205. package/dist/src/extensions/install.js +51 -8
  206. package/dist/src/extensions/install.js.map +1 -1
  207. package/dist/src/extensions/loader.d.ts +0 -4
  208. package/dist/src/extensions/loader.js +55 -88
  209. package/dist/src/extensions/loader.js.map +1 -1
  210. package/dist/src/extensions/lockfile.d.ts +9 -1
  211. package/dist/src/extensions/lockfile.js +2 -2
  212. package/dist/src/extensions/lockfile.js.map +1 -1
  213. package/dist/src/extensions/normalize-manifest.js +20 -4
  214. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  215. package/dist/src/extensions/package-contract.d.ts +12 -0
  216. package/dist/src/extensions/package-contract.js +59 -0
  217. package/dist/src/extensions/package-contract.js.map +1 -0
  218. package/dist/src/extensions/sdk/core.d.ts +1 -1
  219. package/dist/src/extensions/sdk/index.d.ts +1 -1
  220. package/dist/src/extensions/sdk/index.js.map +1 -1
  221. package/dist/src/extensions/types/manifest.d.ts +15 -0
  222. package/dist/src/extensions/update.js +1 -1
  223. package/dist/src/gateway/agents-admin.d.ts +0 -8
  224. package/dist/src/gateway/agents-admin.js +3 -28
  225. package/dist/src/gateway/agents-admin.js.map +1 -1
  226. package/dist/src/gateway/file-path-classifier.js +2 -2
  227. package/dist/src/gateway/heartbeat/service.js +1 -1
  228. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  229. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  230. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  231. package/dist/src/gateway/hono/oauth-async.js +1 -1
  232. package/dist/src/gateway/hono/oauth.js +1 -1
  233. package/dist/src/gateway/hono/routes/agents.js +2 -56
  234. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  235. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  236. package/dist/src/gateway/hono/routes/channels.js +10 -1
  237. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  238. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  239. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  240. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  241. package/dist/src/gateway/hono/routes/models.js +1 -1
  242. package/dist/src/gateway/hono/routes/shares.js +1 -1
  243. package/dist/src/gateway/hono/routes/workflows.js +130 -0
  244. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  245. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  246. package/dist/src/gateway/lock.js +3 -3
  247. package/dist/src/gateway/ports.js +1 -1
  248. package/dist/src/gateway/service/agent-runner.js +2 -2
  249. package/dist/src/gateway/service/marketplace-service.js +2 -2
  250. package/dist/src/gateway/service.d.ts +2 -0
  251. package/dist/src/gateway/service.js +45 -1
  252. package/dist/src/gateway/service.js.map +1 -1
  253. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  254. package/dist/src/heartbeat/index.js +1 -1
  255. package/dist/src/infra/brew.js +1 -1
  256. package/dist/src/infra/package-json.js +1 -1
  257. package/dist/src/infra/package-update-steps.js +1 -1
  258. package/dist/src/infra/path-env.js +2 -2
  259. package/dist/src/infra/restart.js +2 -2
  260. package/dist/src/infra/stable-node-path.js +1 -1
  261. package/dist/src/infra/update-check.js +1 -1
  262. package/dist/src/infra/update-global.js +1 -1
  263. package/dist/src/infra/update-lock.js +3 -3
  264. package/dist/src/infra/update-runner.js +1 -1
  265. package/dist/src/infra/update-startup.js +2 -2
  266. package/dist/src/infra/write-file-atomic.js +2 -2
  267. package/dist/src/media/store.js +1 -1
  268. package/dist/src/notes/agent-context.d.ts +12 -4
  269. package/dist/src/notes/agent-context.js +1 -1
  270. package/dist/src/notes/agent-context.js.map +1 -1
  271. package/dist/src/notes/store.js +2 -2
  272. package/dist/src/project-trust/trust-store.js +2 -2
  273. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  274. package/dist/src/providers/index.js +2 -2
  275. package/dist/src/providers/model-registry.js +1 -1
  276. package/dist/src/session/init-session-turn.js +2 -2
  277. package/dist/src/session/resolve-session.js +3 -3
  278. package/dist/src/session/session-title.js +2 -2
  279. package/dist/src/session/store.js +2 -2
  280. package/dist/src/share/share-auto.js +2 -2
  281. package/dist/src/share/share-store.js +3 -3
  282. package/dist/src/share/share-thumbnail.js +2 -2
  283. package/dist/src/share/share-zip.js +1 -1
  284. package/dist/src/share/site-share-store.js +3 -3
  285. package/dist/src/share/site-static-serve.js +1 -1
  286. package/dist/src/storage/sqlite/connection.js +2 -2
  287. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  288. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  289. package/dist/src/storage/sqlite/migrations/runner.js +1 -1
  290. package/dist/src/storage/sqlite/schema.js +1 -1
  291. package/dist/src/tui/backends/embedded-backend.js +1 -8
  292. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  293. package/dist/src/tui/backends/gateway-sse-backend.js +0 -7
  294. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  295. package/dist/src/tui/clipboard-image.js +3 -3
  296. package/dist/src/tui/theme-manager.js +1 -1
  297. package/dist/src/tui/tui-backend.d.ts +0 -1
  298. package/dist/src/tui/tui-command-formatters.js +3 -3
  299. package/dist/src/tui/tui-commands.js +3 -3
  300. package/dist/src/tui/tui-commands.js.map +1 -1
  301. package/dist/src/tui/tui-keybindings-file.js +1 -1
  302. package/dist/src/tui/tui-picker-overlay.js +1 -1
  303. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  304. package/dist/src/tui/tui-scoped-models.js +2 -2
  305. package/dist/src/tui/tui-settings.js +1 -1
  306. package/dist/src/tui/tui-startup-resources.js +1 -1
  307. package/dist/src/tui/tui.js +5 -5
  308. package/dist/src/tunnel/frpc-binary.js +3 -3
  309. package/dist/src/tunnel/frpc-config.js +1 -1
  310. package/dist/src/tunnel/frpc-extract.js +1 -1
  311. package/dist/src/tunnel/tunnel-state.js +1 -1
  312. package/dist/src/utils/logger/audit.js +1 -1
  313. package/dist/src/utils/logger/log-store.js +1 -1
  314. package/dist/src/utils/logger/rotation.js +1 -1
  315. package/dist/src/voice/tts/audio.js +1 -1
  316. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  317. package/dist/src/workflows/domain/definition-utils.d.ts +1 -0
  318. package/dist/src/workflows/domain/definition-utils.js +32 -2
  319. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  320. package/dist/src/workflows/domain/definition.d.ts +2 -0
  321. package/dist/src/workflows/domain/event.d.ts +2 -1
  322. package/dist/src/workflows/domain/index.d.ts +1 -0
  323. package/dist/src/workflows/domain/index.js +3 -2
  324. package/dist/src/workflows/domain/run.d.ts +27 -1
  325. package/dist/src/workflows/domain/run.js.map +1 -1
  326. package/dist/src/workflows/domain/schema-validation.d.ts +8 -0
  327. package/dist/src/workflows/domain/schema-validation.js +28 -0
  328. package/dist/src/workflows/domain/schema-validation.js.map +1 -0
  329. package/dist/src/workflows/draft/index.d.ts +3 -0
  330. package/dist/src/workflows/draft/index.js +3 -0
  331. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +23 -0
  332. package/dist/src/workflows/draft/workflow-draft-prompt.js +98 -0
  333. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -0
  334. package/dist/src/workflows/draft/workflow-draft-service.d.ts +12 -0
  335. package/dist/src/workflows/draft/workflow-draft-service.js +131 -0
  336. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -0
  337. package/dist/src/workflows/draft/workflow-draft-validator.d.ts +4 -0
  338. package/dist/src/workflows/draft/workflow-draft-validator.js +133 -0
  339. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -0
  340. package/dist/src/workflows/draft/workflow-draft.types.d.ts +44 -0
  341. package/dist/src/workflows/draft/workflow-draft.types.js +1 -0
  342. package/dist/src/workflows/engine/projector.js +1 -0
  343. package/dist/src/workflows/engine/projector.js.map +1 -1
  344. package/dist/src/workflows/engine/workflow-engine.d.ts +18 -0
  345. package/dist/src/workflows/engine/workflow-engine.js +320 -11
  346. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  347. package/dist/src/workflows/index.js +4 -3
  348. package/dist/src/workflows/service/workflow-run-service.d.ts +14 -3
  349. package/dist/src/workflows/service/workflow-run-service.js +227 -6
  350. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  351. package/dist/src/workflows/service/workflow-run-service.types.d.ts +7 -2
  352. package/dist/src/workflows/store/event-store.js +1 -1
  353. package/dist/src/workflows/store/run-store.js +1 -1
  354. package/package.json +4 -2
  355. package/dist/gateway/static/root/assets/agents-3eP0vqFO.js +0 -396
  356. package/dist/gateway/static/root/assets/apps-page-CZ2ZKrko.js +0 -1
  357. package/dist/gateway/static/root/assets/channels-settings-BbETa93K.js +0 -1
  358. package/dist/gateway/static/root/assets/cron-page-DCtUkHMu.js +0 -1
  359. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +0 -1
  360. package/dist/gateway/static/root/assets/index-CEZxETzw.js +0 -4845
  361. package/dist/gateway/static/root/assets/notes-page-EAHl16bq.js +0 -1
  362. package/dist/gateway/static/root/assets/sessions-page-Ce_xuuSB.js +0 -1
  363. package/dist/gateway/static/root/assets/settings-page-KhQ9QgH0.js +0 -3
  364. package/dist/gateway/static/root/assets/skills-page-C0laq7l1.js +0 -2
  365. package/dist/gateway/static/root/assets/url-DPEStU4M.js +0 -3
  366. package/dist/gateway/static/root/assets/voice-api-key-field-DeGckWkl.js +0 -1
  367. package/dist/gateway/static/root/assets/workflows-page-DFjM95g5.js +0 -27
  368. package/dist/src/agent/builtin-agent-ids.d.ts +0 -2
  369. package/dist/src/agent/builtin-agent-ids.js +0 -17
  370. package/dist/src/agent/builtin-agent-ids.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { workflowStepLabel } from "../../agent/workflow/step-labels.js";
2
+ import { validateWorkflowJsonSchema } from "../domain/schema-validation.js";
2
3
  import { createScriptWorkflowRuntime } from "../runtime/script-workflow-runtime.js";
3
4
  import { randomUUID } from "node:crypto";
4
5
  //#region src/workflows/engine/workflow-engine.ts
@@ -53,7 +54,7 @@ var WorkflowEngine = class {
53
54
  }));
54
55
  await appendEvent("run_started", { startedAtMs: Date.now() });
55
56
  try {
56
- const runtimeResult = await (this.options.runtime ?? createScriptWorkflowRuntime()).run(definition.runtime.source, {
57
+ const runtimeResult = await withWorkflowTimeout((this.options.runtime ?? createScriptWorkflowRuntime()).run(definition.runtime.source, {
57
58
  runner: this.options.runner,
58
59
  resolveModelId: this.options.resolveModelId
59
60
  }, {
@@ -95,7 +96,8 @@ var WorkflowEngine = class {
95
96
  label: event.label,
96
97
  phaseId,
97
98
  prompt: event.prompt,
98
- sessionKey: subagentSessionKey
99
+ sessionKey: subagentSessionKey,
100
+ invocation: event.invocation
99
101
  });
100
102
  },
101
103
  onAgentStart: (event) => {
@@ -143,9 +145,10 @@ var WorkflowEngine = class {
143
145
  onProgress: (event) => recorder.onProgress(event)
144
146
  };
145
147
  }
146
- });
148
+ }), options.timeoutSec ?? definition.defaults.timeoutSec);
147
149
  await eventQueue;
148
150
  if (currentPhaseId) await appendEvent("phase_completed", { phaseId: currentPhaseId });
151
+ assertWorkflowOutput(definition, runtimeResult.result);
149
152
  await appendEvent("run_completed", { result: toWorkflowResultEnvelope(runtimeResult.result) });
150
153
  await this.callHooks((hook) => hook.afterRun?.({
151
154
  runId,
@@ -153,7 +156,7 @@ var WorkflowEngine = class {
153
156
  }));
154
157
  } catch (err) {
155
158
  await eventQueue;
156
- const error = toWorkflowRunError(err, options.signal?.aborted === true);
159
+ const error = toWorkflowRunError(err, options.signal?.aborted === true, options.signal?.reason);
157
160
  if (error.code === "cancelled") {
158
161
  await appendEvent("run_cancelled", { reason: error.message });
159
162
  await this.callHooks((hook) => hook.afterRun?.({
@@ -172,12 +175,233 @@ var WorkflowEngine = class {
172
175
  if (!view) throw new Error(`workflow run view was not created for ${runId}`);
173
176
  return view;
174
177
  }
178
+ async startReplayRun(definition, options) {
179
+ const runId = options.runId ?? randomUUID();
180
+ const createdAtMs = Date.now();
181
+ let eventQueue = Promise.resolve();
182
+ const progressRecorders = /* @__PURE__ */ new Map();
183
+ const run = {
184
+ id: runId,
185
+ definitionId: definition.id,
186
+ definitionVersion: definition.version,
187
+ title: `${definition.title} replay`,
188
+ goal: options.goal ?? definition.description,
189
+ input: options.input ?? {},
190
+ status: "queued",
191
+ source: options.source,
192
+ metadata: options.metadata,
193
+ metrics: {
194
+ agentCount: 0,
195
+ doneAgentCount: 0,
196
+ errorAgentCount: 0,
197
+ skippedAgentCount: 0,
198
+ artifactCount: 0
199
+ },
200
+ createdAtMs
201
+ };
202
+ const appendEvent = (type, payload, createdAtMsOverride) => {
203
+ eventQueue = eventQueue.then(() => this.options.eventStore.append({
204
+ runId,
205
+ type,
206
+ payload,
207
+ createdAtMs: createdAtMsOverride
208
+ })).then(async (event) => {
209
+ this.options.onEventAppended?.(event);
210
+ const view = await this.options.runStore.rebuildRunView(runId);
211
+ if (view) this.options.onRunViewUpdated?.(view);
212
+ });
213
+ return eventQueue;
214
+ };
215
+ await appendEvent("run_queued", { run }, createdAtMs);
216
+ await this.callHooks((hook) => hook.beforeRun?.({
217
+ definition,
218
+ run
219
+ }));
220
+ await appendEvent("run_started", { startedAtMs: Date.now() });
221
+ try {
222
+ const result = await withWorkflowTimeout(this.runReplayTargets({
223
+ definition,
224
+ runId,
225
+ targets: options.targets,
226
+ signal: options.signal,
227
+ appendEvent,
228
+ progressRecorders
229
+ }), options.timeoutSec ?? definition.defaults.timeoutSec);
230
+ await eventQueue;
231
+ if (result.errors.length > 0) {
232
+ await appendEvent("run_failed", { error: {
233
+ code: "runtime_error",
234
+ message: `Replay completed with ${result.errors.length} failed target${result.errors.length === 1 ? "" : "s"}.`,
235
+ detail: result.errors.join("\n"),
236
+ recoverable: true
237
+ } });
238
+ await this.callHooks((hook) => hook.afterRun?.({
239
+ runId,
240
+ status: "failed"
241
+ }));
242
+ } else {
243
+ await appendEvent("run_completed", { result: buildReplayResultEnvelope(options, result.results) });
244
+ await this.callHooks((hook) => hook.afterRun?.({
245
+ runId,
246
+ status: "succeeded"
247
+ }));
248
+ }
249
+ } catch (err) {
250
+ await eventQueue;
251
+ const error = toWorkflowRunError(err, options.signal?.aborted === true, options.signal?.reason);
252
+ if (error.code === "cancelled") {
253
+ await appendEvent("run_cancelled", { reason: error.message });
254
+ await this.callHooks((hook) => hook.afterRun?.({
255
+ runId,
256
+ status: "cancelled"
257
+ }));
258
+ } else {
259
+ await appendEvent("run_failed", { error });
260
+ await this.callHooks((hook) => hook.afterRun?.({
261
+ runId,
262
+ status: "failed"
263
+ }));
264
+ }
265
+ }
266
+ const view = await this.options.runStore.readRunView(runId);
267
+ if (!view) throw new Error(`workflow replay run view was not created for ${runId}`);
268
+ return view;
269
+ }
270
+ async runReplayTargets(params) {
271
+ const results = [];
272
+ const errors = [];
273
+ const targetsByPhase = groupReplayTargetsByPhase(params.targets);
274
+ for (const group of targetsByPhase) {
275
+ throwIfSignalAborted(params.signal);
276
+ if (group.phaseId && group.phaseTitle) await params.appendEvent("phase_started", {
277
+ phaseId: group.phaseId,
278
+ title: group.phaseTitle
279
+ });
280
+ const phaseResults = await Promise.all(group.targets.map((target) => this.runReplayTarget({
281
+ ...params,
282
+ target
283
+ })));
284
+ results.push(...phaseResults);
285
+ errors.push(...phaseResults.filter((item) => item.status === "error").map((item) => `${item.label}: ${item.error ?? "failed"}`));
286
+ if (group.phaseId && phaseResults.every((item) => item.status === "done")) await params.appendEvent("phase_completed", { phaseId: group.phaseId });
287
+ }
288
+ return {
289
+ results,
290
+ errors
291
+ };
292
+ }
293
+ async runReplayTarget(params) {
294
+ const { target } = params;
295
+ const invocation = normalizeReplayInvocation(target);
296
+ const sessionKey = this.options.subagentSessionKeyFactory?.({
297
+ runId: params.runId,
298
+ agentId: target.agentId
299
+ }) ?? defaultSubagentSessionKey(params.runId, target.agentId);
300
+ await this.callHooks((hook) => hook.beforeAgent?.({
301
+ runId: params.runId,
302
+ agentId: target.agentId,
303
+ label: invocation.label,
304
+ phaseId: target.phaseId,
305
+ prompt: invocation.prompt
306
+ }));
307
+ await params.appendEvent("agent_queued", {
308
+ agentId: target.agentId,
309
+ label: invocation.label,
310
+ phaseId: target.phaseId,
311
+ prompt: invocation.prompt,
312
+ sessionKey,
313
+ invocation
314
+ });
315
+ await params.appendEvent("agent_started", { agentId: target.agentId });
316
+ const recorder = new AgentProgressRecorder({
317
+ agentId: target.agentId,
318
+ appendEvent: params.appendEvent
319
+ });
320
+ params.progressRecorders.set(target.agentId, recorder);
321
+ try {
322
+ throwIfSignalAborted(params.signal);
323
+ const model = resolveReplayModel(invocation, this.options.resolveModelId);
324
+ const result = await this.options.runner.run(invocation.prompt, {
325
+ label: invocation.label,
326
+ schema: invocation.schema,
327
+ allowedToolNames: invocation.toolset,
328
+ maxIterations: invocation.maxIterations,
329
+ phase: invocation.phase ?? target.phaseTitle,
330
+ signal: params.signal,
331
+ model,
332
+ sessionKey,
333
+ sessionMetadata: {
334
+ parentSessionKey: this.options.parentSessionKey,
335
+ workflowRunId: params.runId,
336
+ workflowDefinitionId: params.definition.id,
337
+ workflowAgentId: target.agentId,
338
+ workflowAgentLabel: invocation.label
339
+ },
340
+ onProgress: (event) => recorder.onProgress(event)
341
+ });
342
+ throwIfSignalAborted(params.signal);
343
+ const status = result === null ? "error" : "done";
344
+ const resultPreview = previewWorkflowValue(result);
345
+ recorder.completeOpenSteps(status === "done" ? "done" : "error");
346
+ await params.appendEvent("agent_completed", {
347
+ agentId: target.agentId,
348
+ status,
349
+ resultPreview,
350
+ error: status === "error" ? "Replay target failed" : void 0
351
+ });
352
+ await this.callHooks((hook) => hook.afterAgent?.({
353
+ runId: params.runId,
354
+ agentId: target.agentId,
355
+ status,
356
+ resultPreview
357
+ }));
358
+ return {
359
+ agentId: target.agentId,
360
+ label: invocation.label,
361
+ phaseId: target.phaseId,
362
+ status,
363
+ resultPreview
364
+ };
365
+ } catch (err) {
366
+ if (params.signal?.aborted) throw err;
367
+ const message = err instanceof Error ? err.message : String(err);
368
+ recorder.completeOpenSteps("error");
369
+ await params.appendEvent("agent_completed", {
370
+ agentId: target.agentId,
371
+ status: "error",
372
+ error: message
373
+ });
374
+ await this.callHooks((hook) => hook.afterAgent?.({
375
+ runId: params.runId,
376
+ agentId: target.agentId,
377
+ status: "error"
378
+ }));
379
+ return {
380
+ agentId: target.agentId,
381
+ label: invocation.label,
382
+ phaseId: target.phaseId,
383
+ status: "error",
384
+ error: message
385
+ };
386
+ } finally {
387
+ params.progressRecorders.delete(target.agentId);
388
+ }
389
+ }
175
390
  async callHooks(call) {
176
391
  for (const hook of this.options.hooks ?? []) try {
177
392
  await call(hook);
178
393
  } catch {}
179
394
  }
180
395
  };
396
+ var WorkflowEngineRunError = class extends Error {
397
+ constructor(code, message, recoverable, detail) {
398
+ super(message);
399
+ this.code = code;
400
+ this.recoverable = recoverable;
401
+ this.detail = detail;
402
+ this.name = "WorkflowEngineRunError";
403
+ }
404
+ };
181
405
  var AgentProgressRecorder = class {
182
406
  activeToolStepIds = /* @__PURE__ */ new Map();
183
407
  activeIterationStepId = null;
@@ -301,6 +525,80 @@ function buildPhaseTitleToId(definition) {
301
525
  function normalizePhaseId(title) {
302
526
  return title.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "phase";
303
527
  }
528
+ function withWorkflowTimeout(promise, timeoutSec) {
529
+ if (typeof timeoutSec !== "number" || !Number.isFinite(timeoutSec) || timeoutSec <= 0) return promise;
530
+ let timeout;
531
+ const timeoutPromise = new Promise((_resolve, reject) => {
532
+ timeout = setTimeout(() => {
533
+ reject(/* @__PURE__ */ new Error(`workflow timed out after ${timeoutSec}s`));
534
+ }, timeoutSec * 1e3);
535
+ });
536
+ return Promise.race([promise, timeoutPromise]).finally(() => {
537
+ if (timeout) clearTimeout(timeout);
538
+ });
539
+ }
540
+ function throwIfSignalAborted(signal) {
541
+ if (!signal?.aborted) return;
542
+ const reason = signal.reason;
543
+ if (reason instanceof Error) throw reason;
544
+ if (reason) throw new Error(String(reason));
545
+ throw new Error("workflow aborted");
546
+ }
547
+ function groupReplayTargetsByPhase(targets) {
548
+ const groups = [];
549
+ for (const target of targets) {
550
+ const key = target.phaseId ?? "";
551
+ let group = groups.find((item) => item.key === key);
552
+ if (!group) {
553
+ group = {
554
+ key,
555
+ phaseId: target.phaseId,
556
+ phaseTitle: target.phaseTitle,
557
+ targets: []
558
+ };
559
+ groups.push(group);
560
+ }
561
+ group.targets.push(target);
562
+ }
563
+ return groups.map(({ key: _key, ...group }) => group);
564
+ }
565
+ function buildReplayResultEnvelope(options, results) {
566
+ return {
567
+ summary: `Replay completed for ${results.filter((item) => item.status === "done").length}/${results.length} target${results.length === 1 ? "" : "s"}.`,
568
+ sections: [{
569
+ kind: "json",
570
+ title: "Replay targets",
571
+ value: {
572
+ sourceRunId: options.sourceRunId,
573
+ scope: options.replayScope,
574
+ targets: results
575
+ }
576
+ }],
577
+ structuredOutput: { replay: {
578
+ sourceRunId: options.sourceRunId,
579
+ scope: options.replayScope,
580
+ targets: results
581
+ } }
582
+ };
583
+ }
584
+ function normalizeReplayInvocation(target) {
585
+ return {
586
+ prompt: target.invocation?.prompt ?? target.prompt,
587
+ label: target.invocation?.label ?? target.label,
588
+ phase: target.invocation?.phase ?? target.phaseTitle,
589
+ modelRef: target.invocation?.modelRef,
590
+ resolvedModelRef: target.invocation?.resolvedModelRef,
591
+ schema: target.invocation?.schema,
592
+ toolset: target.invocation?.toolset ? [...target.invocation.toolset] : void 0,
593
+ maxIterations: target.invocation?.maxIterations
594
+ };
595
+ }
596
+ function resolveReplayModel(invocation, resolveModelId) {
597
+ const modelRef = invocation.resolvedModelRef ?? invocation.modelRef;
598
+ if (!modelRef) return void 0;
599
+ if (!resolveModelId) throw new Error(`workflow replay missing resolveModelId; cannot resolve model '${modelRef}'`);
600
+ return resolveModelId(modelRef);
601
+ }
304
602
  function formatRuntimeAgentId(id) {
305
603
  return `agent-${id}`;
306
604
  }
@@ -346,23 +644,34 @@ function toWorkflowResultEnvelope(value) {
346
644
  raw: value
347
645
  };
348
646
  }
647
+ function assertWorkflowOutput(definition, value) {
648
+ const validation = validateWorkflowJsonSchema(definition.outputSchema, value);
649
+ if (validation.ok) return;
650
+ throw new WorkflowEngineRunError("result_validation_failed", validation.message ?? "Workflow result did not match output schema", false, JSON.stringify(validation.errors ?? []));
651
+ }
349
652
  function isWorkflowResultEnvelope(value) {
350
653
  if (!value || typeof value !== "object" || Array.isArray(value)) return false;
351
654
  const record = value;
352
655
  return typeof record.summary === "string" && Array.isArray(record.sections);
353
656
  }
354
- function toWorkflowRunError(err, wasAborted) {
355
- const message = err instanceof Error ? err.message : String(err);
356
- if (wasAborted || /aborted|cancelled/i.test(message)) return {
357
- code: "cancelled",
358
- message: message || "Workflow run cancelled",
359
- recoverable: true
657
+ function toWorkflowRunError(err, wasAborted, abortReason) {
658
+ if (err instanceof WorkflowEngineRunError) return {
659
+ code: err.code,
660
+ message: err.message,
661
+ detail: err.detail,
662
+ recoverable: err.recoverable
360
663
  };
361
- if (/timeout/i.test(message)) return {
664
+ const message = (abortReason instanceof Error ? abortReason.message : abortReason ? String(abortReason) : "") || (err instanceof Error ? err.message : String(err));
665
+ if (/timeout|timed out/i.test(message)) return {
362
666
  code: "timeout",
363
667
  message,
364
668
  recoverable: true
365
669
  };
670
+ if (wasAborted || /aborted|cancelled/i.test(message)) return {
671
+ code: "cancelled",
672
+ message: message || "Workflow run cancelled",
673
+ recoverable: true
674
+ };
366
675
  if (/quota/i.test(message)) return {
367
676
  code: "agent_quota_exceeded",
368
677
  message,
@@ -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 { 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';\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}\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 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 });\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\n await eventQueue;\n if (currentPhaseId) {\n await appendEvent('phase_completed', { phaseId: currentPhaseId });\n }\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);\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 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\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 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 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): WorkflowRunError {\n const message = err instanceof Error ? err.message : String(err);\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 (/timeout/i.test(message)) {\n return {\n code: 'timeout',\n message,\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 { 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,8 +1,9 @@
1
1
  import { parseWorkflowScript } from "../agent/workflow/parser.js";
2
2
  import { runWorkflow } from "../agent/workflow/runtime.js";
3
- import { DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, buildWorkflowDefinition, normalizeWorkflowDefinitionId, toWorkflowDefinitionTitle } from "./domain/definition-utils.js";
3
+ import { DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, buildWorkflowDefinition, hashWorkflowStableValue, normalizeWorkflowDefinitionId, toWorkflowDefinitionTitle } from "./domain/definition-utils.js";
4
4
  import { isTerminalWorkflowRunStatus } from "./domain/run.js";
5
5
  import { validateWorkflowDefinitionInput } from "./domain/validation.js";
6
+ import { validateWorkflowJsonSchema } from "./domain/schema-validation.js";
6
7
  import "./domain/index.js";
7
8
  import { runViewToSnapshot } from "./service/run-view-to-snapshot.js";
8
9
  import { CatalogWorkflowDefinitionRegistry } from "./registry/catalog-workflow-definition-registry.js";
@@ -13,9 +14,9 @@ import "./engine/index.js";
13
14
  import { resolveWorkflowRootDir, resolveWorkflowRunArtifactsDir, resolveWorkflowRunDir, resolveWorkflowRunEventsPath, resolveWorkflowRunViewPath, resolveWorkflowRunsDir } from "./store/paths.js";
14
15
  import { WorkflowEventStore, createWorkflowEventStore } from "./store/event-store.js";
15
16
  import { WorkflowRunStore, createWorkflowRunStore } from "./store/run-store.js";
16
- import { WorkflowRunService, buildWorkflowRunDefinitionSnapshot, buildWorkflowRunInputEnvelope, buildWorkflowRunMetadata, extractWorkflowRunSessionKey } from "./service/workflow-run-service.js";
17
+ import { WorkflowRunService, buildWorkflowRunDefinitionSnapshot, buildWorkflowRunInputEnvelope, buildWorkflowRunMetadata, extractWorkflowRunSessionKey, resolveWorkflowReplayTargets } from "./service/workflow-run-service.js";
17
18
  import { buildWorkflowRunSessionKey, readWorkflowRunIdFromSessionCustomData } from "./service/workflow-session-key.js";
18
19
  import { WORKFLOW_RUN_LINK_CONTEXT_KIND, WORKFLOW_SESSION_TYPE, WorkflowSessionBridge, formatParentRunLinkText } from "./service/workflow-session-bridge.js";
19
20
  import "./runtime/index.js";
20
21
  import "./registry/index.js";
21
- export { CatalogWorkflowDefinitionRegistry, DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, ScriptWorkflowRuntime, WORKFLOW_RUN_LINK_CONTEXT_KIND, WORKFLOW_SESSION_TYPE, WorkflowEngine, WorkflowEventStore, WorkflowRunService, WorkflowRunStore, WorkflowSessionBridge, buildWorkflowDefinition, buildWorkflowRunDefinitionSnapshot, buildWorkflowRunInputEnvelope, buildWorkflowRunMetadata, buildWorkflowRunSessionKey, createScriptWorkflowRuntime, createWorkflowEventStore, createWorkflowRunStore, extractWorkflowRunSessionKey, formatParentRunLinkText, isTerminalWorkflowRunStatus, normalizeWorkflowDefinitionId, parseWorkflowScript, projectWorkflowRunView, readWorkflowRunIdFromSessionCustomData, resolveWorkflowRootDir, resolveWorkflowRunArtifactsDir, resolveWorkflowRunDir, resolveWorkflowRunEventsPath, resolveWorkflowRunViewPath, resolveWorkflowRunsDir, runViewToSnapshot, runWorkflow as runWorkflowScript, toWorkflowDefinitionTitle, validateWorkflowDefinitionInput };
22
+ export { CatalogWorkflowDefinitionRegistry, DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, ScriptWorkflowRuntime, WORKFLOW_RUN_LINK_CONTEXT_KIND, WORKFLOW_SESSION_TYPE, WorkflowEngine, WorkflowEventStore, WorkflowRunService, WorkflowRunStore, WorkflowSessionBridge, buildWorkflowDefinition, buildWorkflowRunDefinitionSnapshot, buildWorkflowRunInputEnvelope, buildWorkflowRunMetadata, buildWorkflowRunSessionKey, createScriptWorkflowRuntime, createWorkflowEventStore, createWorkflowRunStore, extractWorkflowRunSessionKey, formatParentRunLinkText, hashWorkflowStableValue, isTerminalWorkflowRunStatus, normalizeWorkflowDefinitionId, parseWorkflowScript, projectWorkflowRunView, readWorkflowRunIdFromSessionCustomData, resolveWorkflowReplayTargets, resolveWorkflowRootDir, resolveWorkflowRunArtifactsDir, resolveWorkflowRunDir, resolveWorkflowRunEventsPath, resolveWorkflowRunViewPath, resolveWorkflowRunsDir, runViewToSnapshot, runWorkflow as runWorkflowScript, toWorkflowDefinitionTitle, validateWorkflowDefinitionInput, validateWorkflowJsonSchema };
@@ -5,8 +5,10 @@ import type { WorkflowDefinitionRegistry } from '../registry/workflow-definition
5
5
  import type { WorkflowDefinition, WorkflowRunDefinitionSnapshot, WorkflowRunInputEnvelope, WorkflowRunMetadata, WorkflowRunSource } from '../domain/index.js';
6
6
  import { WorkflowRunStore } from '../store/run-store.js';
7
7
  import type { WorkflowSessionBridge } from './workflow-session-bridge.js';
8
- export type { CancelWorkflowRunResult, CancelWorkflowRunServiceParams, CancelWorkflowRunServiceResult, RetryWorkflowRunServiceParams, StartWorkflowRunServiceParams, StartWorkflowRunServiceResult, WorkflowRunServiceErrorCode, WorkflowRunServiceErrorResult, WorkflowRunServiceResult, } from './workflow-run-service.types.js';
9
- import type { CancelWorkflowRunResult, CancelWorkflowRunServiceParams, RetryWorkflowRunServiceParams, StartWorkflowRunServiceParams, WorkflowRunServiceResult } from './workflow-run-service.types.js';
8
+ export type { CancelWorkflowRunResult, CancelWorkflowRunServiceParams, CancelWorkflowRunServiceResult, ReplayWorkflowRunServiceParams, RetryWorkflowRunServiceParams, StartWorkflowRunServiceParams, StartWorkflowRunServiceResult, WorkflowRunServiceErrorCode, WorkflowRunServiceErrorResult, WorkflowRunServiceResult, } from './workflow-run-service.types.js';
9
+ import type { CancelWorkflowRunResult, CancelWorkflowRunServiceParams, ReplayWorkflowRunServiceParams, RetryWorkflowRunServiceParams, StartWorkflowRunServiceParams, WorkflowRunServiceResult } from './workflow-run-service.types.js';
10
+ import type { WorkflowRunReplayMetadata, WorkflowRunReplayScope, WorkflowRunView } from '../domain/run.js';
11
+ import type { WorkflowReplayAgentTarget } from '../engine/index.js';
10
12
  export interface WorkflowRunServiceOptions {
11
13
  service: GatewayWorkflowHost;
12
14
  sessionBridge: WorkflowSessionBridge;
@@ -16,14 +18,18 @@ export interface WorkflowRunServiceOptions {
16
18
  export declare class WorkflowRunService {
17
19
  private readonly options;
18
20
  private readonly activeRuns;
21
+ private readonly timeoutHandles;
19
22
  private readonly definitionRegistry;
20
23
  constructor(options: WorkflowRunServiceOptions);
21
24
  startWorkflowRun(params: StartWorkflowRunServiceParams): Promise<WorkflowRunServiceResult>;
22
25
  retryWorkflowRun(params: RetryWorkflowRunServiceParams): Promise<WorkflowRunServiceResult>;
26
+ replayWorkflowRun(params: ReplayWorkflowRunServiceParams): Promise<WorkflowRunServiceResult>;
23
27
  cancelWorkflowRun(params: CancelWorkflowRunServiceParams): Promise<CancelWorkflowRunResult>;
24
28
  createRunStore(agentId: string): WorkflowRunStore;
25
- readWorkflowRunView(agentId: string, runId: string): Promise<import("../index.js").WorkflowRunView>;
29
+ readWorkflowRunView(agentId: string, runId: string): Promise<WorkflowRunView>;
30
+ reconcileInterruptedRuns(agentId: string): Promise<number>;
26
31
  private loadDefinition;
32
+ private findRunByIdempotencyKey;
27
33
  private createWorkflowEngine;
28
34
  }
29
35
  export declare function buildWorkflowRunInputEnvelope(input: unknown, goal?: string): WorkflowRunInputEnvelope;
@@ -35,6 +41,11 @@ export declare function buildWorkflowRunMetadata(params: {
35
41
  input: WorkflowRunInputEnvelope;
36
42
  retryOfRunId?: string;
37
43
  idempotencyKey?: string;
44
+ replay?: WorkflowRunReplayMetadata;
38
45
  }): WorkflowRunMetadata;
46
+ export declare function resolveWorkflowReplayTargets(view: WorkflowRunView, scope: WorkflowRunReplayScope): {
47
+ targets: WorkflowReplayAgentTarget[];
48
+ phaseIds?: string[];
49
+ };
39
50
  export declare function buildWorkflowRunDefinitionSnapshot(definition: WorkflowDefinition): WorkflowRunDefinitionSnapshot;
40
51
  export declare function extractWorkflowRunSessionKey(source: WorkflowRunSource): string | null;