@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,5 +1,5 @@
1
- import { Schema } from 'effect';
2
- import { defineEventCatalog } from '@swirls/looms/core';
1
+ import { Effect, Schema } from 'effect';
2
+ import { DEFAULT_DEFINITION_VERSION, defineEventCatalog, RuntimeEffectSchema } from '@swirls/looms/core';
3
3
  export const WorkflowNodeStartedPayloadSchema = Schema.Struct({
4
4
  nodeId: Schema.String,
5
5
  });
@@ -7,33 +7,55 @@ export const WorkflowNodeFinishedPayloadSchema = Schema.Struct({
7
7
  nodeId: Schema.String,
8
8
  result: Schema.NullOr(Schema.Json),
9
9
  error: Schema.NullOr(Schema.String),
10
+ branch: Schema.optional(Schema.String),
10
11
  });
12
+ export const WorkflowSkipCauseSchema = Schema.Union([
13
+ Schema.Literal('inactive'),
14
+ Schema.Literal('policy'),
15
+ ]);
11
16
  export const WorkflowNodeSkippedPayloadSchema = Schema.Struct({
12
17
  nodeId: Schema.String,
13
18
  reason: Schema.String,
19
+ cause: WorkflowSkipCauseSchema.pipe(Schema.withDecodingDefaultKey(Effect.succeed('inactive'))),
14
20
  });
21
+ const attempt = Schema.Finite.pipe(Schema.withDecodingDefaultKey(Effect.succeed(1)));
22
+ const definitionVersion = Schema.String.pipe(Schema.withDecodingDefaultKey(Effect.succeed(DEFAULT_DEFINITION_VERSION)));
15
23
  export const WorkflowSpawnRequestedPayloadSchema = Schema.Struct({
16
24
  nodeId: Schema.String,
25
+ attempt,
17
26
  childThreadId: Schema.String,
18
27
  kind: Schema.String,
19
28
  definitionName: Schema.String,
29
+ definitionVersion,
20
30
  input: Schema.Json,
31
+ /** Set for `loop` iterations: the node re-runs after this child instead of finishing. */
32
+ loopIndex: Schema.NullOr(Schema.Finite).pipe(Schema.withDecodingDefaultKey(Effect.succeed(null))),
33
+ });
34
+ export const WorkflowMapRequestedPayloadSchema = Schema.Struct({
35
+ nodeId: Schema.String,
36
+ attempt,
37
+ kind: Schema.String,
38
+ definitionName: Schema.String,
39
+ definitionVersion,
40
+ items: Schema.Array(Schema.Json),
41
+ concurrency: Schema.Finite,
42
+ limitBytes: Schema.Finite,
21
43
  });
22
44
  export const WorkflowSleepRequestedPayloadSchema = Schema.Struct({
23
45
  nodeId: Schema.String,
24
46
  waitId: Schema.String,
25
- wakeAt: Schema.Number,
47
+ wakeAt: Schema.Finite,
26
48
  });
27
49
  export const WorkflowEffectsRequestedPayloadSchema = Schema.Struct({
28
50
  nodeId: Schema.String,
29
- // SAFETY: RuntimeEffect represents serializable requested effect instructions.
30
- effects: Schema.Array(Schema.Unknown),
51
+ effects: Schema.Array(RuntimeEffectSchema),
31
52
  });
32
53
  export const workflowCatalog = defineEventCatalog('workflow', {
33
54
  'node.started': WorkflowNodeStartedPayloadSchema,
34
55
  'node.finished': WorkflowNodeFinishedPayloadSchema,
35
56
  'node.skipped': WorkflowNodeSkippedPayloadSchema,
36
57
  'spawn.requested': WorkflowSpawnRequestedPayloadSchema,
58
+ 'map.requested': WorkflowMapRequestedPayloadSchema,
37
59
  'sleep.requested': WorkflowSleepRequestedPayloadSchema,
38
60
  'effects.requested': WorkflowEffectsRequestedPayloadSchema,
39
61
  });
@@ -0,0 +1,56 @@
1
+ import { Effect } from 'effect';
2
+ import { type JsonValue } from '@swirls/looms/core';
3
+ import type { NodeState, WorkflowDefinition, WorkflowNodeDefinition } from './definitions';
4
+ export declare const MIN_GRAPH_CONCURRENCY = 1;
5
+ export declare const MAX_GRAPH_CONCURRENCY = 64;
6
+ export declare const DEFAULT_GRAPH_CONCURRENCY = 8;
7
+ export declare const DEFAULT_VALUE_SIZE_LIMIT_BYTES = 2000000;
8
+ export declare const DEFAULT_CHECKPOINT_SIZE_LIMIT_BYTES = 4000000;
9
+ declare const WorkflowValidationError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
10
+ readonly _tag: "WorkflowValidationError";
11
+ } & Readonly<A>;
12
+ export declare class WorkflowValidationError extends WorkflowValidationError_base<{
13
+ readonly message: string;
14
+ }> {
15
+ constructor(message: string);
16
+ }
17
+ declare const WorkflowValueTooLargeError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
18
+ readonly _tag: "WorkflowValueTooLargeError";
19
+ } & Readonly<A>;
20
+ export declare class WorkflowValueTooLargeError extends WorkflowValueTooLargeError_base<{
21
+ readonly label: string;
22
+ readonly actualBytes: number;
23
+ readonly limitBytes: number;
24
+ readonly message: string;
25
+ }> {
26
+ constructor(label: string, actualBytes: number, limitBytes: number);
27
+ }
28
+ export interface WorkflowEdge {
29
+ readonly sourceNodeId: string;
30
+ readonly targetNodeId: string;
31
+ /** For switch nodes, only the edge matching the returned branch is active. */
32
+ readonly label?: string;
33
+ }
34
+ export type GraphNodeStatuses = Record<string, NodeState['status']>;
35
+ /** Distinguishes each attempt, and each loop iteration within it, of one node. */
36
+ export declare function nodeRunKey(nodeId: string, attempt: number, iteration?: number): string;
37
+ export declare function iterationChildWorkflowId(parentThreadId: string, nodeId: string, kind: 'map' | 'loop', attempt: number, index: number): string;
38
+ export declare function nodeChildWorkflowId(parentThreadId: string, nodeId: string, attempt: number): string;
39
+ export declare function assertJsonWithinLimit(value: JsonValue | Readonly<object>, label: string, limitBytes?: number): Effect.Effect<void, WorkflowValueTooLargeError>;
40
+ export declare function resolveGraphConcurrency(value?: number): number;
41
+ export declare function workflowEdges<TInput>(definition: WorkflowDefinition<string, TInput>): WorkflowEdge[];
42
+ export declare function topologicalSort(nodes: readonly Pick<WorkflowNodeDefinition, 'id'>[], edges: readonly WorkflowEdge[]): string[];
43
+ export declare function isEdgeActive(edge: WorkflowEdge, nodes: readonly Pick<WorkflowNodeDefinition, 'id' | 'type'>[], states: Readonly<Record<string, NodeState>>): boolean;
44
+ export declare function getReadyNodeIds<TInput>(definition: WorkflowDefinition<string, TInput>, states: Readonly<Record<string, NodeState>>): string[];
45
+ /**
46
+ * Nodes whose predecessors are settled but whose incoming paths are all inactive can be durably
47
+ * skipped. Repeating this function propagates skips.
48
+ */
49
+ export declare function getSkippableNodeIds<TInput>(definition: WorkflowDefinition<string, TInput>, states: Readonly<Record<string, NodeState>>): string[];
50
+ /** Fallback nodes whose primaries all settled without falling back will never run. */
51
+ export declare function getUnusedFallbackIds<TInput>(definition: WorkflowDefinition<string, TInput>, states: Readonly<Record<string, NodeState>>): string[];
52
+ /** Node results as dependents see them: a node that fell back reports its fallback's result. */
53
+ export declare function nodeResults<TInput>(definition: WorkflowDefinition<string, TInput>, states: Readonly<Record<string, NodeState>>): {
54
+ [k: string]: import("effect/Schema").Json;
55
+ };
56
+ export {};
@@ -0,0 +1,207 @@
1
+ import { Data, Effect } from 'effect';
2
+ import { deterministicThreadId, isJsonString, utf8JsonBytes } from '@swirls/looms/core';
3
+ export const MIN_GRAPH_CONCURRENCY = 1;
4
+ export const MAX_GRAPH_CONCURRENCY = 64;
5
+ export const DEFAULT_GRAPH_CONCURRENCY = 8;
6
+ export const DEFAULT_VALUE_SIZE_LIMIT_BYTES = 2_000_000;
7
+ export const DEFAULT_CHECKPOINT_SIZE_LIMIT_BYTES = 4_000_000;
8
+ export class WorkflowValidationError extends Data.TaggedError('WorkflowValidationError') {
9
+ constructor(message) {
10
+ super({ message });
11
+ }
12
+ }
13
+ export class WorkflowValueTooLargeError extends Data.TaggedError('WorkflowValueTooLargeError') {
14
+ constructor(label, actualBytes, limitBytes) {
15
+ super({
16
+ label,
17
+ actualBytes,
18
+ limitBytes,
19
+ message: `${label} is ${actualBytes} UTF-8 bytes; limit is ${limitBytes} bytes`,
20
+ });
21
+ }
22
+ }
23
+ /** Distinguishes each attempt, and each loop iteration within it, of one node. */
24
+ export function nodeRunKey(nodeId, attempt, iteration) {
25
+ return iteration === undefined ? `${nodeId}_${attempt}` : `${nodeId}_${attempt}_${iteration}`;
26
+ }
27
+ export function iterationChildWorkflowId(parentThreadId, nodeId, kind, attempt, index) {
28
+ return deterministicThreadId(parentThreadId, nodeId, kind, attempt, index);
29
+ }
30
+ export function nodeChildWorkflowId(parentThreadId, nodeId, attempt) {
31
+ return deterministicThreadId(parentThreadId, nodeId, 'workflow', attempt);
32
+ }
33
+ export function assertJsonWithinLimit(value, label, limitBytes = DEFAULT_VALUE_SIZE_LIMIT_BYTES) {
34
+ const actualBytes = utf8JsonBytes(value);
35
+ return actualBytes > limitBytes
36
+ ? Effect.fail(new WorkflowValueTooLargeError(label, actualBytes, limitBytes))
37
+ : Effect.void;
38
+ }
39
+ export function resolveGraphConcurrency(value) {
40
+ const concurrency = value ?? DEFAULT_GRAPH_CONCURRENCY;
41
+ if (!Number.isInteger(concurrency) ||
42
+ concurrency < MIN_GRAPH_CONCURRENCY ||
43
+ concurrency > MAX_GRAPH_CONCURRENCY) {
44
+ throw new WorkflowValidationError('Workflow concurrency must be an integer between 1 and 64');
45
+ }
46
+ return concurrency;
47
+ }
48
+ export function workflowEdges(definition) {
49
+ if (definition.edges) {
50
+ return [...definition.edges];
51
+ }
52
+ return definition.nodes.flatMap((node) => (node.deps ?? []).map((sourceNodeId) => ({ sourceNodeId, targetNodeId: node.id })));
53
+ }
54
+ export function topologicalSort(nodes, edges) {
55
+ const ids = new Set();
56
+ const inputOrder = new Map();
57
+ const indegree = new Map();
58
+ const outgoing = new Map();
59
+ nodes.forEach((node, index) => {
60
+ if (ids.has(node.id)) {
61
+ throw new WorkflowValidationError(`Duplicate workflow node: ${node.id}`);
62
+ }
63
+ ids.add(node.id);
64
+ inputOrder.set(node.id, index);
65
+ indegree.set(node.id, 0);
66
+ outgoing.set(node.id, []);
67
+ });
68
+ for (const edge of edges) {
69
+ if (!ids.has(edge.sourceNodeId)) {
70
+ throw new WorkflowValidationError(`Edge references non-existent source node: ${edge.sourceNodeId}`);
71
+ }
72
+ if (!ids.has(edge.targetNodeId)) {
73
+ throw new WorkflowValidationError(`Edge references non-existent target node: ${edge.targetNodeId}`);
74
+ }
75
+ outgoing.get(edge.sourceNodeId)?.push(edge.targetNodeId);
76
+ indegree.set(edge.targetNodeId, (indegree.get(edge.targetNodeId) ?? 0) + 1);
77
+ }
78
+ const ready = nodes.filter((node) => indegree.get(node.id) === 0).map((node) => node.id);
79
+ const sorted = [];
80
+ while (ready.length > 0) {
81
+ const nodeId = ready.shift();
82
+ if (nodeId === undefined) {
83
+ break;
84
+ }
85
+ sorted.push(nodeId);
86
+ for (const target of outgoing.get(nodeId) ?? []) {
87
+ const next = (indegree.get(target) ?? 0) - 1;
88
+ indegree.set(target, next);
89
+ if (next === 0) {
90
+ ready.push(target);
91
+ ready.sort((a, b) => (inputOrder.get(a) ?? 0) - (inputOrder.get(b) ?? 0));
92
+ }
93
+ }
94
+ }
95
+ if (sorted.length !== nodes.length) {
96
+ throw new WorkflowValidationError('Workflow contains a cycle');
97
+ }
98
+ return sorted;
99
+ }
100
+ function selectedBranch(state) {
101
+ if (state?.status !== 'completed') {
102
+ return undefined;
103
+ }
104
+ if (state.branch !== undefined) {
105
+ return state.branch;
106
+ }
107
+ return isJsonString(state.result) ? state.result : undefined;
108
+ }
109
+ export function isEdgeActive(edge, nodes, states) {
110
+ const state = states[edge.sourceNodeId];
111
+ if (state?.status === 'skipped') {
112
+ return state.skipCause === 'policy';
113
+ }
114
+ const source = nodes.find((node) => node.id === edge.sourceNodeId);
115
+ if (source?.type !== 'switch') {
116
+ return true;
117
+ }
118
+ const branch = selectedBranch(state);
119
+ return edge.label !== undefined && branch === edge.label;
120
+ }
121
+ /** The fallback node standing in for `node`, if its failure policy handed off to one. */
122
+ function activeFallback(node, state) {
123
+ return node.failure?.type === 'fallback' &&
124
+ state?.status === 'skipped' &&
125
+ state.skipCause === 'policy'
126
+ ? node.failure.nodeId
127
+ : undefined;
128
+ }
129
+ /**
130
+ * A node is settled once dependents may observe it: completed, or skipped. A node that fell back
131
+ * stays unsettled until its fallback node completes, so dependents see the fallback's result.
132
+ */
133
+ function isSettled(definition, states, nodeId) {
134
+ const state = states[nodeId];
135
+ if (state?.status === 'completed') {
136
+ return true;
137
+ }
138
+ if (state?.status !== 'skipped') {
139
+ return false;
140
+ }
141
+ const node = definition.nodes.find((candidate) => candidate.id === nodeId);
142
+ const fallback = node && activeFallback(node, state);
143
+ return fallback === undefined || isSettled(definition, states, fallback);
144
+ }
145
+ function fallbackTargets(definition) {
146
+ return new Set(definition.nodes.flatMap((node) => node.failure?.type === 'fallback' ? [node.failure.nodeId] : []));
147
+ }
148
+ export function getReadyNodeIds(definition, states) {
149
+ const edges = workflowEdges(definition);
150
+ const order = topologicalSort(definition.nodes, edges);
151
+ const fallbacks = fallbackTargets(definition);
152
+ return order.filter((nodeId) => {
153
+ if ((states[nodeId]?.status ?? 'pending') !== 'pending' || fallbacks.has(nodeId)) {
154
+ return false;
155
+ }
156
+ const incoming = edges.filter((edge) => edge.targetNodeId === nodeId);
157
+ if (incoming.length === 0) {
158
+ return true;
159
+ }
160
+ return (incoming.every((edge) => isSettled(definition, states, edge.sourceNodeId)) &&
161
+ incoming.some((edge) => isEdgeActive(edge, definition.nodes, states)));
162
+ });
163
+ }
164
+ /**
165
+ * Nodes whose predecessors are settled but whose incoming paths are all inactive can be durably
166
+ * skipped. Repeating this function propagates skips.
167
+ */
168
+ export function getSkippableNodeIds(definition, states) {
169
+ const edges = workflowEdges(definition);
170
+ const order = topologicalSort(definition.nodes, edges);
171
+ return order.filter((nodeId) => {
172
+ if ((states[nodeId]?.status ?? 'pending') !== 'pending') {
173
+ return false;
174
+ }
175
+ const incoming = edges.filter((edge) => edge.targetNodeId === nodeId);
176
+ if (incoming.length === 0) {
177
+ return false;
178
+ }
179
+ return (incoming.every((edge) => isSettled(definition, states, edge.sourceNodeId)) &&
180
+ !incoming.some((edge) => isEdgeActive(edge, definition.nodes, states)));
181
+ });
182
+ }
183
+ /** Fallback nodes whose primaries all settled without falling back will never run. */
184
+ export function getUnusedFallbackIds(definition, states) {
185
+ return [...fallbackTargets(definition)].filter((target) => {
186
+ if ((states[target]?.status ?? 'pending') !== 'pending') {
187
+ return false;
188
+ }
189
+ const primaries = definition.nodes.filter((node) => node.failure?.type === 'fallback' && node.failure.nodeId === target);
190
+ return primaries.every((node) => {
191
+ const state = states[node.id];
192
+ const status = state?.status;
193
+ return (status === 'completed' || status === 'skipped') && !activeFallback(node, state);
194
+ });
195
+ });
196
+ }
197
+ /** Node results as dependents see them: a node that fell back reports its fallback's result. */
198
+ export function nodeResults(definition, states) {
199
+ const results = Object.fromEntries(Object.entries(states).map(([id, state]) => [id, state.result]));
200
+ for (const node of definition.nodes) {
201
+ const fallback = activeFallback(node, states[node.id]);
202
+ if (fallback !== undefined) {
203
+ results[node.id] = states[fallback]?.result ?? null;
204
+ }
205
+ }
206
+ return results;
207
+ }
@@ -6,3 +6,4 @@ export * from './threads';
6
6
  export * from './effects';
7
7
  export * from './projections';
8
8
  export * from './module';
9
+ export * from './graph';
@@ -6,3 +6,4 @@ export * from './threads.js';
6
6
  export * from './effects.js';
7
7
  export * from './projections.js';
8
8
  export * from './module.js';
9
+ export * from './graph.js';