@remnic/core 9.45.3 → 9.45.5

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 (766) hide show
  1. package/dist/abort-error.d.ts +2 -1
  2. package/dist/abort-error.js +3 -1
  3. package/dist/access-admin-ops-surface.d.ts +14 -10
  4. package/dist/access-admin-ops-surface.js +84 -75
  5. package/dist/access-audit.js +2 -2
  6. package/dist/access-authorization-probe.d.ts +14 -10
  7. package/dist/access-authorization-probe.js +85 -76
  8. package/dist/access-boundary.d.ts +15 -11
  9. package/dist/access-boundary.js +84 -75
  10. package/dist/access-citation-namespace.js +2 -2
  11. package/dist/access-cli.js +191 -177
  12. package/dist/access-cli.js.map +1 -1
  13. package/dist/access-coding-context-resolution.d.ts +16 -0
  14. package/dist/access-coding-context-resolution.js +13 -0
  15. package/dist/access-coding-context-resolution.js.map +1 -0
  16. package/dist/access-extraction-force-flush.d.ts +14 -10
  17. package/dist/access-extraction-force-flush.js +84 -75
  18. package/dist/access-health-types.d.ts +2 -1
  19. package/dist/access-http-lcm-compaction.d.ts +16 -12
  20. package/dist/access-http-lcm-compaction.js +3 -3
  21. package/dist/access-http-lifecycle-flush.d.ts +14 -10
  22. package/dist/access-http-lifecycle-flush.js +2 -2
  23. package/dist/access-http-offline-stream.d.ts +123 -0
  24. package/dist/access-http-offline-stream.js +10 -0
  25. package/dist/access-http-offline-stream.js.map +1 -0
  26. package/dist/access-http-query.js +84 -75
  27. package/dist/access-http.d.ts +15 -11
  28. package/dist/access-http.js +104 -90
  29. package/dist/access-identity-continuity-surface.d.ts +9 -8
  30. package/dist/access-identity-continuity-surface.js +84 -75
  31. package/dist/access-lcm-surface.d.ts +14 -10
  32. package/dist/access-lcm-surface.js +84 -75
  33. package/dist/access-mcp-output-schemas.js +1 -1
  34. package/dist/access-mcp.d.ts +14 -10
  35. package/dist/access-mcp.js +95 -82
  36. package/dist/access-memory-search-fanout.d.ts +3 -2
  37. package/dist/{access-namespace-preflight-5yZ4g6F8.d.ts → access-namespace-preflight-CWUDwB4M.d.ts} +1 -1
  38. package/dist/access-namespace-preflight.d.ts +4 -3
  39. package/dist/access-namespace-preflight.js +84 -75
  40. package/dist/access-observe-helpers.d.ts +1 -0
  41. package/dist/access-observe-helpers.js +1 -1
  42. package/dist/access-observe-write-surface.d.ts +16 -10
  43. package/dist/access-observe-write-surface.js +84 -75
  44. package/dist/access-offline-manifest.d.ts +104 -0
  45. package/dist/access-offline-manifest.js +45 -0
  46. package/dist/access-offline-manifest.js.map +1 -0
  47. package/dist/access-operations-batch.js +86 -77
  48. package/dist/access-operations.d.ts +18 -14
  49. package/dist/access-operations.js +91 -79
  50. package/dist/access-recall-concurrency.d.ts +16 -26
  51. package/dist/access-recall-concurrency.js +86 -76
  52. package/dist/access-recall-response.d.ts +18 -14
  53. package/dist/access-recall-response.js +84 -75
  54. package/dist/access-recall-surface.d.ts +29 -24
  55. package/dist/access-recall-surface.js +84 -75
  56. package/dist/access-schema.d.ts +84 -84
  57. package/dist/access-schema.js +3 -3
  58. package/dist/{access-service-CiJRsgAB.d.ts → access-service-CNN89xyn.d.ts} +25 -16
  59. package/dist/access-service-helpers.d.ts +14 -10
  60. package/dist/access-service.d.ts +14 -10
  61. package/dist/access-service.js +84 -75
  62. package/dist/access-surface-catalog.d.ts +14 -10
  63. package/dist/access-surface-catalog.js +4 -0
  64. package/dist/access-surface-catalog.js.map +1 -1
  65. package/dist/access-wearables-meetings-surface.d.ts +4 -3
  66. package/dist/action-confidence.d.ts +2 -1
  67. package/dist/active-memory-bridge.d.ts +2 -1
  68. package/dist/active-recall.d.ts +2 -1
  69. package/dist/active-recall.js +10 -8
  70. package/dist/active-recall.js.map +1 -1
  71. package/dist/adapters/index.js +4 -4
  72. package/dist/adapters/registry.js +2 -2
  73. package/dist/{auto-sync-5OE5QOZB.js → auto-sync-UPTUVE4X.js} +6 -6
  74. package/dist/behavior-learner.d.ts +2 -1
  75. package/dist/behavior-learner.js +1 -1
  76. package/dist/behavior-signals.d.ts +2 -1
  77. package/dist/bootstrap.d.ts +9 -8
  78. package/dist/briefing.d.ts +3 -2
  79. package/dist/briefing.js +24 -22
  80. package/dist/buffer-surprise-report.d.ts +2 -1
  81. package/dist/buffer-turn-helpers.d.ts +2 -1
  82. package/dist/buffer.d.ts +3 -2
  83. package/dist/buffer.js +12 -11
  84. package/dist/bulk-import/index.d.ts +4 -3
  85. package/dist/calibration.d.ts +2 -1
  86. package/dist/capabilities.d.ts +2 -1
  87. package/dist/{capsule-merge-IDWJPCWK.js → capsule-merge-Q6AR3XL7.js} +67 -54
  88. package/dist/capsule-merge-Q6AR3XL7.js.map +1 -0
  89. package/dist/{catalog-scBmy0sO.d.ts → catalog-bctMURhN.d.ts} +1 -1
  90. package/dist/causal-behavior.d.ts +2 -1
  91. package/dist/causal-behavior.js +2 -2
  92. package/dist/causal-chain.js +2 -2
  93. package/dist/causal-consolidation.d.ts +2 -1
  94. package/dist/causal-consolidation.js +28 -26
  95. package/dist/causal-consolidation.js.map +1 -1
  96. package/dist/causal-retrieval.js +2 -2
  97. package/dist/causal-trajectory-graph.d.ts +2 -1
  98. package/dist/causal-trajectory.js +1 -1
  99. package/dist/{chunk-E5UK4VPE.js → chunk-2FSTB6BJ.js} +5 -5
  100. package/dist/{chunk-5ZE7QHTK.js → chunk-2X2T2UVE.js} +5 -5
  101. package/dist/{chunk-P4DRWEYC.js → chunk-3COYXTGM.js} +2 -2
  102. package/dist/{chunk-5IVLTFOV.js → chunk-44N6ESJ4.js} +2 -2
  103. package/dist/{chunk-DL7ZD3JH.js → chunk-4FBVAGV3.js} +14 -9
  104. package/dist/chunk-4FBVAGV3.js.map +1 -0
  105. package/dist/{chunk-WOCNN776.js → chunk-4POAMKV6.js} +100 -41
  106. package/dist/chunk-4POAMKV6.js.map +1 -0
  107. package/dist/{chunk-HO3QBJEY.js → chunk-5546W5SI.js} +2 -2
  108. package/dist/{chunk-AAIUERNB.js → chunk-5QJQHBLE.js} +6 -6
  109. package/dist/{chunk-6CZPDBJS.js → chunk-5U7ID3EZ.js} +3 -3
  110. package/dist/{chunk-RN7DY3FC.js → chunk-6ISC4AVB.js} +31 -12
  111. package/dist/chunk-6ISC4AVB.js.map +1 -0
  112. package/dist/chunk-773TRRGT.js +36 -0
  113. package/dist/chunk-773TRRGT.js.map +1 -0
  114. package/dist/chunk-7T4TOGMS.js +242 -0
  115. package/dist/chunk-7T4TOGMS.js.map +1 -0
  116. package/dist/{chunk-DLVPUX7U.js → chunk-7YKVM5H3.js} +8 -6
  117. package/dist/chunk-7YKVM5H3.js.map +1 -0
  118. package/dist/chunk-7YQ6ESEA.js +322 -0
  119. package/dist/chunk-7YQ6ESEA.js.map +1 -0
  120. package/dist/{chunk-DNWXFTLD.js → chunk-A4IJCD2Z.js} +2 -2
  121. package/dist/{chunk-3CE77VAP.js → chunk-A4JMGKCD.js} +87 -74
  122. package/dist/chunk-A4JMGKCD.js.map +1 -0
  123. package/dist/chunk-A5KNZSNA.js +26 -0
  124. package/dist/chunk-A5KNZSNA.js.map +1 -0
  125. package/dist/{chunk-PKNLM44P.js → chunk-AC5OWJLV.js} +9 -9
  126. package/dist/{chunk-LZ4LDKHZ.js → chunk-AMAUBUKY.js} +6 -6
  127. package/dist/{chunk-CUM2BBPN.js → chunk-AUMWZSE7.js} +19 -10
  128. package/dist/chunk-AUMWZSE7.js.map +1 -0
  129. package/dist/{chunk-BUE5E2HL.js → chunk-BGLY7EEM.js} +5 -314
  130. package/dist/chunk-BGLY7EEM.js.map +1 -0
  131. package/dist/chunk-BIPBQQFI.js +44 -0
  132. package/dist/chunk-BIPBQQFI.js.map +1 -0
  133. package/dist/{chunk-S5SLVSVY.js → chunk-BQIFZ2MP.js} +5 -5
  134. package/dist/chunk-BTTPKDIL.js +34 -0
  135. package/dist/{chunk-PVGDJXVK.js.map → chunk-BTTPKDIL.js.map} +1 -1
  136. package/dist/chunk-CK5KOVHW.js +69 -0
  137. package/dist/chunk-CK5KOVHW.js.map +1 -0
  138. package/dist/{chunk-Q6IP2ARR.js → chunk-CSOYVTRX.js} +2 -2
  139. package/dist/{chunk-XOQSEF7X.js → chunk-CVILPI77.js} +6 -6
  140. package/dist/{chunk-VWAXN2BN.js → chunk-CX4ZUMC6.js} +91 -83
  141. package/dist/chunk-CX4ZUMC6.js.map +1 -0
  142. package/dist/{chunk-NVRYW264.js → chunk-DAJPRXBR.js} +16 -13
  143. package/dist/chunk-DAJPRXBR.js.map +1 -0
  144. package/dist/{chunk-J7VGGECD.js → chunk-DZPFMQZ7.js} +1 -1
  145. package/dist/chunk-DZPFMQZ7.js.map +1 -0
  146. package/dist/{chunk-4LMA77JH.js → chunk-E5XQIWAL.js} +3 -3
  147. package/dist/{chunk-WUNIWKY4.js → chunk-ELIL2A37.js} +6 -6
  148. package/dist/{chunk-OQ5PRDDS.js → chunk-ERZ2R42X.js} +6 -6
  149. package/dist/{chunk-U7GW7NE7.js → chunk-FIK3CQNA.js} +10 -10
  150. package/dist/{chunk-D3J5SLQK.js → chunk-FR27HBBA.js} +81 -20
  151. package/dist/chunk-FR27HBBA.js.map +1 -0
  152. package/dist/{chunk-E6PNLPGJ.js → chunk-FUCYDRE5.js} +838 -480
  153. package/dist/chunk-FUCYDRE5.js.map +1 -0
  154. package/dist/{chunk-HZFHQ4AQ.js → chunk-G7A5HLUS.js} +23 -17
  155. package/dist/chunk-G7A5HLUS.js.map +1 -0
  156. package/dist/{chunk-33PLLLL7.js → chunk-GFCVUY6G.js} +6 -6
  157. package/dist/{chunk-HREE4JHI.js → chunk-GODSPTOT.js} +477 -278
  158. package/dist/chunk-GODSPTOT.js.map +1 -0
  159. package/dist/{chunk-S2NCTZGJ.js → chunk-GRUYA45P.js} +15 -15
  160. package/dist/chunk-GRUYA45P.js.map +1 -0
  161. package/dist/{chunk-VUPTKTDV.js → chunk-GUAL4PQH.js} +3 -3
  162. package/dist/{chunk-CINZGPSJ.js → chunk-GUMZC2BO.js} +2 -2
  163. package/dist/{chunk-H24WNPA2.js → chunk-GWFSVJ4P.js} +3 -3
  164. package/dist/{chunk-7XC2HX75.js → chunk-GYPQL6XN.js} +157 -16
  165. package/dist/chunk-GYPQL6XN.js.map +1 -0
  166. package/dist/{chunk-TSH56VPU.js → chunk-HAYSYUAB.js} +2 -2
  167. package/dist/{chunk-PDLBLTOK.js → chunk-HC3PBX23.js} +9 -9
  168. package/dist/{chunk-TDHTVMPG.js → chunk-HFPASSFV.js} +7 -2
  169. package/dist/chunk-HFPASSFV.js.map +1 -0
  170. package/dist/chunk-J2WC5LF4.js +395 -0
  171. package/dist/chunk-J2WC5LF4.js.map +1 -0
  172. package/dist/{chunk-KXB4VXHY.js → chunk-JIYDRBVZ.js} +2 -2
  173. package/dist/chunk-JV3C2MNQ.js +74 -0
  174. package/dist/chunk-JV3C2MNQ.js.map +1 -0
  175. package/dist/{chunk-HLPD7B7P.js → chunk-JZH4LWHB.js} +2 -2
  176. package/dist/{chunk-AV5ZEH4M.js → chunk-KVJRXN2E.js} +2 -2
  177. package/dist/{chunk-WFTIGIIS.js → chunk-L6CQ7WIW.js} +5 -5
  178. package/dist/{chunk-227UFSEQ.js → chunk-LEPOP46W.js} +4 -4
  179. package/dist/{chunk-EJUEXZHX.js → chunk-LLJMAULE.js} +2 -2
  180. package/dist/{chunk-N5Z4EVOR.js → chunk-LNEWDF2A.js} +36 -11
  181. package/dist/chunk-LNEWDF2A.js.map +1 -0
  182. package/dist/{chunk-QN25OCUF.js → chunk-LPYDOLSM.js} +5 -5
  183. package/dist/{chunk-AS7YMSL6.js → chunk-M23RF3LJ.js} +4 -4
  184. package/dist/{chunk-OAEQLRCY.js → chunk-MO4HSXHZ.js} +5 -5
  185. package/dist/{chunk-ECK75GDJ.js → chunk-N3LL5NEU.js} +43 -24
  186. package/dist/chunk-N3LL5NEU.js.map +1 -0
  187. package/dist/chunk-NEF7LR5J.js +29 -0
  188. package/dist/chunk-NEF7LR5J.js.map +1 -0
  189. package/dist/{chunk-3F2LKUMU.js → chunk-NIS256NW.js} +2 -2
  190. package/dist/{chunk-YIAA2X3D.js → chunk-NK5RGJ65.js} +3 -3
  191. package/dist/chunk-NLDVVWCL.js +84 -0
  192. package/dist/chunk-NLDVVWCL.js.map +1 -0
  193. package/dist/{chunk-4J7G5SY4.js → chunk-NZBZ7IS2.js} +72 -24
  194. package/dist/chunk-NZBZ7IS2.js.map +1 -0
  195. package/dist/{chunk-3TBLDMJA.js → chunk-O4KMGRXE.js} +5 -2
  196. package/dist/chunk-O4KMGRXE.js.map +1 -0
  197. package/dist/{chunk-7TWUCYER.js → chunk-PNRA7FAD.js} +7 -7
  198. package/dist/{chunk-5I4M26Q7.js → chunk-QBSFOKY6.js} +4 -4
  199. package/dist/{chunk-E53DSZEN.js → chunk-QR6G5KF4.js} +3 -3
  200. package/dist/{chunk-CJ2ZR7UA.js → chunk-QUENPGWZ.js} +261 -211
  201. package/dist/chunk-QUENPGWZ.js.map +1 -0
  202. package/dist/{chunk-4UH4BTGK.js → chunk-QVJPH7SH.js} +84 -84
  203. package/dist/{chunk-UYLMNVY6.js → chunk-R3KHKU7M.js} +16 -9
  204. package/dist/chunk-R3KHKU7M.js.map +1 -0
  205. package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
  206. package/dist/{chunk-WDISJRMG.js → chunk-RMMVQQA6.js} +2 -2
  207. package/dist/{chunk-JVLCVFQ4.js → chunk-RNHVVMFN.js} +3 -3
  208. package/dist/{chunk-QJAQNXWI.js → chunk-RVO6TCTU.js} +81 -84
  209. package/dist/chunk-RVO6TCTU.js.map +1 -0
  210. package/dist/chunk-S2HLHAZ4.js +16 -0
  211. package/dist/chunk-S2HLHAZ4.js.map +1 -0
  212. package/dist/{chunk-KWMXR7XS.js → chunk-S2V7RUCL.js} +8 -1
  213. package/dist/{chunk-KWMXR7XS.js.map → chunk-S2V7RUCL.js.map} +1 -1
  214. package/dist/{chunk-5SM35XZR.js → chunk-S5NZBKKQ.js} +2 -2
  215. package/dist/{chunk-VNA7W7QF.js → chunk-SVH57F5Z.js} +12 -4
  216. package/dist/chunk-SVH57F5Z.js.map +1 -0
  217. package/dist/{chunk-WIPEXG6R.js → chunk-SXIMQLGV.js} +2 -2
  218. package/dist/{chunk-RVLJEII5.js → chunk-SYUBB3WM.js} +256 -187
  219. package/dist/chunk-SYUBB3WM.js.map +1 -0
  220. package/dist/{chunk-VCD4PSK2.js → chunk-TQZ4DVBC.js} +7 -4
  221. package/dist/chunk-TQZ4DVBC.js.map +1 -0
  222. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  223. package/dist/{chunk-YV32N67O.js → chunk-URS5GSM7.js} +1 -1
  224. package/dist/chunk-URS5GSM7.js.map +1 -0
  225. package/dist/{chunk-4B77XSG5.js → chunk-UV72DEZD.js} +5 -5
  226. package/dist/{chunk-BJKPPZ6Z.js → chunk-UW66OZTD.js} +2 -2
  227. package/dist/{chunk-XYTOI63Z.js → chunk-V2TNYF6Q.js} +19 -11
  228. package/dist/chunk-V2TNYF6Q.js.map +1 -0
  229. package/dist/{chunk-S2BBISHU.js → chunk-VANZKHTN.js} +3 -3
  230. package/dist/chunk-VHFXP27N.js +250 -0
  231. package/dist/chunk-VHFXP27N.js.map +1 -0
  232. package/dist/chunk-VL35ZFSZ.js +102 -0
  233. package/dist/chunk-VL35ZFSZ.js.map +1 -0
  234. package/dist/{chunk-3Y224NYC.js → chunk-VYISFWVX.js} +2 -2
  235. package/dist/{chunk-JE7EK33X.js → chunk-W2V7UESE.js} +2 -2
  236. package/dist/{chunk-TIHMZFIV.js → chunk-W3IC7QOY.js} +3 -3
  237. package/dist/{chunk-NRV4Y3PM.js → chunk-W4FBGYGK.js} +1 -1
  238. package/dist/{chunk-P2BM76KT.js → chunk-WAS4HV46.js} +174 -43
  239. package/dist/chunk-WAS4HV46.js.map +1 -0
  240. package/dist/{chunk-57QKLRBV.js → chunk-WB7JSQCP.js} +2 -1
  241. package/dist/chunk-WB7JSQCP.js.map +1 -0
  242. package/dist/{chunk-A5OJCXZL.js → chunk-WZ3TOIDW.js} +15 -4
  243. package/dist/chunk-WZ3TOIDW.js.map +1 -0
  244. package/dist/{chunk-MU7ZHSZE.js → chunk-WZFAPHIK.js} +2 -2
  245. package/dist/{chunk-T2TTP3KU.js → chunk-X4IDNPOS.js} +2 -2
  246. package/dist/{chunk-UVIKWC7M.js → chunk-XAGYS7X6.js} +17 -17
  247. package/dist/{chunk-BLAKS3CP.js → chunk-XL3TATMJ.js} +3 -3
  248. package/dist/{chunk-W4XJFLAL.js → chunk-XPRJSHNI.js} +2 -2
  249. package/dist/{chunk-5TFP4CUL.js → chunk-XQ3HXAQH.js} +14 -11
  250. package/dist/chunk-XQ3HXAQH.js.map +1 -0
  251. package/dist/{chunk-E6EE5B67.js → chunk-YK6BDDHP.js} +4 -4
  252. package/dist/{chunk-ES36HTSC.js → chunk-YLHM5BQQ.js} +3 -3
  253. package/dist/{chunk-ULARSG5Z.js → chunk-YN6ASZUG.js} +10 -8
  254. package/dist/{chunk-ULARSG5Z.js.map → chunk-YN6ASZUG.js.map} +1 -1
  255. package/dist/{chunk-VOUOLGIP.js → chunk-YRFAYOFQ.js} +11 -13
  256. package/dist/chunk-YRFAYOFQ.js.map +1 -0
  257. package/dist/{chunk-IKKWIPYN.js → chunk-YYQAKIDJ.js} +37 -1
  258. package/dist/chunk-YYQAKIDJ.js.map +1 -0
  259. package/dist/{chunk-GF22HWS2.js → chunk-Z54EM5YZ.js} +4 -4
  260. package/dist/{chunk-64UDOIMI.js → chunk-ZLQ37WJX.js} +2 -2
  261. package/dist/{cli-BUGN3d6_.d.ts → cli-BHBswmUa.d.ts} +5 -5
  262. package/dist/cli.d.ts +16 -12
  263. package/dist/cli.js +138 -123
  264. package/dist/compounding/engine.d.ts +3 -2
  265. package/dist/compounding/engine.js +25 -23
  266. package/dist/compounding/preference-consolidator.d.ts +2 -1
  267. package/dist/compression-optimizer.d.ts +2 -1
  268. package/dist/config.d.ts +2 -1
  269. package/dist/config.js +10 -8
  270. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  271. package/dist/connectors/codex-materialize-runner.js +24 -22
  272. package/dist/connectors/codex-materialize.d.ts +2 -1
  273. package/dist/connectors/index.d.ts +2 -1
  274. package/dist/connectors/index.js +27 -25
  275. package/dist/consolidation-provenance-check.d.ts +3 -2
  276. package/dist/consolidation-provenance-check.js +4 -4
  277. package/dist/consolidation-undo.d.ts +3 -2
  278. package/dist/consolidation-undo.js +10 -7
  279. package/dist/consolidation-undo.js.map +1 -1
  280. package/dist/contradiction/index.d.ts +3 -2
  281. package/dist/converge-config.d.ts +2 -1
  282. package/dist/convergence-refresh.d.ts +4 -3
  283. package/dist/convergence-refresh.js +28 -26
  284. package/dist/conversation-index/backend.d.ts +2 -1
  285. package/dist/conversation-index/backend.js +2 -2
  286. package/dist/conversation-index/chunker.d.ts +2 -1
  287. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  288. package/dist/conversation-index/indexer.d.ts +2 -1
  289. package/dist/conversation-index/search.d.ts +2 -1
  290. package/dist/corpus-watermark.d.ts +2 -1
  291. package/dist/corpus-watermark.js +43 -41
  292. package/dist/day-summary.d.ts +2 -1
  293. package/dist/delinearize.d.ts +2 -1
  294. package/dist/direct-answer-wiring.d.ts +2 -1
  295. package/dist/direct-answer-wiring.js +2 -2
  296. package/dist/direct-answer.d.ts +2 -1
  297. package/dist/embedding-fallback.d.ts +2 -1
  298. package/dist/embedding-fallback.js +2 -2
  299. package/dist/enrichment/index.d.ts +2 -1
  300. package/dist/entity-retrieval-boundaries.js +1 -1
  301. package/dist/entity-retrieval.d.ts +3 -2
  302. package/dist/entity-retrieval.js +25 -23
  303. package/dist/entity-schema.d.ts +2 -1
  304. package/dist/explicit-capture.d.ts +9 -8
  305. package/dist/explicit-capture.js +11 -9
  306. package/dist/external-wiki-access.d.ts +127 -0
  307. package/dist/external-wiki-access.js +187 -0
  308. package/dist/external-wiki-access.js.map +1 -0
  309. package/dist/external-wiki-cli.d.ts +13 -0
  310. package/dist/external-wiki-cli.js +10 -0
  311. package/dist/external-wiki-cli.js.map +1 -0
  312. package/dist/external-wiki-collection-registration.d.ts +39 -0
  313. package/dist/external-wiki-collection-registration.js +79 -0
  314. package/dist/external-wiki-collection-registration.js.map +1 -0
  315. package/dist/external-wiki-collection.d.ts +50 -0
  316. package/dist/external-wiki-collection.js +387 -0
  317. package/dist/external-wiki-collection.js.map +1 -0
  318. package/dist/external-wiki-config.d.ts +13 -0
  319. package/dist/external-wiki-config.js +13 -0
  320. package/dist/external-wiki-config.js.map +1 -0
  321. package/dist/external-wiki-guard.d.ts +11 -0
  322. package/dist/external-wiki-guard.js +18 -0
  323. package/dist/external-wiki-guard.js.map +1 -0
  324. package/dist/external-wiki-mcp-tools.d.ts +123 -0
  325. package/dist/external-wiki-mcp-tools.js +8 -0
  326. package/dist/external-wiki-mcp-tools.js.map +1 -0
  327. package/dist/external-wiki-search.d.ts +42 -0
  328. package/dist/external-wiki-search.js +11 -0
  329. package/dist/external-wiki-search.js.map +1 -0
  330. package/dist/external-wiki.d.ts +39 -0
  331. package/dist/external-wiki.js +14 -0
  332. package/dist/external-wiki.js.map +1 -0
  333. package/dist/extraction-error-classification.d.ts +2 -1
  334. package/dist/extraction-faithfulness.d.ts +2 -1
  335. package/dist/extraction-judge-telemetry.d.ts +2 -1
  336. package/dist/extraction-judge-training.d.ts +2 -1
  337. package/dist/extraction-judge.d.ts +2 -1
  338. package/dist/extraction-liveness.d.ts +2 -1
  339. package/dist/extraction-source-grounding-helpers.d.ts +5 -3
  340. package/dist/extraction-source-grounding-helpers.js +1 -1
  341. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  342. package/dist/extraction-source-grounding-rules.js +2 -2
  343. package/dist/extraction-source-grounding.d.ts +2 -1
  344. package/dist/extraction-source-grounding.js +5 -5
  345. package/dist/extraction.d.ts +2 -1
  346. package/dist/extraction.js +46 -43
  347. package/dist/fallback-llm.d.ts +2 -1
  348. package/dist/{first-start-migration-F2QJD66E.js → first-start-migration-ZSHEFEI3.js} +10 -12
  349. package/dist/{first-start-migration-F2QJD66E.js.map → first-start-migration-ZSHEFEI3.js.map} +1 -1
  350. package/dist/graph-dashboard-diff.d.ts +2 -1
  351. package/dist/graph-dashboard-key.d.ts +2 -1
  352. package/dist/graph-dashboard-parser.d.ts +2 -1
  353. package/dist/graph-edge-reinforcement.d.ts +2 -1
  354. package/dist/graph-snapshot.d.ts +2 -1
  355. package/dist/graph.d.ts +2 -1
  356. package/dist/harmonic-retrieval.js +2 -2
  357. package/dist/importance.d.ts +2 -1
  358. package/dist/importers/index.d.ts +2 -1
  359. package/dist/in-flight-reads.d.ts +2 -1
  360. package/dist/index.d.ts +443 -430
  361. package/dist/index.js +304 -269
  362. package/dist/intent.d.ts +2 -1
  363. package/dist/lcm/engine.d.ts +2 -1
  364. package/dist/lcm/engine.js +2 -2
  365. package/dist/lcm/index.d.ts +2 -1
  366. package/dist/lcm/index.js +7 -7
  367. package/dist/lcm/tools.d.ts +2 -1
  368. package/dist/lifecycle.d.ts +2 -1
  369. package/dist/live-connectors-runner.d.ts +2 -1
  370. package/dist/local-llm.d.ts +2 -1
  371. package/dist/local-llm.js +2 -2
  372. package/dist/local-model-endpoint.d.ts +2 -1
  373. package/dist/maintenance/memory-governance.d.ts +2 -1
  374. package/dist/maintenance/memory-governance.js +25 -23
  375. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  376. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +25 -23
  377. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  378. package/dist/maintenance/rebuild-memory-projection.js +27 -25
  379. package/dist/{maintenance-LbuS2rUA.d.ts → maintenance-CoRikzIt.d.ts} +3 -3
  380. package/dist/mcp-memory-inspector-app.d.ts +14 -10
  381. package/dist/mcp-read-only-tools.js +1 -1
  382. package/dist/memory-action-policy.d.ts +2 -1
  383. package/dist/memory-cache.d.ts +2 -1
  384. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  385. package/dist/memory-projection-store.d.ts +2 -1
  386. package/dist/memory-provenance.d.ts +2 -1
  387. package/dist/memory-snapshot.d.ts +10 -0
  388. package/dist/memory-snapshot.js +8 -0
  389. package/dist/memory-snapshot.js.map +1 -0
  390. package/dist/memory-worth-outcomes.d.ts +3 -2
  391. package/dist/models-json.d.ts +2 -1
  392. package/dist/namespaces/migrate.d.ts +4 -3
  393. package/dist/namespaces/migrate.js +41 -39
  394. package/dist/namespaces/principal.d.ts +2 -1
  395. package/dist/namespaces/search.d.ts +2 -1
  396. package/dist/namespaces/search.js +18 -18
  397. package/dist/namespaces/storage.d.ts +4 -3
  398. package/dist/namespaces/storage.js +24 -22
  399. package/dist/native-knowledge.d.ts +2 -1
  400. package/dist/offline-sync-impression-drain.d.ts +2 -1
  401. package/dist/offline-sync-impression-drain.js +11 -9
  402. package/dist/offline-sync.d.ts +29 -3
  403. package/dist/offline-sync.js +6 -2
  404. package/dist/operator-doctor-corpus.d.ts +2 -1
  405. package/dist/operator-doctor-corpus.js +46 -44
  406. package/dist/operator-doctor-replica.d.ts +2 -1
  407. package/dist/operator-doctor-replica.js +3 -3
  408. package/dist/operator-toolkit.d.ts +4 -3
  409. package/dist/operator-toolkit.js +60 -55
  410. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  411. package/dist/orchestration/maintenance.d.ts +5 -4
  412. package/dist/orchestration/maintenance.js +37 -33
  413. package/dist/{orchestrator-rHiWt32X.d.ts → orchestrator-BJeq7Pw1.d.ts} +14 -7
  414. package/dist/orchestrator.d.ts +9 -8
  415. package/dist/orchestrator.js +200 -186
  416. package/dist/page-versioning.js +3 -3
  417. package/dist/patterns-cli.d.ts +2 -1
  418. package/dist/{pipeline-W_97O8BV.d.ts → pipeline-CNjY4wk3.d.ts} +1 -1
  419. package/dist/policy-runtime.d.ts +2 -1
  420. package/dist/policy-runtime.js +1 -1
  421. package/dist/proactive-contention.d.ts +2 -1
  422. package/dist/provenance.d.ts +2 -1
  423. package/dist/provenance.js +2 -2
  424. package/dist/{qmd-LWtMofAf.d.ts → qmd-C0UDZidt.d.ts} +9 -7
  425. package/dist/qmd-preflight.d.ts +5 -4
  426. package/dist/qmd-preflight.js +2 -2
  427. package/dist/qmd-recall-cache.d.ts +2 -1
  428. package/dist/qmd.d.ts +4 -3
  429. package/dist/qmd.js +8 -8
  430. package/dist/recall-concurrency-config.d.ts +2 -1
  431. package/dist/recall-disclosure-escalation.d.ts +2 -1
  432. package/dist/recall-explain-renderer.d.ts +2 -1
  433. package/dist/recall-explain-renderer.js +3 -3
  434. package/dist/recall-memory-map.d.ts +2 -1
  435. package/dist/recall-planner-llm.d.ts +2 -1
  436. package/dist/recall-state.d.ts +2 -1
  437. package/dist/recall-tag-filter.d.ts +2 -1
  438. package/dist/recall-timings.d.ts +2 -1
  439. package/dist/recall-xray-cli.d.ts +2 -1
  440. package/dist/recall-xray-cli.js +4 -4
  441. package/dist/recall-xray-renderer.d.ts +2 -1
  442. package/dist/recall-xray-renderer.js +3 -3
  443. package/dist/recall-xray.d.ts +8 -1
  444. package/dist/recall-xray.js +2 -2
  445. package/dist/reconcile/cursor.d.ts +12 -2
  446. package/dist/reconcile/cursor.js +46 -7
  447. package/dist/reconcile/cursor.js.map +1 -1
  448. package/dist/reconcile/manifest.d.ts +9 -2
  449. package/dist/reconcile/manifest.js +15 -268
  450. package/dist/reconcile/manifest.js.map +1 -1
  451. package/dist/reconcile/plan.d.ts +4 -1
  452. package/dist/reconcile/plan.js +4 -4
  453. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  454. package/dist/replay/normalizers/claude.d.ts +2 -1
  455. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  456. package/dist/replay/normalizers/shared.d.ts +2 -1
  457. package/dist/replay/runner.d.ts +2 -1
  458. package/dist/replay/types.d.ts +2 -1
  459. package/dist/replica-divergence.d.ts +2 -1
  460. package/dist/replica-divergence.js +2 -2
  461. package/dist/replica-peers-config.d.ts +2 -1
  462. package/dist/resolve-auth-token.d.ts +2 -1
  463. package/dist/resume-bundles.js +12 -10
  464. package/dist/retrieval-agents.d.ts +4 -3
  465. package/dist/retrieval-agents.js +2 -2
  466. package/dist/retrieval-tiers.d.ts +2 -1
  467. package/dist/routing/engine.d.ts +2 -1
  468. package/dist/routing/store.d.ts +2 -1
  469. package/dist/salvage-envelope.d.ts +2 -1
  470. package/dist/schemas.d.ts +54 -54
  471. package/dist/{scope-profiles-BiQKOE-p.d.ts → scope-profiles-BJzp2F5A.d.ts} +1 -1
  472. package/dist/search/embed-helper.d.ts +2 -1
  473. package/dist/search/embed-helper.js +3 -3
  474. package/dist/search/factory.d.ts +4 -2
  475. package/dist/search/factory.js +20 -18
  476. package/dist/search/index.d.ts +2 -1
  477. package/dist/search/index.js +20 -20
  478. package/dist/search/lancedb-backend.d.ts +2 -1
  479. package/dist/search/lancedb-backend.js +4 -4
  480. package/dist/search/meilisearch-backend.d.ts +2 -1
  481. package/dist/search/meilisearch-backend.js +4 -4
  482. package/dist/search/noop-backend.d.ts +2 -1
  483. package/dist/search/orama-backend.d.ts +2 -1
  484. package/dist/search/orama-backend.js +4 -4
  485. package/dist/search/port.d.ts +18 -1
  486. package/dist/search/port.js +1 -1
  487. package/dist/search/remote-backend.d.ts +2 -1
  488. package/dist/search/remote-backend.js +2 -2
  489. package/dist/secure-store/index.js +2 -2
  490. package/dist/{semantic-consolidation-dHYCyqgh.d.ts → semantic-consolidation-D4KAZO2G.d.ts} +1 -1
  491. package/dist/semantic-consolidation.d.ts +3 -2
  492. package/dist/semantic-consolidation.js +26 -24
  493. package/dist/semantic-rule-promotion.js +24 -22
  494. package/dist/semantic-rule-verifier.d.ts +2 -1
  495. package/dist/semantic-rule-verifier.js +25 -23
  496. package/dist/{service-DJG3KCQ4.d.ts → service-DWC4tq7p.d.ts} +2 -2
  497. package/dist/session-observer-bands.d.ts +2 -1
  498. package/dist/session-observer-state.d.ts +2 -1
  499. package/dist/shared-context/manager.d.ts +10 -9
  500. package/dist/shared-context/manager.js +2 -2
  501. package/dist/signal.d.ts +2 -1
  502. package/dist/source-agent-qualifier.d.ts +2 -1
  503. package/dist/source-agent-qualifier.js +43 -40
  504. package/dist/{storage-F9FVh-w9.d.ts → storage-DPGjB-8e.d.ts} +28 -13
  505. package/dist/storage.d.ts +3 -2
  506. package/dist/storage.js +26 -24
  507. package/dist/summarizer.d.ts +2 -1
  508. package/dist/summarizer.js +5 -5
  509. package/dist/summary-snapshot.d.ts +2 -1
  510. package/dist/temporal-supersession.d.ts +3 -2
  511. package/dist/temporal-timeline-recall.d.ts +2 -1
  512. package/dist/temporal-validity.d.ts +2 -1
  513. package/dist/threading.d.ts +2 -1
  514. package/dist/tier-migration.d.ts +3 -2
  515. package/dist/tier-migration.js +1 -1
  516. package/dist/tier-routing.d.ts +2 -1
  517. package/dist/tool-scoped-memory.d.ts +5 -1
  518. package/dist/tool-scoped-memory.js +3 -1
  519. package/dist/topics.d.ts +2 -1
  520. package/dist/transcript.d.ts +2 -1
  521. package/dist/transfer/capsule-import.js +4 -4
  522. package/dist/transfer/types.d.ts +66 -66
  523. package/dist/trust-score-stage.d.ts +2 -1
  524. package/dist/trust-score.d.ts +2 -1
  525. package/dist/{types-rEwubvim.d.ts → types-yX_FwERf.d.ts} +8 -1
  526. package/dist/types.d.ts +2 -1
  527. package/dist/types.js +1 -1
  528. package/dist/utility-runtime.d.ts +2 -1
  529. package/dist/verified-recall.js +25 -23
  530. package/dist/write-envelope.d.ts +2 -1
  531. package/package.json +2 -2
  532. package/src/abort-error.ts +17 -0
  533. package/src/access-admin-ops-surface.ts +1 -0
  534. package/src/access-boundary.ts +1 -0
  535. package/src/access-coding-context-resolution.ts +42 -0
  536. package/src/access-extraction-force-flush.ts +38 -2
  537. package/src/access-http-lcm-compaction.ts +5 -2
  538. package/src/access-http-offline-stream.ts +80 -0
  539. package/src/access-http.test.ts +310 -3
  540. package/src/access-http.ts +84 -77
  541. package/src/access-mcp-output-schemas.ts +36 -0
  542. package/src/access-mcp.test.ts +95 -1
  543. package/src/access-mcp.ts +7 -9
  544. package/src/access-observe-helpers.ts +64 -22
  545. package/src/access-observe-write-surface.ts +8 -0
  546. package/src/access-offline-manifest.ts +54 -0
  547. package/src/access-operations-batch.ts +3 -3
  548. package/src/access-operations.ts +13 -7
  549. package/src/access-recall-concurrency.ts +3 -27
  550. package/src/access-recall-surface.ts +3 -0
  551. package/src/access-service-health.test.ts +32 -7
  552. package/src/access-service-namespace.test.ts +55 -0
  553. package/src/access-service-observe-idempotency.test.ts +34 -2
  554. package/src/access-service-observe-lcm-parity.test.ts +183 -23
  555. package/src/access-service-observe-scope.test.ts +160 -1
  556. package/src/access-service-offline-file-content.test.ts +345 -1
  557. package/src/access-service.ts +88 -62
  558. package/src/access-surface-catalog.ts +4 -0
  559. package/src/admin/admin-surfaces.ts +2 -0
  560. package/src/binary-lifecycle/pipeline.test.ts +106 -1
  561. package/src/binary-lifecycle/pipeline.ts +3 -0
  562. package/src/coding/git-context.test.ts +47 -0
  563. package/src/coding/git-context.ts +129 -27
  564. package/src/config.test.ts +24 -0
  565. package/src/config.ts +9 -12
  566. package/src/connector-provenance.test.ts +101 -0
  567. package/src/consolidation-undo.ts +3 -0
  568. package/src/convergence-refresh.ts +14 -2
  569. package/src/correction/correction-access-wiring.ts +9 -7
  570. package/src/correction/correction-executor.test.ts +206 -2
  571. package/src/correction/correction-executor.ts +29 -20
  572. package/src/correction/correction-planner.test.ts +36 -0
  573. package/src/correction/correction-planner.ts +9 -15
  574. package/src/correction/correction-service.ts +3 -1
  575. package/src/correction/correction-storage-integration.test.ts +77 -0
  576. package/src/correction/correction-surfaces.test.ts +41 -28
  577. package/src/correction/passive-capture.test.ts +59 -0
  578. package/src/correction/passive-capture.ts +4 -1
  579. package/src/entity-retrieval-boundaries.ts +17 -4
  580. package/src/entity-retrieval.ts +27 -6
  581. package/src/external-wiki-access.test.ts +65 -0
  582. package/src/external-wiki-access.ts +31 -0
  583. package/src/external-wiki-cli.ts +100 -0
  584. package/src/external-wiki-collection-registration.test.ts +163 -0
  585. package/src/external-wiki-collection-registration.ts +101 -0
  586. package/src/external-wiki-collection.test.ts +502 -0
  587. package/src/external-wiki-collection.ts +503 -0
  588. package/src/external-wiki-config.test.ts +135 -0
  589. package/src/external-wiki-config.ts +100 -0
  590. package/src/external-wiki-guard.ts +83 -0
  591. package/src/external-wiki-mcp-tools.ts +23 -0
  592. package/src/external-wiki-search.test.ts +367 -0
  593. package/src/external-wiki-search.ts +362 -0
  594. package/src/external-wiki.test.ts +240 -0
  595. package/src/external-wiki.ts +427 -0
  596. package/src/extraction-scope-source-agent.test.ts +21 -0
  597. package/src/extraction-source-grounding-helpers.ts +243 -53
  598. package/src/extraction-source-grounding-rules.ts +133 -39
  599. package/src/extraction-source-grounding.test.ts +363 -33
  600. package/src/extraction-timeout.test.ts +1 -0
  601. package/src/extraction-watermark.test.ts +150 -7
  602. package/src/extraction.ts +8 -1
  603. package/src/index.ts +9 -5
  604. package/src/maintenance/first-start-migration.ts +11 -11
  605. package/src/mcp-read-only-tools.ts +1 -0
  606. package/src/memory-snapshot.ts +15 -0
  607. package/src/offline-sync.test.ts +194 -0
  608. package/src/offline-sync.ts +217 -13
  609. package/src/orchestration/external-wiki-recall-guard.test.ts +94 -0
  610. package/src/orchestration/extraction-persist.ts +19 -2
  611. package/src/orchestration/extraction-run-helpers.ts +37 -19
  612. package/src/orchestration/extraction-run.test.ts +171 -2
  613. package/src/orchestration/extraction-run.ts +11 -13
  614. package/src/orchestration/extraction-watermark.ts +106 -17
  615. package/src/orchestration/generic-recall-paths.ts +14 -0
  616. package/src/orchestration/orchestrator-helpers.ts +2 -0
  617. package/src/orchestration/orchestrator-init.ts +9 -0
  618. package/src/orchestration/recall-internal-deps.ts +6 -0
  619. package/src/orchestration/recall-internal.ts +154 -33
  620. package/src/orchestration/recall-rerank-coordinator.ts +60 -25
  621. package/src/orchestration/recall-search-pipeline.test.ts +75 -1
  622. package/src/orchestration/recall-search-pipeline.ts +50 -10
  623. package/src/orchestrator-convergence-refresh.test.ts +36 -2
  624. package/src/orchestrator.ts +13 -3
  625. package/src/page-versioning.ts +5 -19
  626. package/src/procedural/procedure-recall.ts +5 -1
  627. package/src/provenance-surfaces.test.ts +3 -0
  628. package/src/qmd-client.test.ts +78 -17
  629. package/src/qmd.test.ts +24 -0
  630. package/src/qmd.ts +224 -315
  631. package/src/recall-explain-renderer.ts +3 -0
  632. package/src/recall-rerank-coordinator.test.ts +61 -0
  633. package/src/recall-xray-renderer.test.ts +6 -0
  634. package/src/recall-xray.test.ts +88 -1
  635. package/src/recall-xray.ts +15 -0
  636. package/src/reconcile/cursor.test.ts +48 -0
  637. package/src/reconcile/cursor.ts +58 -11
  638. package/src/reconcile/manifest.test.ts +4 -0
  639. package/src/reconcile/manifest.ts +41 -51
  640. package/src/reconcile/plan.test.ts +4 -0
  641. package/src/reconcile/plan.ts +28 -16
  642. package/src/search/factory.ts +6 -6
  643. package/src/search/port.ts +25 -9
  644. package/src/secure-store/secure-fs.ts +20 -12
  645. package/src/secure-store/secure-store.test.ts +41 -2
  646. package/src/spaces/index.test.ts +61 -2
  647. package/src/spaces/index.ts +44 -18
  648. package/src/storage/entity-alias-config.ts +97 -0
  649. package/src/storage/entity-canonical-id-lock.ts +53 -23
  650. package/src/storage/entity-canonical-id-migration.ts +53 -22
  651. package/src/storage/entity-canonical-id-references.ts +3 -0
  652. package/src/storage/entity-id-safety.ts +7 -0
  653. package/src/storage/entity-store.ts +6 -2
  654. package/src/storage/memory-frontmatter-metadata.ts +4 -9
  655. package/src/storage/memory-migration-serialization.ts +10 -15
  656. package/src/storage/tombstone-blocked-capture-mutation.ts +52 -64
  657. package/src/storage/tombstone-blocked-capture-sync.ts +244 -199
  658. package/src/storage-contract/cache-coherence.test.ts +99 -0
  659. package/src/storage-deletion-revisions.test.ts +91 -0
  660. package/src/storage-fact-hash-index-defer.test.ts +460 -170
  661. package/src/storage.ts +572 -284
  662. package/src/testing/subjects/first-start-tier-migration.test.ts +75 -0
  663. package/src/tier-migration.ts +10 -12
  664. package/src/tool-scoped-memory.ts +10 -0
  665. package/src/transfer/capsule-import.ts +13 -0
  666. package/src/transfer/capsule-merge.ts +13 -0
  667. package/src/trust-score-recall-paths.test.ts +75 -1
  668. package/src/types.ts +7 -3
  669. package/dist/capsule-merge-IDWJPCWK.js.map +0 -1
  670. package/dist/chunk-3CE77VAP.js.map +0 -1
  671. package/dist/chunk-3TBLDMJA.js.map +0 -1
  672. package/dist/chunk-4J7G5SY4.js.map +0 -1
  673. package/dist/chunk-57QKLRBV.js.map +0 -1
  674. package/dist/chunk-5TFP4CUL.js.map +0 -1
  675. package/dist/chunk-7XC2HX75.js.map +0 -1
  676. package/dist/chunk-A5OJCXZL.js.map +0 -1
  677. package/dist/chunk-BUE5E2HL.js.map +0 -1
  678. package/dist/chunk-CJ2ZR7UA.js.map +0 -1
  679. package/dist/chunk-CUM2BBPN.js.map +0 -1
  680. package/dist/chunk-D3J5SLQK.js.map +0 -1
  681. package/dist/chunk-DL7ZD3JH.js.map +0 -1
  682. package/dist/chunk-DLVPUX7U.js.map +0 -1
  683. package/dist/chunk-E6PNLPGJ.js.map +0 -1
  684. package/dist/chunk-ECK75GDJ.js.map +0 -1
  685. package/dist/chunk-HREE4JHI.js.map +0 -1
  686. package/dist/chunk-HZFHQ4AQ.js.map +0 -1
  687. package/dist/chunk-IKKWIPYN.js.map +0 -1
  688. package/dist/chunk-J7VGGECD.js.map +0 -1
  689. package/dist/chunk-N5Z4EVOR.js.map +0 -1
  690. package/dist/chunk-NVRYW264.js.map +0 -1
  691. package/dist/chunk-P2BM76KT.js.map +0 -1
  692. package/dist/chunk-PVGDJXVK.js +0 -21
  693. package/dist/chunk-QJAQNXWI.js.map +0 -1
  694. package/dist/chunk-RN7DY3FC.js.map +0 -1
  695. package/dist/chunk-RVLJEII5.js.map +0 -1
  696. package/dist/chunk-S2NCTZGJ.js.map +0 -1
  697. package/dist/chunk-TDHTVMPG.js.map +0 -1
  698. package/dist/chunk-UYLMNVY6.js.map +0 -1
  699. package/dist/chunk-VCD4PSK2.js.map +0 -1
  700. package/dist/chunk-VNA7W7QF.js.map +0 -1
  701. package/dist/chunk-VOUOLGIP.js.map +0 -1
  702. package/dist/chunk-VWAXN2BN.js.map +0 -1
  703. package/dist/chunk-WOCNN776.js.map +0 -1
  704. package/dist/chunk-XYTOI63Z.js.map +0 -1
  705. package/dist/chunk-YV32N67O.js.map +0 -1
  706. /package/dist/{auto-sync-5OE5QOZB.js.map → auto-sync-UPTUVE4X.js.map} +0 -0
  707. /package/dist/{chunk-E5UK4VPE.js.map → chunk-2FSTB6BJ.js.map} +0 -0
  708. /package/dist/{chunk-5ZE7QHTK.js.map → chunk-2X2T2UVE.js.map} +0 -0
  709. /package/dist/{chunk-P4DRWEYC.js.map → chunk-3COYXTGM.js.map} +0 -0
  710. /package/dist/{chunk-5IVLTFOV.js.map → chunk-44N6ESJ4.js.map} +0 -0
  711. /package/dist/{chunk-HO3QBJEY.js.map → chunk-5546W5SI.js.map} +0 -0
  712. /package/dist/{chunk-AAIUERNB.js.map → chunk-5QJQHBLE.js.map} +0 -0
  713. /package/dist/{chunk-6CZPDBJS.js.map → chunk-5U7ID3EZ.js.map} +0 -0
  714. /package/dist/{chunk-DNWXFTLD.js.map → chunk-A4IJCD2Z.js.map} +0 -0
  715. /package/dist/{chunk-PKNLM44P.js.map → chunk-AC5OWJLV.js.map} +0 -0
  716. /package/dist/{chunk-LZ4LDKHZ.js.map → chunk-AMAUBUKY.js.map} +0 -0
  717. /package/dist/{chunk-S5SLVSVY.js.map → chunk-BQIFZ2MP.js.map} +0 -0
  718. /package/dist/{chunk-Q6IP2ARR.js.map → chunk-CSOYVTRX.js.map} +0 -0
  719. /package/dist/{chunk-XOQSEF7X.js.map → chunk-CVILPI77.js.map} +0 -0
  720. /package/dist/{chunk-4LMA77JH.js.map → chunk-E5XQIWAL.js.map} +0 -0
  721. /package/dist/{chunk-WUNIWKY4.js.map → chunk-ELIL2A37.js.map} +0 -0
  722. /package/dist/{chunk-OQ5PRDDS.js.map → chunk-ERZ2R42X.js.map} +0 -0
  723. /package/dist/{chunk-U7GW7NE7.js.map → chunk-FIK3CQNA.js.map} +0 -0
  724. /package/dist/{chunk-33PLLLL7.js.map → chunk-GFCVUY6G.js.map} +0 -0
  725. /package/dist/{chunk-VUPTKTDV.js.map → chunk-GUAL4PQH.js.map} +0 -0
  726. /package/dist/{chunk-CINZGPSJ.js.map → chunk-GUMZC2BO.js.map} +0 -0
  727. /package/dist/{chunk-H24WNPA2.js.map → chunk-GWFSVJ4P.js.map} +0 -0
  728. /package/dist/{chunk-TSH56VPU.js.map → chunk-HAYSYUAB.js.map} +0 -0
  729. /package/dist/{chunk-PDLBLTOK.js.map → chunk-HC3PBX23.js.map} +0 -0
  730. /package/dist/{chunk-KXB4VXHY.js.map → chunk-JIYDRBVZ.js.map} +0 -0
  731. /package/dist/{chunk-HLPD7B7P.js.map → chunk-JZH4LWHB.js.map} +0 -0
  732. /package/dist/{chunk-AV5ZEH4M.js.map → chunk-KVJRXN2E.js.map} +0 -0
  733. /package/dist/{chunk-WFTIGIIS.js.map → chunk-L6CQ7WIW.js.map} +0 -0
  734. /package/dist/{chunk-227UFSEQ.js.map → chunk-LEPOP46W.js.map} +0 -0
  735. /package/dist/{chunk-EJUEXZHX.js.map → chunk-LLJMAULE.js.map} +0 -0
  736. /package/dist/{chunk-QN25OCUF.js.map → chunk-LPYDOLSM.js.map} +0 -0
  737. /package/dist/{chunk-AS7YMSL6.js.map → chunk-M23RF3LJ.js.map} +0 -0
  738. /package/dist/{chunk-OAEQLRCY.js.map → chunk-MO4HSXHZ.js.map} +0 -0
  739. /package/dist/{chunk-3F2LKUMU.js.map → chunk-NIS256NW.js.map} +0 -0
  740. /package/dist/{chunk-YIAA2X3D.js.map → chunk-NK5RGJ65.js.map} +0 -0
  741. /package/dist/{chunk-7TWUCYER.js.map → chunk-PNRA7FAD.js.map} +0 -0
  742. /package/dist/{chunk-5I4M26Q7.js.map → chunk-QBSFOKY6.js.map} +0 -0
  743. /package/dist/{chunk-E53DSZEN.js.map → chunk-QR6G5KF4.js.map} +0 -0
  744. /package/dist/{chunk-4UH4BTGK.js.map → chunk-QVJPH7SH.js.map} +0 -0
  745. /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
  746. /package/dist/{chunk-WDISJRMG.js.map → chunk-RMMVQQA6.js.map} +0 -0
  747. /package/dist/{chunk-JVLCVFQ4.js.map → chunk-RNHVVMFN.js.map} +0 -0
  748. /package/dist/{chunk-5SM35XZR.js.map → chunk-S5NZBKKQ.js.map} +0 -0
  749. /package/dist/{chunk-WIPEXG6R.js.map → chunk-SXIMQLGV.js.map} +0 -0
  750. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  751. /package/dist/{chunk-4B77XSG5.js.map → chunk-UV72DEZD.js.map} +0 -0
  752. /package/dist/{chunk-BJKPPZ6Z.js.map → chunk-UW66OZTD.js.map} +0 -0
  753. /package/dist/{chunk-S2BBISHU.js.map → chunk-VANZKHTN.js.map} +0 -0
  754. /package/dist/{chunk-3Y224NYC.js.map → chunk-VYISFWVX.js.map} +0 -0
  755. /package/dist/{chunk-JE7EK33X.js.map → chunk-W2V7UESE.js.map} +0 -0
  756. /package/dist/{chunk-TIHMZFIV.js.map → chunk-W3IC7QOY.js.map} +0 -0
  757. /package/dist/{chunk-NRV4Y3PM.js.map → chunk-W4FBGYGK.js.map} +0 -0
  758. /package/dist/{chunk-MU7ZHSZE.js.map → chunk-WZFAPHIK.js.map} +0 -0
  759. /package/dist/{chunk-T2TTP3KU.js.map → chunk-X4IDNPOS.js.map} +0 -0
  760. /package/dist/{chunk-UVIKWC7M.js.map → chunk-XAGYS7X6.js.map} +0 -0
  761. /package/dist/{chunk-BLAKS3CP.js.map → chunk-XL3TATMJ.js.map} +0 -0
  762. /package/dist/{chunk-W4XJFLAL.js.map → chunk-XPRJSHNI.js.map} +0 -0
  763. /package/dist/{chunk-E6EE5B67.js.map → chunk-YK6BDDHP.js.map} +0 -0
  764. /package/dist/{chunk-ES36HTSC.js.map → chunk-YLHM5BQQ.js.map} +0 -0
  765. /package/dist/{chunk-GF22HWS2.js.map → chunk-Z54EM5YZ.js.map} +0 -0
  766. /package/dist/{chunk-64UDOIMI.js.map → chunk-ZLQ37WJX.js.map} +0 -0
@@ -516,6 +516,69 @@ test("supersede retries loser retirement after a transient failure", async () =>
516
516
  });
517
517
  });
518
518
 
519
+ test("#2206 cancellation terminalizes a plan after a replacement commits but retirement fails", async () => {
520
+ await withTempDir(async (dir) => {
521
+ const candidates = new Map<string, PlannerCandidate>([
522
+ ["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "old", excerpt: "old", score: 1 }],
523
+ ]);
524
+ const state: FakeState = {
525
+ memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "old" })]]),
526
+ tombstones: [],
527
+ redactionRules: [],
528
+ auditRecords: [],
529
+ propagateCalls: 0,
530
+ writtenReplacements: [],
531
+ };
532
+ const plannerDeps: PlannerDeps = {
533
+ ...makePlannerDeps(dir, candidates),
534
+ classifyAndDraft: async () => ({
535
+ classification: "outdated",
536
+ confidence: 0.9,
537
+ actions: [
538
+ { kind: "supersede", loserId: "mem-old", replacement: { content: "new" } },
539
+ { kind: "redaction_rule", pattern: "later-action" },
540
+ ],
541
+ relevance: [{ memoryId: "mem-old", why: "x" }],
542
+ warnings: [],
543
+ }),
544
+ };
545
+ const planner = new CorrectionPlanner(plannerDeps);
546
+ const plan = await planner.plan({ text: "old", targetIds: ["mem-old"] }, ["default"]);
547
+ const abortController = new AbortController();
548
+ const deps = makeExecutorDeps(state);
549
+ let retirementAttempted = false;
550
+ deps.retireMemory = async () => {
551
+ retirementAttempted = true;
552
+ abortController.abort(new Error("correction deadline exceeded"));
553
+ throw new Error("injected retirement failure");
554
+ };
555
+
556
+ const outcome = await new CorrectionExecutor(deps, planner).apply("default", plan.planId, {
557
+ confirm: true,
558
+ abortSignal: abortController.signal,
559
+ });
560
+
561
+ assert.equal(retirementAttempted, true, "the cancellation must be injected from retirement");
562
+ assert.equal(outcome.status, "partial");
563
+ assert.equal((await planner.loadPlan("default", plan.planId))?.status, "partial");
564
+ assert.equal(state.writtenReplacements.length, 1);
565
+ assert.equal(state.memories.get("mem-old")?.status, "active");
566
+ assert.deepEqual(state.redactionRules, []);
567
+ assert.equal(
568
+ outcome.results.some((result) => result.action.kind === "redaction_rule" && result.status === "skipped"),
569
+ true,
570
+ );
571
+ const supersedeResults = outcome.results.filter((result) => result.action.kind === "supersede");
572
+ assert.deepEqual(
573
+ supersedeResults.map((result) => result.status),
574
+ ["applied", "failed"],
575
+ "the outcome must expose the committed replacement and failed retirement",
576
+ );
577
+ assert.match(supersedeResults[1]?.error ?? "", /injected retirement failure/);
578
+ assert.equal(state.auditRecords.length, 1);
579
+ });
580
+ });
581
+
519
582
  test("tombstone emitted per retract; validUntil absent when bi-temporal OFF", async () => {
520
583
  await withTempDir(async (dir) => {
521
584
  const candidates = new Map<string, PlannerCandidate>([
@@ -934,7 +997,7 @@ test("#2128 cancellation after tombstone commit terminalizes the correction plan
934
997
  });
935
998
  });
936
999
 
937
- test("#2128 late cancellation before any mutation restores an applying plan to pending", async () => {
1000
+ test("#2206 cancellation after audit commit terminalizes an empty correction plan", async () => {
938
1001
  await withTempDir(async (dir) => {
939
1002
  const state: FakeState = {
940
1003
  memories: new Map(),
@@ -950,8 +1013,40 @@ test("#2128 late cancellation before any mutation restores an applying plan to p
950
1013
  const deps = makeExecutorDeps(state);
951
1014
  const appendAuditRecord = deps.appendAuditRecord;
952
1015
  deps.appendAuditRecord = async (namespace, record, signal) => {
1016
+ const auditId = await appendAuditRecord(namespace, record, signal);
953
1017
  abortController.abort(new Error("caller disconnected"));
954
- return appendAuditRecord(namespace, record, signal);
1018
+ return auditId;
1019
+ };
1020
+ const executor = new CorrectionExecutor(deps, planner);
1021
+
1022
+ const outcome = await executor.apply("default", plan.planId, {
1023
+ confirm: true,
1024
+ abortSignal: abortController.signal,
1025
+ });
1026
+ assert.equal(outcome.status, "applied");
1027
+ assert.equal(state.auditRecords.length, 1);
1028
+ assert.equal((await planner.loadPlan("default", plan.planId))?.status, "applied");
1029
+ });
1030
+ });
1031
+
1032
+ test("#2206 cancellation before audit commit restores an empty correction plan to pending", async () => {
1033
+ await withTempDir(async (dir) => {
1034
+ const state: FakeState = {
1035
+ memories: new Map(),
1036
+ tombstones: [],
1037
+ redactionRules: [],
1038
+ auditRecords: [],
1039
+ propagateCalls: 0,
1040
+ writtenReplacements: [],
1041
+ };
1042
+ const planner = new CorrectionPlanner(makePlannerDeps(dir, new Map()));
1043
+ const plan = await planner.plan({ text: "nothing matches" }, ["default"]);
1044
+ const abortController = new AbortController();
1045
+ const deps = makeExecutorDeps(state);
1046
+ deps.appendAuditRecord = async () => {
1047
+ const reason = new Error("caller disconnected");
1048
+ abortController.abort(reason);
1049
+ throw reason;
955
1050
  };
956
1051
  const executor = new CorrectionExecutor(deps, planner);
957
1052
 
@@ -959,6 +1054,7 @@ test("#2128 late cancellation before any mutation restores an applying plan to p
959
1054
  () => executor.apply("default", plan.planId, { confirm: true, abortSignal: abortController.signal }),
960
1055
  /caller disconnected/,
961
1056
  );
1057
+ assert.equal(state.auditRecords.length, 0);
962
1058
  assert.equal((await planner.loadPlan("default", plan.planId))?.status, "pending");
963
1059
  });
964
1060
  });
@@ -1140,9 +1236,117 @@ test("#2128 cancellation skips unstarted actions after a committed edit", async
1140
1236
  assert.equal(state.memories.get("mem-edit")?.content, "edited");
1141
1237
  assert.deepEqual(state.redactionRules, [], "the cancelled plan must not start its second action");
1142
1238
  assert.equal(state.auditRecords.length, 1);
1239
+ const skipped = outcome.results.filter((result) => result.status === "skipped");
1240
+ assert.deepEqual(skipped.map((result) => result.action), [
1241
+ { kind: "redaction_rule", pattern: "secret-token-\\d+" },
1242
+ ]);
1243
+ assert.deepEqual(state.auditRecords[0]?.outcome.results, outcome.results);
1143
1244
  });
1144
1245
  });
1145
1246
 
1247
+ test("#2206 cancellation interrupts rescope authorization before any destination write", async () => {
1248
+ for (const priorEditCommitted of [false, true]) {
1249
+ await withTempDir(async (dir) => {
1250
+ const candidates = new Map<string, PlannerCandidate>([
1251
+ ["mem-rescope", {
1252
+ memoryId: "mem-rescope",
1253
+ path: "facts/mem-rescope.md",
1254
+ content: "move me",
1255
+ excerpt: "move me",
1256
+ score: 1,
1257
+ }],
1258
+ ]);
1259
+ if (priorEditCommitted) {
1260
+ candidates.set("mem-edit", {
1261
+ memoryId: "mem-edit",
1262
+ path: "facts/mem-edit.md",
1263
+ content: "edit me",
1264
+ excerpt: "edit me",
1265
+ score: 1,
1266
+ });
1267
+ }
1268
+ const state: FakeState = {
1269
+ memories: new Map([
1270
+ ["mem-rescope", fakeMemory({ memoryId: "mem-rescope", content: "move me" })],
1271
+ ...(priorEditCommitted
1272
+ ? [["mem-edit", fakeMemory({ memoryId: "mem-edit", content: "edit me" })] as const]
1273
+ : []),
1274
+ ]),
1275
+ tombstones: [],
1276
+ redactionRules: [],
1277
+ auditRecords: [],
1278
+ propagateCalls: 0,
1279
+ writtenReplacements: [],
1280
+ };
1281
+ const actions: CorrectionAction[] = [
1282
+ ...(priorEditCommitted
1283
+ ? [{ kind: "edit", memoryId: "mem-edit", patch: "edited" } as const]
1284
+ : []),
1285
+ { kind: "rescope", memoryId: "mem-rescope", toNamespace: "destination" },
1286
+ ];
1287
+ const plannerDeps: PlannerDeps = {
1288
+ ...makePlannerDeps(dir, candidates),
1289
+ classifyAndDraft: async () => ({
1290
+ classification: "outdated",
1291
+ confidence: 0.9,
1292
+ actions,
1293
+ relevance: [...candidates.values()].map((candidate) => ({
1294
+ memoryId: candidate.memoryId,
1295
+ why: "test",
1296
+ })),
1297
+ warnings: [],
1298
+ }),
1299
+ };
1300
+ const planner = new CorrectionPlanner(plannerDeps);
1301
+ const plan = await planner.plan(
1302
+ { text: "move memory", targetIds: [...candidates.keys()] },
1303
+ ["default"],
1304
+ );
1305
+ const abortController = new AbortController();
1306
+ const started = Promise.withResolvers<void>();
1307
+ const authorization = Promise.withResolvers<boolean>();
1308
+ let forwardedSignal: AbortSignal | undefined;
1309
+ const applyResult = new CorrectionExecutor(makeExecutorDeps(state), planner)
1310
+ .apply("default", plan.planId, {
1311
+ confirm: true,
1312
+ abortSignal: abortController.signal,
1313
+ canWriteDestination: async (_namespace, abortSignal) => {
1314
+ forwardedSignal = abortSignal;
1315
+ started.resolve();
1316
+ return authorization.promise;
1317
+ },
1318
+ })
1319
+ .then(
1320
+ (outcome) => ({ ok: true as const, outcome }),
1321
+ (error: unknown) => ({ ok: false as const, error }),
1322
+ );
1323
+
1324
+ await started.promise;
1325
+ abortController.abort(new Error("correction deadline exceeded"));
1326
+ assert.equal(forwardedSignal, abortController.signal);
1327
+ assert.equal(forwardedSignal?.aborted, true);
1328
+ authorization.resolve(true);
1329
+ const result = await applyResult;
1330
+ assert.equal(state.memories.get("mem-rescope")?.status, "active");
1331
+ if (priorEditCommitted) {
1332
+ assert.equal(result.ok, true);
1333
+ assert.equal(result.outcome?.status, "partial");
1334
+ assert.equal(
1335
+ result.outcome?.results.some(
1336
+ (entry) => entry.action.kind === "rescope" && entry.status === "skipped",
1337
+ ),
1338
+ true,
1339
+ );
1340
+ assert.equal((await planner.loadPlan("default", plan.planId))?.status, "partial");
1341
+ } else {
1342
+ assert.equal(result.ok, false);
1343
+ assert.match(String(result.error), /correction deadline exceeded|correction apply aborted/);
1344
+ assert.equal((await planner.loadPlan("default", plan.planId))?.status, "pending");
1345
+ }
1346
+ });
1347
+ }
1348
+ });
1349
+
1146
1350
  test("Of0pz: supersede with a missing loser writes NO replacement (preflight before write)", async () => {
1147
1351
  await withTempDir(async (dir) => {
1148
1352
  const candidates = new Map<string, PlannerCandidate>([
@@ -24,7 +24,7 @@
24
24
  * (`markConsumed`) under `serializeMutations` keyed by plan id (rule 40).
25
25
  */
26
26
 
27
- import { throwIfAborted } from "../abort-error.js";
27
+ import { raceAbort, throwIfAborted } from "../abort-error.js";
28
28
  import { log } from "../logger.js";
29
29
  import { serializeMutations } from "../utils/serialize-mutations.js";
30
30
  import {
@@ -201,7 +201,7 @@ export class CorrectionExecutor {
201
201
  * thread: authorize-rescope-destination). Defaults to allow when the
202
202
  * source namespace already resolves to a writable scope (single-tenant).
203
203
  */
204
- canWriteDestination?: (namespace: string) => Promise<boolean>;
204
+ canWriteDestination?: (namespace: string, abortSignal?: AbortSignal) => Promise<boolean>;
205
205
  }
206
206
  ): Promise<CorrectionOutcome> {
207
207
  throwIfAborted(opts.abortSignal, "correction apply aborted");
@@ -220,7 +220,7 @@ export class CorrectionExecutor {
220
220
  private async applyInternal(
221
221
  namespace: string,
222
222
  planId: string,
223
- canWriteDestination?: (namespace: string) => Promise<boolean>,
223
+ canWriteDestination?: (namespace: string, abortSignal?: AbortSignal) => Promise<boolean>,
224
224
  abortSignal?: AbortSignal
225
225
  ): Promise<CorrectionOutcome> {
226
226
  throwIfAborted(abortSignal, "correction apply aborted");
@@ -307,10 +307,9 @@ export class CorrectionExecutor {
307
307
  }
308
308
  };
309
309
  let mutationCommitted = false;
310
- let cancellationSafeAfterCommit = false;
311
310
  let cancellationRequestedAfterCommit = false;
312
311
  const throwIfAbortedBeforeCommit = (): void => {
313
- if (!mutationCommitted || !cancellationSafeAfterCommit) {
312
+ if (!mutationCommitted) {
314
313
  throwIfAborted(abortSignal, "correction apply aborted");
315
314
  }
316
315
  };
@@ -409,7 +408,6 @@ export class CorrectionExecutor {
409
408
  retirementResult.status === "applied"
410
409
  ) {
411
410
  retiredReplacementActions.add(action);
412
- cancellationSafeAfterCommit = true;
413
411
  }
414
412
  } catch (err) {
415
413
  if (abortSignal?.aborted) {
@@ -435,7 +433,6 @@ export class CorrectionExecutor {
435
433
  abortSignal
436
434
  );
437
435
  mutationCommitted = true;
438
- cancellationSafeAfterCommit = true;
439
436
  results.push({ action, status: "applied", memoryId: editedId });
440
437
  appliedTouched.push(editedId);
441
438
  } catch (err) {
@@ -457,7 +454,6 @@ export class CorrectionExecutor {
457
454
  abortSignal
458
455
  );
459
456
  mutationCommitted = true;
460
- cancellationSafeAfterCommit = true;
461
457
  results.push({ action, status: "applied" });
462
458
  } catch (err) {
463
459
  if (abortSignal?.aborted) {
@@ -501,7 +497,6 @@ export class CorrectionExecutor {
501
497
  );
502
498
  if (results.at(-1)?.status === "applied") {
503
499
  mutationCommitted = true;
504
- cancellationSafeAfterCommit = true;
505
500
  }
506
501
  if (results.at(-1)?.action === action && results.at(-1)?.status === "applied") {
507
502
  removeFailedResultsFor(action);
@@ -518,7 +513,6 @@ export class CorrectionExecutor {
518
513
  );
519
514
  if (results.at(-1)?.status === "applied") {
520
515
  mutationCommitted = true;
521
- cancellationSafeAfterCommit = true;
522
516
  }
523
517
  if (results.at(-1)?.action === action && results.at(-1)?.status === "applied") {
524
518
  removeFailedResultsFor(action);
@@ -530,7 +524,13 @@ export class CorrectionExecutor {
530
524
  // the write ACL (review thread: authorize-rescope-destination).
531
525
  // canWriteDestination defaults to allow when absent (single-tenant,
532
526
  // where the source namespace already resolved to a writable scope).
533
- const allowed = canWriteDestination ? await canWriteDestination(action.toNamespace) : true;
527
+ const allowed = canWriteDestination
528
+ ? await raceAbort(
529
+ canWriteDestination(action.toNamespace, abortSignal),
530
+ abortSignal,
531
+ "correction apply aborted",
532
+ )
533
+ : true;
534
534
  if (!allowed) {
535
535
  results.push({
536
536
  action,
@@ -546,7 +546,6 @@ export class CorrectionExecutor {
546
546
  abortSignal
547
547
  );
548
548
  mutationCommitted = true;
549
- cancellationSafeAfterCommit = true;
550
549
  // #1678 (thread OiiV6): report the DESTINATION memory id, not the
551
550
  // source. The source is archived by the move; callers that re-fetch
552
551
  // the reported id need the live (destination) memory, otherwise they
@@ -589,14 +588,25 @@ export class CorrectionExecutor {
589
588
  const propagationWarnings: string[] = [];
590
589
  if (appliedTouched.length > 0) {
591
590
  try {
592
- await this.deps.propagate(namespace, appliedTouched, cancellationSafeAfterCommit ? undefined : abortSignal);
591
+ await this.deps.propagate(namespace, appliedTouched, mutationCommitted ? undefined : abortSignal);
593
592
  } catch (err) {
594
- if ((!mutationCommitted || !cancellationSafeAfterCommit) && abortSignal?.aborted) throw err;
593
+ if (!mutationCommitted && abortSignal?.aborted) throw err;
595
594
  propagationWarnings.push(`propagation failed (non-fatal): ${errMsg(err)}`);
596
595
  }
597
596
  }
598
597
 
599
598
  await throwIfAbortedBeforeCommitAndReset();
599
+ if (cancellationRequestedAfterCommit) {
600
+ const recordedActions = new Set(results.map((result) => result.action));
601
+ for (const action of plan.actions) {
602
+ if (recordedActions.has(action)) continue;
603
+ results.push({
604
+ action,
605
+ status: "skipped",
606
+ error: "correction apply cancelled before action started",
607
+ });
608
+ }
609
+ }
600
610
  // ── Phase 4: audit record ─────────────────────────────────────────────
601
611
  const anyFailed = results.some((r) => r.status === "failed");
602
612
  const status: CorrectionOutcome["status"] =
@@ -621,20 +631,19 @@ export class CorrectionExecutor {
621
631
  outcome,
622
632
  requestText: plan.request.text,
623
633
  },
624
- cancellationSafeAfterCommit ? undefined : abortSignal
634
+ mutationCommitted ? undefined : abortSignal
625
635
  );
626
636
  outcome.auditMemoryId = auditId;
627
637
  } catch (err) {
628
- if ((!mutationCommitted || !cancellationSafeAfterCommit) && abortSignal?.aborted) throw err;
629
- // The audit record is part of the contract but a failure to write it
630
- // must NOT propagate — applied corrections are already durable. Record
631
- // as a warning instead.
638
+ if (!mutationCommitted && abortSignal?.aborted) {
639
+ await resetApplying();
640
+ throw err;
641
+ }
632
642
  (outcome as CorrectionOutcome & { warnings?: string[] }).warnings = [
633
643
  ...propagationWarnings,
634
644
  `audit record write failed (non-fatal): ${errMsg(err)}`,
635
645
  ];
636
646
  }
637
- await throwIfAbortedBeforeCommitAndReset();
638
647
 
639
648
  // ── Phase 5: mark plan consumed ───────────────────────────────────────
640
649
  // Corrections are already applied (phases 1-4 succeeded). A markConsumed
@@ -17,6 +17,7 @@ import path from "node:path";
17
17
  import { test } from "node:test";
18
18
 
19
19
  import { withTempDir as managedWithTempDir } from "../testing/tmp-dir.js";
20
+ import { writeFileAtomically } from "../maintenance/atomic-file.js";
20
21
  import {
21
22
  CorrectionContractError,
22
23
  MEMORY_CATEGORIES,
@@ -301,6 +302,41 @@ test("plan persists atomically to state/corrections/pending/<planId>.json and ro
301
302
  });
302
303
  });
303
304
 
305
+ test("#2206 cancellation after atomic plan commit returns the persisted plan without temp files", async () => {
306
+ await withTempDir(async (dir) => {
307
+ const state: StubState = {
308
+ candidatesById: new Map([["mem-x", makeCandidate({ memoryId: "mem-x", content: "old fact" })]]),
309
+ llmResult: {
310
+ classification: "outdated",
311
+ confidence: 0.9,
312
+ actions: [{ kind: "edit", memoryId: "mem-x", patch: "new fact" }],
313
+ relevance: [{ memoryId: "mem-x", why: "outdated" }],
314
+ warnings: [],
315
+ },
316
+ writeReplacementCalls: 0,
317
+ propagateCalls: 0,
318
+ retireCalls: 0,
319
+ };
320
+ const abortController = new AbortController();
321
+ const deps = makeDeps(dir, state);
322
+ deps.writePlanFile = async (outputPath, content) => {
323
+ await writeFileAtomically(outputPath, content);
324
+ abortController.abort(new Error("correction deadline exceeded"));
325
+ };
326
+ const planner = new CorrectionPlanner(deps);
327
+
328
+ const plan = await planner.plan(
329
+ { text: "old fact", targetIds: ["mem-x"] },
330
+ ["default"],
331
+ { abortSignal: abortController.signal },
332
+ );
333
+ const pendingDir = path.join(dir, "state", "corrections", "pending");
334
+ assert.equal(abortController.signal.aborted, true);
335
+ assert.equal((await planner.loadPlan("default", plan.planId))?.planId, plan.planId);
336
+ assert.equal((await readdir(pendingDir)).some((name) => name.endsWith(".tmp")), false);
337
+ });
338
+ });
339
+
304
340
  test("plan expires after TTL — apply-time rejection is tested in executor; here we verify the timestamp", async () => {
305
341
  await withTempDir(async (dir) => {
306
342
  const state: StubState = {
@@ -20,9 +20,10 @@
20
20
  * only thing it persists is the plan document itself.
21
21
  */
22
22
 
23
- import { throwIfAborted } from "../abort-error.js";
24
- import { mkdir, readFile, rename, unlink, readdir, writeFile } from "node:fs/promises";
23
+ import { readFile, readdir, unlink } from "node:fs/promises";
25
24
  import path from "node:path";
25
+ import { throwIfAborted } from "../abort-error.js";
26
+ import { writeFileAtomically } from "../maintenance/atomic-file.js";
26
27
  import { serializeMutations } from "../utils/serialize-mutations.js";
27
28
  import {
28
29
  CORRECTION_TEXT_MAX,
@@ -109,6 +110,8 @@ export interface PlannerDeps {
109
110
  }): Promise<string>;
110
111
  /** Per-namespace storage dir root (so the plan lands in the right state/). */
111
112
  storageDir(namespace: string): Promise<string>;
113
+ /** Atomic persistence seam used by focused lifecycle tests. */
114
+ writePlanFile?: (outputPath: string, content: string) => Promise<unknown>;
112
115
  /** Max affected memories per plan (issue config: default 10). */
113
116
  readonly maxAffected: number;
114
117
  /** Plan TTL in hours (issue config: default 24). */
@@ -431,13 +434,8 @@ export class CorrectionPlanner {
431
434
  : plan;
432
435
  await serializeMutations(`correction-plan:${target}`, async () => {
433
436
  throwIfAborted(abortSignal, "correction planning aborted");
434
- await mkdir(dir, { recursive: true });
435
- const tmp = `${target}.${process.pid}.${Date.now().toString(36)}.tmp`;
436
- throwIfAborted(abortSignal, "correction planning aborted");
437
- await writeFile(tmp, `${JSON.stringify(persistedPlan)}\n`, "utf-8");
438
- throwIfAborted(abortSignal, "correction planning aborted");
439
- // rename() is atomic on POSIX for same-filesystem renames (rule 54).
440
- await rename(tmp, target);
437
+ const writePlanFile = this.deps.writePlanFile ?? writeFileAtomically;
438
+ await writePlanFile(target, `${JSON.stringify(persistedPlan)}\n`);
441
439
  });
442
440
  return plan;
443
441
  }
@@ -520,9 +518,7 @@ export class CorrectionPlanner {
520
518
  : a,
521
519
  );
522
520
  }
523
- const tmp = `${file}.${process.pid}.${Date.now().toString(36)}.tmp`;
524
- await writeFile(tmp, `${JSON.stringify(plan)}\n`, "utf-8");
525
- await rename(tmp, file);
521
+ await writeFileAtomically(file, `${JSON.stringify(plan)}\n`);
526
522
  });
527
523
  }
528
524
  /**
@@ -545,9 +541,7 @@ export class CorrectionPlanner {
545
541
  if (!plan || plan.status !== "applying") return;
546
542
  plan.status = "pending";
547
543
  delete plan.applyingAt;
548
- const tmp = `${file}.${process.pid}.${Date.now().toString(36)}.tmp`;
549
- await writeFile(tmp, `${JSON.stringify(plan)}\n`, "utf-8");
550
- await rename(tmp, file);
544
+ await writeFileAtomically(file, `${JSON.stringify(plan)}\n`);
551
545
  });
552
546
  }
553
547
 
@@ -52,6 +52,7 @@ export interface CorrectionNamespacePolicy {
52
52
  namespace: string;
53
53
  sessionKey?: string;
54
54
  principal?: string;
55
+ abortSignal?: AbortSignal;
55
56
  }): Promise<boolean>;
56
57
  /** Namespaces the caller may read — scopes the planner's search. */
57
58
  readableNamespaces(request: {
@@ -144,11 +145,12 @@ export class CorrectionService {
144
145
  abortSignal: opts.abortSignal,
145
146
  // Authorize rescope destinations through the namespace policy bound to
146
147
  // THIS caller's principal (review thread: authorize-rescope-destination).
147
- canWriteDestination: (dest) =>
148
+ canWriteDestination: (dest, abortSignal) =>
148
149
  this.deps.policy.canWriteNamespace({
149
150
  namespace: dest,
150
151
  ...(opts.sessionKey ? { sessionKey: opts.sessionKey } : {}),
151
152
  ...(opts.principal ? { principal: opts.principal } : {}),
153
+ ...(abortSignal ? { abortSignal } : {}),
152
154
  }),
153
155
  });
154
156
  }
@@ -16,12 +16,17 @@ import type { MemoryFile } from "../types.js";
16
16
 
17
17
  import { StorageManager, ContentHashIndex } from "../storage.js";
18
18
  import { sanitizeMemoryContent } from "../sanitize.js";
19
+ import { loadRedactionRules } from "../extraction-redaction-rules.js";
20
+ import { writeFileAtomically } from "../maintenance/atomic-file.js";
19
21
  import {
22
+ type CorrectionAccessWiring,
20
23
  isEligibleCorrectionCandidate,
21
24
  applyEditMemory,
22
25
  appendTombstoneFn,
26
+ appendAuditRecordFn,
23
27
  retireMemoryFn,
24
28
  rescopeMemoryFn,
29
+ registerRedactionRuleFn,
25
30
  writeReplacementMemory,
26
31
  } from "./correction-access-wiring.js";
27
32
 
@@ -292,6 +297,78 @@ test("#2128 tombstone append returns its committed id after cancellation", async
292
297
  }
293
298
  });
294
299
 
300
+ test("#2206 redaction adapter returns after a committed rule write despite cancellation", async () => {
301
+ const { storage, cleanup } = await makeStorage("remnic-corr-redaction-abort-");
302
+ try {
303
+ const abortController = new AbortController();
304
+ let commitCompleted = false;
305
+ const wiring = {
306
+ orchestrator: { getStorage: async () => storage },
307
+ } as unknown as CorrectionAccessWiring;
308
+
309
+ await registerRedactionRuleFn(
310
+ wiring,
311
+ "default",
312
+ "do-not-store-this",
313
+ abortController.signal,
314
+ async (outputPath, content) => {
315
+ await writeFileAtomically(outputPath, content);
316
+ commitCompleted = true;
317
+ abortController.abort(new Error("correction deadline exceeded"));
318
+ },
319
+ );
320
+
321
+ assert.equal(commitCompleted, true);
322
+ assert.deepEqual(
323
+ (await loadRedactionRules(storage.dir)).map((rule) => rule.pattern),
324
+ ["do-not-store-this"],
325
+ );
326
+ } finally {
327
+ await cleanup();
328
+ }
329
+ });
330
+
331
+ test("#2206 audit adapter returns its committed id despite cancellation", async () => {
332
+ const { storage, cleanup } = await makeStorage("remnic-corr-audit-abort-");
333
+ try {
334
+ const originalWriteSealedMemory = storage.writeSealedMemory.bind(storage);
335
+ const abortController = new AbortController();
336
+ let committed = false;
337
+ storage.writeSealedMemory = async (...args: Parameters<typeof storage.writeSealedMemory>) => {
338
+ const result = await originalWriteSealedMemory(...args);
339
+ committed = true;
340
+ abortController.abort(new Error("correction deadline exceeded"));
341
+ return result;
342
+ };
343
+ const wiring = {
344
+ orchestrator: { getStorage: async () => storage },
345
+ } as unknown as CorrectionAccessWiring;
346
+
347
+ const auditId = await appendAuditRecordFn(
348
+ wiring,
349
+ "default",
350
+ {
351
+ planId: "plan-2206",
352
+ classification: "outdated",
353
+ outcome: {
354
+ planId: "plan-2206",
355
+ status: "partial",
356
+ results: [],
357
+ auditMemoryId: "",
358
+ appliedAt: "2026-07-30T00:00:00.000Z",
359
+ },
360
+ requestText: "update the stored fact",
361
+ },
362
+ abortController.signal,
363
+ );
364
+
365
+ assert.equal(committed, true);
366
+ assert.equal((await storage.getMemoryById(auditId))?.frontmatter.category, "correction");
367
+ } finally {
368
+ await cleanup();
369
+ }
370
+ });
371
+
295
372
  // ---------------------------------------------------------------------------
296
373
  // item 4: per-key tombstone emission
297
374
  // ---------------------------------------------------------------------------