@sixb/core 0.1.6 → 0.1.8

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 (909) hide show
  1. package/dist/actions/delegated-admission.d.ts +24 -0
  2. package/dist/actions/delegated-admission.d.ts.map +1 -0
  3. package/dist/actions/descriptor.d.ts +29 -0
  4. package/dist/actions/descriptor.d.ts.map +1 -0
  5. package/dist/actions/execution.d.ts +5 -5
  6. package/dist/actions/execution.d.ts.map +1 -1
  7. package/dist/actions/index.js +50 -40
  8. package/dist/actions/index.js.map +1 -1
  9. package/dist/actions/request.d.ts.map +1 -1
  10. package/dist/actions/run-authorization.d.ts +20 -0
  11. package/dist/actions/run-authorization.d.ts.map +1 -0
  12. package/dist/actions/run-dispatch.d.ts +3 -1
  13. package/dist/actions/run-dispatch.d.ts.map +1 -1
  14. package/dist/actions/worker.js +5 -5
  15. package/dist/actions/worker.js.map +1 -1
  16. package/dist/agents/adapters.d.ts +6 -166
  17. package/dist/agents/adapters.d.ts.map +1 -1
  18. package/dist/agents/authority.d.ts +22 -6
  19. package/dist/agents/authority.d.ts.map +1 -1
  20. package/dist/agents/builders.d.ts +3 -11
  21. package/dist/agents/builders.d.ts.map +1 -1
  22. package/dist/agents/context-resolution.d.ts.map +1 -1
  23. package/dist/agents/context.js +2 -2
  24. package/dist/agents/dispatch.d.ts +9 -1
  25. package/dist/agents/dispatch.d.ts.map +1 -1
  26. package/dist/agents/errors.d.ts +1 -10
  27. package/dist/agents/errors.d.ts.map +1 -1
  28. package/dist/agents/execution.d.ts +9 -10
  29. package/dist/agents/execution.d.ts.map +1 -1
  30. package/dist/agents/identity.d.ts +3 -0
  31. package/dist/agents/identity.d.ts.map +1 -0
  32. package/dist/agents/ids.d.ts +4 -0
  33. package/dist/agents/ids.d.ts.map +1 -1
  34. package/dist/agents/index.d.ts +15 -11
  35. package/dist/agents/index.d.ts.map +1 -1
  36. package/dist/agents/index.js +90 -78
  37. package/dist/agents/index.js.map +1 -1
  38. package/dist/agents/message.d.ts +19 -13
  39. package/dist/agents/message.d.ts.map +1 -1
  40. package/dist/agents/model-loop.d.ts +58 -0
  41. package/dist/agents/model-loop.d.ts.map +1 -0
  42. package/dist/agents/reference.d.ts +4 -0
  43. package/dist/agents/reference.d.ts.map +1 -0
  44. package/dist/agents/request.d.ts +10 -8
  45. package/dist/agents/request.d.ts.map +1 -1
  46. package/dist/agents/retired-config.d.ts +4 -0
  47. package/dist/agents/retired-config.d.ts.map +1 -0
  48. package/dist/agents/streams.d.ts +13 -8
  49. package/dist/agents/streams.d.ts.map +1 -1
  50. package/dist/agents/streams.js +7 -5
  51. package/dist/agents/streams.js.map +1 -1
  52. package/dist/agents/tool-catalog.d.ts +9 -0
  53. package/dist/agents/tool-catalog.d.ts.map +1 -0
  54. package/dist/agents/tool-definition.d.ts +1 -1
  55. package/dist/agents/tool-definition.d.ts.map +1 -1
  56. package/dist/agents/types.d.ts +31 -68
  57. package/dist/agents/types.d.ts.map +1 -1
  58. package/dist/agents/validation.d.ts +3 -13
  59. package/dist/agents/validation.d.ts.map +1 -1
  60. package/dist/ai-usage/execution.d.ts +53 -0
  61. package/dist/ai-usage/execution.d.ts.map +1 -0
  62. package/dist/ai-usage/index.d.ts +3 -0
  63. package/dist/ai-usage/index.d.ts.map +1 -0
  64. package/dist/auth/index.js +12 -9
  65. package/dist/auth/index.js.map +1 -1
  66. package/dist/authorization/decision.d.ts +14 -3
  67. package/dist/authorization/decision.d.ts.map +1 -1
  68. package/dist/authorization/grant-kinds.d.ts +25 -8
  69. package/dist/authorization/grant-kinds.d.ts.map +1 -1
  70. package/dist/authorization/index.d.ts +1 -1
  71. package/dist/authorization/index.d.ts.map +1 -1
  72. package/dist/authorization/index.js +12 -7
  73. package/dist/authorization/index.js.map +1 -1
  74. package/dist/authorization/resolve.d.ts +3 -3
  75. package/dist/authorization/resolve.d.ts.map +1 -1
  76. package/dist/authorization/types.d.ts +7 -5
  77. package/dist/authorization/types.d.ts.map +1 -1
  78. package/dist/blob-storage/browser.js +2 -2
  79. package/dist/blob-storage/index.js +3 -3
  80. package/dist/bootstrap/discovery.d.ts +6 -6
  81. package/dist/bootstrap/discovery.d.ts.map +1 -1
  82. package/dist/bootstrap/index.js +62 -51
  83. package/dist/bootstrap/index.js.map +1 -1
  84. package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
  85. package/dist/broker/index.js +2 -2
  86. package/dist/{chunk-zqysyfjt.js → chunk-08m3b6w8.js} +1 -1
  87. package/dist/chunk-19jp6g9d.js +131 -0
  88. package/dist/chunk-19jp6g9d.js.map +11 -0
  89. package/dist/{chunk-3j7573mj.js → chunk-2dw777qw.js} +50 -5
  90. package/dist/{chunk-3j7573mj.js.map → chunk-2dw777qw.js.map} +4 -3
  91. package/dist/{chunk-0172wgm9.js → chunk-2xns679x.js} +10 -2
  92. package/dist/{chunk-0172wgm9.js.map → chunk-2xns679x.js.map} +3 -3
  93. package/dist/chunk-359jm1jw.js +147 -0
  94. package/dist/chunk-359jm1jw.js.map +10 -0
  95. package/dist/{chunk-dy311asx.js → chunk-3xep5cjx.js} +58 -23
  96. package/dist/chunk-3xep5cjx.js.map +15 -0
  97. package/dist/{chunk-n4spznws.js → chunk-3z1qec12.js} +83 -12
  98. package/dist/chunk-3z1qec12.js.map +12 -0
  99. package/dist/{chunk-z3zp0bj1.js → chunk-407j3msh.js} +1 -1
  100. package/dist/{chunk-rhrbz7d4.js → chunk-4a849fr1.js} +1 -1
  101. package/dist/{chunk-cy0n5dms.js → chunk-4jjp5k14.js} +1 -1
  102. package/dist/chunk-4qfkag59.js +1568 -0
  103. package/dist/chunk-4qfkag59.js.map +20 -0
  104. package/dist/{chunk-1e8m6yn3.js → chunk-4sm0aznx.js} +685 -86
  105. package/dist/chunk-4sm0aznx.js.map +43 -0
  106. package/dist/chunk-4yqmp43v.js +159 -0
  107. package/dist/chunk-4yqmp43v.js.map +11 -0
  108. package/dist/{chunk-rdeagz6b.js → chunk-5e3pq99w.js} +3 -7
  109. package/dist/{chunk-rdeagz6b.js.map → chunk-5e3pq99w.js.map} +3 -3
  110. package/dist/{chunk-ezake7g1.js → chunk-5ntny1qx.js} +1 -1
  111. package/dist/{chunk-dm72y8wt.js → chunk-7y0f6rf1.js} +29 -16
  112. package/dist/chunk-7y0f6rf1.js.map +10 -0
  113. package/dist/{chunk-72q2y8hn.js → chunk-8tsf6dmc.js} +2 -2
  114. package/dist/{chunk-qewtks41.js → chunk-9nbmsvn5.js} +123 -20
  115. package/dist/chunk-9nbmsvn5.js.map +11 -0
  116. package/dist/{chunk-5sxb1168.js → chunk-aa2pen2v.js} +256 -82
  117. package/dist/chunk-aa2pen2v.js.map +34 -0
  118. package/dist/{chunk-819wnjz8.js → chunk-ajnan18g.js} +13 -10
  119. package/dist/chunk-ajnan18g.js.map +12 -0
  120. package/dist/chunk-c15dr03f.js +43 -0
  121. package/dist/chunk-c15dr03f.js.map +10 -0
  122. package/dist/{chunk-t0jjkep3.js → chunk-d8qkxt2v.js} +4 -2
  123. package/dist/chunk-d8qkxt2v.js.map +10 -0
  124. package/dist/{chunk-vybf6pkp.js → chunk-dbc80ad7.js} +1 -1
  125. package/dist/{chunk-nkbfrt0c.js → chunk-f26bck4t.js} +7 -7
  126. package/dist/{chunk-x2yw73hy.js → chunk-fvt9rjsa.js} +23 -7
  127. package/dist/chunk-fvt9rjsa.js.map +10 -0
  128. package/dist/{chunk-znagycq7.js → chunk-gbejpkex.js} +5 -5
  129. package/dist/{chunk-znagycq7.js.map → chunk-gbejpkex.js.map} +1 -1
  130. package/dist/{chunk-e42bc6m3.js → chunk-gzasd5b6.js} +5 -5
  131. package/dist/{chunk-e42bc6m3.js.map → chunk-gzasd5b6.js.map} +3 -3
  132. package/dist/{chunk-rnshztfq.js → chunk-h0k55pc7.js} +6 -6
  133. package/dist/{chunk-rnshztfq.js.map → chunk-h0k55pc7.js.map} +1 -1
  134. package/dist/chunk-h5vqbfmd.js +1537 -0
  135. package/dist/chunk-h5vqbfmd.js.map +19 -0
  136. package/dist/chunk-j1sbhm7p.js +45 -0
  137. package/dist/chunk-j1sbhm7p.js.map +10 -0
  138. package/dist/chunk-jecn6t54.js +307 -0
  139. package/dist/chunk-jecn6t54.js.map +12 -0
  140. package/dist/{chunk-dsrkgtnh.js → chunk-jq43kdvk.js} +1 -1
  141. package/dist/{chunk-wtmzkcht.js → chunk-k34z5rvh.js} +1 -1
  142. package/dist/{chunk-f6erf2vv.js → chunk-k522z7v6.js} +10 -5
  143. package/dist/chunk-k522z7v6.js.map +10 -0
  144. package/dist/{chunk-htq0qh7z.js → chunk-ka3a2ft3.js} +2 -2
  145. package/dist/{chunk-ckxfnx7f.js → chunk-mth82m8t.js} +129 -95
  146. package/dist/chunk-mth82m8t.js.map +14 -0
  147. package/dist/{chunk-5gynx4xn.js → chunk-mwsxn98e.js} +79 -77
  148. package/dist/{chunk-5gynx4xn.js.map → chunk-mwsxn98e.js.map} +8 -8
  149. package/dist/{chunk-f2rt4vkh.js → chunk-n2w475r0.js} +3 -3
  150. package/dist/chunk-n4khvw9n.js +111 -0
  151. package/dist/chunk-n4khvw9n.js.map +11 -0
  152. package/dist/{chunk-t8t39h7v.js → chunk-n6jxh8sw.js} +10 -2
  153. package/dist/chunk-n6jxh8sw.js.map +10 -0
  154. package/dist/chunk-nn0tekr1.js +284 -0
  155. package/dist/chunk-nn0tekr1.js.map +12 -0
  156. package/dist/chunk-nx7k8tpr.js +436 -0
  157. package/dist/chunk-nx7k8tpr.js.map +12 -0
  158. package/dist/{chunk-drjqm1aa.js → chunk-p03r0h5s.js} +310 -28
  159. package/dist/chunk-p03r0h5s.js.map +16 -0
  160. package/dist/{chunk-1g8negke.js → chunk-p1rzczbt.js} +93 -8
  161. package/dist/chunk-p1rzczbt.js.map +12 -0
  162. package/dist/{chunk-f83ka50g.js → chunk-p1x242ad.js} +652 -77
  163. package/dist/chunk-p1x242ad.js.map +25 -0
  164. package/dist/chunk-p2vqaxkc.js +528 -0
  165. package/dist/chunk-p2vqaxkc.js.map +15 -0
  166. package/dist/{chunk-a31h57d5.js → chunk-pc7ys28c.js} +70 -7
  167. package/dist/chunk-pc7ys28c.js.map +14 -0
  168. package/dist/{chunk-md8k0r54.js → chunk-q0k9nc5a.js} +281 -89
  169. package/dist/chunk-q0k9nc5a.js.map +14 -0
  170. package/dist/{chunk-bhxaq2nn.js → chunk-qw9gvjv5.js} +1 -1
  171. package/dist/chunk-r8jrnexe.js +403 -0
  172. package/dist/chunk-r8jrnexe.js.map +10 -0
  173. package/dist/{chunk-h9kxd41f.js → chunk-rafagrwr.js} +48 -7
  174. package/dist/chunk-rafagrwr.js.map +11 -0
  175. package/dist/{chunk-dysw7nsm.js → chunk-rv2hkwwa.js} +2 -2
  176. package/dist/{chunk-ghteq96b.js → chunk-s5y30bc9.js} +2 -2
  177. package/dist/{chunk-t624af60.js → chunk-sbzzr4kx.js} +1848 -757
  178. package/dist/chunk-sbzzr4kx.js.map +63 -0
  179. package/dist/{chunk-6gjqgd3d.js → chunk-tpnd31c1.js} +2 -1
  180. package/dist/chunk-tpnd31c1.js.map +11 -0
  181. package/dist/chunk-trxxmgnf.js +68 -0
  182. package/dist/chunk-trxxmgnf.js.map +11 -0
  183. package/dist/{chunk-0hc5j867.js → chunk-v1xppd0y.js} +17 -13
  184. package/dist/{chunk-0hc5j867.js.map → chunk-v1xppd0y.js.map} +2 -2
  185. package/dist/chunk-v4en4jc2.js +252 -0
  186. package/dist/chunk-v4en4jc2.js.map +10 -0
  187. package/dist/{chunk-xkthy56g.js → chunk-w1tvjszy.js} +1 -1
  188. package/dist/{chunk-8b55ygje.js → chunk-w3e09qqk.js} +1 -1
  189. package/dist/{chunk-8gv5z0zm.js → chunk-w9tg6yyb.js} +13 -8
  190. package/dist/{chunk-8gv5z0zm.js.map → chunk-w9tg6yyb.js.map} +3 -3
  191. package/dist/{chunk-62c7t4jc.js → chunk-wdage1eb.js} +1 -1
  192. package/dist/{chunk-tg5mee00.js → chunk-wtf06et8.js} +11 -7
  193. package/dist/{chunk-tg5mee00.js.map → chunk-wtf06et8.js.map} +3 -3
  194. package/dist/{chunk-nva1xkjz.js → chunk-xajtptbw.js} +1237 -1434
  195. package/dist/chunk-xajtptbw.js.map +40 -0
  196. package/dist/{chunk-xc7hq65b.js → chunk-yp8ee62z.js} +49 -2
  197. package/dist/chunk-yp8ee62z.js.map +11 -0
  198. package/dist/chunk-z4ccwbkz.js +139 -0
  199. package/dist/chunk-z4ccwbkz.js.map +10 -0
  200. package/dist/datasets/builders.d.ts +11 -2
  201. package/dist/datasets/builders.d.ts.map +1 -1
  202. package/dist/datasets/changes.d.ts +14 -4
  203. package/dist/datasets/changes.d.ts.map +1 -1
  204. package/dist/datasets/execution.d.ts +15 -1
  205. package/dist/datasets/execution.d.ts.map +1 -1
  206. package/dist/datasets/index.d.ts +1 -0
  207. package/dist/datasets/index.d.ts.map +1 -1
  208. package/dist/datasets/sequence.d.ts +7 -0
  209. package/dist/datasets/sequence.d.ts.map +1 -0
  210. package/dist/datasets/types.d.ts +1 -0
  211. package/dist/datasets/types.d.ts.map +1 -1
  212. package/dist/datasets/validation.d.ts.map +1 -1
  213. package/dist/datasets/write.d.ts +37 -0
  214. package/dist/datasets/write.d.ts.map +1 -0
  215. package/dist/datasets/write.js +17 -0
  216. package/dist/datasets/write.js.map +9 -0
  217. package/dist/error-reporting/internal.js +4 -4
  218. package/dist/error-reporting/types.d.ts +7 -2
  219. package/dist/error-reporting/types.d.ts.map +1 -1
  220. package/dist/errors/catalog.d.ts +8 -0
  221. package/dist/errors/catalog.d.ts.map +1 -1
  222. package/dist/errors/internal.js +2 -2
  223. package/dist/events/execution.d.ts.map +1 -1
  224. package/dist/events/index.js +4 -4
  225. package/dist/events/types/datasets.d.ts +2 -6
  226. package/dist/events/types/datasets.d.ts.map +1 -1
  227. package/dist/execution/agent.d.ts +18 -9
  228. package/dist/execution/agent.d.ts.map +1 -1
  229. package/dist/execution/agent.js +62 -46
  230. package/dist/execution/agent.js.map +1 -1
  231. package/dist/execution/authorization.d.ts +68 -20
  232. package/dist/execution/authorization.d.ts.map +1 -1
  233. package/dist/execution/authorized-object-reader.d.ts +69 -0
  234. package/dist/execution/authorized-object-reader.d.ts.map +1 -0
  235. package/dist/execution/durable.d.ts.map +1 -1
  236. package/dist/execution/index.d.ts +1 -1
  237. package/dist/execution/index.d.ts.map +1 -1
  238. package/dist/execution/primitive.js +55 -46
  239. package/dist/execution/primitive.js.map +2 -2
  240. package/dist/execution/request.d.ts +14 -1
  241. package/dist/execution/request.d.ts.map +1 -1
  242. package/dist/execution/request.js +92 -54
  243. package/dist/execution/request.js.map +3 -3
  244. package/dist/execution/scopes.d.ts +16 -0
  245. package/dist/execution/scopes.d.ts.map +1 -1
  246. package/dist/execution/types.d.ts +10 -1
  247. package/dist/execution/types.d.ts.map +1 -1
  248. package/dist/http/api-routes.d.ts +2 -0
  249. package/dist/http/api-routes.d.ts.map +1 -1
  250. package/dist/http/index.js +1 -1
  251. package/dist/index.d.ts +15 -9
  252. package/dist/index.d.ts.map +1 -1
  253. package/dist/index.js +128 -109
  254. package/dist/index.js.map +1 -1
  255. package/dist/json.d.ts +2 -0
  256. package/dist/json.d.ts.map +1 -1
  257. package/dist/lake-storage/definition-updates.d.ts.map +1 -1
  258. package/dist/lake-storage/errors.d.ts +5 -1
  259. package/dist/lake-storage/errors.d.ts.map +1 -1
  260. package/dist/lake-storage/in-memory.d.ts +1 -0
  261. package/dist/lake-storage/in-memory.d.ts.map +1 -1
  262. package/dist/lake-storage/index.d.ts +6 -1
  263. package/dist/lake-storage/index.d.ts.map +1 -1
  264. package/dist/lake-storage/index.js +27 -10
  265. package/dist/lake-storage/index.js.map +1 -1
  266. package/dist/lake-storage/merge-validation.d.ts.map +1 -1
  267. package/dist/lake-storage/merge.d.ts +13 -2
  268. package/dist/lake-storage/merge.d.ts.map +1 -1
  269. package/dist/lake-storage/source-ordering.d.ts +19 -0
  270. package/dist/lake-storage/source-ordering.d.ts.map +1 -0
  271. package/dist/lake-storage/sql-transforms.d.ts +2 -1
  272. package/dist/lake-storage/sql-transforms.d.ts.map +1 -1
  273. package/dist/lake-storage/types.d.ts +10 -5
  274. package/dist/lake-storage/types.d.ts.map +1 -1
  275. package/dist/lake-storage/version-inputs.d.ts +4 -0
  276. package/dist/lake-storage/version-inputs.d.ts.map +1 -0
  277. package/dist/logging/index.js +3 -3
  278. package/dist/logging/types.js +2 -2
  279. package/dist/materialization/index.js +2 -2
  280. package/dist/materializer/index.js +38 -31
  281. package/dist/materializer/index.js.map +1 -1
  282. package/dist/models/catalog.d.ts +40 -0
  283. package/dist/models/catalog.d.ts.map +1 -0
  284. package/dist/models/definitions.d.ts +25 -0
  285. package/dist/models/definitions.d.ts.map +1 -0
  286. package/dist/models/errors.d.ts +52 -0
  287. package/dist/models/errors.d.ts.map +1 -0
  288. package/dist/models/events.d.ts +192 -0
  289. package/dist/models/events.d.ts.map +1 -0
  290. package/dist/models/index.d.ts +17 -39
  291. package/dist/models/index.d.ts.map +1 -1
  292. package/dist/models/index.js +50 -0
  293. package/dist/models/index.js.map +9 -0
  294. package/dist/models/language-model.d.ts +90 -0
  295. package/dist/models/language-model.d.ts.map +1 -0
  296. package/dist/models/messages.d.ts +74 -0
  297. package/dist/models/messages.d.ts.map +1 -0
  298. package/dist/models/pricing.d.ts +69 -0
  299. package/dist/models/pricing.d.ts.map +1 -0
  300. package/dist/models/rate-card.d.ts +24 -0
  301. package/dist/models/rate-card.d.ts.map +1 -0
  302. package/dist/models/tools.d.ts +24 -0
  303. package/dist/models/tools.d.ts.map +1 -0
  304. package/dist/objects/authorized-ontology-view.d.ts +25 -0
  305. package/dist/objects/authorized-ontology-view.d.ts.map +1 -0
  306. package/dist/objects/execution.d.ts +1 -1
  307. package/dist/objects/execution.d.ts.map +1 -1
  308. package/dist/objects/index.js +43 -36
  309. package/dist/objects/index.js.map +1 -1
  310. package/dist/objects/link/authorization.d.ts +2 -7
  311. package/dist/objects/link/authorization.d.ts.map +1 -1
  312. package/dist/objects/query/executor.d.ts +4 -2
  313. package/dist/objects/query/executor.d.ts.map +1 -1
  314. package/dist/objects/query/index.js +36 -29
  315. package/dist/objects/query/index.js.map +1 -1
  316. package/dist/objects/query/links.d.ts +22 -1
  317. package/dist/objects/query/links.d.ts.map +1 -1
  318. package/dist/objects/query/selected-read-admission.d.ts +27 -0
  319. package/dist/objects/query/selected-read-admission.d.ts.map +1 -0
  320. package/dist/objects/query/validate.d.ts +60 -2
  321. package/dist/objects/query/validate.d.ts.map +1 -1
  322. package/dist/objects/sdk/object-handle.d.ts.map +1 -1
  323. package/dist/objects/sdk/object-set.d.ts.map +1 -1
  324. package/dist/objects/sdk/runtime-query-executor.d.ts +2 -7
  325. package/dist/objects/sdk/runtime-query-executor.d.ts.map +1 -1
  326. package/dist/objects/sdk/telemetry-channel.d.ts.map +1 -1
  327. package/dist/objects/service/list-service.d.ts +2 -3
  328. package/dist/objects/service/list-service.d.ts.map +1 -1
  329. package/dist/objects/telemetry/history.d.ts +8 -6
  330. package/dist/objects/telemetry/history.d.ts.map +1 -1
  331. package/dist/objects/telemetry/index.d.ts +2 -2
  332. package/dist/objects/telemetry/index.d.ts.map +1 -1
  333. package/dist/objects/telemetry/workload.d.ts +11 -0
  334. package/dist/objects/telemetry/workload.d.ts.map +1 -0
  335. package/dist/ontology/index.d.ts +2 -1
  336. package/dist/ontology/index.d.ts.map +1 -1
  337. package/dist/ontology/index.js +15 -14
  338. package/dist/ontology/index.js.map +1 -1
  339. package/dist/ontology/inference/index.d.ts +2 -1
  340. package/dist/ontology/inference/index.d.ts.map +1 -1
  341. package/dist/ontology/internal.d.ts +0 -1
  342. package/dist/ontology/internal.d.ts.map +1 -1
  343. package/dist/ontology/internal.js +5 -10
  344. package/dist/ontology/internal.js.map +3 -3
  345. package/dist/ontology/json-schema.d.ts +10 -6
  346. package/dist/ontology/json-schema.d.ts.map +1 -1
  347. package/dist/ontology/link-path-selection.d.ts +35 -0
  348. package/dist/ontology/link-path-selection.d.ts.map +1 -0
  349. package/dist/ontology/refs.d.ts +2 -0
  350. package/dist/ontology/refs.d.ts.map +1 -1
  351. package/dist/ontology/tokens.d.ts +2 -1
  352. package/dist/ontology/tokens.d.ts.map +1 -1
  353. package/dist/pipelines/execution.d.ts.map +1 -1
  354. package/dist/pipelines/index.js +41 -36
  355. package/dist/pipelines/index.js.map +1 -1
  356. package/dist/pipelines/request.d.ts.map +1 -1
  357. package/dist/projections/execution.d.ts.map +1 -1
  358. package/dist/projections/internal.js +39 -32
  359. package/dist/projections/internal.js.map +1 -1
  360. package/dist/projections/run-dispatch.d.ts.map +1 -1
  361. package/dist/queues/in-memory.d.ts +3 -2
  362. package/dist/queues/in-memory.d.ts.map +1 -1
  363. package/dist/queues/index.d.ts +3 -1
  364. package/dist/queues/index.d.ts.map +1 -1
  365. package/dist/queues/index.js +1 -1
  366. package/dist/queues/types.d.ts +15 -3
  367. package/dist/queues/types.d.ts.map +1 -1
  368. package/dist/rules/execution.d.ts.map +1 -1
  369. package/dist/runtime/create.d.ts +7 -4
  370. package/dist/runtime/create.d.ts.map +1 -1
  371. package/dist/runtime/definitions.d.ts +4 -2
  372. package/dist/runtime/definitions.d.ts.map +1 -1
  373. package/dist/runtime/host.d.ts +5 -2
  374. package/dist/runtime/host.d.ts.map +1 -1
  375. package/dist/runtime/internal.d.ts +1 -0
  376. package/dist/runtime/internal.d.ts.map +1 -1
  377. package/dist/runtime/resolve-definitions.d.ts +4 -2
  378. package/dist/runtime/resolve-definitions.d.ts.map +1 -1
  379. package/dist/runtime/sixb.d.ts +8 -2
  380. package/dist/runtime/sixb.d.ts.map +1 -1
  381. package/dist/runtime/types.d.ts +3 -0
  382. package/dist/runtime/types.d.ts.map +1 -1
  383. package/dist/schedules/execution.d.ts +2 -1
  384. package/dist/schedules/execution.d.ts.map +1 -1
  385. package/dist/security/every.d.ts +4 -4
  386. package/dist/security/every.d.ts.map +1 -1
  387. package/dist/security/grants.d.ts +12 -6
  388. package/dist/security/grants.d.ts.map +1 -1
  389. package/dist/security/index.d.ts +1 -1
  390. package/dist/security/index.d.ts.map +1 -1
  391. package/dist/security/registry.d.ts +2 -1
  392. package/dist/security/registry.d.ts.map +1 -1
  393. package/dist/security/types.d.ts +19 -5
  394. package/dist/security/types.d.ts.map +1 -1
  395. package/dist/security/validation.d.ts +6 -2
  396. package/dist/security/validation.d.ts.map +1 -1
  397. package/dist/shares/access-plan.d.ts +22 -0
  398. package/dist/shares/access-plan.d.ts.map +1 -0
  399. package/dist/shares/builders.d.ts +14 -0
  400. package/dist/shares/builders.d.ts.map +1 -0
  401. package/dist/shares/compiler.d.ts +14 -0
  402. package/dist/shares/compiler.d.ts.map +1 -0
  403. package/dist/shares/errors.d.ts +4 -0
  404. package/dist/shares/errors.d.ts.map +1 -0
  405. package/dist/shares/execution.d.ts +57 -0
  406. package/dist/shares/execution.d.ts.map +1 -0
  407. package/dist/shares/index.d.ts +10 -0
  408. package/dist/shares/index.d.ts.map +1 -0
  409. package/dist/shares/internal.d.ts +3 -0
  410. package/dist/shares/internal.d.ts.map +1 -0
  411. package/dist/shares/internal.js +239 -0
  412. package/dist/shares/internal.js.map +10 -0
  413. package/dist/shares/intersection.d.ts +9 -0
  414. package/dist/shares/intersection.d.ts.map +1 -0
  415. package/dist/shares/session-protocol.d.ts +41 -0
  416. package/dist/shares/session-protocol.d.ts.map +1 -0
  417. package/dist/shares/types.d.ts +51 -0
  418. package/dist/shares/types.d.ts.map +1 -0
  419. package/dist/shares/validation.d.ts +11 -0
  420. package/dist/shares/validation.d.ts.map +1 -0
  421. package/dist/storage/action-runs/failure.js +3 -3
  422. package/dist/storage/action-runs/provider.js +2 -2
  423. package/dist/storage/agents/errors.d.ts +1 -1
  424. package/dist/storage/agents/errors.d.ts.map +1 -1
  425. package/dist/storage/agents/in-memory.d.ts +3 -2
  426. package/dist/storage/agents/in-memory.d.ts.map +1 -1
  427. package/dist/storage/agents/index.d.ts +1 -1
  428. package/dist/storage/agents/index.d.ts.map +1 -1
  429. package/dist/storage/agents/provider.d.ts +11 -4
  430. package/dist/storage/agents/provider.d.ts.map +1 -1
  431. package/dist/storage/agents/provider.js +18 -15
  432. package/dist/storage/agents/provider.js.map +1 -1
  433. package/dist/storage/agents/types.d.ts +65 -17
  434. package/dist/storage/agents/types.d.ts.map +1 -1
  435. package/dist/storage/ai-cost/analytics.d.ts +2 -1
  436. package/dist/storage/ai-cost/analytics.d.ts.map +1 -1
  437. package/dist/storage/ai-cost/codec.d.ts +3 -2
  438. package/dist/storage/ai-cost/codec.d.ts.map +1 -1
  439. package/dist/storage/ai-cost/groups.d.ts +51 -0
  440. package/dist/storage/ai-cost/groups.d.ts.map +1 -0
  441. package/dist/storage/ai-cost/in-memory.d.ts +11 -1
  442. package/dist/storage/ai-cost/in-memory.d.ts.map +1 -1
  443. package/dist/storage/ai-cost/index.d.ts +1 -1
  444. package/dist/storage/ai-cost/index.d.ts.map +1 -1
  445. package/dist/storage/ai-cost/provider.d.ts +2 -0
  446. package/dist/storage/ai-cost/provider.d.ts.map +1 -1
  447. package/dist/storage/ai-cost/provider.js +29 -13
  448. package/dist/storage/ai-cost/provider.js.map +3 -3
  449. package/dist/storage/ai-cost/types.d.ts +64 -15
  450. package/dist/storage/ai-cost/types.d.ts.map +1 -1
  451. package/dist/storage/ai-cost/validation.d.ts +2 -1
  452. package/dist/storage/ai-cost/validation.d.ts.map +1 -1
  453. package/dist/storage/ai-limits/enforcement.d.ts +14 -0
  454. package/dist/storage/ai-limits/enforcement.d.ts.map +1 -0
  455. package/dist/storage/ai-limits/enforcement.js +21 -0
  456. package/dist/storage/ai-limits/enforcement.js.map +9 -0
  457. package/dist/storage/ai-limits/errors.d.ts +8 -0
  458. package/dist/storage/ai-limits/errors.d.ts.map +1 -0
  459. package/dist/storage/ai-limits/in-memory.d.ts +78 -0
  460. package/dist/storage/ai-limits/in-memory.d.ts.map +1 -0
  461. package/dist/storage/ai-limits/index.d.ts +7 -0
  462. package/dist/storage/ai-limits/index.d.ts.map +1 -0
  463. package/dist/storage/ai-limits/period.d.ts +4 -0
  464. package/dist/storage/ai-limits/period.d.ts.map +1 -0
  465. package/dist/storage/ai-limits/provider.d.ts +85 -0
  466. package/dist/storage/ai-limits/provider.d.ts.map +1 -0
  467. package/dist/storage/ai-limits/provider.js +62 -0
  468. package/dist/storage/ai-limits/provider.js.map +9 -0
  469. package/dist/storage/ai-limits/types.d.ts +175 -0
  470. package/dist/storage/ai-limits/types.d.ts.map +1 -0
  471. package/dist/storage/ai-usage/in-memory.d.ts +4 -0
  472. package/dist/storage/ai-usage/in-memory.d.ts.map +1 -1
  473. package/dist/storage/ai-usage/record.d.ts.map +1 -1
  474. package/dist/storage/ai-usage/types.d.ts +6 -2
  475. package/dist/storage/ai-usage/types.d.ts.map +1 -1
  476. package/dist/storage/auth/errors.d.ts +1 -1
  477. package/dist/storage/auth/errors.d.ts.map +1 -1
  478. package/dist/storage/auth/in-memory/auth-storage.d.ts +4 -1
  479. package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
  480. package/dist/storage/auth/in-memory/device-authorizations.d.ts +29 -0
  481. package/dist/storage/auth/in-memory/device-authorizations.d.ts.map +1 -0
  482. package/dist/storage/auth/in-memory/shared.d.ts +3 -1
  483. package/dist/storage/auth/in-memory/shared.d.ts.map +1 -1
  484. package/dist/storage/auth/index.d.ts +2 -1
  485. package/dist/storage/auth/index.d.ts.map +1 -1
  486. package/dist/storage/auth/types.d.ts +66 -0
  487. package/dist/storage/auth/types.d.ts.map +1 -1
  488. package/dist/storage/connector-connections/provider.js +2 -2
  489. package/dist/storage/executions/in-memory.d.ts +3 -0
  490. package/dist/storage/executions/in-memory.d.ts.map +1 -1
  491. package/dist/storage/executions/provider.d.ts +4 -1
  492. package/dist/storage/executions/provider.d.ts.map +1 -1
  493. package/dist/storage/executions/provider.js +23 -3
  494. package/dist/storage/executions/provider.js.map +3 -3
  495. package/dist/storage/executions/run-link.d.ts +14 -2
  496. package/dist/storage/executions/run-link.d.ts.map +1 -1
  497. package/dist/storage/executions/validation.d.ts +6 -0
  498. package/dist/storage/executions/validation.d.ts.map +1 -1
  499. package/dist/storage/in-memory/index.d.ts +12 -0
  500. package/dist/storage/in-memory/index.d.ts.map +1 -1
  501. package/dist/storage/index.d.ts +15 -6
  502. package/dist/storage/index.d.ts.map +1 -1
  503. package/dist/storage/index.js +78 -36
  504. package/dist/storage/index.js.map +1 -1
  505. package/dist/storage/objects/execution-limits.d.ts +25 -0
  506. package/dist/storage/objects/execution-limits.d.ts.map +1 -0
  507. package/dist/storage/objects/guard.d.ts +16 -0
  508. package/dist/storage/objects/guard.d.ts.map +1 -0
  509. package/dist/storage/objects/in-memory/index.d.ts +3 -0
  510. package/dist/storage/objects/in-memory/index.d.ts.map +1 -0
  511. package/dist/storage/objects/in-memory/keys.d.ts +10 -0
  512. package/dist/storage/objects/in-memory/keys.d.ts.map +1 -0
  513. package/dist/storage/objects/in-memory/query.d.ts +31 -0
  514. package/dist/storage/objects/in-memory/query.d.ts.map +1 -0
  515. package/dist/storage/objects/in-memory/read-scope.d.ts +18 -0
  516. package/dist/storage/objects/in-memory/read-scope.d.ts.map +1 -0
  517. package/dist/storage/objects/in-memory/read-source.d.ts +10 -0
  518. package/dist/storage/objects/in-memory/read-source.d.ts.map +1 -0
  519. package/dist/storage/objects/in-memory/selected-reader.d.ts +9 -0
  520. package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -0
  521. package/dist/storage/objects/{in-memory.d.ts → in-memory/storage.d.ts} +13 -10
  522. package/dist/storage/objects/in-memory/storage.d.ts.map +1 -0
  523. package/dist/storage/objects/index.d.ts +4 -1
  524. package/dist/storage/objects/index.d.ts.map +1 -1
  525. package/dist/storage/objects/keys.d.ts +1 -1
  526. package/dist/storage/objects/keys.d.ts.map +1 -1
  527. package/dist/storage/objects/read-scope.d.ts +25 -0
  528. package/dist/storage/objects/read-scope.d.ts.map +1 -0
  529. package/dist/storage/objects/types.d.ts +114 -22
  530. package/dist/storage/objects/types.d.ts.map +1 -1
  531. package/dist/storage/ontology/provider.js +3 -3
  532. package/dist/storage/operation-scope.d.ts +3 -0
  533. package/dist/storage/operation-scope.d.ts.map +1 -1
  534. package/dist/storage/operation-scope.js +4 -2
  535. package/dist/storage/operation-scope.js.map +1 -1
  536. package/dist/storage/pipeline-runs/provider.js +2 -2
  537. package/dist/storage/projection-runs/provider.js +4 -4
  538. package/dist/storage/share-grants/errors.d.ts +8 -0
  539. package/dist/storage/share-grants/errors.d.ts.map +1 -0
  540. package/dist/storage/share-grants/in-memory.d.ts +11 -0
  541. package/dist/storage/share-grants/in-memory.d.ts.map +1 -0
  542. package/dist/storage/share-grants/index.d.ts +5 -0
  543. package/dist/storage/share-grants/index.d.ts.map +1 -0
  544. package/dist/storage/share-grants/provider.d.ts +4 -0
  545. package/dist/storage/share-grants/provider.d.ts.map +1 -0
  546. package/dist/storage/share-grants/provider.js +24 -0
  547. package/dist/storage/share-grants/provider.js.map +9 -0
  548. package/dist/storage/share-grants/record.d.ts +11 -0
  549. package/dist/storage/share-grants/record.d.ts.map +1 -0
  550. package/dist/storage/share-grants/types.d.ts +97 -0
  551. package/dist/storage/share-grants/types.d.ts.map +1 -0
  552. package/dist/storage/share-sessions/errors.d.ts +8 -0
  553. package/dist/storage/share-sessions/errors.d.ts.map +1 -0
  554. package/dist/storage/share-sessions/in-memory.d.ts +14 -0
  555. package/dist/storage/share-sessions/in-memory.d.ts.map +1 -0
  556. package/dist/storage/share-sessions/index.d.ts +5 -0
  557. package/dist/storage/share-sessions/index.d.ts.map +1 -0
  558. package/dist/storage/share-sessions/provider.d.ts +3 -0
  559. package/dist/storage/share-sessions/provider.d.ts.map +1 -0
  560. package/dist/storage/share-sessions/provider.js +20 -0
  561. package/dist/storage/share-sessions/provider.js.map +9 -0
  562. package/dist/storage/share-sessions/record.d.ts +8 -0
  563. package/dist/storage/share-sessions/record.d.ts.map +1 -0
  564. package/dist/storage/share-sessions/types.d.ts +50 -0
  565. package/dist/storage/share-sessions/types.d.ts.map +1 -0
  566. package/dist/storage/sync-runs/provider.js +2 -2
  567. package/dist/storage/transaction.d.ts +2 -1
  568. package/dist/storage/transaction.d.ts.map +1 -1
  569. package/dist/storage/types.d.ts +13 -1
  570. package/dist/storage/types.d.ts.map +1 -1
  571. package/dist/storage/webhook-runs/provider.js +2 -2
  572. package/dist/storage/workflow-runs/provider.d.ts +1 -1
  573. package/dist/storage/workflow-runs/provider.js +14 -12
  574. package/dist/storage/workflow-runs/provider.js.map +1 -1
  575. package/dist/storage/workflow-runs/types.d.ts +5 -4
  576. package/dist/storage/workflow-runs/types.d.ts.map +1 -1
  577. package/dist/syncs/execution.d.ts.map +1 -1
  578. package/dist/syncs/index.js +41 -36
  579. package/dist/syncs/index.js.map +1 -1
  580. package/dist/syncs/request.d.ts.map +1 -1
  581. package/dist/testing/agent-execution.d.ts +3 -1
  582. package/dist/testing/agent-execution.d.ts.map +1 -1
  583. package/dist/testing/agent-storage-contract.d.ts.map +1 -1
  584. package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -1
  585. package/dist/testing/ai-limit-storage-contract.d.ts +18 -0
  586. package/dist/testing/ai-limit-storage-contract.d.ts.map +1 -0
  587. package/dist/testing/ai-model-call-groups-contract.d.ts +6 -0
  588. package/dist/testing/ai-model-call-groups-contract.d.ts.map +1 -0
  589. package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -1
  590. package/dist/testing/auth-storage-contract.d.ts.map +1 -1
  591. package/dist/testing/dataset-sequence-contract.d.ts +4 -0
  592. package/dist/testing/dataset-sequence-contract.d.ts.map +1 -0
  593. package/dist/testing/effective-storage-contract.d.ts.map +1 -1
  594. package/dist/testing/execution-storage-contract.d.ts +4 -0
  595. package/dist/testing/execution-storage-contract.d.ts.map +1 -1
  596. package/dist/testing/index.d.ts +5 -0
  597. package/dist/testing/index.d.ts.map +1 -1
  598. package/dist/testing/index.js +5392 -2070
  599. package/dist/testing/index.js.map +21 -15
  600. package/dist/testing/lake-merge-storage-contract.d.ts +1 -0
  601. package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -1
  602. package/dist/testing/lake-storage-contract.d.ts.map +1 -1
  603. package/dist/testing/object-read-scope-contract.d.ts +22 -0
  604. package/dist/testing/object-read-scope-contract.d.ts.map +1 -0
  605. package/dist/testing/queues-contract.d.ts.map +1 -1
  606. package/dist/testing/share-grant-storage-contract.d.ts +10 -0
  607. package/dist/testing/share-grant-storage-contract.d.ts.map +1 -0
  608. package/dist/testing/share-session-storage-contract.d.ts +9 -0
  609. package/dist/testing/share-session-storage-contract.d.ts.map +1 -0
  610. package/dist/webhooks/internal.js +36 -29
  611. package/dist/webhooks/internal.js.map +2 -2
  612. package/dist/workers/index.js +2 -2
  613. package/dist/workflows/agent-step-identity.d.ts +3 -0
  614. package/dist/workflows/agent-step-identity.d.ts.map +1 -0
  615. package/dist/workflows/builders.d.ts +2 -3
  616. package/dist/workflows/builders.d.ts.map +1 -1
  617. package/dist/workflows/execution.d.ts +1 -1
  618. package/dist/workflows/execution.d.ts.map +1 -1
  619. package/dist/workflows/failure.d.ts +1 -1
  620. package/dist/workflows/failure.d.ts.map +1 -1
  621. package/dist/workflows/index.d.ts +3 -2
  622. package/dist/workflows/index.d.ts.map +1 -1
  623. package/dist/workflows/index.js +63 -48
  624. package/dist/workflows/index.js.map +1 -1
  625. package/dist/workflows/request.d.ts.map +1 -1
  626. package/dist/workflows/types.d.ts +26 -11
  627. package/dist/workflows/types.d.ts.map +1 -1
  628. package/dist/workflows/validation.d.ts +7 -1
  629. package/dist/workflows/validation.d.ts.map +1 -1
  630. package/package.json +43 -4
  631. package/src/actions/delegated-admission.ts +72 -0
  632. package/src/actions/descriptor.ts +58 -0
  633. package/src/actions/execution.ts +99 -24
  634. package/src/actions/request.ts +136 -19
  635. package/src/actions/run-authorization.ts +53 -0
  636. package/src/actions/run-dispatch.ts +8 -1
  637. package/src/agents/adapters.ts +60 -456
  638. package/src/agents/authority.ts +215 -34
  639. package/src/agents/builders.ts +3 -50
  640. package/src/agents/context-compaction.ts +4 -0
  641. package/src/agents/context-resolution.ts +1 -4
  642. package/src/agents/dispatch.ts +59 -2
  643. package/src/agents/errors.ts +4 -11
  644. package/src/agents/execution.ts +65 -56
  645. package/src/agents/identity.ts +4 -0
  646. package/src/agents/ids.ts +16 -1
  647. package/src/agents/index.ts +23 -30
  648. package/src/agents/message.ts +20 -12
  649. package/src/agents/model-loop.ts +1071 -0
  650. package/src/agents/reference.ts +7 -0
  651. package/src/agents/request.ts +157 -77
  652. package/src/agents/retired-config.ts +20 -0
  653. package/src/agents/streams.ts +45 -19
  654. package/src/agents/tool-catalog.ts +21 -0
  655. package/src/agents/tool-definition.ts +9 -5
  656. package/src/agents/types.ts +39 -81
  657. package/src/agents/validation.ts +11 -216
  658. package/src/ai-usage/execution.ts +189 -0
  659. package/src/ai-usage/index.ts +15 -0
  660. package/src/authorization/decision.ts +54 -22
  661. package/src/authorization/grant-kinds.ts +72 -15
  662. package/src/authorization/index.ts +2 -0
  663. package/src/authorization/resolve.ts +12 -5
  664. package/src/authorization/types.ts +7 -5
  665. package/src/bootstrap/discovery.ts +3 -3
  666. package/src/bootstrap/ontology-type-manifest.ts +12 -6
  667. package/src/datasets/builders.ts +23 -2
  668. package/src/datasets/changes.ts +16 -4
  669. package/src/datasets/execution.ts +76 -5
  670. package/src/datasets/index.ts +1 -0
  671. package/src/datasets/sequence.ts +77 -0
  672. package/src/datasets/types.ts +1 -0
  673. package/src/datasets/validation.ts +26 -0
  674. package/src/datasets/write.ts +240 -0
  675. package/src/error-reporting/types.ts +4 -2
  676. package/src/errors/catalog.ts +8 -0
  677. package/src/events/execution.ts +57 -7
  678. package/src/events/types/datasets.ts +2 -6
  679. package/src/execution/agent.ts +129 -25
  680. package/src/execution/authorization.ts +493 -83
  681. package/src/execution/authorized-object-reader.ts +695 -0
  682. package/src/execution/durable.ts +10 -2
  683. package/src/execution/index.ts +1 -0
  684. package/src/execution/request.ts +67 -14
  685. package/src/execution/scopes.ts +36 -6
  686. package/src/execution/types.ts +9 -1
  687. package/src/http/api-routes.ts +108 -0
  688. package/src/index.ts +72 -22
  689. package/src/json.ts +9 -0
  690. package/src/lake-storage/definition-updates.ts +9 -0
  691. package/src/lake-storage/errors.ts +6 -1
  692. package/src/lake-storage/in-memory.ts +53 -17
  693. package/src/lake-storage/index.ts +10 -1
  694. package/src/lake-storage/merge-validation.ts +12 -2
  695. package/src/lake-storage/merge.ts +40 -2
  696. package/src/lake-storage/source-ordering.ts +95 -0
  697. package/src/lake-storage/sql-transforms.ts +2 -1
  698. package/src/lake-storage/types.ts +10 -5
  699. package/src/lake-storage/version-inputs.ts +14 -0
  700. package/src/models/catalog.ts +137 -0
  701. package/src/models/definitions.ts +202 -0
  702. package/src/models/errors.ts +83 -0
  703. package/src/models/events.ts +198 -0
  704. package/src/models/index.ts +89 -71
  705. package/src/models/language-model.ts +143 -0
  706. package/src/models/messages.ts +78 -0
  707. package/src/models/pricing.ts +390 -0
  708. package/src/models/rate-card.ts +101 -0
  709. package/src/models/tools.ts +29 -0
  710. package/src/objects/authorized-ontology-view.ts +512 -0
  711. package/src/objects/execution.ts +98 -143
  712. package/src/objects/link/authorization.ts +3 -2
  713. package/src/objects/query/executor.ts +45 -34
  714. package/src/objects/query/links.ts +84 -25
  715. package/src/objects/query/selected-read-admission.ts +310 -0
  716. package/src/objects/query/validate.ts +353 -36
  717. package/src/objects/sdk/object-handle.ts +2 -8
  718. package/src/objects/sdk/object-set.ts +10 -11
  719. package/src/objects/sdk/runtime-query-executor.ts +8 -28
  720. package/src/objects/sdk/telemetry-channel.ts +11 -7
  721. package/src/objects/service/list-service.ts +15 -29
  722. package/src/objects/telemetry/history.ts +297 -17
  723. package/src/objects/telemetry/index.ts +2 -2
  724. package/src/objects/telemetry/workload.ts +79 -0
  725. package/src/ontology/index.ts +7 -1
  726. package/src/ontology/inference/index.ts +4 -1
  727. package/src/ontology/internal.ts +0 -1
  728. package/src/ontology/json-schema.ts +13 -12
  729. package/src/ontology/link-path-selection.ts +193 -0
  730. package/src/ontology/refs.ts +19 -0
  731. package/src/ontology/tokens.ts +15 -8
  732. package/src/pipelines/execution.ts +30 -7
  733. package/src/pipelines/request.ts +5 -0
  734. package/src/projections/execution.ts +72 -11
  735. package/src/projections/run-dispatch.ts +6 -12
  736. package/src/queues/in-memory.ts +5 -0
  737. package/src/queues/index.ts +11 -0
  738. package/src/queues/types.ts +20 -3
  739. package/src/rules/execution.ts +20 -8
  740. package/src/runtime/create.ts +11 -5
  741. package/src/runtime/definitions.ts +4 -2
  742. package/src/runtime/host.ts +28 -8
  743. package/src/runtime/internal.ts +1 -0
  744. package/src/runtime/resolve-definitions.ts +22 -36
  745. package/src/runtime/sixb.ts +29 -10
  746. package/src/runtime/types.ts +3 -0
  747. package/src/schedules/execution.ts +24 -2
  748. package/src/security/every.ts +4 -4
  749. package/src/security/grants.ts +100 -14
  750. package/src/security/index.ts +3 -0
  751. package/src/security/registry.ts +9 -5
  752. package/src/security/types.ts +23 -4
  753. package/src/security/validation.ts +33 -9
  754. package/src/shares/access-plan.ts +225 -0
  755. package/src/shares/builders.ts +381 -0
  756. package/src/shares/compiler.ts +359 -0
  757. package/src/shares/errors.ts +3 -0
  758. package/src/shares/execution.ts +394 -0
  759. package/src/shares/index.ts +28 -0
  760. package/src/shares/internal.ts +9 -0
  761. package/src/shares/intersection.ts +178 -0
  762. package/src/shares/session-protocol.ts +258 -0
  763. package/src/shares/types.ts +76 -0
  764. package/src/shares/validation.ts +40 -0
  765. package/src/storage/agents/errors.ts +1 -0
  766. package/src/storage/agents/in-memory.ts +121 -11
  767. package/src/storage/agents/index.ts +7 -0
  768. package/src/storage/agents/provider.ts +150 -6
  769. package/src/storage/agents/types.ts +73 -16
  770. package/src/storage/ai-cost/analytics.ts +63 -6
  771. package/src/storage/ai-cost/codec.ts +37 -12
  772. package/src/storage/ai-cost/groups.ts +248 -0
  773. package/src/storage/ai-cost/in-memory.ts +42 -0
  774. package/src/storage/ai-cost/index.ts +6 -0
  775. package/src/storage/ai-cost/provider.ts +7 -0
  776. package/src/storage/ai-cost/types.ts +76 -14
  777. package/src/storage/ai-cost/validation.ts +147 -17
  778. package/src/storage/ai-limits/enforcement.ts +68 -0
  779. package/src/storage/ai-limits/errors.ts +23 -0
  780. package/src/storage/ai-limits/in-memory.ts +671 -0
  781. package/src/storage/ai-limits/index.ts +31 -0
  782. package/src/storage/ai-limits/period.ts +11 -0
  783. package/src/storage/ai-limits/provider.ts +430 -0
  784. package/src/storage/ai-limits/types.ts +195 -0
  785. package/src/storage/ai-usage/in-memory.ts +13 -0
  786. package/src/storage/ai-usage/record.ts +17 -0
  787. package/src/storage/ai-usage/types.ts +6 -2
  788. package/src/storage/auth/errors.ts +6 -0
  789. package/src/storage/auth/in-memory/auth-storage.ts +69 -0
  790. package/src/storage/auth/in-memory/device-authorizations.ts +145 -0
  791. package/src/storage/auth/in-memory/shared.ts +7 -0
  792. package/src/storage/auth/index.ts +7 -0
  793. package/src/storage/auth/types.ts +73 -0
  794. package/src/storage/executions/in-memory.ts +9 -1
  795. package/src/storage/executions/provider.ts +30 -1
  796. package/src/storage/executions/run-link.ts +45 -6
  797. package/src/storage/executions/validation.ts +82 -7
  798. package/src/storage/in-memory/index.ts +69 -6
  799. package/src/storage/index.ts +102 -1
  800. package/src/storage/objects/execution-limits.ts +283 -0
  801. package/src/storage/objects/guard.ts +55 -0
  802. package/src/storage/objects/in-memory/index.ts +2 -0
  803. package/src/storage/objects/in-memory/keys.ts +46 -0
  804. package/src/storage/objects/in-memory/query.ts +754 -0
  805. package/src/storage/objects/in-memory/read-scope.ts +211 -0
  806. package/src/storage/objects/in-memory/read-source.ts +10 -0
  807. package/src/storage/objects/in-memory/selected-reader.ts +252 -0
  808. package/src/storage/objects/in-memory/storage.ts +589 -0
  809. package/src/storage/objects/index.ts +21 -0
  810. package/src/storage/objects/keys.ts +1 -1
  811. package/src/storage/objects/read-scope.ts +672 -0
  812. package/src/storage/objects/types.ts +123 -19
  813. package/src/storage/operation-scope.ts +16 -0
  814. package/src/storage/share-grants/errors.ts +14 -0
  815. package/src/storage/share-grants/in-memory.ts +107 -0
  816. package/src/storage/share-grants/index.ts +14 -0
  817. package/src/storage/share-grants/provider.ts +11 -0
  818. package/src/storage/share-grants/record.ts +347 -0
  819. package/src/storage/share-grants/types.ts +112 -0
  820. package/src/storage/share-sessions/errors.ts +14 -0
  821. package/src/storage/share-sessions/in-memory.ts +105 -0
  822. package/src/storage/share-sessions/index.ts +11 -0
  823. package/src/storage/share-sessions/provider.ts +9 -0
  824. package/src/storage/share-sessions/record.ts +176 -0
  825. package/src/storage/share-sessions/types.ts +57 -0
  826. package/src/storage/transaction.ts +14 -2
  827. package/src/storage/types.ts +64 -0
  828. package/src/storage/workflow-runs/in-memory.ts +3 -3
  829. package/src/storage/workflow-runs/provider.ts +2 -2
  830. package/src/storage/workflow-runs/types.ts +6 -3
  831. package/src/syncs/execution.ts +25 -5
  832. package/src/syncs/request.ts +5 -0
  833. package/src/testing/agent-execution.ts +40 -28
  834. package/src/testing/agent-storage-contract.ts +249 -28
  835. package/src/testing/ai-cost-storage-contract.ts +96 -8
  836. package/src/testing/ai-limit-storage-contract.ts +1134 -0
  837. package/src/testing/ai-model-call-groups-contract.ts +353 -0
  838. package/src/testing/ai-usage-storage-contract.ts +31 -0
  839. package/src/testing/auth-storage-contract.ts +85 -0
  840. package/src/testing/dataset-sequence-contract.ts +373 -0
  841. package/src/testing/effective-storage-contract.ts +34 -0
  842. package/src/testing/execution-storage-contract.ts +81 -2
  843. package/src/testing/index.ts +26 -0
  844. package/src/testing/lake-merge-storage-contract.ts +3 -0
  845. package/src/testing/lake-storage-contract.ts +58 -0
  846. package/src/testing/object-read-scope-contract.ts +939 -0
  847. package/src/testing/queues-contract.ts +36 -1
  848. package/src/testing/share-grant-storage-contract.ts +325 -0
  849. package/src/testing/share-session-storage-contract.ts +235 -0
  850. package/src/workflows/agent-step-identity.ts +4 -0
  851. package/src/workflows/builders.ts +95 -9
  852. package/src/workflows/execution.ts +55 -16
  853. package/src/workflows/failure.ts +2 -2
  854. package/src/workflows/index.ts +3 -0
  855. package/src/workflows/request.ts +5 -0
  856. package/src/workflows/types.ts +23 -11
  857. package/src/workflows/validation.ts +100 -7
  858. package/dist/chunk-1e8m6yn3.js.map +0 -37
  859. package/dist/chunk-1g8negke.js.map +0 -11
  860. package/dist/chunk-4gz41why.js +0 -72
  861. package/dist/chunk-4gz41why.js.map +0 -11
  862. package/dist/chunk-5sxb1168.js.map +0 -34
  863. package/dist/chunk-6gjqgd3d.js.map +0 -11
  864. package/dist/chunk-819wnjz8.js.map +0 -12
  865. package/dist/chunk-a31h57d5.js.map +0 -13
  866. package/dist/chunk-a44d5zgd.js +0 -556
  867. package/dist/chunk-a44d5zgd.js.map +0 -16
  868. package/dist/chunk-ckxfnx7f.js.map +0 -13
  869. package/dist/chunk-dm72y8wt.js.map +0 -10
  870. package/dist/chunk-drjqm1aa.js.map +0 -15
  871. package/dist/chunk-dy311asx.js.map +0 -14
  872. package/dist/chunk-f6erf2vv.js.map +0 -10
  873. package/dist/chunk-f83ka50g.js.map +0 -23
  874. package/dist/chunk-fe5ev6mr.js +0 -55
  875. package/dist/chunk-fe5ev6mr.js.map +0 -11
  876. package/dist/chunk-h9kxd41f.js.map +0 -11
  877. package/dist/chunk-hceck7dq.js +0 -137
  878. package/dist/chunk-hceck7dq.js.map +0 -10
  879. package/dist/chunk-md8k0r54.js.map +0 -14
  880. package/dist/chunk-n4spznws.js.map +0 -11
  881. package/dist/chunk-nva1xkjz.js.map +0 -46
  882. package/dist/chunk-qewtks41.js.map +0 -11
  883. package/dist/chunk-t0jjkep3.js.map +0 -10
  884. package/dist/chunk-t624af60.js.map +0 -56
  885. package/dist/chunk-t8t39h7v.js.map +0 -10
  886. package/dist/chunk-t9xghkva.js +0 -28
  887. package/dist/chunk-t9xghkva.js.map +0 -10
  888. package/dist/chunk-x2yw73hy.js.map +0 -10
  889. package/dist/chunk-xc7hq65b.js.map +0 -10
  890. package/dist/storage/objects/in-memory.d.ts.map +0 -1
  891. package/src/storage/objects/in-memory.ts +0 -1241
  892. /package/dist/{chunk-zqysyfjt.js.map → chunk-08m3b6w8.js.map} +0 -0
  893. /package/dist/{chunk-z3zp0bj1.js.map → chunk-407j3msh.js.map} +0 -0
  894. /package/dist/{chunk-rhrbz7d4.js.map → chunk-4a849fr1.js.map} +0 -0
  895. /package/dist/{chunk-cy0n5dms.js.map → chunk-4jjp5k14.js.map} +0 -0
  896. /package/dist/{chunk-ezake7g1.js.map → chunk-5ntny1qx.js.map} +0 -0
  897. /package/dist/{chunk-72q2y8hn.js.map → chunk-8tsf6dmc.js.map} +0 -0
  898. /package/dist/{chunk-vybf6pkp.js.map → chunk-dbc80ad7.js.map} +0 -0
  899. /package/dist/{chunk-nkbfrt0c.js.map → chunk-f26bck4t.js.map} +0 -0
  900. /package/dist/{chunk-dsrkgtnh.js.map → chunk-jq43kdvk.js.map} +0 -0
  901. /package/dist/{chunk-wtmzkcht.js.map → chunk-k34z5rvh.js.map} +0 -0
  902. /package/dist/{chunk-htq0qh7z.js.map → chunk-ka3a2ft3.js.map} +0 -0
  903. /package/dist/{chunk-f2rt4vkh.js.map → chunk-n2w475r0.js.map} +0 -0
  904. /package/dist/{chunk-bhxaq2nn.js.map → chunk-qw9gvjv5.js.map} +0 -0
  905. /package/dist/{chunk-dysw7nsm.js.map → chunk-rv2hkwwa.js.map} +0 -0
  906. /package/dist/{chunk-ghteq96b.js.map → chunk-s5y30bc9.js.map} +0 -0
  907. /package/dist/{chunk-xkthy56g.js.map → chunk-w1tvjszy.js.map} +0 -0
  908. /package/dist/{chunk-8b55ygje.js.map → chunk-w3e09qqk.js.map} +0 -0
  909. /package/dist/{chunk-62c7t4jc.js.map → chunk-wdage1eb.js.map} +0 -0
@@ -1,56 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/storage/action-runs/idempotency.ts", "../src/storage/action-runs/in-memory.ts", "../src/agents/message.ts", "../src/storage/agents/in-memory.ts", "../src/storage/ai-cost/errors.ts", "../src/storage/ai-cost/in-memory.ts", "../src/storage/connector-connections/in-memory.ts", "../src/storage/errors.ts", "../src/storage/file-upload-sessions/errors.ts", "../src/storage/file-upload-sessions/utils.ts", "../src/storage/file-upload-sessions/in-memory.ts", "../src/storage/in-memory/index.ts", "../src/storage/executions/in-memory.ts", "../src/objects/query/scalar-values.ts", "../src/storage/objects/keys.ts", "../src/storage/objects/in-memory.ts", "../src/storage/ontology/in-memory/shared-state.ts", "../src/storage/ontology/in-memory/commits.ts", "../src/storage/timeseries/store.ts", "../src/storage/ontology/in-memory/materializations-state.ts", "../src/storage/ontology/in-memory/materializations-work.ts", "../src/storage/ontology/in-memory/materializations-finalization.ts", "../src/storage/ontology/in-memory/materializations.ts", "../src/storage/ontology/in-memory/outbox.ts", "../src/storage/ontology/in-memory/sources.ts", "../src/storage/ontology/in-memory/testing.ts", "../src/storage/ontology/in-memory/index.ts", "../src/storage/pipeline-runs/idempotency.ts", "../src/storage/run-listing.ts", "../src/storage/pipeline-runs/types.ts", "../src/storage/pipeline-runs/in-memory.ts", "../src/storage/projection-runs/in-memory.ts", "../src/storage/rules/in-memory.ts", "../src/storage/sync-runs/idempotency.ts", "../src/storage/sync-runs/types.ts", "../src/storage/sync-runs/in-memory.ts", "../src/storage/transaction.ts", "../src/storage/webhook-runs/types.ts", "../src/storage/webhook-runs/in-memory.ts", "../src/storage/workflow-interventions/errors.ts", "../src/storage/workflow-interventions/in-memory.ts", "../src/storage/workflow-runs/types.ts", "../src/storage/workflow-runs/in-memory.ts", "../src/storage/in-memory/testing.ts", "../src/storage/migrations/migrate-storage.ts", "../src/storage/migrations/check-schema.ts", "../src/storage/migrations/migration-set.ts"],
4
- "sourcesContent": [
5
- "import type { ActionSubject } from \"../../actions\"\nimport { stableJsonStringify } from \"../../json\"\nimport type {\n ActionRunEffectsRecord,\n ActionRunPhase,\n ActionRunRecord,\n ActionRunWritebackRecord,\n FinishActionRunInput,\n QueueActionRunInput,\n} from \"./types\"\n\nexport function actionSubjectsEqual(left: ActionSubject, right: ActionSubject): boolean {\n if (left.kind !== right.kind) return false\n if (left.kind === \"none\") return true\n if (right.kind === \"none\") return false\n return left.objectTypeId === right.objectTypeId && left.primaryId === right.primaryId\n}\n\nexport function actionRunParamsEqual(left: unknown, right: unknown): boolean {\n return stableJsonStringify(left) === stableJsonStringify(right)\n}\n\nexport type ActionRunPhaseRecord = ActionRunWritebackRecord | ActionRunEffectsRecord\n\nexport function actionRunPhaseRecordsEqual(\n left: ActionRunPhaseRecord,\n right: ActionRunPhaseRecord\n): boolean {\n return actionRunParamsEqual(stripPhaseRecordCompletedAt(left), stripPhaseRecordCompletedAt(right))\n}\n\nexport function finishActionRunPhase(\n input: FinishActionRunInput,\n current: ActionRunPhase | null | undefined\n): ActionRunPhase {\n if (input.status === \"succeeded\") {\n return input.phase ?? current ?? \"validation\"\n }\n\n return input.error.details.phase\n}\n\nexport function canRequeueActionRunAfterEnqueueFailure(\n existing: ActionRunRecord,\n input: QueueActionRunInput\n): boolean {\n return (\n existing.status === \"failed\" &&\n existing.phase === \"enqueue\" &&\n existing.executionId === input.executionId &&\n existing.error?.retryable === true &&\n existing.actionId === input.actionId &&\n existing.idempotencyKey === input.idempotencyKey &&\n actionSubjectsEqual(existing.subject, input.subject) &&\n actionRunParamsEqual(existing.params, input.params)\n )\n}\n\nexport function isTerminalActionRun(record: Pick<ActionRunRecord, \"status\">): boolean {\n return (\n record.status === \"succeeded\" || record.status === \"failed\" || record.status === \"cancelled\"\n )\n}\n\nfunction stripPhaseRecordCompletedAt(\n record: ActionRunPhaseRecord\n): Omit<ActionRunPhaseRecord, \"completedAt\"> {\n const { completedAt: _completedAt, ...stableRecord } = record\n return stableRecord\n}\n",
6
- "import type { ExecutionStorage } from \"../executions\"\nimport { ActionRunError } from \"./errors\"\nimport { parseActionRunFailure } from \"./failure\"\nimport {\n actionRunPhaseRecordsEqual,\n actionSubjectsEqual,\n canRequeueActionRunAfterEnqueueFailure,\n isTerminalActionRun,\n} from \"./idempotency\"\nimport { assertActionRunExecution } from \"./provider\"\nimport type {\n ActionRunEffectsRecord,\n ActionRunFailure,\n ActionRunParams,\n ActionRunPhase,\n ActionRunRecord,\n ActionRunStorage,\n ActionRunWritebackRecord,\n EnterActionRunPhaseInput,\n FinishActionRunInput,\n ListActionRunsInput,\n ListActionRunsResult,\n LockActionMaterializationRunInput,\n QueueActionRunInput,\n RecordActionEffectsInput,\n RecordActionWritebackInput,\n StartActionRunInput,\n} from \"./types\"\n\ntype RunRootOperation = <T>(run: () => Promise<T> | T) => Promise<T>\n\nconst runDirectly: RunRootOperation = async <T>(run: () => Promise<T> | T): Promise<T> => run()\n\nfunction actionRunKey(projectId: string, id: string): string {\n return JSON.stringify([projectId, id])\n}\n\nfunction assertNonBlank(value: string, fieldName: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new ActionRunError(`[Sixb] Action materialization ${fieldName} must be nonblank.`)\n }\n}\n\nfunction cloneActionRunRecord(record: ActionRunRecord): ActionRunRecord {\n return structuredClone(record)\n}\n\nfunction normalizeParams(params: ActionRunParams): ActionRunParams {\n return structuredClone(params)\n}\n\nfunction normalizeSubject(subject: QueueActionRunInput[\"subject\"]): QueueActionRunInput[\"subject\"] {\n return structuredClone(subject)\n}\n\nfunction normalizeError<TPhase extends ActionRunPhase>(\n error: ActionRunFailure<TPhase>,\n expectedPhase?: TPhase\n): ActionRunFailure<TPhase> {\n return expectedPhase === undefined\n ? (parseActionRunFailure(error) as ActionRunFailure<TPhase>)\n : parseActionRunFailure(error, expectedPhase)\n}\n\nfunction normalizeWriteback(\n input: RecordActionWritebackInput,\n completedAt: Date\n): ActionRunWritebackRecord {\n if (input.status === \"succeeded\") {\n return {\n status: \"succeeded\",\n completedAt,\n result: structuredClone(input.result),\n }\n }\n\n return {\n status: \"failed\",\n completedAt,\n error: normalizeError(input.error, \"writeback\"),\n }\n}\n\nfunction normalizeEffects(\n input: RecordActionEffectsInput,\n completedAt: Date\n): ActionRunEffectsRecord {\n if (input.status === \"succeeded\") {\n return {\n status: \"succeeded\",\n completedAt,\n }\n }\n\n return {\n status: \"failed\",\n completedAt,\n error: normalizeError(input.error, \"effects\"),\n }\n}\n\nfunction compareRuns(a: ActionRunRecord, b: ActionRunRecord, order: \"asc\" | \"desc\"): number {\n const leftAt = a.startedAt ?? a.queuedAt\n const rightAt = b.startedAt ?? b.queuedAt\n const delta = leftAt.getTime() - rightAt.getTime()\n if (delta !== 0) {\n return order === \"asc\" ? delta : -delta\n }\n\n if (a.id === b.id) {\n return 0\n }\n\n return order === \"asc\" ? a.id.localeCompare(b.id) : b.id.localeCompare(a.id)\n}\n\nexport class InMemoryActionRunStorage implements ActionRunStorage {\n private readonly rows = new Map<string, ActionRunRecord>()\n private readonly runRootOperation: RunRootOperation\n\n constructor(\n private readonly executions: ExecutionStorage,\n input: { readonly runRootOperation?: RunRootOperation } = {}\n ) {\n this.runRootOperation = input.runRootOperation ?? runDirectly\n }\n\n snapshot(): InMemoryActionRunStorageSnapshot {\n return structuredClone(this.rows)\n }\n\n restore(snapshot: InMemoryActionRunStorageSnapshot): void {\n this.rows.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.rows.set(key, record)\n }\n }\n\n async lockForMaterialization(input: LockActionMaterializationRunInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => cloneActionRunRecord(this.requireMaterializationRun(input)))\n }\n\n async queue(input: QueueActionRunInput): Promise<ActionRunRecord> {\n return this.runRootOperation(async () => {\n const key = actionRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n if (existing && !canRequeueActionRunAfterEnqueueFailure(existing, input)) {\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n if (\n [...this.rows.values()].some(\n (run) =>\n run.projectId === input.projectId &&\n run.id !== input.id &&\n run.executionId === input.executionId\n )\n ) {\n throw new ActionRunError(\n `[Sixb] Execution '${input.executionId}' already belongs to another Action run.`\n )\n }\n await assertActionRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n actionId: input.actionId,\n })\n\n const record: ActionRunRecord = {\n id: input.id,\n projectId: input.projectId,\n executionId: input.executionId,\n actionId: input.actionId,\n subject: normalizeSubject(input.subject),\n status: \"queued\",\n phase: \"request\",\n queuedAt: new Date(input.queuedAt ?? new Date()),\n params: normalizeParams(input.params),\n idempotencyKey: input.idempotencyKey,\n }\n\n if (existing) {\n const next: ActionRunRecord = {\n ...existing,\n status: \"queued\",\n phase: \"request\",\n queuedAt: record.queuedAt,\n startedAt: undefined,\n finishedAt: undefined,\n error: undefined,\n writeback: undefined,\n effects: undefined,\n }\n this.rows.set(key, structuredClone(next))\n return cloneActionRunRecord(next)\n }\n\n this.rows.set(key, structuredClone(record))\n return cloneActionRunRecord(record)\n })\n }\n\n async start(input: StartActionRunInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => {\n const key = actionRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n\n if (!existing) {\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n if (existing.status !== \"queued\") {\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' cannot start from status '${existing.status}'.`\n )\n }\n\n const next: ActionRunRecord = {\n ...existing,\n status: \"running\",\n phase: input.phase ?? \"validation\",\n startedAt: new Date(input.startedAt ?? new Date()),\n error: undefined,\n }\n\n this.rows.set(key, structuredClone(next))\n return cloneActionRunRecord(next)\n })\n }\n\n async enterPhase(input: EnterActionRunPhaseInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => {\n const key = actionRunKey(input.projectId, input.id)\n const existing = this.requireRunningRun(key, input.projectId, input.id, \"enter phase\")\n const next: ActionRunRecord = {\n ...existing,\n phase: input.phase,\n }\n\n this.rows.set(key, structuredClone(next))\n return cloneActionRunRecord(next)\n })\n }\n\n async recordWriteback(input: RecordActionWritebackInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => {\n const key = actionRunKey(input.projectId, input.id)\n const existing = this.requireRunningRun(key, input.projectId, input.id, \"record writeback\")\n const writeback = normalizeWriteback(input, new Date(input.completedAt ?? new Date()))\n\n if (existing.writeback) {\n if (actionRunPhaseRecordsEqual(existing.writeback, writeback)) {\n return cloneActionRunRecord(existing)\n }\n\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' already has a different writeback record.`\n )\n }\n\n const next: ActionRunRecord = {\n ...existing,\n phase: \"writeback\",\n writeback,\n }\n\n this.rows.set(key, structuredClone(next))\n return cloneActionRunRecord(next)\n })\n }\n\n async recordEffects(input: RecordActionEffectsInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => {\n const key = actionRunKey(input.projectId, input.id)\n const existing = this.requireRunningRun(key, input.projectId, input.id, \"record effects\")\n const effects = normalizeEffects(input, new Date(input.completedAt ?? new Date()))\n\n if (existing.effects) {\n if (actionRunPhaseRecordsEqual(existing.effects, effects)) {\n return cloneActionRunRecord(existing)\n }\n\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' already has a different effects record.`\n )\n }\n\n const next: ActionRunRecord = {\n ...existing,\n phase: \"effects\",\n effects,\n }\n\n this.rows.set(key, structuredClone(next))\n return cloneActionRunRecord(next)\n })\n }\n\n async finish(input: FinishActionRunInput): Promise<ActionRunRecord> {\n return this.runRootOperation(() => {\n const key = actionRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n\n if (!existing) {\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n if (isTerminalActionRun(existing)) {\n throw new ActionRunError(\n `[Sixb] Action run '${input.id}' cannot finish from terminal status '${existing.status}'.`\n )\n }\n\n const phase =\n input.status === \"succeeded\" ? (input.phase ?? existing.phase) : input.error.details.phase\n\n const base: ActionRunRecord = {\n ...existing,\n status: input.status,\n phase,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n }\n\n const next: ActionRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n error: undefined,\n }\n : {\n ...base,\n error: normalizeError(input.error),\n }\n\n this.rows.set(key, structuredClone(next))\n return cloneActionRunRecord(next)\n })\n }\n\n private requireRunningRun(\n key: string,\n projectId: string,\n id: string,\n operation: string\n ): ActionRunRecord {\n const existing = this.rows.get(key)\n\n if (!existing) {\n throw new ActionRunError(`[Sixb] Action run '${id}' not found for project '${projectId}'.`)\n }\n\n if (existing.status !== \"running\") {\n throw new ActionRunError(\n `[Sixb] Action run '${id}' cannot ${operation} from status '${existing.status}'.`\n )\n }\n\n return existing\n }\n\n async getById(params: { projectId: string; id: string }): Promise<ActionRunRecord | null> {\n return this.runRootOperation(() => {\n const record = this.rows.get(actionRunKey(params.projectId, params.id))\n return record ? cloneActionRunRecord(record) : null\n })\n }\n\n async list(input: ListActionRunsInput): Promise<ListActionRunsResult> {\n return this.runRootOperation(() => {\n if (input.actionIds?.length === 0) {\n return { runs: [], hasMore: false, total: 0 }\n }\n\n const order = input.order ?? \"desc\"\n const offset = input.offset ?? 0\n const limit = input.limit ?? this.rows.size\n const actionIds = input.actionIds ? new Set(input.actionIds) : null\n const objectTypeIds = input.objectTypeIds ? new Set(input.objectTypeIds) : null\n const statuses = input.statuses ? new Set(input.statuses) : null\n\n const filtered = [...this.rows.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => (input.actionId ? record.actionId === input.actionId : true))\n .filter((record) => (actionIds ? actionIds.has(record.actionId) : true))\n .filter((record) =>\n objectTypeIds\n ? record.subject.kind !== \"object\" || objectTypeIds.has(record.subject.objectTypeId)\n : true\n )\n .filter((record) =>\n input.subject ? actionSubjectsEqual(record.subject, input.subject) : true\n )\n .filter((record) =>\n input.objectTypeId\n ? record.subject.kind === \"object\" && record.subject.objectTypeId === input.objectTypeId\n : true\n )\n .filter((record) =>\n input.primaryId\n ? record.subject.kind === \"object\" && record.subject.primaryId === input.primaryId\n : true\n )\n .filter((record) => (statuses ? statuses.has(record.status) : true))\n .filter((record) =>\n input.startedAfter ? (record.startedAt ?? record.queuedAt) >= input.startedAfter : true\n )\n .filter((record) =>\n input.startedBefore ? (record.startedAt ?? record.queuedAt) <= input.startedBefore : true\n )\n .sort((a, b) => compareRuns(a, b, order))\n\n const total = filtered.length\n const runs = filtered.slice(offset, offset + limit).map(cloneActionRunRecord)\n return { runs, hasMore: offset + runs.length < total, total }\n })\n }\n\n private requireMaterializationRun(input: LockActionMaterializationRunInput): ActionRunRecord {\n assertNonBlank(input.projectId, \"projectId\")\n assertNonBlank(input.runId, \"runId\")\n assertNonBlank(input.actionId, \"actionId\")\n\n const existing = this.rows.get(actionRunKey(input.projectId, input.runId))\n if (!existing) {\n throw new ActionRunError(\n `[Sixb] Action run '${input.runId}' not found for project '${input.projectId}'.`\n )\n }\n if (existing.actionId !== input.actionId) {\n throw new ActionRunError(\n `[Sixb] Action run '${input.runId}' does not belong to action '${input.actionId}'.`\n )\n }\n if (existing.status !== \"running\") {\n throw new ActionRunError(\n `[Sixb] Action run '${input.runId}' cannot materialize from status '${existing.status}'.`\n )\n }\n return existing\n }\n}\n\nexport type InMemoryActionRunStorageSnapshot = Map<string, ActionRunRecord>\n",
7
- "import type { FileRef } from \"../blob-storage\"\nimport type { JsonValue } from \"../json\"\nimport type { AgentContextPart } from \"./context\"\n\n/**\n * The agent's own, SDK-independent message. We store messages and threads — not an SDK transport —\n * so a message is just a `role` plus structured `parts` (and optional `metadata`). There is no\n * self-describing wrapper: the storage row owns the message's identity, and `contentVersion` (a\n * column) versions the parts shape so it can be migrated.\n *\n * The part union is intentionally focused on what V1 agents actually produce (text, reasoning, step\n * boundaries, tool calls). It is extensible: adding a part kind later is non-breaking. The adapter\n * `fromAiSdk` is total — it throws on any part it cannot model rather than dropping it silently,\n * which both prevents data loss and signals exactly when the union must grow.\n */\nexport const AGENT_MESSAGE_CONTENT_VERSION = 1 as const\n\nexport type AgentMessageRole = \"system\" | \"user\" | \"assistant\"\n\n/** A plain text part (assistant output, user input, or system text). */\nexport interface AgentTextPart {\n readonly type: \"text\"\n readonly text: string\n /** Provider passthrough (kept because some providers require it on the next turn). */\n readonly providerMetadata?: JsonValue\n}\n\n/**\n * A reasoning (\"thinking\") part. `providerMetadata` is load-bearing here: some providers require\n * the reasoning signature back on the following turn, so dropping it would break multi-step loops.\n */\nexport interface AgentReasoningPart {\n readonly type: \"reasoning\"\n readonly text: string\n readonly providerMetadata?: JsonValue\n}\n\n/** A step boundary between assistant loop iterations. */\nexport interface AgentStepStartPart {\n readonly type: \"step-start\"\n}\n\n/** A blob-backed file attached to a user message or produced by an agent/tool. */\nexport interface AgentFilePart {\n readonly type: \"file\"\n readonly fileRef: FileRef\n /** Provider passthrough for future model-specific file handling. */\n readonly providerMetadata?: JsonValue\n}\n\ninterface AgentToolCallBase {\n readonly type: \"tool-call\"\n readonly toolCallId: string\n readonly toolName: string\n /** `true` when reconstructed from an SDK `dynamic-tool` part (vs a static `tool-${name}` part). */\n readonly dynamic?: boolean\n /** `true` when the provider executed the tool inline (steers model projection). V1 = `false`. */\n readonly providerExecuted?: boolean\n readonly input: JsonValue\n readonly providerMetadata?: JsonValue\n}\n\n/**\n * A completed tool call. Only terminal states are modelled — transient states\n * (`input-streaming`, `input-available`, `approval-*`) are never persisted because messages are\n * written only once a run finishes.\n */\nexport type AgentToolCallPart = AgentToolCallBase &\n (\n | { readonly state: \"output-available\"; readonly output: JsonValue }\n | { readonly state: \"output-error\"; readonly errorText: string }\n )\n\nexport type AgentMessagePart =\n | AgentTextPart\n | AgentReasoningPart\n | AgentStepStartPart\n | AgentFilePart\n | AgentContextPart\n | AgentToolCallPart\n\nexport type AgentMessagePartType = AgentMessagePart[\"type\"]\nexport type AgentToolCallState = AgentToolCallPart[\"state\"]\n\n/** The logical agent message the adapters speak and the store persists (as columns). */\nexport interface AgentMessage {\n readonly role: AgentMessageRole\n readonly parts: readonly AgentMessagePart[]\n /** Message-level metadata (mirrors `UIMessage.metadata`). */\n readonly metadata?: JsonValue\n}\n",
8
- "import { AGENT_MESSAGE_CONTENT_VERSION } from \"../../agents/message\"\nimport { principalsEqual } from \"../../auth\"\nimport { normalizeRequesterGroupIds } from \"../../auth/attribution\"\nimport { parseSixbFailure } from \"../../errors/internal\"\nimport type { SixbFailure } from \"../../errors/types\"\nimport type { ExecutionStorage } from \"../executions\"\nimport { AgentStorageError } from \"./errors\"\nimport {\n agentContextCheckpointMatchesCreateInput,\n assertAgentContextCheckpointAnchors,\n assertAgentContextCheckpointAuthority,\n assertAgentContextCheckpointReplayState,\n assertAgentRunExecution,\n assertCreateAgentContextCheckpointInput,\n} from \"./provider\"\nimport type {\n AgentContextCheckpointRecord,\n AgentContextCheckpointStore,\n AgentMessageRecord,\n AgentMessageStore,\n AgentRunFailureCode,\n AgentRunRecord,\n AgentRunStore,\n AgentStorage,\n AgentThreadRecord,\n AgentThreadStore,\n AppendAgentMessageInput,\n ConfirmAgentRunExecutionOwnershipInput,\n CreateAgentContextCheckpointInput,\n CreateAgentRunInput,\n CreateAgentThreadInput,\n DeleteAgentMessagesByRunInput,\n FinishAgentRunInput,\n FinishQueuedAgentRunInput,\n ListAgentMessagesInput,\n ListAgentMessagesResult,\n ListAgentRunsInput,\n ListAgentRunsResult,\n ListAgentThreadsInput,\n ListAgentThreadsResult,\n ReclaimAgentRunInput,\n StartAgentRunInput,\n} from \"./types\"\nimport { AGENT_RUN_FAILURE_CODES } from \"./types\"\n\nfunction normalizeFailure(\n failure: SixbFailure<AgentRunFailureCode> | undefined\n): SixbFailure<AgentRunFailureCode> | undefined {\n return failure ? parseSixbFailure(failure, AGENT_RUN_FAILURE_CODES) : undefined\n}\n\nfunction key(projectId: string, id: string): string {\n return `${projectId}:${id}`\n}\n\nfunction clone<T>(value: T): T {\n return structuredClone(value)\n}\n\nfunction compareByDate(\n left: Date | undefined,\n right: Date | undefined,\n leftId: string,\n rightId: string,\n order: \"asc\" | \"desc\"\n): number {\n const delta = (left?.getTime() ?? 0) - (right?.getTime() ?? 0)\n if (delta !== 0) {\n return order === \"asc\" ? delta : -delta\n }\n if (leftId === rightId) {\n return 0\n }\n return order === \"asc\" ? leftId.localeCompare(rightId) : rightId.localeCompare(leftId)\n}\n\ninterface Window<T> {\n readonly page: T[]\n readonly hasMore: boolean\n readonly total: number\n}\n\nfunction applyWindow<T>(rows: T[], offset = 0, limit?: number): Window<T> {\n const total = rows.length\n const end = limit === undefined ? total : offset + limit\n const page = rows.slice(offset, end)\n return { page, hasMore: offset + page.length < total, total }\n}\n\n/**\n * Shared in-memory state behind the four sub-stores. They are tiered for ergonomics\n * (`storage.runs.create(...)`), but several operations span tables — creating/finishing a run\n * updates the thread anchor, appending a message bumps thread stats, and checkpoint creation reads\n * run/thread/message anchors — so they all read and write the same maps through this object.\n */\ninterface AgentStoreState {\n readonly threads: Map<string, AgentThreadRecord>\n readonly runs: Map<string, AgentRunRecord>\n readonly messages: Map<string, AgentMessageRecord>\n readonly checkpoints: Map<string, AgentContextCheckpointRecord>\n}\n\nexport interface InMemoryAgentStorageSnapshot {\n readonly threads: Map<string, AgentThreadRecord>\n readonly runs: Map<string, AgentRunRecord>\n readonly messages: Map<string, AgentMessageRecord>\n readonly checkpoints: Map<string, AgentContextCheckpointRecord>\n}\n\n// ── threads ───────────────────────────────────────────────────────────────────────────────────\n\nclass InMemoryAgentThreadStore implements AgentThreadStore {\n constructor(private readonly state: AgentStoreState) {}\n\n async create(input: CreateAgentThreadInput): Promise<AgentThreadRecord> {\n const threadKey = key(input.projectId, input.id)\n if (this.state.threads.has(threadKey)) {\n throw new AgentStorageError(\n \"duplicate_id\",\n `[Sixb] Agent thread '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const createdAt = new Date(input.createdAt ?? new Date())\n const record: AgentThreadRecord = {\n id: input.id,\n projectId: input.projectId,\n agentId: input.agentId,\n ownerPrincipal: clone(input.ownerPrincipal),\n ...(input.title === undefined ? {} : { title: input.title }),\n status: input.status ?? \"active\",\n activeRunId: null,\n messageCount: 0,\n createdAt,\n updatedAt: new Date(input.updatedAt ?? createdAt),\n }\n\n this.state.threads.set(threadKey, clone(record))\n return clone(record)\n }\n\n async getById(params: { projectId: string; id: string }): Promise<AgentThreadRecord | null> {\n const record = this.state.threads.get(key(params.projectId, params.id))\n return record ? clone(record) : null\n }\n\n async list(input: ListAgentThreadsInput): Promise<ListAgentThreadsResult> {\n const order = input.order ?? \"desc\"\n const statuses = input.statuses ? new Set(input.statuses) : null\n const agentIds = input.agentIds ? new Set(input.agentIds) : null\n\n const filtered = [...this.state.threads.values()]\n .filter((thread) => thread.projectId === input.projectId)\n .filter((thread) => (input.agentId ? thread.agentId === input.agentId : true))\n .filter((thread) => (agentIds ? agentIds.has(thread.agentId) : true))\n .filter((thread) => (statuses ? statuses.has(thread.status) : true))\n .filter((thread) =>\n input.ownerPrincipal ? principalsEqual(thread.ownerPrincipal, input.ownerPrincipal) : true\n )\n .sort((a, b) =>\n compareByDate(\n a.lastMessageAt ?? a.createdAt,\n b.lastMessageAt ?? b.createdAt,\n a.id,\n b.id,\n order\n )\n )\n\n const { page, hasMore, total } = applyWindow(filtered, input.offset, input.limit)\n return { threads: page.map(clone), hasMore, total }\n }\n}\n\n// ── runs ──────────────────────────────────────────────────────────────────────────────────────\n\nclass InMemoryAgentRunStore implements AgentRunStore {\n constructor(\n private readonly state: AgentStoreState,\n private readonly executions: ExecutionStorage\n ) {}\n\n async create(input: CreateAgentRunInput): Promise<AgentRunRecord> {\n await assertAgentRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n agentId: input.agentId,\n })\n // No `await` between read and write: the in-memory critical section is atomic, so two concurrent\n // queued runs on the same thread cannot both win — the second observes `activeRunId` set.\n const threadKey = key(input.projectId, input.threadId)\n const thread = this.state.threads.get(threadKey)\n if (!thread) {\n throw new AgentStorageError(\n \"thread_not_found\",\n `[Sixb] Agent thread '${input.threadId}' not found for project '${input.projectId}'.`\n )\n }\n if (thread.activeRunId !== null) {\n throw new AgentStorageError(\n \"active_run_exists\",\n `[Sixb] Agent thread '${input.threadId}' already has an active run '${thread.activeRunId}'.`\n )\n }\n\n const runKey = key(input.projectId, input.id)\n if (this.state.runs.has(runKey)) {\n throw new AgentStorageError(\n \"duplicate_id\",\n `[Sixb] Agent run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n if (\n [...this.state.runs.values()].some(\n (run) => run.projectId === input.projectId && run.executionId === input.executionId\n )\n ) {\n throw new AgentStorageError(\n \"duplicate_id\",\n `[Sixb] Execution '${input.executionId}' already belongs to another Agent run.`\n )\n }\n\n const createdAt = new Date(input.createdAt ?? new Date())\n const run: AgentRunRecord = {\n id: input.id,\n projectId: input.projectId,\n executionId: input.executionId,\n threadId: input.threadId,\n agentId: input.agentId,\n triggerMessageId: input.triggerMessageId,\n requesterGroupIds: normalizeRequesterGroupIds(input.requesterGroupIds),\n status: \"queued\",\n attempt: 0,\n createdAt,\n }\n this.state.runs.set(runKey, clone(run))\n\n const updatedThread: AgentThreadRecord = {\n ...thread,\n activeRunId: run.id,\n updatedAt: createdAt,\n }\n this.state.threads.set(threadKey, clone(updatedThread))\n\n return clone(run)\n }\n\n async start(input: StartAgentRunInput): Promise<AgentRunRecord> {\n const run = this.requireStatus(input.projectId, input.id, \"queued\")\n const startedAt = new Date(input.startedAt ?? new Date())\n const next: AgentRunRecord = {\n ...run,\n status: \"running\",\n ...(input.modelId === undefined ? {} : { modelId: input.modelId }),\n attempt: 1,\n execution: clone(input.execution),\n startedAt,\n }\n this.state.runs.set(key(input.projectId, input.id), clone(next))\n return clone(next)\n }\n\n async finishQueued(input: FinishQueuedAgentRunInput): Promise<AgentRunRecord> {\n const run = this.requireStatus(input.projectId, input.id, \"queued\")\n const completedAt = new Date(input.completedAt ?? new Date())\n const next: AgentRunRecord = {\n ...run,\n status: input.status,\n ...(input.error === undefined ? {} : { error: normalizeFailure(input.error) }),\n completedAt,\n }\n this.state.runs.set(key(input.projectId, input.id), clone(next))\n this.releaseThread(run, completedAt)\n return clone(next)\n }\n\n async reclaim(input: ReclaimAgentRunInput): Promise<AgentRunRecord> {\n const run = this.requireRunning(input.projectId, input.id)\n const next: AgentRunRecord = {\n ...run,\n attempt: run.attempt + 1,\n execution: clone(input.execution),\n }\n this.state.runs.set(key(input.projectId, input.id), clone(next))\n return clone(next)\n }\n\n async confirmExecutionOwnership(\n input: ConfirmAgentRunExecutionOwnershipInput\n ): Promise<AgentRunRecord> {\n const run = this.requireRunning(input.projectId, input.id)\n if (!run.execution || run.execution.token !== input.executionToken) {\n throw new AgentStorageError(\n \"execution_lost\",\n `[Sixb] Execution token is no longer current on agent run '${input.id}'.`\n )\n }\n\n const next: AgentRunRecord = {\n ...run,\n execution: {\n ...run.execution,\n queueLeaseExpiresAt: new Date(\n Math.max(run.execution.queueLeaseExpiresAt.getTime(), input.queueLeaseExpiresAt.getTime())\n ),\n },\n }\n this.state.runs.set(key(input.projectId, input.id), clone(next))\n return clone(next)\n }\n\n async finish(input: FinishAgentRunInput): Promise<AgentRunRecord> {\n const run = this.requireRunning(input.projectId, input.id)\n if (!run.execution || run.execution.token !== input.executionToken) {\n throw new AgentStorageError(\n \"execution_lost\",\n `[Sixb] Execution token is no longer current on agent run '${input.id}'.`\n )\n }\n\n const completedAt = new Date(input.completedAt ?? new Date())\n const next: AgentRunRecord = {\n ...run,\n status: input.status,\n ...(input.modelId === undefined ? {} : { modelId: input.modelId }),\n ...(input.finishReason === undefined ? {} : { finishReason: input.finishReason }),\n ...(input.diagnostics === undefined ? {} : { diagnostics: clone(input.diagnostics) }),\n ...(input.status === \"succeeded\" || input.error === undefined\n ? {}\n : { error: normalizeFailure(input.error) }),\n execution: undefined,\n completedAt,\n }\n this.state.runs.set(key(input.projectId, input.id), clone(next))\n\n this.releaseThread(run, completedAt)\n\n return clone(next)\n }\n\n async getById(params: { projectId: string; id: string }): Promise<AgentRunRecord | null> {\n const record = this.state.runs.get(key(params.projectId, params.id))\n return record ? clone(record) : null\n }\n\n async getByIds(params: {\n projectId: string\n ids: readonly string[]\n }): Promise<readonly AgentRunRecord[]> {\n return [...new Set(params.ids)]\n .map((id) => this.state.runs.get(key(params.projectId, id)))\n .filter((record): record is AgentRunRecord => record !== undefined)\n .map(clone)\n }\n\n async list(input: ListAgentRunsInput): Promise<ListAgentRunsResult> {\n const order = input.order ?? \"desc\"\n const statuses = input.statuses ? new Set(input.statuses) : null\n\n const filtered = [...this.state.runs.values()]\n .filter((run) => run.projectId === input.projectId)\n .filter((run) => (input.threadId ? run.threadId === input.threadId : true))\n .filter((run) => (input.agentId ? run.agentId === input.agentId : true))\n .filter((run) => (statuses ? statuses.has(run.status) : true))\n .filter((run) =>\n input.startedAfter ? (run.startedAt ?? run.createdAt) >= input.startedAfter : true\n )\n .filter((run) =>\n input.startedBefore ? (run.startedAt ?? run.createdAt) <= input.startedBefore : true\n )\n .sort((a, b) =>\n compareByDate(a.startedAt ?? a.createdAt, b.startedAt ?? b.createdAt, a.id, b.id, order)\n )\n\n const { page, hasMore, total } = applyWindow(filtered, input.offset, input.limit)\n return { runs: page.map(clone), hasMore, total }\n }\n\n private requireRunning(projectId: string, id: string): AgentRunRecord {\n return this.requireStatus(projectId, id, \"running\")\n }\n\n private requireStatus(\n projectId: string,\n id: string,\n status: AgentRunRecord[\"status\"]\n ): AgentRunRecord {\n const run = this.state.runs.get(key(projectId, id))\n if (!run) {\n throw new AgentStorageError(\n \"run_not_found\",\n `[Sixb] Agent run '${id}' not found for project '${projectId}'.`\n )\n }\n if (run.status !== status) {\n throw new AgentStorageError(\n \"invalid_state\",\n `[Sixb] Agent run '${id}' is not ${status} (status '${run.status}').`\n )\n }\n return run\n }\n\n private releaseThread(run: AgentRunRecord, completedAt: Date): void {\n const threadKey = key(run.projectId, run.threadId)\n const thread = this.state.threads.get(threadKey)\n if (thread && thread.activeRunId === run.id) {\n this.state.threads.set(\n threadKey,\n clone({ ...thread, activeRunId: null, updatedAt: completedAt })\n )\n }\n }\n}\n\n// ── messages ──────────────────────────────────────────────────────────────────────────────────\n\nclass InMemoryAgentMessageStore implements AgentMessageStore {\n constructor(private readonly state: AgentStoreState) {}\n\n async append(input: AppendAgentMessageInput): Promise<AgentMessageRecord> {\n const threadKey = key(input.projectId, input.threadId)\n const thread = this.state.threads.get(threadKey)\n if (!thread) {\n throw new AgentStorageError(\n \"thread_not_found\",\n `[Sixb] Agent thread '${input.threadId}' not found for project '${input.projectId}'.`\n )\n }\n\n const messageKey = key(input.projectId, input.id)\n if (this.state.messages.has(messageKey)) {\n throw new AgentStorageError(\n \"duplicate_id\",\n `[Sixb] Agent message '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n if (input.runId !== null && !this.state.runs.has(key(input.projectId, input.runId))) {\n throw new AgentStorageError(\n \"run_not_found\",\n `[Sixb] Agent run '${input.runId}' not found for project '${input.projectId}'.`\n )\n }\n\n const createdAt = new Date(input.createdAt ?? new Date())\n const seq = this.nextSeq(input.projectId, input.threadId)\n const message: AgentMessageRecord = {\n id: input.id,\n projectId: input.projectId,\n threadId: input.threadId,\n runId: input.runId,\n role: input.role,\n ...(input.authorPrincipal === undefined\n ? {}\n : { authorPrincipal: clone(input.authorPrincipal) }),\n seq,\n parts: clone(input.parts),\n ...(input.metadata === undefined ? {} : { metadata: clone(input.metadata) }),\n contentVersion: AGENT_MESSAGE_CONTENT_VERSION,\n createdAt,\n ...(input.completedAt === undefined ? {} : { completedAt: new Date(input.completedAt) }),\n }\n this.state.messages.set(messageKey, clone(message))\n\n this.state.threads.set(\n threadKey,\n clone({\n ...thread,\n messageCount: thread.messageCount + 1,\n lastMessageAt: createdAt,\n updatedAt: createdAt,\n })\n )\n\n return clone(message)\n }\n\n async deleteByRunId(input: DeleteAgentMessagesByRunInput): Promise<number> {\n const threadKey = key(input.projectId, input.threadId)\n const thread = this.state.threads.get(threadKey)\n if (!thread) {\n throw new AgentStorageError(\n \"thread_not_found\",\n `[Sixb] Agent thread '${input.threadId}' not found for project '${input.projectId}'.`\n )\n }\n\n const messages = [...this.state.messages.entries()].filter(\n ([, message]) =>\n message.projectId === input.projectId &&\n message.threadId === input.threadId &&\n message.runId === input.runId\n )\n if (messages.length === 0) {\n return 0\n }\n\n for (const [messageKey] of messages) {\n this.state.messages.delete(messageKey)\n }\n\n const remainingMessages = [...this.state.messages.values()]\n .filter(\n (message) => message.projectId === input.projectId && message.threadId === input.threadId\n )\n .sort((left, right) => right.seq - left.seq)\n const latestMessage = remainingMessages[0]\n const updatedAt = new Date()\n this.state.threads.set(\n threadKey,\n clone({\n ...thread,\n messageCount: remainingMessages.length,\n lastMessageAt: latestMessage?.createdAt,\n updatedAt,\n })\n )\n\n return messages.length\n }\n\n async getById(params: { projectId: string; id: string }): Promise<AgentMessageRecord | null> {\n const record = this.state.messages.get(key(params.projectId, params.id))\n return record ? clone(record) : null\n }\n\n async list(input: ListAgentMessagesInput): Promise<ListAgentMessagesResult> {\n const order = input.order ?? \"asc\"\n const roles = input.roles ? new Set(input.roles) : null\n\n const filtered = [...this.state.messages.values()]\n .filter((message) => message.projectId === input.projectId)\n .filter((message) => message.threadId === input.threadId)\n .filter((message) => (input.afterSeq === undefined ? true : message.seq > input.afterSeq))\n .filter((message) => (roles ? roles.has(message.role) : true))\n .sort((a, b) => (order === \"asc\" ? a.seq - b.seq : b.seq - a.seq))\n\n const { page, hasMore, total } = applyWindow(filtered, input.offset, input.limit)\n return { messages: page.map(clone), hasMore, total }\n }\n\n private nextSeq(projectId: string, threadId: string): number {\n let max = 0\n for (const message of this.state.messages.values()) {\n if (message.projectId === projectId && message.threadId === threadId && message.seq > max) {\n max = message.seq\n }\n }\n return max + 1\n }\n}\n\n// ── context checkpoints ──────────────────────────────────────────────────────────────────────\n\nclass InMemoryAgentContextCheckpointStore implements AgentContextCheckpointStore {\n constructor(private readonly state: AgentStoreState) {}\n\n async create(input: CreateAgentContextCheckpointInput): Promise<AgentContextCheckpointRecord> {\n assertCreateAgentContextCheckpointInput(input)\n\n // No `await` between authority checks and append: this is one in-memory critical section.\n const run = this.state.runs.get(key(input.projectId, input.createdByRunId)) ?? null\n const thread = this.state.threads.get(key(input.projectId, input.threadId)) ?? null\n assertAgentContextCheckpointAuthority({ create: input, run, thread })\n\n const messages = [...this.state.messages.values()].filter(\n (message) => message.projectId === input.projectId && message.threadId === input.threadId\n )\n const headSeq = messages.reduce((head, message) => Math.max(head, message.seq), 0)\n const latest = this.findLatest(input.projectId, input.threadId)\n\n const existingForRun = [...this.state.checkpoints.values()].find(\n (checkpoint) =>\n checkpoint.projectId === input.projectId &&\n checkpoint.createdByRunId === input.createdByRunId\n )\n if (existingForRun) {\n if (agentContextCheckpointMatchesCreateInput(existingForRun, input)) {\n assertAgentContextCheckpointReplayState({\n create: input,\n existing: existingForRun,\n latest,\n headSeq,\n })\n return clone(existingForRun)\n }\n throw new AgentStorageError(\n \"invalid_state\",\n `[Sixb] Agent run '${input.createdByRunId}' already created a different context checkpoint.`\n )\n }\n\n if (this.state.checkpoints.has(key(input.projectId, input.id))) {\n throw new AgentStorageError(\n \"duplicate_id\",\n `[Sixb] Agent context checkpoint '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const firstRetained =\n messages\n .filter((message) => message.seq > input.summarizedThroughSeq)\n .sort((left, right) => left.seq - right.seq)[0] ?? null\n assertAgentContextCheckpointAnchors({\n create: input,\n latest,\n headSeq,\n firstRetained,\n })\n\n const record: AgentContextCheckpointRecord = {\n id: input.id,\n projectId: input.projectId,\n threadId: input.threadId,\n createdByRunId: input.createdByRunId,\n ...(input.expectedPreviousCheckpointId === null\n ? {}\n : { previousCheckpointId: input.expectedPreviousCheckpointId }),\n reason: input.reason,\n summary: input.summary,\n summaryFormatVersion: input.summaryFormatVersion,\n summarizedThroughSeq: input.summarizedThroughSeq,\n observedHeadSeq: input.observedHeadSeq,\n estimatedInputTokensBefore: input.estimatedInputTokensBefore,\n estimatedInputTokensAfter: input.estimatedInputTokensAfter,\n summaryModelId: input.summaryModelId,\n createdAt: new Date(input.createdAt ?? new Date()),\n }\n this.state.checkpoints.set(key(input.projectId, input.id), clone(record))\n return clone(record)\n }\n\n async getLatest(input: {\n readonly projectId: string\n readonly threadId: string\n }): Promise<AgentContextCheckpointRecord | null> {\n const record = this.findLatest(input.projectId, input.threadId)\n return record ? clone(record) : null\n }\n\n async getByRunIds(input: {\n readonly projectId: string\n readonly runIds: readonly string[]\n }): Promise<readonly AgentContextCheckpointRecord[]> {\n const byRunId = new Map(\n [...this.state.checkpoints.values()]\n .filter((checkpoint) => checkpoint.projectId === input.projectId)\n .map((checkpoint) => [checkpoint.createdByRunId, checkpoint] as const)\n )\n return [...new Set(input.runIds)].flatMap((runId) => {\n const checkpoint = byRunId.get(runId)\n return checkpoint ? [clone(checkpoint)] : []\n })\n }\n\n private findLatest(projectId: string, threadId: string): AgentContextCheckpointRecord | null {\n return (\n [...this.state.checkpoints.values()]\n .filter(\n (checkpoint) => checkpoint.projectId === projectId && checkpoint.threadId === threadId\n )\n .sort(\n (left, right) =>\n right.summarizedThroughSeq - left.summarizedThroughSeq ||\n right.createdAt.getTime() - left.createdAt.getTime() ||\n right.id.localeCompare(left.id)\n )[0] ?? null\n )\n }\n}\n\nexport class InMemoryAgentStorage implements AgentStorage {\n private readonly state: AgentStoreState = {\n threads: new Map(),\n runs: new Map(),\n messages: new Map(),\n checkpoints: new Map(),\n }\n\n readonly threads: InMemoryAgentThreadStore\n readonly runs: InMemoryAgentRunStore\n readonly messages: InMemoryAgentMessageStore\n readonly checkpoints: InMemoryAgentContextCheckpointStore\n\n constructor(executions: ExecutionStorage) {\n this.threads = new InMemoryAgentThreadStore(this.state)\n this.runs = new InMemoryAgentRunStore(this.state, executions)\n this.messages = new InMemoryAgentMessageStore(this.state)\n this.checkpoints = new InMemoryAgentContextCheckpointStore(this.state)\n }\n\n snapshot(): InMemoryAgentStorageSnapshot {\n return {\n threads: structuredClone(this.state.threads),\n runs: structuredClone(this.state.runs),\n messages: structuredClone(this.state.messages),\n checkpoints: structuredClone(this.state.checkpoints),\n }\n }\n\n restore(snapshot: InMemoryAgentStorageSnapshot): void {\n replace(this.state.threads, snapshot.threads)\n replace(this.state.runs, snapshot.runs)\n replace(this.state.messages, snapshot.messages)\n replace(this.state.checkpoints, snapshot.checkpoints)\n }\n}\n\nfunction replace<T>(target: Map<string, T>, source: Map<string, T>): void {\n target.clear()\n for (const [k, value] of structuredClone(source)) {\n target.set(k, value)\n }\n}\n",
9
- "export type AiCostStorageErrorCode = \"missing_usage\" | \"cost_mismatch\"\n\nexport class AiCostStorageError extends Error {\n readonly name = \"AiCostStorageError\"\n\n constructor(\n readonly code: AiCostStorageErrorCode,\n message: string\n ) {\n super(message)\n }\n}\n",
10
- "import type { AiModelCallUsageRecord, InMemoryAiUsageStorageSnapshot } from \"../ai-usage\"\nimport type { AiAccountingRecordSetItem } from \"./analytics\"\nimport { buildAiAccountingOverview, buildAiModelCallAccountingList } from \"./analytics\"\nimport { AiCostStorageError } from \"./errors\"\nimport type {\n AiAccountingAttribution,\n AiAccountingOverview,\n AiCostStorage,\n AiCostSummary,\n AiModelCallCostRecord,\n AiMoney,\n ListAiModelCallAccountingInput,\n ListAiModelCallAccountingResult,\n QueryAiAccountingOverviewInput,\n SummarizeAiCostExecutionsInput,\n} from \"./types\"\nimport { aiModelCallCostMatchesUsage, normalizeAiModelCallCostRecord } from \"./validation\"\n\nexport interface InMemoryAiCostStorageSnapshot {\n readonly recordsByUsage: Map<string, AiModelCallCostRecord>\n}\n\ninterface InMemoryAiCostUsageSource {\n snapshot(): InMemoryAiUsageStorageSnapshot\n}\n\nexport interface InMemoryAiAccountingAttributionSource {\n resolve(input: {\n readonly projectId: string\n readonly executionId: string\n }): Promise<AiAccountingAttribution | undefined>\n}\n\n/** In-memory immutable model-call costs and accounting reads. */\nexport class InMemoryAiCostStorage implements AiCostStorage {\n private readonly recordsByUsage = new Map<string, AiModelCallCostRecord>()\n\n constructor(\n private readonly usage: InMemoryAiCostUsageSource,\n private readonly attribution?: InMemoryAiAccountingAttributionSource\n ) {}\n\n async recordModelCallCost(input: AiModelCallCostRecord): Promise<void> {\n const record = normalizeAiModelCallCostRecord(input)\n const usage = this.usageRecord(record.projectId, record.usageRecordId)\n if (!usage) throw missingUsage(record)\n if (!aiModelCallCostMatchesUsage(record, usage)) {\n throw new AiCostStorageError(\n \"cost_mismatch\",\n `[Sixb] AI valuation for usage '${record.usageRecordId}' does not match its usage record.`\n )\n }\n const key = usageRecordKey(record.projectId, record.usageRecordId)\n if (!this.recordsByUsage.has(key)) this.recordsByUsage.set(key, structuredClone(record))\n }\n\n async summarizeExecutions(\n input: SummarizeAiCostExecutionsInput\n ): Promise<readonly AiCostSummary[]> {\n assertNonBlank(input.projectId, \"cost summary projectId\")\n for (const id of input.executionIds) assertNonBlank(id, \"cost summary executionId\")\n const requested = new Set(input.executionIds)\n const usageByExecution = new Map(input.executionIds.map((id) => [id, [] as string[]]))\n for (const usage of this.usage.snapshot().records.values()) {\n if (usage.projectId === input.projectId && requested.has(usage.executionId)) {\n usageByExecution.get(usage.executionId)!.push(usage.id)\n }\n }\n return input.executionIds.map((id) =>\n this.summarizeUsageIds(input.projectId, usageByExecution.get(id) ?? [])\n )\n }\n\n async queryProjectOverview(input: QueryAiAccountingOverviewInput): Promise<AiAccountingOverview> {\n return buildAiAccountingOverview(input, await this.accountingItems())\n }\n\n async listModelCalls(\n input: ListAiModelCallAccountingInput\n ): Promise<ListAiModelCallAccountingResult> {\n return buildAiModelCallAccountingList(input, await this.accountingItems())\n }\n\n snapshot(): InMemoryAiCostStorageSnapshot {\n return structuredClone({ recordsByUsage: this.recordsByUsage })\n }\n\n restore(snapshot: InMemoryAiCostStorageSnapshot): void {\n replaceMap(this.recordsByUsage, snapshot.recordsByUsage)\n }\n\n private usageRecord(projectId: string, id: string): AiModelCallUsageRecord | undefined {\n return [...this.usage.snapshot().records.values()].find(\n (record) => record.projectId === projectId && record.id === id\n )\n }\n\n private async accountingItems(): Promise<readonly AiAccountingRecordSetItem[]> {\n return Promise.all(\n [...this.usage.snapshot().records.values()].map(async (usage) => {\n const cost = this.recordsByUsage.get(usageRecordKey(usage.projectId, usage.id))\n const attribution = await this.attribution?.resolve({\n projectId: usage.projectId,\n executionId: usage.executionId,\n })\n return {\n usage,\n ...(attribution ? { attribution } : {}),\n ...(cost ? { cost } : {}),\n }\n })\n )\n }\n\n private summarizeUsageIds(projectId: string, ids: readonly string[]): AiCostSummary {\n const amounts = new Map<string, bigint>()\n let ratedCallCount = 0\n let unpriceableCallCount = 0\n let unvaluedCallCount = 0\n for (const id of ids) {\n const cost = this.recordsByUsage.get(usageRecordKey(projectId, id))\n if (!cost) unvaluedCallCount += 1\n else if (cost.status === \"unpriceable\") unpriceableCallCount += 1\n else {\n ratedCallCount += 1\n addMoney(amounts, cost.money)\n }\n }\n return {\n amounts: [...amounts]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currency, amount]) => ({ currency, amountNanos: amount.toString() })),\n ratedCallCount,\n unpriceableCallCount,\n unvaluedCallCount,\n }\n }\n}\n\nfunction missingUsage(record: { readonly projectId: string; readonly usageRecordId: string }) {\n return new AiCostStorageError(\n \"missing_usage\",\n `[Sixb] AI usage '${record.usageRecordId}' does not exist in project '${record.projectId}'.`\n )\n}\n\nfunction addMoney(amounts: Map<string, bigint>, money: AiMoney): void {\n amounts.set(money.currency, (amounts.get(money.currency) ?? 0n) + BigInt(money.amountNanos))\n}\n\nfunction usageRecordKey(projectId: string, id: string): string {\n return JSON.stringify([projectId, id])\n}\n\nfunction assertNonBlank(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`[Sixb] AI ${field} must be nonblank.`)\n }\n}\n\nfunction replaceMap<TKey, TValue>(target: Map<TKey, TValue>, source: Map<TKey, TValue>): void {\n target.clear()\n for (const [key, value] of structuredClone(source)) target.set(key, value)\n}\n",
11
- "import { timingSafeEqual } from \"node:crypto\"\nimport { createSixbError, parseSixbFailure, toSixbFailure } from \"../../errors/internal\"\nimport { ConnectorConnectionStorageError } from \"./errors\"\nimport type {\n AttachConnectorConnectionRunAuthorizationInput,\n ClaimConnectorConnectionRunCallbackInput,\n ClaimConnectorConnectionRunCallbackResult,\n ClaimConnectorCredentialMutationInput,\n ClaimConnectorCredentialMutationResult,\n ConnectorAuthorizationAttemptRecord,\n ConnectorAuthorizationKey,\n ConnectorAuthorizationRecord,\n ConnectorConnectionKey,\n ConnectorConnectionRecord,\n ConnectorConnectionRunAwaitingProviderRecord,\n ConnectorConnectionRunAwaitingSelectionRecord,\n ConnectorConnectionRunProcessingRecord,\n ConnectorConnectionRunRecord,\n ConnectorConnectionRunSucceededRecord,\n ConnectorConnectionStorage,\n ConnectorCredentialMutationFence,\n CreateConnectorAuthorizationAttemptInput,\n CreateConnectorAuthorizationInput,\n CreateConnectorConnectionRunInput,\n CreateConnectorConnectionSelectionRunInput,\n FinalizeConnectorReauthorizationInput,\n FinishConnectorConnectionRunInput,\n GetConnectorConnectionInput,\n GetConnectorConnectionRunInput,\n InitializeConnectorAuthorizationAccountsInput,\n ListConnectorConnectionsInput,\n MarkConnectorAuthorizationNeedsReauthorizationInput,\n MarkConnectorCredentialMutationExecutingInput,\n PutConnectorConnectionFromRunInput,\n PutConnectorConnectionFromRunResult,\n PutConnectorConnectionInput,\n PutConnectorConnectionResult,\n RecoverExpiredConnectorCredentialMutationInput,\n ReleaseConnectorCredentialMutationInput,\n RenewConnectorCredentialMutationInput,\n StageConnectorCredentialMutationCredentialsInput,\n StageConnectorCredentialMutationRevocationInput,\n WaitForConnectorConnectionRunSelectionInput,\n} from \"./types\"\nimport { CONNECTOR_CONNECTION_RUN_FAILURE_CODES } from \"./types\"\n\nexport interface InMemoryConnectorConnectionStorageSnapshot {\n readonly attempts: Map<string, ConnectorAuthorizationAttemptRecord>\n readonly connectionRuns: Map<string, ConnectorConnectionRunRecord>\n readonly authorizations: Map<string, ConnectorAuthorizationRecord>\n readonly connections: Map<string, ConnectorConnectionRecord>\n}\n\nfunction connectionRunBase(record: ConnectorConnectionRunRecord, updatedAt: Date) {\n return {\n id: record.id,\n projectId: record.projectId,\n connectorId: record.connectorId,\n kind: record.kind,\n owner: structuredClone(record.owner),\n slot: record.slot,\n initiatedByExecutionId: record.initiatedByExecutionId,\n createdAt: new Date(record.createdAt),\n updatedAt: new Date(updatedAt),\n }\n}\n\nfunction expireConnectionRun(\n record: Extract<ConnectorConnectionRunRecord, { readonly status: \"waiting\" }>,\n now: Date\n) {\n return {\n ...connectionRunBase(record, now),\n status: \"expired\" as const,\n ...(record.waitingFor === \"account_selection\"\n ? { authorizationId: record.authorizationId }\n : {}),\n finishedAt: new Date(now),\n }\n}\n\nfunction failExpiredProcessingRun(record: ConnectorConnectionRunProcessingRecord, now: Date) {\n return {\n ...connectionRunBase(record, now),\n status: \"failed\" as const,\n ...(record.authorizationId === undefined ? {} : { authorizationId: record.authorizationId }),\n error: toSixbFailure(\n createSixbError(\n \"internal.unexpected\",\n \"[Sixb] Connector callback processing did not complete before its deadline.\"\n ),\n { allowedCodes: CONNECTOR_CONNECTION_RUN_FAILURE_CODES, at: now }\n ),\n finishedAt: new Date(now),\n }\n}\n\nexport interface InMemoryConnectorConnectionStorageOptions {\n /** Storage-authoritative clock. Durable implementations should use their database clock. */\n readonly now?: () => Date\n}\n\nexport class InMemoryConnectorConnectionStorage implements ConnectorConnectionStorage {\n readonly durability = \"ephemeral\" as const\n private readonly attempts = new Map<string, ConnectorAuthorizationAttemptRecord>()\n private readonly connectionRuns = new Map<string, ConnectorConnectionRunRecord>()\n private readonly authorizations = new Map<string, ConnectorAuthorizationRecord>()\n private readonly connections = new Map<string, ConnectorConnectionRecord>()\n\n constructor(private readonly options: InMemoryConnectorConnectionStorageOptions = {}) {}\n\n async createAuthorizationAttempt(\n input: CreateConnectorAuthorizationAttemptInput\n ): Promise<ConnectorAuthorizationAttemptRecord> {\n assertPositiveDuration(input.ttlMs, \"authorization attempt TTL\")\n if (this.attempts.has(input.id)) {\n throw new ConnectorConnectionStorageError(\n \"attempt_conflict\",\n \"[Sixb] Connector authorization attempt already exists.\"\n )\n }\n if (input.connectionRunId !== undefined) {\n const run = this.connectionRuns.get(input.connectionRunId)\n const existingAttempt = this.findAuthorizationAttemptByConnectionRunId(input.connectionRunId)\n if (\n !run ||\n existingAttempt ||\n run.projectId !== input.projectId ||\n run.connectorId !== input.connectorId ||\n run.status !== \"waiting\" ||\n run.waitingFor !== \"provider_authorization\" ||\n run.slot !== input.slot ||\n run.initiatedByExecutionId !== input.initiatedByExecutionId\n ) {\n throw new ConnectorConnectionStorageError(\n \"attempt_conflict\",\n \"[Sixb] Connector authorization attempt does not match its connection run.\"\n )\n }\n }\n const now = this.now()\n const record: ConnectorAuthorizationAttemptRecord = {\n id: input.id,\n projectId: input.projectId,\n connectorId: input.connectorId,\n owner: structuredClone(input.owner),\n slot: input.slot,\n initiatedByExecutionId: input.initiatedByExecutionId,\n stateHash: input.stateHash,\n codeVerifier: structuredClone(input.codeVerifier),\n redirectUri: input.redirectUri,\n ...(input.connectionRunId === undefined ? {} : { connectionRunId: input.connectionRunId }),\n ...(input.returnTo === undefined ? {} : { returnTo: input.returnTo }),\n ...(input.callbackBindingHash === undefined\n ? {}\n : { callbackBindingHash: input.callbackBindingHash }),\n ...(input.reauthorizationId === undefined\n ? {}\n : { reauthorizationId: input.reauthorizationId }),\n ...(input.reauthorizationRevision === undefined\n ? {}\n : { reauthorizationRevision: input.reauthorizationRevision }),\n ...(input.reauthorizationConnectionIds === undefined\n ? {}\n : { reauthorizationConnectionIds: [...input.reauthorizationConnectionIds] }),\n createdAt: now,\n expiresAt: new Date(now.getTime() + input.ttlMs),\n }\n this.attempts.set(record.id, record)\n return structuredClone(record)\n }\n\n async consumeAuthorizationAttempt(\n input: Parameters<ConnectorConnectionStorage[\"consumeAuthorizationAttempt\"]>[0]\n ): Promise<ConnectorAuthorizationAttemptRecord> {\n const record = this.attempts.get(input.id)\n if (record && record.expiresAt.getTime() <= this.now().getTime()) {\n this.attempts.delete(record.id)\n throw invalidAttempt()\n }\n if (\n !record ||\n record.projectId !== input.projectId ||\n record.connectorId !== input.connectorId ||\n record.redirectUri !== input.redirectUri ||\n !safeEqual(record.stateHash, input.stateHash)\n ) {\n throw invalidAttempt()\n }\n\n this.attempts.delete(input.id)\n return structuredClone(record)\n }\n\n async createConnectionRun(\n input: CreateConnectorConnectionRunInput\n ): Promise<ConnectorConnectionRunRecord> {\n assertPositiveDuration(input.ttlMs, \"connection run TTL\")\n if (this.connectionRuns.has(input.id)) {\n throw new ConnectorConnectionStorageError(\n \"run_conflict\",\n \"[Sixb] Connector connection run already exists.\"\n )\n }\n const now = this.now()\n const record: ConnectorConnectionRunAwaitingProviderRecord = {\n id: input.id,\n projectId: input.projectId,\n connectorId: input.connectorId,\n kind: input.kind,\n owner: structuredClone(input.owner),\n slot: input.slot,\n initiatedByExecutionId: input.initiatedByExecutionId,\n status: \"waiting\",\n waitingFor: \"provider_authorization\",\n createdAt: now,\n updatedAt: now,\n expiresAt: new Date(now.getTime() + input.ttlMs),\n }\n this.connectionRuns.set(record.id, record)\n return structuredClone(record)\n }\n\n async createConnectionSelectionRun(\n input: CreateConnectorConnectionSelectionRunInput\n ): Promise<ConnectorConnectionRunAwaitingSelectionRecord> {\n assertPositiveDuration(input.ttlMs, \"connection run TTL\")\n if (this.connectionRuns.has(input.id)) {\n throw new ConnectorConnectionStorageError(\n \"run_conflict\",\n \"[Sixb] Connector connection run already exists.\"\n )\n }\n const authorization = this.authorizations.get(input.authorizationId)\n if (\n !sameAuthorizationScope(authorization, input) ||\n authorization.status !== \"active\" ||\n authorization.credentialMutation\n ) {\n throw authorizationConflict()\n }\n const now = this.now()\n const record: ConnectorConnectionRunAwaitingSelectionRecord = {\n id: input.id,\n projectId: input.projectId,\n connectorId: input.connectorId,\n kind: \"connect\",\n owner: structuredClone(input.owner),\n slot: input.slot,\n initiatedByExecutionId: input.initiatedByExecutionId,\n status: \"waiting\",\n waitingFor: \"account_selection\",\n authorizationId: input.authorizationId,\n createdAt: now,\n updatedAt: now,\n expiresAt: new Date(now.getTime() + input.ttlMs),\n }\n this.connectionRuns.set(record.id, record)\n return structuredClone(record)\n }\n\n async claimConnectionRunCallback(\n input: ClaimConnectorConnectionRunCallbackInput\n ): Promise<ClaimConnectorConnectionRunCallbackResult | null> {\n assertPositiveDuration(input.processingTtlMs, \"connection run processing TTL\")\n const attempt = this.attempts.get(input.attemptId)\n if (\n !attempt ||\n attempt.projectId !== input.projectId ||\n attempt.connectionRunId === undefined ||\n attempt.returnTo === undefined ||\n attempt.callbackBindingHash === undefined ||\n attempt.redirectUri !== input.redirectUri ||\n !safeEqual(attempt.stateHash, input.stateHash) ||\n !safeEqual(attempt.callbackBindingHash, input.callbackBindingHash)\n ) {\n return null\n }\n\n const run = this.connectionRuns.get(attempt.connectionRunId)\n if (\n !run ||\n run.projectId !== input.projectId ||\n run.connectorId !== attempt.connectorId ||\n run.status !== \"waiting\" ||\n run.waitingFor !== \"provider_authorization\" ||\n run.slot !== attempt.slot ||\n run.initiatedByExecutionId !== attempt.initiatedByExecutionId\n ) {\n return null\n }\n\n const now = this.now()\n this.attempts.delete(attempt.id)\n if (attempt.expiresAt.getTime() <= now.getTime() || run.expiresAt.getTime() <= now.getTime()) {\n const expired = expireConnectionRun(run, now)\n this.connectionRuns.set(run.id, expired)\n return { type: \"expired\", run: structuredClone(expired), returnTo: attempt.returnTo }\n }\n\n const processing: ConnectorConnectionRunProcessingRecord = {\n ...connectionRunBase(run, now),\n status: \"running\" as const,\n processingId: input.processingId,\n callbackStartedAt: now,\n expiresAt: new Date(now.getTime() + input.processingTtlMs),\n ...(attempt.reauthorizationId === undefined\n ? {}\n : { authorizationId: attempt.reauthorizationId }),\n }\n this.connectionRuns.set(run.id, processing)\n return {\n type: \"claimed\",\n run: structuredClone(processing),\n attempt: structuredClone(attempt),\n returnTo: attempt.returnTo,\n }\n }\n\n async attachConnectionRunAuthorization(\n input: AttachConnectorConnectionRunAuthorizationInput\n ): Promise<ConnectorConnectionRunProcessingRecord | null> {\n const run = this.currentConnectionRun(input.runId)\n const authorization = this.authorizations.get(input.authorizationId)\n if (\n !sameConnectionRunScope(run, input) ||\n run.status !== \"running\" ||\n run.processingId !== input.processingId ||\n (run.authorizationId !== undefined && run.authorizationId !== input.authorizationId) ||\n !sameAuthorizationScope(authorization, input) ||\n authorization.status !== \"pending_selection\"\n ) {\n return null\n }\n const updated: ConnectorConnectionRunProcessingRecord = {\n ...run,\n authorizationId: input.authorizationId,\n updatedAt: this.now(),\n }\n this.connectionRuns.set(run.id, updated)\n return structuredClone(updated)\n }\n\n async waitForConnectionRunSelection(input: WaitForConnectorConnectionRunSelectionInput) {\n const run = this.currentConnectionRun(input.runId)\n if (\n !sameConnectionRunScope(run, input) ||\n run.status !== \"running\" ||\n run.kind !== \"connect\" ||\n run.processingId !== input.processingId ||\n run.authorizationId !== input.authorizationId\n ) {\n return null\n }\n const now = this.now()\n const waiting = {\n ...connectionRunBase(run, now),\n status: \"waiting\" as const,\n waitingFor: \"account_selection\" as const,\n authorizationId: input.authorizationId,\n expiresAt: new Date(input.expiresAt),\n }\n this.connectionRuns.set(run.id, waiting)\n return structuredClone(waiting)\n }\n\n async finishConnectionRun(\n input: FinishConnectorConnectionRunInput\n ): Promise<ConnectorConnectionRunRecord | null> {\n const run = this.currentConnectionRun(input.runId)\n if (!sameConnectionRunScope(run, input) || run.status !== \"running\") return null\n if (input.processingId !== run.processingId) return null\n const now = this.now()\n const authorizationId =\n input.status === \"succeeded\"\n ? input.authorizationId\n : input.status === \"failed\"\n ? (input.authorizationId ?? run.authorizationId)\n : run.authorizationId\n if (input.status !== \"succeeded\" && run.kind === \"connect\" && authorizationId) {\n this.markPendingAuthorizationForCleanup(run.connectorId, authorizationId, now)\n }\n const base = connectionRunBase(run, now)\n const finished: ConnectorConnectionRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n status: \"succeeded\",\n authorizationId: input.authorizationId,\n ...(input.cleanupAuthorizationId === undefined\n ? {}\n : { cleanupAuthorizationId: input.cleanupAuthorizationId }),\n connections: structuredClone(input.connections),\n finishedAt: now,\n }\n : input.status === \"failed\"\n ? {\n ...base,\n status: \"failed\",\n ...(authorizationId === undefined ? {} : { authorizationId }),\n error: parseSixbFailure(input.error, CONNECTOR_CONNECTION_RUN_FAILURE_CODES),\n finishedAt: now,\n }\n : {\n ...base,\n status: \"cancelled\",\n ...(authorizationId === undefined ? {} : { authorizationId }),\n finishedAt: now,\n }\n this.connectionRuns.set(run.id, finished)\n return structuredClone(finished)\n }\n\n async getConnectionRun(\n input: GetConnectorConnectionRunInput\n ): Promise<ConnectorConnectionRunRecord | null> {\n const run = this.currentConnectionRun(input.runId)\n return sameConnectionRunScope(run, input) ? structuredClone(run) : null\n }\n\n async createAuthorization(\n input: CreateConnectorAuthorizationInput\n ): Promise<ConnectorAuthorizationRecord> {\n assertPositiveDuration(input.selectionTtlMs, \"account selection TTL\")\n if (this.authorizations.has(input.id)) {\n throw new ConnectorConnectionStorageError(\n \"authorization_conflict\",\n \"[Sixb] Connector authorization already exists.\"\n )\n }\n const now = this.now()\n const record: ConnectorAuthorizationRecord = {\n id: input.id,\n projectId: input.projectId,\n connectorId: input.connectorId,\n authorizedBy: structuredClone(input.authorizedBy),\n credentials: structuredClone(input.credentials),\n ...(input.credentialExpiresAt === undefined\n ? {}\n : { credentialExpiresAt: new Date(input.credentialExpiresAt) }),\n scopes: [...input.scopes],\n accounts: structuredClone(input.accounts),\n status: \"pending_selection\",\n selectionExpiresAt: new Date(now.getTime() + input.selectionTtlMs),\n revision: 0,\n createdAt: now,\n updatedAt: now,\n }\n this.authorizations.set(record.id, record)\n return structuredClone(record)\n }\n\n async initializeAuthorizationAccounts(\n input: InitializeConnectorAuthorizationAccountsInput\n ): Promise<ConnectorAuthorizationRecord | null> {\n const record = this.authorizations.get(input.authorizationId)\n if (\n !sameAuthorizationScope(record, input) ||\n record.revision !== input.expectedRevision ||\n record.status !== \"pending_selection\" ||\n record.credentialMutation\n ) {\n return null\n }\n const updated: ConnectorAuthorizationRecord = {\n ...record,\n accounts: structuredClone(input.accounts),\n revision: record.revision + 1,\n updatedAt: this.now(),\n }\n this.authorizations.set(record.id, updated)\n return structuredClone(updated)\n }\n\n async getAuthorization(\n input: ConnectorAuthorizationKey\n ): Promise<ConnectorAuthorizationRecord | null> {\n const authorization = this.authorizations.get(input.authorizationId)\n return sameAuthorizationScope(authorization, input) ? structuredClone(authorization) : null\n }\n\n async getAuthorizationByConnectionId(\n input: ConnectorConnectionKey\n ): Promise<ConnectorAuthorizationRecord | null> {\n const connection = this.connections.get(input.connectionId)\n if (!sameConnectionScope(connection, input)) return null\n const authorization = this.authorizations.get(connection.authorizationId)\n return sameAuthorizationScope(authorization, input) ? structuredClone(authorization) : null\n }\n\n async claimCredentialMutation(\n input: ClaimConnectorCredentialMutationInput\n ): Promise<ClaimConnectorCredentialMutationResult | null> {\n assertPositiveDuration(input.leaseDurationMs, \"credential mutation lease duration\")\n assertPositiveDuration(input.operationTimeoutMs, \"credential mutation timeout\")\n const now = this.now()\n const record = this.authorizations.get(input.authorizationId)\n if (\n !sameAuthorizationScope(record, input) ||\n record.revision !== input.expectedRevision ||\n !canClaimMutation(record.status, input.mutation.kind)\n ) {\n return null\n }\n\n if (record.credentialMutation) {\n const canReplacePrepared =\n record.credentialMutation.phase === \"prepared\" &&\n record.credentialMutation.expiresAt.getTime() <= now.getTime()\n if (!canReplacePrepared) return null\n }\n\n const attached = this.connectedConnectionsForAuthorization(record.id)\n if (\n input.mutation.kind === \"reauthorization\" &&\n !sameIds(\n attached.map((connection) => connection.id),\n input.expectedConnectionIds ?? []\n )\n ) {\n return null\n }\n\n const deadlineAt = new Date(now.getTime() + input.operationTimeoutMs)\n const mutation = {\n ...structuredClone(input.mutation),\n phase: \"prepared\" as const,\n expiresAt: leaseExpiry(now, input.leaseDurationMs, deadlineAt),\n deadlineAt,\n ...(input.mutation.kind === \"reauthorization\"\n ? { expectedConnectionIds: [...(input.expectedConnectionIds ?? [])] }\n : {}),\n }\n const startsRevocation =\n input.mutation.kind === \"revocation\" && record.status !== \"revocation_pending\"\n const updated: ConnectorAuthorizationRecord = {\n ...record,\n status: input.mutation.kind === \"revocation\" ? \"revocation_pending\" : record.status,\n selectionExpiresAt:\n input.mutation.kind === \"revocation\" ? undefined : record.selectionExpiresAt,\n revision: startsRevocation ? record.revision + 1 : record.revision,\n credentialMutation: mutation,\n updatedAt: now,\n }\n this.authorizations.set(record.id, updated)\n\n const disconnected: ConnectorConnectionRecord[] = []\n if (input.mutation.kind === \"revocation\") {\n for (const connection of attached) {\n const updatedConnection = disconnectConnectionRecord(connection, now)\n this.connections.set(connection.id, updatedConnection)\n disconnected.push(structuredClone(updatedConnection))\n }\n }\n return { authorization: structuredClone(updated), disconnected }\n }\n\n async markCredentialMutationExecuting(\n input: MarkConnectorCredentialMutationExecutingInput\n ): Promise<ConnectorAuthorizationRecord | null> {\n const now = this.now()\n const record = this.authorizations.get(input.authorizationId)\n if (\n !matchesMutation(record, input, input.holderId) ||\n record.credentialMutation.phase !== \"prepared\" ||\n mutationExpired(record, now)\n ) {\n return null\n }\n const updated: ConnectorAuthorizationRecord = {\n ...record,\n credentialMutation: { ...record.credentialMutation, phase: \"executing\" },\n updatedAt: now,\n }\n this.authorizations.set(record.id, updated)\n return structuredClone(updated)\n }\n\n async renewCredentialMutation(\n input: RenewConnectorCredentialMutationInput\n ): Promise<ConnectorAuthorizationRecord | null> {\n assertPositiveDuration(input.leaseDurationMs, \"credential mutation lease duration\")\n const now = this.now()\n const record = this.authorizations.get(input.authorizationId)\n if (\n !matchesMutation(record, input, input.holderId) ||\n record.credentialMutation.phase === \"result_staged\" ||\n mutationExpired(record, now)\n ) {\n return null\n }\n const updated: ConnectorAuthorizationRecord = {\n ...record,\n credentialMutation: {\n ...record.credentialMutation,\n expiresAt: leaseExpiry(now, input.leaseDurationMs, record.credentialMutation.deadlineAt),\n },\n }\n this.authorizations.set(record.id, updated)\n return structuredClone(updated)\n }\n\n async stageCredentialMutationCredentials(\n input: StageConnectorCredentialMutationCredentialsInput\n ): Promise<ConnectorAuthorizationRecord | null> {\n const now = this.now()\n const record = this.authorizations.get(input.authorizationId)\n if (\n !matchesMutation(record, input, input.holderId) ||\n record.credentialMutation.phase !== \"executing\" ||\n mutationExpired(record, now) ||\n record.credentialMutation.kind === \"revocation\"\n ) {\n return null\n }\n const updated: ConnectorAuthorizationRecord = {\n ...record,\n credentialMutation: {\n ...record.credentialMutation,\n phase: \"result_staged\",\n stagedCredentials: {\n credentials: structuredClone(input.credentials),\n ...(input.credentialExpiresAt === undefined\n ? {}\n : { credentialExpiresAt: new Date(input.credentialExpiresAt) }),\n scopes: [...input.scopes],\n },\n },\n updatedAt: now,\n }\n this.authorizations.set(record.id, updated)\n return structuredClone(updated)\n }\n\n async stageCredentialMutationRevocation(\n input: StageConnectorCredentialMutationRevocationInput\n ): Promise<ConnectorAuthorizationRecord | null> {\n const now = this.now()\n const record = this.authorizations.get(input.authorizationId)\n if (\n !matchesMutation(record, input, input.holderId) ||\n record.credentialMutation.phase !== \"executing\" ||\n record.credentialMutation.kind !== \"revocation\" ||\n mutationExpired(record, now)\n ) {\n return null\n }\n const updated: ConnectorAuthorizationRecord = {\n ...record,\n credentialMutation: { ...record.credentialMutation, phase: \"result_staged\" },\n updatedAt: now,\n }\n this.authorizations.set(record.id, updated)\n return structuredClone(updated)\n }\n\n async releaseCredentialMutation(\n input: ReleaseConnectorCredentialMutationInput\n ): Promise<boolean> {\n const record = this.authorizations.get(input.authorizationId)\n if (\n !matchesMutation(record, input, input.holderId) ||\n record.credentialMutation.phase === \"result_staged\"\n ) {\n return false\n }\n this.authorizations.set(record.id, {\n ...record,\n credentialMutation: undefined,\n updatedAt: this.now(),\n })\n return true\n }\n\n async recoverExpiredCredentialMutation(\n input: RecoverExpiredConnectorCredentialMutationInput\n ): Promise<ConnectorAuthorizationRecord | null> {\n const record = this.authorizations.get(input.authorizationId)\n if (!sameAuthorizationScope(record, input) || !record.credentialMutation) return null\n if (record.credentialMutation.phase === \"result_staged\") return structuredClone(record)\n\n const now = this.now()\n if (!mutationExpired(record, now)) return null\n const ambiguous = record.credentialMutation.phase === \"executing\"\n const failClosed = ambiguous && record.credentialMutation.kind !== \"revocation\"\n const updated: ConnectorAuthorizationRecord = {\n ...record,\n status: failClosed ? \"needs_reauthorization\" : record.status,\n selectionExpiresAt: failClosed ? undefined : record.selectionExpiresAt,\n revision: failClosed ? record.revision + 1 : record.revision,\n credentialMutation: undefined,\n updatedAt: now,\n }\n this.authorizations.set(record.id, updated)\n return structuredClone(updated)\n }\n\n async markNeedsReauthorization(\n input: MarkConnectorAuthorizationNeedsReauthorizationInput\n ): Promise<ConnectorAuthorizationRecord | null> {\n const record = this.authorizations.get(input.authorizationId)\n if (!matchesMutation(record, input)) return null\n const staged = record.credentialMutation.stagedCredentials\n const updated: ConnectorAuthorizationRecord = {\n ...record,\n ...(staged\n ? {\n credentials: structuredClone(staged.credentials),\n credentialExpiresAt:\n staged.credentialExpiresAt === undefined\n ? undefined\n : new Date(staged.credentialExpiresAt),\n scopes: [...staged.scopes],\n }\n : {}),\n status: \"needs_reauthorization\",\n selectionExpiresAt: undefined,\n revision: record.revision + 1,\n credentialMutation: undefined,\n updatedAt: this.now(),\n }\n this.authorizations.set(record.id, updated)\n return structuredClone(updated)\n }\n\n async finalizeRefresh(\n input: ConnectorCredentialMutationFence\n ): Promise<ConnectorAuthorizationRecord | null> {\n const record = this.authorizations.get(input.authorizationId)\n const staged = stagedCredentials(record, input, \"refresh\")\n if (!record || !staged) return null\n const updated = applyStagedCredentials(record, staged, this.now(), {\n status: \"active\",\n accounts: record.accounts,\n })\n this.authorizations.set(record.id, updated)\n return structuredClone(updated)\n }\n\n async finalizeReauthorization(\n input: FinalizeConnectorReauthorizationInput\n ): Promise<ConnectorAuthorizationRecord | null> {\n const record = this.authorizations.get(input.authorizationId)\n const staged = stagedCredentials(record, input, \"reauthorization\")\n if (!record || !staged || !record.credentialMutation) return null\n const attached = this.connectedConnectionsForAuthorization(record.id)\n if (\n !sameIds(\n attached.map((connection) => connection.id),\n record.credentialMutation.expectedConnectionIds ?? []\n )\n ) {\n throw new ConnectorConnectionStorageError(\n \"authorization_conflict\",\n \"[Sixb] Connections attached to the connector authorization changed during reauthorization.\"\n )\n }\n const accountsById = new Map(input.accounts.map((account) => [account.id, account]))\n if (attached.some((connection) => !accountsById.has(connection.account.id))) {\n throw new ConnectorConnectionStorageError(\n \"authorization_conflict\",\n \"[Sixb] Reauthorized connector grant no longer exposes every attached account.\"\n )\n }\n\n const now = this.now()\n const updated = applyStagedCredentials(record, staged, now, {\n status: \"active\",\n accounts: input.accounts,\n })\n this.authorizations.set(record.id, updated)\n for (const connection of attached) {\n this.connections.set(connection.id, {\n ...connection,\n account: structuredClone(accountsById.get(connection.account.id)!),\n updatedAt: now,\n })\n }\n return structuredClone(updated)\n }\n\n async finalizeRevocation(\n input: ConnectorCredentialMutationFence\n ): Promise<ConnectorAuthorizationRecord | null> {\n const record = this.authorizations.get(input.authorizationId)\n if (\n !matchesMutation(record, input) ||\n record.credentialMutation.kind !== \"revocation\" ||\n record.credentialMutation.phase !== \"result_staged\"\n ) {\n return null\n }\n const updated: ConnectorAuthorizationRecord = {\n ...record,\n status: \"revoked\",\n credentials: undefined,\n credentialExpiresAt: undefined,\n scopes: [],\n accounts: [],\n selectionExpiresAt: undefined,\n revision: record.revision + 1,\n credentialMutation: undefined,\n updatedAt: this.now(),\n }\n this.authorizations.set(record.id, updated)\n return structuredClone(updated)\n }\n\n async putConnection(input: PutConnectorConnectionInput): Promise<PutConnectorConnectionResult> {\n return this.putConnectionNow(input, this.now())\n }\n\n async putConnectionFromRun(\n input: PutConnectorConnectionFromRunInput\n ): Promise<PutConnectorConnectionFromRunResult> {\n const run = this.currentConnectionRun(input.runId)\n if (\n !sameConnectionRunScope(run, input) ||\n run.status !== \"waiting\" ||\n run.waitingFor !== \"account_selection\"\n ) {\n throw invalidRun()\n }\n const now = this.now()\n const result = this.putConnectionNow(\n {\n id: input.id,\n projectId: input.projectId,\n connectorId: input.connectorId,\n owner: run.owner,\n slot: run.slot,\n authorizationId: run.authorizationId,\n account: input.account,\n replace: input.replace,\n },\n now\n )\n const succeeded: ConnectorConnectionRunSucceededRecord = {\n ...connectionRunBase(run, now),\n status: \"succeeded\",\n authorizationId: run.authorizationId,\n ...(result.revocationPendingAuthorizationId === undefined\n ? {}\n : { cleanupAuthorizationId: result.revocationPendingAuthorizationId }),\n connections: [structuredClone(result.connection)],\n finishedAt: now,\n }\n this.connectionRuns.set(run.id, succeeded)\n return { ...result, run: structuredClone(succeeded) }\n }\n\n private putConnectionNow(\n input: PutConnectorConnectionInput,\n now: Date\n ): PutConnectorConnectionResult {\n let authorization = this.authorizations.get(input.authorizationId)\n if (\n !sameAuthorizationScope(authorization, input) ||\n !isSelectable(authorization.status) ||\n authorization.credentialMutation?.kind === \"reauthorization\"\n ) {\n throw authorizationConflict()\n }\n if (\n authorization.status === \"pending_selection\" &&\n authorization.selectionExpiresAt!.getTime() <= now.getTime()\n ) {\n authorization = {\n ...authorization,\n status: \"revocation_pending\",\n selectionExpiresAt: undefined,\n revision: authorization.revision + 1,\n updatedAt: now,\n }\n this.authorizations.set(authorization.id, authorization)\n throw authorizationConflict()\n }\n const account = authorization.accounts.find((candidate) => candidate.id === input.account.id)\n if (!account) {\n throw new ConnectorConnectionStorageError(\n \"authorization_conflict\",\n \"[Sixb] Connector connection account is not exposed by its authorization.\"\n )\n }\n const existing = this.findConnectionRecord(input)\n const sameAccount = existing?.account.id === account.id\n if (existing && !sameAccount && !input.replace) {\n throw new ConnectorConnectionStorageError(\n \"connection_conflict\",\n `[Sixb] Connector slot '${input.slot}' is already connected to another account; explicit replacement is required.`\n )\n }\n if (!existing && this.connections.has(input.id)) {\n throw new ConnectorConnectionStorageError(\n \"connection_conflict\",\n \"[Sixb] Connector connection id already exists.\"\n )\n }\n\n let revocationPendingAuthorizationId: string | undefined\n if (existing?.status === \"connected\" && existing.authorizationId !== authorization.id) {\n const previous = this.authorizations.get(existing.authorizationId)\n if (!previous) {\n throw new ConnectorConnectionStorageError(\n \"authorization_conflict\",\n \"[Sixb] Existing connector connection references an unavailable authorization.\"\n )\n }\n const remaining = this.connectedConnectionsForAuthorization(previous.id).filter(\n (connection) => connection.id !== existing.id\n )\n this.assertConnectionCanMove(existing, previous, remaining.length === 0)\n if (remaining.length === 0) {\n const pending = markAuthorizationRevocationPending(previous, now)\n this.authorizations.set(previous.id, pending)\n revocationPendingAuthorizationId = previous.id\n }\n } else if (existing?.status === \"connected\") {\n const previous = this.authorizations.get(existing.authorizationId)\n if (previous) this.assertConnectionCanMove(existing, previous, false)\n }\n\n const updatedAuthorization: ConnectorAuthorizationRecord =\n authorization.status === \"pending_selection\"\n ? {\n ...authorization,\n status: \"active\",\n selectionExpiresAt: undefined,\n revision: authorization.revision + 1,\n updatedAt: now,\n }\n : authorization\n const connection: ConnectorConnectionRecord = existing\n ? {\n ...existing,\n authorizationId: input.authorizationId,\n account: structuredClone(account),\n status: \"connected\",\n disconnectedAt: undefined,\n updatedAt: now,\n }\n : {\n id: input.id,\n projectId: input.projectId,\n connectorId: input.connectorId,\n owner: structuredClone(input.owner),\n slot: input.slot,\n authorizationId: input.authorizationId,\n account: structuredClone(account),\n status: \"connected\",\n createdAt: now,\n updatedAt: now,\n }\n\n if (updatedAuthorization !== authorization) {\n this.authorizations.set(updatedAuthorization.id, updatedAuthorization)\n }\n this.connections.set(connection.id, connection)\n return {\n connection: structuredClone(connection),\n authorization: structuredClone(updatedAuthorization),\n ...(revocationPendingAuthorizationId === undefined\n ? {}\n : { revocationPendingAuthorizationId }),\n created: existing === undefined,\n replaced: existing !== undefined && !sameAccount,\n }\n }\n\n async getConnection(\n input: GetConnectorConnectionInput\n ): Promise<ConnectorConnectionRecord | null> {\n const connection = this.findConnectionRecord(input)\n return connection?.status === \"connected\" ? structuredClone(connection) : null\n }\n\n async getConnectionById(\n input: ConnectorConnectionKey\n ): Promise<ConnectorConnectionRecord | null> {\n const connection = this.connections.get(input.connectionId)\n return sameConnectionScope(connection, input) ? structuredClone(connection) : null\n }\n\n async listConnections(\n input: ListConnectorConnectionsInput\n ): Promise<readonly ConnectorConnectionRecord[]> {\n return [...this.connections.values()]\n .filter((connection) => sameConnectionScope(connection, input))\n .map((connection) => structuredClone(connection))\n }\n\n async listConnectionsByAuthorization(\n input: ConnectorAuthorizationKey\n ): Promise<readonly ConnectorConnectionRecord[]> {\n const authorization = this.authorizations.get(input.authorizationId)\n if (!sameAuthorizationScope(authorization, input)) return []\n return this.connectedConnectionsForAuthorization(input.authorizationId)\n .filter((connection) => sameConnectionScope(connection, input))\n .map((connection) => structuredClone(connection))\n }\n\n async disconnectConnection(input: ConnectorConnectionKey): Promise<{\n readonly connection: ConnectorConnectionRecord\n readonly authorization: ConnectorAuthorizationRecord\n readonly revocationPendingAuthorizationId?: string\n } | null> {\n const connection = this.connections.get(input.connectionId)\n if (\n !connection ||\n connection.projectId !== input.projectId ||\n connection.connectorId !== input.connectorId\n ) {\n return null\n }\n const authorization = this.authorizations.get(connection.authorizationId)\n if (!sameAuthorizationScope(authorization, input)) {\n throw new ConnectorConnectionStorageError(\n \"authorization_conflict\",\n \"[Sixb] Connector connection references an unavailable authorization.\"\n )\n }\n if (connection.status === \"disconnected\") {\n return {\n connection: structuredClone(connection),\n authorization: structuredClone(authorization),\n ...(authorization.status === \"revocation_pending\"\n ? { revocationPendingAuthorizationId: authorization.id }\n : {}),\n }\n }\n\n const now = this.now()\n const remaining = this.connectedConnectionsForAuthorization(authorization.id).filter(\n (candidate) => candidate.id !== connection.id\n )\n this.assertConnectionCanMove(connection, authorization, remaining.length === 0)\n const disconnected = disconnectConnectionRecord(connection, now)\n this.connections.set(connection.id, disconnected)\n const updatedAuthorization =\n remaining.length === 0\n ? markAuthorizationRevocationPending(authorization, now)\n : authorization\n if (updatedAuthorization !== authorization) {\n this.authorizations.set(authorization.id, updatedAuthorization)\n }\n return {\n connection: structuredClone(disconnected),\n authorization: structuredClone(updatedAuthorization),\n ...(updatedAuthorization.status === \"revocation_pending\" && remaining.length === 0\n ? { revocationPendingAuthorizationId: updatedAuthorization.id }\n : {}),\n }\n }\n\n snapshot(): InMemoryConnectorConnectionStorageSnapshot {\n return {\n attempts: structuredClone(this.attempts),\n connectionRuns: structuredClone(this.connectionRuns),\n authorizations: structuredClone(this.authorizations),\n connections: structuredClone(this.connections),\n }\n }\n\n restore(snapshot: InMemoryConnectorConnectionStorageSnapshot): void {\n replaceMap(this.attempts, snapshot.attempts)\n replaceMap(this.connectionRuns, snapshot.connectionRuns)\n replaceMap(this.authorizations, snapshot.authorizations)\n replaceMap(this.connections, snapshot.connections)\n }\n\n private now(): Date {\n return new Date(this.options.now?.() ?? new Date())\n }\n\n private currentConnectionRun(runId: string): ConnectorConnectionRunRecord | undefined {\n const run = this.connectionRuns.get(runId)\n if (!run || (run.status !== \"waiting\" && run.status !== \"running\")) return run\n\n const now = this.now()\n if (run.expiresAt.getTime() > now.getTime()) return run\n\n if (run.status === \"waiting\" && run.waitingFor === \"provider_authorization\") {\n const attempt = this.findAuthorizationAttemptByConnectionRunId(run.id)\n if (attempt) this.attempts.delete(attempt.id)\n }\n if (run.status === \"waiting\") {\n if (run.kind === \"connect\" && run.waitingFor === \"account_selection\") {\n this.markPendingAuthorizationForCleanup(run.connectorId, run.authorizationId, now)\n }\n const expired = expireConnectionRun(run, now)\n this.connectionRuns.set(run.id, expired)\n return expired\n }\n\n if (run.kind === \"connect\" && run.authorizationId) {\n this.markPendingAuthorizationForCleanup(run.connectorId, run.authorizationId, now)\n }\n const failed = failExpiredProcessingRun(run, now)\n this.connectionRuns.set(run.id, failed)\n return failed\n }\n\n private findConnectionRecord(\n input: GetConnectorConnectionInput\n ): ConnectorConnectionRecord | undefined {\n for (const connection of this.connections.values()) {\n if (\n connection.projectId === input.projectId &&\n connection.connectorId === input.connectorId &&\n connection.owner.type === input.owner.type &&\n connection.slot === input.slot\n ) {\n return connection\n }\n }\n return undefined\n }\n\n private findAuthorizationAttemptByConnectionRunId(\n connectionRunId: string\n ): ConnectorAuthorizationAttemptRecord | undefined {\n for (const attempt of this.attempts.values()) {\n if (attempt.connectionRunId === connectionRunId) return attempt\n }\n return undefined\n }\n\n private connectionRecordsForAuthorization(authorizationId: string): ConnectorConnectionRecord[] {\n return [...this.connections.values()].filter(\n (connection) => connection.authorizationId === authorizationId\n )\n }\n\n private connectedConnectionsForAuthorization(\n authorizationId: string\n ): ConnectorConnectionRecord[] {\n return this.connectionRecordsForAuthorization(authorizationId).filter(\n (connection) => connection.status === \"connected\"\n )\n }\n\n private assertConnectionCanMove(\n _connection: ConnectorConnectionRecord,\n authorization: ConnectorAuthorizationRecord,\n removingLastConnection = true\n ): void {\n const mutation = authorization.credentialMutation\n if (mutation?.kind === \"reauthorization\") {\n throw new ConnectorConnectionStorageError(\n \"authorization_conflict\",\n \"[Sixb] Connections cannot change while their connector authorization is being reauthorized.\"\n )\n }\n if (removingLastConnection && mutation) {\n throw new ConnectorConnectionStorageError(\n \"authorization_conflict\",\n \"[Sixb] The last connector connection cannot be removed while credentials are being mutated.\"\n )\n }\n }\n\n private markPendingAuthorizationForCleanup(\n connectorId: string,\n authorizationId: string,\n now: Date\n ): void {\n const authorization = this.authorizations.get(authorizationId)\n if (\n !authorization ||\n authorization.connectorId !== connectorId ||\n authorization.status !== \"pending_selection\"\n ) {\n return\n }\n this.authorizations.set(\n authorization.id,\n markAuthorizationRevocationPending(authorization, now)\n )\n }\n}\n\nfunction disconnectConnectionRecord(\n connection: ConnectorConnectionRecord,\n now: Date\n): ConnectorConnectionRecord {\n return {\n ...connection,\n status: \"disconnected\",\n disconnectedAt: new Date(now),\n updatedAt: new Date(now),\n }\n}\n\nfunction markAuthorizationRevocationPending(\n authorization: ConnectorAuthorizationRecord,\n now: Date\n): ConnectorAuthorizationRecord {\n if (authorization.status === \"revocation_pending\" || authorization.status === \"revoked\") {\n return authorization\n }\n if (authorization.credentialMutation) {\n throw new ConnectorConnectionStorageError(\n \"authorization_conflict\",\n \"[Sixb] Connector authorization cannot begin revocation while credentials are being mutated.\"\n )\n }\n return {\n ...authorization,\n status: \"revocation_pending\",\n selectionExpiresAt: undefined,\n revision: authorization.revision + 1,\n updatedAt: new Date(now),\n }\n}\n\nfunction safeEqual(left: string, right: string): boolean {\n const leftBytes = Buffer.from(left)\n const rightBytes = Buffer.from(right)\n return leftBytes.length === rightBytes.length && timingSafeEqual(leftBytes, rightBytes)\n}\n\nfunction invalidRun(): ConnectorConnectionStorageError {\n return new ConnectorConnectionStorageError(\n \"run_invalid\",\n \"[Sixb] Connector connection run is invalid, expired, or already used.\"\n )\n}\n\nfunction replaceMap<TKey, TValue>(target: Map<TKey, TValue>, source: Map<TKey, TValue>): void {\n target.clear()\n for (const [key, value] of structuredClone(source)) target.set(key, value)\n}\n\nfunction sameIds(left: readonly string[], right: readonly string[]): boolean {\n const leftSorted = [...left].sort()\n const rightSorted = [...right].sort()\n return (\n leftSorted.length === rightSorted.length &&\n leftSorted.every((value, index) => value === rightSorted[index])\n )\n}\n\nfunction invalidAttempt(): ConnectorConnectionStorageError {\n return new ConnectorConnectionStorageError(\n \"attempt_invalid\",\n \"[Sixb] Connector authorization attempt is invalid, expired, or already used.\"\n )\n}\n\nfunction authorizationConflict(): ConnectorConnectionStorageError {\n return new ConnectorConnectionStorageError(\n \"authorization_conflict\",\n \"[Sixb] Connector connection requires a selectable authorization from the same project and connector.\"\n )\n}\n\nfunction assertPositiveDuration(value: number, name: string): void {\n if (!Number.isFinite(value) || value <= 0) {\n throw new ConnectorConnectionStorageError(\n \"invalid_input\",\n `[Sixb] Connector ${name} must be positive.`\n )\n }\n}\n\nfunction sameAuthorizationScope(\n record: ConnectorAuthorizationRecord | undefined,\n input: { readonly projectId: string; readonly connectorId: string }\n): record is ConnectorAuthorizationRecord {\n return (\n record !== undefined &&\n record.projectId === input.projectId &&\n record.connectorId === input.connectorId\n )\n}\n\nfunction sameConnectionScope(\n record: ConnectorConnectionRecord | undefined,\n input: { readonly projectId: string; readonly connectorId: string }\n): record is ConnectorConnectionRecord {\n return (\n record !== undefined &&\n record.projectId === input.projectId &&\n record.connectorId === input.connectorId\n )\n}\n\nfunction sameConnectionRunScope(\n record: ConnectorConnectionRunRecord | undefined,\n input: { readonly projectId: string; readonly connectorId: string }\n): record is ConnectorConnectionRunRecord {\n return (\n record !== undefined &&\n record.projectId === input.projectId &&\n record.connectorId === input.connectorId\n )\n}\n\nfunction canClaimMutation(\n status: ConnectorAuthorizationRecord[\"status\"],\n kind: ClaimConnectorCredentialMutationInput[\"mutation\"][\"kind\"]\n): boolean {\n if (kind === \"refresh\") return status === \"active\"\n if (kind === \"reauthorization\") {\n return status === \"active\" || status === \"needs_reauthorization\"\n }\n return status !== \"revoked\"\n}\n\nfunction isSelectable(status: ConnectorAuthorizationRecord[\"status\"]): boolean {\n return status === \"pending_selection\" || status === \"active\"\n}\n\nfunction leaseExpiry(now: Date, durationMs: number, deadlineAt: Date): Date {\n return new Date(Math.min(now.getTime() + durationMs, deadlineAt.getTime()))\n}\n\nfunction mutationExpired(record: ConnectorAuthorizationRecord, now: Date): boolean {\n return (\n record.credentialMutation!.expiresAt.getTime() <= now.getTime() ||\n record.credentialMutation!.deadlineAt.getTime() <= now.getTime()\n )\n}\n\nfunction matchesMutation(\n record: ConnectorAuthorizationRecord | undefined,\n input: ConnectorCredentialMutationFence,\n holderId?: string\n): record is ConnectorAuthorizationRecord & {\n readonly credentialMutation: NonNullable<ConnectorAuthorizationRecord[\"credentialMutation\"]>\n} {\n return (\n sameAuthorizationScope(record, input) &&\n record.revision === input.expectedRevision &&\n record.credentialMutation?.id === input.mutationId &&\n (holderId === undefined || record.credentialMutation.holderId === holderId)\n )\n}\n\nfunction stagedCredentials(\n record: ConnectorAuthorizationRecord | undefined,\n input: ConnectorCredentialMutationFence,\n kind: \"refresh\" | \"reauthorization\"\n) {\n if (\n !matchesMutation(record, input) ||\n record.credentialMutation.kind !== kind ||\n record.credentialMutation.phase !== \"result_staged\"\n ) {\n return null\n }\n return record.credentialMutation.stagedCredentials ?? null\n}\n\nfunction applyStagedCredentials(\n record: ConnectorAuthorizationRecord,\n staged: NonNullable<ReturnType<typeof stagedCredentials>>,\n now: Date,\n input: {\n readonly status: \"active\"\n readonly accounts: readonly ConnectorAuthorizationRecord[\"accounts\"][number][]\n }\n): ConnectorAuthorizationRecord {\n return {\n ...record,\n credentials: structuredClone(staged.credentials),\n credentialExpiresAt:\n staged.credentialExpiresAt === undefined ? undefined : new Date(staged.credentialExpiresAt),\n scopes: [...staged.scopes],\n accounts: structuredClone(input.accounts),\n status: input.status,\n selectionExpiresAt: undefined,\n revision: record.revision + 1,\n credentialMutation: undefined,\n updatedAt: now,\n }\n}\n",
12
- "/**\n * Thrown when a storage lookup by primary ID finds no matching object.\n * Carries structured context so callers can discriminate without string parsing.\n */\nexport class ObjectNotFoundError extends Error {\n readonly name = \"ObjectNotFoundError\"\n\n constructor(\n readonly objectTypeId: string,\n readonly primaryId: string,\n readonly context: string\n ) {\n super(`[Sixb] ${context}: ${objectTypeId}:${primaryId}`)\n }\n}\n\nexport class ObjectStorageError extends Error {\n readonly name = \"ObjectStorageError\"\n}\n\nexport type StorageTransactionErrorCode =\n | \"nested_transaction\"\n | \"serialization_failure\"\n | \"transaction_inactive\"\n\nexport interface StorageTransactionErrorOptions {\n readonly cause?: unknown\n readonly code?: StorageTransactionErrorCode\n}\n\nexport class StorageTransactionError extends Error {\n readonly name = \"StorageTransactionError\"\n readonly code?: StorageTransactionErrorCode\n override readonly cause?: unknown\n\n constructor(message: string, options: StorageTransactionErrorOptions = {}) {\n super(message)\n this.code = options.code\n this.cause = options.cause\n }\n}\n\nexport function isStorageSerializationFailure(error: unknown): boolean {\n return error instanceof StorageTransactionError && error.code === \"serialization_failure\"\n}\n",
13
- "/**\n * Transport-agnostic reasons a file upload session operation can fail. Mapping a\n * reason to an HTTP status (or any other transport) is the responsibility of the\n * boundary that surfaces it, not of core.\n */\nexport type FileUploadSessionErrorReason =\n | \"not_found\"\n | \"expired\"\n | \"already_completed\"\n | \"already_aborted\"\n\n/**\n * Error for file upload session invariants and invalid state transitions.\n */\nexport class FileUploadSessionError extends Error {\n readonly name = \"FileUploadSessionError\"\n\n constructor(\n readonly reason: FileUploadSessionErrorReason,\n message: string\n ) {\n super(message)\n }\n}\n",
14
- "import { randomUUID } from \"node:crypto\"\nimport type { Principal } from \"../../auth\"\nimport type { FileUploadSession } from \"./types\"\n\nexport const DEFAULT_FILE_UPLOAD_SESSION_TTL_MS = 60 * 60 * 1000\nexport const DEFAULT_FILE_UPLOAD_TERMINAL_SESSION_TTL_MS = 15 * 60 * 1000\n\nexport function createUploadExpiresAt(now = Date.now()): Date {\n return new Date(now + DEFAULT_FILE_UPLOAD_SESSION_TTL_MS)\n}\n\nexport function createFileUploadId(): string {\n return `upload_${randomUUID().replaceAll(\"-\", \"\")}`\n}\n\nexport function principalKey(principal: Principal): string {\n return `${principal.type}:${principal.id}`\n}\n\nexport function isFileUploadSessionExpired(\n session: FileUploadSession,\n nowMs = Date.now()\n): boolean {\n return session.status === \"pending\" && session.expiresAt.getTime() <= nowMs\n}\n\nexport function shouldDeleteFileUploadSession(session: FileUploadSession, nowMs: number): boolean {\n if (isFileUploadSessionExpired(session, nowMs)) {\n return true\n }\n\n return isTerminalFileUploadSessionExpired(session, nowMs)\n}\n\nexport function isTerminalFileUploadSessionExpired(\n session: FileUploadSession,\n nowMs: number\n): boolean {\n if (session.status === \"pending\") {\n return false\n }\n\n const terminalAt = session.completedAt ?? session.abortedAt\n if (!terminalAt) {\n return false\n }\n\n return terminalAt.getTime() + DEFAULT_FILE_UPLOAD_TERMINAL_SESSION_TTL_MS <= nowMs\n}\n",
15
- "import type { Principal } from \"../../auth\"\nimport type { FileRef, SignedBlobUploadPart } from \"../../blob-storage\"\nimport { FileUploadSessionError } from \"./errors\"\nimport type {\n CreateFileUploadSessionInput,\n FileUploadSession,\n FileUploadSessionStore,\n} from \"./types\"\nimport {\n createFileUploadId,\n isFileUploadSessionExpired,\n isTerminalFileUploadSessionExpired,\n principalKey,\n shouldDeleteFileUploadSession,\n} from \"./utils\"\n\nexport type InMemoryFileUploadSessionsSnapshot = Map<string, FileUploadSession>\n\n/**\n * In-memory {@link FileUploadSessionStore}.\n *\n * Sessions live only in this process's memory: they do not survive a restart and\n * are not shared across instances. Staged/direct-put uploads therefore require a\n * single-instance deployment for now; a durable (Pg/Sqlite) store is a follow-up.\n * Expired sessions are reaped opportunistically on `create` and on demand via\n * `cleanupExpired` (there is no background sweeper).\n */\nexport class InMemoryFileUploadSessions implements FileUploadSessionStore {\n private readonly sessionsById = new Map<string, FileUploadSession>()\n\n snapshot(): InMemoryFileUploadSessionsSnapshot {\n return structuredClone(this.sessionsById)\n }\n\n restore(snapshot: InMemoryFileUploadSessionsSnapshot): void {\n this.sessionsById.clear()\n for (const [id, session] of snapshot) {\n this.sessionsById.set(id, structuredClone(session))\n }\n }\n\n async create(input: CreateFileUploadSessionInput): Promise<FileUploadSession> {\n await this.cleanupExpired()\n\n const session: FileUploadSession = {\n id: input.id ?? createFileUploadId(),\n projectId: input.projectId,\n principalKey: principalKey(input.principal),\n strategy: input.strategy,\n status: \"pending\",\n ...(input.fileName === undefined ? {} : { fileName: input.fileName }),\n ...(input.mediaType === undefined ? {} : { mediaType: input.mediaType }),\n ...(input.logicalPath === undefined ? {} : { logicalPath: input.logicalPath }),\n ...(input.expectedSizeBytes === undefined\n ? {}\n : { expectedSizeBytes: input.expectedSizeBytes }),\n ...(input.expectedDigest === undefined ? {} : { expectedDigest: input.expectedDigest }),\n ...(input.providerUpload === undefined ? {} : { providerUpload: input.providerUpload }),\n signedParts: [],\n createdAt: new Date(),\n expiresAt: input.expiresAt,\n }\n\n this.sessionsById.set(session.id, session)\n return session\n }\n\n async getForPrincipal(uploadId: string, principal: Principal): Promise<FileUploadSession> {\n const session = this.sessionsById.get(uploadId)\n if (!session || session.principalKey !== principalKey(principal)) {\n throw new FileUploadSessionError(\"not_found\", \"File upload session not found.\")\n }\n\n const nowMs = Date.now()\n if (isFileUploadSessionExpired(session, nowMs)) {\n this.sessionsById.delete(uploadId)\n throw new FileUploadSessionError(\"expired\", \"File upload session has expired.\")\n }\n\n if (isTerminalFileUploadSessionExpired(session, nowMs)) {\n this.sessionsById.delete(uploadId)\n throw new FileUploadSessionError(\"not_found\", \"File upload session not found.\")\n }\n\n return session\n }\n\n async markUploaded(uploadId: string, fileRef: FileRef): Promise<FileUploadSession> {\n const session = this.requirePending(uploadId)\n const updated = {\n ...session,\n fileRef,\n }\n this.sessionsById.set(uploadId, updated)\n return updated\n }\n\n async addSignedPart(uploadId: string, part: SignedBlobUploadPart): Promise<FileUploadSession> {\n const session = this.requirePending(uploadId)\n const updated = {\n ...session,\n signedParts: [\n ...session.signedParts.filter((candidate) => candidate.partNumber !== part.partNumber),\n part,\n ].sort((left, right) => left.partNumber - right.partNumber),\n }\n this.sessionsById.set(uploadId, updated)\n return updated\n }\n\n async complete(uploadId: string, fileRef: FileRef): Promise<FileUploadSession> {\n const session = this.requirePending(uploadId)\n const updated = {\n ...session,\n status: \"completed\" as const,\n fileRef,\n completedAt: new Date(),\n }\n this.sessionsById.set(uploadId, updated)\n return updated\n }\n\n async abort(uploadId: string): Promise<FileUploadSession> {\n const session = this.requirePending(uploadId)\n const updated = {\n ...session,\n status: \"aborted\" as const,\n abortedAt: new Date(),\n }\n this.sessionsById.set(uploadId, updated)\n return updated\n }\n\n async cleanupExpired(now = new Date()): Promise<number> {\n let deleted = 0\n for (const [id, session] of this.sessionsById) {\n if (shouldDeleteFileUploadSession(session, now.getTime())) {\n this.sessionsById.delete(id)\n deleted += 1\n }\n }\n\n return deleted\n }\n\n private requirePending(uploadId: string): FileUploadSession {\n const session = this.sessionsById.get(uploadId)\n if (!session) {\n throw new FileUploadSessionError(\"not_found\", \"File upload session not found.\")\n }\n\n if (session.status !== \"pending\") {\n throw new FileUploadSessionError(\n session.status === \"completed\" ? \"already_completed\" : \"already_aborted\",\n `File upload session is already ${session.status}.`\n )\n }\n\n return session\n }\n}\n",
16
- "import { AsyncLocalStorage } from \"node:async_hooks\"\nimport { InMemoryActionRunStorage } from \"../action-runs\"\nimport { type AgentStorage, InMemoryAgentStorage } from \"../agents\"\nimport { type AiAccountingAttribution, type AiCostStorage, InMemoryAiCostStorage } from \"../ai-cost\"\nimport { type AiUsageStorage, InMemoryAiUsageStorage } from \"../ai-usage\"\nimport { type AuthStorage, InMemoryAuthStorage } from \"../auth\"\nimport {\n type ConnectorConnectionStorage,\n InMemoryConnectorConnectionStorage,\n} from \"../connector-connections\"\nimport { StorageTransactionError } from \"../errors\"\nimport { InMemoryExecutionStorage } from \"../executions/in-memory\"\nimport type { ExecutionStorage } from \"../executions/types\"\nimport { type FileUploadSessionStore, InMemoryFileUploadSessions } from \"../file-upload-sessions\"\nimport type { ObjectStorage } from \"../objects\"\nimport { InMemoryObjectStorage } from \"../objects/in-memory\"\nimport type { OntologyStorage } from \"../ontology\"\nimport { InMemoryOntologyStorage } from \"../ontology/in-memory\"\nimport { ProviderMaterializationTransactionLifecycle } from \"../ontology/provider\"\nimport {\n createAgentOperationScope,\n createAuthOperationScope,\n createOntologyOperationScope,\n createOperationScopedFacade,\n createStorageOperationScope,\n createWorkflowRunOperationScope,\n} from \"../operation-scope\"\nimport { InMemoryPipelineRunStorage, type PipelineRunStorage } from \"../pipeline-runs\"\nimport { InMemoryProjectionRunStorage } from \"../projection-runs\"\nimport { InMemoryRulesStorage, type RulesStorage } from \"../rules\"\nimport { InMemorySyncRunStorage, type SyncRunStorage } from \"../sync-runs\"\nimport type { TimeseriesStorage } from \"../timeseries\"\nimport { InMemoryTimeseriesStorage } from \"../timeseries/store\"\nimport { createTransactionStorageProxy, throwNestedStorageTransaction } from \"../transaction\"\nimport type { Storage, StorageTransactionOptions } from \"../types\"\nimport { InMemoryWebhookRunStorage, type WebhookRunStorage } from \"../webhook-runs\"\nimport {\n InMemoryWorkflowInterventionStorage,\n type WorkflowInterventionStorage,\n} from \"../workflow-interventions\"\nimport { InMemoryWorkflowRunStorage, type WorkflowRunStorage } from \"../workflow-runs\"\nimport { registerInMemoryStorageTestingAdapter } from \"./testing\"\n\n/**\n * In-memory {@link Storage} used for dev and tests.\n *\n * Every top-level storage call (\"root operation\") serializes against a single promise-chain lock\n * unless a transaction is already active, which is what gives {@link InMemoryStorage.transaction}\n * snapshot/rollback atomicity. The provider owns one operation scope and applies it to every async\n * root capability. Transaction calls reuse the already-active scope and therefore never reacquire\n * its non-reentrant lock.\n */\nexport interface InMemoryStorageOptions {\n readonly connectorConnections?: {\n /** Storage-authoritative clock override for deterministic development and tests. */\n readonly now?: () => Date\n }\n}\n\nexport class InMemoryStorage implements Storage {\n readonly objects: ObjectStorage\n readonly timeseries: TimeseriesStorage\n readonly ontology: OntologyStorage\n private readonly objectStorage = new InMemoryObjectStorage()\n private readonly timeseriesStorage = new InMemoryTimeseriesStorage()\n private readonly ontologyStorage: InMemoryOntologyStorage\n private readonly authStorage = new InMemoryAuthStorage()\n private readonly executionStorage = new InMemoryExecutionStorage(this.authStorage)\n private readonly agentStorage = new InMemoryAgentStorage(this.executionStorage)\n private readonly aiUsageStorage = new InMemoryAiUsageStorage(this.executionStorage)\n private readonly aiCostStorage = new InMemoryAiCostStorage(this.aiUsageStorage, {\n resolve: (input) => this.resolveAiAccountingAttribution(input),\n })\n private readonly actionRunStorage = new InMemoryActionRunStorage(this.executionStorage)\n private readonly syncRunStorage = new InMemorySyncRunStorage(this.executionStorage)\n private readonly pipelineRunStorage = new InMemoryPipelineRunStorage(this.executionStorage)\n private readonly projectionRunStorage = new InMemoryProjectionRunStorage({\n executions: this.executionStorage,\n })\n private readonly workflowRunStorage = new InMemoryWorkflowRunStorage(this.executionStorage)\n private readonly workflowInterventionStorage = new InMemoryWorkflowInterventionStorage()\n private readonly webhookRunStorage = new InMemoryWebhookRunStorage(this.executionStorage)\n private readonly rulesStorage = new InMemoryRulesStorage()\n private readonly fileUploadSessionStorage = new InMemoryFileUploadSessions()\n private readonly connectorConnectionStorage: InMemoryConnectorConnectionStorage\n readonly auth: AuthStorage\n readonly executions: ExecutionStorage\n readonly agents: AgentStorage\n readonly aiUsage: AiUsageStorage\n readonly aiCosts: AiCostStorage\n readonly actionRuns: InMemoryActionRunStorage\n readonly syncRuns: SyncRunStorage\n readonly pipelineRuns: PipelineRunStorage\n readonly projectionRuns: InMemoryProjectionRunStorage\n readonly workflowRuns: WorkflowRunStorage\n readonly workflowInterventions: WorkflowInterventionStorage\n readonly webhookRuns: WebhookRunStorage\n readonly rules: RulesStorage\n readonly fileUploadSessions: FileUploadSessionStore\n readonly connectorConnections: ConnectorConnectionStorage\n\n constructor(options: InMemoryStorageOptions = {}) {\n this.connectorConnectionStorage = new InMemoryConnectorConnectionStorage(\n options.connectorConnections\n )\n const scope = createStorageOperationScope(\n (run) => this.withStorageOperation(run),\n () => this.assertRootOperationAvailable()\n )\n this.objects = createOperationScopedFacade(this.objectStorage, scope)\n this.timeseries = createOperationScopedFacade(this.timeseriesStorage, scope)\n this.auth = createAuthOperationScope(this.authStorage, scope)\n this.executions = createOperationScopedFacade(this.executionStorage, scope)\n this.agents = createAgentOperationScope(this.agentStorage, scope)\n this.aiUsage = createOperationScopedFacade(this.aiUsageStorage, scope)\n this.aiCosts = createOperationScopedFacade(this.aiCostStorage, scope)\n this.actionRuns = createOperationScopedFacade(this.actionRunStorage, scope)\n this.syncRuns = createOperationScopedFacade(this.syncRunStorage, scope)\n this.pipelineRuns = createOperationScopedFacade(this.pipelineRunStorage, scope)\n this.projectionRuns = createOperationScopedFacade(this.projectionRunStorage, scope)\n this.workflowRuns = createWorkflowRunOperationScope(this.workflowRunStorage, scope)\n this.workflowInterventions = createOperationScopedFacade(\n this.workflowInterventionStorage,\n scope\n )\n this.webhookRuns = createOperationScopedFacade(this.webhookRunStorage, scope)\n this.rules = createOperationScopedFacade(this.rulesStorage, scope)\n this.fileUploadSessions = createOperationScopedFacade(this.fileUploadSessionStorage, scope)\n this.connectorConnections = createOperationScopedFacade(this.connectorConnectionStorage, scope)\n this.ontologyStorage = new InMemoryOntologyStorage(this.objectStorage, this.timeseriesStorage, {\n runRootOperation: async (run) => run(),\n getTransactionToken: () => this.getActiveTransactionToken(),\n getMaterializationLifecycle: () => this.getActiveMaterializationLifecycle(),\n assertSourceMaterializationExecution: (input) =>\n this.projectionRunStorage.assertSourceMaterializationExecutionUnlocked(input),\n executionExists: async (projectId, executionId) =>\n (await this.executionStorage.getById({ projectId, id: executionId })) !== null,\n })\n this.ontology = createOntologyOperationScope(this.ontologyStorage, scope)\n this.ontologyStorage.registerTestingAlias(this.ontology)\n registerInMemoryStorageTestingAdapter(this, { snapshot: () => this.snapshot() })\n }\n\n private async resolveAiAccountingAttribution(input: {\n readonly projectId: string\n readonly executionId: string\n }): Promise<AiAccountingAttribution | undefined> {\n const execution = await this.executionStorage.getById({\n projectId: input.projectId,\n id: input.executionId,\n })\n if (!execution || execution.executor.type !== \"agent\") return undefined\n const directRun = await this.agentStorage.runs.getById({\n projectId: input.projectId,\n id: execution.executor.runId,\n })\n if (directRun) {\n return {\n kind: \"agent\",\n agentId: directRun.agentId,\n agentRunId: directRun.id,\n threadId: directRun.threadId,\n }\n }\n const agentRun = await this.workflowRunStorage.agentNodes.getByNodeRunId({\n projectId: input.projectId,\n nodeRunId: execution.executor.runId,\n })\n if (!agentRun) return undefined\n const node = await this.workflowRunStorage.nodes.getById({\n projectId: input.projectId,\n id: agentRun.nodeRunId,\n })\n if (!node) return undefined\n return {\n kind: \"workflowAgent\",\n agentId: agentRun.agentId,\n nodeRunId: agentRun.nodeRunId,\n workflowId: node.workflowId,\n workflowRunId: node.workflowRunId,\n }\n }\n\n private readonly transactionScope = new AsyncLocalStorage<object>()\n private readonly activeTransactionTokens = new WeakSet<object>()\n private readonly materializationLifecycles = new WeakMap<\n object,\n ProviderMaterializationTransactionLifecycle\n >()\n private transactionTail: Promise<void> = Promise.resolve()\n\n async ping(): Promise<void> {\n await this.withStorageOperation(() => undefined)\n }\n\n /**\n * Run `run` against a transactional view of this storage.\n *\n * Atomicity is achieved by snapshotting every store before the callback and restoring that\n * snapshot if it throws. The snapshot is a full structural clone of the in-memory dataset, so\n * its cost scales with total dataset size rather than changeset size. That is acceptable for the\n * dev/test role of {@link InMemoryStorage} but is the reason it is not intended for large\n * datasets under heavy transactional load — the SQL providers use real database transactions.\n *\n * The `isolation` option is intentionally ignored: the promise-chain lock serializes\n * transactions one at a time, which is at least as strong as `serializable`.\n */\n async transaction<T>(\n run: (tx: Storage) => Promise<T> | T,\n _options: StorageTransactionOptions = {}\n ): Promise<T> {\n const inheritedTransactionToken = this.transactionScope.getStore()\n if (inheritedTransactionToken && this.activeTransactionTokens.has(inheritedTransactionToken)) {\n throwNestedStorageTransaction()\n }\n\n return this.withTransactionLock(async () => {\n const snapshot = this.snapshot()\n let active = true\n const tx = createTransactionStorageProxy(this.createTransactionStorage(), () => active)\n const transactionToken = {}\n const materializationLifecycle = new ProviderMaterializationTransactionLifecycle()\n this.activeTransactionTokens.add(transactionToken)\n this.materializationLifecycles.set(transactionToken, materializationLifecycle)\n\n try {\n const result = await this.transactionScope.run(transactionToken, async () => run(tx))\n materializationLifecycle.assertCommittable()\n return result\n } catch (error) {\n // A failed rollback leaves the store in an unknown state. Surface that explicitly instead\n // of letting the restore error silently replace (mask) the original transaction error.\n try {\n this.restore(snapshot)\n } catch (restoreError) {\n throw new StorageTransactionError(\n `[Sixb] In-memory storage failed to roll back after a transaction error; state may be inconsistent. Original transaction error: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { cause: restoreError }\n )\n }\n throw error\n } finally {\n this.ontologyStorage.completeTransaction(transactionToken)\n materializationLifecycle.deactivate()\n this.activeTransactionTokens.delete(transactionToken)\n active = false\n }\n })\n }\n\n private async withStorageOperation<T>(run: () => Promise<T> | T): Promise<T> {\n this.assertRootOperationAvailable()\n return this.withTransactionLock(async () => run())\n }\n\n private assertRootOperationAvailable(): void {\n if (!this.getActiveTransactionToken()) return\n throw new StorageTransactionError(\n \"[Sixb] Root storage cannot be used inside a transaction callback; use the provided tx storage.\"\n )\n }\n\n private getActiveTransactionToken(): object | null {\n const token = this.transactionScope.getStore()\n return token && this.activeTransactionTokens.has(token) ? token : null\n }\n\n private getActiveMaterializationLifecycle(): ProviderMaterializationTransactionLifecycle | null {\n const token = this.getActiveTransactionToken()\n return token ? (this.materializationLifecycles.get(token) ?? null) : null\n }\n\n private async withTransactionLock<T>(run: () => Promise<T>): Promise<T> {\n const previous = this.transactionTail\n let release!: () => void\n this.transactionTail = new Promise<void>((resolve) => {\n release = resolve\n })\n\n await previous\n try {\n return await run()\n } finally {\n release()\n }\n }\n\n private createTransactionStorage(): Storage {\n return {\n objects: this.objectStorage,\n timeseries: this.timeseriesStorage,\n ontology: this.ontologyStorage,\n auth: this.authStorage,\n executions: this.executionStorage,\n agents: this.agentStorage,\n aiUsage: this.aiUsageStorage,\n aiCosts: this.aiCostStorage,\n actionRuns: this.actionRunStorage,\n syncRuns: this.syncRunStorage,\n pipelineRuns: this.pipelineRunStorage,\n projectionRuns: this.projectionRunStorage,\n workflowRuns: this.workflowRunStorage,\n workflowInterventions: this.workflowInterventionStorage,\n webhookRuns: this.webhookRunStorage,\n rules: this.rulesStorage,\n fileUploadSessions: this.fileUploadSessionStorage,\n connectorConnections: this.connectorConnectionStorage,\n ping: async () => undefined,\n transaction: async <T>(): Promise<T> => {\n throwNestedStorageTransaction()\n },\n }\n }\n\n private snapshot(): InMemoryStorageSnapshot {\n return {\n objects: this.objectStorage.snapshot(),\n timeseries: this.timeseriesStorage.snapshot(),\n ontology: this.ontologyStorage.snapshot(),\n auth: this.authStorage.snapshot(),\n executions: this.executionStorage.snapshot(),\n agents: this.agentStorage.snapshot(),\n aiUsage: this.aiUsageStorage.snapshot(),\n aiCosts: this.aiCostStorage.snapshot(),\n actionRuns: this.actionRunStorage.snapshot(),\n syncRuns: this.syncRunStorage.snapshot(),\n pipelineRuns: this.pipelineRunStorage.snapshot(),\n projectionRuns: this.projectionRunStorage.snapshot(),\n workflowRuns: this.workflowRunStorage.snapshot(),\n workflowInterventions: this.workflowInterventionStorage.snapshot(),\n webhookRuns: this.webhookRunStorage.snapshot(),\n rules: this.rulesStorage.snapshot(),\n fileUploadSessions: this.fileUploadSessionStorage.snapshot(),\n connectorConnections: this.connectorConnectionStorage.snapshot(),\n }\n }\n\n private restore(snapshot: InMemoryStorageSnapshot): void {\n this.objectStorage.restore(snapshot.objects)\n this.timeseriesStorage.restore(snapshot.timeseries)\n this.ontologyStorage.restore(snapshot.ontology)\n this.authStorage.restore(snapshot.auth)\n this.executionStorage.restore(snapshot.executions)\n this.agentStorage.restore(snapshot.agents)\n this.aiUsageStorage.restore(snapshot.aiUsage)\n this.aiCostStorage.restore(snapshot.aiCosts)\n this.actionRunStorage.restore(snapshot.actionRuns)\n this.syncRunStorage.restore(snapshot.syncRuns)\n this.pipelineRunStorage.restore(snapshot.pipelineRuns)\n this.projectionRunStorage.restore(snapshot.projectionRuns)\n this.workflowRunStorage.restore(snapshot.workflowRuns)\n this.workflowInterventionStorage.restore(snapshot.workflowInterventions)\n this.webhookRunStorage.restore(snapshot.webhookRuns)\n this.rulesStorage.restore(snapshot.rules)\n this.fileUploadSessionStorage.restore(snapshot.fileUploadSessions)\n this.connectorConnectionStorage.restore(snapshot.connectorConnections)\n }\n}\n\nexport interface InMemoryStorageSnapshot {\n readonly objects: ReturnType<InMemoryObjectStorage[\"snapshot\"]>\n readonly timeseries: ReturnType<InMemoryTimeseriesStorage[\"snapshot\"]>\n readonly ontology: ReturnType<InMemoryOntologyStorage[\"snapshot\"]>\n readonly auth: ReturnType<InMemoryAuthStorage[\"snapshot\"]>\n readonly executions: ReturnType<InMemoryExecutionStorage[\"snapshot\"]>\n readonly agents: ReturnType<InMemoryAgentStorage[\"snapshot\"]>\n readonly aiUsage: ReturnType<InMemoryAiUsageStorage[\"snapshot\"]>\n readonly aiCosts: ReturnType<InMemoryAiCostStorage[\"snapshot\"]>\n readonly actionRuns: ReturnType<InMemoryActionRunStorage[\"snapshot\"]>\n readonly syncRuns: ReturnType<InMemorySyncRunStorage[\"snapshot\"]>\n readonly pipelineRuns: ReturnType<InMemoryPipelineRunStorage[\"snapshot\"]>\n readonly projectionRuns: ReturnType<InMemoryProjectionRunStorage[\"snapshot\"]>\n readonly workflowRuns: ReturnType<InMemoryWorkflowRunStorage[\"snapshot\"]>\n readonly workflowInterventions: ReturnType<InMemoryWorkflowInterventionStorage[\"snapshot\"]>\n readonly webhookRuns: ReturnType<InMemoryWebhookRunStorage[\"snapshot\"]>\n readonly rules: ReturnType<InMemoryRulesStorage[\"snapshot\"]>\n readonly fileUploadSessions: ReturnType<InMemoryFileUploadSessions[\"snapshot\"]>\n readonly connectorConnections: ReturnType<InMemoryConnectorConnectionStorage[\"snapshot\"]>\n}\n",
17
- "import type { AuthStorage } from \"../auth\"\nimport { ExecutionStorageError } from \"./errors\"\nimport type { CreateExecutionInput, ExecutionRecord, ExecutionStorage } from \"./types\"\nimport {\n cloneExecutionRecord,\n normalizeExecutionRecord,\n validateExecutionRecordReferences,\n} from \"./validation\"\n\ntype RunRootOperation = <T>(run: () => Promise<T> | T) => Promise<T>\n\nconst runDirectly: RunRootOperation = async <T>(run: () => Promise<T> | T): Promise<T> => run()\n\nfunction executionKey(projectId: string, id: string): string {\n return JSON.stringify([projectId, id])\n}\n\nexport class InMemoryExecutionStorage implements ExecutionStorage {\n private readonly rows = new Map<string, ExecutionRecord>()\n private readonly runRootOperation: RunRootOperation\n\n constructor(\n private readonly auth: AuthStorage,\n input: { readonly runRootOperation?: RunRootOperation } = {}\n ) {\n this.runRootOperation = input.runRootOperation ?? runDirectly\n }\n\n snapshot(): InMemoryExecutionStorageSnapshot {\n return structuredClone(this.rows)\n }\n\n restore(snapshot: InMemoryExecutionStorageSnapshot): void {\n this.rows.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.rows.set(key, record)\n }\n }\n\n async create(input: CreateExecutionInput): Promise<ExecutionRecord> {\n return this.runRootOperation(async () => {\n const record = normalizeExecutionRecord(input)\n const key = executionKey(record.projectId, record.id)\n if (this.rows.has(key)) {\n throw new ExecutionStorageError(\n \"duplicate_execution\",\n `[Sixb] Execution '${record.id}' already exists in project '${record.projectId}'.`\n )\n }\n\n await validateExecutionRecordReferences(record, {\n auth: this.auth,\n getExecution: async ({ projectId, id }) => {\n const existing = this.rows.get(executionKey(projectId, id))\n return existing ? cloneExecutionRecord(existing) : null\n },\n })\n\n this.rows.set(key, cloneExecutionRecord(record))\n return cloneExecutionRecord(record)\n })\n }\n\n async getById(params: {\n readonly projectId: string\n readonly id: string\n }): Promise<ExecutionRecord | null> {\n return this.runRootOperation(() => {\n const record = this.rows.get(executionKey(params.projectId, params.id))\n return record ? cloneExecutionRecord(record) : null\n })\n }\n}\n\nexport type InMemoryExecutionStorageSnapshot = Map<string, ExecutionRecord>\n",
18
- "import { compareDecimalValues } from \"../../ontology\"\nimport type { QueryScalarKind } from \"./ir\"\n\n/** Compare two values according to the scalar schema resolved by query validation. */\nexport function compareQueryScalarValues(\n left: unknown,\n right: unknown,\n scalarKind?: QueryScalarKind\n): number {\n if (left === undefined || right === undefined || left === null || right === null) {\n return Number.NaN\n }\n\n if (scalarKind === undefined) return compareRuntimeValues(left, right)\n\n switch (scalarKind) {\n case \"string\":\n case \"uuid\":\n return typeof left === \"string\" && typeof right === \"string\"\n ? compareStrings(left, right)\n : Number.NaN\n case \"boolean\":\n return typeof left === \"boolean\" && typeof right === \"boolean\"\n ? Number(left) - Number(right)\n : Number.NaN\n case \"integer\":\n case \"double\":\n return typeof left === \"number\" && typeof right === \"number\" ? left - right : Number.NaN\n case \"decimal\":\n return typeof left === \"string\" && typeof right === \"string\"\n ? compareDecimalValues(left, right)\n : Number.NaN\n case \"date\":\n case \"timestamp\":\n return compareTemporalValues(left, right)\n }\n}\n\n/** Test equality with the same schema semantics used for ordered comparisons. */\nexport function queryScalarValuesEqual(\n left: unknown,\n right: unknown,\n scalarKind?: QueryScalarKind\n): boolean {\n if (scalarKind === \"decimal\") {\n const comparison = compareQueryScalarValues(left, right, scalarKind)\n return !Number.isNaN(comparison) && comparison === 0\n }\n\n if (scalarKind === \"date\" || scalarKind === \"timestamp\") {\n const comparison = compareTemporalValues(left, right)\n return !Number.isNaN(comparison) && comparison === 0\n }\n\n if (scalarKind !== undefined) return Object.is(left, right)\n return runtimeValuesEqual(left, right)\n}\n\nfunction compareRuntimeValues(left: unknown, right: unknown): number {\n if (typeof left === \"number\" && typeof right === \"number\") return left - right\n if (typeof left === \"string\" && typeof right === \"string\") return compareStrings(left, right)\n if (typeof left === \"boolean\" && typeof right === \"boolean\") {\n return Number(left) - Number(right)\n }\n if (left instanceof Date || right instanceof Date) return compareTemporalValues(left, right)\n return Number.NaN\n}\n\nfunction runtimeValuesEqual(left: unknown, right: unknown): boolean {\n if (left instanceof Date || right instanceof Date) {\n const comparison = compareTemporalValues(left, right)\n return !Number.isNaN(comparison) && comparison === 0\n }\n return Object.is(left, right)\n}\n\nfunction compareTemporalValues(left: unknown, right: unknown): number {\n const leftTime = dateTime(left)\n const rightTime = dateTime(right)\n if (leftTime === null || rightTime === null) return Number.NaN\n return leftTime - rightTime\n}\n\nfunction dateTime(value: unknown): number | null {\n if (value instanceof Date) {\n const time = value.getTime()\n return Number.isNaN(time) ? null : time\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n const time = new Date(value).getTime()\n return Number.isNaN(time) ? null : time\n }\n return null\n}\n\nfunction compareStrings(left: string, right: string): number {\n if (left < right) return -1\n if (left > right) return 1\n return 0\n}\n",
19
- "import type { ObjectLinkCursor, ObjectLinkRow } from \"./types\"\n\nexport type ObjectBatchKey = string & {\n readonly __sixbObjectBatchKey: true\n}\n\nexport type LinkBatchKey = string & {\n readonly __sixbLinkBatchKey: true\n}\n\n/** Collision-safe key for object batch-read results. */\nexport function objectBatchKey(objectTypeId: string, primaryId: string): ObjectBatchKey {\n return JSON.stringify([objectTypeId, primaryId]) as ObjectBatchKey\n}\n\n/** Collision-safe key for outgoing-link batch-read results. */\nexport function linkBatchKey(objectTypeId: string, objectId: string, linkId: string): LinkBatchKey {\n return JSON.stringify([objectTypeId, objectId, linkId]) as LinkBatchKey\n}\n\n/** Canonical storage ordering and cursor for physical links. */\nexport function objectLinkCursor(link: ObjectLinkRow): ObjectLinkCursor {\n return [link.sourceTypeId, link.sourceId, link.linkId, link.targetTypeId, link.targetId]\n}\n\nexport function compareObjectLinkCursors(left: ObjectLinkCursor, right: ObjectLinkCursor): number {\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] < right[index]) return -1\n if (left[index] > right[index]) return 1\n }\n return 0\n}\n\nexport function compareObjectLinks(left: ObjectLinkRow, right: ObjectLinkRow): number {\n return compareObjectLinkCursors(objectLinkCursor(left), objectLinkCursor(right))\n}\n",
20
- "import type { EffectiveLinkSnapshot, EffectiveObjectSnapshot } from \"../../materialization/model\"\nimport type { ObjectQuery, ObjectQueryPredicate, ObjectQuerySortField } from \"../../objects/query\"\nimport { compareQueryScalarValues, queryScalarValuesEqual } from \"../../objects/query/scalar-values\"\nimport type { LinkBatchKey, ObjectBatchKey } from \"./keys\"\nimport {\n compareObjectLinkCursors,\n compareObjectLinks,\n linkBatchKey,\n objectBatchKey,\n objectLinkCursor,\n} from \"./keys\"\nimport type {\n CountObjectsInput,\n CountObjectsResult,\n ExistsObjectsInput,\n ExistsObjectsResult,\n FacetObjectsInput,\n FacetObjectsResult,\n LinkDirection,\n ObjectFacetRequest,\n ObjectFacetResult,\n ObjectLinkRow,\n ObjectQueryCapabilities,\n ObjectRow,\n ObjectStorage,\n QueryObjectLinksInput,\n QueryObjectLinksResult,\n QueryObjectsInput,\n QueryObjectsResult,\n} from \"./types\"\n\nconst IN_MEMORY_OBJECT_QUERY_CAPABILITIES: ObjectQueryCapabilities = {\n queryObjects: true,\n countObjects: true,\n existsObjects: true,\n facetObjects: true,\n nodes: {\n start: true,\n refs: true,\n filter: true,\n text: true,\n vector: true,\n traverse: true,\n set: true,\n sort: true,\n limit: true,\n page: true,\n project: true,\n },\n predicateOps: {\n and: true,\n or: true,\n not: true,\n eq: true,\n neq: true,\n lt: true,\n lte: true,\n gt: true,\n gte: true,\n in: true,\n exists: true,\n contains: true,\n },\n sortKinds: {\n property: true,\n relevance: true,\n },\n traversalDirections: {\n outgoing: true,\n incoming: true,\n },\n setOps: {\n union: true,\n intersect: true,\n subtract: true,\n },\n scalarOperations: {\n string: { equality: true, ordering: true },\n uuid: { equality: true, ordering: true },\n boolean: { equality: true },\n integer: { equality: true, ordering: true },\n double: { equality: true, ordering: true },\n decimal: { equality: true, ordering: true },\n date: { equality: true, ordering: true },\n timestamp: { equality: true, ordering: true },\n },\n limits: {\n totalCount: true,\n stablePageTokens: true,\n },\n}\n\nfunction objectRowKey(projectId: string, objectTypeId: string): string {\n return JSON.stringify([projectId, objectTypeId])\n}\n\nfunction objectRowProjectPrefix(projectId: string): string {\n return `[${JSON.stringify(projectId)},`\n}\n\nfunction compareStrings(left: string, right: string): number {\n if (left < right) return -1\n if (left > right) return 1\n return 0\n}\n\nfunction assertLinkQueryLimit(limit: number): void {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(\"Object link query limit must be a positive safe integer.\")\n }\n}\n\nfunction sourceLinkBucketKey(projectId: string, sourceTypeId: string, sourceId: string): string {\n return JSON.stringify([projectId, sourceTypeId, sourceId])\n}\n\nfunction linkRowKey(linkId: string, targetTypeId: string, targetId: string): string {\n return JSON.stringify([linkId, targetTypeId, targetId])\n}\n\nfunction fullLinkRowKey(row: ObjectLinkRow): string {\n return JSON.stringify([\n row.sourceTypeId,\n row.sourceId,\n row.linkId,\n row.targetTypeId,\n row.targetId,\n ])\n}\n\ntype QueryEntry = {\n row: ObjectRow\n score: number\n order: number\n}\n\ntype QueryEvaluation = {\n entries: QueryEntry[]\n total: number\n hasMore: boolean\n nextPageToken?: string\n}\n\nconst PAGE_TOKEN_PREFIX = \"offset:\"\n\nexport interface InMemoryObjectStorageSnapshot {\n readonly rows: Map<string, Map<string, ObjectRow>>\n readonly links: Map<string, Map<string, ObjectLinkRow>>\n}\n\ninterface InMemoryObjectMaterializerAdapter {\n getExactObjectRow(projectId: string, objectTypeId: string, primaryId: string): ObjectRow | null\n getExactLinkRow(\n projectId: string,\n ref: {\n readonly sourceTypeId: string\n readonly sourceId: string\n readonly linkId: string\n readonly targetTypeId: string\n readonly targetId: string\n }\n ): ObjectLinkRow | null\n applyExactObject(row: EffectiveObjectSnapshot, projectId: string): void\n deleteExactObject(projectId: string, objectTypeId: string, primaryId: string): void\n applyExactLink(row: EffectiveLinkSnapshot, projectId: string): void\n deleteExactLink(row: {\n projectId: string\n sourceTypeId: string\n sourceId: string\n linkId: string\n targetTypeId: string\n targetId: string\n }): void\n visitExactLinks(projectId: string, visit: (row: ObjectLinkRow) => void): void\n visitExactScopeLinks(\n projectId: string,\n sourceTypeId: string,\n sourceId: string,\n linkId: string,\n visit: (row: ObjectLinkRow) => void\n ): void\n}\n\nconst materializerAdapters = new WeakMap<InMemoryObjectStorage, InMemoryObjectMaterializerAdapter>()\n\n/** @internal Exact access for the in-memory ontology provider; not exported from package barrels. */\nexport function getInMemoryObjectMaterializerAdapter(\n storage: InMemoryObjectStorage\n): InMemoryObjectMaterializerAdapter {\n const adapter = materializerAdapters.get(storage)\n if (!adapter) throw new Error(\"[Sixb] In-memory object materializer adapter is unavailable.\")\n return adapter\n}\n\nexport class InMemoryObjectStorage implements ObjectStorage {\n private readonly rows = new Map<string, Map<string, ObjectRow>>()\n private readonly links = new Map<string, Map<string, ObjectLinkRow>>()\n\n constructor() {\n materializerAdapters.set(this, {\n getExactObjectRow: (projectId, objectTypeId, primaryId) =>\n this.getExactObjectRow(projectId, objectTypeId, primaryId),\n getExactLinkRow: (projectId, ref) => this.getExactLinkRow(projectId, ref),\n applyExactObject: (row, projectId) => this.applyExactObject(row, projectId),\n deleteExactObject: (projectId, objectTypeId, primaryId) =>\n this.deleteExactObject(projectId, objectTypeId, primaryId),\n applyExactLink: (row, projectId) => this.applyExactLink(row, projectId),\n deleteExactLink: (row) => this.deleteExactLink(row),\n visitExactLinks: (projectId, visit) => {\n for (const bucket of this.links.values()) {\n for (const row of bucket.values()) {\n if (row.projectId === projectId) visit(structuredClone(row))\n }\n }\n },\n visitExactScopeLinks: (projectId, sourceTypeId, sourceId, linkId, visit) => {\n const bucket = this.links.get(sourceLinkBucketKey(projectId, sourceTypeId, sourceId))\n if (!bucket) return\n for (const row of bucket.values()) {\n if (row.linkId === linkId) visit(structuredClone(row))\n }\n },\n })\n }\n\n snapshot(): InMemoryObjectStorageSnapshot {\n return {\n rows: cloneObjectBuckets(this.rows),\n links: cloneLinkBuckets(this.links),\n }\n }\n\n restore(snapshot: InMemoryObjectStorageSnapshot): void {\n this.rows.clear()\n for (const [key, bucket] of cloneObjectBuckets(snapshot.rows)) {\n this.rows.set(key, bucket)\n }\n\n this.links.clear()\n for (const [key, bucket] of cloneLinkBuckets(snapshot.links)) {\n this.links.set(key, bucket)\n }\n }\n\n private getExactObjectRow(\n projectId: string,\n objectTypeId: string,\n primaryId: string\n ): ObjectRow | null {\n const row = this.rows.get(objectRowKey(projectId, objectTypeId))?.get(primaryId)\n return row ? structuredClone(row) : null\n }\n\n private getExactLinkRow(\n projectId: string,\n ref: {\n readonly sourceTypeId: string\n readonly sourceId: string\n readonly linkId: string\n readonly targetTypeId: string\n readonly targetId: string\n }\n ): ObjectLinkRow | null {\n const row = this.links\n .get(sourceLinkBucketKey(projectId, ref.sourceTypeId, ref.sourceId))\n ?.get(linkRowKey(ref.linkId, ref.targetTypeId, ref.targetId))\n return row ? structuredClone(row) : null\n }\n\n private applyExactObject(row: EffectiveObjectSnapshot, projectId: string): void {\n const bucketId = objectRowKey(projectId, row.ref.objectTypeId)\n const bucket = this.rows.get(bucketId) ?? new Map<string, ObjectRow>()\n this.rows.set(bucketId, bucket)\n bucket.set(row.ref.primaryId, {\n projectId,\n objectTypeId: row.ref.objectTypeId,\n primaryId: row.ref.primaryId,\n properties: structuredClone(row.properties) as Record<string, unknown>,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n version: row.version,\n lastCommitId: row.lastCommitId,\n })\n }\n\n private deleteExactObject(projectId: string, objectTypeId: string, primaryId: string): void {\n this.deleteObjectRow(projectId, objectTypeId, primaryId)\n }\n\n private applyExactLink(row: EffectiveLinkSnapshot, projectId: string): void {\n const bucketKey = sourceLinkBucketKey(\n projectId,\n row.ref.source.objectTypeId,\n row.ref.source.primaryId\n )\n const bucket = this.links.get(bucketKey) ?? new Map<string, ObjectLinkRow>()\n this.links.set(bucketKey, bucket)\n bucket.set(linkRowKey(row.ref.linkId, row.ref.target.objectTypeId, row.ref.target.primaryId), {\n projectId,\n sourceTypeId: row.ref.source.objectTypeId,\n sourceId: row.ref.source.primaryId,\n linkId: row.ref.linkId,\n targetTypeId: row.ref.target.objectTypeId,\n targetId: row.ref.target.primaryId,\n properties: row.properties\n ? (structuredClone(row.properties) as Record<string, unknown>)\n : undefined,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n lastCommitId: row.lastCommitId,\n })\n }\n\n private deleteExactLink(row: {\n projectId: string\n sourceTypeId: string\n sourceId: string\n linkId: string\n targetTypeId: string\n targetId: string\n }): void {\n this.deleteLinkRow(\n row.projectId,\n row.sourceTypeId,\n row.sourceId,\n row.linkId,\n row.targetTypeId,\n row.targetId\n )\n }\n\n queryCapabilities(): ObjectQueryCapabilities {\n return IN_MEMORY_OBJECT_QUERY_CAPABILITIES\n }\n\n async queryObjects(params: QueryObjectsInput): Promise<QueryObjectsResult> {\n const result = this.evaluateObjectQuery(params.projectId, params.query)\n return {\n objects: result.entries.map((entry) => entry.row),\n hasMore: result.hasMore,\n nextPageToken: result.nextPageToken,\n ...(params.includeTotal === false ? {} : { total: result.total }),\n }\n }\n\n async countObjects(params: CountObjectsInput): Promise<CountObjectsResult> {\n return {\n count: this.evaluateObjectQuery(params.projectId, stripOuterRowShape(params.query)).total,\n }\n }\n\n async existsObjects(params: ExistsObjectsInput): Promise<ExistsObjectsResult> {\n return {\n exists:\n this.evaluateObjectQuery(params.projectId, stripOuterRowShape(params.query)).total > 0,\n }\n }\n\n async facetObjects(params: FacetObjectsInput): Promise<FacetObjectsResult> {\n const result = this.evaluateObjectQuery(params.projectId, stripOuterRowShape(params.query))\n return {\n facets: buildFacetResults(\n result.entries.map((entry) => entry.row),\n params.facets\n ),\n }\n }\n\n private evaluateObjectQuery(projectId: string, query: ObjectQuery): QueryEvaluation {\n switch (query.kind) {\n case \"start\":\n return this.evaluateStart(projectId, query.objectTypeId)\n case \"refs\":\n return this.evaluateRefs(projectId, query.refs)\n case \"filter\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n const entries = input.entries.filter((entry) =>\n matchesPredicate(entry.row, query.predicate)\n )\n return completeEvaluation(entries)\n }\n case \"text\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n const scoredEntries = input.entries.flatMap((entry) => {\n const score = textScore(entry.row, query.query, query.fields, query.fieldsByObjectType)\n return score > 0 ? [{ ...entry, score: entry.score + score }] : []\n })\n return completeEvaluation(scoredEntries)\n }\n case \"vector\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n const scoredEntries = input.entries.flatMap((entry) => {\n const score = vectorSimilarity(entry.row.properties[query.propertyId], query.vector)\n return score === null ? [] : [{ ...entry, score: entry.score + score }]\n })\n scoredEntries.sort(compareEntriesByRelevance)\n const limit = Math.max(0, query.k)\n return {\n entries: scoredEntries.slice(0, limit),\n total: scoredEntries.length,\n hasMore: limit < scoredEntries.length,\n }\n }\n case \"traverse\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n const entries =\n query.direction === \"outgoing\"\n ? this.traverseOutgoing(projectId, input.entries, query.linkId)\n : this.traverseIncoming(\n projectId,\n input.entries,\n query.linkId,\n query.sourceObjectTypeId\n )\n return completeEvaluation(entries)\n }\n case \"set\":\n return this.evaluateSet(projectId, query.op, query.inputs)\n case \"sort\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n return {\n ...input,\n entries: sortEntries(input.entries, query.fields),\n }\n }\n case \"limit\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n const limit = Math.max(0, query.limit)\n return {\n entries: input.entries.slice(0, limit),\n total: input.entries.length,\n hasMore: limit < input.entries.length,\n }\n }\n case \"page\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n const offset = decodePageOffset(query.pageToken)\n const pageSize = Math.max(0, query.pageSize)\n const nextOffset = offset + pageSize\n const hasMore = pageSize > 0 && nextOffset < input.entries.length\n return {\n entries: input.entries.slice(offset, nextOffset),\n total: input.entries.length,\n hasMore,\n nextPageToken: hasMore ? encodePageOffset(nextOffset) : undefined,\n }\n }\n case \"project\": {\n const input = this.evaluateObjectQuery(projectId, query.input)\n if (!query.properties) return input\n const properties = query.properties\n return {\n ...input,\n entries: input.entries.map((entry) => ({\n ...entry,\n row: projectRow(entry.row, properties),\n })),\n }\n }\n case \"expand\":\n // `expand` is output-shaping and is gated off by the planner in this\n // slice (and stripped before aggregates run), so the in-memory engine\n // should never receive one. Link hydration lands in a later slice.\n throw new Error(\"[Sixb] In-memory object storage does not support 'expand' execution yet\")\n }\n }\n\n private evaluateStart(projectId: string, objectTypeId: string): QueryEvaluation {\n const bucket = this.rows.get(objectRowKey(projectId, objectTypeId))\n const entries = [...(bucket?.values() ?? [])].map((row, index) => ({\n row,\n score: 0,\n order: index,\n }))\n return completeEvaluation(entries)\n }\n\n private evaluateRefs(\n projectId: string,\n refs: readonly { objectTypeId: string; primaryId: string }[]\n ): QueryEvaluation {\n const seen = new Set<string>()\n const entries = refs\n .flatMap((ref) => {\n const key = JSON.stringify([ref.objectTypeId, ref.primaryId])\n if (seen.has(key)) return []\n seen.add(key)\n const row = this.rows.get(objectRowKey(projectId, ref.objectTypeId))?.get(ref.primaryId)\n return row ? [row] : []\n })\n .sort(\n (left, right) =>\n compareStrings(left.objectTypeId, right.objectTypeId) ||\n compareStrings(left.primaryId, right.primaryId)\n )\n .map((row, order) => ({ row, score: 0, order }))\n\n return completeEvaluation(entries)\n }\n\n private evaluateSet(\n projectId: string,\n op: \"union\" | \"intersect\" | \"subtract\",\n inputs: readonly ObjectQuery[]\n ): QueryEvaluation {\n const evaluations = inputs.map((input) => this.evaluateObjectQuery(projectId, input))\n const first = evaluations[0]\n if (!first) return completeEvaluation([])\n\n if (op === \"union\") {\n const entriesByKey = new Map<string, QueryEntry>()\n for (const evaluation of evaluations) {\n for (const entry of evaluation.entries) {\n upsertEntry(entriesByKey, entry)\n }\n }\n return completeEvaluation([...entriesByKey.values()])\n }\n\n if (op === \"intersect\") {\n const otherKeySets = evaluations\n .slice(1)\n .map((evaluation) => new Set(evaluation.entries.map((entry) => rowIdentityKey(entry.row))))\n const entries = first.entries.filter((entry) => {\n const key = rowIdentityKey(entry.row)\n return otherKeySets.every((keys) => keys.has(key))\n })\n return completeEvaluation(entries)\n }\n\n const subtractKeys = new Set(\n evaluations\n .slice(1)\n .flatMap((evaluation) => evaluation.entries.map((entry) => rowIdentityKey(entry.row)))\n )\n return completeEvaluation(\n first.entries.filter((entry) => !subtractKeys.has(rowIdentityKey(entry.row)))\n )\n }\n\n private traverseOutgoing(\n projectId: string,\n entries: readonly QueryEntry[],\n linkId: string\n ): QueryEntry[] {\n const resultsByKey = new Map<string, QueryEntry>()\n\n entries.forEach((entry, index) => {\n const bucket = this.links.get(\n sourceLinkBucketKey(projectId, entry.row.objectTypeId, entry.row.primaryId)\n )\n if (!bucket) return\n\n for (const link of bucket.values()) {\n if (link.linkId !== linkId) continue\n const target = this.rows.get(objectRowKey(projectId, link.targetTypeId))?.get(link.targetId)\n if (!target) continue\n upsertEntry(resultsByKey, {\n row: target,\n score: entry.score,\n order: entry.order + index / 1_000_000,\n })\n }\n })\n\n return [...resultsByKey.values()]\n }\n\n private traverseIncoming(\n projectId: string,\n entries: readonly QueryEntry[],\n linkId: string,\n sourceObjectTypeId?: string\n ): QueryEntry[] {\n const inputEntriesByTarget = new Map(entries.map((entry) => [rowIdentityKey(entry.row), entry]))\n const resultsByKey = new Map<string, QueryEntry>()\n\n for (const bucket of this.links.values()) {\n for (const link of bucket.values()) {\n if (link.projectId !== projectId || link.linkId !== linkId) continue\n if (sourceObjectTypeId !== undefined && link.sourceTypeId !== sourceObjectTypeId) continue\n const targetEntry = inputEntriesByTarget.get(\n rowIdentityKeyParts(link.targetTypeId, link.targetId)\n )\n if (!targetEntry) continue\n\n const source = this.rows.get(objectRowKey(projectId, link.sourceTypeId))?.get(link.sourceId)\n if (!source) continue\n upsertEntry(resultsByKey, {\n row: source,\n score: targetEntry.score,\n order: targetEntry.order,\n })\n }\n }\n\n return [...resultsByKey.values()]\n }\n\n /**\n * Reads return the *live* stored row by reference (the SQL providers detach a copy via JSON\n * round-trip). Callers must treat read results as immutable: mutating a returned row mutates the\n * store in place — including after the transaction that read it has completed, which escapes the\n * transaction guard. Internal call sites (e.g. the EditBatch planner) already copy before\n * mutating; external callers must do the same.\n */\n async getByPrimaryId(params: {\n projectId: string\n objectTypeId: string\n primaryId: string\n }): Promise<ObjectRow | null> {\n const bucket = this.rows.get(objectRowKey(params.projectId, params.objectTypeId))\n if (!bucket) return null\n return bucket.get(params.primaryId) ?? null\n }\n\n async listLinks(params: {\n projectId: string\n objectTypeId: string\n objectId: string\n linkId?: string\n direction?: LinkDirection\n }): Promise<readonly ObjectLinkRow[]> {\n const direction = params.direction ?? \"outgoing\"\n const matches = (row: ObjectLinkRow) => !params.linkId || row.linkId === params.linkId\n const rows: ObjectLinkRow[] = []\n\n if (direction === \"outgoing\" || direction === \"both\") {\n const bucket = this.links.get(\n sourceLinkBucketKey(params.projectId, params.objectTypeId, params.objectId)\n )\n if (bucket) rows.push(...[...bucket.values()].filter(matches))\n }\n\n if (direction === \"incoming\" || direction === \"both\") {\n for (const bucket of this.links.values()) {\n for (const row of bucket.values()) {\n if (\n row.projectId === params.projectId &&\n row.targetTypeId === params.objectTypeId &&\n row.targetId === params.objectId &&\n matches(row)\n ) {\n rows.push(row)\n }\n }\n }\n }\n\n if (direction !== \"both\") return rows\n return [...new Map(rows.map((row) => [fullLinkRowKey(row), row])).values()]\n }\n\n async getByPrimaryIdBatch(params: {\n projectId: string\n items: readonly { objectTypeId: string; primaryId: string }[]\n }): Promise<Map<ObjectBatchKey, ObjectRow>> {\n const result = new Map<ObjectBatchKey, ObjectRow>()\n for (const item of params.items) {\n const row = await this.getByPrimaryId({\n projectId: params.projectId,\n objectTypeId: item.objectTypeId,\n primaryId: item.primaryId,\n })\n if (row) {\n result.set(objectBatchKey(item.objectTypeId, item.primaryId), row)\n }\n }\n return result\n }\n\n async listLinksBatch(params: {\n projectId: string\n items: readonly { objectTypeId: string; objectId: string; linkId: string }[]\n }): Promise<Map<LinkBatchKey, ObjectLinkRow[]>> {\n const result = new Map<LinkBatchKey, ObjectLinkRow[]>()\n for (const item of params.items) {\n const rows = await this.listLinks({\n projectId: params.projectId,\n objectTypeId: item.objectTypeId,\n objectId: item.objectId,\n linkId: item.linkId,\n })\n if (rows.length > 0) {\n result.set(linkBatchKey(item.objectTypeId, item.objectId, item.linkId), [...rows])\n }\n }\n return result\n }\n\n async queryLinks(params: QueryObjectLinksInput): Promise<QueryObjectLinksResult> {\n assertLinkQueryLimit(params.limit)\n if (params.objectRefs.length === 0 || params.endpointObjectTypeIds?.length === 0) {\n return { links: [], hasMore: false }\n }\n\n const allowedTypes = params.endpointObjectTypeIds\n ? new Set(params.endpointObjectTypeIds)\n : undefined\n const deduped = new Map<string, ObjectLinkRow>()\n for (const object of params.objectRefs) {\n const rows = await this.listLinks({\n projectId: params.projectId,\n objectTypeId: object.objectTypeId,\n objectId: object.primaryId,\n direction: params.direction,\n ...(params.linkId === undefined ? {} : { linkId: params.linkId }),\n })\n for (const row of rows) {\n if (\n allowedTypes &&\n (!allowedTypes.has(row.sourceTypeId) || !allowedTypes.has(row.targetTypeId))\n ) {\n continue\n }\n if (params.after && compareObjectLinkCursors(objectLinkCursor(row), params.after) <= 0) {\n continue\n }\n deduped.set(fullLinkRowKey(row), row)\n }\n }\n\n const rows = [...deduped.values()].sort(compareObjectLinks).slice(0, params.limit + 1)\n return { links: rows.slice(0, params.limit), hasMore: rows.length > params.limit }\n }\n\n async listIncidentLinksBatch(params: {\n projectId: string\n items: readonly { objectTypeId: string; objectId: string }[]\n }): Promise<readonly ObjectLinkRow[]> {\n const deduped = new Map<string, ObjectLinkRow>()\n for (const item of params.items) {\n const rows = await this.listLinks({\n projectId: params.projectId,\n objectTypeId: item.objectTypeId,\n objectId: item.objectId,\n direction: \"both\",\n })\n for (const row of rows) {\n deduped.set(fullLinkRowKey(row), row)\n }\n }\n return [...deduped.values()]\n }\n\n async listByPrimaryIdPage(params: {\n projectId: string\n objectTypeId: string\n afterPrimaryId?: string\n limit: number\n }): Promise<{ objects: readonly ObjectRow[]; nextPrimaryId?: string }> {\n assertReconciliationPageLimit(params.limit)\n const bucket = this.rows.get(objectRowKey(params.projectId, params.objectTypeId))\n const rows = [...(bucket?.values() ?? [])]\n .filter(\n (row) => !params.afterPrimaryId || compareStrings(row.primaryId, params.afterPrimaryId) > 0\n )\n .sort((left, right) => compareStrings(left.primaryId, right.primaryId))\n .slice(0, params.limit + 1)\n const hasMore = rows.length > params.limit\n const objects = rows.slice(0, params.limit).map((row) => structuredClone(row))\n const last = objects.at(-1)\n return {\n objects,\n ...(hasMore && last ? { nextPrimaryId: last.primaryId } : {}),\n }\n }\n\n async list(params: {\n projectId: string\n objectTypeId?: string | readonly string[]\n primaryIdPrefix?: string\n primaryIdSuffix?: string\n updatedAfter?: Date\n updatedBefore?: Date\n createdAfter?: Date\n createdBefore?: Date\n limit?: number\n offset?: number\n orderBy?: \"createdAt\" | \"updatedAt\" | \"primaryId\"\n order?: \"asc\" | \"desc\"\n }): Promise<{ objects: readonly ObjectRow[]; hasMore: boolean; total: number }> {\n let allRows: ObjectRow[] = []\n\n if (params.objectTypeId) {\n const typeIds = Array.isArray(params.objectTypeId)\n ? params.objectTypeId\n : [params.objectTypeId]\n for (const typeId of typeIds) {\n const bucket = this.rows.get(objectRowKey(params.projectId, typeId))\n if (bucket) {\n allRows.push(...bucket.values())\n }\n }\n } else {\n for (const [key, bucket] of this.rows) {\n if (key.startsWith(objectRowProjectPrefix(params.projectId))) {\n allRows.push(...bucket.values())\n }\n }\n }\n\n const {\n primaryIdPrefix,\n primaryIdSuffix,\n updatedAfter,\n updatedBefore,\n createdAfter,\n createdBefore,\n } = params\n if (\n primaryIdPrefix ||\n primaryIdSuffix ||\n updatedAfter ||\n updatedBefore ||\n createdAfter ||\n createdBefore\n ) {\n allRows = allRows.filter(\n (row) =>\n (!primaryIdPrefix || row.primaryId.startsWith(primaryIdPrefix)) &&\n (!primaryIdSuffix || row.primaryId.endsWith(primaryIdSuffix)) &&\n (!updatedAfter || row.updatedAt >= updatedAfter) &&\n (!updatedBefore || row.updatedAt <= updatedBefore) &&\n (!createdAfter || row.createdAt >= createdAfter) &&\n (!createdBefore || row.createdAt <= createdBefore)\n )\n }\n\n const total = allRows.length\n\n const offset = params.offset ?? 0\n const limit = params.limit ?? 50\n if (limit === 0) return { objects: [], hasMore: offset < total, total }\n\n const orderBy = params.orderBy ?? \"updatedAt\"\n const order = params.order ?? \"desc\"\n\n allRows.sort((a, b) => {\n let comparison = 0\n switch (orderBy) {\n case \"primaryId\":\n comparison = a.primaryId.localeCompare(b.primaryId)\n break\n case \"createdAt\":\n comparison = a.createdAt.getTime() - b.createdAt.getTime()\n break\n default:\n comparison = a.updatedAt.getTime() - b.updatedAt.getTime()\n break\n }\n return order === \"desc\" ? -comparison : comparison\n })\n\n const objects = allRows.slice(offset, offset + limit)\n const hasMore = offset + limit < total\n\n return { objects, hasMore, total }\n }\n\n private deleteObjectRow(projectId: string, objectTypeId: string, primaryId: string): void {\n const bucket = this.rows.get(objectRowKey(projectId, objectTypeId))\n bucket?.delete(primaryId)\n }\n\n private deleteLinkRow(\n projectId: string,\n sourceTypeId: string,\n sourceId: string,\n linkId: string,\n targetTypeId: string,\n targetId: string\n ): void {\n const bucket = this.links.get(sourceLinkBucketKey(projectId, sourceTypeId, sourceId))\n bucket?.delete(linkRowKey(linkId, targetTypeId, targetId))\n }\n}\n\nfunction assertReconciliationPageLimit(limit: number): void {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new Error(\"Object reconciliation page limit must be a positive safe integer.\")\n }\n}\n\nfunction cloneObjectBuckets(\n rows: Map<string, Map<string, ObjectRow>>\n): Map<string, Map<string, ObjectRow>> {\n const clone = new Map<string, Map<string, ObjectRow>>()\n for (const [key, bucket] of rows) {\n clone.set(\n key,\n new Map([...bucket.entries()].map(([primaryId, row]) => [primaryId, structuredClone(row)]))\n )\n }\n return clone\n}\n\nfunction cloneLinkBuckets(\n links: Map<string, Map<string, ObjectLinkRow>>\n): Map<string, Map<string, ObjectLinkRow>> {\n const clone = new Map<string, Map<string, ObjectLinkRow>>()\n for (const [key, bucket] of links) {\n clone.set(\n key,\n new Map([...bucket.entries()].map(([linkId, row]) => [linkId, structuredClone(row)]))\n )\n }\n return clone\n}\n\nfunction completeEvaluation(entries: QueryEntry[]): QueryEvaluation {\n return {\n entries,\n total: entries.length,\n hasMore: false,\n }\n}\n\nfunction matchesPredicate(row: ObjectRow, predicate: ObjectQueryPredicate): boolean {\n switch (predicate.op) {\n case \"and\":\n return predicate.items.every((item) => matchesPredicate(row, item))\n case \"or\":\n return predicate.items.some((item) => matchesPredicate(row, item))\n case \"not\":\n return !matchesPredicate(row, predicate.item)\n case \"eq\":\n return queryScalarValuesEqual(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n )\n case \"neq\":\n return !queryScalarValuesEqual(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n )\n case \"lt\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) < 0\n )\n case \"lte\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) <= 0\n )\n case \"gt\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) > 0\n )\n case \"gte\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) >= 0\n )\n case \"in\":\n return predicate.values.some((value) =>\n queryScalarValuesEqual(row.properties[predicate.propertyId], value, predicate.scalarKind)\n )\n case \"exists\": {\n const exists =\n Object.hasOwn(row.properties, predicate.propertyId) &&\n row.properties[predicate.propertyId] !== undefined\n return predicate.value ? exists : !exists\n }\n case \"contains\":\n return containsValue(row.properties[predicate.propertyId], predicate.value)\n }\n}\n\nfunction containsValue(actual: unknown, expected: unknown): boolean {\n if (typeof actual === \"string\" && typeof expected === \"string\") {\n return actual.includes(expected)\n }\n\n if (Array.isArray(actual)) {\n return actual.some((item) => queryScalarValuesEqual(item, expected))\n }\n\n if (isPlainObject(actual) && typeof expected === \"string\") {\n return Object.hasOwn(actual, expected)\n }\n\n return false\n}\n\nfunction textScore(\n row: ObjectRow,\n query: string,\n fields: readonly string[] | undefined,\n fieldsByObjectType: Readonly<Record<string, readonly string[]>> | undefined\n): number {\n const terms = tokenize(query)\n if (terms.length === 0) return 0\n\n const scopedFields = fields ?? fieldsByObjectType?.[row.objectTypeId]\n const values = fields\n ? fields.flatMap((field) => collectTextValues(row.properties[field]))\n : scopedFields\n ? scopedFields.flatMap((field) => collectTextValues(row.properties[field]))\n : [row.primaryId, ...Object.values(row.properties).flatMap(collectTextValues)]\n const haystack = values.join(\" \").toLowerCase()\n if (!terms.every((term) => haystack.includes(term))) return 0\n\n const phrase = query.trim().toLowerCase()\n const phraseBoost = phrase.length > 0 && haystack.includes(phrase) ? terms.length : 0\n return terms.reduce((score, term) => score + countOccurrences(haystack, term), phraseBoost)\n}\n\nfunction tokenize(query: string): string[] {\n return query\n .trim()\n .toLowerCase()\n .split(/\\s+/)\n .filter((term) => term.length > 0)\n}\n\nfunction collectTextValues(value: unknown): string[] {\n if (typeof value === \"string\") return [value]\n if (Array.isArray(value)) return value.flatMap(collectTextValues)\n return []\n}\n\nfunction countOccurrences(value: string, needle: string): number {\n if (!needle) return 0\n let count = 0\n let index = value.indexOf(needle)\n while (index !== -1) {\n count += 1\n index = value.indexOf(needle, index + needle.length)\n }\n return count\n}\n\nfunction vectorSimilarity(actual: unknown, expected: readonly number[]): number | null {\n if (!Array.isArray(actual) || actual.length !== expected.length || actual.length === 0) {\n return null\n }\n\n let dot = 0\n let actualNorm = 0\n let expectedNorm = 0\n for (let index = 0; index < expected.length; index += 1) {\n const actualValue = actual[index]\n const expectedValue = expected[index]\n if (\n typeof actualValue !== \"number\" ||\n typeof expectedValue !== \"number\" ||\n !Number.isFinite(actualValue) ||\n !Number.isFinite(expectedValue)\n ) {\n return null\n }\n\n dot += actualValue * expectedValue\n actualNorm += actualValue * actualValue\n expectedNorm += expectedValue * expectedValue\n }\n\n if (actualNorm === 0 || expectedNorm === 0) return null\n return dot / (Math.sqrt(actualNorm) * Math.sqrt(expectedNorm))\n}\n\nfunction sortEntries(\n entries: readonly QueryEntry[],\n fields: readonly ObjectQuerySortField[]\n): QueryEntry[] {\n return [...entries].sort((left, right) => {\n for (const field of fields) {\n const comparison = compareSortField(left, right, field)\n if (comparison !== 0) return comparison\n }\n return (\n left.order - right.order || rowIdentityKey(left.row).localeCompare(rowIdentityKey(right.row))\n )\n })\n}\n\nfunction compareSortField(\n left: QueryEntry,\n right: QueryEntry,\n field: ObjectQuerySortField\n): number {\n if (field.kind === \"relevance\") {\n const direction = field.direction ?? \"desc\"\n const comparison = right.score - left.score\n return direction === \"desc\" ? comparison : -comparison\n }\n\n const leftValue = left.row.properties[field.propertyId]\n const rightValue = right.row.properties[field.propertyId]\n const leftMissing = leftValue === undefined || leftValue === null\n const rightMissing = rightValue === undefined || rightValue === null\n if (leftMissing && rightMissing) return 0\n if (leftMissing) return 1\n if (rightMissing) return -1\n\n const comparison = compareQueryScalarValues(leftValue, rightValue, field.scalarKind)\n if (Number.isNaN(comparison)) return 0\n return field.direction === \"desc\" ? -comparison : comparison\n}\n\nfunction compareEntriesByRelevance(left: QueryEntry, right: QueryEntry): number {\n return (\n right.score - left.score || rowIdentityKey(left.row).localeCompare(rowIdentityKey(right.row))\n )\n}\n\nfunction projectRow(row: ObjectRow, properties: readonly string[]): ObjectRow {\n const projected: Record<string, unknown> = {}\n for (const propertyId of properties) {\n if (Object.hasOwn(row.properties, propertyId)) {\n projected[propertyId] = row.properties[propertyId]\n }\n }\n return {\n ...row,\n properties: projected,\n }\n}\n\nfunction stripOuterRowShape(query: ObjectQuery): ObjectQuery {\n switch (query.kind) {\n case \"limit\":\n case \"page\":\n case \"project\":\n case \"sort\":\n // `expand` is output-shaping: aggregates ignore it (it never changes which\n // objects match).\n case \"expand\":\n return stripOuterRowShape(query.input)\n default:\n return query\n }\n}\n\nfunction buildFacetResults(\n rows: readonly ObjectRow[],\n facets: readonly ObjectFacetRequest[]\n): ObjectFacetResult[] {\n return facets.map((facet) => ({\n propertyId: facet.propertyId,\n buckets: buildFacetBuckets(rows, facet),\n }))\n}\n\nfunction buildFacetBuckets(\n rows: readonly ObjectRow[],\n facet: ObjectFacetRequest\n): ObjectFacetResult[\"buckets\"] {\n const buckets = new Map<string, { value: unknown; count: number }>()\n\n for (const row of rows) {\n if (!Object.hasOwn(row.properties, facet.propertyId)) continue\n const value = row.properties[facet.propertyId]\n if (value === undefined) continue\n const key = facetValueKey(value)\n const existing = buckets.get(key)\n if (existing) {\n existing.count += 1\n } else {\n buckets.set(key, { value, count: 1 })\n }\n }\n\n return [...buckets.values()]\n .sort(\n (left, right) =>\n right.count - left.count ||\n facetValueSortKey(left.value).localeCompare(facetValueSortKey(right.value))\n )\n .slice(0, facet.limit)\n}\n\nfunction facetValueKey(value: unknown): string {\n return JSON.stringify(value) ?? String(value)\n}\n\nfunction facetValueSortKey(value: unknown): string {\n return JSON.stringify(value) ?? String(value)\n}\n\nfunction rowIdentityKey(row: ObjectRow): string {\n return rowIdentityKeyParts(row.objectTypeId, row.primaryId)\n}\n\nfunction rowIdentityKeyParts(objectTypeId: string, primaryId: string): string {\n return objectBatchKey(objectTypeId, primaryId)\n}\n\nfunction upsertEntry(entriesByKey: Map<string, QueryEntry>, entry: QueryEntry): void {\n const key = rowIdentityKey(entry.row)\n const existing = entriesByKey.get(key)\n if (!existing) {\n entriesByKey.set(key, entry)\n return\n }\n\n if (entry.score > existing.score) {\n entriesByKey.set(key, {\n ...existing,\n score: entry.score,\n })\n }\n}\n\nfunction encodePageOffset(offset: number): string {\n return `${PAGE_TOKEN_PREFIX}${offset}`\n}\n\nfunction decodePageOffset(token: string | undefined): number {\n if (!token) return 0\n if (!token.startsWith(PAGE_TOKEN_PREFIX)) {\n throw new Error(\"[Sixb] Invalid object query page token\")\n }\n\n const offset = Number(token.slice(PAGE_TOKEN_PREFIX.length))\n if (!Number.isInteger(offset) || offset < 0) {\n throw new Error(\"[Sixb] Invalid object query page token\")\n }\n return offset\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n",
21
- "import { MaterializationValidationError } from \"../../../materialization/errors\"\nimport type {\n LinkSlotOverride,\n OntologyMaterializationOrigin,\n} from \"../../../materialization/model\"\nimport type { OntologyCommitOriginSelector, OntologyCommitRecord } from \"../commits\"\nimport type {\n MaterializationWorkRecord,\n StoredLinkOverride,\n StoredLinkSlotOverride,\n StoredObjectOverride,\n} from \"../materializations\"\nimport type { OntologyOutboxRecord } from \"../outbox\"\nimport type { OntologySourceRecord, StageSourceAssertion } from \"../sources\"\n\nexport interface InMemorySourceMaterialization extends OntologySourceRecord {\n readonly rowsByEntity: Map<string, StageSourceAssertion>\n readonly rootOrdinals: Map<string, number>\n readonly ordinalRoots: Map<number, string>\n}\n\nexport interface InMemoryStoredObjectOverride extends StoredObjectOverride {\n readonly projectId: string\n}\n\nexport interface InMemoryStoredLinkOverride extends StoredLinkOverride {\n readonly projectId: string\n}\n\nexport interface InMemoryStoredLinkSlotOverride extends Omit<StoredLinkSlotOverride, \"value\"> {\n readonly projectId: string\n readonly value: LinkSlotOverride\n}\n\nexport interface InMemoryOntologyState {\n readonly commitsById: Map<string, OntologyCommitRecord>\n readonly commitIdByIdempotency: Map<string, string>\n readonly commitIdByOrigin: Map<string, string>\n readonly sourceMaterializations: Map<string, InMemorySourceMaterialization>\n readonly objectOverrides: Map<string, InMemoryStoredObjectOverride>\n readonly linkOverrides: Map<string, InMemoryStoredLinkOverride>\n readonly linkSlotOverrides: Map<string, InMemoryStoredLinkSlotOverride>\n readonly outbox: Map<string, OntologyOutboxRecord>\n}\n\n/** @internal Test-only failure injection for the in-memory ontology provider. */\nexport interface InMemoryOntologyStorageTestHooks {\n readonly beforeRead?: (boundary: string) => void\n readonly beforeWrite?: (boundary: string, ordinal: number) => void\n readonly observeBuffer?: (boundary: string, rows: number) => void\n readonly observeWork?: (records: readonly MaterializationWorkRecord[]) => void\n}\n\nexport function createInMemoryOntologyState(): InMemoryOntologyState {\n return {\n commitsById: new Map(),\n commitIdByIdempotency: new Map(),\n commitIdByOrigin: new Map(),\n sourceMaterializations: new Map(),\n objectOverrides: new Map(),\n linkOverrides: new Map(),\n linkSlotOverrides: new Map(),\n outbox: new Map(),\n }\n}\n\nexport function projectEntityKey(projectId: string, entityKey: string): string {\n return JSON.stringify([projectId, entityKey])\n}\n\nexport function sourceMaterializationKey(\n projectId: string,\n sourceId: string,\n materializationId: string\n): string {\n return JSON.stringify([projectId, sourceId, materializationId])\n}\n\nexport function sourceMaterializationRecord(\n materialization: InMemorySourceMaterialization\n): OntologySourceRecord {\n const {\n rowsByEntity: _rows,\n rootOrdinals: _roots,\n ordinalRoots: _ordinals,\n ...record\n } = materialization\n return structuredClone(record)\n}\n\nexport function commitKey(projectId: string, commitId: string): string {\n return JSON.stringify([projectId, commitId])\n}\n\nexport function idempotencyKey(projectId: string, key: string): string {\n return JSON.stringify([projectId, key])\n}\n\nexport function ontologyCommitOriginSelector(\n origin: OntologyMaterializationOrigin\n): OntologyCommitOriginSelector | null {\n if (origin.kind === \"action\") return { kind: \"action\", actionRunId: origin.runId }\n if (origin.kind === \"projection\") {\n return { kind: \"projection\", projectionRunId: origin.projectionRunId }\n }\n if (origin.kind === \"telemetry\" && origin.source.kind === \"projection\") {\n return {\n kind: \"telemetry\",\n projectionRunId: origin.source.projectionRunId,\n batchOrdinal: origin.source.batchOrdinal,\n }\n }\n return null\n}\n\nexport function commitOriginKey(projectId: string, origin: OntologyCommitOriginSelector): string {\n switch (origin.kind) {\n case \"action\":\n return JSON.stringify([projectId, origin.kind, origin.actionRunId])\n case \"projection\":\n return JSON.stringify([projectId, origin.kind, origin.projectionRunId])\n case \"telemetry\":\n return JSON.stringify([projectId, origin.kind, origin.projectionRunId, origin.batchOrdinal])\n }\n}\n\nexport function outboxKey(projectId: string, eventId: string): string {\n return JSON.stringify([projectId, eventId])\n}\n\nexport function cloneOntologyState(state: InMemoryOntologyState): InMemoryOntologyState {\n return structuredClone(state)\n}\n\nexport function restoreOntologyState(\n target: InMemoryOntologyState,\n snapshot: InMemoryOntologyState\n): void {\n for (const key of Object.keys(target) as (keyof InMemoryOntologyState)[]) {\n const targetMap = target[key] as Map<unknown, unknown>\n const sourceMap = structuredClone(snapshot[key]) as Map<unknown, unknown>\n targetMap.clear()\n for (const [entryKey, value] of sourceMap) targetMap.set(entryKey, value)\n }\n}\n\n/** Insert `value` into a sorted, size-bounded accumulator, dropping the largest entry past `limit`. */\nexport function insertBounded<T>(\n values: T[],\n value: T,\n limit: number,\n compare: (left: T, right: T) => number\n): void {\n let index = values.findIndex((candidate) => compare(value, candidate) < 0)\n if (index < 0) index = values.length\n values.splice(index, 0, value)\n if (values.length > limit) values.pop()\n}\n\nexport function assertNonblank(value: string, label: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new MaterializationValidationError(`${label} must be nonblank.`)\n }\n}\n\nexport function assertTimestamp(value: string, label: string): number {\n const milliseconds = Date.parse(value)\n if (!Number.isFinite(milliseconds) || new Date(milliseconds).toISOString() !== value) {\n throw new MaterializationValidationError(`${label} must be a canonical UTC timestamp.`)\n }\n return milliseconds\n}\n",
22
- "import type {\n GetOntologyCommitByIdempotencyKeyInput,\n GetOntologyCommitByIdInput,\n GetOntologyCommitByOriginInput,\n ListOntologyCommitsInput,\n ListOntologyCommitsResult,\n OntologyCommitRecord,\n OntologyCommitRunSelector,\n OntologyCommitStorage,\n} from \"../commits\"\nimport {\n commitKey,\n commitOriginKey,\n type InMemoryOntologyState,\n idempotencyKey,\n} from \"./shared-state\"\n\nexport class InMemoryOntologyCommitStorage implements OntologyCommitStorage {\n constructor(\n private readonly state: InMemoryOntologyState,\n private readonly runRootOperation: <T>(run: () => Promise<T> | T) => Promise<T>\n ) {}\n\n async getByIdempotencyKey(\n input: GetOntologyCommitByIdempotencyKeyInput\n ): Promise<OntologyCommitRecord | null> {\n return this.runRootOperation(() => {\n const id = this.state.commitIdByIdempotency.get(\n idempotencyKey(input.projectId, input.idempotencyKey)\n )\n if (!id) return null\n return structuredClone(this.state.commitsById.get(commitKey(input.projectId, id)) ?? null)\n })\n }\n\n async getById(input: GetOntologyCommitByIdInput): Promise<OntologyCommitRecord | null> {\n return this.runRootOperation(() =>\n structuredClone(this.state.commitsById.get(commitKey(input.projectId, input.id)) ?? null)\n )\n }\n\n async getByOrigin(input: GetOntologyCommitByOriginInput): Promise<OntologyCommitRecord | null> {\n return this.runRootOperation(() => {\n assertOriginLookup(input)\n const id = this.state.commitIdByOrigin.get(commitOriginKey(input.projectId, input.origin))\n if (!id) return null\n return structuredClone(this.state.commitsById.get(commitKey(input.projectId, id)) ?? null)\n })\n }\n\n async list(input: ListOntologyCommitsInput): Promise<ListOntologyCommitsResult> {\n return this.runRootOperation(() => {\n if (input.projectId.trim().length === 0 || input.run?.id.trim().length === 0) {\n throw new Error(\"[Sixb] Ontology commit project and run ids must be nonblank.\")\n }\n const offset = input.offset ?? 0\n const limit = input.limit ?? this.state.commitsById.size\n if (\n !Number.isSafeInteger(offset) ||\n offset < 0 ||\n !Number.isSafeInteger(limit) ||\n limit < 0\n ) {\n throw new Error(\n \"[Sixb] Ontology commit list limit and offset must be nonnegative integers.\"\n )\n }\n const direction = input.order === \"desc\" ? -1 : 1\n const commits = [...this.state.commitsById.values()]\n .filter((commit) => commit.projectId === input.projectId)\n .filter((commit) => (input.run ? commitMatchesRun(commit, input.run) : true))\n .sort((left, right) => {\n if (input.run?.kind === \"projection\") {\n const byOrdinal = projectionRunOrdinal(left) - projectionRunOrdinal(right)\n if (byOrdinal !== 0) return byOrdinal * direction\n }\n const byTime = left.committedAt.localeCompare(right.committedAt)\n if (byTime !== 0) return byTime * direction\n return left.id.localeCompare(right.id) * direction\n })\n const total = commits.length\n const page = commits.slice(offset, offset + limit).map((commit) => structuredClone(commit))\n return { commits: page, total, hasMore: offset + page.length < total }\n })\n }\n}\n\nfunction assertOriginLookup(input: GetOntologyCommitByOriginInput): void {\n if (input.projectId.trim().length === 0) {\n throw new Error(\"[Sixb] Ontology commit project id must be nonblank.\")\n }\n const runId =\n input.origin.kind === \"action\" ? input.origin.actionRunId : input.origin.projectionRunId\n if (runId.trim().length === 0) {\n throw new Error(\"[Sixb] Ontology commit origin run id must be nonblank.\")\n }\n if (\n input.origin.kind === \"telemetry\" &&\n (!Number.isSafeInteger(input.origin.batchOrdinal) || input.origin.batchOrdinal < 0)\n ) {\n throw new Error(\"[Sixb] Ontology telemetry commit batch ordinal must be nonnegative.\")\n }\n}\n\nfunction commitMatchesRun(commit: OntologyCommitRecord, run: OntologyCommitRunSelector): boolean {\n if (run.kind === \"action\") {\n return commit.origin.kind === \"action\" && commit.origin.runId === run.id\n }\n if (commit.origin.kind === \"projection\") return commit.origin.projectionRunId === run.id\n return (\n commit.origin.kind === \"telemetry\" &&\n commit.origin.source.kind === \"projection\" &&\n commit.origin.source.projectionRunId === run.id\n )\n}\n\nfunction projectionRunOrdinal(commit: OntologyCommitRecord): number {\n if (commit.origin.kind === \"telemetry\" && commit.origin.source.kind === \"projection\") {\n return commit.origin.source.batchOrdinal\n }\n return 0\n}\n",
23
- "import type { TelemetrySeriesRef } from \"../../materialization/model\"\nimport type { StoredTelemetryPoint } from \"../ontology/materializations\"\nimport type { TimeseriesHistoryBatchInput, TimeseriesPoint, TimeseriesStorage } from \"./types\"\n\nfunction pointKey(\n projectId: string,\n objectTypeId: string,\n objectId: string,\n propertyId: string\n): string {\n return JSON.stringify([projectId, objectTypeId, objectId, propertyId])\n}\n\nexport class InMemoryTimeseriesStorage implements TimeseriesStorage {\n // A telemetry point is uniquely identified by (series, at): one value per\n // instant per series. Re-applying the same instant is a last-write-wins\n // upsert, which makes telemetry writes idempotent under replay for free.\n private readonly pointsByKey = new Map<string, Map<number, TimeseriesPoint>>()\n\n constructor() {\n materializerAdapters.set(this, {\n getExactPoint: (projectId, series, at) => this.getExactPoint(projectId, series, at),\n listLatestForObject: (projectId, objectTypeId, objectId) =>\n this.listLatestForObject(projectId, objectTypeId, objectId),\n applyExactPoint: (projectId, point) => this.applyExactPoint(projectId, point),\n })\n }\n\n snapshot(): InMemoryTimeseriesStorageSnapshot {\n return {\n pointsByKey: structuredClone(this.pointsByKey),\n }\n }\n\n restore(snapshot: InMemoryTimeseriesStorageSnapshot): void {\n this.pointsByKey.clear()\n for (const [key, points] of structuredClone(snapshot.pointsByKey)) {\n this.pointsByKey.set(key, points)\n }\n }\n\n private getExactPoint(\n projectId: string,\n series: TelemetrySeriesRef,\n at: string\n ): TimeseriesPoint | null {\n const point =\n this.pointsByKey\n .get(\n pointKey(\n projectId,\n series.object.objectTypeId,\n series.object.primaryId,\n series.propertyId\n )\n )\n ?.get(new Date(at).getTime()) ?? null\n return point ? clonePoint(point) : null\n }\n\n private listLatestForObject(\n projectId: string,\n objectTypeId: string,\n objectId: string\n ): TimeseriesPoint[] {\n const latest: TimeseriesPoint[] = []\n for (const series of this.pointsByKey.values()) {\n let point: TimeseriesPoint | null = null\n for (const candidate of series.values()) {\n if (\n candidate.projectId !== projectId ||\n candidate.objectTypeId !== objectTypeId ||\n candidate.objectId !== objectId\n ) {\n continue\n }\n if (!point || candidate.at > point.at) point = candidate\n }\n if (point) latest.push(clonePoint(point))\n }\n return latest\n }\n\n private applyExactPoint(projectId: string, point: StoredTelemetryPoint): void {\n const key = pointKey(\n projectId,\n point.series.object.objectTypeId,\n point.series.object.primaryId,\n point.series.propertyId\n )\n const series = this.pointsByKey.get(key) ?? new Map<number, TimeseriesPoint>()\n series.set(new Date(point.at).getTime(), {\n projectId,\n objectTypeId: point.series.object.objectTypeId,\n objectId: point.series.object.primaryId,\n propertyId: point.series.propertyId,\n value: structuredClone(point.value),\n ...(point.unit !== undefined ? { unit: point.unit } : {}),\n at: new Date(point.at),\n lastCommitId: point.lastCommitId,\n })\n this.pointsByKey.set(key, series)\n }\n\n async getHistory(params: {\n projectId: string\n objectTypeId: string\n objectId: string\n propertyId: string\n from?: Date\n to?: Date\n limit?: number\n order?: \"asc\" | \"desc\"\n }): Promise<readonly TimeseriesPoint[]> {\n const key = pointKey(params.projectId, params.objectTypeId, params.objectId, params.propertyId)\n const { from, to } = params\n let points = [...(this.pointsByKey.get(key)?.values() ?? [])]\n if (from || to) {\n points = points.filter((point) => (!from || point.at >= from) && (!to || point.at <= to))\n }\n\n points.sort((a, b) => a.at.getTime() - b.at.getTime())\n if (params.order === \"desc\") {\n points.reverse()\n }\n\n if (params.limit !== undefined) {\n points = points.slice(0, Math.max(0, params.limit))\n }\n\n return points.map(clonePoint)\n }\n\n async getHistoryBatch(input: TimeseriesHistoryBatchInput): Promise<\n readonly {\n objectTypeId: string\n objectId: string\n propertyId: string\n points: readonly TimeseriesPoint[]\n }[]\n > {\n // Start every read before yielding so one batch observes one in-memory snapshot. The SQL\n // providers get the same guarantee from their single query.\n return Promise.all(\n input.series.map(async (series) => ({\n ...series,\n points: await this.getHistory({\n projectId: input.projectId,\n objectTypeId: series.objectTypeId,\n objectId: series.objectId,\n propertyId: series.propertyId,\n from: input.from,\n to: input.to,\n limit: input.limitPerSeries,\n order: input.order,\n }),\n }))\n )\n }\n\n async getLatest(params: {\n projectId: string\n objectTypeId: string\n objectId: string\n propertyId: string\n }): Promise<TimeseriesPoint | null> {\n const series = this.pointsByKey.get(\n pointKey(params.projectId, params.objectTypeId, params.objectId, params.propertyId)\n )\n if (!series || series.size === 0) {\n return null\n }\n\n let latest: TimeseriesPoint | null = null\n for (const point of series.values()) {\n if (!latest || point.at.getTime() > latest.at.getTime()) {\n latest = point\n }\n }\n return latest ? clonePoint(latest) : null\n }\n}\n\ninterface InMemoryTimeseriesMaterializerAdapter {\n getExactPoint(projectId: string, series: TelemetrySeriesRef, at: string): TimeseriesPoint | null\n listLatestForObject(projectId: string, objectTypeId: string, objectId: string): TimeseriesPoint[]\n applyExactPoint(projectId: string, point: StoredTelemetryPoint): void\n}\n\nconst materializerAdapters = new WeakMap<\n InMemoryTimeseriesStorage,\n InMemoryTimeseriesMaterializerAdapter\n>()\n\n/** @internal Exact access for the in-memory ontology provider; not exported from package barrels. */\nexport function getInMemoryTimeseriesMaterializerAdapter(\n storage: InMemoryTimeseriesStorage\n): InMemoryTimeseriesMaterializerAdapter {\n const adapter = materializerAdapters.get(storage)\n if (!adapter) throw new Error(\"[Sixb] In-memory timeseries materializer adapter is unavailable.\")\n return adapter\n}\n\nfunction clonePoint(point: TimeseriesPoint): TimeseriesPoint {\n return {\n ...structuredClone(point),\n value: structuredClone(point.value),\n at: new Date(point.at),\n }\n}\n\nexport interface InMemoryTimeseriesStorageSnapshot {\n readonly pointsByKey: Map<string, Map<number, TimeseriesPoint>>\n}\n",
24
- "import { MaterializationConflictError } from \"../../../materialization/errors\"\nimport type {\n EffectiveLinkSnapshot,\n EffectiveObjectSnapshot,\n OntologyLinkRef,\n} from \"../../../materialization/model\"\nimport { linkRefKey, linkRefSortKey, linkScopeSortKey } from \"../../../materialization/refs\"\nimport type { ObjectLinkRow, ObjectRow } from \"../../objects/types\"\nimport type { TimeseriesPoint } from \"../../timeseries/types\"\nimport type {\n StoredLinkOverride,\n StoredLinkSlotOverride,\n StoredObjectOverride,\n StoredTelemetryPoint,\n} from \"../materializations\"\nimport type {\n StageSourceAssertion,\n StoredSourceAssertion,\n StoredSourceLinkAssertion,\n StoredSourceObjectAssertion,\n} from \"../sources\"\nimport type { ReplacementSessionState } from \"./materializations\"\nimport type {\n InMemoryOntologyState,\n InMemorySourceMaterialization,\n InMemoryStoredLinkOverride,\n InMemoryStoredLinkSlotOverride,\n InMemoryStoredObjectOverride,\n} from \"./shared-state\"\n\nexport function publicObjectOverride(\n value: InMemoryStoredObjectOverride | undefined\n): StoredObjectOverride | null {\n if (!value) return null\n const { projectId: _, ...stored } = value\n return stored\n}\n\nexport function publicLinkOverride(\n value: InMemoryStoredLinkOverride | undefined\n): StoredLinkOverride | null {\n if (!value) return null\n const { projectId: _, ...stored } = value\n return stored\n}\n\nexport function publicLinkSlotOverride(\n value: InMemoryStoredLinkSlotOverride | undefined\n): StoredLinkSlotOverride | null {\n if (!value) return null\n const { projectId: _, ...stored } = value\n return stored\n}\n\nexport function uniqueBy<T>(values: readonly T[], keyOf: (value: T) => string): T[] {\n return [...new Map(values.map((value) => [keyOf(value), structuredClone(value)])).values()]\n}\n\nexport function objectSnapshot(row: ObjectRow): EffectiveObjectSnapshot {\n if (!row.lastCommitId)\n throw new MaterializationConflictError(\n \"effective-state\",\n `Effective object ${row.objectTypeId}:${row.primaryId} lacks materializer provenance.`\n )\n return {\n ref: { objectTypeId: row.objectTypeId, primaryId: row.primaryId },\n properties: structuredClone(row.properties) as EffectiveObjectSnapshot[\"properties\"],\n version: row.version,\n createdAt: row.createdAt.toISOString(),\n updatedAt: row.updatedAt.toISOString(),\n lastCommitId: row.lastCommitId,\n }\n}\n\nexport function linkSnapshot(row: ObjectLinkRow): EffectiveLinkSnapshot {\n if (!row.lastCommitId)\n throw new MaterializationConflictError(\n \"effective-state\",\n `Effective link lacks materializer provenance.`\n )\n return {\n ref: linkRef(row),\n ...(row.properties\n ? { properties: structuredClone(row.properties) as EffectiveLinkSnapshot[\"properties\"] }\n : {}),\n createdAt: row.createdAt.toISOString(),\n updatedAt: row.updatedAt.toISOString(),\n lastCommitId: row.lastCommitId,\n }\n}\n\nexport function linkRef(row: ObjectLinkRow): OntologyLinkRef {\n return {\n source: { objectTypeId: row.sourceTypeId, primaryId: row.sourceId },\n linkId: row.linkId,\n target: { objectTypeId: row.targetTypeId, primaryId: row.targetId },\n }\n}\n\nexport function storedPoint(point: TimeseriesPoint): StoredTelemetryPoint {\n if (!point.lastCommitId)\n throw new MaterializationConflictError(\n \"timeseries-point\",\n \"Telemetry point lacks materializer provenance.\"\n )\n return {\n series: {\n object: { objectTypeId: point.objectTypeId, primaryId: point.objectId },\n propertyId: point.propertyId,\n },\n value: structuredClone(point.value) as StoredTelemetryPoint[\"value\"],\n ...(point.unit !== undefined ? { unit: point.unit } : {}),\n at: point.at.toISOString(),\n lastCommitId: point.lastCommitId,\n }\n}\n\nexport function findActiveSourceMaterialization(\n state: InMemoryOntologyState,\n projectId: string,\n sourceId: string\n): InMemorySourceMaterialization | undefined {\n let active: InMemorySourceMaterialization | undefined\n for (const materialization of state.sourceMaterializations.values()) {\n if (\n materialization.projectId !== projectId ||\n materialization.source.projectionId !== sourceId ||\n materialization.status !== \"active\"\n ) {\n continue\n }\n if (active) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Source '${sourceId}' has more than one active materialization.`\n )\n }\n active = materialization\n }\n return active\n}\n\nexport function storedSource(\n sourceId: string,\n materializationId: string,\n row: StageSourceAssertion\n): StoredSourceAssertion {\n return {\n source: { projectionId: sourceId },\n materializationId,\n root: structuredClone(row.root),\n assertion: structuredClone(row.assertion),\n stagingOrdinal: row.stagingOrdinal,\n } as StoredSourceAssertion\n}\n\nexport function storedSourceObject(\n sourceId: string,\n materializationId: string | undefined,\n row: StageSourceAssertion | undefined\n): StoredSourceObjectAssertion | null {\n if (!materializationId || !row || row.assertion.kind !== \"object\") return null\n return storedSource(sourceId, materializationId, row) as StoredSourceObjectAssertion\n}\n\nexport function storedSourceLink(\n sourceId: string,\n materializationId: string | undefined,\n row: StageSourceAssertion | undefined\n): StoredSourceLinkAssertion | null {\n if (!materializationId || !row || row.assertion.kind !== \"link\") return null\n return storedSource(sourceId, materializationId, row) as StoredSourceLinkAssertion\n}\n\nexport function addReplacementLink(\n replacement: ReplacementSessionState,\n ref: OntologyLinkRef,\n diffRequired: boolean\n): void {\n const key = linkRefKey(ref)\n const existing = replacement.links.get(key)\n if (existing) {\n existing.diffRequired ||= diffRequired\n if (diffRequired) replacement.affectedScopes.add(linkScopeSortKey(ref.source, ref.linkId))\n return\n }\n replacement.links.set(key, {\n ref: structuredClone(ref),\n sortKey: linkRefSortKey(ref),\n diffRequired,\n })\n if (diffRequired) replacement.affectedScopes.add(linkScopeSortKey(ref.source, ref.linkId))\n}\n",
25
- "import { stableJsonStringify } from \"../../../json\"\nimport { MaterializationConflictError } from \"../../../materialization/errors\"\nimport type {\n MaterializationPlanChunk,\n StoredLinkOverride,\n StoredLinkSlotOverride,\n StoredObjectOverride,\n} from \"../materializations\"\nimport { invalidCorrelation, materializationPlanItems } from \"../provider-work\"\nimport type { SessionState } from \"./materializations\"\n\nexport * from \"../provider-work\"\n\nexport function assertChunkSequence(session: SessionState, chunk: MaterializationPlanChunk): void {\n const planItems = materializationPlanItems(chunk)\n const applyStream = session.workStreams.apply\n const appliedStart = session.appliedPlanItems.length\n if (\n planItems.length > 0 &&\n (!applyStream.started || appliedStart + planItems.length > applyStream.emittedCount)\n ) {\n invalidCorrelation(\"Materialization plan items cannot be applied before they are streamed.\")\n }\n for (let offset = 0; offset < planItems.length; offset += 1) {\n const expected = session.applyWork[appliedStart + offset]?.item\n if (!expected || stableJsonStringify(planItems[offset]) !== stableJsonStringify(expected)) {\n invalidCorrelation(\"Materialization plan items must be applied in exact streamed order.\")\n }\n }\n\n const eventStream = session.workStreams.event\n const appliedOutboxCount = session.outboxEnvelopes.size\n if (\n chunk.outbox.length > 0 &&\n (!eventStream.started || appliedOutboxCount + chunk.outbox.length > eventStream.emittedCount)\n ) {\n invalidCorrelation(\"Materialization events cannot be applied before they are streamed.\")\n }\n for (let offset = 0; offset < chunk.outbox.length; offset += 1) {\n const expected = session.eventWork[appliedOutboxCount + offset]\n const actual = chunk.outbox[offset]?.envelope\n if (!expected || !actual) {\n invalidCorrelation(\"Materialization outbox events must follow exact streamed order.\")\n }\n const { id: _id, commitOrdinal, ...actualDraft } = actual\n if (\n commitOrdinal !== appliedOutboxCount + offset ||\n stableJsonStringify(actualDraft) !== stableJsonStringify(expected.draft)\n ) {\n invalidCorrelation(\"Materialization outbox events must follow exact streamed order.\")\n }\n }\n}\n\nexport function assertLastCommit(\n value: StoredObjectOverride | StoredLinkOverride | StoredLinkSlotOverride | undefined,\n expected: string | null,\n label: string\n): void {\n if ((value?.lastCommitId ?? null) !== expected) {\n throw new MaterializationConflictError(\"effective-state\", `Expected ${label} changed.`)\n }\n}\n",
26
- "import { stableJsonStringify } from \"../../../json\"\nimport { assertPinnedDatasetWatermark } from \"../../../materialization/dataset-watermark\"\nimport { MaterializationConflictError } from \"../../../materialization/errors\"\nimport { createEventId } from \"../../../materialization/identity\"\nimport type {\n EffectiveChangeCounts,\n OntologyObjectRef,\n PinnedDatasetVersion,\n TelemetryCommitResult,\n} from \"../../../materialization/model\"\nimport { linkRefSortKey } from \"../../../materialization/refs\"\nimport {\n getInMemoryObjectMaterializerAdapter,\n type InMemoryObjectStorage,\n} from \"../../objects/in-memory\"\nimport type { MaterializationCardinalityOccupantWorkRecord } from \"../materializations\"\nimport type { SessionState } from \"./materializations\"\nimport { findActiveSourceMaterialization, linkRef } from \"./materializations-state\"\nimport { compareEventWork, invalidCorrelation } from \"./materializations-work\"\nimport { type InMemoryOntologyState, outboxKey, sourceMaterializationKey } from \"./shared-state\"\n\nexport function assertFinalizationCorrelations(\n session: SessionState,\n finalization: import(\"../materializations\").MaterializationPlanFinalization,\n state: InMemoryOntologyState,\n objects: InMemoryObjectStorage\n): void {\n const { commit } = session.header\n const { result, sourceActivations } = finalization\n if (\n result.commitId !== commit.id ||\n result.kind !== commit.intent.kind ||\n result.committedAt !== commit.committedAt ||\n result.created !== true ||\n !Number.isSafeInteger(result.eventCount) ||\n result.eventCount < 0 ||\n result.eventCount !== session.outboxEnvelopes.size\n ) {\n invalidCorrelation(\"Materialization result does not correlate with its commit intent.\")\n }\n for (let ordinal = 0; ordinal < result.eventCount; ordinal += 1) {\n if (!session.outboxEnvelopes.has(ordinal)) {\n invalidCorrelation(\"Outbox event ordinals must be contiguous from zero.\")\n }\n }\n\n if (commit.intent.kind === \"edit\") {\n if (result.kind !== \"edit\" || result.outcomes.length !== commit.intent.operationCount) {\n invalidCorrelation(\"Edit result does not correlate with its operation count.\")\n }\n if (sourceActivations.length !== 0) {\n invalidCorrelation(\"Edit materialization cannot activate a source materialization.\")\n }\n } else if (commit.intent.kind === \"projection\") {\n if (result.kind !== \"projection\" || sourceActivations.length !== 1) {\n invalidCorrelation(\"Projection result requires exactly one correlated source activation.\")\n }\n } else if (result.kind !== \"telemetry\" || sourceActivations.length !== 0) {\n invalidCorrelation(\"Telemetry result does not correlate with its point intent.\")\n }\n\n for (const activation of sourceActivations) {\n assertSourceActivationCorrelation(activation, session, state)\n }\n if (sourceActivations[0]) {\n assertReplacementFullyStreamed(session, sourceActivations[0])\n }\n assertFinalizedWork(session, state, objects)\n if (commit.intent.kind === \"projection\") {\n if (result.kind !== \"projection\" || !projectionCountsCorrelate(session, result.counts)) {\n invalidCorrelation(\"Projection result counts do not correlate with finalized work.\")\n }\n } else if (\n commit.intent.kind === \"telemetry\" &&\n (result.kind !== \"telemetry\" ||\n !telemetryCountsCorrelate(session, commit.intent.pointCount, result))\n ) {\n invalidCorrelation(\"Telemetry result counts do not correlate with finalized work.\")\n }\n}\n\nfunction projectionCountsCorrelate(session: SessionState, actual: EffectiveChangeCounts): boolean {\n const expected = deriveExpectedProjectionCounts(session)\n if (expected === null) return false\n\n return effectiveChangeCountsMatch(actual, expected)\n}\n\ninterface ClassifiedProjectionCounts {\n objects: number\n links: number\n}\n\ninterface AppliedProjectionChangeCounts {\n objectsCreated: number\n objectsUpdated: number\n objectsDeleted: number\n linksCreated: number\n linksUpdated: number\n linksDeleted: number\n}\n\nconst effectiveChangeCountKeys = [\n \"objectsCreated\",\n \"objectsUpdated\",\n \"objectsDeleted\",\n \"objectsUnchanged\",\n \"linksCreated\",\n \"linksUpdated\",\n \"linksDeleted\",\n \"linksUnchanged\",\n] as const satisfies readonly (keyof EffectiveChangeCounts)[]\n\nfunction deriveExpectedProjectionCounts(session: SessionState): EffectiveChangeCounts | null {\n const classified = countClassifiedProjectionEntities(session)\n const applied = countAppliedProjectionChanges(session)\n const objectsUnchanged = remainingClassifiedCount(\n classified.objects,\n applied.objectsCreated,\n applied.objectsUpdated,\n applied.objectsDeleted\n )\n const linksUnchanged = remainingClassifiedCount(\n classified.links,\n applied.linksCreated,\n applied.linksUpdated,\n applied.linksDeleted\n )\n\n if (objectsUnchanged < 0 || linksUnchanged < 0) return null\n\n return { ...applied, objectsUnchanged, linksUnchanged }\n}\n\nfunction countClassifiedProjectionEntities(session: SessionState): ClassifiedProjectionCounts {\n const counts = { objects: 0, links: 0 }\n\n for (const record of session.work.values()) {\n if (record.kind !== \"classification\") continue\n\n if (record.entityKind === \"object\") counts.objects += 1\n if (record.entityKind === \"link\") counts.links += 1\n }\n\n return counts\n}\n\nfunction countAppliedProjectionChanges(session: SessionState): AppliedProjectionChangeCounts {\n const counts: AppliedProjectionChangeCounts = {\n objectsCreated: 0,\n objectsUpdated: 0,\n objectsDeleted: 0,\n linksCreated: 0,\n linksUpdated: 0,\n linksDeleted: 0,\n }\n\n for (const work of session.applyWork) {\n const { item } = work\n\n switch (item.kind) {\n case \"object-upsert\":\n if (item.value.expected.exists) counts.objectsUpdated += 1\n else counts.objectsCreated += 1\n break\n case \"object-delete\":\n counts.objectsDeleted += 1\n break\n case \"link-upsert\":\n if (item.value.expected.exists) counts.linksUpdated += 1\n else counts.linksCreated += 1\n break\n case \"link-delete\":\n counts.linksDeleted += 1\n break\n }\n }\n\n return counts\n}\n\nfunction remainingClassifiedCount(\n classified: number,\n created: number,\n updated: number,\n deleted: number\n): number {\n return classified - created - updated - deleted\n}\n\nfunction effectiveChangeCountsMatch(\n actual: EffectiveChangeCounts,\n expected: EffectiveChangeCounts\n): boolean {\n return effectiveChangeCountKeys.every((key) => {\n const count = actual[key]\n return Number.isSafeInteger(count) && count >= 0 && count === expected[key]\n })\n}\n\nfunction telemetryCountsCorrelate(\n session: SessionState,\n pointCount: number,\n actual: TelemetryCommitResult\n): boolean {\n let pointsCreated = 0\n let pointsUpdated = 0\n let latestObjectsChanged = 0\n for (const work of session.applyWork) {\n if (work.item.kind === \"point-upsert\") {\n if (work.item.value.expected.lastCommitId === null) pointsCreated += 1\n else pointsUpdated += 1\n } else if (work.item.kind === \"object-upsert\") {\n latestObjectsChanged += 1\n }\n }\n const expected = {\n pointsCreated,\n pointsUpdated,\n pointsUnchanged: pointCount - pointsCreated - pointsUpdated,\n latestObjectsChanged,\n }\n return (\n expected.pointsUnchanged >= 0 &&\n (Object.keys(expected) as (keyof typeof expected)[]).every(\n (key) =>\n Number.isSafeInteger(actual[key]) && actual[key] >= 0 && actual[key] === expected[key]\n )\n )\n}\n\nfunction assertSourceActivationCorrelation(\n activation: import(\"../materializations\").SourceActivationWrite,\n session: SessionState,\n state: InMemoryOntologyState\n): void {\n const { header } = session\n const { commit } = header\n if (\n commit.intent.kind !== \"projection\" ||\n commit.origin.kind !== \"projection\" ||\n activation.source.projectionId !== commit.intent.source.projectionId ||\n activation.source.projectionId !== commit.origin.projectionId ||\n activation.execution.projectionRunId !== commit.origin.projectionRunId ||\n activation.protocol !== \"replacement\" ||\n stableJsonStringify(activation.datasetVersion) !==\n stableJsonStringify(commit.intent.datasetVersion) ||\n activation.projectionRevision !== commit.projectionRevision ||\n activation.ownershipHash !== commit.ownershipHash ||\n activation.ontologyRevision !== commit.ontologyRevision ||\n activation.lastCommitId !== commit.id ||\n activation.updatedAt !== commit.committedAt ||\n !header.expected.sources.some(\n (expected) => stableJsonStringify(expected) === stableJsonStringify(activation.expected)\n )\n ) {\n invalidCorrelation(\"Source activation does not correlate with its projection commit.\")\n }\n const candidate = state.sourceMaterializations.get(\n sourceMaterializationKey(\n commit.projectId,\n activation.source.projectionId,\n activation.materializationId\n )\n )\n if (!candidate || candidate.status !== \"ready\") {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Source activation candidate is missing or is not ready.\"\n )\n }\n if (\n candidate.projectionRunId !== activation.execution.projectionRunId ||\n candidate.executionToken !== activation.execution.executionToken ||\n candidate.projectionKind !== activation.projectionKind ||\n candidate.protocol !== activation.protocol ||\n stableJsonStringify(candidate.datasetVersion) !==\n stableJsonStringify(activation.datasetVersion) ||\n candidate.projectionRevision !== activation.projectionRevision ||\n candidate.ownershipHash !== activation.ownershipHash ||\n candidate.ontologyRevision !== activation.ontologyRevision\n ) {\n invalidCorrelation(\"Source activation does not match its ready candidate identity.\")\n }\n if (candidate.readyAt === null) {\n invalidCorrelation(\"Source activation candidate has no ready timestamp.\")\n }\n assertTimestampNotBefore(\n activation.updatedAt,\n candidate.readyAt,\n \"Source activation cannot precede candidate readiness.\"\n )\n const previous = findActiveSourceMaterialization(\n state,\n commit.projectId,\n activation.source.projectionId\n )\n if (previous) {\n assertSourceDatasetWatermark(previous.datasetVersion, activation.datasetVersion)\n assertTimestampNotBefore(\n activation.updatedAt,\n previous.updatedAt,\n \"Source activation cannot precede the active materialization update.\"\n )\n }\n}\n\nfunction assertSourceDatasetWatermark(\n active: PinnedDatasetVersion,\n next: PinnedDatasetVersion\n): void {\n assertPinnedDatasetWatermark(active, next, \"Source activation\")\n}\n\nfunction assertFinalizedWork(\n session: SessionState,\n state: InMemoryOntologyState,\n objects: InMemoryObjectStorage\n): void {\n const expectedPlanItems = session.applyWork.map((record) => stableJsonStringify(record.item))\n const appliedPlanItems = session.appliedPlanItems\n if (expectedPlanItems.length > 0 && !session.workStreams.apply.completed) {\n invalidCorrelation(\"Materialization plan work was not fully streamed.\")\n }\n if (stableJsonStringify(appliedPlanItems) !== stableJsonStringify(expectedPlanItems)) {\n invalidCorrelation(\"Materialization plan work was not applied exactly once.\")\n }\n if (session.cardinalityWork.length > 0 && !session.workStreams.cardinality.completed) {\n invalidCorrelation(\"Materialization cardinality work was not fully validated.\")\n }\n assertFinalCardinality(session.cardinalityWork, session.header.commit.projectId, objects)\n if (session.header.commit.intent.kind === \"telemetry\") {\n const pointKeys = classificationKeys(session, \"point\")\n if (pointKeys.length !== session.header.commit.intent.pointCount) {\n invalidCorrelation(\n \"Telemetry point classification coverage does not match the commit intent.\"\n )\n }\n }\n\n const expectedEvents = [...session.eventWork].sort(compareEventWork)\n if (expectedEvents.length > 0 && !session.workStreams.event.completed) {\n invalidCorrelation(\"Materialization event work was not fully drained.\")\n }\n if (session.outboxEnvelopes.size !== expectedEvents.length) {\n invalidCorrelation(\"Materialization event work was not fully written to the outbox.\")\n }\n for (let ordinal = 0; ordinal < expectedEvents.length; ordinal += 1) {\n const expected = expectedEvents[ordinal]\n const actual = session.outboxEnvelopes.get(ordinal)\n if (!expected || !actual) {\n invalidCorrelation(\"Materialization event work was not fully written to the outbox.\")\n }\n const { id, commitOrdinal, ...actualDraft } = actual\n if (\n commitOrdinal !== ordinal ||\n id !== createEventId(session.header.commit.projectId, session.header.commit.id, ordinal) ||\n stableJsonStringify(actualDraft) !== stableJsonStringify(expected.draft)\n ) {\n invalidCorrelation(\"Materialization outbox event does not match its staged event work.\")\n }\n const persisted = state.outbox.get(outboxKey(session.header.commit.projectId, actual.id))\n if (!persisted || stableJsonStringify(persisted.envelope) !== stableJsonStringify(actual)) {\n invalidCorrelation(\"Materialization outbox event was not persisted.\")\n }\n }\n}\n\nfunction assertFinalCardinality(\n records: readonly MaterializationCardinalityOccupantWorkRecord[],\n projectId: string,\n objects: InMemoryObjectStorage\n): void {\n const effectiveOccupants = records.filter((record) => record.view === \"effective\")\n const scopes = new Map<\n string,\n {\n readonly source: OntologyObjectRef\n readonly linkId: string\n readonly occupiedLinkKeys: Set<string>\n }\n >()\n let currentScope: string | null = null\n let occupiedCount = 0\n for (const record of effectiveOccupants) {\n if (record.scopeSortKey !== currentScope) {\n currentScope = record.scopeSortKey\n occupiedCount = 0\n }\n const scope = scopes.get(record.scopeSortKey) ?? {\n source: structuredClone(record.ref.source),\n linkId: record.ref.linkId,\n occupiedLinkKeys: new Set<string>(),\n }\n scopes.set(record.scopeSortKey, scope)\n if (record.occupied) {\n occupiedCount += 1\n scope.occupiedLinkKeys.add(record.linkSortKey)\n if (occupiedCount > 1) {\n invalidCorrelation(\"Materialization cardinality work violates cardinality-one.\")\n }\n }\n }\n\n const adapter = getInMemoryObjectMaterializerAdapter(objects)\n for (const scope of scopes.values()) {\n const effectiveLinkKeys: string[] = []\n adapter.visitExactScopeLinks(\n projectId,\n scope.source.objectTypeId,\n scope.source.primaryId,\n scope.linkId,\n (row) => effectiveLinkKeys.push(linkRefSortKey(linkRef(row)))\n )\n effectiveLinkKeys.sort()\n const occupiedLinkKeys = [...scope.occupiedLinkKeys].sort()\n if (stableJsonStringify(effectiveLinkKeys) !== stableJsonStringify(occupiedLinkKeys)) {\n invalidCorrelation(\n \"Materialization cardinality work does not match the final effective link scope.\"\n )\n }\n }\n}\n\nfunction assertReplacementFullyStreamed(\n session: SessionState,\n activation: import(\"../materializations\").SourceActivationWrite\n): void {\n const replacement = session.replacement\n if (\n !replacement ||\n replacement.sourceId !== activation.source.projectionId ||\n replacement.candidateMaterializationId !== activation.materializationId ||\n replacement.candidate.materializationId !== activation.materializationId ||\n replacement.candidate.projectionKind !== activation.projectionKind ||\n replacement.candidate.protocol !== activation.protocol\n ) {\n invalidCorrelation(\n \"Source activation does not match the replacement candidate opened by the session.\"\n )\n }\n if (\n activation.projectionKind === \"object\" &&\n (!replacement.objectStreamCompleted || !replacement.linkStreamCompleted)\n ) {\n invalidCorrelation(\"Object projection replacement state was not fully streamed.\")\n }\n if (activation.projectionKind === \"link\" && !replacement.linkStreamCompleted) {\n invalidCorrelation(\"Link projection replacement state was not fully streamed.\")\n }\n const expectedObjectKeys =\n activation.projectionKind === \"object\" ? [...replacement.objects.keys()].sort() : []\n const expectedLinkKeys = [...replacement.links.entries()]\n .filter(([, value]) => value.diffRequired)\n .map(([key]) => key)\n .sort()\n if (\n stableJsonStringify(classificationKeys(session, \"object\")) !==\n stableJsonStringify(expectedObjectKeys) ||\n stableJsonStringify(classificationKeys(session, \"link\")) !==\n stableJsonStringify(expectedLinkKeys) ||\n classificationKeys(session, \"point\").length > 0\n ) {\n invalidCorrelation(\n \"Projection replacement classification coverage does not match its streamed state.\"\n )\n }\n}\n\nfunction classificationKeys(\n session: SessionState,\n entityKind: import(\"../materializations\").MaterializationWorkEntityKind\n): string[] {\n return [...session.work.values()]\n .filter(\n (record): record is import(\"../materializations\").MaterializationClassificationWorkRecord =>\n record.kind === \"classification\" && record.entityKind === entityKind\n )\n .map((record) => record.identityKey)\n .sort()\n}\n\nfunction assertTimestampNotBefore(value: string, minimum: string, message: string): void {\n if (Date.parse(value) < Date.parse(minimum)) invalidCorrelation(message)\n}\n",
27
- "import { stableJsonStringify } from \"../../../json\"\nimport {\n MaterializationConflictError,\n MaterializationValidationError,\n} from \"../../../materialization/errors\"\nimport type {\n ExpectedLinkRevision,\n ExpectedObjectRevision,\n OntologyLinkRef,\n OntologyObjectRef,\n} from \"../../../materialization/model\"\nimport {\n linkRefKey,\n linkRefSortKey,\n linkScopeKey,\n linkScopeSortKey,\n objectRefKey,\n objectRefSortKey,\n projectionEntityKey,\n telemetryPointKey,\n telemetryPointSortKey,\n} from \"../../../materialization/refs\"\nimport {\n getInMemoryObjectMaterializerAdapter,\n type InMemoryObjectStorage,\n} from \"../../objects/in-memory\"\nimport type { ObjectLinkRow } from \"../../objects/types\"\nimport {\n getInMemoryTimeseriesMaterializerAdapter,\n type InMemoryTimeseriesStorage,\n} from \"../../timeseries/store\"\nimport type { OntologyCommitRecord } from \"../commits\"\nimport type {\n ApplyMaterializationChunkInput,\n ApplyMaterializationResult,\n ExpectedSourceRevision,\n ExpectedTimeseriesPointRevision,\n FinalizeMaterializationInput,\n MaterializationCardinalityOccupantWorkRecord,\n MaterializationEventWorkRecord,\n MaterializationLinkScopeRevision,\n MaterializationLinkScopeState,\n MaterializationLinkState,\n MaterializationObjectExistence,\n MaterializationObjectExistenceWorkRecord,\n MaterializationObjectState,\n MaterializationPlanHeader,\n MaterializationPlanWorkRecord,\n MaterializationSession,\n MaterializationStatePage,\n MaterializationWorkPage,\n MaterializationWorkRecord,\n OntologyMaterializationStorage,\n ReadMaterializationObjectExistenceInput,\n SourceReplacementLinkState,\n SourceReplacementObjectState,\n SourceReplacementStatePage,\n StageMaterializationWorkInput,\n StoredTelemetryPoint,\n StreamMaterializationStateInput,\n StreamMaterializationWorkInput,\n StreamSourceReplacementStateInput,\n} from \"../materializations\"\nimport type { OntologyMaterializationEvent } from \"../outbox\"\nimport {\n appendScopeSnapshot,\n assertMaterializationHeader,\n finishScopeAccumulator,\n type ProviderMaterializationTransactionLifecycle,\n startScopeAccumulator,\n uniqueSorted,\n} from \"../provider\"\nimport type {\n StoredSourceAssertion,\n StoredSourceLinkAssertion,\n StoredSourceObjectAssertion,\n} from \"../sources\"\nimport { assertFinalizationCorrelations } from \"./materializations-finalization\"\nimport {\n addReplacementLink,\n findActiveSourceMaterialization,\n linkRef,\n linkSnapshot,\n objectSnapshot,\n publicLinkOverride,\n publicLinkSlotOverride,\n publicObjectOverride,\n storedPoint,\n storedSource,\n storedSourceLink,\n storedSourceObject,\n uniqueBy,\n} from \"./materializations-state\"\nimport {\n assertChunkSequence,\n assertLastCommit,\n assertPageRows,\n assertPlanChunkCorrelations,\n assertWorkRecord,\n compareCardinalityWork,\n compareEventWork,\n comparePlanWork,\n materializationChunkRows,\n materializationPlanItems,\n workUniquenessKey,\n} from \"./materializations-work\"\nimport {\n assertTimestamp,\n commitKey,\n commitOriginKey,\n type InMemoryOntologyState,\n type InMemoryOntologyStorageTestHooks,\n type InMemorySourceMaterialization,\n idempotencyKey,\n ontologyCommitOriginSelector,\n outboxKey,\n projectEntityKey,\n sourceMaterializationKey,\n} from \"./shared-state\"\n\nexport interface SessionState {\n readonly providerToken: object\n readonly header: MaterializationPlanHeader\n readonly transactionToken: object\n readonly lifecycle: ProviderMaterializationTransactionLifecycle\n active: boolean\n writeOrdinal: number\n readonly work: Map<string, MaterializationWorkRecord>\n readonly workUniqueKeys: Set<string>\n readonly applyWork: MaterializationPlanWorkRecord[]\n readonly cardinalityWork: MaterializationCardinalityOccupantWorkRecord[]\n readonly eventWork: MaterializationEventWorkRecord[]\n readonly appliedPlanItems: string[]\n readonly outboxEnvelopes: Map<number, OntologyMaterializationEvent>\n readonly workStreams: Record<StreamMaterializationWorkInput[\"order\"], WorkStreamState>\n workSealed: boolean\n incidentLinksByObject: Map<string, readonly OntologyLinkRef[]> | null\n linkSlotStates: Map<string, MaterializationLinkScopeState> | null\n readonly objectExistence: Map<string, MaterializationObjectExistenceWorkRecord>\n replacement: ReplacementSessionState | null\n}\n\nexport interface WorkStreamState {\n started: boolean\n completed: boolean\n emittedCount: number\n}\n\nexport interface ReplacementObjectWork {\n readonly ref: OntologyObjectRef\n readonly sortKey: string\n}\n\nexport interface ReplacementLinkWork {\n readonly ref: OntologyLinkRef\n readonly sortKey: string\n diffRequired: boolean\n}\n\nexport interface ReplacementSessionState {\n readonly sourceId: string\n readonly candidateMaterializationId: string\n readonly previous: InMemorySourceMaterialization | undefined\n readonly candidate: InMemorySourceMaterialization\n readonly objects: Map<string, ReplacementObjectWork>\n readonly links: Map<string, ReplacementLinkWork>\n orderedObjects: ReplacementObjectWork[]\n orderedLinks: ReplacementLinkWork[] | null\n readonly affectedScopes: Set<string>\n readonly incidentObjects: Map<string, OntologyObjectRef>\n objectStreamStarted: boolean\n objectStreamCompleted: boolean\n linkStreamStarted: boolean\n linkStreamCompleted: boolean\n linksExpanded: boolean\n}\n\nexport class InMemoryOntologyMaterializationStorage implements OntologyMaterializationStorage {\n private readonly sessions = new WeakMap<object, SessionState>()\n private readonly liveSessions = new Set<SessionState>()\n\n constructor(\n private readonly state: InMemoryOntologyState,\n private readonly objects: InMemoryObjectStorage,\n private readonly timeseries: InMemoryTimeseriesStorage,\n private readonly getTransactionToken: () => object | null,\n private readonly getMaterializationLifecycle: () => ProviderMaterializationTransactionLifecycle | null,\n private readonly executionExists: (projectId: string, executionId: string) => Promise<boolean>,\n private readonly hooks: InMemoryOntologyStorageTestHooks = {}\n ) {}\n\n async begin(input: MaterializationPlanHeader): Promise<MaterializationSession> {\n const transactionToken = this.getTransactionToken()\n const lifecycle = this.getMaterializationLifecycle()\n if (!transactionToken || !lifecycle) {\n throw new MaterializationValidationError(\n \"Materialization sessions require an active storage transaction.\"\n )\n }\n assertMaterializationHeader(input)\n if (!(await this.executionExists(input.commit.projectId, input.commit.executionId))) {\n throw new MaterializationValidationError(\n `Ontology commit execution '${input.commit.executionId}' does not exist in project '${input.commit.projectId}'.`\n )\n }\n this.assertCommitAbsent(input)\n for (const expected of input.expected.sources)\n this.assertSource(expected, input.commit.projectId)\n for (const expected of input.expected.objects)\n await this.assertObject(expected, input.commit.projectId)\n for (const expected of input.expected.links)\n await this.assertLink(expected, input.commit.projectId)\n const expectedScopeRevisions = new Map<string, MaterializationLinkScopeRevision>()\n for (const expected of input.expected.linkScopes) {\n const key = linkScopeSortKey(expected.source, expected.linkId)\n const current =\n expectedScopeRevisions.get(key) ??\n this.computeEffectiveLinkScope(input.commit.projectId, expected.source, expected.linkId)\n expectedScopeRevisions.set(key, current)\n if (current.fingerprint !== expected.fingerprint) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Expected link scope changed for ${expected.source.objectTypeId}:${expected.source.primaryId}.${expected.linkId}.`\n )\n }\n }\n for (const expected of input.expected.points) this.assertPoint(expected, input.commit.projectId)\n\n const providerToken = {}\n const session = {\n providerToken,\n header: structuredClone(input),\n transactionToken,\n lifecycle,\n active: true,\n writeOrdinal: 0,\n work: new Map<string, MaterializationWorkRecord>(),\n workUniqueKeys: new Set<string>(),\n applyWork: [],\n cardinalityWork: [],\n eventWork: [],\n appliedPlanItems: [],\n outboxEnvelopes: new Map<number, OntologyMaterializationEvent>(),\n workStreams: {\n apply: { started: false, completed: false, emittedCount: 0 },\n cardinality: { started: false, completed: false, emittedCount: 0 },\n event: { started: false, completed: false, emittedCount: 0 },\n },\n workSealed: false,\n incidentLinksByObject: null,\n linkSlotStates: new Map(),\n objectExistence: new Map<string, MaterializationObjectExistenceWorkRecord>(),\n replacement: null,\n }\n this.sessions.set(providerToken, session)\n this.liveSessions.add(session)\n lifecycle.register(providerToken)\n return { providerToken }\n }\n\n deactivateTransaction(transactionToken: object): void {\n for (const session of this.liveSessions) {\n if (session.transactionToken !== transactionToken) continue\n this.releaseSession(session)\n }\n }\n\n /** Deactivate a session, drop its transaction-local work, and stop tracking it as live. */\n private releaseSession(session: SessionState): void {\n session.active = false\n session.work.clear()\n session.workUniqueKeys.clear()\n session.applyWork.length = 0\n session.cardinalityWork.length = 0\n session.eventWork.length = 0\n session.appliedPlanItems.length = 0\n session.outboxEnvelopes.clear()\n session.incidentLinksByObject = null\n session.linkSlotStates = null\n session.objectExistence.clear()\n session.replacement = null\n this.liveSessions.delete(session)\n session.lifecycle.complete(session.providerToken)\n }\n\n async *streamState(\n input: StreamMaterializationStateInput\n ): AsyncIterable<MaterializationStatePage> {\n const session = this.requireSession(input.session)\n assertPageRows(input.pageRows)\n for await (const request of input.requests) {\n this.requireSession(input.session)\n this.hooks.beforeRead?.(\"state.read\")\n const objectRefs = uniqueSorted(request.objects, objectRefKey, objectRefSortKey)\n for (let offset = 0; offset < objectRefs.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const objects: MaterializationObjectState[] = []\n for (const ref of objectRefs.slice(offset, offset + input.pageRows)) {\n objects.push(await this.objectState(session, ref))\n }\n this.requireSession(input.session)\n this.hooks.observeBuffer?.(\"state.object.page\", objects.length)\n yield { objects, links: [], linkScopes: [], points: [] }\n }\n\n const linkRefs = uniqueSorted(request.links, linkRefKey, linkRefSortKey)\n for (let offset = 0; offset < linkRefs.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const links: MaterializationLinkState[] = []\n for (const ref of linkRefs.slice(offset, offset + input.pageRows)) {\n links.push(await this.linkState(session, ref))\n }\n this.requireSession(input.session)\n this.hooks.observeBuffer?.(\"state.link.page\", links.length)\n yield { objects: [], links, linkScopes: [], points: [] }\n }\n\n const incidentRefs = this.incidentLinkRefs(session, request.incidentObjects)\n for (let offset = 0; offset < incidentRefs.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const refs = incidentRefs.slice(offset, offset + input.pageRows)\n const links: MaterializationLinkState[] = []\n for (const ref of refs) links.push(await this.linkState(session, ref))\n this.requireSession(input.session)\n this.hooks.observeBuffer?.(\"state.incident-link.page\", links.length)\n yield { objects: [], links, linkScopes: [], points: [] }\n }\n\n for (const scope of uniqueBy(request.linkScopes, (value) =>\n linkScopeSortKey(value.source, value.linkId)\n )) {\n this.requireSession(input.session)\n const value = this.linkSlotState(session, scope.source, scope.linkId)\n // Scope rows are currently only requested for cardinality-one links, so the complete member\n // set is bounded by the ontology invariant. Replacement scope enumeration is flattened in\n // its dedicated stream and never uses this shape.\n yield { objects: [], links: [], linkScopes: [value], points: [] }\n }\n\n const requestedPoints = uniqueSorted(\n request.points,\n (point) => telemetryPointKey(point.series, point.at),\n (point) => telemetryPointSortKey(point.series, point.at)\n )\n for (let offset = 0; offset < requestedPoints.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const points: StoredTelemetryPoint[] = []\n for (const point of requestedPoints.slice(offset, offset + input.pageRows)) {\n const stored = getInMemoryTimeseriesMaterializerAdapter(this.timeseries).getExactPoint(\n session.header.commit.projectId,\n point.series,\n point.at\n )\n if (stored) points.push(storedPoint(stored))\n }\n this.requireSession(input.session)\n this.hooks.observeBuffer?.(\"state.point.page\", points.length)\n if (points.length > 0) yield { objects: [], links: [], linkScopes: [], points }\n }\n }\n }\n\n async *streamSourceReplacementState(\n input: StreamSourceReplacementStateInput\n ): AsyncIterable<SourceReplacementStatePage> {\n const session = this.requireSession(input.session)\n assertPageRows(input.pageRows)\n const replacement = this.requireReplacement(session, input)\n if (input.entityKind === \"object\") {\n if (replacement.candidate.projectionKind !== \"object\") {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Link projection replacement cannot stream object state.\"\n )\n }\n if (replacement.objectStreamStarted)\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Replacement object state may only be streamed once per session.\"\n )\n replacement.objectStreamStarted = true\n this.hooks.beforeRead?.(\"source-replacement.object\")\n for (let offset = 0; offset < replacement.orderedObjects.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const selected = replacement.orderedObjects.slice(offset, offset + input.pageRows)\n const objects: SourceReplacementObjectState[] = []\n for (const entry of selected) {\n const key = projectionEntityKey({ kind: \"object\", ref: entry.ref })\n const base = await this.objectState(session, entry.ref)\n objects.push({\n ref: base.ref,\n candidateSource: storedSourceObject(\n input.source.projectionId,\n replacement.candidate.materializationId,\n replacement.candidate.rowsByEntity.get(key)\n ),\n override: base.override,\n effective: base.effective,\n latestTelemetry: base.latestTelemetry,\n })\n }\n this.requireSession(input.session)\n this.hooks.observeBuffer?.(\"replacement.object.page\", objects.length)\n yield { objects, links: [] }\n }\n this.requireSession(input.session)\n replacement.objectStreamCompleted = true\n return\n }\n\n if (replacement.candidate.projectionKind === \"object\" && !replacement.objectStreamCompleted) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Object projection replacement must fully stream object state before link state.\"\n )\n }\n if (replacement.linkStreamStarted)\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Replacement link state may only be streamed once per session.\"\n )\n replacement.linkStreamStarted = true\n this.hooks.beforeRead?.(\"source-replacement.link\")\n this.expandReplacementLinks(session, replacement)\n replacement.orderedLinks ??= [...replacement.links.values()].sort((left, right) =>\n left.sortKey.localeCompare(right.sortKey)\n )\n for (let offset = 0; offset < replacement.orderedLinks.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const selected = replacement.orderedLinks.slice(offset, offset + input.pageRows)\n const links: SourceReplacementLinkState[] = []\n for (const entry of selected) {\n const key = projectionEntityKey({ kind: \"link\", ref: entry.ref })\n const base = await this.linkState(session, entry.ref)\n const ownedByReplacement =\n replacement.previous?.rowsByEntity.has(key) || replacement.candidate.rowsByEntity.has(key)\n links.push({\n ref: base.ref,\n candidateSource: ownedByReplacement\n ? storedSourceLink(\n input.source.projectionId,\n replacement.candidate.materializationId,\n replacement.candidate.rowsByEntity.get(key)\n )\n : base.source,\n override: base.override,\n slotOverride: base.slotOverride,\n effective: base.effective,\n diffRequired: entry.diffRequired,\n })\n }\n this.requireSession(input.session)\n this.hooks.observeBuffer?.(\"replacement.link.page\", links.length)\n yield { objects: [], links }\n }\n this.requireSession(input.session)\n replacement.linkStreamCompleted = true\n }\n\n async stageWork(input: StageMaterializationWorkInput): Promise<void> {\n const session = this.requireSession(input.session)\n if (session.workSealed) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Materialization work cannot be staged after draining begins.\"\n )\n }\n const batchKeys = new Set<string>()\n const batchUniqueKeys = new Set<string>()\n for (const record of input.records) {\n assertWorkRecord(record, session.header)\n const uniqueKey = workUniquenessKey(record)\n if (\n batchKeys.has(record.recordKey) ||\n session.work.has(record.recordKey) ||\n batchUniqueKeys.has(uniqueKey) ||\n session.workUniqueKeys.has(uniqueKey)\n ) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Duplicate materialization work key '${record.recordKey}'.`\n )\n }\n if (\n record.kind === \"incident-object\" &&\n (!session.replacement || session.replacement.linkStreamStarted)\n ) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Incident replacement work must be staged before link state is streamed.\"\n )\n }\n batchKeys.add(record.recordKey)\n batchUniqueKeys.add(uniqueKey)\n }\n const cloned = input.records.map((record) => structuredClone(record))\n this.hooks.observeWork?.(cloned)\n for (const record of cloned) {\n session.work.set(record.recordKey, record)\n session.workUniqueKeys.add(workUniquenessKey(record))\n if (record.kind === \"plan\") session.applyWork.push(record)\n if (record.kind === \"cardinality\") session.cardinalityWork.push(record)\n if (record.kind === \"event\") session.eventWork.push(record)\n if (record.kind === \"object-existence\") {\n session.objectExistence.set(objectRefKey(record.ref), record)\n }\n if (record.kind === \"incident-object\") {\n const replacement = session.replacement\n if (replacement) {\n replacement.incidentObjects.set(objectRefKey(record.ref), record.ref)\n replacement.linksExpanded = false\n replacement.orderedLinks = null\n }\n }\n }\n this.hooks.observeBuffer?.(\"work.stage\", cloned.length)\n }\n\n async *streamWork(input: StreamMaterializationWorkInput): AsyncIterable<MaterializationWorkPage> {\n const session = this.requireSession(input.session)\n assertPageRows(input.pageRows)\n const stream = session.workStreams[input.order]\n if (stream.started) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Materialization ${input.order} work may only be streamed once per session.`\n )\n }\n stream.started = true\n if (!session.workSealed) {\n session.applyWork.sort(comparePlanWork)\n session.cardinalityWork.sort(compareCardinalityWork)\n session.eventWork.sort(compareEventWork)\n session.workSealed = true\n }\n const records =\n input.order === \"apply\"\n ? session.applyWork\n : input.order === \"cardinality\"\n ? session.cardinalityWork\n : session.eventWork\n for (let offset = 0; offset < records.length; offset += input.pageRows) {\n this.requireSession(input.session)\n const selected = records.slice(offset, offset + input.pageRows)\n this.hooks.observeBuffer?.(`work.${input.order}.page`, selected.length)\n stream.emittedCount = offset + selected.length\n yield { records: structuredClone(selected) }\n }\n this.requireSession(input.session)\n stream.completed = true\n }\n\n async readObjectExistence(\n input: ReadMaterializationObjectExistenceInput\n ): Promise<readonly MaterializationObjectExistence[]> {\n const session = this.requireSession(input.session)\n const result: MaterializationObjectExistence[] = []\n for (const ref of input.refs) {\n const record = session.objectExistence.get(objectRefKey(ref))\n if (record) {\n result.push({ ref: structuredClone(record.ref), exists: record.exists })\n }\n }\n return result\n }\n\n async applyChunk(input: ApplyMaterializationChunkInput): Promise<void> {\n const session = this.requireSession(input.session)\n const projectId = session.header.commit.projectId\n assertPlanChunkCorrelations(input.chunk, session.header.commit)\n assertChunkSequence(session, input.chunk)\n this.hooks.observeBuffer?.(\"apply.chunk\", materializationChunkRows(input.chunk))\n const write = (boundary: string, apply: () => void): void => {\n this.hooks.beforeWrite?.(boundary, session.writeOrdinal++)\n apply()\n }\n\n for (const item of input.chunk.overrides.objects.upserts)\n write(\"override.object.upsert\", () => {\n const key = projectEntityKey(projectId, objectRefKey(item.ref))\n assertLastCommit(\n this.state.objectOverrides.get(key),\n item.expectedLastCommitId,\n \"object override\"\n )\n this.state.objectOverrides.set(\n key,\n structuredClone({\n projectId,\n ref: item.ref,\n value: item.value,\n editedAt: { ...item.editedAt },\n lastCommitId: item.lastCommitId,\n updatedAt: item.updatedAt,\n })\n )\n })\n for (const item of input.chunk.overrides.objects.deletes)\n write(\"override.object.delete\", () => {\n const key = projectEntityKey(projectId, objectRefKey(item.ref))\n assertLastCommit(\n this.state.objectOverrides.get(key),\n item.expectedLastCommitId,\n \"object override\"\n )\n this.state.objectOverrides.delete(key)\n })\n for (const item of input.chunk.overrides.links.edges.upserts)\n write(\"override.link.upsert\", () => {\n const key = projectEntityKey(projectId, linkRefKey(item.ref))\n assertLastCommit(\n this.state.linkOverrides.get(key),\n item.expectedLastCommitId,\n \"link edge override\"\n )\n this.state.linkOverrides.set(\n key,\n structuredClone({\n projectId,\n ref: item.ref,\n value: item.value,\n lastCommitId: item.lastCommitId,\n updatedAt: item.updatedAt,\n })\n )\n })\n for (const item of input.chunk.overrides.links.edges.deletes)\n write(\"override.link.delete\", () => {\n const key = projectEntityKey(projectId, linkRefKey(item.ref))\n assertLastCommit(\n this.state.linkOverrides.get(key),\n item.expectedLastCommitId,\n \"link edge override\"\n )\n this.state.linkOverrides.delete(key)\n })\n for (const item of input.chunk.overrides.links.slots.upserts)\n write(\"override.link-slot.upsert\", () => {\n const key = projectEntityKey(projectId, linkScopeKey(item.ref.source, item.ref.linkId))\n assertLastCommit(\n this.state.linkSlotOverrides.get(key),\n item.expectedLastCommitId,\n \"link slot override\"\n )\n this.state.linkSlotOverrides.set(\n key,\n structuredClone({\n projectId,\n ref: item.ref,\n value: item.value,\n lastCommitId: item.lastCommitId,\n updatedAt: item.updatedAt,\n })\n )\n })\n for (const item of input.chunk.overrides.links.slots.deletes)\n write(\"override.link-slot.delete\", () => {\n const key = projectEntityKey(projectId, linkScopeKey(item.ref.source, item.ref.linkId))\n assertLastCommit(\n this.state.linkSlotOverrides.get(key),\n item.expectedLastCommitId,\n \"link slot override\"\n )\n this.state.linkSlotOverrides.delete(key)\n })\n\n for (const item of input.chunk.effective.linkDeletes)\n write(\"effective.link.delete\", () => {\n this.assertLinkSync(item.expected, projectId)\n getInMemoryObjectMaterializerAdapter(this.objects).deleteExactLink({\n projectId,\n sourceTypeId: item.ref.source.objectTypeId,\n sourceId: item.ref.source.primaryId,\n linkId: item.ref.linkId,\n targetTypeId: item.ref.target.objectTypeId,\n targetId: item.ref.target.primaryId,\n })\n })\n for (const item of input.chunk.effective.objectDeletes)\n write(\"effective.object.delete\", () => {\n this.assertObjectSync(item.expected, projectId)\n getInMemoryObjectMaterializerAdapter(this.objects).deleteExactObject(\n projectId,\n item.ref.objectTypeId,\n item.ref.primaryId\n )\n })\n for (const item of input.chunk.effective.objectUpserts)\n write(\"effective.object.upsert\", () => {\n this.assertObjectSync(item.expected, projectId)\n getInMemoryObjectMaterializerAdapter(this.objects).applyExactObject(item.row, projectId)\n })\n for (const item of input.chunk.effective.linkUpserts)\n write(\"effective.link.upsert\", () => {\n this.assertLinkSync(item.expected, projectId)\n getInMemoryObjectMaterializerAdapter(this.objects).applyExactLink(item.row, projectId)\n })\n for (const item of input.chunk.timeseries.pointUpserts)\n write(\"timeseries.point.upsert\", () => {\n this.assertPoint(item.expected, projectId)\n getInMemoryTimeseriesMaterializerAdapter(this.timeseries).applyExactPoint(\n projectId,\n item.point\n )\n })\n for (const item of input.chunk.outbox)\n write(\"outbox.insert\", () => {\n const envelope = item.envelope\n if (envelope.projectId !== projectId || envelope.commitId !== session.header.commit.id) {\n throw new MaterializationValidationError(\n \"Outbox event does not correlate with its materialization commit.\"\n )\n }\n assertTimestamp(item.availableAt, \"Outbox availableAt\")\n assertTimestamp(item.createdAt, \"Outbox createdAt\")\n assertTimestamp(envelope.occurredAt, \"Outbox event occurredAt\")\n const key = outboxKey(projectId, envelope.id)\n if (this.state.outbox.has(key)) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Duplicate outbox event '${envelope.id}'.`\n )\n }\n if (session.outboxEnvelopes.has(envelope.commitOrdinal))\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Duplicate outbox commit ordinal.\"\n )\n this.state.outbox.set(key, {\n envelope: structuredClone(envelope),\n availableAt: item.availableAt,\n attempts: 0,\n leaseId: null,\n leaseExpiresAt: null,\n publishedAt: null,\n lastFailure: null,\n createdAt: item.createdAt,\n })\n session.outboxEnvelopes.set(envelope.commitOrdinal, structuredClone(envelope))\n })\n for (const item of materializationPlanItems(input.chunk)) {\n session.appliedPlanItems.push(stableJsonStringify(item))\n }\n }\n\n async finalize(input: FinalizeMaterializationInput): Promise<ApplyMaterializationResult> {\n const session = this.requireSession(input.session)\n const { commit } = session.header\n // Recheck reservations at the durable boundary: callers may open more than one session in the\n // same transaction before either one finalizes.\n this.assertCommitAbsent(session.header)\n assertFinalizationCorrelations(session, input.finalization, this.state, this.objects)\n this.hooks.beforeWrite?.(\"finalize\", session.writeOrdinal++)\n for (const activation of input.finalization.sourceActivations) {\n this.hooks.beforeWrite?.(\"source.activate\", session.writeOrdinal++)\n assertTimestamp(activation.datasetVersion.createdAt, \"Source dataset version createdAt\")\n assertTimestamp(activation.updatedAt, \"Source activation updatedAt\")\n this.assertSource(activation.expected, commit.projectId)\n const candidateKey = sourceMaterializationKey(\n commit.projectId,\n activation.source.projectionId,\n activation.materializationId\n )\n const candidate = this.state.sourceMaterializations.get(candidateKey)\n if (!candidate || candidate.status !== \"ready\")\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Source activation candidate is missing or is not ready.\"\n )\n const previous = findActiveSourceMaterialization(\n this.state,\n commit.projectId,\n activation.source.projectionId\n )\n if (previous) {\n this.state.sourceMaterializations.set(\n sourceMaterializationKey(\n previous.projectId,\n previous.source.projectionId,\n previous.materializationId\n ),\n {\n ...previous,\n status: \"superseded\",\n executionToken: null,\n terminalAt: activation.updatedAt,\n updatedAt: activation.updatedAt,\n }\n )\n }\n this.state.sourceMaterializations.set(candidateKey, {\n ...candidate,\n status: \"active\",\n executionToken: null,\n activatedAt: activation.updatedAt,\n lastCommitId: activation.lastCommitId,\n updatedAt: activation.updatedAt,\n })\n }\n const record = {\n ...structuredClone(commit),\n result: structuredClone(input.finalization.result),\n } as OntologyCommitRecord\n this.state.commitsById.set(commitKey(commit.projectId, commit.id), record)\n this.state.commitIdByIdempotency.set(\n idempotencyKey(commit.projectId, commit.idempotencyKey),\n commit.id\n )\n const origin = ontologyCommitOriginSelector(commit.origin)\n if (origin) {\n this.state.commitIdByOrigin.set(commitOriginKey(commit.projectId, origin), commit.id)\n }\n this.releaseSession(session)\n return { commit: structuredClone(record) }\n }\n\n private requireSession(session: MaterializationSession): SessionState {\n const value = this.sessions.get(session.providerToken)\n if (\n !value ||\n !value.active ||\n !this.getTransactionToken() ||\n this.getTransactionToken() !== value.transactionToken\n ) {\n throw new MaterializationConflictError(\n \"effective-state\",\n \"Materialization session is inactive.\"\n )\n }\n return value\n }\n\n private requireReplacement(\n session: SessionState,\n input: StreamSourceReplacementStateInput\n ): ReplacementSessionState {\n if (session.replacement) {\n if (\n session.replacement.sourceId !== input.source.projectionId ||\n session.replacement.candidateMaterializationId !== input.candidateMaterializationId\n ) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Materialization session already owns another replacement union.\"\n )\n }\n return session.replacement\n }\n const projectId = session.header.commit.projectId\n const sourceId = input.source.projectionId\n const candidate = this.state.sourceMaterializations.get(\n sourceMaterializationKey(projectId, sourceId, input.candidateMaterializationId)\n )\n if (!candidate || candidate.status !== \"ready\") {\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Candidate source materialization '${input.candidateMaterializationId}' is missing or is not ready.`\n )\n }\n const previous = findActiveSourceMaterialization(this.state, projectId, sourceId)\n if (\n candidate.protocol !== \"replacement\" ||\n (previous &&\n (previous.protocol !== candidate.protocol ||\n previous.projectionKind !== candidate.projectionKind))\n ) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n \"Source replacement kind or protocol does not match its active materialization.\"\n )\n }\n const replacement: ReplacementSessionState = {\n sourceId,\n candidateMaterializationId: input.candidateMaterializationId,\n previous,\n candidate,\n objects: new Map(),\n links: new Map(),\n orderedObjects: [],\n orderedLinks: null,\n affectedScopes: new Set(),\n incidentObjects: new Map(),\n objectStreamStarted: false,\n objectStreamCompleted: false,\n linkStreamStarted: false,\n linkStreamCompleted: false,\n linksExpanded: false,\n }\n for (const materialization of [previous, candidate]) {\n if (!materialization) continue\n for (const row of materialization.rowsByEntity.values()) {\n if (row.assertion.kind === \"object\") {\n const ref = row.assertion.ref\n replacement.objects.set(objectRefKey(ref), { ref, sortKey: objectRefSortKey(ref) })\n } else {\n addReplacementLink(replacement, row.assertion.ref, true)\n }\n }\n }\n replacement.orderedObjects = [...replacement.objects.values()].sort((left, right) =>\n left.sortKey.localeCompare(right.sortKey)\n )\n session.replacement = replacement\n return replacement\n }\n\n private expandReplacementLinks(\n session: SessionState,\n replacement: ReplacementSessionState\n ): void {\n if (replacement.linksExpanded) return\n const projectId = session.header.commit.projectId\n const incident = replacement.incidentObjects\n const touchesIncident = (ref: OntologyLinkRef): boolean =>\n incident.has(objectRefKey(ref.source)) || incident.has(objectRefKey(ref.target))\n\n const adapter = getInMemoryObjectMaterializerAdapter(this.objects)\n adapter.visitExactLinks(projectId, (row) => {\n const ref = linkRef(row)\n if (touchesIncident(ref)) addReplacementLink(replacement, ref, true)\n })\n for (const override of this.state.linkOverrides.values()) {\n if (override.projectId !== projectId) continue\n if (touchesIncident(override.ref)) addReplacementLink(replacement, override.ref, true)\n }\n for (const override of this.state.linkSlotOverrides.values()) {\n if (override.projectId !== projectId) continue\n const ref = {\n source: override.ref.source,\n linkId: override.ref.linkId,\n target: override.value.target,\n }\n if (touchesIncident(ref)) addReplacementLink(replacement, ref, true)\n }\n for (const active of this.state.sourceMaterializations.values()) {\n if (active.projectId !== projectId || active.status !== \"active\") continue\n for (const row of active.rowsByEntity.values()) {\n if (row.assertion.kind === \"link\" && touchesIncident(row.assertion.ref)) {\n addReplacementLink(replacement, row.assertion.ref, true)\n }\n }\n }\n\n adapter.visitExactLinks(projectId, (row) => {\n const ref = linkRef(row)\n if (replacement.affectedScopes.has(linkScopeSortKey(ref.source, ref.linkId))) {\n addReplacementLink(replacement, ref, false)\n }\n })\n for (const override of this.state.linkSlotOverrides.values()) {\n if (\n override.projectId === projectId &&\n replacement.affectedScopes.has(linkScopeSortKey(override.ref.source, override.ref.linkId))\n ) {\n addReplacementLink(\n replacement,\n {\n source: override.ref.source,\n linkId: override.ref.linkId,\n target: override.value.target,\n },\n false\n )\n }\n }\n replacement.linksExpanded = true\n replacement.orderedLinks = null\n }\n\n private assertCommitAbsent(header: MaterializationPlanHeader): void {\n if (this.state.commitsById.has(commitKey(header.commit.projectId, header.commit.id))) {\n throw new MaterializationConflictError(\n \"idempotency\",\n `Ontology commit '${header.commit.id}' already exists.`\n )\n }\n if (\n this.state.commitIdByIdempotency.has(\n idempotencyKey(header.commit.projectId, header.commit.idempotencyKey)\n )\n ) {\n throw new MaterializationConflictError(\n \"idempotency\",\n \"Ontology idempotency key already exists.\"\n )\n }\n const origin = ontologyCommitOriginSelector(header.commit.origin)\n if (\n origin &&\n this.state.commitIdByOrigin.has(commitOriginKey(header.commit.projectId, origin))\n ) {\n throw new MaterializationConflictError(\n \"run-correlation\",\n \"Ontology commit origin already has an authoritative commit.\"\n )\n }\n }\n\n private assertSource(expected: ExpectedSourceRevision, projectId: string): void {\n const current = findActiveSourceMaterialization(\n this.state,\n projectId,\n expected.source.projectionId\n )\n if (\n (current?.materializationId ?? null) !== expected.activeMaterializationId ||\n (current?.lastCommitId ?? null) !== expected.lastCommitId\n ) {\n throw new MaterializationConflictError(\n \"projection-fence\",\n `Source '${expected.source.projectionId}' changed.`\n )\n }\n }\n\n private async assertObject(expected: ExpectedObjectRevision, projectId: string): Promise<void> {\n this.assertObjectSync(expected, projectId)\n }\n\n private assertObjectSync(expected: ExpectedObjectRevision, projectId: string): void {\n const row = getInMemoryObjectMaterializerAdapter(this.objects).getExactObjectRow(\n projectId,\n expected.ref.objectTypeId,\n expected.ref.primaryId\n )\n if (!expected.exists) {\n if (row)\n throw new MaterializationConflictError(\n \"effective-state\",\n `Expected object ${objectRefKey(expected.ref)} to be absent.`\n )\n return\n }\n if (!row || row.version !== expected.version || row.lastCommitId !== expected.lastCommitId) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Expected object ${objectRefKey(expected.ref)} changed.`\n )\n }\n }\n\n private async assertLink(expected: ExpectedLinkRevision, projectId: string): Promise<void> {\n this.assertLinkSync(expected, projectId)\n }\n\n private assertLinkSync(expected: ExpectedLinkRevision, projectId: string): void {\n const row = getInMemoryObjectMaterializerAdapter(this.objects).getExactLinkRow(projectId, {\n sourceTypeId: expected.ref.source.objectTypeId,\n sourceId: expected.ref.source.primaryId,\n linkId: expected.ref.linkId,\n targetTypeId: expected.ref.target.objectTypeId,\n targetId: expected.ref.target.primaryId,\n })\n if (!expected.exists) {\n if (row)\n throw new MaterializationConflictError(\n \"effective-state\",\n `Expected link ${linkRefKey(expected.ref)} to be absent.`\n )\n return\n }\n if (!row || row.lastCommitId !== expected.lastCommitId) {\n throw new MaterializationConflictError(\n \"effective-state\",\n `Expected link ${linkRefKey(expected.ref)} changed.`\n )\n }\n }\n\n private assertPoint(expected: ExpectedTimeseriesPointRevision, projectId: string): void {\n const point = getInMemoryTimeseriesMaterializerAdapter(this.timeseries).getExactPoint(\n projectId,\n expected.series,\n expected.at\n )\n if ((point?.lastCommitId ?? null) !== expected.lastCommitId) {\n throw new MaterializationConflictError(\n \"timeseries-point\",\n `Telemetry point ${telemetryPointKey(expected.series, expected.at)} changed.`\n )\n }\n }\n\n private async objectState(\n session: SessionState,\n ref: OntologyObjectRef\n ): Promise<MaterializationObjectState> {\n const projectId = session.header.commit.projectId\n const row = await this.objects.getByPrimaryId({\n projectId,\n objectTypeId: ref.objectTypeId,\n primaryId: ref.primaryId,\n })\n return {\n ref: structuredClone(ref),\n source: this.findActiveObjectSource(projectId, ref),\n override: structuredClone(\n publicObjectOverride(\n this.state.objectOverrides.get(projectEntityKey(projectId, objectRefKey(ref)))\n )\n ),\n effective: row ? objectSnapshot(row) : null,\n latestTelemetry: getInMemoryTimeseriesMaterializerAdapter(this.timeseries)\n .listLatestForObject(projectId, ref.objectTypeId, ref.primaryId)\n .map(storedPoint),\n }\n }\n\n private async linkState(\n session: SessionState,\n ref: OntologyLinkRef\n ): Promise<MaterializationLinkState> {\n const projectId = session.header.commit.projectId\n const row = getInMemoryObjectMaterializerAdapter(this.objects).getExactLinkRow(projectId, {\n sourceTypeId: ref.source.objectTypeId,\n sourceId: ref.source.primaryId,\n linkId: ref.linkId,\n targetTypeId: ref.target.objectTypeId,\n targetId: ref.target.primaryId,\n })\n return {\n ref: structuredClone(ref),\n source: this.findActiveLinkSource(projectId, ref),\n override: structuredClone(\n publicLinkOverride(\n this.state.linkOverrides.get(projectEntityKey(projectId, linkRefKey(ref)))\n )\n ),\n slotOverride: structuredClone(\n publicLinkSlotOverride(\n this.state.linkSlotOverrides.get(\n projectEntityKey(projectId, linkScopeKey(ref.source, ref.linkId))\n )\n )\n ),\n effective: row ? linkSnapshot(row) : null,\n }\n }\n\n private linkSlotState(\n session: SessionState,\n source: OntologyObjectRef,\n linkId: string\n ): MaterializationLinkScopeState {\n session.linkSlotStates ??= new Map()\n const key = linkScopeSortKey(source, linkId)\n const existing = session.linkSlotStates.get(key)\n if (existing) return structuredClone(existing)\n const computed = this.computeLinkSlotState(session.header.commit.projectId, source, linkId)\n session.linkSlotStates.set(key, computed)\n return structuredClone(computed)\n }\n\n private computeLinkSlotState(\n projectId: string,\n source: OntologyObjectRef,\n linkId: string\n ): MaterializationLinkScopeState {\n const value = this.computeEffectiveLinkScope(projectId, source, linkId)\n return {\n ...value,\n sourceAssertion: this.findActiveLinkScopeSource(projectId, source, linkId),\n override: structuredClone(\n publicLinkSlotOverride(\n this.state.linkSlotOverrides.get(\n projectEntityKey(projectId, linkScopeKey(source, linkId))\n )\n )\n ),\n }\n }\n\n private computeEffectiveLinkScope(\n projectId: string,\n source: OntologyObjectRef,\n linkId: string\n ): MaterializationLinkScopeRevision & Pick<MaterializationLinkScopeState, \"effective\"> {\n const rows: ObjectLinkRow[] = []\n getInMemoryObjectMaterializerAdapter(this.objects).visitExactScopeLinks(\n projectId,\n source.objectTypeId,\n source.primaryId,\n linkId,\n (row) => rows.push(row)\n )\n rows.sort((left, right) =>\n linkRefSortKey(linkRef(left)).localeCompare(linkRefSortKey(linkRef(right)))\n )\n const accumulator = startScopeAccumulator(source, linkId)\n for (let offset = 0; offset < rows.length; offset += 1_000) {\n const page = rows.slice(offset, offset + 1_000)\n this.hooks.observeBuffer?.(\"state.link-scope.page\", page.length)\n for (const row of page) {\n appendScopeSnapshot(accumulator, linkSnapshot(row))\n }\n }\n const effective = rows.length === 1 ? linkSnapshot(rows[0]!) : null\n return {\n ...finishScopeAccumulator(accumulator),\n effective,\n }\n }\n\n private findActiveLinkScopeSource(\n projectId: string,\n source: OntologyObjectRef,\n linkId: string\n ): StoredSourceLinkAssertion | null {\n let found: StoredSourceLinkAssertion | null = null\n for (const active of this.state.sourceMaterializations.values()) {\n if (active.projectId !== projectId || active.status !== \"active\") continue\n for (const row of active.rowsByEntity.values()) {\n if (\n row.assertion.kind !== \"link\" ||\n objectRefKey(row.assertion.ref.source) !== objectRefKey(source) ||\n row.assertion.ref.linkId !== linkId\n ) {\n continue\n }\n if (found) {\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Multiple active source links assert cardinality-one scope '${source.objectTypeId}.${linkId}'.`\n )\n }\n found = storedSource(\n active.source.projectionId,\n active.materializationId,\n row\n ) as StoredSourceLinkAssertion\n }\n }\n return structuredClone(found)\n }\n\n private findActiveObjectSource(\n projectId: string,\n ref: OntologyObjectRef\n ): StoredSourceObjectAssertion | null {\n const found = this.findActiveSource(projectId, projectionEntityKey({ kind: \"object\", ref }))\n return found?.assertion.kind === \"object\" ? (found as StoredSourceObjectAssertion) : null\n }\n\n private findActiveLinkSource(\n projectId: string,\n ref: OntologyLinkRef\n ): StoredSourceLinkAssertion | null {\n const found = this.findActiveSource(projectId, projectionEntityKey({ kind: \"link\", ref }))\n return found?.assertion.kind === \"link\" ? (found as StoredSourceLinkAssertion) : null\n }\n\n private findActiveSource(projectId: string, entityKey: string): StoredSourceAssertion | null {\n let found: StoredSourceAssertion | null = null\n for (const active of this.state.sourceMaterializations.values()) {\n if (active.projectId !== projectId || active.status !== \"active\") continue\n const row = active.rowsByEntity.get(entityKey)\n if (!row) continue\n if (found)\n throw new MaterializationConflictError(\n \"source-materialization\",\n `Multiple active sources assert ${entityKey}.`\n )\n found = storedSource(active.source.projectionId, active.materializationId, row)\n }\n return structuredClone(found)\n }\n\n private incidentLinkRefs(\n session: SessionState,\n objects: readonly OntologyObjectRef[]\n ): readonly OntologyLinkRef[] {\n if (objects.length === 0) return []\n session.incidentLinksByObject ??= this.buildIncidentLinkIndex(session.header.commit.projectId)\n const selected = new Map<string, OntologyLinkRef>()\n for (const object of objects) {\n for (const ref of session.incidentLinksByObject.get(objectRefKey(object)) ?? []) {\n selected.set(linkRefSortKey(ref), ref)\n }\n }\n return [...selected.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([, ref]) => ref)\n }\n\n private buildIncidentLinkIndex(projectId: string): Map<string, readonly OntologyLinkRef[]> {\n const mutable = new Map<string, Map<string, OntologyLinkRef>>()\n const consider = (ref: OntologyLinkRef): void => {\n const sortKey = linkRefSortKey(ref)\n for (const endpoint of [ref.source, ref.target]) {\n const key = objectRefKey(endpoint)\n const links = mutable.get(key) ?? new Map<string, OntologyLinkRef>()\n links.set(sortKey, structuredClone(ref))\n mutable.set(key, links)\n }\n }\n getInMemoryObjectMaterializerAdapter(this.objects).visitExactLinks(projectId, (row) =>\n consider(linkRef(row))\n )\n for (const override of this.state.linkOverrides.values()) {\n if (override.projectId === projectId) consider(override.ref)\n }\n for (const override of this.state.linkSlotOverrides.values()) {\n if (override.projectId !== projectId) continue\n consider({\n source: override.ref.source,\n linkId: override.ref.linkId,\n target: override.value.target,\n })\n }\n for (const active of this.state.sourceMaterializations.values()) {\n if (active.projectId !== projectId || active.status !== \"active\") continue\n for (const row of active.rowsByEntity.values()) {\n if (row.assertion.kind === \"link\") consider(row.assertion.ref)\n }\n }\n const index = new Map<string, readonly OntologyLinkRef[]>()\n for (const [objectKey, refs] of mutable) {\n index.set(\n objectKey,\n [...refs.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([, ref]) => ref)\n )\n }\n return index\n }\n}\n",
28
- "import {\n MaterializationConflictError,\n MaterializationValidationError,\n} from \"../../../materialization/errors\"\nimport type {\n ClaimedOntologyOutboxRow,\n ClaimOntologyOutboxInput,\n CompleteOntologyOutboxLeaseInput,\n OntologyOutboxRecord,\n OntologyOutboxStorage,\n OntologyOutboxSummary,\n PurgePublishedOntologyOutboxInput,\n RescheduleOntologyOutboxLeaseInput,\n SummarizeOntologyOutboxInput,\n} from \"../outbox\"\nimport {\n assertNonblank,\n assertTimestamp,\n type InMemoryOntologyState,\n insertBounded,\n outboxKey,\n} from \"./shared-state\"\n\nexport class InMemoryOntologyOutboxStorage implements OntologyOutboxStorage {\n constructor(\n private readonly state: InMemoryOntologyState,\n private readonly runRootOperation: <T>(run: () => Promise<T> | T) => Promise<T>\n ) {}\n\n async claim(input: ClaimOntologyOutboxInput): Promise<readonly ClaimedOntologyOutboxRow[]> {\n return this.runRootOperation(() => this.claimUnlocked(input))\n }\n\n private claimUnlocked(input: ClaimOntologyOutboxInput): readonly ClaimedOntologyOutboxRow[] {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertPositiveLimit(input.limit)\n const now = assertTimestamp(input.now, \"Ontology outbox claim time\")\n const leaseExpiresAt = assertTimestamp(input.leaseExpiresAt, \"Ontology outbox lease expiry\")\n assertNonblank(input.leaseId, \"Ontology outbox lease id\")\n if (leaseExpiresAt <= now) {\n throw new MaterializationValidationError(\n \"Ontology outbox lease expiry must be later than the claim time.\"\n )\n }\n const rows: OntologyOutboxRecord[] = []\n for (const row of this.state.outbox.values()) {\n if (row.envelope.projectId !== input.projectId) continue\n assertPairedLease(row)\n if (row.publishedAt !== null || Date.parse(row.availableAt) > now) continue\n if (row.leaseExpiresAt !== null && Date.parse(row.leaseExpiresAt) > now) continue\n insertBounded(rows, row, input.limit, compareClaimRows)\n }\n return rows.map((row) => {\n const claimed: ClaimedOntologyOutboxRow = {\n ...row,\n attempts: row.attempts + 1,\n leaseId: input.leaseId,\n leaseExpiresAt: input.leaseExpiresAt,\n }\n this.state.outbox.set(outboxKey(input.projectId, row.envelope.id), structuredClone(claimed))\n return structuredClone(claimed)\n })\n }\n\n async markPublished(input: CompleteOntologyOutboxLeaseInput): Promise<void> {\n await this.runRootOperation(() => this.markPublishedUnlocked(input))\n }\n\n private markPublishedUnlocked(input: CompleteOntologyOutboxLeaseInput): void {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertNonblank(input.leaseId, \"Ontology outbox lease id\")\n assertTimestamp(input.publishedAt, \"Ontology outbox publishedAt\")\n const rows = this.validateLeaseBatch(input.projectId, input.ids, input.leaseId)\n for (const [key, row] of rows) {\n this.state.outbox.set(key, {\n ...row,\n publishedAt: input.publishedAt,\n leaseId: null,\n leaseExpiresAt: null,\n })\n }\n }\n\n async reschedule(input: RescheduleOntologyOutboxLeaseInput): Promise<void> {\n await this.runRootOperation(() => this.rescheduleUnlocked(input))\n }\n\n private rescheduleUnlocked(input: RescheduleOntologyOutboxLeaseInput): void {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertNonblank(input.leaseId, \"Ontology outbox lease id\")\n assertTimestamp(input.availableAt, \"Ontology outbox availableAt\")\n const rows = this.validateLeaseBatch(input.projectId, input.ids, input.leaseId)\n for (const [key, row] of rows) {\n this.state.outbox.set(key, {\n ...row,\n availableAt: input.availableAt,\n lastFailure: input.failure === undefined ? row.lastFailure : structuredClone(input.failure),\n leaseId: null,\n leaseExpiresAt: null,\n })\n }\n }\n\n async purgePublished(input: PurgePublishedOntologyOutboxInput): Promise<number> {\n return this.runRootOperation(() => this.purgePublishedUnlocked(input))\n }\n\n async summarize(input: SummarizeOntologyOutboxInput): Promise<OntologyOutboxSummary> {\n return this.runRootOperation(() => {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n let pendingCount = 0\n let oldestPendingAt: string | null = null\n let retryingCount = 0\n let maxAttempts = 0\n\n for (const row of this.state.outbox.values()) {\n if (row.envelope.projectId !== input.projectId || row.publishedAt !== null) continue\n pendingCount += 1\n if (row.attempts > 0) retryingCount += 1\n maxAttempts = Math.max(maxAttempts, row.attempts)\n if (oldestPendingAt === null || row.createdAt < oldestPendingAt) {\n oldestPendingAt = row.createdAt\n }\n }\n\n return { pendingCount, oldestPendingAt, retryingCount, maxAttempts }\n })\n }\n\n private purgePublishedUnlocked(input: PurgePublishedOntologyOutboxInput): number {\n assertNonblank(input.projectId, \"Ontology outbox project id\")\n assertPositiveLimit(input.limit)\n const cutoff = assertTimestamp(input.publishedBefore, \"Ontology outbox purge cutoff\")\n const rows: [string, OntologyOutboxRecord][] = []\n for (const entry of this.state.outbox.entries()) {\n const [, row] = entry\n if (\n row.envelope.projectId !== input.projectId ||\n row.publishedAt === null ||\n Date.parse(row.publishedAt) >= cutoff\n ) {\n continue\n }\n insertBounded(rows, entry, input.limit, ([, left], [, right]) =>\n comparePublishedRows(left, right)\n )\n }\n for (const [key] of rows) this.state.outbox.delete(key)\n return rows.length\n }\n\n private requireLease(key: string, leaseId: string) {\n const row = this.state.outbox.get(key)\n if (!row || row.leaseId !== leaseId || row.leaseExpiresAt === null) {\n throw new MaterializationConflictError(\n \"outbox-lease\",\n \"Ontology outbox lease does not match.\"\n )\n }\n return row\n }\n\n private validateLeaseBatch(\n projectId: string,\n ids: readonly string[],\n leaseId: string\n ): readonly (readonly [string, ReturnType<InMemoryOntologyOutboxStorage[\"requireLease\"]>])[] {\n const seen = new Set<string>()\n return ids.map((id) => {\n assertNonblank(id, \"Ontology outbox event id\")\n if (seen.has(id)) {\n throw new MaterializationValidationError(\n `Ontology outbox lease batch repeats event '${id}'.`\n )\n }\n seen.add(id)\n const key = outboxKey(projectId, id)\n return [key, this.requireLease(key, leaseId)] as const\n })\n }\n}\n\n/**\n * Deterministic claim order.\n *\n * Every row of one commit shares `createdAt`, so `commitOrdinal` gives providers a stable batch\n * order. It correlates facts but does not promise broker delivery order: concurrent leases and\n * retries may publish later rows first.\n */\nfunction compareClaimRows(\n left: import(\"../outbox\").OntologyOutboxRecord,\n right: import(\"../outbox\").OntologyOutboxRecord\n): number {\n return (\n left.createdAt.localeCompare(right.createdAt) ||\n left.envelope.commitId.localeCompare(right.envelope.commitId) ||\n left.envelope.commitOrdinal - right.envelope.commitOrdinal\n )\n}\n\nfunction comparePublishedRows(\n left: import(\"../outbox\").OntologyOutboxRecord,\n right: import(\"../outbox\").OntologyOutboxRecord\n): number {\n return (\n (left.publishedAt ?? \"\").localeCompare(right.publishedAt ?? \"\") ||\n left.envelope.id.localeCompare(right.envelope.id)\n )\n}\n\nfunction assertPositiveLimit(limit: number): void {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw new MaterializationValidationError(\"Ontology outbox limit must be positive.\")\n }\n}\n\nfunction assertPairedLease(row: {\n readonly leaseId: string | null\n readonly leaseExpiresAt: string | null\n}): void {\n if ((row.leaseId === null) !== (row.leaseExpiresAt === null)) {\n throw new MaterializationConflictError(\n \"outbox-lease\",\n \"Ontology outbox row has an unpaired lease lifecycle.\"\n )\n }\n}\n",
29
- "import { stableJsonStringify } from \"../../../json\"\nimport { MaterializationValidationError } from \"../../../materialization/errors\"\nimport type { ProjectionExecution } from \"../../../materialization/model\"\nimport { projectionEntityKey } from \"../../../materialization/refs\"\nimport {\n assertSourceBeginInput as assertBeginInput,\n assertTimestamp as assertCanonicalTimestamp,\n assertSourceProject as assertProjectAndSource,\n assertSourceCandidateOwner,\n assertSourceExecutionIdentity,\n assertSourceStagedRow,\n assertSourceWriteIdentity as assertWriteIdentity,\n isExactStagingManifest,\n sourceConflict,\n sourceMaterializationIdentity,\n} from \"../provider\"\nimport type {\n AbandonSourceMaterializationCandidateInput,\n AbandonSourceMaterializationInput,\n AssertSourceMaterializationExecution,\n BeginSourceMaterializationInput,\n CleanupTerminalSourceMaterializationsInput,\n CleanupTerminalSourceMaterializationsResult,\n GetActiveOntologySourceInput,\n MarkSourceMaterializationReadyInput,\n OntologySourceRecord,\n OntologySourceStorage,\n ReclaimSourceMaterializationInput,\n StageSourceAssertion,\n StageSourceRowsInput,\n StageSourceRowsResult,\n SummarizeTerminalSourceMaterializationsInput,\n TerminalSourceMaterializationSummary,\n} from \"../sources\"\nimport {\n assertNonblank,\n type InMemoryOntologyState,\n type InMemorySourceMaterialization,\n insertBounded,\n sourceMaterializationKey,\n sourceMaterializationRecord,\n} from \"./shared-state\"\n\nexport class InMemoryOntologySourceStorage implements OntologySourceStorage {\n constructor(\n private readonly state: InMemoryOntologyState,\n private readonly runRootOperation: <T>(run: () => Promise<T> | T) => Promise<T>,\n private readonly assertExecution: AssertSourceMaterializationExecution\n ) {}\n\n async beginMaterialization(\n input: BeginSourceMaterializationInput\n ): Promise<OntologySourceRecord> {\n return this.runRootOperation(async () => {\n assertBeginInput(input)\n await this.assertCurrentExecution(input)\n const key = sourceMaterializationKey(\n input.projectId,\n input.source.projectionId,\n input.materializationId\n )\n const existing = this.state.sourceMaterializations.get(key)\n if (existing) {\n if (isExactStagingManifest(sourceMaterializationRecord(existing), input)) {\n return sourceMaterializationRecord(existing)\n }\n throw sourceConflict(\n `Source materialization '${input.materializationId}' already exists with different identity or state.`\n )\n }\n\n const nonterminal = this.findRunCandidates(\n input.projectId,\n input.source.projectionId,\n input.execution.projectionRunId\n )\n if (nonterminal.length > 0) {\n throw sourceConflict(\n `Projection run '${input.execution.projectionRunId}' already has a nonterminal source materialization; reclaim it before beginning another.`\n )\n }\n\n const materialization: InMemorySourceMaterialization = {\n projectId: input.projectId,\n source: structuredClone(input.source),\n materializationId: input.materializationId,\n projectionRunId: input.execution.projectionRunId,\n projectionKind: input.projectionKind,\n protocol: input.protocol,\n status: \"staging\",\n executionToken: input.execution.executionToken,\n datasetVersion: structuredClone(input.datasetVersion),\n projectionRevision: input.projectionRevision,\n ownershipHash: input.ownershipHash,\n ontologyRevision: input.ontologyRevision,\n rootCount: null,\n assertionCount: null,\n createdAt: input.createdAt,\n readyAt: null,\n activatedAt: null,\n terminalAt: null,\n lastCommitId: null,\n updatedAt: input.createdAt,\n rowsByEntity: new Map(),\n rootOrdinals: new Map(),\n ordinalRoots: new Map(),\n }\n this.state.sourceMaterializations.set(key, materialization)\n return sourceMaterializationRecord(materialization)\n })\n }\n\n async stageRows(input: StageSourceRowsInput): Promise<StageSourceRowsResult> {\n return this.runRootOperation(async () => {\n assertWriteIdentity(input)\n await this.assertCurrentExecution(input)\n const materialization = this.requireMaterialization(input)\n assertSourceCandidateOwner(sourceMaterializationRecord(materialization), input.execution)\n if (materialization.status !== \"staging\") {\n throw sourceConflict(\n `Source materialization '${input.materializationId}' is '${materialization.status}' and cannot accept rows.`\n )\n }\n return stageRowsAtomically(materialization, input.rows)\n })\n }\n\n async markReady(input: MarkSourceMaterializationReadyInput): Promise<OntologySourceRecord> {\n return this.runRootOperation(async () => {\n assertWriteIdentity(input)\n assertCanonicalTimestamp(input.readyAt, \"Source readyAt\")\n assertCount(input.rootCount, \"Source root count\")\n assertCount(input.assertionCount, \"Source assertion count\")\n await this.assertCurrentExecution(input)\n const materialization = this.requireMaterialization(input)\n assertSourceCandidateOwner(sourceMaterializationRecord(materialization), input.execution)\n\n if (materialization.status === \"ready\") {\n if (\n materialization.rootCount === input.rootCount &&\n materialization.assertionCount === input.assertionCount &&\n materialization.readyAt === input.readyAt\n ) {\n return sourceMaterializationRecord(materialization)\n }\n throw sourceConflict(\n `Source materialization '${input.materializationId}' was marked ready with different counts or time.`\n )\n }\n if (materialization.status !== \"staging\") {\n throw sourceConflict(\n `Source materialization '${input.materializationId}' cannot transition from '${materialization.status}' to 'ready'.`\n )\n }\n assertNotBefore(input.readyAt, materialization.createdAt, \"Source readyAt\", \"createdAt\")\n assertReadyCounts(materialization, input.rootCount, input.assertionCount)\n\n const ready: InMemorySourceMaterialization = {\n ...materialization,\n status: \"ready\",\n rootCount: input.rootCount,\n assertionCount: input.assertionCount,\n readyAt: input.readyAt,\n updatedAt: input.readyAt,\n }\n this.state.sourceMaterializations.set(\n sourceMaterializationKey(\n input.projectId,\n input.source.projectionId,\n input.materializationId\n ),\n ready\n )\n return sourceMaterializationRecord(ready)\n })\n }\n\n async getActive(input: GetActiveOntologySourceInput): Promise<OntologySourceRecord | null> {\n return this.runRootOperation(() => {\n assertProjectAndSource(input)\n const active = [...this.state.sourceMaterializations.values()].filter(\n (materialization) =>\n materialization.projectId === input.projectId &&\n materialization.source.projectionId === input.source.projectionId &&\n materialization.status === \"active\"\n )\n if (active.length > 1) {\n throw sourceConflict(\n `Source '${input.source.projectionId}' has more than one active materialization.`\n )\n }\n return active[0] ? sourceMaterializationRecord(active[0]) : null\n })\n }\n\n async abandon(input: AbandonSourceMaterializationCandidateInput): Promise<OntologySourceRecord>\n async abandon(input: ReclaimSourceMaterializationInput): Promise<OntologySourceRecord | null>\n async abandon(input: AbandonSourceMaterializationInput): Promise<OntologySourceRecord | null> {\n return this.runRootOperation(async () => {\n assertProjectAndSource(input)\n assertSourceExecutionIdentity(input.execution.projectionRunId, input.execution.executionToken)\n assertCanonicalTimestamp(input.abandonedAt, \"Source abandonedAt\")\n await this.assertCurrentExecution(input)\n return input.kind === \"candidate\"\n ? this.abandonCandidate(input)\n : this.abandonForReclaim(input)\n })\n }\n\n async cleanupTerminal(\n input: CleanupTerminalSourceMaterializationsInput\n ): Promise<CleanupTerminalSourceMaterializationsResult> {\n return this.runRootOperation(() => {\n assertNonblank(input.projectId, \"Terminal source cleanup project id\")\n assertCanonicalTimestamp(input.terminalBefore, \"Terminal source cleanup cutoff\")\n if (!Number.isSafeInteger(input.limit) || input.limit <= 0) {\n throw new MaterializationValidationError(\n \"Terminal source cleanup limit must be a positive safe integer.\"\n )\n }\n\n const candidates: [string, InMemorySourceMaterialization][] = []\n for (const entry of this.state.sourceMaterializations.entries()) {\n const materialization = entry[1]\n if (\n materialization.projectId !== input.projectId ||\n (materialization.status !== \"superseded\" && materialization.status !== \"abandoned\") ||\n materialization.terminalAt === null ||\n materialization.terminalAt >= input.terminalBefore\n ) {\n continue\n }\n insertBounded(candidates, entry, input.limit, compareTerminalMaterializations)\n }\n\n let remaining = input.limit\n let rowsDeleted = 0\n let materializationsDeleted = 0\n for (const [key, candidate] of candidates) {\n if (remaining === 0) break\n const current = this.state.sourceMaterializations.get(key)\n if (current !== candidate) continue\n // Terminal manifests never participate in reads or activation again. Release their\n // ingestion-only indexes immediately instead of retaining O(root count) memory until the\n // last child row is removed by a later bounded cleanup pass.\n current.rootOrdinals.clear()\n current.ordinalRoots.clear()\n for (const entityKey of current.rowsByEntity.keys()) {\n if (remaining === 0) break\n current.rowsByEntity.delete(entityKey)\n rowsDeleted += 1\n remaining -= 1\n }\n if (current.rowsByEntity.size === 0 && remaining > 0) {\n this.state.sourceMaterializations.delete(key)\n materializationsDeleted += 1\n remaining -= 1\n }\n }\n return { rowsDeleted, materializationsDeleted }\n })\n }\n\n async summarizeTerminal(\n input: SummarizeTerminalSourceMaterializationsInput\n ): Promise<TerminalSourceMaterializationSummary> {\n return this.runRootOperation(() => {\n assertNonblank(input.projectId, \"Terminal source summary project id\")\n let count = 0\n let oldestTerminalAt: string | null = null\n for (const materialization of this.state.sourceMaterializations.values()) {\n if (\n materialization.projectId !== input.projectId ||\n (materialization.status !== \"superseded\" && materialization.status !== \"abandoned\") ||\n materialization.terminalAt === null\n ) {\n continue\n }\n count += 1\n if (oldestTerminalAt === null || materialization.terminalAt < oldestTerminalAt) {\n oldestTerminalAt = materialization.terminalAt\n }\n }\n return { count, oldestTerminalAt }\n })\n }\n\n private async assertCurrentExecution(\n input:\n | BeginSourceMaterializationInput\n | {\n readonly projectId: string\n readonly source: BeginSourceMaterializationInput[\"source\"]\n readonly execution: ProjectionExecution\n }\n ): Promise<void> {\n await this.assertExecution({\n projectId: input.projectId,\n source: input.source,\n execution: input.execution,\n ...(\"projectionKind\" in input ? { identity: sourceMaterializationIdentity(input) } : {}),\n })\n }\n\n private requireMaterialization(input: {\n readonly projectId: string\n readonly source: BeginSourceMaterializationInput[\"source\"]\n readonly materializationId: string\n }): InMemorySourceMaterialization {\n const materialization = this.state.sourceMaterializations.get(\n sourceMaterializationKey(input.projectId, input.source.projectionId, input.materializationId)\n )\n if (!materialization) {\n throw sourceConflict(`Source materialization '${input.materializationId}' does not exist.`)\n }\n return materialization\n }\n\n private abandonCandidate(\n input: AbandonSourceMaterializationCandidateInput\n ): OntologySourceRecord {\n const materialization = this.requireMaterialization(input)\n if (materialization.status === \"abandoned\") {\n if (\n materialization.projectionRunId === input.execution.projectionRunId &&\n materialization.terminalAt === input.abandonedAt\n ) {\n return sourceMaterializationRecord(materialization)\n }\n throw sourceConflict(\n `Source materialization '${input.materializationId}' was abandoned by another execution or at another time.`\n )\n }\n assertSourceCandidateOwner(sourceMaterializationRecord(materialization), input.execution)\n if (materialization.status !== \"staging\" && materialization.status !== \"ready\") {\n throw sourceConflict(\n `Source materialization '${input.materializationId}' cannot transition from '${materialization.status}' to 'abandoned'.`\n )\n }\n return this.transitionToAbandoned(materialization, input.abandonedAt)\n }\n\n private abandonForReclaim(input: ReclaimSourceMaterializationInput): OntologySourceRecord | null {\n const candidates = this.findRunCandidates(\n input.projectId,\n input.source.projectionId,\n input.execution.projectionRunId\n )\n if (\n candidates.some(\n ([, materialization]) => materialization.executionToken === input.execution.executionToken\n )\n ) {\n throw sourceConflict(\n `Projection run '${input.execution.projectionRunId}' already has a source materialization owned by the current execution.`\n )\n }\n if (candidates.length > 1) {\n throw sourceConflict(\n `Projection run '${input.execution.projectionRunId}' has multiple nonterminal source materializations.`\n )\n }\n const candidate = candidates[0]?.[1]\n return candidate ? this.transitionToAbandoned(candidate, input.abandonedAt) : null\n }\n\n private transitionToAbandoned(\n materialization: InMemorySourceMaterialization,\n abandonedAt: string\n ): OntologySourceRecord {\n assertNotBefore(abandonedAt, materialization.createdAt, \"Source abandonedAt\", \"createdAt\")\n if (materialization.readyAt !== null) {\n assertNotBefore(abandonedAt, materialization.readyAt, \"Source abandonedAt\", \"readyAt\")\n }\n const abandoned: InMemorySourceMaterialization = {\n ...materialization,\n status: \"abandoned\",\n executionToken: null,\n terminalAt: abandonedAt,\n updatedAt: abandonedAt,\n }\n this.state.sourceMaterializations.set(\n sourceMaterializationKey(\n materialization.projectId,\n materialization.source.projectionId,\n materialization.materializationId\n ),\n abandoned\n )\n return sourceMaterializationRecord(abandoned)\n }\n\n private findRunCandidates(\n projectId: string,\n sourceId: string,\n projectionRunId: string\n ): [string, InMemorySourceMaterialization][] {\n return [...this.state.sourceMaterializations.entries()].filter(\n ([, materialization]) =>\n materialization.projectId === projectId &&\n materialization.source.projectionId === sourceId &&\n materialization.projectionRunId === projectionRunId &&\n (materialization.status === \"staging\" || materialization.status === \"ready\")\n )\n }\n}\n\nfunction stageRowsAtomically(\n materialization: InMemorySourceMaterialization,\n rows: StageSourceRowsInput[\"rows\"]\n): StageSourceRowsResult {\n let inserted = 0\n let unchanged = 0\n const newRows = new Map<string, StageSourceRowsInput[\"rows\"][number]>()\n const newRootOrdinals = new Map<string, number>()\n const newOrdinalRoots = new Map<number, string>()\n for (const row of rows) {\n assertSourceStagedRow(materialization.projectionKind, row)\n\n const rootKey = projectionEntityKey(row.root)\n const existingOrdinal =\n materialization.rootOrdinals.get(rootKey) ?? newRootOrdinals.get(rootKey)\n if (existingOrdinal !== undefined && existingOrdinal !== row.stagingOrdinal) {\n throw new MaterializationValidationError(\n `Source materialization repeats root ${rootKey} at a different stream ordinal.`\n )\n }\n const existingRoot =\n materialization.ordinalRoots.get(row.stagingOrdinal) ??\n newOrdinalRoots.get(row.stagingOrdinal)\n if (existingRoot !== undefined && existingRoot !== rootKey) {\n throw new MaterializationValidationError(\n `Source materialization repeats stream ordinal ${row.stagingOrdinal} for another root.`\n )\n }\n\n const entityKey = projectionEntityKey(row.assertion)\n const existing = materialization.rowsByEntity.get(entityKey) ?? newRows.get(entityKey)\n if (existing) {\n if (stableJsonStringify(existing) === stableJsonStringify(row)) {\n unchanged += 1\n continue\n }\n throw new MaterializationValidationError(\n `Source materialization repeats asserted entity ${entityKey}.`\n )\n }\n\n newRootOrdinals.set(rootKey, row.stagingOrdinal)\n newOrdinalRoots.set(row.stagingOrdinal, rootKey)\n newRows.set(entityKey, structuredClone(row))\n inserted += 1\n }\n\n for (const [rootKey, ordinal] of newRootOrdinals) {\n materialization.rootOrdinals.set(rootKey, ordinal)\n }\n for (const [ordinal, rootKey] of newOrdinalRoots) {\n materialization.ordinalRoots.set(ordinal, rootKey)\n }\n for (const [entityKey, row] of newRows) materialization.rowsByEntity.set(entityKey, row)\n return { inserted, unchanged }\n}\n\nfunction assertReadyCounts(\n materialization: InMemorySourceMaterialization,\n rootCount: number,\n assertionCount: number\n): void {\n if (\n materialization.rootOrdinals.size !== rootCount ||\n materialization.ordinalRoots.size !== rootCount ||\n materialization.rowsByEntity.size !== assertionCount\n ) {\n throw new MaterializationValidationError(\n \"Source ready counts do not match the staged roots and assertions.\"\n )\n }\n for (let ordinal = 0; ordinal < rootCount; ordinal += 1) {\n if (!materialization.ordinalRoots.has(ordinal)) {\n throw new MaterializationValidationError(\n `Source staging ordinals must be contiguous from zero; missing ${ordinal}.`\n )\n }\n }\n assertReadyTopology(materialization)\n}\n\nfunction assertReadyTopology(materialization: InMemorySourceMaterialization): void {\n const rowsByRoot = new Map<string, StageSourceAssertion[]>()\n for (const row of materialization.rowsByEntity.values()) {\n const rootKey = projectionEntityKey(row.root)\n const rows = rowsByRoot.get(rootKey) ?? []\n rows.push(row)\n rowsByRoot.set(rootKey, rows)\n }\n\n for (const rootKey of materialization.rootOrdinals.keys()) {\n const rows = rowsByRoot.get(rootKey) ?? []\n const first = rows[0]\n if (!first) {\n throw new MaterializationValidationError(`Source root ${rootKey} has no staged assertions.`)\n }\n const root = first.root\n\n if (materialization.projectionKind === \"link\") {\n if (\n rows.length !== 1 ||\n root.kind !== \"link\" ||\n first.assertion.kind !== \"link\" ||\n projectionEntityKey(first.assertion) !== rootKey\n ) {\n throw new MaterializationValidationError(\n `Link projection root ${rootKey} must contain exactly its matching link assertion.`\n )\n }\n continue\n }\n\n if (root.kind !== \"object\") {\n throw new MaterializationValidationError(\n `Object projection root ${rootKey} must be an object.`\n )\n }\n const matchingObjects = rows.filter(\n (row) => row.assertion.kind === \"object\" && projectionEntityKey(row.assertion) === rootKey\n )\n const hasForeignAssertion = rows.some((row) => {\n if (row.assertion.kind === \"object\") return projectionEntityKey(row.assertion) !== rootKey\n return projectionEntityKey({ kind: \"object\", ref: row.assertion.ref.source }) !== rootKey\n })\n if (matchingObjects.length !== 1 || hasForeignAssertion) {\n throw new MaterializationValidationError(\n `Object projection root ${rootKey} must contain exactly its matching object assertion plus links sourced from that root.`\n )\n }\n }\n}\n\nfunction assertCount(value: number, label: string): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new MaterializationValidationError(`${label} must be a nonnegative safe integer.`)\n }\n}\n\nfunction assertNotBefore(\n value: string,\n minimum: string,\n label: string,\n minimumLabel: string\n): void {\n if (value < minimum) {\n throw new MaterializationValidationError(`${label} cannot precede source ${minimumLabel}.`)\n }\n}\n\nfunction compareTerminalMaterializations(\n [, left]: readonly [string, InMemorySourceMaterialization],\n [, right]: readonly [string, InMemorySourceMaterialization]\n): number {\n return (\n (left.terminalAt ?? \"\").localeCompare(right.terminalAt ?? \"\") ||\n left.source.projectionId.localeCompare(right.source.projectionId) ||\n left.materializationId.localeCompare(right.materializationId)\n )\n}\n",
30
- "import type { OntologyStorage } from \"..\"\nimport type { InMemoryOntologyState, InMemoryOntologyStorageTestHooks } from \"./shared-state\"\n\nexport interface InMemoryOntologyStorageTestingAdapter {\n setTestHooks(hooks: InMemoryOntologyStorageTestHooks): void\n snapshot(): InMemoryOntologyState\n}\n\nconst testingAdapters = new WeakMap<object, InMemoryOntologyStorageTestingAdapter>()\n\nexport function registerInMemoryOntologyStorageTestingAdapter(\n storage: OntologyStorage,\n adapter: InMemoryOntologyStorageTestingAdapter\n): void {\n testingAdapters.set(storage, adapter)\n}\n\n/** @internal Relative test-only access; intentionally absent from every package barrel. */\nexport function getInMemoryOntologyStorageTestingAdapter(\n storage: OntologyStorage\n): InMemoryOntologyStorageTestingAdapter {\n const adapter = testingAdapters.get(storage)\n if (!adapter) {\n throw new Error(\"[Sixb] In-memory ontology storage testing adapter is unavailable.\")\n }\n return adapter\n}\n\nexport type { InMemoryOntologyStorageTestHooks } from \"./shared-state\"\n",
31
- "import type { InMemoryObjectStorage } from \"../../objects/in-memory\"\nimport type { InMemoryTimeseriesStorage } from \"../../timeseries/store\"\nimport type { OntologyStorage } from \"..\"\nimport type { ProviderMaterializationTransactionLifecycle } from \"../provider\"\nimport type { AssertSourceMaterializationExecution } from \"../sources\"\nimport { InMemoryOntologyCommitStorage } from \"./commits\"\nimport { InMemoryOntologyMaterializationStorage } from \"./materializations\"\nimport { InMemoryOntologyOutboxStorage } from \"./outbox\"\nimport {\n cloneOntologyState,\n createInMemoryOntologyState,\n type InMemoryOntologyState,\n type InMemoryOntologyStorageTestHooks,\n restoreOntologyState,\n} from \"./shared-state\"\nimport { InMemoryOntologySourceStorage } from \"./sources\"\nimport {\n type InMemoryOntologyStorageTestingAdapter,\n registerInMemoryOntologyStorageTestingAdapter,\n} from \"./testing\"\n\nexport type InMemoryOntologyStorageSnapshot = InMemoryOntologyState\n\ninterface InMemoryOntologyStorageOptions {\n readonly runRootOperation: <T>(run: () => Promise<T> | T) => Promise<T>\n readonly getTransactionToken: () => object | null\n readonly getMaterializationLifecycle: () => ProviderMaterializationTransactionLifecycle | null\n readonly assertSourceMaterializationExecution: AssertSourceMaterializationExecution\n readonly executionExists: (projectId: string, executionId: string) => Promise<boolean>\n}\n\nexport class InMemoryOntologyStorage implements OntologyStorage {\n private readonly state = createInMemoryOntologyState()\n readonly commits: InMemoryOntologyCommitStorage\n readonly sources: InMemoryOntologySourceStorage\n readonly materializations: InMemoryOntologyMaterializationStorage\n readonly outbox: InMemoryOntologyOutboxStorage\n private testHooks: InMemoryOntologyStorageTestHooks = {}\n private readonly testingAdapter: InMemoryOntologyStorageTestingAdapter = {\n setTestHooks: (hooks) => this.setTestHooks(hooks),\n snapshot: () => this.snapshot(),\n }\n\n constructor(\n objects: InMemoryObjectStorage,\n timeseries: InMemoryTimeseriesStorage,\n options: InMemoryOntologyStorageOptions\n ) {\n this.commits = new InMemoryOntologyCommitStorage(this.state, options.runRootOperation)\n this.sources = new InMemoryOntologySourceStorage(\n this.state,\n options.runRootOperation,\n options.assertSourceMaterializationExecution\n )\n this.outbox = new InMemoryOntologyOutboxStorage(this.state, options.runRootOperation)\n this.materializations = new InMemoryOntologyMaterializationStorage(\n this.state,\n objects,\n timeseries,\n options.getTransactionToken,\n options.getMaterializationLifecycle,\n options.executionExists,\n {\n beforeRead: (boundary) => this.testHooks.beforeRead?.(boundary),\n beforeWrite: (boundary, ordinal) => this.testHooks.beforeWrite?.(boundary, ordinal),\n observeBuffer: (boundary, rows) => this.testHooks.observeBuffer?.(boundary, rows),\n observeWork: (records) => this.testHooks.observeWork?.(records),\n }\n )\n registerInMemoryOntologyStorageTestingAdapter(this, this.testingAdapter)\n }\n\n /** @internal Test-only failure injection; not part of OntologyStorage. */\n setTestHooks(hooks: InMemoryOntologyStorageTestHooks): void {\n this.testHooks = hooks\n }\n\n /** @internal Register a decorated facade as an alias for the same test adapter. */\n registerTestingAlias(storage: OntologyStorage): void {\n registerInMemoryOntologyStorageTestingAdapter(storage, this.testingAdapter)\n }\n\n snapshot(): InMemoryOntologyStorageSnapshot {\n return cloneOntologyState(this.state)\n }\n\n restore(snapshot: InMemoryOntologyStorageSnapshot): void {\n restoreOntologyState(this.state, snapshot)\n }\n\n completeTransaction(transactionToken: object): void {\n this.materializations.deactivateTransaction(transactionToken)\n }\n}\n\nexport type { InMemoryOntologyStorageTestHooks } from \"./shared-state\"\n",
32
- "import type { PipelineRunRecord, QueuePipelineRunInput } from \"./types\"\n\nexport function canRequeuePipelineRunAfterEnqueueFailure(\n existing: PipelineRunRecord,\n input: QueuePipelineRunInput\n): boolean {\n return (\n existing.status === \"failed\" &&\n existing.error?.code === \"queue.enqueue_failed\" &&\n existing.error.retryable &&\n existing.executionId === input.executionId &&\n existing.pipelineId === input.pipelineId\n )\n}\n",
33
- "export type RunListOrder = \"asc\" | \"desc\"\n\nexport type { ListPage as RunListPage, ListWindow as RunListWindow } from \"./pagination\"\nexport { paginate } from \"./pagination\"\n\nexport interface StartedAtRunRecord<TStatus extends string = string> {\n readonly id: string\n readonly status: TStatus\n readonly startedAt?: Date\n readonly queuedAt?: Date\n}\n\nexport function storageKey(projectId: string, id: string): string {\n return `${projectId}:${id}`\n}\n\nexport function cloneRecord<T>(record: T): T {\n return structuredClone(record)\n}\n\nexport function hasEmptyStatuses(input: { readonly statuses?: readonly unknown[] }): boolean {\n return input.statuses !== undefined && input.statuses.length === 0\n}\n\nexport function toStatusSet<TStatus extends string>(\n statuses: readonly TStatus[] | undefined\n): ReadonlySet<TStatus> | null {\n return statuses ? new Set(statuses) : null\n}\n\nexport function matchesRunListDateFilters<TStatus extends string>(\n record: StartedAtRunRecord<TStatus>,\n filters: {\n readonly statuses: ReadonlySet<TStatus> | null\n readonly startedAfter?: Date\n readonly startedBefore?: Date\n }\n): boolean {\n if (filters.statuses && !filters.statuses.has(record.status)) {\n return false\n }\n\n const startedAt = effectiveStartedAt(record)\n\n if (filters.startedAfter && startedAt < filters.startedAfter) {\n return false\n }\n\n if (filters.startedBefore && startedAt > filters.startedBefore) {\n return false\n }\n\n return true\n}\n\nexport function compareStartedAt(\n left: { readonly id: string; readonly startedAt?: Date; readonly queuedAt?: Date },\n right: { readonly id: string; readonly startedAt?: Date; readonly queuedAt?: Date },\n order: RunListOrder\n): number {\n const delta = effectiveStartedAt(left).getTime() - effectiveStartedAt(right).getTime()\n if (delta !== 0) {\n return order === \"asc\" ? delta : -delta\n }\n\n if (left.id === right.id) {\n return 0\n }\n\n return order === \"asc\" ? left.id.localeCompare(right.id) : right.id.localeCompare(left.id)\n}\n\nexport function latestStartedAtByOwnerId<\n TRecord extends { readonly id: string; readonly startedAt?: Date; readonly queuedAt?: Date },\n>(\n records: readonly TRecord[],\n ownerIds: readonly string[],\n ownerIdFor: (record: TRecord) => string\n): readonly TRecord[] {\n const uniqueOwnerIds = [...new Set(ownerIds)]\n if (uniqueOwnerIds.length === 0) {\n return []\n }\n\n const requested = new Set(uniqueOwnerIds)\n const latestByOwnerId = new Map<string, TRecord>()\n\n for (const record of records) {\n const ownerId = ownerIdFor(record)\n if (!requested.has(ownerId)) {\n continue\n }\n\n const current = latestByOwnerId.get(ownerId)\n if (!current || compareStartedAt(record, current, \"desc\") < 0) {\n latestByOwnerId.set(ownerId, record)\n }\n }\n\n return uniqueOwnerIds.flatMap((ownerId) => {\n const record = latestByOwnerId.get(ownerId)\n return record ? [record] : []\n })\n}\n\nfunction effectiveStartedAt(record: {\n readonly id: string\n readonly startedAt?: Date\n readonly queuedAt?: Date\n}): Date {\n const value = record.startedAt ?? record.queuedAt\n if (!value) {\n throw new Error(`[Sixb] Run '${record.id}' has neither startedAt nor queuedAt.`)\n }\n return value\n}\n",
34
- "import type { SixbErrorCode, SixbFailure } from \"../../errors/types\"\nimport type { DatasetVersionRef, DatasetWriteMode } from \"../../lake-storage\"\n\nexport type PipelineRunStatus = \"queued\" | \"running\" | \"succeeded\" | \"failed\" | \"cancelled\"\nexport type PipelineStepRunStatus = Exclude<PipelineRunStatus, \"queued\">\n/** Error codes a pipeline or pipeline-step run can persist and expose. */\nexport const PIPELINE_RUN_FAILURE_CODES = [\n \"internal.unexpected\",\n \"runtime.cancelled\",\n \"queue.enqueue_failed\",\n \"pipeline.step_failed\",\n] as const satisfies readonly [SixbErrorCode, ...SixbErrorCode[]]\n\nexport type PipelineRunFailureCode = (typeof PIPELINE_RUN_FAILURE_CODES)[number]\n\nexport interface PipelineRunRecord {\n readonly id: string\n readonly projectId: string\n readonly executionId: string\n readonly pipelineId: string\n readonly status: PipelineRunStatus\n readonly queuedAt: Date\n readonly startedAt?: Date\n readonly finishedAt?: Date\n /** Final step output in sequential V1. */\n readonly output?: DatasetVersionRef\n readonly error?: SixbFailure<PipelineRunFailureCode>\n}\n\nexport interface PipelineStepRunRecord {\n readonly id: string\n readonly projectId: string\n readonly pipelineRunId: string\n readonly pipelineId: string\n readonly stepId: string\n readonly datasetId: string\n readonly mode: DatasetWriteMode\n readonly status: PipelineStepRunStatus\n readonly startedAt: Date\n readonly finishedAt?: Date\n readonly inputs: readonly DatasetVersionRef[]\n readonly output?: DatasetVersionRef\n readonly rowsWritten?: number\n readonly error?: SixbFailure<PipelineRunFailureCode>\n}\n\nexport interface QueuePipelineRunInput {\n readonly id: string\n readonly projectId: string\n readonly executionId: string\n readonly pipelineId: string\n readonly queuedAt?: Date\n}\n\nexport interface StartPipelineRunInput {\n readonly id: string\n readonly projectId: string\n readonly startedAt?: Date\n}\n\nexport type FinishPipelineRunInput =\n | {\n readonly id: string\n readonly projectId: string\n readonly status: \"succeeded\"\n readonly finishedAt?: Date\n readonly output?: DatasetVersionRef\n }\n | {\n readonly id: string\n readonly projectId: string\n readonly status: \"failed\"\n readonly finishedAt?: Date\n readonly error: SixbFailure<PipelineRunFailureCode>\n }\n | {\n readonly id: string\n readonly projectId: string\n readonly status: \"cancelled\"\n readonly finishedAt?: Date\n readonly error?: SixbFailure<PipelineRunFailureCode>\n }\n\nexport interface StartPipelineStepRunInput {\n readonly id: string\n readonly projectId: string\n readonly pipelineRunId: string\n readonly pipelineId: string\n readonly stepId: string\n readonly datasetId: string\n readonly mode: DatasetWriteMode\n readonly startedAt?: Date\n readonly inputs: readonly DatasetVersionRef[]\n}\n\nexport type FinishPipelineStepRunInput =\n | {\n readonly id: string\n readonly projectId: string\n readonly status: \"succeeded\"\n readonly finishedAt?: Date\n readonly output: DatasetVersionRef\n readonly rowsWritten?: number\n }\n | {\n readonly id: string\n readonly projectId: string\n readonly status: \"failed\" | \"cancelled\"\n readonly finishedAt?: Date\n readonly rowsWritten?: number\n readonly error?: SixbFailure<PipelineRunFailureCode>\n }\n\nexport interface ListPipelineRunsInput {\n readonly projectId: string\n readonly pipelineId?: string\n readonly pipelineIds?: readonly string[]\n readonly statuses?: readonly PipelineRunStatus[]\n readonly startedAfter?: Date\n readonly startedBefore?: Date\n readonly limit?: number\n readonly offset?: number\n readonly order?: \"asc\" | \"desc\"\n}\n\nexport interface ListPipelineRunsResult {\n readonly runs: readonly PipelineRunRecord[]\n readonly hasMore: boolean\n readonly total: number\n}\n\nexport interface ListLatestPipelineRunsInput {\n readonly projectId: string\n readonly pipelineIds: readonly string[]\n}\n\nexport interface ListLatestPipelineRunsResult {\n readonly runs: readonly PipelineRunRecord[]\n}\n\nexport interface ListPipelineStepRunsInput {\n readonly projectId: string\n readonly pipelineRunId?: string\n readonly pipelineId?: string\n readonly stepId?: string\n readonly datasetId?: string\n readonly statuses?: readonly PipelineStepRunStatus[]\n readonly startedAfter?: Date\n readonly startedBefore?: Date\n readonly limit?: number\n readonly offset?: number\n readonly order?: \"asc\" | \"desc\"\n}\n\nexport interface ListPipelineStepRunsResult {\n readonly steps: readonly PipelineStepRunRecord[]\n readonly hasMore: boolean\n readonly total: number\n}\n\nexport interface PipelineRunStorage {\n queue(input: QueuePipelineRunInput): Promise<PipelineRunRecord>\n start(input: StartPipelineRunInput): Promise<PipelineRunRecord>\n finish(input: FinishPipelineRunInput): Promise<PipelineRunRecord>\n startStep(input: StartPipelineStepRunInput): Promise<PipelineStepRunRecord>\n finishStep(input: FinishPipelineStepRunInput): Promise<PipelineStepRunRecord>\n getById(params: { projectId: string; id: string }): Promise<PipelineRunRecord | null>\n list(input: ListPipelineRunsInput): Promise<ListPipelineRunsResult>\n listLatestByPipelineIds(input: ListLatestPipelineRunsInput): Promise<ListLatestPipelineRunsResult>\n listSteps(input: ListPipelineStepRunsInput): Promise<ListPipelineStepRunsResult>\n}\n",
35
- "import { parseSixbFailure } from \"../../errors/internal\"\nimport type { SixbFailure } from \"../../errors/types\"\nimport type { ExecutionStorage } from \"../executions\"\nimport {\n cloneRecord,\n compareStartedAt,\n hasEmptyStatuses,\n latestStartedAtByOwnerId,\n matchesRunListDateFilters,\n paginate,\n storageKey,\n toStatusSet,\n} from \"../run-listing\"\nimport { PipelineRunError } from \"./errors\"\nimport { canRequeuePipelineRunAfterEnqueueFailure } from \"./idempotency\"\nimport { assertPipelineRunExecution } from \"./provider\"\nimport type {\n FinishPipelineRunInput,\n FinishPipelineStepRunInput,\n ListLatestPipelineRunsInput,\n ListLatestPipelineRunsResult,\n ListPipelineRunsInput,\n ListPipelineRunsResult,\n ListPipelineStepRunsInput,\n ListPipelineStepRunsResult,\n PipelineRunFailureCode,\n PipelineRunRecord,\n PipelineRunStorage,\n PipelineStepRunRecord,\n QueuePipelineRunInput,\n StartPipelineRunInput,\n StartPipelineStepRunInput,\n} from \"./types\"\nimport { PIPELINE_RUN_FAILURE_CODES } from \"./types\"\n\nfunction normalizeError(\n error: SixbFailure<PipelineRunFailureCode> | undefined\n): SixbFailure<PipelineRunFailureCode> | undefined {\n return error ? parseSixbFailure(error, PIPELINE_RUN_FAILURE_CODES) : undefined\n}\n\nfunction assertNonNegativeInteger(value: number | undefined, fieldName: string): void {\n if (value !== undefined && (!Number.isInteger(value) || value < 0)) {\n throw new PipelineRunError(`[Sixb] Pipeline run ${fieldName} must be a non-negative integer.`)\n }\n}\n\nexport class InMemoryPipelineRunStorage implements PipelineRunStorage {\n private readonly runs = new Map<string, PipelineRunRecord>()\n private readonly steps = new Map<string, PipelineStepRunRecord>()\n\n constructor(private readonly executions: ExecutionStorage) {}\n\n snapshot(): InMemoryPipelineRunStorageSnapshot {\n return {\n runs: structuredClone(this.runs),\n steps: structuredClone(this.steps),\n }\n }\n\n restore(snapshot: InMemoryPipelineRunStorageSnapshot): void {\n this.runs.clear()\n for (const [key, record] of structuredClone(snapshot.runs)) {\n this.runs.set(key, record)\n }\n\n this.steps.clear()\n for (const [key, record] of structuredClone(snapshot.steps)) {\n this.steps.set(key, record)\n }\n }\n\n async queue(input: QueuePipelineRunInput): Promise<PipelineRunRecord> {\n const key = storageKey(input.projectId, input.id)\n const existing = this.runs.get(key)\n if (existing && !canRequeuePipelineRunAfterEnqueueFailure(existing, input)) {\n throw new PipelineRunError(\n `[Sixb] Pipeline run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n if (\n [...this.runs.values()].some(\n (run) =>\n run.projectId === input.projectId &&\n run.id !== input.id &&\n run.executionId === input.executionId\n )\n ) {\n throw new PipelineRunError(\n `[Sixb] Execution '${input.executionId}' already belongs to another Pipeline run.`\n )\n }\n await assertPipelineRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n pipelineId: input.pipelineId,\n })\n\n const queuedAt = new Date(input.queuedAt ?? new Date())\n if (existing) {\n const next: PipelineRunRecord = {\n ...existing,\n status: \"queued\",\n queuedAt,\n startedAt: undefined,\n finishedAt: undefined,\n output: undefined,\n error: undefined,\n }\n this.runs.set(key, cloneRecord(next))\n return cloneRecord(next)\n }\n\n const record: PipelineRunRecord = {\n id: input.id,\n projectId: input.projectId,\n executionId: input.executionId,\n pipelineId: input.pipelineId,\n status: \"queued\",\n queuedAt,\n }\n\n this.runs.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async start(input: StartPipelineRunInput): Promise<PipelineRunRecord> {\n const key = storageKey(input.projectId, input.id)\n const existing = this.runs.get(key)\n if (!existing) {\n throw new PipelineRunError(\n `[Sixb] Pipeline run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n if (existing.status !== \"queued\") {\n throw new PipelineRunError(\n `[Sixb] Pipeline run '${input.id}' cannot start from status '${existing.status}'.`\n )\n }\n\n const next: PipelineRunRecord = {\n ...existing,\n status: \"running\",\n startedAt: new Date(input.startedAt ?? new Date()),\n error: undefined,\n }\n this.runs.set(key, cloneRecord(next))\n return cloneRecord(next)\n }\n\n async finish(input: FinishPipelineRunInput): Promise<PipelineRunRecord> {\n const existing = this.requireExistingPipelineRun(input.projectId, input.id)\n const enqueueFailure = input.status === \"failed\" && input.error.code === \"queue.enqueue_failed\"\n if (\n (enqueueFailure && existing.status !== \"queued\") ||\n (!enqueueFailure && existing.status !== \"running\")\n ) {\n throw new PipelineRunError(\n `[Sixb] Pipeline run '${input.id}' cannot finish from status '${existing.status}'.`\n )\n }\n const base: PipelineRunRecord = {\n ...existing,\n status: input.status,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n }\n\n const next: PipelineRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n output: input.output ? cloneRecord(input.output) : undefined,\n error: undefined,\n }\n : {\n ...base,\n output: undefined,\n error: normalizeError(input.error),\n }\n\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async startStep(input: StartPipelineStepRunInput): Promise<PipelineStepRunRecord> {\n const pipelineRun = this.requireRunningPipelineRun(input.projectId, input.pipelineRunId)\n if (pipelineRun.pipelineId !== input.pipelineId) {\n throw new PipelineRunError(\n `[Sixb] Pipeline step run '${input.id}' pipeline '${input.pipelineId}' does not match pipeline run '${input.pipelineRunId}' pipeline '${pipelineRun.pipelineId}'.`\n )\n }\n\n const key = storageKey(input.projectId, input.id)\n if (this.steps.has(key)) {\n throw new PipelineRunError(\n `[Sixb] Pipeline step run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const record: PipelineStepRunRecord = {\n id: input.id,\n projectId: input.projectId,\n pipelineRunId: input.pipelineRunId,\n pipelineId: input.pipelineId,\n stepId: input.stepId,\n datasetId: input.datasetId,\n mode: input.mode,\n status: \"running\",\n startedAt: new Date(input.startedAt ?? new Date()),\n inputs: cloneRecord(input.inputs),\n }\n\n this.steps.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async finishStep(input: FinishPipelineStepRunInput): Promise<PipelineStepRunRecord> {\n assertNonNegativeInteger(input.rowsWritten, \"rowsWritten\")\n\n const existing = this.requireRunningStepRun(input.projectId, input.id)\n\n if (input.status === \"succeeded\" && input.output.datasetId !== existing.datasetId) {\n throw new PipelineRunError(\n `[Sixb] Pipeline step run '${input.id}' output dataset '${input.output.datasetId}' does not match '${existing.datasetId}'.`\n )\n }\n\n const base: PipelineStepRunRecord = {\n ...existing,\n status: input.status,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n rowsWritten: input.rowsWritten ?? existing.rowsWritten,\n }\n\n const next: PipelineStepRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n output: cloneRecord(input.output),\n error: undefined,\n }\n : {\n ...base,\n output: undefined,\n error: normalizeError(input.error),\n }\n\n this.steps.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async getById(params: { projectId: string; id: string }): Promise<PipelineRunRecord | null> {\n const record = this.runs.get(storageKey(params.projectId, params.id))\n return record ? cloneRecord(record) : null\n }\n\n async list(input: ListPipelineRunsInput): Promise<ListPipelineRunsResult> {\n if (hasEmptyStatuses(input) || input.pipelineIds?.length === 0) {\n return {\n runs: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const pipelineIds = input.pipelineIds ? new Set(input.pipelineIds) : null\n const filtered = [...this.runs.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => (input.pipelineId ? record.pipelineId === input.pipelineId : true))\n .filter((record) => (pipelineIds ? pipelineIds.has(record.pipelineId) : true))\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareStartedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n runs: page.map(cloneRecord),\n hasMore,\n total,\n }\n }\n\n async listLatestByPipelineIds(\n input: ListLatestPipelineRunsInput\n ): Promise<ListLatestPipelineRunsResult> {\n const runs = latestStartedAtByOwnerId(\n [...this.runs.values()].filter((record) => record.projectId === input.projectId),\n input.pipelineIds,\n (record) => record.pipelineId\n )\n\n return {\n runs: runs.map(cloneRecord),\n }\n }\n\n async listSteps(input: ListPipelineStepRunsInput): Promise<ListPipelineStepRunsResult> {\n if (hasEmptyStatuses(input)) {\n return {\n steps: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const filtered = [...this.steps.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) =>\n input.pipelineRunId ? record.pipelineRunId === input.pipelineRunId : true\n )\n .filter((record) => (input.pipelineId ? record.pipelineId === input.pipelineId : true))\n .filter((record) => (input.stepId ? record.stepId === input.stepId : true))\n .filter((record) => (input.datasetId ? record.datasetId === input.datasetId : true))\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareStartedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n steps: page.map(cloneRecord),\n hasMore,\n total,\n }\n }\n\n private requireExistingPipelineRun(projectId: string, id: string): PipelineRunRecord {\n const record = this.runs.get(storageKey(projectId, id))\n if (!record) {\n throw new PipelineRunError(\n `[Sixb] Pipeline run '${id}' not found for project '${projectId}'.`\n )\n }\n\n return record\n }\n\n private requireRunningPipelineRun(projectId: string, id: string): PipelineRunRecord {\n const record = this.requireExistingPipelineRun(projectId, id)\n if (record.status !== \"running\") {\n throw new PipelineRunError(\n `[Sixb] Pipeline run '${id}' for project '${projectId}' is already terminal.`\n )\n }\n\n return record\n }\n\n private requireRunningStepRun(projectId: string, id: string): PipelineStepRunRecord {\n const record = this.steps.get(storageKey(projectId, id))\n if (!record) {\n throw new PipelineRunError(\n `[Sixb] Pipeline step run '${id}' not found for project '${projectId}'.`\n )\n }\n\n if (record.status !== \"running\") {\n throw new PipelineRunError(\n `[Sixb] Pipeline step run '${id}' for project '${projectId}' is already terminal.`\n )\n }\n\n return record\n }\n}\n\nexport interface InMemoryPipelineRunStorageSnapshot {\n readonly runs: Map<string, PipelineRunRecord>\n readonly steps: Map<string, PipelineStepRunRecord>\n}\n",
36
- "import { randomUUID } from \"node:crypto\"\nimport type { ExecutionStorage } from \"../executions\"\nimport type { AssertSourceMaterializationExecutionInput } from \"../ontology/sources\"\nimport {\n compareStartedAt,\n latestStartedAtByOwnerId,\n matchesRunListDateFilters,\n} from \"../run-listing\"\nimport { ProjectionRunError } from \"./errors\"\nimport {\n advanceProjectionTelemetry,\n assertGenericProgressDoesNotAdvanceTelemetry,\n assertProjectionMissingTarget,\n assertProjectionRunAttempt,\n assertProjectionRunDurableExecution,\n assertProjectionRunIdentityMatches,\n assertProjectionRunListWindow,\n assertProjectionRunNonEmpty,\n assertProjectionRunQueueInput,\n assertProjectionRunRunning,\n assertProjectionRunStartInput,\n canRequeueProjectionRunAfterEnqueueFailure,\n createProjectionRunClaim,\n createProjectionRunRecord,\n failProjectionRunEnqueue,\n finishProjectionRunRecord,\n immutableDatasetVersionConflict,\n mergeProjectionRunProgress,\n planProjectionRunReclaim,\n projectionRunNotFound,\n publicProjectionRunRecord,\n requireTelemetryProjectionRun,\n type StoredProjectionRunRecord,\n staleProjectionRunExecution,\n} from \"./provider\"\nimport {\n type AdvanceProjectionTelemetryCheckpointInput,\n type FailProjectionRunEnqueueInput,\n type FinishProjectionRunInput,\n type ListLatestProjectionRunsInput,\n type ListLatestProjectionRunsResult,\n type ListProjectionRunsInput,\n type ListProjectionRunsResult,\n type LockProjectionRunForMaterializationInput,\n type ProjectionRunClaim,\n type ProjectionRunRecord,\n type ProjectionRunStorage,\n projectionRunObjectTypesVisible,\n type QueueProjectionRunInput,\n type RecordProjectionMissingTargetInput,\n type StartOrReclaimProjectionRunInput,\n type TelemetryProjectionRunRecord,\n type UpdateProjectionRunInput,\n} from \"./types\"\n\ntype RunRootOperation = <T>(run: () => Promise<T> | T) => Promise<T>\nconst runDirectly: RunRootOperation = async <T>(run: () => Promise<T> | T): Promise<T> => run()\n\nfunction projectionRunKey(projectId: string, id: string): string {\n return JSON.stringify([projectId, id])\n}\n\nfunction compareRuns(a: ProjectionRunRecord, b: ProjectionRunRecord, order: \"asc\" | \"desc\") {\n return compareStartedAt(a, b, order)\n}\n\nexport class InMemoryProjectionRunStorage implements ProjectionRunStorage {\n private readonly rows = new Map<string, StoredProjectionRunRecord>()\n /** Durable per-run history prevents a reclaimed execution token from becoming valid again. */\n private readonly executionTokensByRun = new Map<string, Set<string>>()\n private readonly runRootOperation: RunRootOperation\n private readonly createExecutionToken: () => string\n\n constructor(input: {\n readonly executions: ExecutionStorage\n readonly runRootOperation?: RunRootOperation\n readonly executionToken?: () => string\n }) {\n this.executions = input.executions\n this.runRootOperation = input.runRootOperation ?? runDirectly\n this.createExecutionToken = input.executionToken ?? randomUUID\n }\n\n private readonly executions: ExecutionStorage\n\n snapshot(): InMemoryProjectionRunStorageSnapshot {\n return structuredClone({\n rows: this.rows,\n executionTokensByRun: this.executionTokensByRun,\n })\n }\n\n restore(snapshot: InMemoryProjectionRunStorageSnapshot): void {\n this.rows.clear()\n this.executionTokensByRun.clear()\n for (const [key, record] of structuredClone(snapshot.rows)) this.rows.set(key, record)\n for (const [key, tokens] of structuredClone(snapshot.executionTokensByRun)) {\n this.executionTokensByRun.set(key, tokens)\n }\n }\n\n async queue(input: QueueProjectionRunInput): Promise<ProjectionRunRecord> {\n return this.runRootOperation(async () => {\n assertProjectionRunQueueInput(input)\n this.assertDatasetVersionIsImmutable(input)\n const key = projectionRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n if (existing && !canRequeueProjectionRunAfterEnqueueFailure(existing, input)) {\n throw new ProjectionRunError(\n `[Sixb] Projection run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n if (\n [...this.rows.values()].some(\n (run) =>\n run.projectId === input.projectId &&\n run.id !== input.id &&\n run.executionId === input.executionId\n )\n ) {\n throw new ProjectionRunError(\n `[Sixb] Execution '${input.executionId}' already belongs to another Projection run.`\n )\n }\n await assertProjectionRunDurableExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n projectionId: input.identity.projectionId,\n datasetId: input.identity.datasetVersion.datasetId,\n datasetVersionId: input.identity.datasetVersion.versionId,\n })\n const record = createProjectionRunRecord(input)\n this.rows.set(key, structuredClone(record))\n return publicProjectionRunRecord(record)\n })\n }\n\n async startOrReclaim(input: StartOrReclaimProjectionRunInput): Promise<ProjectionRunClaim> {\n return this.runRootOperation(() => {\n assertProjectionRunStartInput(input)\n const key = projectionRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n if (!existing) throw projectionRunNotFound(input.projectId, input.id)\n const attempt = planProjectionRunReclaim(existing, input).attempt\n const executionToken = this.issueExecutionToken(key, input.id, existing.executionToken)\n const record: StoredProjectionRunRecord = {\n ...existing,\n status: \"running\",\n attempt,\n executionToken,\n startedAt: existing.startedAt ?? new Date(input.startedAt ?? new Date()),\n finishedAt: undefined,\n error: undefined,\n }\n\n this.rows.set(key, structuredClone(record))\n return createProjectionRunClaim(record)\n })\n }\n\n async failEnqueue(input: FailProjectionRunEnqueueInput): Promise<ProjectionRunRecord> {\n return this.runRootOperation(() => {\n const key = projectionRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n if (!existing) throw projectionRunNotFound(input.projectId, input.id)\n const next = failProjectionRunEnqueue(existing, input)\n this.rows.set(key, structuredClone(next))\n return publicProjectionRunRecord(next)\n })\n }\n\n async lockForMaterialization(\n input: LockProjectionRunForMaterializationInput\n ): Promise<ProjectionRunRecord> {\n return this.runRootOperation(() => publicProjectionRunRecord(this.requireExecution(input)))\n }\n\n /** @internal The caller must already hold InMemoryStorage's root operation lock. */\n assertSourceMaterializationExecutionUnlocked(\n input: AssertSourceMaterializationExecutionInput\n ): void {\n assertProjectionRunNonEmpty(input.source.projectionId, \"projectionId\")\n assertProjectionRunNonEmpty(input.execution.executionToken, \"executionToken\")\n const record = this.requireRunning(input.projectId, input.execution.projectionRunId)\n if (\n record.identity.projectionId !== input.source.projectionId ||\n record.identity.protocol !== \"replacement\"\n ) {\n throw new ProjectionRunError(\n `[Sixb] Projection run '${record.id}' does not own replacement source '${input.source.projectionId}'.`\n )\n }\n if (record.executionToken !== input.execution.executionToken) {\n throw staleProjectionRunExecution(record.id)\n }\n if (input.identity) {\n assertProjectionRunIdentityMatches(record, {\n projectionId: input.source.projectionId,\n ...input.identity,\n })\n }\n }\n\n async update(input: UpdateProjectionRunInput): Promise<ProjectionRunRecord> {\n return this.runRootOperation(() => {\n const existing = this.requireExecution(input)\n assertGenericProgressDoesNotAdvanceTelemetry(existing, input.progress)\n const next = {\n ...existing,\n progress: mergeProjectionRunProgress(existing.progress, input.progress),\n }\n this.rows.set(projectionRunKey(input.projectId, input.id), structuredClone(next))\n return publicProjectionRunRecord(next)\n })\n }\n async advanceTelemetryCheckpoint(\n input: AdvanceProjectionTelemetryCheckpointInput\n ): Promise<TelemetryProjectionRunRecord> {\n return this.runRootOperation(() => {\n const existing = this.requireTelemetryExecution(input)\n const advance = advanceProjectionTelemetry(existing, input)\n const next: TelemetryProjectionRunRecord & { readonly executionToken: string } = {\n ...existing,\n progress: advance.progress,\n telemetryCheckpoint: advance.checkpoint,\n missingTarget: undefined,\n }\n this.rows.set(projectionRunKey(input.projectId, input.id), structuredClone(next))\n return publicProjectionRunRecord(next) as TelemetryProjectionRunRecord\n })\n }\n\n async recordMissingTarget(\n input: RecordProjectionMissingTargetInput\n ): Promise<TelemetryProjectionRunRecord> {\n return this.runRootOperation(() => {\n const existing = this.requireTelemetryExecution(input)\n const next: TelemetryProjectionRunRecord & { readonly executionToken: string } = {\n ...existing,\n missingTarget: assertProjectionMissingTarget(existing, input.missingTarget),\n }\n this.rows.set(projectionRunKey(input.projectId, input.id), structuredClone(next))\n return publicProjectionRunRecord(next) as TelemetryProjectionRunRecord\n })\n }\n\n async finish(input: FinishProjectionRunInput): Promise<ProjectionRunRecord> {\n return this.runRootOperation(() => {\n const existing = this.requireExecution(input)\n const next = finishProjectionRunRecord(existing, input)\n this.rows.set(projectionRunKey(input.projectId, input.id), structuredClone(next))\n return publicProjectionRunRecord(next)\n })\n }\n\n async getById(params: { projectId: string; id: string }): Promise<ProjectionRunRecord | null> {\n return this.runRootOperation(() => {\n const record = this.rows.get(projectionRunKey(params.projectId, params.id))\n return record ? publicProjectionRunRecord(record) : null\n })\n }\n\n async list(input: ListProjectionRunsInput): Promise<ListProjectionRunsResult> {\n return this.runRootOperation(() => {\n assertProjectionRunNonEmpty(input.projectId, \"projectId\")\n assertProjectionRunListWindow(input.limit, \"limit\")\n assertProjectionRunListWindow(input.offset, \"offset\")\n if (input.statuses?.length === 0) return { runs: [], hasMore: false, total: 0 }\n\n const order = input.order ?? \"desc\"\n const offset = input.offset ?? 0\n const limit = input.limit ?? this.rows.size\n const statuses = input.statuses ? new Set(input.statuses) : null\n const objectTypeIds = input.objectTypeIds ? new Set(input.objectTypeIds) : null\n const filtered = [...this.rows.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) =>\n input.projectionId ? record.identity.projectionId === input.projectionId : true\n )\n .filter((record) =>\n input.projectionKind ? record.identity.projectionKind === input.projectionKind : true\n )\n .filter((record) =>\n input.datasetId ? record.identity.datasetVersion.datasetId === input.datasetId : true\n )\n .filter((record) =>\n input.datasetVersionId\n ? record.identity.datasetVersion.versionId === input.datasetVersionId\n : true\n )\n .filter((record) =>\n objectTypeIds\n ? projectionRunObjectTypesVisible(record, (id) => objectTypeIds.has(id))\n : true\n )\n .filter((record) => (statuses ? statuses.has(record.status) : true))\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareRuns(left, right, order))\n\n const total = filtered.length\n const runs = filtered.slice(offset, offset + limit).map(publicProjectionRunRecord)\n return { runs, hasMore: offset + runs.length < total, total }\n })\n }\n\n async listLatestByProjectionIds(\n input: ListLatestProjectionRunsInput\n ): Promise<ListLatestProjectionRunsResult> {\n return this.runRootOperation(() => {\n const runs = latestStartedAtByOwnerId(\n [...this.rows.values()].filter((record) => record.projectId === input.projectId),\n input.projectionIds,\n (record) => record.identity.projectionId\n )\n return { runs: runs.map(publicProjectionRunRecord) }\n })\n }\n\n private assertDatasetVersionIsImmutable(input: QueueProjectionRunInput): void {\n for (const candidate of this.rows.values()) {\n if (\n candidate.projectId === input.projectId &&\n candidate.id !== input.id &&\n candidate.identity.datasetVersion.datasetId === input.identity.datasetVersion.datasetId &&\n candidate.identity.datasetVersion.versionId === input.identity.datasetVersion.versionId &&\n candidate.identity.datasetVersion.createdAt !== input.identity.datasetVersion.createdAt\n ) {\n throw immutableDatasetVersionConflict(input.identity)\n }\n }\n }\n\n private issueExecutionToken(\n key: string,\n runId: string,\n currentToken: string | undefined\n ): string {\n const executionToken = this.createExecutionToken()\n assertProjectionRunNonEmpty(executionToken, \"executionToken\")\n const usedTokens = this.executionTokensByRun.get(key) ?? new Set<string>()\n if (currentToken) usedTokens.add(currentToken)\n if (usedTokens.has(executionToken)) {\n throw new ProjectionRunError(\n `[Sixb] Projection run '${runId}' execution token was already used.`\n )\n }\n usedTokens.add(executionToken)\n this.executionTokensByRun.set(key, usedTokens)\n return executionToken\n }\n\n private requireExecution(\n input: LockProjectionRunForMaterializationInput\n ): StoredProjectionRunRecord & { readonly executionToken: string } {\n const record = this.requireRunning(input.projectId, input.id)\n assertProjectionRunAttempt(record, input)\n return record\n }\n\n private requireTelemetryExecution(\n input: LockProjectionRunForMaterializationInput\n ): TelemetryProjectionRunRecord & { readonly executionToken: string } {\n const record = this.requireExecution(input)\n return requireTelemetryProjectionRun(record)\n }\n\n private requireRunning(projectId: string, id: string): StoredProjectionRunRecord {\n assertProjectionRunNonEmpty(projectId, \"projectId\")\n assertProjectionRunNonEmpty(id, \"id\")\n const record = this.rows.get(projectionRunKey(projectId, id))\n if (!record) {\n throw projectionRunNotFound(projectId, id)\n }\n assertProjectionRunRunning(record)\n return record\n }\n}\n\nexport interface InMemoryProjectionRunStorageSnapshot {\n readonly rows: Map<string, StoredProjectionRunRecord>\n readonly executionTokensByRun: Map<string, Set<string>>\n}\n",
37
- "import type {\n RuleEventSubject,\n StoredRuleResolvedEvent,\n StoredRuleTriggeredEvent,\n} from \"../../events\"\nimport type {\n ListActiveRuleStatesInput,\n ListActiveRuleStatesResult,\n ListRuleStatesReconciliationPageInput,\n ListRuleStatesReconciliationPageResult,\n RuleStateCursor,\n RuleStateRecord,\n RuleStateTransitionEvent,\n RulesStorage,\n} from \"./types\"\n\nfunction stateKey(params: {\n readonly projectId: string\n readonly ruleId: string\n readonly subject: RuleEventSubject\n}): string {\n return JSON.stringify([\n params.projectId,\n params.ruleId,\n params.subject.kind,\n params.subject.objectTypeId,\n params.subject.primaryId,\n ])\n}\n\nfunction cloneRuleStateRecord(record: RuleStateRecord): RuleStateRecord {\n return structuredClone(record)\n}\n\nfunction compareRuleStateRecords(\n left: RuleStateRecord,\n right: RuleStateRecord,\n order: \"asc\" | \"desc\"\n): number {\n const direction = order === \"asc\" ? 1 : -1\n const fields = [\n left.triggeredAt.localeCompare(right.triggeredAt),\n left.ruleId.localeCompare(right.ruleId),\n left.subject.objectTypeId.localeCompare(right.subject.objectTypeId),\n left.subject.primaryId.localeCompare(right.subject.primaryId),\n ]\n\n for (const value of fields) {\n if (value !== 0) {\n return value * direction\n }\n }\n\n return 0\n}\n\nfunction compareRuleStateIdentity(left: RuleStateRecord, right: RuleStateRecord): number {\n return (\n left.ruleId.localeCompare(right.ruleId) ||\n left.subject.objectTypeId.localeCompare(right.subject.objectTypeId) ||\n left.subject.primaryId.localeCompare(right.subject.primaryId)\n )\n}\n\nfunction compareCursor(record: RuleStateRecord, cursor: RuleStateCursor): number {\n return (\n record.ruleId.localeCompare(cursor.ruleId) ||\n record.subject.objectTypeId.localeCompare(cursor.objectTypeId) ||\n record.subject.primaryId.localeCompare(cursor.primaryId)\n )\n}\n\nexport class InMemoryRulesStorage implements RulesStorage {\n private readonly active = new Map<string, RuleStateRecord>()\n\n snapshot(): InMemoryRulesStorageSnapshot {\n return structuredClone(this.active)\n }\n\n restore(snapshot: InMemoryRulesStorageSnapshot): void {\n this.active.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.active.set(key, record)\n }\n }\n\n async getActive(params: {\n projectId: string\n ruleId: string\n subject: RuleEventSubject\n }): Promise<RuleStateRecord | null> {\n const record = this.active.get(stateKey(params))\n return record ? cloneRuleStateRecord(record) : null\n }\n\n async getActiveBatch(params: {\n projectId: string\n items: readonly { readonly ruleId: string; readonly subject: RuleEventSubject }[]\n }): Promise<readonly RuleStateRecord[]> {\n return params.items.flatMap((item) => {\n const record = this.active.get(stateKey({ projectId: params.projectId, ...item }))\n return record ? [cloneRuleStateRecord(record)] : []\n })\n }\n\n async listActive(input: ListActiveRuleStatesInput): Promise<ListActiveRuleStatesResult> {\n if (input.objectTypeIds?.length === 0) {\n return { states: [], hasMore: false, total: 0 }\n }\n\n const order = input.order ?? \"desc\"\n const offset = input.offset ?? 0\n const objectTypeIds = input.objectTypeIds ? new Set(input.objectTypeIds) : null\n const states = [...this.active.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => !input.ruleId || record.ruleId === input.ruleId)\n .filter((record) => !input.objectTypeId || record.subject.objectTypeId === input.objectTypeId)\n .filter((record) => (objectTypeIds ? objectTypeIds.has(record.subject.objectTypeId) : true))\n .filter((record) => !input.primaryId || record.subject.primaryId === input.primaryId)\n .sort((left, right) => compareRuleStateRecords(left, right, order))\n\n const total = states.length\n const windowed =\n input.limit === undefined ? states.slice(offset) : states.slice(offset, offset + input.limit)\n\n return {\n states: windowed.map(cloneRuleStateRecord),\n hasMore: offset + windowed.length < total,\n total,\n }\n }\n\n async listReconciliationPage(\n input: ListRuleStatesReconciliationPageInput\n ): Promise<ListRuleStatesReconciliationPageResult> {\n const rows = [...this.active.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => record.subject.kind === \"object\")\n .filter((record) => !input.after || compareCursor(record, input.after) > 0)\n .sort(compareRuleStateIdentity)\n .slice(0, input.limit + 1)\n const hasMore = rows.length > input.limit\n const states = rows.slice(0, input.limit).map(cloneRuleStateRecord)\n const last = states.at(-1)\n return {\n states,\n ...(hasMore && last\n ? {\n next: {\n ruleId: last.ruleId,\n objectTypeId: last.subject.objectTypeId,\n primaryId: last.subject.primaryId,\n },\n }\n : {}),\n }\n }\n\n async applyTriggered(event: StoredRuleTriggeredEvent): Promise<void> {\n const record: RuleStateRecord = {\n projectId: event.projectId,\n ruleId: event.payload.ruleId,\n subject: structuredClone(event.payload.subject),\n triggeredAt: event.payload.triggeredAt,\n }\n\n this.active.set(stateKey(record), cloneRuleStateRecord(record))\n }\n\n async applyResolved(event: StoredRuleResolvedEvent): Promise<void> {\n this.active.delete(\n stateKey({\n projectId: event.projectId,\n ruleId: event.payload.ruleId,\n subject: event.payload.subject,\n })\n )\n }\n\n async applyTransitions(events: readonly RuleStateTransitionEvent[]): Promise<void> {\n for (const event of events) {\n if (event.type === \"rule.triggered\") {\n await this.applyTriggered(event)\n } else {\n await this.applyResolved(event)\n }\n }\n }\n}\n\nexport type InMemoryRulesStorageSnapshot = Map<string, RuleStateRecord>\n",
38
- "import type { QueueSyncRunInput, SyncRunRecord } from \"./types\"\n\nexport function canRequeueSyncRunAfterEnqueueFailure(\n existing: SyncRunRecord,\n input: QueueSyncRunInput\n): boolean {\n return (\n existing.status === \"failed\" &&\n existing.error?.code === \"queue.enqueue_failed\" &&\n existing.error.retryable &&\n existing.executionId === input.executionId &&\n existing.syncId === input.syncId &&\n existing.datasetId === input.datasetId &&\n existing.mode === input.mode &&\n existing.expectedLatestVersionId === input.expectedLatestVersionId &&\n existing.commitMessage === input.commitMessage\n )\n}\n",
39
- "import type { SixbErrorCode, SixbFailure } from \"../../errors/types\"\nimport type { JsonValue } from \"../../json\"\nimport type { DatasetVersionRef, DatasetWriteMode } from \"../../lake-storage\"\n\nexport type SyncRunMode = DatasetWriteMode | \"merge\"\n\nexport type SyncRunStatus = \"queued\" | \"running\" | \"succeeded\" | \"failed\" | \"cancelled\"\n/** Error codes a sync run can persist and expose through its public contract. */\nexport const SYNC_RUN_FAILURE_CODES = [\n \"internal.unexpected\",\n \"runtime.cancelled\",\n \"queue.enqueue_failed\",\n \"sync.execution_failed\",\n] as const satisfies readonly [SixbErrorCode, ...SixbErrorCode[]]\n\nexport type SyncRunFailureCode = (typeof SYNC_RUN_FAILURE_CODES)[number]\n\nexport interface SyncRunRecord {\n readonly id: string\n readonly projectId: string\n readonly executionId: string\n readonly syncId: string\n readonly datasetId: string\n readonly mode: SyncRunMode\n readonly status: SyncRunStatus\n readonly queuedAt: Date\n readonly startedAt?: Date\n readonly finishedAt?: Date\n /** Source items successfully consumed. Merge runs count both upserts and deletes. */\n readonly rowsRead?: number\n readonly output?: DatasetVersionRef\n readonly expectedLatestVersionId?: string\n readonly commitMessage?: string\n readonly error?: SixbFailure<SyncRunFailureCode>\n readonly checkpoint?: JsonValue\n}\n\nexport interface QueueSyncRunInput {\n readonly id: string\n readonly projectId: string\n readonly executionId: string\n readonly syncId: string\n readonly datasetId: string\n readonly mode: SyncRunMode\n readonly queuedAt?: Date\n readonly expectedLatestVersionId?: string\n readonly commitMessage?: string\n}\n\nexport interface StartSyncRunInput {\n readonly id: string\n readonly projectId: string\n readonly startedAt?: Date\n}\n\nexport type FinishSyncRunInput =\n | {\n readonly id: string\n readonly projectId: string\n readonly status: \"succeeded\"\n readonly finishedAt?: Date\n /** Source items successfully consumed. Merge runs count both upserts and deletes. */\n readonly rowsRead: number\n /** Absent when a successful run has no dataset version to reference. */\n readonly output?: DatasetVersionRef\n readonly checkpoint?: JsonValue\n }\n | {\n readonly id: string\n readonly projectId: string\n readonly status: \"failed\"\n readonly finishedAt?: Date\n /** Source items successfully consumed before the failure or cancellation. */\n readonly rowsRead?: number\n readonly error: SixbFailure<SyncRunFailureCode>\n }\n | {\n readonly id: string\n readonly projectId: string\n readonly status: \"cancelled\"\n readonly finishedAt?: Date\n /** Source items successfully consumed before cancellation. */\n readonly rowsRead?: number\n readonly error?: SixbFailure<SyncRunFailureCode>\n }\n\nexport interface ListSyncRunsInput {\n readonly projectId: string\n readonly syncId?: string\n readonly syncIds?: readonly string[]\n readonly datasetId?: string\n readonly statuses?: readonly SyncRunStatus[]\n readonly startedAfter?: Date\n readonly startedBefore?: Date\n readonly limit?: number\n readonly offset?: number\n readonly order?: \"asc\" | \"desc\"\n}\n\nexport interface ListSyncRunsResult {\n readonly runs: readonly SyncRunRecord[]\n readonly hasMore: boolean\n readonly total: number\n}\n\nexport interface ListLatestSyncRunsInput {\n readonly projectId: string\n readonly syncIds: readonly string[]\n}\n\nexport interface ListLatestSyncRunsResult {\n readonly runs: readonly SyncRunRecord[]\n}\n\nexport interface SyncRunStorage {\n queue(input: QueueSyncRunInput): Promise<SyncRunRecord>\n start(input: StartSyncRunInput): Promise<SyncRunRecord>\n finish(input: FinishSyncRunInput): Promise<SyncRunRecord>\n getById(params: { projectId: string; id: string }): Promise<SyncRunRecord | null>\n list(input: ListSyncRunsInput): Promise<ListSyncRunsResult>\n listLatestBySyncIds(input: ListLatestSyncRunsInput): Promise<ListLatestSyncRunsResult>\n}\n",
40
- "import { parseSixbFailure } from \"../../errors/internal\"\nimport type { SixbFailure } from \"../../errors/types\"\nimport { cloneJsonValue, type JsonValue } from \"../../json\"\nimport type { ExecutionStorage } from \"../executions\"\nimport {\n compareStartedAt,\n hasEmptyStatuses,\n latestStartedAtByOwnerId,\n matchesRunListDateFilters,\n paginate,\n toStatusSet,\n} from \"../run-listing\"\nimport { SyncRunError } from \"./errors\"\nimport { canRequeueSyncRunAfterEnqueueFailure } from \"./idempotency\"\nimport { assertSyncRunExecution } from \"./provider\"\nimport type {\n FinishSyncRunInput,\n ListLatestSyncRunsInput,\n ListLatestSyncRunsResult,\n ListSyncRunsInput,\n ListSyncRunsResult,\n QueueSyncRunInput,\n StartSyncRunInput,\n SyncRunFailureCode,\n SyncRunRecord,\n SyncRunStorage,\n} from \"./types\"\nimport { SYNC_RUN_FAILURE_CODES } from \"./types\"\n\nfunction syncRunKey(projectId: string, id: string): string {\n return `${projectId}:${id}`\n}\n\nfunction cloneSyncRunRecord(record: SyncRunRecord): SyncRunRecord {\n return structuredClone(record)\n}\n\nfunction normalizeCheckpoint(checkpoint: JsonValue | undefined): JsonValue | undefined {\n return checkpoint !== undefined ? cloneJsonValue(checkpoint) : undefined\n}\n\nfunction normalizeError(\n error: SixbFailure<SyncRunFailureCode> | undefined\n): SixbFailure<SyncRunFailureCode> | undefined {\n return error ? parseSixbFailure(error, SYNC_RUN_FAILURE_CODES) : undefined\n}\n\nexport class InMemorySyncRunStorage implements SyncRunStorage {\n private readonly rows = new Map<string, SyncRunRecord>()\n\n constructor(private readonly executions: ExecutionStorage) {}\n\n snapshot(): InMemorySyncRunStorageSnapshot {\n return structuredClone(this.rows)\n }\n\n restore(snapshot: InMemorySyncRunStorageSnapshot): void {\n this.rows.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.rows.set(key, record)\n }\n }\n\n async queue(input: QueueSyncRunInput): Promise<SyncRunRecord> {\n const key = syncRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n if (existing && !canRequeueSyncRunAfterEnqueueFailure(existing, input)) {\n throw new SyncRunError(\n `[Sixb] Sync run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n if (\n [...this.rows.values()].some(\n (run) =>\n run.projectId === input.projectId &&\n run.id !== input.id &&\n run.executionId === input.executionId\n )\n ) {\n throw new SyncRunError(\n `[Sixb] Execution '${input.executionId}' already belongs to another Sync run.`\n )\n }\n await assertSyncRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n syncId: input.syncId,\n })\n\n const queuedAt = new Date(input.queuedAt ?? new Date())\n if (existing) {\n const next: SyncRunRecord = {\n ...existing,\n status: \"queued\",\n queuedAt,\n startedAt: undefined,\n finishedAt: undefined,\n rowsRead: undefined,\n output: undefined,\n error: undefined,\n checkpoint: undefined,\n }\n this.rows.set(key, structuredClone(next))\n return cloneSyncRunRecord(next)\n }\n\n const record: SyncRunRecord = {\n id: input.id,\n projectId: input.projectId,\n executionId: input.executionId,\n syncId: input.syncId,\n datasetId: input.datasetId,\n mode: input.mode,\n status: \"queued\",\n queuedAt,\n expectedLatestVersionId: input.expectedLatestVersionId,\n commitMessage: input.commitMessage,\n }\n\n this.rows.set(key, structuredClone(record))\n return cloneSyncRunRecord(record)\n }\n\n async start(input: StartSyncRunInput): Promise<SyncRunRecord> {\n const key = syncRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n if (!existing) {\n throw new SyncRunError(\n `[Sixb] Sync run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n if (existing.status !== \"queued\") {\n throw new SyncRunError(\n `[Sixb] Sync run '${input.id}' cannot start from status '${existing.status}'.`\n )\n }\n\n const next: SyncRunRecord = {\n ...existing,\n status: \"running\",\n startedAt: new Date(input.startedAt ?? new Date()),\n error: undefined,\n }\n this.rows.set(key, structuredClone(next))\n return cloneSyncRunRecord(next)\n }\n\n async finish(input: FinishSyncRunInput): Promise<SyncRunRecord> {\n const key = syncRunKey(input.projectId, input.id)\n const existing = this.rows.get(key)\n\n if (!existing) {\n throw new SyncRunError(\n `[Sixb] Sync run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n const enqueueFailure = input.status === \"failed\" && input.error.code === \"queue.enqueue_failed\"\n if (\n (enqueueFailure && existing.status !== \"queued\") ||\n (!enqueueFailure && existing.status !== \"running\")\n ) {\n throw new SyncRunError(\n `[Sixb] Sync run '${input.id}' cannot finish from status '${existing.status}'.`\n )\n }\n\n if (input.status === \"succeeded\") {\n if (input.output && input.output.datasetId !== existing.datasetId) {\n throw new SyncRunError(\n `[Sixb] Sync run '${input.id}' output dataset '${input.output.datasetId}' does not match '${existing.datasetId}'.`\n )\n }\n if (!input.output && input.rowsRead !== 0 && existing.mode !== \"merge\") {\n throw new SyncRunError(\n `[Sixb] Sync run '${input.id}' may omit its output with rows read only for an initial merge no-op.`\n )\n }\n }\n\n const base: SyncRunRecord = {\n ...existing,\n status: input.status,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n }\n\n const next: SyncRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n rowsRead: input.rowsRead,\n output: input.output ? structuredClone(input.output) : undefined,\n error: undefined,\n checkpoint: normalizeCheckpoint(input.checkpoint),\n }\n : {\n ...base,\n rowsRead: input.rowsRead ?? existing.rowsRead,\n output: undefined,\n error: normalizeError(input.error),\n checkpoint: undefined,\n }\n\n this.rows.set(key, structuredClone(next))\n return cloneSyncRunRecord(next)\n }\n\n async getById(params: { projectId: string; id: string }): Promise<SyncRunRecord | null> {\n const record = this.rows.get(syncRunKey(params.projectId, params.id))\n return record ? cloneSyncRunRecord(record) : null\n }\n\n async list(input: ListSyncRunsInput): Promise<ListSyncRunsResult> {\n if (hasEmptyStatuses(input) || input.syncIds?.length === 0) {\n return {\n runs: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const syncIds = input.syncIds ? new Set(input.syncIds) : null\n\n const filtered = [...this.rows.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => (input.syncId ? record.syncId === input.syncId : true))\n .filter((record) => (syncIds ? syncIds.has(record.syncId) : true))\n .filter((record) => (input.datasetId ? record.datasetId === input.datasetId : true))\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareStartedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n runs: page.map(cloneSyncRunRecord),\n hasMore,\n total,\n }\n }\n\n async listLatestBySyncIds(input: ListLatestSyncRunsInput): Promise<ListLatestSyncRunsResult> {\n const runs = latestStartedAtByOwnerId(\n [...this.rows.values()].filter((record) => record.projectId === input.projectId),\n input.syncIds,\n (record) => record.syncId\n )\n\n return {\n runs: runs.map(cloneSyncRunRecord),\n }\n }\n}\n\nexport type InMemorySyncRunStorageSnapshot = Map<string, SyncRunRecord>\n",
41
- "import { StorageTransactionError } from \"./errors\"\n\ntype ObjectLike = Record<PropertyKey, unknown>\n\nexport function createTransactionStorageProxy<T extends object>(\n target: T,\n isActive: () => boolean\n): T {\n const proxies = new WeakMap<object, object>()\n\n const wrap = <TValue extends object>(value: TValue): TValue => {\n const existing = proxies.get(value)\n if (existing) return existing as TValue\n\n const proxy = new Proxy(value as ObjectLike, {\n // The guard runs on property access and on call. Its purpose is to fail fast when a\n // transaction handle (`tx`) leaks past the transaction's lifetime — using it afterward is a\n // bug, not a recoverable state. Overhead is bounded: only the storage namespaces reachable\n // from `tx` are wrapped (a handful), not the row/link data graph, and never per-record.\n get(current, property, receiver) {\n assertTransactionActive(isActive)\n const result = Reflect.get(current, property, receiver)\n if (typeof result === \"function\") {\n return (...args: unknown[]) => {\n assertTransactionActive(isActive)\n return result.apply(current, args)\n }\n }\n if (result && typeof result === \"object\") {\n return wrap(result)\n }\n return result\n },\n })\n\n proxies.set(value, proxy)\n return proxy as TValue\n }\n\n return wrap(target)\n}\n\nexport function assertTransactionActive(isActive: () => boolean): void {\n if (!isActive()) {\n throw new StorageTransactionError(\n \"[Sixb] Transaction storage cannot be used after transaction completion.\",\n { code: \"transaction_inactive\" }\n )\n }\n}\n\nexport function throwNestedStorageTransaction(): never {\n throw new StorageTransactionError(\"[Sixb] Nested storage transactions are not supported yet.\", {\n code: \"nested_transaction\",\n })\n}\n",
42
- "import type { SixbErrorCode, SixbFailure } from \"../../errors/types\"\n\nexport type WebhookRunStatus = \"running\" | \"succeeded\" | \"failed\"\nexport type FinishWebhookRunStatus = Exclude<WebhookRunStatus, \"running\">\n\n/** Error codes a webhook run can persist and expose through its public contract. */\nexport const WEBHOOK_RUN_FAILURE_CODES = [\n \"internal.unexpected\",\n \"webhook.delivery_failed\",\n \"webhook.delivery_rejected\",\n] as const satisfies readonly [SixbErrorCode, ...SixbErrorCode[]]\n\nexport type WebhookRunFailureCode = (typeof WEBHOOK_RUN_FAILURE_CODES)[number]\n\nexport interface WebhookRunRecord {\n readonly id: string\n readonly projectId: string\n readonly executionId: string\n readonly connectorId: string\n readonly webhookId: string\n readonly status: WebhookRunStatus\n readonly method: string\n readonly route: string\n readonly startedAt: Date\n readonly finishedAt?: Date\n readonly requestBodyBytes: number\n readonly requestBodySha256: string\n readonly responseStatus?: number\n readonly idempotencyKey?: string\n readonly error?: SixbFailure<WebhookRunFailureCode>\n}\n\nexport interface StartWebhookRunInput {\n readonly id: string\n readonly projectId: string\n readonly executionId: string\n readonly connectorId: string\n readonly webhookId: string\n readonly method: string\n readonly route: string\n readonly requestBodyBytes: number\n readonly requestBodySha256: string\n readonly idempotencyKey?: string\n readonly startedAt?: Date\n}\n\nexport interface RestartWebhookRunInput {\n readonly id: string\n readonly projectId: string\n readonly startedAt?: Date\n}\n\ninterface FinishWebhookRunBaseInput {\n readonly id: string\n readonly projectId: string\n readonly finishedAt?: Date\n readonly responseStatus?: number\n}\n\nexport type FinishWebhookRunInput = FinishWebhookRunBaseInput &\n (\n | {\n readonly status: \"succeeded\"\n readonly error?: never\n }\n | {\n readonly status: \"failed\"\n readonly error: SixbFailure<WebhookRunFailureCode>\n }\n )\n\nexport interface GetWebhookRunByDeliveryInput {\n readonly projectId: string\n readonly connectorId: string\n readonly webhookId: string\n readonly idempotencyKey: string\n}\n\nexport interface ListWebhookRunsInput {\n readonly projectId: string\n readonly connectorId?: string\n readonly webhookId?: string\n readonly statuses?: readonly WebhookRunStatus[]\n readonly idempotencyKey?: string\n readonly startedAfter?: Date\n readonly startedBefore?: Date\n readonly limit?: number\n readonly offset?: number\n readonly order?: \"asc\" | \"desc\"\n}\n\nexport interface ListWebhookRunsResult {\n readonly runs: readonly WebhookRunRecord[]\n readonly hasMore: boolean\n readonly total: number\n}\n\nexport interface WebhookRunStorage {\n start(input: StartWebhookRunInput): Promise<WebhookRunRecord>\n restart(input: RestartWebhookRunInput): Promise<WebhookRunRecord>\n finish(input: FinishWebhookRunInput): Promise<WebhookRunRecord>\n getById(params: { projectId: string; id: string }): Promise<WebhookRunRecord | null>\n getByDelivery(input: GetWebhookRunByDeliveryInput): Promise<WebhookRunRecord | null>\n list(input: ListWebhookRunsInput): Promise<ListWebhookRunsResult>\n}\n\n/** Provider retries may reopen only failures classified as retryable by the shared error policy. */\nexport function canRetryWebhookRun(run: WebhookRunRecord): boolean {\n return run.status === \"failed\" && run.error?.retryable === true\n}\n",
43
- "import { parseSixbFailure } from \"../../errors/internal\"\nimport type { ExecutionStorage } from \"../executions\"\nimport {\n cloneRecord,\n compareStartedAt,\n hasEmptyStatuses,\n matchesRunListDateFilters,\n paginate,\n storageKey,\n toStatusSet,\n} from \"../run-listing\"\nimport { WebhookRunError } from \"./errors\"\nimport { assertWebhookRunExecution } from \"./provider\"\nimport type {\n FinishWebhookRunInput,\n ListWebhookRunsInput,\n ListWebhookRunsResult,\n RestartWebhookRunInput,\n StartWebhookRunInput,\n WebhookRunRecord,\n WebhookRunStorage,\n} from \"./types\"\nimport { canRetryWebhookRun, WEBHOOK_RUN_FAILURE_CODES } from \"./types\"\n\nexport class InMemoryWebhookRunStorage implements WebhookRunStorage {\n private readonly runs = new Map<string, WebhookRunRecord>()\n\n constructor(private readonly executions: ExecutionStorage) {}\n\n snapshot(): InMemoryWebhookRunStorageSnapshot {\n return structuredClone(this.runs)\n }\n\n restore(snapshot: InMemoryWebhookRunStorageSnapshot): void {\n this.runs.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.runs.set(key, record)\n }\n }\n\n async start(input: StartWebhookRunInput): Promise<WebhookRunRecord> {\n await assertWebhookRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n route: input.route,\n })\n const key = storageKey(input.projectId, input.id)\n if (this.runs.has(key) || this.findByDelivery(input)) {\n throw new WebhookRunError(\n `[Sixb] Webhook run '${input.id}' or delivery key already exists for project '${input.projectId}'.`,\n \"duplicate_run\"\n )\n }\n\n const record: WebhookRunRecord = {\n id: input.id,\n projectId: input.projectId,\n executionId: input.executionId,\n connectorId: input.connectorId,\n webhookId: input.webhookId,\n status: \"running\",\n method: input.method,\n route: input.route,\n startedAt: new Date(input.startedAt ?? new Date()),\n requestBodyBytes: input.requestBodyBytes,\n requestBodySha256: input.requestBodySha256,\n idempotencyKey: input.idempotencyKey,\n }\n\n this.runs.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async restart(input: RestartWebhookRunInput): Promise<WebhookRunRecord> {\n const existing = this.requireWebhookRun(input.projectId, input.id)\n if (!canRetryWebhookRun(existing)) {\n throw new WebhookRunError(\n `[Sixb] Webhook run '${input.id}' cannot restart from status '${existing.status}'.`,\n \"invalid_transition\"\n )\n }\n const next: WebhookRunRecord = {\n ...existing,\n status: \"running\",\n startedAt: new Date(input.startedAt ?? new Date()),\n finishedAt: undefined,\n responseStatus: undefined,\n error: undefined,\n }\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async finish(input: FinishWebhookRunInput): Promise<WebhookRunRecord> {\n const existing = this.requireRunningWebhookRun(input.projectId, input.id)\n const next: WebhookRunRecord = {\n ...existing,\n status: input.status,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n responseStatus: input.responseStatus,\n error:\n input.status === \"failed\"\n ? parseSixbFailure(input.error, WEBHOOK_RUN_FAILURE_CODES)\n : undefined,\n }\n\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async getById(params: { projectId: string; id: string }): Promise<WebhookRunRecord | null> {\n const record = this.runs.get(storageKey(params.projectId, params.id))\n return record ? cloneRecord(record) : null\n }\n\n async getByDelivery(input: {\n projectId: string\n connectorId: string\n webhookId: string\n idempotencyKey: string\n }): Promise<WebhookRunRecord | null> {\n const record = this.findByDelivery(input)\n return record ? cloneRecord(record) : null\n }\n\n async list(input: ListWebhookRunsInput): Promise<ListWebhookRunsResult> {\n if (hasEmptyStatuses(input)) {\n return {\n runs: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const filtered = [...this.runs.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => (input.connectorId ? record.connectorId === input.connectorId : true))\n .filter((record) => (input.webhookId ? record.webhookId === input.webhookId : true))\n .filter((record) =>\n input.idempotencyKey ? record.idempotencyKey === input.idempotencyKey : true\n )\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareStartedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n runs: page.map(cloneRecord),\n hasMore,\n total,\n }\n }\n\n private requireWebhookRun(projectId: string, id: string): WebhookRunRecord {\n const record = this.runs.get(storageKey(projectId, id))\n if (!record) {\n throw new WebhookRunError(\n `[Sixb] Webhook run '${id}' not found for project '${projectId}'.`,\n \"not_found\"\n )\n }\n\n return record\n }\n\n private requireRunningWebhookRun(projectId: string, id: string): WebhookRunRecord {\n const record = this.requireWebhookRun(projectId, id)\n\n if (record.status !== \"running\") {\n throw new WebhookRunError(\n `[Sixb] Webhook run '${id}' for project '${projectId}' is already terminal.`,\n \"invalid_transition\"\n )\n }\n\n return record\n }\n\n private findByDelivery(input: {\n readonly projectId: string\n readonly connectorId: string\n readonly webhookId: string\n readonly idempotencyKey?: string\n }): WebhookRunRecord | undefined {\n if (input.idempotencyKey === undefined) return undefined\n return [...this.runs.values()].find(\n (run) =>\n run.projectId === input.projectId &&\n run.connectorId === input.connectorId &&\n run.webhookId === input.webhookId &&\n run.idempotencyKey === input.idempotencyKey\n )\n }\n}\n\nexport type InMemoryWebhookRunStorageSnapshot = Map<string, WebhookRunRecord>\n",
44
- "/**\n * Base error for workflow-intervention storage operations.\n */\nexport class WorkflowInterventionError extends Error {\n readonly name = \"WorkflowInterventionError\"\n}\n",
45
- "import { cloneRecord, hasEmptyStatuses, paginate, storageKey, toStatusSet } from \"../run-listing\"\nimport { WorkflowInterventionError } from \"./errors\"\nimport type {\n CancelWorkflowInterventionInput,\n CreateWorkflowInterventionInput,\n ExpireWorkflowInterventionInput,\n ListWorkflowInterventionsInput,\n ListWorkflowInterventionsResult,\n SubmitWorkflowInterventionInput,\n WorkflowInterventionRecord,\n WorkflowInterventionStorage,\n} from \"./types\"\n\nfunction assertNonNegativeInteger(value: number, fieldName: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new WorkflowInterventionError(\n `[Sixb] Workflow intervention ${fieldName} must be a non-negative integer.`\n )\n }\n}\n\nexport class InMemoryWorkflowInterventionStorage implements WorkflowInterventionStorage {\n private readonly interventions = new Map<string, WorkflowInterventionRecord>()\n\n snapshot(): InMemoryWorkflowInterventionStorageSnapshot {\n return structuredClone(this.interventions)\n }\n\n restore(snapshot: InMemoryWorkflowInterventionStorageSnapshot): void {\n this.interventions.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.interventions.set(key, record)\n }\n }\n\n async create(input: CreateWorkflowInterventionInput): Promise<WorkflowInterventionRecord> {\n assertNonNegativeInteger(input.nodeIndex, \"nodeIndex\")\n\n const key = storageKey(input.projectId, input.id)\n if (this.interventions.has(key)) {\n throw new WorkflowInterventionError(\n `[Sixb] Workflow intervention '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const record: WorkflowInterventionRecord = {\n id: input.id,\n projectId: input.projectId,\n workflowId: input.workflowId,\n workflowRunId: input.workflowRunId,\n nodeRunId: input.nodeRunId,\n nodeIndex: input.nodeIndex,\n nodeId: input.nodeId,\n nodeKey: input.nodeKey,\n interventionId: input.interventionId,\n input: cloneRecord(input.input),\n defaultResponse: cloneRecord(input.defaultResponse),\n status: \"pending\",\n requestedAt: new Date(input.requestedAt ?? new Date()),\n expiresAt: input.expiresAt ? new Date(input.expiresAt) : undefined,\n }\n\n this.interventions.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async submit(input: SubmitWorkflowInterventionInput): Promise<WorkflowInterventionRecord> {\n const existing = this.requirePendingIntervention(input.projectId, input.id)\n const next: WorkflowInterventionRecord = {\n ...existing,\n status: \"submitted\",\n submittedAt: new Date(input.submittedAt ?? new Date()),\n submittedBy: input.submittedBy ? cloneRecord(input.submittedBy) : undefined,\n response: cloneRecord(input.response),\n }\n\n this.interventions.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async cancel(input: CancelWorkflowInterventionInput): Promise<WorkflowInterventionRecord> {\n const existing = this.requirePendingIntervention(input.projectId, input.id)\n const next: WorkflowInterventionRecord = {\n ...existing,\n status: \"cancelled\",\n cancelledAt: new Date(input.cancelledAt ?? new Date()),\n cancelledBy: input.cancelledBy ? cloneRecord(input.cancelledBy) : undefined,\n }\n\n this.interventions.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async expire(input: ExpireWorkflowInterventionInput): Promise<WorkflowInterventionRecord> {\n const existing = this.requirePendingIntervention(input.projectId, input.id)\n const next: WorkflowInterventionRecord = {\n ...existing,\n status: \"expired\",\n expiredAt: new Date(input.expiredAt ?? new Date()),\n }\n\n this.interventions.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async getById(params: {\n projectId: string\n id: string\n }): Promise<WorkflowInterventionRecord | null> {\n const record = this.interventions.get(storageKey(params.projectId, params.id))\n return record ? cloneRecord(record) : null\n }\n\n async list(input: ListWorkflowInterventionsInput): Promise<ListWorkflowInterventionsResult> {\n if (hasEmptyStatuses(input) || input.workflowIds?.length === 0) {\n return {\n interventions: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const workflowIds = input.workflowIds ? new Set(input.workflowIds) : null\n const filtered = [...this.interventions.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => (statuses ? statuses.has(record.status) : true))\n .filter((record) => (input.workflowId ? record.workflowId === input.workflowId : true))\n .filter((record) => (workflowIds ? workflowIds.has(record.workflowId) : true))\n .filter((record) =>\n input.workflowRunId ? record.workflowRunId === input.workflowRunId : true\n )\n .filter((record) => (input.nodeRunId ? record.nodeRunId === input.nodeRunId : true))\n .filter((record) => (input.nodeId ? record.nodeId === input.nodeId : true))\n .filter((record) => (input.nodeKey ? record.nodeKey === input.nodeKey : true))\n .filter((record) =>\n input.interventionId ? record.interventionId === input.interventionId : true\n )\n .filter((record) =>\n input.requestedAfter ? record.requestedAt >= input.requestedAfter : true\n )\n .filter((record) =>\n input.requestedBefore ? record.requestedAt <= input.requestedBefore : true\n )\n .sort((left, right) => compareRequestedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n interventions: page.map(cloneRecord),\n hasMore,\n total,\n }\n }\n\n private requirePendingIntervention(projectId: string, id: string): WorkflowInterventionRecord {\n const record = this.interventions.get(storageKey(projectId, id))\n if (!record) {\n throw new WorkflowInterventionError(\n `[Sixb] Workflow intervention '${id}' not found for project '${projectId}'.`\n )\n }\n\n if (record.status !== \"pending\") {\n throw new WorkflowInterventionError(\n `[Sixb] Workflow intervention '${id}' for project '${projectId}' is not pending.`\n )\n }\n\n return record\n }\n}\n\nexport type InMemoryWorkflowInterventionStorageSnapshot = Map<string, WorkflowInterventionRecord>\n\nfunction compareRequestedAt(\n left: { readonly id: string; readonly requestedAt: Date },\n right: { readonly id: string; readonly requestedAt: Date },\n order: \"asc\" | \"desc\"\n): number {\n const delta = left.requestedAt.getTime() - right.requestedAt.getTime()\n if (delta !== 0) {\n return order === \"asc\" ? delta : -delta\n }\n\n if (left.id === right.id) {\n return 0\n }\n\n return order === \"asc\" ? left.id.localeCompare(right.id) : right.id.localeCompare(left.id)\n}\n",
46
- "import type { AgentMessagePart } from \"../../agents/message\"\nimport type { SixbErrorCode, SixbFailure } from \"../../errors/types\"\nimport type { JsonValue } from \"../../json\"\nimport type { WorkflowIOSnapshot } from \"../../workflows/types\"\nimport type { AgentExecutionStatus, AgentRunFailureCode, AgentRunFinishReason } from \"../agents\"\n\nexport type { WorkflowIOSnapshot } from \"../../workflows/types\"\n\nexport type WorkflowRunStatus =\n | \"queued\"\n | \"running\"\n | \"waiting\"\n | \"succeeded\"\n | \"failed\"\n | \"cancelled\"\nexport type WorkflowNodeRunStatus = Exclude<WorkflowRunStatus, \"queued\">\nexport type WorkflowNodeRunType = \"step\" | \"action\" | \"intervention\" | \"agent\"\n\n/** Error codes a workflow or workflow-node run can persist and expose. */\nexport const WORKFLOW_RUN_FAILURE_CODES = [\n \"internal.unexpected\",\n \"runtime.cancelled\",\n \"workflow.node_failed\",\n] as const satisfies readonly [SixbErrorCode, ...SixbErrorCode[]]\n\nexport type WorkflowRunFailureCode = (typeof WORKFLOW_RUN_FAILURE_CODES)[number]\n\nexport interface WorkflowRunExecution {\n readonly token: string\n readonly queueLeaseExpiresAt: Date\n}\n\nexport type WorkflowAgentNodeRunStatus = AgentExecutionStatus\n\nexport interface WorkflowAgentNodeRunExecution {\n readonly token: string\n readonly queueLeaseExpiresAt: Date\n}\n\n/** Execution details for an agent workflow node. The generic node run owns business IO. */\nexport interface WorkflowAgentNodeRunRecord {\n readonly projectId: string\n readonly nodeRunId: string\n readonly executionId: string\n readonly agentId: string\n readonly status: WorkflowAgentNodeRunStatus\n readonly prompt: string\n readonly modelId?: string\n readonly finishReason?: AgentRunFinishReason\n readonly trace?: readonly AgentMessagePart[]\n readonly diagnostics?: readonly JsonValue[]\n readonly error?: SixbFailure<AgentRunFailureCode>\n readonly attempt: number\n readonly execution?: WorkflowAgentNodeRunExecution\n readonly createdAt: Date\n readonly startedAt?: Date\n readonly completedAt?: Date\n}\n\nexport interface CreateWorkflowAgentNodeRunInput {\n readonly projectId: string\n readonly nodeRunId: string\n readonly executionId: string\n readonly agentId: string\n readonly prompt: string\n readonly createdAt?: Date\n}\n\nexport interface StartWorkflowAgentNodeRunInput {\n readonly projectId: string\n readonly nodeRunId: string\n readonly modelId?: string\n readonly execution: WorkflowAgentNodeRunExecution\n readonly startedAt?: Date\n}\n\nexport interface ReclaimWorkflowAgentNodeRunInput {\n readonly projectId: string\n readonly nodeRunId: string\n readonly execution: WorkflowAgentNodeRunExecution\n}\n\nexport interface ConfirmWorkflowAgentNodeRunExecutionOwnershipInput {\n readonly projectId: string\n readonly nodeRunId: string\n readonly executionToken: string\n readonly queueLeaseExpiresAt: Date\n}\n\ninterface FinishWorkflowAgentNodeRunBaseInput {\n readonly projectId: string\n readonly nodeRunId: string\n readonly executionToken: string\n readonly modelId?: string\n readonly finishReason?: AgentRunFinishReason\n readonly trace?: readonly AgentMessagePart[]\n readonly diagnostics?: readonly JsonValue[]\n readonly completedAt?: Date\n}\n\nexport type FinishWorkflowAgentNodeRunInput =\n | (FinishWorkflowAgentNodeRunBaseInput & {\n readonly status: \"succeeded\"\n })\n | (FinishWorkflowAgentNodeRunBaseInput & {\n readonly status: \"failed\" | \"cancelled\"\n readonly error?: SixbFailure<AgentRunFailureCode>\n })\n\nexport interface CancelWorkflowAgentNodeRunInput {\n readonly projectId: string\n readonly nodeRunId: string\n readonly error?: SixbFailure<AgentRunFailureCode>\n readonly completedAt?: Date\n}\n\nexport interface ListWorkflowAgentNodeRunsInput {\n readonly projectId: string\n readonly agentId?: string\n readonly statuses?: readonly WorkflowAgentNodeRunStatus[]\n readonly limit?: number\n readonly offset?: number\n readonly order?: \"asc\" | \"desc\"\n}\n\nexport interface ListWorkflowAgentNodeRunsResult {\n readonly runs: readonly WorkflowAgentNodeRunRecord[]\n readonly hasMore: boolean\n readonly total: number\n}\n\nexport interface WorkflowRunRecord {\n readonly id: string\n readonly projectId: string\n readonly executionId: string\n readonly workflowId: string\n readonly status: WorkflowRunStatus\n readonly input: WorkflowIOSnapshot\n readonly output?: WorkflowIOSnapshot\n readonly queuedAt?: Date\n readonly startedAt: Date\n readonly finishedAt?: Date\n readonly error?: SixbFailure<WorkflowRunFailureCode>\n /** Durable group memberships snapshotted when the workflow run was admitted. */\n readonly requesterGroupIds: readonly string[]\n readonly attempt: number\n readonly execution?: WorkflowRunExecution\n}\n\nexport interface WorkflowNodeRunRecord {\n readonly id: string\n readonly projectId: string\n readonly workflowRunId: string\n readonly workflowId: string\n readonly nodeIndex: number\n readonly nodeType: WorkflowNodeRunType\n readonly nodeId: string\n readonly nodeKey: string\n readonly status: WorkflowNodeRunStatus\n readonly input: WorkflowIOSnapshot\n readonly startedAt: Date\n readonly finishedAt?: Date\n readonly output?: WorkflowIOSnapshot\n readonly error?: SixbFailure<WorkflowRunFailureCode>\n}\n\nexport interface StartWorkflowRunInput {\n readonly id: string\n readonly projectId: string\n readonly startedAt?: Date\n readonly execution?: WorkflowRunExecution\n}\n\nexport interface QueueWorkflowRunInput {\n readonly id: string\n readonly projectId: string\n readonly executionId: string\n readonly workflowId: string\n readonly input: WorkflowIOSnapshot\n readonly queuedAt?: Date\n readonly requesterGroupIds: readonly string[]\n}\n\nexport interface ReclaimWorkflowRunInput {\n readonly id: string\n readonly projectId: string\n readonly execution: WorkflowRunExecution\n}\n\nexport interface ConfirmWorkflowRunExecutionOwnershipInput {\n readonly id: string\n readonly projectId: string\n readonly executionToken: string\n readonly queueLeaseExpiresAt: Date\n}\n\nexport interface WaitWorkflowRunInput {\n readonly id: string\n readonly projectId: string\n readonly waitingAt?: Date\n readonly executionToken?: string\n}\n\nexport interface ResumeWorkflowRunInput {\n readonly id: string\n readonly projectId: string\n readonly resumedAt?: Date\n readonly execution?: WorkflowRunExecution\n}\n\nexport type FinishWorkflowRunInput =\n | {\n readonly id: string\n readonly projectId: string\n readonly status: \"succeeded\"\n readonly output: WorkflowIOSnapshot\n readonly finishedAt?: Date\n readonly executionToken?: string\n }\n | {\n readonly id: string\n readonly projectId: string\n readonly status: \"failed\" | \"cancelled\"\n readonly finishedAt?: Date\n readonly error?: SixbFailure<WorkflowRunFailureCode>\n readonly executionToken?: string\n }\n\nexport interface StartWorkflowNodeRunInput {\n readonly id: string\n readonly projectId: string\n readonly workflowRunId: string\n readonly workflowId: string\n readonly nodeIndex: number\n readonly nodeType: WorkflowNodeRunType\n readonly nodeId: string\n readonly nodeKey: string\n readonly input: WorkflowIOSnapshot\n readonly startedAt?: Date\n readonly executionToken?: string\n}\n\nexport interface WaitWorkflowNodeRunInput {\n readonly id: string\n readonly projectId: string\n readonly waitingAt?: Date\n readonly executionToken?: string\n}\n\nexport type FinishWorkflowNodeRunInput =\n | {\n readonly id: string\n readonly projectId: string\n readonly status: \"succeeded\"\n readonly finishedAt?: Date\n readonly output?: WorkflowIOSnapshot\n readonly executionToken?: string\n }\n | {\n readonly id: string\n readonly projectId: string\n readonly status: \"failed\" | \"cancelled\"\n readonly finishedAt?: Date\n readonly error?: SixbFailure<WorkflowRunFailureCode>\n readonly executionToken?: string\n }\n\nexport interface ListWorkflowRunsInput {\n readonly projectId: string\n readonly workflowId?: string\n readonly workflowIds?: readonly string[]\n readonly statuses?: readonly WorkflowRunStatus[]\n readonly startedAfter?: Date\n readonly startedBefore?: Date\n readonly limit?: number\n readonly offset?: number\n readonly order?: \"asc\" | \"desc\"\n}\n\nexport interface ListWorkflowRunsResult {\n readonly runs: readonly WorkflowRunRecord[]\n readonly hasMore: boolean\n readonly total: number\n}\n\nexport interface ListLatestWorkflowRunsInput {\n readonly projectId: string\n readonly workflowIds: readonly string[]\n}\n\nexport interface ListLatestWorkflowRunsResult {\n readonly runs: readonly WorkflowRunRecord[]\n}\n\nexport interface ListWorkflowNodeRunsInput {\n readonly projectId: string\n readonly workflowRunId?: string\n readonly workflowId?: string\n readonly nodeType?: WorkflowNodeRunType\n readonly nodeId?: string\n readonly nodeKey?: string\n readonly statuses?: readonly WorkflowNodeRunStatus[]\n readonly startedAfter?: Date\n readonly startedBefore?: Date\n readonly limit?: number\n readonly offset?: number\n readonly order?: \"asc\" | \"desc\"\n}\n\nexport interface ListWorkflowNodeRunsResult {\n readonly nodes: readonly WorkflowNodeRunRecord[]\n readonly hasMore: boolean\n readonly total: number\n}\n\nexport interface WorkflowRunStorage {\n readonly nodes: WorkflowNodeRunStorage\n readonly agentNodes: WorkflowAgentNodeRunStorage\n\n queue(input: QueueWorkflowRunInput): Promise<WorkflowRunRecord>\n /** Atomically claims a queued run by transitioning it to running; competing claims must fail. */\n start(input: StartWorkflowRunInput): Promise<WorkflowRunRecord>\n reclaim(input: ReclaimWorkflowRunInput): Promise<WorkflowRunRecord>\n confirmExecutionOwnership(\n input: ConfirmWorkflowRunExecutionOwnershipInput\n ): Promise<WorkflowRunRecord>\n wait(input: WaitWorkflowRunInput): Promise<WorkflowRunRecord>\n resume(input: ResumeWorkflowRunInput): Promise<WorkflowRunRecord>\n finish(input: FinishWorkflowRunInput): Promise<WorkflowRunRecord>\n getById(params: { projectId: string; id: string }): Promise<WorkflowRunRecord | null>\n list(input: ListWorkflowRunsInput): Promise<ListWorkflowRunsResult>\n listLatestByWorkflowIds(input: ListLatestWorkflowRunsInput): Promise<ListLatestWorkflowRunsResult>\n}\n\nexport interface WorkflowAgentNodeRunStorage {\n create(input: CreateWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord>\n start(input: StartWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord>\n reclaim(input: ReclaimWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord>\n confirmExecutionOwnership(\n input: ConfirmWorkflowAgentNodeRunExecutionOwnershipInput\n ): Promise<WorkflowAgentNodeRunRecord>\n cancel(input: CancelWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord>\n finish(input: FinishWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord>\n getByNodeRunId(params: {\n projectId: string\n nodeRunId: string\n }): Promise<WorkflowAgentNodeRunRecord | null>\n list(input: ListWorkflowAgentNodeRunsInput): Promise<ListWorkflowAgentNodeRunsResult>\n}\n\nexport interface WorkflowNodeRunStorage {\n start(input: StartWorkflowNodeRunInput): Promise<WorkflowNodeRunRecord>\n wait(input: WaitWorkflowNodeRunInput): Promise<WorkflowNodeRunRecord>\n finish(input: FinishWorkflowNodeRunInput): Promise<WorkflowNodeRunRecord>\n getById(params: { projectId: string; id: string }): Promise<WorkflowNodeRunRecord | null>\n list(input: ListWorkflowNodeRunsInput): Promise<ListWorkflowNodeRunsResult>\n}\n",
47
- "import { normalizeRequesterGroupIds } from \"../../auth/attribution\"\nimport { parseSixbFailure } from \"../../errors/internal\"\nimport type { SixbFailure } from \"../../errors/types\"\nimport type { AgentRunFailureCode } from \"../agents\"\nimport { AGENT_RUN_FAILURE_CODES } from \"../agents\"\nimport type { ExecutionStorage } from \"../executions\"\nimport {\n cloneRecord,\n compareStartedAt,\n hasEmptyStatuses,\n latestStartedAtByOwnerId,\n matchesRunListDateFilters,\n paginate,\n storageKey,\n toStatusSet,\n} from \"../run-listing\"\nimport { WorkflowRunError } from \"./errors\"\nimport { assertWorkflowAgentNodeRunExecution, assertWorkflowRunExecution } from \"./provider\"\nimport type {\n CancelWorkflowAgentNodeRunInput,\n ConfirmWorkflowAgentNodeRunExecutionOwnershipInput,\n ConfirmWorkflowRunExecutionOwnershipInput,\n CreateWorkflowAgentNodeRunInput,\n FinishWorkflowAgentNodeRunInput,\n FinishWorkflowNodeRunInput,\n FinishWorkflowRunInput,\n ListLatestWorkflowRunsInput,\n ListLatestWorkflowRunsResult,\n ListWorkflowAgentNodeRunsInput,\n ListWorkflowAgentNodeRunsResult,\n ListWorkflowNodeRunsInput,\n ListWorkflowNodeRunsResult,\n ListWorkflowRunsInput,\n ListWorkflowRunsResult,\n QueueWorkflowRunInput,\n ReclaimWorkflowAgentNodeRunInput,\n ReclaimWorkflowRunInput,\n ResumeWorkflowRunInput,\n StartWorkflowAgentNodeRunInput,\n StartWorkflowNodeRunInput,\n StartWorkflowRunInput,\n WaitWorkflowNodeRunInput,\n WaitWorkflowRunInput,\n WorkflowAgentNodeRunRecord,\n WorkflowAgentNodeRunStorage,\n WorkflowNodeRunRecord,\n WorkflowNodeRunStorage,\n WorkflowRunFailureCode,\n WorkflowRunRecord,\n WorkflowRunStorage,\n} from \"./types\"\nimport { WORKFLOW_RUN_FAILURE_CODES } from \"./types\"\n\nfunction normalizeFailure(\n failure: SixbFailure<WorkflowRunFailureCode> | undefined\n): SixbFailure<WorkflowRunFailureCode> | undefined {\n return failure ? parseSixbFailure(failure, WORKFLOW_RUN_FAILURE_CODES) : undefined\n}\n\nfunction normalizeAgentFailure(\n failure: SixbFailure<AgentRunFailureCode> | undefined\n): SixbFailure<AgentRunFailureCode> | undefined {\n return failure ? parseSixbFailure(failure, AGENT_RUN_FAILURE_CODES) : undefined\n}\n\nfunction assertNonNegativeInteger(value: number, fieldName: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new WorkflowRunError(`[Sixb] Workflow run ${fieldName} must be a non-negative integer.`)\n }\n}\n\nexport class InMemoryWorkflowRunStorage implements WorkflowRunStorage {\n readonly nodes: InMemoryWorkflowNodeRunStorage\n readonly agentNodes: InMemoryWorkflowAgentNodeRunStorage\n\n private readonly runs = new Map<string, WorkflowRunRecord>()\n\n constructor(private readonly executions: ExecutionStorage) {\n this.nodes = new InMemoryWorkflowNodeRunStorage({\n requireRunningWorkflowRun: (projectId, id) => this.requireRunningWorkflowRun(projectId, id),\n requireActiveWorkflowRun: (projectId, id) => this.requireActiveWorkflowRun(projectId, id),\n assertExecutionOwnership: (projectId, id, token) =>\n this.assertExecutionOwnership(projectId, id, token),\n })\n this.agentNodes = new InMemoryWorkflowAgentNodeRunStorage(\n {\n requireAgentNodeRun: (projectId, id) => this.nodes.requireAgentNodeRun(projectId, id),\n requireWorkflowRun: (projectId, id) => this.requireExistingWorkflowRun(projectId, id),\n },\n this.executions\n )\n }\n\n snapshot(): InMemoryWorkflowRunStorageSnapshot {\n return {\n runs: structuredClone(this.runs),\n nodes: this.nodes.snapshot(),\n agentNodes: this.agentNodes.snapshot(),\n }\n }\n\n restore(snapshot: InMemoryWorkflowRunStorageSnapshot): void {\n this.runs.clear()\n for (const [key, record] of structuredClone(snapshot.runs)) {\n this.runs.set(key, record)\n }\n this.nodes.restore(snapshot.nodes)\n this.agentNodes.restore(snapshot.agentNodes)\n }\n\n async queue(input: QueueWorkflowRunInput): Promise<WorkflowRunRecord> {\n const key = storageKey(input.projectId, input.id)\n if (this.runs.has(key)) {\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n if (\n [...this.runs.values()].some(\n (run) => run.projectId === input.projectId && run.executionId === input.executionId\n )\n ) {\n throw new WorkflowRunError(\n `[Sixb] Execution '${input.executionId}' already belongs to another workflow run.`\n )\n }\n await assertWorkflowRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n runId: input.id,\n workflowId: input.workflowId,\n })\n\n const queuedAt = new Date(input.queuedAt ?? new Date())\n const record: WorkflowRunRecord = {\n id: input.id,\n projectId: input.projectId,\n executionId: input.executionId,\n workflowId: input.workflowId,\n status: \"queued\",\n input: cloneRecord(input.input),\n queuedAt,\n startedAt: queuedAt,\n attempt: 0,\n requesterGroupIds: normalizeRequesterGroupIds(input.requesterGroupIds),\n }\n\n this.runs.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async start(input: StartWorkflowRunInput): Promise<WorkflowRunRecord> {\n const key = storageKey(input.projectId, input.id)\n const existing = this.runs.get(key)\n if (!existing || existing.status !== \"queued\") {\n throw new WorkflowRunError(\n existing\n ? `[Sixb] Workflow run '${input.id}' cannot start from status '${existing.status}'.`\n : `[Sixb] Workflow run '${input.id}' not found for project '${input.projectId}'.`\n )\n }\n\n const next: WorkflowRunRecord = {\n ...existing,\n status: \"running\",\n startedAt: new Date(input.startedAt ?? new Date()),\n finishedAt: undefined,\n error: undefined,\n attempt: existing.attempt + 1,\n execution: input.execution ? cloneRecord(input.execution) : undefined,\n }\n\n this.runs.set(key, cloneRecord(next))\n return cloneRecord(next)\n }\n\n async finish(input: FinishWorkflowRunInput): Promise<WorkflowRunRecord> {\n const existing = this.requireFinishableWorkflowRun(input)\n this.assertRecordExecutionOwnership(existing, input.executionToken)\n const base: WorkflowRunRecord = {\n ...existing,\n status: input.status,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n execution: undefined,\n }\n\n const next: WorkflowRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n output: cloneRecord(input.output),\n error: undefined,\n }\n : {\n ...base,\n output: undefined,\n error: normalizeFailure(input.error),\n }\n\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async wait(input: WaitWorkflowRunInput): Promise<WorkflowRunRecord> {\n const existing = this.requireRunningWorkflowRun(input.projectId, input.id)\n this.assertRecordExecutionOwnership(existing, input.executionToken)\n const next: WorkflowRunRecord = {\n ...existing,\n status: \"waiting\",\n finishedAt: undefined,\n error: undefined,\n execution: undefined,\n }\n\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async resume(input: ResumeWorkflowRunInput): Promise<WorkflowRunRecord> {\n const existing = this.requireWaitingWorkflowRun(input.projectId, input.id)\n const next: WorkflowRunRecord = {\n ...existing,\n status: \"running\",\n finishedAt: undefined,\n error: undefined,\n attempt: existing.attempt + 1,\n execution: input.execution ? cloneRecord(input.execution) : undefined,\n }\n\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async reclaim(input: ReclaimWorkflowRunInput): Promise<WorkflowRunRecord> {\n const existing = this.requireRunningWorkflowRun(input.projectId, input.id)\n const next: WorkflowRunRecord = {\n ...existing,\n attempt: existing.attempt + 1,\n execution: cloneRecord(input.execution),\n }\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async confirmExecutionOwnership(\n input: ConfirmWorkflowRunExecutionOwnershipInput\n ): Promise<WorkflowRunRecord> {\n const existing = this.requireRunningWorkflowRun(input.projectId, input.id)\n this.assertRecordExecutionOwnership(existing, input.executionToken)\n const next: WorkflowRunRecord = {\n ...existing,\n execution: {\n token: input.executionToken,\n queueLeaseExpiresAt: new Date(\n Math.max(\n existing.execution!.queueLeaseExpiresAt.getTime(),\n input.queueLeaseExpiresAt.getTime()\n )\n ),\n },\n }\n this.runs.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async getById(params: { projectId: string; id: string }): Promise<WorkflowRunRecord | null> {\n const record = this.runs.get(storageKey(params.projectId, params.id))\n return record ? cloneRecord(record) : null\n }\n\n async list(input: ListWorkflowRunsInput): Promise<ListWorkflowRunsResult> {\n if (hasEmptyStatuses(input) || input.workflowIds?.length === 0) {\n return {\n runs: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const workflowIds = input.workflowIds ? new Set(input.workflowIds) : null\n const filtered = [...this.runs.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) => (input.workflowId ? record.workflowId === input.workflowId : true))\n .filter((record) => (workflowIds ? workflowIds.has(record.workflowId) : true))\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareStartedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n runs: page.map(cloneRecord),\n hasMore,\n total,\n }\n }\n\n async listLatestByWorkflowIds(\n input: ListLatestWorkflowRunsInput\n ): Promise<ListLatestWorkflowRunsResult> {\n const runs = latestStartedAtByOwnerId(\n [...this.runs.values()].filter((record) => record.projectId === input.projectId),\n input.workflowIds,\n (record) => record.workflowId\n )\n\n return {\n runs: runs.map(cloneRecord),\n }\n }\n\n private requireExistingWorkflowRun(projectId: string, id: string): WorkflowRunRecord {\n const record = this.runs.get(storageKey(projectId, id))\n if (!record) {\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${id}' not found for project '${projectId}'.`\n )\n }\n\n return record\n }\n\n private requireRunningWorkflowRun(projectId: string, id: string): WorkflowRunRecord {\n const record = this.requireExistingWorkflowRun(projectId, id)\n if (record.status !== \"running\") {\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${id}' for project '${projectId}' must be running.`\n )\n }\n\n return record\n }\n\n private requireWaitingWorkflowRun(projectId: string, id: string): WorkflowRunRecord {\n const record = this.requireExistingWorkflowRun(projectId, id)\n if (record.status !== \"waiting\") {\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${id}' for project '${projectId}' must be waiting.`\n )\n }\n\n return record\n }\n\n private requireActiveWorkflowRun(projectId: string, id: string): WorkflowRunRecord {\n const record = this.requireExistingWorkflowRun(projectId, id)\n if (record.status !== \"running\" && record.status !== \"waiting\") {\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${id}' for project '${projectId}' is already terminal.`\n )\n }\n\n return record\n }\n\n private requireFinishableWorkflowRun(input: FinishWorkflowRunInput): WorkflowRunRecord {\n const record = this.requireExistingWorkflowRun(input.projectId, input.id)\n if (record.status === \"running\") {\n return record\n }\n\n if (record.status === \"waiting\" && input.status !== \"succeeded\") {\n return record\n }\n\n if (record.status === \"queued\" && input.status !== \"succeeded\") {\n return record\n }\n\n throw new WorkflowRunError(\n `[Sixb] Workflow run '${input.id}' for project '${input.projectId}' cannot be finished from status '${record.status}'.`\n )\n }\n\n private assertExecutionOwnership(projectId: string, id: string, token?: string): void {\n this.assertRecordExecutionOwnership(this.requireExistingWorkflowRun(projectId, id), token)\n }\n\n private assertRecordExecutionOwnership(record: WorkflowRunRecord, token?: string): void {\n if (record.execution?.token !== token) {\n throw new WorkflowRunError(\n `[Sixb] Execution token is no longer current on workflow run '${record.id}'.`\n )\n }\n }\n}\n\nexport class InMemoryWorkflowNodeRunStorage implements WorkflowNodeRunStorage {\n private readonly nodes = new Map<string, WorkflowNodeRunRecord>()\n\n constructor(\n private readonly workflowRuns: {\n requireRunningWorkflowRun(projectId: string, id: string): WorkflowRunRecord\n requireActiveWorkflowRun(projectId: string, id: string): WorkflowRunRecord\n assertExecutionOwnership(projectId: string, id: string, token?: string): void\n }\n ) {}\n\n snapshot(): InMemoryWorkflowNodeRunStorageSnapshot {\n return structuredClone(this.nodes)\n }\n\n restore(snapshot: InMemoryWorkflowNodeRunStorageSnapshot): void {\n this.nodes.clear()\n for (const [key, record] of structuredClone(snapshot)) {\n this.nodes.set(key, record)\n }\n }\n\n async start(input: StartWorkflowNodeRunInput): Promise<WorkflowNodeRunRecord> {\n assertNonNegativeInteger(input.nodeIndex, \"nodeIndex\")\n\n const workflowRun = this.workflowRuns.requireRunningWorkflowRun(\n input.projectId,\n input.workflowRunId\n )\n this.workflowRuns.assertExecutionOwnership(\n input.projectId,\n input.workflowRunId,\n input.executionToken\n )\n if (workflowRun.workflowId !== input.workflowId) {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${input.id}' workflow '${input.workflowId}' does not match workflow run '${input.workflowRunId}' workflow '${workflowRun.workflowId}'.`\n )\n }\n\n const key = storageKey(input.projectId, input.id)\n if (this.nodes.has(key)) {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${input.id}' already exists for project '${input.projectId}'.`\n )\n }\n\n const record: WorkflowNodeRunRecord = {\n id: input.id,\n projectId: input.projectId,\n workflowRunId: input.workflowRunId,\n workflowId: input.workflowId,\n nodeIndex: input.nodeIndex,\n nodeType: input.nodeType,\n nodeId: input.nodeId,\n nodeKey: input.nodeKey,\n status: \"running\",\n input: cloneRecord(input.input),\n startedAt: new Date(input.startedAt ?? new Date()),\n }\n\n this.nodes.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async finish(input: FinishWorkflowNodeRunInput): Promise<WorkflowNodeRunRecord> {\n const existing = this.requireActiveNodeRun(input.projectId, input.id)\n this.workflowRuns.assertExecutionOwnership(\n input.projectId,\n existing.workflowRunId,\n input.executionToken\n )\n const base: WorkflowNodeRunRecord = {\n ...existing,\n status: input.status,\n finishedAt: new Date(input.finishedAt ?? new Date()),\n }\n\n const next: WorkflowNodeRunRecord =\n input.status === \"succeeded\"\n ? {\n ...base,\n output: input.output ? cloneRecord(input.output) : undefined,\n error: undefined,\n }\n : {\n ...base,\n output: undefined,\n error: normalizeFailure(input.error),\n }\n\n this.nodes.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async wait(input: WaitWorkflowNodeRunInput): Promise<WorkflowNodeRunRecord> {\n const existing = this.requireRunningNodeRun(input.projectId, input.id)\n this.workflowRuns.requireActiveWorkflowRun(input.projectId, existing.workflowRunId)\n this.workflowRuns.assertExecutionOwnership(\n input.projectId,\n existing.workflowRunId,\n input.executionToken\n )\n\n const next: WorkflowNodeRunRecord = {\n ...existing,\n status: \"waiting\",\n finishedAt: undefined,\n output: undefined,\n error: undefined,\n }\n\n this.nodes.set(storageKey(input.projectId, input.id), cloneRecord(next))\n return cloneRecord(next)\n }\n\n async getById(params: { projectId: string; id: string }): Promise<WorkflowNodeRunRecord | null> {\n const record = this.nodes.get(storageKey(params.projectId, params.id))\n return record ? cloneRecord(record) : null\n }\n\n async list(input: ListWorkflowNodeRunsInput): Promise<ListWorkflowNodeRunsResult> {\n if (hasEmptyStatuses(input)) {\n return {\n nodes: [],\n hasMore: false,\n total: 0,\n }\n }\n\n const order = input.order ?? \"desc\"\n const statuses = toStatusSet(input.statuses)\n const filtered = [...this.nodes.values()]\n .filter((record) => record.projectId === input.projectId)\n .filter((record) =>\n input.workflowRunId ? record.workflowRunId === input.workflowRunId : true\n )\n .filter((record) => (input.workflowId ? record.workflowId === input.workflowId : true))\n .filter((record) => (input.nodeType ? record.nodeType === input.nodeType : true))\n .filter((record) => (input.nodeId ? record.nodeId === input.nodeId : true))\n .filter((record) => (input.nodeKey ? record.nodeKey === input.nodeKey : true))\n .filter((record) =>\n matchesRunListDateFilters(record, {\n statuses,\n startedAfter: input.startedAfter,\n startedBefore: input.startedBefore,\n })\n )\n .sort((left, right) => compareStartedAt(left, right, order))\n\n const { page, total, hasMore } = paginate(filtered, input)\n\n return {\n nodes: page.map(cloneRecord),\n hasMore,\n total,\n }\n }\n\n private requireRunningNodeRun(projectId: string, id: string): WorkflowNodeRunRecord {\n const record = this.nodes.get(storageKey(projectId, id))\n if (!record) {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${id}' not found for project '${projectId}'.`\n )\n }\n\n if (record.status !== \"running\") {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${id}' for project '${projectId}' must be running.`\n )\n }\n\n return record\n }\n\n private requireActiveNodeRun(projectId: string, id: string): WorkflowNodeRunRecord {\n const record = this.nodes.get(storageKey(projectId, id))\n if (!record) {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${id}' not found for project '${projectId}'.`\n )\n }\n\n if (record.status !== \"running\" && record.status !== \"waiting\") {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${id}' for project '${projectId}' is already terminal.`\n )\n }\n\n return record\n }\n\n requireAgentNodeRun(projectId: string, id: string): WorkflowNodeRunRecord {\n const node = this.nodes.get(storageKey(projectId, id))\n if (!node) {\n throw new WorkflowRunError(\n `[Sixb] Workflow node run '${id}' not found for project '${projectId}'.`\n )\n }\n if (node.nodeType !== \"agent\") {\n throw new WorkflowRunError(`[Sixb] Workflow node run '${id}' is not an agent node.`)\n }\n return node\n }\n}\n\nexport class InMemoryWorkflowAgentNodeRunStorage implements WorkflowAgentNodeRunStorage {\n private readonly runs = new Map<string, WorkflowAgentNodeRunRecord>()\n\n constructor(\n private readonly nodes: {\n requireAgentNodeRun(projectId: string, id: string): WorkflowNodeRunRecord\n requireWorkflowRun(projectId: string, id: string): WorkflowRunRecord\n },\n private readonly executions: ExecutionStorage\n ) {}\n\n snapshot(): InMemoryWorkflowAgentNodeRunStorageSnapshot {\n return structuredClone(this.runs)\n }\n\n restore(snapshot: InMemoryWorkflowAgentNodeRunStorageSnapshot): void {\n this.runs.clear()\n for (const [key, record] of structuredClone(snapshot)) this.runs.set(key, record)\n }\n\n async create(input: CreateWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord> {\n const node = this.nodes.requireAgentNodeRun(input.projectId, input.nodeRunId)\n const workflowRun = this.nodes.requireWorkflowRun(input.projectId, node.workflowRunId)\n await assertWorkflowAgentNodeRunExecution({\n executions: this.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n nodeRunId: input.nodeRunId,\n agentId: input.agentId,\n workflowExecutionId: workflowRun.executionId,\n })\n if (node.status !== \"running\") {\n throw new WorkflowRunError(\n `[Sixb] Agent workflow node run '${input.nodeRunId}' must be running when queued.`\n )\n }\n const key = storageKey(input.projectId, input.nodeRunId)\n if (this.runs.has(key)) {\n throw new WorkflowRunError(\n `[Sixb] Agent execution already exists for workflow node run '${input.nodeRunId}'.`\n )\n }\n if (\n [...this.runs.values()].some(\n (run) => run.projectId === input.projectId && run.executionId === input.executionId\n )\n ) {\n throw new WorkflowRunError(\n `[Sixb] Execution '${input.executionId}' already belongs to another Workflow Agent-node run.`\n )\n }\n const record: WorkflowAgentNodeRunRecord = {\n projectId: input.projectId,\n nodeRunId: input.nodeRunId,\n executionId: input.executionId,\n agentId: input.agentId,\n status: \"queued\",\n prompt: input.prompt,\n attempt: 0,\n createdAt: new Date(input.createdAt ?? new Date()),\n }\n this.runs.set(key, cloneRecord(record))\n return cloneRecord(record)\n }\n\n async start(input: StartWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord> {\n const run = this.requireStatus(input.projectId, input.nodeRunId, \"queued\")\n const next: WorkflowAgentNodeRunRecord = {\n ...run,\n status: \"running\",\n ...(input.modelId ? { modelId: input.modelId } : {}),\n attempt: 1,\n execution: cloneRecord(input.execution),\n startedAt: new Date(input.startedAt ?? new Date()),\n }\n return this.save(next)\n }\n\n async reclaim(input: ReclaimWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord> {\n const run = this.requireStatus(input.projectId, input.nodeRunId, \"running\")\n return this.save({ ...run, attempt: run.attempt + 1, execution: cloneRecord(input.execution) })\n }\n\n async confirmExecutionOwnership(\n input: ConfirmWorkflowAgentNodeRunExecutionOwnershipInput\n ): Promise<WorkflowAgentNodeRunRecord> {\n const run = this.requireOwned(input.projectId, input.nodeRunId, input.executionToken)\n return this.save({\n ...run,\n execution: {\n token: input.executionToken,\n queueLeaseExpiresAt: new Date(\n Math.max(\n run.execution!.queueLeaseExpiresAt.getTime(),\n input.queueLeaseExpiresAt.getTime()\n )\n ),\n },\n })\n }\n\n async finish(input: FinishWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord> {\n const run = this.requireOwned(input.projectId, input.nodeRunId, input.executionToken)\n return this.save({\n ...run,\n status: input.status,\n ...(input.modelId === undefined ? {} : { modelId: input.modelId }),\n ...(input.finishReason === undefined ? {} : { finishReason: input.finishReason }),\n ...(input.trace === undefined ? {} : { trace: cloneRecord(input.trace) }),\n ...(input.diagnostics === undefined ? {} : { diagnostics: cloneRecord(input.diagnostics) }),\n ...(input.status === \"succeeded\" || input.error === undefined\n ? {}\n : { error: normalizeAgentFailure(input.error) }),\n execution: undefined,\n completedAt: new Date(input.completedAt ?? new Date()),\n })\n }\n\n async cancel(input: CancelWorkflowAgentNodeRunInput): Promise<WorkflowAgentNodeRunRecord> {\n const run = this.requireExisting(input.projectId, input.nodeRunId)\n if (run.status !== \"queued\" && run.status !== \"running\") {\n throw new WorkflowRunError(\n `[Sixb] Agent workflow node run '${input.nodeRunId}' cannot be cancelled from status '${run.status}'.`\n )\n }\n return this.save({\n ...run,\n status: \"cancelled\",\n execution: undefined,\n error: normalizeAgentFailure(input.error),\n completedAt: new Date(input.completedAt ?? new Date()),\n })\n }\n\n async getByNodeRunId(params: {\n projectId: string\n nodeRunId: string\n }): Promise<WorkflowAgentNodeRunRecord | null> {\n const run = this.runs.get(storageKey(params.projectId, params.nodeRunId))\n return run ? cloneRecord(run) : null\n }\n\n async list(input: ListWorkflowAgentNodeRunsInput): Promise<ListWorkflowAgentNodeRunsResult> {\n const statuses = input.statuses ? new Set(input.statuses) : null\n const order = input.order ?? \"desc\"\n const filtered = [...this.runs.values()]\n .filter((run) => run.projectId === input.projectId)\n .filter((run) => (input.agentId ? run.agentId === input.agentId : true))\n .filter((run) => (statuses ? statuses.has(run.status) : true))\n .sort((a, b) =>\n order === \"asc\"\n ? a.createdAt.getTime() - b.createdAt.getTime()\n : b.createdAt.getTime() - a.createdAt.getTime()\n )\n const { page, total, hasMore } = paginate(filtered, input)\n return { runs: page.map(cloneRecord), total, hasMore }\n }\n\n private requireStatus(\n projectId: string,\n nodeRunId: string,\n status: WorkflowAgentNodeRunRecord[\"status\"]\n ): WorkflowAgentNodeRunRecord {\n const run = this.runs.get(storageKey(projectId, nodeRunId))\n if (!run) throw new WorkflowRunError(`[Sixb] Agent workflow node run '${nodeRunId}' not found.`)\n if (run.status !== status) {\n throw new WorkflowRunError(\n `[Sixb] Agent workflow node run '${nodeRunId}' must be ${status} (status '${run.status}').`\n )\n }\n return run\n }\n\n private requireExisting(projectId: string, nodeRunId: string): WorkflowAgentNodeRunRecord {\n const run = this.runs.get(storageKey(projectId, nodeRunId))\n if (!run) {\n throw new WorkflowRunError(\n `[Sixb] Agent workflow node run '${nodeRunId}' not found for project '${projectId}'.`\n )\n }\n return run\n }\n\n private requireOwned(\n projectId: string,\n nodeRunId: string,\n token: string\n ): WorkflowAgentNodeRunRecord {\n const run = this.requireStatus(projectId, nodeRunId, \"running\")\n if (run.execution?.token !== token) {\n throw new WorkflowRunError(\n `[Sixb] Execution token is no longer current on agent workflow node run '${nodeRunId}'.`\n )\n }\n return run\n }\n\n private save(record: WorkflowAgentNodeRunRecord): WorkflowAgentNodeRunRecord {\n this.runs.set(storageKey(record.projectId, record.nodeRunId), cloneRecord(record))\n return cloneRecord(record)\n }\n}\n\nexport interface InMemoryWorkflowRunStorageSnapshot {\n readonly runs: Map<string, WorkflowRunRecord>\n readonly nodes: InMemoryWorkflowNodeRunStorageSnapshot\n readonly agentNodes: InMemoryWorkflowAgentNodeRunStorageSnapshot\n}\n\nexport type InMemoryWorkflowNodeRunStorageSnapshot = Map<string, WorkflowNodeRunRecord>\nexport type InMemoryWorkflowAgentNodeRunStorageSnapshot = Map<string, WorkflowAgentNodeRunRecord>\n",
48
- "import type { InMemoryStorageSnapshot } from \".\"\n\nexport interface InMemoryStorageTestingAdapter {\n snapshot(): InMemoryStorageSnapshot\n}\n\nconst testingAdapters = new WeakMap<object, InMemoryStorageTestingAdapter>()\n\nexport function registerInMemoryStorageTestingAdapter(\n storage: object,\n adapter: InMemoryStorageTestingAdapter\n): void {\n testingAdapters.set(storage, adapter)\n}\n\n/** @internal Relative test-only access; intentionally absent from every package barrel. */\nexport function getInMemoryStorageTestingAdapter(storage: object): InMemoryStorageTestingAdapter {\n const adapter = testingAdapters.get(storage)\n if (!adapter) throw new Error(\"[Sixb] In-memory storage testing adapter is unavailable.\")\n return adapter\n}\n",
49
- "import type { Storage } from \"../types\"\nimport type { MigrationCapableStorage, MigrationReport, StorageMigrationResult } from \"./types\"\n\nexport function isMigrationCapableStorage(storage: Storage): storage is MigrationCapableStorage {\n return Array.isArray((storage as { migrators?: unknown }).migrators)\n}\n\n/** Runs storage adapter migrators when the configured storage exposes them. */\nexport async function migrateStorage(storage: Storage): Promise<StorageMigrationResult> {\n if (!isMigrationCapableStorage(storage) || storage.migrators.length === 0) {\n return { status: \"skipped\", reports: [] }\n }\n\n const reports: MigrationReport[] = []\n\n for (const migrator of storage.migrators) {\n reports.push(await migrator.migrate())\n }\n\n return {\n status: reports.some((report) => report.status === \"migrated\") ? \"migrated\" : \"current\",\n reports,\n }\n}\n",
50
- "import type { Storage } from \"../types\"\nimport { isMigrationCapableStorage } from \"./migrate-storage\"\n\nexport interface StorageSchemaCheck {\n readonly ok: boolean\n /**\n * Whether anything was read. False when the storage exposes no migrators: usable on the\n * strength of having no schema rather than of a verified one.\n */\n readonly verified: boolean\n /** Absent only when `ok`. Names the adapter, the state, and what to do about it. */\n readonly reason?: string\n}\n\n/**\n * Reports whether the configured storage's schema is usable, without touching it.\n *\n * Storage with no migrators is usable by definition. Failures are returned rather than thrown,\n * because both callers report instead of aborting: `/ready` and `sixb check`.\n */\nexport async function checkStorageSchema(storage: Storage): Promise<StorageSchemaCheck> {\n if (!isMigrationCapableStorage(storage)) return { ok: true, verified: false }\n\n try {\n // `status()` is the only read-only member of the migrator contract: `migrate()` calls\n // `ensure()` first, so it runs DDL and takes an advisory lock. This serves `/ready`.\n const statuses = await Promise.all(storage.migrators.map((migrator) => migrator.status()))\n const unusable = statuses.filter((status) => status.state !== \"current\")\n\n if (unusable.length === 0) return { ok: true, verified: true }\n\n return {\n ok: false,\n verified: true,\n // Named, because \"could not be verified\" leaves an operator guessing between a missing\n // migration, a schema newer than the build, and no database at all.\n reason: unusable\n .map((status) => `${status.adapterId}: ${status.state} — ${status.reason ?? \"\"}`)\n .join(\"; \"),\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n return {\n ok: false,\n verified: false,\n reason: `Storage schema could not be verified: ${message}`,\n }\n }\n}\n",
51
- "import type {\n DefineMigrationsOptions,\n MigrationHistoryStore,\n MigrationPlan,\n MigrationRecord,\n MigrationReport,\n MigrationSet,\n MigrationStatus,\n MigrationStep,\n MigrationStepOptions,\n} from \"./types\"\n\nexport interface PlanMigrationSetParams<TContext> {\n readonly migrations: MigrationSet<TContext>\n readonly state: MigrationHistoryStore\n}\n\nexport interface RunMigrationSetParams<TContext> extends PlanMigrationSetParams<TContext> {\n readonly context: TContext\n readonly now?: () => string\n}\n\nexport function step<TContext>(\n id: string,\n up: (context: TContext) => void | Promise<void>,\n options: MigrationStepOptions = {}\n): MigrationStep<TContext> {\n const { version, name } = parseMigrationId(id)\n\n return {\n id,\n version,\n name,\n checksum: options.checksum,\n up,\n }\n}\n\nexport function defineMigrations<TContext>(\n options: DefineMigrationsOptions<TContext>\n): MigrationSet<TContext> {\n const steps = [...options.steps]\n assertValidSteps(options.adapterId, steps)\n\n return {\n adapterId: options.adapterId,\n latestVersion: steps.at(-1)?.version ?? 0,\n steps,\n }\n}\n\nasync function planMigrationSet<TContext>(\n params: PlanMigrationSetParams<TContext>\n): Promise<MigrationPlan<TContext>> {\n await params.state.ensure()\n\n const rows = await params.state.readHistory(params.migrations.adapterId)\n const applied = assertAppliedPrefix(params.migrations, rows)\n\n return {\n adapterId: params.migrations.adapterId,\n latestVersion: params.migrations.latestVersion,\n applied,\n pending: params.migrations.steps.slice(applied.length),\n }\n}\n\nexport async function runMigrationSet<TContext>(\n params: RunMigrationSetParams<TContext>\n): Promise<MigrationReport> {\n const now = params.now ?? (() => new Date().toISOString())\n const plan = await planMigrationSet(params)\n const applied: string[] = []\n\n for (const migration of plan.pending) {\n await params.state.transaction(async () => {\n await params.state.markStarted(plan.adapterId, migration, now())\n await migration.up(params.context)\n await params.state.markApplied(plan.adapterId, migration, now())\n })\n\n applied.push(migration.id)\n }\n\n return {\n adapterId: plan.adapterId,\n latestVersion: plan.latestVersion,\n status: applied.length > 0 ? \"migrated\" : \"current\",\n applied,\n skipped: plan.applied.map((migration) => migration.id),\n }\n}\n\nfunction parseMigrationId(id: string): { version: number; name: string } {\n const match = /^(\\d+)(?:[-_](.+))?$/.exec(id)\n\n if (!match) {\n throw new Error(`[Sixb] Migration id must start with a numeric prefix: ${id}`)\n }\n\n const version = Number(match[1])\n\n if (!Number.isInteger(version) || version < 1) {\n throw new Error(`[Sixb] Migration id must start with a positive version: ${id}`)\n }\n\n return {\n version,\n name: match[2] ?? id,\n }\n}\n\nfunction assertValidSteps<TContext>(\n adapterId: string,\n steps: readonly MigrationStep<TContext>[]\n): void {\n let previousVersion = 0\n\n for (const migration of steps) {\n if (migration.version <= previousVersion) {\n throw new Error(`[${adapterId}] Migrations must be ordered by ascending version.`)\n }\n\n previousVersion = migration.version\n }\n}\n\n/**\n * Classifies migration history without touching the database.\n *\n * The single source of truth for what a history means. `status()` reports the result\n * and `assertAppliedPrefix` throws on it, so the read-only probe and the migration\n * path can never disagree about whether a database is usable.\n *\n * `rows: null` means the history table itself is absent, which a probe must be able to\n * express without creating it.\n */\nexport function describeMigrationHistory<TContext>(params: {\n readonly migrations: MigrationSet<TContext>\n readonly rows: readonly MigrationRecord[] | null\n}): MigrationStatus {\n const { migrations, rows } = params\n const base = { adapterId: migrations.adapterId, latestVersion: migrations.latestVersion }\n\n // An adapter that declares no migrations and has recorded none is as current as it can\n // be. Reading that as `uninitialized` sent an operator to run `sixb db migrate`, which\n // would have applied nothing and reported the same state again. Only the empty history\n // qualifies: an adapter with no steps whose database recorded some is `ahead`, which\n // the walk below still finds.\n if (rows === null) {\n return migrations.steps.length === 0\n ? { ...base, appliedVersion: 0, state: \"current\" }\n : {\n ...base,\n appliedVersion: 0,\n state: \"uninitialized\",\n reason: \"No migration history exists. Run `sixb db migrate`.\",\n }\n }\n\n const applied = [...rows].sort((a, b) => a.version - b.version)\n const appliedVersion = applied.at(-1)?.version ?? 0\n const found = { ...base, appliedVersion }\n const seen = new Set<number>()\n\n for (const row of applied) {\n if (row.adapterId !== migrations.adapterId) {\n return {\n ...found,\n state: \"incompatible\",\n reason: `Migration state belongs to a different adapter: ${row.adapterId}`,\n }\n }\n\n if (row.status === \"started\") {\n return {\n ...found,\n state: \"dirty\",\n reason: `Migration '${row.id}' started and never finished. Resolve it by hand before serving traffic.`,\n }\n }\n\n if (row.status !== \"applied\") {\n return {\n ...found,\n state: \"incompatible\",\n reason: `Invalid migration status: ${row.status}`,\n }\n }\n\n if (seen.has(row.version)) {\n return {\n ...found,\n state: \"incompatible\",\n reason: `Duplicate applied migration: ${row.version}`,\n }\n }\n\n seen.add(row.version)\n }\n\n for (const [index, row] of applied.entries()) {\n const migration = migrations.steps[index]\n\n if (!migration || row.version > migrations.latestVersion) {\n return {\n ...found,\n state: \"ahead\",\n reason:\n \"Database schema is newer than this Sixb version. Downgrades are not supported; \" +\n \"deploy a build that knows this schema.\",\n }\n }\n\n if (row.version !== migration.version || row.id !== migration.id) {\n return {\n ...found,\n state: \"incompatible\",\n reason: \"Applied migration history does not match declared migrations\",\n }\n }\n\n if ((row.checksum ?? null) !== (migration.checksum ?? null)) {\n return {\n ...found,\n state: \"incompatible\",\n reason: `Applied migration checksum changed: ${row.id}`,\n }\n }\n }\n\n if (applied.length === 0) {\n return migrations.steps.length === 0\n ? { ...found, state: \"current\" }\n : {\n ...found,\n state: \"uninitialized\",\n reason: \"Migration history is empty. Run `sixb db migrate`.\",\n }\n }\n\n const pendingCount = migrations.steps.length - applied.length\n if (pendingCount > 0) {\n return {\n ...found,\n state: \"pending\",\n reason: `${pendingCount} migration(s) are not applied. Run \\`sixb db migrate\\`.`,\n }\n }\n\n return { ...found, state: \"current\" }\n}\n\nfunction assertAppliedPrefix<TContext>(\n migrations: MigrationSet<TContext>,\n rows: readonly MigrationRecord[]\n): readonly MigrationRecord[] {\n const status = describeMigrationHistory({ migrations, rows })\n\n // `uninitialized` and `pending` are the normal inputs to a migration, not failures.\n if (\n status.state !== \"current\" &&\n status.state !== \"uninitialized\" &&\n status.state !== \"pending\"\n ) {\n throw new Error(`[${migrations.adapterId}] ${status.reason}`)\n }\n\n return [...rows].sort((a, b) => a.version - b.version)\n}\n"
52
- ],
53
- "mappings": "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",
54
- "debugId": "9ED097CBB9250C8464756E2164756E21",
55
- "names": []
56
- }