@nicia-ai/typegraph 0.48.0 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/dist/backend/drizzle/indexes.cjs +9 -9
  2. package/dist/backend/drizzle/indexes.d.cts +1 -1
  3. package/dist/backend/drizzle/indexes.d.ts +1 -1
  4. package/dist/backend/drizzle/indexes.js +5 -5
  5. package/dist/backend/index.cjs +56 -52
  6. package/dist/backend/index.d.cts +3 -3
  7. package/dist/backend/index.d.ts +3 -3
  8. package/dist/backend/index.js +11 -11
  9. package/dist/backend/postgres/index.cjs +34 -28
  10. package/dist/backend/postgres/index.d.cts +7 -7
  11. package/dist/backend/postgres/index.d.ts +7 -7
  12. package/dist/backend/postgres/index.js +17 -15
  13. package/dist/backend/postgres/pglite-store.cjs +36 -35
  14. package/dist/backend/postgres/pglite-store.cjs.map +1 -1
  15. package/dist/backend/postgres/pglite-store.d.cts +8 -8
  16. package/dist/backend/postgres/pglite-store.d.ts +8 -8
  17. package/dist/backend/postgres/pglite-store.js +32 -31
  18. package/dist/backend/postgres/pglite-store.js.map +1 -1
  19. package/dist/backend/postgres/pglite.cjs +19 -17
  20. package/dist/backend/postgres/pglite.d.cts +3 -3
  21. package/dist/backend/postgres/pglite.d.ts +3 -3
  22. package/dist/backend/postgres/pglite.js +18 -16
  23. package/dist/backend/sqlite/index.cjs +31 -25
  24. package/dist/backend/sqlite/index.d.cts +7 -7
  25. package/dist/backend/sqlite/index.d.ts +7 -7
  26. package/dist/backend/sqlite/index.js +15 -13
  27. package/dist/backend/sqlite/libsql.cjs +22 -20
  28. package/dist/backend/sqlite/libsql.cjs.map +1 -1
  29. package/dist/backend/sqlite/libsql.d.cts +3 -3
  30. package/dist/backend/sqlite/libsql.d.ts +3 -3
  31. package/dist/backend/sqlite/libsql.js +17 -15
  32. package/dist/backend/sqlite/libsql.js.map +1 -1
  33. package/dist/backend/sqlite/local-store.cjs +37 -36
  34. package/dist/backend/sqlite/local-store.cjs.map +1 -1
  35. package/dist/backend/sqlite/local-store.d.cts +8 -8
  36. package/dist/backend/sqlite/local-store.d.ts +8 -8
  37. package/dist/backend/sqlite/local-store.js +33 -32
  38. package/dist/backend/sqlite/local-store.js.map +1 -1
  39. package/dist/backend/sqlite/local.cjs +20 -18
  40. package/dist/backend/sqlite/local.d.cts +3 -3
  41. package/dist/backend/sqlite/local.d.ts +3 -3
  42. package/dist/backend/sqlite/local.js +18 -16
  43. package/dist/{chunk-AX6JGVTZ.js → chunk-2CYI5HRH.js} +276 -206
  44. package/dist/chunk-2CYI5HRH.js.map +1 -0
  45. package/dist/{chunk-KF6K7TGH.js → chunk-2GIV5X4P.js} +702 -422
  46. package/dist/chunk-2GIV5X4P.js.map +1 -0
  47. package/dist/{chunk-2TYSSBU5.js → chunk-2Q45FAIE.js} +15 -15
  48. package/dist/{chunk-2TYSSBU5.js.map → chunk-2Q45FAIE.js.map} +1 -1
  49. package/dist/{chunk-WODMN3Q2.cjs → chunk-45YZXI6X.cjs} +27 -27
  50. package/dist/{chunk-WODMN3Q2.cjs.map → chunk-45YZXI6X.cjs.map} +1 -1
  51. package/dist/{chunk-3DMMGT6S.js → chunk-46UGOVRW.js} +3 -3
  52. package/dist/{chunk-3DMMGT6S.js.map → chunk-46UGOVRW.js.map} +1 -1
  53. package/dist/{chunk-GLHXM7C4.js → chunk-5LKOVCPP.js} +60 -23
  54. package/dist/chunk-5LKOVCPP.js.map +1 -0
  55. package/dist/{chunk-JFRT7S3B.cjs → chunk-5OWHU7Z7.cjs} +261 -459
  56. package/dist/chunk-5OWHU7Z7.cjs.map +1 -0
  57. package/dist/{chunk-7SQSZN2J.js → chunk-5PP4KRPV.js} +5 -5
  58. package/dist/{chunk-7SQSZN2J.js.map → chunk-5PP4KRPV.js.map} +1 -1
  59. package/dist/chunk-6KQEICJ6.cjs +12 -0
  60. package/dist/{chunk-MKJ4KXL5.cjs.map → chunk-6KQEICJ6.cjs.map} +1 -1
  61. package/dist/{chunk-6SWPJEYN.js → chunk-6LEOAIIB.js} +40 -6
  62. package/dist/chunk-6LEOAIIB.js.map +1 -0
  63. package/dist/{chunk-DZAICA5J.js → chunk-6NKSE5AU.js} +4 -4
  64. package/dist/{chunk-DZAICA5J.js.map → chunk-6NKSE5AU.js.map} +1 -1
  65. package/dist/{chunk-OVI7IXYX.js → chunk-6S3PTHL4.js} +3 -3
  66. package/dist/{chunk-OVI7IXYX.js.map → chunk-6S3PTHL4.js.map} +1 -1
  67. package/dist/{chunk-3FPR224C.cjs → chunk-7CCMCMJO.cjs} +102 -102
  68. package/dist/{chunk-3FPR224C.cjs.map → chunk-7CCMCMJO.cjs.map} +1 -1
  69. package/dist/{chunk-SHFBB23Q.js → chunk-7OWE7WD6.js} +6 -4
  70. package/dist/chunk-7OWE7WD6.js.map +1 -0
  71. package/dist/chunk-7PRMDZIA.cjs +182 -0
  72. package/dist/chunk-7PRMDZIA.cjs.map +1 -0
  73. package/dist/{chunk-CHAOFCHV.js → chunk-AH2A74OZ.js} +3 -3
  74. package/dist/{chunk-CHAOFCHV.js.map → chunk-AH2A74OZ.js.map} +1 -1
  75. package/dist/{chunk-OORXGFL5.cjs → chunk-BYBDM423.cjs} +48 -48
  76. package/dist/{chunk-OORXGFL5.cjs.map → chunk-BYBDM423.cjs.map} +1 -1
  77. package/dist/{chunk-JB6T4GLL.cjs → chunk-C76WFIVZ.cjs} +808 -519
  78. package/dist/chunk-C76WFIVZ.cjs.map +1 -0
  79. package/dist/{chunk-OTUPEF2W.cjs → chunk-CS6JTQQ2.cjs} +328 -257
  80. package/dist/chunk-CS6JTQQ2.cjs.map +1 -0
  81. package/dist/{chunk-AOSSQDVO.cjs → chunk-CSNOYIB4.cjs} +13 -13
  82. package/dist/{chunk-AOSSQDVO.cjs.map → chunk-CSNOYIB4.cjs.map} +1 -1
  83. package/dist/{chunk-HEV35TGT.js → chunk-DI6VC62F.js} +13 -4
  84. package/dist/chunk-DI6VC62F.js.map +1 -0
  85. package/dist/{chunk-2QGYQBS2.cjs → chunk-DWUDZ66O.cjs} +10 -10
  86. package/dist/{chunk-2QGYQBS2.cjs.map → chunk-DWUDZ66O.cjs.map} +1 -1
  87. package/dist/{chunk-ZDKTPBGV.js → chunk-EDLKIQRI.js} +4 -4
  88. package/dist/{chunk-ZDKTPBGV.js.map → chunk-EDLKIQRI.js.map} +1 -1
  89. package/dist/chunk-EH3JZJUM.cjs +567 -0
  90. package/dist/chunk-EH3JZJUM.cjs.map +1 -0
  91. package/dist/{chunk-S5TERQVW.js → chunk-FX5ZW6PN.js} +196 -33
  92. package/dist/chunk-FX5ZW6PN.js.map +1 -0
  93. package/dist/{chunk-XVWOYKIK.js → chunk-FZHF5UWR.js} +3 -3
  94. package/dist/{chunk-XVWOYKIK.js.map → chunk-FZHF5UWR.js.map} +1 -1
  95. package/dist/{chunk-BFUOME67.cjs → chunk-G2TLHH6T.cjs} +20 -11
  96. package/dist/chunk-G2TLHH6T.cjs.map +1 -0
  97. package/dist/{chunk-5PRKMB24.cjs → chunk-GHZPZNFC.cjs} +12 -4
  98. package/dist/chunk-GHZPZNFC.cjs.map +1 -0
  99. package/dist/{chunk-ZFMCDJGB.js → chunk-GVYVGGPJ.js} +11 -199
  100. package/dist/chunk-GVYVGGPJ.js.map +1 -0
  101. package/dist/{chunk-SDBBMD4N.js → chunk-H3XP6BAV.js} +3 -3
  102. package/dist/{chunk-SDBBMD4N.js.map → chunk-H3XP6BAV.js.map} +1 -1
  103. package/dist/{chunk-ROR5ZR6A.cjs → chunk-HSEZ7X6Y.cjs} +45 -45
  104. package/dist/{chunk-ROR5ZR6A.cjs.map → chunk-HSEZ7X6Y.cjs.map} +1 -1
  105. package/dist/{chunk-LRQKXRXO.cjs → chunk-HY5BNOUN.cjs} +4 -4
  106. package/dist/{chunk-LRQKXRXO.cjs.map → chunk-HY5BNOUN.cjs.map} +1 -1
  107. package/dist/chunk-HZUB5CON.js +27 -0
  108. package/dist/chunk-HZUB5CON.js.map +1 -0
  109. package/dist/{chunk-MYKHJI2J.js → chunk-I5C6OTKR.js} +3 -3
  110. package/dist/{chunk-MYKHJI2J.js.map → chunk-I5C6OTKR.js.map} +1 -1
  111. package/dist/{chunk-3U5ABFDW.cjs → chunk-IHK5KA2Q.cjs} +31 -28
  112. package/dist/chunk-IHK5KA2Q.cjs.map +1 -0
  113. package/dist/{chunk-26YKDNUD.cjs → chunk-IPRP6TDL.cjs} +12 -10
  114. package/dist/chunk-IPRP6TDL.cjs.map +1 -0
  115. package/dist/{chunk-UGHG7PGX.js → chunk-IRPYOHRC.js} +26 -4
  116. package/dist/chunk-IRPYOHRC.js.map +1 -0
  117. package/dist/{chunk-7XUYFFR4.cjs → chunk-ISKCIQF2.cjs} +20 -20
  118. package/dist/{chunk-7XUYFFR4.cjs.map → chunk-ISKCIQF2.cjs.map} +1 -1
  119. package/dist/{chunk-OD4SSY2U.js → chunk-JG5XIJDY.js} +57 -31
  120. package/dist/chunk-JG5XIJDY.js.map +1 -0
  121. package/dist/{chunk-2HIYYMWY.cjs → chunk-K2XYLVVB.cjs} +134 -133
  122. package/dist/chunk-K2XYLVVB.cjs.map +1 -0
  123. package/dist/{chunk-5K2BKEBD.js → chunk-K46SDNQD.js} +10 -4
  124. package/dist/chunk-K46SDNQD.js.map +1 -0
  125. package/dist/{chunk-TZEGUG6D.cjs → chunk-K6VKTBST.cjs} +4 -4
  126. package/dist/{chunk-TZEGUG6D.cjs.map → chunk-K6VKTBST.cjs.map} +1 -1
  127. package/dist/chunk-KWNWG4RC.cjs +12 -0
  128. package/dist/{chunk-CICO5GXD.cjs.map → chunk-KWNWG4RC.cjs.map} +1 -1
  129. package/dist/{chunk-FQPEMEWX.cjs → chunk-LLVOQOWE.cjs} +80 -32
  130. package/dist/chunk-LLVOQOWE.cjs.map +1 -0
  131. package/dist/{chunk-TQHGE7UC.cjs → chunk-M5MSP3BI.cjs} +18 -10
  132. package/dist/chunk-M5MSP3BI.cjs.map +1 -0
  133. package/dist/{chunk-ACGSAMD3.js → chunk-MJPZNEJZ.js} +274 -292
  134. package/dist/chunk-MJPZNEJZ.js.map +1 -0
  135. package/dist/{chunk-TUNPBZY3.cjs → chunk-MM3JHVKZ.cjs} +4 -4
  136. package/dist/{chunk-TUNPBZY3.cjs.map → chunk-MM3JHVKZ.cjs.map} +1 -1
  137. package/dist/{chunk-BRRP76WO.js → chunk-MX7EKQPM.js} +457 -299
  138. package/dist/chunk-MX7EKQPM.js.map +1 -0
  139. package/dist/{chunk-2SYZXD54.js → chunk-MZ34E2GN.js} +13 -12
  140. package/dist/chunk-MZ34E2GN.js.map +1 -0
  141. package/dist/{chunk-EDN4Y4ZG.cjs → chunk-OJHD3LXJ.cjs} +9 -9
  142. package/dist/{chunk-EDN4Y4ZG.cjs.map → chunk-OJHD3LXJ.cjs.map} +1 -1
  143. package/dist/{chunk-DO7SAMEK.cjs → chunk-ON47CBE4.cjs} +47 -47
  144. package/dist/{chunk-DO7SAMEK.cjs.map → chunk-ON47CBE4.cjs.map} +1 -1
  145. package/dist/{chunk-6LN7FIVU.js → chunk-PALYTHGM.js} +11 -4
  146. package/dist/chunk-PALYTHGM.js.map +1 -0
  147. package/dist/{chunk-YVF2EM7B.js → chunk-R7MRFE5P.js} +3 -3
  148. package/dist/{chunk-YVF2EM7B.js.map → chunk-R7MRFE5P.js.map} +1 -1
  149. package/dist/{chunk-EZEEWCFJ.cjs → chunk-RDP6ZRSM.cjs} +435 -265
  150. package/dist/chunk-RDP6ZRSM.cjs.map +1 -0
  151. package/dist/{chunk-GYEG3ZLZ.cjs → chunk-RJMHU2MG.cjs} +121 -18
  152. package/dist/chunk-RJMHU2MG.cjs.map +1 -0
  153. package/dist/chunk-RWUWTJQY.cjs +30 -0
  154. package/dist/chunk-RWUWTJQY.cjs.map +1 -0
  155. package/dist/{chunk-CT3ZKTOF.js → chunk-S33YQEL7.js} +7 -7
  156. package/dist/{chunk-CT3ZKTOF.js.map → chunk-S33YQEL7.js.map} +1 -1
  157. package/dist/chunk-S3SDEQMC.js +532 -0
  158. package/dist/chunk-S3SDEQMC.js.map +1 -0
  159. package/dist/{chunk-OI2GQ25X.cjs → chunk-SHC7BCG5.cjs} +7 -7
  160. package/dist/{chunk-OI2GQ25X.cjs.map → chunk-SHC7BCG5.cjs.map} +1 -1
  161. package/dist/{chunk-L3LQNR34.cjs → chunk-TEC24ZDA.cjs} +161 -161
  162. package/dist/{chunk-L3LQNR34.cjs.map → chunk-TEC24ZDA.cjs.map} +1 -1
  163. package/dist/{chunk-HDL2ARHX.cjs → chunk-TP4NJTI3.cjs} +63 -27
  164. package/dist/chunk-TP4NJTI3.cjs.map +1 -0
  165. package/dist/{chunk-UMGZDVOA.cjs → chunk-TTCOPKUL.cjs} +124 -124
  166. package/dist/{chunk-UMGZDVOA.cjs.map → chunk-TTCOPKUL.cjs.map} +1 -1
  167. package/dist/chunk-TUVD4DFR.cjs +1207 -0
  168. package/dist/chunk-TUVD4DFR.cjs.map +1 -0
  169. package/dist/{chunk-PFBRJBUL.cjs → chunk-TYGGUWMS.cjs} +178 -152
  170. package/dist/chunk-TYGGUWMS.cjs.map +1 -0
  171. package/dist/{chunk-4WMMBDS5.js → chunk-U3Z7XKAG.js} +7 -7
  172. package/dist/{chunk-4WMMBDS5.js.map → chunk-U3Z7XKAG.js.map} +1 -1
  173. package/dist/{chunk-NACVVDWB.js → chunk-U5EL6JUV.js} +10 -10
  174. package/dist/{chunk-NACVVDWB.js.map → chunk-U5EL6JUV.js.map} +1 -1
  175. package/dist/{chunk-OMZ37BM2.js → chunk-V76FGHY3.js} +5 -5
  176. package/dist/{chunk-OMZ37BM2.js.map → chunk-V76FGHY3.js.map} +1 -1
  177. package/dist/{chunk-6NGW27EO.cjs → chunk-VLBTRXA2.cjs} +10 -10
  178. package/dist/{chunk-6NGW27EO.cjs.map → chunk-VLBTRXA2.cjs.map} +1 -1
  179. package/dist/chunk-VTJVMP4I.js +1182 -0
  180. package/dist/chunk-VTJVMP4I.js.map +1 -0
  181. package/dist/{chunk-QTD6HX4O.js → chunk-W5SOCUBL.js} +5 -5
  182. package/dist/{chunk-QTD6HX4O.js.map → chunk-W5SOCUBL.js.map} +1 -1
  183. package/dist/{chunk-SR725PWF.cjs → chunk-WCLMKNQE.cjs} +1750 -1592
  184. package/dist/chunk-WCLMKNQE.cjs.map +1 -0
  185. package/dist/{chunk-TKZXMWQF.cjs → chunk-WK23PGTP.cjs} +13 -13
  186. package/dist/{chunk-TKZXMWQF.cjs.map → chunk-WK23PGTP.cjs.map} +1 -1
  187. package/dist/{chunk-KKBDXCLQ.js → chunk-WQBAQZHR.js} +4 -4
  188. package/dist/{chunk-KKBDXCLQ.js.map → chunk-WQBAQZHR.js.map} +1 -1
  189. package/dist/{chunk-MRDBBHIZ.cjs → chunk-X4GDXBOP.cjs} +2 -2
  190. package/dist/chunk-X4GDXBOP.cjs.map +1 -0
  191. package/dist/{chunk-WCCATHMB.cjs → chunk-XMY2SXOH.cjs} +438 -456
  192. package/dist/chunk-XMY2SXOH.cjs.map +1 -0
  193. package/dist/{chunk-D5R42W5D.js → chunk-XZW2CTNO.js} +115 -12
  194. package/dist/chunk-XZW2CTNO.js.map +1 -0
  195. package/dist/{chunk-NVY5CJFP.js → chunk-Y55DLLEG.js} +9 -6
  196. package/dist/chunk-Y55DLLEG.js.map +1 -0
  197. package/dist/chunk-YA36ABIL.js +174 -0
  198. package/dist/chunk-YA36ABIL.js.map +1 -0
  199. package/dist/{chunk-ZLONH2UD.js → chunk-YDEJQWOL.js} +2 -2
  200. package/dist/chunk-YDEJQWOL.js.map +1 -0
  201. package/dist/{chunk-JONXFAPO.js → chunk-ZAQUKCUC.js} +5 -5
  202. package/dist/{chunk-JONXFAPO.js.map → chunk-ZAQUKCUC.js.map} +1 -1
  203. package/dist/{chunk-SIT26LAZ.cjs → chunk-ZBFZGLZE.cjs} +29 -5
  204. package/dist/chunk-ZBFZGLZE.cjs.map +1 -0
  205. package/dist/{chunk-P6YLZTRE.js → chunk-ZRJTM7MT.js} +3 -3
  206. package/dist/{chunk-P6YLZTRE.js.map → chunk-ZRJTM7MT.js.map} +1 -1
  207. package/dist/core/index.cjs +29 -28
  208. package/dist/core/index.d.cts +4 -4
  209. package/dist/core/index.d.ts +4 -4
  210. package/dist/core/index.js +9 -8
  211. package/dist/{ddl-D_oW-EVO.d.ts → ddl-B49O7dB_.d.ts} +3 -3
  212. package/dist/{ddl-BL1NZLMY.d.cts → ddl-DcZG660s.d.cts} +3 -3
  213. package/dist/graph-extension/index.cjs +21 -20
  214. package/dist/graph-extension/index.d.cts +4 -4
  215. package/dist/graph-extension/index.d.ts +4 -4
  216. package/dist/graph-extension/index.js +5 -4
  217. package/dist/graph-merge/index.cjs +327 -302
  218. package/dist/graph-merge/index.cjs.map +1 -1
  219. package/dist/graph-merge/index.d.cts +14 -11
  220. package/dist/graph-merge/index.d.ts +14 -11
  221. package/dist/graph-merge/index.js +52 -27
  222. package/dist/graph-merge/index.js.map +1 -1
  223. package/dist/{index-D7d1u2gr.d.ts → index-B0PrmE3K.d.cts} +16 -2
  224. package/dist/{index-COs_z6nV.d.cts → index-CwcXsL5R.d.ts} +16 -2
  225. package/dist/index.cjs +223 -222
  226. package/dist/index.cjs.map +1 -1
  227. package/dist/index.d.cts +12 -12
  228. package/dist/index.d.ts +12 -12
  229. package/dist/index.js +37 -36
  230. package/dist/index.js.map +1 -1
  231. package/dist/indexes/index.cjs +13 -13
  232. package/dist/indexes/index.d.cts +4 -4
  233. package/dist/indexes/index.d.ts +4 -4
  234. package/dist/indexes/index.js +6 -6
  235. package/dist/ingestion-import-target-CI8OWIkM.d.ts +17 -0
  236. package/dist/ingestion-import-target-DCpfM1PX.d.cts +17 -0
  237. package/dist/interchange/index.cjs +55 -54
  238. package/dist/interchange/index.cjs.map +1 -1
  239. package/dist/interchange/index.d.cts +26 -12
  240. package/dist/interchange/index.d.ts +26 -12
  241. package/dist/interchange/index.js +19 -18
  242. package/dist/interchange/index.js.map +1 -1
  243. package/dist/{manager-D9eRT_ns.d.ts → manager-Cfg1ENj1.d.ts} +30 -2
  244. package/dist/{manager-CYaff3n3.d.cts → manager-D348fa6W.d.cts} +30 -2
  245. package/dist/{materialize-indexes-DJ3ykH59.d.ts → materialize-indexes-C9GG3O3C.d.ts} +1 -1
  246. package/dist/{materialize-indexes-DTtAnvfY.d.cts → materialize-indexes-CrSiW_lT.d.cts} +1 -1
  247. package/dist/{postgres-DMj39MEu.d.cts → postgres-CH1kkM5J.d.cts} +279 -2
  248. package/dist/{postgres-CcL4bAHS.d.ts → postgres-UStOycLI.d.ts} +279 -2
  249. package/dist/profiler/index.d.cts +9 -9
  250. package/dist/profiler/index.d.ts +9 -9
  251. package/dist/provenance/index.cjs +46 -44
  252. package/dist/provenance/index.cjs.map +1 -1
  253. package/dist/provenance/index.d.cts +7 -7
  254. package/dist/provenance/index.d.ts +7 -7
  255. package/dist/provenance/index.js +12 -10
  256. package/dist/provenance/index.js.map +1 -1
  257. package/dist/{repair-validity-windows-DlUSqwCg.d.ts → repair-validity-windows-BtOEe2pS.d.ts} +2 -2
  258. package/dist/{repair-validity-windows-BFNZvd_H.d.cts → repair-validity-windows-aWX7VNvv.d.cts} +2 -2
  259. package/dist/schema/index.cjs +46 -46
  260. package/dist/schema/index.d.cts +6 -6
  261. package/dist/schema/index.d.ts +6 -6
  262. package/dist/schema/index.js +19 -19
  263. package/dist/{searchable-DHJMh_nj.d.cts → searchable-C8-RrL3l.d.cts} +1 -1
  264. package/dist/{searchable-bpE1bBfc.d.ts → searchable-z4BiFfHI.d.ts} +1 -1
  265. package/dist/{sqlite-D7Oz0SQh.d.ts → sqlite-Cyx9j9o6.d.cts} +309 -2
  266. package/dist/{sqlite-YppHrNFb.d.cts → sqlite-axLw5Lo5.d.ts} +309 -2
  267. package/dist/{store-JUVvtmR4.d.cts → store-CTfQ9taw.d.ts} +110 -13
  268. package/dist/{store-UzrGvZOo.d.ts → store-DR9J7JVB.d.cts} +110 -13
  269. package/dist/{temporal-5GqpYCk2.d.cts → temporal-B4Ky4wzh.d.cts} +1 -1
  270. package/dist/{temporal-CbnLzTmM.d.ts → temporal-CBOrERz5.d.ts} +1 -1
  271. package/dist/{types-CXAhpW-c.d.cts → types-BE921wRl.d.cts} +1 -1
  272. package/dist/{types-Bx74kaTt.d.ts → types-BScHXVM7.d.ts} +1 -1
  273. package/dist/{types-BqFZTQmV.d.cts → types-CWg4dTjj.d.cts} +257 -6
  274. package/dist/{types-BqFZTQmV.d.ts → types-CWg4dTjj.d.ts} +257 -6
  275. package/dist/{where-O-k2wgYm.d.ts → where-BWXUPV3C.d.ts} +1 -1
  276. package/dist/{where-DI_Fqz-X.d.cts → where-CNtx1aLc.d.cts} +1 -1
  277. package/package.json +4 -4
  278. package/dist/chunk-26YKDNUD.cjs.map +0 -1
  279. package/dist/chunk-2HIYYMWY.cjs.map +0 -1
  280. package/dist/chunk-2SYZXD54.js.map +0 -1
  281. package/dist/chunk-3KOY4FH3.cjs +0 -934
  282. package/dist/chunk-3KOY4FH3.cjs.map +0 -1
  283. package/dist/chunk-3U5ABFDW.cjs.map +0 -1
  284. package/dist/chunk-5K2BKEBD.js.map +0 -1
  285. package/dist/chunk-5PRKMB24.cjs.map +0 -1
  286. package/dist/chunk-6LN7FIVU.js.map +0 -1
  287. package/dist/chunk-6SWPJEYN.js.map +0 -1
  288. package/dist/chunk-ACGSAMD3.js.map +0 -1
  289. package/dist/chunk-AX6JGVTZ.js.map +0 -1
  290. package/dist/chunk-BFUOME67.cjs.map +0 -1
  291. package/dist/chunk-BRRP76WO.js.map +0 -1
  292. package/dist/chunk-CICO5GXD.cjs +0 -12
  293. package/dist/chunk-D5R42W5D.js.map +0 -1
  294. package/dist/chunk-EZEEWCFJ.cjs.map +0 -1
  295. package/dist/chunk-FA2AFWLP.cjs +0 -167
  296. package/dist/chunk-FA2AFWLP.cjs.map +0 -1
  297. package/dist/chunk-FQPEMEWX.cjs.map +0 -1
  298. package/dist/chunk-GLHXM7C4.js.map +0 -1
  299. package/dist/chunk-GYEG3ZLZ.cjs.map +0 -1
  300. package/dist/chunk-HDL2ARHX.cjs.map +0 -1
  301. package/dist/chunk-HEV35TGT.js.map +0 -1
  302. package/dist/chunk-I4GAZH5Z.js +0 -913
  303. package/dist/chunk-I4GAZH5Z.js.map +0 -1
  304. package/dist/chunk-JB6T4GLL.cjs.map +0 -1
  305. package/dist/chunk-JBQQ7THH.js +0 -20
  306. package/dist/chunk-JBQQ7THH.js.map +0 -1
  307. package/dist/chunk-JFRT7S3B.cjs.map +0 -1
  308. package/dist/chunk-KF6K7TGH.js.map +0 -1
  309. package/dist/chunk-MKJ4KXL5.cjs +0 -12
  310. package/dist/chunk-MRDBBHIZ.cjs.map +0 -1
  311. package/dist/chunk-NVY5CJFP.js.map +0 -1
  312. package/dist/chunk-OD4SSY2U.js.map +0 -1
  313. package/dist/chunk-OTUPEF2W.cjs.map +0 -1
  314. package/dist/chunk-PFBRJBUL.cjs.map +0 -1
  315. package/dist/chunk-PWLJ77UV.cjs +0 -23
  316. package/dist/chunk-PWLJ77UV.cjs.map +0 -1
  317. package/dist/chunk-S5TERQVW.js.map +0 -1
  318. package/dist/chunk-SHFBB23Q.js.map +0 -1
  319. package/dist/chunk-SIT26LAZ.cjs.map +0 -1
  320. package/dist/chunk-SR725PWF.cjs.map +0 -1
  321. package/dist/chunk-TQHGE7UC.cjs.map +0 -1
  322. package/dist/chunk-UGHG7PGX.js.map +0 -1
  323. package/dist/chunk-WCCATHMB.cjs.map +0 -1
  324. package/dist/chunk-YIURNGXI.js +0 -155
  325. package/dist/chunk-YIURNGXI.js.map +0 -1
  326. package/dist/chunk-ZFMCDJGB.js.map +0 -1
  327. package/dist/chunk-ZLONH2UD.js.map +0 -1
@@ -1,18 +1,20 @@
1
1
  'use strict';
2
2
 
3
- var chunk3KOY4FH3_cjs = require('../chunk-3KOY4FH3.cjs');
4
- var chunkEZEEWCFJ_cjs = require('../chunk-EZEEWCFJ.cjs');
5
- require('../chunk-SIT26LAZ.cjs');
6
- require('../chunk-3U5ABFDW.cjs');
7
- var chunk5PRKMB24_cjs = require('../chunk-5PRKMB24.cjs');
8
- require('../chunk-FQPEMEWX.cjs');
9
- require('../chunk-2QGYQBS2.cjs');
10
- var chunkTQHGE7UC_cjs = require('../chunk-TQHGE7UC.cjs');
3
+ var chunkTUVD4DFR_cjs = require('../chunk-TUVD4DFR.cjs');
4
+ require('../chunk-7PRMDZIA.cjs');
5
+ var chunkRDP6ZRSM_cjs = require('../chunk-RDP6ZRSM.cjs');
6
+ require('../chunk-ZBFZGLZE.cjs');
7
+ require('../chunk-IHK5KA2Q.cjs');
8
+ var chunkGHZPZNFC_cjs = require('../chunk-GHZPZNFC.cjs');
9
+ require('../chunk-LLVOQOWE.cjs');
10
+ require('../chunk-DWUDZ66O.cjs');
11
+ var chunkM5MSP3BI_cjs = require('../chunk-M5MSP3BI.cjs');
11
12
  require('../chunk-NAUA4PW5.cjs');
12
- require('../chunk-EDN4Y4ZG.cjs');
13
+ require('../chunk-OJHD3LXJ.cjs');
13
14
  require('../chunk-RT5ZY4XA.cjs');
14
15
  require('../chunk-HAHNRASW.cjs');
15
- var chunkMRDBBHIZ_cjs = require('../chunk-MRDBBHIZ.cjs');
16
+ var chunkRWUWTJQY_cjs = require('../chunk-RWUWTJQY.cjs');
17
+ var chunkX4GDXBOP_cjs = require('../chunk-X4GDXBOP.cjs');
16
18
  require('../chunk-A7J2YDDI.cjs');
17
19
  var chunkN66HCGCY_cjs = require('../chunk-N66HCGCY.cjs');
18
20
 
@@ -34,7 +36,7 @@ function edgeToKey(edge) {
34
36
  function keyToRef(key) {
35
37
  const separatorIndex = key.indexOf(KEY_SEPARATOR);
36
38
  if (separatorIndex === -1) {
37
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
39
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
38
40
  "Invalid provenance identity key.",
39
41
  { key },
40
42
  {
@@ -47,12 +49,12 @@ function keyToRef(key) {
47
49
  return { kind, id };
48
50
  }
49
51
  function sortedReferences(keys) {
50
- return [...keys].toSorted((left, right) => chunkEZEEWCFJ_cjs.compareStrings(left, right)).map((key) => keyToRef(key));
52
+ return [...keys].toSorted((left, right) => chunkRWUWTJQY_cjs.compareStrings(left, right)).map((key) => keyToRef(key));
51
53
  }
52
54
  function parseNodeProps(row) {
53
- const parsed = chunk5PRKMB24_cjs.rowPropsToObject(row.props);
55
+ const parsed = chunkGHZPZNFC_cjs.rowPropsToObject(row.props);
54
56
  if (!chunkN66HCGCY_cjs.isPlainObject(parsed)) {
55
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
57
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
56
58
  `Node ${row.kind}/${row.id} props are not an object.`,
57
59
  { kind: row.kind, id: row.id }
58
60
  );
@@ -64,7 +66,7 @@ function sourceRetractedState(row, retractedField) {
64
66
  const value = props[retractedField];
65
67
  if (value === void 0) return "available";
66
68
  if (typeof value !== "boolean") {
67
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
69
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
68
70
  `Provenance source field "${retractedField}" must contain a boolean value.`,
69
71
  { kind: row.kind, id: row.id, field: retractedField },
70
72
  {
@@ -82,26 +84,26 @@ function normalizeConfig(graph, config) {
82
84
  const derivesKind = config.derives.kind;
83
85
  const retractedField = config.source.retractedField ?? DEFAULT_RETRACTED_FIELD;
84
86
  if (sourceKinds.length === 0) {
85
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
87
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
86
88
  "Provenance retraction requires at least one source kind.",
87
89
  { role: "source" }
88
90
  );
89
91
  }
90
92
  if (factKinds.length === 0) {
91
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
93
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
92
94
  "Provenance retraction requires at least one fact kind.",
93
95
  { role: "fact" }
94
96
  );
95
97
  }
96
98
  const duplicateSourceKinds = duplicateValues(sourceKinds);
97
99
  if (duplicateSourceKinds.length > 0) {
98
- throw new chunkMRDBBHIZ_cjs.ConfigurationError("Provenance source kinds must be unique.", {
100
+ throw new chunkX4GDXBOP_cjs.ConfigurationError("Provenance source kinds must be unique.", {
99
101
  duplicateSourceKinds
100
102
  });
101
103
  }
102
104
  const duplicateFactKinds = duplicateValues(factKinds);
103
105
  if (duplicateFactKinds.length > 0) {
104
- throw new chunkMRDBBHIZ_cjs.ConfigurationError("Provenance fact kinds must be unique.", {
106
+ throw new chunkX4GDXBOP_cjs.ConfigurationError("Provenance fact kinds must be unique.", {
105
107
  duplicateFactKinds
106
108
  });
107
109
  }
@@ -119,7 +121,7 @@ function normalizeConfig(graph, config) {
119
121
  if (factKinds.some(
120
122
  (kind) => sourceKinds.includes(kind) || kind === justificationKind
121
123
  )) {
122
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
124
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
123
125
  "Provenance fact kinds must be distinct from source and justification kinds.",
124
126
  { sourceKinds, justificationKind, factKinds }
125
127
  );
@@ -157,11 +159,11 @@ function duplicateValues(values) {
157
159
  }
158
160
  seen.add(value);
159
161
  }
160
- return [...duplicates].toSorted((left, right) => chunkEZEEWCFJ_cjs.compareStrings(left, right));
162
+ return [...duplicates].toSorted((left, right) => chunkRWUWTJQY_cjs.compareStrings(left, right));
161
163
  }
162
164
  function assertKind(records, kind, role, noun, graphId) {
163
165
  if (Object.hasOwn(records, kind)) return;
164
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
166
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
165
167
  `Provenance ${role} kind "${kind}" is not a ${noun} kind in this graph.`,
166
168
  { role, kind, graphId }
167
169
  );
@@ -170,7 +172,7 @@ function assertSourceField(graph, sourceKind, retractedField) {
170
172
  const registration = graph.nodes[sourceKind];
171
173
  if (registration === void 0) return;
172
174
  if (Object.hasOwn(registration.type.schema.shape, retractedField)) return;
173
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
175
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
174
176
  `Provenance source kind "${sourceKind}" must include field "${retractedField}".`,
175
177
  { sourceKind, retractedField },
176
178
  {
@@ -185,14 +187,14 @@ function assertEdgeEndpoints(graph, edgeKind, expected) {
185
187
  const toKinds = new Set(registration.to.map((node) => node.kind));
186
188
  for (const kind of expected.fromKinds) {
187
189
  if (fromKinds.has(kind)) continue;
188
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
190
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
189
191
  `Provenance ${expected.role} edge "${edgeKind}" cannot start at "${kind}".`,
190
192
  { edgeKind, role: expected.role, expectedFrom: kind }
191
193
  );
192
194
  }
193
195
  for (const kind of expected.toKinds) {
194
196
  if (toKinds.has(kind)) continue;
195
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
197
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
196
198
  `Provenance ${expected.role} edge "${edgeKind}" cannot end at "${kind}".`,
197
199
  { edgeKind, role: expected.role, expectedTo: kind }
198
200
  );
@@ -208,7 +210,7 @@ async function findNodeRows(backend, graphId, kind, options) {
208
210
  orderBy: "id"
209
211
  });
210
212
  return rows.filter(
211
- (row) => chunkTQHGE7UC_cjs.validityWindowContainsInstant(row.valid_from, row.valid_to, options.asOf)
213
+ (row) => chunkM5MSP3BI_cjs.validityWindowContainsInstant(row.valid_from, row.valid_to, options.asOf)
212
214
  );
213
215
  }
214
216
  return backend.findNodesByKind({
@@ -297,7 +299,7 @@ function buildSupportEdges(config, rows) {
297
299
  };
298
300
  }
299
301
  async function loadSupportGraph(backend, graphId, config) {
300
- const asOf = chunkTQHGE7UC_cjs.nowIso();
302
+ const asOf = chunkM5MSP3BI_cjs.nowIso();
301
303
  const roles = await readRoles(backend, graphId, config, asOf);
302
304
  const supportEdges = buildSupportEdges(config, roles);
303
305
  const sourceRowsByKind = await Promise.all(
@@ -405,7 +407,7 @@ function buildReport(before, after, affected) {
405
407
  const unaffected = sortedReferences(
406
408
  believedBefore.filter((key) => !affected.has(key))
407
409
  );
408
- const survivedVia = [...affected].filter((key) => after.supportedFactKeys.has(key)).toSorted((left, right) => chunkEZEEWCFJ_cjs.compareStrings(left, right)).map((key) => ({
410
+ const survivedVia = [...affected].filter((key) => after.supportedFactKeys.has(key)).toSorted((left, right) => chunkRWUWTJQY_cjs.compareStrings(left, right)).map((key) => ({
409
411
  fact: keyToRef(key),
410
412
  via: sortedReferences(
411
413
  after.firingJustificationKeysByFact.get(key) ?? []
@@ -428,21 +430,21 @@ async function synchronizeFactCurrency(backend, store, runHooks, snapshot, affec
428
430
  snapshot,
429
431
  affected,
430
432
  (key) => !snapshot.supportedFactKeys.has(key),
431
- chunk5PRKMB24_cjs.isLiveNodeRow,
433
+ chunkGHZPZNFC_cjs.isLiveNodeRow,
432
434
  (row) => closeFactCurrency(backend, store, runHooks, row, lock)
433
435
  );
434
436
  await forEachAffectedFact(
435
437
  snapshot,
436
438
  affected,
437
439
  (key) => snapshot.supportedFactKeys.has(key),
438
- chunk5PRKMB24_cjs.isTombstonedNodeRow,
440
+ chunkGHZPZNFC_cjs.isTombstonedNodeRow,
439
441
  (row) => reopenFactCurrency(backend, store, runHooks, row, lock)
440
442
  );
441
443
  }
442
444
  function getFactRegistration(store, row) {
443
445
  const registration = store.graph.nodes[row.kind];
444
446
  if (registration !== void 0) return registration;
445
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
447
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
446
448
  `Provenance fact kind "${row.kind}" is not a node kind in this graph.`,
447
449
  { kind: row.kind, graphId: store.graphId }
448
450
  );
@@ -450,8 +452,8 @@ function getFactRegistration(store, row) {
450
452
  async function closeFactCurrency(backend, store, runHooks, row, lock) {
451
453
  await runHooks("delete", row.kind, row.id, async () => {
452
454
  const registration = getFactRegistration(store, row);
453
- await chunk3KOY4FH3_cjs.applyNodeSoftDelete(
454
- chunk3KOY4FH3_cjs.createNodeWriteContext(store.graphId, store.registry, lock),
455
+ await chunkTUVD4DFR_cjs.applyNodeSoftDelete(
456
+ chunkTUVD4DFR_cjs.createNodeWriteContext(store.graphId, store.registry, lock),
455
457
  {
456
458
  existing: row,
457
459
  schema: registration.type.schema,
@@ -466,8 +468,8 @@ async function closeFactCurrency(backend, store, runHooks, row, lock) {
466
468
  async function reopenFactCurrency(backend, store, runHooks, row, lock) {
467
469
  await runHooks("update", row.kind, row.id, async () => {
468
470
  const registration = getFactRegistration(store, row);
469
- await chunk3KOY4FH3_cjs.applyNodeResurrect(
470
- chunk3KOY4FH3_cjs.createNodeWriteContext(store.graphId, store.registry, lock),
471
+ await chunkTUVD4DFR_cjs.applyNodeResurrect(
472
+ chunkTUVD4DFR_cjs.createNodeWriteContext(store.graphId, store.registry, lock),
471
473
  {
472
474
  existing: row,
473
475
  schema: registration.type.schema,
@@ -480,7 +482,7 @@ async function reopenFactCurrency(backend, store, runHooks, row, lock) {
480
482
  function getTransactionNodeCollection(tx, kind) {
481
483
  const collection = tx.getNodeCollection(kind);
482
484
  if (collection !== void 0) return collection;
483
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
485
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
484
486
  `Provenance source kind "${kind}" is not available on this transaction.`,
485
487
  { kind }
486
488
  );
@@ -493,14 +495,14 @@ async function runTransition(store, config, sources, retracted) {
493
495
  const uniqueSources = uniqueNodeReferences(sources);
494
496
  for (const source of uniqueSources) {
495
497
  if (config.sourceKinds.includes(source.kind)) continue;
496
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
498
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
497
499
  `Provenance retraction source must be one of: ${config.sourceKinds.join(", ")}.`,
498
500
  { expectedKinds: config.sourceKinds, actualKind: source.kind }
499
501
  );
500
502
  }
501
503
  return store.transaction(async (tx) => {
502
- const backend = chunk3KOY4FH3_cjs.transactionBackend(tx);
503
- const lock = await chunkEZEEWCFJ_cjs.lockRecordedGraphWrite(backend, store.graphId);
504
+ const backend = chunkTUVD4DFR_cjs.transactionBackend(tx);
505
+ const lock = await chunkRDP6ZRSM_cjs.lockRecordedGraphWrite(backend, store.graphId);
504
506
  const rows = await Promise.all(
505
507
  uniqueSources.map(
506
508
  (source) => backend.getNode(store.graphId, source.kind, source.id)
@@ -509,7 +511,7 @@ async function runTransition(store, config, sources, retracted) {
509
511
  const sourceRows = uniqueSources.map((source, index) => {
510
512
  const sourceRow = rows[index];
511
513
  if (sourceRow === void 0 || sourceRow.deleted_at !== void 0) {
512
- throw new chunkMRDBBHIZ_cjs.NodeNotFoundError(source.kind, source.id);
514
+ throw new chunkX4GDXBOP_cjs.NodeNotFoundError(source.kind, source.id);
513
515
  }
514
516
  return { source, row: sourceRow };
515
517
  });
@@ -536,7 +538,7 @@ async function runTransition(store, config, sources, retracted) {
536
538
  await synchronizeFactCurrency(
537
539
  backend,
538
540
  store,
539
- chunk3KOY4FH3_cjs.transactionNodeOperationHookRunner(tx),
541
+ chunkTUVD4DFR_cjs.transactionNodeOperationHookRunner(tx),
540
542
  after,
541
543
  affected,
542
544
  lock
@@ -562,8 +564,8 @@ function createRetractionCapability(store, config) {
562
564
  unRetractMany: (sources) => transition(sources, false),
563
565
  async holding() {
564
566
  return store.transaction(async (tx) => {
565
- const backend = chunk3KOY4FH3_cjs.transactionBackend(tx);
566
- await chunkEZEEWCFJ_cjs.lockRecordedGraphWrite(backend, store.graphId);
567
+ const backend = chunkTUVD4DFR_cjs.transactionBackend(tx);
568
+ await chunkRDP6ZRSM_cjs.lockRecordedGraphWrite(backend, store.graphId);
567
569
  const snapshot = await computeSupport(
568
570
  backend,
569
571
  store.graphId,
@@ -578,7 +580,7 @@ function createRetractionCapability(store, config) {
578
580
  }
579
581
  function assertRetractionHistoryEnabled(store) {
580
582
  if (!store.historyEnabled) {
581
- throw new chunkMRDBBHIZ_cjs.ConfigurationError(
583
+ throw new chunkX4GDXBOP_cjs.ConfigurationError(
582
584
  "createRetractionCapability requires a store created with { history: true }.",
583
585
  { graphId: store.graphId },
584
586
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/provenance/index.ts"],"names":["ConfigurationError","compareStrings","rowPropsToObject","isPlainObject","validityWindowContainsInstant","nowIso","isLiveNodeRow","isTombstonedNodeRow","applyNodeSoftDelete","createNodeWriteContext","applyNodeResurrect","transactionBackend","lockRecordedGraphWrite","NodeNotFoundError","transactionNodeOperationHookRunner"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n type EdgeRow,\n type GraphReadBackend,\n isLiveNodeRow,\n isTombstonedNodeRow,\n type LiveNodeRow,\n type NodeRow,\n rowPropsToObject,\n type TombstonedNodeRow,\n type TransactionBackend,\n} from \"../backend/types\";\nimport type { GraphDef } from \"../core/define-graph\";\nimport type { NodeRegistration } from \"../core/types\";\nimport { ConfigurationError, NodeNotFoundError } from \"../errors\";\nimport {\n applyNodeResurrect,\n applyNodeSoftDelete,\n createNodeWriteContext,\n} from \"../store/operations/node-write-pipeline\";\nimport { lockRecordedGraphWrite } from \"../store/recorded-capture\";\nimport { type GraphWriteLock } from \"../store/recorded-capture/clock\";\nimport {\n transactionBackend,\n transactionNodeOperationHookRunner,\n} from \"../store/runtime-port\";\nimport type { HistoryStore } from \"../store/store\";\nimport {\n type DynamicNodeCollection,\n type TransactionContext,\n} from \"../store/types\";\nimport { compareStrings } from \"../utils/compare\";\nimport { nowIso, validityWindowContainsInstant } from \"../utils/date\";\nimport { isPlainObject } from \"../utils/object\";\n\nexport type {\n ContributionDiagnostic,\n ContributionDiagnosticState,\n ContributionRepairEntry,\n ContributionRepairResult,\n} from \"../backend/types\";\n\nconst DEFAULT_RETRACTED_FIELD = \"retracted\";\nconst KEY_SEPARATOR = \"\\u0000\";\n\ntype NodeKind<G extends GraphDef> = Extract<keyof G[\"nodes\"], string>;\ntype EdgeKind<G extends GraphDef> = Extract<keyof G[\"edges\"], string>;\n\nexport type ProvenanceNodeRef<\n G extends GraphDef = GraphDef,\n K extends NodeKind<G> = NodeKind<G>,\n> = Readonly<{\n kind: K;\n id: string;\n}>;\n\nexport type ProvenanceJustificationRef<\n G extends GraphDef = GraphDef,\n K extends NodeKind<G> = NodeKind<G>,\n> = ProvenanceNodeRef<G, K>;\nexport type ProvenanceFactRef<\n G extends GraphDef = GraphDef,\n K extends NodeKind<G> = NodeKind<G>,\n> = ProvenanceNodeRef<G, K>;\n\ntype ProvenanceSourceConfig<G extends GraphDef = GraphDef> =\n | Readonly<{\n kind: NodeKind<G>;\n retractedField?: string;\n }>\n | Readonly<{\n kinds: readonly NodeKind<G>[];\n retractedField?: string;\n }>;\n\nexport type ProvenanceRetractionConfig<G extends GraphDef = GraphDef> =\n Readonly<{\n source: ProvenanceSourceConfig<G>;\n justification: Readonly<{ kind: NodeKind<G> }>;\n fact: Readonly<{ kinds: readonly NodeKind<G>[] }>;\n premiseOf: Readonly<{ kind: EdgeKind<G> }>;\n derives: Readonly<{ kind: EdgeKind<G> }>;\n }>;\n\n/**\n * Extracts the node kind(s) referenced by a provenance role config, whether\n * declared as a single `{ kind }` or a `{ kinds }` array. Falls back to the\n * full `NodeKind<G>` union when neither shape is present (e.g. a role config\n * that also carries unrelated fields, matched structurally).\n */\ntype KindsFromRef<G extends GraphDef, Ref> =\n Ref extends Readonly<{ kind: infer K }> ? Extract<K, NodeKind<G>>\n : Ref extends Readonly<{ kinds: readonly (infer K)[] }> ?\n Extract<K, NodeKind<G>>\n : NodeKind<G>;\n\ntype SourceKindsFromConfig<\n G extends GraphDef,\n C extends ProvenanceRetractionConfig<G>,\n> = KindsFromRef<G, C[\"source\"]>;\n\ntype FactKindsFromConfig<\n G extends GraphDef,\n C extends ProvenanceRetractionConfig<G>,\n> = KindsFromRef<G, C[\"fact\"]>;\n\ntype JustificationKindFromConfig<\n G extends GraphDef,\n C extends ProvenanceRetractionConfig<G>,\n> = KindsFromRef<G, C[\"justification\"]>;\n\nexport type SurvivedVia<\n G extends GraphDef = GraphDef,\n FactKind extends NodeKind<G> = NodeKind<G>,\n JustificationKind extends NodeKind<G> = NodeKind<G>,\n> = Readonly<{\n fact: ProvenanceFactRef<G, FactKind>;\n via: readonly ProvenanceJustificationRef<G, JustificationKind>[];\n}>;\n\nexport type RetractionReport<\n G extends GraphDef = GraphDef,\n FactKind extends NodeKind<G> = NodeKind<G>,\n JustificationKind extends NodeKind<G> = NodeKind<G>,\n> = Readonly<{\n died: readonly ProvenanceFactRef<G, FactKind>[];\n survivedVia: readonly SurvivedVia<G, FactKind, JustificationKind>[];\n unaffected: readonly ProvenanceFactRef<G, FactKind>[];\n}>;\n\nexport type RetractionCapability<\n G extends GraphDef = GraphDef,\n SourceKind extends NodeKind<G> = NodeKind<G>,\n FactKind extends NodeKind<G> = NodeKind<G>,\n JustificationKind extends NodeKind<G> = NodeKind<G>,\n> = Readonly<{\n retract: (\n source: ProvenanceNodeRef<G, SourceKind>,\n ) => Promise<RetractionReport<G, FactKind, JustificationKind>>;\n retractMany: (\n sources: readonly ProvenanceNodeRef<G, SourceKind>[],\n ) => Promise<RetractionReport<G, FactKind, JustificationKind>>;\n unRetract: (\n source: ProvenanceNodeRef<G, SourceKind>,\n ) => Promise<RetractionReport<G, FactKind, JustificationKind>>;\n unRetractMany: (\n sources: readonly ProvenanceNodeRef<G, SourceKind>[],\n ) => Promise<RetractionReport<G, FactKind, JustificationKind>>;\n holding: () => Promise<readonly ProvenanceFactRef<G, FactKind>[]>;\n}>;\n\ntype NormalizedConfig = Readonly<{\n sourceKinds: readonly string[];\n retractedField: string;\n justificationKind: string;\n factKinds: readonly string[];\n premiseOfKind: string;\n derivesKind: string;\n}>;\n\ntype ProvenanceRows = Readonly<{\n justifications: ReadonlyMap<string, NodeRow>;\n facts: ReadonlyMap<string, NodeRow>;\n premiseEdges: readonly EdgeRow[];\n deriveEdges: readonly EdgeRow[];\n}>;\n\ntype SupportEdges = Readonly<{\n premisesByJustification: ReadonlyMap<string, readonly string[]>;\n factsByJustification: ReadonlyMap<string, readonly string[]>;\n justificationsByPremise: ReadonlyMap<string, readonly string[]>;\n}>;\n\ntype SupportSnapshot = Readonly<{\n facts: ReadonlyMap<string, NodeRow>;\n supportedFactKeys: ReadonlySet<string>;\n believedFactKeys: ReadonlySet<string>;\n firingJustificationKeysByFact: ReadonlyMap<string, readonly string[]>;\n affectedFactKeys: (\n sources: readonly ProvenanceNodeRef[],\n ) => ReadonlySet<string>;\n}>;\n\ntype SourceRetractedState = \"retracted\" | \"available\";\n\ntype SourceRow<G extends GraphDef> = Readonly<{\n source: ProvenanceNodeRef<G>;\n row: NodeRow;\n}>;\n\nfunction refKey(ref: ProvenanceNodeRef): string {\n return `${ref.kind}${KEY_SEPARATOR}${ref.id}`;\n}\n\nfunction rowKey(row: Pick<NodeRow, \"kind\" | \"id\">): string {\n return refKey({ kind: row.kind, id: row.id });\n}\n\nfunction edgeFromKey(edge: EdgeRow): string {\n return refKey({ kind: edge.from_kind, id: edge.from_id });\n}\n\nfunction edgeToKey(edge: EdgeRow): string {\n return refKey({ kind: edge.to_kind, id: edge.to_id });\n}\n\nfunction keyToRef<\n G extends GraphDef = GraphDef,\n K extends NodeKind<G> = NodeKind<G>,\n>(key: string): ProvenanceNodeRef<G, K> {\n const separatorIndex = key.indexOf(KEY_SEPARATOR);\n if (separatorIndex === -1) {\n throw new ConfigurationError(\n \"Invalid provenance identity key.\",\n { key },\n {\n suggestion:\n \"Report this TypeGraph provenance bug with the graph roles that produced the key.\",\n },\n );\n }\n const kind = key.slice(0, separatorIndex);\n const id = key.slice(separatorIndex + KEY_SEPARATOR.length);\n return { kind, id } as ProvenanceNodeRef<G, K>;\n}\n\nfunction sortedReferences<\n G extends GraphDef = GraphDef,\n K extends NodeKind<G> = NodeKind<G>,\n>(keys: Iterable<string>): ProvenanceNodeRef<G, K>[] {\n return [...keys]\n .toSorted((left, right) => compareStrings(left, right))\n .map((key) => keyToRef<G, K>(key));\n}\n\nfunction parseNodeProps(row: NodeRow): Record<string, unknown> {\n const parsed = rowPropsToObject(row.props) as unknown;\n if (!isPlainObject(parsed)) {\n throw new ConfigurationError(\n `Node ${row.kind}/${row.id} props are not an object.`,\n { kind: row.kind, id: row.id },\n );\n }\n return parsed;\n}\n\nfunction sourceRetractedState(\n row: NodeRow,\n retractedField: string,\n): SourceRetractedState {\n const props = parseNodeProps(row);\n const value = props[retractedField];\n if (value === undefined) return \"available\";\n if (typeof value !== \"boolean\") {\n throw new ConfigurationError(\n `Provenance source field \"${retractedField}\" must contain a boolean value.`,\n { kind: row.kind, id: row.id, field: retractedField },\n {\n suggestion:\n \"Use a source node schema with a boolean retracted flag, for example z.boolean().default(false).\",\n },\n );\n }\n return value ? \"retracted\" : \"available\";\n}\n\nfunction normalizeConfig<G extends GraphDef>(\n graph: G,\n config: ProvenanceRetractionConfig<G>,\n): NormalizedConfig {\n const sourceKinds = sourceKindsFromConfig(config.source);\n const justificationKind = config.justification.kind;\n const factKinds = [...config.fact.kinds];\n const premiseOfKind = config.premiseOf.kind;\n const derivesKind = config.derives.kind;\n const retractedField =\n config.source.retractedField ?? DEFAULT_RETRACTED_FIELD;\n\n if (sourceKinds.length === 0) {\n throw new ConfigurationError(\n \"Provenance retraction requires at least one source kind.\",\n { role: \"source\" },\n );\n }\n\n if (factKinds.length === 0) {\n throw new ConfigurationError(\n \"Provenance retraction requires at least one fact kind.\",\n { role: \"fact\" },\n );\n }\n\n const duplicateSourceKinds = duplicateValues(sourceKinds);\n if (duplicateSourceKinds.length > 0) {\n throw new ConfigurationError(\"Provenance source kinds must be unique.\", {\n duplicateSourceKinds,\n });\n }\n\n const duplicateFactKinds = duplicateValues(factKinds);\n if (duplicateFactKinds.length > 0) {\n throw new ConfigurationError(\"Provenance fact kinds must be unique.\", {\n duplicateFactKinds,\n });\n }\n\n for (const kind of sourceKinds) {\n assertKind(graph.nodes, kind, \"source\", \"node\", graph.id);\n }\n assertKind(graph.nodes, justificationKind, \"justification\", \"node\", graph.id);\n for (const kind of factKinds) {\n assertKind(graph.nodes, kind, \"fact\", \"node\", graph.id);\n }\n for (const kind of sourceKinds)\n assertSourceField(graph, kind, retractedField);\n assertKind(graph.edges, premiseOfKind, \"premiseOf\", \"edge\", graph.id);\n assertKind(graph.edges, derivesKind, \"derives\", \"edge\", graph.id);\n\n if (\n factKinds.some(\n (kind) => sourceKinds.includes(kind) || kind === justificationKind,\n )\n ) {\n throw new ConfigurationError(\n \"Provenance fact kinds must be distinct from source and justification kinds.\",\n { sourceKinds, justificationKind, factKinds },\n );\n }\n\n assertEdgeEndpoints(graph, premiseOfKind, {\n role: \"premiseOf\",\n fromKinds: sourceKinds,\n toKinds: [justificationKind],\n });\n assertEdgeEndpoints(graph, derivesKind, {\n role: \"derives\",\n fromKinds: [justificationKind],\n toKinds: factKinds,\n });\n\n return {\n sourceKinds,\n retractedField,\n justificationKind,\n factKinds,\n premiseOfKind,\n derivesKind,\n };\n}\n\nfunction sourceKindsFromConfig<G extends GraphDef>(\n source: ProvenanceSourceConfig<G>,\n): string[] {\n if (\"kinds\" in source) return [...source.kinds];\n return [source.kind];\n}\n\nfunction duplicateValues(values: readonly string[]): string[] {\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n for (const value of values) {\n if (seen.has(value)) {\n duplicates.add(value);\n continue;\n }\n seen.add(value);\n }\n return [...duplicates].toSorted((left, right) => compareStrings(left, right));\n}\n\nfunction assertKind(\n records: Readonly<Record<string, unknown>>,\n kind: string,\n role: string,\n noun: \"node\" | \"edge\",\n graphId: string,\n): void {\n if (Object.hasOwn(records, kind)) return;\n throw new ConfigurationError(\n `Provenance ${role} kind \"${kind}\" is not a ${noun} kind in this graph.`,\n { role, kind, graphId },\n );\n}\n\nfunction assertSourceField<G extends GraphDef>(\n graph: G,\n sourceKind: string,\n retractedField: string,\n): void {\n const registration = graph.nodes[sourceKind];\n if (registration === undefined) return;\n if (Object.hasOwn(registration.type.schema.shape, retractedField)) return;\n throw new ConfigurationError(\n `Provenance source kind \"${sourceKind}\" must include field \"${retractedField}\".`,\n { sourceKind, retractedField },\n {\n suggestion:\n \"Add a boolean retracted flag to the source node schema or pass source.retractedField.\",\n },\n );\n}\n\nfunction assertEdgeEndpoints<G extends GraphDef>(\n graph: G,\n edgeKind: string,\n expected: Readonly<{\n role: string;\n fromKinds: readonly string[];\n toKinds: readonly string[];\n }>,\n): void {\n const registration = graph.edges[edgeKind];\n if (registration === undefined) return;\n const fromKinds = new Set(registration.from.map((node) => node.kind));\n const toKinds = new Set(registration.to.map((node) => node.kind));\n for (const kind of expected.fromKinds) {\n if (fromKinds.has(kind)) continue;\n throw new ConfigurationError(\n `Provenance ${expected.role} edge \"${edgeKind}\" cannot start at \"${kind}\".`,\n { edgeKind, role: expected.role, expectedFrom: kind },\n );\n }\n for (const kind of expected.toKinds) {\n if (toKinds.has(kind)) continue;\n throw new ConfigurationError(\n `Provenance ${expected.role} edge \"${edgeKind}\" cannot end at \"${kind}\".`,\n { edgeKind, role: expected.role, expectedTo: kind },\n );\n }\n}\n\n/**\n * Provenance reads follow the store's currency semantics: a source,\n * justification, or support edge counts only while currently valid (the\n * default `\"current\"` read mode), so a validity-expired source no longer\n * supports anything and `holding()` agrees with the collection API about\n * which facts are currently believed. Fact rows additionally need their\n * tombstones — a reopen candidate is by definition soft-deleted — so they\n * are loaded with tombstones and filtered to the same validity instant.\n */\nasync function findNodeRows(\n backend: GraphReadBackend,\n graphId: string,\n kind: string,\n options: Readonly<{ includeTombstones: boolean; asOf: string }>,\n): Promise<readonly NodeRow[]> {\n if (options.includeTombstones) {\n const rows = await backend.findNodesByKind({\n graphId,\n kind,\n excludeDeleted: false,\n temporalMode: \"includeTombstones\",\n orderBy: \"id\",\n });\n return rows.filter((row) =>\n validityWindowContainsInstant(row.valid_from, row.valid_to, options.asOf),\n );\n }\n return backend.findNodesByKind({\n graphId,\n kind,\n excludeDeleted: true,\n temporalMode: \"current\",\n asOf: options.asOf,\n orderBy: \"id\",\n });\n}\n\nasync function findEdgeRows(\n backend: GraphReadBackend,\n graphId: string,\n kind: string,\n asOf: string,\n): Promise<readonly EdgeRow[]> {\n return backend.findEdgesByKind({\n graphId,\n kind,\n excludeDeleted: true,\n temporalMode: \"current\",\n asOf,\n orderBy: \"id\",\n });\n}\n\nasync function readRoles(\n backend: GraphReadBackend,\n graphId: string,\n config: NormalizedConfig,\n asOf: string,\n): Promise<ProvenanceRows> {\n const [justificationRows, factRowsByKind, premiseEdges, deriveEdges] =\n await Promise.all([\n findNodeRows(backend, graphId, config.justificationKind, {\n includeTombstones: false,\n asOf,\n }),\n Promise.all(\n config.factKinds.map((kind) =>\n findNodeRows(backend, graphId, kind, {\n includeTombstones: true,\n asOf,\n }),\n ),\n ),\n findEdgeRows(backend, graphId, config.premiseOfKind, asOf),\n findEdgeRows(backend, graphId, config.derivesKind, asOf),\n ]);\n const factRows = factRowsByKind.flat();\n\n return {\n justifications: rowsByKey(justificationRows),\n facts: rowsByKey(factRows),\n premiseEdges,\n deriveEdges,\n };\n}\n\nfunction rowsByKey(rows: readonly NodeRow[]): ReadonlyMap<string, NodeRow> {\n const byKey = new Map<string, NodeRow>();\n for (const row of rows) byKey.set(rowKey(row), row);\n return byKey;\n}\n\nfunction appendGroupedValue(\n groups: Map<string, string[]>,\n key: string,\n value: string,\n): void {\n const group = groups.get(key);\n if (group === undefined) {\n groups.set(key, [value]);\n return;\n }\n if (group.includes(value)) return;\n group.push(value);\n}\n\nfunction buildSupportEdges(\n config: NormalizedConfig,\n rows: ProvenanceRows,\n): SupportEdges {\n const premisesByJustification = new Map<string, string[]>();\n const factsByJustification = new Map<string, string[]>();\n const justificationsByPremise = new Map<string, string[]>();\n\n for (const edge of rows.premiseEdges) {\n if (edge.to_kind !== config.justificationKind) continue;\n if (!isPremiseKind(config, edge.from_kind)) continue;\n\n const premiseKey = edgeFromKey(edge);\n const justificationKey = edgeToKey(edge);\n appendGroupedValue(premisesByJustification, justificationKey, premiseKey);\n appendGroupedValue(justificationsByPremise, premiseKey, justificationKey);\n }\n\n for (const edge of rows.deriveEdges) {\n if (edge.from_kind !== config.justificationKind) continue;\n if (!config.factKinds.includes(edge.to_kind)) continue;\n appendGroupedValue(\n factsByJustification,\n edgeFromKey(edge),\n edgeToKey(edge),\n );\n }\n\n return {\n premisesByJustification,\n factsByJustification,\n justificationsByPremise,\n };\n}\n\n/**\n * The whole-graph read a support computation needs: the role rows, the support\n * edges derived from them, and the (non-retracted-visible) source rows. Loaded\n * once per transition so `before` and `after` snapshots share one read instead\n * of scanning the entire provenance graph twice — the graph structure is\n * identical across a transition, only source availability changes.\n */\ntype SupportGraph = Readonly<{\n roles: ProvenanceRows;\n supportEdges: SupportEdges;\n sourceRows: readonly NodeRow[];\n}>;\n\nasync function loadSupportGraph(\n backend: GraphReadBackend,\n graphId: string,\n config: NormalizedConfig,\n): Promise<SupportGraph> {\n // One read instant for every role read, so the whole snapshot shares a\n // single \"currently valid\" coordinate.\n const asOf = nowIso();\n const roles = await readRoles(backend, graphId, config, asOf);\n const supportEdges = buildSupportEdges(config, roles);\n const sourceRowsByKind = await Promise.all(\n config.sourceKinds.map((kind) =>\n findNodeRows(backend, graphId, kind, { includeTombstones: false, asOf }),\n ),\n );\n return { roles, supportEdges, sourceRows: sourceRowsByKind.flat() };\n}\n\nfunction availableSourceKeys(\n sourceRows: readonly NodeRow[],\n retractedField: string,\n): Set<string> {\n const available = new Set<string>();\n for (const row of sourceRows) {\n if (sourceRetractedState(row, retractedField) === \"available\") {\n available.add(rowKey(row));\n }\n }\n return available;\n}\n\n/**\n * The pure TMS fixpoint: given the loaded graph and the set of available\n * (non-retracted) source keys, derive which facts are supported and believed.\n * No I/O — the same {@link SupportGraph} feeds both the pre- and post-transition\n * snapshots with different availability sets.\n */\nfunction computeSupportSnapshot(\n graph: Pick<SupportGraph, \"roles\" | \"supportEdges\">,\n available: ReadonlySet<string>,\n): SupportSnapshot {\n const { roles, supportEdges } = graph;\n const supported = new Set<string>();\n const inSet = new Set<string>(available);\n const firingJustifications = new Set<string>();\n const firingJustificationKeysByFact = new Map<string, string[]>();\n\n let changed = true;\n while (changed) {\n changed = false;\n for (const [justificationKey] of roles.justifications) {\n if (firingJustifications.has(justificationKey)) continue;\n const premises =\n supportEdges.premisesByJustification.get(justificationKey) ?? [];\n if (!allPremisesSupported(premises, inSet)) continue;\n\n firingJustifications.add(justificationKey);\n const derivedFacts =\n supportEdges.factsByJustification.get(justificationKey) ?? [];\n for (const factKey of derivedFacts) {\n if (!roles.facts.has(factKey)) continue;\n appendGroupedValue(\n firingJustificationKeysByFact,\n factKey,\n justificationKey,\n );\n if (supported.has(factKey)) continue;\n supported.add(factKey);\n inSet.add(factKey);\n changed = true;\n }\n }\n }\n\n const believed = new Set<string>();\n for (const key of supported) {\n const row = roles.facts.get(key);\n if (row !== undefined && row.deleted_at === undefined) believed.add(key);\n }\n\n return {\n facts: roles.facts,\n supportedFactKeys: supported,\n believedFactKeys: believed,\n firingJustificationKeysByFact,\n affectedFactKeys(\n targets: readonly ProvenanceNodeRef[],\n ): ReadonlySet<string> {\n return computeAffectedFactKeys(targets, roles, supportEdges);\n },\n };\n}\n\nasync function computeSupport(\n backend: GraphReadBackend,\n graphId: string,\n config: NormalizedConfig,\n): Promise<SupportSnapshot> {\n const graph = await loadSupportGraph(backend, graphId, config);\n return computeSupportSnapshot(\n graph,\n availableSourceKeys(graph.sourceRows, config.retractedField),\n );\n}\n\nfunction isPremiseKind(config: NormalizedConfig, kind: string): boolean {\n return config.sourceKinds.includes(kind) || config.factKinds.includes(kind);\n}\n\nfunction allPremisesSupported(\n premises: readonly string[],\n supported: ReadonlySet<string>,\n): boolean {\n for (const premise of premises) {\n if (!supported.has(premise)) return false;\n }\n return true;\n}\n\nfunction computeAffectedFactKeys(\n sources: readonly ProvenanceNodeRef[],\n roles: ProvenanceRows,\n supportEdges: SupportEdges,\n): ReadonlySet<string> {\n const affected = new Set<string>();\n // Seed the BFS with every source at once: the union of facts reachable from\n // any source falls out of one traversal, instead of one BFS per source.\n const frontier = sources.map((source) => refKey(source));\n const seen = new Set<string>(frontier);\n\n while (frontier.length > 0) {\n const current = frontier.shift();\n if (current === undefined) continue;\n\n const justifications =\n supportEdges.justificationsByPremise.get(current) ?? [];\n for (const justificationKey of justifications) {\n const derivedFacts =\n supportEdges.factsByJustification.get(justificationKey) ?? [];\n for (const factKey of derivedFacts) {\n if (!roles.facts.has(factKey)) continue;\n affected.add(factKey);\n if (seen.has(factKey)) continue;\n seen.add(factKey);\n frontier.push(factKey);\n }\n }\n }\n\n return affected;\n}\n\nfunction buildReport<\n G extends GraphDef,\n FactKind extends NodeKind<G>,\n JustificationKind extends NodeKind<G>,\n>(\n before: SupportSnapshot,\n after: SupportSnapshot,\n affected: ReadonlySet<string>,\n): RetractionReport<G, FactKind, JustificationKind> {\n const believedBefore = [...before.believedFactKeys];\n const died = sortedReferences<G, FactKind>(\n believedBefore.filter((key) => !after.supportedFactKeys.has(key)),\n );\n const unaffected = sortedReferences<G, FactKind>(\n believedBefore.filter((key) => !affected.has(key)),\n );\n const survivedVia = [...affected]\n .filter((key) => after.supportedFactKeys.has(key))\n .toSorted((left, right) => compareStrings(left, right))\n .map((key) => ({\n fact: keyToRef<G, FactKind>(key),\n via: sortedReferences<G, JustificationKind>(\n after.firingJustificationKeysByFact.get(key) ?? [],\n ),\n }));\n return { died, survivedVia, unaffected };\n}\n\n/**\n * Brings fact currency in line with the post-transition support snapshot —\n * but only for the facts the transition could have affected (those reachable\n * from the flipped sources through justification edges). Facts outside that\n * set are never touched: an unsupported live fact elsewhere in the graph\n * (e.g. one whose justification edges have not been linked yet) is not this\n * transition's business, and silently tombstoning it would be invisible data\n * loss the report cannot even mention.\n *\n * Closes run before reopens: a reopen re-checks uniqueness, and the unique\n * key it needs may still be held by a fact this same transition is about to\n * close — closing first makes a legal transition order-independent.\n */\n/**\n * Runs `action` over every fact row in `snapshot` that is both affected by the\n * transition and matches `isTargetKey`/`isTargetRow`, concurrently — the\n * matched rows are independent facts, so there is no ordering dependency\n * within a single pass (only between the close pass and the reopen pass,\n * which the caller sequences).\n */\nasync function forEachAffectedFact<T extends NodeRow>(\n snapshot: SupportSnapshot,\n affected: ReadonlySet<string>,\n isTargetKey: (key: string) => boolean,\n isTargetRow: (row: NodeRow) => row is T,\n action: (row: T) => Promise<void>,\n): Promise<void> {\n const rows: T[] = [];\n for (const [key, row] of snapshot.facts) {\n if (!affected.has(key)) continue;\n if (!isTargetKey(key)) continue;\n if (!isTargetRow(row)) continue;\n rows.push(row);\n }\n await Promise.all(rows.map((row) => action(row)));\n}\n\n/**\n * The transaction-scoped hook lifecycle fact close/reopen runs through —\n * transaction runtime's operation-hook runner. Using the\n * transaction's runner (not the store's) defers each fact's success hook\n * until the transition's COMMIT, so hooks never report a closed or reopened\n * fact that a failed commit then rolls back.\n */\ntype RunNodeOperationHooks = <T>(\n operation: \"create\" | \"update\" | \"delete\",\n kind: string,\n id: string,\n fn: () => Promise<T>,\n) => Promise<T>;\n\nasync function synchronizeFactCurrency<G extends GraphDef>(\n backend: TransactionBackend,\n store: HistoryStore<G>,\n runHooks: RunNodeOperationHooks,\n snapshot: SupportSnapshot,\n affected: ReadonlySet<string>,\n lock: GraphWriteLock,\n): Promise<void> {\n await forEachAffectedFact(\n snapshot,\n affected,\n (key) => !snapshot.supportedFactKeys.has(key),\n isLiveNodeRow,\n (row) => closeFactCurrency(backend, store, runHooks, row, lock),\n );\n await forEachAffectedFact(\n snapshot,\n affected,\n (key) => snapshot.supportedFactKeys.has(key),\n isTombstonedNodeRow,\n (row) => reopenFactCurrency(backend, store, runHooks, row, lock),\n );\n}\n\nfunction getFactRegistration<G extends GraphDef>(\n store: HistoryStore<G>,\n row: NodeRow,\n): NodeRegistration {\n const registration = store.graph.nodes[row.kind];\n if (registration !== undefined) return registration;\n throw new ConfigurationError(\n `Provenance fact kind \"${row.kind}\" is not a node kind in this graph.`,\n { kind: row.kind, graphId: store.graphId },\n );\n}\n\nasync function closeFactCurrency<G extends GraphDef>(\n backend: TransactionBackend,\n store: HistoryStore<G>,\n runHooks: RunNodeOperationHooks,\n row: LiveNodeRow,\n lock: GraphWriteLock,\n): Promise<void> {\n await runHooks(\"delete\", row.kind, row.id, async () => {\n const registration = getFactRegistration(store, row);\n // The canonical soft-delete steps (tombstone, uniqueness/embedding/\n // fulltext cleanup) WITHOUT delete-behavior enforcement: closing a\n // fact's currency is a belief-status change, not a domain delete, so\n // its connected edges neither block the close (`restrict`) nor get\n // removed (`cascade` / `disconnect`). Every edge survives untouched,\n // making a later reopen an exact inverse of this close.\n await applyNodeSoftDelete(\n createNodeWriteContext(store.graphId, store.registry, lock),\n {\n existing: row,\n schema: registration.type.schema,\n uniqueConstraints: registration.unique ?? [],\n onDelete: registration.onDelete,\n },\n backend,\n { enforceDeleteBehavior: false },\n );\n });\n}\n\nasync function reopenFactCurrency<G extends GraphDef>(\n backend: TransactionBackend,\n store: HistoryStore<G>,\n runHooks: RunNodeOperationHooks,\n row: TombstonedNodeRow,\n lock: GraphWriteLock,\n): Promise<void> {\n await runHooks(\"update\", row.kind, row.id, async () => {\n const registration = getFactRegistration(store, row);\n // The delete removed this fact's uniqueness entries, so reopen re-checks and\n // re-inserts them (rather than the diff-based update path) before clearing\n // the tombstone and re-syncing embeddings/fulltext.\n await applyNodeResurrect(\n createNodeWriteContext(store.graphId, store.registry, lock),\n {\n existing: row,\n schema: registration.type.schema,\n uniqueConstraints: registration.unique ?? [],\n },\n backend,\n );\n });\n}\n\nfunction getTransactionNodeCollection<G extends GraphDef>(\n tx: TransactionContext<G>,\n kind: string,\n): DynamicNodeCollection {\n const collection = tx.getNodeCollection(kind);\n if (collection !== undefined) return collection;\n throw new ConfigurationError(\n `Provenance source kind \"${kind}\" is not available on this transaction.`,\n { kind },\n );\n}\n\nasync function setSourceRetractionState<G extends GraphDef>(\n tx: TransactionContext<G>,\n config: NormalizedConfig,\n source: ProvenanceNodeRef,\n retracted: boolean,\n): Promise<void> {\n const collection = getTransactionNodeCollection(tx, source.kind);\n await collection.update(source.id, { [config.retractedField]: retracted });\n}\n\nasync function runTransition<\n G extends GraphDef,\n SourceKind extends NodeKind<G>,\n FactKind extends NodeKind<G>,\n JustificationKind extends NodeKind<G>,\n>(\n store: HistoryStore<G>,\n config: NormalizedConfig,\n sources: readonly ProvenanceNodeRef<G, SourceKind>[],\n retracted: boolean,\n): Promise<RetractionReport<G, FactKind, JustificationKind>> {\n const uniqueSources = uniqueNodeReferences(sources);\n for (const source of uniqueSources) {\n if (config.sourceKinds.includes(source.kind)) continue;\n throw new ConfigurationError(\n `Provenance retraction source must be one of: ${config.sourceKinds.join(\", \")}.`,\n { expectedKinds: config.sourceKinds, actualKind: source.kind },\n );\n }\n\n return store.transaction(async (tx) => {\n const backend = transactionBackend(tx);\n // Serialize the whole read-compute-write transition per graph BEFORE the\n // first read. `store.transaction` itself takes no lock (write operations\n // acquire it at their own boundaries), but a transition's support\n // snapshot must not race a concurrent transition or history write, so\n // the per-graph write lock is acquired explicitly up front. The token is\n // the evidence the currency-sync pipeline steps require.\n const lock = await lockRecordedGraphWrite(backend, store.graphId);\n const rows = await Promise.all(\n uniqueSources.map((source) =>\n backend.getNode(store.graphId, source.kind, source.id),\n ),\n );\n const sourceRows = uniqueSources.map((source, index): SourceRow<G> => {\n const sourceRow = rows[index];\n if (sourceRow === undefined || sourceRow.deleted_at !== undefined) {\n throw new NodeNotFoundError(source.kind, source.id);\n }\n return { source, row: sourceRow };\n });\n\n // Load the provenance graph once. Its structure (justifications, facts,\n // premise/derive edges) is identical before and after the transition — only\n // source availability changes — so the pre- and post-flip snapshots share\n // this read instead of scanning the whole graph twice per retraction.\n const supportGraph = await loadSupportGraph(backend, store.graphId, config);\n const availableBefore = availableSourceKeys(\n supportGraph.sourceRows,\n config.retractedField,\n );\n const before = computeSupportSnapshot(supportGraph, availableBefore);\n\n const nextState: SourceRetractedState =\n retracted ? \"retracted\" : \"available\";\n const availableAfter = new Set(availableBefore);\n for (const { source, row } of sourceRows) {\n const currentState = sourceRetractedState(row, config.retractedField);\n if (currentState === nextState) continue;\n await setSourceRetractionState(tx, config, source, retracted);\n // Mirror the flip in the in-memory availability so `after` matches the\n // source rows now persisted, without re-reading the whole graph.\n if (nextState === \"available\") {\n availableAfter.add(refKey(source));\n } else {\n availableAfter.delete(refKey(source));\n }\n }\n const after = computeSupportSnapshot(supportGraph, availableAfter);\n const affected = after.affectedFactKeys(uniqueSources);\n await synchronizeFactCurrency(\n backend,\n store,\n transactionNodeOperationHookRunner(tx),\n after,\n affected,\n lock,\n );\n return buildReport<G, FactKind, JustificationKind>(before, after, affected);\n });\n}\n\nfunction uniqueNodeReferences<\n G extends GraphDef,\n K extends NodeKind<G> = NodeKind<G>,\n>(references: readonly ProvenanceNodeRef<G, K>[]): ProvenanceNodeRef<G, K>[] {\n const byKey = new Map<string, ProvenanceNodeRef<G, K>>();\n for (const reference of references) {\n byKey.set(refKey(reference), reference);\n }\n return [...byKey.values()];\n}\n\nexport function createRetractionCapability<\n G extends GraphDef,\n const C extends ProvenanceRetractionConfig<G>,\n>(\n store: HistoryStore<G>,\n config: C,\n): RetractionCapability<\n G,\n SourceKindsFromConfig<G, C>,\n FactKindsFromConfig<G, C>,\n JustificationKindFromConfig<G, C>\n> {\n assertRetractionHistoryEnabled(store);\n const normalized = normalizeConfig(store.graph, config);\n\n // The four retract verbs differ only in one/many source shape and the target\n // retracted flag; the generics are fixed by the config, so hoist one call.\n const transition = (\n sources: readonly ProvenanceNodeRef<G, SourceKindsFromConfig<G, C>>[],\n retracted: boolean,\n ) =>\n runTransition<\n G,\n SourceKindsFromConfig<G, C>,\n FactKindsFromConfig<G, C>,\n JustificationKindFromConfig<G, C>\n >(store, normalized, sources, retracted);\n\n return {\n retract: (source) => transition([source], true),\n retractMany: (sources) => transition(sources, true),\n unRetract: (source) => transition([source], false),\n unRetractMany: (sources) => transition(sources, false),\n\n async holding() {\n return store.transaction(async (tx) => {\n const backend = transactionBackend(tx);\n // Same explicit lock as runTransition: the support computation reads\n // several relations, and PostgreSQL's READ COMMITTED gives each\n // statement its own snapshot — without the lock a concurrent\n // transition could commit between those reads and tear the view.\n await lockRecordedGraphWrite(backend, store.graphId);\n const snapshot = await computeSupport(\n backend,\n store.graphId,\n normalized,\n );\n return sortedReferences<G, FactKindsFromConfig<G, C>>(\n snapshot.believedFactKeys,\n );\n });\n },\n };\n}\n\nfunction assertRetractionHistoryEnabled(\n store: Readonly<{ historyEnabled: boolean; graphId: string }>,\n): void {\n if (!store.historyEnabled) {\n throw new ConfigurationError(\n \"createRetractionCapability requires a store created with { history: true }.\",\n { graphId: store.graphId },\n {\n suggestion:\n \"Use createStoreWithSchema(graph, backend, { history: true }) so retraction mutations are captured and queryable with asOfRecorded().\",\n },\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/provenance/index.ts"],"names":["ConfigurationError","compareStrings","rowPropsToObject","isPlainObject","validityWindowContainsInstant","nowIso","isLiveNodeRow","isTombstonedNodeRow","applyNodeSoftDelete","createNodeWriteContext","applyNodeResurrect","transactionBackend","lockRecordedGraphWrite","NodeNotFoundError","transactionNodeOperationHookRunner"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n type EdgeRow,\n type GraphReadBackend,\n isLiveNodeRow,\n isTombstonedNodeRow,\n type LiveNodeRow,\n type NodeRow,\n rowPropsToObject,\n type TombstonedNodeRow,\n type TransactionBackend,\n} from \"../backend/types\";\nimport type { GraphDef } from \"../core/define-graph\";\nimport type { NodeRegistration } from \"../core/types\";\nimport { ConfigurationError, NodeNotFoundError } from \"../errors\";\nimport {\n applyNodeResurrect,\n applyNodeSoftDelete,\n createNodeWriteContext,\n} from \"../store/operations/node-write-pipeline\";\nimport { lockRecordedGraphWrite } from \"../store/recorded-capture\";\nimport { type GraphWriteLock } from \"../store/recorded-capture/clock\";\nimport {\n transactionBackend,\n transactionNodeOperationHookRunner,\n} from \"../store/runtime-port\";\nimport type { HistoryStore } from \"../store/store\";\nimport {\n type DynamicNodeCollection,\n type TransactionContext,\n} from \"../store/types\";\nimport { compareStrings } from \"../utils/compare\";\nimport { nowIso, validityWindowContainsInstant } from \"../utils/date\";\nimport { isPlainObject } from \"../utils/object\";\n\nexport type {\n ContributionDiagnostic,\n ContributionDiagnosticState,\n ContributionRepairEntry,\n ContributionRepairResult,\n} from \"../backend/types\";\n\nconst DEFAULT_RETRACTED_FIELD = \"retracted\";\nconst KEY_SEPARATOR = \"\\u0000\";\n\ntype NodeKind<G extends GraphDef> = Extract<keyof G[\"nodes\"], string>;\ntype EdgeKind<G extends GraphDef> = Extract<keyof G[\"edges\"], string>;\n\nexport type ProvenanceNodeRef<\n G extends GraphDef = GraphDef,\n K extends NodeKind<G> = NodeKind<G>,\n> = Readonly<{\n kind: K;\n id: string;\n}>;\n\nexport type ProvenanceJustificationRef<\n G extends GraphDef = GraphDef,\n K extends NodeKind<G> = NodeKind<G>,\n> = ProvenanceNodeRef<G, K>;\nexport type ProvenanceFactRef<\n G extends GraphDef = GraphDef,\n K extends NodeKind<G> = NodeKind<G>,\n> = ProvenanceNodeRef<G, K>;\n\ntype ProvenanceSourceConfig<G extends GraphDef = GraphDef> =\n | Readonly<{\n kind: NodeKind<G>;\n retractedField?: string;\n }>\n | Readonly<{\n kinds: readonly NodeKind<G>[];\n retractedField?: string;\n }>;\n\nexport type ProvenanceRetractionConfig<G extends GraphDef = GraphDef> =\n Readonly<{\n source: ProvenanceSourceConfig<G>;\n justification: Readonly<{ kind: NodeKind<G> }>;\n fact: Readonly<{ kinds: readonly NodeKind<G>[] }>;\n premiseOf: Readonly<{ kind: EdgeKind<G> }>;\n derives: Readonly<{ kind: EdgeKind<G> }>;\n }>;\n\n/**\n * Extracts the node kind(s) referenced by a provenance role config, whether\n * declared as a single `{ kind }` or a `{ kinds }` array. Falls back to the\n * full `NodeKind<G>` union when neither shape is present (e.g. a role config\n * that also carries unrelated fields, matched structurally).\n */\ntype KindsFromRef<G extends GraphDef, Ref> =\n Ref extends Readonly<{ kind: infer K }> ? Extract<K, NodeKind<G>>\n : Ref extends Readonly<{ kinds: readonly (infer K)[] }> ?\n Extract<K, NodeKind<G>>\n : NodeKind<G>;\n\ntype SourceKindsFromConfig<\n G extends GraphDef,\n C extends ProvenanceRetractionConfig<G>,\n> = KindsFromRef<G, C[\"source\"]>;\n\ntype FactKindsFromConfig<\n G extends GraphDef,\n C extends ProvenanceRetractionConfig<G>,\n> = KindsFromRef<G, C[\"fact\"]>;\n\ntype JustificationKindFromConfig<\n G extends GraphDef,\n C extends ProvenanceRetractionConfig<G>,\n> = KindsFromRef<G, C[\"justification\"]>;\n\nexport type SurvivedVia<\n G extends GraphDef = GraphDef,\n FactKind extends NodeKind<G> = NodeKind<G>,\n JustificationKind extends NodeKind<G> = NodeKind<G>,\n> = Readonly<{\n fact: ProvenanceFactRef<G, FactKind>;\n via: readonly ProvenanceJustificationRef<G, JustificationKind>[];\n}>;\n\nexport type RetractionReport<\n G extends GraphDef = GraphDef,\n FactKind extends NodeKind<G> = NodeKind<G>,\n JustificationKind extends NodeKind<G> = NodeKind<G>,\n> = Readonly<{\n died: readonly ProvenanceFactRef<G, FactKind>[];\n survivedVia: readonly SurvivedVia<G, FactKind, JustificationKind>[];\n unaffected: readonly ProvenanceFactRef<G, FactKind>[];\n}>;\n\nexport type RetractionCapability<\n G extends GraphDef = GraphDef,\n SourceKind extends NodeKind<G> = NodeKind<G>,\n FactKind extends NodeKind<G> = NodeKind<G>,\n JustificationKind extends NodeKind<G> = NodeKind<G>,\n> = Readonly<{\n retract: (\n source: ProvenanceNodeRef<G, SourceKind>,\n ) => Promise<RetractionReport<G, FactKind, JustificationKind>>;\n retractMany: (\n sources: readonly ProvenanceNodeRef<G, SourceKind>[],\n ) => Promise<RetractionReport<G, FactKind, JustificationKind>>;\n unRetract: (\n source: ProvenanceNodeRef<G, SourceKind>,\n ) => Promise<RetractionReport<G, FactKind, JustificationKind>>;\n unRetractMany: (\n sources: readonly ProvenanceNodeRef<G, SourceKind>[],\n ) => Promise<RetractionReport<G, FactKind, JustificationKind>>;\n holding: () => Promise<readonly ProvenanceFactRef<G, FactKind>[]>;\n}>;\n\ntype NormalizedConfig = Readonly<{\n sourceKinds: readonly string[];\n retractedField: string;\n justificationKind: string;\n factKinds: readonly string[];\n premiseOfKind: string;\n derivesKind: string;\n}>;\n\ntype ProvenanceRows = Readonly<{\n justifications: ReadonlyMap<string, NodeRow>;\n facts: ReadonlyMap<string, NodeRow>;\n premiseEdges: readonly EdgeRow[];\n deriveEdges: readonly EdgeRow[];\n}>;\n\ntype SupportEdges = Readonly<{\n premisesByJustification: ReadonlyMap<string, readonly string[]>;\n factsByJustification: ReadonlyMap<string, readonly string[]>;\n justificationsByPremise: ReadonlyMap<string, readonly string[]>;\n}>;\n\ntype SupportSnapshot = Readonly<{\n facts: ReadonlyMap<string, NodeRow>;\n supportedFactKeys: ReadonlySet<string>;\n believedFactKeys: ReadonlySet<string>;\n firingJustificationKeysByFact: ReadonlyMap<string, readonly string[]>;\n affectedFactKeys: (\n sources: readonly ProvenanceNodeRef[],\n ) => ReadonlySet<string>;\n}>;\n\ntype SourceRetractedState = \"retracted\" | \"available\";\n\ntype SourceRow<G extends GraphDef> = Readonly<{\n source: ProvenanceNodeRef<G>;\n row: NodeRow;\n}>;\n\nfunction refKey(ref: ProvenanceNodeRef): string {\n return `${ref.kind}${KEY_SEPARATOR}${ref.id}`;\n}\n\nfunction rowKey(row: Pick<NodeRow, \"kind\" | \"id\">): string {\n return refKey({ kind: row.kind, id: row.id });\n}\n\nfunction edgeFromKey(edge: EdgeRow): string {\n return refKey({ kind: edge.from_kind, id: edge.from_id });\n}\n\nfunction edgeToKey(edge: EdgeRow): string {\n return refKey({ kind: edge.to_kind, id: edge.to_id });\n}\n\nfunction keyToRef<\n G extends GraphDef = GraphDef,\n K extends NodeKind<G> = NodeKind<G>,\n>(key: string): ProvenanceNodeRef<G, K> {\n const separatorIndex = key.indexOf(KEY_SEPARATOR);\n if (separatorIndex === -1) {\n throw new ConfigurationError(\n \"Invalid provenance identity key.\",\n { key },\n {\n suggestion:\n \"Report this TypeGraph provenance bug with the graph roles that produced the key.\",\n },\n );\n }\n const kind = key.slice(0, separatorIndex);\n const id = key.slice(separatorIndex + KEY_SEPARATOR.length);\n return { kind, id } as ProvenanceNodeRef<G, K>;\n}\n\nfunction sortedReferences<\n G extends GraphDef = GraphDef,\n K extends NodeKind<G> = NodeKind<G>,\n>(keys: Iterable<string>): ProvenanceNodeRef<G, K>[] {\n return [...keys]\n .toSorted((left, right) => compareStrings(left, right))\n .map((key) => keyToRef<G, K>(key));\n}\n\nfunction parseNodeProps(row: NodeRow): Record<string, unknown> {\n const parsed = rowPropsToObject(row.props) as unknown;\n if (!isPlainObject(parsed)) {\n throw new ConfigurationError(\n `Node ${row.kind}/${row.id} props are not an object.`,\n { kind: row.kind, id: row.id },\n );\n }\n return parsed;\n}\n\nfunction sourceRetractedState(\n row: NodeRow,\n retractedField: string,\n): SourceRetractedState {\n const props = parseNodeProps(row);\n const value = props[retractedField];\n if (value === undefined) return \"available\";\n if (typeof value !== \"boolean\") {\n throw new ConfigurationError(\n `Provenance source field \"${retractedField}\" must contain a boolean value.`,\n { kind: row.kind, id: row.id, field: retractedField },\n {\n suggestion:\n \"Use a source node schema with a boolean retracted flag, for example z.boolean().default(false).\",\n },\n );\n }\n return value ? \"retracted\" : \"available\";\n}\n\nfunction normalizeConfig<G extends GraphDef>(\n graph: G,\n config: ProvenanceRetractionConfig<G>,\n): NormalizedConfig {\n const sourceKinds = sourceKindsFromConfig(config.source);\n const justificationKind = config.justification.kind;\n const factKinds = [...config.fact.kinds];\n const premiseOfKind = config.premiseOf.kind;\n const derivesKind = config.derives.kind;\n const retractedField =\n config.source.retractedField ?? DEFAULT_RETRACTED_FIELD;\n\n if (sourceKinds.length === 0) {\n throw new ConfigurationError(\n \"Provenance retraction requires at least one source kind.\",\n { role: \"source\" },\n );\n }\n\n if (factKinds.length === 0) {\n throw new ConfigurationError(\n \"Provenance retraction requires at least one fact kind.\",\n { role: \"fact\" },\n );\n }\n\n const duplicateSourceKinds = duplicateValues(sourceKinds);\n if (duplicateSourceKinds.length > 0) {\n throw new ConfigurationError(\"Provenance source kinds must be unique.\", {\n duplicateSourceKinds,\n });\n }\n\n const duplicateFactKinds = duplicateValues(factKinds);\n if (duplicateFactKinds.length > 0) {\n throw new ConfigurationError(\"Provenance fact kinds must be unique.\", {\n duplicateFactKinds,\n });\n }\n\n for (const kind of sourceKinds) {\n assertKind(graph.nodes, kind, \"source\", \"node\", graph.id);\n }\n assertKind(graph.nodes, justificationKind, \"justification\", \"node\", graph.id);\n for (const kind of factKinds) {\n assertKind(graph.nodes, kind, \"fact\", \"node\", graph.id);\n }\n for (const kind of sourceKinds)\n assertSourceField(graph, kind, retractedField);\n assertKind(graph.edges, premiseOfKind, \"premiseOf\", \"edge\", graph.id);\n assertKind(graph.edges, derivesKind, \"derives\", \"edge\", graph.id);\n\n if (\n factKinds.some(\n (kind) => sourceKinds.includes(kind) || kind === justificationKind,\n )\n ) {\n throw new ConfigurationError(\n \"Provenance fact kinds must be distinct from source and justification kinds.\",\n { sourceKinds, justificationKind, factKinds },\n );\n }\n\n assertEdgeEndpoints(graph, premiseOfKind, {\n role: \"premiseOf\",\n fromKinds: sourceKinds,\n toKinds: [justificationKind],\n });\n assertEdgeEndpoints(graph, derivesKind, {\n role: \"derives\",\n fromKinds: [justificationKind],\n toKinds: factKinds,\n });\n\n return {\n sourceKinds,\n retractedField,\n justificationKind,\n factKinds,\n premiseOfKind,\n derivesKind,\n };\n}\n\nfunction sourceKindsFromConfig<G extends GraphDef>(\n source: ProvenanceSourceConfig<G>,\n): string[] {\n if (\"kinds\" in source) return [...source.kinds];\n return [source.kind];\n}\n\nfunction duplicateValues(values: readonly string[]): string[] {\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n for (const value of values) {\n if (seen.has(value)) {\n duplicates.add(value);\n continue;\n }\n seen.add(value);\n }\n return [...duplicates].toSorted((left, right) => compareStrings(left, right));\n}\n\nfunction assertKind(\n records: Readonly<Record<string, unknown>>,\n kind: string,\n role: string,\n noun: \"node\" | \"edge\",\n graphId: string,\n): void {\n if (Object.hasOwn(records, kind)) return;\n throw new ConfigurationError(\n `Provenance ${role} kind \"${kind}\" is not a ${noun} kind in this graph.`,\n { role, kind, graphId },\n );\n}\n\nfunction assertSourceField<G extends GraphDef>(\n graph: G,\n sourceKind: string,\n retractedField: string,\n): void {\n const registration = graph.nodes[sourceKind];\n if (registration === undefined) return;\n if (Object.hasOwn(registration.type.schema.shape, retractedField)) return;\n throw new ConfigurationError(\n `Provenance source kind \"${sourceKind}\" must include field \"${retractedField}\".`,\n { sourceKind, retractedField },\n {\n suggestion:\n \"Add a boolean retracted flag to the source node schema or pass source.retractedField.\",\n },\n );\n}\n\nfunction assertEdgeEndpoints<G extends GraphDef>(\n graph: G,\n edgeKind: string,\n expected: Readonly<{\n role: string;\n fromKinds: readonly string[];\n toKinds: readonly string[];\n }>,\n): void {\n const registration = graph.edges[edgeKind];\n if (registration === undefined) return;\n const fromKinds = new Set(registration.from.map((node) => node.kind));\n const toKinds = new Set(registration.to.map((node) => node.kind));\n for (const kind of expected.fromKinds) {\n if (fromKinds.has(kind)) continue;\n throw new ConfigurationError(\n `Provenance ${expected.role} edge \"${edgeKind}\" cannot start at \"${kind}\".`,\n { edgeKind, role: expected.role, expectedFrom: kind },\n );\n }\n for (const kind of expected.toKinds) {\n if (toKinds.has(kind)) continue;\n throw new ConfigurationError(\n `Provenance ${expected.role} edge \"${edgeKind}\" cannot end at \"${kind}\".`,\n { edgeKind, role: expected.role, expectedTo: kind },\n );\n }\n}\n\n/**\n * Provenance reads follow the store's currency semantics: a source,\n * justification, or support edge counts only while currently valid (the\n * default `\"current\"` read mode), so a validity-expired source no longer\n * supports anything and `holding()` agrees with the collection API about\n * which facts are currently believed. Fact rows additionally need their\n * tombstones — a reopen candidate is by definition soft-deleted — so they\n * are loaded with tombstones and filtered to the same validity instant.\n */\nasync function findNodeRows(\n backend: GraphReadBackend,\n graphId: string,\n kind: string,\n options: Readonly<{ includeTombstones: boolean; asOf: string }>,\n): Promise<readonly NodeRow[]> {\n if (options.includeTombstones) {\n const rows = await backend.findNodesByKind({\n graphId,\n kind,\n excludeDeleted: false,\n temporalMode: \"includeTombstones\",\n orderBy: \"id\",\n });\n return rows.filter((row) =>\n validityWindowContainsInstant(row.valid_from, row.valid_to, options.asOf),\n );\n }\n return backend.findNodesByKind({\n graphId,\n kind,\n excludeDeleted: true,\n temporalMode: \"current\",\n asOf: options.asOf,\n orderBy: \"id\",\n });\n}\n\nasync function findEdgeRows(\n backend: GraphReadBackend,\n graphId: string,\n kind: string,\n asOf: string,\n): Promise<readonly EdgeRow[]> {\n return backend.findEdgesByKind({\n graphId,\n kind,\n excludeDeleted: true,\n temporalMode: \"current\",\n asOf,\n orderBy: \"id\",\n });\n}\n\nasync function readRoles(\n backend: GraphReadBackend,\n graphId: string,\n config: NormalizedConfig,\n asOf: string,\n): Promise<ProvenanceRows> {\n const [justificationRows, factRowsByKind, premiseEdges, deriveEdges] =\n await Promise.all([\n findNodeRows(backend, graphId, config.justificationKind, {\n includeTombstones: false,\n asOf,\n }),\n Promise.all(\n config.factKinds.map((kind) =>\n findNodeRows(backend, graphId, kind, {\n includeTombstones: true,\n asOf,\n }),\n ),\n ),\n findEdgeRows(backend, graphId, config.premiseOfKind, asOf),\n findEdgeRows(backend, graphId, config.derivesKind, asOf),\n ]);\n const factRows = factRowsByKind.flat();\n\n return {\n justifications: rowsByKey(justificationRows),\n facts: rowsByKey(factRows),\n premiseEdges,\n deriveEdges,\n };\n}\n\nfunction rowsByKey(rows: readonly NodeRow[]): ReadonlyMap<string, NodeRow> {\n const byKey = new Map<string, NodeRow>();\n for (const row of rows) byKey.set(rowKey(row), row);\n return byKey;\n}\n\nfunction appendGroupedValue(\n groups: Map<string, string[]>,\n key: string,\n value: string,\n): void {\n const group = groups.get(key);\n if (group === undefined) {\n groups.set(key, [value]);\n return;\n }\n if (group.includes(value)) return;\n group.push(value);\n}\n\nfunction buildSupportEdges(\n config: NormalizedConfig,\n rows: ProvenanceRows,\n): SupportEdges {\n const premisesByJustification = new Map<string, string[]>();\n const factsByJustification = new Map<string, string[]>();\n const justificationsByPremise = new Map<string, string[]>();\n\n for (const edge of rows.premiseEdges) {\n if (edge.to_kind !== config.justificationKind) continue;\n if (!isPremiseKind(config, edge.from_kind)) continue;\n\n const premiseKey = edgeFromKey(edge);\n const justificationKey = edgeToKey(edge);\n appendGroupedValue(premisesByJustification, justificationKey, premiseKey);\n appendGroupedValue(justificationsByPremise, premiseKey, justificationKey);\n }\n\n for (const edge of rows.deriveEdges) {\n if (edge.from_kind !== config.justificationKind) continue;\n if (!config.factKinds.includes(edge.to_kind)) continue;\n appendGroupedValue(\n factsByJustification,\n edgeFromKey(edge),\n edgeToKey(edge),\n );\n }\n\n return {\n premisesByJustification,\n factsByJustification,\n justificationsByPremise,\n };\n}\n\n/**\n * The whole-graph read a support computation needs: the role rows, the support\n * edges derived from them, and the (non-retracted-visible) source rows. Loaded\n * once per transition so `before` and `after` snapshots share one read instead\n * of scanning the entire provenance graph twice — the graph structure is\n * identical across a transition, only source availability changes.\n */\ntype SupportGraph = Readonly<{\n roles: ProvenanceRows;\n supportEdges: SupportEdges;\n sourceRows: readonly NodeRow[];\n}>;\n\nasync function loadSupportGraph(\n backend: GraphReadBackend,\n graphId: string,\n config: NormalizedConfig,\n): Promise<SupportGraph> {\n // One read instant for every role read, so the whole snapshot shares a\n // single \"currently valid\" coordinate.\n const asOf = nowIso();\n const roles = await readRoles(backend, graphId, config, asOf);\n const supportEdges = buildSupportEdges(config, roles);\n const sourceRowsByKind = await Promise.all(\n config.sourceKinds.map((kind) =>\n findNodeRows(backend, graphId, kind, { includeTombstones: false, asOf }),\n ),\n );\n return { roles, supportEdges, sourceRows: sourceRowsByKind.flat() };\n}\n\nfunction availableSourceKeys(\n sourceRows: readonly NodeRow[],\n retractedField: string,\n): Set<string> {\n const available = new Set<string>();\n for (const row of sourceRows) {\n if (sourceRetractedState(row, retractedField) === \"available\") {\n available.add(rowKey(row));\n }\n }\n return available;\n}\n\n/**\n * The pure TMS fixpoint: given the loaded graph and the set of available\n * (non-retracted) source keys, derive which facts are supported and believed.\n * No I/O — the same {@link SupportGraph} feeds both the pre- and post-transition\n * snapshots with different availability sets.\n */\nfunction computeSupportSnapshot(\n graph: Pick<SupportGraph, \"roles\" | \"supportEdges\">,\n available: ReadonlySet<string>,\n): SupportSnapshot {\n const { roles, supportEdges } = graph;\n const supported = new Set<string>();\n const inSet = new Set<string>(available);\n const firingJustifications = new Set<string>();\n const firingJustificationKeysByFact = new Map<string, string[]>();\n\n let changed = true;\n while (changed) {\n changed = false;\n for (const [justificationKey] of roles.justifications) {\n if (firingJustifications.has(justificationKey)) continue;\n const premises =\n supportEdges.premisesByJustification.get(justificationKey) ?? [];\n if (!allPremisesSupported(premises, inSet)) continue;\n\n firingJustifications.add(justificationKey);\n const derivedFacts =\n supportEdges.factsByJustification.get(justificationKey) ?? [];\n for (const factKey of derivedFacts) {\n if (!roles.facts.has(factKey)) continue;\n appendGroupedValue(\n firingJustificationKeysByFact,\n factKey,\n justificationKey,\n );\n if (supported.has(factKey)) continue;\n supported.add(factKey);\n inSet.add(factKey);\n changed = true;\n }\n }\n }\n\n const believed = new Set<string>();\n for (const key of supported) {\n const row = roles.facts.get(key);\n if (row !== undefined && row.deleted_at === undefined) believed.add(key);\n }\n\n return {\n facts: roles.facts,\n supportedFactKeys: supported,\n believedFactKeys: believed,\n firingJustificationKeysByFact,\n affectedFactKeys(\n targets: readonly ProvenanceNodeRef[],\n ): ReadonlySet<string> {\n return computeAffectedFactKeys(targets, roles, supportEdges);\n },\n };\n}\n\nasync function computeSupport(\n backend: GraphReadBackend,\n graphId: string,\n config: NormalizedConfig,\n): Promise<SupportSnapshot> {\n const graph = await loadSupportGraph(backend, graphId, config);\n return computeSupportSnapshot(\n graph,\n availableSourceKeys(graph.sourceRows, config.retractedField),\n );\n}\n\nfunction isPremiseKind(config: NormalizedConfig, kind: string): boolean {\n return config.sourceKinds.includes(kind) || config.factKinds.includes(kind);\n}\n\nfunction allPremisesSupported(\n premises: readonly string[],\n supported: ReadonlySet<string>,\n): boolean {\n for (const premise of premises) {\n if (!supported.has(premise)) return false;\n }\n return true;\n}\n\nfunction computeAffectedFactKeys(\n sources: readonly ProvenanceNodeRef[],\n roles: ProvenanceRows,\n supportEdges: SupportEdges,\n): ReadonlySet<string> {\n const affected = new Set<string>();\n // Seed the BFS with every source at once: the union of facts reachable from\n // any source falls out of one traversal, instead of one BFS per source.\n const frontier = sources.map((source) => refKey(source));\n const seen = new Set<string>(frontier);\n\n while (frontier.length > 0) {\n const current = frontier.shift();\n if (current === undefined) continue;\n\n const justifications =\n supportEdges.justificationsByPremise.get(current) ?? [];\n for (const justificationKey of justifications) {\n const derivedFacts =\n supportEdges.factsByJustification.get(justificationKey) ?? [];\n for (const factKey of derivedFacts) {\n if (!roles.facts.has(factKey)) continue;\n affected.add(factKey);\n if (seen.has(factKey)) continue;\n seen.add(factKey);\n frontier.push(factKey);\n }\n }\n }\n\n return affected;\n}\n\nfunction buildReport<\n G extends GraphDef,\n FactKind extends NodeKind<G>,\n JustificationKind extends NodeKind<G>,\n>(\n before: SupportSnapshot,\n after: SupportSnapshot,\n affected: ReadonlySet<string>,\n): RetractionReport<G, FactKind, JustificationKind> {\n const believedBefore = [...before.believedFactKeys];\n const died = sortedReferences<G, FactKind>(\n believedBefore.filter((key) => !after.supportedFactKeys.has(key)),\n );\n const unaffected = sortedReferences<G, FactKind>(\n believedBefore.filter((key) => !affected.has(key)),\n );\n const survivedVia = [...affected]\n .filter((key) => after.supportedFactKeys.has(key))\n .toSorted((left, right) => compareStrings(left, right))\n .map((key) => ({\n fact: keyToRef<G, FactKind>(key),\n via: sortedReferences<G, JustificationKind>(\n after.firingJustificationKeysByFact.get(key) ?? [],\n ),\n }));\n return { died, survivedVia, unaffected };\n}\n\n/**\n * Brings fact currency in line with the post-transition support snapshot —\n * but only for the facts the transition could have affected (those reachable\n * from the flipped sources through justification edges). Facts outside that\n * set are never touched: an unsupported live fact elsewhere in the graph\n * (e.g. one whose justification edges have not been linked yet) is not this\n * transition's business, and silently tombstoning it would be invisible data\n * loss the report cannot even mention.\n *\n * Closes run before reopens: a reopen re-checks uniqueness, and the unique\n * key it needs may still be held by a fact this same transition is about to\n * close — closing first makes a legal transition order-independent.\n */\n/**\n * Runs `action` over every fact row in `snapshot` that is both affected by the\n * transition and matches `isTargetKey`/`isTargetRow`, concurrently — the\n * matched rows are independent facts, so there is no ordering dependency\n * within a single pass (only between the close pass and the reopen pass,\n * which the caller sequences).\n */\nasync function forEachAffectedFact<T extends NodeRow>(\n snapshot: SupportSnapshot,\n affected: ReadonlySet<string>,\n isTargetKey: (key: string) => boolean,\n isTargetRow: (row: NodeRow) => row is T,\n action: (row: T) => Promise<void>,\n): Promise<void> {\n const rows: T[] = [];\n for (const [key, row] of snapshot.facts) {\n if (!affected.has(key)) continue;\n if (!isTargetKey(key)) continue;\n if (!isTargetRow(row)) continue;\n rows.push(row);\n }\n await Promise.all(rows.map((row) => action(row)));\n}\n\n/**\n * The transaction-scoped hook lifecycle fact close/reopen runs through —\n * transaction runtime's operation-hook runner. Using the\n * transaction's runner (not the store's) defers each fact's success hook\n * until the transition's COMMIT, so hooks never report a closed or reopened\n * fact that a failed commit then rolls back.\n */\ntype RunNodeOperationHooks = <T>(\n operation: \"create\" | \"update\" | \"delete\",\n kind: string,\n id: string,\n fn: () => Promise<T>,\n) => Promise<T>;\n\nasync function synchronizeFactCurrency<G extends GraphDef>(\n backend: TransactionBackend,\n store: HistoryStore<G>,\n runHooks: RunNodeOperationHooks,\n snapshot: SupportSnapshot,\n affected: ReadonlySet<string>,\n lock: GraphWriteLock,\n): Promise<void> {\n await forEachAffectedFact(\n snapshot,\n affected,\n (key) => !snapshot.supportedFactKeys.has(key),\n isLiveNodeRow,\n (row) => closeFactCurrency(backend, store, runHooks, row, lock),\n );\n await forEachAffectedFact(\n snapshot,\n affected,\n (key) => snapshot.supportedFactKeys.has(key),\n isTombstonedNodeRow,\n (row) => reopenFactCurrency(backend, store, runHooks, row, lock),\n );\n}\n\nfunction getFactRegistration<G extends GraphDef>(\n store: HistoryStore<G>,\n row: NodeRow,\n): NodeRegistration {\n const registration = store.graph.nodes[row.kind];\n if (registration !== undefined) return registration;\n throw new ConfigurationError(\n `Provenance fact kind \"${row.kind}\" is not a node kind in this graph.`,\n { kind: row.kind, graphId: store.graphId },\n );\n}\n\nasync function closeFactCurrency<G extends GraphDef>(\n backend: TransactionBackend,\n store: HistoryStore<G>,\n runHooks: RunNodeOperationHooks,\n row: LiveNodeRow,\n lock: GraphWriteLock,\n): Promise<void> {\n await runHooks(\"delete\", row.kind, row.id, async () => {\n const registration = getFactRegistration(store, row);\n // The canonical soft-delete steps (tombstone, uniqueness/embedding/\n // fulltext cleanup) WITHOUT delete-behavior enforcement: closing a\n // fact's currency is a belief-status change, not a domain delete, so\n // its connected edges neither block the close (`restrict`) nor get\n // removed (`cascade` / `disconnect`). Every edge survives untouched,\n // making a later reopen an exact inverse of this close.\n await applyNodeSoftDelete(\n createNodeWriteContext(store.graphId, store.registry, lock),\n {\n existing: row,\n schema: registration.type.schema,\n uniqueConstraints: registration.unique ?? [],\n onDelete: registration.onDelete,\n },\n backend,\n { enforceDeleteBehavior: false },\n );\n });\n}\n\nasync function reopenFactCurrency<G extends GraphDef>(\n backend: TransactionBackend,\n store: HistoryStore<G>,\n runHooks: RunNodeOperationHooks,\n row: TombstonedNodeRow,\n lock: GraphWriteLock,\n): Promise<void> {\n await runHooks(\"update\", row.kind, row.id, async () => {\n const registration = getFactRegistration(store, row);\n // The delete removed this fact's uniqueness entries, so reopen re-checks and\n // re-inserts them (rather than the diff-based update path) before clearing\n // the tombstone and re-syncing embeddings/fulltext.\n await applyNodeResurrect(\n createNodeWriteContext(store.graphId, store.registry, lock),\n {\n existing: row,\n schema: registration.type.schema,\n uniqueConstraints: registration.unique ?? [],\n },\n backend,\n );\n });\n}\n\nfunction getTransactionNodeCollection<G extends GraphDef>(\n tx: TransactionContext<G>,\n kind: string,\n): DynamicNodeCollection {\n const collection = tx.getNodeCollection(kind);\n if (collection !== undefined) return collection;\n throw new ConfigurationError(\n `Provenance source kind \"${kind}\" is not available on this transaction.`,\n { kind },\n );\n}\n\nasync function setSourceRetractionState<G extends GraphDef>(\n tx: TransactionContext<G>,\n config: NormalizedConfig,\n source: ProvenanceNodeRef,\n retracted: boolean,\n): Promise<void> {\n const collection = getTransactionNodeCollection(tx, source.kind);\n await collection.update(source.id, { [config.retractedField]: retracted });\n}\n\nasync function runTransition<\n G extends GraphDef,\n SourceKind extends NodeKind<G>,\n FactKind extends NodeKind<G>,\n JustificationKind extends NodeKind<G>,\n>(\n store: HistoryStore<G>,\n config: NormalizedConfig,\n sources: readonly ProvenanceNodeRef<G, SourceKind>[],\n retracted: boolean,\n): Promise<RetractionReport<G, FactKind, JustificationKind>> {\n const uniqueSources = uniqueNodeReferences(sources);\n for (const source of uniqueSources) {\n if (config.sourceKinds.includes(source.kind)) continue;\n throw new ConfigurationError(\n `Provenance retraction source must be one of: ${config.sourceKinds.join(\", \")}.`,\n { expectedKinds: config.sourceKinds, actualKind: source.kind },\n );\n }\n\n return store.transaction(async (tx) => {\n const backend = transactionBackend(tx);\n // Serialize the whole read-compute-write transition per graph BEFORE the\n // first read. `store.transaction` itself takes no lock (write operations\n // acquire it at their own boundaries), but a transition's support\n // snapshot must not race a concurrent transition or history write, so\n // the per-graph write lock is acquired explicitly up front. The token is\n // the evidence the currency-sync pipeline steps require.\n const lock = await lockRecordedGraphWrite(backend, store.graphId);\n const rows = await Promise.all(\n uniqueSources.map((source) =>\n backend.getNode(store.graphId, source.kind, source.id),\n ),\n );\n const sourceRows = uniqueSources.map((source, index): SourceRow<G> => {\n const sourceRow = rows[index];\n if (sourceRow === undefined || sourceRow.deleted_at !== undefined) {\n throw new NodeNotFoundError(source.kind, source.id);\n }\n return { source, row: sourceRow };\n });\n\n // Load the provenance graph once. Its structure (justifications, facts,\n // premise/derive edges) is identical before and after the transition — only\n // source availability changes — so the pre- and post-flip snapshots share\n // this read instead of scanning the whole graph twice per retraction.\n const supportGraph = await loadSupportGraph(backend, store.graphId, config);\n const availableBefore = availableSourceKeys(\n supportGraph.sourceRows,\n config.retractedField,\n );\n const before = computeSupportSnapshot(supportGraph, availableBefore);\n\n const nextState: SourceRetractedState =\n retracted ? \"retracted\" : \"available\";\n const availableAfter = new Set(availableBefore);\n for (const { source, row } of sourceRows) {\n const currentState = sourceRetractedState(row, config.retractedField);\n if (currentState === nextState) continue;\n await setSourceRetractionState(tx, config, source, retracted);\n // Mirror the flip in the in-memory availability so `after` matches the\n // source rows now persisted, without re-reading the whole graph.\n if (nextState === \"available\") {\n availableAfter.add(refKey(source));\n } else {\n availableAfter.delete(refKey(source));\n }\n }\n const after = computeSupportSnapshot(supportGraph, availableAfter);\n const affected = after.affectedFactKeys(uniqueSources);\n await synchronizeFactCurrency(\n backend,\n store,\n transactionNodeOperationHookRunner(tx),\n after,\n affected,\n lock,\n );\n return buildReport<G, FactKind, JustificationKind>(before, after, affected);\n });\n}\n\nfunction uniqueNodeReferences<\n G extends GraphDef,\n K extends NodeKind<G> = NodeKind<G>,\n>(references: readonly ProvenanceNodeRef<G, K>[]): ProvenanceNodeRef<G, K>[] {\n const byKey = new Map<string, ProvenanceNodeRef<G, K>>();\n for (const reference of references) {\n byKey.set(refKey(reference), reference);\n }\n return [...byKey.values()];\n}\n\nexport function createRetractionCapability<\n G extends GraphDef,\n const C extends ProvenanceRetractionConfig<G>,\n>(\n store: HistoryStore<G>,\n config: C,\n): RetractionCapability<\n G,\n SourceKindsFromConfig<G, C>,\n FactKindsFromConfig<G, C>,\n JustificationKindFromConfig<G, C>\n> {\n assertRetractionHistoryEnabled(store);\n const normalized = normalizeConfig(store.graph, config);\n\n // The four retract verbs differ only in one/many source shape and the target\n // retracted flag; the generics are fixed by the config, so hoist one call.\n const transition = (\n sources: readonly ProvenanceNodeRef<G, SourceKindsFromConfig<G, C>>[],\n retracted: boolean,\n ) =>\n runTransition<\n G,\n SourceKindsFromConfig<G, C>,\n FactKindsFromConfig<G, C>,\n JustificationKindFromConfig<G, C>\n >(store, normalized, sources, retracted);\n\n return {\n retract: (source) => transition([source], true),\n retractMany: (sources) => transition(sources, true),\n unRetract: (source) => transition([source], false),\n unRetractMany: (sources) => transition(sources, false),\n\n async holding() {\n return store.transaction(async (tx) => {\n const backend = transactionBackend(tx);\n // Same explicit lock as runTransition: the support computation reads\n // several relations, and PostgreSQL's READ COMMITTED gives each\n // statement its own snapshot — without the lock a concurrent\n // transition could commit between those reads and tear the view.\n await lockRecordedGraphWrite(backend, store.graphId);\n const snapshot = await computeSupport(\n backend,\n store.graphId,\n normalized,\n );\n return sortedReferences<G, FactKindsFromConfig<G, C>>(\n snapshot.believedFactKeys,\n );\n });\n },\n };\n}\n\nfunction assertRetractionHistoryEnabled(\n store: Readonly<{ historyEnabled: boolean; graphId: string }>,\n): void {\n if (!store.historyEnabled) {\n throw new ConfigurationError(\n \"createRetractionCapability requires a store created with { history: true }.\",\n { graphId: store.graphId },\n {\n suggestion:\n \"Use createStoreWithSchema(graph, backend, { history: true }) so retraction mutations are captured and queryable with asOfRecorded().\",\n },\n );\n }\n}\n"]}
@@ -1,11 +1,11 @@
1
- import { d8 as GraphDef } from '../types-BqFZTQmV.cjs';
2
- export { u as ContributionDiagnostic, v as ContributionDiagnosticState, J as ContributionRepairEntry, K as ContributionRepairResult } from '../types-BqFZTQmV.cjs';
3
- import { b as HistoryStore } from '../store-JUVvtmR4.cjs';
1
+ import { dk as GraphDef } from '../types-CWg4dTjj.cjs';
2
+ export { y as ContributionDiagnostic, z as ContributionDiagnosticState, N as ContributionRepairEntry, O as ContributionRepairResult } from '../types-CWg4dTjj.cjs';
3
+ import { b as HistoryStore } from '../store-DR9J7JVB.cjs';
4
4
  import 'zod';
5
- import '../temporal-5GqpYCk2.cjs';
6
- import '../searchable-DHJMh_nj.cjs';
7
- import '../manager-CYaff3n3.cjs';
8
- import '../materialize-indexes-DTtAnvfY.cjs';
5
+ import '../temporal-B4Ky4wzh.cjs';
6
+ import '../searchable-C8-RrL3l.cjs';
7
+ import '../manager-D348fa6W.cjs';
8
+ import '../materialize-indexes-CrSiW_lT.cjs';
9
9
 
10
10
  type NodeKind<G extends GraphDef> = Extract<keyof G["nodes"], string>;
11
11
  type EdgeKind<G extends GraphDef> = Extract<keyof G["edges"], string>;
@@ -1,11 +1,11 @@
1
- import { d8 as GraphDef } from '../types-BqFZTQmV.js';
2
- export { u as ContributionDiagnostic, v as ContributionDiagnosticState, J as ContributionRepairEntry, K as ContributionRepairResult } from '../types-BqFZTQmV.js';
3
- import { b as HistoryStore } from '../store-UzrGvZOo.js';
1
+ import { dk as GraphDef } from '../types-CWg4dTjj.js';
2
+ export { y as ContributionDiagnostic, z as ContributionDiagnosticState, N as ContributionRepairEntry, O as ContributionRepairResult } from '../types-CWg4dTjj.js';
3
+ import { b as HistoryStore } from '../store-CTfQ9taw.js';
4
4
  import 'zod';
5
- import '../temporal-CbnLzTmM.js';
6
- import '../searchable-bpE1bBfc.js';
7
- import '../manager-D9eRT_ns.js';
8
- import '../materialize-indexes-DJ3ykH59.js';
5
+ import '../temporal-CBOrERz5.js';
6
+ import '../searchable-z4BiFfHI.js';
7
+ import '../manager-Cfg1ENj1.js';
8
+ import '../materialize-indexes-C9GG3O3C.js';
9
9
 
10
10
  type NodeKind<G extends GraphDef> = Extract<keyof G["nodes"], string>;
11
11
  type EdgeKind<G extends GraphDef> = Extract<keyof G["edges"], string>;
@@ -1,16 +1,18 @@
1
- import { transactionBackend, transactionNodeOperationHookRunner, applyNodeSoftDelete, createNodeWriteContext, applyNodeResurrect } from '../chunk-I4GAZH5Z.js';
2
- import { lockRecordedGraphWrite, compareStrings } from '../chunk-S5TERQVW.js';
3
- import '../chunk-UGHG7PGX.js';
4
- import '../chunk-NVY5CJFP.js';
5
- import { rowPropsToObject, isLiveNodeRow, isTombstonedNodeRow } from '../chunk-6LN7FIVU.js';
6
- import '../chunk-GLHXM7C4.js';
7
- import '../chunk-DZAICA5J.js';
8
- import { nowIso, validityWindowContainsInstant } from '../chunk-5K2BKEBD.js';
1
+ import { transactionBackend, transactionNodeOperationHookRunner, applyNodeSoftDelete, createNodeWriteContext, applyNodeResurrect } from '../chunk-VTJVMP4I.js';
2
+ import '../chunk-YA36ABIL.js';
3
+ import { lockRecordedGraphWrite } from '../chunk-FX5ZW6PN.js';
4
+ import '../chunk-IRPYOHRC.js';
5
+ import '../chunk-Y55DLLEG.js';
6
+ import { rowPropsToObject, isLiveNodeRow, isTombstonedNodeRow } from '../chunk-PALYTHGM.js';
7
+ import '../chunk-5LKOVCPP.js';
8
+ import '../chunk-6NKSE5AU.js';
9
+ import { nowIso, validityWindowContainsInstant } from '../chunk-K46SDNQD.js';
9
10
  import '../chunk-2EBMPJBO.js';
10
- import '../chunk-3DMMGT6S.js';
11
+ import '../chunk-46UGOVRW.js';
11
12
  import '../chunk-W6OG3HDG.js';
12
13
  import '../chunk-PC2UBAUB.js';
13
- import { ConfigurationError, NodeNotFoundError } from '../chunk-ZLONH2UD.js';
14
+ import { compareStrings } from '../chunk-HZUB5CON.js';
15
+ import { ConfigurationError, NodeNotFoundError } from '../chunk-YDEJQWOL.js';
14
16
  import '../chunk-FWJKWH6U.js';
15
17
  import { isPlainObject } from '../chunk-DYATYRY4.js';
16
18