@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,5 +1,14 @@
1
+ import type { ActionSubject } from "../actions"
1
2
  import type { AuthorizablePrincipal, TrustedPrimitiveRef } from "../execution"
2
- import type { ActionRunRecord, QueueActionRunInput, Storage } from "../storage"
3
+ import type {
4
+ ActionRunFailure,
5
+ ActionRunParams,
6
+ ActionRunPhase,
7
+ ActionRunRecord,
8
+ ActionRunWritebackRecord,
9
+ RecordActionRunInput,
10
+ Storage,
11
+ } from "../storage"
3
12
  import type { ExecutionStorage } from "../storage/executions"
4
13
 
5
14
  /** Create the durable execution chain required by an Action-run storage fixture. */
@@ -57,22 +66,73 @@ export async function createTestActionExecution(
57
66
  return executionId
58
67
  }
59
68
 
60
- /** Queue an Action run with the valid durable execution fixture required by every provider. */
61
- export async function queueTestActionRun(
62
- storage: Pick<Storage, "actionRuns" | "executions">,
63
- input: Omit<QueueActionRunInput, "executionId"> & {
64
- readonly requesterGroupIds?: readonly string[]
65
- readonly requestedBy?: AuthorizablePrincipal
66
- }
67
- ): Promise<ActionRunRecord> {
68
- if (!storage.actionRuns) throw new Error("Action run storage is not configured for this test.")
69
- const executionId = await createTestActionExecution(storage.executions, {
69
+ type TestActionRunOutcome =
70
+ | { readonly status?: "succeeded"; readonly error?: never }
71
+ | { readonly status: "failed"; readonly error: ActionRunFailure }
72
+
73
+ /** A test Action run that ended. It succeeds in its commit phase unless told otherwise. */
74
+ export type TestActionRunInput = TestActionRunOutcome & {
75
+ readonly id: string
76
+ readonly projectId: string
77
+ readonly actionId: string
78
+ readonly subject: ActionSubject
79
+ readonly params: ActionRunParams
80
+ readonly idempotencyKey: string
81
+ /** Defaults to `commit` for a succeeded run, and to its failure's phase for a failed one. */
82
+ readonly phase?: ActionRunPhase
83
+ /** Defaults to now. */
84
+ readonly startedAt?: Date
85
+ /** Defaults to `startedAt`. */
86
+ readonly finishedAt?: Date
87
+ readonly writeback?: ActionRunWritebackRecord
88
+ readonly requesterGroupIds?: readonly string[]
89
+ /** Must name an existing auth principal. The parent request then carries its authority. */
90
+ readonly requestedBy?: AuthorizablePrincipal
91
+ }
92
+
93
+ /**
94
+ * Create a test run's durable execution, and return the run's terminal record without writing it:
95
+ * an Action commit carries the record it inserts.
96
+ */
97
+ export async function createTestActionRunRecord(
98
+ executions: ExecutionStorage,
99
+ input: TestActionRunInput
100
+ ): Promise<RecordActionRunInput> {
101
+ const executionId = await createTestActionExecution(executions, {
70
102
  projectId: input.projectId,
71
103
  actionId: input.actionId,
72
104
  runId: input.id,
73
105
  requesterGroupIds: input.requesterGroupIds,
74
106
  ...(input.requestedBy === undefined ? {} : { requestedBy: input.requestedBy }),
75
107
  })
76
- const { requesterGroupIds: _groups, requestedBy: _requestedBy, ...run } = input
77
- return storage.actionRuns.queue({ ...run, executionId })
108
+ const startedAt = input.startedAt ?? new Date()
109
+ const fields = {
110
+ id: input.id,
111
+ projectId: input.projectId,
112
+ executionId,
113
+ actionId: input.actionId,
114
+ subject: input.subject,
115
+ params: input.params,
116
+ idempotencyKey: input.idempotencyKey,
117
+ startedAt,
118
+ finishedAt: input.finishedAt ?? startedAt,
119
+ ...(input.writeback === undefined ? {} : { writeback: input.writeback }),
120
+ }
121
+ return input.status === "failed"
122
+ ? {
123
+ ...fields,
124
+ status: "failed",
125
+ phase: input.phase ?? input.error.details.phase,
126
+ error: input.error,
127
+ }
128
+ : { ...fields, status: "succeeded", phase: input.phase ?? "commit" }
129
+ }
130
+
131
+ /** Record a test Action run with the valid durable execution every provider requires. */
132
+ export async function recordTestActionRun(
133
+ storage: Pick<Storage, "actionRuns" | "executions">,
134
+ input: TestActionRunInput
135
+ ): Promise<ActionRunRecord> {
136
+ if (!storage.actionRuns) throw new Error("Action run storage is not configured for this test.")
137
+ return storage.actionRuns.record(await createTestActionRunRecord(storage.executions, input))
78
138
  }
@@ -0,0 +1,335 @@
1
+ import { describe, expect, test } from "bun:test"
2
+ import type {
3
+ ActionRunFailure,
4
+ ActionRunPhase,
5
+ ActionRunRecord,
6
+ RecordActionRunInput,
7
+ Storage,
8
+ } from "../storage"
9
+ import { ActionRunError } from "../storage"
10
+ import {
11
+ createTestActionExecution,
12
+ createTestActionRunRecord,
13
+ recordTestActionRun,
14
+ type TestActionRunInput,
15
+ } from "./action-execution"
16
+
17
+ export type ActionRunStorageContractStorage = Storage & {
18
+ readonly actionRuns: NonNullable<Storage["actionRuns"]>
19
+ }
20
+
21
+ export interface ActionRunStorageContractSuiteOptions<
22
+ TStorage extends ActionRunStorageContractStorage = ActionRunStorageContractStorage,
23
+ > {
24
+ readonly createStorage: () => TStorage | Promise<TStorage>
25
+ readonly cleanup?: (storage: TStorage) => void | Promise<void>
26
+ }
27
+
28
+ const projectId = "action-run-contract"
29
+ const startedAt = new Date("2026-04-29T10:00:00.000Z")
30
+ const finishedAt = new Date("2026-04-29T10:00:03.842Z")
31
+
32
+ function failure<TPhase extends ActionRunPhase>(
33
+ runId: string,
34
+ phase: TPhase,
35
+ message: string
36
+ ): ActionRunFailure<TPhase> {
37
+ return {
38
+ code: "action.phase_failed",
39
+ message,
40
+ retryable: false,
41
+ at: finishedAt.toISOString(),
42
+ details: { actionId: "createInvoice", runId, phase },
43
+ }
44
+ }
45
+
46
+ type RunOverrides = Partial<
47
+ Pick<
48
+ TestActionRunInput,
49
+ "actionId" | "subject" | "phase" | "startedAt" | "finishedAt" | "writeback"
50
+ >
51
+ > &
52
+ (
53
+ | { readonly status?: "succeeded"; readonly error?: never }
54
+ | { readonly status: "failed"; readonly error: ActionRunFailure }
55
+ )
56
+
57
+ function run(id: string, overrides: RunOverrides = {}): TestActionRunInput {
58
+ return {
59
+ id,
60
+ projectId,
61
+ actionId: "createInvoice",
62
+ subject: { kind: "none" },
63
+ params: { amount: 42 },
64
+ idempotencyKey: `action:${projectId}:${id}`,
65
+ startedAt,
66
+ finishedAt,
67
+ ...overrides,
68
+ }
69
+ }
70
+
71
+ /** Runs the record-once Action run contract against one complete storage provider. */
72
+ export function runActionRunStorageContractSuite<TStorage extends ActionRunStorageContractStorage>(
73
+ label: string,
74
+ options: ActionRunStorageContractSuiteOptions<TStorage>
75
+ ): void {
76
+ const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {
77
+ const storage = await options.createStorage()
78
+ try {
79
+ await body(storage)
80
+ } finally {
81
+ await options.cleanup?.(storage)
82
+ }
83
+ }
84
+
85
+ describe(label, () => {
86
+ test("records a terminal run once, and reads it back detached", async () => {
87
+ await withStorage(async (storage) => {
88
+ const input = await createTestActionRunRecord(
89
+ storage.executions,
90
+ run("act_1", {
91
+ subject: { kind: "object", objectTypeId: "Opportunity", primaryId: "opp-1" },
92
+ writeback: {
93
+ status: "succeeded",
94
+ completedAt: new Date("2026-04-29T10:00:01.000Z"),
95
+ result: { externalInvoiceId: "ext_1" },
96
+ },
97
+ })
98
+ )
99
+
100
+ const recorded = await storage.actionRuns.record(input)
101
+ const expected: ActionRunRecord = {
102
+ id: "act_1",
103
+ projectId,
104
+ executionId: "test_action_execution:act_1",
105
+ actionId: "createInvoice",
106
+ subject: { kind: "object", objectTypeId: "Opportunity", primaryId: "opp-1" },
107
+ status: "succeeded",
108
+ phase: "commit",
109
+ startedAt,
110
+ finishedAt,
111
+ params: { amount: 42 },
112
+ idempotencyKey: `action:${projectId}:act_1`,
113
+ writeback: {
114
+ status: "succeeded",
115
+ completedAt: new Date("2026-04-29T10:00:01.000Z"),
116
+ result: { externalInvoiceId: "ext_1" },
117
+ },
118
+ }
119
+ expect(recorded).toEqual(expected)
120
+ ;(recorded.params as { amount: number }).amount = 1
121
+ await expect(storage.actionRuns.getById({ projectId, id: "act_1" })).resolves.toEqual(
122
+ expected
123
+ )
124
+
125
+ await expect(storage.actionRuns.record(input)).rejects.toBeInstanceOf(ActionRunError)
126
+ await expect(
127
+ storage.actionRuns.record({ ...input, id: "act_2", idempotencyKey: "act_2" })
128
+ ).rejects.toBeInstanceOf(ActionRunError)
129
+ await expect(storage.actionRuns.getById({ projectId, id: "act_2" })).resolves.toBeNull()
130
+ })
131
+ })
132
+
133
+ test("requires the trusted execution created for the run", async () => {
134
+ await withStorage(async (storage) => {
135
+ const input = await createTestActionRunRecord(storage.executions, run("act_owned"))
136
+ await expect(
137
+ storage.actionRuns.record({ ...input, executionId: "missing" })
138
+ ).rejects.toThrow("does not authorize Action run")
139
+
140
+ const otherAction = await createTestActionExecution(storage.executions, {
141
+ projectId,
142
+ actionId: "otherAction",
143
+ runId: "act_other",
144
+ })
145
+ await expect(
146
+ storage.actionRuns.record({ ...input, executionId: otherAction })
147
+ ).rejects.toThrow("does not authorize Action run")
148
+ await expect(storage.actionRuns.getById({ projectId, id: "act_owned" })).resolves.toBeNull()
149
+ })
150
+ })
151
+
152
+ test("refuses a record a run cannot end with", async () => {
153
+ await withStorage(async (storage) => {
154
+ const succeeded = await createTestActionRunRecord(storage.executions, run("act_invalid"))
155
+ const writebackFailure = failure("act_invalid", "writeback", "Upstream rejected it")
156
+ const invalid: readonly RecordActionRunInput[] = [
157
+ { ...succeeded, phase: "effects" },
158
+ { ...succeeded, status: "failed", phase: "commit", error: writebackFailure },
159
+ {
160
+ ...succeeded,
161
+ status: "failed",
162
+ phase: "writeback",
163
+ error: failure("another-run", "writeback", "Upstream rejected it"),
164
+ },
165
+ { ...succeeded, finishedAt: new Date(startedAt.getTime() - 1) },
166
+ ]
167
+ for (const input of invalid) {
168
+ await expect(storage.actionRuns.record(input)).rejects.toThrow()
169
+ }
170
+ await expect(
171
+ storage.actionRuns.getById({ projectId, id: "act_invalid" })
172
+ ).resolves.toBeNull()
173
+ })
174
+ })
175
+
176
+ test("records a failure with the phase it ended in", async () => {
177
+ await withStorage(async (storage) => {
178
+ const error = failure("act_failed", "writeback", "TeamLeader API returned 503")
179
+ const recorded = await recordTestActionRun(
180
+ storage,
181
+ run("act_failed", {
182
+ status: "failed",
183
+ error,
184
+ writeback: { status: "failed", completedAt: finishedAt, error },
185
+ })
186
+ )
187
+
188
+ expect(recorded).toMatchObject({ status: "failed", phase: "writeback", error })
189
+ await expect(
190
+ storage.actionRuns.getById({ projectId, id: "act_failed" })
191
+ ).resolves.toMatchObject({
192
+ status: "failed",
193
+ phase: "writeback",
194
+ error,
195
+ writeback: { status: "failed", error },
196
+ })
197
+ })
198
+ })
199
+
200
+ test("records the effects of a run that committed, once", async () => {
201
+ await withStorage(async (storage) => {
202
+ await recordTestActionRun(storage, run("act_effects"))
203
+ const error = failure("act_effects", "effects", "Slack timed out")
204
+ const completedAt = new Date("2026-04-29T10:00:05.000Z")
205
+
206
+ const recorded = await storage.actionRuns.recordEffects({
207
+ id: "act_effects",
208
+ projectId,
209
+ status: "failed",
210
+ completedAt,
211
+ error,
212
+ })
213
+ expect(recorded).toMatchObject({
214
+ status: "succeeded",
215
+ phase: "effects",
216
+ effects: { status: "failed", completedAt, error },
217
+ })
218
+ expect(recorded.error).toBeUndefined()
219
+
220
+ // The same outcome again changes nothing, its completion time included.
221
+ await expect(
222
+ storage.actionRuns.recordEffects({
223
+ id: "act_effects",
224
+ projectId,
225
+ status: "failed",
226
+ completedAt: new Date("2026-04-29T10:00:06.000Z"),
227
+ error,
228
+ })
229
+ ).resolves.toEqual(recorded)
230
+ await expect(
231
+ storage.actionRuns.recordEffects({ id: "act_effects", projectId, status: "succeeded" })
232
+ ).rejects.toBeInstanceOf(ActionRunError)
233
+ await expect(storage.actionRuns.getById({ projectId, id: "act_effects" })).resolves.toEqual(
234
+ recorded
235
+ )
236
+ })
237
+ })
238
+
239
+ test("records effects only on a succeeded run in its commit phase", async () => {
240
+ await withStorage(async (storage) => {
241
+ await recordTestActionRun(storage, run("act_no_edits", { phase: "writeback" }))
242
+ await recordTestActionRun(
243
+ storage,
244
+ run("act_rejected", {
245
+ status: "failed",
246
+ error: failure("act_rejected", "commit", "Commit failed"),
247
+ })
248
+ )
249
+
250
+ for (const id of ["act_no_edits", "act_rejected", "act_missing"]) {
251
+ await expect(
252
+ storage.actionRuns.recordEffects({ id, projectId, status: "succeeded" })
253
+ ).rejects.toBeInstanceOf(ActionRunError)
254
+ }
255
+ await expect(
256
+ storage.actionRuns.getById({ projectId, id: "act_no_edits" })
257
+ ).resolves.toMatchObject({ phase: "writeback" })
258
+ })
259
+ })
260
+
261
+ test("lists runs with filters, in start order, by page", async () => {
262
+ await withStorage(async (storage) => {
263
+ const at = (minute: number) => new Date(Date.UTC(2026, 3, 29, 10, minute))
264
+ await recordTestActionRun(
265
+ storage,
266
+ run("act_1", {
267
+ subject: { kind: "object", objectTypeId: "Opportunity", primaryId: "opp-1" },
268
+ startedAt: at(0),
269
+ finishedAt: at(1),
270
+ status: "failed",
271
+ error: failure("act_1", "validation", "Invalid amount"),
272
+ })
273
+ )
274
+ await recordTestActionRun(
275
+ storage,
276
+ run("act_2", {
277
+ subject: { kind: "object", objectTypeId: "Opportunity", primaryId: "opp-2" },
278
+ startedAt: at(10),
279
+ finishedAt: at(11),
280
+ })
281
+ )
282
+ await recordTestActionRun(
283
+ storage,
284
+ run("act_3", { actionId: "closeOpportunity", startedAt: at(20), finishedAt: at(21) })
285
+ )
286
+
287
+ const succeeded = await storage.actionRuns.list({
288
+ projectId,
289
+ actionId: "createInvoice",
290
+ statuses: ["succeeded"],
291
+ startedAfter: at(5),
292
+ limit: 1,
293
+ })
294
+ expect(succeeded).toMatchObject({ total: 1, hasMore: false })
295
+ expect(succeeded.runs.map((recorded) => recorded.id)).toEqual(["act_2"])
296
+
297
+ const all = await storage.actionRuns.list({ projectId, order: "asc", limit: 2 })
298
+ expect(all).toMatchObject({ total: 3, hasMore: true })
299
+ expect(all.runs.map((recorded) => recorded.id)).toEqual(["act_1", "act_2"])
300
+
301
+ const latest = await storage.actionRuns.list({ projectId, startedBefore: at(15) })
302
+ expect(latest.runs.map((recorded) => recorded.id)).toEqual(["act_2", "act_1"])
303
+
304
+ const forObject = await storage.actionRuns.list({
305
+ projectId,
306
+ objectTypeId: "Opportunity",
307
+ primaryId: "opp-1",
308
+ })
309
+ expect(forObject.runs.map((recorded) => recorded.id)).toEqual(["act_1"])
310
+ })
311
+ })
312
+
313
+ test("drops a record written in a transaction that rolls back", async () => {
314
+ await withStorage(async (storage) => {
315
+ const input = await createTestActionRunRecord(storage.executions, run("act_rolled_back"))
316
+ await expect(
317
+ storage.transaction(async (tx) => {
318
+ await tx.actionRuns?.record(input)
319
+ throw new Error("rollback")
320
+ })
321
+ ).rejects.toThrow("rollback")
322
+ await expect(
323
+ storage.actionRuns.getById({ projectId, id: "act_rolled_back" })
324
+ ).resolves.toBeNull()
325
+
326
+ await storage.transaction(async (tx) => {
327
+ await tx.actionRuns?.record(input)
328
+ })
329
+ await expect(
330
+ storage.actionRuns.getById({ projectId, id: "act_rolled_back" })
331
+ ).resolves.toMatchObject({ status: "succeeded" })
332
+ })
333
+ })
334
+ })
335
+ }