@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @swirls/looms
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6ed3a5f: `vercelEvaluator({ provider, model })` resolves model ids through an AI SDK provider such as `createTypeSafeAi({ apiKey })`, so callers can use their own TypeSafe key instead of the AI Gateway.
8
+ - 6ed3a5f: Serve a debugger UI from `createLooms` with `debuggerUi()` from `@swirls/looms/debugger/server`. Modules ship their own debugger views from `@swirls/looms/agent/debugger`, `@swirls/looms/workflow/debugger`, and `@swirls/looms/approval/debugger`. `GET /definitions` lists the definitions and projections that UI can start and inspect, and `GET /runs/summaries` returns each run's status and definition.
9
+
10
+ `@swirls/looms/debugger` also exports the building blocks the hosted UI uses, so module views can match it: `JsonTree` (collapsible JSON that expands JSON held in strings), `FollowList` (a virtualized list that follows new items), `Composer`, `Button`, `Input`, `Textarea`, `Select`, `PanelHeader`, `PanelTitle`, `EmptyState`, `Kbd`, and `StatusBadge`. To render `DebuggerShell` in your own app, import `@swirls/looms/debugger/styles.css` after Tailwind CSS v4. The stylesheet brings its theme and scans the kit and the built-in module views.
11
+
12
+ Breaking changes:
13
+
14
+ - Tool helpers and tool definitions no longer accept `inputSchema`. Pass `input` and the JSON Schema is derived from it.
15
+ - `@swirls/looms/debugger` no longer exports `EventFamily`, `DEFAULT_FAMILIES`, `familyClass`, `familyFromPrefix`, `summarizeDomainEvent`, `summarizeEvent`, `searchText`, or `createDefaultCatalog`. Build a catalog with `createEventCatalog(plugins)` or use `defaultEventCatalog`.
16
+ - `EventStreamCatalog.familyClass` is now `familyColor`, which returns a CSS color, and `searchText` is required.
17
+
18
+ ## 0.1.0
19
+
20
+ ### Minor Changes
21
+
22
+ - 2176eac: Add `defineKind` and `createKind` so custom startable types share the same `{ kind, name }` builder as `defineAgent` and `defineWorkflow`.
23
+ - a879e8b: Add `@swirls/looms/evaluator` so typed questions can score a run and branch a workflow. Pass a model id such as `typesafe-ai/jev`; the thread kind stays `evaluator`.
24
+
3
25
  ## 0.0.2
4
26
 
5
27
  ### Patch Changes
@@ -21,7 +43,7 @@
21
43
 
22
44
  - Add Standard Schema `input` typing and runtime validation for `defineAgent`, `defineWorkflow`, and `defineTool`.
23
45
  - Provide Promise-based `createLooms()` facade with lazy init, typed start overloads, and universal `fetch(req) -> Response | null`.
24
- - Add Looms-native event streaming directly against EventStore and `/api/events` (eliminating the dual-log S2 bridge).
46
+ - Add Looms-native event streaming directly against EventStore and `/runs/:id/events` (eliminating the dual-log S2 bridge).
25
47
  - Add `s2Lite()` / `startS2Lite()` auto-starting dev process manager.
26
48
  - Typed client generics for `createLoomsClient<typeof definitions>()`.
27
49
  - Single server setup for dev and prod in demo app with no `effect` dependency.
@@ -42,5 +64,5 @@
42
64
  - e398380: Publish the React integration at `@swirls/looms/react` and drop the former LiveStore protocol names.
43
65
 
44
66
  - Package and React provider are now `@swirls/looms/react` / `LoomsProvider`.
45
- - Live event HTTP is `GET /api/events?runId=` (pull or SSE). Wire batches are Looms event envelopes.
67
+ - Live event HTTP is `GET /runs/:id/events` with SSE content negotiation. Wire batches are Looms event envelopes.
46
68
  - `LiveStoreGlobalEncoded` is now `EncodedLoomsEvent`.
@@ -1,5 +1,5 @@
1
- import { type AnyRuntimeModule, type EventStore, type RunState, type SnapshotStore } from '@swirls/looms/core';
2
- import { type LoomsRuntime, type WakeScheduler } from '@swirls/looms/runtime';
1
+ import { type AnyRuntimeModule, type EventStore, type EventStoreTrimCoverage, type RunState, type SnapshotStore } from '@swirls/looms/core';
2
+ import { type Authorize, type LoomsRuntime, type WakeScheduler } from '@swirls/looms/runtime';
3
3
  export interface ActorCellOptions<TModules extends readonly AnyRuntimeModule[] = readonly AnyRuntimeModule[]> {
4
4
  readonly runId: string;
5
5
  readonly store: EventStore;
@@ -7,10 +7,14 @@ export interface ActorCellOptions<TModules extends readonly AnyRuntimeModule[] =
7
7
  readonly modules: TModules;
8
8
  readonly snapshotEvery?: number;
9
9
  readonly maxWakeIterations?: number;
10
+ readonly maxPendingRunOperations?: number;
10
11
  readonly snapshotStore?: SnapshotStore;
11
12
  readonly trimAfterSnapshot?: {
12
- keepSnapshots: number;
13
+ readonly keepSnapshots: number;
14
+ readonly coverage?: (runId: string) => EventStoreTrimCoverage | Promise<EventStoreTrimCoverage>;
13
15
  };
16
+ /** Authorizes the cell's HTTP API; see `createFetchHandler`. */
17
+ readonly authorize?: Authorize;
14
18
  }
15
19
  export interface ActorCell<TModules extends readonly AnyRuntimeModule[] = readonly AnyRuntimeModule[]> {
16
20
  readonly runId: string;
@@ -18,7 +22,8 @@ export interface ActorCell<TModules extends readonly AnyRuntimeModule[] = readon
18
22
  readonly store: EventStore;
19
23
  fetch(req: Request): Promise<Response>;
20
24
  wake(): Promise<RunState>;
21
- dispose(): void;
25
+ recoverWake(): Promise<number>;
26
+ dispose(): Promise<void>;
22
27
  }
23
28
  /**
24
29
  * Creates an in-process actor cell that owns a single `runId`.
@@ -14,28 +14,24 @@ export function createActorCell(options) {
14
14
  scheduler,
15
15
  snapshotEvery: options.snapshotEvery,
16
16
  maxWakeIterations: options.maxWakeIterations,
17
+ maxPendingRunOperations: options.maxPendingRunOperations,
17
18
  snapshotStore: options.snapshotStore,
18
19
  trimAfterSnapshot: options.trimAfterSnapshot,
19
20
  });
20
- const fetchHandler = createFetchHandler({ runtime, store });
21
+ const fetchHandler = createFetchHandler({ runtime, store, authorize: options.authorize });
21
22
  return {
22
23
  runId,
23
24
  runtime,
24
25
  store,
25
- fetch: async (req) => {
26
+ fetch: (req) => {
26
27
  const targetRunId = runIdFromRequest(req);
27
28
  if (targetRunId && targetRunId !== runId) {
28
- return new Response('Not Found', { status: 404 });
29
+ return Promise.resolve(new Response('Not Found', { status: 404 }));
29
30
  }
30
- const res = await fetchHandler(req);
31
- if (res === null) {
32
- return new Response('Not Found', { status: 404 });
33
- }
34
- return res;
31
+ return fetchHandler(req).then((res) => res ?? new Response('Not Found', { status: 404 }));
35
32
  },
36
33
  wake: () => Effect.runPromise(Effect.provideService(runtime.wake(runId), EventStoreTag, store)),
37
- dispose: () => {
38
- runtime.dispose();
39
- },
34
+ recoverWake: () => Effect.runPromise(Effect.provideService(runtime.rescanTimers, EventStoreTag, store)),
35
+ dispose: () => Effect.runPromise(runtime.dispose),
40
36
  };
41
37
  }
@@ -1,4 +1,5 @@
1
- import type { AnyRuntimeModule, EventStore, SnapshotStore } from '@swirls/looms/core';
1
+ import type { AnyRuntimeModule, EventStore, EventStoreTrimCoverage, SnapshotStore } from '@swirls/looms/core';
2
+ import { type Authorize } from '@swirls/looms/runtime';
2
3
  import { type ActorCell } from './cell';
3
4
  export interface LocalActorHostOptions<TModules extends readonly AnyRuntimeModule[] = readonly AnyRuntimeModule[]> {
4
5
  readonly createStore: (runId: string) => EventStore | Promise<EventStore>;
@@ -7,18 +8,21 @@ export interface LocalActorHostOptions<TModules extends readonly AnyRuntimeModul
7
8
  readonly snapshotEvery?: number;
8
9
  readonly maxWakeIterations?: number;
9
10
  readonly trimAfterSnapshot?: {
10
- keepSnapshots: number;
11
+ readonly keepSnapshots: number;
12
+ readonly coverage?: (runId: string) => EventStoreTrimCoverage | Promise<EventStoreTrimCoverage>;
11
13
  };
12
14
  /**
13
15
  * After creating a cell, rescan its store for pending timers (process restart).
14
16
  * Default true. No-op for empty in-memory stores.
15
17
  */
16
18
  readonly rescanTimers?: boolean;
19
+ /** Authorizes each cell's HTTP API; see `createFetchHandler`. */
20
+ readonly authorize?: Authorize;
17
21
  }
18
22
  export interface LocalActorHost<TModules extends readonly AnyRuntimeModule[] = readonly AnyRuntimeModule[]> {
19
23
  getCell(runId: string): Promise<ActorCell<TModules>>;
20
24
  fetch(req: Request): Promise<Response | null>;
21
- dispose(): void;
25
+ dispose(): Promise<void>;
22
26
  }
23
27
  /**
24
28
  * Creates an in-process host that routes requests to distinct actor cells.
@@ -1,8 +1,26 @@
1
- import { Effect } from 'effect';
1
+ import { Data, Effect } from 'effect';
2
2
  import { EventStoreTag } from '@swirls/looms/core';
3
3
  import { createTimeoutScheduler, isLoomsApiPath } from '@swirls/looms/runtime';
4
4
  import { createActorCell } from './cell.js';
5
- import { resolveRunTarget } from './routing.js';
5
+ import { resolveRunTarget, RunTargetError } from './routing.js';
6
+ class ActorWakeError extends Data.TaggedError('ActorWakeError') {
7
+ constructor(cause) {
8
+ super({
9
+ cause,
10
+ message: cause instanceof Error ? cause.message : String(cause),
11
+ });
12
+ this.name = 'ActorWakeError';
13
+ }
14
+ }
15
+ class ActorHostError extends Data.TaggedError('ActorHostError') {
16
+ constructor(cause) {
17
+ super({
18
+ cause,
19
+ message: cause instanceof Error ? cause.message : String(cause),
20
+ });
21
+ this.name = 'ActorHostError';
22
+ }
23
+ }
6
24
  /**
7
25
  * Creates an in-process host that routes requests to distinct actor cells.
8
26
  * Useful for local Bun actor backends, tests, and lightweight simulation.
@@ -15,18 +33,19 @@ export function createLocalActorHost(options) {
15
33
  if (existing) {
16
34
  return existing;
17
35
  }
18
- const cellPromise = (async () => {
19
- const store = await options.createStore(runId);
36
+ const cellPromise = Effect.runPromise(Effect.gen(function* () {
37
+ const store = yield* Effect.tryPromise({
38
+ try: () => Promise.resolve(options.createStore(runId)),
39
+ catch: (cause) => new ActorHostError(cause),
40
+ });
20
41
  // Assign after createActorCell so the scheduler never closes over an unassigned cell.
21
42
  let wake;
22
- const scheduler = createTimeoutScheduler((scheduledRunId) => {
23
- if (scheduledRunId !== runId) {
24
- return;
25
- }
26
- void wake?.().catch((err) => {
27
- console.error('[actor host wake error]', err);
28
- });
29
- });
43
+ const scheduler = createTimeoutScheduler((scheduledRunId) => scheduledRunId === runId && wake
44
+ ? Effect.tryPromise({
45
+ try: wake,
46
+ catch: (cause) => new ActorWakeError(cause),
47
+ }).pipe(Effect.tapError(Effect.logError), Effect.ignore)
48
+ : Effect.void);
30
49
  const cell = createActorCell({
31
50
  runId,
32
51
  store,
@@ -36,47 +55,52 @@ export function createLocalActorHost(options) {
36
55
  snapshotEvery: options.snapshotEvery,
37
56
  maxWakeIterations: options.maxWakeIterations,
38
57
  trimAfterSnapshot: options.trimAfterSnapshot,
58
+ authorize: options.authorize,
39
59
  });
40
60
  wake = () => cell.wake();
41
61
  if (rescanTimers) {
42
- await Effect.runPromise(Effect.provideService(cell.runtime.rescanTimers(), EventStoreTag, store)).catch((err) => {
43
- console.error('[actor host rescan timers error]', err);
44
- });
62
+ yield* Effect.provideService(cell.runtime.rescanTimers, EventStoreTag, store).pipe(Effect.tapError(Effect.logError), Effect.ignore);
45
63
  }
46
64
  return cell;
47
- })();
65
+ }));
48
66
  cells.set(runId, cellPromise);
49
67
  return cellPromise;
50
68
  };
51
69
  return {
52
70
  getCell,
53
- fetch: async (req) => {
71
+ fetch: (req) => {
54
72
  const url = new URL(req.url);
55
73
  if (!isLoomsApiPath(url.pathname)) {
56
- return null;
74
+ return Promise.resolve(null);
57
75
  }
58
76
  if (url.pathname === '/health') {
59
- return Response.json({ ok: true });
77
+ return Promise.resolve(Response.json({ ok: true }));
60
78
  }
61
- if (req.method === 'GET' && url.pathname === '/runs') {
62
- return Response.json({
79
+ if (req.method === 'GET' &&
80
+ (url.pathname === '/runs' || url.pathname === '/runs/summaries')) {
81
+ return Promise.resolve(Response.json({
63
82
  error: 'Global run listing is not supported in the actor host without a global index',
64
- }, { status: 501 });
65
- }
66
- try {
67
- const { runId, request } = await resolveRunTarget(req);
68
- const cell = await getCell(runId);
69
- return cell.fetch(request);
70
- }
71
- catch {
72
- return new Response('Not Found', { status: 404 });
83
+ }, { status: 501 }));
73
84
  }
85
+ return Effect.runPromise(Effect.gen(function* () {
86
+ const { runId, request } = yield* Effect.tryPromise({
87
+ try: () => resolveRunTarget(req),
88
+ catch: (cause) => new ActorHostError(cause),
89
+ });
90
+ const cell = yield* Effect.tryPromise({
91
+ try: () => getCell(runId),
92
+ catch: (cause) => new ActorHostError(cause),
93
+ });
94
+ return yield* Effect.tryPromise({
95
+ try: () => cell.fetch(request),
96
+ catch: (cause) => new ActorHostError(cause),
97
+ });
98
+ }).pipe(Effect.catchIf((error) => error.cause instanceof RunTargetError, () => Effect.succeed(new Response('Not Found', { status: 404 })))));
74
99
  },
75
100
  dispose: () => {
76
- for (const promise of cells.values()) {
77
- void promise.then((cell) => cell.dispose());
78
- }
101
+ const disposals = [...cells.values()].map((promise) => promise.then((cell) => cell.dispose()));
79
102
  cells.clear();
103
+ return Promise.all(disposals).then(() => undefined);
80
104
  },
81
105
  };
82
106
  }
@@ -1,3 +1,3 @@
1
1
  export { createActorCell, type ActorCell, type ActorCellOptions } from './cell';
2
- export { runIdFromRequest, resolveRunTarget, type ResolvedRunTarget } from './routing';
2
+ export { runIdFromRequest, resolveRunTarget, RunTargetError, type ResolvedRunTarget, } from './routing';
3
3
  export { createLocalActorHost, type LocalActorHost, type LocalActorHostOptions } from './host';
@@ -1,3 +1,3 @@
1
1
  export { createActorCell } from './cell.js';
2
- export { runIdFromRequest, resolveRunTarget } from './routing.js';
2
+ export { runIdFromRequest, resolveRunTarget, RunTargetError, } from './routing.js';
3
3
  export { createLocalActorHost } from './host.js';
@@ -1,15 +1,26 @@
1
1
  /**
2
2
  * Extracts the target `runId` from a Looms HTTP request.
3
- * Inspects `x-looms-run-id`, `/runs/:runId/*`, and `/api/events?runId=*`.
3
+ * Inspects `x-looms-run-id` and `/runs/:runId/*`.
4
4
  */
5
5
  export declare function runIdFromRequest(req: Request): string | null;
6
6
  export interface ResolvedRunTarget {
7
7
  readonly runId: string;
8
8
  readonly request: Request;
9
9
  }
10
+ declare const RunTargetError_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 & {
11
+ readonly _tag: "RunTargetError";
12
+ } & Readonly<A>;
13
+ export declare class RunTargetError extends RunTargetError_base<{
14
+ readonly method: string;
15
+ readonly path: string;
16
+ readonly message: string;
17
+ }> {
18
+ constructor(method: string, path: string);
19
+ }
10
20
  /**
11
21
  * Resolves the destination `runId` for routing to an actor cell.
12
22
  * For `POST /runs` without a `runId`, creates a fresh `runId`, injects it
13
23
  * into the body, and sets `x-looms-run-id`.
14
24
  */
15
25
  export declare function resolveRunTarget(req: Request): Promise<ResolvedRunTarget>;
26
+ export {};
@@ -1,5 +1,5 @@
1
- import { Option, Schema } from 'effect';
2
- import { createRunId, isJsonObject } from '@swirls/looms/core';
1
+ import { Data, Effect, Option, Schema } from 'effect';
2
+ import { createRunId, isJsonObject, stringifyJson } from '@swirls/looms/core';
3
3
  const RunTargetBodySchema = Schema.Struct({
4
4
  runId: Schema.optional(Schema.NonEmptyString),
5
5
  });
@@ -7,7 +7,7 @@ const decodeRunTargetBody = Schema.decodeUnknownOption(Schema.fromJsonString(Run
7
7
  const decodePayloadRecord = Schema.decodeUnknownOption(Schema.fromJsonString(Schema.Record(Schema.String, Schema.Json)));
8
8
  /**
9
9
  * Extracts the target `runId` from a Looms HTTP request.
10
- * Inspects `x-looms-run-id`, `/runs/:runId/*`, and `/api/events?runId=*`.
10
+ * Inspects `x-looms-run-id` and `/runs/:runId/*`.
11
11
  */
12
12
  export function runIdFromRequest(req) {
13
13
  const header = req.headers.get('x-looms-run-id');
@@ -20,61 +20,67 @@ export function runIdFromRequest(req) {
20
20
  if (runsMatch && runsMatch[1]) {
21
21
  return decodeURIComponent(runsMatch[1]);
22
22
  }
23
- if (path.startsWith('/api/events')) {
24
- const runId = url.searchParams.get('runId');
25
- if (runId) {
26
- return runId;
27
- }
28
- }
29
23
  return null;
30
24
  }
25
+ export class RunTargetError extends Data.TaggedError('RunTargetError') {
26
+ constructor(method, path) {
27
+ super({
28
+ method,
29
+ path,
30
+ message: `Cannot resolve runId from request: ${method} ${path}`,
31
+ });
32
+ this.name = 'RunTargetError';
33
+ }
34
+ }
31
35
  /**
32
36
  * Resolves the destination `runId` for routing to an actor cell.
33
37
  * For `POST /runs` without a `runId`, creates a fresh `runId`, injects it
34
38
  * into the body, and sets `x-looms-run-id`.
35
39
  */
36
- export async function resolveRunTarget(req) {
37
- const existing = runIdFromRequest(req);
38
- if (existing) {
39
- if (req.headers.get('x-looms-run-id') === existing) {
40
- return { runId: existing, request: req };
40
+ export function resolveRunTarget(req) {
41
+ return Effect.runPromise(Effect.gen(function* () {
42
+ const existing = runIdFromRequest(req);
43
+ if (existing) {
44
+ if (req.headers.get('x-looms-run-id') === existing) {
45
+ return { runId: existing, request: req };
46
+ }
47
+ const headers = new Headers(req.headers);
48
+ headers.set('x-looms-run-id', existing);
49
+ const request = new Request(req.url, {
50
+ method: req.method,
51
+ headers,
52
+ body: req.body,
53
+ // SAFETY: duplex 'half' is required when streaming request body in standard Fetch.
54
+ // @ts-expect-error duplex is supported in modern runtimes
55
+ duplex: req.body ? 'half' : undefined,
56
+ });
57
+ return { runId: existing, request };
41
58
  }
42
- const headers = new Headers(req.headers);
43
- headers.set('x-looms-run-id', existing);
44
- const request = new Request(req.url, {
45
- method: req.method,
46
- headers,
47
- body: req.body,
48
- // SAFETY: duplex 'half' is required when streaming request body in standard Fetch.
49
- // @ts-expect-error duplex is supported in modern runtimes
50
- duplex: req.body ? 'half' : undefined,
51
- });
52
- return { runId: existing, request };
53
- }
54
- const url = new URL(req.url);
55
- if (req.method === 'POST' && url.pathname === '/runs') {
56
- const text = await req.clone().text();
57
- const decoded = decodeRunTargetBody(text);
58
- let runId;
59
- if (Option.isSome(decoded) && decoded.value.runId) {
60
- runId = decoded.value.runId;
61
- }
62
- else {
63
- runId = createRunId();
59
+ const url = new URL(req.url);
60
+ if (req.method === 'POST' && url.pathname === '/runs') {
61
+ const text = yield* Effect.promise(() => req.clone().text());
62
+ const decoded = decodeRunTargetBody(text);
63
+ let runId;
64
+ if (Option.isSome(decoded) && decoded.value.runId) {
65
+ runId = decoded.value.runId;
66
+ }
67
+ else {
68
+ runId = createRunId();
69
+ }
70
+ const decodedRecord = decodePayloadRecord(text);
71
+ const payloadObj = Option.isSome(decodedRecord) && isJsonObject(decodedRecord.value)
72
+ ? { ...decodedRecord.value, runId }
73
+ : { runId };
74
+ const headers = new Headers(req.headers);
75
+ headers.set('x-looms-run-id', runId);
76
+ headers.set('content-type', 'application/json');
77
+ const request = new Request(req.url, {
78
+ method: req.method,
79
+ headers,
80
+ body: stringifyJson(payloadObj),
81
+ });
82
+ return { runId, request };
64
83
  }
65
- const decodedRecord = decodePayloadRecord(text);
66
- const payloadObj = Option.isSome(decodedRecord) && isJsonObject(decodedRecord.value)
67
- ? { ...decodedRecord.value, runId }
68
- : { runId };
69
- const headers = new Headers(req.headers);
70
- headers.set('x-looms-run-id', runId);
71
- headers.set('content-type', 'application/json');
72
- const request = new Request(req.url, {
73
- method: req.method,
74
- headers,
75
- body: JSON.stringify(payloadObj),
76
- });
77
- return { runId, request };
78
- }
79
- throw new Error(`Cannot resolve runId from request: ${req.method} ${url.pathname}`);
84
+ return yield* new RunTargetError(req.method, url.pathname);
85
+ }));
80
86
  }
@@ -0,0 +1,5 @@
1
+ import { type DefinitionStore, type ThreadDefinition } from '@swirls/looms/core';
2
+ import type { AgentSessionDefinition } from './definitions';
3
+ import type { AgentSessionSnapshot, AgentSessionState } from './types';
4
+ export declare function createAgentSessionThread(definitions: DefinitionStore<AgentSessionDefinition>): ThreadDefinition<AgentSessionState>;
5
+ export declare function agentSessionSnapshot(state: AgentSessionState): AgentSessionSnapshot;