@remnic/core 9.69.22 → 9.69.24

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 (772) hide show
  1. package/dist/abstraction-nodes.js +3 -2
  2. package/dist/access-admin-ops-surface.d.ts +14 -12
  3. package/dist/access-admin-ops-surface.js +94 -91
  4. package/dist/access-authorization-probe.d.ts +14 -12
  5. package/dist/access-authorization-probe.js +95 -92
  6. package/dist/access-boundary.d.ts +14 -12
  7. package/dist/access-boundary.js +94 -91
  8. package/dist/access-citation-namespace.js +3 -3
  9. package/dist/access-cli.js +200 -195
  10. package/dist/access-cli.js.map +1 -1
  11. package/dist/access-coding-context-resolution.d.ts +2 -1
  12. package/dist/access-extraction-force-flush.d.ts +14 -12
  13. package/dist/access-extraction-force-flush.js +94 -91
  14. package/dist/access-health-types.d.ts +2 -1
  15. package/dist/access-http-briefing.d.ts +156 -0
  16. package/dist/access-http-briefing.js +233 -0
  17. package/dist/access-http-lcm-compaction.d.ts +14 -12
  18. package/dist/access-http-lifecycle-flush.d.ts +14 -12
  19. package/dist/access-http-offline-stream.d.ts +14 -12
  20. package/dist/access-http-query.d.ts +3 -2
  21. package/dist/access-http-query.js +96 -93
  22. package/dist/access-http.d.ts +15 -13
  23. package/dist/access-http.js +119 -114
  24. package/dist/access-identity-continuity-surface.d.ts +12 -10
  25. package/dist/access-identity-continuity-surface.js +94 -91
  26. package/dist/access-lcm-surface.d.ts +14 -12
  27. package/dist/access-lcm-surface.js +94 -91
  28. package/dist/access-mcp.d.ts +14 -12
  29. package/dist/access-mcp.js +105 -101
  30. package/dist/access-memory-search-fanout.d.ts +3 -2
  31. package/dist/{access-namespace-preflight-BMHhxoL9.d.ts → access-namespace-preflight-BsvmyENS.d.ts} +1 -1
  32. package/dist/access-namespace-preflight.d.ts +4 -3
  33. package/dist/access-namespace-preflight.js +94 -91
  34. package/dist/access-observe-transcript.d.ts +12 -10
  35. package/dist/access-observe-write-surface.d.ts +14 -12
  36. package/dist/access-observe-write-surface.js +94 -91
  37. package/dist/access-offline-manifest.d.ts +12 -10
  38. package/dist/access-offline-manifest.js +15 -15
  39. package/dist/access-operations-batch.js +99 -95
  40. package/dist/access-operations.d.ts +14 -12
  41. package/dist/access-operations.js +104 -100
  42. package/dist/access-recall-concurrency.d.ts +14 -12
  43. package/dist/access-recall-concurrency.js +94 -91
  44. package/dist/access-recall-response.d.ts +14 -12
  45. package/dist/access-recall-response.js +94 -91
  46. package/dist/access-recall-surface.d.ts +14 -12
  47. package/dist/access-recall-surface.js +94 -91
  48. package/dist/access-schema.js +8 -7
  49. package/dist/{access-service-BlsNXFwx.d.ts → access-service-DWdY9Mlk.d.ts} +7 -7
  50. package/dist/access-service-helpers.d.ts +14 -12
  51. package/dist/access-service.d.ts +14 -12
  52. package/dist/access-service.js +94 -91
  53. package/dist/access-surface-catalog.d.ts +14 -12
  54. package/dist/access-surface-catalog.js +97 -93
  55. package/dist/access-surface-catalog.js.map +1 -1
  56. package/dist/access-wearables-meetings-surface.d.ts +4 -3
  57. package/dist/action-confidence.d.ts +2 -1
  58. package/dist/active-memory-bridge.d.ts +2 -1
  59. package/dist/active-recall.d.ts +2 -1
  60. package/dist/active-recall.js +16 -13
  61. package/dist/active-recall.js.map +1 -1
  62. package/dist/adapters/index.js +7 -7
  63. package/dist/adapters/registry.js +3 -3
  64. package/dist/ambient-provenance.d.ts +2 -1
  65. package/dist/artifact-search.d.ts +2 -1
  66. package/dist/{auto-sync-GRUJFD2F.js → auto-sync-WNGG2GC2.js} +9 -9
  67. package/dist/behavior-learner.d.ts +2 -1
  68. package/dist/behavior-signals.d.ts +2 -1
  69. package/dist/bootstrap.d.ts +12 -10
  70. package/dist/briefing-window.d.ts +3 -2
  71. package/dist/briefing.d.ts +3 -2
  72. package/dist/briefing.js +36 -36
  73. package/dist/buffer-surprise-report.d.ts +2 -1
  74. package/dist/buffer-turn-helpers.d.ts +2 -1
  75. package/dist/buffer.d.ts +3 -2
  76. package/dist/buffer.js +13 -13
  77. package/dist/bulk-import/index.d.ts +4 -3
  78. package/dist/calibration.d.ts +2 -1
  79. package/dist/calibration.js +2 -1
  80. package/dist/calibration.js.map +1 -1
  81. package/dist/capabilities.d.ts +2 -1
  82. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  83. package/dist/{capsule-merge-SEHERWWP.js → capsule-merge-IPG4IOFP.js} +5 -5
  84. package/dist/{catalog-C1qHsGew.d.ts → catalog-CDZLyiXL.d.ts} +1 -1
  85. package/dist/causal-behavior.d.ts +2 -1
  86. package/dist/causal-behavior.js +4 -3
  87. package/dist/causal-behavior.js.map +1 -1
  88. package/dist/causal-chain.js +4 -3
  89. package/dist/causal-consolidation.d.ts +2 -1
  90. package/dist/causal-consolidation.js +42 -42
  91. package/dist/causal-retrieval.js +4 -3
  92. package/dist/causal-retrieval.js.map +1 -1
  93. package/dist/causal-trajectory-graph.d.ts +5 -2
  94. package/dist/causal-trajectory-graph.js +6 -2
  95. package/dist/causal-trajectory-graph.js.map +1 -1
  96. package/dist/causal-trajectory.js +3 -2
  97. package/dist/{chunk-KTVSPFCQ.js → chunk-22FVR2KE.js} +2 -2
  98. package/dist/{chunk-7Y5V3LAP.js → chunk-27QVNSQ3.js} +2 -2
  99. package/dist/{chunk-R7LY4YKF.js → chunk-2EKJDQZB.js} +2 -2
  100. package/dist/{chunk-FCATYKQA.js → chunk-2IOHTUP3.js} +263 -13
  101. package/dist/chunk-2IOHTUP3.js.map +1 -0
  102. package/dist/{chunk-HOUST5UX.js → chunk-2ITE4C2Z.js} +2 -2
  103. package/dist/{chunk-JOYC4RYC.js → chunk-2JVJ7UHC.js} +2 -2
  104. package/dist/{chunk-X2NFFBTO.js → chunk-2L5FSNPC.js} +7 -7
  105. package/dist/{chunk-DUAJKRR2.js → chunk-2SGLMP2E.js} +2 -2
  106. package/dist/{chunk-6FUMA6AA.js → chunk-2Z4GS5E6.js} +2 -2
  107. package/dist/{chunk-G6MXN2G5.js → chunk-37KUQPX4.js} +6 -6
  108. package/dist/{chunk-DDQQY2E3.js → chunk-3BTFBQLO.js} +7 -7
  109. package/dist/chunk-3BTFBQLO.js.map +1 -0
  110. package/dist/{chunk-UR6PBX2J.js → chunk-3K7V3HE6.js} +35 -60
  111. package/dist/chunk-3K7V3HE6.js.map +1 -0
  112. package/dist/{chunk-WKAXBXVA.js → chunk-3QQTXYZ6.js} +2 -2
  113. package/dist/{chunk-DJUKBGAD.js → chunk-46EST7JO.js} +5 -5
  114. package/dist/chunk-46EST7JO.js.map +1 -0
  115. package/dist/{chunk-4ZWCQJNM.js → chunk-46WM6JX2.js} +5 -5
  116. package/dist/{chunk-CASWJ2HM.js → chunk-46ZPIGWI.js} +3 -3
  117. package/dist/{chunk-HTIIXNJQ.js → chunk-4FIH6MPS.js} +6 -3
  118. package/dist/chunk-4FIH6MPS.js.map +1 -0
  119. package/dist/{chunk-MCA2X4WH.js → chunk-4IHBN6WU.js} +2 -2
  120. package/dist/{chunk-W7IGLX4G.js → chunk-4O6WRBGE.js} +7 -7
  121. package/dist/chunk-4O6WRBGE.js.map +1 -0
  122. package/dist/{chunk-FB7LAJQM.js → chunk-4TKJGOCJ.js} +2 -2
  123. package/dist/{chunk-H7BZBSP6.js → chunk-52II7PB6.js} +4 -4
  124. package/dist/{chunk-N4Y5T6VD.js → chunk-54WHLA65.js} +4 -4
  125. package/dist/chunk-56Y6EKZN.js +24 -0
  126. package/dist/chunk-56Y6EKZN.js.map +1 -0
  127. package/dist/{chunk-YVLENSNS.js → chunk-5ATKSPEQ.js} +2 -2
  128. package/dist/{chunk-OLT3YTDH.js → chunk-5FAGCOZD.js} +37 -24
  129. package/dist/chunk-5FAGCOZD.js.map +1 -0
  130. package/dist/{chunk-ZVZHG7AI.js → chunk-5UBH37SL.js} +3 -3
  131. package/dist/{chunk-N3WZU76A.js → chunk-66OJSCI6.js} +2 -2
  132. package/dist/{chunk-D35XLYQ7.js → chunk-6CVNSDCZ.js} +11 -11
  133. package/dist/{chunk-KA2HZCMG.js → chunk-6NXSYYGP.js} +2 -2
  134. package/dist/{chunk-2HIJHXB3.js → chunk-6WHJ2EAB.js} +2 -2
  135. package/dist/{chunk-ZZM476NV.js → chunk-6XL73HQ4.js} +4 -4
  136. package/dist/{chunk-EJ5RKUXW.js → chunk-AQ7SYDVO.js} +2 -2
  137. package/dist/{chunk-2Z3DG5CQ.js → chunk-B3O3IRZN.js} +2 -2
  138. package/dist/{chunk-P77QX3ID.js → chunk-B6O2YLUR.js} +21 -20
  139. package/dist/chunk-B6O2YLUR.js.map +1 -0
  140. package/dist/{chunk-RACZB5HT.js → chunk-BD7JTBYP.js} +4 -4
  141. package/dist/{chunk-I762GW7V.js → chunk-BLJWYCNO.js} +5 -5
  142. package/dist/{chunk-ACPCA4NO.js → chunk-BMWN7B3Y.js} +6 -6
  143. package/dist/chunk-BMWN7B3Y.js.map +1 -0
  144. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  145. package/dist/{chunk-KK66P5GQ.js → chunk-C553ZTLF.js} +46 -48
  146. package/dist/chunk-C553ZTLF.js.map +1 -0
  147. package/dist/{chunk-GCASGYIO.js → chunk-C7HJ3NEI.js} +2 -2
  148. package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
  149. package/dist/{chunk-WVGXCBOC.js → chunk-D5F7TKMH.js} +2 -2
  150. package/dist/chunk-DGS34QSY.js +141 -0
  151. package/dist/chunk-DGS34QSY.js.map +1 -0
  152. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  153. package/dist/{chunk-2OXIPF3A.js → chunk-DZD3WGCD.js} +4 -4
  154. package/dist/{chunk-UMEOXLIZ.js → chunk-E2P7TZTF.js} +5 -5
  155. package/dist/{chunk-6FC3IZ26.js → chunk-EBA5DA77.js} +2 -2
  156. package/dist/{chunk-N7JK2RKG.js → chunk-EOQ6FSQP.js} +2 -2
  157. package/dist/chunk-EUT2WCWS.js +54 -0
  158. package/dist/chunk-EUT2WCWS.js.map +1 -0
  159. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  160. package/dist/{chunk-XDMI5VKE.js → chunk-FVOP3NT7.js} +2 -2
  161. package/dist/{chunk-NRLELHAY.js → chunk-G7NYVKD6.js} +2 -2
  162. package/dist/{chunk-B3W7GWQB.js → chunk-GHTSNGBZ.js} +2 -2
  163. package/dist/chunk-GKCXTSFF.js +17 -0
  164. package/dist/chunk-GKCXTSFF.js.map +1 -0
  165. package/dist/{chunk-LUDBXTBJ.js → chunk-H272ZPQ3.js} +5 -5
  166. package/dist/{chunk-SN4JXNLL.js → chunk-H3TKENU4.js} +2 -2
  167. package/dist/{chunk-4HYNMLT6.js → chunk-H4SEGIZY.js} +2 -2
  168. package/dist/{chunk-ACZN5ZXD.js → chunk-H54VWRPS.js} +13 -13
  169. package/dist/{chunk-HTP6XRUI.js → chunk-HM7RHKS4.js} +2 -2
  170. package/dist/{chunk-Z3SQEEB6.js → chunk-HWLIMQE2.js} +2 -2
  171. package/dist/{chunk-NQFCLAYT.js → chunk-ICKJ52PE.js} +99 -322
  172. package/dist/chunk-ICKJ52PE.js.map +1 -0
  173. package/dist/{chunk-2QSZNTDO.js → chunk-JBPKEARU.js} +7 -7
  174. package/dist/{chunk-DK6GMO6D.js → chunk-JEC4DVM3.js} +16 -16
  175. package/dist/chunk-JEC4DVM3.js.map +1 -0
  176. package/dist/{chunk-ET2CNMLD.js → chunk-JN72EPOE.js} +2 -2
  177. package/dist/{chunk-U62OK7BB.js → chunk-JPKK466T.js} +188 -21
  178. package/dist/chunk-JPKK466T.js.map +1 -0
  179. package/dist/{chunk-JCCWJHOP.js → chunk-JYZSRNR7.js} +2 -2
  180. package/dist/{chunk-7D6HXODY.js → chunk-K7724CH2.js} +2 -2
  181. package/dist/{chunk-X33MJFD2.js → chunk-KAXCYM66.js} +3 -3
  182. package/dist/{chunk-7RRUHJPG.js → chunk-KB2G2I6Q.js} +3 -3
  183. package/dist/{chunk-ZXBTTMGZ.js → chunk-KEF46KL2.js} +5 -5
  184. package/dist/{chunk-5UZXUTVO.js → chunk-KNA3BXXL.js} +6 -2
  185. package/dist/chunk-KNA3BXXL.js.map +1 -0
  186. package/dist/{chunk-UWTDARPF.js → chunk-KTWG7CNY.js} +6 -6
  187. package/dist/{chunk-XQYTSZW3.js → chunk-L7Z57SID.js} +6 -6
  188. package/dist/{chunk-JMAG7WZ7.js → chunk-LO4UKPKX.js} +3 -3
  189. package/dist/{chunk-LDWIPYJ6.js → chunk-LS2FHUML.js} +3 -3
  190. package/dist/{chunk-GDB4J2H3.js → chunk-MPC7TYTZ.js} +2 -2
  191. package/dist/{chunk-2GF27PGH.js → chunk-MRPOZBJC.js} +3 -3
  192. package/dist/{chunk-BR3OOQZQ.js → chunk-MWN6QEI2.js} +2 -2
  193. package/dist/{chunk-NZGO2GKL.js → chunk-MY5EDR46.js} +4 -4
  194. package/dist/{chunk-LCMUZDBZ.js → chunk-N3ZOP7KC.js} +3 -3
  195. package/dist/{chunk-TVW4C7PV.js → chunk-NB3LRY4T.js} +6 -6
  196. package/dist/{chunk-QJCWK2A7.js → chunk-ND6IQGSZ.js} +2 -2
  197. package/dist/{chunk-NOB2T2FC.js → chunk-NHLLKEKK.js} +2 -2
  198. package/dist/{chunk-7GSSHAXC.js → chunk-NLYVH66G.js} +6 -6
  199. package/dist/chunk-NLYVH66G.js.map +1 -0
  200. package/dist/{chunk-EJIWBTVM.js → chunk-O6ZNNVSP.js} +2 -2
  201. package/dist/{chunk-AG46P24C.js → chunk-OB3XMWX5.js} +4 -4
  202. package/dist/{chunk-NYRB7BKY.js → chunk-OEYZXDQI.js} +6 -6
  203. package/dist/chunk-OEYZXDQI.js.map +1 -0
  204. package/dist/{chunk-46QMN7I7.js → chunk-PAZY2ZKP.js} +6 -6
  205. package/dist/{chunk-EF4JUM55.js → chunk-PX4UMA5Z.js} +2 -2
  206. package/dist/chunk-QLK3SL7Q.js +242 -0
  207. package/dist/chunk-QLK3SL7Q.js.map +1 -0
  208. package/dist/{chunk-GGYDJJBO.js → chunk-QOOBICJF.js} +5 -5
  209. package/dist/chunk-QOOBICJF.js.map +1 -0
  210. package/dist/{chunk-NNZFPYYX.js → chunk-R7QY5ZVB.js} +2 -2
  211. package/dist/{chunk-RO2X2EYM.js → chunk-R7RTXEYG.js} +2 -2
  212. package/dist/{chunk-3LJPSRAN.js → chunk-RBCQVOVJ.js} +3 -3
  213. package/dist/{chunk-N4F7ZSSG.js → chunk-RC5DXXWC.js} +2 -2
  214. package/dist/{chunk-VLAQV4HT.js → chunk-RJYJ7KR7.js} +1636 -611
  215. package/dist/chunk-RJYJ7KR7.js.map +1 -0
  216. package/dist/{chunk-5CF2R4NS.js → chunk-RKBLRTNT.js} +2 -2
  217. package/dist/{chunk-5QZR2RA3.js → chunk-ROBHL3GL.js} +2 -2
  218. package/dist/{chunk-D5ZNOKR7.js → chunk-S7T2TY65.js} +3 -3
  219. package/dist/{chunk-C2JCVZWX.js → chunk-SCXURCVT.js} +25 -13
  220. package/dist/chunk-SCXURCVT.js.map +1 -0
  221. package/dist/{chunk-3LADWWMA.js → chunk-SJDQ5RSN.js} +3 -3
  222. package/dist/{chunk-45XVII3J.js → chunk-SMWTZLHE.js} +99 -89
  223. package/dist/{chunk-45XVII3J.js.map → chunk-SMWTZLHE.js.map} +1 -1
  224. package/dist/{chunk-XOQGUGJL.js → chunk-SO7SV523.js} +1 -1
  225. package/dist/{chunk-XOQGUGJL.js.map → chunk-SO7SV523.js.map} +1 -1
  226. package/dist/{chunk-CHWUICVY.js → chunk-SV4Z2S67.js} +4 -4
  227. package/dist/{chunk-JHP45LO5.js → chunk-SVXJLDDC.js} +9 -7
  228. package/dist/{chunk-JHP45LO5.js.map → chunk-SVXJLDDC.js.map} +1 -1
  229. package/dist/{chunk-SEF4IOFE.js → chunk-SWIKABKI.js} +2 -2
  230. package/dist/{chunk-JRRQ747T.js → chunk-TBXAY2SS.js} +13 -13
  231. package/dist/{chunk-J6A3CX5N.js → chunk-TG3FAM2S.js} +33 -8
  232. package/dist/{chunk-J6A3CX5N.js.map → chunk-TG3FAM2S.js.map} +1 -1
  233. package/dist/{chunk-XZBXINXZ.js → chunk-TNSCIPBQ.js} +4 -4
  234. package/dist/{chunk-S37NN23M.js → chunk-TVEONGBU.js} +2 -2
  235. package/dist/{chunk-5RPMTFB6.js → chunk-TWF35IC6.js} +3 -3
  236. package/dist/{chunk-BZTJEILZ.js → chunk-U6N5IBVY.js} +2 -2
  237. package/dist/{chunk-7TUB6JWA.js → chunk-UCKYTA2T.js} +3 -3
  238. package/dist/{chunk-PPOT6SPR.js → chunk-UNNPNBR2.js} +11 -11
  239. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  240. package/dist/{chunk-J2R275FN.js → chunk-VVX5PZFS.js} +4 -4
  241. package/dist/{chunk-ME35HVDJ.js → chunk-VYCOJKSX.js} +2 -2
  242. package/dist/{chunk-F5UWQ4LX.js → chunk-W24T5YMW.js} +2 -2
  243. package/dist/{chunk-HDQUQBPW.js → chunk-W3K3HITK.js} +2 -2
  244. package/dist/{chunk-GDASG7NC.js → chunk-W4F3C7N7.js} +2 -2
  245. package/dist/{chunk-LFK623SF.js → chunk-WJHGDE7X.js} +5 -5
  246. package/dist/{chunk-DP4EBV7C.js → chunk-WMLEPWMO.js} +16 -16
  247. package/dist/chunk-WMLEPWMO.js.map +1 -0
  248. package/dist/{chunk-3Q6RD76J.js → chunk-WQZZDN5M.js} +5 -5
  249. package/dist/{chunk-ZJWDWPX6.js → chunk-X5K5TAQZ.js} +4 -4
  250. package/dist/{chunk-ZL3XX5LW.js → chunk-XM24CDZX.js} +3 -3
  251. package/dist/{chunk-JTWZKNUH.js → chunk-XOVKXJEP.js} +3 -3
  252. package/dist/{chunk-OGTKQ5MJ.js → chunk-XSGUMQQQ.js} +62 -50
  253. package/dist/chunk-XSGUMQQQ.js.map +1 -0
  254. package/dist/{chunk-X5YYSAZX.js → chunk-XUE46UYW.js} +3 -3
  255. package/dist/{chunk-DJORULH3.js → chunk-YRLHEEQT.js} +2 -2
  256. package/dist/{chunk-TA7UZZMW.js → chunk-Z3O53WZR.js} +2 -2
  257. package/dist/{chunk-4LG4CPOC.js → chunk-Z6COGHHN.js} +2 -2
  258. package/dist/{chunk-RE3H6Y2X.js → chunk-ZIW5JVRM.js} +2 -2
  259. package/dist/{cli-BNtvR-nU.d.ts → cli-DD0P-lu8.d.ts} +6 -6
  260. package/dist/cli.d.ts +16 -14
  261. package/dist/cli.js +154 -149
  262. package/dist/coding/export-okf-codegraph.d.ts +2 -1
  263. package/dist/coding/export-okf-codegraph.js +37 -37
  264. package/dist/coding/pre-action-gate.d.ts +2 -1
  265. package/dist/coding/pre-action-gate.js +4 -3
  266. package/dist/commitment-ledger.js +3 -2
  267. package/dist/compounding/engine.d.ts +3 -2
  268. package/dist/compounding/engine.js +37 -37
  269. package/dist/compounding/preference-consolidator.d.ts +2 -1
  270. package/dist/compression-optimizer.d.ts +2 -1
  271. package/dist/config.d.ts +2 -1
  272. package/dist/config.js +16 -13
  273. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  274. package/dist/connectors/codex-materialize-runner.js +38 -38
  275. package/dist/connectors/codex-materialize.d.ts +2 -1
  276. package/dist/connectors/codex-materialize.js +4 -4
  277. package/dist/connectors/index.d.ts +2 -1
  278. package/dist/connectors/index.js +38 -38
  279. package/dist/consolidation-provenance-check.d.ts +3 -2
  280. package/dist/consolidation-provenance-check.js +4 -4
  281. package/dist/consolidation-undo.d.ts +3 -2
  282. package/dist/consolidation-undo.js +3 -3
  283. package/dist/contradiction/index.d.ts +4 -3
  284. package/dist/contradiction/index.js +9 -9
  285. package/dist/converge-config.d.ts +2 -1
  286. package/dist/convergence-refresh.d.ts +3 -2
  287. package/dist/convergence-refresh.js +38 -38
  288. package/dist/conversation-index/backend.d.ts +2 -1
  289. package/dist/conversation-index/chunker.d.ts +2 -1
  290. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  291. package/dist/conversation-index/indexer.d.ts +2 -1
  292. package/dist/conversation-index/search.d.ts +2 -1
  293. package/dist/corpus-watermark.d.ts +2 -1
  294. package/dist/corpus-watermark.js +38 -38
  295. package/dist/cross-lingual-recall.d.ts +2 -1
  296. package/dist/cue-anchors.js +4 -3
  297. package/dist/dashboard-runtime.js +2 -2
  298. package/dist/day-summary.d.ts +2 -1
  299. package/dist/deep-recall-http-glue.d.ts +14 -12
  300. package/dist/deep-recall-http-glue.js +9 -8
  301. package/dist/deep-recall-mcp-tools.d.ts +14 -12
  302. package/dist/deep-recall-policy-llm.d.ts +2 -1
  303. package/dist/deep-recall-seeds.d.ts +2 -1
  304. package/dist/deep-recall.js +2 -2
  305. package/dist/delinearize.d.ts +2 -1
  306. package/dist/dependency-propagation-config.d.ts +2 -1
  307. package/dist/{dependency-propagation-delivery-DjpUlhLi.d.ts → dependency-propagation-delivery-CQPCu0o5.d.ts} +1 -1
  308. package/dist/direct-answer-wiring.d.ts +2 -1
  309. package/dist/direct-answer.d.ts +2 -1
  310. package/dist/embedding-fallback.d.ts +2 -1
  311. package/dist/enrichment/index.d.ts +2 -1
  312. package/dist/entity-origin-fields.d.ts +2 -1
  313. package/dist/entity-retrieval.d.ts +3 -2
  314. package/dist/entity-retrieval.js +36 -36
  315. package/dist/entity-schema.d.ts +2 -1
  316. package/dist/episodic-context.d.ts +2 -1
  317. package/dist/eval-trajectory-contracts.d.ts +2 -1
  318. package/dist/eval-trajectory-store.d.ts +2 -1
  319. package/dist/eval-trajectory-store.js +4 -3
  320. package/dist/eval-trajectory.d.ts +2 -1
  321. package/dist/eval-trajectory.js +4 -3
  322. package/dist/evals.js +3 -2
  323. package/dist/event-order-recall.js +2 -2
  324. package/dist/explicit-capture.d.ts +12 -10
  325. package/dist/explicit-capture.js +10 -10
  326. package/dist/external-wiki-access.d.ts +14 -12
  327. package/dist/external-wiki-access.js +95 -92
  328. package/dist/external-wiki-collection-registration.d.ts +2 -1
  329. package/dist/external-wiki-collection.d.ts +2 -1
  330. package/dist/external-wiki-mcp-tools.d.ts +14 -12
  331. package/dist/extraction-error-classification.d.ts +2 -1
  332. package/dist/extraction-faithfulness.d.ts +2 -1
  333. package/dist/extraction-judge-telemetry.d.ts +2 -1
  334. package/dist/extraction-judge-training.d.ts +2 -1
  335. package/dist/extraction-judge.d.ts +2 -1
  336. package/dist/extraction-liveness.d.ts +2 -1
  337. package/dist/extraction-normalization.d.ts +2 -1
  338. package/dist/extraction-prompt.d.ts +2 -1
  339. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  340. package/dist/extraction-source-grounding.d.ts +2 -1
  341. package/dist/extraction.d.ts +2 -1
  342. package/dist/extraction.js +43 -43
  343. package/dist/fallback-llm.d.ts +2 -1
  344. package/dist/{first-start-migration-KHIMCBIC.js → first-start-migration-RC345GPL.js} +6 -5
  345. package/dist/{first-start-migration-KHIMCBIC.js.map → first-start-migration-RC345GPL.js.map} +1 -1
  346. package/dist/{forget-2AE4MDK3.js → forget-SZ2BXDGF.js} +3 -3
  347. package/dist/{graph-444E-DrF.d.ts → graph-DRkl22KE.d.ts} +10 -12
  348. package/dist/graph-append-error.d.ts +40 -0
  349. package/dist/graph-append-error.js +8 -0
  350. package/dist/graph-dashboard-diff.d.ts +5 -2
  351. package/dist/graph-dashboard-key.d.ts +5 -2
  352. package/dist/graph-dashboard-parser.d.ts +5 -2
  353. package/dist/{graph-edge-decay-DGTBFALQ.js → graph-edge-decay-MKIRZ762.js} +10 -4
  354. package/dist/graph-edge-decay-MKIRZ762.js.map +1 -0
  355. package/dist/graph-edge-reinforcement.d.ts +5 -2
  356. package/dist/graph-jsonl.d.ts +82 -0
  357. package/dist/graph-jsonl.js +23 -0
  358. package/dist/graph-jsonl.js.map +1 -0
  359. package/dist/graph-path-reconstruction.d.ts +5 -2
  360. package/dist/graph-path-scoring.d.ts +5 -2
  361. package/dist/graph-snapshot.d.ts +5 -2
  362. package/dist/graph-snapshot.js +7 -3
  363. package/dist/graph-write-lock.d.ts +84 -0
  364. package/dist/graph-write-lock.js +15 -0
  365. package/dist/graph-write-lock.js.map +1 -0
  366. package/dist/graph.d.ts +5 -2
  367. package/dist/graph.js +10 -3
  368. package/dist/harmonic-construction.js +5 -4
  369. package/dist/harmonic-retrieval.js +5 -4
  370. package/dist/importance.d.ts +2 -1
  371. package/dist/importers/index.d.ts +2 -1
  372. package/dist/in-flight-reads.d.ts +2 -1
  373. package/dist/{index-CsUrdMyL.d.ts → index-C9VXenR8.d.ts} +2 -2
  374. package/dist/index.d.ts +39 -25
  375. package/dist/index.js +291 -284
  376. package/dist/intent.d.ts +2 -1
  377. package/dist/json-store.js +2 -1
  378. package/dist/lcm/engine.d.ts +2 -1
  379. package/dist/lcm/engine.js +3 -3
  380. package/dist/lcm/index.d.ts +2 -1
  381. package/dist/lcm/index.js +6 -6
  382. package/dist/lcm/tools.d.ts +2 -1
  383. package/dist/lifecycle.d.ts +2 -1
  384. package/dist/live-connectors-runner.d.ts +2 -1
  385. package/dist/live-connectors-runner.js +3 -2
  386. package/dist/local-llm.d.ts +2 -1
  387. package/dist/local-model-endpoint.d.ts +2 -1
  388. package/dist/location/index.d.ts +4 -3
  389. package/dist/location/index.js +39 -39
  390. package/dist/maintenance/memory-governance.d.ts +2 -1
  391. package/dist/maintenance/memory-governance.js +36 -36
  392. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  393. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +36 -36
  394. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  395. package/dist/maintenance/rebuild-memory-projection.js +37 -37
  396. package/dist/{maintenance-D1GRGLTE.d.ts → maintenance-C14sorKa.d.ts} +3 -3
  397. package/dist/mcp-memory-inspector-app.d.ts +14 -12
  398. package/dist/memory-action-policy.d.ts +2 -1
  399. package/dist/memory-cache.d.ts +2 -1
  400. package/dist/memory-controller.d.ts +2 -1
  401. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  402. package/dist/memory-projection-mutations.js +3 -3
  403. package/dist/memory-projection-store.d.ts +2 -1
  404. package/dist/memory-provenance.d.ts +2 -1
  405. package/dist/memory-snapshot.d.ts +2 -1
  406. package/dist/memory-subject-cli.d.ts +14 -12
  407. package/dist/memory-subject.d.ts +14 -12
  408. package/dist/memory-subject.js +5 -5
  409. package/dist/memory-worth-outcomes.d.ts +3 -2
  410. package/dist/models-json.d.ts +2 -1
  411. package/dist/namespaces/migrate.d.ts +4 -3
  412. package/dist/namespaces/migrate.js +37 -37
  413. package/dist/namespaces/principal.d.ts +2 -1
  414. package/dist/namespaces/search.d.ts +2 -1
  415. package/dist/namespaces/search.js +11 -11
  416. package/dist/namespaces/storage.d.ts +4 -3
  417. package/dist/namespaces/storage.js +36 -36
  418. package/dist/native-knowledge.d.ts +2 -1
  419. package/dist/objective-state-writers.js +4 -3
  420. package/dist/objective-state.js +3 -2
  421. package/dist/offline-sync-file-io.js +4 -3
  422. package/dist/offline-sync-impression-drain.d.ts +2 -1
  423. package/dist/offline-sync-impression-drain.js +7 -7
  424. package/dist/offline-sync.js +5 -4
  425. package/dist/operator-doctor-corpus.d.ts +2 -1
  426. package/dist/operator-doctor-corpus.js +39 -39
  427. package/dist/operator-doctor-replica.d.ts +2 -1
  428. package/dist/operator-toolkit.d.ts +6 -4
  429. package/dist/operator-toolkit.js +61 -58
  430. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  431. package/dist/orchestration/maintenance.d.ts +5 -4
  432. package/dist/orchestration/maintenance.js +46 -46
  433. package/dist/{orchestrator-DeqaPGT5.d.ts → orchestrator-DgyvFfPR.d.ts} +9 -9
  434. package/dist/orchestrator.d.ts +12 -10
  435. package/dist/orchestrator.js +201 -196
  436. package/dist/page-versioning.d.ts +73 -4
  437. package/dist/page-versioning.js +11 -3
  438. package/dist/patterns-cli.d.ts +2 -1
  439. package/dist/{pipeline-umUzU0D1.d.ts → pipeline-DRUwHb1X.d.ts} +1 -1
  440. package/dist/policy-runtime.d.ts +2 -1
  441. package/dist/proactive-contention.d.ts +2 -1
  442. package/dist/provenance.d.ts +2 -1
  443. package/dist/{public-http-Bevrjll9.d.ts → public-http-C4i8Opxc.d.ts} +1 -1
  444. package/dist/{purge-OP6BEDFY.js → purge-TZKRE6ZQ.js} +5 -5
  445. package/dist/purge-TZKRE6ZQ.js.map +1 -0
  446. package/dist/{qmd-BasT78PP.d.ts → qmd-BVWlg1YS.d.ts} +1 -1
  447. package/dist/qmd-preflight.d.ts +3 -2
  448. package/dist/qmd-recall-cache.d.ts +2 -1
  449. package/dist/qmd.d.ts +3 -2
  450. package/dist/qmd.js +4 -4
  451. package/dist/recall-concurrency-config.d.ts +2 -1
  452. package/dist/recall-disclosure-escalation.d.ts +2 -1
  453. package/dist/recall-explain-renderer.d.ts +2 -1
  454. package/dist/recall-explain-renderer.js +3 -3
  455. package/dist/recall-memory-map.d.ts +2 -1
  456. package/dist/recall-navigate-access.d.ts +2 -1
  457. package/dist/recall-navigate-access.js +2 -2
  458. package/dist/recall-navigate-disclosure.d.ts +2 -1
  459. package/dist/recall-navigate-disclosure.js +1 -1
  460. package/dist/recall-navigate.d.ts +2 -1
  461. package/dist/recall-navigate.js +2 -2
  462. package/dist/recall-planner-llm.d.ts +2 -1
  463. package/dist/recall-state.d.ts +2 -1
  464. package/dist/recall-state.js +3 -3
  465. package/dist/recall-tag-filter.d.ts +2 -1
  466. package/dist/recall-timings.d.ts +2 -1
  467. package/dist/recall-xray-cli.d.ts +2 -1
  468. package/dist/recall-xray-cli.js +4 -4
  469. package/dist/recall-xray-renderer.d.ts +2 -1
  470. package/dist/recall-xray-renderer.js +3 -3
  471. package/dist/recall-xray.d.ts +2 -1
  472. package/dist/recall-xray.js +2 -2
  473. package/dist/reconcile/cursor.d.ts +2 -1
  474. package/dist/reconcile/manifest.d.ts +2 -1
  475. package/dist/reconcile/manifest.js +7 -7
  476. package/dist/reconcile/plan.d.ts +2 -1
  477. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  478. package/dist/replay/normalizers/claude.d.ts +2 -1
  479. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  480. package/dist/replay/normalizers/shared.d.ts +2 -1
  481. package/dist/replay/runner.d.ts +2 -1
  482. package/dist/replay/types.d.ts +2 -1
  483. package/dist/replica-divergence.d.ts +2 -1
  484. package/dist/replica-peers-config.d.ts +2 -1
  485. package/dist/{resolution-4DLI3IOR.js → resolution-VKATP2HT.js} +10 -10
  486. package/dist/resolution-VKATP2HT.js.map +1 -0
  487. package/dist/resolve-auth-token.d.ts +2 -1
  488. package/dist/resume-bundles.js +21 -18
  489. package/dist/retrieval-agents.d.ts +3 -2
  490. package/dist/retrieval-tiers.d.ts +2 -1
  491. package/dist/routing/engine.d.ts +2 -1
  492. package/dist/routing/store.d.ts +2 -1
  493. package/dist/salvage-envelope.d.ts +2 -1
  494. package/dist/salvage-envelope.js +7 -7
  495. package/dist/{scope-profiles-DXYzyOXW.d.ts → scope-profiles-Vl00B1KU.d.ts} +1 -1
  496. package/dist/search/document-scanner.js +3 -3
  497. package/dist/search/embed-helper.d.ts +2 -1
  498. package/dist/search/factory.d.ts +2 -1
  499. package/dist/search/factory.js +10 -10
  500. package/dist/search/index.d.ts +2 -1
  501. package/dist/search/index.js +16 -16
  502. package/dist/search/lancedb-backend.d.ts +2 -1
  503. package/dist/search/lancedb-backend.js +4 -4
  504. package/dist/search/meilisearch-backend.d.ts +2 -1
  505. package/dist/search/meilisearch-backend.js +4 -4
  506. package/dist/search/noop-backend.d.ts +2 -1
  507. package/dist/search/orama-backend.d.ts +2 -1
  508. package/dist/search/orama-backend.js +4 -4
  509. package/dist/search/port.d.ts +2 -1
  510. package/dist/search/remote-backend.d.ts +2 -1
  511. package/dist/secure-store/index.js +3 -3
  512. package/dist/{semantic-consolidation-CqDeaY0U.d.ts → semantic-consolidation-BC9-GFuT.d.ts} +1 -1
  513. package/dist/semantic-consolidation.d.ts +3 -2
  514. package/dist/semantic-consolidation.js +39 -39
  515. package/dist/semantic-merge-config.d.ts +17 -0
  516. package/dist/semantic-merge-config.js +1 -0
  517. package/dist/semantic-merge-config.js.map +1 -0
  518. package/dist/semantic-rule-promotion.js +36 -36
  519. package/dist/semantic-rule-verifier.d.ts +2 -1
  520. package/dist/semantic-rule-verifier.js +36 -36
  521. package/dist/{service-BKD-DVYZ.d.ts → service-BOy6dHfc.d.ts} +2 -2
  522. package/dist/session-observer-bands.d.ts +2 -1
  523. package/dist/session-observer-state.d.ts +2 -1
  524. package/dist/shared-context/manager.d.ts +2 -1
  525. package/dist/signal.d.ts +2 -1
  526. package/dist/source-agent-qualifier.d.ts +2 -1
  527. package/dist/source-agent-qualifier.js +42 -42
  528. package/dist/source-attribution.d.ts +18 -6
  529. package/dist/source-attribution.js +3 -1
  530. package/dist/standup/build.js +36 -36
  531. package/dist/{storage-BcFd1lN_.d.ts → storage-BLJRnFi6.d.ts} +15 -8
  532. package/dist/storage.d.ts +3 -2
  533. package/dist/storage.js +35 -35
  534. package/dist/subject-config.d.ts +2 -1
  535. package/dist/subject-config.js +6 -6
  536. package/dist/summarizer.d.ts +2 -1
  537. package/dist/summary-snapshot.d.ts +2 -1
  538. package/dist/support-passport/index.d.ts +17 -15
  539. package/dist/support-passport/index.js +97 -94
  540. package/dist/temporal-supersession.d.ts +3 -2
  541. package/dist/temporal-timeline-recall.d.ts +2 -1
  542. package/dist/temporal-validity.d.ts +2 -1
  543. package/dist/threading.d.ts +2 -1
  544. package/dist/tier-migration.d.ts +3 -2
  545. package/dist/tier-routing.d.ts +2 -1
  546. package/dist/{tier-stats-2TOW3QNL.js → tier-stats-KA6OZX2C.js} +6 -5
  547. package/dist/{tier-stats-2TOW3QNL.js.map → tier-stats-KA6OZX2C.js.map} +1 -1
  548. package/dist/topics.d.ts +2 -1
  549. package/dist/transcript.d.ts +2 -1
  550. package/dist/transfer/backup.js +2 -2
  551. package/dist/transfer/capsule-export.js +2 -2
  552. package/dist/transfer/capsule-import.js +6 -6
  553. package/dist/transfer/export-okf.d.ts +2 -1
  554. package/dist/transfer/export-okf.js +37 -37
  555. package/dist/trust-score-stage.d.ts +2 -1
  556. package/dist/trust-score.d.ts +2 -1
  557. package/dist/trust-zones.js +3 -2
  558. package/dist/{types-BRg3tMyp.d.ts → types-YY-eKKU7.d.ts} +3 -0
  559. package/dist/types.d.ts +2 -1
  560. package/dist/types.js +1 -1
  561. package/dist/utility-learner.js +4 -3
  562. package/dist/utility-runtime.d.ts +2 -1
  563. package/dist/utility-runtime.js +5 -4
  564. package/dist/utility-telemetry.js +3 -2
  565. package/dist/verified-recall.js +36 -36
  566. package/dist/who-knows-cli.d.ts +14 -12
  567. package/dist/who-knows-cli.js +37 -37
  568. package/dist/who-knows.d.ts +14 -12
  569. package/dist/who-knows.js +36 -36
  570. package/dist/work/board.js +3 -3
  571. package/dist/work/storage.js +2 -2
  572. package/dist/work-product-ledger.js +3 -2
  573. package/dist/write-envelope.d.ts +2 -1
  574. package/dist/write-envelope.js +6 -6
  575. package/package.json +2 -2
  576. package/src/abstraction-nodes.ts +1 -4
  577. package/src/access-http-briefing.ts +35 -0
  578. package/src/access-http.test.ts +76 -0
  579. package/src/access-http.ts +20 -23
  580. package/src/access-surface-catalog.test.ts +9 -0
  581. package/src/access-surface-catalog.ts +1 -0
  582. package/src/binary-lifecycle/backend.ts +2 -1
  583. package/src/config.ts +2 -0
  584. package/src/connectors/live/github.ts +10 -17
  585. package/src/connectors/live/gmail.ts +8 -19
  586. package/src/connectors/live/google-drive.ts +6 -13
  587. package/src/connectors/live/notion.ts +11 -21
  588. package/src/cue-anchors.ts +1 -6
  589. package/src/dedup/connector-scope.ts +39 -0
  590. package/src/dedup/merge-content.test.ts +21 -0
  591. package/src/dedup/merge-content.ts +21 -7
  592. package/src/dedup/merge-judge.ts +146 -0
  593. package/src/dedup/merge.test.ts +3542 -0
  594. package/src/dedup/merge.ts +384 -0
  595. package/src/dedup/novelty-gate.ts +12 -10
  596. package/src/dedup/semantic.ts +7 -9
  597. package/src/graph-append-error.ts +28 -0
  598. package/src/graph-jsonl.ts +267 -0
  599. package/src/graph-write-lock.test.ts +228 -0
  600. package/src/graph-write-lock.ts +132 -0
  601. package/src/graph.ts +49 -45
  602. package/src/harmonic-construction.test.ts +329 -0
  603. package/src/json-store.ts +17 -20
  604. package/src/live-connectors-runner.ts +2 -1
  605. package/src/location/store.ts +1 -4
  606. package/src/maintenance/graph-edge-decay.ts +24 -13
  607. package/src/maintenance/purge.ts +2 -5
  608. package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +3 -6
  609. package/src/maintenance/rebuild-memory-projection.ts +2 -5
  610. package/src/namespaces/catalog.ts +1 -9
  611. package/src/offline-sync-file-io.test.ts +39 -0
  612. package/src/offline-sync-file-io.ts +3 -7
  613. package/src/orchestration/contradiction-localization.integration.test.ts +35 -0
  614. package/src/orchestration/extraction-anchor-snapshot.ts +6 -1
  615. package/src/orchestration/extraction-persist-deps.ts +2 -1
  616. package/src/orchestration/extraction-persist-profile-promotion.test.ts +456 -0
  617. package/src/orchestration/extraction-persist-promotion.test.ts +534 -0
  618. package/src/orchestration/extraction-persist-promotion.ts +387 -1
  619. package/src/orchestration/extraction-persist.ts +95 -94
  620. package/src/orchestration/harmonic-construction-persist.test.ts +69 -0
  621. package/src/orchestration/harmonic-construction-persist.ts +55 -0
  622. package/src/orchestration/persistence-index.ts +35 -7
  623. package/src/orchestration/semantic-merge-commit-effects.ts +354 -0
  624. package/src/orchestration/semantic-merge-persist.ts +1095 -0
  625. package/src/orchestration/semantic-merge-promotion-payload.ts +161 -0
  626. package/src/orchestrator.ts +2 -2
  627. package/src/page-versioning.ts +396 -22
  628. package/src/procedural/procedure-miner.ts +1 -9
  629. package/src/search/document-scanner.ts +3 -6
  630. package/src/semantic-merge-config.ts +16 -0
  631. package/src/semantic-rule-promotion.ts +1 -4
  632. package/src/source-attribution-roundtrip.test.ts +21 -0
  633. package/src/source-attribution.ts +57 -17
  634. package/src/storage-contract/versioning.test.ts +500 -1
  635. package/src/storage.ts +30 -30
  636. package/src/testing/subjects/graph-edge-decay.test.ts +163 -0
  637. package/src/testing/subjects/semantic-merge-lifecycle.test.ts +1175 -0
  638. package/src/types.ts +2 -0
  639. package/src/utils/errno.test.ts +31 -0
  640. package/src/utils/errno.ts +5 -0
  641. package/src/wearables/index.ts +1 -0
  642. package/src/wearables/registry.ts +23 -0
  643. package/dist/chunk-5UZXUTVO.js.map +0 -1
  644. package/dist/chunk-7GSSHAXC.js.map +0 -1
  645. package/dist/chunk-ACPCA4NO.js.map +0 -1
  646. package/dist/chunk-C2JCVZWX.js.map +0 -1
  647. package/dist/chunk-DDQQY2E3.js.map +0 -1
  648. package/dist/chunk-DJUKBGAD.js.map +0 -1
  649. package/dist/chunk-DK6GMO6D.js.map +0 -1
  650. package/dist/chunk-DP4EBV7C.js.map +0 -1
  651. package/dist/chunk-FCATYKQA.js.map +0 -1
  652. package/dist/chunk-GGYDJJBO.js.map +0 -1
  653. package/dist/chunk-HTIIXNJQ.js.map +0 -1
  654. package/dist/chunk-KK66P5GQ.js.map +0 -1
  655. package/dist/chunk-NQFCLAYT.js.map +0 -1
  656. package/dist/chunk-NYRB7BKY.js.map +0 -1
  657. package/dist/chunk-OGTKQ5MJ.js.map +0 -1
  658. package/dist/chunk-OLT3YTDH.js.map +0 -1
  659. package/dist/chunk-P77QX3ID.js.map +0 -1
  660. package/dist/chunk-U62OK7BB.js.map +0 -1
  661. package/dist/chunk-UR6PBX2J.js.map +0 -1
  662. package/dist/chunk-VLAQV4HT.js.map +0 -1
  663. package/dist/chunk-W7IGLX4G.js.map +0 -1
  664. package/dist/purge-OP6BEDFY.js.map +0 -1
  665. /package/dist/{capsule-crypto-7FJQINUR.js.map → access-http-briefing.js.map} +0 -0
  666. /package/dist/{auto-sync-GRUJFD2F.js.map → auto-sync-WNGG2GC2.js.map} +0 -0
  667. /package/dist/{graph-edge-decay-DGTBFALQ.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  668. /package/dist/{capsule-merge-SEHERWWP.js.map → capsule-merge-IPG4IOFP.js.map} +0 -0
  669. /package/dist/{chunk-KTVSPFCQ.js.map → chunk-22FVR2KE.js.map} +0 -0
  670. /package/dist/{chunk-7Y5V3LAP.js.map → chunk-27QVNSQ3.js.map} +0 -0
  671. /package/dist/{chunk-R7LY4YKF.js.map → chunk-2EKJDQZB.js.map} +0 -0
  672. /package/dist/{chunk-HOUST5UX.js.map → chunk-2ITE4C2Z.js.map} +0 -0
  673. /package/dist/{chunk-JOYC4RYC.js.map → chunk-2JVJ7UHC.js.map} +0 -0
  674. /package/dist/{chunk-X2NFFBTO.js.map → chunk-2L5FSNPC.js.map} +0 -0
  675. /package/dist/{chunk-DUAJKRR2.js.map → chunk-2SGLMP2E.js.map} +0 -0
  676. /package/dist/{chunk-6FUMA6AA.js.map → chunk-2Z4GS5E6.js.map} +0 -0
  677. /package/dist/{chunk-G6MXN2G5.js.map → chunk-37KUQPX4.js.map} +0 -0
  678. /package/dist/{chunk-WKAXBXVA.js.map → chunk-3QQTXYZ6.js.map} +0 -0
  679. /package/dist/{chunk-4ZWCQJNM.js.map → chunk-46WM6JX2.js.map} +0 -0
  680. /package/dist/{chunk-CASWJ2HM.js.map → chunk-46ZPIGWI.js.map} +0 -0
  681. /package/dist/{chunk-MCA2X4WH.js.map → chunk-4IHBN6WU.js.map} +0 -0
  682. /package/dist/{chunk-FB7LAJQM.js.map → chunk-4TKJGOCJ.js.map} +0 -0
  683. /package/dist/{chunk-H7BZBSP6.js.map → chunk-52II7PB6.js.map} +0 -0
  684. /package/dist/{chunk-N4Y5T6VD.js.map → chunk-54WHLA65.js.map} +0 -0
  685. /package/dist/{chunk-YVLENSNS.js.map → chunk-5ATKSPEQ.js.map} +0 -0
  686. /package/dist/{chunk-ZVZHG7AI.js.map → chunk-5UBH37SL.js.map} +0 -0
  687. /package/dist/{chunk-N3WZU76A.js.map → chunk-66OJSCI6.js.map} +0 -0
  688. /package/dist/{chunk-D35XLYQ7.js.map → chunk-6CVNSDCZ.js.map} +0 -0
  689. /package/dist/{chunk-KA2HZCMG.js.map → chunk-6NXSYYGP.js.map} +0 -0
  690. /package/dist/{chunk-2HIJHXB3.js.map → chunk-6WHJ2EAB.js.map} +0 -0
  691. /package/dist/{chunk-ZZM476NV.js.map → chunk-6XL73HQ4.js.map} +0 -0
  692. /package/dist/{chunk-EJ5RKUXW.js.map → chunk-AQ7SYDVO.js.map} +0 -0
  693. /package/dist/{chunk-2Z3DG5CQ.js.map → chunk-B3O3IRZN.js.map} +0 -0
  694. /package/dist/{chunk-RACZB5HT.js.map → chunk-BD7JTBYP.js.map} +0 -0
  695. /package/dist/{chunk-I762GW7V.js.map → chunk-BLJWYCNO.js.map} +0 -0
  696. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  697. /package/dist/{chunk-GCASGYIO.js.map → chunk-C7HJ3NEI.js.map} +0 -0
  698. /package/dist/{chunk-C24UZSFW.js.map → chunk-CEH2AFXG.js.map} +0 -0
  699. /package/dist/{chunk-WVGXCBOC.js.map → chunk-D5F7TKMH.js.map} +0 -0
  700. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  701. /package/dist/{chunk-2OXIPF3A.js.map → chunk-DZD3WGCD.js.map} +0 -0
  702. /package/dist/{chunk-UMEOXLIZ.js.map → chunk-E2P7TZTF.js.map} +0 -0
  703. /package/dist/{chunk-6FC3IZ26.js.map → chunk-EBA5DA77.js.map} +0 -0
  704. /package/dist/{chunk-N7JK2RKG.js.map → chunk-EOQ6FSQP.js.map} +0 -0
  705. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  706. /package/dist/{chunk-XDMI5VKE.js.map → chunk-FVOP3NT7.js.map} +0 -0
  707. /package/dist/{chunk-NRLELHAY.js.map → chunk-G7NYVKD6.js.map} +0 -0
  708. /package/dist/{chunk-B3W7GWQB.js.map → chunk-GHTSNGBZ.js.map} +0 -0
  709. /package/dist/{chunk-LUDBXTBJ.js.map → chunk-H272ZPQ3.js.map} +0 -0
  710. /package/dist/{chunk-SN4JXNLL.js.map → chunk-H3TKENU4.js.map} +0 -0
  711. /package/dist/{chunk-4HYNMLT6.js.map → chunk-H4SEGIZY.js.map} +0 -0
  712. /package/dist/{chunk-ACZN5ZXD.js.map → chunk-H54VWRPS.js.map} +0 -0
  713. /package/dist/{chunk-HTP6XRUI.js.map → chunk-HM7RHKS4.js.map} +0 -0
  714. /package/dist/{chunk-Z3SQEEB6.js.map → chunk-HWLIMQE2.js.map} +0 -0
  715. /package/dist/{chunk-2QSZNTDO.js.map → chunk-JBPKEARU.js.map} +0 -0
  716. /package/dist/{chunk-ET2CNMLD.js.map → chunk-JN72EPOE.js.map} +0 -0
  717. /package/dist/{chunk-JCCWJHOP.js.map → chunk-JYZSRNR7.js.map} +0 -0
  718. /package/dist/{chunk-7D6HXODY.js.map → chunk-K7724CH2.js.map} +0 -0
  719. /package/dist/{chunk-X33MJFD2.js.map → chunk-KAXCYM66.js.map} +0 -0
  720. /package/dist/{chunk-7RRUHJPG.js.map → chunk-KB2G2I6Q.js.map} +0 -0
  721. /package/dist/{chunk-ZXBTTMGZ.js.map → chunk-KEF46KL2.js.map} +0 -0
  722. /package/dist/{chunk-UWTDARPF.js.map → chunk-KTWG7CNY.js.map} +0 -0
  723. /package/dist/{chunk-XQYTSZW3.js.map → chunk-L7Z57SID.js.map} +0 -0
  724. /package/dist/{chunk-JMAG7WZ7.js.map → chunk-LO4UKPKX.js.map} +0 -0
  725. /package/dist/{chunk-LDWIPYJ6.js.map → chunk-LS2FHUML.js.map} +0 -0
  726. /package/dist/{chunk-GDB4J2H3.js.map → chunk-MPC7TYTZ.js.map} +0 -0
  727. /package/dist/{chunk-2GF27PGH.js.map → chunk-MRPOZBJC.js.map} +0 -0
  728. /package/dist/{chunk-BR3OOQZQ.js.map → chunk-MWN6QEI2.js.map} +0 -0
  729. /package/dist/{chunk-NZGO2GKL.js.map → chunk-MY5EDR46.js.map} +0 -0
  730. /package/dist/{chunk-LCMUZDBZ.js.map → chunk-N3ZOP7KC.js.map} +0 -0
  731. /package/dist/{chunk-TVW4C7PV.js.map → chunk-NB3LRY4T.js.map} +0 -0
  732. /package/dist/{chunk-QJCWK2A7.js.map → chunk-ND6IQGSZ.js.map} +0 -0
  733. /package/dist/{chunk-NOB2T2FC.js.map → chunk-NHLLKEKK.js.map} +0 -0
  734. /package/dist/{chunk-EJIWBTVM.js.map → chunk-O6ZNNVSP.js.map} +0 -0
  735. /package/dist/{chunk-AG46P24C.js.map → chunk-OB3XMWX5.js.map} +0 -0
  736. /package/dist/{chunk-46QMN7I7.js.map → chunk-PAZY2ZKP.js.map} +0 -0
  737. /package/dist/{chunk-EF4JUM55.js.map → chunk-PX4UMA5Z.js.map} +0 -0
  738. /package/dist/{chunk-NNZFPYYX.js.map → chunk-R7QY5ZVB.js.map} +0 -0
  739. /package/dist/{chunk-RO2X2EYM.js.map → chunk-R7RTXEYG.js.map} +0 -0
  740. /package/dist/{chunk-3LJPSRAN.js.map → chunk-RBCQVOVJ.js.map} +0 -0
  741. /package/dist/{chunk-N4F7ZSSG.js.map → chunk-RC5DXXWC.js.map} +0 -0
  742. /package/dist/{chunk-5CF2R4NS.js.map → chunk-RKBLRTNT.js.map} +0 -0
  743. /package/dist/{chunk-5QZR2RA3.js.map → chunk-ROBHL3GL.js.map} +0 -0
  744. /package/dist/{chunk-D5ZNOKR7.js.map → chunk-S7T2TY65.js.map} +0 -0
  745. /package/dist/{chunk-3LADWWMA.js.map → chunk-SJDQ5RSN.js.map} +0 -0
  746. /package/dist/{chunk-CHWUICVY.js.map → chunk-SV4Z2S67.js.map} +0 -0
  747. /package/dist/{chunk-SEF4IOFE.js.map → chunk-SWIKABKI.js.map} +0 -0
  748. /package/dist/{chunk-JRRQ747T.js.map → chunk-TBXAY2SS.js.map} +0 -0
  749. /package/dist/{chunk-XZBXINXZ.js.map → chunk-TNSCIPBQ.js.map} +0 -0
  750. /package/dist/{chunk-S37NN23M.js.map → chunk-TVEONGBU.js.map} +0 -0
  751. /package/dist/{chunk-5RPMTFB6.js.map → chunk-TWF35IC6.js.map} +0 -0
  752. /package/dist/{chunk-BZTJEILZ.js.map → chunk-U6N5IBVY.js.map} +0 -0
  753. /package/dist/{chunk-7TUB6JWA.js.map → chunk-UCKYTA2T.js.map} +0 -0
  754. /package/dist/{chunk-PPOT6SPR.js.map → chunk-UNNPNBR2.js.map} +0 -0
  755. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  756. /package/dist/{chunk-J2R275FN.js.map → chunk-VVX5PZFS.js.map} +0 -0
  757. /package/dist/{chunk-ME35HVDJ.js.map → chunk-VYCOJKSX.js.map} +0 -0
  758. /package/dist/{chunk-F5UWQ4LX.js.map → chunk-W24T5YMW.js.map} +0 -0
  759. /package/dist/{chunk-HDQUQBPW.js.map → chunk-W3K3HITK.js.map} +0 -0
  760. /package/dist/{chunk-GDASG7NC.js.map → chunk-W4F3C7N7.js.map} +0 -0
  761. /package/dist/{chunk-LFK623SF.js.map → chunk-WJHGDE7X.js.map} +0 -0
  762. /package/dist/{chunk-3Q6RD76J.js.map → chunk-WQZZDN5M.js.map} +0 -0
  763. /package/dist/{chunk-ZJWDWPX6.js.map → chunk-X5K5TAQZ.js.map} +0 -0
  764. /package/dist/{chunk-ZL3XX5LW.js.map → chunk-XM24CDZX.js.map} +0 -0
  765. /package/dist/{chunk-JTWZKNUH.js.map → chunk-XOVKXJEP.js.map} +0 -0
  766. /package/dist/{chunk-X5YYSAZX.js.map → chunk-XUE46UYW.js.map} +0 -0
  767. /package/dist/{chunk-DJORULH3.js.map → chunk-YRLHEEQT.js.map} +0 -0
  768. /package/dist/{chunk-TA7UZZMW.js.map → chunk-Z3O53WZR.js.map} +0 -0
  769. /package/dist/{chunk-4LG4CPOC.js.map → chunk-Z6COGHHN.js.map} +0 -0
  770. /package/dist/{chunk-RE3H6Y2X.js.map → chunk-ZIW5JVRM.js.map} +0 -0
  771. /package/dist/{forget-2AE4MDK3.js.map → forget-SZ2BXDGF.js.map} +0 -0
  772. /package/dist/{resolution-4DLI3IOR.js.map → graph-append-error.js.map} +0 -0
@@ -443,6 +443,45 @@ export function hasCitationForTemplate(text: string, template: string): boolean
443
443
  return matcher.test(text);
444
444
  }
445
445
 
446
+ /**
447
+ * Return the LAST citation marker in `text` for the given template (or the
448
+ * default `[Source: ...]` shape). `attachCitation` always appends at the
449
+ * trimmed end, so the last occurrence is the most recently attached marker —
450
+ * callers use this to lift a just-attached citation off a cited body and
451
+ * re-attach it to a derived body (the merged-target commit path). Returns
452
+ * null when the text carries no marker of this template (including
453
+ * all-placeholder templates that cannot be matched reliably).
454
+ */
455
+ export function lastCitationMarkerForTemplate(
456
+ text: string,
457
+ template: string = DEFAULT_CITATION_FORMAT,
458
+ ): string | null {
459
+ if (typeof text !== "string" || text.length === 0) return null;
460
+ let matcher: RegExp | null;
461
+ if (template === DEFAULT_CITATION_FORMAT) {
462
+ matcher = defaultCitationMatcher();
463
+ } else if (!PLACEHOLDER_REGEX.test(template)) {
464
+ // Fully-literal template: presence is exact inclusion (no placeholders
465
+ // to widen the match).
466
+ PLACEHOLDER_REGEX.lastIndex = 0;
467
+ return text.includes(template) ? template : null;
468
+ } else {
469
+ PLACEHOLDER_REGEX.lastIndex = 0;
470
+ matcher = templateMatcher(template);
471
+ }
472
+ if (!matcher) return null;
473
+ const global = new RegExp(
474
+ matcher.source,
475
+ matcher.flags.includes("g") ? matcher.flags : matcher.flags + "g",
476
+ );
477
+ let last: string | null = null;
478
+ for (let match = global.exec(text); match !== null; match = global.exec(text)) {
479
+ last = match[0];
480
+ if (match[0].length === 0) global.lastIndex++;
481
+ }
482
+ return last;
483
+ }
484
+
446
485
  /**
447
486
  * Attach an inline citation to fact text.
448
487
  *
@@ -589,12 +628,14 @@ export function stripCitation(text: string): string {
589
628
  * templates that differ from the default `[Source: ...]` pattern.
590
629
  *
591
630
  * Behaviour:
592
- * - If the text has a **default-format** citation, delegates to
593
- * {@link stripCitation} (always safe).
594
- * - If the text has a **custom-template** citation detected by
631
+ * - If the text has a **default-format** citation, strips it first
632
+ * (always safe).
633
+ * - Then, if the result has a **custom-template** citation detected by
595
634
  * `hasCitationForTemplate`, builds the template regex and removes every
596
- * occurrence (citations are appended at the end of the fact body by
597
- * {@link attachCitation}).
635
+ * occurrence. BOTH passes run when a body carries both forms a target
636
+ * written under the default format can carry the default marker plus a
637
+ * custom marker appended after a config change; returning after the
638
+ * default pass alone left the custom marker inside hash inputs (#2330).
598
639
  * - All-placeholder templates (no literal prefix/suffix/separator) cannot
599
640
  * produce a reliable matcher. `hasCitationForTemplate` already returns
600
641
  * `false` for such templates, so this function never attempts to strip an
@@ -611,19 +652,18 @@ export function stripCitationForTemplate(
611
652
  ): string {
612
653
  if (typeof text !== "string" || text.length === 0) return text;
613
654
 
614
- // Fast path: default-format citation delegate to the existing stripper.
615
- if (hasCitation(text)) return stripCitation(text);
655
+ // First pass: the default-format marker, if any. A second pass below still
656
+ // runs a body can carry the default marker AND the custom template's
657
+ // marker, and canonicalization must remove every recognized form.
658
+ const afterDefault = hasCitation(text) ? stripCitation(text) : text;
616
659
 
617
- // No default citation; check whether the custom template produced one.
618
- // hasCitationForTemplate returns false for all-placeholder templates (no
619
- // reliable matcher), so those pass through unchanged below.
620
- if (!hasCitationForTemplate(text, template)) return text;
660
+ if (!hasCitationForTemplate(afterDefault, template)) return afterDefault;
621
661
 
622
662
  // Build the template matcher. hasCitationForTemplate already returned true,
623
663
  // which means templateMatcher produced a non-null result. The null branch
624
- // here is a defensive fallback only — delegate to stripCitation.
664
+ // here is a defensive fallback only — the default pass already ran.
625
665
  const matcher = templateMatcher(template);
626
- if (!matcher) return stripCitation(text);
666
+ if (!matcher) return afterDefault;
627
667
 
628
668
  // The matcher regex was built without the global flag; add it for exec loop.
629
669
  const globalMatcher = new RegExp(
@@ -634,12 +674,12 @@ export function stripCitationForTemplate(
634
674
  let lastIndex = 0;
635
675
  let match: RegExpExecArray | null;
636
676
 
637
- while ((match = globalMatcher.exec(text)) !== null) {
677
+ while ((match = globalMatcher.exec(afterDefault)) !== null) {
638
678
  const matchEnd = match.index + match[0].length;
639
- const enclosure = enclosingDelimiterRange(text, match.index, matchEnd);
679
+ const enclosure = enclosingDelimiterRange(afterDefault, match.index, matchEnd);
640
680
  const removalStart = enclosure?.start ?? match.index;
641
681
  const removalEnd = enclosure?.end ?? matchEnd;
642
- const before = text.slice(lastIndex, removalStart).replace(/[ \t]+$/, "");
682
+ const before = afterDefault.slice(lastIndex, removalStart).replace(/[ \t]+$/, "");
643
683
  result += before;
644
684
  lastIndex = removalEnd;
645
685
  // Guard against zero-width matches causing an infinite loop.
@@ -648,7 +688,7 @@ export function stripCitationForTemplate(
648
688
  }
649
689
  }
650
690
 
651
- const after = text.slice(lastIndex).replace(/^[ \t]+/, "");
691
+ const after = afterDefault.slice(lastIndex).replace(/^[ \t]+/, "");
652
692
  if (after.length > 0) {
653
693
  if (result.length > 0) result += " ";
654
694
  result += after;
@@ -13,7 +13,9 @@
13
13
  */
14
14
 
15
15
  import assert from "node:assert/strict";
16
- import { mkdtemp, rm, readFile, writeFile } from "node:fs/promises";
16
+ import { mkdtemp, mkdir, rm, readFile, writeFile, chmod, unlink } from "node:fs/promises";
17
+ import { existsSync } from "node:fs";
18
+ import { randomUUID } from "node:crypto";
17
19
  import os from "node:os";
18
20
  import path from "node:path";
19
21
  import test from "node:test";
@@ -23,8 +25,13 @@ import {
23
25
  listVersions,
24
26
  revertToVersion,
25
27
  getVersion,
28
+ pruneVersions,
29
+ removeVersion,
30
+ recordStrandedCommit,
31
+ sidecarKey,
26
32
  type VersioningConfig,
27
33
  } from "../page-versioning.js";
34
+ import { finalizeMergedVersionPrune } from "../orchestration/semantic-merge-commit-effects.js";
28
35
  import { StorageManager } from "../storage.js";
29
36
  import { resetStaticCaches } from "./harness.js";
30
37
 
@@ -137,3 +144,495 @@ test("versioning: createVersion → revertToVersion round-trip restores content"
137
144
  await rm(dir, { recursive: true, force: true });
138
145
  }
139
146
  });
147
+
148
+ test("versioning: a final prune counts only COMMITTED snapshots — a staged writer's entry is never traded away (round N+15 B)", async () => {
149
+ // Two concurrent merges stage their pre-merge snapshots (deferPrune)
150
+ // before either compare-and-swap commits. Writer A commits and finalizes
151
+ // the prune while writer B is still pending: counting B's uncommitted
152
+ // snapshot would remove one MORE valid rollback point than the cap
153
+ // requires, and B's later abort would leave history short of the cap.
154
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-pending-"));
155
+ try {
156
+ const pagePath = path.join(dir, "facts", "deploy-notes.md");
157
+ await mkdir(path.dirname(pagePath), { recursive: true });
158
+ const config: VersioningConfig = {
159
+ enabled: true,
160
+ maxVersionsPerPage: 3,
161
+ sidecarDir: ".versions",
162
+ };
163
+ for (let index = 1; index <= 3; index += 1) {
164
+ await writeFile(pagePath, `body v${index}`, "utf8");
165
+ await createVersion(pagePath, `body v${index}`, "write", config, undefined, undefined, dir);
166
+ }
167
+ const stagedA = await createVersion(pagePath, "body v3", "semantic-merge", config, undefined, undefined, dir, { deferPrune: true });
168
+ const stagedB = await createVersion(pagePath, "body v3", "semantic-merge", config, undefined, undefined, dir, { deferPrune: true });
169
+
170
+ // Writer A's guarded write commits and finalizes; writer B is still pending.
171
+ await pruneVersions(pagePath, config, undefined, dir, { committedVersionId: stagedA.versionId });
172
+
173
+ const history = await listVersions(pagePath, config, dir);
174
+ assert.deepEqual(
175
+ history.versions.map((version) => version.versionId),
176
+ ["2", "3", stagedA.versionId, stagedB.versionId],
177
+ "exactly ONE committed rollback point (v1) removed; both staged entries stay",
178
+ );
179
+ assert.equal(
180
+ history.versions.find((version) => version.versionId === stagedB.versionId)?.pending,
181
+ true,
182
+ "writer B's staged entry is untouched and still pending",
183
+ );
184
+ assert.equal(
185
+ history.versions.find((version) => version.versionId === stagedA.versionId)?.pending,
186
+ undefined,
187
+ "writer A's finalize marked its own entry committed",
188
+ );
189
+ assert.equal(
190
+ await getVersion(pagePath, "2", config, dir),
191
+ "body v2",
192
+ "v2 survives as a rollback point",
193
+ );
194
+ await assert.rejects(
195
+ getVersion(pagePath, "1", config, dir),
196
+ /not found/,
197
+ "v1 is the one rollback point removed",
198
+ );
199
+
200
+ // Writer B's attempt then aborts (lost compare-and-swap): its entry
201
+ // leaves history without taking any committed rollback point with it.
202
+ await removeVersion(pagePath, stagedB.versionId, config, undefined, dir);
203
+ const after = await listVersions(pagePath, config, dir);
204
+ assert.deepEqual(
205
+ after.versions.map((version) => version.versionId),
206
+ ["2", "3", stagedA.versionId],
207
+ );
208
+ } finally {
209
+ await rm(dir, { recursive: true, force: true });
210
+ }
211
+ });
212
+
213
+ test("versioning: a failed finalization is reconciled by the next successful one — history stays within maxVersionsPerPage (round N+22)", async () => {
214
+ // A finalization whose merge had ALREADY committed can fail transiently
215
+ // (manifest lock timeout, unreadable manifest). Pre-fix, the catch only
216
+ // logged: the staged entry stayed `pending` forever, pruneExcessVersions
217
+ // excludes pending entries, and every such failure stranded one
218
+ // unprunable snapshot beyond the cap. The next successful finalization
219
+ // must reconcile the stranded entry so the prune bounds history again.
220
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-strand-"));
221
+ try {
222
+ const pagePath = path.join(dir, "facts", "strand-notes.md");
223
+ await mkdir(path.dirname(pagePath), { recursive: true });
224
+ const config: VersioningConfig = {
225
+ enabled: true,
226
+ maxVersionsPerPage: 3,
227
+ sidecarDir: ".versions",
228
+ };
229
+ for (let index = 1; index <= 3; index += 1) {
230
+ await writeFile(pagePath, `body v${index}`, "utf8");
231
+ await createVersion(pagePath, `body v${index}`, "write", config, undefined, undefined, dir);
232
+ }
233
+
234
+ // Merge 1: stage the rollback snapshot, commit the merged body, then the
235
+ // finalizing prune FAILS — here via a transiently unreadable manifest
236
+ // (the lock-timeout production shape: pruneVersions throws, the catch is
237
+ // best-effort, the entry stays pending).
238
+ const staged1 = await createVersion(
239
+ pagePath,
240
+ "body v3",
241
+ "semantic-merge",
242
+ config,
243
+ undefined,
244
+ undefined,
245
+ dir,
246
+ { deferPrune: true },
247
+ );
248
+ await writeFile(pagePath, "body merged 1", "utf8");
249
+ const manifestFile = path.join(
250
+ dir,
251
+ ".versions",
252
+ sidecarKey(path.relative(dir, pagePath)),
253
+ "manifest.json",
254
+ );
255
+ const goodManifest = await readFile(manifestFile, "utf-8");
256
+ await writeFile(manifestFile, "{ transiently not json", "utf-8");
257
+ await finalizeMergedVersionPrune(pagePath, config, dir, "fact-strand", staged1.versionId);
258
+ await writeFile(manifestFile, goodManifest, "utf-8");
259
+
260
+ const stranded = await listVersions(pagePath, config, dir);
261
+ assert.equal(
262
+ stranded.versions.find((version) => version.versionId === staged1.versionId)?.pending,
263
+ true,
264
+ "the failed finalization left the committed merge's snapshot pending",
265
+ );
266
+
267
+ // Merge 2: stage, commit, and finalize SUCCESSFULLY. It must clear its
268
+ // own flag AND reconcile merge 1's stranded entry, so the committed set
269
+ // {v1, v2, v3, staged1, staged2} prunes back to the cap.
270
+ const staged2 = await createVersion(
271
+ pagePath,
272
+ "body merged 1",
273
+ "semantic-merge",
274
+ config,
275
+ undefined,
276
+ undefined,
277
+ dir,
278
+ { deferPrune: true },
279
+ );
280
+ await writeFile(pagePath, "body merged 2", "utf8");
281
+ await finalizeMergedVersionPrune(pagePath, config, dir, "fact-strand", staged2.versionId);
282
+
283
+ const history = await listVersions(pagePath, config, dir);
284
+ assert.ok(
285
+ history.versions.length <= config.maxVersionsPerPage,
286
+ `total snapshot count must stay within maxVersionsPerPage=${config.maxVersionsPerPage} (got ${history.versions.length}: ${history.versions.map((v) => v.versionId).join(",")})`,
287
+ );
288
+ assert.deepEqual(
289
+ history.versions.map((version) => version.versionId),
290
+ ["3", staged1.versionId, staged2.versionId],
291
+ "the two oldest committed rollback points are pruned; both merged snapshots stay",
292
+ );
293
+ assert.equal(
294
+ history.versions.filter((version) => version.pending === true).length,
295
+ 0,
296
+ "no entry remains pending after the reconciling finalization",
297
+ );
298
+ } finally {
299
+ await rm(dir, { recursive: true, force: true });
300
+ }
301
+ });
302
+
303
+ test("versioning: stale stranded-commit ids — gone or already-committed entries — are no-ops (round N+22)", async () => {
304
+ // The marker is append-only and never rewritten, so it accumulates ids
305
+ // whose entry was later removed (aborted writer's id reused path) or
306
+ // already cleared by an earlier reconciliation. Reading them must neither
307
+ // throw, clear a still-pending concurrent writer's entry, nor remove any
308
+ // extra committed snapshot.
309
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-stale-"));
310
+ try {
311
+ const pagePath = path.join(dir, "facts", "stale-notes.md");
312
+ await mkdir(path.dirname(pagePath), { recursive: true });
313
+ const config: VersioningConfig = {
314
+ enabled: true,
315
+ maxVersionsPerPage: 3,
316
+ sidecarDir: ".versions",
317
+ };
318
+ for (let index = 1; index <= 3; index += 1) {
319
+ await writeFile(pagePath, `body v${index}`, "utf8");
320
+ await createVersion(pagePath, `body v${index}`, "write", config, undefined, undefined, dir);
321
+ }
322
+ // A still-pending concurrent writer plus stale marker ids: one for an
323
+ // entry that does not exist (999) and one for an already-committed
324
+ // entry ("1"). Neither resolves to a clearable pending entry, and the
325
+ // still-pending writer's entry has NO marker record — only a writer's
326
+ // OWN failed finalization can record its id — so reconciliation must
327
+ // leave it pending and touch nothing else.
328
+ const pendingWriter = await createVersion(
329
+ pagePath,
330
+ "body v3",
331
+ "semantic-merge",
332
+ config,
333
+ undefined,
334
+ undefined,
335
+ dir,
336
+ { deferPrune: true },
337
+ );
338
+ await recordStrandedCommit(pagePath, config, "999", undefined, dir);
339
+ await recordStrandedCommit(pagePath, config, "1", undefined, dir);
340
+ await recordStrandedCommit(pagePath, config, "999", undefined, dir);
341
+
342
+ await pruneVersions(pagePath, config, undefined, dir);
343
+
344
+ const history = await listVersions(pagePath, config, dir);
345
+ assert.equal(
346
+ history.versions.find((version) => version.versionId === pendingWriter.versionId)?.pending,
347
+ true,
348
+ "a still-pending writer's entry is never cleared by marker reconciliation — its id can only be recorded by its OWN failed finalization, never by a stale line",
349
+ );
350
+ assert.deepEqual(
351
+ history.versions.map((version) => version.versionId),
352
+ ["1", "2", "3", pendingWriter.versionId],
353
+ "committed history is untouched by unresolvable marker ids",
354
+ );
355
+ } finally {
356
+ await rm(dir, { recursive: true, force: true });
357
+ }
358
+ });
359
+
360
+ // ── Final round (A): publish-before-cleanup ordering ────────────────────────
361
+ // An aborted merge's removeVersion, a cap prune, and a fresh stage all used to
362
+ // unlink/drop snapshot state BEFORE the manifest publication that records it.
363
+ // When the publication then failed (transient I/O, full disk), the on-disk
364
+ // manifest kept referencing a now-missing snapshot — a dangling reference that
365
+ // getVersion/revert fail on and prune never cleans. The invariant under test:
366
+ // after ANY publication failure, every manifest entry's snapshot stays
367
+ // readable, and the manifest either reflects the mutation or does not — never
368
+ // half of it.
369
+
370
+ test("versioning: a failed manifest publication during abort cleanup never leaves a dangling snapshot reference (final A)", async () => {
371
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-dangling-"));
372
+ try {
373
+ const pagePath = path.join(dir, "facts", "dangling-notes.md");
374
+ await mkdir(path.dirname(pagePath), { recursive: true });
375
+ const config: VersioningConfig = {
376
+ enabled: true,
377
+ maxVersionsPerPage: 10,
378
+ sidecarDir: ".versions",
379
+ };
380
+ await writeFile(pagePath, "body v1", "utf8");
381
+ await createVersion(pagePath, "body v1", "write", config, undefined, undefined, dir);
382
+ const staged = await createVersion(
383
+ pagePath,
384
+ "body v1",
385
+ "semantic-merge",
386
+ config,
387
+ undefined,
388
+ undefined,
389
+ dir,
390
+ { deferPrune: true },
391
+ );
392
+ await writeFile(pagePath, "body merged", "utf8");
393
+
394
+ // Transient publication failure: the manifest file itself is read-only,
395
+ // so a non-atomic overwrite fails while snapshot unlinks (directory
396
+ // permission) still succeed — the exact pre-fix dangling shape.
397
+ const manifestFile = path.join(
398
+ dir,
399
+ ".versions",
400
+ sidecarKey(path.relative(dir, pagePath)),
401
+ "manifest.json",
402
+ );
403
+ await chmod(manifestFile, 0o444);
404
+ let removalCompleted = false;
405
+ try {
406
+ await removeVersion(pagePath, staged.versionId, config, undefined, dir);
407
+ removalCompleted = true;
408
+ } catch {
409
+ // a surfaced publication failure is the safe outcome
410
+ } finally {
411
+ await chmod(manifestFile, 0o644);
412
+ }
413
+
414
+ const history = await listVersions(pagePath, config, dir);
415
+ const stillListed = history.versions.some(
416
+ (version) => version.versionId === staged.versionId,
417
+ );
418
+ assert.notEqual(
419
+ removalCompleted,
420
+ stillListed,
421
+ "the removal either completed (entry gone) or failed (entry stays) — never half-applied",
422
+ );
423
+ for (const version of history.versions) {
424
+ await assert.doesNotReject(
425
+ () => getVersion(pagePath, version.versionId, config, dir),
426
+ `snapshot ${version.versionId} listed in the manifest must stay readable (no dangling reference)`,
427
+ );
428
+ }
429
+ JSON.parse(await readFile(manifestFile, "utf-8"));
430
+ } finally {
431
+ await rm(dir, { recursive: true, force: true });
432
+ }
433
+ });
434
+
435
+ test("versioning: a failed manifest publication during a cap prune never leaves dangling references (final A)", async () => {
436
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-prune-dangling-"));
437
+ try {
438
+ const pagePath = path.join(dir, "facts", "prune-notes.md");
439
+ await mkdir(path.dirname(pagePath), { recursive: true });
440
+ const config: VersioningConfig = {
441
+ enabled: true,
442
+ maxVersionsPerPage: 2,
443
+ sidecarDir: ".versions",
444
+ };
445
+ for (let index = 1; index <= 2; index += 1) {
446
+ await writeFile(pagePath, `body v${index}`, "utf8");
447
+ await createVersion(pagePath, `body v${index}`, "write", config, undefined, undefined, dir);
448
+ }
449
+ const manifestFile = path.join(
450
+ dir,
451
+ ".versions",
452
+ sidecarKey(path.relative(dir, pagePath)),
453
+ "manifest.json",
454
+ );
455
+ await chmod(manifestFile, 0o444);
456
+ let stageCompleted = false;
457
+ try {
458
+ await writeFile(pagePath, "body v3", "utf8");
459
+ await createVersion(pagePath, "body v3", "write", config, undefined, undefined, dir);
460
+ stageCompleted = true;
461
+ } catch {
462
+ // a surfaced publication failure is the safe outcome
463
+ } finally {
464
+ await chmod(manifestFile, 0o644);
465
+ }
466
+
467
+ const history = await listVersions(pagePath, config, dir);
468
+ if (!stageCompleted) {
469
+ assert.deepEqual(
470
+ history.versions.map((version) => version.versionId),
471
+ ["1", "2"],
472
+ "a failed stage leaves the manifest exactly as it was",
473
+ );
474
+ }
475
+ for (const version of history.versions) {
476
+ await assert.doesNotReject(
477
+ () => getVersion(pagePath, version.versionId, config, dir),
478
+ `snapshot ${version.versionId} listed in the manifest must stay readable (no dangling reference)`,
479
+ );
480
+ }
481
+ } finally {
482
+ await rm(dir, { recursive: true, force: true });
483
+ }
484
+ });
485
+
486
+ // ── Final round (B): ownership revalidation before destructive writes ───────
487
+ // The lock's mtime heartbeat is a timer; a section paused past the 30s stale
488
+ // window (CPU-bound pause, suspended process) cannot heartbeat, so a peer can
489
+ // break the lock and commit its own mutation. Every destructive write must
490
+ // revalidate ownership immediately before it lands and abort on loss — the
491
+ // same pattern the graph JSONL lock adopted (GraphWriteLockSection).
492
+
493
+ function fakeManifestEntries(count: number): string {
494
+ const versions = Array.from({ length: count }, (_, index) => ({
495
+ versionId: String(index + 1),
496
+ timestamp: "2026-08-22T00:00:00.000Z",
497
+ contentHash: `hash-${index + 1}`,
498
+ sizeBytes: 10,
499
+ trigger: "write",
500
+ }));
501
+ return `${JSON.stringify(
502
+ { pagePath: "facts/notes.md", versions, currentVersion: String(count) },
503
+ null,
504
+ 2,
505
+ )}\n`;
506
+ }
507
+
508
+ test("versioning: removeVersion whose manifest lock was stale-broken aborts instead of clobbering the peer's committed manifest (final B)", async () => {
509
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-locklost-"));
510
+ try {
511
+ const pagePath = path.join(dir, "facts", "locklost-notes.md");
512
+ await mkdir(path.dirname(pagePath), { recursive: true });
513
+ const config: VersioningConfig = {
514
+ enabled: true,
515
+ maxVersionsPerPage: 10,
516
+ sidecarDir: ".versions",
517
+ };
518
+ const sidecarPageDir = path.join(dir, ".versions", sidecarKey(path.relative(dir, pagePath)));
519
+ const manifestFile = path.join(sidecarPageDir, "manifest.json");
520
+ const lockPath = `${manifestFile}.lock`;
521
+ await mkdir(sidecarPageDir, { recursive: true });
522
+ // Our process's stale-but-current view: two versions.
523
+ await writeFile(manifestFile, fakeManifestEntries(2), "utf8");
524
+ await writeFile(path.join(sidecarPageDir, "1.md"), "body v1", "utf8");
525
+ await writeFile(path.join(sidecarPageDir, "2.md"), "body v2", "utf8");
526
+
527
+ // The peer: stale-breaks our lock mid-section, takes ownership, and
528
+ // commits a newer mutation (version 3) under its own lock.
529
+ const breakAsPeer = (async () => {
530
+ while (!existsSync(lockPath)) await new Promise<void>((resolve) => setImmediate(resolve));
531
+ await unlink(lockPath).catch(() => undefined);
532
+ await writeFile(lockPath, `${process.pid} peer-${randomUUID()} ${new Date().toISOString()}\n`, "utf8");
533
+ await writeFile(path.join(sidecarPageDir, "3.md"), "body v3", "utf8");
534
+ await writeFile(manifestFile, fakeManifestEntries(3), "utf8");
535
+ })();
536
+
537
+ let aborted = false;
538
+ try {
539
+ await removeVersion(pagePath, "2", config, undefined, dir);
540
+ } catch (err) {
541
+ aborted = err instanceof Error && /lost mid-section/.test(err.message);
542
+ }
543
+ await breakAsPeer;
544
+ assert.equal(aborted, true, "a removal whose lock was stale-broken must abort, not publish");
545
+
546
+ const history = await listVersions(pagePath, config, dir);
547
+ assert.deepEqual(
548
+ history.versions.map((version) => version.versionId),
549
+ ["1", "2", "3"],
550
+ "the peer's committed version 3 survives — the stale writer never rewrote the manifest",
551
+ );
552
+ for (const version of history.versions) {
553
+ await assert.doesNotReject(
554
+ () => getVersion(pagePath, version.versionId, config, dir),
555
+ `peer-committed snapshot ${version.versionId} must stay readable`,
556
+ );
557
+ }
558
+ } finally {
559
+ await rm(dir, { recursive: true, force: true });
560
+ }
561
+ });
562
+
563
+ test("versioning: pruneVersions and createVersion whose manifest lock was stale-broken abort instead of publishing (final B)", async () => {
564
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-locklost2-"));
565
+ try {
566
+ const pagePath = path.join(dir, "facts", "locklost2-notes.md");
567
+ await mkdir(path.dirname(pagePath), { recursive: true });
568
+ const config: VersioningConfig = {
569
+ enabled: true,
570
+ maxVersionsPerPage: 2,
571
+ sidecarDir: ".versions",
572
+ };
573
+ const sidecarPageDir = path.join(dir, ".versions", sidecarKey(path.relative(dir, pagePath)));
574
+ const manifestFile = path.join(sidecarPageDir, "manifest.json");
575
+ const lockPath = `${manifestFile}.lock`;
576
+ await mkdir(sidecarPageDir, { recursive: true });
577
+ await writeFile(manifestFile, fakeManifestEntries(3), "utf8");
578
+ for (let index = 1; index <= 3; index += 1) {
579
+ await writeFile(path.join(sidecarPageDir, `${index}.md`), `body v${index}`, "utf8");
580
+ }
581
+
582
+ const breakAsPeer = (async () => {
583
+ while (!existsSync(lockPath)) await new Promise<void>((resolve) => setImmediate(resolve));
584
+ await unlink(lockPath).catch(() => undefined);
585
+ await writeFile(lockPath, `${process.pid} peer-${randomUUID()} ${new Date().toISOString()}\n`, "utf8");
586
+ })();
587
+
588
+ // The prune (over-cap by one) must refuse to publish on a broken lock.
589
+ let pruneAborted = false;
590
+ try {
591
+ await pruneVersions(pagePath, config, undefined, dir);
592
+ } catch (err) {
593
+ pruneAborted = err instanceof Error && /lost mid-section/.test(err.message);
594
+ }
595
+ await breakAsPeer;
596
+ assert.equal(pruneAborted, true, "a prune whose lock was stale-broken must abort, not publish");
597
+
598
+ let history = await listVersions(pagePath, config, dir);
599
+ assert.deepEqual(
600
+ history.versions.map((version) => version.versionId),
601
+ ["1", "2", "3"],
602
+ "the peer's manifest is untouched by the refused prune",
603
+ );
604
+ // The fake peer never releases its lock; clear it so the stage below
605
+ // acquires fresh and the SECOND break lands mid-section, not as a busy
606
+ // 10s acquire timeout against a live-looking peer.
607
+ await unlink(lockPath).catch(() => undefined);
608
+
609
+ // Same contract for staging a new version.
610
+ const breakAsPeer2 = (async () => {
611
+ while (!existsSync(lockPath)) await new Promise<void>((resolve) => setImmediate(resolve));
612
+ await unlink(lockPath).catch(() => undefined);
613
+ await writeFile(lockPath, `${process.pid} peer-${randomUUID()} ${new Date().toISOString()}\n`, "utf8");
614
+ })();
615
+ let stageAborted = false;
616
+ try {
617
+ await createVersion(pagePath, "body v4", "write", config, undefined, undefined, dir);
618
+ } catch (err) {
619
+ stageAborted = err instanceof Error && /lost mid-section/.test(err.message);
620
+ }
621
+ await breakAsPeer2;
622
+ assert.equal(stageAborted, true, "a stage whose lock was stale-broken must abort, not write");
623
+
624
+ history = await listVersions(pagePath, config, dir);
625
+ assert.deepEqual(
626
+ history.versions.map((version) => version.versionId),
627
+ ["1", "2", "3"],
628
+ "the peer's manifest is untouched by the refused stage",
629
+ );
630
+ assert.equal(
631
+ existsSync(path.join(sidecarPageDir, "4.md")),
632
+ false,
633
+ "the refused stage must not leave a snapshot file behind",
634
+ );
635
+ } finally {
636
+ await rm(dir, { recursive: true, force: true });
637
+ }
638
+ });