@remnic/core 9.30.1 → 9.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (493) hide show
  1. package/dist/access-admin-ops-surface.d.ts +10 -10
  2. package/dist/access-admin-ops-surface.js +50 -44
  3. package/dist/access-authorization-probe.d.ts +10 -10
  4. package/dist/access-authorization-probe.js +51 -45
  5. package/dist/access-boundary.d.ts +13 -11
  6. package/dist/access-boundary.js +50 -44
  7. package/dist/access-cli.js +168 -123
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +119 -0
  10. package/dist/access-extraction-force-flush.js +166 -0
  11. package/dist/access-health-types.d.ts +1 -1
  12. package/dist/access-http-lcm-compaction.d.ts +47 -13
  13. package/dist/access-http-lcm-compaction.js +7 -3
  14. package/dist/access-http-lifecycle-flush.d.ts +132 -0
  15. package/dist/access-http-lifecycle-flush.js +9 -0
  16. package/dist/access-http-lifecycle-flush.js.map +1 -0
  17. package/dist/access-http.d.ts +11 -10
  18. package/dist/access-http.js +66 -59
  19. package/dist/access-identity-continuity-surface.d.ts +8 -8
  20. package/dist/access-identity-continuity-surface.js +50 -44
  21. package/dist/access-lcm-surface.d.ts +10 -10
  22. package/dist/access-lcm-surface.js +50 -44
  23. package/dist/access-mcp-output-schemas.js +1 -1
  24. package/dist/access-mcp.d.ts +16 -10
  25. package/dist/access-mcp.js +58 -52
  26. package/dist/access-memory-search-fanout.d.ts +2 -2
  27. package/dist/{access-namespace-preflight-VfXssvoI.d.ts → access-namespace-preflight-D4vW97H1.d.ts} +1 -1
  28. package/dist/access-namespace-preflight.d.ts +3 -3
  29. package/dist/access-namespace-preflight.js +50 -44
  30. package/dist/access-observe-helpers.d.ts +22 -0
  31. package/dist/access-observe-helpers.js +10 -0
  32. package/dist/access-observe-helpers.js.map +1 -0
  33. package/dist/access-observe-write-surface.d.ts +51 -47
  34. package/dist/access-observe-write-surface.js +50 -44
  35. package/dist/access-operations-batch.js +53 -47
  36. package/dist/access-operations.d.ts +11 -11
  37. package/dist/access-operations.js +55 -49
  38. package/dist/access-recall-concurrency.d.ts +10 -10
  39. package/dist/access-recall-concurrency.js +50 -44
  40. package/dist/access-recall-response.d.ts +10 -10
  41. package/dist/access-recall-response.js +50 -44
  42. package/dist/access-recall-surface.d.ts +10 -10
  43. package/dist/access-recall-surface.js +50 -44
  44. package/dist/access-schema.d.ts +37 -7
  45. package/dist/access-schema.js +5 -3
  46. package/dist/{access-service-B5RwVsTV.d.ts → access-service-B6PZ_xUL.d.ts} +44 -20
  47. package/dist/access-service-helpers.d.ts +113 -0
  48. package/dist/access-service-helpers.js +8 -0
  49. package/dist/access-service-helpers.js.map +1 -0
  50. package/dist/access-service.d.ts +10 -10
  51. package/dist/access-service.js +50 -44
  52. package/dist/access-surface-catalog.d.ts +10 -10
  53. package/dist/access-surface-catalog.js +2 -0
  54. package/dist/access-surface-catalog.js.map +1 -1
  55. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  56. package/dist/action-confidence.d.ts +1 -1
  57. package/dist/active-memory-bridge.d.ts +1 -1
  58. package/dist/active-recall.d.ts +1 -1
  59. package/dist/active-recall.js +1 -1
  60. package/dist/adapters/index.js +7 -7
  61. package/dist/adapters/registry.js +3 -3
  62. package/dist/behavior-learner.d.ts +1 -1
  63. package/dist/behavior-signals.d.ts +1 -1
  64. package/dist/bootstrap.d.ts +8 -8
  65. package/dist/briefing.d.ts +2 -2
  66. package/dist/briefing.js +14 -14
  67. package/dist/buffer-surprise-report.d.ts +1 -1
  68. package/dist/buffer-turn-helpers.d.ts +5 -0
  69. package/dist/buffer-turn-helpers.js +24 -0
  70. package/dist/buffer-turn-helpers.js.map +1 -0
  71. package/dist/buffer.d.ts +17 -4
  72. package/dist/buffer.js +21 -1
  73. package/dist/bulk-import/index.d.ts +3 -3
  74. package/dist/calibration.d.ts +1 -1
  75. package/dist/capabilities.d.ts +1 -1
  76. package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
  77. package/dist/capsule-crypto-7FJQINUR.js.map +1 -0
  78. package/dist/{capsule-merge-5KKJQBWQ.js → capsule-merge-2H2IUTBT.js} +4 -4
  79. package/dist/{catalog-V7inUQdp.d.ts → catalog-CGFYmTT8.d.ts} +1 -1
  80. package/dist/causal-behavior.d.ts +1 -1
  81. package/dist/causal-behavior.js +2 -2
  82. package/dist/causal-chain.js +2 -2
  83. package/dist/causal-consolidation.d.ts +1 -1
  84. package/dist/causal-consolidation.js +19 -19
  85. package/dist/causal-retrieval.js +2 -2
  86. package/dist/causal-trajectory-graph.d.ts +1 -1
  87. package/dist/causal-trajectory.js +1 -1
  88. package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
  89. package/dist/{chunk-GIBMDSJ2.js → chunk-27P5YVDU.js} +2 -2
  90. package/dist/{chunk-2SA56WMI.js → chunk-2LTDWSR6.js} +4 -4
  91. package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
  92. package/dist/{chunk-YTSNAUXN.js → chunk-3F2LKUMU.js} +22 -8
  93. package/dist/chunk-3F2LKUMU.js.map +1 -0
  94. package/dist/chunk-3QL24R5Y.js +9 -0
  95. package/dist/chunk-3QL24R5Y.js.map +1 -0
  96. package/dist/chunk-4RNZMRAV.js +60 -0
  97. package/dist/chunk-4RNZMRAV.js.map +1 -0
  98. package/dist/{chunk-6U7F52DE.js → chunk-4XHR3I67.js} +60 -60
  99. package/dist/chunk-5IVLTFOV.js +65 -0
  100. package/dist/chunk-5IVLTFOV.js.map +1 -0
  101. package/dist/{chunk-2EUVEDF5.js → chunk-5XA7PQ5I.js} +2 -2
  102. package/dist/{chunk-ALSGMEJR.js → chunk-65ZPVYTA.js} +7 -7
  103. package/dist/{chunk-5VQJBH2G.js → chunk-6TAUHL33.js} +2 -2
  104. package/dist/{chunk-HUHX2OCX.js → chunk-7DRETLP5.js} +1 -1
  105. package/dist/chunk-7DRETLP5.js.map +1 -0
  106. package/dist/{chunk-RGIWINDN.js → chunk-7G5MH4NT.js} +30 -30
  107. package/dist/{chunk-WVO4G37W.js → chunk-7TEZUUGM.js} +3 -3
  108. package/dist/{chunk-MJCGLM25.js → chunk-7VUAG236.js} +5 -5
  109. package/dist/{chunk-M3C2V3PV.js → chunk-AJEMDQNA.js} +12 -12
  110. package/dist/{chunk-RKNJBZ55.js → chunk-AU7Q3LSC.js} +7 -7
  111. package/dist/{chunk-ACXPX4AG.js → chunk-BR2K43MK.js} +2 -2
  112. package/dist/{chunk-IYZ5K7MU.js → chunk-BUE5E2HL.js} +4 -187
  113. package/dist/chunk-BUE5E2HL.js.map +1 -0
  114. package/dist/{chunk-CZRYLSSW.js → chunk-BUGVGH4N.js} +2 -2
  115. package/dist/{chunk-YTQNQ4KB.js → chunk-C4VQMFVM.js} +3 -3
  116. package/dist/{chunk-ZPSVBSOF.js → chunk-CIVDJD6P.js} +3 -3
  117. package/dist/{chunk-K5GB36ME.js → chunk-CZDOT5I2.js} +2 -2
  118. package/dist/{chunk-VI2JQPNQ.js → chunk-E4PWACUN.js} +2 -2
  119. package/dist/{chunk-D2ANTDGO.js → chunk-E6BMSH7U.js} +2 -2
  120. package/dist/{chunk-P5PXWTW7.js → chunk-EJCAV3QZ.js} +3 -3
  121. package/dist/{chunk-CKMO4RDY.js → chunk-EMDLM3LW.js} +4 -4
  122. package/dist/chunk-ER7W6H4T.js +112 -0
  123. package/dist/chunk-ER7W6H4T.js.map +1 -0
  124. package/dist/{chunk-6FUPCJUL.js → chunk-FI4F5X2V.js} +54 -54
  125. package/dist/chunk-FI4F5X2V.js.map +1 -0
  126. package/dist/{chunk-LGHKJABJ.js → chunk-GOUILH55.js} +40 -18
  127. package/dist/chunk-GOUILH55.js.map +1 -0
  128. package/dist/{chunk-G5R3D5UP.js → chunk-GTTAHHD3.js} +2 -2
  129. package/dist/{chunk-H5CPS5JP.js → chunk-H36LJIPD.js} +3 -3
  130. package/dist/{chunk-AITCS2RC.js → chunk-IJ7HK452.js} +4 -4
  131. package/dist/{chunk-D3LMYTBV.js → chunk-J7WZUL2K.js} +9 -9
  132. package/dist/{chunk-5W4ZLBEZ.js → chunk-JCFTIQBR.js} +2 -2
  133. package/dist/{chunk-XOZ4ALGB.js → chunk-KE353EWI.js} +3 -3
  134. package/dist/{chunk-W5EG6LE3.js → chunk-KIT6M7EB.js} +3 -3
  135. package/dist/{chunk-5W7CTZ2E.js → chunk-KQAFEZQX.js} +4 -4
  136. package/dist/{chunk-Z54EM5YZ.js → chunk-MAXVH44E.js} +7 -7
  137. package/dist/{chunk-WZFAPHIK.js → chunk-MU7ZHSZE.js} +2 -2
  138. package/dist/chunk-N5Z4EVOR.js +123 -0
  139. package/dist/chunk-N5Z4EVOR.js.map +1 -0
  140. package/dist/{chunk-66772WBP.js → chunk-NFXQJHJD.js} +5 -5
  141. package/dist/{chunk-AZ5BTEKX.js → chunk-NQUF7XKR.js} +2 -2
  142. package/dist/{chunk-W4FBGYGK.js → chunk-NRV4Y3PM.js} +1 -1
  143. package/dist/{chunk-NHWB6HG2.js → chunk-NYCGIQRA.js} +2 -2
  144. package/dist/{chunk-4WKA6I65.js → chunk-OGCNZPKX.js} +1119 -309
  145. package/dist/chunk-OGCNZPKX.js.map +1 -0
  146. package/dist/{chunk-QJAQNXWI.js → chunk-ONHRRJZM.js} +6 -6
  147. package/dist/{chunk-FDAMS4PK.js → chunk-PNPOWBGC.js} +2 -2
  148. package/dist/{chunk-IC6CBHCA.js → chunk-QGENAYVS.js} +2 -2
  149. package/dist/{chunk-GBJ4RDFR.js → chunk-QIHIHZYC.js} +66 -91
  150. package/dist/chunk-QIHIHZYC.js.map +1 -0
  151. package/dist/{chunk-YNQBRLC5.js → chunk-RUYJ7TWU.js} +517 -2011
  152. package/dist/chunk-RUYJ7TWU.js.map +1 -0
  153. package/dist/{chunk-4A6YGWQN.js → chunk-TL4TO3EA.js} +115 -120
  154. package/dist/chunk-TL4TO3EA.js.map +1 -0
  155. package/dist/{chunk-SPJXKAVF.js → chunk-U52AKICI.js} +14 -13
  156. package/dist/chunk-U52AKICI.js.map +1 -0
  157. package/dist/chunk-ULARSG5Z.js +203 -0
  158. package/dist/chunk-ULARSG5Z.js.map +1 -0
  159. package/dist/{chunk-62U4J2GN.js → chunk-UR77VKF7.js} +2 -2
  160. package/dist/{chunk-JCBWCYEJ.js → chunk-VANLTS5F.js} +2 -2
  161. package/dist/{chunk-4Z4XNEWZ.js → chunk-VCD4PSK2.js} +56 -12
  162. package/dist/chunk-VCD4PSK2.js.map +1 -0
  163. package/dist/{chunk-RMMVQQA6.js → chunk-WDISJRMG.js} +2 -2
  164. package/dist/{chunk-B6JDYXL7.js → chunk-WWUVONGW.js} +7 -1
  165. package/dist/chunk-WWUVONGW.js.map +1 -0
  166. package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
  167. package/dist/{chunk-TH2LSRMG.js → chunk-XHDIB4T4.js} +2 -2
  168. package/dist/{chunk-CVILPI77.js → chunk-XOQSEF7X.js} +6 -6
  169. package/dist/{chunk-LBOD4U5B.js → chunk-YFOMN2II.js} +6 -6
  170. package/dist/{chunk-RPW2NOU6.js → chunk-YIAA2X3D.js} +41 -1
  171. package/dist/chunk-YIAA2X3D.js.map +1 -0
  172. package/dist/chunk-YPC7W6GA.js +1604 -0
  173. package/dist/chunk-YPC7W6GA.js.map +1 -0
  174. package/dist/{chunk-I5NLEENJ.js → chunk-Z4SWV4VW.js} +3 -3
  175. package/dist/{chunk-PHWUFPCO.js → chunk-ZCPP5OW6.js} +61 -53
  176. package/dist/chunk-ZCPP5OW6.js.map +1 -0
  177. package/dist/{cli-C4GbETPC.d.ts → cli-BptUDTtp.d.ts} +5 -5
  178. package/dist/cli.d.ts +12 -12
  179. package/dist/cli.js +91 -84
  180. package/dist/compounding/engine.d.ts +2 -2
  181. package/dist/compounding/engine.js +14 -14
  182. package/dist/compounding/preference-consolidator.d.ts +1 -1
  183. package/dist/compression-optimizer.d.ts +1 -1
  184. package/dist/config.d.ts +1 -1
  185. package/dist/config.js +1 -1
  186. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  187. package/dist/connectors/codex-materialize-runner.js +14 -14
  188. package/dist/connectors/codex-materialize.d.ts +1 -1
  189. package/dist/connectors/index.d.ts +1 -1
  190. package/dist/connectors/index.js +17 -17
  191. package/dist/consolidation-provenance-check.d.ts +2 -2
  192. package/dist/consolidation-provenance-check.js +5 -5
  193. package/dist/consolidation-undo.d.ts +2 -2
  194. package/dist/consolidation-undo.js +3 -3
  195. package/dist/contradiction/index.d.ts +2 -2
  196. package/dist/contradiction/index.js +4 -4
  197. package/dist/conversation-index/backend.d.ts +1 -1
  198. package/dist/conversation-index/backend.js +2 -2
  199. package/dist/conversation-index/chunker.d.ts +1 -1
  200. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  201. package/dist/conversation-index/indexer.d.ts +1 -1
  202. package/dist/conversation-index/search.d.ts +1 -1
  203. package/dist/corpus-watermark.d.ts +1 -1
  204. package/dist/corpus-watermark.js +26 -26
  205. package/dist/day-summary.d.ts +1 -1
  206. package/dist/delinearize.d.ts +1 -1
  207. package/dist/direct-answer-wiring.d.ts +1 -1
  208. package/dist/direct-answer.d.ts +1 -1
  209. package/dist/embedding-fallback.d.ts +1 -1
  210. package/dist/enrichment/index.d.ts +1 -1
  211. package/dist/entity-retrieval.d.ts +2 -2
  212. package/dist/entity-retrieval.js +14 -14
  213. package/dist/entity-schema.d.ts +1 -1
  214. package/dist/explicit-capture.d.ts +8 -8
  215. package/dist/extraction-error-classification.d.ts +1 -1
  216. package/dist/extraction-faithfulness.d.ts +1 -1
  217. package/dist/extraction-judge-telemetry.d.ts +1 -1
  218. package/dist/extraction-judge-training.d.ts +1 -1
  219. package/dist/extraction-judge.d.ts +1 -1
  220. package/dist/extraction-liveness.d.ts +1 -1
  221. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  222. package/dist/extraction-source-grounding.d.ts +15 -2
  223. package/dist/extraction-source-grounding.js +10 -1
  224. package/dist/extraction.d.ts +2 -15
  225. package/dist/extraction.js +5 -4
  226. package/dist/fallback-llm.d.ts +1 -1
  227. package/dist/graph-dashboard-diff.d.ts +1 -1
  228. package/dist/graph-dashboard-key.d.ts +1 -1
  229. package/dist/graph-dashboard-parser.d.ts +1 -1
  230. package/dist/graph-edge-reinforcement.d.ts +1 -1
  231. package/dist/graph-snapshot.d.ts +1 -1
  232. package/dist/graph.d.ts +1 -1
  233. package/dist/importance.d.ts +1 -1
  234. package/dist/importers/index.d.ts +1 -1
  235. package/dist/in-flight-reads.d.ts +1 -1
  236. package/dist/index.d.ts +19 -19
  237. package/dist/index.js +215 -207
  238. package/dist/intent.d.ts +1 -1
  239. package/dist/lcm/engine.d.ts +1 -1
  240. package/dist/lcm/engine.js +3 -3
  241. package/dist/lcm/index.d.ts +1 -1
  242. package/dist/lcm/index.js +6 -6
  243. package/dist/lcm/tools.d.ts +1 -1
  244. package/dist/lifecycle.d.ts +1 -1
  245. package/dist/live-connectors-runner.d.ts +1 -1
  246. package/dist/local-llm-helpers.d.ts +7 -0
  247. package/dist/local-llm-helpers.js +16 -0
  248. package/dist/local-llm-helpers.js.map +1 -0
  249. package/dist/local-llm.d.ts +3 -6
  250. package/dist/local-llm.js +2 -1
  251. package/dist/local-model-endpoint.d.ts +1 -1
  252. package/dist/maintenance/memory-governance.d.ts +1 -1
  253. package/dist/maintenance/memory-governance.js +14 -14
  254. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  255. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -14
  256. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  257. package/dist/maintenance/rebuild-memory-projection.js +15 -15
  258. package/dist/{maintenance-CL30NWtc.d.ts → maintenance-b6f92bRz.d.ts} +3 -3
  259. package/dist/mcp-memory-inspector-app.d.ts +10 -10
  260. package/dist/memory-action-policy.d.ts +1 -1
  261. package/dist/memory-cache.d.ts +1 -1
  262. package/dist/memory-corpus-version.js +2 -2
  263. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  264. package/dist/memory-projection-store.d.ts +1 -1
  265. package/dist/memory-provenance.d.ts +1 -1
  266. package/dist/memory-worth-outcomes.d.ts +2 -2
  267. package/dist/models-json.d.ts +1 -1
  268. package/dist/namespaces/migrate.d.ts +3 -3
  269. package/dist/namespaces/migrate.js +24 -24
  270. package/dist/namespaces/principal.d.ts +1 -1
  271. package/dist/namespaces/search.d.ts +1 -1
  272. package/dist/namespaces/search.js +9 -9
  273. package/dist/namespaces/storage.d.ts +3 -3
  274. package/dist/namespaces/storage.js +14 -14
  275. package/dist/native-knowledge.d.ts +1 -1
  276. package/dist/offline-sync-impression-drain.d.ts +1 -1
  277. package/dist/offline-sync-impression-drain.js +6 -5
  278. package/dist/operator-doctor-corpus.d.ts +1 -1
  279. package/dist/operator-doctor-corpus.js +29 -29
  280. package/dist/operator-doctor-replica.d.ts +1 -1
  281. package/dist/operator-doctor-replica.js +3 -3
  282. package/dist/operator-toolkit.d.ts +3 -3
  283. package/dist/operator-toolkit.js +38 -37
  284. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  285. package/dist/orchestration/maintenance.d.ts +4 -4
  286. package/dist/orchestration/maintenance.js +22 -21
  287. package/dist/{orchestrator-CKTCRwWV.d.ts → orchestrator-3uGxC1qO.d.ts} +72 -34
  288. package/dist/orchestrator.d.ts +8 -8
  289. package/dist/orchestrator.js +167 -159
  290. package/dist/page-versioning.js +3 -3
  291. package/dist/patterns-cli.d.ts +1 -1
  292. package/dist/{pipeline-B7wj4rRZ.d.ts → pipeline-DepuNr-m.d.ts} +1 -1
  293. package/dist/policy-runtime.d.ts +1 -1
  294. package/dist/proactive-contention.d.ts +1 -1
  295. package/dist/provenance.d.ts +1 -1
  296. package/dist/{qmd-q9tg4dHp.d.ts → qmd-Dalr3Jby.d.ts} +1 -1
  297. package/dist/qmd-preflight.d.ts +2 -2
  298. package/dist/qmd-recall-cache.d.ts +1 -1
  299. package/dist/qmd.d.ts +2 -2
  300. package/dist/qmd.js +4 -4
  301. package/dist/recall-concurrency-config.d.ts +1 -1
  302. package/dist/recall-disclosure-escalation.d.ts +1 -1
  303. package/dist/recall-explain-renderer.d.ts +1 -1
  304. package/dist/recall-explain-renderer.js +3 -3
  305. package/dist/recall-memory-map.d.ts +1 -1
  306. package/dist/recall-planner-llm.d.ts +1 -1
  307. package/dist/recall-state.d.ts +1 -1
  308. package/dist/recall-tag-filter.d.ts +1 -1
  309. package/dist/recall-timings.d.ts +1 -1
  310. package/dist/recall-xray-cli.d.ts +1 -1
  311. package/dist/recall-xray-cli.js +4 -4
  312. package/dist/recall-xray-renderer.d.ts +1 -1
  313. package/dist/recall-xray-renderer.js +3 -3
  314. package/dist/recall-xray.d.ts +1 -1
  315. package/dist/recall-xray.js +2 -2
  316. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  317. package/dist/replay/normalizers/claude.d.ts +1 -1
  318. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  319. package/dist/replay/normalizers/shared.d.ts +1 -1
  320. package/dist/replay/runner.d.ts +1 -1
  321. package/dist/replay/types.d.ts +1 -1
  322. package/dist/replica-divergence.d.ts +1 -1
  323. package/dist/replica-divergence.js +2 -2
  324. package/dist/replica-peers-config.d.ts +1 -1
  325. package/dist/resolve-auth-token.d.ts +1 -1
  326. package/dist/resume-bundles.js +1 -1
  327. package/dist/retrieval-agents.d.ts +2 -2
  328. package/dist/retrieval-tiers.d.ts +1 -1
  329. package/dist/routing/engine.d.ts +1 -1
  330. package/dist/routing/store.d.ts +1 -1
  331. package/dist/salvage-envelope.d.ts +1 -1
  332. package/dist/{scope-profiles-CWDyglPM.d.ts → scope-profiles-BpiM5hTU.d.ts} +1 -1
  333. package/dist/search/embed-helper.d.ts +1 -1
  334. package/dist/search/factory.d.ts +1 -1
  335. package/dist/search/factory.js +8 -8
  336. package/dist/search/index.d.ts +1 -1
  337. package/dist/search/index.js +12 -12
  338. package/dist/search/lancedb-backend.d.ts +1 -1
  339. package/dist/search/meilisearch-backend.d.ts +1 -1
  340. package/dist/search/noop-backend.d.ts +1 -1
  341. package/dist/search/orama-backend.d.ts +1 -1
  342. package/dist/search/port.d.ts +1 -1
  343. package/dist/search/remote-backend.d.ts +1 -1
  344. package/dist/{semantic-consolidation-BUE3deLn.d.ts → semantic-consolidation-CMtVrf9f.d.ts} +1 -1
  345. package/dist/semantic-consolidation.d.ts +2 -2
  346. package/dist/semantic-consolidation.js +16 -16
  347. package/dist/semantic-rule-promotion.js +14 -14
  348. package/dist/semantic-rule-verifier.d.ts +1 -1
  349. package/dist/semantic-rule-verifier.js +14 -14
  350. package/dist/{service-CXgM0bQG.d.ts → service-DuAxwSgg.d.ts} +2 -2
  351. package/dist/session-observer-bands.d.ts +1 -1
  352. package/dist/session-observer-state.d.ts +1 -1
  353. package/dist/shared-context/manager.d.ts +1 -1
  354. package/dist/signal.d.ts +1 -1
  355. package/dist/{storage-DysJq-XH.d.ts → storage-CF0Ih8GP.d.ts} +1 -1
  356. package/dist/storage.d.ts +2 -2
  357. package/dist/storage.js +13 -13
  358. package/dist/summarizer.d.ts +1 -1
  359. package/dist/summarizer.js +3 -2
  360. package/dist/summary-snapshot.d.ts +1 -1
  361. package/dist/temporal-supersession.d.ts +2 -2
  362. package/dist/temporal-timeline-recall.d.ts +1 -1
  363. package/dist/temporal-validity.d.ts +1 -1
  364. package/dist/threading.d.ts +1 -1
  365. package/dist/tier-migration.d.ts +2 -2
  366. package/dist/tier-routing.d.ts +1 -1
  367. package/dist/tokens.js +2 -2
  368. package/dist/topics.d.ts +1 -1
  369. package/dist/transcript.d.ts +1 -1
  370. package/dist/transfer/backup.js +2 -2
  371. package/dist/transfer/capsule-export.js +2 -2
  372. package/dist/transfer/capsule-import.js +5 -5
  373. package/dist/trust-score-stage.d.ts +1 -1
  374. package/dist/trust-score.d.ts +1 -1
  375. package/dist/{types-aPPzhnjT.d.ts → types-BpaYvJ6v.d.ts} +22 -2
  376. package/dist/types.d.ts +1 -1
  377. package/dist/types.js +1 -1
  378. package/dist/utility-runtime.d.ts +1 -1
  379. package/dist/verified-recall.js +14 -14
  380. package/dist/write-envelope.d.ts +1 -1
  381. package/package.json +2 -2
  382. package/src/access-boundary.ts +3 -0
  383. package/src/access-cli.test.ts +93 -0
  384. package/src/access-cli.ts +56 -2
  385. package/src/access-extraction-force-flush.ts +177 -0
  386. package/src/access-http-extraction-force-flush.test.ts +132 -0
  387. package/src/access-http-lcm-compaction.ts +99 -22
  388. package/src/access-http-lifecycle-flush.ts +81 -0
  389. package/src/access-http.test.ts +227 -0
  390. package/src/access-http.ts +33 -40
  391. package/src/access-mcp-output-schemas.ts +6 -0
  392. package/src/access-mcp.test.ts +40 -0
  393. package/src/access-mcp.ts +32 -1
  394. package/src/access-observe-helpers.ts +180 -0
  395. package/src/access-observe-write-surface.ts +78 -19
  396. package/src/access-operations-batch.ts +2 -1
  397. package/src/access-schema-pi.test.ts +17 -0
  398. package/src/access-schema.ts +28 -11
  399. package/src/access-service-helpers.ts +46 -0
  400. package/src/access-service-observe-lcm-parity.test.ts +781 -31
  401. package/src/access-service-observe-scope.test.ts +88 -0
  402. package/src/access-service.ts +46 -128
  403. package/src/access-surface-catalog.test.ts +32 -0
  404. package/src/access-surface-catalog.ts +2 -0
  405. package/src/buffer-session.test.ts +148 -0
  406. package/src/buffer-turn-helpers.ts +152 -0
  407. package/src/buffer.ts +126 -201
  408. package/src/correction/correction-access-wiring.ts +79 -27
  409. package/src/correction/correction-executor.test.ts +542 -1
  410. package/src/correction/correction-executor.ts +309 -89
  411. package/src/correction/correction-planner.test.ts +35 -1
  412. package/src/correction/correction-planner.ts +50 -3
  413. package/src/correction/correction-service.ts +12 -7
  414. package/src/correction/correction-storage-integration.test.ts +172 -1
  415. package/src/correction/passive-capture.test.ts +35 -0
  416. package/src/correction/passive-capture.ts +17 -3
  417. package/src/extraction-source-grounding.ts +55 -1
  418. package/src/extraction-timeout.test.ts +51 -0
  419. package/src/extraction.ts +64 -90
  420. package/src/local-llm-headers-timeout.test.ts +48 -0
  421. package/src/local-llm-helpers.ts +58 -0
  422. package/src/local-llm.ts +62 -58
  423. package/src/orchestration/extraction-run-helpers.ts +309 -0
  424. package/src/orchestration/extraction-run.test.ts +350 -7
  425. package/src/orchestration/extraction-run.ts +327 -250
  426. package/src/orchestration/session-context.ts +193 -18
  427. package/src/orchestration/turn-ingestion.ts +61 -11
  428. package/src/orchestrator-flush.test.ts +511 -5
  429. package/src/orchestrator.ts +8 -6
  430. package/src/types.ts +2 -2
  431. package/dist/chunk-4A6YGWQN.js.map +0 -1
  432. package/dist/chunk-4WKA6I65.js.map +0 -1
  433. package/dist/chunk-4Z4XNEWZ.js.map +0 -1
  434. package/dist/chunk-6FUPCJUL.js.map +0 -1
  435. package/dist/chunk-B6JDYXL7.js.map +0 -1
  436. package/dist/chunk-GBJ4RDFR.js.map +0 -1
  437. package/dist/chunk-HUHX2OCX.js.map +0 -1
  438. package/dist/chunk-IYZ5K7MU.js.map +0 -1
  439. package/dist/chunk-LGHKJABJ.js.map +0 -1
  440. package/dist/chunk-PHWUFPCO.js.map +0 -1
  441. package/dist/chunk-RPW2NOU6.js.map +0 -1
  442. package/dist/chunk-SPJXKAVF.js.map +0 -1
  443. package/dist/chunk-YNQBRLC5.js.map +0 -1
  444. package/dist/chunk-YTSNAUXN.js.map +0 -1
  445. /package/dist/{capsule-crypto-GWVG7LGC.js.map → access-extraction-force-flush.js.map} +0 -0
  446. /package/dist/{capsule-merge-5KKJQBWQ.js.map → capsule-merge-2H2IUTBT.js.map} +0 -0
  447. /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
  448. /package/dist/{chunk-GIBMDSJ2.js.map → chunk-27P5YVDU.js.map} +0 -0
  449. /package/dist/{chunk-2SA56WMI.js.map → chunk-2LTDWSR6.js.map} +0 -0
  450. /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
  451. /package/dist/{chunk-6U7F52DE.js.map → chunk-4XHR3I67.js.map} +0 -0
  452. /package/dist/{chunk-2EUVEDF5.js.map → chunk-5XA7PQ5I.js.map} +0 -0
  453. /package/dist/{chunk-ALSGMEJR.js.map → chunk-65ZPVYTA.js.map} +0 -0
  454. /package/dist/{chunk-5VQJBH2G.js.map → chunk-6TAUHL33.js.map} +0 -0
  455. /package/dist/{chunk-RGIWINDN.js.map → chunk-7G5MH4NT.js.map} +0 -0
  456. /package/dist/{chunk-WVO4G37W.js.map → chunk-7TEZUUGM.js.map} +0 -0
  457. /package/dist/{chunk-MJCGLM25.js.map → chunk-7VUAG236.js.map} +0 -0
  458. /package/dist/{chunk-M3C2V3PV.js.map → chunk-AJEMDQNA.js.map} +0 -0
  459. /package/dist/{chunk-RKNJBZ55.js.map → chunk-AU7Q3LSC.js.map} +0 -0
  460. /package/dist/{chunk-ACXPX4AG.js.map → chunk-BR2K43MK.js.map} +0 -0
  461. /package/dist/{chunk-CZRYLSSW.js.map → chunk-BUGVGH4N.js.map} +0 -0
  462. /package/dist/{chunk-YTQNQ4KB.js.map → chunk-C4VQMFVM.js.map} +0 -0
  463. /package/dist/{chunk-ZPSVBSOF.js.map → chunk-CIVDJD6P.js.map} +0 -0
  464. /package/dist/{chunk-K5GB36ME.js.map → chunk-CZDOT5I2.js.map} +0 -0
  465. /package/dist/{chunk-VI2JQPNQ.js.map → chunk-E4PWACUN.js.map} +0 -0
  466. /package/dist/{chunk-D2ANTDGO.js.map → chunk-E6BMSH7U.js.map} +0 -0
  467. /package/dist/{chunk-P5PXWTW7.js.map → chunk-EJCAV3QZ.js.map} +0 -0
  468. /package/dist/{chunk-CKMO4RDY.js.map → chunk-EMDLM3LW.js.map} +0 -0
  469. /package/dist/{chunk-G5R3D5UP.js.map → chunk-GTTAHHD3.js.map} +0 -0
  470. /package/dist/{chunk-H5CPS5JP.js.map → chunk-H36LJIPD.js.map} +0 -0
  471. /package/dist/{chunk-AITCS2RC.js.map → chunk-IJ7HK452.js.map} +0 -0
  472. /package/dist/{chunk-D3LMYTBV.js.map → chunk-J7WZUL2K.js.map} +0 -0
  473. /package/dist/{chunk-5W4ZLBEZ.js.map → chunk-JCFTIQBR.js.map} +0 -0
  474. /package/dist/{chunk-XOZ4ALGB.js.map → chunk-KE353EWI.js.map} +0 -0
  475. /package/dist/{chunk-W5EG6LE3.js.map → chunk-KIT6M7EB.js.map} +0 -0
  476. /package/dist/{chunk-5W7CTZ2E.js.map → chunk-KQAFEZQX.js.map} +0 -0
  477. /package/dist/{chunk-Z54EM5YZ.js.map → chunk-MAXVH44E.js.map} +0 -0
  478. /package/dist/{chunk-WZFAPHIK.js.map → chunk-MU7ZHSZE.js.map} +0 -0
  479. /package/dist/{chunk-66772WBP.js.map → chunk-NFXQJHJD.js.map} +0 -0
  480. /package/dist/{chunk-AZ5BTEKX.js.map → chunk-NQUF7XKR.js.map} +0 -0
  481. /package/dist/{chunk-W4FBGYGK.js.map → chunk-NRV4Y3PM.js.map} +0 -0
  482. /package/dist/{chunk-NHWB6HG2.js.map → chunk-NYCGIQRA.js.map} +0 -0
  483. /package/dist/{chunk-QJAQNXWI.js.map → chunk-ONHRRJZM.js.map} +0 -0
  484. /package/dist/{chunk-FDAMS4PK.js.map → chunk-PNPOWBGC.js.map} +0 -0
  485. /package/dist/{chunk-IC6CBHCA.js.map → chunk-QGENAYVS.js.map} +0 -0
  486. /package/dist/{chunk-62U4J2GN.js.map → chunk-UR77VKF7.js.map} +0 -0
  487. /package/dist/{chunk-JCBWCYEJ.js.map → chunk-VANLTS5F.js.map} +0 -0
  488. /package/dist/{chunk-RMMVQQA6.js.map → chunk-WDISJRMG.js.map} +0 -0
  489. /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
  490. /package/dist/{chunk-TH2LSRMG.js.map → chunk-XHDIB4T4.js.map} +0 -0
  491. /package/dist/{chunk-CVILPI77.js.map → chunk-XOQSEF7X.js.map} +0 -0
  492. /package/dist/{chunk-LBOD4U5B.js.map → chunk-YFOMN2II.js.map} +0 -0
  493. /package/dist/{chunk-I5NLEENJ.js.map → chunk-Z4SWV4VW.js.map} +0 -0
@@ -41,8 +41,11 @@ interface FakeState {
41
41
  auditRecords: Array<{ planId: string; outcome: CorrectionOutcome }>;
42
42
  replacementFailOnLoserId?: string;
43
43
  retireFailOnMemoryId?: string;
44
+ retireFailuresRemaining?: number;
44
45
  /** When set, appendTombstone throws for this source memory (PG9 test). */
45
46
  tombstoneFailOnMemoryId?: string;
47
+ /** Hook used by cancellation-transaction regressions after a tombstone commits. */
48
+ abortAfterTombstone?: () => void;
46
49
  propagateFails?: boolean;
47
50
  propagateCalls: number;
48
51
  /** Number of times retireMemory was invoked (PG9 ordering test). */
@@ -113,7 +116,14 @@ function makeExecutorDeps(state: FakeState, opts: { biTemporalEnabled?: boolean;
113
116
  state.memories.set(memoryId, { ...existing, content: patch, rawContent: patch });
114
117
  return memoryId;
115
118
  },
116
- retireMemory: async (_ns, memoryId, retireOpts) => {
119
+ retireMemory: async (_ns, memoryId, retireOpts, abortSignal) => {
120
+ if (abortSignal?.aborted) {
121
+ throw abortSignal.reason ?? new Error("aborted");
122
+ }
123
+ if (state.retireFailuresRemaining && state.retireFailuresRemaining > 0) {
124
+ state.retireFailuresRemaining -= 1;
125
+ throw new Error(`injected transient retire failure for ${memoryId}`);
126
+ }
117
127
  if (state.retireFailOnMemoryId === memoryId) {
118
128
  throw new Error(`injected retire failure for ${memoryId}`);
119
129
  }
@@ -139,6 +149,7 @@ function makeExecutorDeps(state: FakeState, opts: { biTemporalEnabled?: boolean;
139
149
  throw new Error(`injected tombstone failure for ${input.sourceMemoryId}`);
140
150
  }
141
151
  state.tombstones.push(input);
152
+ state.abortAfterTombstone?.();
142
153
  return `tomb-${state.tombstones.length}`;
143
154
  },
144
155
  registerRedactionRule: async (_ns, pattern) => {
@@ -225,6 +236,286 @@ test("ordering: replacement write fails → loser NOT superseded, tagged partial
225
236
  });
226
237
  });
227
238
 
239
+ test("supersede retires the loser atomically when cancellation arrives after replacement write", async () => {
240
+ await withTempDir(async (dir) => {
241
+ const candidates = new Map<string, PlannerCandidate>([
242
+ ["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "old", excerpt: "old", score: 1 }],
243
+ ]);
244
+ const state: FakeState = {
245
+ memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "old" })]]),
246
+ tombstones: [],
247
+ redactionRules: [],
248
+ auditRecords: [],
249
+ propagateCalls: 0,
250
+ writtenReplacements: [],
251
+ };
252
+ const plannerDeps: PlannerDeps = {
253
+ ...makePlannerDeps(dir, candidates),
254
+ classifyAndDraft: async () => ({
255
+ classification: "outdated",
256
+ confidence: 0.9,
257
+ actions: [{ kind: "supersede", loserId: "mem-old", replacement: { content: "new" } }],
258
+ relevance: [{ memoryId: "mem-old", why: "x" }],
259
+ warnings: [],
260
+ }),
261
+ };
262
+ const planner = new CorrectionPlanner(plannerDeps);
263
+ const plan = await planner.plan({ text: "old", targetIds: ["mem-old"] }, ["default"]);
264
+ const abortController = new AbortController();
265
+ const baseDeps = makeExecutorDeps(state);
266
+ const deps: ExecutorDeps = {
267
+ ...baseDeps,
268
+ writeReplacement: async (namespace, draft, abortSignal) => {
269
+ const newId = await baseDeps.writeReplacement(namespace, draft, abortSignal);
270
+ abortController.abort();
271
+ return newId;
272
+ },
273
+ retireMemory: async (namespace, memoryId, opts, abortSignal) => {
274
+ assert.equal(abortSignal, undefined, "retirement must finish after replacement cancellation");
275
+ await baseDeps.retireMemory(namespace, memoryId, opts, abortSignal);
276
+ },
277
+ };
278
+
279
+ const executor = new CorrectionExecutor(deps, planner);
280
+ const outcome = await executor.apply("default", plan.planId, {
281
+ confirm: true,
282
+ abortSignal: abortController.signal,
283
+ });
284
+ assert.equal(outcome.status, "applied");
285
+ assert.equal((await planner.loadPlan("default", plan.planId))?.status, "applied");
286
+
287
+ const loser = state.memories.get("mem-old");
288
+ assert.equal(loser?.status, "superseded");
289
+ assert.equal(loser?.supersededBy, "mem-new-0");
290
+ assert.equal(state.tombstones.length, 1);
291
+ assert.equal(state.retireCalls, 1);
292
+ });
293
+ });
294
+
295
+ test("cancellation after marking a plan applying restores it to pending", async () => {
296
+ await withTempDir(async (dir) => {
297
+ const candidates = new Map<string, PlannerCandidate>([
298
+ ["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "old", excerpt: "old", score: 1 }],
299
+ ]);
300
+ const state: FakeState = {
301
+ memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "old" })]]),
302
+ tombstones: [],
303
+ redactionRules: [],
304
+ auditRecords: [],
305
+ propagateCalls: 0,
306
+ writtenReplacements: [],
307
+ };
308
+ const planner = new CorrectionPlanner(makePlannerDeps(dir, candidates));
309
+ const plan = await planner.plan({ text: "old", targetIds: ["mem-old"] }, ["default"]);
310
+ const abortController = new AbortController();
311
+ const originalMarkConsumed = planner.markConsumed.bind(planner);
312
+ planner.markConsumed = async (namespace, planId, status) => {
313
+ await originalMarkConsumed(namespace, planId, status);
314
+ if (status === "applying") abortController.abort();
315
+ };
316
+
317
+ const executor = new CorrectionExecutor(makeExecutorDeps(state), planner);
318
+ await assert.rejects(
319
+ executor.apply("default", plan.planId, {
320
+ confirm: true,
321
+ abortSignal: abortController.signal,
322
+ }),
323
+ /correction apply aborted/,
324
+ );
325
+
326
+ const reloaded = await planner.loadPlan("default", plan.planId);
327
+ assert.equal(reloaded?.status, "pending");
328
+ assert.ok(
329
+ (await planner.listPending("default")).some((pending) => pending.planId === plan.planId),
330
+ "cancelled plan must remain pending",
331
+ );
332
+ });
333
+ });
334
+
335
+ test("cancellation during loser preflight restores an applying plan to pending", async () => {
336
+ await withTempDir(async (dir) => {
337
+ const candidates = new Map<string, PlannerCandidate>([
338
+ ["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "old", excerpt: "old", score: 1 }],
339
+ ]);
340
+ const state: FakeState = {
341
+ memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "old" })]]),
342
+ tombstones: [],
343
+ redactionRules: [],
344
+ auditRecords: [],
345
+ propagateCalls: 0,
346
+ writtenReplacements: [],
347
+ };
348
+ const plannerDeps: PlannerDeps = {
349
+ ...makePlannerDeps(dir, candidates),
350
+ classifyAndDraft: async () => ({
351
+ classification: "outdated",
352
+ confidence: 0.9,
353
+ actions: [{ kind: "supersede", loserId: "mem-old", replacement: { content: "new" } }],
354
+ relevance: [{ memoryId: "mem-old", why: "x" }],
355
+ warnings: [],
356
+ }),
357
+ };
358
+ const planner = new CorrectionPlanner(plannerDeps);
359
+ const plan = await planner.plan({ text: "old", targetIds: ["mem-old"] }, ["default"]);
360
+ const abortController = new AbortController();
361
+ let resolveReadStarted!: () => void;
362
+ const readStarted = new Promise<void>((resolve) => {
363
+ resolveReadStarted = resolve;
364
+ });
365
+ const baseDeps = makeExecutorDeps(state);
366
+ const deps: ExecutorDeps = {
367
+ ...baseDeps,
368
+ getMemory: async (namespace, memoryId, abortSignal) => {
369
+ resolveReadStarted();
370
+ await new Promise<never>((_resolve, reject) => {
371
+ abortSignal?.addEventListener(
372
+ "abort",
373
+ () => reject(abortSignal.reason ?? new Error("aborted")),
374
+ { once: true },
375
+ );
376
+ });
377
+ return baseDeps.getMemory(namespace, memoryId);
378
+ },
379
+ };
380
+ const executor = new CorrectionExecutor(deps, planner);
381
+ const applyPromise = executor.apply("default", plan.planId, {
382
+ confirm: true,
383
+ abortSignal: abortController.signal,
384
+ });
385
+
386
+ await readStarted;
387
+ abortController.abort();
388
+ await assert.rejects(applyPromise, /correction apply aborted/);
389
+
390
+ const reloaded = await planner.loadPlan("default", plan.planId);
391
+ assert.equal(reloaded?.status, "pending");
392
+ assert.equal(state.writtenReplacements.length, 0);
393
+ });
394
+ });
395
+ test("#2128 Phase 1 pre-commit cancellation resets applying plans", async () => {
396
+ const cases: Array<{
397
+ name: string;
398
+ action: CorrectionAction;
399
+ inject: (deps: ExecutorDeps, abortController: AbortController) => ExecutorDeps;
400
+ }> = [
401
+ {
402
+ name: "supersede",
403
+ action: { kind: "supersede", loserId: "mem-old", replacement: { content: "new" } },
404
+ inject: (deps, abortController) => ({
405
+ ...deps,
406
+ writeReplacement: async (_namespace, _draft, _abortSignal) => {
407
+ abortController.abort();
408
+ throw abortController.signal.reason ?? new Error("aborted");
409
+ },
410
+ }),
411
+ },
412
+ {
413
+ name: "edit",
414
+ action: { kind: "edit", memoryId: "mem-old", patch: "new" },
415
+ inject: (deps, abortController) => ({
416
+ ...deps,
417
+ applyEdit: async (_namespace, _memoryId, _patch, _abortSignal) => {
418
+ abortController.abort();
419
+ throw abortController.signal.reason ?? new Error("aborted");
420
+ },
421
+ }),
422
+ },
423
+ {
424
+ name: "redaction_rule",
425
+ action: { kind: "redaction_rule", pattern: "secret-token" },
426
+ inject: (deps, abortController) => ({
427
+ ...deps,
428
+ registerRedactionRule: async (_namespace, _pattern, _abortSignal) => {
429
+ abortController.abort();
430
+ throw abortController.signal.reason ?? new Error("aborted");
431
+ },
432
+ }),
433
+ },
434
+ ];
435
+
436
+ for (const phaseCase of cases) {
437
+ await withTempDir(async (dir) => {
438
+ const candidates = new Map<string, PlannerCandidate>([
439
+ ["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "old", excerpt: "old", score: 1 }],
440
+ ]);
441
+ const state: FakeState = {
442
+ memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "old" })]]),
443
+ tombstones: [],
444
+ redactionRules: [],
445
+ auditRecords: [],
446
+ propagateCalls: 0,
447
+ writtenReplacements: [],
448
+ };
449
+ const plannerDeps: PlannerDeps = {
450
+ ...makePlannerDeps(dir, candidates),
451
+ classifyAndDraft: async () => ({
452
+ classification: phaseCase.action.kind === "redaction_rule" ? "never_store" : "outdated",
453
+ confidence: 0.9,
454
+ actions: [phaseCase.action],
455
+ relevance: [{ memoryId: "mem-old", why: "x" }],
456
+ warnings: [],
457
+ }),
458
+ };
459
+ const planner = new CorrectionPlanner(plannerDeps);
460
+ const plan = await planner.plan({ text: "old", targetIds: ["mem-old"] }, ["default"]);
461
+ const abortController = new AbortController();
462
+ const deps = phaseCase.inject(makeExecutorDeps(state), abortController);
463
+
464
+ await assert.rejects(
465
+ new CorrectionExecutor(deps, planner).apply("default", plan.planId, {
466
+ confirm: true,
467
+ abortSignal: abortController.signal,
468
+ }),
469
+ /aborted/,
470
+ );
471
+
472
+ const reloaded = await planner.loadPlan("default", plan.planId);
473
+ assert.equal(reloaded?.status, "pending", `${phaseCase.name} plan must remain pending`);
474
+ assert.ok(
475
+ (await planner.listPending("default")).some((pending) => pending.planId === plan.planId),
476
+ `${phaseCase.name} plan must remain retryable`,
477
+ );
478
+ });
479
+ }
480
+ });
481
+
482
+ test("supersede retries loser retirement after a transient failure", async () => {
483
+ await withTempDir(async (dir) => {
484
+ const candidates = new Map<string, PlannerCandidate>([
485
+ ["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "old", excerpt: "old", score: 1 }],
486
+ ]);
487
+ const state: FakeState = {
488
+ memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "old" })]]),
489
+ tombstones: [],
490
+ redactionRules: [],
491
+ auditRecords: [],
492
+ retireFailuresRemaining: 1,
493
+ propagateCalls: 0,
494
+ writtenReplacements: [],
495
+ };
496
+ const plannerDeps: PlannerDeps = {
497
+ ...makePlannerDeps(dir, candidates),
498
+ classifyAndDraft: async () => ({
499
+ classification: "outdated",
500
+ confidence: 0.9,
501
+ actions: [{ kind: "supersede", loserId: "mem-old", replacement: { content: "new" } }],
502
+ relevance: [{ memoryId: "mem-old", why: "x" }],
503
+ warnings: [],
504
+ }),
505
+ };
506
+ const planner = new CorrectionPlanner(plannerDeps);
507
+ const plan = await planner.plan({ text: "old", targetIds: ["mem-old"] }, ["default"]);
508
+ const executor = new CorrectionExecutor(makeExecutorDeps(state), planner);
509
+ const outcome = await executor.apply("default", plan.planId, { confirm: true });
510
+
511
+ assert.equal(outcome.status, "applied");
512
+ const loser = state.memories.get("mem-old");
513
+ assert.equal(loser?.status, "superseded");
514
+ assert.equal(state.tombstones.length, 2, "phase 2 must retry the failed retirement");
515
+ assert.equal(state.retireCalls, 1);
516
+ });
517
+ });
518
+
228
519
  test("tombstone emitted per retract; validUntil absent when bi-temporal OFF", async () => {
229
520
  await withTempDir(async (dir) => {
230
521
  const candidates = new Map<string, PlannerCandidate>([
@@ -602,6 +893,256 @@ test("PG9: tombstone failure does NOT retire the source memory (write tombstone
602
893
  });
603
894
  });
604
895
 
896
+ test("#2128 cancellation after tombstone commit terminalizes the correction plan", async () => {
897
+ await withTempDir(async (dir) => {
898
+ const candidates = new Map<string, PlannerCandidate>([
899
+ ["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "stale", excerpt: "stale", score: 1 }],
900
+ ]);
901
+ const abortController = new AbortController();
902
+ const state: FakeState = {
903
+ memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "stale" })]]),
904
+ tombstones: [],
905
+ redactionRules: [],
906
+ auditRecords: [],
907
+ propagateCalls: 0,
908
+ writtenReplacements: [],
909
+ abortAfterTombstone: () => abortController.abort(new Error("caller disconnected")),
910
+ };
911
+ const plannerDeps: PlannerDeps = {
912
+ ...makePlannerDeps(dir, candidates),
913
+ classifyAndDraft: async () => ({
914
+ classification: "outdated",
915
+ confidence: 0.9,
916
+ actions: [{ kind: "retract", memoryId: "mem-old" }],
917
+ relevance: [{ memoryId: "mem-old", why: "stale" }],
918
+ warnings: [],
919
+ }),
920
+ };
921
+ const planner = new CorrectionPlanner(plannerDeps);
922
+ const plan = await planner.plan({ text: "stale", targetIds: ["mem-old"] }, ["default"]);
923
+ const executor = new CorrectionExecutor(makeExecutorDeps(state), planner);
924
+
925
+ const outcome = await executor.apply("default", plan.planId, {
926
+ confirm: true,
927
+ abortSignal: abortController.signal,
928
+ });
929
+ assert.equal(outcome.status, "applied");
930
+ assert.equal((await planner.loadPlan("default", plan.planId))?.status, "applied");
931
+ assert.equal(state.tombstones.length, 1);
932
+ assert.equal(state.retireCalls, 1, "retirement must complete after tombstone commit");
933
+ assert.equal(state.memories.get("mem-old")?.status, "retracted");
934
+ });
935
+ });
936
+
937
+ test("#2128 late cancellation before any mutation restores an applying plan to pending", async () => {
938
+ await withTempDir(async (dir) => {
939
+ const state: FakeState = {
940
+ memories: new Map(),
941
+ tombstones: [],
942
+ redactionRules: [],
943
+ auditRecords: [],
944
+ propagateCalls: 0,
945
+ writtenReplacements: [],
946
+ };
947
+ const planner = new CorrectionPlanner(makePlannerDeps(dir, new Map()));
948
+ const plan = await planner.plan({ text: "nothing matches" }, ["default"]);
949
+ const abortController = new AbortController();
950
+ const deps = makeExecutorDeps(state);
951
+ const appendAuditRecord = deps.appendAuditRecord;
952
+ deps.appendAuditRecord = async (namespace, record, signal) => {
953
+ abortController.abort(new Error("caller disconnected"));
954
+ return appendAuditRecord(namespace, record, signal);
955
+ };
956
+ const executor = new CorrectionExecutor(deps, planner);
957
+
958
+ await assert.rejects(
959
+ () => executor.apply("default", plan.planId, { confirm: true, abortSignal: abortController.signal }),
960
+ /caller disconnected/,
961
+ );
962
+ assert.equal((await planner.loadPlan("default", plan.planId))?.status, "pending");
963
+ });
964
+ });
965
+
966
+ test("#2128 cancellation before retract mutation restores a plan to pending", async () => {
967
+ await withTempDir(async (dir) => {
968
+ const candidates = new Map<string, PlannerCandidate>([
969
+ ["mem-old", { memoryId: "mem-old", path: "facts/mem-old.md", content: "stale", excerpt: "stale", score: 1 }],
970
+ ]);
971
+ const abortController = new AbortController();
972
+ const state: FakeState = {
973
+ memories: new Map([["mem-old", fakeMemory({ memoryId: "mem-old", content: "stale" })]]),
974
+ tombstones: [],
975
+ redactionRules: [],
976
+ auditRecords: [],
977
+ propagateCalls: 0,
978
+ writtenReplacements: [],
979
+ };
980
+ const plannerDeps: PlannerDeps = {
981
+ ...makePlannerDeps(dir, candidates),
982
+ classifyAndDraft: async () => ({
983
+ classification: "outdated",
984
+ confidence: 0.9,
985
+ actions: [{ kind: "retract", memoryId: "mem-old" }],
986
+ relevance: [{ memoryId: "mem-old", why: "stale" }],
987
+ warnings: [],
988
+ }),
989
+ };
990
+ const planner = new CorrectionPlanner(plannerDeps);
991
+ const plan = await planner.plan({ text: "stale", targetIds: ["mem-old"] }, ["default"]);
992
+ const deps = makeExecutorDeps(state);
993
+ const originalGetMemory = deps.getMemory;
994
+ deps.getMemory = async (namespace, memoryId, signal) => {
995
+ if (memoryId === "mem-old") {
996
+ abortController.abort(new Error("caller disconnected"));
997
+ throw signal?.reason ?? new Error("caller disconnected");
998
+ }
999
+ return originalGetMemory(namespace, memoryId, signal);
1000
+ };
1001
+ const executor = new CorrectionExecutor(deps, planner);
1002
+
1003
+ await assert.rejects(
1004
+ () => executor.apply("default", plan.planId, { confirm: true, abortSignal: abortController.signal }),
1005
+ /caller disconnected/,
1006
+ );
1007
+ const reloaded = await planner.loadPlan("default", plan.planId);
1008
+ assert.equal(reloaded?.status, "pending");
1009
+ assert.equal(state.tombstones.length, 0);
1010
+ assert.equal(state.retireCalls ?? 0, 0);
1011
+ });
1012
+ });
1013
+
1014
+ test("#2128 committed actions terminalize plans after cancellation", async () => {
1015
+ const actions: CorrectionAction[] = [
1016
+ { kind: "edit", memoryId: "mem-edit", patch: "edited" },
1017
+ { kind: "redaction_rule", pattern: "secret-token-\\d+" },
1018
+ { kind: "rescope", memoryId: "mem-rescope", toNamespace: "other-ns" },
1019
+ ];
1020
+
1021
+ for (const action of actions) {
1022
+ await withTempDir(async (dir) => {
1023
+ const memoryId = action.kind === "rescope" ? action.memoryId : action.kind === "edit" ? action.memoryId : "mem-redact";
1024
+ const candidates = new Map<string, PlannerCandidate>([
1025
+ [memoryId, { memoryId, path: `facts/${memoryId}.md`, content: "old", excerpt: "old", score: 1 }],
1026
+ ]);
1027
+ const state: FakeState = {
1028
+ memories: new Map([[memoryId, fakeMemory({ memoryId, content: "old" })]]),
1029
+ tombstones: [],
1030
+ redactionRules: [],
1031
+ auditRecords: [],
1032
+ propagateCalls: 0,
1033
+ writtenReplacements: [],
1034
+ };
1035
+ const abortController = new AbortController();
1036
+ const plannerDeps: PlannerDeps = {
1037
+ ...makePlannerDeps(dir, candidates),
1038
+ classifyAndDraft: async () => ({
1039
+ classification: "outdated",
1040
+ confidence: 0.9,
1041
+ actions: [action],
1042
+ relevance: [{ memoryId, why: "test" }],
1043
+ warnings: [],
1044
+ }),
1045
+ };
1046
+ const planner = new CorrectionPlanner(plannerDeps);
1047
+ const plan = await planner.plan({ text: "old", targetIds: [memoryId] }, ["default"]);
1048
+ const baseDeps = makeExecutorDeps(state);
1049
+ let deps = baseDeps;
1050
+ if (action.kind === "edit") {
1051
+ deps = {
1052
+ ...baseDeps,
1053
+ applyEdit: async (namespace, id, patch, signal) => {
1054
+ const editedId = await baseDeps.applyEdit(namespace, id, patch, signal);
1055
+ abortController.abort(new Error("caller disconnected"));
1056
+ return editedId;
1057
+ },
1058
+ };
1059
+ } else if (action.kind === "redaction_rule") {
1060
+ deps = {
1061
+ ...baseDeps,
1062
+ registerRedactionRule: async (namespace, pattern, signal) => {
1063
+ await baseDeps.registerRedactionRule(namespace, pattern, signal);
1064
+ abortController.abort(new Error("caller disconnected"));
1065
+ },
1066
+ };
1067
+ } else {
1068
+ deps = {
1069
+ ...baseDeps,
1070
+ rescopeMemory: async (namespace, id, toNamespace, signal) => {
1071
+ const destinationId = await baseDeps.rescopeMemory(namespace, id, toNamespace, signal);
1072
+ abortController.abort(new Error("caller disconnected"));
1073
+ return destinationId;
1074
+ },
1075
+ };
1076
+ }
1077
+
1078
+ const outcome = await new CorrectionExecutor(deps, planner).apply("default", plan.planId, {
1079
+ confirm: true,
1080
+ abortSignal: abortController.signal,
1081
+ });
1082
+ assert.equal(outcome.status, "applied", `${action.kind} outcome`);
1083
+ assert.equal((await planner.loadPlan("default", plan.planId))?.status, "applied", `${action.kind} plan`);
1084
+ assert.equal(state.auditRecords.length, 1, `${action.kind} audit`);
1085
+ if (action.kind === "edit") {
1086
+ assert.equal(state.memories.get(action.memoryId)?.content, "edited");
1087
+ } else if (action.kind === "redaction_rule") {
1088
+ assert.deepEqual(state.redactionRules, [action.pattern]);
1089
+ } else if (action.kind === "rescope") {
1090
+ assert.equal(state.memories.get(action.memoryId)?.status, "rescoped");
1091
+ }
1092
+ });
1093
+ }
1094
+ });
1095
+ test("#2128 cancellation skips unstarted actions after a committed edit", async () => {
1096
+ await withTempDir(async (dir) => {
1097
+ const candidates = new Map<string, PlannerCandidate>([
1098
+ ["mem-edit", { memoryId: "mem-edit", path: "facts/mem-edit.md", content: "old", excerpt: "old", score: 1 }],
1099
+ ]);
1100
+ const state: FakeState = {
1101
+ memories: new Map([["mem-edit", fakeMemory({ memoryId: "mem-edit", content: "old" })]]),
1102
+ tombstones: [],
1103
+ redactionRules: [],
1104
+ auditRecords: [],
1105
+ propagateCalls: 0,
1106
+ writtenReplacements: [],
1107
+ };
1108
+ const abortController = new AbortController();
1109
+ const plannerDeps: PlannerDeps = {
1110
+ ...makePlannerDeps(dir, candidates),
1111
+ classifyAndDraft: async () => ({
1112
+ classification: "outdated",
1113
+ confidence: 0.9,
1114
+ actions: [
1115
+ { kind: "edit", memoryId: "mem-edit", patch: "edited" },
1116
+ { kind: "redaction_rule", pattern: "secret-token-\\d+" },
1117
+ ],
1118
+ relevance: [{ memoryId: "mem-edit", why: "test" }],
1119
+ warnings: [],
1120
+ }),
1121
+ };
1122
+ const planner = new CorrectionPlanner(plannerDeps);
1123
+ const plan = await planner.plan({ text: "old", targetIds: ["mem-edit"] }, ["default"]);
1124
+ const baseDeps = makeExecutorDeps(state);
1125
+ const deps: ExecutorDeps = {
1126
+ ...baseDeps,
1127
+ applyEdit: async (namespace, memoryId, patch, signal) => {
1128
+ const editedId = await baseDeps.applyEdit(namespace, memoryId, patch, signal);
1129
+ abortController.abort(new Error("caller disconnected"));
1130
+ return editedId;
1131
+ },
1132
+ };
1133
+
1134
+ const outcome = await new CorrectionExecutor(deps, planner).apply("default", plan.planId, {
1135
+ confirm: true,
1136
+ abortSignal: abortController.signal,
1137
+ });
1138
+ assert.equal(outcome.status, "partial");
1139
+ assert.equal((await planner.loadPlan("default", plan.planId))?.status, "partial");
1140
+ assert.equal(state.memories.get("mem-edit")?.content, "edited");
1141
+ assert.deepEqual(state.redactionRules, [], "the cancelled plan must not start its second action");
1142
+ assert.equal(state.auditRecords.length, 1);
1143
+ });
1144
+ });
1145
+
605
1146
  test("Of0pz: supersede with a missing loser writes NO replacement (preflight before write)", async () => {
606
1147
  await withTempDir(async (dir) => {
607
1148
  const candidates = new Map<string, PlannerCandidate>([