@remnic/core 9.65.2 → 9.65.3

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 (449) hide show
  1. package/dist/access-admin-ops-surface.d.ts +44 -44
  2. package/dist/access-admin-ops-surface.js +14 -14
  3. package/dist/access-authorization-probe.d.ts +38 -38
  4. package/dist/access-authorization-probe.js +15 -15
  5. package/dist/access-boundary.d.ts +40 -40
  6. package/dist/access-boundary.js +14 -14
  7. package/dist/access-cli.js +52 -52
  8. package/dist/access-coding-context-resolution.d.ts +3 -1
  9. package/dist/access-extraction-force-flush.d.ts +25 -25
  10. package/dist/access-extraction-force-flush.js +14 -14
  11. package/dist/access-health-types.d.ts +3 -1
  12. package/dist/access-http-lcm-compaction.d.ts +39 -39
  13. package/dist/access-http-lifecycle-flush.d.ts +39 -39
  14. package/dist/access-http-offline-stream.d.ts +25 -25
  15. package/dist/access-http-query.d.ts +4 -2
  16. package/dist/access-http-query.js +16 -16
  17. package/dist/access-http.d.ts +51 -44
  18. package/dist/access-http.js +30 -30
  19. package/dist/access-identity-continuity-surface.d.ts +12 -12
  20. package/dist/access-identity-continuity-surface.js +14 -14
  21. package/dist/access-lcm-surface.d.ts +27 -27
  22. package/dist/access-lcm-surface.js +14 -14
  23. package/dist/access-mcp-admin-tools.d.ts +9 -1
  24. package/dist/access-mcp-admin-tools.js +3 -1
  25. package/dist/access-mcp-output-schemas.js +1 -1
  26. package/dist/access-mcp.d.ts +39 -39
  27. package/dist/access-mcp.js +24 -24
  28. package/dist/access-memory-search-fanout.d.ts +4 -2
  29. package/dist/{access-namespace-preflight-Dhvcl-T0.d.ts → access-namespace-preflight-B7Usyz-K.d.ts} +1 -1
  30. package/dist/access-namespace-preflight.d.ts +5 -3
  31. package/dist/access-namespace-preflight.js +14 -14
  32. package/dist/access-observe-write-surface.d.ts +39 -39
  33. package/dist/access-observe-write-surface.js +14 -14
  34. package/dist/access-offline-manifest.d.ts +12 -12
  35. package/dist/access-operations-batch.js +18 -18
  36. package/dist/access-operations.d.ts +40 -40
  37. package/dist/access-operations.js +21 -21
  38. package/dist/access-recall-concurrency.d.ts +40 -40
  39. package/dist/access-recall-concurrency.js +14 -14
  40. package/dist/access-recall-response.d.ts +24 -24
  41. package/dist/access-recall-response.js +14 -14
  42. package/dist/access-recall-surface.d.ts +24 -24
  43. package/dist/access-recall-surface.js +14 -14
  44. package/dist/access-schema.d.ts +45 -45
  45. package/dist/{access-service-Bke1alZO.d.ts → access-service-DkaIG3n8.d.ts} +219 -75
  46. package/dist/access-service-helpers.d.ts +40 -40
  47. package/dist/access-service.d.ts +47 -47
  48. package/dist/access-service.js +14 -14
  49. package/dist/access-surface-catalog.d.ts +40 -40
  50. package/dist/access-surface-catalog.js +20 -16
  51. package/dist/access-surface-catalog.js.map +1 -1
  52. package/dist/access-wearables-meetings-surface.d.ts +5 -3
  53. package/dist/action-confidence.d.ts +3 -1
  54. package/dist/active-memory-bridge.d.ts +3 -1
  55. package/dist/active-recall.d.ts +3 -1
  56. package/dist/active-recall.js +6 -1
  57. package/dist/active-recall.js.map +1 -1
  58. package/dist/ambient-provenance.d.ts +3 -1
  59. package/dist/artifact-search.d.ts +3 -1
  60. package/dist/behavior-learner.d.ts +3 -1
  61. package/dist/behavior-signals.d.ts +3 -1
  62. package/dist/bootstrap.d.ts +12 -12
  63. package/dist/briefing-window.d.ts +4 -2
  64. package/dist/briefing.d.ts +4 -2
  65. package/dist/briefing.js +3 -3
  66. package/dist/buffer-surprise-report.d.ts +3 -1
  67. package/dist/buffer-turn-helpers.d.ts +3 -1
  68. package/dist/buffer.d.ts +4 -2
  69. package/dist/bulk-import/index.d.ts +5 -3
  70. package/dist/calibration.d.ts +3 -1
  71. package/dist/capabilities.d.ts +3 -1
  72. package/dist/{catalog-DV6qnbr7.d.ts → catalog-CX2BZEJh.d.ts} +1 -1
  73. package/dist/causal-behavior.d.ts +1 -1
  74. package/dist/causal-consolidation.d.ts +3 -1
  75. package/dist/causal-consolidation.js +7 -7
  76. package/dist/causal-trajectory-graph.d.ts +1 -1
  77. package/dist/{chunk-R7JAM2XF.js → chunk-2VXWFYJE.js} +3 -3
  78. package/dist/{chunk-UXO5IMBK.js → chunk-4XDGYCZI.js} +2 -2
  79. package/dist/{chunk-OTHZWLUD.js → chunk-57HVIG5U.js} +2 -2
  80. package/dist/{chunk-EILZG5VC.js → chunk-6TAX66IA.js} +2 -2
  81. package/dist/{chunk-NKKD4ZAU.js → chunk-6VALIZKG.js} +2 -2
  82. package/dist/{chunk-BWLRUMOG.js → chunk-76PL4XLG.js} +435 -1
  83. package/dist/chunk-76PL4XLG.js.map +1 -0
  84. package/dist/{chunk-2E36UXVW.js → chunk-7KFIMGMP.js} +2 -2
  85. package/dist/{chunk-LGO6A7GJ.js → chunk-7QOO4LGC.js} +28 -28
  86. package/dist/{chunk-TBOJ76ER.js → chunk-AB3A7EFH.js} +18 -2
  87. package/dist/{chunk-TBOJ76ER.js.map → chunk-AB3A7EFH.js.map} +1 -1
  88. package/dist/{chunk-DZUJ46DO.js → chunk-AUO2LJ3K.js} +2 -2
  89. package/dist/{chunk-ZO6AXLEH.js → chunk-AYDDB3XI.js} +2 -2
  90. package/dist/{chunk-NTWN6HB2.js → chunk-AYYGRVRP.js} +2 -2
  91. package/dist/{chunk-7YQ4IYS2.js → chunk-AZAA5DNP.js} +2 -2
  92. package/dist/{chunk-4KYOLI6M.js → chunk-BKYPJUQL.js} +120 -14
  93. package/dist/chunk-BKYPJUQL.js.map +1 -0
  94. package/dist/{chunk-Z7PBQPJ4.js → chunk-BQUEAVNW.js} +2 -2
  95. package/dist/{chunk-35NN3ZFA.js → chunk-CTVWELNK.js} +21 -3
  96. package/dist/chunk-CTVWELNK.js.map +1 -0
  97. package/dist/{chunk-5YQ63T4B.js → chunk-D27J626P.js} +2 -2
  98. package/dist/{chunk-LZH5FR2W.js → chunk-DHTQP334.js} +2 -2
  99. package/dist/{chunk-Y7DK7HHJ.js → chunk-E4MVQQVX.js} +2 -2
  100. package/dist/{chunk-JYYBA7TF.js → chunk-EIVIB73I.js} +2 -2
  101. package/dist/{chunk-S2DPMJXH.js → chunk-EV3YFLCB.js} +2 -2
  102. package/dist/{chunk-TZNQUNKL.js → chunk-FC7TIRFS.js} +15 -1
  103. package/dist/chunk-FC7TIRFS.js.map +1 -0
  104. package/dist/{chunk-3I7ASZN3.js → chunk-G57LQRP6.js} +2 -2
  105. package/dist/{chunk-UIN2BWDD.js → chunk-GN55KU2P.js} +2 -2
  106. package/dist/{chunk-PE255F4T.js → chunk-GUXS322H.js} +2 -2
  107. package/dist/{chunk-V3MXUL3D.js → chunk-H5FW4S5Q.js} +319 -643
  108. package/dist/chunk-H5FW4S5Q.js.map +1 -0
  109. package/dist/chunk-I32NKXE2.js +879 -0
  110. package/dist/chunk-I32NKXE2.js.map +1 -0
  111. package/dist/{chunk-YB42WZCY.js → chunk-IQSC3V2E.js} +2 -2
  112. package/dist/{chunk-MN4KB2A4.js → chunk-MBDJJTAT.js} +3 -3
  113. package/dist/{chunk-SQI57UCJ.js → chunk-MRTUN665.js} +2 -2
  114. package/dist/{chunk-SBDCZ2AX.js → chunk-NXKJHSDN.js} +1 -1
  115. package/dist/chunk-NXKJHSDN.js.map +1 -0
  116. package/dist/{chunk-SPUJNJJC.js → chunk-NZWEEALH.js} +2 -2
  117. package/dist/{chunk-2XDWWPTN.js → chunk-OJD4WS2E.js} +2 -2
  118. package/dist/{chunk-ZWXJBFZU.js → chunk-OLWTCWQ2.js} +8 -8
  119. package/dist/{chunk-XRYZRW54.js → chunk-P4DHENRE.js} +2 -2
  120. package/dist/{chunk-J275IYMG.js → chunk-PAYGC3BD.js} +29 -2
  121. package/dist/chunk-PAYGC3BD.js.map +1 -0
  122. package/dist/{chunk-IID2CMUU.js → chunk-PDVQ5JU3.js} +2 -2
  123. package/dist/{chunk-7BY7V4YX.js → chunk-Q4WONDMJ.js} +4 -3
  124. package/dist/{chunk-7BY7V4YX.js.map → chunk-Q4WONDMJ.js.map} +1 -1
  125. package/dist/{chunk-5NM4OH4P.js → chunk-QFMO32TO.js} +3 -3
  126. package/dist/{chunk-SIHSCCUQ.js → chunk-QXIQPCCN.js} +1 -1
  127. package/dist/{chunk-2YI72KM3.js → chunk-R47WINCY.js} +2 -2
  128. package/dist/{chunk-ZQHI2BZB.js → chunk-RK4WXUI2.js} +2 -2
  129. package/dist/{chunk-QOS5LBZN.js → chunk-S7Q5CM7E.js} +2 -2
  130. package/dist/{chunk-GDFVPUJ5.js → chunk-TDKSCV62.js} +2 -2
  131. package/dist/{chunk-OCZIYAE5.js → chunk-TYUS5TLG.js} +3 -3
  132. package/dist/{chunk-GNCCUR6K.js → chunk-URHCUXKI.js} +2 -2
  133. package/dist/{chunk-TF77C7SV.js → chunk-VA5KMSAE.js} +7 -5
  134. package/dist/chunk-VA5KMSAE.js.map +1 -0
  135. package/dist/{chunk-SB7D4BT7.js → chunk-WN5FSGLE.js} +1545 -105
  136. package/dist/chunk-WN5FSGLE.js.map +1 -0
  137. package/dist/{chunk-YLDXWCZP.js → chunk-YF6UHWOV.js} +14 -9
  138. package/dist/chunk-YF6UHWOV.js.map +1 -0
  139. package/dist/{chunk-CT56C22C.js → chunk-Z4RPXHJH.js} +4 -4
  140. package/dist/{cli-cShQ13XG.d.ts → cli-ChKeYMZv.d.ts} +5 -5
  141. package/dist/cli.d.ts +25 -25
  142. package/dist/cli.js +44 -43
  143. package/dist/coding/pre-action-gate.d.ts +2 -60
  144. package/dist/compounding/engine.d.ts +4 -2
  145. package/dist/compounding/engine.js +3 -3
  146. package/dist/compounding/preference-consolidator.d.ts +3 -1
  147. package/dist/compression-optimizer.d.ts +3 -1
  148. package/dist/config.d.ts +3 -1
  149. package/dist/config.js +6 -1
  150. package/dist/connectors/codex-materialize-runner.d.ts +3 -1
  151. package/dist/connectors/codex-materialize-runner.js +3 -3
  152. package/dist/connectors/codex-materialize.d.ts +3 -1
  153. package/dist/connectors/index.d.ts +3 -1
  154. package/dist/connectors/index.js +3 -3
  155. package/dist/consolidation-provenance-check.d.ts +4 -2
  156. package/dist/consolidation-undo.d.ts +4 -2
  157. package/dist/contradiction/index.d.ts +10 -270
  158. package/dist/contradiction/index.js +11 -6
  159. package/dist/{contradiction-review-QKJH5DKD.js → contradiction-review-WRVLRWHS.js} +6 -2
  160. package/dist/{contradiction-scan-VOTQRRSX.js → contradiction-scan-AKUWPX5N.js} +5 -3
  161. package/dist/converge-config.d.ts +3 -1
  162. package/dist/convergence-refresh.d.ts +4 -2
  163. package/dist/convergence-refresh.js +5 -5
  164. package/dist/conversation-index/backend.d.ts +3 -1
  165. package/dist/conversation-index/chunker.d.ts +3 -1
  166. package/dist/conversation-index/faiss-adapter.d.ts +3 -1
  167. package/dist/conversation-index/indexer.d.ts +3 -1
  168. package/dist/conversation-index/search.d.ts +3 -1
  169. package/dist/corpus-watermark.d.ts +3 -1
  170. package/dist/corpus-watermark.js +5 -5
  171. package/dist/cross-lingual-recall.d.ts +3 -1
  172. package/dist/day-summary.d.ts +3 -1
  173. package/dist/delinearize.d.ts +3 -1
  174. package/dist/dependency-propagation-config.d.ts +3 -1
  175. package/dist/{dependency-propagation-delivery-CsGg-VwS.d.ts → dependency-propagation-delivery-B8ZMBBCY.d.ts} +1 -1
  176. package/dist/direct-answer-wiring.d.ts +3 -1
  177. package/dist/direct-answer.d.ts +3 -1
  178. package/dist/embedding-fallback.d.ts +3 -1
  179. package/dist/enrichment/index.d.ts +3 -1
  180. package/dist/entity-origin-fields.d.ts +3 -1
  181. package/dist/entity-retrieval.d.ts +4 -2
  182. package/dist/entity-retrieval.js +3 -3
  183. package/dist/entity-schema.d.ts +3 -1
  184. package/dist/episodic-context.d.ts +3 -1
  185. package/dist/explicit-capture.d.ts +12 -12
  186. package/dist/external-wiki-access.d.ts +40 -40
  187. package/dist/external-wiki-access.js +15 -15
  188. package/dist/external-wiki-collection-registration.d.ts +3 -1
  189. package/dist/external-wiki-collection.d.ts +3 -1
  190. package/dist/external-wiki-mcp-tools.d.ts +40 -40
  191. package/dist/extraction-error-classification.d.ts +3 -1
  192. package/dist/extraction-faithfulness.d.ts +3 -1
  193. package/dist/extraction-judge-telemetry.d.ts +3 -1
  194. package/dist/extraction-judge-training.d.ts +3 -1
  195. package/dist/extraction-judge.d.ts +3 -1
  196. package/dist/extraction-liveness.d.ts +3 -1
  197. package/dist/extraction-normalization.d.ts +3 -1
  198. package/dist/extraction-prompt.d.ts +3 -1
  199. package/dist/extraction-source-grounding-rules.d.ts +3 -1
  200. package/dist/extraction-source-grounding.d.ts +3 -1
  201. package/dist/extraction.d.ts +3 -1
  202. package/dist/extraction.js +3 -3
  203. package/dist/fallback-llm.d.ts +3 -1
  204. package/dist/graph-dashboard-diff.d.ts +3 -1
  205. package/dist/graph-dashboard-key.d.ts +3 -1
  206. package/dist/graph-dashboard-parser.d.ts +3 -1
  207. package/dist/graph-edge-reinforcement.d.ts +3 -1
  208. package/dist/graph-path-reconstruction.d.ts +3 -1
  209. package/dist/graph-path-scoring.d.ts +3 -1
  210. package/dist/graph-snapshot.d.ts +3 -1
  211. package/dist/graph.d.ts +3 -1
  212. package/dist/harmonic-retrieval.js +1 -1
  213. package/dist/importance.d.ts +3 -1
  214. package/dist/importers/index.d.ts +3 -1
  215. package/dist/in-flight-reads.d.ts +3 -1
  216. package/dist/index-CexDrJzC.d.ts +284 -0
  217. package/dist/index.d.ts +251 -29
  218. package/dist/index.js +129 -75
  219. package/dist/intent.d.ts +3 -1
  220. package/dist/lcm/engine.d.ts +3 -1
  221. package/dist/lcm/index.d.ts +3 -1
  222. package/dist/lcm/tools.d.ts +3 -1
  223. package/dist/lifecycle.d.ts +3 -1
  224. package/dist/live-connectors-runner.d.ts +3 -1
  225. package/dist/local-llm.d.ts +3 -1
  226. package/dist/local-model-endpoint.d.ts +3 -1
  227. package/dist/maintenance/memory-governance.d.ts +3 -1
  228. package/dist/maintenance/memory-governance.js +3 -3
  229. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +4 -2
  230. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  231. package/dist/maintenance/rebuild-memory-projection.d.ts +4 -2
  232. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  233. package/dist/{maintenance-jhMpeGne.d.ts → maintenance-nkdtSrVr.d.ts} +3 -3
  234. package/dist/mcp-memory-inspector-app.d.ts +37 -37
  235. package/dist/memory-action-policy.d.ts +3 -1
  236. package/dist/memory-cache.d.ts +3 -1
  237. package/dist/memory-lifecycle-ledger-utils.d.ts +3 -1
  238. package/dist/memory-projection-store.d.ts +3 -1
  239. package/dist/memory-provenance.d.ts +3 -1
  240. package/dist/memory-snapshot.d.ts +3 -1
  241. package/dist/memory-subject-cli.d.ts +40 -40
  242. package/dist/memory-subject.d.ts +42 -42
  243. package/dist/memory-worth-outcomes.d.ts +4 -2
  244. package/dist/models-json.d.ts +3 -1
  245. package/dist/namespaces/migrate.d.ts +5 -3
  246. package/dist/namespaces/migrate.js +4 -4
  247. package/dist/namespaces/principal.d.ts +3 -1
  248. package/dist/namespaces/search.d.ts +3 -1
  249. package/dist/namespaces/storage.d.ts +5 -3
  250. package/dist/namespaces/storage.js +3 -3
  251. package/dist/native-knowledge.d.ts +3 -1
  252. package/dist/offline-sync-impression-drain.d.ts +3 -1
  253. package/dist/operator-doctor-corpus.d.ts +3 -1
  254. package/dist/operator-doctor-corpus.js +6 -6
  255. package/dist/operator-doctor-replica.d.ts +3 -1
  256. package/dist/operator-toolkit.d.ts +5 -3
  257. package/dist/operator-toolkit.js +15 -12
  258. package/dist/orchestration/compression-guideline-coordinator.d.ts +4 -2
  259. package/dist/orchestration/maintenance.d.ts +6 -4
  260. package/dist/orchestration/maintenance.js +9 -9
  261. package/dist/{orchestrator-DyGUC7re.d.ts → orchestrator-Bvq1-RQs.d.ts} +23 -9
  262. package/dist/orchestrator.d.ts +12 -12
  263. package/dist/orchestrator.js +52 -52
  264. package/dist/patterns-cli.d.ts +3 -1
  265. package/dist/{pipeline-C25Oxtp1.d.ts → pipeline-C8vfIiTX.d.ts} +1 -1
  266. package/dist/policy-runtime.d.ts +3 -1
  267. package/dist/proactive-contention.d.ts +3 -1
  268. package/dist/provenance.d.ts +3 -1
  269. package/dist/{public-http-CMe7NQzj.d.ts → public-http-Cy0aYbys.d.ts} +1 -1
  270. package/dist/{qmd-DkDVCbgF.d.ts → qmd-B9p1SZTZ.d.ts} +1 -1
  271. package/dist/qmd-preflight.d.ts +4 -2
  272. package/dist/qmd-recall-cache.d.ts +3 -1
  273. package/dist/qmd.d.ts +4 -2
  274. package/dist/recall-concurrency-config.d.ts +3 -1
  275. package/dist/recall-disclosure-escalation.d.ts +3 -1
  276. package/dist/recall-explain-renderer.d.ts +3 -1
  277. package/dist/recall-explain-renderer.js +3 -3
  278. package/dist/recall-memory-map.d.ts +3 -1
  279. package/dist/recall-planner-llm.d.ts +3 -1
  280. package/dist/recall-state.d.ts +3 -1
  281. package/dist/recall-tag-filter.d.ts +3 -1
  282. package/dist/recall-timings.d.ts +3 -1
  283. package/dist/recall-xray-cli.d.ts +3 -1
  284. package/dist/recall-xray-cli.js +4 -4
  285. package/dist/recall-xray-renderer.d.ts +3 -1
  286. package/dist/recall-xray-renderer.js +3 -3
  287. package/dist/recall-xray.d.ts +3 -1
  288. package/dist/recall-xray.js +2 -2
  289. package/dist/reconcile/cursor.d.ts +3 -1
  290. package/dist/reconcile/manifest.d.ts +3 -1
  291. package/dist/reconcile/plan.d.ts +3 -1
  292. package/dist/replay/normalizers/chatgpt.d.ts +3 -1
  293. package/dist/replay/normalizers/claude.d.ts +3 -1
  294. package/dist/replay/normalizers/openclaw.d.ts +3 -1
  295. package/dist/replay/normalizers/shared.d.ts +3 -1
  296. package/dist/replay/runner.d.ts +3 -1
  297. package/dist/replay/types.d.ts +3 -1
  298. package/dist/replica-divergence.d.ts +3 -1
  299. package/dist/replica-peers-config.d.ts +3 -1
  300. package/dist/{resolution-MFY72STR.js → resolution-4552BNRV.js} +13 -3
  301. package/dist/resolve-auth-token.d.ts +3 -1
  302. package/dist/resume-bundles.js +4 -2
  303. package/dist/retrieval-agents.d.ts +4 -2
  304. package/dist/retrieval-tiers.d.ts +3 -1
  305. package/dist/routing/engine.d.ts +3 -1
  306. package/dist/routing/store.d.ts +3 -1
  307. package/dist/salvage-envelope.d.ts +3 -1
  308. package/dist/schemas.d.ts +44 -44
  309. package/dist/{scope-profiles-B9xMoFO-.d.ts → scope-profiles-DLrRxFWR.d.ts} +1 -1
  310. package/dist/search/embed-helper.d.ts +3 -1
  311. package/dist/search/factory.d.ts +3 -1
  312. package/dist/search/index.d.ts +3 -1
  313. package/dist/search/lancedb-backend.d.ts +3 -1
  314. package/dist/search/meilisearch-backend.d.ts +3 -1
  315. package/dist/search/noop-backend.d.ts +3 -1
  316. package/dist/search/orama-backend.d.ts +3 -1
  317. package/dist/search/port.d.ts +3 -1
  318. package/dist/search/remote-backend.d.ts +3 -1
  319. package/dist/{semantic-TddhF0y7.d.ts → semantic-BalR6EXU.d.ts} +1 -1
  320. package/dist/{semantic-consolidation-C4uykW84.d.ts → semantic-consolidation-DlN6xe20.d.ts} +1 -1
  321. package/dist/semantic-consolidation.d.ts +4 -2
  322. package/dist/semantic-consolidation.js +4 -4
  323. package/dist/semantic-rule-promotion.js +3 -3
  324. package/dist/semantic-rule-verifier.d.ts +3 -1
  325. package/dist/semantic-rule-verifier.js +3 -3
  326. package/dist/{service-DCZDZNcV.d.ts → service-GkYyVfm9.d.ts} +2 -2
  327. package/dist/session-observer-bands.d.ts +3 -1
  328. package/dist/session-observer-state.d.ts +3 -1
  329. package/dist/shared-context/manager.d.ts +3 -1
  330. package/dist/signal.d.ts +3 -1
  331. package/dist/source-agent-qualifier.d.ts +3 -1
  332. package/dist/source-agent-qualifier.js +3 -3
  333. package/dist/{storage-CcKmEjL8.d.ts → storage-BIDzuKIn.d.ts} +1 -1
  334. package/dist/storage.d.ts +4 -2
  335. package/dist/storage.js +2 -2
  336. package/dist/subject-config.d.ts +3 -1
  337. package/dist/summarizer.d.ts +3 -1
  338. package/dist/summary-snapshot.d.ts +3 -1
  339. package/dist/support-passport/index.d.ts +43 -43
  340. package/dist/support-passport/index.js +17 -17
  341. package/dist/temporal-supersession.d.ts +4 -2
  342. package/dist/temporal-timeline-recall.d.ts +3 -1
  343. package/dist/temporal-validity.d.ts +3 -1
  344. package/dist/threading.d.ts +3 -1
  345. package/dist/tier-migration.d.ts +4 -2
  346. package/dist/tier-routing.d.ts +3 -1
  347. package/dist/topics.d.ts +3 -1
  348. package/dist/transcript.d.ts +3 -1
  349. package/dist/transfer/types.d.ts +20 -20
  350. package/dist/trust-score-stage.d.ts +3 -1
  351. package/dist/trust-score.d.ts +3 -1
  352. package/dist/{types-Pi0lfaEt.d.ts → types-BxAcOl5Q.d.ts} +323 -4
  353. package/dist/types.d.ts +3 -1
  354. package/dist/types.js +1 -1
  355. package/dist/utility-runtime.d.ts +3 -1
  356. package/dist/verified-recall.js +3 -3
  357. package/dist/who-knows-cli.d.ts +40 -40
  358. package/dist/who-knows-cli.js +4 -4
  359. package/dist/who-knows.d.ts +42 -42
  360. package/dist/who-knows.js +3 -3
  361. package/dist/write-envelope.d.ts +3 -1
  362. package/package.json +2 -2
  363. package/src/access-boundary.ts +4 -0
  364. package/src/access-http.ts +6 -5
  365. package/src/access-mcp-admin-tools.ts +24 -0
  366. package/src/access-mcp-output-schemas.ts +14 -0
  367. package/src/access-mcp.ts +2 -2
  368. package/src/access-operations-batch.ts +5 -0
  369. package/src/access-service.ts +27 -0
  370. package/src/access-surface-catalog.test.ts +24 -0
  371. package/src/access-surface-catalog.ts +4 -0
  372. package/src/coding/action-gate.test.ts +341 -0
  373. package/src/coding/action-gate.ts +556 -0
  374. package/src/config.ts +5 -0
  375. package/src/contradiction/contradiction-review.ts +50 -4
  376. package/src/contradiction/contradiction-scan.ts +14 -3
  377. package/src/contradiction/resolution.ts +50 -2
  378. package/src/index.ts +4 -3
  379. package/src/orchestration/recall-rerank-coordinator.ts +123 -4
  380. package/src/orchestration/recall-result-formatter.ts +6 -2
  381. package/src/orchestration/recall-search-pipeline.ts +14 -1
  382. package/src/preferences/drift-config.ts +118 -0
  383. package/src/preferences/drift-recall.ts +133 -0
  384. package/src/preferences/drift-types.ts +87 -0
  385. package/src/preferences/index.ts +12 -0
  386. package/src/preferences/preference-drift.test.ts +690 -0
  387. package/src/preferences/preference-drift.ts +724 -0
  388. package/src/review/review-deck-access.test.ts +325 -0
  389. package/src/review/review-deck-http-base.ts +133 -0
  390. package/src/review/review-deck-mutation.test.ts +417 -0
  391. package/src/review/review-deck-mutation.ts +677 -0
  392. package/src/review/review-deck-snapshot.ts +196 -0
  393. package/src/review/review-deck-surface.ts +117 -0
  394. package/src/review/review-deck.test.ts +347 -0
  395. package/src/review/review-deck.ts +311 -0
  396. package/src/storage.ts +4 -6
  397. package/src/types.ts +7 -3
  398. package/dist/chunk-35NN3ZFA.js.map +0 -1
  399. package/dist/chunk-4KYOLI6M.js.map +0 -1
  400. package/dist/chunk-BWLRUMOG.js.map +0 -1
  401. package/dist/chunk-J275IYMG.js.map +0 -1
  402. package/dist/chunk-SB7D4BT7.js.map +0 -1
  403. package/dist/chunk-SBDCZ2AX.js.map +0 -1
  404. package/dist/chunk-TF77C7SV.js.map +0 -1
  405. package/dist/chunk-TZNQUNKL.js.map +0 -1
  406. package/dist/chunk-V3MXUL3D.js.map +0 -1
  407. package/dist/chunk-XCTXS7VY.js +0 -402
  408. package/dist/chunk-XCTXS7VY.js.map +0 -1
  409. package/dist/chunk-YLDXWCZP.js.map +0 -1
  410. /package/dist/{chunk-R7JAM2XF.js.map → chunk-2VXWFYJE.js.map} +0 -0
  411. /package/dist/{chunk-UXO5IMBK.js.map → chunk-4XDGYCZI.js.map} +0 -0
  412. /package/dist/{chunk-OTHZWLUD.js.map → chunk-57HVIG5U.js.map} +0 -0
  413. /package/dist/{chunk-EILZG5VC.js.map → chunk-6TAX66IA.js.map} +0 -0
  414. /package/dist/{chunk-NKKD4ZAU.js.map → chunk-6VALIZKG.js.map} +0 -0
  415. /package/dist/{chunk-2E36UXVW.js.map → chunk-7KFIMGMP.js.map} +0 -0
  416. /package/dist/{chunk-LGO6A7GJ.js.map → chunk-7QOO4LGC.js.map} +0 -0
  417. /package/dist/{chunk-DZUJ46DO.js.map → chunk-AUO2LJ3K.js.map} +0 -0
  418. /package/dist/{chunk-ZO6AXLEH.js.map → chunk-AYDDB3XI.js.map} +0 -0
  419. /package/dist/{chunk-NTWN6HB2.js.map → chunk-AYYGRVRP.js.map} +0 -0
  420. /package/dist/{chunk-7YQ4IYS2.js.map → chunk-AZAA5DNP.js.map} +0 -0
  421. /package/dist/{chunk-Z7PBQPJ4.js.map → chunk-BQUEAVNW.js.map} +0 -0
  422. /package/dist/{chunk-5YQ63T4B.js.map → chunk-D27J626P.js.map} +0 -0
  423. /package/dist/{chunk-LZH5FR2W.js.map → chunk-DHTQP334.js.map} +0 -0
  424. /package/dist/{chunk-Y7DK7HHJ.js.map → chunk-E4MVQQVX.js.map} +0 -0
  425. /package/dist/{chunk-JYYBA7TF.js.map → chunk-EIVIB73I.js.map} +0 -0
  426. /package/dist/{chunk-S2DPMJXH.js.map → chunk-EV3YFLCB.js.map} +0 -0
  427. /package/dist/{chunk-3I7ASZN3.js.map → chunk-G57LQRP6.js.map} +0 -0
  428. /package/dist/{chunk-UIN2BWDD.js.map → chunk-GN55KU2P.js.map} +0 -0
  429. /package/dist/{chunk-PE255F4T.js.map → chunk-GUXS322H.js.map} +0 -0
  430. /package/dist/{chunk-YB42WZCY.js.map → chunk-IQSC3V2E.js.map} +0 -0
  431. /package/dist/{chunk-MN4KB2A4.js.map → chunk-MBDJJTAT.js.map} +0 -0
  432. /package/dist/{chunk-SQI57UCJ.js.map → chunk-MRTUN665.js.map} +0 -0
  433. /package/dist/{chunk-SPUJNJJC.js.map → chunk-NZWEEALH.js.map} +0 -0
  434. /package/dist/{chunk-2XDWWPTN.js.map → chunk-OJD4WS2E.js.map} +0 -0
  435. /package/dist/{chunk-ZWXJBFZU.js.map → chunk-OLWTCWQ2.js.map} +0 -0
  436. /package/dist/{chunk-XRYZRW54.js.map → chunk-P4DHENRE.js.map} +0 -0
  437. /package/dist/{chunk-IID2CMUU.js.map → chunk-PDVQ5JU3.js.map} +0 -0
  438. /package/dist/{chunk-5NM4OH4P.js.map → chunk-QFMO32TO.js.map} +0 -0
  439. /package/dist/{chunk-SIHSCCUQ.js.map → chunk-QXIQPCCN.js.map} +0 -0
  440. /package/dist/{chunk-2YI72KM3.js.map → chunk-R47WINCY.js.map} +0 -0
  441. /package/dist/{chunk-ZQHI2BZB.js.map → chunk-RK4WXUI2.js.map} +0 -0
  442. /package/dist/{chunk-QOS5LBZN.js.map → chunk-S7Q5CM7E.js.map} +0 -0
  443. /package/dist/{chunk-GDFVPUJ5.js.map → chunk-TDKSCV62.js.map} +0 -0
  444. /package/dist/{chunk-OCZIYAE5.js.map → chunk-TYUS5TLG.js.map} +0 -0
  445. /package/dist/{chunk-GNCCUR6K.js.map → chunk-URHCUXKI.js.map} +0 -0
  446. /package/dist/{chunk-CT56C22C.js.map → chunk-Z4RPXHJH.js.map} +0 -0
  447. /package/dist/{contradiction-review-QKJH5DKD.js.map → contradiction-review-WRVLRWHS.js.map} +0 -0
  448. /package/dist/{contradiction-scan-VOTQRRSX.js.map → contradiction-scan-AKUWPX5N.js.map} +0 -0
  449. /package/dist/{resolution-MFY72STR.js.map → resolution-4552BNRV.js.map} +0 -0
@@ -0,0 +1,677 @@
1
+ /**
2
+ * Review-deck mutations. Keep/not-true go through performReview.
3
+ * Receipts live on the existing memory lifecycle ledger.
4
+ */
5
+
6
+ import { createHash, randomUUID } from "node:crypto";
7
+ import fs from "node:fs";
8
+ import path from "node:path";
9
+ import { throwIfAborted } from "../abort-error.js";
10
+ import { bumpMemoryCorpusVersionForDir } from "../memory-corpus-version.js";
11
+ import { toMemoryPathRel } from "../memory-lifecycle-ledger-utils.js";
12
+ import { createVersion, getVersion, revertToVersion, type VersioningConfig } from "../page-versioning.js";
13
+ import type { MemoryLifecycleEvent } from "../types.js";
14
+ import { performReview } from "./index.js";
15
+ import {
16
+ computeReviewItemRevision,
17
+ type ReviewDeckActionReceipt,
18
+ type ReviewDeckActionRequest,
19
+ type ReviewDeckUndoRequest,
20
+ } from "./review-deck.js";
21
+ import { readReviewDeckRow } from "./review-deck-snapshot.js";
22
+
23
+ const ACTOR = "admin-console.review-deck";
24
+ const RULE_VERSION = "admin-console.review-deck.v1";
25
+ const DECK_VERSIONING: VersioningConfig = {
26
+ enabled: true,
27
+ maxVersionsPerPage: 20,
28
+ sidecarDir: ".versions",
29
+ };
30
+
31
+ const KEEP_EFFECT = "Kept: this memory can now be recalled.";
32
+ const NOT_TRUE_EFFECT = "Marked untrue: removed from the review queue.";
33
+ const PLANNED_EFFECT = "Prepared a correction plan.";
34
+ const PLAN_FAILED_EFFECT = "Could not prepare a correction plan.";
35
+ const MISSING_EFFECT = "This review item is no longer available.";
36
+ const CONFLICT_EFFECT = "This memory changed. Review it again.";
37
+ const UNDO_EFFECT = "Undid the last review decision.";
38
+ const UNDO_CONFLICT_EFFECT = "Another change happened first. Nothing was undone.";
39
+ const UNDO_FAILED_EFFECT = "This action cannot be undone.";
40
+
41
+ export class ReviewDeckIdempotencyError extends Error {
42
+ override readonly name = "ReviewDeckIdempotencyError";
43
+ constructor(message = "Idempotency key was reused with a different review request.") {
44
+ super(message);
45
+ }
46
+ }
47
+
48
+ export class ReviewDeckInputError extends Error {
49
+ override readonly name = "ReviewDeckInputError";
50
+ constructor(message: string) {
51
+ super(message);
52
+ }
53
+ }
54
+
55
+ export interface ReviewLifecycleReceipt {
56
+ schemaVersion: 1;
57
+ receiptId: string;
58
+ requestFingerprint: string;
59
+ principalDigest: string;
60
+ itemId: string;
61
+ action: "approve" | "dismiss" | "undo";
62
+ beforeRevision: string;
63
+ afterRevision: string;
64
+ revisionArtifact?: string;
65
+ sourcePath: string;
66
+ undoOfReceiptId?: string;
67
+ }
68
+
69
+ export type ReviewLifecycleLedgerEvent = MemoryLifecycleEvent & {
70
+ reviewReceipt?: ReviewLifecycleReceipt;
71
+ };
72
+
73
+ export interface ReviewDeckMutationContext {
74
+ memoryDir: string;
75
+ namespace: string;
76
+ principalDigest: string;
77
+ appendLifecycleEvents(events: unknown[]): Promise<void>;
78
+ readLifecycleEvents(memoryId?: string): Promise<unknown[]>;
79
+ onApproveBlockedMemory?: (tombstoneId: string, memoryId: string) => void | Promise<void>;
80
+ planCorrection?: (input: {
81
+ itemId: string;
82
+ correctionText: string;
83
+ }) => Promise<{ planId?: string; preview?: unknown; message?: string }>;
84
+ signal?: AbortSignal;
85
+ }
86
+
87
+ type DeckActionName = "keep" | "not_true" | "prepare_fix" | "undo";
88
+
89
+ type StoredDeckEvent = ReviewLifecycleLedgerEvent & {
90
+ reviewNamespace?: string;
91
+ reviewCreatedPath?: string;
92
+ reviewDeckReceipt?: ReviewDeckActionReceipt;
93
+ };
94
+
95
+ const LEDGER_ACTION: Record<"keep" | "not_true" | "undo", ReviewLifecycleReceipt["action"]> = {
96
+ keep: "approve",
97
+ not_true: "dismiss",
98
+ undo: "undo",
99
+ };
100
+
101
+ const EVENT_TYPE: Record<"keep" | "not_true" | "undo", MemoryLifecycleEvent["eventType"]> = {
102
+ keep: "promoted",
103
+ not_true: "rejected",
104
+ undo: "restored",
105
+ };
106
+
107
+ function sha256Hex(value: string): string {
108
+ return createHash("sha256").update(value, "utf8").digest("hex");
109
+ }
110
+
111
+ function computeReceiptId(namespace: string, principalDigest: string, idempotencyKey: string): string {
112
+ return `rcp1:${sha256Hex(`${namespace}\u0000${principalDigest}\u0000${idempotencyKey}`)}`;
113
+ }
114
+
115
+ function computeRequestFingerprint(parts: readonly string[]): string {
116
+ return `rfp1:${sha256Hex(parts.join("\u0000"))}`;
117
+ }
118
+
119
+ function actionFingerprint(
120
+ ctx: ReviewDeckMutationContext,
121
+ itemId: string,
122
+ action: DeckActionName,
123
+ expectedRevision: string,
124
+ correctionText?: string,
125
+ ): string {
126
+ const parts = [ctx.principalDigest, ctx.namespace, itemId, action, expectedRevision];
127
+ if (correctionText !== undefined) parts.push(correctionText);
128
+ return computeRequestFingerprint(parts);
129
+ }
130
+
131
+ function isNonEmptyString(value: unknown): value is string {
132
+ return typeof value === "string" && value.length > 0;
133
+ }
134
+
135
+ function isReceiptAction(value: unknown): value is ReviewLifecycleReceipt["action"] {
136
+ return value === "approve" || value === "dismiss" || value === "undo";
137
+ }
138
+
139
+ export function parseReviewLifecycleReceipt(value: unknown): ReviewLifecycleReceipt | null {
140
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return null;
141
+ const rec = value as Record<string, unknown>;
142
+ if (rec.schemaVersion !== 1) return null;
143
+ if (!isNonEmptyString(rec.receiptId)) return null;
144
+ if (!isNonEmptyString(rec.requestFingerprint)) return null;
145
+ if (!isNonEmptyString(rec.principalDigest)) return null;
146
+ if (!isNonEmptyString(rec.itemId)) return null;
147
+ if (!isReceiptAction(rec.action)) return null;
148
+ if (typeof rec.beforeRevision !== "string") return null;
149
+ if (typeof rec.afterRevision !== "string") return null;
150
+ if (!isNonEmptyString(rec.sourcePath) || path.isAbsolute(rec.sourcePath)) return null;
151
+ if (rec.revisionArtifact !== undefined && typeof rec.revisionArtifact !== "string") return null;
152
+ if (rec.undoOfReceiptId !== undefined && typeof rec.undoOfReceiptId !== "string") return null;
153
+ const parsed: ReviewLifecycleReceipt = {
154
+ schemaVersion: 1,
155
+ receiptId: rec.receiptId,
156
+ requestFingerprint: rec.requestFingerprint,
157
+ principalDigest: rec.principalDigest,
158
+ itemId: rec.itemId,
159
+ action: rec.action,
160
+ beforeRevision: rec.beforeRevision,
161
+ afterRevision: rec.afterRevision,
162
+ sourcePath: rec.sourcePath,
163
+ };
164
+ if (typeof rec.revisionArtifact === "string") parsed.revisionArtifact = rec.revisionArtifact;
165
+ if (typeof rec.undoOfReceiptId === "string") parsed.undoOfReceiptId = rec.undoOfReceiptId;
166
+ return parsed;
167
+ }
168
+
169
+ function asStoredEvent(value: unknown): StoredDeckEvent | null {
170
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return null;
171
+ return value as StoredDeckEvent;
172
+ }
173
+
174
+ function findStoredReceipt(
175
+ events: readonly unknown[],
176
+ receiptId: string,
177
+ ): { event: StoredDeckEvent; receipt: ReviewLifecycleReceipt } | null {
178
+ for (const raw of events) {
179
+ const event = asStoredEvent(raw);
180
+ if (!event) continue;
181
+ const receipt = parseReviewLifecycleReceipt(event.reviewReceipt);
182
+ if (receipt && receipt.receiptId === receiptId) return { event, receipt };
183
+ }
184
+ return null;
185
+ }
186
+
187
+
188
+ function resolveInside(memoryDir: string, rel: string): string | null {
189
+ if (!rel || path.isAbsolute(rel)) return null;
190
+ const root = path.resolve(memoryDir);
191
+ const abs = path.resolve(root, rel.split("/").join(path.sep));
192
+ const next = path.relative(root, abs);
193
+ if (next.startsWith("..") || path.isAbsolute(next)) return null;
194
+ return abs;
195
+ }
196
+
197
+ function currentRevision(absPath: string): string {
198
+ try {
199
+ return computeReviewItemRevision(fs.readFileSync(absPath, "utf8"));
200
+ } catch {
201
+ return "";
202
+ }
203
+ }
204
+
205
+ function publicReceipt(input: {
206
+ receiptId: string;
207
+ itemId: string;
208
+ action: DeckActionName;
209
+ outcome: ReviewDeckActionReceipt["outcome"];
210
+ effect: string;
211
+ undoAvailable: boolean;
212
+ appliedRevision?: string;
213
+ correctionPlanId?: string;
214
+ correctionPreview?: unknown;
215
+ }): ReviewDeckActionReceipt {
216
+ return {
217
+ schemaVersion: 1,
218
+ receiptId: input.receiptId,
219
+ itemId: input.itemId,
220
+ action: input.action,
221
+ outcome: input.outcome,
222
+ effect: input.effect,
223
+ undoAvailable: input.undoAvailable,
224
+ ...(input.appliedRevision !== undefined ? { appliedRevision: input.appliedRevision } : {}),
225
+ ...(input.correctionPlanId !== undefined ? { correctionPlanId: input.correctionPlanId } : {}),
226
+ ...(input.correctionPreview !== undefined ? { correctionPreview: input.correctionPreview } : {}),
227
+ };
228
+ }
229
+
230
+ async function snapshotForUndo(
231
+ filePath: string,
232
+ memoryDir: string,
233
+ ): Promise<string | undefined> {
234
+ try {
235
+ const content = fs.readFileSync(filePath, "utf8");
236
+ const version = await createVersion(
237
+ filePath,
238
+ content,
239
+ "manual",
240
+ DECK_VERSIONING,
241
+ undefined,
242
+ undefined,
243
+ memoryDir,
244
+ );
245
+ return version.versionId;
246
+ } catch {
247
+ return undefined;
248
+ }
249
+ }
250
+
251
+ async function artifactReadable(
252
+ filePath: string,
253
+ versionId: string,
254
+ memoryDir: string,
255
+ ): Promise<boolean> {
256
+ try {
257
+ await getVersion(filePath, versionId, DECK_VERSIONING, memoryDir);
258
+ return true;
259
+ } catch {
260
+ return false;
261
+ }
262
+ }
263
+
264
+ function undoTargetRevision(receipt: ReviewLifecycleReceipt, createdRel: string | undefined): string {
265
+ const created = createdRel && createdRel !== receipt.sourcePath ? createdRel : undefined;
266
+ if (receipt.action === "approve" && created) return created;
267
+ return receipt.sourcePath;
268
+ }
269
+
270
+ async function honestUndoAvailable(
271
+ ctx: ReviewDeckMutationContext,
272
+ receipt: ReviewLifecycleReceipt,
273
+ createdRel: string | undefined,
274
+ ): Promise<boolean> {
275
+ if (!receipt.revisionArtifact || receipt.action === "undo") return false;
276
+ const sourceAbs = resolveInside(ctx.memoryDir, receipt.sourcePath);
277
+ if (!sourceAbs) return false;
278
+ if (!(await artifactReadable(sourceAbs, receipt.revisionArtifact, ctx.memoryDir))) return false;
279
+ const targetRel = undoTargetRevision(receipt, createdRel);
280
+ const targetAbs = resolveInside(ctx.memoryDir, targetRel);
281
+ if (!targetAbs) return false;
282
+ return currentRevision(targetAbs) === receipt.afterRevision;
283
+ }
284
+
285
+ async function replayReceipt(
286
+ ctx: ReviewDeckMutationContext,
287
+ hit: { event: StoredDeckEvent; receipt: ReviewLifecycleReceipt },
288
+ action: DeckActionName,
289
+ ): Promise<ReviewDeckActionReceipt> {
290
+ const stored = hit.event.reviewDeckReceipt;
291
+ const undoAvailable = await honestUndoAvailable(ctx, hit.receipt, hit.event.reviewCreatedPath);
292
+ if (stored && stored.schemaVersion === 1 && stored.receiptId === hit.receipt.receiptId) {
293
+ return {
294
+ ...stored,
295
+ undoAvailable,
296
+ appliedRevision: stored.appliedRevision ?? hit.receipt.afterRevision,
297
+ };
298
+ }
299
+ return publicReceipt({
300
+ receiptId: hit.receipt.receiptId,
301
+ itemId: hit.receipt.itemId,
302
+ action,
303
+ outcome: "applied",
304
+ effect: action === "keep" ? KEEP_EFFECT : action === "not_true" ? NOT_TRUE_EFFECT : UNDO_EFFECT,
305
+ undoAvailable,
306
+ appliedRevision: hit.receipt.afterRevision,
307
+ });
308
+ }
309
+
310
+ function applyKeepOrNotTrueSync(input: {
311
+ memoryDir: string;
312
+ itemId: string;
313
+ filePath: string;
314
+ expectedRevision: string;
315
+ action: "keep" | "not_true";
316
+ onApproveBlockedMemory?: ReviewDeckMutationContext["onApproveBlockedMemory"];
317
+ }):
318
+ | { kind: "conflict"; current: string }
319
+ | { kind: "failed" }
320
+ | { kind: "applied"; afterRevision: string; createdAbs?: string } {
321
+ let current: string;
322
+ try {
323
+ current = fs.readFileSync(input.filePath, "utf8");
324
+ } catch {
325
+ return { kind: "failed" };
326
+ }
327
+ const currentRev = computeReviewItemRevision(current);
328
+ if (currentRev !== input.expectedRevision) {
329
+ return { kind: "conflict", current: currentRev };
330
+ }
331
+ const result = performReview(
332
+ input.memoryDir,
333
+ input.itemId,
334
+ input.action === "keep" ? "approve" : "dismiss",
335
+ { onApproveBlockedMemory: input.onApproveBlockedMemory },
336
+ );
337
+ if (result.message === "Item not found" || result.message === "Could not parse frontmatter") {
338
+ return { kind: "failed" };
339
+ }
340
+ if (result.updatedPath && fs.existsSync(result.updatedPath)) {
341
+ return {
342
+ kind: "applied",
343
+ afterRevision: computeReviewItemRevision(fs.readFileSync(result.updatedPath, "utf8")),
344
+ createdAbs: result.updatedPath,
345
+ };
346
+ }
347
+ return { kind: "applied", afterRevision: "" };
348
+ }
349
+
350
+ async function appendAppliedEvent(
351
+ ctx: ReviewDeckMutationContext,
352
+ input: {
353
+ itemId: string;
354
+ action: "keep" | "not_true" | "undo";
355
+ receipt: ReviewLifecycleReceipt;
356
+ createdRel?: string;
357
+ publicReceipt: ReviewDeckActionReceipt;
358
+ undoOfReceiptId?: string;
359
+ },
360
+ ): Promise<void> {
361
+ const event: StoredDeckEvent = {
362
+ eventId: `mle-${randomUUID()}`,
363
+ memoryId: input.itemId,
364
+ eventType: EVENT_TYPE[input.action],
365
+ timestamp: new Date().toISOString(),
366
+ actor: ACTOR,
367
+ ruleVersion: RULE_VERSION,
368
+ reviewReceipt: input.receipt,
369
+ reviewNamespace: ctx.namespace,
370
+ reviewDeckReceipt: input.publicReceipt,
371
+ before: { path: input.receipt.sourcePath },
372
+ ...(input.createdRel ? { after: { path: input.createdRel }, reviewCreatedPath: input.createdRel } : {}),
373
+ ...(input.undoOfReceiptId ? { relatedMemoryIds: [input.itemId] } : {}),
374
+ };
375
+ await ctx.appendLifecycleEvents([event]);
376
+ }
377
+
378
+ export async function executeReviewDeckAction(
379
+ ctx: ReviewDeckMutationContext,
380
+ req: ReviewDeckActionRequest,
381
+ ): Promise<ReviewDeckActionReceipt> {
382
+ throwIfAborted(ctx.signal);
383
+ if (req.schemaVersion !== 1) throw new ReviewDeckInputError("schemaVersion must be 1");
384
+ if (!isNonEmptyString(req.itemId)) throw new ReviewDeckInputError("itemId is required");
385
+ if (!isNonEmptyString(req.revision)) throw new ReviewDeckInputError("revision is required");
386
+ if (!isNonEmptyString(req.idempotencyKey)) throw new ReviewDeckInputError("idempotencyKey is required");
387
+
388
+ const receiptId = computeReceiptId(ctx.namespace, ctx.principalDigest, req.idempotencyKey);
389
+
390
+ if (req.action === "prepare_fix") {
391
+ const correctionText = req.correctionText;
392
+ if (typeof correctionText !== "string" || correctionText.trim() === "") {
393
+ throw new ReviewDeckInputError("correctionText is required");
394
+ }
395
+ if (!ctx.planCorrection) {
396
+ return publicReceipt({
397
+ receiptId,
398
+ itemId: req.itemId,
399
+ action: "prepare_fix",
400
+ outcome: "failed",
401
+ effect: PLAN_FAILED_EFFECT,
402
+ undoAvailable: false,
403
+ });
404
+ }
405
+ const planned = await ctx.planCorrection({ itemId: req.itemId, correctionText });
406
+ if (!planned.planId) {
407
+ return publicReceipt({
408
+ receiptId,
409
+ itemId: req.itemId,
410
+ action: "prepare_fix",
411
+ outcome: "failed",
412
+ effect: planned.message?.trim() || PLAN_FAILED_EFFECT,
413
+ undoAvailable: false,
414
+ });
415
+ }
416
+ return publicReceipt({
417
+ receiptId,
418
+ itemId: req.itemId,
419
+ action: "prepare_fix",
420
+ outcome: "planned",
421
+ effect: PLANNED_EFFECT,
422
+ undoAvailable: false,
423
+ correctionPlanId: planned.planId,
424
+ correctionPreview: planned.preview,
425
+ });
426
+ }
427
+
428
+ if (req.action !== "keep" && req.action !== "not_true") {
429
+ throw new ReviewDeckInputError("unsupported review deck action");
430
+ }
431
+
432
+ const fingerprint = actionFingerprint(ctx, req.itemId, req.action, req.revision);
433
+ const existing = findStoredReceipt(await ctx.readLifecycleEvents(), receiptId);
434
+ if (existing) {
435
+ if (existing.receipt.requestFingerprint !== fingerprint) throw new ReviewDeckIdempotencyError();
436
+ return replayReceipt(ctx, existing, req.action);
437
+ }
438
+
439
+ const row = readReviewDeckRow({ memoryDir: ctx.memoryDir, itemId: req.itemId });
440
+ if (!row) {
441
+ return publicReceipt({
442
+ receiptId,
443
+ itemId: req.itemId,
444
+ action: req.action,
445
+ outcome: "failed",
446
+ effect: MISSING_EFFECT,
447
+ undoAvailable: false,
448
+ });
449
+ }
450
+
451
+ throwIfAborted(ctx.signal);
452
+ const revisionArtifact = await snapshotForUndo(row.filePath, ctx.memoryDir);
453
+ throwIfAborted(ctx.signal);
454
+
455
+ const applied = applyKeepOrNotTrueSync({
456
+ memoryDir: ctx.memoryDir,
457
+ itemId: req.itemId,
458
+ filePath: row.filePath,
459
+ expectedRevision: req.revision,
460
+ action: req.action,
461
+ onApproveBlockedMemory: ctx.onApproveBlockedMemory,
462
+ });
463
+
464
+ if (applied.kind === "conflict") {
465
+ return publicReceipt({
466
+ receiptId,
467
+ itemId: req.itemId,
468
+ action: req.action,
469
+ outcome: "conflict",
470
+ effect: CONFLICT_EFFECT,
471
+ undoAvailable: false,
472
+ appliedRevision: applied.current,
473
+ });
474
+ }
475
+ if (applied.kind === "failed") {
476
+ return publicReceipt({
477
+ receiptId,
478
+ itemId: req.itemId,
479
+ action: req.action,
480
+ outcome: "failed",
481
+ effect: MISSING_EFFECT,
482
+ undoAvailable: false,
483
+ });
484
+ }
485
+
486
+ const sourcePath = toMemoryPathRel(ctx.memoryDir, row.filePath);
487
+ const createdRel = applied.createdAbs ? toMemoryPathRel(ctx.memoryDir, applied.createdAbs) : undefined;
488
+ const ledgerReceipt: ReviewLifecycleReceipt = {
489
+ schemaVersion: 1,
490
+ receiptId,
491
+ requestFingerprint: fingerprint,
492
+ principalDigest: ctx.principalDigest,
493
+ itemId: req.itemId,
494
+ action: LEDGER_ACTION[req.action],
495
+ beforeRevision: req.revision,
496
+ afterRevision: applied.afterRevision,
497
+ sourcePath,
498
+ ...(revisionArtifact ? { revisionArtifact } : {}),
499
+ };
500
+ const undoAvailable = Boolean(revisionArtifact);
501
+ const published = publicReceipt({
502
+ receiptId,
503
+ itemId: req.itemId,
504
+ action: req.action,
505
+ outcome: "applied",
506
+ effect: req.action === "keep" ? KEEP_EFFECT : NOT_TRUE_EFFECT,
507
+ undoAvailable,
508
+ appliedRevision: applied.afterRevision,
509
+ });
510
+ await appendAppliedEvent(ctx, {
511
+ itemId: req.itemId,
512
+ action: req.action,
513
+ receipt: ledgerReceipt,
514
+ createdRel,
515
+ publicReceipt: published,
516
+ });
517
+ return published;
518
+ }
519
+
520
+ export async function executeReviewDeckUndo(
521
+ ctx: ReviewDeckMutationContext,
522
+ req: ReviewDeckUndoRequest,
523
+ ): Promise<ReviewDeckActionReceipt> {
524
+ throwIfAborted(ctx.signal);
525
+ if (req.schemaVersion !== 1) throw new ReviewDeckInputError("schemaVersion must be 1");
526
+ if (!isNonEmptyString(req.receiptId)) throw new ReviewDeckInputError("receiptId is required");
527
+ if (typeof req.expectedRevision !== "string") throw new ReviewDeckInputError("expectedRevision is required");
528
+ if (!isNonEmptyString(req.idempotencyKey)) throw new ReviewDeckInputError("idempotencyKey is required");
529
+
530
+ const undoReceiptId = computeReceiptId(ctx.namespace, ctx.principalDigest, req.idempotencyKey);
531
+ const events = await ctx.readLifecycleEvents();
532
+ const original = findStoredReceipt(events, req.receiptId);
533
+ if (!original) {
534
+ return publicReceipt({
535
+ receiptId: undoReceiptId,
536
+ itemId: "",
537
+ action: "undo",
538
+ outcome: "failed",
539
+ effect: UNDO_FAILED_EFFECT,
540
+ undoAvailable: false,
541
+ });
542
+ }
543
+
544
+ const scopeOk =
545
+ original.receipt.principalDigest === ctx.principalDigest &&
546
+ original.event.reviewNamespace === ctx.namespace;
547
+ if (!scopeOk) {
548
+ return publicReceipt({
549
+ receiptId: undoReceiptId,
550
+ itemId: "",
551
+ action: "undo",
552
+ outcome: "failed",
553
+ effect: UNDO_FAILED_EFFECT,
554
+ undoAvailable: false,
555
+ });
556
+ }
557
+
558
+ const fingerprint = actionFingerprint(
559
+ ctx,
560
+ original.receipt.itemId,
561
+ "undo",
562
+ req.expectedRevision,
563
+ );
564
+ const priorUndo = findStoredReceipt(events, undoReceiptId);
565
+ if (priorUndo) {
566
+ if (priorUndo.receipt.requestFingerprint !== fingerprint) throw new ReviewDeckIdempotencyError();
567
+ return replayReceipt(ctx, priorUndo, "undo");
568
+ }
569
+
570
+ if (req.expectedRevision !== original.receipt.afterRevision) {
571
+ return publicReceipt({
572
+ receiptId: undoReceiptId,
573
+ itemId: original.receipt.itemId,
574
+ action: "undo",
575
+ outcome: "conflict",
576
+ effect: UNDO_CONFLICT_EFFECT,
577
+ undoAvailable: false,
578
+ });
579
+ }
580
+
581
+ const createdRel = original.event.reviewCreatedPath;
582
+ const targetRel = undoTargetRevision(original.receipt, createdRel);
583
+ const targetAbs = resolveInside(ctx.memoryDir, targetRel);
584
+ const sourceAbs = resolveInside(ctx.memoryDir, original.receipt.sourcePath);
585
+ if (!targetAbs || !sourceAbs) {
586
+ return publicReceipt({
587
+ receiptId: undoReceiptId,
588
+ itemId: original.receipt.itemId,
589
+ action: "undo",
590
+ outcome: "failed",
591
+ effect: UNDO_FAILED_EFFECT,
592
+ undoAvailable: false,
593
+ });
594
+ }
595
+
596
+ if (currentRevision(targetAbs) !== original.receipt.afterRevision) {
597
+ return publicReceipt({
598
+ receiptId: undoReceiptId,
599
+ itemId: original.receipt.itemId,
600
+ action: "undo",
601
+ outcome: "conflict",
602
+ effect: UNDO_CONFLICT_EFFECT,
603
+ undoAvailable: false,
604
+ appliedRevision: currentRevision(targetAbs),
605
+ });
606
+ }
607
+
608
+ if (!original.receipt.revisionArtifact) {
609
+ return publicReceipt({
610
+ receiptId: undoReceiptId,
611
+ itemId: original.receipt.itemId,
612
+ action: "undo",
613
+ outcome: "failed",
614
+ effect: UNDO_FAILED_EFFECT,
615
+ undoAvailable: false,
616
+ });
617
+ }
618
+
619
+ throwIfAborted(ctx.signal);
620
+ try {
621
+ await revertToVersion(
622
+ sourceAbs,
623
+ original.receipt.revisionArtifact,
624
+ DECK_VERSIONING,
625
+ undefined,
626
+ ctx.memoryDir,
627
+ );
628
+ } catch {
629
+ return publicReceipt({
630
+ receiptId: undoReceiptId,
631
+ itemId: original.receipt.itemId,
632
+ action: "undo",
633
+ outcome: "failed",
634
+ effect: UNDO_FAILED_EFFECT,
635
+ undoAvailable: false,
636
+ });
637
+ }
638
+
639
+ if (createdRel && createdRel !== original.receipt.sourcePath) {
640
+ const createdAbs = resolveInside(ctx.memoryDir, createdRel);
641
+ if (createdAbs && createdAbs !== sourceAbs && fs.existsSync(createdAbs)) {
642
+ fs.unlinkSync(createdAbs);
643
+ }
644
+ }
645
+ bumpMemoryCorpusVersionForDir(ctx.memoryDir);
646
+
647
+ const afterRevision = currentRevision(sourceAbs);
648
+ const ledgerReceipt: ReviewLifecycleReceipt = {
649
+ schemaVersion: 1,
650
+ receiptId: undoReceiptId,
651
+ requestFingerprint: fingerprint,
652
+ principalDigest: ctx.principalDigest,
653
+ itemId: original.receipt.itemId,
654
+ action: "undo",
655
+ beforeRevision: original.receipt.afterRevision,
656
+ afterRevision,
657
+ sourcePath: original.receipt.sourcePath,
658
+ undoOfReceiptId: original.receipt.receiptId,
659
+ };
660
+ const published = publicReceipt({
661
+ receiptId: undoReceiptId,
662
+ itemId: original.receipt.itemId,
663
+ action: "undo",
664
+ outcome: "applied",
665
+ effect: UNDO_EFFECT,
666
+ undoAvailable: false,
667
+ appliedRevision: afterRevision,
668
+ });
669
+ await appendAppliedEvent(ctx, {
670
+ itemId: original.receipt.itemId,
671
+ action: "undo",
672
+ receipt: ledgerReceipt,
673
+ publicReceipt: published,
674
+ undoOfReceiptId: original.receipt.receiptId,
675
+ });
676
+ return published;
677
+ }