@swirls/looms 0.0.2 → 0.2.0

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 (375) hide show
  1. package/CHANGELOG.md +24 -2
  2. package/dist/actor/cell.d.ts +9 -4
  3. package/dist/actor/cell.js +7 -11
  4. package/dist/actor/host.d.ts +7 -3
  5. package/dist/actor/host.js +57 -33
  6. package/dist/actor/index.d.ts +1 -1
  7. package/dist/actor/index.js +1 -1
  8. package/dist/actor/routing.d.ts +12 -1
  9. package/dist/actor/routing.js +57 -51
  10. package/dist/agent/agent-session.d.ts +5 -0
  11. package/dist/agent/agent-session.js +270 -0
  12. package/dist/agent/debugger/agent-chat.d.ts +2 -0
  13. package/dist/agent/debugger/agent-chat.js +176 -0
  14. package/dist/agent/debugger/index.d.ts +5 -0
  15. package/dist/agent/debugger/index.js +19 -0
  16. package/dist/agent/debugger/summarize.d.ts +2 -0
  17. package/dist/agent/debugger/summarize.js +51 -0
  18. package/dist/agent/debugger/token-usage.d.ts +3 -0
  19. package/dist/agent/debugger/token-usage.js +11 -0
  20. package/dist/agent/definitions-store.d.ts +2 -3
  21. package/dist/agent/definitions-store.js +2 -4
  22. package/dist/agent/definitions.d.ts +47 -29
  23. package/dist/agent/definitions.js +39 -12
  24. package/dist/agent/effects.d.ts +359 -2
  25. package/dist/agent/effects.js +60 -34
  26. package/dist/agent/events.d.ts +175 -19
  27. package/dist/agent/events.js +45 -10
  28. package/dist/agent/index.d.ts +1 -0
  29. package/dist/agent/index.js +1 -0
  30. package/dist/agent/llm.d.ts +11 -2
  31. package/dist/agent/llm.js +13 -3
  32. package/dist/agent/module.d.ts +812 -78
  33. package/dist/agent/module.js +16 -4
  34. package/dist/agent/scope.d.ts +174 -18
  35. package/dist/agent/signals.d.ts +26 -1
  36. package/dist/agent/signals.js +79 -0
  37. package/dist/agent/threads.d.ts +3 -33
  38. package/dist/agent/threads.js +20 -25
  39. package/dist/agent/tool-schema.d.ts +1 -17
  40. package/dist/agent/tool-schema.js +3 -43
  41. package/dist/agent/types.d.ts +49 -4
  42. package/dist/agent/types.js +5 -5
  43. package/dist/ai-vercel/index.d.ts +1 -0
  44. package/dist/ai-vercel/index.js +1 -0
  45. package/dist/ai-vercel/messages.js +22 -7
  46. package/dist/ai-vercel/vercel-evaluator.d.ts +36 -0
  47. package/dist/ai-vercel/vercel-evaluator.js +73 -0
  48. package/dist/ai-vercel/vercel-llm.js +64 -44
  49. package/dist/approval/debugger/approvals-view.d.ts +3 -0
  50. package/dist/approval/debugger/approvals-view.js +16 -0
  51. package/dist/approval/debugger/index.d.ts +4 -0
  52. package/dist/approval/debugger/index.js +11 -0
  53. package/dist/approval/debugger/summarize.d.ts +2 -0
  54. package/dist/approval/debugger/summarize.js +17 -0
  55. package/dist/approval/effects.d.ts +89 -0
  56. package/dist/approval/module.d.ts +179 -29
  57. package/dist/approval/projections.d.ts +0 -14
  58. package/dist/approval/projections.js +20 -3
  59. package/dist/approval/signals.d.ts +2 -0
  60. package/dist/approval/signals.js +18 -2
  61. package/dist/cli/cli.js +2 -0
  62. package/dist/cli/commands.js +12 -16
  63. package/dist/client/client.d.ts +1213 -18
  64. package/dist/client/client.js +120 -120
  65. package/dist/client/index.d.ts +1 -1
  66. package/dist/client/index.js +1 -1
  67. package/dist/client/sse.d.ts +13 -0
  68. package/dist/client/sse.js +38 -44
  69. package/dist/cloudflare/alarm-scheduler.d.ts +12 -2
  70. package/dist/cloudflare/alarm-scheduler.js +34 -7
  71. package/dist/cloudflare/durable-object.d.ts +10 -2
  72. package/dist/cloudflare/durable-object.js +59 -28
  73. package/dist/cloudflare/event-store.d.ts +7 -2
  74. package/dist/cloudflare/event-store.js +8 -7
  75. package/dist/cloudflare/index.d.ts +2 -2
  76. package/dist/cloudflare/index.js +2 -2
  77. package/dist/cloudflare/router.d.ts +1 -1
  78. package/dist/cloudflare/router.js +15 -16
  79. package/dist/core/catalog.d.ts +3 -3
  80. package/dist/core/catalog.js +2 -5
  81. package/dist/core/coalesce.js +5 -3
  82. package/dist/core/compose.d.ts +2 -1
  83. package/dist/core/compose.js +19 -2
  84. package/dist/core/debugger-host.d.ts +16 -0
  85. package/dist/core/debugger-host.js +1 -0
  86. package/dist/core/definition-store.d.ts +11 -0
  87. package/dist/core/definition-store.js +6 -0
  88. package/dist/core/effects.d.ts +127 -15
  89. package/dist/core/effects.js +89 -17
  90. package/dist/core/envelope.d.ts +27 -7
  91. package/dist/core/envelope.js +20 -6
  92. package/dist/core/event-codec.d.ts +4 -2
  93. package/dist/core/event-codec.js +10 -5
  94. package/dist/core/event-index.js +1 -3
  95. package/dist/core/fold.d.ts +3 -0
  96. package/dist/core/fold.js +171 -24
  97. package/dist/core/ids.d.ts +5 -0
  98. package/dist/core/ids.js +35 -2
  99. package/dist/core/index.d.ts +7 -1
  100. package/dist/core/index.js +6 -1
  101. package/dist/core/kind.d.ts +22 -0
  102. package/dist/core/kind.js +17 -0
  103. package/dist/core/limits.d.ts +34 -0
  104. package/dist/core/limits.js +46 -0
  105. package/dist/core/match.d.ts +1 -0
  106. package/dist/core/match.js +10 -1
  107. package/dist/core/module-scope.d.ts +22 -20
  108. package/dist/core/module-scope.js +38 -28
  109. package/dist/core/module.d.ts +18 -5
  110. package/dist/core/module.js +4 -0
  111. package/dist/core/projection.d.ts +13 -13
  112. package/dist/core/projection.js +9 -5
  113. package/dist/core/protocol.d.ts +68 -11
  114. package/dist/core/protocol.js +82 -11
  115. package/dist/core/published.d.ts +43 -0
  116. package/dist/core/published.js +44 -0
  117. package/dist/core/replay.d.ts +312 -3
  118. package/dist/core/replay.js +11 -1
  119. package/dist/core/schema.d.ts +11 -20
  120. package/dist/core/schema.js +63 -80
  121. package/dist/core/serialize.js +2 -4
  122. package/dist/core/snapshot-store.d.ts +6 -1
  123. package/dist/core/snapshot-store.js +15 -2
  124. package/dist/core/snapshots.d.ts +5 -1
  125. package/dist/core/snapshots.js +10 -15
  126. package/dist/core/sqlite-store.js +95 -11
  127. package/dist/core/state.d.ts +142 -4
  128. package/dist/core/state.js +78 -0
  129. package/dist/core/store.d.ts +38 -3
  130. package/dist/core/store.js +77 -22
  131. package/dist/core/thread.d.ts +10 -9
  132. package/dist/core/types.d.ts +5 -8
  133. package/dist/core/types.js +28 -24
  134. package/dist/core/validate-event.js +14 -4
  135. package/dist/core/worker-callback.d.ts +17 -0
  136. package/dist/core/worker-callback.js +1 -0
  137. package/dist/debugger/app/assets/index-B3Ah8WAE.css +2 -0
  138. package/dist/debugger/app/assets/index-Qb371t_O.js +22 -0
  139. package/dist/debugger/app/assets/rolldown-runtime-CbXtAM7H.js +1 -0
  140. package/dist/debugger/app/assets/routes-CjtEHgPQ.js +47 -0
  141. package/dist/debugger/app/index.html +14 -0
  142. package/dist/debugger/components/composer.d.ts +17 -0
  143. package/dist/debugger/components/composer.js +25 -0
  144. package/dist/debugger/components/debugger-split.d.ts +2 -1
  145. package/dist/debugger/components/debugger-split.js +2 -2
  146. package/dist/debugger/components/event-inspector.d.ts +2 -1
  147. package/dist/debugger/components/event-inspector.js +25 -16
  148. package/dist/debugger/components/event-stream.d.ts +2 -1
  149. package/dist/debugger/components/event-stream.js +14 -74
  150. package/dist/debugger/components/follow-list.d.ts +19 -0
  151. package/dist/debugger/components/follow-list.js +96 -0
  152. package/dist/debugger/components/json-tree.d.ts +11 -0
  153. package/dist/debugger/components/json-tree.js +120 -0
  154. package/dist/debugger/components/json-view.js +2 -2
  155. package/dist/debugger/components/run-tree.js +53 -20
  156. package/dist/debugger/components/status-dot.d.ts +4 -0
  157. package/dist/debugger/components/status-dot.js +6 -2
  158. package/dist/debugger/context.d.ts +14 -0
  159. package/dist/debugger/context.js +17 -0
  160. package/dist/debugger/contracts.d.ts +7 -4
  161. package/dist/debugger/events/builtin-families.d.ts +3 -0
  162. package/dist/debugger/events/builtin-families.js +9 -0
  163. package/dist/debugger/events/catalog.d.ts +3 -4
  164. package/dist/debugger/events/catalog.js +27 -17
  165. package/dist/debugger/events/protocol-summarize.d.ts +1 -2
  166. package/dist/debugger/events/protocol-summarize.js +42 -24
  167. package/dist/debugger/index.d.ts +20 -6
  168. package/dist/debugger/index.js +19 -5
  169. package/dist/debugger/lib/cn.d.ts +1 -0
  170. package/dist/debugger/lib/cn.js +3 -0
  171. package/dist/debugger/lib/event-meta.d.ts +2 -3
  172. package/dist/debugger/lib/event-meta.js +6 -12
  173. package/dist/debugger/lib/json.d.ts +25 -0
  174. package/dist/debugger/lib/json.js +87 -0
  175. package/dist/debugger/lib/payload.d.ts +7 -0
  176. package/dist/debugger/lib/payload.js +11 -0
  177. package/dist/debugger/lib/time.d.ts +3 -0
  178. package/dist/debugger/lib/time.js +24 -0
  179. package/dist/debugger/plugin.d.ts +36 -0
  180. package/dist/debugger/plugin.js +14 -0
  181. package/dist/debugger/server/index.d.ts +14 -0
  182. package/dist/debugger/server/index.js +114 -0
  183. package/dist/debugger/shell/debugger-shell.d.ts +15 -0
  184. package/dist/debugger/shell/debugger-shell.js +43 -0
  185. package/dist/debugger/shell/definition-key.d.ts +3 -0
  186. package/dist/debugger/shell/definition-key.js +4 -0
  187. package/dist/debugger/shell/events-pane.d.ts +12 -0
  188. package/dist/debugger/shell/events-pane.js +25 -0
  189. package/dist/debugger/shell/projections-panel.d.ts +4 -0
  190. package/dist/debugger/shell/projections-panel.js +59 -0
  191. package/dist/debugger/shell/run-controls.d.ts +4 -0
  192. package/dist/debugger/shell/run-controls.js +72 -0
  193. package/dist/debugger/shell/run-search.d.ts +6 -0
  194. package/dist/debugger/shell/run-search.js +102 -0
  195. package/dist/debugger/shell/run-type-menu.d.ts +6 -0
  196. package/dist/debugger/shell/run-type-menu.js +11 -0
  197. package/dist/debugger/shell/schema-form.d.ts +31 -0
  198. package/dist/debugger/shell/schema-form.js +117 -0
  199. package/dist/debugger/shell/start-form.d.ts +3 -0
  200. package/dist/debugger/shell/start-form.js +75 -0
  201. package/dist/debugger/shell/use-start-run.d.ts +14 -0
  202. package/dist/debugger/shell/use-start-run.js +32 -0
  203. package/dist/debugger/shell/workspace.d.ts +6 -0
  204. package/dist/debugger/shell/workspace.js +15 -0
  205. package/dist/debugger/styles.css +111 -27
  206. package/dist/debugger/ui/button.d.ts +24 -0
  207. package/dist/debugger/ui/button.js +24 -0
  208. package/dist/debugger/ui/command.d.ts +9 -0
  209. package/dist/debugger/ui/command.js +24 -0
  210. package/dist/debugger/ui/dropdown-menu.d.ts +13 -0
  211. package/dist/debugger/ui/dropdown-menu.js +37 -0
  212. package/dist/debugger/ui/panel.d.ts +14 -0
  213. package/dist/debugger/ui/panel.js +16 -0
  214. package/dist/debugger/ui/popover.d.ts +7 -0
  215. package/dist/debugger/ui/popover.js +17 -0
  216. package/dist/debugger/ui/resizable.d.ts +7 -0
  217. package/dist/debugger/ui/resizable.js +14 -0
  218. package/dist/debugger/ui/scroll-area.d.ts +2 -1
  219. package/dist/debugger/ui/scroll-area.js +5 -3
  220. package/dist/debugger/ui/select.d.ts +10 -0
  221. package/dist/debugger/ui/select.js +21 -0
  222. package/dist/debugger/ui/tabs.js +2 -2
  223. package/dist/debugger/ui/textarea.d.ts +3 -0
  224. package/dist/debugger/ui/textarea.js +7 -0
  225. package/dist/evaluator/definitions-store.d.ts +11 -0
  226. package/dist/evaluator/definitions-store.js +8 -0
  227. package/dist/evaluator/definitions.d.ts +18 -0
  228. package/dist/evaluator/definitions.js +4 -0
  229. package/dist/evaluator/effects.d.ts +226 -0
  230. package/dist/evaluator/effects.js +132 -0
  231. package/dist/evaluator/evaluator.d.ts +24 -0
  232. package/dist/evaluator/evaluator.js +67 -0
  233. package/dist/evaluator/events.d.ts +59 -0
  234. package/dist/evaluator/events.js +21 -0
  235. package/dist/evaluator/index.d.ts +11 -0
  236. package/dist/evaluator/index.js +11 -0
  237. package/dist/evaluator/module.d.ts +606 -0
  238. package/dist/evaluator/module.js +25 -0
  239. package/dist/evaluator/projections.d.ts +50 -0
  240. package/dist/evaluator/projections.js +20 -0
  241. package/dist/evaluator/scope.d.ts +59 -0
  242. package/dist/evaluator/scope.js +7 -0
  243. package/dist/evaluator/signals.d.ts +3 -0
  244. package/dist/evaluator/signals.js +17 -0
  245. package/dist/evaluator/threads.d.ts +62 -0
  246. package/dist/evaluator/threads.js +117 -0
  247. package/dist/evaluator/types.d.ts +125 -0
  248. package/dist/evaluator/types.js +51 -0
  249. package/dist/projectors/delivery.d.ts +83 -0
  250. package/dist/projectors/delivery.js +182 -0
  251. package/dist/projectors/index-model.d.ts +1 -1
  252. package/dist/projectors/index-model.js +4 -6
  253. package/dist/projectors/index.d.ts +2 -0
  254. package/dist/projectors/index.js +2 -0
  255. package/dist/projectors/memory.d.ts +1 -1
  256. package/dist/projectors/memory.js +10 -8
  257. package/dist/projectors/postgres.js +44 -58
  258. package/dist/projectors/projector.d.ts +17 -0
  259. package/dist/projectors/projector.js +26 -1
  260. package/dist/projectors/sqlite-delivery.d.ts +4 -0
  261. package/dist/projectors/sqlite-delivery.js +147 -0
  262. package/dist/projectors/sqlite.js +23 -23
  263. package/dist/projectors/with-projectors.d.ts +7 -2
  264. package/dist/projectors/with-projectors.js +27 -28
  265. package/dist/react/notify.js +11 -8
  266. package/dist/react/react.d.ts +2 -3
  267. package/dist/react/react.js +14 -30
  268. package/dist/react/sse.d.ts +1 -1
  269. package/dist/react/sse.js +1 -1
  270. package/dist/react/store.d.ts +3 -3
  271. package/dist/react/store.js +109 -119
  272. package/dist/runtime/cancellation.d.ts +16 -0
  273. package/dist/runtime/cancellation.js +129 -0
  274. package/dist/runtime/deadline-transition-planner.d.ts +31 -0
  275. package/dist/runtime/deadline-transition-planner.js +139 -0
  276. package/dist/runtime/dispatch-effect.d.ts +3 -2
  277. package/dist/runtime/dispatch-effect.js +7 -13
  278. package/dist/runtime/errors.d.ts +51 -0
  279. package/dist/runtime/errors.js +39 -0
  280. package/dist/runtime/{runtime-helpers.d.ts → helpers.d.ts} +24 -4
  281. package/dist/runtime/{runtime-helpers.js → helpers.js} +56 -19
  282. package/dist/runtime/index.d.ts +3 -3
  283. package/dist/runtime/index.js +3 -3
  284. package/dist/runtime/ingress.d.ts +15 -0
  285. package/dist/runtime/ingress.js +42 -0
  286. package/dist/runtime/local-effect-executor.d.ts +21 -0
  287. package/dist/runtime/local-effect-executor.js +137 -0
  288. package/dist/runtime/looms.d.ts +30 -4
  289. package/dist/runtime/looms.js +57 -37
  290. package/dist/runtime/observer.d.ts +45 -0
  291. package/dist/runtime/observer.js +11 -0
  292. package/dist/runtime/repository.d.ts +55 -0
  293. package/dist/runtime/repository.js +293 -0
  294. package/dist/runtime/retry-policy.d.ts +16 -0
  295. package/dist/runtime/retry-policy.js +29 -0
  296. package/dist/runtime/run-execution-context.d.ts +30 -0
  297. package/dist/runtime/run-execution-context.js +56 -0
  298. package/dist/runtime/run-start.d.ts +4 -0
  299. package/dist/runtime/run-start.js +44 -0
  300. package/dist/runtime/runtime.d.ts +6 -87
  301. package/dist/runtime/runtime.js +248 -470
  302. package/dist/runtime/server/auth.d.ts +41 -0
  303. package/dist/runtime/server/auth.js +45 -0
  304. package/dist/runtime/server/debugger-host.d.ts +11 -0
  305. package/dist/runtime/server/debugger-host.js +32 -0
  306. package/dist/runtime/server/fetch-handler.d.ts +18 -0
  307. package/dist/runtime/server/fetch-handler.js +62 -0
  308. package/dist/runtime/server/http.d.ts +38 -0
  309. package/dist/runtime/server/http.js +66 -0
  310. package/dist/runtime/server/route-table.d.ts +55 -0
  311. package/dist/runtime/server/route-table.js +74 -0
  312. package/dist/runtime/server/routes/definitions.d.ts +3 -0
  313. package/dist/runtime/server/routes/definitions.js +20 -0
  314. package/dist/runtime/server/routes/effects.d.ts +3 -0
  315. package/dist/runtime/server/routes/effects.js +59 -0
  316. package/dist/runtime/server/routes/operations.d.ts +3 -0
  317. package/dist/runtime/server/routes/operations.js +14 -0
  318. package/dist/runtime/server/routes/runs.d.ts +3 -0
  319. package/dist/runtime/server/routes/runs.js +199 -0
  320. package/dist/runtime/server.d.ts +4 -8
  321. package/dist/runtime/server.js +6 -211
  322. package/dist/runtime/sse.d.ts +2 -1
  323. package/dist/runtime/sse.js +24 -17
  324. package/dist/runtime/types.d.ts +117 -0
  325. package/dist/runtime/types.js +1 -0
  326. package/dist/runtime/wake-engine.d.ts +20 -0
  327. package/dist/runtime/wake-engine.js +311 -0
  328. package/dist/runtime/wake-scheduler.d.ts +3 -4
  329. package/dist/runtime/wake-scheduler.js +25 -31
  330. package/dist/runtime/worker-callbacks.d.ts +16 -0
  331. package/dist/runtime/worker-callbacks.js +167 -0
  332. package/dist/runtime/worker-effect-dispatch.d.ts +36 -0
  333. package/dist/runtime/worker-effect-dispatch.js +126 -0
  334. package/dist/s2/config.d.ts +1 -1
  335. package/dist/s2/config.js +1 -1
  336. package/dist/s2/lite.js +70 -82
  337. package/dist/s2/pagination.d.ts +15 -0
  338. package/dist/s2/pagination.js +36 -0
  339. package/dist/s2/projector.js +6 -5
  340. package/dist/s2/snapshot-store.js +188 -161
  341. package/dist/s2/store.d.ts +3 -21
  342. package/dist/s2/store.js +71 -165
  343. package/dist/testing/index.d.ts +15 -0
  344. package/dist/testing/index.js +53 -16
  345. package/dist/workflow/debugger/index.d.ts +4 -0
  346. package/dist/workflow/debugger/index.js +11 -0
  347. package/dist/workflow/debugger/nodes-view.d.ts +3 -0
  348. package/dist/workflow/debugger/nodes-view.js +13 -0
  349. package/dist/workflow/debugger/summarize.d.ts +2 -0
  350. package/dist/workflow/debugger/summarize.js +30 -0
  351. package/dist/workflow/definitions-store.d.ts +2 -3
  352. package/dist/workflow/definitions-store.js +2 -2
  353. package/dist/workflow/definitions.d.ts +78 -22
  354. package/dist/workflow/definitions.js +80 -14
  355. package/dist/workflow/effects.d.ts +453 -107
  356. package/dist/workflow/effects.js +214 -115
  357. package/dist/workflow/events.d.ts +149 -5
  358. package/dist/workflow/events.js +27 -5
  359. package/dist/workflow/graph.d.ts +56 -0
  360. package/dist/workflow/graph.js +207 -0
  361. package/dist/workflow/index.d.ts +1 -0
  362. package/dist/workflow/index.js +1 -0
  363. package/dist/workflow/module.d.ts +1047 -266
  364. package/dist/workflow/projections.d.ts +14 -12
  365. package/dist/workflow/projections.js +30 -8
  366. package/dist/workflow/scope.d.ts +146 -4
  367. package/dist/workflow/threads.d.ts +383 -155
  368. package/dist/workflow/threads.js +308 -110
  369. package/package.json +26 -2
  370. package/dist/debugger/events/domain-summarize.d.ts +0 -3
  371. package/dist/debugger/events/domain-summarize.js +0 -107
  372. package/dist/debugger/events/family.d.ts +0 -8
  373. package/dist/debugger/events/family.js +0 -44
  374. package/dist/runtime/events-api.d.ts +0 -4
  375. package/dist/runtime/events-api.js +0 -84
@@ -1,204 +1,285 @@
1
- import { Effect, Predicate, Schema } from 'effect';
2
- import { createThreadId, createWaitId } from '@swirls/looms/core';
3
- import { NodeStateSchema, readyNodes, } from './definitions.js';
1
+ import { Clock, Data, Effect, Predicate, Schema } from 'effect';
2
+ import { createThreadId, createWaitId, DEFAULT_DEFINITION_VERSION, } from '@swirls/looms/core';
3
+ import { NodeStateSchema, nodeResultBuilders, } from './definitions.js';
4
4
  import { WorkflowDefinitionsTag } from './definitions-store.js';
5
+ import { assertJsonWithinLimit, DEFAULT_CHECKPOINT_SIZE_LIMIT_BYTES, DEFAULT_GRAPH_CONCURRENCY, getReadyNodeIds, getSkippableNodeIds, getUnusedFallbackIds, iterationChildWorkflowId, nodeChildWorkflowId, nodeResults, nodeRunKey, } from './graph.js';
5
6
  import { workflowModule } from './scope.js';
6
7
  const ScheduleInput = Schema.Struct({
7
8
  definitionName: Schema.optional(Schema.String),
9
+ definitionVersion: Schema.String.pipe(Schema.withDecodingDefaultKey(Effect.succeed(DEFAULT_DEFINITION_VERSION))),
8
10
  nodes: Schema.optional(Schema.Record(Schema.String, NodeStateSchema)),
9
11
  input: Schema.optional(Schema.Json),
10
12
  });
11
13
  const RunNodeInput = Schema.Struct({
12
14
  definitionName: Schema.optional(Schema.String),
15
+ definitionVersion: Schema.String.pipe(Schema.withDecodingDefaultKey(Effect.succeed(DEFAULT_DEFINITION_VERSION))),
13
16
  nodeId: Schema.String,
17
+ attempt: Schema.Finite.pipe(Schema.withDecodingDefaultKey(Effect.succeed(1))),
18
+ iteration: Schema.optional(Schema.Struct({ index: Schema.Finite, previous: Schema.Json })),
14
19
  input: Schema.optional(Schema.Json),
15
- results: Schema.optional(Schema.Record(Schema.String, Schema.NullOr(Schema.Json))),
20
+ nodes: Schema.optional(Schema.Record(Schema.String, NodeStateSchema)),
16
21
  });
22
+ class WorkflowNodeError extends Data.TaggedError('WorkflowNodeError') {
23
+ constructor(cause) {
24
+ super({
25
+ cause,
26
+ message: cause instanceof Error ? cause.message : String(cause),
27
+ });
28
+ this.name = 'WorkflowNodeError';
29
+ }
30
+ }
17
31
  function isNodeResult(raw) {
18
32
  if (!Predicate.isObject(raw) || !('type' in raw)) {
19
33
  return false;
20
34
  }
21
- return (raw.type === 'value' || raw.type === 'spawn' || raw.type === 'sleep' || raw.type === 'effects');
35
+ return (raw.type === 'value' ||
36
+ raw.type === 'spawn' ||
37
+ raw.type === 'sleep' ||
38
+ raw.type === 'effects' ||
39
+ raw.type === 'switch' ||
40
+ raw.type === 'map' ||
41
+ raw.type === 'loop');
42
+ }
43
+ function threadFailed(threadId, error) {
44
+ return [{ type: 'runtime.thread.failed', payload: { threadId, error }, threadId }];
22
45
  }
23
46
  export const scheduleEffect = workflowModule.effect({
24
47
  type: 'workflow.schedule',
25
48
  input: ScheduleInput,
26
49
  execute: (input, ctx) => Effect.gen(function* () {
27
50
  const workflows = yield* WorkflowDefinitionsTag;
28
- const threadId = ctx.threadId;
29
- const definition = input.definitionName ? workflows.get(input.definitionName) : undefined;
51
+ const definition = input.definitionName
52
+ ? workflows.get(input.definitionName, input.definitionVersion)
53
+ : undefined;
30
54
  if (!definition) {
31
55
  return [];
32
56
  }
33
- const rawNodes = input.nodes ?? {};
34
- const nodes = {};
35
- for (const [id, n] of Object.entries(rawNodes)) {
36
- // SAFETY: NodeState results are valid JSON-serializable node execution outputs.
37
- nodes[id] = { status: n.status, result: n.result ?? null };
38
- }
57
+ const nodes = { ...input.nodes };
39
58
  for (const node of definition.nodes) {
40
- if (!nodes[node.id]) {
41
- nodes[node.id] = { status: 'pending', result: null };
42
- }
59
+ nodes[node.id] ??= { status: 'pending', result: null, error: null, attempts: 0 };
43
60
  }
44
- // SAFETY: Workflow input is validated and serialized as JsonValue.
45
- return scheduleEvents(definition, { nodes, input: input.input ?? null }, threadId);
61
+ return yield* scheduleEvents(definition, { nodes, input: input.input ?? null }, ctx.threadId);
46
62
  }),
47
63
  });
48
- export function scheduleEvents(definition, binding, threadId) {
49
- const running = Object.values(binding.nodes).filter((n) => n.status === 'running').length;
50
- const slots = Math.max(0, (definition.concurrency ?? 8) - running);
51
- const ready = readyNodes(definition, binding.nodes).slice(0, slots);
52
- const events = [];
53
- for (const nodeId of ready) {
54
- events.push({
55
- type: 'workflow.node.started',
56
- payload: { nodeId },
57
- threadId,
58
- });
64
+ function failurePolicyEvents(definition, nodes, threadId) {
65
+ const failed = definition.nodes.find((node) => nodes[node.id]?.status === 'failed');
66
+ if (!failed) {
67
+ return undefined;
59
68
  }
60
- if (ready.length > 0) {
61
- return events;
62
- }
63
- const pending = Object.values(binding.nodes).some((n) => n.status === 'pending' || n.status === 'running');
64
- if (pending) {
65
- return [];
69
+ const state = nodes[failed.id];
70
+ const policy = failed.failure ?? { type: 'fail' };
71
+ const error = state?.error ?? `Node ${failed.id} failed`;
72
+ switch (policy.type) {
73
+ case 'retry':
74
+ return (state?.attempts ?? 0) < policy.maxAttempts
75
+ ? [{ type: 'workflow.node.started', payload: { nodeId: failed.id }, threadId }]
76
+ : threadFailed(threadId, error);
77
+ case 'skip':
78
+ return [
79
+ {
80
+ type: 'workflow.node.skipped',
81
+ payload: { nodeId: failed.id, reason: error, cause: 'policy' },
82
+ threadId,
83
+ },
84
+ ];
85
+ case 'fallback':
86
+ return [
87
+ {
88
+ type: 'workflow.node.skipped',
89
+ payload: { nodeId: failed.id, reason: `fallback:${policy.nodeId}`, cause: 'policy' },
90
+ threadId,
91
+ },
92
+ { type: 'workflow.node.started', payload: { nodeId: policy.nodeId }, threadId },
93
+ ];
94
+ case 'fail':
95
+ return threadFailed(threadId, error);
96
+ default: {
97
+ const exhaustiveCheck = policy;
98
+ return exhaustiveCheck;
99
+ }
66
100
  }
67
- const failed = Object.entries(binding.nodes).find(([, n]) => n.status === 'failed');
68
- if (failed) {
69
- return [
70
- {
71
- type: 'runtime.thread.failed',
72
- payload: { threadId, error: `Node ${failed[0]} failed` },
101
+ }
102
+ export function scheduleEvents(definition, binding, threadId) {
103
+ return Effect.gen(function* () {
104
+ yield* assertJsonWithinLimit(binding.input, 'Workflow input', definition.inputLimitBytes);
105
+ const policyEvents = failurePolicyEvents(definition, binding.nodes, threadId);
106
+ if (policyEvents) {
107
+ return policyEvents;
108
+ }
109
+ const skipped = [
110
+ ...getSkippableNodeIds(definition, binding.nodes).map((nodeId) => ({
111
+ type: 'workflow.node.skipped',
112
+ payload: { nodeId, reason: 'inactive branch', cause: 'inactive' },
73
113
  threadId,
74
- },
114
+ })),
115
+ ...getUnusedFallbackIds(definition, binding.nodes).map((nodeId) => ({
116
+ type: 'workflow.node.skipped',
117
+ payload: { nodeId, reason: 'fallback not needed', cause: 'inactive' },
118
+ threadId,
119
+ })),
75
120
  ];
76
- }
77
- const results = {};
78
- for (const [id, node] of Object.entries(binding.nodes)) {
79
- results[id] = node.result;
80
- }
81
- const output = definition.output ? definition.output({ input: binding.input, results }) : results;
82
- return [
83
- {
84
- type: 'runtime.thread.completed',
85
- payload: { threadId, output },
86
- threadId,
87
- },
88
- ];
121
+ if (skipped.length > 0) {
122
+ return skipped;
123
+ }
124
+ const statuses = Object.values(binding.nodes).map((node) => node.status);
125
+ const running = statuses.filter((status) => status === 'running').length;
126
+ const slots = Math.max(0, (definition.concurrency ?? DEFAULT_GRAPH_CONCURRENCY) - running);
127
+ const ready = getReadyNodeIds(definition, binding.nodes).slice(0, slots);
128
+ if (ready.length > 0) {
129
+ return ready.map((nodeId) => ({
130
+ type: 'workflow.node.started',
131
+ payload: { nodeId },
132
+ threadId,
133
+ }));
134
+ }
135
+ if (statuses.some((status) => status === 'pending' || status === 'running')) {
136
+ return [];
137
+ }
138
+ const results = nodeResults(definition, binding.nodes);
139
+ const output = definition.output
140
+ ? definition.output({ input: binding.input, results })
141
+ : results;
142
+ yield* assertJsonWithinLimit(output, 'Workflow output', definition.outputLimitBytes);
143
+ return [{ type: 'runtime.thread.completed', payload: { threadId, output }, threadId }];
144
+ }).pipe(Effect.catchTag('WorkflowValueTooLargeError', (error) => Effect.succeed(threadFailed(threadId, error.message))));
89
145
  }
90
146
  export const runNodeEffect = workflowModule.effect({
91
147
  type: 'workflow.runNode',
92
148
  input: RunNodeInput,
93
149
  execute: (input, ctx) => Effect.gen(function* () {
94
150
  const workflows = yield* WorkflowDefinitionsTag;
95
- const threadId = ctx.threadId;
96
- const definition = input.definitionName ? workflows.get(input.definitionName) : undefined;
151
+ const definition = input.definitionName
152
+ ? workflows.get(input.definitionName, input.definitionVersion)
153
+ : undefined;
154
+ const run = {
155
+ threadId: ctx.threadId,
156
+ nodeId: input.nodeId,
157
+ attempt: input.attempt,
158
+ iteration: input.iteration,
159
+ input: input.input ?? null,
160
+ nodes: input.nodes ?? {},
161
+ };
97
162
  if (!definition) {
98
- return [
99
- {
100
- type: 'workflow.node.finished',
101
- payload: { nodeId: input.nodeId, result: null, error: 'Unknown workflow definition' },
102
- threadId,
103
- },
104
- ];
105
- }
106
- const rawResults = input.results ?? {};
107
- const results = {};
108
- for (const [id, val] of Object.entries(rawResults)) {
109
- // SAFETY: Node results dictionary maps node IDs to JSON values or null.
110
- results[id] = val ?? null;
163
+ return finished(run, null, 'Unknown workflow definition');
111
164
  }
112
- return yield* runNode(definition,
113
- // SAFETY: Workflow input is validated and serialized as JsonValue.
114
- { input: input.input ?? null, results }, input.nodeId, threadId);
165
+ return yield* runNode(definition, run);
115
166
  }),
116
167
  });
117
- function runNode(definition, binding, nodeId, threadId) {
168
+ function finished(run, result, error) {
169
+ return [
170
+ {
171
+ type: 'workflow.node.finished',
172
+ payload: { nodeId: run.nodeId, result, error },
173
+ threadId: run.threadId,
174
+ },
175
+ ];
176
+ }
177
+ function runNode(definition, run) {
118
178
  return Effect.gen(function* () {
119
- const nodeDef = definition.nodes.find((node) => node.id === nodeId);
179
+ const nodeDef = definition.nodes.find((node) => node.id === run.nodeId);
120
180
  if (!nodeDef) {
121
- return [
122
- {
123
- type: 'workflow.node.finished',
124
- payload: { nodeId, result: null, error: `Unknown node: ${nodeId}` },
125
- threadId,
126
- },
127
- ];
181
+ return finished(run, null, `Unknown node: ${run.nodeId}`);
128
182
  }
129
- const results = binding.results;
130
183
  const raw = yield* Effect.tryPromise({
131
184
  try: () => Promise.resolve(nodeDef.run({
132
- threadId,
133
- nodeId,
134
- input: binding.input,
135
- results,
136
- spawn: (child, input) => ({ type: 'spawn', kind: child.kind, name: child.name, input }),
137
- sleep: (ms) => ({ type: 'sleep', ms }),
138
- effects: (effects) => ({ type: 'effects', effects }),
185
+ threadId: run.threadId,
186
+ nodeId: run.nodeId,
187
+ input: run.input,
188
+ results: nodeResults(definition, run.nodes),
189
+ iteration: run.iteration,
190
+ ...nodeResultBuilders(),
139
191
  })),
140
- catch: (cause) => (cause instanceof Error ? cause : new Error(String(cause))),
192
+ catch: (cause) => new WorkflowNodeError(cause),
141
193
  }).pipe(Effect.map((value) => ({ ok: true, value })), Effect.catch((err) => Effect.succeed({ ok: false, error: err.message })));
142
194
  if (!raw.ok) {
143
- return [
144
- {
145
- type: 'workflow.node.finished',
146
- payload: { nodeId, result: null, error: raw.error },
147
- threadId,
148
- },
149
- ];
195
+ return finished(run, null, raw.error);
150
196
  }
151
197
  const result = isNodeResult(raw.value)
152
198
  ? raw.value
153
199
  : { type: 'value', value: raw.value };
200
+ return yield* nodeResultEvents(definition, nodeDef.type, run, result);
201
+ }).pipe(Effect.catchTag('WorkflowValueTooLargeError', (error) => Effect.succeed(finished(run, null, error.message))));
202
+ }
203
+ function nodeResultEvents(definition, nodeType, run, result) {
204
+ return Effect.gen(function* () {
205
+ const { threadId, nodeId, attempt } = run;
206
+ const outputLabel = `Node ${nodeId} output`;
154
207
  switch (result.type) {
155
208
  case 'value':
209
+ yield* assertJsonWithinLimit(result.value, outputLabel, definition.outputLimitBytes);
210
+ return finished(run, result.value, null);
211
+ case 'switch': {
212
+ const value = result.value ?? result.branch;
213
+ yield* assertJsonWithinLimit(value, outputLabel, definition.outputLimitBytes);
156
214
  return [
157
215
  {
158
216
  type: 'workflow.node.finished',
159
- payload: { nodeId, result: result.value ?? null, error: null },
217
+ payload: { nodeId, result: value, error: null, branch: result.branch },
160
218
  threadId,
161
219
  },
162
220
  ];
221
+ }
163
222
  case 'spawn': {
164
- const childThreadId = createThreadId();
223
+ const childThreadId = result.childThreadId ??
224
+ (nodeType === 'workflow'
225
+ ? nodeChildWorkflowId(threadId, nodeId, attempt)
226
+ : createThreadId());
227
+ return spawnRequested(run, childThreadId, result, result.input);
228
+ }
229
+ case 'sleep': {
230
+ const now = yield* Clock.currentTimeMillis;
231
+ const key = nodeRunKey(nodeId, attempt, run.iteration?.index);
165
232
  return [
166
233
  {
167
- type: 'workflow.spawn.requested',
234
+ type: 'workflow.sleep.requested',
168
235
  payload: {
169
236
  nodeId,
170
- childThreadId,
171
- kind: result.kind,
172
- definitionName: result.name,
173
- input: result.input ?? null,
237
+ waitId: createWaitId(threadId, `sleep_${key}`),
238
+ wakeAt: now + result.ms,
174
239
  },
175
240
  threadId,
176
241
  },
177
242
  ];
178
243
  }
179
- case 'sleep':
244
+ case 'effects':
180
245
  return [
181
246
  {
182
- type: 'workflow.sleep.requested',
183
- payload: {
184
- nodeId,
185
- waitId: createWaitId(threadId, `sleep_${nodeId}`),
186
- wakeAt: Date.now() + result.ms,
187
- },
247
+ type: 'workflow.effects.requested',
248
+ payload: { nodeId, effects: result.effects ?? [] },
188
249
  threadId,
189
250
  },
190
251
  ];
191
- case 'effects':
252
+ case 'map': {
253
+ if (result.items.length === 0) {
254
+ return finished(run, [], null);
255
+ }
256
+ const limitBytes = definition.checkpointLimitBytes ?? DEFAULT_CHECKPOINT_SIZE_LIMIT_BYTES;
257
+ yield* assertJsonWithinLimit(result.items, `Node ${nodeId} items`, limitBytes);
192
258
  return [
193
259
  {
194
- type: 'workflow.effects.requested',
260
+ type: 'workflow.map.requested',
195
261
  payload: {
196
262
  nodeId,
197
- effects: result.effects ?? [],
263
+ attempt,
264
+ kind: result.kind,
265
+ definitionName: result.name,
266
+ definitionVersion: result.version,
267
+ items: result.items,
268
+ concurrency: result.concurrency,
269
+ limitBytes,
198
270
  },
199
271
  threadId,
200
272
  },
201
273
  ];
274
+ }
275
+ case 'loop': {
276
+ const index = run.iteration?.index ?? 0;
277
+ if (index >= result.maxIterations) {
278
+ return finished(run, run.iteration?.previous ?? null, null);
279
+ }
280
+ const childThreadId = iterationChildWorkflowId(threadId, nodeId, 'loop', attempt, index);
281
+ return spawnRequested(run, childThreadId, result, result.input, index);
282
+ }
202
283
  default: {
203
284
  const exhaustiveCheck = result;
204
285
  return exhaustiveCheck;
@@ -206,3 +287,21 @@ function runNode(definition, binding, nodeId, threadId) {
206
287
  }
207
288
  });
208
289
  }
290
+ function spawnRequested(run, childThreadId, child, input, loopIndex = null) {
291
+ return [
292
+ {
293
+ type: 'workflow.spawn.requested',
294
+ payload: {
295
+ nodeId: run.nodeId,
296
+ attempt: run.attempt,
297
+ childThreadId,
298
+ kind: child.kind,
299
+ definitionName: child.name,
300
+ definitionVersion: child.version,
301
+ input,
302
+ loopIndex,
303
+ },
304
+ threadId: run.threadId,
305
+ },
306
+ ];
307
+ }
@@ -1,5 +1,4 @@
1
1
  import { Schema } from 'effect';
2
- import { type RuntimeEffect } from '@swirls/looms/core';
3
2
  export declare const WorkflowNodeStartedPayloadSchema: Schema.Struct<{
4
3
  readonly nodeId: Schema.String;
5
4
  }>;
@@ -7,26 +6,99 @@ export declare const WorkflowNodeFinishedPayloadSchema: Schema.Struct<{
7
6
  readonly nodeId: Schema.String;
8
7
  readonly result: Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
9
8
  readonly error: Schema.NullOr<Schema.String>;
9
+ readonly branch: Schema.optional<Schema.String>;
10
10
  }>;
11
+ export declare const WorkflowSkipCauseSchema: Schema.Union<readonly [Schema.Literal<"inactive">, Schema.Literal<"policy">]>;
11
12
  export declare const WorkflowNodeSkippedPayloadSchema: Schema.Struct<{
12
13
  readonly nodeId: Schema.String;
13
14
  readonly reason: Schema.String;
15
+ readonly cause: Schema.withDecodingDefaultKey<Schema.Union<readonly [Schema.Literal<"inactive">, Schema.Literal<"policy">]>, never>;
14
16
  }>;
15
17
  export declare const WorkflowSpawnRequestedPayloadSchema: Schema.Struct<{
16
18
  readonly nodeId: Schema.String;
19
+ readonly attempt: Schema.withDecodingDefaultKey<Schema.Finite, never>;
17
20
  readonly childThreadId: Schema.String;
18
21
  readonly kind: Schema.String;
19
22
  readonly definitionName: Schema.String;
23
+ readonly definitionVersion: Schema.withDecodingDefaultKey<Schema.String, never>;
20
24
  readonly input: Schema.Codec<Schema.Json, Schema.Json, never, never>;
25
+ /** Set for `loop` iterations: the node re-runs after this child instead of finishing. */
26
+ readonly loopIndex: Schema.withDecodingDefaultKey<Schema.NullOr<Schema.Finite>, never>;
27
+ }>;
28
+ export declare const WorkflowMapRequestedPayloadSchema: Schema.Struct<{
29
+ readonly nodeId: Schema.String;
30
+ readonly attempt: Schema.withDecodingDefaultKey<Schema.Finite, never>;
31
+ readonly kind: Schema.String;
32
+ readonly definitionName: Schema.String;
33
+ readonly definitionVersion: Schema.withDecodingDefaultKey<Schema.String, never>;
34
+ readonly items: Schema.$Array<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
35
+ readonly concurrency: Schema.Finite;
36
+ readonly limitBytes: Schema.Finite;
21
37
  }>;
22
38
  export declare const WorkflowSleepRequestedPayloadSchema: Schema.Struct<{
23
39
  readonly nodeId: Schema.String;
24
40
  readonly waitId: Schema.String;
25
- readonly wakeAt: Schema.Number;
41
+ readonly wakeAt: Schema.Finite;
26
42
  }>;
27
43
  export declare const WorkflowEffectsRequestedPayloadSchema: Schema.Struct<{
28
44
  readonly nodeId: Schema.String;
29
- readonly effects: Schema.$Array<Schema.Schema<RuntimeEffect>>;
45
+ readonly effects: Schema.$Array<Schema.Union<readonly [Schema.Struct<{
46
+ readonly type: Schema.Literal<"runtime.spawn">;
47
+ readonly childThreadId: Schema.String;
48
+ readonly kind: Schema.String;
49
+ readonly definitionName: Schema.String;
50
+ readonly definitionVersion: Schema.withDecodingDefaultKey<Schema.String, never>;
51
+ readonly input: Schema.Codec<Schema.Json, Schema.Json, never, never>;
52
+ }>, Schema.Struct<{
53
+ readonly type: Schema.Literal<"runtime.wait">;
54
+ readonly waitId: Schema.String;
55
+ readonly on: Schema.Union<readonly [Schema.Struct<{
56
+ readonly type: Schema.Union<readonly [Schema.String, Schema.$Array<Schema.String>]>;
57
+ readonly match: Schema.optional<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
58
+ }>, Schema.Struct<{
59
+ readonly timerAt: Schema.Finite;
60
+ }>]>;
61
+ readonly tag: Schema.optional<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
62
+ }>, Schema.Struct<{
63
+ readonly type: Schema.Literal<"runtime.emit">;
64
+ readonly event: Schema.Struct<{
65
+ readonly type: Schema.String;
66
+ readonly payload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
67
+ readonly threadId: Schema.optional<Schema.NullOr<Schema.String>>;
68
+ readonly parentThreadId: Schema.optional<Schema.NullOr<Schema.String>>;
69
+ readonly causationId: Schema.optional<Schema.NullOr<Schema.String>>;
70
+ readonly correlationId: Schema.optional<Schema.NullOr<Schema.String>>;
71
+ readonly effectId: Schema.optional<Schema.NullOr<Schema.String>>;
72
+ readonly origin: Schema.optional<Schema.Union<readonly [Schema.Struct<{
73
+ readonly type: Schema.Literal<"thread">;
74
+ readonly threadId: Schema.String;
75
+ }>, Schema.Struct<{
76
+ readonly type: Schema.Literal<"external">;
77
+ readonly actorId: Schema.optional<Schema.String>;
78
+ }>, Schema.Struct<{
79
+ readonly type: Schema.Literal<"system">;
80
+ }>]>>;
81
+ readonly ephemeral: Schema.optional<Schema.Boolean>;
82
+ readonly id: Schema.optional<Schema.String>;
83
+ readonly ts: Schema.optional<Schema.Finite>;
84
+ readonly idempotencyKey: Schema.optional<Schema.NullOr<Schema.String>>;
85
+ }>;
86
+ readonly tag: Schema.optional<Schema.String>;
87
+ }>, Schema.Struct<{
88
+ readonly type: Schema.Literal<"runtime.complete">;
89
+ readonly output: Schema.Codec<Schema.Json, Schema.Json, never, never>;
90
+ }>, Schema.Struct<{
91
+ readonly type: Schema.Literal<"runtime.fail">;
92
+ readonly error: Schema.String;
93
+ }>, Schema.Struct<{
94
+ readonly type: Schema.Literal<"runtime.cancel">;
95
+ readonly threadId: Schema.String;
96
+ readonly tag: Schema.optional<Schema.String>;
97
+ }>, Schema.Struct<{
98
+ readonly type: Schema.String;
99
+ readonly input: Schema.Codec<Schema.Json, Schema.Json, never, never>;
100
+ readonly tag: Schema.optional<Schema.String>;
101
+ }>]>>;
30
102
  }>;
31
103
  export declare const workflowCatalog: import("@swirls/looms/core").EventCatalog<"workflow", {
32
104
  'node.started': Schema.Struct<{
@@ -36,25 +108,97 @@ export declare const workflowCatalog: import("@swirls/looms/core").EventCatalog<
36
108
  readonly nodeId: Schema.String;
37
109
  readonly result: Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
38
110
  readonly error: Schema.NullOr<Schema.String>;
111
+ readonly branch: Schema.optional<Schema.String>;
39
112
  }>;
40
113
  'node.skipped': Schema.Struct<{
41
114
  readonly nodeId: Schema.String;
42
115
  readonly reason: Schema.String;
116
+ readonly cause: Schema.withDecodingDefaultKey<Schema.Union<readonly [Schema.Literal<"inactive">, Schema.Literal<"policy">]>, never>;
43
117
  }>;
44
118
  'spawn.requested': Schema.Struct<{
45
119
  readonly nodeId: Schema.String;
120
+ readonly attempt: Schema.withDecodingDefaultKey<Schema.Finite, never>;
46
121
  readonly childThreadId: Schema.String;
47
122
  readonly kind: Schema.String;
48
123
  readonly definitionName: Schema.String;
124
+ readonly definitionVersion: Schema.withDecodingDefaultKey<Schema.String, never>;
49
125
  readonly input: Schema.Codec<Schema.Json, Schema.Json, never, never>;
126
+ /** Set for `loop` iterations: the node re-runs after this child instead of finishing. */
127
+ readonly loopIndex: Schema.withDecodingDefaultKey<Schema.NullOr<Schema.Finite>, never>;
128
+ }>;
129
+ 'map.requested': Schema.Struct<{
130
+ readonly nodeId: Schema.String;
131
+ readonly attempt: Schema.withDecodingDefaultKey<Schema.Finite, never>;
132
+ readonly kind: Schema.String;
133
+ readonly definitionName: Schema.String;
134
+ readonly definitionVersion: Schema.withDecodingDefaultKey<Schema.String, never>;
135
+ readonly items: Schema.$Array<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
136
+ readonly concurrency: Schema.Finite;
137
+ readonly limitBytes: Schema.Finite;
50
138
  }>;
51
139
  'sleep.requested': Schema.Struct<{
52
140
  readonly nodeId: Schema.String;
53
141
  readonly waitId: Schema.String;
54
- readonly wakeAt: Schema.Number;
142
+ readonly wakeAt: Schema.Finite;
55
143
  }>;
56
144
  'effects.requested': Schema.Struct<{
57
145
  readonly nodeId: Schema.String;
58
- readonly effects: Schema.$Array<Schema.Schema<RuntimeEffect>>;
146
+ readonly effects: Schema.$Array<Schema.Union<readonly [Schema.Struct<{
147
+ readonly type: Schema.Literal<"runtime.spawn">;
148
+ readonly childThreadId: Schema.String;
149
+ readonly kind: Schema.String;
150
+ readonly definitionName: Schema.String;
151
+ readonly definitionVersion: Schema.withDecodingDefaultKey<Schema.String, never>;
152
+ readonly input: Schema.Codec<Schema.Json, Schema.Json, never, never>;
153
+ }>, Schema.Struct<{
154
+ readonly type: Schema.Literal<"runtime.wait">;
155
+ readonly waitId: Schema.String;
156
+ readonly on: Schema.Union<readonly [Schema.Struct<{
157
+ readonly type: Schema.Union<readonly [Schema.String, Schema.$Array<Schema.String>]>;
158
+ readonly match: Schema.optional<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
159
+ }>, Schema.Struct<{
160
+ readonly timerAt: Schema.Finite;
161
+ }>]>;
162
+ readonly tag: Schema.optional<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
163
+ }>, Schema.Struct<{
164
+ readonly type: Schema.Literal<"runtime.emit">;
165
+ readonly event: Schema.Struct<{
166
+ readonly type: Schema.String;
167
+ readonly payload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
168
+ readonly threadId: Schema.optional<Schema.NullOr<Schema.String>>;
169
+ readonly parentThreadId: Schema.optional<Schema.NullOr<Schema.String>>;
170
+ readonly causationId: Schema.optional<Schema.NullOr<Schema.String>>;
171
+ readonly correlationId: Schema.optional<Schema.NullOr<Schema.String>>;
172
+ readonly effectId: Schema.optional<Schema.NullOr<Schema.String>>;
173
+ readonly origin: Schema.optional<Schema.Union<readonly [Schema.Struct<{
174
+ readonly type: Schema.Literal<"thread">;
175
+ readonly threadId: Schema.String;
176
+ }>, Schema.Struct<{
177
+ readonly type: Schema.Literal<"external">;
178
+ readonly actorId: Schema.optional<Schema.String>;
179
+ }>, Schema.Struct<{
180
+ readonly type: Schema.Literal<"system">;
181
+ }>]>>;
182
+ readonly ephemeral: Schema.optional<Schema.Boolean>;
183
+ readonly id: Schema.optional<Schema.String>;
184
+ readonly ts: Schema.optional<Schema.Finite>;
185
+ readonly idempotencyKey: Schema.optional<Schema.NullOr<Schema.String>>;
186
+ }>;
187
+ readonly tag: Schema.optional<Schema.String>;
188
+ }>, Schema.Struct<{
189
+ readonly type: Schema.Literal<"runtime.complete">;
190
+ readonly output: Schema.Codec<Schema.Json, Schema.Json, never, never>;
191
+ }>, Schema.Struct<{
192
+ readonly type: Schema.Literal<"runtime.fail">;
193
+ readonly error: Schema.String;
194
+ }>, Schema.Struct<{
195
+ readonly type: Schema.Literal<"runtime.cancel">;
196
+ readonly threadId: Schema.String;
197
+ readonly tag: Schema.optional<Schema.String>;
198
+ }>, Schema.Struct<{
199
+ readonly type: Schema.String;
200
+ readonly input: Schema.Codec<Schema.Json, Schema.Json, never, never>;
201
+ readonly tag: Schema.optional<Schema.String>;
202
+ }>]>>;
59
203
  }>;
60
204
  }>;