@xopcai/xopc 0.0.88 → 0.0.90

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 (275) hide show
  1. package/README.md +8 -1
  2. package/README.zh-CN.md +8 -1
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/agents-cPvvYLXo.js +222 -0
  6. package/dist/gateway/static/root/assets/apps-page-Bk1_P5FJ.js +1 -0
  7. package/dist/gateway/static/root/assets/channels-settings-CZoeQwHz.js +1 -0
  8. package/dist/gateway/static/root/assets/{channels-status-swr-DIsl75Y3.js → channels-status-swr-BrtH2VzC.js} +1 -1
  9. package/dist/gateway/static/root/assets/circle-check-C23XjkUj.js +1 -0
  10. package/dist/gateway/static/root/assets/cron-api-CyqbgfHM.js +1 -0
  11. package/dist/gateway/static/root/assets/cron-dreaming-jobs-Ip703-qM.js +2 -0
  12. package/dist/gateway/static/root/assets/cron-page-BpLdiQN8.js +1 -0
  13. package/dist/gateway/static/root/assets/dist-BpAiK86n.js +1 -0
  14. package/dist/gateway/static/root/assets/{extension-debug-page-BVJohZoZ.js → extension-debug-page-D6Ak0STa.js} +1 -1
  15. package/dist/gateway/static/root/assets/{extension-page-BT2tmElC.js → extension-page-Q0P3d6DW.js} +1 -1
  16. package/dist/gateway/static/root/assets/{extension-settings-page-BSS47c2j.js → extension-settings-page-CL55LwU_.js} +1 -1
  17. package/dist/gateway/static/root/assets/eye-DAfL1U7M.js +1 -0
  18. package/dist/gateway/static/root/assets/{fetch-BaFNUtkE.js → fetch-Dqa9iTWl.js} +1 -1
  19. package/dist/gateway/static/root/assets/{field-primitives-QwYEq6Hz.js → field-primitives-HUR6JElP.js} +1 -1
  20. package/dist/gateway/static/root/assets/{heartbeat-config-api-BVSidEDJ.js → heartbeat-config-api-DusckjUX.js} +1 -1
  21. package/dist/gateway/static/root/assets/{index-qNrVJp-y.js → index-BYcGfwcE.js} +97 -97
  22. package/dist/gateway/static/root/assets/index-V7MQ7834.css +1 -0
  23. package/dist/gateway/static/root/assets/{logs-page-DDonPVLn.js → logs-page-_HcZ2fgK.js} +1 -1
  24. package/dist/gateway/static/root/assets/sessions-page-iezSMjho.js +1 -0
  25. package/dist/gateway/static/root/assets/{settings-form-section-B8N3A3Zo.js → settings-form-section-a0qGVOlr.js} +1 -1
  26. package/dist/gateway/static/root/assets/settings-page-C9_nYQwM.js +3 -0
  27. package/dist/gateway/static/root/assets/{share-preview-page-Q7KqkO-u.js → share-preview-page-DExl7CJy.js} +1 -1
  28. package/dist/gateway/static/root/assets/skills-page-BlgGD93t.js +2 -0
  29. package/dist/gateway/static/root/assets/{theme-store-BbRc5ugR.js → theme-store-C0Ehmdo5.js} +1 -1
  30. package/dist/gateway/static/root/assets/url-fxyYANfA.js +3 -0
  31. package/dist/gateway/static/root/assets/{utils-CxDGduqK.js → utils-DRQryzdn.js} +1 -1
  32. package/dist/gateway/static/root/assets/voice-api-key-field-D0viACE2.js +1 -0
  33. package/dist/gateway/static/root/assets/workflow-page.utils-DnG8JBhV.js +1 -0
  34. package/dist/gateway/static/root/assets/workflows-page-BvMobnJP.js +27 -0
  35. package/dist/gateway/static/root/index.html +7 -6
  36. package/dist/package.js +1 -1
  37. package/dist/src/agent/agent-manager.d.ts +2 -0
  38. package/dist/src/agent/agent-manager.js +1 -0
  39. package/dist/src/agent/agent-manager.js.map +1 -1
  40. package/dist/src/agent/service.js +2 -1
  41. package/dist/src/agent/service.js.map +1 -1
  42. package/dist/src/agent/service.types.d.ts +3 -1
  43. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +20 -18
  44. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  45. package/dist/src/agent/tools/cronjob-tool.d.ts +6 -0
  46. package/dist/src/agent/tools/cronjob-tool.js +76 -10
  47. package/dist/src/agent/tools/cronjob-tool.js.map +1 -1
  48. package/dist/src/agent/tools/edit.d.ts +5 -1
  49. package/dist/src/agent/tools/edit.js +7 -5
  50. package/dist/src/agent/tools/edit.js.map +1 -1
  51. package/dist/src/agent/tools/factory.d.ts +3 -0
  52. package/dist/src/agent/tools/factory.js +4 -25
  53. package/dist/src/agent/tools/factory.js.map +1 -1
  54. package/dist/src/agent/tools/workflow-tool.d.ts +6 -28
  55. package/dist/src/agent/tools/workflow-tool.js +60 -260
  56. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  57. package/dist/src/agent/tools/write.d.ts +5 -1
  58. package/dist/src/agent/tools/write.js +7 -5
  59. package/dist/src/agent/tools/write.js.map +1 -1
  60. package/dist/src/agent/workflow/agent-progress.js +2 -0
  61. package/dist/src/agent/workflow/agent-progress.js.map +1 -1
  62. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +12 -0
  63. package/dist/src/agent/workflow/builtins/client-proposal.js +155 -0
  64. package/dist/src/agent/workflow/builtins/client-proposal.js.map +1 -0
  65. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +12 -0
  66. package/dist/src/agent/workflow/builtins/competitor-scan.js +150 -0
  67. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +1 -0
  68. package/dist/src/agent/workflow/builtins/content-draft.d.ts +13 -0
  69. package/dist/src/agent/workflow/builtins/content-draft.js +146 -0
  70. package/dist/src/agent/workflow/builtins/content-draft.js.map +1 -0
  71. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +11 -0
  72. package/dist/src/agent/workflow/builtins/content-repurpose.js +137 -0
  73. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +1 -0
  74. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +13 -0
  75. package/dist/src/agent/workflow/builtins/decision-compare.js +173 -0
  76. package/dist/src/agent/workflow/builtins/decision-compare.js.map +1 -0
  77. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +11 -0
  78. package/dist/src/agent/workflow/builtins/inbox-triage.js +148 -0
  79. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +1 -0
  80. package/dist/src/agent/workflow/builtins/index.d.ts +10 -1
  81. package/dist/src/agent/workflow/builtins/index.js +46 -1
  82. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  83. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +12 -0
  84. package/dist/src/agent/workflow/builtins/meeting-prep.js +144 -0
  85. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +1 -0
  86. package/dist/src/agent/workflow/builtins/offer-design.d.ts +12 -0
  87. package/dist/src/agent/workflow/builtins/offer-design.js +161 -0
  88. package/dist/src/agent/workflow/builtins/offer-design.js.map +1 -0
  89. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +12 -0
  90. package/dist/src/agent/workflow/builtins/weekly-review.js +131 -0
  91. package/dist/src/agent/workflow/builtins/weekly-review.js.map +1 -0
  92. package/dist/src/agent/workflow/step-labels.js +2 -2
  93. package/dist/src/agent/workflow/step-labels.js.map +1 -1
  94. package/dist/src/agent/workflow/subagent-runner.js +3 -1
  95. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  96. package/dist/src/agent/workflow/types.d.ts +4 -0
  97. package/dist/src/agent/workflow/workflow-child-tools.d.ts +4 -0
  98. package/dist/src/agent/workflow/workflow-child-tools.js +21 -0
  99. package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -0
  100. package/dist/src/auth/credentials.d.ts +14 -2
  101. package/dist/src/auth/credentials.js +38 -13
  102. package/dist/src/auth/credentials.js.map +1 -1
  103. package/dist/src/auth/oauth/types.d.ts +16 -0
  104. package/dist/src/chat-commands/agent-edit.d.ts +4 -0
  105. package/dist/src/chat-commands/agent-edit.js +136 -0
  106. package/dist/src/chat-commands/agent-edit.js.map +1 -0
  107. package/dist/src/chat-commands/index.d.ts +1 -0
  108. package/dist/src/chat-commands/index.js +3 -1
  109. package/dist/src/chat-commands/index.js.map +1 -1
  110. package/dist/src/cli/bin.js +2 -0
  111. package/dist/src/cli/bin.js.map +1 -1
  112. package/dist/src/cli/commands/auth.js +6 -0
  113. package/dist/src/cli/commands/auth.js.map +1 -1
  114. package/dist/src/cli/commands/cron.js +42 -3
  115. package/dist/src/cli/commands/cron.js.map +1 -1
  116. package/dist/src/cli/commands/doctor/checks/session-integrity.js +79 -56
  117. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
  118. package/dist/src/cli/commands/onboard/model.js +6 -0
  119. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  120. package/dist/src/cli/commands/update.js +86 -79
  121. package/dist/src/cli/commands/update.js.map +1 -1
  122. package/dist/src/commands/agents.config.d.ts +3 -2
  123. package/dist/src/commands/agents.config.js +5 -2
  124. package/dist/src/commands/agents.config.js.map +1 -1
  125. package/dist/src/config/agent-typed-models.d.ts +2 -7
  126. package/dist/src/config/agent-typed-models.js +3 -14
  127. package/dist/src/config/agent-typed-models.js.map +1 -1
  128. package/dist/src/config/localized-text.d.ts +6 -0
  129. package/dist/src/config/localized-text.js +42 -0
  130. package/dist/src/config/localized-text.js.map +1 -0
  131. package/dist/src/config/models-json.d.ts +6 -6
  132. package/dist/src/config/schema.d.ts +6 -21
  133. package/dist/src/config/schema.js +4 -4
  134. package/dist/src/config/schema.js.map +1 -1
  135. package/dist/src/cron/executor.d.ts +4 -0
  136. package/dist/src/cron/executor.js +169 -5
  137. package/dist/src/cron/executor.js.map +1 -1
  138. package/dist/src/cron/job-content.js +2 -1
  139. package/dist/src/cron/job-content.js.map +1 -1
  140. package/dist/src/cron/types.d.ts +28 -1
  141. package/dist/src/cron/validation.d.ts +80 -0
  142. package/dist/src/cron/validation.js +30 -4
  143. package/dist/src/cron/validation.js.map +1 -1
  144. package/dist/src/cron/workflow-run-completion.d.ts +23 -0
  145. package/dist/src/cron/workflow-run-completion.js +72 -0
  146. package/dist/src/cron/workflow-run-completion.js.map +1 -0
  147. package/dist/src/extensions/update.d.ts +51 -0
  148. package/dist/src/extensions/update.js +260 -0
  149. package/dist/src/extensions/update.js.map +1 -0
  150. package/dist/src/gateway/agents-admin.d.ts +15 -8
  151. package/dist/src/gateway/agents-admin.js +77 -28
  152. package/dist/src/gateway/agents-admin.js.map +1 -1
  153. package/dist/src/gateway/gateway-workflow-host.types.d.ts +17 -0
  154. package/dist/src/gateway/gateway-workflow-host.types.js +1 -0
  155. package/dist/src/gateway/heartbeat/service.js +1 -1
  156. package/dist/src/gateway/hono/lib/config-payload.d.ts +5 -0
  157. package/dist/src/gateway/hono/lib/config-payload.js +2 -1
  158. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  159. package/dist/src/gateway/hono/middleware/auth.d.ts +2 -0
  160. package/dist/src/gateway/hono/middleware/auth.js +12 -7
  161. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  162. package/dist/src/gateway/hono/oauth-async.js +40 -15
  163. package/dist/src/gateway/hono/oauth-async.js.map +1 -1
  164. package/dist/src/gateway/hono/oauth.js +31 -6
  165. package/dist/src/gateway/hono/oauth.js.map +1 -1
  166. package/dist/src/gateway/hono/routes/agents.js +55 -12
  167. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  168. package/dist/src/gateway/hono/routes/config-patch/agents.js +1 -1
  169. package/dist/src/gateway/hono/routes/models.js +11 -5
  170. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  171. package/dist/src/gateway/hono/routes/update.js +55 -107
  172. package/dist/src/gateway/hono/routes/update.js.map +1 -1
  173. package/dist/src/gateway/hono/routes/workflows.js +72 -191
  174. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  175. package/dist/src/gateway/server.js +2 -0
  176. package/dist/src/gateway/server.js.map +1 -1
  177. package/dist/src/gateway/service.d.ts +5 -0
  178. package/dist/src/gateway/service.js +24 -3
  179. package/dist/src/gateway/service.js.map +1 -1
  180. package/dist/src/heartbeat/index.js +1 -1
  181. package/dist/src/infra/brew.d.ts +4 -0
  182. package/dist/src/infra/brew.js +20 -0
  183. package/dist/src/infra/brew.js.map +1 -0
  184. package/dist/src/infra/package-json.d.ts +2 -0
  185. package/dist/src/infra/package-json.js +23 -0
  186. package/dist/src/infra/package-json.js.map +1 -0
  187. package/dist/src/infra/package-update-steps.d.ts +35 -0
  188. package/dist/src/infra/package-update-steps.js +304 -0
  189. package/dist/src/infra/package-update-steps.js.map +1 -0
  190. package/dist/src/infra/path-env.d.ts +11 -0
  191. package/dist/src/infra/path-env.js +90 -0
  192. package/dist/src/infra/path-env.js.map +1 -0
  193. package/dist/src/infra/path-prepend.d.ts +7 -0
  194. package/dist/src/infra/path-prepend.js +44 -0
  195. package/dist/src/infra/path-prepend.js.map +1 -0
  196. package/dist/src/infra/stable-node-path.d.ts +2 -0
  197. package/dist/src/infra/stable-node-path.js +28 -0
  198. package/dist/src/infra/stable-node-path.js.map +1 -0
  199. package/dist/src/infra/update-global.d.ts +30 -23
  200. package/dist/src/infra/update-global.js +113 -64
  201. package/dist/src/infra/update-global.js.map +1 -1
  202. package/dist/src/infra/update-log.d.ts +1 -0
  203. package/dist/src/infra/update-log.js +12 -0
  204. package/dist/src/infra/update-log.js.map +1 -0
  205. package/dist/src/infra/update-restart.d.ts +20 -0
  206. package/dist/src/infra/update-restart.js +165 -0
  207. package/dist/src/infra/update-restart.js.map +1 -0
  208. package/dist/src/infra/update-runner.d.ts +89 -1
  209. package/dist/src/infra/update-runner.js +604 -173
  210. package/dist/src/infra/update-runner.js.map +1 -1
  211. package/dist/src/infra/update-startup.d.ts +3 -0
  212. package/dist/src/infra/update-startup.js +8 -4
  213. package/dist/src/infra/update-startup.js.map +1 -1
  214. package/dist/src/providers/index.d.ts +8 -0
  215. package/dist/src/providers/index.js +51 -12
  216. package/dist/src/providers/index.js.map +1 -1
  217. package/dist/src/routing/resolve-route.d.ts +3 -1
  218. package/dist/src/routing/resolve-route.js.map +1 -1
  219. package/dist/src/session/store.d.ts +5 -3
  220. package/dist/src/session/store.js +66 -20
  221. package/dist/src/session/store.js.map +1 -1
  222. package/dist/src/share/site-share-config.d.ts +3 -2
  223. package/dist/src/share/site-share-config.js.map +1 -1
  224. package/dist/src/utils/logger/stats.d.ts +1 -1
  225. package/dist/src/workflows/domain/command.d.ts +2 -1
  226. package/dist/src/workflows/domain/definition-utils.d.ts +14 -0
  227. package/dist/src/workflows/domain/definition-utils.js +50 -0
  228. package/dist/src/workflows/domain/definition-utils.js.map +1 -0
  229. package/dist/src/workflows/domain/event.d.ts +3 -0
  230. package/dist/src/workflows/domain/index.d.ts +2 -0
  231. package/dist/src/workflows/domain/index.js +3 -1
  232. package/dist/src/workflows/domain/run.d.ts +60 -0
  233. package/dist/src/workflows/domain/run.js.map +1 -1
  234. package/dist/src/workflows/domain/validation.d.ts +19 -0
  235. package/dist/src/workflows/domain/validation.js +66 -0
  236. package/dist/src/workflows/domain/validation.js.map +1 -0
  237. package/dist/src/workflows/engine/projector.js +17 -0
  238. package/dist/src/workflows/engine/projector.js.map +1 -1
  239. package/dist/src/workflows/engine/workflow-engine.d.ts +2 -1
  240. package/dist/src/workflows/engine/workflow-engine.js +128 -0
  241. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  242. package/dist/src/workflows/index.d.ts +4 -0
  243. package/dist/src/workflows/index.js +9 -2
  244. package/dist/src/workflows/service/run-view-to-snapshot.d.ts +4 -0
  245. package/dist/src/workflows/service/run-view-to-snapshot.js +63 -0
  246. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -0
  247. package/dist/src/workflows/service/workflow-run-service.d.ts +37 -0
  248. package/dist/src/workflows/service/workflow-run-service.js +282 -0
  249. package/dist/src/workflows/service/workflow-run-service.js.map +1 -0
  250. package/dist/src/workflows/service/workflow-run-service.types.d.ts +47 -0
  251. package/dist/src/workflows/service/workflow-run-service.types.js +1 -0
  252. package/dist/src/workflows/service/workflow-session-bridge.d.ts +29 -0
  253. package/dist/src/workflows/service/workflow-session-bridge.js +177 -0
  254. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -0
  255. package/dist/src/workflows/service/workflow-session-key.d.ts +3 -0
  256. package/dist/src/workflows/service/workflow-session-key.js +21 -0
  257. package/dist/src/workflows/service/workflow-session-key.js.map +1 -0
  258. package/dist/src/workflows/store/run-store.js +1 -0
  259. package/dist/src/workflows/store/run-store.js.map +1 -1
  260. package/package.json +1 -1
  261. package/dist/gateway/static/root/assets/agents-CRxETUZx.js +0 -222
  262. package/dist/gateway/static/root/assets/apps-page-wKWf3l57.js +0 -1
  263. package/dist/gateway/static/root/assets/channels-settings-DDbqVNkx.js +0 -1
  264. package/dist/gateway/static/root/assets/copy-SxMW6Xpc.js +0 -1
  265. package/dist/gateway/static/root/assets/cron-api-N9hvuRrn.js +0 -1
  266. package/dist/gateway/static/root/assets/cron-dreaming-jobs-DueM3rBz.js +0 -2
  267. package/dist/gateway/static/root/assets/cron-page-tlNGNxhP.js +0 -1
  268. package/dist/gateway/static/root/assets/dist-CJwfHYvT.js +0 -1
  269. package/dist/gateway/static/root/assets/index-CqZzHNEg.css +0 -1
  270. package/dist/gateway/static/root/assets/sessions-page-DKt-Wmib.js +0 -1
  271. package/dist/gateway/static/root/assets/settings-page-DcJjvvw4.js +0 -3
  272. package/dist/gateway/static/root/assets/skills-page-DuJ4BTO3.js +0 -2
  273. package/dist/gateway/static/root/assets/url-D6jvVYIA.js +0 -7
  274. package/dist/gateway/static/root/assets/voice-api-key-field-CTyHz7L_.js +0 -1
  275. package/dist/gateway/static/root/assets/workflows-page-GacJ41Fv.js +0 -27
@@ -1 +1 @@
1
- {"version":3,"file":"site-share-config.js","names":[],"sources":["../../../src/share/site-share-config.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport type { Config } from '../config/schema.js';\nimport type { GatewayService } from '../gateway/service.js';\nimport {\n SITE_SHARE_CONFIG_DEFAULTS,\n type SiteShareConfig,\n} from './site-share-types.js';\n\nconst SiteShareStaticPatchSchema = z.object({\n enabled: z.boolean().optional(),\n maxRootDirSize: z.number().int().min(1_048_576).max(10_737_418_240).optional(),\n maxFileCount: z.number().int().min(1).max(100_000).optional(),\n rewriteEnabledByDefault: z.boolean().optional(),\n});\n\nconst SiteShareProxyPatchSchema = z.object({\n enabled: z.boolean().optional(),\n allowedUpstreamHosts: z.array(z.string().min(1)).optional(),\n allowedUpstreamPorts: z.array(z.number().int().min(1).max(65535)).optional(),\n forwardWebSocket: z.boolean().optional(),\n bodySizeLimit: z.number().int().min(0).max(1_073_741_824).optional(),\n requestTimeoutMs: z.number().int().min(1_000).max(600_000).optional(),\n wsIdleTimeoutMs: z.number().int().min(10_000).max(3_600_000).optional(),\n rewriteSetCookiePath: z.boolean().optional(),\n});\n\nconst SiteSharePatchSchema = z.object({\n enabled: z.boolean().optional(),\n publicHostSuffix: z.string().min(1).optional(),\n defaultTtlMs: z.number().int().min(60_000).max(604_800_000).optional(),\n maxTtlMs: z.number().int().min(60_000).max(2_592_000_000).optional(),\n maxActiveSites: z.number().int().min(1).max(1_000).optional(),\n static: SiteShareStaticPatchSchema.optional(),\n proxy: SiteShareProxyPatchSchema.optional(),\n});\n\nexport function resolveSiteShareConfig(service: GatewayService): SiteShareConfig {\n const raw = (service.currentConfig.gateway as Record<string, unknown> | undefined)?.siteShare;\n return mergeWithDefaults(raw);\n}\n\nexport function mergeWithDefaults(raw: unknown): SiteShareConfig {\n const base = SITE_SHARE_CONFIG_DEFAULTS;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return JSON.parse(JSON.stringify(base)) as SiteShareConfig;\n }\n const r = raw as Partial<SiteShareConfig> & {\n static?: Partial<SiteShareConfig['static']>;\n proxy?: Partial<SiteShareConfig['proxy']>;\n };\n return {\n enabled: r.enabled ?? base.enabled,\n publicHostSuffix: r.publicHostSuffix ?? base.publicHostSuffix,\n defaultTtlMs: r.defaultTtlMs ?? base.defaultTtlMs,\n maxTtlMs: r.maxTtlMs ?? base.maxTtlMs,\n maxActiveSites: r.maxActiveSites ?? base.maxActiveSites,\n static: {\n enabled: r.static?.enabled ?? base.static.enabled,\n maxRootDirSize: r.static?.maxRootDirSize ?? base.static.maxRootDirSize,\n maxFileCount: r.static?.maxFileCount ?? base.static.maxFileCount,\n rewriteEnabledByDefault: r.static?.rewriteEnabledByDefault ?? base.static.rewriteEnabledByDefault,\n },\n proxy: {\n enabled: r.proxy?.enabled ?? base.proxy.enabled,\n allowedUpstreamHosts: r.proxy?.allowedUpstreamHosts ?? [...base.proxy.allowedUpstreamHosts],\n allowedUpstreamPorts: r.proxy?.allowedUpstreamPorts ?? [...base.proxy.allowedUpstreamPorts],\n forwardWebSocket: r.proxy?.forwardWebSocket ?? base.proxy.forwardWebSocket,\n bodySizeLimit: r.proxy?.bodySizeLimit ?? base.proxy.bodySizeLimit,\n requestTimeoutMs: r.proxy?.requestTimeoutMs ?? base.proxy.requestTimeoutMs,\n wsIdleTimeoutMs: r.proxy?.wsIdleTimeoutMs ?? base.proxy.wsIdleTimeoutMs,\n rewriteSetCookiePath: r.proxy?.rewriteSetCookiePath ?? base.proxy.rewriteSetCookiePath,\n },\n };\n}\n\nexport function mergeSiteShareConfigPatch(\n config: Config,\n patch: Record<string, unknown>,\n): { ok: true } | { ok: false; message: string } {\n const parsed = SiteSharePatchSchema.safeParse(patch);\n if (!parsed.success) {\n return { ok: false, message: parsed.error.issues.map((i) => i.message).join('; ') };\n }\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n auth: { mode: 'token' },\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n\n const cfg = config.gateway as Record<string, unknown>;\n const current = mergeWithDefaults(cfg.siteShare);\n const next: SiteShareConfig = {\n ...current,\n ...parsed.data,\n static: parsed.data.static ? { ...current.static, ...parsed.data.static } : current.static,\n proxy: parsed.data.proxy ? { ...current.proxy, ...parsed.data.proxy } : current.proxy,\n };\n if (next.defaultTtlMs > next.maxTtlMs) {\n return { ok: false, message: 'siteShare.defaultTtlMs must not exceed siteShare.maxTtlMs' };\n }\n cfg.siteShare = next as unknown as Record<string, unknown>;\n return { ok: true };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"site-share-config.js","names":[],"sources":["../../../src/share/site-share-config.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport type { Config } from '../config/schema.js';\nimport {\n SITE_SHARE_CONFIG_DEFAULTS,\n type SiteShareConfig,\n} from './site-share-types.js';\n\nconst SiteShareStaticPatchSchema = z.object({\n enabled: z.boolean().optional(),\n maxRootDirSize: z.number().int().min(1_048_576).max(10_737_418_240).optional(),\n maxFileCount: z.number().int().min(1).max(100_000).optional(),\n rewriteEnabledByDefault: z.boolean().optional(),\n});\n\nconst SiteShareProxyPatchSchema = z.object({\n enabled: z.boolean().optional(),\n allowedUpstreamHosts: z.array(z.string().min(1)).optional(),\n allowedUpstreamPorts: z.array(z.number().int().min(1).max(65535)).optional(),\n forwardWebSocket: z.boolean().optional(),\n bodySizeLimit: z.number().int().min(0).max(1_073_741_824).optional(),\n requestTimeoutMs: z.number().int().min(1_000).max(600_000).optional(),\n wsIdleTimeoutMs: z.number().int().min(10_000).max(3_600_000).optional(),\n rewriteSetCookiePath: z.boolean().optional(),\n});\n\nconst SiteSharePatchSchema = z.object({\n enabled: z.boolean().optional(),\n publicHostSuffix: z.string().min(1).optional(),\n defaultTtlMs: z.number().int().min(60_000).max(604_800_000).optional(),\n maxTtlMs: z.number().int().min(60_000).max(2_592_000_000).optional(),\n maxActiveSites: z.number().int().min(1).max(1_000).optional(),\n static: SiteShareStaticPatchSchema.optional(),\n proxy: SiteShareProxyPatchSchema.optional(),\n});\n\nexport function resolveSiteShareConfig(service: { currentConfig: Config }): SiteShareConfig {\n const raw = (service.currentConfig.gateway as Record<string, unknown> | undefined)?.siteShare;\n return mergeWithDefaults(raw);\n}\n\nexport function mergeWithDefaults(raw: unknown): SiteShareConfig {\n const base = SITE_SHARE_CONFIG_DEFAULTS;\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return JSON.parse(JSON.stringify(base)) as SiteShareConfig;\n }\n const r = raw as Partial<SiteShareConfig> & {\n static?: Partial<SiteShareConfig['static']>;\n proxy?: Partial<SiteShareConfig['proxy']>;\n };\n return {\n enabled: r.enabled ?? base.enabled,\n publicHostSuffix: r.publicHostSuffix ?? base.publicHostSuffix,\n defaultTtlMs: r.defaultTtlMs ?? base.defaultTtlMs,\n maxTtlMs: r.maxTtlMs ?? base.maxTtlMs,\n maxActiveSites: r.maxActiveSites ?? base.maxActiveSites,\n static: {\n enabled: r.static?.enabled ?? base.static.enabled,\n maxRootDirSize: r.static?.maxRootDirSize ?? base.static.maxRootDirSize,\n maxFileCount: r.static?.maxFileCount ?? base.static.maxFileCount,\n rewriteEnabledByDefault: r.static?.rewriteEnabledByDefault ?? base.static.rewriteEnabledByDefault,\n },\n proxy: {\n enabled: r.proxy?.enabled ?? base.proxy.enabled,\n allowedUpstreamHosts: r.proxy?.allowedUpstreamHosts ?? [...base.proxy.allowedUpstreamHosts],\n allowedUpstreamPorts: r.proxy?.allowedUpstreamPorts ?? [...base.proxy.allowedUpstreamPorts],\n forwardWebSocket: r.proxy?.forwardWebSocket ?? base.proxy.forwardWebSocket,\n bodySizeLimit: r.proxy?.bodySizeLimit ?? base.proxy.bodySizeLimit,\n requestTimeoutMs: r.proxy?.requestTimeoutMs ?? base.proxy.requestTimeoutMs,\n wsIdleTimeoutMs: r.proxy?.wsIdleTimeoutMs ?? base.proxy.wsIdleTimeoutMs,\n rewriteSetCookiePath: r.proxy?.rewriteSetCookiePath ?? base.proxy.rewriteSetCookiePath,\n },\n };\n}\n\nexport function mergeSiteShareConfigPatch(\n config: Config,\n patch: Record<string, unknown>,\n): { ok: true } | { ok: false; message: string } {\n const parsed = SiteSharePatchSchema.safeParse(patch);\n if (!parsed.success) {\n return { ok: false, message: parsed.error.issues.map((i) => i.message).join('; ') };\n }\n if (!config.gateway) {\n config.gateway = {\n bind: 'loopback',\n port: 18790,\n auth: { mode: 'token' },\n heartbeat: { enabled: true, intervalMs: 1_800_000, includeSystemPromptSection: false },\n maxSseConnections: 100,\n corsOrigins: [],\n };\n }\n\n const cfg = config.gateway as Record<string, unknown>;\n const current = mergeWithDefaults(cfg.siteShare);\n const next: SiteShareConfig = {\n ...current,\n ...parsed.data,\n static: parsed.data.static ? { ...current.static, ...parsed.data.static } : current.static,\n proxy: parsed.data.proxy ? { ...current.proxy, ...parsed.data.proxy } : current.proxy,\n };\n if (next.defaultTtlMs > next.maxTtlMs) {\n return { ok: false, message: 'siteShare.defaultTtlMs must not exceed siteShare.maxTtlMs' };\n }\n cfg.siteShare = next as unknown as Record<string, unknown>;\n return { ok: true };\n}\n"],"mappings":"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"}
@@ -12,8 +12,8 @@ export declare function incrementStats(level: LogLevel, module?: string): void;
12
12
  */
13
13
  export declare function getLogStats(): {
14
14
  byLevel: {
15
- debug: number;
16
15
  error: number;
16
+ debug: number;
17
17
  trace: number;
18
18
  info: number;
19
19
  warn: number;
@@ -1,9 +1,10 @@
1
- import type { WorkflowRunSource } from './run.js';
1
+ import type { WorkflowRunInputEnvelope, WorkflowRunSource } from './run.js';
2
2
  export type WorkflowCommand = StartWorkflowRunCommand | CancelWorkflowRunCommand | ArchiveWorkflowRunCommand;
3
3
  export interface StartWorkflowRunCommand {
4
4
  type: 'start_run';
5
5
  definitionId: string;
6
6
  input?: unknown;
7
+ inputEnvelope?: WorkflowRunInputEnvelope;
7
8
  source: WorkflowRunSource;
8
9
  goal?: string;
9
10
  }
@@ -0,0 +1,14 @@
1
+ import type { WorkflowMeta } from '../../agent/workflow/types.js';
2
+ import type { WorkflowDefinition } from './definition.js';
3
+ export declare const DEFAULT_WORKFLOW_CONCURRENCY = 4;
4
+ export declare const DEFAULT_WORKFLOW_TIMEOUT_SEC: number;
5
+ export declare const DEFAULT_WORKFLOW_MAX_SUBAGENTS = 100;
6
+ export interface WorkflowDefinitionBuildInput {
7
+ name: string;
8
+ source: 'builtin' | 'user';
9
+ script: string;
10
+ meta: WorkflowMeta;
11
+ }
12
+ export declare function buildWorkflowDefinition(input: WorkflowDefinitionBuildInput): WorkflowDefinition;
13
+ export declare function normalizeWorkflowDefinitionId(value: string): string;
14
+ export declare function toWorkflowDefinitionTitle(value: string): string;
@@ -0,0 +1,50 @@
1
+ //#region src/workflows/domain/definition-utils.ts
2
+ const DEFAULT_WORKFLOW_CONCURRENCY = 4;
3
+ const DEFAULT_WORKFLOW_TIMEOUT_SEC = 1800;
4
+ const DEFAULT_WORKFLOW_MAX_SUBAGENTS = 100;
5
+ function buildWorkflowDefinition(input) {
6
+ const nowMs = Date.now();
7
+ const phases = input.meta.phases?.map((phase, index) => ({
8
+ id: normalizeWorkflowDefinitionId(phase.title) || `phase-${index + 1}`,
9
+ title: phase.title,
10
+ description: phase.detail
11
+ })) ?? [];
12
+ return {
13
+ id: input.name,
14
+ name: input.name,
15
+ title: toWorkflowDefinitionTitle(input.name),
16
+ description: input.meta.description,
17
+ version: "1.0.0",
18
+ phases,
19
+ runtime: {
20
+ kind: "script",
21
+ source: input.script
22
+ },
23
+ defaults: {
24
+ concurrency: 4,
25
+ timeoutSec: DEFAULT_WORKFLOW_TIMEOUT_SEC,
26
+ maxSubagents: input.meta.estimatedAgents?.max ?? 100
27
+ },
28
+ metadata: {
29
+ tags: input.meta.tags ?? [],
30
+ builtIn: input.source === "builtin",
31
+ source: input.source,
32
+ whenToUse: input.meta.whenToUse,
33
+ estimatedAgents: input.meta.estimatedAgents,
34
+ examplePrompts: input.meta.examplePrompts,
35
+ i18n: input.meta.i18n,
36
+ createdAtMs: nowMs,
37
+ updatedAtMs: nowMs
38
+ }
39
+ };
40
+ }
41
+ function normalizeWorkflowDefinitionId(value) {
42
+ return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
43
+ }
44
+ function toWorkflowDefinitionTitle(value) {
45
+ return value.split(/[_-]+/g).filter(Boolean).map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`).join(" ");
46
+ }
47
+ //#endregion
48
+ export { DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, buildWorkflowDefinition, normalizeWorkflowDefinitionId, toWorkflowDefinitionTitle };
49
+
50
+ //# sourceMappingURL=definition-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition-utils.js","names":[],"sources":["../../../../src/workflows/domain/definition-utils.ts"],"sourcesContent":["import type { WorkflowMeta } from '../../agent/workflow/types.js';\n\nimport type { WorkflowDefinition } from './definition.js';\n\nexport const DEFAULT_WORKFLOW_CONCURRENCY = 4;\nexport const DEFAULT_WORKFLOW_TIMEOUT_SEC = 30 * 60;\nexport const DEFAULT_WORKFLOW_MAX_SUBAGENTS = 100;\n\nexport interface WorkflowDefinitionBuildInput {\n name: string;\n source: 'builtin' | 'user';\n script: string;\n meta: WorkflowMeta;\n}\n\nexport function buildWorkflowDefinition(input: WorkflowDefinitionBuildInput): WorkflowDefinition {\n const nowMs = Date.now();\n const phases = input.meta.phases?.map((phase, index) => ({\n id: normalizeWorkflowDefinitionId(phase.title) || `phase-${index + 1}`,\n title: phase.title,\n description: phase.detail,\n })) ?? [];\n\n return {\n id: input.name,\n name: input.name,\n title: toWorkflowDefinitionTitle(input.name),\n description: input.meta.description,\n version: '1.0.0',\n phases,\n runtime: {\n kind: 'script',\n source: input.script,\n },\n defaults: {\n concurrency: DEFAULT_WORKFLOW_CONCURRENCY,\n timeoutSec: DEFAULT_WORKFLOW_TIMEOUT_SEC,\n maxSubagents: input.meta.estimatedAgents?.max ?? DEFAULT_WORKFLOW_MAX_SUBAGENTS,\n },\n metadata: {\n tags: input.meta.tags ?? [],\n builtIn: input.source === 'builtin',\n source: input.source,\n whenToUse: input.meta.whenToUse,\n estimatedAgents: input.meta.estimatedAgents,\n examplePrompts: input.meta.examplePrompts,\n i18n: input.meta.i18n,\n createdAtMs: nowMs,\n updatedAtMs: nowMs,\n },\n };\n}\n\nexport function normalizeWorkflowDefinitionId(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nexport function toWorkflowDefinitionTitle(value: string): string {\n return value\n .split(/[_-]+/g)\n .filter(Boolean)\n .map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)\n .join(' ');\n}\n"],"mappings":";AAIA,MAAa,+BAA+B;AAC5C,MAAa,+BAA+B;AAC5C,MAAa,iCAAiC;AAS9C,SAAgB,wBAAwB,OAAyD;CAC/F,MAAM,QAAQ,KAAK,KAAK;CACxB,MAAM,SAAS,MAAM,KAAK,QAAQ,KAAK,OAAO,WAAW;EACvD,IAAI,8BAA8B,MAAM,MAAM,IAAI,SAAS,QAAQ;EACnE,OAAO,MAAM;EACb,aAAa,MAAM;EACpB,EAAE,IAAI,EAAE;AAET,QAAO;EACL,IAAI,MAAM;EACV,MAAM,MAAM;EACZ,OAAO,0BAA0B,MAAM,KAAK;EAC5C,aAAa,MAAM,KAAK;EACxB,SAAS;EACT;EACA,SAAS;GACP,MAAM;GACN,QAAQ,MAAM;GACf;EACD,UAAU;GACR,aAAA;GACA,YAAY;GACZ,cAAc,MAAM,KAAK,iBAAiB,OAAA;GAC3C;EACD,UAAU;GACR,MAAM,MAAM,KAAK,QAAQ,EAAE;GAC3B,SAAS,MAAM,WAAW;GAC1B,QAAQ,MAAM;GACd,WAAW,MAAM,KAAK;GACtB,iBAAiB,MAAM,KAAK;GAC5B,gBAAgB,MAAM,KAAK;GAC3B,MAAM,MAAM,KAAK;GACjB,aAAa;GACb,aAAa;GACd;EACF;;AAGH,SAAgB,8BAA8B,OAAuB;AACnE,QAAO,MACJ,MAAM,CACN,aAAa,CACb,QAAQ,eAAe,IAAI,CAC3B,QAAQ,YAAY,GAAG;;AAG5B,SAAgB,0BAA0B,OAAuB;AAC/D,QAAO,MACJ,MAAM,SAAS,CACf,OAAO,QAAQ,CACf,KAAK,SAAS,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE,GAAG,CAClE,KAAK,IAAI"}
@@ -37,12 +37,15 @@ export interface AgentStepStartedPayload {
37
37
  stepId: string;
38
38
  label: string;
39
39
  kind: 'tool' | 'llm' | 'thinking';
40
+ toolName?: string;
40
41
  detail?: string;
41
42
  }
42
43
  export interface AgentStepCompletedPayload {
43
44
  agentId: string;
44
45
  stepId: string;
45
46
  status: 'done' | 'error';
47
+ resultPreview?: string;
48
+ error?: string;
46
49
  }
47
50
  export interface AgentCompletedPayload {
48
51
  agentId: string;
@@ -1,5 +1,7 @@
1
1
  export * from './definition.js';
2
+ export * from './definition-utils.js';
2
3
  export * from './event.js';
3
4
  export * from './result.js';
4
5
  export * from './run.js';
5
6
  export * from './command.js';
7
+ export * from './validation.js';
@@ -1,2 +1,4 @@
1
+ import { DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, buildWorkflowDefinition, normalizeWorkflowDefinitionId, toWorkflowDefinitionTitle } from "./definition-utils.js";
1
2
  import { isTerminalWorkflowRunStatus } from "./run.js";
2
- export { isTerminalWorkflowRunStatus };
3
+ import { validateWorkflowDefinitionInput } from "./validation.js";
4
+ export { DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, buildWorkflowDefinition, isTerminalWorkflowRunStatus, normalizeWorkflowDefinitionId, toWorkflowDefinitionTitle, validateWorkflowDefinitionInput };
@@ -1,3 +1,4 @@
1
+ import type { WorkflowDefinitionEstimatedAgents } from './definition.js';
1
2
  import type { WorkflowArtifactRef, WorkflowResultEnvelope } from './result.js';
2
3
  export type WorkflowRunStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled' | 'timeout';
3
4
  export declare function isTerminalWorkflowRunStatus(status: WorkflowRunStatus): boolean;
@@ -10,6 +11,7 @@ export interface WorkflowRun {
10
11
  input: unknown;
11
12
  status: WorkflowRunStatus;
12
13
  source: WorkflowRunSource;
14
+ metadata?: WorkflowRunMetadata;
13
15
  result?: WorkflowResultEnvelope;
14
16
  error?: WorkflowRunError;
15
17
  metrics: WorkflowRunMetrics;
@@ -17,22 +19,76 @@ export interface WorkflowRun {
17
19
  startedAtMs?: number;
18
20
  completedAtMs?: number;
19
21
  }
22
+ export interface WorkflowRunMetadata {
23
+ sessionKey: string;
24
+ triggerSource: WorkflowRunSource['kind'];
25
+ agentId?: string;
26
+ retryOfRunId?: string;
27
+ definition: WorkflowRunDefinitionSnapshot;
28
+ input?: WorkflowRunInputEnvelope;
29
+ correlation?: WorkflowRunCorrelation;
30
+ origin?: WorkflowRunOrigin;
31
+ schedule?: WorkflowRunScheduleMetadata;
32
+ }
33
+ export interface WorkflowRunInputEnvelope {
34
+ payload: unknown;
35
+ goal?: string;
36
+ variables?: Record<string, unknown>;
37
+ context?: Record<string, unknown>;
38
+ }
39
+ export interface WorkflowRunCorrelation {
40
+ idempotencyKey?: string;
41
+ requestId?: string;
42
+ traceId?: string;
43
+ parentRunId?: string;
44
+ }
45
+ export interface WorkflowRunOrigin {
46
+ channel: string;
47
+ sessionKey?: string;
48
+ chatId?: string;
49
+ messageId?: string;
50
+ scheduleId?: string;
51
+ fireId?: string;
52
+ requestId?: string;
53
+ }
54
+ export interface WorkflowRunScheduleMetadata {
55
+ scheduleId: string;
56
+ fireId?: string;
57
+ scheduledAtMs?: number;
58
+ }
59
+ export interface WorkflowRunDefinitionSnapshot {
60
+ id: string;
61
+ name: string;
62
+ title: string;
63
+ version: string;
64
+ source: 'builtin' | 'user';
65
+ tags: string[];
66
+ phaseCount: number;
67
+ estimatedAgents?: WorkflowDefinitionEstimatedAgents;
68
+ }
20
69
  export type WorkflowRunSource = {
21
70
  kind: 'chat';
22
71
  sessionKey: string;
23
72
  messageId?: string;
24
73
  } | {
25
74
  kind: 'webui';
75
+ sessionKey?: string;
76
+ requestId?: string;
26
77
  } | {
27
78
  kind: 'cron';
28
79
  scheduleId: string;
80
+ fireId?: string;
81
+ scheduledAtMs?: number;
29
82
  } | {
30
83
  kind: 'api';
31
84
  requestId?: string;
85
+ idempotencyKey?: string;
32
86
  } | {
33
87
  kind: 'im';
34
88
  channel: string;
35
89
  chatId: string;
90
+ messageId?: string;
91
+ userId?: string;
36
92
  };
37
93
  export interface WorkflowRunMetrics {
38
94
  agentCount: number;
@@ -60,6 +116,7 @@ export interface WorkflowRunSummary {
60
116
  title: string;
61
117
  status: WorkflowRunStatus;
62
118
  source: WorkflowRunSource;
119
+ metadata?: WorkflowRunMetadata;
63
120
  createdAtMs: number;
64
121
  startedAtMs?: number;
65
122
  completedAtMs?: number;
@@ -102,8 +159,11 @@ export interface WorkflowAgentStepView {
102
159
  id: string;
103
160
  label: string;
104
161
  kind: 'tool' | 'llm' | 'thinking';
162
+ toolName?: string;
105
163
  detail?: string;
106
164
  status: WorkflowAgentStepStatus;
165
+ resultPreview?: string;
166
+ error?: string;
107
167
  startedAtMs?: number;
108
168
  completedAtMs?: number;
109
169
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","names":[],"sources":["../../../../src/workflows/domain/run.ts"],"sourcesContent":["import type { WorkflowArtifactRef, WorkflowResultEnvelope } from './result.js';\n\nexport type WorkflowRunStatus =\n | 'queued'\n | 'running'\n | 'succeeded'\n | 'failed'\n | 'cancelled'\n | 'timeout';\n\nconst TERMINAL_WORKFLOW_RUN_STATUSES = new Set<WorkflowRunStatus>([\n 'succeeded',\n 'failed',\n 'cancelled',\n 'timeout',\n]);\n\nexport function isTerminalWorkflowRunStatus(status: WorkflowRunStatus): boolean {\n return TERMINAL_WORKFLOW_RUN_STATUSES.has(status);\n}\n\nexport interface WorkflowRun {\n id: string;\n definitionId: string;\n definitionVersion: string;\n title: string;\n goal: string;\n input: unknown;\n status: WorkflowRunStatus;\n source: WorkflowRunSource;\n result?: WorkflowResultEnvelope;\n error?: WorkflowRunError;\n metrics: WorkflowRunMetrics;\n createdAtMs: number;\n startedAtMs?: number;\n completedAtMs?: number;\n}\n\nexport type WorkflowRunSource =\n | { kind: 'chat'; sessionKey: string; messageId?: string }\n | { kind: 'webui' }\n | { kind: 'cron'; scheduleId: string }\n | { kind: 'api'; requestId?: string }\n | { kind: 'im'; channel: string; chatId: string };\n\nexport interface WorkflowRunMetrics {\n agentCount: number;\n doneAgentCount: number;\n errorAgentCount: number;\n skippedAgentCount: number;\n artifactCount: number;\n durationMs?: number;\n}\n\nexport interface WorkflowRunError {\n code: WorkflowRunErrorCode;\n message: string;\n detail?: string;\n recoverable: boolean;\n}\n\nexport type WorkflowRunErrorCode =\n | 'definition_not_found'\n | 'invalid_input'\n | 'runtime_error'\n | 'timeout'\n | 'cancelled'\n | 'result_validation_failed'\n | 'agent_quota_exceeded';\n\nexport interface WorkflowRunControls {\n canCancel: boolean;\n canRetry: boolean;\n canArchive: boolean;\n}\n\nexport interface WorkflowRunSummary {\n id: string;\n definitionId: string;\n title: string;\n status: WorkflowRunStatus;\n source: WorkflowRunSource;\n createdAtMs: number;\n startedAtMs?: number;\n completedAtMs?: number;\n metrics: WorkflowRunMetrics;\n}\n\nexport interface WorkflowRunView {\n run: WorkflowRun;\n phases: WorkflowPhaseView[];\n agents: WorkflowAgentView[];\n logs: WorkflowLogEntry[];\n artifacts: WorkflowArtifactRef[];\n timeline: WorkflowTimelineItem[];\n controls: WorkflowRunControls;\n}\n\nexport type WorkflowPhaseStatus = 'pending' | 'running' | 'completed' | 'failed';\n\nexport interface WorkflowPhaseView {\n id: string;\n title: string;\n status: WorkflowPhaseStatus;\n startedAtMs?: number;\n completedAtMs?: number;\n agentIds: string[];\n}\n\nexport type WorkflowAgentStatus = 'queued' | 'running' | 'done' | 'error' | 'skipped';\n\nexport interface WorkflowAgentView {\n id: string;\n label: string;\n phaseId?: string;\n status: WorkflowAgentStatus;\n prompt?: string;\n currentStep?: string;\n resultPreview?: string;\n error?: string;\n startedAtMs?: number;\n completedAtMs?: number;\n steps: WorkflowAgentStepView[];\n}\n\nexport type WorkflowAgentStepStatus = 'running' | 'done' | 'error';\n\nexport interface WorkflowAgentStepView {\n id: string;\n label: string;\n kind: 'tool' | 'llm' | 'thinking';\n detail?: string;\n status: WorkflowAgentStepStatus;\n startedAtMs?: number;\n completedAtMs?: number;\n}\n\nexport interface WorkflowLogEntry {\n sequence: number;\n message: string;\n createdAtMs: number;\n}\n\nexport interface WorkflowTimelineItem {\n sequence: number;\n type: string;\n title: string;\n createdAtMs: number;\n}\n"],"mappings":";AAUA,MAAM,iCAAiC,IAAI,IAAuB;CAChE;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,4BAA4B,QAAoC;AAC9E,QAAO,+BAA+B,IAAI,OAAO"}
1
+ {"version":3,"file":"run.js","names":[],"sources":["../../../../src/workflows/domain/run.ts"],"sourcesContent":["import type { WorkflowDefinitionEstimatedAgents } from './definition.js';\nimport type { WorkflowArtifactRef, WorkflowResultEnvelope } from './result.js';\n\nexport type WorkflowRunStatus =\n | 'queued'\n | 'running'\n | 'succeeded'\n | 'failed'\n | 'cancelled'\n | 'timeout';\n\nconst TERMINAL_WORKFLOW_RUN_STATUSES = new Set<WorkflowRunStatus>([\n 'succeeded',\n 'failed',\n 'cancelled',\n 'timeout',\n]);\n\nexport function isTerminalWorkflowRunStatus(status: WorkflowRunStatus): boolean {\n return TERMINAL_WORKFLOW_RUN_STATUSES.has(status);\n}\n\nexport interface WorkflowRun {\n id: string;\n definitionId: string;\n definitionVersion: string;\n title: string;\n goal: string;\n input: unknown;\n status: WorkflowRunStatus;\n source: WorkflowRunSource;\n metadata?: WorkflowRunMetadata;\n result?: WorkflowResultEnvelope;\n error?: WorkflowRunError;\n metrics: WorkflowRunMetrics;\n createdAtMs: number;\n startedAtMs?: number;\n completedAtMs?: number;\n}\n\nexport interface WorkflowRunMetadata {\n sessionKey: string;\n triggerSource: WorkflowRunSource['kind'];\n agentId?: string;\n retryOfRunId?: string;\n definition: WorkflowRunDefinitionSnapshot;\n input?: WorkflowRunInputEnvelope;\n correlation?: WorkflowRunCorrelation;\n origin?: WorkflowRunOrigin;\n schedule?: WorkflowRunScheduleMetadata;\n}\n\nexport interface WorkflowRunInputEnvelope {\n payload: unknown;\n goal?: string;\n variables?: Record<string, unknown>;\n context?: Record<string, unknown>;\n}\n\nexport interface WorkflowRunCorrelation {\n idempotencyKey?: string;\n requestId?: string;\n traceId?: string;\n parentRunId?: string;\n}\n\nexport interface WorkflowRunOrigin {\n channel: string;\n sessionKey?: string;\n chatId?: string;\n messageId?: string;\n scheduleId?: string;\n fireId?: string;\n requestId?: string;\n}\n\nexport interface WorkflowRunScheduleMetadata {\n scheduleId: string;\n fireId?: string;\n scheduledAtMs?: number;\n}\n\nexport interface WorkflowRunDefinitionSnapshot {\n id: string;\n name: string;\n title: string;\n version: string;\n source: 'builtin' | 'user';\n tags: string[];\n phaseCount: number;\n estimatedAgents?: WorkflowDefinitionEstimatedAgents;\n}\n\nexport type WorkflowRunSource =\n | { kind: 'chat'; sessionKey: string; messageId?: string }\n | { kind: 'webui'; sessionKey?: string; requestId?: string }\n | { kind: 'cron'; scheduleId: string; fireId?: string; scheduledAtMs?: number }\n | { kind: 'api'; requestId?: string; idempotencyKey?: string }\n | { kind: 'im'; channel: string; chatId: string; messageId?: string; userId?: string };\n\nexport interface WorkflowRunMetrics {\n agentCount: number;\n doneAgentCount: number;\n errorAgentCount: number;\n skippedAgentCount: number;\n artifactCount: number;\n durationMs?: number;\n}\n\nexport interface WorkflowRunError {\n code: WorkflowRunErrorCode;\n message: string;\n detail?: string;\n recoverable: boolean;\n}\n\nexport type WorkflowRunErrorCode =\n | 'definition_not_found'\n | 'invalid_input'\n | 'runtime_error'\n | 'timeout'\n | 'cancelled'\n | 'result_validation_failed'\n | 'agent_quota_exceeded';\n\nexport interface WorkflowRunControls {\n canCancel: boolean;\n canRetry: boolean;\n canArchive: boolean;\n}\n\nexport interface WorkflowRunSummary {\n id: string;\n definitionId: string;\n title: string;\n status: WorkflowRunStatus;\n source: WorkflowRunSource;\n metadata?: WorkflowRunMetadata;\n createdAtMs: number;\n startedAtMs?: number;\n completedAtMs?: number;\n metrics: WorkflowRunMetrics;\n}\n\nexport interface WorkflowRunView {\n run: WorkflowRun;\n phases: WorkflowPhaseView[];\n agents: WorkflowAgentView[];\n logs: WorkflowLogEntry[];\n artifacts: WorkflowArtifactRef[];\n timeline: WorkflowTimelineItem[];\n controls: WorkflowRunControls;\n}\n\nexport type WorkflowPhaseStatus = 'pending' | 'running' | 'completed' | 'failed';\n\nexport interface WorkflowPhaseView {\n id: string;\n title: string;\n status: WorkflowPhaseStatus;\n startedAtMs?: number;\n completedAtMs?: number;\n agentIds: string[];\n}\n\nexport type WorkflowAgentStatus = 'queued' | 'running' | 'done' | 'error' | 'skipped';\n\nexport interface WorkflowAgentView {\n id: string;\n label: string;\n phaseId?: string;\n status: WorkflowAgentStatus;\n prompt?: string;\n currentStep?: string;\n resultPreview?: string;\n error?: string;\n startedAtMs?: number;\n completedAtMs?: number;\n steps: WorkflowAgentStepView[];\n}\n\nexport type WorkflowAgentStepStatus = 'running' | 'done' | 'error';\n\nexport interface WorkflowAgentStepView {\n id: string;\n label: string;\n kind: 'tool' | 'llm' | 'thinking';\n toolName?: string;\n detail?: string;\n status: WorkflowAgentStepStatus;\n resultPreview?: string;\n error?: string;\n startedAtMs?: number;\n completedAtMs?: number;\n}\n\nexport interface WorkflowLogEntry {\n sequence: number;\n message: string;\n createdAtMs: number;\n}\n\nexport interface WorkflowTimelineItem {\n sequence: number;\n type: string;\n title: string;\n createdAtMs: number;\n}\n"],"mappings":";AAWA,MAAM,iCAAiC,IAAI,IAAuB;CAChE;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,4BAA4B,QAAoC;AAC9E,QAAO,+BAA+B,IAAI,OAAO"}
@@ -0,0 +1,19 @@
1
+ import type { WorkflowDefinition } from './definition.js';
2
+ export type WorkflowDefinitionValidationIssueCode = 'name_required' | 'script_required' | 'parse_failed' | 'meta_name_mismatch' | 'unknown_error';
3
+ export interface WorkflowDefinitionValidationIssue {
4
+ code: WorkflowDefinitionValidationIssueCode;
5
+ message: string;
6
+ line?: number;
7
+ column?: number;
8
+ }
9
+ export interface WorkflowDefinitionValidationResult {
10
+ valid: boolean;
11
+ errors: WorkflowDefinitionValidationIssue[];
12
+ warnings: WorkflowDefinitionValidationIssue[];
13
+ definition?: WorkflowDefinition;
14
+ }
15
+ export interface ValidateWorkflowDefinitionInput {
16
+ name?: string;
17
+ script?: string;
18
+ }
19
+ export declare function validateWorkflowDefinitionInput(input: ValidateWorkflowDefinitionInput): WorkflowDefinitionValidationResult;
@@ -0,0 +1,66 @@
1
+ import { parseWorkflowScript } from "../../agent/workflow/parser.js";
2
+ import { buildWorkflowDefinition } from "./definition-utils.js";
3
+ //#region src/workflows/domain/validation.ts
4
+ const NAME_RE = /^[a-z][a-z0-9_-]*$/;
5
+ function validateWorkflowDefinitionInput(input) {
6
+ const name = input.name?.trim() ?? "";
7
+ const script = input.script ?? "";
8
+ const errors = [];
9
+ const warnings = [];
10
+ if (!name) errors.push({
11
+ code: "name_required",
12
+ message: "Workflow name is required."
13
+ });
14
+ else if (!NAME_RE.test(name)) errors.push({
15
+ code: "parse_failed",
16
+ message: `Invalid workflow name "${name}". Use lowercase snake_case, e.g. "audit_repo".`
17
+ });
18
+ if (!script.trim()) errors.push({
19
+ code: "script_required",
20
+ message: "Workflow script is required."
21
+ });
22
+ if (errors.length > 0) return {
23
+ valid: false,
24
+ errors,
25
+ warnings
26
+ };
27
+ try {
28
+ const { meta } = parseWorkflowScript(script);
29
+ if (meta.name !== name) {
30
+ errors.push({
31
+ code: "meta_name_mismatch",
32
+ message: `meta.name "${meta.name}" does not match workflow name "${name}".`
33
+ });
34
+ return {
35
+ valid: false,
36
+ errors,
37
+ warnings
38
+ };
39
+ }
40
+ return {
41
+ valid: true,
42
+ errors,
43
+ warnings,
44
+ definition: buildWorkflowDefinition({
45
+ name,
46
+ source: "user",
47
+ script,
48
+ meta
49
+ })
50
+ };
51
+ } catch (err) {
52
+ errors.push({
53
+ code: "parse_failed",
54
+ message: err instanceof Error ? err.message : String(err)
55
+ });
56
+ return {
57
+ valid: false,
58
+ errors,
59
+ warnings
60
+ };
61
+ }
62
+ }
63
+ //#endregion
64
+ export { validateWorkflowDefinitionInput };
65
+
66
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","names":[],"sources":["../../../../src/workflows/domain/validation.ts"],"sourcesContent":["import { parseWorkflowScript } from '../../agent/workflow/parser.js';\n\nimport type { WorkflowDefinition } from './definition.js';\nimport { buildWorkflowDefinition } from './definition-utils.js';\n\nexport type WorkflowDefinitionValidationIssueCode =\n | 'name_required'\n | 'script_required'\n | 'parse_failed'\n | 'meta_name_mismatch'\n | 'unknown_error';\n\nexport interface WorkflowDefinitionValidationIssue {\n code: WorkflowDefinitionValidationIssueCode;\n message: string;\n line?: number;\n column?: number;\n}\n\nexport interface WorkflowDefinitionValidationResult {\n valid: boolean;\n errors: WorkflowDefinitionValidationIssue[];\n warnings: WorkflowDefinitionValidationIssue[];\n definition?: WorkflowDefinition;\n}\n\nexport interface ValidateWorkflowDefinitionInput {\n name?: string;\n script?: string;\n}\n\nconst NAME_RE = /^[a-z][a-z0-9_-]*$/;\n\nexport function validateWorkflowDefinitionInput(\n input: ValidateWorkflowDefinitionInput,\n): WorkflowDefinitionValidationResult {\n const name = input.name?.trim() ?? '';\n const script = input.script ?? '';\n const errors: WorkflowDefinitionValidationIssue[] = [];\n const warnings: WorkflowDefinitionValidationIssue[] = [];\n\n if (!name) {\n errors.push({ code: 'name_required', message: 'Workflow name is required.' });\n } else if (!NAME_RE.test(name)) {\n errors.push({\n code: 'parse_failed',\n message: `Invalid workflow name \"${name}\". Use lowercase snake_case, e.g. \"audit_repo\".`,\n });\n }\n\n if (!script.trim()) {\n errors.push({ code: 'script_required', message: 'Workflow script is required.' });\n }\n\n if (errors.length > 0) {\n return { valid: false, errors, warnings };\n }\n\n try {\n const { meta } = parseWorkflowScript(script);\n if (meta.name !== name) {\n errors.push({\n code: 'meta_name_mismatch',\n message: `meta.name \"${meta.name}\" does not match workflow name \"${name}\".`,\n });\n return { valid: false, errors, warnings };\n }\n\n return {\n valid: true,\n errors,\n warnings,\n definition: buildWorkflowDefinition({\n name,\n source: 'user',\n script,\n meta,\n }),\n };\n } catch (err) {\n errors.push({\n code: 'parse_failed',\n message: err instanceof Error ? err.message : String(err),\n });\n return { valid: false, errors, warnings };\n }\n}\n"],"mappings":";;;AA+BA,MAAM,UAAU;AAEhB,SAAgB,gCACd,OACoC;CACpC,MAAM,OAAO,MAAM,MAAM,MAAM,IAAI;CACnC,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,SAA8C,EAAE;CACtD,MAAM,WAAgD,EAAE;AAExD,KAAI,CAAC,KACH,QAAO,KAAK;EAAE,MAAM;EAAiB,SAAS;EAA8B,CAAC;UACpE,CAAC,QAAQ,KAAK,KAAK,CAC5B,QAAO,KAAK;EACV,MAAM;EACN,SAAS,0BAA0B,KAAK;EACzC,CAAC;AAGJ,KAAI,CAAC,OAAO,MAAM,CAChB,QAAO,KAAK;EAAE,MAAM;EAAmB,SAAS;EAAgC,CAAC;AAGnF,KAAI,OAAO,SAAS,EAClB,QAAO;EAAE,OAAO;EAAO;EAAQ;EAAU;AAG3C,KAAI;EACF,MAAM,EAAE,SAAS,oBAAoB,OAAO;AAC5C,MAAI,KAAK,SAAS,MAAM;AACtB,UAAO,KAAK;IACV,MAAM;IACN,SAAS,cAAc,KAAK,KAAK,kCAAkC,KAAK;IACzE,CAAC;AACF,UAAO;IAAE,OAAO;IAAO;IAAQ;IAAU;;AAG3C,SAAO;GACL,OAAO;GACP;GACA;GACA,YAAY,wBAAwB;IAClC;IACA,QAAQ;IACR;IACA;IACD,CAAC;GACH;UACM,KAAK;AACZ,SAAO,KAAK;GACV,MAAM;GACN,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;GAC1D,CAAC;AACF,SAAO;GAAE,OAAO;GAAO;GAAQ;GAAU"}
@@ -102,6 +102,7 @@ function projectWorkflowRunView(events) {
102
102
  id: payload.stepId,
103
103
  label: payload.label,
104
104
  kind: payload.kind,
105
+ toolName: payload.toolName,
105
106
  detail: payload.detail,
106
107
  status: "running",
107
108
  startedAtMs: event.createdAtMs
@@ -117,6 +118,8 @@ function projectWorkflowRunView(events) {
117
118
  steps: existing.steps.map((step) => step.id === payload.stepId ? {
118
119
  ...step,
119
120
  status: payload.status,
121
+ resultPreview: payload.resultPreview,
122
+ error: payload.error,
120
123
  completedAtMs: event.createdAtMs
121
124
  } : step)
122
125
  });
@@ -167,6 +170,20 @@ function projectWorkflowRunView(events) {
167
170
  case "run_cancelled":
168
171
  run.status = "cancelled";
169
172
  run.completedAtMs = event.createdAtMs;
173
+ for (const [agentId, agent] of agentIdToAgent) {
174
+ if (agent.status !== "queued" && agent.status !== "running") continue;
175
+ agentIdToAgent.set(agentId, {
176
+ ...agent,
177
+ status: "skipped",
178
+ currentStep: void 0,
179
+ completedAtMs: event.createdAtMs,
180
+ steps: agent.steps.map((step) => step.status === "running" ? {
181
+ ...step,
182
+ status: "error",
183
+ completedAtMs: event.createdAtMs
184
+ } : step)
185
+ });
186
+ }
170
187
  break;
171
188
  default: break;
172
189
  }
@@ -1 +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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"}
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 toolName?: string;\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 toolName: payload.toolName,\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 {\n agentId: string;\n stepId: string;\n status: 'done' | 'error';\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 steps: existing.steps.map((step) =>\n step.id === payload.stepId\n ? {\n ...step,\n status: payload.status,\n resultPreview: payload.resultPreview,\n error: payload.error,\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 for (const [agentId, agent] of agentIdToAgent) {\n if (agent.status !== 'queued' && agent.status !== 'running') {\n continue;\n }\n agentIdToAgent.set(agentId, {\n ...agent,\n status: 'skipped',\n currentStep: undefined,\n completedAtMs: event.createdAtMs,\n steps: agent.steps.map((step) =>\n step.status === 'running'\n ? { ...step, status: 'error', completedAtMs: event.createdAtMs }\n : step,\n ),\n });\n }\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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"}
@@ -1,6 +1,6 @@
1
1
  import type { WorkflowDefinition } from '../domain/definition.js';
2
2
  import type { WorkflowEventEnvelope } from '../domain/event.js';
3
- import type { WorkflowRunSource, WorkflowRunView } from '../domain/run.js';
3
+ import type { WorkflowRunMetadata, WorkflowRunSource, WorkflowRunView } from '../domain/run.js';
4
4
  import { WorkflowEventStore } from '../store/event-store.js';
5
5
  import { WorkflowRunStore } from '../store/run-store.js';
6
6
  import type { Api, Model } from '@earendil-works/pi-ai';
@@ -17,6 +17,7 @@ export interface WorkflowEngineOptions {
17
17
  export interface StartWorkflowRunOptions {
18
18
  input?: unknown;
19
19
  source: WorkflowRunSource;
20
+ metadata?: WorkflowRunMetadata;
20
21
  goal?: string;
21
22
  runId?: string;
22
23
  signal?: AbortSignal;