@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
@@ -16,13 +16,15 @@
16
16
  * 2.md <- version 2 snapshot
17
17
  */
18
18
 
19
- import { createHash } from "node:crypto";
19
+ import { createHash, randomUUID } from "node:crypto";
20
20
  import path from "node:path";
21
21
  import {
22
22
  access,
23
+ appendFile,
23
24
  mkdir,
24
25
  readFile,
25
26
  writeFile,
27
+ rename,
26
28
  unlink,
27
29
  } from "node:fs/promises";
28
30
  import { ALL_CATEGORY_DIRS, RECALL_FALLBACK_DIRS } from "./utils/category-dir.js";
@@ -32,6 +34,7 @@ import {
32
34
  requestEntityCanonicalIdReconcile,
33
35
  } from "./storage/entity-canonical-id-references.js";
34
36
  import { withRawEntityPageMutation } from "./storage/entity-canonical-id-lock.js";
37
+ import { withHeldFileLock, type HeldFileLockController } from "./utils/serialize-mutations.js";
35
38
 
36
39
  // ---------------------------------------------------------------------------
37
40
  // Public interfaces
@@ -44,9 +47,33 @@ export interface PageVersion {
44
47
  sizeBytes: number;
45
48
  trigger: VersionTrigger;
46
49
  note?: string;
50
+ /**
51
+ * True while the snapshot is STAGED by a guarded write that has not yet
52
+ * committed (issue #2330 round N+15 B). Pruning counts — and removes —
53
+ * only committed snapshots: a pending entry belongs to a writer whose
54
+ * compare-and-swap may still fail, so trading it for an older rollback
55
+ * point would leave history short of the cap once that writer aborts
56
+ * (removeVersion). The staging writer clears the flag when its write
57
+ * commits (pruneVersions `committedVersionId`) or drops the entry; a
58
+ * finalization that FAILS after the commit records the id via
59
+ * recordStrandedCommit, and the next pruneVersions clears it (round
60
+ * N+22).
61
+ */
62
+ pending?: boolean;
47
63
  }
48
64
 
49
- export type VersionTrigger = "write" | "consolidation" | "revert" | "manual";
65
+ /**
66
+ * Snapshot triggers. The runtime allow-list in `readManifest` is derived from
67
+ * this array, so adding a trigger cannot leave a written manifest unreadable.
68
+ */
69
+ export const VERSION_TRIGGERS = Object.freeze([
70
+ "write",
71
+ "consolidation",
72
+ "revert",
73
+ "manual",
74
+ "semantic-merge",
75
+ ] as const);
76
+ export type VersionTrigger = (typeof VERSION_TRIGGERS)[number];
50
77
 
51
78
  export interface VersionHistory {
52
79
  pagePath: string;
@@ -87,6 +114,79 @@ function withPageLock<T>(pageKey: string, fn: () => Promise<T>): Promise<T> {
87
114
  return next;
88
115
  }
89
116
 
117
+ // ---------------------------------------------------------------------------
118
+ // Cross-process manifest lock (issue #2330 round N+16 B)
119
+ // ---------------------------------------------------------------------------
120
+
121
+ // withPageLock serializes manifest mutations only within ONE Remnic process.
122
+ // Two processes sharing a memory directory could both read a manifest,
123
+ // compute the SAME next version id, and stage colliding snapshots — and a
124
+ // merge whose content CAS then lost called removeVersion on that shared id,
125
+ // deleting the WINNER's committed rollback point (and concurrent
126
+ // non-atomic manifest writes tore the JSON outright). The mutation now also
127
+ // holds a cross-process advisory lock — the established withHeldFileLock
128
+ // primitive, as a sibling `<manifest>.lock` file (the same `<data>.lock`
129
+ // placement tombstones.jsonl and fact-hashes.txt use). A lock that cannot be
130
+ // taken within the bounded wait FAILS the mutation: staging falls back to
131
+ // the create path, and removal/prune callers already treat a throw as
132
+ // non-fatal — no caller ever proceeds unsynchronized into the collision the
133
+ // lock exists to prevent.
134
+ const MANIFEST_LOCK_STALE_MS = 30_000;
135
+ const MANIFEST_LOCK_MAX_WAIT_MS = 10_000;
136
+
137
+ /**
138
+ * A manifest mutation lost its advisory lock mid-section — a peer stale-broke
139
+ * and replaced it, and the section must abort rather than publish over the
140
+ * peer's committed mutation.
141
+ */
142
+ class ManifestLockLostError extends Error {
143
+ constructor(mPath: string) {
144
+ super(
145
+ `page-versioning: manifest lock for ${mPath} was lost mid-section — a peer stale-broke it; aborting so the peer's mutation survives`,
146
+ );
147
+ this.name = "ManifestLockLostError";
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Revalidate lock ownership immediately before a destructive write (final
153
+ * round B). The lock's mtime heartbeat is a TIMER — it cannot fire while the
154
+ * process is paused past the stale window (CPU-bound section, suspended
155
+ * machine), so a peer can break the lock and commit its own newer mutation
156
+ * while THIS section still believes it holds it. Every mutation calls this
157
+ * immediately before each destructive write (snapshot writeFile, manifest
158
+ * rename, snapshot unlink) and aborts on loss — the same pattern the graph
159
+ * JSONL lock adopted (GraphWriteLockSection / assertGraphLockHeld). A held
160
+ * result also re-stamps the mtime, so the bounded write that follows cannot
161
+ * itself be judged stale mid-write.
162
+ */
163
+ async function assertManifestLockHeld(
164
+ mPath: string,
165
+ lock: HeldFileLockController,
166
+ ): Promise<void> {
167
+ if (!(await lock.refresh())) throw new ManifestLockLostError(mPath);
168
+ }
169
+
170
+ function withManifestLock<T>(
171
+ mPath: string,
172
+ fn: (lock: HeldFileLockController) => Promise<T>,
173
+ ): Promise<T> {
174
+ return withPageLock(mPath, () =>
175
+ withHeldFileLock(
176
+ `${mPath}.lock`,
177
+ { staleMs: MANIFEST_LOCK_STALE_MS, maxWaitMs: MANIFEST_LOCK_MAX_WAIT_MS },
178
+ async (acquired, lock) => {
179
+ if (!acquired) {
180
+ throw new Error(
181
+ `page-versioning: could not acquire the manifest lock for ${mPath} within ${MANIFEST_LOCK_MAX_WAIT_MS}ms — another process holds it`,
182
+ );
183
+ }
184
+ return fn(lock);
185
+ },
186
+ ),
187
+ );
188
+ }
189
+
90
190
  // ---------------------------------------------------------------------------
91
191
  // Internal helpers
92
192
  // ---------------------------------------------------------------------------
@@ -158,7 +258,8 @@ async function readManifest(
158
258
  typeof version.contentHash !== "string" ||
159
259
  typeof version.sizeBytes !== "number" ||
160
260
  !Number.isFinite(version.sizeBytes) ||
161
- !["write", "consolidation", "revert", "manual"].includes(String(version.trigger))
261
+ !(VERSION_TRIGGERS as readonly string[]).includes(String(version.trigger)) ||
262
+ (version.pending !== undefined && typeof version.pending !== "boolean")
162
263
  ) {
163
264
  throw new Error(`manifest version ${index} has invalid shape`);
164
265
  }
@@ -183,7 +284,43 @@ async function writeManifest(
183
284
  const dir = sidecarDir(memoryDir, sidecar, pagePath);
184
285
  await mkdir(dir, { recursive: true });
185
286
  const mp = manifestPath(memoryDir, sidecar, pagePath);
186
- await writeFile(mp, JSON.stringify(history, null, 2) + "\n", "utf-8");
287
+ // Final round (A): publish atomically write the temp file, then rename
288
+ // it over the manifest. A crash or transient failure can no longer leave a
289
+ // torn or truncated manifest behind, and the publish-before-cleanup
290
+ // ordering in every mutation guarantees a failed publication never strands
291
+ // a manifest entry whose snapshot file is already gone.
292
+ const tmp = `${mp}.${process.pid}.${randomUUID()}.tmp`;
293
+ try {
294
+ await writeFile(tmp, JSON.stringify(history, null, 2) + "\n", "utf8");
295
+ await rename(tmp, mp);
296
+ } catch (err) {
297
+ await unlink(tmp).catch(() => undefined);
298
+ throw err;
299
+ }
300
+ }
301
+
302
+ // Round N+22: stranded-commit marker. A finalization whose merge had
303
+ // ALREADY committed can still fail (manifest lock timeout, transient I/O),
304
+ // leaving its staged entry `pending` forever — pruneExcessVersions excludes
305
+ // pending entries, so every such failure stranded one unprunable snapshot
306
+ // and repeated failures grew history past maxVersionsPerPage. The failed
307
+ // finalization appends the (known-committed) version id to this marker (a
308
+ // sibling `<manifest>.stranded` file, one id per line); the next
309
+ // pruneVersions for the page reconciles those ids under the manifest lock.
310
+ // Append-only by design: a one-line O_APPEND write is atomic, and a
311
+ // clear-side rewrite could clobber an id appended by a finalization that
312
+ // just failed against the very lock the clear holds. Ids whose entry is gone
313
+ // or already committed are read-side no-ops, so stale lines cost one skipped
314
+ // lookup each and the file is bounded by finalization failures (one small
315
+ // line each). A writer that CRASHES mid-attempt records nothing — that case
316
+ // stays covered by the pending-exclusion itself.
317
+ async function readStrandedCommits(markerPath: string): Promise<string[]> {
318
+ try {
319
+ const raw = await readFile(markerPath, "utf-8");
320
+ return raw.split("\n").filter((line) => /^\d+$/.test(line.trim()));
321
+ } catch {
322
+ return [];
323
+ }
187
324
  }
188
325
 
189
326
  // ---------------------------------------------------------------------------
@@ -198,7 +335,14 @@ async function writeManifest(
198
335
  * `content` is snapshotted as version 1.
199
336
  *
200
337
  * Pruning: when the number of versions exceeds `config.maxVersionsPerPage`,
201
- * the oldest snapshots (and their files) are removed.
338
+ * the oldest snapshots (and their files) are removed. Pass
339
+ * `options.deferPrune` to stage the snapshot WITHOUT pruning and finalize
340
+ * with {@link pruneVersions} once the guarded write that staged it commits —
341
+ * a failed attempt then leaves the history untouched instead of discarding
342
+ * the oldest rollback point (issue #2330 round N+11 C). A deferred snapshot
343
+ * is recorded `pending` until its writer commits (round N+15 B); pruning
344
+ * counts only committed snapshots, so no prune can trade another writer's
345
+ * staged entry for an older rollback point.
202
346
  */
203
347
  export async function createVersion(
204
348
  pagePath: string,
@@ -208,12 +352,13 @@ export async function createVersion(
208
352
  log: VersioningLogger = NOOP_LOGGER,
209
353
  note?: string,
210
354
  memoryDir?: string,
355
+ options?: { deferPrune?: boolean },
211
356
  ): Promise<PageVersion> {
212
357
  const { sidecarDir: sidecar, maxVersionsPerPage } = config;
213
358
  const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);
214
359
  const mPath = manifestPath(resolvedMemoryDir, sidecar, relPath(pagePath, resolvedMemoryDir));
215
360
 
216
- return withPageLock(mPath, async () => {
361
+ return withManifestLock(mPath, async (lock) => {
217
362
  const history = await readManifest(resolvedMemoryDir, sidecar, relPath(pagePath, resolvedMemoryDir));
218
363
  const nextId = String(history.versions.length > 0
219
364
  ? Math.max(...history.versions.map((v) => Number(v.versionId))) + 1
@@ -224,41 +369,270 @@ export async function createVersion(
224
369
  versionId: nextId,
225
370
  timestamp: new Date().toISOString(),
226
371
  contentHash: hash,
227
- sizeBytes: Buffer.byteLength(content, "utf-8"),
372
+ sizeBytes: Buffer.byteLength(content, "utf8"),
228
373
  trigger,
229
374
  ...(note !== undefined ? { note } : {}),
375
+ ...(options?.deferPrune === true ? { pending: true } : {}),
230
376
  };
231
377
 
232
- // Write snapshot file
233
378
  const dir = sidecarDir(resolvedMemoryDir, sidecar, relPath(pagePath, resolvedMemoryDir));
234
379
  await mkdir(dir, { recursive: true });
235
380
  const ext = path.extname(pagePath) || ".md";
236
381
  const snapshotPath = path.join(dir, `${nextId}${ext}`);
237
- await writeFile(snapshotPath, content, "utf-8");
382
+ // Final round (B): revalidate ownership immediately before the staged
383
+ // snapshot write — a peer that stale-broke the lock may have committed a
384
+ // mutation reusing this id, and overwriting its file would corrupt the
385
+ // peer's published rollback point.
386
+ await assertManifestLockHeld(mPath, lock);
387
+ await writeFile(snapshotPath, content, "utf8");
238
388
 
239
389
  history.versions.push(version);
240
390
  history.currentVersion = nextId;
241
391
 
242
- // Prune old versions if exceeding max
243
- if (maxVersionsPerPage > 0 && history.versions.length > maxVersionsPerPage) {
244
- const toRemove = history.versions.splice(0, history.versions.length - maxVersionsPerPage);
245
- for (const old of toRemove) {
246
- const oldPath = path.join(dir, `${old.versionId}${ext}`);
247
- try {
248
- await unlink(oldPath);
249
- } catch {
250
- log.debug(`page-versioning: could not remove old snapshot ${oldPath}`);
251
- }
252
- }
253
- }
254
-
392
+ // Final round (A): the prune only COMPUTES the removal here; the
393
+ // manifest publishes it (atomic rename), and only then are the pruned
394
+ // snapshot files unlinked a publication failure leaves the manifest
395
+ // and the files exactly as they were, never a dangling reference.
396
+ // The prune is skipped when the caller deferred it until its guarded
397
+ // write commits (issue #2330 round N+11 C).
398
+ const pruned = options?.deferPrune === true
399
+ ? []
400
+ : pruneExcessVersions(history, maxVersionsPerPage);
401
+ await assertManifestLockHeld(mPath, lock);
255
402
  await writeManifest(resolvedMemoryDir, sidecar, relPath(pagePath, resolvedMemoryDir), history);
403
+ await unlinkPublishedSnapshots(mPath, lock, dir, ext, pruned, log);
256
404
  log.debug(`page-versioning: created version ${nextId} for ${pagePath} (trigger=${trigger})`);
257
405
 
258
406
  return version;
259
407
  });
260
408
  }
261
409
 
410
+ /**
411
+ * Compute the excess COMMITTED snapshots and drop them from `history`,
412
+ * returning the pruned entries WITHOUT touching any file — the caller
413
+ * publishes the manifest first and unlinks the files only afterwards
414
+ * ({@link unlinkPublishedSnapshots}, final round A). The caller holds the
415
+ * manifest lock.
416
+ */
417
+ function pruneExcessVersions(
418
+ history: VersionHistory,
419
+ maxVersionsPerPage: number,
420
+ ): PageVersion[] {
421
+ if (!(maxVersionsPerPage > 0)) return [];
422
+ // Round N+15 (B): count only COMMITTED snapshots. Two concurrent merges
423
+ // can both stage (deferPrune) before either commits; a prune that counted
424
+ // the other writer's pending entry would drop one more rollback point
425
+ // than the cap requires, and that writer's abort (removeVersion) then
426
+ // leaves history SHORT of the cap. Pending entries are skipped entirely —
427
+ // never counted, never removed. (ponytail: a writer that dies mid-attempt
428
+ // leaves its entry pending forever — bounded by one entry per crash;
429
+ // age-based expiry if crash loops ever make that matter. A finalization
430
+ // that fails AFTER its merge committed no longer strands its entry —
431
+ // pruneVersions reconciles those from the stranded-commit marker, round
432
+ // N+22.)
433
+ const excess =
434
+ history.versions.filter((version) => version.pending !== true).length -
435
+ maxVersionsPerPage;
436
+ if (excess <= 0) return [];
437
+ const toRemove = new Set<PageVersion>();
438
+ for (const version of history.versions) {
439
+ if (toRemove.size >= excess) break;
440
+ if (version.pending === true) continue;
441
+ toRemove.add(version);
442
+ }
443
+ history.versions = history.versions.filter((version) => !toRemove.has(version));
444
+ return [...toRemove];
445
+ }
446
+
447
+ /**
448
+ * Best-effort removal of snapshot files whose removal the manifest has
449
+ * ALREADY published (final round A). Ownership is revalidated first: after a
450
+ * lock loss, a peer's fresh mutation may have reused a removed id, and
451
+ * unlinking its file would leave the PEER's manifest with a dangling
452
+ * reference — so a lost lock aborts the cleanup (the caller surfaces the
453
+ * error; the already-published manifest stays consistent, and the skipped
454
+ * files are unreferenced orphans, never dangling references).
455
+ */
456
+ async function unlinkPublishedSnapshots(
457
+ mPath: string,
458
+ lock: HeldFileLockController,
459
+ dir: string,
460
+ ext: string,
461
+ pruned: PageVersion[],
462
+ log: VersioningLogger,
463
+ ): Promise<void> {
464
+ if (pruned.length === 0) return;
465
+ await assertManifestLockHeld(mPath, lock);
466
+ for (const old of pruned) {
467
+ const oldPath = path.join(dir, `${old.versionId}${ext}`);
468
+ try {
469
+ await unlink(oldPath);
470
+ } catch {
471
+ log.debug(`page-versioning: could not remove old snapshot ${oldPath}`);
472
+ }
473
+ }
474
+ }
475
+
476
+ /**
477
+ * Finalize a deferred prune: drop the oldest COMMITTED snapshots (and their
478
+ * files) until the history is back at `config.maxVersionsPerPage`. Call only
479
+ * after the guarded write that staged the snapshot has committed — a failed
480
+ * attempt never calls this, so it cannot discard rollback points. Pass
481
+ * `options.committedVersionId` to clear the staging writer's `pending` flag
482
+ * under the SAME page lock as the prune (round N+15 B): the entry becomes
483
+ * countable exactly when — and only when — its writer's write has committed,
484
+ * so a concurrent still-pending writer's entry is never counted or removed.
485
+ *
486
+ * Round N+22: each call also reconciles entries stranded by an EARLIER
487
+ * finalization that failed after its merge committed (see
488
+ * {@link recordStrandedCommit}) — their `pending` flags clear here, under
489
+ * the same lock, so a transient finalization failure cannot permanently
490
+ * exclude a committed snapshot from the prune bound.
491
+ */
492
+ export async function pruneVersions(
493
+ pagePath: string,
494
+ config: VersioningConfig,
495
+ log: VersioningLogger = NOOP_LOGGER,
496
+ memoryDir?: string,
497
+ options?: { committedVersionId?: string },
498
+ ): Promise<void> {
499
+ const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);
500
+ const rel = relPath(pagePath, resolvedMemoryDir);
501
+ const mPath = manifestPath(resolvedMemoryDir, config.sidecarDir, rel);
502
+ await withManifestLock(mPath, async (lock) => {
503
+ const history = await readManifest(resolvedMemoryDir, config.sidecarDir, rel);
504
+ const before = history.versions.length;
505
+ let committedCleared = false;
506
+ if (options?.committedVersionId !== undefined) {
507
+ const staged = history.versions.find(
508
+ (version) =>
509
+ version.versionId === options.committedVersionId && version.pending === true,
510
+ );
511
+ if (staged) {
512
+ delete staged.pending;
513
+ committedCleared = true;
514
+ }
515
+ }
516
+ // Marker ids are known-COMMITTED by construction: only a finalization
517
+ // failure for an already-committed merge records one, so clearing them
518
+ // here can never trade away a concurrent still-pending writer's entry.
519
+ let strandedCleared = 0;
520
+ for (const id of await readStrandedCommits(`${mPath}.stranded`)) {
521
+ const stranded = history.versions.find(
522
+ (version) => version.versionId === id && version.pending === true,
523
+ );
524
+ if (stranded) {
525
+ delete stranded.pending;
526
+ strandedCleared += 1;
527
+ }
528
+ }
529
+ // Final round (A): compute the prune, PUBLISH the manifest (atomic
530
+ // rename), and only then unlink the pruned snapshot files best-effort —
531
+ // a publication failure leaves manifest and files mutually consistent.
532
+ const pruned = pruneExcessVersions(history, config.maxVersionsPerPage);
533
+ if (history.versions.length !== before || committedCleared || strandedCleared > 0) {
534
+ await assertManifestLockHeld(mPath, lock);
535
+ await writeManifest(resolvedMemoryDir, config.sidecarDir, rel, history);
536
+ }
537
+ await unlinkPublishedSnapshots(
538
+ mPath,
539
+ lock,
540
+ sidecarDir(resolvedMemoryDir, config.sidecarDir, rel),
541
+ path.extname(pagePath) || ".md",
542
+ pruned,
543
+ log,
544
+ );
545
+ if (strandedCleared > 0) {
546
+ log.debug(
547
+ `page-versioning: reconciled ${strandedCleared} stranded committed snapshot(s) for ${pagePath}`,
548
+ );
549
+ }
550
+ });
551
+ }
552
+
553
+ /**
554
+ * Record that the guarded write behind `versionId` COMMITTED but its
555
+ * finalizing prune failed (round N+22) — the entry's `pending` flag could
556
+ * not be cleared, so without this record the snapshot stayed excluded from
557
+ * pruning forever. The next {@link pruneVersions} for the page reconciles
558
+ * the id from the marker. Best-effort: a marker-write failure is logged and
559
+ * never thrown (the caller is already on an error path).
560
+ */
561
+ export async function recordStrandedCommit(
562
+ pagePath: string,
563
+ config: VersioningConfig,
564
+ versionId: string,
565
+ log: VersioningLogger = NOOP_LOGGER,
566
+ memoryDir?: string,
567
+ ): Promise<void> {
568
+ const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);
569
+ const rel = relPath(pagePath, resolvedMemoryDir);
570
+ try {
571
+ await appendFile(
572
+ `${manifestPath(resolvedMemoryDir, config.sidecarDir, rel)}.stranded`,
573
+ `${versionId}\n`,
574
+ "utf-8",
575
+ );
576
+ } catch (err) {
577
+ log.warn(
578
+ `page-versioning: could not record stranded commit ${versionId} (non-fatal): ${err instanceof Error ? err.message : String(err)}`,
579
+ );
580
+ }
581
+ }
582
+
583
+ /**
584
+ * Remove ONE version from the manifest and delete its snapshot file.
585
+ * Idempotent: a version already gone (or never present) is a no-op.
586
+ *
587
+ * Used by guarded-write callers whose staged snapshot must not survive an
588
+ * aborted attempt (issue #2330 round N+13 B): staging itself mutates
589
+ * history, and without this rollback repeated failed attempts grow history
590
+ * past `maxVersionsPerPage`, so a later successful commit's prune trades
591
+ * real rollback states for duplicate failed-attempt snapshots of a body that
592
+ * never changed. Never call this for a version a committed write relies on.
593
+ * `currentVersion` returns to the newest remaining snapshot (or `"0"` when
594
+ * history emptied) — never to a removed id.
595
+ */
596
+ export async function removeVersion(
597
+ pagePath: string,
598
+ versionId: string,
599
+ config: VersioningConfig,
600
+ log: VersioningLogger = NOOP_LOGGER,
601
+ memoryDir?: string,
602
+ ): Promise<void> {
603
+ const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);
604
+ const rel = relPath(pagePath, resolvedMemoryDir);
605
+ const mPath = manifestPath(resolvedMemoryDir, config.sidecarDir, rel);
606
+ await withManifestLock(mPath, async (lock) => {
607
+ const history = await readManifest(resolvedMemoryDir, config.sidecarDir, rel);
608
+ const index = history.versions.findIndex((version) => version.versionId === versionId);
609
+ if (index === -1) return;
610
+ const removed = history.versions[index];
611
+ history.versions.splice(index, 1);
612
+ history.currentVersion = history.versions.length > 0
613
+ ? String(Math.max(...history.versions.map((version) => Number(version.versionId))))
614
+ : "0";
615
+ // Final round (A): PUBLISH the manifest (atomic rename) BEFORE touching
616
+ // the snapshot file. The old order unlinked first — a publication
617
+ // failure (transient I/O, full disk) then left the on-disk manifest
618
+ // referencing a now-missing snapshot: an unusable rollback entry that
619
+ // getVersion/revert fail on and prune never cleans. Publish-first means
620
+ // a failed publication leaves manifest AND file untouched; the unlink
621
+ // only runs once the removal is durably published.
622
+ await assertManifestLockHeld(mPath, lock);
623
+ await writeManifest(resolvedMemoryDir, config.sidecarDir, rel, history);
624
+ await unlinkPublishedSnapshots(
625
+ mPath,
626
+ lock,
627
+ sidecarDir(resolvedMemoryDir, config.sidecarDir, rel),
628
+ path.extname(pagePath) || ".md",
629
+ [removed],
630
+ log,
631
+ );
632
+ log.debug(`page-versioning: removed version ${versionId} for ${pagePath}`);
633
+ });
634
+ }
635
+
262
636
  /**
263
637
  * List all versions for a page.
264
638
  */
@@ -16,6 +16,7 @@ import { buildProcedurePersistBody, normalizeProcedureSteps, type ProcedureStep
16
16
  import { clusterByKey } from "./reinforcement-core.js";
17
17
  import { log } from "../logger.js";
18
18
  import { composeMemoryEnvelope, STRUCTURED_ATTRIBUTE_LIMITS } from "../write-envelope.js";
19
+ import { isErrnoCode } from "../utils/errno.js";
19
20
 
20
21
  /** Must match truncation on `procedure_cluster` structured attribute (dedupe + storage). */
21
22
  const PROCEDURE_CLUSTER_ATTR_MAX = 500;
@@ -53,15 +54,6 @@ function clusterKeyHash(cluster: string): string {
53
54
  return createHash("sha256").update(cluster).digest("hex");
54
55
  }
55
56
 
56
- function isErrnoCode(error: unknown, code: string): boolean {
57
- return (
58
- typeof error === "object" &&
59
- error !== null &&
60
- "code" in error &&
61
- (error as { code?: unknown }).code === code
62
- );
63
- }
64
-
65
57
  function sleep(ms: number): Promise<void> {
66
58
  return new Promise((resolve) => setTimeout(resolve, ms));
67
59
  }
@@ -2,6 +2,7 @@ import path from "node:path";
2
2
  import { lstat, readdir, readFile, realpath } from "node:fs/promises";
3
3
  import { RECALL_FALLBACK_DIRS } from "../utils/category-dir.js";
4
4
  import { assertPathInsideRoot } from "../utils/path-containment.js";
5
+ import { isErrnoCode } from "../utils/errno.js";
5
6
 
6
7
  export interface IndexableDocument {
7
8
  /** Memory ID from frontmatter or filename stem */
@@ -83,7 +84,7 @@ async function scanDir(dir: string, memoryRootReal: string): Promise<IndexableDo
83
84
  }
84
85
  }
85
86
  } catch (err) {
86
- if (isNodeError(err) && err.code === "ENOENT") {
87
+ if (isErrnoCode(err, "ENOENT")) {
87
88
  // Optional category directories may not exist yet.
88
89
  return docs;
89
90
  }
@@ -92,10 +93,6 @@ async function scanDir(dir: string, memoryRootReal: string): Promise<IndexableDo
92
93
  return docs;
93
94
  }
94
95
 
95
- function isNodeError(err: unknown): err is NodeJS.ErrnoException {
96
- return typeof err === "object" && err !== null && "code" in err;
97
- }
98
-
99
96
  /**
100
97
  * Scan every recall category subdir of memoryDir for indexable markdown
101
98
  * documents. The directory set is derived from `RECALL_FALLBACK_DIRS`
@@ -114,7 +111,7 @@ export async function scanMemoryDir(memoryDir: string): Promise<IndexableDocumen
114
111
  try {
115
112
  memoryRootReal = await realpath(memoryDir);
116
113
  } catch (err) {
117
- if (isNodeError(err) && err.code === "ENOENT") {
114
+ if (isErrnoCode(err, "ENOENT")) {
118
115
  return [];
119
116
  }
120
117
  throw err;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Configuration shape for judge-mediated merge-on-write (issue #2330).
3
+ *
4
+ * Kept in its own module rather than in `types.ts`, which sits at its
5
+ * grandfathered size ceiling (issue #1995). This file deliberately imports
6
+ * nothing: `types.ts` re-exports the type and `dedup/` consumes it, so a
7
+ * shared leaf module is what keeps that from becoming an import cycle.
8
+ */
9
+
10
+ export interface SemanticMergeConfig {
11
+ enabled: boolean;
12
+ minSimilarity: number;
13
+ maxCandidates: number;
14
+ categories: readonly string[];
15
+ shadowMode: boolean;
16
+ }
@@ -6,6 +6,7 @@ import path from "node:path";
6
6
  import { setTimeout as sleep } from "node:timers/promises";
7
7
  import { StorageManager } from "./storage.js";
8
8
  import type { MemoryFile, MemoryLink } from "./types.js";
9
+ import { isErrnoCode } from "./utils/errno.js";
9
10
 
10
11
  export interface SemanticRulePromotionCandidate {
11
12
  id: string;
@@ -79,10 +80,6 @@ function promotionLockHeartbeatMs(): number {
79
80
  return testHooks?.heartbeatMs ?? PROMOTION_LOCK_HEARTBEAT_MS;
80
81
  }
81
82
 
82
- function isErrnoCode(err: unknown, code: string): boolean {
83
- return typeof err === "object" && err !== null && "code" in err && (err as { code?: unknown }).code === code;
84
- }
85
-
86
83
  function promotionLockDir(memoryDir: string, ruleKey: string): string {
87
84
  const digest = createHash("sha256").update(ruleKey).digest("hex");
88
85
  return path.join(path.resolve(memoryDir), "state", "semantic-rule-promotion-locks", `${digest}.lock`);
@@ -119,6 +119,27 @@ test("stripCitationForTemplate: custom template — strips custom citation", ()
119
119
  assert.equal(result, body);
120
120
  });
121
121
 
122
+ // #2330 round N+8 (P2-C): a body tagged under the DEFAULT format can later
123
+ // receive a CUSTOM template marker after a config change. Canonicalization
124
+ // must strip BOTH recognized forms in either order — the default fast path
125
+ // alone left the custom marker inside the hash input.
126
+ test("stripCitationForTemplate: mixed default + custom markers — strips both, in either order", () => {
127
+ const body = "Cache TTL is 30 seconds.";
128
+ const template = "[src:{agent}@{date}]";
129
+ const defaultCited = `[Source: agent=planner, session=main, ts=2026-04-10T00:00:00Z]`;
130
+ const customCited = `[src:scout@2026-04-11]`;
131
+ assert.equal(
132
+ stripCitationForTemplate(`${body} ${defaultCited} ${customCited}`, template),
133
+ body,
134
+ "default marker first: both forms stripped",
135
+ );
136
+ assert.equal(
137
+ stripCitationForTemplate(`${body} ${customCited} ${defaultCited}`, template),
138
+ body,
139
+ "custom marker first: both forms stripped",
140
+ );
141
+ });
142
+
122
143
  test("stripCitationForTemplate: all-placeholder template (no literal anchors) — text returned unchanged", () => {
123
144
  // A template with no literal prefix, suffix, or separator between
124
145
  // placeholders cannot produce a reliable matcher. hasCitationForTemplate