@xopcai/xopc 0.0.87 → 0.0.88

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 (385) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  4. package/dist/extensions/telegram/src/plugin.js +1 -1
  5. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  6. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  7. package/dist/extensions/telegram/xopc.extension.json +1 -1
  8. package/dist/extensions/weixin/src/api/api.js +2 -2
  9. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  10. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  11. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  12. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  13. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  14. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  15. package/dist/extensions/weixin/src/plugin.js +1 -1
  16. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  17. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  18. package/dist/gateway/static/root/assets/agents-CRxETUZx.js +222 -0
  19. package/dist/gateway/static/root/assets/{apps-page-Dg8R-Szf.js → apps-page-wKWf3l57.js} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-DDbqVNkx.js +1 -0
  21. package/dist/gateway/static/root/assets/{channels-status-swr-BSHqqCF1.js → channels-status-swr-DIsl75Y3.js} +1 -1
  22. package/dist/gateway/static/root/assets/copy-SxMW6Xpc.js +1 -0
  23. package/dist/gateway/static/root/assets/{cron-api-0h_QT8U3.js → cron-api-N9hvuRrn.js} +1 -1
  24. package/dist/gateway/static/root/assets/{cron-page-BkfKFfFk.js → cron-page-tlNGNxhP.js} +1 -1
  25. package/dist/gateway/static/root/assets/{dist-Cmjp2APP.js → dist-CJwfHYvT.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-debug-page-CFa9z_1N.js → extension-debug-page-BVJohZoZ.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-page-BI8eaTPq.js → extension-page-BT2tmElC.js} +1 -1
  28. package/dist/gateway/static/root/assets/extension-settings-page-BSS47c2j.js +1 -0
  29. package/dist/gateway/static/root/assets/{fetch-DRqwef_Q.js → fetch-BaFNUtkE.js} +1 -1
  30. package/dist/gateway/static/root/assets/{field-primitives-BiNHBo2Y.js → field-primitives-QwYEq6Hz.js} +1 -1
  31. package/dist/gateway/static/root/assets/{heartbeat-config-api-ZRb8qhuz.js → heartbeat-config-api-BVSidEDJ.js} +1 -1
  32. package/dist/gateway/static/root/assets/index-CqZzHNEg.css +1 -0
  33. package/dist/gateway/static/root/assets/{index-Cu7bKuUi.js → index-qNrVJp-y.js} +97 -97
  34. package/dist/gateway/static/root/assets/{logs-page-BFZ8GgCv.js → logs-page-DDonPVLn.js} +1 -1
  35. package/dist/gateway/static/root/assets/sessions-page-DKt-Wmib.js +1 -0
  36. package/dist/gateway/static/root/assets/{settings-form-section-DiqqVs6m.js → settings-form-section-B8N3A3Zo.js} +1 -1
  37. package/dist/gateway/static/root/assets/settings-page-DcJjvvw4.js +3 -0
  38. package/dist/gateway/static/root/assets/{share-preview-page-n1Gprylk.js → share-preview-page-Q7KqkO-u.js} +1 -1
  39. package/dist/gateway/static/root/assets/skills-page-DuJ4BTO3.js +2 -0
  40. package/dist/gateway/static/root/assets/{theme-store-CZOh1nT3.js → theme-store-BbRc5ugR.js} +1 -1
  41. package/dist/gateway/static/root/assets/url-D6jvVYIA.js +7 -0
  42. package/dist/gateway/static/root/assets/{utils-CkWBfxs4.js → utils-CxDGduqK.js} +1 -1
  43. package/dist/gateway/static/root/assets/voice-api-key-field-CTyHz7L_.js +1 -0
  44. package/dist/gateway/static/root/assets/workflows-page-GacJ41Fv.js +27 -0
  45. package/dist/gateway/static/root/index.html +6 -5
  46. package/dist/package.js +1 -1
  47. package/dist/src/agent/agent-manager.js +7 -7
  48. package/dist/src/agent/agent-scope.js +1 -1
  49. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  50. package/dist/src/agent/child-agent-factory.d.ts +15 -0
  51. package/dist/src/agent/child-agent-factory.js +35 -2
  52. package/dist/src/agent/child-agent-factory.js.map +1 -1
  53. package/dist/src/agent/client-error-format.d.ts +20 -0
  54. package/dist/src/agent/client-error-format.js +97 -0
  55. package/dist/src/agent/client-error-format.js.map +1 -0
  56. package/dist/src/agent/context/workspace-seed.js +2 -2
  57. package/dist/src/agent/embedded/run-turn.js +23 -4
  58. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  59. package/dist/src/agent/goals/goal-locale.d.ts +1 -1
  60. package/dist/src/agent/goals/goal-run-store.js +4 -4
  61. package/dist/src/agent/goals/persistent-goal-service.js +1 -1
  62. package/dist/src/agent/goals/post-turn.js +2 -2
  63. package/dist/src/agent/image/load-image-media.js +2 -2
  64. package/dist/src/agent/inbound/turn-dispatcher.js +1 -1
  65. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  66. package/dist/src/agent/ipc/bus.js +1 -1
  67. package/dist/src/agent/ipc/inbox.js +2 -2
  68. package/dist/src/agent/ipc/socket.js +1 -1
  69. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  70. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  71. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  72. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  73. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  74. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  75. package/dist/src/agent/memory/dreaming/events.js +1 -1
  76. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  77. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  78. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  79. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  80. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  81. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  82. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  83. package/dist/src/agent/models/manager.js +1 -1
  84. package/dist/src/agent/orchestration/llm-turn-retry.d.ts +2 -0
  85. package/dist/src/agent/orchestration/llm-turn-retry.js +9 -1
  86. package/dist/src/agent/orchestration/llm-turn-retry.js.map +1 -1
  87. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  88. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  89. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  90. package/dist/src/agent/sandbox/path-policy.js +2 -2
  91. package/dist/src/agent/service/build-direct-message-content.js +1 -1
  92. package/dist/src/agent/service/process-direct-streaming.js +19 -3
  93. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  94. package/dist/src/agent/service/webchat-tts.d.ts +1 -2
  95. package/dist/src/agent/service/webchat-tts.js +1 -1
  96. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  97. package/dist/src/agent/service.js +4 -4
  98. package/dist/src/agent/session/session-inspector.js +1 -1
  99. package/dist/src/agent/skills/config.js +1 -1
  100. package/dist/src/agent/skills/hub-hash.js +2 -2
  101. package/dist/src/agent/skills/hub-lock.js +1 -1
  102. package/dist/src/agent/skills/hub-pull.js +2 -2
  103. package/dist/src/agent/skills/index.js +1 -1
  104. package/dist/src/agent/skills/managed-store.js +1 -1
  105. package/dist/src/agent/skills/scanner.js +1 -1
  106. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  107. package/dist/src/agent/skills/skill-manager.js +1 -1
  108. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  109. package/dist/src/agent/tools/factory.js +1 -1
  110. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  111. package/dist/src/agent/tools/send-media.js +1 -1
  112. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  113. package/dist/src/agent/tools/workflow-tool.js +64 -16
  114. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  115. package/dist/src/agent/tools/write.js +1 -1
  116. package/dist/src/agent/workflow/agent-progress.d.ts +5 -0
  117. package/dist/src/agent/workflow/agent-progress.js +65 -0
  118. package/dist/src/agent/workflow/agent-progress.js.map +1 -0
  119. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +1 -1
  120. package/dist/src/agent/workflow/builtins/audit-repo.js +14 -0
  121. package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
  122. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
  123. package/dist/src/agent/workflow/builtins/debug-incident.js +14 -0
  124. package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
  125. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +12 -0
  126. package/dist/src/agent/workflow/builtins/implementation-plan.js +175 -0
  127. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +1 -0
  128. package/dist/src/agent/workflow/builtins/index.d.ts +3 -1
  129. package/dist/src/agent/workflow/builtins/index.js +11 -1
  130. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  131. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +1 -1
  132. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +14 -0
  133. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
  134. package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
  135. package/dist/src/agent/workflow/builtins/pr-review.js +14 -0
  136. package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
  137. package/dist/src/agent/workflow/builtins/release-check.d.ts +11 -0
  138. package/dist/src/agent/workflow/builtins/release-check.js +165 -0
  139. package/dist/src/agent/workflow/builtins/release-check.js.map +1 -0
  140. package/dist/src/agent/workflow/builtins/research.d.ts +1 -1
  141. package/dist/src/agent/workflow/builtins/research.js +14 -0
  142. package/dist/src/agent/workflow/builtins/research.js.map +1 -1
  143. package/dist/src/agent/workflow/catalog.js +1 -1
  144. package/dist/src/agent/workflow/index.d.ts +2 -1
  145. package/dist/src/agent/workflow/index.js +3 -2
  146. package/dist/src/agent/workflow/meta-locale.d.ts +12 -0
  147. package/dist/src/agent/workflow/meta-locale.js +62 -0
  148. package/dist/src/agent/workflow/meta-locale.js.map +1 -0
  149. package/dist/src/agent/workflow/parser.js +3 -0
  150. package/dist/src/agent/workflow/parser.js.map +1 -1
  151. package/dist/src/agent/workflow/runtime.d.ts +2 -2
  152. package/dist/src/agent/workflow/runtime.js +21 -14
  153. package/dist/src/agent/workflow/runtime.js.map +1 -1
  154. package/dist/src/agent/workflow/snapshot.js +2 -12
  155. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  156. package/dist/src/agent/workflow/step-labels.d.ts +8 -0
  157. package/dist/src/agent/workflow/step-labels.js +48 -0
  158. package/dist/src/agent/workflow/step-labels.js.map +1 -0
  159. package/dist/src/agent/workflow/subagent-runner.js +46 -1
  160. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  161. package/dist/src/agent/workflow/types.d.ts +74 -1
  162. package/dist/src/auth/credentials.d.ts +5 -0
  163. package/dist/src/auth/credentials.js +12 -3
  164. package/dist/src/auth/credentials.js.map +1 -1
  165. package/dist/src/auth/profiles/store.js +1 -1
  166. package/dist/src/auth/sync-provider-auth.js +1 -1
  167. package/dist/src/browser/cache-dir-policy.js +1 -1
  168. package/dist/src/browser/cdp-local-launcher.js +2 -2
  169. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  170. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  171. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  172. package/dist/src/browser/stealth.js +1 -1
  173. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  174. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  175. package/dist/src/channels/outbound/persist-store.js +1 -1
  176. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  177. package/dist/src/channels/pairing/pairing-store.js +2 -2
  178. package/dist/src/chat-commands/builtins/config.js +2 -2
  179. package/dist/src/chat-commands/context.js +1 -1
  180. package/dist/src/cli/commands/config.js +1 -1
  181. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  182. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  183. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  184. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  185. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  186. package/dist/src/cli/commands/extension-dev.js +1 -1
  187. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  188. package/dist/src/cli/commands/extension-pack.js +1 -1
  189. package/dist/src/cli/commands/gateway/logs.js +1 -1
  190. package/dist/src/cli/commands/image.js +1 -1
  191. package/dist/src/cli/commands/init.js +4 -4
  192. package/dist/src/cli/commands/onboard.js +1 -1
  193. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  194. package/dist/src/config/agent-profile.js +1 -1
  195. package/dist/src/config/agent-typed-models.d.ts +18 -0
  196. package/dist/src/config/agent-typed-models.js +53 -0
  197. package/dist/src/config/agent-typed-models.js.map +1 -0
  198. package/dist/src/config/gateway-bind.js +1 -1
  199. package/dist/src/config/index.js +6 -6
  200. package/dist/src/config/loader.js +2 -2
  201. package/dist/src/config/models-json.js +2 -2
  202. package/dist/src/config/paths-state.js +1 -1
  203. package/dist/src/config/profile.js +2 -2
  204. package/dist/src/config/schema.d.ts +52 -0
  205. package/dist/src/config/schema.js +39 -3
  206. package/dist/src/config/schema.js.map +1 -1
  207. package/dist/src/config/voice.d.ts +3 -28
  208. package/dist/src/config/voice.js +27 -261
  209. package/dist/src/config/voice.js.map +1 -1
  210. package/dist/src/config/workspace-path.js +1 -1
  211. package/dist/src/cron/executor.js +2 -2
  212. package/dist/src/cron/persistence.js +1 -1
  213. package/dist/src/cron/run-log-store.js +1 -1
  214. package/dist/src/daemon/constants.js +1 -1
  215. package/dist/src/daemon/install-plan.js +2 -2
  216. package/dist/src/daemon/launchd.js +2 -2
  217. package/dist/src/daemon/schtasks.js +2 -2
  218. package/dist/src/daemon/systemd.js +2 -2
  219. package/dist/src/extensions/bundle-mcp.js +1 -1
  220. package/dist/src/extensions/discover-extensions.js +1 -1
  221. package/dist/src/extensions/health.js +1 -1
  222. package/dist/src/extensions/loader.js +1 -1
  223. package/dist/src/extensions/lockfile.js +2 -2
  224. package/dist/src/gateway/agents-admin.d.ts +9 -0
  225. package/dist/src/gateway/agents-admin.js +18 -2
  226. package/dist/src/gateway/agents-admin.js.map +1 -1
  227. package/dist/src/gateway/config-tools-web.js +3 -2
  228. package/dist/src/gateway/config-tools-web.js.map +1 -1
  229. package/dist/src/gateway/file-path-classifier.js +2 -2
  230. package/dist/src/gateway/hono/lib/agent-model.d.ts +7 -0
  231. package/dist/src/gateway/hono/lib/agent-model.js +36 -1
  232. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  233. package/dist/src/gateway/hono/lib/config-payload.js +28 -5
  234. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  235. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  236. package/dist/src/gateway/hono/lib/mask-secret-length.d.ts +6 -0
  237. package/dist/src/gateway/hono/lib/mask-secret-length.js +16 -0
  238. package/dist/src/gateway/hono/lib/mask-secret-length.js.map +1 -0
  239. package/dist/src/gateway/hono/lib/safe-providers-config.d.ts +1 -1
  240. package/dist/src/gateway/hono/lib/safe-providers-config.js +2 -1
  241. package/dist/src/gateway/hono/lib/safe-providers-config.js.map +1 -1
  242. package/dist/src/gateway/hono/lib/safe-voice-config.js +2 -1
  243. package/dist/src/gateway/hono/lib/safe-voice-config.js.map +1 -1
  244. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  245. package/dist/src/gateway/hono/oauth.js +1 -1
  246. package/dist/src/gateway/hono/routes/agents.js +2 -2
  247. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  248. package/dist/src/gateway/hono/routes/config-patch/agents.js +8 -2
  249. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  250. package/dist/src/gateway/hono/routes/config-patch/gateway.js +3 -2
  251. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
  252. package/dist/src/gateway/hono/routes/config-patch/misc.js +8 -3
  253. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
  254. package/dist/src/gateway/hono/routes/config.js +59 -0
  255. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  256. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  257. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  258. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  259. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  260. package/dist/src/gateway/hono/routes/models.js +75 -12
  261. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  262. package/dist/src/gateway/hono/routes/shares.js +1 -1
  263. package/dist/src/gateway/hono/routes/voice.js +75 -0
  264. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  265. package/dist/src/gateway/hono/routes/workflows.d.ts +3 -0
  266. package/dist/src/gateway/hono/routes/workflows.js +347 -0
  267. package/dist/src/gateway/hono/routes/workflows.js.map +1 -0
  268. package/dist/src/gateway/hono/routes/workspace.js +4 -4
  269. package/dist/src/gateway/lock.js +3 -3
  270. package/dist/src/gateway/ports.js +1 -1
  271. package/dist/src/gateway/service/agent-runner.js +2 -2
  272. package/dist/src/gateway/service/marketplace-service.js +2 -2
  273. package/dist/src/gateway/service/run-gateway-agent.js +2 -20
  274. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  275. package/dist/src/gateway/service.d.ts +3 -0
  276. package/dist/src/gateway/service.js +7 -1
  277. package/dist/src/gateway/service.js.map +1 -1
  278. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  279. package/dist/src/infra/restart.js +2 -2
  280. package/dist/src/infra/update-check.js +1 -1
  281. package/dist/src/infra/update-global.js +1 -1
  282. package/dist/src/infra/update-lock.js +3 -3
  283. package/dist/src/infra/update-runner.js +1 -1
  284. package/dist/src/infra/update-startup.js +2 -2
  285. package/dist/src/infra/write-file-atomic.js +2 -2
  286. package/dist/src/mcp/channel-bridge.js +1 -1
  287. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  288. package/dist/src/providers/index.js +2 -2
  289. package/dist/src/providers/model-registry.js +1 -1
  290. package/dist/src/session/config-store.js +2 -2
  291. package/dist/src/session/init-session-turn.js +2 -2
  292. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  293. package/dist/src/session/parity/sessions-json-file.js +1 -1
  294. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  295. package/dist/src/session/parity/transcript-paths.js +1 -1
  296. package/dist/src/session/resolve-session.js +4 -4
  297. package/dist/src/session/search-index-cache.js +1 -1
  298. package/dist/src/session/search-index.js +1 -1
  299. package/dist/src/session/session-title.js +2 -2
  300. package/dist/src/session/store.js +5 -5
  301. package/dist/src/share/share-auto.js +2 -2
  302. package/dist/src/share/share-store.js +3 -3
  303. package/dist/src/share/share-thumbnail.js +2 -2
  304. package/dist/src/share/share-zip.js +1 -1
  305. package/dist/src/share/site-share-store.js +3 -3
  306. package/dist/src/share/site-static-serve.js +1 -1
  307. package/dist/src/tui/clipboard-image.js +3 -3
  308. package/dist/src/tui/theme-manager.js +1 -1
  309. package/dist/src/tui/tui-agent-events.js +2 -1
  310. package/dist/src/tui/tui-agent-events.js.map +1 -1
  311. package/dist/src/tui/tui-keybindings-file.js +1 -1
  312. package/dist/src/tui/tui-scoped-models.js +2 -2
  313. package/dist/src/tui/tui-settings.js +1 -1
  314. package/dist/src/tui/tui.js +3 -3
  315. package/dist/src/tunnel/frpc-binary.js +3 -3
  316. package/dist/src/tunnel/frpc-config.js +1 -1
  317. package/dist/src/tunnel/frpc-extract.js +1 -1
  318. package/dist/src/tunnel/tunnel-state.js +1 -1
  319. package/dist/src/utils/logger/audit.js +1 -1
  320. package/dist/src/utils/logger/log-store.js +1 -1
  321. package/dist/src/utils/logger/rotation.js +1 -1
  322. package/dist/src/voice/metadata/builtin.d.ts +2 -0
  323. package/dist/src/voice/metadata/builtin.js +420 -0
  324. package/dist/src/voice/metadata/builtin.js.map +1 -0
  325. package/dist/src/voice/metadata/index.d.ts +4 -0
  326. package/dist/src/voice/metadata/index.js +3 -0
  327. package/dist/src/voice/metadata/registry.d.ts +5 -0
  328. package/dist/src/voice/metadata/registry.js +34 -0
  329. package/dist/src/voice/metadata/registry.js.map +1 -0
  330. package/dist/src/voice/metadata/types.d.ts +41 -0
  331. package/dist/src/voice/metadata/types.js +1 -0
  332. package/dist/src/voice/stt/list-providers.d.ts +3 -3
  333. package/dist/src/voice/stt/list-providers.js +41 -6
  334. package/dist/src/voice/stt/list-providers.js.map +1 -1
  335. package/dist/src/voice/tts/audio.js +1 -1
  336. package/dist/src/voice/tts/list-providers.d.ts +3 -3
  337. package/dist/src/voice/tts/list-providers.js +41 -6
  338. package/dist/src/voice/tts/list-providers.js.map +1 -1
  339. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  340. package/dist/src/workflows/domain/command.d.ts +18 -0
  341. package/dist/src/workflows/domain/command.js +1 -0
  342. package/dist/src/workflows/domain/definition.d.ts +62 -0
  343. package/dist/src/workflows/domain/definition.js +1 -0
  344. package/dist/src/workflows/domain/event.d.ts +67 -0
  345. package/dist/src/workflows/domain/event.js +1 -0
  346. package/dist/src/workflows/domain/index.d.ts +5 -0
  347. package/dist/src/workflows/domain/index.js +2 -0
  348. package/dist/src/workflows/domain/result.d.ts +65 -0
  349. package/dist/src/workflows/domain/result.js +1 -0
  350. package/dist/src/workflows/domain/run.d.ts +120 -0
  351. package/dist/src/workflows/domain/run.js +14 -0
  352. package/dist/src/workflows/domain/run.js.map +1 -0
  353. package/dist/src/workflows/engine/index.d.ts +2 -0
  354. package/dist/src/workflows/engine/index.js +3 -0
  355. package/dist/src/workflows/engine/projector.d.ts +3 -0
  356. package/dist/src/workflows/engine/projector.js +205 -0
  357. package/dist/src/workflows/engine/projector.js.map +1 -0
  358. package/dist/src/workflows/engine/workflow-engine.d.ts +31 -0
  359. package/dist/src/workflows/engine/workflow-engine.js +188 -0
  360. package/dist/src/workflows/engine/workflow-engine.js.map +1 -0
  361. package/dist/src/workflows/index.d.ts +6 -0
  362. package/dist/src/workflows/index.js +11 -0
  363. package/dist/src/workflows/runtime/index.d.ts +1 -0
  364. package/dist/src/workflows/runtime/index.js +4 -0
  365. package/dist/src/workflows/runtime/script-runtime.d.ts +3 -0
  366. package/dist/src/workflows/runtime/script-runtime.js +3 -0
  367. package/dist/src/workflows/store/event-store.d.ts +17 -0
  368. package/dist/src/workflows/store/event-store.js +83 -0
  369. package/dist/src/workflows/store/event-store.js.map +1 -0
  370. package/dist/src/workflows/store/paths.d.ts +7 -0
  371. package/dist/src/workflows/store/paths.js +26 -0
  372. package/dist/src/workflows/store/paths.js.map +1 -0
  373. package/dist/src/workflows/store/run-store.d.ts +13 -0
  374. package/dist/src/workflows/store/run-store.js +68 -0
  375. package/dist/src/workflows/store/run-store.js.map +1 -0
  376. package/package.json +5 -5
  377. package/dist/gateway/static/root/assets/agents-BEAbXpuP.js +0 -222
  378. package/dist/gateway/static/root/assets/channels-settings-yohw9YSu.js +0 -1
  379. package/dist/gateway/static/root/assets/extension-settings-page-x4BB7q1X.js +0 -1
  380. package/dist/gateway/static/root/assets/index-a5gWIdZQ.css +0 -1
  381. package/dist/gateway/static/root/assets/sessions-page-CD7AfB-2.js +0 -1
  382. package/dist/gateway/static/root/assets/settings-page-BBOjEQW3.js +0 -3
  383. package/dist/gateway/static/root/assets/skills-page-CcN_gj--.js +0 -2
  384. package/dist/gateway/static/root/assets/url-Dd8Q7kZZ.js +0 -3
  385. package/dist/gateway/static/root/assets/voice-api-key-field-O6awz9hi.js +0 -1
@@ -0,0 +1,205 @@
1
+ import { isTerminalWorkflowRunStatus } from "../domain/run.js";
2
+ //#region src/workflows/engine/projector.ts
3
+ function terminalRunStatus(status) {
4
+ return isTerminalWorkflowRunStatus(status);
5
+ }
6
+ function phaseStatusAfterAgentStatus(agentStatuses) {
7
+ if (agentStatuses.some((status) => status === "running")) return "running";
8
+ if (agentStatuses.some((status) => status === "error")) return "failed";
9
+ if (agentStatuses.length > 0 && agentStatuses.every((status) => status === "done" || status === "skipped")) return "completed";
10
+ return "pending";
11
+ }
12
+ function buildTimelineItem(event) {
13
+ return {
14
+ sequence: event.sequence,
15
+ type: event.type,
16
+ title: event.type.replaceAll("_", " "),
17
+ createdAtMs: event.createdAtMs
18
+ };
19
+ }
20
+ function projectWorkflowRunView(events) {
21
+ if (events.length === 0) return null;
22
+ const orderedEvents = [...events].sort((left, right) => left.sequence - right.sequence);
23
+ const firstEvent = orderedEvents[0];
24
+ if (firstEvent.type !== "run_queued") return null;
25
+ const firstPayload = firstEvent.payload;
26
+ if (!firstPayload.run) return null;
27
+ const run = {
28
+ ...firstPayload.run,
29
+ metrics: { ...firstPayload.run.metrics }
30
+ };
31
+ const phaseIdToPhase = /* @__PURE__ */ new Map();
32
+ const agentIdToAgent = /* @__PURE__ */ new Map();
33
+ const logs = [];
34
+ const artifacts = [];
35
+ const timeline = [];
36
+ for (const event of orderedEvents) {
37
+ timeline.push(buildTimelineItem(event));
38
+ switch (event.type) {
39
+ case "run_started": {
40
+ const payload = event.payload;
41
+ run.status = "running";
42
+ run.startedAtMs = payload.startedAtMs;
43
+ break;
44
+ }
45
+ case "phase_started": {
46
+ const payload = event.payload;
47
+ phaseIdToPhase.set(payload.phaseId, {
48
+ id: payload.phaseId,
49
+ title: payload.title,
50
+ status: "running",
51
+ startedAtMs: event.createdAtMs,
52
+ agentIds: phaseIdToPhase.get(payload.phaseId)?.agentIds ?? []
53
+ });
54
+ break;
55
+ }
56
+ case "phase_completed": {
57
+ const payload = event.payload;
58
+ const existing = phaseIdToPhase.get(payload.phaseId);
59
+ if (existing) phaseIdToPhase.set(payload.phaseId, {
60
+ ...existing,
61
+ status: "completed",
62
+ completedAtMs: event.createdAtMs
63
+ });
64
+ break;
65
+ }
66
+ case "agent_queued": {
67
+ const payload = event.payload;
68
+ agentIdToAgent.set(payload.agentId, {
69
+ id: payload.agentId,
70
+ label: payload.label,
71
+ phaseId: payload.phaseId,
72
+ status: "queued",
73
+ prompt: payload.prompt,
74
+ steps: []
75
+ });
76
+ if (payload.phaseId) {
77
+ const existingPhase = phaseIdToPhase.get(payload.phaseId);
78
+ if (existingPhase && !existingPhase.agentIds.includes(payload.agentId)) phaseIdToPhase.set(payload.phaseId, {
79
+ ...existingPhase,
80
+ agentIds: [...existingPhase.agentIds, payload.agentId]
81
+ });
82
+ }
83
+ break;
84
+ }
85
+ case "agent_started": {
86
+ const payload = event.payload;
87
+ const existing = agentIdToAgent.get(payload.agentId);
88
+ if (existing) agentIdToAgent.set(payload.agentId, {
89
+ ...existing,
90
+ status: "running",
91
+ startedAtMs: event.createdAtMs
92
+ });
93
+ break;
94
+ }
95
+ case "agent_step_started": {
96
+ const payload = event.payload;
97
+ const existing = agentIdToAgent.get(payload.agentId);
98
+ if (existing) agentIdToAgent.set(payload.agentId, {
99
+ ...existing,
100
+ currentStep: payload.label,
101
+ steps: [...existing.steps, {
102
+ id: payload.stepId,
103
+ label: payload.label,
104
+ kind: payload.kind,
105
+ detail: payload.detail,
106
+ status: "running",
107
+ startedAtMs: event.createdAtMs
108
+ }]
109
+ });
110
+ break;
111
+ }
112
+ case "agent_step_completed": {
113
+ const payload = event.payload;
114
+ const existing = agentIdToAgent.get(payload.agentId);
115
+ if (existing) agentIdToAgent.set(payload.agentId, {
116
+ ...existing,
117
+ steps: existing.steps.map((step) => step.id === payload.stepId ? {
118
+ ...step,
119
+ status: payload.status,
120
+ completedAtMs: event.createdAtMs
121
+ } : step)
122
+ });
123
+ break;
124
+ }
125
+ case "agent_completed": {
126
+ const payload = event.payload;
127
+ const existing = agentIdToAgent.get(payload.agentId);
128
+ if (existing) agentIdToAgent.set(payload.agentId, {
129
+ ...existing,
130
+ status: payload.status,
131
+ currentStep: void 0,
132
+ resultPreview: payload.resultPreview,
133
+ error: payload.error,
134
+ completedAtMs: event.createdAtMs
135
+ });
136
+ break;
137
+ }
138
+ case "log_appended": {
139
+ const payload = event.payload;
140
+ logs.push({
141
+ sequence: event.sequence,
142
+ message: payload.message,
143
+ createdAtMs: event.createdAtMs
144
+ });
145
+ break;
146
+ }
147
+ case "artifact_created": {
148
+ const payload = event.payload;
149
+ artifacts.push(payload.artifact);
150
+ run.metrics.artifactCount = artifacts.length;
151
+ break;
152
+ }
153
+ case "run_completed": {
154
+ const payload = event.payload;
155
+ run.status = "succeeded";
156
+ run.result = payload.result;
157
+ run.completedAtMs = event.createdAtMs;
158
+ break;
159
+ }
160
+ case "run_failed": {
161
+ const payload = event.payload;
162
+ run.status = payload.error?.code === "timeout" ? "timeout" : "failed";
163
+ run.error = payload.error;
164
+ run.completedAtMs = event.createdAtMs;
165
+ break;
166
+ }
167
+ case "run_cancelled":
168
+ run.status = "cancelled";
169
+ run.completedAtMs = event.createdAtMs;
170
+ break;
171
+ default: break;
172
+ }
173
+ }
174
+ const agents = [...agentIdToAgent.values()];
175
+ run.metrics.agentCount = agents.length;
176
+ run.metrics.doneAgentCount = agents.filter((agent) => agent.status === "done").length;
177
+ run.metrics.errorAgentCount = agents.filter((agent) => agent.status === "error").length;
178
+ run.metrics.skippedAgentCount = agents.filter((agent) => agent.status === "skipped").length;
179
+ run.metrics.artifactCount = artifacts.length;
180
+ if (run.startedAtMs && run.completedAtMs) run.metrics.durationMs = run.completedAtMs - run.startedAtMs;
181
+ return {
182
+ run,
183
+ phases: [...phaseIdToPhase.values()].map((phase) => {
184
+ if (phase.status === "completed" || phase.status === "failed") return phase;
185
+ const phaseAgents = phase.agentIds.map((agentId) => agentIdToAgent.get(agentId)?.status).filter((status) => Boolean(status));
186
+ return {
187
+ ...phase,
188
+ status: phaseStatusAfterAgentStatus(phaseAgents)
189
+ };
190
+ }),
191
+ agents,
192
+ logs,
193
+ artifacts,
194
+ timeline,
195
+ controls: {
196
+ canCancel: !terminalRunStatus(run.status),
197
+ canRetry: terminalRunStatus(run.status),
198
+ canArchive: terminalRunStatus(run.status)
199
+ }
200
+ };
201
+ }
202
+ //#endregion
203
+ export { projectWorkflowRunView };
204
+
205
+ //# sourceMappingURL=projector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projector.js","names":[],"sources":["../../../../src/workflows/engine/projector.ts"],"sourcesContent":["import type { WorkflowEventEnvelope } from '../domain/event.js';\nimport type {\n WorkflowAgentStatus,\n WorkflowAgentView,\n WorkflowLogEntry,\n WorkflowPhaseStatus,\n WorkflowPhaseView,\n WorkflowRun,\n WorkflowRunView,\n WorkflowTimelineItem,\n} from '../domain/run.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/run.js';\nimport type { WorkflowArtifactRef } from '../domain/result.js';\n\nfunction terminalRunStatus(status: WorkflowRun['status']): boolean {\n return isTerminalWorkflowRunStatus(status);\n}\n\nfunction phaseStatusAfterAgentStatus(agentStatuses: WorkflowAgentStatus[]): WorkflowPhaseStatus {\n if (agentStatuses.some((status) => status === 'running')) {\n return 'running';\n }\n if (agentStatuses.some((status) => status === 'error')) {\n return 'failed';\n }\n if (agentStatuses.length > 0 && agentStatuses.every((status) => status === 'done' || status === 'skipped')) {\n return 'completed';\n }\n return 'pending';\n}\n\nfunction buildTimelineItem(event: WorkflowEventEnvelope): WorkflowTimelineItem {\n return {\n sequence: event.sequence,\n type: event.type,\n title: event.type.replaceAll('_', ' '),\n createdAtMs: event.createdAtMs,\n };\n}\n\nexport function projectWorkflowRunView(events: WorkflowEventEnvelope[]): WorkflowRunView | null {\n if (events.length === 0) {\n return null;\n }\n\n const orderedEvents = [...events].sort((left, right) => left.sequence - right.sequence);\n const firstEvent = orderedEvents[0];\n if (firstEvent.type !== 'run_queued') {\n return null;\n }\n\n const firstPayload = firstEvent.payload as { run?: WorkflowRun };\n if (!firstPayload.run) {\n return null;\n }\n\n const run: WorkflowRun = {\n ...firstPayload.run,\n metrics: { ...firstPayload.run.metrics },\n };\n const phaseIdToPhase = new Map<string, WorkflowPhaseView>();\n const agentIdToAgent = new Map<string, WorkflowAgentView>();\n const logs: WorkflowLogEntry[] = [];\n const artifacts: WorkflowArtifactRef[] = [];\n const timeline: WorkflowTimelineItem[] = [];\n\n for (const event of orderedEvents) {\n timeline.push(buildTimelineItem(event));\n\n switch (event.type) {\n case 'run_started': {\n const payload = event.payload as { startedAtMs: number };\n run.status = 'running';\n run.startedAtMs = payload.startedAtMs;\n break;\n }\n case 'phase_started': {\n const payload = event.payload as { phaseId: string; title: string };\n phaseIdToPhase.set(payload.phaseId, {\n id: payload.phaseId,\n title: payload.title,\n status: 'running',\n startedAtMs: event.createdAtMs,\n agentIds: phaseIdToPhase.get(payload.phaseId)?.agentIds ?? [],\n });\n break;\n }\n case 'phase_completed': {\n const payload = event.payload as { phaseId: string };\n const existing = phaseIdToPhase.get(payload.phaseId);\n if (existing) {\n phaseIdToPhase.set(payload.phaseId, {\n ...existing,\n status: 'completed',\n completedAtMs: event.createdAtMs,\n });\n }\n break;\n }\n case 'agent_queued': {\n const payload = event.payload as { agentId: string; label: string; phaseId?: string; prompt?: string };\n agentIdToAgent.set(payload.agentId, {\n id: payload.agentId,\n label: payload.label,\n phaseId: payload.phaseId,\n status: 'queued',\n prompt: payload.prompt,\n steps: [],\n });\n if (payload.phaseId) {\n const existingPhase = phaseIdToPhase.get(payload.phaseId);\n if (existingPhase && !existingPhase.agentIds.includes(payload.agentId)) {\n phaseIdToPhase.set(payload.phaseId, {\n ...existingPhase,\n agentIds: [...existingPhase.agentIds, payload.agentId],\n });\n }\n }\n break;\n }\n case 'agent_started': {\n const payload = event.payload as { agentId: string };\n const existing = agentIdToAgent.get(payload.agentId);\n if (existing) {\n agentIdToAgent.set(payload.agentId, {\n ...existing,\n status: 'running',\n startedAtMs: event.createdAtMs,\n });\n }\n break;\n }\n case 'agent_step_started': {\n const payload = event.payload as {\n agentId: string;\n stepId: string;\n label: string;\n kind: 'tool' | 'llm' | 'thinking';\n detail?: string;\n };\n const existing = agentIdToAgent.get(payload.agentId);\n if (existing) {\n agentIdToAgent.set(payload.agentId, {\n ...existing,\n currentStep: payload.label,\n steps: [\n ...existing.steps,\n {\n id: payload.stepId,\n label: payload.label,\n kind: payload.kind,\n detail: payload.detail,\n status: 'running',\n startedAtMs: event.createdAtMs,\n },\n ],\n });\n }\n break;\n }\n case 'agent_step_completed': {\n const payload = event.payload as { agentId: string; stepId: string; status: 'done' | 'error' };\n const existing = agentIdToAgent.get(payload.agentId);\n if (existing) {\n agentIdToAgent.set(payload.agentId, {\n ...existing,\n steps: existing.steps.map((step) =>\n step.id === payload.stepId\n ? {\n ...step,\n status: payload.status,\n completedAtMs: event.createdAtMs,\n }\n : step,\n ),\n });\n }\n break;\n }\n case 'agent_completed': {\n const payload = event.payload as {\n agentId: string;\n status: WorkflowAgentStatus;\n resultPreview?: string;\n error?: string;\n };\n const existing = agentIdToAgent.get(payload.agentId);\n if (existing) {\n agentIdToAgent.set(payload.agentId, {\n ...existing,\n status: payload.status,\n currentStep: undefined,\n resultPreview: payload.resultPreview,\n error: payload.error,\n completedAtMs: event.createdAtMs,\n });\n }\n break;\n }\n case 'log_appended': {\n const payload = event.payload as { message: string };\n logs.push({ sequence: event.sequence, message: payload.message, createdAtMs: event.createdAtMs });\n break;\n }\n case 'artifact_created': {\n const payload = event.payload as { artifact: WorkflowArtifactRef };\n artifacts.push(payload.artifact);\n run.metrics.artifactCount = artifacts.length;\n break;\n }\n case 'run_completed': {\n const payload = event.payload as { result: WorkflowRun['result'] };\n run.status = 'succeeded';\n run.result = payload.result;\n run.completedAtMs = event.createdAtMs;\n break;\n }\n case 'run_failed': {\n const payload = event.payload as { error: WorkflowRun['error'] };\n run.status = payload.error?.code === 'timeout' ? 'timeout' : 'failed';\n run.error = payload.error;\n run.completedAtMs = event.createdAtMs;\n break;\n }\n case 'run_cancelled': {\n run.status = 'cancelled';\n run.completedAtMs = event.createdAtMs;\n break;\n }\n case 'run_queued':\n default:\n break;\n }\n }\n\n const agents = [...agentIdToAgent.values()];\n run.metrics.agentCount = agents.length;\n run.metrics.doneAgentCount = agents.filter((agent) => agent.status === 'done').length;\n run.metrics.errorAgentCount = agents.filter((agent) => agent.status === 'error').length;\n run.metrics.skippedAgentCount = agents.filter((agent) => agent.status === 'skipped').length;\n run.metrics.artifactCount = artifacts.length;\n if (run.startedAtMs && run.completedAtMs) {\n run.metrics.durationMs = run.completedAtMs - run.startedAtMs;\n }\n\n const phases = [...phaseIdToPhase.values()].map((phase) => {\n if (phase.status === 'completed' || phase.status === 'failed') {\n return phase;\n }\n const phaseAgents = phase.agentIds\n .map((agentId) => agentIdToAgent.get(agentId)?.status)\n .filter((status): status is WorkflowAgentStatus => Boolean(status));\n return { ...phase, status: phaseStatusAfterAgentStatus(phaseAgents) };\n });\n\n return {\n run,\n phases,\n agents,\n logs,\n artifacts,\n timeline,\n controls: {\n canCancel: !terminalRunStatus(run.status),\n canRetry: terminalRunStatus(run.status),\n canArchive: terminalRunStatus(run.status),\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { WorkflowDefinition } from '../domain/definition.js';
2
+ import type { WorkflowEventEnvelope } from '../domain/event.js';
3
+ import type { WorkflowRunSource, WorkflowRunView } from '../domain/run.js';
4
+ import { WorkflowEventStore } from '../store/event-store.js';
5
+ import { WorkflowRunStore } from '../store/run-store.js';
6
+ import type { Api, Model } from '@earendil-works/pi-ai';
7
+ import type { WorkflowScriptSubagentRunner } from '../runtime/script-runtime.js';
8
+ export interface WorkflowEngineOptions {
9
+ cwd: string;
10
+ eventStore: WorkflowEventStore;
11
+ runStore: WorkflowRunStore;
12
+ runner: WorkflowScriptSubagentRunner;
13
+ onEventAppended?: (event: WorkflowEventEnvelope) => void;
14
+ onRunViewUpdated?: (view: WorkflowRunView) => void;
15
+ resolveModelId?: (modelId: string) => Model<Api>;
16
+ }
17
+ export interface StartWorkflowRunOptions {
18
+ input?: unknown;
19
+ source: WorkflowRunSource;
20
+ goal?: string;
21
+ runId?: string;
22
+ signal?: AbortSignal;
23
+ concurrency?: number;
24
+ maxSubagents?: number;
25
+ tokenBudget?: number | null;
26
+ }
27
+ export declare class WorkflowEngine {
28
+ private readonly options;
29
+ constructor(options: WorkflowEngineOptions);
30
+ startRun(definition: WorkflowDefinition, options: StartWorkflowRunOptions): Promise<WorkflowRunView>;
31
+ }
@@ -0,0 +1,188 @@
1
+ import { runWorkflow } from "../../agent/workflow/runtime.js";
2
+ import "../runtime/script-runtime.js";
3
+ import { randomUUID } from "node:crypto";
4
+ //#region src/workflows/engine/workflow-engine.ts
5
+ var WorkflowEngine = class {
6
+ constructor(options) {
7
+ this.options = options;
8
+ }
9
+ async startRun(definition, options) {
10
+ const runId = options.runId ?? randomUUID();
11
+ const createdAtMs = Date.now();
12
+ const phaseTitleToId = buildPhaseTitleToId(definition);
13
+ let currentPhaseId;
14
+ let eventQueue = Promise.resolve();
15
+ const run = {
16
+ id: runId,
17
+ definitionId: definition.id,
18
+ definitionVersion: definition.version,
19
+ title: definition.title,
20
+ goal: options.goal ?? definition.description,
21
+ input: options.input ?? {},
22
+ status: "queued",
23
+ source: options.source,
24
+ metrics: {
25
+ agentCount: 0,
26
+ doneAgentCount: 0,
27
+ errorAgentCount: 0,
28
+ skippedAgentCount: 0,
29
+ artifactCount: 0
30
+ },
31
+ createdAtMs
32
+ };
33
+ const appendEvent = (type, payload, createdAtMsOverride) => {
34
+ eventQueue = eventQueue.then(() => this.options.eventStore.append({
35
+ runId,
36
+ type,
37
+ payload,
38
+ createdAtMs: createdAtMsOverride
39
+ })).then(async (event) => {
40
+ this.options.onEventAppended?.(event);
41
+ const view = await this.options.runStore.rebuildRunView(runId);
42
+ if (view) this.options.onRunViewUpdated?.(view);
43
+ });
44
+ return eventQueue;
45
+ };
46
+ await appendEvent("run_queued", { run }, createdAtMs);
47
+ await appendEvent("run_started", { startedAtMs: Date.now() });
48
+ try {
49
+ const runtimeResult = await runWorkflow(definition.runtime.source, {
50
+ runner: this.options.runner,
51
+ resolveModelId: this.options.resolveModelId
52
+ }, {
53
+ cwd: this.options.cwd,
54
+ args: options.input,
55
+ signal: options.signal,
56
+ concurrency: options.concurrency ?? definition.defaults.concurrency,
57
+ maxSubagents: options.maxSubagents ?? definition.defaults.maxSubagents,
58
+ tokenBudget: options.tokenBudget,
59
+ onPhase: (title) => {
60
+ const nextPhaseId = phaseTitleToId.get(title) ?? normalizePhaseId(title);
61
+ if (currentPhaseId && currentPhaseId !== nextPhaseId) appendEvent("phase_completed", { phaseId: currentPhaseId });
62
+ currentPhaseId = nextPhaseId;
63
+ appendEvent("phase_started", {
64
+ phaseId: nextPhaseId,
65
+ title
66
+ });
67
+ },
68
+ onLog: (message) => {
69
+ appendEvent("log_appended", { message });
70
+ },
71
+ onAgentQueued: (event) => {
72
+ const phaseId = event.phase ? phaseTitleToId.get(event.phase) ?? normalizePhaseId(event.phase) : currentPhaseId;
73
+ appendEvent("agent_queued", {
74
+ agentId: formatRuntimeAgentId(event.id),
75
+ label: event.label,
76
+ phaseId,
77
+ prompt: event.prompt
78
+ });
79
+ },
80
+ onAgentStart: (event) => {
81
+ appendEvent("agent_started", { agentId: formatRuntimeAgentId(event.id) });
82
+ },
83
+ onAgentEnd: (event) => {
84
+ const completedStatus = normalizeCompletedAgentStatus(event.status);
85
+ appendEvent("agent_completed", {
86
+ agentId: formatRuntimeAgentId(event.id),
87
+ status: completedStatus,
88
+ resultPreview: previewWorkflowValue(event.result),
89
+ error: completedStatus === "error" ? "Subagent failed" : void 0
90
+ });
91
+ }
92
+ });
93
+ await eventQueue;
94
+ if (currentPhaseId) await appendEvent("phase_completed", { phaseId: currentPhaseId });
95
+ await appendEvent("run_completed", { result: toWorkflowResultEnvelope(runtimeResult.result) });
96
+ } catch (err) {
97
+ await eventQueue;
98
+ const error = toWorkflowRunError(err, options.signal?.aborted === true);
99
+ if (error.code === "cancelled") await appendEvent("run_cancelled", { reason: error.message });
100
+ else await appendEvent("run_failed", { error });
101
+ }
102
+ const view = await this.options.runStore.readRunView(runId);
103
+ if (!view) throw new Error(`workflow run view was not created for ${runId}`);
104
+ return view;
105
+ }
106
+ };
107
+ function buildPhaseTitleToId(definition) {
108
+ const phaseTitleToId = /* @__PURE__ */ new Map();
109
+ for (const phase of definition.phases) phaseTitleToId.set(phase.title, phase.id);
110
+ return phaseTitleToId;
111
+ }
112
+ function normalizePhaseId(title) {
113
+ return title.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "phase";
114
+ }
115
+ function formatRuntimeAgentId(id) {
116
+ return `agent-${id}`;
117
+ }
118
+ function normalizeCompletedAgentStatus(status) {
119
+ if (status === "done" || status === "error" || status === "skipped") return status;
120
+ return "error";
121
+ }
122
+ function previewWorkflowValue(value) {
123
+ if (value === null || value === void 0) return;
124
+ if (typeof value === "string") return truncate(value, 300);
125
+ try {
126
+ return truncate(JSON.stringify(value), 300);
127
+ } catch {
128
+ return truncate(String(value), 300);
129
+ }
130
+ }
131
+ function truncate(value, maxLength) {
132
+ const trimmed = value.trim();
133
+ if (trimmed.length <= maxLength) return trimmed;
134
+ return `${trimmed.slice(0, maxLength - 1)}…`;
135
+ }
136
+ function toWorkflowResultEnvelope(value) {
137
+ if (isWorkflowResultEnvelope(value)) return value;
138
+ if (typeof value === "string") return {
139
+ summary: truncate(value, 800),
140
+ sections: [{
141
+ kind: "text",
142
+ title: "Result",
143
+ content: value
144
+ }],
145
+ raw: value
146
+ };
147
+ return {
148
+ summary: "Workflow completed.",
149
+ sections: [{
150
+ kind: "json",
151
+ title: "Result",
152
+ value
153
+ }],
154
+ raw: value
155
+ };
156
+ }
157
+ function isWorkflowResultEnvelope(value) {
158
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
159
+ const record = value;
160
+ return typeof record.summary === "string" && Array.isArray(record.sections);
161
+ }
162
+ function toWorkflowRunError(err, wasAborted) {
163
+ const message = err instanceof Error ? err.message : String(err);
164
+ if (wasAborted || /aborted|cancelled/i.test(message)) return {
165
+ code: "cancelled",
166
+ message: message || "Workflow run cancelled",
167
+ recoverable: true
168
+ };
169
+ if (/timeout/i.test(message)) return {
170
+ code: "timeout",
171
+ message,
172
+ recoverable: true
173
+ };
174
+ if (/quota/i.test(message)) return {
175
+ code: "agent_quota_exceeded",
176
+ message,
177
+ recoverable: true
178
+ };
179
+ return {
180
+ code: "runtime_error",
181
+ message,
182
+ recoverable: false
183
+ };
184
+ }
185
+ //#endregion
186
+ export { WorkflowEngine };
187
+
188
+ //# sourceMappingURL=workflow-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-engine.js","names":["runWorkflowScript"],"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, 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 { runWorkflowScript } from '../runtime/script-runtime.js';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\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 onEventAppended?: (event: WorkflowEventEnvelope) => void;\n onRunViewUpdated?: (view: WorkflowRunView) => void;\n resolveModelId?: (modelId: string) => Model<Api>;\n}\n\nexport interface StartWorkflowRunOptions {\n input?: unknown;\n source: WorkflowRunSource;\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\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 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 appendEvent('run_started', { startedAtMs: Date.now() });\n\n try {\n const runtimeResult = await runWorkflowScript<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 phaseId = event.phase ? (phaseTitleToId.get(event.phase) ?? normalizePhaseId(event.phase)) : currentPhaseId;\n void appendEvent('agent_queued', {\n agentId: formatRuntimeAgentId(event.id),\n label: event.label,\n phaseId,\n prompt: event.prompt,\n });\n },\n onAgentStart: (event) => {\n void appendEvent('agent_started', { agentId: formatRuntimeAgentId(event.id) });\n },\n onAgentEnd: (event) => {\n const completedStatus = normalizeCompletedAgentStatus(event.status);\n void appendEvent('agent_completed', {\n agentId: formatRuntimeAgentId(event.id),\n status: completedStatus,\n resultPreview: previewWorkflowValue(event.result),\n error: completedStatus === 'error' ? 'Subagent failed' : undefined,\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 } 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 } else {\n await appendEvent('run_failed', { error });\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\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 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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"}
@@ -0,0 +1,6 @@
1
+ export * from './domain/index.js';
2
+ export * from './engine/index.js';
3
+ export * from './runtime/index.js';
4
+ export * from './store/event-store.js';
5
+ export * from './store/paths.js';
6
+ export * from './store/run-store.js';
@@ -0,0 +1,11 @@
1
+ import { parseWorkflowScript } from "../agent/workflow/parser.js";
2
+ import { runWorkflow } from "../agent/workflow/runtime.js";
3
+ import { isTerminalWorkflowRunStatus } from "./domain/run.js";
4
+ import { projectWorkflowRunView } from "./engine/projector.js";
5
+ import { WorkflowEngine } from "./engine/workflow-engine.js";
6
+ import "./engine/index.js";
7
+ import "./runtime/index.js";
8
+ import { resolveWorkflowRootDir, resolveWorkflowRunArtifactsDir, resolveWorkflowRunDir, resolveWorkflowRunEventsPath, resolveWorkflowRunViewPath, resolveWorkflowRunsDir } from "./store/paths.js";
9
+ import { WorkflowEventStore, createWorkflowEventStore } from "./store/event-store.js";
10
+ import { WorkflowRunStore, createWorkflowRunStore } from "./store/run-store.js";
11
+ export { WorkflowEngine, WorkflowEventStore, WorkflowRunStore, createWorkflowEventStore, createWorkflowRunStore, isTerminalWorkflowRunStatus, parseWorkflowScript, projectWorkflowRunView, resolveWorkflowRootDir, resolveWorkflowRunArtifactsDir, resolveWorkflowRunDir, resolveWorkflowRunEventsPath, resolveWorkflowRunViewPath, resolveWorkflowRunsDir, runWorkflow as runWorkflowScript };
@@ -0,0 +1 @@
1
+ export * from './script-runtime.js';
@@ -0,0 +1,4 @@
1
+ import { parseWorkflowScript } from "../../agent/workflow/parser.js";
2
+ import { runWorkflow } from "../../agent/workflow/runtime.js";
3
+ import "./script-runtime.js";
4
+ export { parseWorkflowScript, runWorkflow as runWorkflowScript };
@@ -0,0 +1,3 @@
1
+ export { parseWorkflowScript } from '../../agent/workflow/parser.js';
2
+ export { runWorkflow as runWorkflowScript } from '../../agent/workflow/runtime.js';
3
+ export type { SubagentRunner as WorkflowScriptSubagentRunner, WorkflowRunOptions as WorkflowScriptRunOptions, WorkflowRunResult as WorkflowScriptRunResult, } from '../../agent/workflow/types.js';
@@ -0,0 +1,3 @@
1
+ import { parseWorkflowScript } from "../../agent/workflow/parser.js";
2
+ import { runWorkflow } from "../../agent/workflow/runtime.js";
3
+ export { parseWorkflowScript, runWorkflow as runWorkflowScript };
@@ -0,0 +1,17 @@
1
+ import type { Config } from '../../config/schema.js';
2
+ import type { WorkflowEventEnvelope, WorkflowEventPayload, WorkflowEventType } from '../domain/event.js';
3
+ export interface AppendWorkflowEventInput<T extends WorkflowEventPayload = WorkflowEventPayload> {
4
+ runId: string;
5
+ type: WorkflowEventType;
6
+ payload: T;
7
+ createdAtMs?: number;
8
+ }
9
+ export declare class WorkflowEventStore {
10
+ private readonly config;
11
+ private readonly agentId;
12
+ constructor(config: Config, agentId: string);
13
+ append<T extends WorkflowEventPayload>(input: AppendWorkflowEventInput<T>): Promise<WorkflowEventEnvelope<T>>;
14
+ readRunEvents(runId: string): Promise<WorkflowEventEnvelope[]>;
15
+ listRunIds(): Promise<string[]>;
16
+ }
17
+ export declare function createWorkflowEventStore(config: Config, agentId: string): WorkflowEventStore;
@@ -0,0 +1,83 @@
1
+ import { createLogger } from "../../utils/logger/index.js";
2
+ import { init_logger } from "../../utils/logger.js";
3
+ import { resolveWorkflowRunEventsPath, resolveWorkflowRunsDir } from "./paths.js";
4
+ import { randomUUID } from "node:crypto";
5
+ import { appendFile, mkdir, readFile, readdir } from "node:fs/promises";
6
+ import { dirname } from "node:path";
7
+ //#region src/workflows/store/event-store.ts
8
+ init_logger();
9
+ const log = createLogger("WorkflowEventStore");
10
+ var WorkflowEventStore = class {
11
+ constructor(config, agentId) {
12
+ this.config = config;
13
+ this.agentId = agentId;
14
+ }
15
+ async append(input) {
16
+ const eventsPath = resolveWorkflowRunEventsPath(this.config, this.agentId, input.runId);
17
+ await mkdir(dirname(eventsPath), { recursive: true });
18
+ const previousEvents = await this.readRunEvents(input.runId);
19
+ const event = {
20
+ id: randomUUID(),
21
+ runId: input.runId,
22
+ sequence: previousEvents.length + 1,
23
+ type: input.type,
24
+ payload: input.payload,
25
+ createdAtMs: input.createdAtMs ?? Date.now()
26
+ };
27
+ await appendFile(eventsPath, `${JSON.stringify(event)}\n`, "utf8");
28
+ return event;
29
+ }
30
+ async readRunEvents(runId) {
31
+ const eventsPath = resolveWorkflowRunEventsPath(this.config, this.agentId, runId);
32
+ let content;
33
+ try {
34
+ content = await readFile(eventsPath, "utf8");
35
+ } catch (err) {
36
+ if ((err && typeof err === "object" && "code" in err ? String(err.code) : "") === "ENOENT") return [];
37
+ log.warn({
38
+ err,
39
+ runId,
40
+ eventsPath
41
+ }, "Workflow events read failed");
42
+ return [];
43
+ }
44
+ const events = [];
45
+ for (const line of content.split("\n")) {
46
+ if (!line.trim()) continue;
47
+ try {
48
+ const event = JSON.parse(line);
49
+ if (event.runId === runId && Number.isFinite(event.sequence)) events.push(event);
50
+ } catch (err) {
51
+ log.warn({
52
+ err,
53
+ runId,
54
+ linePreview: line.slice(0, 160)
55
+ }, "Workflow event line parse failed");
56
+ }
57
+ }
58
+ events.sort((left, right) => left.sequence - right.sequence);
59
+ return events;
60
+ }
61
+ async listRunIds() {
62
+ const runsDir = resolveWorkflowRunsDir(this.config, this.agentId);
63
+ let entries;
64
+ try {
65
+ entries = await readdir(runsDir);
66
+ } catch (err) {
67
+ if ((err && typeof err === "object" && "code" in err ? String(err.code) : "") === "ENOENT") return [];
68
+ log.warn({
69
+ err,
70
+ runsDir
71
+ }, "Workflow runs directory read failed");
72
+ return [];
73
+ }
74
+ return entries.filter((entry) => !entry.startsWith(".") && !entry.includes("/") && !entry.includes("\\"));
75
+ }
76
+ };
77
+ function createWorkflowEventStore(config, agentId) {
78
+ return new WorkflowEventStore(config, agentId);
79
+ }
80
+ //#endregion
81
+ export { WorkflowEventStore, createWorkflowEventStore };
82
+
83
+ //# sourceMappingURL=event-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store.js","names":[],"sources":["../../../../src/workflows/store/event-store.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { appendFile, mkdir, readFile, readdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\nimport type { Config } from '../../config/schema.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { WorkflowEventEnvelope, WorkflowEventPayload, WorkflowEventType } from '../domain/event.js';\n\nimport { resolveWorkflowRunEventsPath, resolveWorkflowRunsDir } from './paths.js';\n\nconst log = createLogger('WorkflowEventStore');\n\nexport interface AppendWorkflowEventInput<T extends WorkflowEventPayload = WorkflowEventPayload> {\n runId: string;\n type: WorkflowEventType;\n payload: T;\n createdAtMs?: number;\n}\n\nexport class WorkflowEventStore {\n constructor(\n private readonly config: Config,\n private readonly agentId: string,\n ) {}\n\n async append<T extends WorkflowEventPayload>(input: AppendWorkflowEventInput<T>): Promise<WorkflowEventEnvelope<T>> {\n const eventsPath = resolveWorkflowRunEventsPath(this.config, this.agentId, input.runId);\n await mkdir(dirname(eventsPath), { recursive: true });\n const previousEvents = await this.readRunEvents(input.runId);\n const event: WorkflowEventEnvelope<T> = {\n id: randomUUID(),\n runId: input.runId,\n sequence: previousEvents.length + 1,\n type: input.type,\n payload: input.payload,\n createdAtMs: input.createdAtMs ?? Date.now(),\n };\n\n await appendFile(eventsPath, `${JSON.stringify(event)}\\n`, 'utf8');\n return event;\n }\n\n async readRunEvents(runId: string): Promise<WorkflowEventEnvelope[]> {\n const eventsPath = resolveWorkflowRunEventsPath(this.config, this.agentId, runId);\n let content: string;\n try {\n content = await readFile(eventsPath, 'utf8');\n } catch (err) {\n const code = err && typeof err === 'object' && 'code' in err ? String((err as NodeJS.ErrnoException).code) : '';\n if (code === 'ENOENT') {\n return [];\n }\n log.warn({ err, runId, eventsPath }, 'Workflow events read failed');\n return [];\n }\n\n const events: WorkflowEventEnvelope[] = [];\n for (const line of content.split('\\n')) {\n if (!line.trim()) {\n continue;\n }\n try {\n const event = JSON.parse(line) as WorkflowEventEnvelope;\n if (event.runId === runId && Number.isFinite(event.sequence)) {\n events.push(event);\n }\n } catch (err) {\n log.warn({ err, runId, linePreview: line.slice(0, 160) }, 'Workflow event line parse failed');\n }\n }\n\n events.sort((left, right) => left.sequence - right.sequence);\n return events;\n }\n\n async listRunIds(): Promise<string[]> {\n const runsDir = resolveWorkflowRunsDir(this.config, this.agentId);\n let entries: string[];\n try {\n entries = await readdir(runsDir);\n } catch (err) {\n const code = err && typeof err === 'object' && 'code' in err ? String((err as NodeJS.ErrnoException).code) : '';\n if (code === 'ENOENT') {\n return [];\n }\n log.warn({ err, runsDir }, 'Workflow runs directory read failed');\n return [];\n }\n\n return entries.filter((entry) => !entry.startsWith('.') && !entry.includes('/') && !entry.includes('\\\\'));\n }\n}\n\nexport function createWorkflowEventStore(config: Config, agentId: string): WorkflowEventStore {\n return new WorkflowEventStore(config, agentId);\n}\n"],"mappings":";;;;;;;aAKqD;AAKrD,MAAM,MAAM,aAAa,qBAAqB;AAS9C,IAAa,qBAAb,MAAgC;CAC9B,YACE,QACA,SACA;AAFiB,OAAA,SAAA;AACA,OAAA,UAAA;;CAGnB,MAAM,OAAuC,OAAuE;EAClH,MAAM,aAAa,6BAA6B,KAAK,QAAQ,KAAK,SAAS,MAAM,MAAM;AACvF,QAAM,MAAM,QAAQ,WAAW,EAAE,EAAE,WAAW,MAAM,CAAC;EACrD,MAAM,iBAAiB,MAAM,KAAK,cAAc,MAAM,MAAM;EAC5D,MAAM,QAAkC;GACtC,IAAI,YAAY;GAChB,OAAO,MAAM;GACb,UAAU,eAAe,SAAS;GAClC,MAAM,MAAM;GACZ,SAAS,MAAM;GACf,aAAa,MAAM,eAAe,KAAK,KAAK;GAC7C;AAED,QAAM,WAAW,YAAY,GAAG,KAAK,UAAU,MAAM,CAAC,KAAK,OAAO;AAClE,SAAO;;CAGT,MAAM,cAAc,OAAiD;EACnE,MAAM,aAAa,6BAA6B,KAAK,QAAQ,KAAK,SAAS,MAAM;EACjF,IAAI;AACJ,MAAI;AACF,aAAU,MAAM,SAAS,YAAY,OAAO;WACrC,KAAK;AAEZ,QADa,OAAO,OAAO,QAAQ,YAAY,UAAU,MAAM,OAAQ,IAA8B,KAAK,GAAG,QAChG,SACX,QAAO,EAAE;AAEX,OAAI,KAAK;IAAE;IAAK;IAAO;IAAY,EAAE,8BAA8B;AACnE,UAAO,EAAE;;EAGX,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,QAAQ,QAAQ,MAAM,KAAK,EAAE;AACtC,OAAI,CAAC,KAAK,MAAM,CACd;AAEF,OAAI;IACF,MAAM,QAAQ,KAAK,MAAM,KAAK;AAC9B,QAAI,MAAM,UAAU,SAAS,OAAO,SAAS,MAAM,SAAS,CAC1D,QAAO,KAAK,MAAM;YAEb,KAAK;AACZ,QAAI,KAAK;KAAE;KAAK;KAAO,aAAa,KAAK,MAAM,GAAG,IAAI;KAAE,EAAE,mCAAmC;;;AAIjG,SAAO,MAAM,MAAM,UAAU,KAAK,WAAW,MAAM,SAAS;AAC5D,SAAO;;CAGT,MAAM,aAAgC;EACpC,MAAM,UAAU,uBAAuB,KAAK,QAAQ,KAAK,QAAQ;EACjE,IAAI;AACJ,MAAI;AACF,aAAU,MAAM,QAAQ,QAAQ;WACzB,KAAK;AAEZ,QADa,OAAO,OAAO,QAAQ,YAAY,UAAU,MAAM,OAAQ,IAA8B,KAAK,GAAG,QAChG,SACX,QAAO,EAAE;AAEX,OAAI,KAAK;IAAE;IAAK;IAAS,EAAE,sCAAsC;AACjE,UAAO,EAAE;;AAGX,SAAO,QAAQ,QAAQ,UAAU,CAAC,MAAM,WAAW,IAAI,IAAI,CAAC,MAAM,SAAS,IAAI,IAAI,CAAC,MAAM,SAAS,KAAK,CAAC;;;AAI7G,SAAgB,yBAAyB,QAAgB,SAAqC;AAC5F,QAAO,IAAI,mBAAmB,QAAQ,QAAQ"}
@@ -0,0 +1,7 @@
1
+ import type { Config } from '../../config/schema.js';
2
+ export declare function resolveWorkflowRootDir(config: Config, agentId: string): string;
3
+ export declare function resolveWorkflowRunsDir(config: Config, agentId: string): string;
4
+ export declare function resolveWorkflowRunDir(config: Config, agentId: string, runId: string): string;
5
+ export declare function resolveWorkflowRunEventsPath(config: Config, agentId: string, runId: string): string;
6
+ export declare function resolveWorkflowRunViewPath(config: Config, agentId: string, runId: string): string;
7
+ export declare function resolveWorkflowRunArtifactsDir(config: Config, agentId: string, runId: string): string;