@codemation/core 0.0.1

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 (348) hide show
  1. package/README.md +30 -0
  2. package/dist/EngineExecutionLimitsPolicy-8MEFIYx1.d.cts +160 -0
  3. package/dist/EngineExecutionLimitsPolicy-BWAXW9D6.d.cts +160 -0
  4. package/dist/EngineExecutionLimitsPolicy-Bp8PS1Ss.d.cts +159 -0
  5. package/dist/EngineExecutionLimitsPolicy-CLxcN-D2.d.ts +159 -0
  6. package/dist/EngineExecutionLimitsPolicy-DZXuix51.d.ts +160 -0
  7. package/dist/EngineExecutionLimitsPolicy-Gfz6ngFd.d.ts +160 -0
  8. package/dist/EngineFactory-CBnntY3J.cjs +3152 -0
  9. package/dist/EngineFactory-CBnntY3J.cjs.map +1 -0
  10. package/dist/EngineFactory-Cwn3R2YA.js +3087 -0
  11. package/dist/EngineFactory-Cwn3R2YA.js.map +1 -0
  12. package/dist/EngineFactory-DWCnNocp.js +3063 -0
  13. package/dist/EngineFactory-DWCnNocp.js.map +1 -0
  14. package/dist/EngineFactory-DhPFou4p.cjs +3188 -0
  15. package/dist/EngineFactory-DhPFou4p.cjs.map +1 -0
  16. package/dist/EngineFactory-l_9xmBtv.cjs +3190 -0
  17. package/dist/EngineFactory-l_9xmBtv.cjs.map +1 -0
  18. package/dist/EngineFactory-w-aOWuqh.js +3089 -0
  19. package/dist/EngineFactory-w-aOWuqh.js.map +1 -0
  20. package/dist/InMemoryLiveWorkflowRepository-1J9MHN_I.js +18 -0
  21. package/dist/InMemoryLiveWorkflowRepository-1J9MHN_I.js.map +1 -0
  22. package/dist/InMemoryLiveWorkflowRepository-BTzHpQ6e.cjs +151 -0
  23. package/dist/InMemoryLiveWorkflowRepository-BTzHpQ6e.cjs.map +1 -0
  24. package/dist/InMemoryLiveWorkflowRepository-BoLNnVLg.js +139 -0
  25. package/dist/InMemoryLiveWorkflowRepository-BoLNnVLg.js.map +1 -0
  26. package/dist/InMemoryLiveWorkflowRepository-CULNqv96.d.ts +1300 -0
  27. package/dist/InMemoryLiveWorkflowRepository-D6eiiXxF.d.cts +1168 -0
  28. package/dist/InMemoryLiveWorkflowRepository-D7l8cjdZ.d.cts +1130 -0
  29. package/dist/InMemoryLiveWorkflowRepository-DL7LmC9S.d.ts +1340 -0
  30. package/dist/InMemoryLiveWorkflowRepository-jnv-OnOP.d.ts +1300 -0
  31. package/dist/InMemoryLiveWorkflowRepository-xny1_Z6i.cjs +24 -0
  32. package/dist/InMemoryLiveWorkflowRepository-xny1_Z6i.cjs.map +1 -0
  33. package/dist/InMemoryLiveWorkflowRepository-xr7b4kvi.d.ts +1338 -0
  34. package/dist/InMemoryWorkflowCatalog-BIdFpwbK.d.ts +1205 -0
  35. package/dist/InMemoryWorkflowCatalog-BW00_3N3.d.cts +12 -0
  36. package/dist/InMemoryWorkflowCatalog-BiYHGoPw.cjs +24 -0
  37. package/dist/InMemoryWorkflowCatalog-BiYHGoPw.cjs.map +1 -0
  38. package/dist/InMemoryWorkflowCatalog-BrG0ApMO.d.cts +1115 -0
  39. package/dist/InMemoryWorkflowCatalog-BzrAr--Y.js +139 -0
  40. package/dist/InMemoryWorkflowCatalog-BzrAr--Y.js.map +1 -0
  41. package/dist/InMemoryWorkflowCatalog-C-EJlJ7y.d.cts +1120 -0
  42. package/dist/InMemoryWorkflowCatalog-C4482bpw.cjs +24 -0
  43. package/dist/InMemoryWorkflowCatalog-C4482bpw.cjs.map +1 -0
  44. package/dist/InMemoryWorkflowCatalog-CZ0kZpOv.d.ts +1289 -0
  45. package/dist/InMemoryWorkflowCatalog-C_ACeLyW.d.cts +1119 -0
  46. package/dist/InMemoryWorkflowCatalog-CiHWIu5E.d.cts +12 -0
  47. package/dist/InMemoryWorkflowCatalog-CkH7gkya.js +18 -0
  48. package/dist/InMemoryWorkflowCatalog-CkH7gkya.js.map +1 -0
  49. package/dist/InMemoryWorkflowCatalog-CnpZVJM9.d.ts +1205 -0
  50. package/dist/InMemoryWorkflowCatalog-Cu68S8YR.js +18 -0
  51. package/dist/InMemoryWorkflowCatalog-Cu68S8YR.js.map +1 -0
  52. package/dist/InMemoryWorkflowCatalog-D2w9nMj2.cjs +151 -0
  53. package/dist/InMemoryWorkflowCatalog-D2w9nMj2.cjs.map +1 -0
  54. package/dist/InMemoryWorkflowCatalog-D5eMxEf7.js +18 -0
  55. package/dist/InMemoryWorkflowCatalog-D5eMxEf7.js.map +1 -0
  56. package/dist/InMemoryWorkflowCatalog-D5nCp2yZ.d.ts +1267 -0
  57. package/dist/InMemoryWorkflowCatalog-DIq0bjqN.d.ts +12 -0
  58. package/dist/InMemoryWorkflowCatalog-DLgaEaw_.d.ts +1288 -0
  59. package/dist/InMemoryWorkflowCatalog-DNBFdK-x.d.cts +1120 -0
  60. package/dist/InMemoryWorkflowCatalog-DQBkCzb7.cjs +24 -0
  61. package/dist/InMemoryWorkflowCatalog-DQBkCzb7.cjs.map +1 -0
  62. package/dist/InMemoryWorkflowCatalog-DS4-eX6i.d.cts +1118 -0
  63. package/dist/InMemoryWorkflowCatalog-DdVfy8MY.d.ts +12 -0
  64. package/dist/InMemoryWorkflowCatalog-DeVZu3g8.d.ts +12 -0
  65. package/dist/InMemoryWorkflowCatalog-GxkQjvt5.d.ts +1200 -0
  66. package/dist/InMemoryWorkflowCatalog-qaVRn1Lc.d.cts +1115 -0
  67. package/dist/InMemoryWorkflowCatalog-z1aIT4TC.d.cts +12 -0
  68. package/dist/InMemoryWorkflowRegistry-BBuOovLL.d.ts +1007 -0
  69. package/dist/InMemoryWorkflowRegistry-BIFnSl3k.d.ts +1201 -0
  70. package/dist/InMemoryWorkflowRegistry-BnGilthz.d.ts +1137 -0
  71. package/dist/InMemoryWorkflowRegistry-CEp5I8No.d.ts +1146 -0
  72. package/dist/InMemoryWorkflowRegistry-CHyMB9jW.d.cts +976 -0
  73. package/dist/InMemoryWorkflowRegistry-CUN7K86m.d.cts +1061 -0
  74. package/dist/InMemoryWorkflowRegistry-CVfHyELh.d.cts +971 -0
  75. package/dist/InMemoryWorkflowRegistry-CXXJrwAr.d.cts +1052 -0
  76. package/dist/InMemoryWorkflowRegistry-DDGfPTJy.d.ts +1013 -0
  77. package/dist/InMemoryWorkflowRegistry-DnYSOoT5.d.ts +1120 -0
  78. package/dist/InMemoryWorkflowRegistry-Dp5GiFF2.d.cts +1035 -0
  79. package/dist/InMemoryWorkflowRegistry-DypDBeOw.d.cts +1116 -0
  80. package/dist/InMemoryWorkflowRegistry-SzwJCAxT.d.ts +1012 -0
  81. package/dist/InMemoryWorkflowRegistry-jupvqyGc.d.cts +977 -0
  82. package/dist/InMemoryWorkflowRegistry-rAdKVWYT.d.ts +1117 -0
  83. package/dist/InProcessRetryRunner-BBNPkXjy.d.cts +292 -0
  84. package/dist/PersistedWorkflowSnapshotFactory-7RkOL3Kg.d.ts +14 -0
  85. package/dist/PersistedWorkflowSnapshotFactory-BmANa46W.cjs +141 -0
  86. package/dist/PersistedWorkflowSnapshotFactory-BmANa46W.cjs.map +1 -0
  87. package/dist/PersistedWorkflowSnapshotFactory-Bwb_etSt.js +118 -0
  88. package/dist/PersistedWorkflowSnapshotFactory-Bwb_etSt.js.map +1 -0
  89. package/dist/PersistedWorkflowSnapshotFactory-CRkKGNV6.js +123 -0
  90. package/dist/PersistedWorkflowSnapshotFactory-CRkKGNV6.js.map +1 -0
  91. package/dist/PersistedWorkflowSnapshotFactory-CZolnGy5.js +101 -0
  92. package/dist/PersistedWorkflowSnapshotFactory-CZolnGy5.js.map +1 -0
  93. package/dist/PersistedWorkflowSnapshotFactory-Ca_oysOv.cjs +131 -0
  94. package/dist/PersistedWorkflowSnapshotFactory-Ca_oysOv.cjs.map +1 -0
  95. package/dist/PersistedWorkflowSnapshotFactory-CqIcShnX.js +103 -0
  96. package/dist/PersistedWorkflowSnapshotFactory-CqIcShnX.js.map +1 -0
  97. package/dist/PersistedWorkflowSnapshotFactory-D-tBk4_G.js +119 -0
  98. package/dist/PersistedWorkflowSnapshotFactory-D-tBk4_G.js.map +1 -0
  99. package/dist/PersistedWorkflowSnapshotFactory-D4cXl2e2.cjs +131 -0
  100. package/dist/PersistedWorkflowSnapshotFactory-D4cXl2e2.cjs.map +1 -0
  101. package/dist/PersistedWorkflowSnapshotFactory-DINoP12r.cjs +131 -0
  102. package/dist/PersistedWorkflowSnapshotFactory-DINoP12r.cjs.map +1 -0
  103. package/dist/PersistedWorkflowSnapshotFactory-DJAwSuHU.js +103 -0
  104. package/dist/PersistedWorkflowSnapshotFactory-DJAwSuHU.js.map +1 -0
  105. package/dist/PersistedWorkflowSnapshotFactory-DSUjVCcf.cjs +131 -0
  106. package/dist/PersistedWorkflowSnapshotFactory-DSUjVCcf.cjs.map +1 -0
  107. package/dist/PersistedWorkflowSnapshotFactory-DdHuhkDb.cjs +107 -0
  108. package/dist/PersistedWorkflowSnapshotFactory-DdHuhkDb.cjs.map +1 -0
  109. package/dist/PersistedWorkflowSnapshotFactory-Dqc6NHis.js +119 -0
  110. package/dist/PersistedWorkflowSnapshotFactory-Dqc6NHis.js.map +1 -0
  111. package/dist/PersistedWorkflowSnapshotFactory-Dxa2dSrw.cjs +130 -0
  112. package/dist/PersistedWorkflowSnapshotFactory-Dxa2dSrw.cjs.map +1 -0
  113. package/dist/PersistedWorkflowSnapshotFactory-Ep79Ah1G.js +123 -0
  114. package/dist/PersistedWorkflowSnapshotFactory-Ep79Ah1G.js.map +1 -0
  115. package/dist/PersistedWorkflowSnapshotFactory-GyLfRuiJ.js +119 -0
  116. package/dist/PersistedWorkflowSnapshotFactory-GyLfRuiJ.js.map +1 -0
  117. package/dist/PersistedWorkflowSnapshotFactory-HTpBsBzn.js +102 -0
  118. package/dist/PersistedWorkflowSnapshotFactory-HTpBsBzn.js.map +1 -0
  119. package/dist/PersistedWorkflowSnapshotFactory-LVmaaf3t.cjs +141 -0
  120. package/dist/PersistedWorkflowSnapshotFactory-LVmaaf3t.cjs.map +1 -0
  121. package/dist/PersistedWorkflowSnapshotFactory-PZCpo2ZS.js +119 -0
  122. package/dist/PersistedWorkflowSnapshotFactory-PZCpo2ZS.js.map +1 -0
  123. package/dist/PersistedWorkflowSnapshotFactory-UjQ1SJev.cjs +109 -0
  124. package/dist/PersistedWorkflowSnapshotFactory-UjQ1SJev.cjs.map +1 -0
  125. package/dist/PersistedWorkflowSnapshotFactory-Y8kCrhcy.cjs +109 -0
  126. package/dist/PersistedWorkflowSnapshotFactory-Y8kCrhcy.cjs.map +1 -0
  127. package/dist/PersistedWorkflowSnapshotFactory-Z_nB-fmB.cjs +108 -0
  128. package/dist/PersistedWorkflowSnapshotFactory-Z_nB-fmB.cjs.map +1 -0
  129. package/dist/RunIntentService-1EE6N8ZL.cjs +963 -0
  130. package/dist/RunIntentService-1EE6N8ZL.cjs.map +1 -0
  131. package/dist/RunIntentService-2ivFmNQh.cjs +3462 -0
  132. package/dist/RunIntentService-2ivFmNQh.cjs.map +1 -0
  133. package/dist/RunIntentService-B0sUL5q-.js +761 -0
  134. package/dist/RunIntentService-B0sUL5q-.js.map +1 -0
  135. package/dist/RunIntentService-BFVbsOcg.js +3131 -0
  136. package/dist/RunIntentService-BFVbsOcg.js.map +1 -0
  137. package/dist/RunIntentService-BsBOwpVN.cjs +1051 -0
  138. package/dist/RunIntentService-BsBOwpVN.cjs.map +1 -0
  139. package/dist/RunIntentService-CSk3ETyn.js +858 -0
  140. package/dist/RunIntentService-CSk3ETyn.js.map +1 -0
  141. package/dist/RunIntentService-Ckn3u3tA.d.cts +326 -0
  142. package/dist/RunIntentService-DEo6GTTo.d.cts +289 -0
  143. package/dist/RunIntentService-DKrGtL0B.js +782 -0
  144. package/dist/RunIntentService-DKrGtL0B.js.map +1 -0
  145. package/dist/RunIntentService-DNOJc1R7.cjs +942 -0
  146. package/dist/RunIntentService-DNOJc1R7.cjs.map +1 -0
  147. package/dist/RunIntentService-Dq3pV53j.d.cts +289 -0
  148. package/dist/RunIntentService-NKobsfMQ.d.cts +274 -0
  149. package/dist/WorkflowSnapshotCodec-C3fuuS_R.d.cts +22 -0
  150. package/dist/WorkflowSnapshotCodec-CUudUo6f.js +123 -0
  151. package/dist/WorkflowSnapshotCodec-CUudUo6f.js.map +1 -0
  152. package/dist/WorkflowSnapshotCodec-CuCPQZTc.cjs +129 -0
  153. package/dist/WorkflowSnapshotCodec-CuCPQZTc.cjs.map +1 -0
  154. package/dist/WorkflowSnapshotCodec-DLiXQNvV.d.cts +22 -0
  155. package/dist/WorkflowSnapshotCodec-DNtdrZ7l.d.cts +22 -0
  156. package/dist/WorkflowSnapshotCodec-DTdWkoW_.d.cts +22 -0
  157. package/dist/bootstrap/index.cjs +1028 -0
  158. package/dist/bootstrap/index.cjs.map +1 -0
  159. package/dist/bootstrap/index.d.cts +311 -0
  160. package/dist/bootstrap/index.d.ts +83 -0
  161. package/dist/bootstrap/index.js +994 -0
  162. package/dist/bootstrap/index.js.map +1 -0
  163. package/dist/credentialTypes-B5h3dI7r.d.cts +1107 -0
  164. package/dist/credentialTypes-B9okPCVo.d.cts +963 -0
  165. package/dist/credentialTypes-BFL70rgZ.d.cts +964 -0
  166. package/dist/credentialTypes-BGkh1O07.d.ts +1010 -0
  167. package/dist/credentialTypes-BNLi4Q7u.d.ts +1030 -0
  168. package/dist/credentialTypes-CeSoZGj3.d.cts +994 -0
  169. package/dist/credentialTypes-CpHc32Ig.d.cts +984 -0
  170. package/dist/credentialTypes-D0m7MQQl.d.cts +1107 -0
  171. package/dist/credentialTypes-D4nL2sUd.d.ts +1000 -0
  172. package/dist/credentialTypes-DBYK2Qbu.d.ts +999 -0
  173. package/dist/credentialTypes-DMJVy0r1.d.ts +1000 -0
  174. package/dist/credentialTypes-DhUAjYQp.d.ts +1020 -0
  175. package/dist/credentialTypes-gGITj5KL.d.cts +964 -0
  176. package/dist/credentialTypes-r3KVBJBE.d.cts +974 -0
  177. package/dist/diTokens-ClO27tjK.cjs +34 -0
  178. package/dist/diTokens-ClO27tjK.cjs.map +1 -0
  179. package/dist/diTokens-CoHBkwG6.js +28 -0
  180. package/dist/diTokens-CoHBkwG6.js.map +1 -0
  181. package/dist/index-6Doxmfnd.d.ts +857 -0
  182. package/dist/index-9g6Pfe9Z.d.ts +689 -0
  183. package/dist/index-AZ72Ej-K.d.ts +920 -0
  184. package/dist/index-BEk9V-q-.d.ts +667 -0
  185. package/dist/index-Bjt7_7oS.d.ts +1192 -0
  186. package/dist/index-CFGxsYXy.d.ts +708 -0
  187. package/dist/index-C_u8xFgn.d.ts +690 -0
  188. package/dist/index-CpbfsvOJ.d.ts +1192 -0
  189. package/dist/index-CsReNJN_.d.ts +859 -0
  190. package/dist/index-D5iNnXaW.d.ts +667 -0
  191. package/dist/index-DD_Eft1q.d.ts +708 -0
  192. package/dist/index-DiSYUe0G.d.ts +1192 -0
  193. package/dist/index-gIcH60sp.d.ts +674 -0
  194. package/dist/index.cjs +520 -0
  195. package/dist/index.cjs.map +1 -0
  196. package/dist/index.d.cts +345 -0
  197. package/dist/index.d.ts +3 -0
  198. package/dist/index.js +412 -0
  199. package/dist/index.js.map +1 -0
  200. package/dist/runtime-BIvd-1JA.cjs +4112 -0
  201. package/dist/runtime-BIvd-1JA.cjs.map +1 -0
  202. package/dist/runtime-D3eWKSQK.cjs +3986 -0
  203. package/dist/runtime-D3eWKSQK.cjs.map +1 -0
  204. package/dist/runtime-Dvp4xAjg.js +3799 -0
  205. package/dist/runtime-Dvp4xAjg.js.map +1 -0
  206. package/dist/runtime-vc76SSAa.js +3685 -0
  207. package/dist/runtime-vc76SSAa.js.map +1 -0
  208. package/dist/runtimeTypes-BK0b8SaG.d.cts +884 -0
  209. package/dist/runtimeTypes-CoYZkYQq.d.cts +851 -0
  210. package/dist/runtimeTypes-D-Pm0Uas.d.cts +849 -0
  211. package/dist/testing.cjs +18 -0
  212. package/dist/testing.cjs.map +1 -0
  213. package/dist/testing.d.cts +19 -0
  214. package/dist/testing.d.ts +18 -0
  215. package/dist/testing.js +16 -0
  216. package/dist/testing.js.map +1 -0
  217. package/dist/types-Cb5UK7Y6.d.ts +857 -0
  218. package/package.json +66 -0
  219. package/src/ai/AiHost.ts +115 -0
  220. package/src/binaries/DefaultExecutionBinaryServiceFactory.ts +37 -0
  221. package/src/binaries/DefaultNodeBinaryAttachmentServiceFactory.ts +120 -0
  222. package/src/binaries/UnavailableBinaryStorage.ts +19 -0
  223. package/src/binaries/index.ts +2 -0
  224. package/src/bootstrap/index.ts +46 -0
  225. package/src/bootstrap/runtime/EngineRuntimeRegistrar.ts +180 -0
  226. package/src/bootstrap/runtime/EngineRuntimeRegistration.types.ts +43 -0
  227. package/src/bootstrap/runtime/index.ts +6 -0
  228. package/src/browser.ts +8 -0
  229. package/src/contracts/Clock.ts +10 -0
  230. package/src/contracts/ExpRetryPolicy.ts +23 -0
  231. package/src/contracts/NoRetryPolicy.ts +5 -0
  232. package/src/contracts/RetryPolicy.ts +23 -0
  233. package/src/contracts/credentialTypes.ts +194 -0
  234. package/src/contracts/index.ts +6 -0
  235. package/src/contracts/retryPolicySpec.types.ts +30 -0
  236. package/src/contracts/runFinishedAtFactory.ts +19 -0
  237. package/src/contracts/runTypes.ts +314 -0
  238. package/src/contracts/runtimeTypes.ts +373 -0
  239. package/src/contracts/webhookTypes.ts +49 -0
  240. package/src/contracts/workflowActivationPolicy.ts +16 -0
  241. package/src/contracts/workflowTypes.ts +280 -0
  242. package/src/di/CoreTokens.ts +60 -0
  243. package/src/di/index.ts +24 -0
  244. package/src/events/EventPublishingWorkflowExecutionRepository.ts +67 -0
  245. package/src/events/InMemoryRunEventBusRegistry.ts +37 -0
  246. package/src/events/InMemoryRunEventSubscription.ts +9 -0
  247. package/src/events/NodeEventPublisher.ts +22 -0
  248. package/src/events/index.ts +4 -0
  249. package/src/events/runEvents.ts +54 -0
  250. package/src/execution/ActivationEnqueueService.ts +125 -0
  251. package/src/execution/CredentialResolverFactory.ts +39 -0
  252. package/src/execution/DefaultAsyncSleeper.ts +9 -0
  253. package/src/execution/DefaultExecutionContextFactory.ts +48 -0
  254. package/src/execution/InProcessRetryRunner.ts +115 -0
  255. package/src/execution/InProcessRetryRunnerFactory.ts +8 -0
  256. package/src/execution/NodeActivationRequestComposer.ts +113 -0
  257. package/src/execution/NodeExecutionSnapshotFactory.ts +152 -0
  258. package/src/execution/NodeExecutor.ts +43 -0
  259. package/src/execution/NodeExecutorFactory.ts +10 -0
  260. package/src/execution/NodeInputsByPortFactory.ts +14 -0
  261. package/src/execution/NodeInstanceFactory.ts +32 -0
  262. package/src/execution/NodeInstanceFactoryFactory.ts +9 -0
  263. package/src/execution/NodeRunStateWriter.ts +185 -0
  264. package/src/execution/NodeRunStateWriterFactory.ts +29 -0
  265. package/src/execution/PersistedRunStateTerminalBuilder.ts +25 -0
  266. package/src/execution/RunStateSemantics.ts +158 -0
  267. package/src/execution/WorkflowRunExecutionContextFactory.ts +45 -0
  268. package/src/execution/asyncSleeper.types.ts +3 -0
  269. package/src/execution/index.ts +26 -0
  270. package/src/index.ts +18 -0
  271. package/src/orchestration/Engine.ts +229 -0
  272. package/src/orchestration/EngineWaiters.ts +37 -0
  273. package/src/orchestration/RunContinuationService.ts +810 -0
  274. package/src/orchestration/RunStartService.ts +449 -0
  275. package/src/orchestration/TriggerRuntimeService.ts +260 -0
  276. package/src/orchestration/index.ts +5 -0
  277. package/src/planning/CurrentStateFrontierPlanner.ts +400 -0
  278. package/src/planning/EngineWorkflowPlanningFactory.ts +63 -0
  279. package/src/planning/RunQueuePlanner.ts +302 -0
  280. package/src/planning/WorkflowTopologyPlanner.ts +77 -0
  281. package/src/planning/index.ts +4 -0
  282. package/src/policies/WorkflowPolicyErrorServices.ts +38 -0
  283. package/src/policies/executionLimits/EngineExecutionLimitsPolicy.ts +66 -0
  284. package/src/policies/executionLimits/EngineExecutionLimitsPolicyFactory.ts +14 -0
  285. package/src/policies/index.ts +10 -0
  286. package/src/policies/storage/RunPolicySnapshotFactory.ts +23 -0
  287. package/src/policies/storage/RunTerminalPersistenceCoordinator.ts +29 -0
  288. package/src/policies/storage/WorkflowStoragePolicyEvaluator.ts +39 -0
  289. package/src/runStorage/BinaryBodyBufferReader.ts +57 -0
  290. package/src/runStorage/BinaryBodyReadableStreamFactory.ts +21 -0
  291. package/src/runStorage/InMemoryBinaryStorageRegistry.ts +53 -0
  292. package/src/runStorage/InMemoryRunData.ts +33 -0
  293. package/src/runStorage/InMemoryRunDataFactory.ts +8 -0
  294. package/src/runStorage/InMemoryWorkflowExecutionRepository.ts +95 -0
  295. package/src/runStorage/RunSummaryMapper.ts +17 -0
  296. package/src/runStorage/index.ts +7 -0
  297. package/src/runtime/EngineFactory.ts +151 -0
  298. package/src/runtime/EngineWorkflowRunnerService.ts +39 -0
  299. package/src/runtime/EngineWorkflowRunnerServiceFactory.ts +11 -0
  300. package/src/runtime/InMemoryLiveWorkflowRepository.ts +20 -0
  301. package/src/runtime/RunIntentService.ts +175 -0
  302. package/src/runtime/RunIntentServiceFactory.ts +11 -0
  303. package/src/runtime/WorkflowRepositoryWebhookTriggerMatcher.ts +144 -0
  304. package/src/runtime/WorkflowRepositoryWebhookTriggerMatcherFactory.ts +13 -0
  305. package/src/runtime/index.ts +9 -0
  306. package/src/runtime-types/InjectableRuntimeDecoratorComposerRegistry.ts +25 -0
  307. package/src/runtime-types/PersistedRuntimeTypeMetadataStoreRegistry.ts +46 -0
  308. package/src/runtime-types/PersistedRuntimeTypeNameResolver.ts +14 -0
  309. package/src/runtime-types/StackTraceCallSitePathResolver.ts +25 -0
  310. package/src/runtime-types/persistedRuntimeTypeModelRegistry.ts +33 -0
  311. package/src/runtime-types/runtimeTypeDecorators.types.ts +46 -0
  312. package/src/scheduler/ConfigDrivenOffloadPolicy.ts +28 -0
  313. package/src/scheduler/DefaultDrivingScheduler.ts +100 -0
  314. package/src/scheduler/HintOnlyOffloadPolicy.ts +9 -0
  315. package/src/scheduler/InlineDrivingScheduler.ts +145 -0
  316. package/src/scheduler/InlineDrivingSchedulerFactory.ts +9 -0
  317. package/src/scheduler/LocalOnlyScheduler.ts +7 -0
  318. package/src/serialization/ItemsInputNormalizer.ts +36 -0
  319. package/src/testing/RejectingCredentialSessionService.ts +15 -0
  320. package/src/testing.ts +6 -0
  321. package/src/types/index.ts +12 -0
  322. package/src/workflow/definition/ConnectionInvocationIdFactory.ts +17 -0
  323. package/src/workflow/definition/ConnectionNodeIdFactory.ts +42 -0
  324. package/src/workflow/definition/WorkflowExecutableNodeClassifier.ts +71 -0
  325. package/src/workflow/definition/WorkflowExecutableNodeClassifierFactory.ts +9 -0
  326. package/src/workflow/dsl/ChainCursorResolver.ts +103 -0
  327. package/src/workflow/dsl/WhenBuilder.ts +57 -0
  328. package/src/workflow/dsl/WorkflowBuilder.ts +55 -0
  329. package/src/workflow/dsl/workflowBuilderTypes.ts +63 -0
  330. package/src/workflow/graph/DefaultWorkflowGraphFactory.ts +8 -0
  331. package/src/workflow/graph/ExecutableGraph.ts +24 -0
  332. package/src/workflow/index.ts +11 -0
  333. package/src/workflowSnapshots/MissingRuntimeExecutionMarker.ts +5 -0
  334. package/src/workflowSnapshots/MissingRuntimeFallbacksFactory.ts +27 -0
  335. package/src/workflowSnapshots/MissingRuntimeNode.ts +12 -0
  336. package/src/workflowSnapshots/MissingRuntimeNodeConfig.ts +14 -0
  337. package/src/workflowSnapshots/MissingRuntimeNodeToken.ts +1 -0
  338. package/src/workflowSnapshots/MissingRuntimeTrigger.ts +16 -0
  339. package/src/workflowSnapshots/MissingRuntimeTriggerConfig.ts +14 -0
  340. package/src/workflowSnapshots/MissingRuntimeTriggerToken.ts +1 -0
  341. package/src/workflowSnapshots/PersistedRuntimeTypeIdFactory.ts +19 -0
  342. package/src/workflowSnapshots/PersistedWorkflowTokenRegistry.ts +89 -0
  343. package/src/workflowSnapshots/PersistedWorkflowTokenRegistryFactory.ts +2 -0
  344. package/src/workflowSnapshots/WorkflowSnapshotCodec.ts +177 -0
  345. package/src/workflowSnapshots/WorkflowSnapshotResolver.ts +102 -0
  346. package/src/workflowSnapshots/index.ts +12 -0
  347. package/tsconfig.json +9 -0
  348. package/tsdown.config.ts +10 -0
@@ -0,0 +1,280 @@
1
+ import type { TypeToken } from "../di";
2
+ import type { CredentialRequirement } from "./credentialTypes";
3
+ import type { RetryPolicySpec } from "./retryPolicySpec.types";
4
+
5
+ export type WorkflowId = string;
6
+ export type NodeId = string;
7
+ export type OutputPortKey = string;
8
+ export type InputPortKey = string;
9
+ export type PersistedTokenId = string;
10
+
11
+ export type NodeKind = "trigger" | "node";
12
+ export type JsonPrimitive = string | number | boolean | null;
13
+ export interface JsonObject {
14
+ readonly [key: string]: JsonValue;
15
+ }
16
+ export type JsonValue = JsonPrimitive | JsonObject | JsonArray;
17
+ export type JsonArray = ReadonlyArray<JsonValue>;
18
+
19
+ export interface Edge {
20
+ from: { nodeId: NodeId; output: OutputPortKey };
21
+ to: { nodeId: NodeId; input: InputPortKey };
22
+ }
23
+
24
+ export type NodeConnectionName = string;
25
+
26
+ /**
27
+ * Named connection from an executable parent node to child nodes that exist in {@link WorkflowDefinition.nodes}
28
+ * but are not traversed by the main execution graph.
29
+ */
30
+ export interface WorkflowNodeConnection {
31
+ readonly parentNodeId: NodeId;
32
+ readonly connectionName: NodeConnectionName;
33
+ readonly childNodeIds: ReadonlyArray<NodeId>;
34
+ }
35
+
36
+ export interface WorkflowDefinition {
37
+ id: WorkflowId;
38
+ name: string;
39
+ nodes: NodeDefinition[];
40
+ edges: Edge[];
41
+ /**
42
+ * Optional metadata: which nodes are connection-owned children (e.g. AI agent `llm` / `tools` slots).
43
+ * When omitted, all nodes in {@link nodes} are treated as executable for topology.
44
+ */
45
+ readonly connections?: ReadonlyArray<WorkflowNodeConnection>;
46
+ /** Directory + file-stem path under a workflow discovery root (for UI grouping only). */
47
+ discoveryPathSegments?: readonly string[];
48
+ /** Retention for run JSON and binaries (seconds). Host/env may supply defaults when omitted. */
49
+ readonly prunePolicy?: WorkflowPrunePolicySpec;
50
+ /** Whether to keep run data after completion. Host/env may supply defaults when omitted. */
51
+ readonly storagePolicy?: WorkflowStoragePolicySpec;
52
+ /** Invoked after a node fails permanently (retries exhausted) and node error handler did not recover. */
53
+ readonly workflowErrorHandler?: WorkflowErrorHandlerSpec;
54
+ }
55
+
56
+ export interface WorkflowGraph {
57
+ next(nodeId: NodeId, output: OutputPortKey): ReadonlyArray<Readonly<{ nodeId: NodeId; input: InputPortKey }>>;
58
+ }
59
+
60
+ export interface WorkflowGraphFactory {
61
+ create(def: WorkflowDefinition): WorkflowGraph;
62
+ }
63
+
64
+ export interface NodeConfigBase {
65
+ readonly kind: NodeKind;
66
+ readonly type: TypeToken<unknown>;
67
+ readonly name?: string;
68
+ readonly id?: NodeId;
69
+ readonly icon?: string;
70
+ readonly execution?: Readonly<{ hint?: "local" | "worker"; queue?: string }>;
71
+ /** In-process execute retries (runnable nodes). Triggers typically omit this. */
72
+ readonly retryPolicy?: RetryPolicySpec;
73
+ /** Recover from execute failures; return outputs to continue, or rethrow to fail the node. */
74
+ readonly nodeErrorHandler?: NodeErrorHandlerSpec;
75
+ /**
76
+ * When true, edges carrying zero items on an output port still schedule single-input downstream nodes.
77
+ * Decided from the **source** node that produced the (empty) output. Default (false/undefined): empty
78
+ * main batches skip downstream execution and propagate the empty path.
79
+ */
80
+ readonly continueWhenEmptyOutput?: boolean;
81
+ getCredentialRequirements?(): ReadonlyArray<CredentialRequirement>;
82
+ }
83
+
84
+ export declare const runnableNodeInputType: unique symbol;
85
+ export declare const runnableNodeOutputType: unique symbol;
86
+ export declare const triggerNodeOutputType: unique symbol;
87
+
88
+ export interface RunnableNodeConfig<TInputJson = unknown, TOutputJson = unknown> extends NodeConfigBase {
89
+ readonly kind: "node";
90
+ readonly [runnableNodeInputType]?: TInputJson;
91
+ readonly [runnableNodeOutputType]?: TOutputJson;
92
+ }
93
+
94
+ export declare const triggerNodeSetupStateType: unique symbol;
95
+
96
+ export interface TriggerNodeConfig<
97
+ TOutputJson = unknown,
98
+ TSetupState extends JsonValue | undefined = undefined,
99
+ > extends NodeConfigBase {
100
+ readonly kind: "trigger";
101
+ readonly [triggerNodeOutputType]?: TOutputJson;
102
+ readonly [triggerNodeSetupStateType]?: TSetupState;
103
+ }
104
+
105
+ export type RunnableNodeInputJson<TConfig extends RunnableNodeConfig<any, any>> =
106
+ TConfig extends RunnableNodeConfig<infer TInputJson, any> ? TInputJson : never;
107
+
108
+ export type RunnableNodeOutputJson<TConfig extends RunnableNodeConfig<any, any>> =
109
+ TConfig extends RunnableNodeConfig<any, infer TOutputJson> ? TOutputJson : never;
110
+
111
+ export type TriggerNodeOutputJson<TConfig extends TriggerNodeConfig<any, any>> =
112
+ TConfig extends TriggerNodeConfig<infer TOutputJson, any> ? TOutputJson : never;
113
+
114
+ export type TriggerNodeSetupState<TConfig extends TriggerNodeConfig<any, any>> =
115
+ TConfig extends TriggerNodeConfig<any, infer TSetupState> ? TSetupState : never;
116
+
117
+ export interface NodeDefinition {
118
+ id: NodeId;
119
+ kind: NodeKind;
120
+ type: TypeToken<unknown>;
121
+ name?: string;
122
+ config: NodeConfigBase;
123
+ }
124
+
125
+ export interface NodeRef {
126
+ id: NodeId;
127
+ kind: NodeKind;
128
+ name?: string;
129
+ }
130
+
131
+ export type PairedItemRef = Readonly<{ nodeId: NodeId; output: OutputPortKey; itemIndex: number }>;
132
+
133
+ export type BinaryPreviewKind = "image" | "audio" | "video" | "download";
134
+
135
+ export type BinaryAttachment = Readonly<{
136
+ id: string;
137
+ storageKey: string;
138
+ mimeType: string;
139
+ size: number;
140
+ storageDriver: string;
141
+ previewKind: BinaryPreviewKind;
142
+ createdAt: string;
143
+ runId: RunId;
144
+ workflowId: WorkflowId;
145
+ nodeId: NodeId;
146
+ activationId: NodeActivationId;
147
+ filename?: string;
148
+ sha256?: string;
149
+ }>;
150
+
151
+ export type ItemBinary = Readonly<Record<string, BinaryAttachment>>;
152
+
153
+ export type Item<TJson = unknown> = Readonly<{
154
+ json: TJson;
155
+ binary?: ItemBinary;
156
+ meta?: Readonly<Record<string, unknown>>;
157
+ paired?: ReadonlyArray<PairedItemRef>;
158
+ }>;
159
+
160
+ export type Items<TJson = unknown> = ReadonlyArray<Item<TJson>>;
161
+
162
+ export type NodeOutputs = Partial<Record<OutputPortKey, Items>>;
163
+
164
+ export type RunId = string;
165
+ export type NodeActivationId = string;
166
+
167
+ export interface ParentExecutionRef {
168
+ runId: RunId;
169
+ workflowId: WorkflowId;
170
+ nodeId: NodeId;
171
+ /** Subworkflow depth of the **spawning** run (0 = root). Passed when starting a child run. */
172
+ subworkflowDepth?: number;
173
+ /** Effective max node activations from the parent run (propagated to child policy merge). */
174
+ engineMaxNodeActivations?: number;
175
+ /** Effective max subworkflow depth from the parent run (propagated to child policy merge). */
176
+ engineMaxSubworkflowDepth?: number;
177
+ }
178
+
179
+ export interface RunDataSnapshot {
180
+ getOutputs(nodeId: NodeId): NodeOutputs | undefined;
181
+ getOutputItems(nodeId: NodeId, output?: OutputPortKey): Items;
182
+ getOutputItem(nodeId: NodeId, itemIndex: number, output?: OutputPortKey): Item | undefined;
183
+ }
184
+
185
+ export interface MutableRunData extends RunDataSnapshot {
186
+ setOutputs(nodeId: NodeId, outputs: NodeOutputs): void;
187
+ dump(): Record<NodeId, NodeOutputs>;
188
+ }
189
+
190
+ export interface RunDataFactory {
191
+ create(initial?: Record<NodeId, NodeOutputs>): MutableRunData;
192
+ }
193
+
194
+ export interface RunIdFactory {
195
+ makeRunId(): RunId;
196
+ }
197
+
198
+ export interface ActivationIdFactory {
199
+ makeActivationId(): NodeActivationId;
200
+ }
201
+
202
+ export type UpstreamRefPlaceholder = `$${number}`;
203
+ export const branchRef = (index: number) => `$${index}` as UpstreamRefPlaceholder;
204
+
205
+ export type ExecutionMode = "local" | "worker";
206
+
207
+ export interface NodeSchedulerDecision {
208
+ mode: ExecutionMode;
209
+ queue?: string;
210
+ }
211
+
212
+ export interface NodeOffloadPolicy {
213
+ decide(args: { workflowId: WorkflowId; nodeId: NodeId; config: NodeConfigBase }): NodeSchedulerDecision;
214
+ }
215
+
216
+ /** Whether to persist run execution data after the workflow finishes. */
217
+ export type WorkflowStoragePolicyMode = "ALL" | "SUCCESS" | "ERROR" | "NEVER";
218
+
219
+ export type WorkflowStoragePolicySpec = WorkflowStoragePolicyMode | TypeToken<WorkflowStoragePolicyResolver>;
220
+
221
+ export interface WorkflowStoragePolicyResolver {
222
+ shouldPersist(args: WorkflowStoragePolicyDecisionArgs): boolean | Promise<boolean>;
223
+ }
224
+
225
+ export interface WorkflowStoragePolicyDecisionArgs {
226
+ readonly runId: RunId;
227
+ readonly workflowId: WorkflowId;
228
+ readonly workflow: WorkflowDefinition;
229
+ readonly finalStatus: "completed" | "failed";
230
+ readonly startedAt: string;
231
+ readonly finishedAt: string;
232
+ }
233
+
234
+ export interface WorkflowPrunePolicySpec {
235
+ readonly runDataRetentionSeconds?: number;
236
+ readonly binaryRetentionSeconds?: number;
237
+ }
238
+
239
+ export interface PersistedRunPolicySnapshot {
240
+ readonly retentionSeconds?: number;
241
+ readonly binaryRetentionSeconds?: number;
242
+ readonly storagePolicy: WorkflowStoragePolicyMode;
243
+ }
244
+
245
+ export interface WorkflowErrorHandler {
246
+ onError(ctx: WorkflowErrorContext): void | Promise<void>;
247
+ }
248
+
249
+ export interface WorkflowErrorContext {
250
+ readonly runId: RunId;
251
+ readonly workflowId: WorkflowId;
252
+ readonly workflow: WorkflowDefinition;
253
+ readonly failedNodeId: NodeId;
254
+ readonly error: Error;
255
+ readonly startedAt: string;
256
+ readonly finishedAt: string;
257
+ }
258
+
259
+ export type WorkflowErrorHandlerSpec = TypeToken<WorkflowErrorHandler> | WorkflowErrorHandler;
260
+
261
+ export interface NodeErrorHandlerArgs<TConfig extends NodeConfigBase = NodeConfigBase> {
262
+ readonly kind: "single" | "multi";
263
+ readonly items: Items;
264
+ readonly inputsByPort: Readonly<Record<InputPortKey, Items>> | undefined;
265
+ readonly ctx: import("./runtimeTypes").NodeExecutionContext<TConfig>;
266
+ readonly error: Error;
267
+ }
268
+
269
+ export interface NodeErrorHandler {
270
+ handle<TConfig extends NodeConfigBase>(args: NodeErrorHandlerArgs<TConfig>): Promise<NodeOutputs>;
271
+ }
272
+
273
+ export type NodeErrorHandlerSpec = TypeToken<NodeErrorHandler> | NodeErrorHandler;
274
+
275
+ /** Runtime defaults when workflow omits prune/storage fields (typically from host env). */
276
+ export interface WorkflowPolicyRuntimeDefaults {
277
+ readonly retentionSeconds?: number;
278
+ readonly binaryRetentionSeconds?: number;
279
+ readonly storagePolicy?: WorkflowStoragePolicyMode;
280
+ }
@@ -0,0 +1,60 @@
1
+ import type { TypeToken } from "./index";
2
+ import type { RunEventBus } from "../events/runEvents";
3
+ import type { EngineExecutionLimitsPolicy } from "../policies/executionLimits/EngineExecutionLimitsPolicy";
4
+ import type {
5
+ ActivationIdFactory,
6
+ BinaryStorage,
7
+ CredentialSessionService,
8
+ CredentialTypeRegistry,
9
+ ExecutionContextFactory,
10
+ LiveWorkflowRepository,
11
+ NodeActivationScheduler,
12
+ NodeResolver,
13
+ PersistedWorkflowTokenRegistryLike,
14
+ RunDataFactory,
15
+ RunIdFactory,
16
+ TriggerSetupStateRepository,
17
+ WorkflowExecutionRepository,
18
+ WorkflowNodeInstanceFactory,
19
+ WorkflowActivationPolicy,
20
+ WorkflowRepository,
21
+ WorkflowRunnerService,
22
+ } from "../types";
23
+
24
+ export const CoreTokens = {
25
+ PersistedWorkflowTokenRegistry: Symbol.for(
26
+ "codemation.core.PersistedWorkflowTokenRegistry",
27
+ ) as TypeToken<PersistedWorkflowTokenRegistryLike>,
28
+ CredentialSessionService: Symbol.for(
29
+ "codemation.core.CredentialSessionService",
30
+ ) as TypeToken<CredentialSessionService>,
31
+ CredentialTypeRegistry: Symbol.for("codemation.core.CredentialTypeRegistry") as TypeToken<CredentialTypeRegistry>,
32
+ WorkflowRunnerService: Symbol.for("codemation.core.WorkflowRunnerService") as TypeToken<WorkflowRunnerService>,
33
+ LiveWorkflowRepository: Symbol.for("codemation.core.LiveWorkflowRepository") as TypeToken<LiveWorkflowRepository>,
34
+ WorkflowRepository: Symbol.for("codemation.core.WorkflowRepository") as TypeToken<WorkflowRepository>,
35
+ NodeResolver: Symbol.for("codemation.core.NodeResolver") as TypeToken<NodeResolver>,
36
+ WorkflowNodeInstanceFactory: Symbol.for(
37
+ "codemation.core.WorkflowNodeInstanceFactory",
38
+ ) as TypeToken<WorkflowNodeInstanceFactory>,
39
+ RunIdFactory: Symbol.for("codemation.core.RunIdFactory") as TypeToken<RunIdFactory>,
40
+ ActivationIdFactory: Symbol.for("codemation.core.ActivationIdFactory") as TypeToken<ActivationIdFactory>,
41
+ WorkflowExecutionRepository: Symbol.for(
42
+ "codemation.core.WorkflowExecutionRepository",
43
+ ) as TypeToken<WorkflowExecutionRepository>,
44
+ TriggerSetupStateRepository: Symbol.for(
45
+ "codemation.core.TriggerSetupStateRepository",
46
+ ) as TypeToken<TriggerSetupStateRepository>,
47
+ NodeActivationScheduler: Symbol.for("codemation.core.NodeActivationScheduler") as TypeToken<NodeActivationScheduler>,
48
+ RunDataFactory: Symbol.for("codemation.core.RunDataFactory") as TypeToken<RunDataFactory>,
49
+ ExecutionContextFactory: Symbol.for("codemation.core.ExecutionContextFactory") as TypeToken<ExecutionContextFactory>,
50
+ RunEventBus: Symbol.for("codemation.core.RunEventBus") as TypeToken<RunEventBus>,
51
+ BinaryStorage: Symbol.for("codemation.core.BinaryStorage") as TypeToken<BinaryStorage>,
52
+ WebhookBasePath: Symbol.for("codemation.core.WebhookBasePath") as TypeToken<string>,
53
+ /** Engine execution limits (defaults + optional host overrides). Consumers may bind a custom instance to override. */
54
+ EngineExecutionLimitsPolicy: Symbol.for(
55
+ "codemation.core.EngineExecutionLimitsPolicy",
56
+ ) as TypeToken<EngineExecutionLimitsPolicy>,
57
+ WorkflowActivationPolicy: Symbol.for(
58
+ "codemation.core.WorkflowActivationPolicy",
59
+ ) as TypeToken<WorkflowActivationPolicy>,
60
+ } as const;
@@ -0,0 +1,24 @@
1
+ import "reflect-metadata";
2
+
3
+ export { CoreTokens } from "./CoreTokens";
4
+ export {
5
+ container,
6
+ delay,
7
+ inject,
8
+ injectAll,
9
+ injectable,
10
+ instanceCachingFactory,
11
+ instancePerContainerCachingFactory,
12
+ predicateAwareClassFactory,
13
+ registry,
14
+ singleton,
15
+ } from "tsyringe";
16
+ export type {
17
+ DependencyContainer as Container,
18
+ DependencyContainer,
19
+ Disposable,
20
+ InjectionToken,
21
+ Lifecycle,
22
+ RegistrationOptions,
23
+ InjectionToken as TypeToken,
24
+ } from "tsyringe";
@@ -0,0 +1,67 @@
1
+ import type {
2
+ PersistedRunState,
3
+ RunId,
4
+ RunPruneCandidate,
5
+ RunSummary,
6
+ WorkflowExecutionListingRepository,
7
+ WorkflowExecutionPruneRepository,
8
+ WorkflowExecutionRepository,
9
+ WorkflowId,
10
+ } from "../types";
11
+ import type { RunEventBus } from "./runEvents";
12
+
13
+ export class EventPublishingWorkflowExecutionRepository
14
+ implements WorkflowExecutionRepository, WorkflowExecutionListingRepository, WorkflowExecutionPruneRepository
15
+ {
16
+ constructor(
17
+ private readonly inner: WorkflowExecutionRepository,
18
+ private readonly eventBus: RunEventBus,
19
+ private readonly now: () => Date = () => new Date(),
20
+ ) {}
21
+
22
+ async createRun(args: Parameters<WorkflowExecutionRepository["createRun"]>[0]): Promise<void> {
23
+ await this.inner.createRun(args);
24
+ await this.eventBus.publish({
25
+ kind: "runCreated",
26
+ runId: args.runId,
27
+ workflowId: args.workflowId,
28
+ parent: args.parent,
29
+ at: this.now().toISOString(),
30
+ });
31
+ }
32
+
33
+ async load(runId: RunId): Promise<PersistedRunState | undefined> {
34
+ return await this.inner.load(runId);
35
+ }
36
+
37
+ async save(state: PersistedRunState): Promise<void> {
38
+ await this.inner.save(state);
39
+ await this.eventBus.publish({
40
+ kind: "runSaved",
41
+ runId: state.runId,
42
+ workflowId: state.workflowId,
43
+ parent: state.parent,
44
+ at: this.now().toISOString(),
45
+ state,
46
+ });
47
+ }
48
+
49
+ async deleteRun(runId: RunId): Promise<void> {
50
+ if (!this.inner.deleteRun) return;
51
+ await this.inner.deleteRun(runId);
52
+ }
53
+
54
+ async listRuns(args?: Readonly<{ workflowId?: WorkflowId; limit?: number }>): Promise<ReadonlyArray<RunSummary>> {
55
+ const listingRepository = this.inner as unknown as Partial<WorkflowExecutionListingRepository>;
56
+ if (!listingRepository.listRuns) return [];
57
+ return await listingRepository.listRuns(args);
58
+ }
59
+
60
+ async listRunsOlderThan(
61
+ args: Readonly<{ beforeIso: string; limit?: number }>,
62
+ ): Promise<ReadonlyArray<RunPruneCandidate>> {
63
+ const pruneRepository = this.inner as unknown as Partial<WorkflowExecutionPruneRepository>;
64
+ if (!pruneRepository.listRunsOlderThan) return [];
65
+ return await pruneRepository.listRunsOlderThan(args);
66
+ }
67
+ }
@@ -0,0 +1,37 @@
1
+ import type { WorkflowId } from "../types";
2
+
3
+ import type { RunEvent, RunEventBus, RunEventSubscription } from "./runEvents";
4
+
5
+ import { InMemoryRunEventSubscription } from "./InMemoryRunEventSubscription";
6
+
7
+ export class InMemoryRunEventBus implements RunEventBus {
8
+ private readonly globalListeners = new Set<(event: RunEvent) => void>();
9
+ private readonly listenersByWorkflowId = new Map<WorkflowId, Set<(event: RunEvent) => void>>();
10
+
11
+ async publish(event: RunEvent): Promise<void> {
12
+ for (const listener of this.globalListeners) listener(event);
13
+ for (const listener of this.listenersByWorkflowId.get(event.workflowId) ?? []) listener(event);
14
+ }
15
+
16
+ async subscribe(onEvent: (event: RunEvent) => void): Promise<RunEventSubscription> {
17
+ this.globalListeners.add(onEvent);
18
+ return new InMemoryRunEventSubscription(() => {
19
+ this.globalListeners.delete(onEvent);
20
+ });
21
+ }
22
+
23
+ async subscribeToWorkflow(workflowId: WorkflowId, onEvent: (event: RunEvent) => void): Promise<RunEventSubscription> {
24
+ const existing = this.listenersByWorkflowId.get(workflowId) ?? new Set<(event: RunEvent) => void>();
25
+ existing.add(onEvent);
26
+ this.listenersByWorkflowId.set(workflowId, existing);
27
+
28
+ return new InMemoryRunEventSubscription(() => {
29
+ const listeners = this.listenersByWorkflowId.get(workflowId);
30
+ if (!listeners) return;
31
+ listeners.delete(onEvent);
32
+ if (listeners.size === 0) this.listenersByWorkflowId.delete(workflowId);
33
+ });
34
+ }
35
+ }
36
+
37
+ export { InMemoryRunEventSubscription } from "./InMemoryRunEventSubscription";
@@ -0,0 +1,9 @@
1
+ import type { RunEventSubscription } from "./runEvents";
2
+
3
+ export class InMemoryRunEventSubscription implements RunEventSubscription {
4
+ constructor(private readonly onClose: () => void) {}
5
+
6
+ async close(): Promise<void> {
7
+ this.onClose();
8
+ }
9
+ }
@@ -0,0 +1,22 @@
1
+ import type { RunEventBus } from "./runEvents";
2
+ import type { NodeExecutionSnapshot } from "../types";
3
+
4
+ /** Publishes node lifecycle snapshots onto the run {@link RunEventBus}. */
5
+ export class NodeEventPublisher {
6
+ constructor(private readonly eventBus: RunEventBus | undefined) {}
7
+
8
+ async publish(
9
+ kind: "nodeQueued" | "nodeStarted" | "nodeCompleted" | "nodeFailed",
10
+ snapshot: NodeExecutionSnapshot,
11
+ ): Promise<void> {
12
+ if (!this.eventBus) return;
13
+ await this.eventBus.publish({
14
+ kind,
15
+ runId: snapshot.runId,
16
+ workflowId: snapshot.workflowId,
17
+ parent: snapshot.parent,
18
+ at: snapshot.updatedAt,
19
+ snapshot,
20
+ });
21
+ }
22
+ }
@@ -0,0 +1,4 @@
1
+ export { NodeEventPublisher } from "./NodeEventPublisher";
2
+ export { InMemoryRunEventBus } from "./InMemoryRunEventBusRegistry";
3
+ export { EventPublishingWorkflowExecutionRepository } from "./EventPublishingWorkflowExecutionRepository";
4
+ export * from "./runEvents";
@@ -0,0 +1,54 @@
1
+ import type { NodeExecutionSnapshot, ParentExecutionRef, PersistedRunState, RunId, WorkflowId } from "../types";
2
+
3
+ export type RunEvent =
4
+ | Readonly<{ kind: "runCreated"; runId: RunId; workflowId: WorkflowId; parent?: ParentExecutionRef; at: string }>
5
+ | Readonly<{
6
+ kind: "runSaved";
7
+ runId: RunId;
8
+ workflowId: WorkflowId;
9
+ parent?: ParentExecutionRef;
10
+ at: string;
11
+ state: PersistedRunState;
12
+ }>
13
+ | Readonly<{
14
+ kind: "nodeQueued";
15
+ runId: RunId;
16
+ workflowId: WorkflowId;
17
+ parent?: ParentExecutionRef;
18
+ at: string;
19
+ snapshot: NodeExecutionSnapshot;
20
+ }>
21
+ | Readonly<{
22
+ kind: "nodeStarted";
23
+ runId: RunId;
24
+ workflowId: WorkflowId;
25
+ parent?: ParentExecutionRef;
26
+ at: string;
27
+ snapshot: NodeExecutionSnapshot;
28
+ }>
29
+ | Readonly<{
30
+ kind: "nodeCompleted";
31
+ runId: RunId;
32
+ workflowId: WorkflowId;
33
+ parent?: ParentExecutionRef;
34
+ at: string;
35
+ snapshot: NodeExecutionSnapshot;
36
+ }>
37
+ | Readonly<{
38
+ kind: "nodeFailed";
39
+ runId: RunId;
40
+ workflowId: WorkflowId;
41
+ parent?: ParentExecutionRef;
42
+ at: string;
43
+ snapshot: NodeExecutionSnapshot;
44
+ }>;
45
+
46
+ export interface RunEventSubscription {
47
+ close(): Promise<void>;
48
+ }
49
+
50
+ export interface RunEventBus {
51
+ publish(event: RunEvent): Promise<void>;
52
+ subscribe(onEvent: (event: RunEvent) => void): Promise<RunEventSubscription>;
53
+ subscribeToWorkflow(workflowId: WorkflowId, onEvent: (event: RunEvent) => void): Promise<RunEventSubscription>;
54
+ }
@@ -0,0 +1,125 @@
1
+ import type {
2
+ ConnectionInvocationRecord,
3
+ EngineRunCounters,
4
+ NodeActivationRequest,
5
+ NodeActivationScheduler,
6
+ NodeExecutionSnapshot,
7
+ NodeId,
8
+ ParentExecutionRef,
9
+ PendingNodeExecution,
10
+ PersistedRunControlState,
11
+ RunDataFactory,
12
+ RunExecutionOptions,
13
+ RunId,
14
+ RunQueueEntry,
15
+ RunResult,
16
+ WorkflowExecutionRepository,
17
+ WorkflowId,
18
+ } from "../types";
19
+
20
+ import { RunQueuePlanner } from "../planning/RunQueuePlanner";
21
+
22
+ import { NodeEventPublisher } from "../events/NodeEventPublisher";
23
+ import { NodeExecutionSnapshotFactory } from "./NodeExecutionSnapshotFactory";
24
+ import { NodeInputsByPortFactory } from "./NodeInputsByPortFactory";
25
+
26
+ type PersistedRunStateRecord = NonNullable<Awaited<ReturnType<WorkflowExecutionRepository["load"]>>>;
27
+
28
+ type ActivationSchedulerPort = Pick<NodeActivationScheduler, "enqueue"> &
29
+ Pick<Partial<NodeActivationScheduler>, "notifyPendingStatePersisted">;
30
+
31
+ export type ActivationEnqueueRequest = {
32
+ runId: RunId;
33
+ workflowId: WorkflowId;
34
+ startedAt: string;
35
+ parent?: ParentExecutionRef;
36
+ executionOptions?: RunExecutionOptions;
37
+ control: PersistedRunControlState | undefined;
38
+ workflowSnapshot: PersistedRunStateRecord["workflowSnapshot"];
39
+ mutableState: PersistedRunStateRecord["mutableState"];
40
+ policySnapshot: PersistedRunStateRecord["policySnapshot"];
41
+ pendingQueue: RunQueueEntry[];
42
+ request: NodeActivationRequest;
43
+ previousNodeSnapshotsByNodeId: Record<NodeId, NodeExecutionSnapshot>;
44
+ planner: RunQueuePlanner;
45
+ engineCounters?: EngineRunCounters;
46
+ connectionInvocations?: ReadonlyArray<ConnectionInvocationRecord>;
47
+ };
48
+
49
+ export class ActivationEnqueueService {
50
+ constructor(
51
+ private readonly activationScheduler: ActivationSchedulerPort,
52
+ private readonly workflowExecutionRepository: WorkflowExecutionRepository,
53
+ private readonly nodeEventPublisher: NodeEventPublisher,
54
+ ) {}
55
+
56
+ async enqueueActivation(args: ActivationEnqueueRequest): Promise<RunResult> {
57
+ const { result, queuedSnapshot } = await this.enqueueActivationWithSnapshot(args);
58
+ await this.nodeEventPublisher.publish("nodeQueued", queuedSnapshot);
59
+ return result;
60
+ }
61
+
62
+ async enqueueActivationWithSnapshot(
63
+ args: ActivationEnqueueRequest,
64
+ ): Promise<{ result: RunResult; queuedSnapshot: NodeExecutionSnapshot }> {
65
+ const receipt = await this.activationScheduler.enqueue(args.request);
66
+ const inputsByPort = NodeInputsByPortFactory.fromRequest(args.request);
67
+ const itemsIn =
68
+ args.request.kind === "multi"
69
+ ? args.planner.sumItemsByPort(args.request.inputsByPort)
70
+ : args.request.input.length;
71
+ const enqueuedAt = new Date().toISOString();
72
+ const pending: PendingNodeExecution = {
73
+ runId: args.runId,
74
+ activationId: args.request.activationId,
75
+ workflowId: args.workflowId,
76
+ nodeId: args.request.nodeId,
77
+ itemsIn,
78
+ inputsByPort,
79
+ receiptId: receipt.receiptId,
80
+ queue: receipt.queue,
81
+ batchId: args.request.batchId,
82
+ enqueuedAt,
83
+ };
84
+ const queuedSnapshot = NodeExecutionSnapshotFactory.queued({
85
+ runId: args.runId,
86
+ workflowId: args.workflowId,
87
+ nodeId: args.request.nodeId,
88
+ activationId: args.request.activationId,
89
+ parent: args.parent,
90
+ queuedAt: enqueuedAt,
91
+ inputsByPort,
92
+ });
93
+
94
+ await this.workflowExecutionRepository.save({
95
+ runId: args.runId,
96
+ workflowId: args.workflowId,
97
+ startedAt: args.startedAt,
98
+ parent: args.parent,
99
+ executionOptions: args.executionOptions,
100
+ control: args.control,
101
+ workflowSnapshot: args.workflowSnapshot,
102
+ mutableState: args.mutableState,
103
+ policySnapshot: args.policySnapshot,
104
+ engineCounters: args.engineCounters,
105
+ connectionInvocations: args.connectionInvocations ? [...args.connectionInvocations] : [],
106
+ status: "pending",
107
+ pending,
108
+ queue: args.pendingQueue.map((entry) => ({ ...entry })),
109
+ outputsByNode: (args.request.ctx.data as ReturnType<RunDataFactory["create"]>).dump(),
110
+ nodeSnapshotsByNodeId: {
111
+ ...args.previousNodeSnapshotsByNodeId,
112
+ [args.request.nodeId]: queuedSnapshot,
113
+ },
114
+ });
115
+ this.notifyPendingStatePersisted(args.runId);
116
+ return {
117
+ result: { runId: args.runId, workflowId: args.workflowId, startedAt: args.startedAt, status: "pending", pending },
118
+ queuedSnapshot,
119
+ };
120
+ }
121
+
122
+ private notifyPendingStatePersisted(runId: RunId): void {
123
+ this.activationScheduler.notifyPendingStatePersisted?.(runId);
124
+ }
125
+ }