@sixb/core 0.1.18 → 0.1.20

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 (523) hide show
  1. package/README.md +7 -6
  2. package/dist/actions/commit-edits.d.ts +7 -19
  3. package/dist/actions/commit-edits.d.ts.map +1 -1
  4. package/dist/actions/errors.d.ts +0 -3
  5. package/dist/actions/errors.d.ts.map +1 -1
  6. package/dist/actions/execution.d.ts +10 -3
  7. package/dist/actions/execution.d.ts.map +1 -1
  8. package/dist/actions/index.d.ts +6 -9
  9. package/dist/actions/index.d.ts.map +1 -1
  10. package/dist/actions/index.js +51 -50
  11. package/dist/actions/index.js.map +1 -1
  12. package/dist/actions/request.d.ts +14 -25
  13. package/dist/actions/request.d.ts.map +1 -1
  14. package/dist/actions/run/context.d.ts +40 -0
  15. package/dist/actions/run/context.d.ts.map +1 -0
  16. package/dist/actions/run/edits-commit.d.ts +31 -0
  17. package/dist/actions/run/edits-commit.d.ts.map +1 -0
  18. package/dist/actions/run/effects.d.ts +23 -0
  19. package/dist/actions/run/effects.d.ts.map +1 -0
  20. package/dist/actions/run/execute.d.ts +30 -0
  21. package/dist/actions/run/execute.d.ts.map +1 -0
  22. package/dist/actions/run/executor.d.ts +95 -0
  23. package/dist/actions/run/executor.d.ts.map +1 -0
  24. package/dist/actions/run/normalize.d.ts +36 -0
  25. package/dist/actions/run/normalize.d.ts.map +1 -0
  26. package/dist/actions/run/phase-types.d.ts +18 -0
  27. package/dist/actions/run/phase-types.d.ts.map +1 -0
  28. package/dist/actions/run/phases.d.ts +20 -0
  29. package/dist/actions/run/phases.d.ts.map +1 -0
  30. package/dist/actions/run/run-action.d.ts +25 -0
  31. package/dist/actions/run/run-action.d.ts.map +1 -0
  32. package/dist/actions/run/signals.d.ts +67 -0
  33. package/dist/actions/run/signals.d.ts.map +1 -0
  34. package/dist/actions/run/state.d.ts +47 -0
  35. package/dist/actions/run/state.d.ts.map +1 -0
  36. package/dist/actions/run/types.d.ts +54 -0
  37. package/dist/actions/run/types.d.ts.map +1 -0
  38. package/dist/actions/run/writeback.d.ts +17 -0
  39. package/dist/actions/run/writeback.d.ts.map +1 -0
  40. package/dist/actions/run-authorization.d.ts +1 -1
  41. package/dist/actions/run-authorization.d.ts.map +1 -1
  42. package/dist/actions/run-persistence.d.ts +53 -0
  43. package/dist/actions/run-persistence.d.ts.map +1 -0
  44. package/dist/actions/types/context.d.ts +10 -0
  45. package/dist/actions/types/context.d.ts.map +1 -1
  46. package/dist/agents/index.js +52 -55
  47. package/dist/agents/index.js.map +1 -1
  48. package/dist/agents/streams/index.js +2 -2
  49. package/dist/agents/streams/internal.js +2 -2
  50. package/dist/auth/cookies.d.ts +2 -4
  51. package/dist/auth/cookies.d.ts.map +1 -1
  52. package/dist/auth/index.d.ts +0 -2
  53. package/dist/auth/index.d.ts.map +1 -1
  54. package/dist/auth/index.js +15 -21
  55. package/dist/auth/index.js.map +1 -1
  56. package/dist/auth/runtime.d.ts +8 -10
  57. package/dist/auth/runtime.d.ts.map +1 -1
  58. package/dist/auth/session-cache.d.ts +1 -5
  59. package/dist/auth/session-cache.d.ts.map +1 -1
  60. package/dist/auth/strategy.js +1 -1
  61. package/dist/auth/types.d.ts +4 -8
  62. package/dist/auth/types.d.ts.map +1 -1
  63. package/dist/auth/validation.d.ts +0 -1
  64. package/dist/auth/validation.d.ts.map +1 -1
  65. package/dist/authorization/decision.d.ts +0 -4
  66. package/dist/authorization/decision.d.ts.map +1 -1
  67. package/dist/authorization/event-visibility.d.ts.map +1 -1
  68. package/dist/authorization/grant-kinds.d.ts +6 -8
  69. package/dist/authorization/grant-kinds.d.ts.map +1 -1
  70. package/dist/authorization/index.d.ts +0 -1
  71. package/dist/authorization/index.d.ts.map +1 -1
  72. package/dist/authorization/index.js +5 -9
  73. package/dist/authorization/index.js.map +1 -1
  74. package/dist/authorization/resolve.d.ts +1 -1
  75. package/dist/authorization/resolve.d.ts.map +1 -1
  76. package/dist/bootstrap/index.js +50 -53
  77. package/dist/bootstrap/index.js.map +2 -2
  78. package/dist/{chunk-vz3gc1tm.js → chunk-0rbyz4qy.js} +67 -69
  79. package/dist/{chunk-vz3gc1tm.js.map → chunk-0rbyz4qy.js.map} +4 -4
  80. package/dist/{chunk-rz53yb4v.js → chunk-0yh890a4.js} +1 -1
  81. package/dist/{chunk-vgk3hknm.js → chunk-1k89ecfr.js} +1 -1
  82. package/dist/{chunk-ny3xyvcn.js → chunk-1zq2p6g0.js} +3 -3
  83. package/dist/{chunk-dnmadg9k.js → chunk-3t2hgbgd.js} +2 -2
  84. package/dist/{chunk-k6hrnf35.js → chunk-4vyr1j8f.js} +51 -4
  85. package/dist/chunk-4vyr1j8f.js.map +11 -0
  86. package/dist/{chunk-22v5bpz3.js → chunk-5e43w60z.js} +1 -1
  87. package/dist/{chunk-de4z2bj6.js → chunk-5j58wjct.js} +17 -17
  88. package/dist/chunk-5j58wjct.js.map +18 -0
  89. package/dist/{chunk-fe52eczz.js → chunk-6c6sn0bh.js} +6352 -2127
  90. package/dist/chunk-6c6sn0bh.js.map +106 -0
  91. package/dist/{chunk-7hpdd6r9.js → chunk-6p49a5cq.js} +4 -4
  92. package/dist/{chunk-b9affek3.js → chunk-7n440zgt.js} +30 -30
  93. package/dist/{chunk-b9affek3.js.map → chunk-7n440zgt.js.map} +4 -4
  94. package/dist/{chunk-kkqwzy6h.js → chunk-7t429e3f.js} +1 -1
  95. package/dist/{chunk-6fsr7y93.js → chunk-8mx7qw3y.js} +14 -13
  96. package/dist/{chunk-6fsr7y93.js.map → chunk-8mx7qw3y.js.map} +4 -4
  97. package/dist/{chunk-kpx7jrmn.js → chunk-91mg3nj9.js} +59 -59
  98. package/dist/{chunk-kpx7jrmn.js.map → chunk-91mg3nj9.js.map} +5 -5
  99. package/dist/{chunk-ex496vct.js → chunk-9dmt152s.js} +1 -1
  100. package/dist/{chunk-48e3cn2d.js → chunk-9gyp8hg1.js} +2 -2
  101. package/dist/{chunk-ewqa58h9.js → chunk-9k93ah50.js} +4 -4
  102. package/dist/{chunk-ewqa58h9.js.map → chunk-9k93ah50.js.map} +1 -1
  103. package/dist/{chunk-zxawp1n2.js → chunk-9w055r5b.js} +1 -1
  104. package/dist/{chunk-4wn7bxxa.js → chunk-9ybhtmg4.js} +1 -1
  105. package/dist/{chunk-fc5zfxy1.js → chunk-a40ad1ft.js} +5 -13
  106. package/dist/chunk-a40ad1ft.js.map +10 -0
  107. package/dist/{chunk-y2aq6ag9.js → chunk-b38szspf.js} +5 -14
  108. package/dist/chunk-b38szspf.js.map +11 -0
  109. package/dist/{chunk-r2y23egw.js → chunk-bkpke1sg.js} +1 -10
  110. package/dist/chunk-bkpke1sg.js.map +10 -0
  111. package/dist/{chunk-htr6wjmv.js → chunk-bx9q3cwv.js} +22 -22
  112. package/dist/{chunk-htr6wjmv.js.map → chunk-bx9q3cwv.js.map} +1 -1
  113. package/dist/{chunk-vx2yp45y.js → chunk-c85m1hyj.js} +2 -2
  114. package/dist/{chunk-bs7sqkre.js → chunk-d09tj99x.js} +2 -2
  115. package/dist/{chunk-qkbx3tf6.js → chunk-d0bqz29d.js} +27 -47
  116. package/dist/chunk-d0bqz29d.js.map +23 -0
  117. package/dist/{chunk-zb77kjth.js → chunk-dk8tkk5f.js} +4 -4
  118. package/dist/{chunk-xt1zt7gv.js → chunk-es1gxsbf.js} +24 -15
  119. package/dist/chunk-es1gxsbf.js.map +13 -0
  120. package/dist/{chunk-vjcd8d27.js → chunk-fa02jy15.js} +1 -1
  121. package/dist/{chunk-za5yd58j.js → chunk-fkgc1wt8.js} +2 -2
  122. package/dist/{chunk-enpsx8k5.js → chunk-gsjm1wms.js} +16 -20
  123. package/dist/chunk-gsjm1wms.js.map +10 -0
  124. package/dist/{chunk-2jntasmh.js → chunk-hcbyfxbe.js} +25 -49
  125. package/dist/chunk-hcbyfxbe.js.map +12 -0
  126. package/dist/{chunk-p0dqwj3n.js → chunk-hjzdd750.js} +66 -47
  127. package/dist/{chunk-p0dqwj3n.js.map → chunk-hjzdd750.js.map} +4 -4
  128. package/dist/chunk-hkc3jct7.js.map +1 -1
  129. package/dist/{chunk-y05543x6.js → chunk-hvsb78a1.js} +4 -4
  130. package/dist/{chunk-y05543x6.js.map → chunk-hvsb78a1.js.map} +1 -1
  131. package/dist/{chunk-1b1f2d5f.js → chunk-k6q3n2sc.js} +9 -9
  132. package/dist/{chunk-1b1f2d5f.js.map → chunk-k6q3n2sc.js.map} +1 -1
  133. package/dist/{chunk-wr8qp979.js → chunk-m427qgq0.js} +9 -5
  134. package/dist/{chunk-wr8qp979.js.map → chunk-m427qgq0.js.map} +4 -3
  135. package/dist/{chunk-qq90g05n.js → chunk-n33z5bjw.js} +50 -240
  136. package/dist/{chunk-qq90g05n.js.map → chunk-n33z5bjw.js.map} +4 -4
  137. package/dist/{chunk-e1c18xjx.js → chunk-nq6gpjt7.js} +4 -45
  138. package/dist/{chunk-e1c18xjx.js.map → chunk-nq6gpjt7.js.map} +5 -5
  139. package/dist/{chunk-1hqwggsn.js → chunk-nzapm6p0.js} +1 -2
  140. package/dist/chunk-nzapm6p0.js.map +12 -0
  141. package/dist/{chunk-wt4szfec.js → chunk-pbcbn83d.js} +4 -4
  142. package/dist/{chunk-wt4szfec.js.map → chunk-pbcbn83d.js.map} +1 -1
  143. package/dist/{chunk-s4jhg8a3.js → chunk-ren4kg2j.js} +15 -15
  144. package/dist/{chunk-s4jhg8a3.js.map → chunk-ren4kg2j.js.map} +1 -1
  145. package/dist/{chunk-d0eb5yy6.js → chunk-rrzt8jdy.js} +5 -5
  146. package/dist/{chunk-d0eb5yy6.js.map → chunk-rrzt8jdy.js.map} +1 -1
  147. package/dist/{chunk-y9jmd7e5.js → chunk-s16apyk9.js} +102 -16
  148. package/dist/chunk-s16apyk9.js.map +16 -0
  149. package/dist/{chunk-6gmfggss.js → chunk-t7x8dmn0.js} +2 -2
  150. package/dist/{chunk-f1zxad2t.js → chunk-tg2cw67r.js} +6 -6
  151. package/dist/{chunk-f1zxad2t.js.map → chunk-tg2cw67r.js.map} +1 -1
  152. package/dist/{chunk-p844e0rn.js → chunk-tpn40322.js} +2 -2
  153. package/dist/{chunk-rt9p8m9t.js → chunk-v9xd5wzd.js} +1 -1
  154. package/dist/{chunk-6h5m9xjx.js → chunk-vpq4shxz.js} +49 -113
  155. package/dist/chunk-vpq4shxz.js.map +39 -0
  156. package/dist/{chunk-2vhg6ysa.js → chunk-vyf9kfqf.js} +1 -1
  157. package/dist/{chunk-bwjcehza.js → chunk-way52z4h.js} +1 -1
  158. package/dist/{chunk-qkvz64nd.js → chunk-x6m907x7.js} +3 -3
  159. package/dist/{chunk-yv9czyfr.js → chunk-xfs8x8m9.js} +5 -5
  160. package/dist/chunk-y0c4e6ex.js +16 -0
  161. package/dist/chunk-y0c4e6ex.js.map +10 -0
  162. package/dist/{chunk-v6xpd60t.js → chunk-yevzdx4y.js} +5 -5
  163. package/dist/{chunk-dfm066qg.js → chunk-yxd3nnqt.js} +2 -29
  164. package/dist/chunk-yxd3nnqt.js.map +11 -0
  165. package/dist/{chunk-70jmg2zx.js → chunk-yzwja0mj.js} +4 -19
  166. package/dist/{chunk-70jmg2zx.js.map → chunk-yzwja0mj.js.map} +3 -3
  167. package/dist/{chunk-qmnnhde6.js → chunk-z4m0yz8c.js} +1 -1
  168. package/dist/datasets/write.js +5 -5
  169. package/dist/deploy/index.d.ts +1 -1
  170. package/dist/deploy/index.d.ts.map +1 -1
  171. package/dist/deploy/internal.js +13 -10
  172. package/dist/deploy/internal.js.map +4 -4
  173. package/dist/deploy/services.d.ts +1 -2
  174. package/dist/deploy/services.d.ts.map +1 -1
  175. package/dist/deploy/types.d.ts +7 -7
  176. package/dist/deploy/types.d.ts.map +1 -1
  177. package/dist/deploy/validation.d.ts.map +1 -1
  178. package/dist/edits/index.js +3 -5
  179. package/dist/edits/index.js.map +1 -1
  180. package/dist/error-reporting/internal.js +3 -3
  181. package/dist/error-reporting/types.d.ts +2 -9
  182. package/dist/error-reporting/types.d.ts.map +1 -1
  183. package/dist/errors/catalog.d.ts +12 -0
  184. package/dist/errors/catalog.d.ts.map +1 -1
  185. package/dist/errors/internal.js +1 -1
  186. package/dist/events/definitions.d.ts +0 -5
  187. package/dist/events/definitions.d.ts.map +1 -1
  188. package/dist/events/index.d.ts +3 -3
  189. package/dist/events/index.d.ts.map +1 -1
  190. package/dist/events/index.js +6 -8
  191. package/dist/events/index.js.map +1 -1
  192. package/dist/events/scope.d.ts +0 -1
  193. package/dist/events/scope.d.ts.map +1 -1
  194. package/dist/events/scope.js +1 -1
  195. package/dist/events/selectors/builder.d.ts +1 -8
  196. package/dist/events/selectors/builder.d.ts.map +1 -1
  197. package/dist/events/selectors/index.d.ts +2 -2
  198. package/dist/events/selectors/index.d.ts.map +1 -1
  199. package/dist/events/selectors/index.js +2 -2
  200. package/dist/events/selectors/predicate.d.ts.map +1 -1
  201. package/dist/events/selectors/types.d.ts +2 -33
  202. package/dist/events/selectors/types.d.ts.map +1 -1
  203. package/dist/events/types/index.d.ts +1 -12
  204. package/dist/events/types/index.d.ts.map +1 -1
  205. package/dist/execution/agent.js +41 -44
  206. package/dist/execution/agent.js.map +1 -1
  207. package/dist/execution/authorization.d.ts.map +1 -1
  208. package/dist/execution/primitive.js +60 -91
  209. package/dist/execution/primitive.js.map +3 -4
  210. package/dist/execution/request.js +40 -43
  211. package/dist/execution/request.js.map +2 -2
  212. package/dist/index.d.ts +8 -8
  213. package/dist/index.d.ts.map +1 -1
  214. package/dist/index.js +105 -127
  215. package/dist/index.js.map +1 -1
  216. package/dist/lake-storage/index.js +5 -5
  217. package/dist/materialization/index.js +3 -3
  218. package/dist/materialization/index.js.map +1 -1
  219. package/dist/materialization/model.d.ts +19 -6
  220. package/dist/materialization/model.d.ts.map +1 -1
  221. package/dist/materializer/index.js +31 -31
  222. package/dist/materializer/index.js.map +1 -1
  223. package/dist/materializer/shared/normalize.d.ts.map +1 -1
  224. package/dist/models/execution/index.js +21 -21
  225. package/dist/objects/action/errors.d.ts +0 -9
  226. package/dist/objects/action/errors.d.ts.map +1 -1
  227. package/dist/objects/action/index.d.ts +3 -3
  228. package/dist/objects/action/index.d.ts.map +1 -1
  229. package/dist/objects/action/request.d.ts +2 -8
  230. package/dist/objects/action/request.d.ts.map +1 -1
  231. package/dist/objects/execution.d.ts +0 -2
  232. package/dist/objects/execution.d.ts.map +1 -1
  233. package/dist/objects/index.js +44 -29
  234. package/dist/objects/index.js.map +1 -1
  235. package/dist/objects/query/index.js +29 -29
  236. package/dist/objects/query/index.js.map +1 -1
  237. package/dist/objects/sdk/object-handle.d.ts.map +1 -1
  238. package/dist/objects/sdk/object-set.d.ts.map +1 -1
  239. package/dist/objects/service/index.d.ts +0 -1
  240. package/dist/objects/service/index.d.ts.map +1 -1
  241. package/dist/objects/vectors/handle.d.ts.map +1 -1
  242. package/dist/objects/vectors/profile.d.ts +5 -0
  243. package/dist/objects/vectors/profile.d.ts.map +1 -1
  244. package/dist/ontology/index.js +6 -6
  245. package/dist/ontology/index.js.map +1 -1
  246. package/dist/ontology/internal.js +2 -2
  247. package/dist/pipelines/index.js +28 -28
  248. package/dist/projections/internal.js +22 -22
  249. package/dist/projections/internal.js.map +1 -1
  250. package/dist/query.js +2 -2
  251. package/dist/queues/in-memory.d.ts +1 -2
  252. package/dist/queues/in-memory.d.ts.map +1 -1
  253. package/dist/queues/index.d.ts +1 -1
  254. package/dist/queues/index.d.ts.map +1 -1
  255. package/dist/queues/index.js +1 -1
  256. package/dist/queues/types.d.ts +0 -7
  257. package/dist/queues/types.d.ts.map +1 -1
  258. package/dist/runtime/host.d.ts.map +1 -1
  259. package/dist/runtime/internal.js +27 -28
  260. package/dist/runtime/internal.js.map +1 -1
  261. package/dist/runtime/resolve-definitions.d.ts.map +1 -1
  262. package/dist/runtime/types.d.ts +16 -36
  263. package/dist/runtime/types.d.ts.map +1 -1
  264. package/dist/sandboxes/index.js +5 -5
  265. package/dist/schedules/builders.d.ts.map +1 -1
  266. package/dist/schedules/index.js +3 -3
  267. package/dist/schedules/runtime.d.ts.map +1 -1
  268. package/dist/schedules/validation.d.ts +0 -1
  269. package/dist/schedules/validation.d.ts.map +1 -1
  270. package/dist/security/builders.d.ts.map +1 -1
  271. package/dist/security/every.d.ts +2 -5
  272. package/dist/security/every.d.ts.map +1 -1
  273. package/dist/security/grants.d.ts +2 -4
  274. package/dist/security/grants.d.ts.map +1 -1
  275. package/dist/security/index.d.ts +1 -2
  276. package/dist/security/index.d.ts.map +1 -1
  277. package/dist/security/membership-policies.d.ts.map +1 -1
  278. package/dist/security/public.d.ts +10 -0
  279. package/dist/security/public.d.ts.map +1 -0
  280. package/dist/security/public.js +10 -0
  281. package/dist/security/public.js.map +9 -0
  282. package/dist/security/registry.d.ts +0 -1
  283. package/dist/security/registry.d.ts.map +1 -1
  284. package/dist/security/types.d.ts +13 -18
  285. package/dist/security/types.d.ts.map +1 -1
  286. package/dist/security/validation.d.ts +0 -6
  287. package/dist/security/validation.d.ts.map +1 -1
  288. package/dist/shares/internal.js +20 -20
  289. package/dist/storage/action-runs/failure.js +2 -2
  290. package/dist/storage/action-runs/idempotency.d.ts +3 -4
  291. package/dist/storage/action-runs/idempotency.d.ts.map +1 -1
  292. package/dist/storage/action-runs/in-memory.d.ts +2 -9
  293. package/dist/storage/action-runs/in-memory.d.ts.map +1 -1
  294. package/dist/storage/action-runs/index.d.ts +1 -3
  295. package/dist/storage/action-runs/index.d.ts.map +1 -1
  296. package/dist/storage/action-runs/provider.js +1 -1
  297. package/dist/storage/action-runs/record.d.ts +20 -0
  298. package/dist/storage/action-runs/record.d.ts.map +1 -0
  299. package/dist/storage/action-runs/types.d.ts +39 -68
  300. package/dist/storage/action-runs/types.d.ts.map +1 -1
  301. package/dist/storage/agents/types.d.ts +1 -1
  302. package/dist/storage/ai-limits/enforcement.js +2 -2
  303. package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
  304. package/dist/storage/auth/in-memory/magic-links.d.ts.map +1 -1
  305. package/dist/storage/auth/in-memory/oidc-attempts.d.ts.map +1 -1
  306. package/dist/storage/auth/in-memory/sessions.d.ts +0 -10
  307. package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -1
  308. package/dist/storage/auth/in-memory/shared.d.ts +1 -2
  309. package/dist/storage/auth/in-memory/shared.d.ts.map +1 -1
  310. package/dist/storage/auth/types.d.ts +1 -17
  311. package/dist/storage/auth/types.d.ts.map +1 -1
  312. package/dist/storage/connector-connections/provider.js +1 -1
  313. package/dist/storage/file-upload-sessions/provider.js +10 -10
  314. package/dist/storage/index.d.ts +2 -2
  315. package/dist/storage/index.d.ts.map +1 -1
  316. package/dist/storage/index.js +21 -22
  317. package/dist/storage/index.js.map +1 -1
  318. package/dist/storage/internal.d.ts +1 -1
  319. package/dist/storage/internal.d.ts.map +1 -1
  320. package/dist/storage/internal.js +9 -12
  321. package/dist/storage/internal.js.map +1 -1
  322. package/dist/storage/objects/execution-limits.d.ts +1 -1
  323. package/dist/storage/objects/execution-limits.d.ts.map +1 -1
  324. package/dist/storage/ontology/provider.js +2 -2
  325. package/dist/storage/projection-runs/provider.js +2 -2
  326. package/dist/storage/types.d.ts +1 -1
  327. package/dist/storage/types.d.ts.map +1 -1
  328. package/dist/storage/workflow-runs/provider.js +10 -10
  329. package/dist/syncs/index.js +29 -29
  330. package/dist/testing/action-execution.d.ts +34 -4
  331. package/dist/testing/action-execution.d.ts.map +1 -1
  332. package/dist/testing/action-run-storage-contract.d.ts +11 -0
  333. package/dist/testing/action-run-storage-contract.d.ts.map +1 -0
  334. package/dist/testing/auth-storage-contract.d.ts.map +1 -1
  335. package/dist/testing/index.d.ts +2 -1
  336. package/dist/testing/index.d.ts.map +1 -1
  337. package/dist/testing/index.js +3205 -2946
  338. package/dist/testing/index.js.map +9 -8
  339. package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
  340. package/dist/testing/queues-contract.d.ts.map +1 -1
  341. package/dist/webhooks/internal.js +26 -26
  342. package/dist/webhooks/internal.js.map +1 -1
  343. package/dist/workers/index.js +1 -1
  344. package/dist/workflows/index.js +48 -51
  345. package/dist/workflows/index.js.map +1 -1
  346. package/package.json +8 -8
  347. package/src/actions/commit-edits.ts +9 -37
  348. package/src/actions/errors.ts +0 -4
  349. package/src/actions/execution.ts +10 -10
  350. package/src/actions/index.ts +5 -24
  351. package/src/actions/request.ts +157 -295
  352. package/src/actions/run/context.ts +193 -0
  353. package/src/actions/run/edits-commit.ts +102 -0
  354. package/src/actions/run/effects.ts +105 -0
  355. package/src/actions/run/execute.ts +113 -0
  356. package/src/actions/run/executor.ts +314 -0
  357. package/src/actions/run/normalize.ts +142 -0
  358. package/src/actions/run/phase-types.ts +20 -0
  359. package/src/actions/run/phases.ts +150 -0
  360. package/src/actions/run/run-action.ts +170 -0
  361. package/src/actions/run/signals.ts +118 -0
  362. package/src/actions/run/state.ts +95 -0
  363. package/src/actions/run/types.ts +61 -0
  364. package/src/actions/run/writeback.ts +79 -0
  365. package/src/actions/run-authorization.ts +1 -1
  366. package/src/actions/run-persistence.ts +105 -0
  367. package/src/actions/types/context.ts +10 -0
  368. package/src/auth/cookies.ts +3 -20
  369. package/src/auth/index.ts +0 -6
  370. package/src/auth/runtime.ts +59 -76
  371. package/src/auth/session-cache.ts +2 -9
  372. package/src/auth/types.ts +4 -8
  373. package/src/auth/validation.ts +0 -2
  374. package/src/authorization/decision.ts +8 -23
  375. package/src/authorization/event-visibility.ts +0 -12
  376. package/src/authorization/grant-kinds.ts +20 -27
  377. package/src/authorization/index.ts +0 -1
  378. package/src/authorization/resolve.ts +10 -6
  379. package/src/deploy/index.ts +0 -1
  380. package/src/deploy/services.ts +2 -12
  381. package/src/deploy/types.ts +7 -8
  382. package/src/deploy/validation.ts +15 -7
  383. package/src/error-reporting/types.ts +2 -10
  384. package/src/errors/catalog.ts +13 -0
  385. package/src/events/definitions.ts +0 -17
  386. package/src/events/index.ts +0 -14
  387. package/src/events/scope.ts +0 -12
  388. package/src/events/selectors/builder.ts +0 -51
  389. package/src/events/selectors/index.ts +0 -6
  390. package/src/events/selectors/predicate.ts +0 -2
  391. package/src/events/selectors/types.ts +7 -65
  392. package/src/events/types/index.ts +0 -11
  393. package/src/execution/authorization.ts +11 -5
  394. package/src/index.ts +2 -33
  395. package/src/materialization/model.ts +26 -9
  396. package/src/materializer/README.md +6 -1
  397. package/src/materializer/edits/commit.ts +42 -32
  398. package/src/materializer/shared/normalize.ts +25 -14
  399. package/src/models/execution/embedding.ts +6 -6
  400. package/src/objects/action/errors.ts +0 -12
  401. package/src/objects/action/index.ts +3 -3
  402. package/src/objects/action/request.ts +2 -29
  403. package/src/objects/execution.ts +2 -2
  404. package/src/objects/sdk/object-handle.ts +3 -29
  405. package/src/objects/sdk/object-set.ts +5 -30
  406. package/src/objects/service/index.ts +0 -1
  407. package/src/objects/vectors/README.md +4 -0
  408. package/src/objects/vectors/handle.ts +11 -2
  409. package/src/objects/vectors/indexing-generate.ts +2 -2
  410. package/src/objects/vectors/profile.ts +5 -0
  411. package/src/queues/in-memory.ts +0 -6
  412. package/src/queues/index.ts +0 -2
  413. package/src/queues/types.ts +0 -11
  414. package/src/runtime/host.ts +5 -0
  415. package/src/runtime/resolve-definitions.ts +0 -1
  416. package/src/runtime/types.ts +16 -45
  417. package/src/schedules/builders.ts +1 -4
  418. package/src/schedules/runtime.ts +0 -41
  419. package/src/schedules/validation.ts +2 -16
  420. package/src/security/builders.ts +7 -2
  421. package/src/security/every.ts +1 -5
  422. package/src/security/grants.ts +5 -25
  423. package/src/security/index.ts +0 -3
  424. package/src/security/membership-policies.ts +3 -1
  425. package/src/security/public.ts +10 -0
  426. package/src/security/registry.ts +0 -8
  427. package/src/security/types.ts +19 -25
  428. package/src/security/validation.ts +19 -17
  429. package/src/storage/action-runs/idempotency.ts +13 -41
  430. package/src/storage/action-runs/in-memory.ts +20 -311
  431. package/src/storage/action-runs/index.ts +1 -16
  432. package/src/storage/action-runs/record.ts +130 -0
  433. package/src/storage/action-runs/types.ts +37 -92
  434. package/src/storage/agents/types.ts +1 -1
  435. package/src/storage/auth/in-memory/auth-storage.ts +0 -18
  436. package/src/storage/auth/in-memory/magic-links.ts +0 -3
  437. package/src/storage/auth/in-memory/oidc-attempts.ts +0 -3
  438. package/src/storage/auth/in-memory/sessions.ts +1 -25
  439. package/src/storage/auth/in-memory/shared.ts +1 -10
  440. package/src/storage/auth/types.ts +2 -18
  441. package/src/storage/index.ts +1 -9
  442. package/src/storage/internal.ts +1 -7
  443. package/src/storage/objects/execution-limits.ts +3 -2
  444. package/src/storage/types.ts +2 -4
  445. package/src/testing/action-execution.ts +73 -13
  446. package/src/testing/action-run-storage-contract.ts +335 -0
  447. package/src/testing/auth-storage-contract.ts +14 -107
  448. package/src/testing/execution-storage-contract.ts +0 -2
  449. package/src/testing/index.ts +8 -1
  450. package/src/testing/materializer-storage-contract.ts +174 -18
  451. package/src/testing/queues-contract.ts +0 -18
  452. package/dist/actions/run-dispatch.d.ts +0 -25
  453. package/dist/actions/run-dispatch.d.ts.map +0 -1
  454. package/dist/actions/worker.d.ts +0 -3
  455. package/dist/actions/worker.d.ts.map +0 -1
  456. package/dist/actions/worker.js +0 -325
  457. package/dist/actions/worker.js.map +0 -11
  458. package/dist/auth/audience.d.ts +0 -8
  459. package/dist/auth/audience.d.ts.map +0 -1
  460. package/dist/authorization/application-access.d.ts +0 -18
  461. package/dist/authorization/application-access.d.ts.map +0 -1
  462. package/dist/chunk-1hqwggsn.js.map +0 -12
  463. package/dist/chunk-2jntasmh.js.map +0 -13
  464. package/dist/chunk-6h5m9xjx.js.map +0 -40
  465. package/dist/chunk-85cd7e8c.js +0 -51
  466. package/dist/chunk-85cd7e8c.js.map +0 -10
  467. package/dist/chunk-de4z2bj6.js.map +0 -18
  468. package/dist/chunk-dfm066qg.js.map +0 -11
  469. package/dist/chunk-enpsx8k5.js.map +0 -10
  470. package/dist/chunk-fc5zfxy1.js.map +0 -11
  471. package/dist/chunk-fe52eczz.js.map +0 -49
  472. package/dist/chunk-fx93hd2n.js +0 -1614
  473. package/dist/chunk-fx93hd2n.js.map +0 -20
  474. package/dist/chunk-k6hrnf35.js.map +0 -10
  475. package/dist/chunk-qkbx3tf6.js.map +0 -24
  476. package/dist/chunk-qxvp5epv.js +0 -1329
  477. package/dist/chunk-qxvp5epv.js.map +0 -36
  478. package/dist/chunk-r2y23egw.js.map +0 -10
  479. package/dist/chunk-tffvfy6s.js +0 -593
  480. package/dist/chunk-tffvfy6s.js.map +0 -15
  481. package/dist/chunk-xt1zt7gv.js.map +0 -13
  482. package/dist/chunk-y2aq6ag9.js.map +0 -11
  483. package/dist/chunk-y9jmd7e5.js.map +0 -15
  484. package/dist/chunk-zvx7h87b.js +0 -12
  485. package/dist/chunk-zvx7h87b.js.map +0 -10
  486. package/dist/events/types/actions.d.ts +0 -39
  487. package/dist/events/types/actions.d.ts.map +0 -1
  488. package/dist/objects/service/action-service.d.ts +0 -13
  489. package/dist/objects/service/action-service.d.ts.map +0 -1
  490. package/dist/security/applications.d.ts +0 -15
  491. package/dist/security/applications.d.ts.map +0 -1
  492. package/src/actions/run-dispatch.ts +0 -282
  493. package/src/actions/worker.ts +0 -2
  494. package/src/auth/audience.ts +0 -28
  495. package/src/authorization/application-access.ts +0 -34
  496. package/src/events/types/actions.ts +0 -42
  497. package/src/objects/service/action-service.ts +0 -43
  498. package/src/security/applications.ts +0 -11
  499. /package/dist/{chunk-rz53yb4v.js.map → chunk-0yh890a4.js.map} +0 -0
  500. /package/dist/{chunk-vgk3hknm.js.map → chunk-1k89ecfr.js.map} +0 -0
  501. /package/dist/{chunk-ny3xyvcn.js.map → chunk-1zq2p6g0.js.map} +0 -0
  502. /package/dist/{chunk-dnmadg9k.js.map → chunk-3t2hgbgd.js.map} +0 -0
  503. /package/dist/{chunk-22v5bpz3.js.map → chunk-5e43w60z.js.map} +0 -0
  504. /package/dist/{chunk-7hpdd6r9.js.map → chunk-6p49a5cq.js.map} +0 -0
  505. /package/dist/{chunk-kkqwzy6h.js.map → chunk-7t429e3f.js.map} +0 -0
  506. /package/dist/{chunk-ex496vct.js.map → chunk-9dmt152s.js.map} +0 -0
  507. /package/dist/{chunk-48e3cn2d.js.map → chunk-9gyp8hg1.js.map} +0 -0
  508. /package/dist/{chunk-zxawp1n2.js.map → chunk-9w055r5b.js.map} +0 -0
  509. /package/dist/{chunk-4wn7bxxa.js.map → chunk-9ybhtmg4.js.map} +0 -0
  510. /package/dist/{chunk-vx2yp45y.js.map → chunk-c85m1hyj.js.map} +0 -0
  511. /package/dist/{chunk-bs7sqkre.js.map → chunk-d09tj99x.js.map} +0 -0
  512. /package/dist/{chunk-zb77kjth.js.map → chunk-dk8tkk5f.js.map} +0 -0
  513. /package/dist/{chunk-vjcd8d27.js.map → chunk-fa02jy15.js.map} +0 -0
  514. /package/dist/{chunk-za5yd58j.js.map → chunk-fkgc1wt8.js.map} +0 -0
  515. /package/dist/{chunk-6gmfggss.js.map → chunk-t7x8dmn0.js.map} +0 -0
  516. /package/dist/{chunk-p844e0rn.js.map → chunk-tpn40322.js.map} +0 -0
  517. /package/dist/{chunk-rt9p8m9t.js.map → chunk-v9xd5wzd.js.map} +0 -0
  518. /package/dist/{chunk-2vhg6ysa.js.map → chunk-vyf9kfqf.js.map} +0 -0
  519. /package/dist/{chunk-bwjcehza.js.map → chunk-way52z4h.js.map} +0 -0
  520. /package/dist/{chunk-qkvz64nd.js.map → chunk-x6m907x7.js.map} +0 -0
  521. /package/dist/{chunk-yv9czyfr.js.map → chunk-xfs8x8m9.js.map} +0 -0
  522. /package/dist/{chunk-v6xpd60t.js.map → chunk-yevzdx4y.js.map} +0 -0
  523. /package/dist/{chunk-qmnnhde6.js.map → chunk-z4m0yz8c.js.map} +0 -0
@@ -1,30 +1,15 @@
1
1
  import type { ExecutionStorage } from "../executions"
2
2
  import { ActionRunError } from "./errors"
3
- import { parseActionRunFailure } from "./failure"
4
- import {
5
- actionRunPhaseRecordsEqual,
6
- actionSubjectsEqual,
7
- canRequeueActionRunAfterEnqueueFailure,
8
- isTerminalActionRun,
9
- } from "./idempotency"
3
+ import { actionSubjectsEqual } from "./idempotency"
10
4
  import { assertActionRunExecution } from "./provider"
5
+ import { normalizeRecordActionRunInput, resolveActionRunEffects } from "./record"
11
6
  import type {
12
- ActionRunEffectsRecord,
13
- ActionRunFailure,
14
- ActionRunParams,
15
- ActionRunPhase,
16
7
  ActionRunRecord,
17
8
  ActionRunStorage,
18
- ActionRunWritebackRecord,
19
- EnterActionRunPhaseInput,
20
- FinishActionRunInput,
21
9
  ListActionRunsInput,
22
10
  ListActionRunsResult,
23
- LockActionMaterializationRunInput,
24
- QueueActionRunInput,
25
11
  RecordActionEffectsInput,
26
- RecordActionWritebackInput,
27
- StartActionRunInput,
12
+ RecordActionRunInput,
28
13
  } from "./types"
29
14
 
30
15
  type RunRootOperation = <T>(run: () => Promise<T> | T) => Promise<T>
@@ -35,74 +20,12 @@ function actionRunKey(projectId: string, id: string): string {
35
20
  return JSON.stringify([projectId, id])
36
21
  }
37
22
 
38
- function assertNonBlank(value: string, fieldName: string): void {
39
- if (typeof value !== "string" || value.trim().length === 0) {
40
- throw new ActionRunError(`[Sixb] Action materialization ${fieldName} must be nonblank.`)
41
- }
42
- }
43
-
44
23
  function cloneActionRunRecord(record: ActionRunRecord): ActionRunRecord {
45
24
  return structuredClone(record)
46
25
  }
47
26
 
48
- function normalizeParams(params: ActionRunParams): ActionRunParams {
49
- return structuredClone(params)
50
- }
51
-
52
- function normalizeSubject(subject: QueueActionRunInput["subject"]): QueueActionRunInput["subject"] {
53
- return structuredClone(subject)
54
- }
55
-
56
- function normalizeError<TPhase extends ActionRunPhase>(
57
- error: ActionRunFailure<TPhase>,
58
- expectedPhase?: TPhase
59
- ): ActionRunFailure<TPhase> {
60
- return expectedPhase === undefined
61
- ? (parseActionRunFailure(error) as ActionRunFailure<TPhase>)
62
- : parseActionRunFailure(error, expectedPhase)
63
- }
64
-
65
- function normalizeWriteback(
66
- input: RecordActionWritebackInput,
67
- completedAt: Date
68
- ): ActionRunWritebackRecord {
69
- if (input.status === "succeeded") {
70
- return {
71
- status: "succeeded",
72
- completedAt,
73
- result: structuredClone(input.result),
74
- }
75
- }
76
-
77
- return {
78
- status: "failed",
79
- completedAt,
80
- error: normalizeError(input.error, "writeback"),
81
- }
82
- }
83
-
84
- function normalizeEffects(
85
- input: RecordActionEffectsInput,
86
- completedAt: Date
87
- ): ActionRunEffectsRecord {
88
- if (input.status === "succeeded") {
89
- return {
90
- status: "succeeded",
91
- completedAt,
92
- }
93
- }
94
-
95
- return {
96
- status: "failed",
97
- completedAt,
98
- error: normalizeError(input.error, "effects"),
99
- }
100
- }
101
-
102
27
  function compareRuns(a: ActionRunRecord, b: ActionRunRecord, order: "asc" | "desc"): number {
103
- const leftAt = a.startedAt ?? a.queuedAt
104
- const rightAt = b.startedAt ?? b.queuedAt
105
- const delta = leftAt.getTime() - rightAt.getTime()
28
+ const delta = a.startedAt.getTime() - b.startedAt.getTime()
106
29
  if (delta !== 0) {
107
30
  return order === "asc" ? delta : -delta
108
31
  }
@@ -136,235 +59,49 @@ export class InMemoryActionRunStorage implements ActionRunStorage {
136
59
  }
137
60
  }
138
61
 
139
- async lockForMaterialization(input: LockActionMaterializationRunInput): Promise<ActionRunRecord> {
140
- return this.runRootOperation(() => cloneActionRunRecord(this.requireMaterializationRun(input)))
141
- }
142
-
143
- async queue(input: QueueActionRunInput): Promise<ActionRunRecord> {
62
+ async record(input: RecordActionRunInput): Promise<ActionRunRecord> {
144
63
  return this.runRootOperation(async () => {
145
- const key = actionRunKey(input.projectId, input.id)
146
- const existing = this.rows.get(key)
147
- if (existing && !canRequeueActionRunAfterEnqueueFailure(existing, input)) {
64
+ const record = normalizeRecordActionRunInput(input)
65
+ const key = actionRunKey(record.projectId, record.id)
66
+ if (this.rows.has(key)) {
148
67
  throw new ActionRunError(
149
- `[Sixb] Action run '${input.id}' already exists for project '${input.projectId}'.`
68
+ `[Sixb] Action run '${record.id}' is already recorded for project '${record.projectId}'.`
150
69
  )
151
70
  }
152
71
  if (
153
72
  [...this.rows.values()].some(
154
- (run) =>
155
- run.projectId === input.projectId &&
156
- run.id !== input.id &&
157
- run.executionId === input.executionId
73
+ (run) => run.projectId === record.projectId && run.executionId === record.executionId
158
74
  )
159
75
  ) {
160
76
  throw new ActionRunError(
161
- `[Sixb] Execution '${input.executionId}' already belongs to another Action run.`
77
+ `[Sixb] Execution '${record.executionId}' already belongs to another Action run.`
162
78
  )
163
79
  }
164
80
  await assertActionRunExecution({
165
81
  executions: this.executions,
166
- projectId: input.projectId,
167
- executionId: input.executionId,
168
- runId: input.id,
169
- actionId: input.actionId,
82
+ projectId: record.projectId,
83
+ executionId: record.executionId,
84
+ runId: record.id,
85
+ actionId: record.actionId,
170
86
  })
171
87
 
172
- const record: ActionRunRecord = {
173
- id: input.id,
174
- projectId: input.projectId,
175
- executionId: input.executionId,
176
- actionId: input.actionId,
177
- subject: normalizeSubject(input.subject),
178
- status: "queued",
179
- phase: "request",
180
- queuedAt: new Date(input.queuedAt ?? new Date()),
181
- params: normalizeParams(input.params),
182
- idempotencyKey: input.idempotencyKey,
183
- }
184
-
185
- if (existing) {
186
- const next: ActionRunRecord = {
187
- ...existing,
188
- status: "queued",
189
- phase: "request",
190
- queuedAt: record.queuedAt,
191
- startedAt: undefined,
192
- finishedAt: undefined,
193
- error: undefined,
194
- writeback: undefined,
195
- effects: undefined,
196
- }
197
- this.rows.set(key, structuredClone(next))
198
- return cloneActionRunRecord(next)
199
- }
200
-
201
88
  this.rows.set(key, structuredClone(record))
202
89
  return cloneActionRunRecord(record)
203
90
  })
204
91
  }
205
92
 
206
- async start(input: StartActionRunInput): Promise<ActionRunRecord> {
207
- return this.runRootOperation(() => {
208
- const key = actionRunKey(input.projectId, input.id)
209
- const existing = this.rows.get(key)
210
-
211
- if (!existing) {
212
- throw new ActionRunError(
213
- `[Sixb] Action run '${input.id}' not found for project '${input.projectId}'.`
214
- )
215
- }
216
-
217
- if (existing.status !== "queued") {
218
- throw new ActionRunError(
219
- `[Sixb] Action run '${input.id}' cannot start from status '${existing.status}'.`
220
- )
221
- }
222
-
223
- const next: ActionRunRecord = {
224
- ...existing,
225
- status: "running",
226
- phase: input.phase ?? "validation",
227
- startedAt: new Date(input.startedAt ?? new Date()),
228
- error: undefined,
229
- }
230
-
231
- this.rows.set(key, structuredClone(next))
232
- return cloneActionRunRecord(next)
233
- })
234
- }
235
-
236
- async enterPhase(input: EnterActionRunPhaseInput): Promise<ActionRunRecord> {
237
- return this.runRootOperation(() => {
238
- const key = actionRunKey(input.projectId, input.id)
239
- const existing = this.requireRunningRun(key, input.projectId, input.id, "enter phase")
240
- const next: ActionRunRecord = {
241
- ...existing,
242
- phase: input.phase,
243
- }
244
-
245
- this.rows.set(key, structuredClone(next))
246
- return cloneActionRunRecord(next)
247
- })
248
- }
249
-
250
- async recordWriteback(input: RecordActionWritebackInput): Promise<ActionRunRecord> {
251
- return this.runRootOperation(() => {
252
- const key = actionRunKey(input.projectId, input.id)
253
- const existing = this.requireRunningRun(key, input.projectId, input.id, "record writeback")
254
- const writeback = normalizeWriteback(input, new Date(input.completedAt ?? new Date()))
255
-
256
- if (existing.writeback) {
257
- if (actionRunPhaseRecordsEqual(existing.writeback, writeback)) {
258
- return cloneActionRunRecord(existing)
259
- }
260
-
261
- throw new ActionRunError(
262
- `[Sixb] Action run '${input.id}' already has a different writeback record.`
263
- )
264
- }
265
-
266
- const next: ActionRunRecord = {
267
- ...existing,
268
- phase: "writeback",
269
- writeback,
270
- }
271
-
272
- this.rows.set(key, structuredClone(next))
273
- return cloneActionRunRecord(next)
274
- })
275
- }
276
-
277
93
  async recordEffects(input: RecordActionEffectsInput): Promise<ActionRunRecord> {
278
94
  return this.runRootOperation(() => {
279
95
  const key = actionRunKey(input.projectId, input.id)
280
- const existing = this.requireRunningRun(key, input.projectId, input.id, "record effects")
281
- const effects = normalizeEffects(input, new Date(input.completedAt ?? new Date()))
282
-
283
- if (existing.effects) {
284
- if (actionRunPhaseRecordsEqual(existing.effects, effects)) {
285
- return cloneActionRunRecord(existing)
286
- }
287
-
288
- throw new ActionRunError(
289
- `[Sixb] Action run '${input.id}' already has a different effects record.`
290
- )
291
- }
292
-
293
- const next: ActionRunRecord = {
294
- ...existing,
295
- phase: "effects",
296
- effects,
297
- }
96
+ const { run, effects } = resolveActionRunEffects(this.rows.get(key) ?? null, input)
97
+ if (!effects) return cloneActionRunRecord(run)
298
98
 
99
+ const next: ActionRunRecord = { ...run, phase: "effects", effects }
299
100
  this.rows.set(key, structuredClone(next))
300
101
  return cloneActionRunRecord(next)
301
102
  })
302
103
  }
303
104
 
304
- async finish(input: FinishActionRunInput): Promise<ActionRunRecord> {
305
- return this.runRootOperation(() => {
306
- const key = actionRunKey(input.projectId, input.id)
307
- const existing = this.rows.get(key)
308
-
309
- if (!existing) {
310
- throw new ActionRunError(
311
- `[Sixb] Action run '${input.id}' not found for project '${input.projectId}'.`
312
- )
313
- }
314
-
315
- if (isTerminalActionRun(existing)) {
316
- throw new ActionRunError(
317
- `[Sixb] Action run '${input.id}' cannot finish from terminal status '${existing.status}'.`
318
- )
319
- }
320
-
321
- const phase =
322
- input.status === "succeeded" ? (input.phase ?? existing.phase) : input.error.details.phase
323
-
324
- const base: ActionRunRecord = {
325
- ...existing,
326
- status: input.status,
327
- phase,
328
- finishedAt: new Date(input.finishedAt ?? new Date()),
329
- }
330
-
331
- const next: ActionRunRecord =
332
- input.status === "succeeded"
333
- ? {
334
- ...base,
335
- error: undefined,
336
- }
337
- : {
338
- ...base,
339
- error: normalizeError(input.error),
340
- }
341
-
342
- this.rows.set(key, structuredClone(next))
343
- return cloneActionRunRecord(next)
344
- })
345
- }
346
-
347
- private requireRunningRun(
348
- key: string,
349
- projectId: string,
350
- id: string,
351
- operation: string
352
- ): ActionRunRecord {
353
- const existing = this.rows.get(key)
354
-
355
- if (!existing) {
356
- throw new ActionRunError(`[Sixb] Action run '${id}' not found for project '${projectId}'.`)
357
- }
358
-
359
- if (existing.status !== "running") {
360
- throw new ActionRunError(
361
- `[Sixb] Action run '${id}' cannot ${operation} from status '${existing.status}'.`
362
- )
363
- }
364
-
365
- return existing
366
- }
367
-
368
105
  async getById(params: { projectId: string; id: string }): Promise<ActionRunRecord | null> {
369
106
  return this.runRootOperation(() => {
370
107
  const record = this.rows.get(actionRunKey(params.projectId, params.id))
@@ -408,12 +145,8 @@ export class InMemoryActionRunStorage implements ActionRunStorage {
408
145
  : true
409
146
  )
410
147
  .filter((record) => (statuses ? statuses.has(record.status) : true))
411
- .filter((record) =>
412
- input.startedAfter ? (record.startedAt ?? record.queuedAt) >= input.startedAfter : true
413
- )
414
- .filter((record) =>
415
- input.startedBefore ? (record.startedAt ?? record.queuedAt) <= input.startedBefore : true
416
- )
148
+ .filter((record) => (input.startedAfter ? record.startedAt >= input.startedAfter : true))
149
+ .filter((record) => (input.startedBefore ? record.startedAt <= input.startedBefore : true))
417
150
  .sort((a, b) => compareRuns(a, b, order))
418
151
 
419
152
  const total = filtered.length
@@ -421,30 +154,6 @@ export class InMemoryActionRunStorage implements ActionRunStorage {
421
154
  return { runs, hasMore: offset + runs.length < total, total }
422
155
  })
423
156
  }
424
-
425
- private requireMaterializationRun(input: LockActionMaterializationRunInput): ActionRunRecord {
426
- assertNonBlank(input.projectId, "projectId")
427
- assertNonBlank(input.runId, "runId")
428
- assertNonBlank(input.actionId, "actionId")
429
-
430
- const existing = this.rows.get(actionRunKey(input.projectId, input.runId))
431
- if (!existing) {
432
- throw new ActionRunError(
433
- `[Sixb] Action run '${input.runId}' not found for project '${input.projectId}'.`
434
- )
435
- }
436
- if (existing.actionId !== input.actionId) {
437
- throw new ActionRunError(
438
- `[Sixb] Action run '${input.runId}' does not belong to action '${input.actionId}'.`
439
- )
440
- }
441
- if (existing.status !== "running") {
442
- throw new ActionRunError(
443
- `[Sixb] Action run '${input.runId}' cannot materialize from status '${existing.status}'.`
444
- )
445
- }
446
- return existing
447
- }
448
157
  }
449
158
 
450
159
  export type InMemoryActionRunStorageSnapshot = Map<string, ActionRunRecord>
@@ -1,13 +1,4 @@
1
1
  export { ActionRunError } from "./errors"
2
- export type { ActionRunPhaseRecord } from "./idempotency"
3
- export {
4
- actionRunParamsEqual,
5
- actionRunPhaseRecordsEqual,
6
- actionSubjectsEqual,
7
- canRequeueActionRunAfterEnqueueFailure,
8
- finishActionRunPhase,
9
- isTerminalActionRun,
10
- } from "./idempotency"
11
2
  export { InMemoryActionRunStorage } from "./in-memory"
12
3
  export type {
13
4
  ActionRunEffectsRecord,
@@ -16,19 +7,13 @@ export type {
16
7
  ActionRunFailureDetails,
17
8
  ActionRunParams,
18
9
  ActionRunPhase,
19
- ActionRunPhaseStatus,
20
10
  ActionRunRecord,
21
11
  ActionRunStatus,
22
12
  ActionRunStorage,
23
13
  ActionRunWritebackRecord,
24
- EnterActionRunPhaseInput,
25
- FinishActionRunInput,
26
14
  ListActionRunsInput,
27
15
  ListActionRunsResult,
28
- LockActionMaterializationRunInput,
29
- QueueActionRunInput,
30
16
  RecordActionEffectsInput,
31
- RecordActionWritebackInput,
32
- StartActionRunInput,
17
+ RecordActionRunInput,
33
18
  } from "./types"
34
19
  export { ACTION_RUN_FAILURE_CODES, ACTION_RUN_PHASES } from "./types"
@@ -0,0 +1,130 @@
1
+ import { assertJsonValue, cloneJsonValue } from "../../json"
2
+ import { ActionRunError } from "./errors"
3
+ import { parseActionRunFailure } from "./failure"
4
+ import { actionRunPhaseRecordsEqual } from "./idempotency"
5
+ import type {
6
+ ActionRunEffectsRecord,
7
+ ActionRunRecord,
8
+ ActionRunWritebackRecord,
9
+ RecordActionEffectsInput,
10
+ RecordActionRunInput,
11
+ } from "./types"
12
+ import { ACTION_RUN_PHASES } from "./types"
13
+
14
+ /**
15
+ * Validate a terminal run record before a provider inserts it, and detach it from the caller.
16
+ *
17
+ * Every provider records through this, so a stored run always reads back as the record that was
18
+ * written: a failed run carries the failure of the phase it ended in, and a succeeded one none. A
19
+ * run is recorded before its effects run, so no record starts in the `effects` phase.
20
+ */
21
+ export function normalizeRecordActionRunInput(input: RecordActionRunInput): RecordActionRunInput {
22
+ const label = `[Sixb] Action run '${input.id}'`
23
+ for (const field of ["id", "projectId", "executionId", "actionId", "idempotencyKey"] as const) {
24
+ if (typeof input[field] !== "string" || input[field].trim().length === 0) {
25
+ throw new ActionRunError(`${label} must have a nonblank ${field}.`)
26
+ }
27
+ }
28
+ const status: string = input.status
29
+ if (status !== "succeeded" && status !== "failed") {
30
+ throw new ActionRunError(`${label} has unknown status '${status}'.`)
31
+ }
32
+ if (!(ACTION_RUN_PHASES as readonly string[]).includes(input.phase)) {
33
+ throw new ActionRunError(`${label} has unknown phase '${input.phase}'.`)
34
+ }
35
+ if (input.phase === "effects") {
36
+ throw new ActionRunError(`${label} is recorded before its effects run.`)
37
+ }
38
+ const startedAt = requireDate(input.startedAt, `${label} startedAt`)
39
+ const finishedAt = requireDate(input.finishedAt, `${label} finishedAt`)
40
+ if (finishedAt < startedAt) {
41
+ throw new ActionRunError(`${label} cannot finish before it started.`)
42
+ }
43
+ assertJsonValue(input.params, `${label} params`)
44
+
45
+ const fields = {
46
+ id: input.id,
47
+ projectId: input.projectId,
48
+ executionId: input.executionId,
49
+ actionId: input.actionId,
50
+ subject: structuredClone(input.subject),
51
+ phase: input.phase,
52
+ startedAt,
53
+ finishedAt,
54
+ params: structuredClone(input.params),
55
+ idempotencyKey: input.idempotencyKey,
56
+ ...(input.writeback === undefined
57
+ ? {}
58
+ : { writeback: normalizeWriteback(input.writeback, label) }),
59
+ }
60
+
61
+ if (input.status === "succeeded") {
62
+ if (input.error !== undefined) {
63
+ throw new ActionRunError(`${label} succeeded, so it cannot record a failure.`)
64
+ }
65
+ return { ...fields, status: "succeeded" }
66
+ }
67
+ const error = parseActionRunFailure(input.error, input.phase)
68
+ if (error.details.runId !== input.id || error.details.actionId !== input.actionId) {
69
+ throw new ActionRunError(`${label} records the failure of another run.`)
70
+ }
71
+ return { ...fields, status: "failed", error }
72
+ }
73
+
74
+ /**
75
+ * Resolve what recording effects does to the stored run: write `effects`, or nothing (`null`) when
76
+ * an equal outcome is already recorded.
77
+ *
78
+ * Effects run only after a succeeded run committed its edits, and their outcome is recorded once.
79
+ */
80
+ export function resolveActionRunEffects(
81
+ existing: ActionRunRecord | null,
82
+ input: RecordActionEffectsInput
83
+ ): { readonly run: ActionRunRecord; readonly effects: ActionRunEffectsRecord | null } {
84
+ const label = `[Sixb] Action run '${input.id}'`
85
+ if (!existing) {
86
+ throw new ActionRunError(`${label} not found for project '${input.projectId}'.`)
87
+ }
88
+ const completedAt = requireDate(input.completedAt ?? new Date(), `${label} effects`)
89
+ const effects: ActionRunEffectsRecord =
90
+ input.status === "succeeded"
91
+ ? { status: "succeeded", completedAt }
92
+ : { status: "failed", completedAt, error: parseActionRunFailure(input.error, "effects") }
93
+
94
+ if (existing.effects) {
95
+ if (actionRunPhaseRecordsEqual(existing.effects, effects))
96
+ return { run: existing, effects: null }
97
+ throw new ActionRunError(`${label} already has a different effects record.`)
98
+ }
99
+ if (existing.status !== "succeeded" || existing.phase !== "commit") {
100
+ throw new ActionRunError(
101
+ `${label} cannot record effects: it ended '${existing.status}' in phase '${existing.phase}'.`
102
+ )
103
+ }
104
+ return { run: existing, effects }
105
+ }
106
+
107
+ function normalizeWriteback(
108
+ writeback: ActionRunWritebackRecord,
109
+ label: string
110
+ ): ActionRunWritebackRecord {
111
+ const completedAt = requireDate(writeback.completedAt, `${label} writeback`)
112
+ if (writeback.status === "succeeded") {
113
+ assertJsonValue(writeback.result, `${label} writeback result`)
114
+ return { status: "succeeded", completedAt, result: cloneJsonValue(writeback.result) }
115
+ }
116
+ return {
117
+ status: "failed",
118
+ completedAt,
119
+ error: parseActionRunFailure(writeback.error, "writeback"),
120
+ }
121
+ }
122
+
123
+ /** A detached copy of `value`, which must be a valid date. */
124
+ function requireDate(value: Date, label: string): Date {
125
+ const date = value instanceof Date ? new Date(value) : new Date(Number.NaN)
126
+ if (!Number.isFinite(date.getTime())) {
127
+ throw new ActionRunError(`${label} must be a valid date.`)
128
+ }
129
+ return date
130
+ }