@nicia-ai/typegraph 0.46.2 → 0.48.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 (310) hide show
  1. package/README.md +20 -1
  2. package/dist/backend/drizzle/indexes.cjs +9 -9
  3. package/dist/backend/drizzle/indexes.d.cts +1 -1
  4. package/dist/backend/drizzle/indexes.d.ts +1 -1
  5. package/dist/backend/drizzle/indexes.js +5 -5
  6. package/dist/backend/index.cjs +58 -49
  7. package/dist/backend/index.d.cts +37 -55
  8. package/dist/backend/index.d.ts +37 -55
  9. package/dist/backend/index.js +11 -10
  10. package/dist/backend/postgres/index.cjs +27 -26
  11. package/dist/backend/postgres/index.d.cts +21 -7
  12. package/dist/backend/postgres/index.d.ts +21 -7
  13. package/dist/backend/postgres/index.js +14 -13
  14. package/dist/backend/postgres/pglite-store.cjs +34 -33
  15. package/dist/backend/postgres/pglite-store.cjs.map +1 -1
  16. package/dist/backend/postgres/pglite-store.d.cts +8 -8
  17. package/dist/backend/postgres/pglite-store.d.ts +8 -8
  18. package/dist/backend/postgres/pglite-store.js +30 -29
  19. package/dist/backend/postgres/pglite-store.js.map +1 -1
  20. package/dist/backend/postgres/pglite.cjs +16 -15
  21. package/dist/backend/postgres/pglite.d.cts +3 -3
  22. package/dist/backend/postgres/pglite.d.ts +3 -3
  23. package/dist/backend/postgres/pglite.js +15 -14
  24. package/dist/backend/sqlite/index.cjs +24 -23
  25. package/dist/backend/sqlite/index.d.cts +20 -7
  26. package/dist/backend/sqlite/index.d.ts +20 -7
  27. package/dist/backend/sqlite/index.js +12 -11
  28. package/dist/backend/sqlite/libsql.cjs +19 -18
  29. package/dist/backend/sqlite/libsql.cjs.map +1 -1
  30. package/dist/backend/sqlite/libsql.d.cts +3 -3
  31. package/dist/backend/sqlite/libsql.d.ts +3 -3
  32. package/dist/backend/sqlite/libsql.js +14 -13
  33. package/dist/backend/sqlite/libsql.js.map +1 -1
  34. package/dist/backend/sqlite/local-store.cjs +35 -34
  35. package/dist/backend/sqlite/local-store.cjs.map +1 -1
  36. package/dist/backend/sqlite/local-store.d.cts +8 -8
  37. package/dist/backend/sqlite/local-store.d.ts +8 -8
  38. package/dist/backend/sqlite/local-store.js +31 -30
  39. package/dist/backend/sqlite/local-store.js.map +1 -1
  40. package/dist/backend/sqlite/local.cjs +17 -16
  41. package/dist/backend/sqlite/local.d.cts +3 -3
  42. package/dist/backend/sqlite/local.d.ts +3 -3
  43. package/dist/backend/sqlite/local.js +15 -14
  44. package/dist/{chunk-TCT66A7N.cjs → chunk-26YKDNUD.cjs} +10 -10
  45. package/dist/{chunk-TCT66A7N.cjs.map → chunk-26YKDNUD.cjs.map} +1 -1
  46. package/dist/{chunk-E4OSGBCM.cjs → chunk-2HIYYMWY.cjs} +139 -136
  47. package/dist/chunk-2HIYYMWY.cjs.map +1 -0
  48. package/dist/chunk-2QGYQBS2.cjs +161 -0
  49. package/dist/chunk-2QGYQBS2.cjs.map +1 -0
  50. package/dist/{chunk-GWXXHOLU.js → chunk-2SYZXD54.js} +21 -18
  51. package/dist/chunk-2SYZXD54.js.map +1 -0
  52. package/dist/{chunk-KA4L2NZ3.js → chunk-2TYSSBU5.js} +14 -14
  53. package/dist/{chunk-KA4L2NZ3.js.map → chunk-2TYSSBU5.js.map} +1 -1
  54. package/dist/{chunk-QOJ2L2AD.js → chunk-3DMMGT6S.js} +3 -3
  55. package/dist/{chunk-QOJ2L2AD.js.map → chunk-3DMMGT6S.js.map} +1 -1
  56. package/dist/{chunk-F36KZDFX.cjs → chunk-3FPR224C.cjs} +91 -91
  57. package/dist/{chunk-F36KZDFX.cjs.map → chunk-3FPR224C.cjs.map} +1 -1
  58. package/dist/{chunk-32UETY6S.cjs → chunk-3KOY4FH3.cjs} +207 -28
  59. package/dist/chunk-3KOY4FH3.cjs.map +1 -0
  60. package/dist/{chunk-QU7QLJA4.cjs → chunk-3U5ABFDW.cjs} +26 -26
  61. package/dist/{chunk-QU7QLJA4.cjs.map → chunk-3U5ABFDW.cjs.map} +1 -1
  62. package/dist/{chunk-RFDEYLIK.js → chunk-4WMMBDS5.js} +7 -7
  63. package/dist/chunk-4WMMBDS5.js.map +1 -0
  64. package/dist/{chunk-R7EWHKID.js → chunk-5K2BKEBD.js} +19 -145
  65. package/dist/chunk-5K2BKEBD.js.map +1 -0
  66. package/dist/chunk-5PRKMB24.cjs +124 -0
  67. package/dist/chunk-5PRKMB24.cjs.map +1 -0
  68. package/dist/chunk-6LN7FIVU.js +107 -0
  69. package/dist/chunk-6LN7FIVU.js.map +1 -0
  70. package/dist/{chunk-D6GCNNMK.cjs → chunk-6NGW27EO.cjs} +10 -10
  71. package/dist/{chunk-D6GCNNMK.cjs.map → chunk-6NGW27EO.cjs.map} +1 -1
  72. package/dist/{chunk-WHS2Y43J.js → chunk-6SWPJEYN.js} +5 -5
  73. package/dist/{chunk-WHS2Y43J.js.map → chunk-6SWPJEYN.js.map} +1 -1
  74. package/dist/{chunk-7TKNK32B.js → chunk-7SQSZN2J.js} +5 -5
  75. package/dist/{chunk-7TKNK32B.js.map → chunk-7SQSZN2J.js.map} +1 -1
  76. package/dist/{chunk-UTVQPZPN.cjs → chunk-7XUYFFR4.cjs} +20 -20
  77. package/dist/chunk-7XUYFFR4.cjs.map +1 -0
  78. package/dist/{chunk-KXSMF6PL.js → chunk-ACGSAMD3.js} +39 -34
  79. package/dist/chunk-ACGSAMD3.js.map +1 -0
  80. package/dist/{chunk-PYKF7UIL.cjs → chunk-AOSSQDVO.cjs} +13 -13
  81. package/dist/{chunk-PYKF7UIL.cjs.map → chunk-AOSSQDVO.cjs.map} +1 -1
  82. package/dist/{chunk-AT3MLMJV.js → chunk-AX6JGVTZ.js} +91 -20
  83. package/dist/chunk-AX6JGVTZ.js.map +1 -0
  84. package/dist/{chunk-WA64ZSCA.cjs → chunk-BFUOME67.cjs} +11 -11
  85. package/dist/{chunk-WA64ZSCA.cjs.map → chunk-BFUOME67.cjs.map} +1 -1
  86. package/dist/{chunk-YQ4JONWE.js → chunk-BRRP76WO.js} +401 -131
  87. package/dist/chunk-BRRP76WO.js.map +1 -0
  88. package/dist/{chunk-FCIZNUW5.js → chunk-CHAOFCHV.js} +3 -3
  89. package/dist/{chunk-FCIZNUW5.js.map → chunk-CHAOFCHV.js.map} +1 -1
  90. package/dist/chunk-CICO5GXD.cjs +12 -0
  91. package/dist/{chunk-73MWKDFK.cjs.map → chunk-CICO5GXD.cjs.map} +1 -1
  92. package/dist/{chunk-S3G5VLSW.js → chunk-CT3ZKTOF.js} +7 -6
  93. package/dist/chunk-CT3ZKTOF.js.map +1 -0
  94. package/dist/{chunk-SXWLLQ3D.js → chunk-D5R42W5D.js} +4 -4
  95. package/dist/{chunk-SXWLLQ3D.js.map → chunk-D5R42W5D.js.map} +1 -1
  96. package/dist/{chunk-BZZI7B43.cjs → chunk-DO7SAMEK.cjs} +47 -47
  97. package/dist/{chunk-BZZI7B43.cjs.map → chunk-DO7SAMEK.cjs.map} +1 -1
  98. package/dist/chunk-DZAICA5J.js +147 -0
  99. package/dist/chunk-DZAICA5J.js.map +1 -0
  100. package/dist/{chunk-2ZWM2RFH.cjs → chunk-EDN4Y4ZG.cjs} +9 -9
  101. package/dist/{chunk-2ZWM2RFH.cjs.map → chunk-EDN4Y4ZG.cjs.map} +1 -1
  102. package/dist/{chunk-A4R3H7RU.cjs → chunk-EZEEWCFJ.cjs} +264 -361
  103. package/dist/chunk-EZEEWCFJ.cjs.map +1 -0
  104. package/dist/{chunk-BEB4OFZF.cjs → chunk-FA2AFWLP.cjs} +51 -59
  105. package/dist/chunk-FA2AFWLP.cjs.map +1 -0
  106. package/dist/{chunk-ZBVZ7HXD.cjs → chunk-FQPEMEWX.cjs} +12 -12
  107. package/dist/{chunk-ZBVZ7HXD.cjs.map → chunk-FQPEMEWX.cjs.map} +1 -1
  108. package/dist/{chunk-LNIWCQR4.js → chunk-GLHXM7C4.js} +3 -3
  109. package/dist/{chunk-LNIWCQR4.js.map → chunk-GLHXM7C4.js.map} +1 -1
  110. package/dist/{chunk-6BD6ZBKT.cjs → chunk-GYEG3ZLZ.cjs} +10 -10
  111. package/dist/{chunk-6BD6ZBKT.cjs.map → chunk-GYEG3ZLZ.cjs.map} +1 -1
  112. package/dist/{chunk-A7NMUYEL.cjs → chunk-HDL2ARHX.cjs} +27 -27
  113. package/dist/{chunk-A7NMUYEL.cjs.map → chunk-HDL2ARHX.cjs.map} +1 -1
  114. package/dist/{chunk-5ZJOB5YS.js → chunk-HEV35TGT.js} +4 -4
  115. package/dist/{chunk-5ZJOB5YS.js.map → chunk-HEV35TGT.js.map} +1 -1
  116. package/dist/{chunk-LHYSY6SE.js → chunk-I4GAZH5Z.js} +186 -9
  117. package/dist/chunk-I4GAZH5Z.js.map +1 -0
  118. package/dist/{chunk-BQM5P2NO.cjs → chunk-JB6T4GLL.cjs} +260 -223
  119. package/dist/chunk-JB6T4GLL.cjs.map +1 -0
  120. package/dist/{chunk-QPOQX2DI.cjs → chunk-JFRT7S3B.cjs} +1026 -369
  121. package/dist/chunk-JFRT7S3B.cjs.map +1 -0
  122. package/dist/{chunk-JCNTKRAK.js → chunk-JONXFAPO.js} +5 -5
  123. package/dist/{chunk-JCNTKRAK.js.map → chunk-JONXFAPO.js.map} +1 -1
  124. package/dist/{chunk-WEJHA7AD.js → chunk-KF6K7TGH.js} +109 -75
  125. package/dist/chunk-KF6K7TGH.js.map +1 -0
  126. package/dist/{chunk-EDJDDY6H.js → chunk-KKBDXCLQ.js} +4 -4
  127. package/dist/{chunk-EDJDDY6H.js.map → chunk-KKBDXCLQ.js.map} +1 -1
  128. package/dist/{chunk-ZHOAZD7Q.cjs → chunk-L3LQNR34.cjs} +161 -161
  129. package/dist/{chunk-ZHOAZD7Q.cjs.map → chunk-L3LQNR34.cjs.map} +1 -1
  130. package/dist/{chunk-AF3TWL5C.cjs → chunk-LRQKXRXO.cjs} +4 -4
  131. package/dist/{chunk-AF3TWL5C.cjs.map → chunk-LRQKXRXO.cjs.map} +1 -1
  132. package/dist/chunk-MKJ4KXL5.cjs +12 -0
  133. package/dist/{chunk-6LAXM4J2.cjs.map → chunk-MKJ4KXL5.cjs.map} +1 -1
  134. package/dist/{chunk-KCH7WQA5.cjs → chunk-MRDBBHIZ.cjs} +48 -2
  135. package/dist/chunk-MRDBBHIZ.cjs.map +1 -0
  136. package/dist/{chunk-FXNHZFZV.js → chunk-MYKHJI2J.js} +3 -3
  137. package/dist/{chunk-FXNHZFZV.js.map → chunk-MYKHJI2J.js.map} +1 -1
  138. package/dist/{chunk-Z43KWLZF.js → chunk-NACVVDWB.js} +213 -12
  139. package/dist/chunk-NACVVDWB.js.map +1 -0
  140. package/dist/{chunk-72WUT4GG.js → chunk-NVY5CJFP.js} +4 -4
  141. package/dist/{chunk-72WUT4GG.js.map → chunk-NVY5CJFP.js.map} +1 -1
  142. package/dist/{chunk-WYFB7BN3.js → chunk-OD4SSY2U.js} +166 -48
  143. package/dist/chunk-OD4SSY2U.js.map +1 -0
  144. package/dist/{chunk-ZIH42CRX.cjs → chunk-OI2GQ25X.cjs} +7 -7
  145. package/dist/{chunk-ZIH42CRX.cjs.map → chunk-OI2GQ25X.cjs.map} +1 -1
  146. package/dist/{chunk-AU3IJNNP.js → chunk-OMZ37BM2.js} +5 -5
  147. package/dist/{chunk-AU3IJNNP.js.map → chunk-OMZ37BM2.js.map} +1 -1
  148. package/dist/{chunk-C4DYN2SD.cjs → chunk-OORXGFL5.cjs} +48 -48
  149. package/dist/{chunk-C4DYN2SD.cjs.map → chunk-OORXGFL5.cjs.map} +1 -1
  150. package/dist/{chunk-HNYLMPQQ.cjs → chunk-OTUPEF2W.cjs} +149 -78
  151. package/dist/chunk-OTUPEF2W.cjs.map +1 -0
  152. package/dist/{chunk-BRN3RGD2.js → chunk-OVI7IXYX.js} +3 -3
  153. package/dist/{chunk-BRN3RGD2.js.map → chunk-OVI7IXYX.js.map} +1 -1
  154. package/dist/{chunk-WMKEGJG4.js → chunk-P6YLZTRE.js} +3 -3
  155. package/dist/{chunk-WMKEGJG4.js.map → chunk-P6YLZTRE.js.map} +1 -1
  156. package/dist/{chunk-C2ZP5YS6.cjs → chunk-PFBRJBUL.cjs} +278 -160
  157. package/dist/chunk-PFBRJBUL.cjs.map +1 -0
  158. package/dist/{chunk-EJSYWAEV.js → chunk-QTD6HX4O.js} +5 -5
  159. package/dist/{chunk-EJSYWAEV.js.map → chunk-QTD6HX4O.js.map} +1 -1
  160. package/dist/{chunk-JL5UEBWT.cjs → chunk-ROR5ZR6A.cjs} +45 -45
  161. package/dist/{chunk-JL5UEBWT.cjs.map → chunk-ROR5ZR6A.cjs.map} +1 -1
  162. package/dist/{chunk-EDHV4CBU.js → chunk-S5TERQVW.js} +37 -134
  163. package/dist/chunk-S5TERQVW.js.map +1 -0
  164. package/dist/{chunk-FSLTU57P.js → chunk-SDBBMD4N.js} +3 -3
  165. package/dist/{chunk-FSLTU57P.js.map → chunk-SDBBMD4N.js.map} +1 -1
  166. package/dist/{chunk-36LIJXWC.js → chunk-SHFBB23Q.js} +4 -4
  167. package/dist/{chunk-36LIJXWC.js.map → chunk-SHFBB23Q.js.map} +1 -1
  168. package/dist/chunk-SIT26LAZ.cjs +614 -0
  169. package/dist/chunk-SIT26LAZ.cjs.map +1 -0
  170. package/dist/{chunk-C6KE2HSQ.cjs → chunk-SR725PWF.cjs} +1662 -1392
  171. package/dist/chunk-SR725PWF.cjs.map +1 -0
  172. package/dist/{chunk-S7WIRFNS.cjs → chunk-TKZXMWQF.cjs} +13 -12
  173. package/dist/chunk-TKZXMWQF.cjs.map +1 -0
  174. package/dist/{chunk-5PDSCELM.cjs → chunk-TQHGE7UC.cjs} +29 -164
  175. package/dist/chunk-TQHGE7UC.cjs.map +1 -0
  176. package/dist/{chunk-XBHRKLZU.cjs → chunk-TUNPBZY3.cjs} +4 -4
  177. package/dist/{chunk-XBHRKLZU.cjs.map → chunk-TUNPBZY3.cjs.map} +1 -1
  178. package/dist/{chunk-KOAI3KIV.cjs → chunk-TZEGUG6D.cjs} +4 -4
  179. package/dist/{chunk-KOAI3KIV.cjs.map → chunk-TZEGUG6D.cjs.map} +1 -1
  180. package/dist/chunk-UGHG7PGX.js +592 -0
  181. package/dist/chunk-UGHG7PGX.js.map +1 -0
  182. package/dist/{chunk-N3QTGPC7.cjs → chunk-UMGZDVOA.cjs} +303 -101
  183. package/dist/chunk-UMGZDVOA.cjs.map +1 -0
  184. package/dist/{chunk-RHDOAQCT.cjs → chunk-WCCATHMB.cjs} +140 -135
  185. package/dist/chunk-WCCATHMB.cjs.map +1 -0
  186. package/dist/{chunk-DYPRZ53S.cjs → chunk-WODMN3Q2.cjs} +27 -27
  187. package/dist/{chunk-DYPRZ53S.cjs.map → chunk-WODMN3Q2.cjs.map} +1 -1
  188. package/dist/{chunk-OZJCH7ZS.js → chunk-XVWOYKIK.js} +3 -3
  189. package/dist/{chunk-OZJCH7ZS.js.map → chunk-XVWOYKIK.js.map} +1 -1
  190. package/dist/{chunk-IHRDX7K6.js → chunk-YIURNGXI.js} +46 -56
  191. package/dist/chunk-YIURNGXI.js.map +1 -0
  192. package/dist/{chunk-GWUWRZXW.js → chunk-YVF2EM7B.js} +3 -3
  193. package/dist/{chunk-GWUWRZXW.js.map → chunk-YVF2EM7B.js.map} +1 -1
  194. package/dist/{chunk-EAMVXR5B.js → chunk-ZDKTPBGV.js} +4 -4
  195. package/dist/{chunk-EAMVXR5B.js.map → chunk-ZDKTPBGV.js.map} +1 -1
  196. package/dist/{chunk-A2LJG5GM.js → chunk-ZFMCDJGB.js} +803 -148
  197. package/dist/chunk-ZFMCDJGB.js.map +1 -0
  198. package/dist/{chunk-62ZXBMSD.js → chunk-ZLONH2UD.js} +46 -3
  199. package/dist/chunk-ZLONH2UD.js.map +1 -0
  200. package/dist/core/index.cjs +28 -27
  201. package/dist/core/index.d.cts +4 -4
  202. package/dist/core/index.d.ts +4 -4
  203. package/dist/core/index.js +8 -7
  204. package/dist/ddl-BL1NZLMY.d.cts +78 -0
  205. package/dist/ddl-D_oW-EVO.d.ts +78 -0
  206. package/dist/graph-extension/index.cjs +20 -20
  207. package/dist/graph-extension/index.d.cts +4 -4
  208. package/dist/graph-extension/index.d.ts +4 -4
  209. package/dist/graph-extension/index.js +4 -4
  210. package/dist/graph-merge/index.cjs +3418 -706
  211. package/dist/graph-merge/index.cjs.map +1 -1
  212. package/dist/graph-merge/index.d.cts +550 -58
  213. package/dist/graph-merge/index.d.ts +550 -58
  214. package/dist/graph-merge/index.js +3191 -497
  215. package/dist/graph-merge/index.js.map +1 -1
  216. package/dist/{index-Deyu8IXL.d.ts → index-COs_z6nV.d.cts} +47 -3
  217. package/dist/{index-DrRS51Ld.d.cts → index-D7d1u2gr.d.ts} +47 -3
  218. package/dist/index.cjs +233 -216
  219. package/dist/index.cjs.map +1 -1
  220. package/dist/index.d.cts +12 -12
  221. package/dist/index.d.ts +12 -12
  222. package/dist/index.js +35 -34
  223. package/dist/index.js.map +1 -1
  224. package/dist/indexes/index.cjs +13 -13
  225. package/dist/indexes/index.d.cts +4 -4
  226. package/dist/indexes/index.d.ts +4 -4
  227. package/dist/indexes/index.js +6 -6
  228. package/dist/interchange/index.cjs +53 -52
  229. package/dist/interchange/index.cjs.map +1 -1
  230. package/dist/interchange/index.d.cts +17 -13
  231. package/dist/interchange/index.d.ts +17 -13
  232. package/dist/interchange/index.js +17 -16
  233. package/dist/interchange/index.js.map +1 -1
  234. package/dist/{manager-ptr3JLRP.d.cts → manager-CYaff3n3.d.cts} +2 -2
  235. package/dist/{manager-DX983gJ0.d.ts → manager-D9eRT_ns.d.ts} +2 -2
  236. package/dist/{materialize-indexes-CpXoggWU.d.ts → materialize-indexes-DJ3ykH59.d.ts} +1 -1
  237. package/dist/{materialize-indexes-BXz77YqO.d.cts → materialize-indexes-DTtAnvfY.d.cts} +1 -1
  238. package/dist/{postgres-DwgEXSPI.d.cts → postgres-CcL4bAHS.d.ts} +1 -1
  239. package/dist/{postgres-QdOMHTBz.d.ts → postgres-DMj39MEu.d.cts} +1 -1
  240. package/dist/profiler/index.d.cts +9 -9
  241. package/dist/profiler/index.d.ts +9 -9
  242. package/dist/provenance/index.cjs +46 -46
  243. package/dist/provenance/index.cjs.map +1 -1
  244. package/dist/provenance/index.d.cts +7 -7
  245. package/dist/provenance/index.d.ts +7 -7
  246. package/dist/provenance/index.js +13 -13
  247. package/dist/provenance/index.js.map +1 -1
  248. package/dist/repair-validity-windows-BFNZvd_H.d.cts +166 -0
  249. package/dist/repair-validity-windows-DlUSqwCg.d.ts +166 -0
  250. package/dist/schema/index.cjs +45 -44
  251. package/dist/schema/index.d.cts +6 -6
  252. package/dist/schema/index.d.ts +6 -6
  253. package/dist/schema/index.js +18 -17
  254. package/dist/{searchable-BOUuA83f.d.ts → searchable-DHJMh_nj.d.cts} +1 -1
  255. package/dist/{searchable-BrUh0pdc.d.cts → searchable-bpE1bBfc.d.ts} +1 -1
  256. package/dist/{sqlite-BfYcV61E.d.cts → sqlite-D7Oz0SQh.d.ts} +1 -1
  257. package/dist/{sqlite-DK40XVR1.d.ts → sqlite-YppHrNFb.d.cts} +1 -1
  258. package/dist/{store-FTqBpuJD.d.cts → store-JUVvtmR4.d.cts} +228 -92
  259. package/dist/{store-Bo1psfVZ.d.ts → store-UzrGvZOo.d.ts} +228 -92
  260. package/dist/{temporal-DPtn0HOu.d.ts → temporal-5GqpYCk2.d.cts} +1 -1
  261. package/dist/{temporal-CXewwLTB.d.cts → temporal-CbnLzTmM.d.ts} +1 -1
  262. package/dist/{types-Du78EvpN.d.ts → types-BqFZTQmV.d.cts} +60 -9
  263. package/dist/{types-Du78EvpN.d.cts → types-BqFZTQmV.d.ts} +60 -9
  264. package/dist/{types-CeT7xM4M.d.ts → types-Bx74kaTt.d.ts} +1 -1
  265. package/dist/{types-XR1nHERK.d.cts → types-CXAhpW-c.d.cts} +1 -1
  266. package/dist/{where-CJsp-YUf.d.cts → where-DI_Fqz-X.d.cts} +1 -1
  267. package/dist/{where-CMbFiWwp.d.ts → where-O-k2wgYm.d.ts} +1 -1
  268. package/package.json +1 -1
  269. package/dist/chunk-32UETY6S.cjs.map +0 -1
  270. package/dist/chunk-5PDSCELM.cjs.map +0 -1
  271. package/dist/chunk-62ZXBMSD.js.map +0 -1
  272. package/dist/chunk-6LAXM4J2.cjs +0 -12
  273. package/dist/chunk-73MWKDFK.cjs +0 -12
  274. package/dist/chunk-A2LJG5GM.js.map +0 -1
  275. package/dist/chunk-A4R3H7RU.cjs.map +0 -1
  276. package/dist/chunk-ANKOXPCC.cjs +0 -267
  277. package/dist/chunk-ANKOXPCC.cjs.map +0 -1
  278. package/dist/chunk-AT3MLMJV.js.map +0 -1
  279. package/dist/chunk-BEB4OFZF.cjs.map +0 -1
  280. package/dist/chunk-BQM5P2NO.cjs.map +0 -1
  281. package/dist/chunk-C2ZP5YS6.cjs.map +0 -1
  282. package/dist/chunk-C6KE2HSQ.cjs.map +0 -1
  283. package/dist/chunk-DSAWGCMP.js +0 -254
  284. package/dist/chunk-DSAWGCMP.js.map +0 -1
  285. package/dist/chunk-E4OSGBCM.cjs.map +0 -1
  286. package/dist/chunk-EDHV4CBU.js.map +0 -1
  287. package/dist/chunk-FA6Z7B5L.js +0 -244
  288. package/dist/chunk-FA6Z7B5L.js.map +0 -1
  289. package/dist/chunk-GVAMRRZR.cjs +0 -268
  290. package/dist/chunk-GVAMRRZR.cjs.map +0 -1
  291. package/dist/chunk-GWXXHOLU.js.map +0 -1
  292. package/dist/chunk-HNYLMPQQ.cjs.map +0 -1
  293. package/dist/chunk-IHRDX7K6.js.map +0 -1
  294. package/dist/chunk-KCH7WQA5.cjs.map +0 -1
  295. package/dist/chunk-KXSMF6PL.js.map +0 -1
  296. package/dist/chunk-LHYSY6SE.js.map +0 -1
  297. package/dist/chunk-N3QTGPC7.cjs.map +0 -1
  298. package/dist/chunk-QPOQX2DI.cjs.map +0 -1
  299. package/dist/chunk-R7EWHKID.js.map +0 -1
  300. package/dist/chunk-RFDEYLIK.js.map +0 -1
  301. package/dist/chunk-RHDOAQCT.cjs.map +0 -1
  302. package/dist/chunk-S3G5VLSW.js.map +0 -1
  303. package/dist/chunk-S7WIRFNS.cjs.map +0 -1
  304. package/dist/chunk-UTVQPZPN.cjs.map +0 -1
  305. package/dist/chunk-WEJHA7AD.js.map +0 -1
  306. package/dist/chunk-WYFB7BN3.js.map +0 -1
  307. package/dist/chunk-YQ4JONWE.js.map +0 -1
  308. package/dist/chunk-Z43KWLZF.js.map +0 -1
  309. package/dist/ddl-mE07h_EM.d.cts +0 -38
  310. package/dist/ddl-opIn8DfX.d.ts +0 -38
@@ -1,17 +1,18 @@
1
1
  'use strict';
2
2
 
3
- var chunk32UETY6S_cjs = require('../chunk-32UETY6S.cjs');
4
- var chunkA4R3H7RU_cjs = require('../chunk-A4R3H7RU.cjs');
5
- require('../chunk-GVAMRRZR.cjs');
6
- require('../chunk-QU7QLJA4.cjs');
7
- var chunkANKOXPCC_cjs = require('../chunk-ANKOXPCC.cjs');
8
- require('../chunk-ZBVZ7HXD.cjs');
9
- var chunk5PDSCELM_cjs = require('../chunk-5PDSCELM.cjs');
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');
10
11
  require('../chunk-NAUA4PW5.cjs');
11
- require('../chunk-2ZWM2RFH.cjs');
12
+ require('../chunk-EDN4Y4ZG.cjs');
12
13
  require('../chunk-RT5ZY4XA.cjs');
13
14
  require('../chunk-HAHNRASW.cjs');
14
- var chunkKCH7WQA5_cjs = require('../chunk-KCH7WQA5.cjs');
15
+ var chunkMRDBBHIZ_cjs = require('../chunk-MRDBBHIZ.cjs');
15
16
  require('../chunk-A7J2YDDI.cjs');
16
17
  var chunkN66HCGCY_cjs = require('../chunk-N66HCGCY.cjs');
17
18
 
@@ -33,7 +34,7 @@ function edgeToKey(edge) {
33
34
  function keyToRef(key) {
34
35
  const separatorIndex = key.indexOf(KEY_SEPARATOR);
35
36
  if (separatorIndex === -1) {
36
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
37
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
37
38
  "Invalid provenance identity key.",
38
39
  { key },
39
40
  {
@@ -46,12 +47,12 @@ function keyToRef(key) {
46
47
  return { kind, id };
47
48
  }
48
49
  function sortedReferences(keys) {
49
- return [...keys].toSorted((left, right) => chunkA4R3H7RU_cjs.compareStrings(left, right)).map((key) => keyToRef(key));
50
+ return [...keys].toSorted((left, right) => chunkEZEEWCFJ_cjs.compareStrings(left, right)).map((key) => keyToRef(key));
50
51
  }
51
52
  function parseNodeProps(row) {
52
- const parsed = chunkANKOXPCC_cjs.rowPropsToObject(row.props);
53
+ const parsed = chunk5PRKMB24_cjs.rowPropsToObject(row.props);
53
54
  if (!chunkN66HCGCY_cjs.isPlainObject(parsed)) {
54
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
55
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
55
56
  `Node ${row.kind}/${row.id} props are not an object.`,
56
57
  { kind: row.kind, id: row.id }
57
58
  );
@@ -63,7 +64,7 @@ function sourceRetractedState(row, retractedField) {
63
64
  const value = props[retractedField];
64
65
  if (value === void 0) return "available";
65
66
  if (typeof value !== "boolean") {
66
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
67
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
67
68
  `Provenance source field "${retractedField}" must contain a boolean value.`,
68
69
  { kind: row.kind, id: row.id, field: retractedField },
69
70
  {
@@ -81,26 +82,26 @@ function normalizeConfig(graph, config) {
81
82
  const derivesKind = config.derives.kind;
82
83
  const retractedField = config.source.retractedField ?? DEFAULT_RETRACTED_FIELD;
83
84
  if (sourceKinds.length === 0) {
84
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
85
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
85
86
  "Provenance retraction requires at least one source kind.",
86
87
  { role: "source" }
87
88
  );
88
89
  }
89
90
  if (factKinds.length === 0) {
90
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
91
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
91
92
  "Provenance retraction requires at least one fact kind.",
92
93
  { role: "fact" }
93
94
  );
94
95
  }
95
96
  const duplicateSourceKinds = duplicateValues(sourceKinds);
96
97
  if (duplicateSourceKinds.length > 0) {
97
- throw new chunkKCH7WQA5_cjs.ConfigurationError("Provenance source kinds must be unique.", {
98
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError("Provenance source kinds must be unique.", {
98
99
  duplicateSourceKinds
99
100
  });
100
101
  }
101
102
  const duplicateFactKinds = duplicateValues(factKinds);
102
103
  if (duplicateFactKinds.length > 0) {
103
- throw new chunkKCH7WQA5_cjs.ConfigurationError("Provenance fact kinds must be unique.", {
104
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError("Provenance fact kinds must be unique.", {
104
105
  duplicateFactKinds
105
106
  });
106
107
  }
@@ -118,7 +119,7 @@ function normalizeConfig(graph, config) {
118
119
  if (factKinds.some(
119
120
  (kind) => sourceKinds.includes(kind) || kind === justificationKind
120
121
  )) {
121
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
122
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
122
123
  "Provenance fact kinds must be distinct from source and justification kinds.",
123
124
  { sourceKinds, justificationKind, factKinds }
124
125
  );
@@ -156,11 +157,11 @@ function duplicateValues(values) {
156
157
  }
157
158
  seen.add(value);
158
159
  }
159
- return [...duplicates].toSorted((left, right) => chunkA4R3H7RU_cjs.compareStrings(left, right));
160
+ return [...duplicates].toSorted((left, right) => chunkEZEEWCFJ_cjs.compareStrings(left, right));
160
161
  }
161
162
  function assertKind(records, kind, role, noun, graphId) {
162
163
  if (Object.hasOwn(records, kind)) return;
163
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
164
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
164
165
  `Provenance ${role} kind "${kind}" is not a ${noun} kind in this graph.`,
165
166
  { role, kind, graphId }
166
167
  );
@@ -169,7 +170,7 @@ function assertSourceField(graph, sourceKind, retractedField) {
169
170
  const registration = graph.nodes[sourceKind];
170
171
  if (registration === void 0) return;
171
172
  if (Object.hasOwn(registration.type.schema.shape, retractedField)) return;
172
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
173
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
173
174
  `Provenance source kind "${sourceKind}" must include field "${retractedField}".`,
174
175
  { sourceKind, retractedField },
175
176
  {
@@ -184,22 +185,19 @@ function assertEdgeEndpoints(graph, edgeKind, expected) {
184
185
  const toKinds = new Set(registration.to.map((node) => node.kind));
185
186
  for (const kind of expected.fromKinds) {
186
187
  if (fromKinds.has(kind)) continue;
187
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
188
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
188
189
  `Provenance ${expected.role} edge "${edgeKind}" cannot start at "${kind}".`,
189
190
  { edgeKind, role: expected.role, expectedFrom: kind }
190
191
  );
191
192
  }
192
193
  for (const kind of expected.toKinds) {
193
194
  if (toKinds.has(kind)) continue;
194
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
195
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
195
196
  `Provenance ${expected.role} edge "${edgeKind}" cannot end at "${kind}".`,
196
197
  { edgeKind, role: expected.role, expectedTo: kind }
197
198
  );
198
199
  }
199
200
  }
200
- function isValidAt(row, asOf) {
201
- return (row.valid_from === void 0 || row.valid_from <= asOf) && (row.valid_to === void 0 || row.valid_to > asOf);
202
- }
203
201
  async function findNodeRows(backend, graphId, kind, options) {
204
202
  if (options.includeTombstones) {
205
203
  const rows = await backend.findNodesByKind({
@@ -209,7 +207,9 @@ async function findNodeRows(backend, graphId, kind, options) {
209
207
  temporalMode: "includeTombstones",
210
208
  orderBy: "id"
211
209
  });
212
- return rows.filter((row) => isValidAt(row, options.asOf));
210
+ return rows.filter(
211
+ (row) => chunkTQHGE7UC_cjs.validityWindowContainsInstant(row.valid_from, row.valid_to, options.asOf)
212
+ );
213
213
  }
214
214
  return backend.findNodesByKind({
215
215
  graphId,
@@ -297,7 +297,7 @@ function buildSupportEdges(config, rows) {
297
297
  };
298
298
  }
299
299
  async function loadSupportGraph(backend, graphId, config) {
300
- const asOf = chunk5PDSCELM_cjs.nowIso();
300
+ const asOf = chunkTQHGE7UC_cjs.nowIso();
301
301
  const roles = await readRoles(backend, graphId, config, asOf);
302
302
  const supportEdges = buildSupportEdges(config, roles);
303
303
  const sourceRowsByKind = await Promise.all(
@@ -405,7 +405,7 @@ function buildReport(before, after, affected) {
405
405
  const unaffected = sortedReferences(
406
406
  believedBefore.filter((key) => !affected.has(key))
407
407
  );
408
- const survivedVia = [...affected].filter((key) => after.supportedFactKeys.has(key)).toSorted((left, right) => chunkA4R3H7RU_cjs.compareStrings(left, right)).map((key) => ({
408
+ const survivedVia = [...affected].filter((key) => after.supportedFactKeys.has(key)).toSorted((left, right) => chunkEZEEWCFJ_cjs.compareStrings(left, right)).map((key) => ({
409
409
  fact: keyToRef(key),
410
410
  via: sortedReferences(
411
411
  after.firingJustificationKeysByFact.get(key) ?? []
@@ -428,21 +428,21 @@ async function synchronizeFactCurrency(backend, store, runHooks, snapshot, affec
428
428
  snapshot,
429
429
  affected,
430
430
  (key) => !snapshot.supportedFactKeys.has(key),
431
- chunkANKOXPCC_cjs.isLiveNodeRow,
431
+ chunk5PRKMB24_cjs.isLiveNodeRow,
432
432
  (row) => closeFactCurrency(backend, store, runHooks, row, lock)
433
433
  );
434
434
  await forEachAffectedFact(
435
435
  snapshot,
436
436
  affected,
437
437
  (key) => snapshot.supportedFactKeys.has(key),
438
- chunkANKOXPCC_cjs.isTombstonedNodeRow,
438
+ chunk5PRKMB24_cjs.isTombstonedNodeRow,
439
439
  (row) => reopenFactCurrency(backend, store, runHooks, row, lock)
440
440
  );
441
441
  }
442
442
  function getFactRegistration(store, row) {
443
443
  const registration = store.graph.nodes[row.kind];
444
444
  if (registration !== void 0) return registration;
445
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
445
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
446
446
  `Provenance fact kind "${row.kind}" is not a node kind in this graph.`,
447
447
  { kind: row.kind, graphId: store.graphId }
448
448
  );
@@ -450,8 +450,8 @@ function getFactRegistration(store, row) {
450
450
  async function closeFactCurrency(backend, store, runHooks, row, lock) {
451
451
  await runHooks("delete", row.kind, row.id, async () => {
452
452
  const registration = getFactRegistration(store, row);
453
- await chunk32UETY6S_cjs.applyNodeSoftDelete(
454
- chunk32UETY6S_cjs.createNodeWriteContext(store.graphId, store.registry, lock),
453
+ await chunk3KOY4FH3_cjs.applyNodeSoftDelete(
454
+ chunk3KOY4FH3_cjs.createNodeWriteContext(store.graphId, store.registry, lock),
455
455
  {
456
456
  existing: row,
457
457
  schema: registration.type.schema,
@@ -466,8 +466,8 @@ async function closeFactCurrency(backend, store, runHooks, row, lock) {
466
466
  async function reopenFactCurrency(backend, store, runHooks, row, lock) {
467
467
  await runHooks("update", row.kind, row.id, async () => {
468
468
  const registration = getFactRegistration(store, row);
469
- await chunk32UETY6S_cjs.applyNodeResurrect(
470
- chunk32UETY6S_cjs.createNodeWriteContext(store.graphId, store.registry, lock),
469
+ await chunk3KOY4FH3_cjs.applyNodeResurrect(
470
+ chunk3KOY4FH3_cjs.createNodeWriteContext(store.graphId, store.registry, lock),
471
471
  {
472
472
  existing: row,
473
473
  schema: registration.type.schema,
@@ -480,7 +480,7 @@ async function reopenFactCurrency(backend, store, runHooks, row, lock) {
480
480
  function getTransactionNodeCollection(tx, kind) {
481
481
  const collection = tx.getNodeCollection(kind);
482
482
  if (collection !== void 0) return collection;
483
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
483
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
484
484
  `Provenance source kind "${kind}" is not available on this transaction.`,
485
485
  { kind }
486
486
  );
@@ -493,14 +493,14 @@ async function runTransition(store, config, sources, retracted) {
493
493
  const uniqueSources = uniqueNodeReferences(sources);
494
494
  for (const source of uniqueSources) {
495
495
  if (config.sourceKinds.includes(source.kind)) continue;
496
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
496
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
497
497
  `Provenance retraction source must be one of: ${config.sourceKinds.join(", ")}.`,
498
498
  { expectedKinds: config.sourceKinds, actualKind: source.kind }
499
499
  );
500
500
  }
501
501
  return store.transaction(async (tx) => {
502
- const backend = chunk32UETY6S_cjs.transactionBackend(tx);
503
- const lock = await chunkA4R3H7RU_cjs.lockRecordedGraphWrite(backend, store.graphId);
502
+ const backend = chunk3KOY4FH3_cjs.transactionBackend(tx);
503
+ const lock = await chunkEZEEWCFJ_cjs.lockRecordedGraphWrite(backend, store.graphId);
504
504
  const rows = await Promise.all(
505
505
  uniqueSources.map(
506
506
  (source) => backend.getNode(store.graphId, source.kind, source.id)
@@ -509,7 +509,7 @@ async function runTransition(store, config, sources, retracted) {
509
509
  const sourceRows = uniqueSources.map((source, index) => {
510
510
  const sourceRow = rows[index];
511
511
  if (sourceRow === void 0 || sourceRow.deleted_at !== void 0) {
512
- throw new chunkKCH7WQA5_cjs.NodeNotFoundError(source.kind, source.id);
512
+ throw new chunkMRDBBHIZ_cjs.NodeNotFoundError(source.kind, source.id);
513
513
  }
514
514
  return { source, row: sourceRow };
515
515
  });
@@ -536,7 +536,7 @@ async function runTransition(store, config, sources, retracted) {
536
536
  await synchronizeFactCurrency(
537
537
  backend,
538
538
  store,
539
- chunk32UETY6S_cjs.transactionNodeOperationHookRunner(tx),
539
+ chunk3KOY4FH3_cjs.transactionNodeOperationHookRunner(tx),
540
540
  after,
541
541
  affected,
542
542
  lock
@@ -562,8 +562,8 @@ function createRetractionCapability(store, config) {
562
562
  unRetractMany: (sources) => transition(sources, false),
563
563
  async holding() {
564
564
  return store.transaction(async (tx) => {
565
- const backend = chunk32UETY6S_cjs.transactionBackend(tx);
566
- await chunkA4R3H7RU_cjs.lockRecordedGraphWrite(backend, store.graphId);
565
+ const backend = chunk3KOY4FH3_cjs.transactionBackend(tx);
566
+ await chunkEZEEWCFJ_cjs.lockRecordedGraphWrite(backend, store.graphId);
567
567
  const snapshot = await computeSupport(
568
568
  backend,
569
569
  store.graphId,
@@ -578,7 +578,7 @@ function createRetractionCapability(store, config) {
578
578
  }
579
579
  function assertRetractionHistoryEnabled(store) {
580
580
  if (!store.historyEnabled) {
581
- throw new chunkKCH7WQA5_cjs.ConfigurationError(
581
+ throw new chunkMRDBBHIZ_cjs.ConfigurationError(
582
582
  "createRetractionCapability requires a store created with { history: true }.",
583
583
  { graphId: store.graphId },
584
584
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/provenance/index.ts"],"names":["ConfigurationError","compareStrings","rowPropsToObject","isPlainObject","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 } 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 * Whether a row's validity window contains `asOf`. The JS mirror of the SQL\n * `\"current\"`-mode predicate, for role reads that must include tombstoned\n * rows (which `\"current\"` cannot express) yet still respect validity.\n * Canonical fixed-width UTC ISO strings compare correctly as text.\n */\nfunction isValidAt(\n row: Pick<NodeRow, \"valid_from\" | \"valid_to\">,\n asOf: string,\n): boolean {\n return (\n (row.valid_from === undefined || row.valid_from <= asOf) &&\n (row.valid_to === undefined || row.valid_to > asOf)\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) => isValidAt(row, options.asOf));\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 { d as GraphDef } from '../types-Du78EvpN.cjs';
2
- export { C as ContributionDiagnostic, a as ContributionDiagnosticState, b as ContributionRepairEntry, c as ContributionRepairResult } from '../types-Du78EvpN.cjs';
3
- import { b as HistoryStore } from '../store-FTqBpuJD.cjs';
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';
4
4
  import 'zod';
5
- import '../temporal-CXewwLTB.cjs';
6
- import '../searchable-BrUh0pdc.cjs';
7
- import '../manager-ptr3JLRP.cjs';
8
- import '../materialize-indexes-BXz77YqO.cjs';
5
+ import '../temporal-5GqpYCk2.cjs';
6
+ import '../searchable-DHJMh_nj.cjs';
7
+ import '../manager-CYaff3n3.cjs';
8
+ import '../materialize-indexes-DTtAnvfY.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 { d as GraphDef } from '../types-Du78EvpN.js';
2
- export { C as ContributionDiagnostic, a as ContributionDiagnosticState, b as ContributionRepairEntry, c as ContributionRepairResult } from '../types-Du78EvpN.js';
3
- import { b as HistoryStore } from '../store-Bo1psfVZ.js';
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';
4
4
  import 'zod';
5
- import '../temporal-DPtn0HOu.js';
6
- import '../searchable-BOUuA83f.js';
7
- import '../manager-DX983gJ0.js';
8
- import '../materialize-indexes-CpXoggWU.js';
5
+ import '../temporal-CbnLzTmM.js';
6
+ import '../searchable-bpE1bBfc.js';
7
+ import '../manager-D9eRT_ns.js';
8
+ import '../materialize-indexes-DJ3ykH59.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>;