@remnic/core 10.0.3 → 10.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. package/dist/access-admin-ops-surface.js +62 -62
  2. package/dist/access-authorization-probe.js +63 -63
  3. package/dist/access-boundary.js +62 -62
  4. package/dist/access-cli.d.ts.map +1 -1
  5. package/dist/access-cli.js +146 -139
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-extraction-force-flush.js +62 -62
  8. package/dist/access-http-briefing.js +63 -63
  9. package/dist/access-http-query.js +64 -64
  10. package/dist/access-http.d.ts.map +1 -1
  11. package/dist/access-http.js +86 -85
  12. package/dist/access-identity-continuity-surface.js +62 -62
  13. package/dist/access-lcm-surface.js +62 -62
  14. package/dist/access-mcp-correction-tools.d.ts +10 -0
  15. package/dist/access-mcp-correction-tools.d.ts.map +1 -0
  16. package/dist/access-mcp-correction-tools.js +8 -0
  17. package/dist/access-mcp.d.ts.map +1 -1
  18. package/dist/access-mcp.js +76 -75
  19. package/dist/access-namespace-preflight.js +62 -62
  20. package/dist/access-observe-write-category.js +5 -5
  21. package/dist/access-observe-write-surface.js +62 -62
  22. package/dist/access-offline-manifest.js +8 -8
  23. package/dist/access-operations-batch.js +65 -65
  24. package/dist/access-operations.d.ts +1 -0
  25. package/dist/access-operations.d.ts.map +1 -1
  26. package/dist/access-operations.js +72 -72
  27. package/dist/access-recall-concurrency.js +62 -62
  28. package/dist/access-recall-diagnostics.js +2 -2
  29. package/dist/access-recall-response.js +62 -62
  30. package/dist/access-recall-surface.js +62 -62
  31. package/dist/access-service.d.ts.map +1 -1
  32. package/dist/access-service.js +62 -62
  33. package/dist/access-surface-catalog.js +64 -64
  34. package/dist/active-recall.js +31 -30
  35. package/dist/active-recall.js.map +1 -1
  36. package/dist/adapters/index.js +7 -7
  37. package/dist/adapters/registry.js +3 -3
  38. package/dist/{auto-sync-PAWBFQWL.js → auto-sync-FN7E3OTO.js} +6 -6
  39. package/dist/briefing.js +26 -26
  40. package/dist/buffer.js +8 -8
  41. package/dist/causal-consolidation.js +26 -26
  42. package/dist/{chunk-YQSWNFZE.js → chunk-2CP577K6.js} +2 -2
  43. package/dist/{chunk-6JIHC5AS.js → chunk-37HCPM56.js} +78 -67
  44. package/dist/chunk-37HCPM56.js.map +1 -0
  45. package/dist/{chunk-345MEMRU.js → chunk-3OUGSOJP.js} +2 -2
  46. package/dist/{chunk-CHI37EHP.js → chunk-4CWUZBPF.js} +8 -6
  47. package/dist/chunk-4CWUZBPF.js.map +1 -0
  48. package/dist/{chunk-G2STTRYB.js → chunk-4D2YH47Z.js} +2 -2
  49. package/dist/{chunk-IXYIW3MZ.js → chunk-4K2H4KTR.js} +5 -5
  50. package/dist/{chunk-UVVSOSHL.js → chunk-52CQKST6.js} +53 -53
  51. package/dist/{chunk-H7BZBSP6.js → chunk-52II7PB6.js} +4 -4
  52. package/dist/{chunk-BLHPADUX.js → chunk-5BPXMAUP.js} +22 -78
  53. package/dist/chunk-5BPXMAUP.js.map +1 -0
  54. package/dist/{chunk-ZS7RK6H6.js → chunk-5BY3IA2U.js} +16 -53
  55. package/dist/chunk-5BY3IA2U.js.map +1 -0
  56. package/dist/{chunk-2QZFZNXO.js → chunk-5CQO6LVM.js} +2 -2
  57. package/dist/{chunk-NLDMTXWV.js → chunk-5LNPW7NE.js} +2 -2
  58. package/dist/{chunk-WHTMVTU4.js → chunk-5X4ZJESN.js} +2 -2
  59. package/dist/{chunk-WI37MWRZ.js → chunk-63UNVGZW.js} +5 -5
  60. package/dist/{chunk-G3T6YMBO.js → chunk-64S6X4IU.js} +7 -7
  61. package/dist/{chunk-CFCEJNOE.js → chunk-6KHF6PAB.js} +2 -2
  62. package/dist/{chunk-5GINB5LC.js → chunk-6MKLMEBE.js} +1 -1
  63. package/dist/{chunk-5GINB5LC.js.map → chunk-6MKLMEBE.js.map} +1 -1
  64. package/dist/{chunk-35A7GCHG.js → chunk-6T42L5FI.js} +2 -2
  65. package/dist/{chunk-JDOBIFBK.js → chunk-7CXL25AA.js} +2 -2
  66. package/dist/{chunk-YLBE6PLR.js → chunk-7IGMKQWK.js} +2 -2
  67. package/dist/{chunk-CSLK7BN6.js → chunk-7LYRFI5A.js} +2 -2
  68. package/dist/{chunk-IB63OVUB.js → chunk-AJ6ORARY.js} +6 -6
  69. package/dist/{chunk-CGOKNQDK.js → chunk-ANZXWOYD.js} +2 -2
  70. package/dist/{chunk-5QXMESS7.js → chunk-AXC7UTLM.js} +2 -2
  71. package/dist/{chunk-RFIJRZ4K.js → chunk-B657ZGDH.js} +2 -2
  72. package/dist/{chunk-AW4QUFQF.js → chunk-BTNNL7ZW.js} +3 -2
  73. package/dist/{chunk-AW4QUFQF.js.map → chunk-BTNNL7ZW.js.map} +1 -1
  74. package/dist/{chunk-MY7B3HYC.js → chunk-CLCMDKTB.js} +2 -2
  75. package/dist/{chunk-QPWUG2S3.js → chunk-CYEK6Z3P.js} +4 -4
  76. package/dist/{chunk-IHCYCE6D.js → chunk-DJMVSUPK.js} +4 -4
  77. package/dist/{chunk-HP4CU2ZA.js → chunk-DST7HRSG.js} +2 -2
  78. package/dist/{chunk-IIFFC3RL.js → chunk-EDR6CVWZ.js} +2 -2
  79. package/dist/{chunk-AUWMKDKL.js → chunk-EMVJU7WC.js} +2 -2
  80. package/dist/{chunk-O6AYMAPJ.js → chunk-ENNC3RZ6.js} +2 -2
  81. package/dist/{chunk-2JRB3Z5N.js → chunk-EP5WXE2G.js} +3 -3
  82. package/dist/{chunk-QLK3SL7Q.js → chunk-ETSJD5IV.js} +131 -12
  83. package/dist/chunk-ETSJD5IV.js.map +1 -0
  84. package/dist/chunk-EWMRFW3F.js +38 -0
  85. package/dist/chunk-EWMRFW3F.js.map +1 -0
  86. package/dist/{chunk-I2KEH2LS.js → chunk-FC6RCOIU.js} +2 -2
  87. package/dist/{chunk-OZVHLBH6.js → chunk-FLV7M7CT.js} +2 -2
  88. package/dist/{chunk-Q6GI7HEC.js → chunk-FRH2UC7Q.js} +2 -2
  89. package/dist/{chunk-3SL52JKD.js → chunk-FZVROZKC.js} +5 -5
  90. package/dist/{chunk-2EZB2DL5.js → chunk-GE6HETIF.js} +3 -3
  91. package/dist/{chunk-2DHJTJIY.js → chunk-GEGUBU3D.js} +2 -2
  92. package/dist/{chunk-6AA7XFMO.js → chunk-GF4H3B3R.js} +8 -8
  93. package/dist/{chunk-NGOZH7R5.js → chunk-GVUW5XK5.js} +311 -142
  94. package/dist/chunk-GVUW5XK5.js.map +1 -0
  95. package/dist/{chunk-ME2LMFHF.js → chunk-HPAOMYKM.js} +92 -92
  96. package/dist/{chunk-4NRZ7BRS.js → chunk-I25RINZK.js} +2 -2
  97. package/dist/{chunk-XG4XXI66.js → chunk-I25RQA65.js} +2 -2
  98. package/dist/chunk-I56MTWE7.js +80 -0
  99. package/dist/chunk-I56MTWE7.js.map +1 -0
  100. package/dist/{chunk-EJJMDLVB.js → chunk-IJ4FEGZR.js} +2 -2
  101. package/dist/{chunk-EUL3S3LE.js → chunk-J5WI4QRP.js} +4 -4
  102. package/dist/{chunk-LMMC55WM.js → chunk-JA54KIYD.js} +4 -4
  103. package/dist/{chunk-5FLFPTDK.js → chunk-JA72X46J.js} +2 -2
  104. package/dist/{chunk-6GU3TNJJ.js → chunk-JMF5Q4JY.js} +246 -49
  105. package/dist/chunk-JMF5Q4JY.js.map +1 -0
  106. package/dist/{chunk-IDSSDL4W.js → chunk-JXSYWTFK.js} +21 -4
  107. package/dist/{chunk-IDSSDL4W.js.map → chunk-JXSYWTFK.js.map} +1 -1
  108. package/dist/{chunk-NLYOOGZ7.js → chunk-KE5PWLI6.js} +3 -3
  109. package/dist/chunk-KIUVEMBI.js +49 -0
  110. package/dist/chunk-KIUVEMBI.js.map +1 -0
  111. package/dist/{chunk-4DDIWRT7.js → chunk-KQI2PKYP.js} +2 -2
  112. package/dist/{chunk-Y2ADLCB3.js → chunk-KSUOM3YU.js} +9 -9
  113. package/dist/{chunk-BTOHGPHC.js → chunk-KZEMFD6E.js} +3 -3
  114. package/dist/{chunk-NXVD46HT.js → chunk-L2VS27PZ.js} +4 -4
  115. package/dist/{chunk-MYYHACOW.js → chunk-L34W4W4I.js} +2 -2
  116. package/dist/{chunk-KRTIHXWC.js → chunk-L3PWXD73.js} +2 -2
  117. package/dist/{chunk-NQHSXHJP.js → chunk-L6GNS5GB.js} +2 -2
  118. package/dist/{chunk-44PBRUXB.js → chunk-M47Q6566.js} +2 -2
  119. package/dist/{chunk-E7FN5N5E.js → chunk-MQNOIH2C.js} +7 -7
  120. package/dist/{chunk-IDSZNHIP.js → chunk-MULNBSPP.js} +4 -4
  121. package/dist/{chunk-RKSGUMVL.js → chunk-NBQIFCJE.js} +2 -2
  122. package/dist/{chunk-I6WFBNA4.js → chunk-NHSVW7UT.js} +15 -15
  123. package/dist/{chunk-32HO62I4.js → chunk-OFEHITAZ.js} +2 -2
  124. package/dist/{chunk-PCO3P7WJ.js → chunk-OGVJXIHX.js} +2 -2
  125. package/dist/{chunk-RYN4AIRM.js → chunk-OZABSIOV.js} +4 -4
  126. package/dist/{chunk-HO7IQP7G.js → chunk-QMFKW4OU.js} +3 -3
  127. package/dist/{chunk-34G4U6HS.js → chunk-QRZMJ2WN.js} +2 -2
  128. package/dist/{chunk-RKDSELA3.js → chunk-QWWMS4AE.js} +1 -1
  129. package/dist/chunk-QWWMS4AE.js.map +1 -0
  130. package/dist/{chunk-GUD6FYQG.js → chunk-RSMIRLKM.js} +2 -2
  131. package/dist/{chunk-TNVZCLJU.js → chunk-S5TGRZWY.js} +2 -2
  132. package/dist/{chunk-O24EWFPQ.js → chunk-SNXBXYUE.js} +3 -3
  133. package/dist/{chunk-KW77LGDX.js → chunk-SUAX5JWY.js} +2 -2
  134. package/dist/{chunk-PNFWIB4X.js → chunk-SWRN6U7Q.js} +2 -2
  135. package/dist/{chunk-X6X4UASX.js → chunk-SZXPKUMN.js} +232 -83
  136. package/dist/chunk-SZXPKUMN.js.map +1 -0
  137. package/dist/{chunk-R4NGLTUS.js → chunk-TDMNADPI.js} +2 -2
  138. package/dist/{chunk-QCP75JGO.js → chunk-TFA6HPOA.js} +5 -5
  139. package/dist/{chunk-LI76ESJL.js → chunk-TZQOCQXB.js} +2 -2
  140. package/dist/{chunk-OV7EYM6M.js → chunk-U6OXJQEH.js} +12 -12
  141. package/dist/{chunk-OWHPA4JS.js → chunk-V32NHP2R.js} +2 -2
  142. package/dist/{chunk-JSUA4YFE.js → chunk-WG4TMZJ2.js} +2 -2
  143. package/dist/{chunk-DQTCGVFK.js → chunk-WHCD4Z3D.js} +2 -2
  144. package/dist/{chunk-GBA4N2SG.js → chunk-WRICYGYG.js} +27 -26
  145. package/dist/chunk-WRICYGYG.js.map +1 -0
  146. package/dist/{chunk-KATEWTQJ.js → chunk-X7J56GPG.js} +2 -2
  147. package/dist/{chunk-7KICGR5W.js → chunk-XPRAOTJY.js} +2 -2
  148. package/dist/{chunk-2NV7MMMM.js → chunk-XQSJXNWC.js} +2 -2
  149. package/dist/{chunk-22DYJLFN.js → chunk-XVC7JU2N.js} +39 -18
  150. package/dist/chunk-XVC7JU2N.js.map +1 -0
  151. package/dist/{chunk-RXT6UB25.js → chunk-YJAOYEWI.js} +2 -2
  152. package/dist/{chunk-L6DJJEFW.js → chunk-YJEUHGZZ.js} +2 -2
  153. package/dist/{chunk-AXFWMRKI.js → chunk-YQJCWR4R.js} +2 -2
  154. package/dist/cli.js +110 -108
  155. package/dist/coding/export-okf-codegraph.js +25 -25
  156. package/dist/compounding/engine.js +25 -25
  157. package/dist/config.d.ts.map +1 -1
  158. package/dist/config.js +31 -30
  159. package/dist/connectors/codex-materialize-runner.js +25 -25
  160. package/dist/connectors/index.js +25 -25
  161. package/dist/consolidation-provenance-check.js +2 -2
  162. package/dist/contradiction/index.js +7 -7
  163. package/dist/convergence-refresh.js +27 -27
  164. package/dist/conversation-index/backend.js +2 -2
  165. package/dist/corpus-read-cancellation.d.ts +7 -0
  166. package/dist/corpus-read-cancellation.d.ts.map +1 -1
  167. package/dist/corpus-read-cancellation.js +1 -1
  168. package/dist/corpus-watermark.js +27 -27
  169. package/dist/correction/correction-access-wiring.d.ts +6 -6
  170. package/dist/correction/correction-access-wiring.d.ts.map +1 -1
  171. package/dist/correction/correction-classify.d.ts +25 -0
  172. package/dist/correction/correction-classify.d.ts.map +1 -0
  173. package/dist/correction/correction-config.d.ts +11 -0
  174. package/dist/correction/correction-config.d.ts.map +1 -0
  175. package/dist/correction/correction-contract.d.ts +13 -1
  176. package/dist/correction/correction-contract.d.ts.map +1 -1
  177. package/dist/correction/correction-executor.d.ts +2 -0
  178. package/dist/correction/correction-executor.d.ts.map +1 -1
  179. package/dist/correction/correction-planner.d.ts +24 -3
  180. package/dist/correction/correction-planner.d.ts.map +1 -1
  181. package/dist/directory-sidecars.js +2 -2
  182. package/dist/entity-retrieval.js +25 -25
  183. package/dist/event-order-recall.js +2 -2
  184. package/dist/explicit-capture.js +2 -2
  185. package/dist/external-wiki-access.js +63 -63
  186. package/dist/extraction-span-materialize.js +2 -2
  187. package/dist/extraction.js +34 -34
  188. package/dist/harmonic-retrieval.js +25 -25
  189. package/dist/index.js +221 -218
  190. package/dist/lcm/index.js +3 -3
  191. package/dist/local-llm.d.ts.map +1 -1
  192. package/dist/local-llm.js +1 -1
  193. package/dist/location/index.js +28 -28
  194. package/dist/maintenance/archive-observations.js +2 -2
  195. package/dist/maintenance/atomic-file.d.ts +1 -1
  196. package/dist/maintenance/atomic-file.d.ts.map +1 -1
  197. package/dist/maintenance/atomic-file.js +1 -1
  198. package/dist/maintenance/memory-governance.js +25 -25
  199. package/dist/maintenance/migrate-observations.js +3 -3
  200. package/dist/maintenance/observation-ledger-utils.js +2 -2
  201. package/dist/maintenance/projection-rebuild-abort.d.ts +17 -0
  202. package/dist/maintenance/projection-rebuild-abort.d.ts.map +1 -0
  203. package/dist/maintenance/projection-timeline.d.ts +19 -0
  204. package/dist/maintenance/projection-timeline.d.ts.map +1 -0
  205. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +25 -25
  206. package/dist/maintenance/rebuild-memory-projection-runner.d.ts +8 -0
  207. package/dist/maintenance/rebuild-memory-projection-runner.d.ts.map +1 -0
  208. package/dist/maintenance/rebuild-memory-projection-runner.js +113 -0
  209. package/dist/maintenance/rebuild-memory-projection-runner.js.map +1 -0
  210. package/dist/maintenance/rebuild-memory-projection.d.ts +8 -0
  211. package/dist/maintenance/rebuild-memory-projection.d.ts.map +1 -1
  212. package/dist/maintenance/rebuild-memory-projection.js +26 -26
  213. package/dist/maintenance/rebuild-observations.js +3 -3
  214. package/dist/memory-browse-operations.js +63 -63
  215. package/dist/memory-browse.js +7 -7
  216. package/dist/memory-subject.js +1 -1
  217. package/dist/namespaces/migrate.js +26 -26
  218. package/dist/namespaces/search.js +10 -10
  219. package/dist/namespaces/storage.js +25 -25
  220. package/dist/offline-sync-impression-drain.js +3 -3
  221. package/dist/operator-doctor-corpus.js +28 -28
  222. package/dist/operator-toolkit.js +41 -40
  223. package/dist/orchestration/full-corpus-heap-guard.d.ts +25 -0
  224. package/dist/orchestration/full-corpus-heap-guard.d.ts.map +1 -0
  225. package/dist/orchestration/maintenance.d.ts.map +1 -1
  226. package/dist/orchestration/maintenance.js +38 -36
  227. package/dist/orchestration/projection-rebuild-schedule.d.ts +40 -0
  228. package/dist/orchestration/projection-rebuild-schedule.d.ts.map +1 -1
  229. package/dist/orchestration/session-context.d.ts.map +1 -1
  230. package/dist/orchestrator.js +142 -139
  231. package/dist/projection-rebuild-config.d.ts +52 -0
  232. package/dist/projection-rebuild-config.d.ts.map +1 -0
  233. package/dist/projection-rebuild-config.js +14 -0
  234. package/dist/projection-rebuild-config.js.map +1 -0
  235. package/dist/qmd.js +4 -4
  236. package/dist/recall-explain-renderer.js +3 -3
  237. package/dist/recall-navigate-access.js +2 -2
  238. package/dist/recall-navigate-disclosure.js +2 -2
  239. package/dist/recall-navigate.js +2 -2
  240. package/dist/recall-navigation-operations.js +63 -63
  241. package/dist/recall-navigation.js +62 -62
  242. package/dist/recall-state-view-admission.js +7 -7
  243. package/dist/recall-state.js +2 -2
  244. package/dist/recall-why-service.js +8 -8
  245. package/dist/recall-xray-cli.js +4 -4
  246. package/dist/recall-xray-renderer.js +3 -3
  247. package/dist/recall-xray.js +2 -2
  248. package/dist/reconcile/manifest.js +3 -3
  249. package/dist/relevance.js +2 -2
  250. package/dist/{resolution-RSG4HZTL.js → resolution-TV3F7ZTH.js} +7 -7
  251. package/dist/resolution-TV3F7ZTH.js.map +1 -0
  252. package/dist/resume-bundles.js +32 -31
  253. package/dist/salvage-envelope.js +1 -1
  254. package/dist/search/factory.js +9 -9
  255. package/dist/search/index.js +17 -17
  256. package/dist/semantic-consolidation.js +31 -31
  257. package/dist/semantic-rule-promotion.js +25 -25
  258. package/dist/semantic-rule-verifier.js +25 -25
  259. package/dist/source-agent-qualifier.js +29 -29
  260. package/dist/standup/build.js +25 -25
  261. package/dist/storage/memory-lifecycle-ledger-access.d.ts +5 -3
  262. package/dist/storage/memory-lifecycle-ledger-access.d.ts.map +1 -1
  263. package/dist/storage/memory-read-store.d.ts +2 -2
  264. package/dist/storage/memory-read-store.d.ts.map +1 -1
  265. package/dist/storage.d.ts +4 -2
  266. package/dist/storage.d.ts.map +1 -1
  267. package/dist/storage.js +24 -24
  268. package/dist/subject-config.js +1 -1
  269. package/dist/summarizer.js +3 -3
  270. package/dist/support-passport/index.js +78 -78
  271. package/dist/transfer/export-okf.js +26 -26
  272. package/dist/types.d.ts +8 -40
  273. package/dist/types.d.ts.map +1 -1
  274. package/dist/types.js +1 -1
  275. package/dist/verified-recall.js +25 -25
  276. package/dist/who-knows-cli.js +26 -26
  277. package/dist/who-knows.js +25 -25
  278. package/dist/write-envelope.js +1 -1
  279. package/package.json +2 -2
  280. package/src/access-cli.ts +4 -0
  281. package/src/access-http.ts +1 -0
  282. package/src/access-mcp-correction-tools.ts +56 -0
  283. package/src/access-mcp.ts +4 -49
  284. package/src/access-operations.ts +3 -0
  285. package/src/access-service.ts +12 -21
  286. package/src/config.test.ts +35 -0
  287. package/src/config.ts +6 -65
  288. package/src/corpus-read-cancellation.ts +7 -0
  289. package/src/correction/correction-access-wiring.ts +56 -16
  290. package/src/correction/correction-classify.test.ts +185 -0
  291. package/src/correction/correction-classify.ts +157 -0
  292. package/src/correction/correction-config.ts +93 -0
  293. package/src/correction/correction-contract.ts +61 -14
  294. package/src/correction/correction-executor.test.ts +102 -2
  295. package/src/correction/correction-executor.ts +19 -1
  296. package/src/correction/correction-planner.test.ts +141 -0
  297. package/src/correction/correction-planner.ts +117 -11
  298. package/src/correction/correction-surfaces.test.ts +22 -1
  299. package/src/local-llm-qos.test.ts +36 -0
  300. package/src/local-llm.ts +20 -3
  301. package/src/maintenance/atomic-file.ts +2 -0
  302. package/src/maintenance/projection-rebuild-abort.ts +40 -0
  303. package/src/maintenance/projection-timeline.ts +209 -0
  304. package/src/maintenance/rebuild-memory-projection-runner.ts +94 -0
  305. package/src/maintenance/rebuild-memory-projection.memory.test.ts +159 -0
  306. package/src/maintenance/rebuild-memory-projection.retain-raw.test.ts +202 -0
  307. package/src/maintenance/rebuild-memory-projection.ts +63 -91
  308. package/src/orchestration/full-corpus-heap-guard.ts +38 -0
  309. package/src/orchestration/maintenance.test.ts +2 -2
  310. package/src/orchestration/maintenance.ts +2 -0
  311. package/src/orchestration/projection-rebuild-schedule.test.ts +498 -0
  312. package/src/orchestration/projection-rebuild-schedule.ts +280 -9
  313. package/src/orchestration/session-context.ts +0 -15
  314. package/src/projection-rebuild-config.ts +82 -0
  315. package/src/recall-handles-wiring.test.ts +24 -0
  316. package/src/storage/memory-lifecycle-ledger-access.ts +61 -33
  317. package/src/storage/memory-read-store.ts +10 -4
  318. package/src/storage.ts +45 -33
  319. package/src/types.ts +8 -41
  320. package/dist/chunk-22DYJLFN.js.map +0 -1
  321. package/dist/chunk-6GU3TNJJ.js.map +0 -1
  322. package/dist/chunk-6JIHC5AS.js.map +0 -1
  323. package/dist/chunk-BLHPADUX.js.map +0 -1
  324. package/dist/chunk-CHI37EHP.js.map +0 -1
  325. package/dist/chunk-GBA4N2SG.js.map +0 -1
  326. package/dist/chunk-NGOZH7R5.js.map +0 -1
  327. package/dist/chunk-QLK3SL7Q.js.map +0 -1
  328. package/dist/chunk-RKDSELA3.js.map +0 -1
  329. package/dist/chunk-X6X4UASX.js.map +0 -1
  330. package/dist/chunk-ZS7RK6H6.js.map +0 -1
  331. /package/dist/{resolution-RSG4HZTL.js.map → access-mcp-correction-tools.js.map} +0 -0
  332. /package/dist/{auto-sync-PAWBFQWL.js.map → auto-sync-FN7E3OTO.js.map} +0 -0
  333. /package/dist/{chunk-YQSWNFZE.js.map → chunk-2CP577K6.js.map} +0 -0
  334. /package/dist/{chunk-345MEMRU.js.map → chunk-3OUGSOJP.js.map} +0 -0
  335. /package/dist/{chunk-G2STTRYB.js.map → chunk-4D2YH47Z.js.map} +0 -0
  336. /package/dist/{chunk-IXYIW3MZ.js.map → chunk-4K2H4KTR.js.map} +0 -0
  337. /package/dist/{chunk-UVVSOSHL.js.map → chunk-52CQKST6.js.map} +0 -0
  338. /package/dist/{chunk-H7BZBSP6.js.map → chunk-52II7PB6.js.map} +0 -0
  339. /package/dist/{chunk-2QZFZNXO.js.map → chunk-5CQO6LVM.js.map} +0 -0
  340. /package/dist/{chunk-NLDMTXWV.js.map → chunk-5LNPW7NE.js.map} +0 -0
  341. /package/dist/{chunk-WHTMVTU4.js.map → chunk-5X4ZJESN.js.map} +0 -0
  342. /package/dist/{chunk-WI37MWRZ.js.map → chunk-63UNVGZW.js.map} +0 -0
  343. /package/dist/{chunk-G3T6YMBO.js.map → chunk-64S6X4IU.js.map} +0 -0
  344. /package/dist/{chunk-CFCEJNOE.js.map → chunk-6KHF6PAB.js.map} +0 -0
  345. /package/dist/{chunk-35A7GCHG.js.map → chunk-6T42L5FI.js.map} +0 -0
  346. /package/dist/{chunk-JDOBIFBK.js.map → chunk-7CXL25AA.js.map} +0 -0
  347. /package/dist/{chunk-YLBE6PLR.js.map → chunk-7IGMKQWK.js.map} +0 -0
  348. /package/dist/{chunk-CSLK7BN6.js.map → chunk-7LYRFI5A.js.map} +0 -0
  349. /package/dist/{chunk-IB63OVUB.js.map → chunk-AJ6ORARY.js.map} +0 -0
  350. /package/dist/{chunk-CGOKNQDK.js.map → chunk-ANZXWOYD.js.map} +0 -0
  351. /package/dist/{chunk-5QXMESS7.js.map → chunk-AXC7UTLM.js.map} +0 -0
  352. /package/dist/{chunk-RFIJRZ4K.js.map → chunk-B657ZGDH.js.map} +0 -0
  353. /package/dist/{chunk-MY7B3HYC.js.map → chunk-CLCMDKTB.js.map} +0 -0
  354. /package/dist/{chunk-QPWUG2S3.js.map → chunk-CYEK6Z3P.js.map} +0 -0
  355. /package/dist/{chunk-IHCYCE6D.js.map → chunk-DJMVSUPK.js.map} +0 -0
  356. /package/dist/{chunk-HP4CU2ZA.js.map → chunk-DST7HRSG.js.map} +0 -0
  357. /package/dist/{chunk-IIFFC3RL.js.map → chunk-EDR6CVWZ.js.map} +0 -0
  358. /package/dist/{chunk-AUWMKDKL.js.map → chunk-EMVJU7WC.js.map} +0 -0
  359. /package/dist/{chunk-O6AYMAPJ.js.map → chunk-ENNC3RZ6.js.map} +0 -0
  360. /package/dist/{chunk-2JRB3Z5N.js.map → chunk-EP5WXE2G.js.map} +0 -0
  361. /package/dist/{chunk-I2KEH2LS.js.map → chunk-FC6RCOIU.js.map} +0 -0
  362. /package/dist/{chunk-OZVHLBH6.js.map → chunk-FLV7M7CT.js.map} +0 -0
  363. /package/dist/{chunk-Q6GI7HEC.js.map → chunk-FRH2UC7Q.js.map} +0 -0
  364. /package/dist/{chunk-3SL52JKD.js.map → chunk-FZVROZKC.js.map} +0 -0
  365. /package/dist/{chunk-2EZB2DL5.js.map → chunk-GE6HETIF.js.map} +0 -0
  366. /package/dist/{chunk-2DHJTJIY.js.map → chunk-GEGUBU3D.js.map} +0 -0
  367. /package/dist/{chunk-6AA7XFMO.js.map → chunk-GF4H3B3R.js.map} +0 -0
  368. /package/dist/{chunk-ME2LMFHF.js.map → chunk-HPAOMYKM.js.map} +0 -0
  369. /package/dist/{chunk-4NRZ7BRS.js.map → chunk-I25RINZK.js.map} +0 -0
  370. /package/dist/{chunk-XG4XXI66.js.map → chunk-I25RQA65.js.map} +0 -0
  371. /package/dist/{chunk-EJJMDLVB.js.map → chunk-IJ4FEGZR.js.map} +0 -0
  372. /package/dist/{chunk-EUL3S3LE.js.map → chunk-J5WI4QRP.js.map} +0 -0
  373. /package/dist/{chunk-LMMC55WM.js.map → chunk-JA54KIYD.js.map} +0 -0
  374. /package/dist/{chunk-5FLFPTDK.js.map → chunk-JA72X46J.js.map} +0 -0
  375. /package/dist/{chunk-NLYOOGZ7.js.map → chunk-KE5PWLI6.js.map} +0 -0
  376. /package/dist/{chunk-4DDIWRT7.js.map → chunk-KQI2PKYP.js.map} +0 -0
  377. /package/dist/{chunk-Y2ADLCB3.js.map → chunk-KSUOM3YU.js.map} +0 -0
  378. /package/dist/{chunk-BTOHGPHC.js.map → chunk-KZEMFD6E.js.map} +0 -0
  379. /package/dist/{chunk-NXVD46HT.js.map → chunk-L2VS27PZ.js.map} +0 -0
  380. /package/dist/{chunk-MYYHACOW.js.map → chunk-L34W4W4I.js.map} +0 -0
  381. /package/dist/{chunk-KRTIHXWC.js.map → chunk-L3PWXD73.js.map} +0 -0
  382. /package/dist/{chunk-NQHSXHJP.js.map → chunk-L6GNS5GB.js.map} +0 -0
  383. /package/dist/{chunk-44PBRUXB.js.map → chunk-M47Q6566.js.map} +0 -0
  384. /package/dist/{chunk-E7FN5N5E.js.map → chunk-MQNOIH2C.js.map} +0 -0
  385. /package/dist/{chunk-IDSZNHIP.js.map → chunk-MULNBSPP.js.map} +0 -0
  386. /package/dist/{chunk-RKSGUMVL.js.map → chunk-NBQIFCJE.js.map} +0 -0
  387. /package/dist/{chunk-I6WFBNA4.js.map → chunk-NHSVW7UT.js.map} +0 -0
  388. /package/dist/{chunk-32HO62I4.js.map → chunk-OFEHITAZ.js.map} +0 -0
  389. /package/dist/{chunk-PCO3P7WJ.js.map → chunk-OGVJXIHX.js.map} +0 -0
  390. /package/dist/{chunk-RYN4AIRM.js.map → chunk-OZABSIOV.js.map} +0 -0
  391. /package/dist/{chunk-HO7IQP7G.js.map → chunk-QMFKW4OU.js.map} +0 -0
  392. /package/dist/{chunk-34G4U6HS.js.map → chunk-QRZMJ2WN.js.map} +0 -0
  393. /package/dist/{chunk-GUD6FYQG.js.map → chunk-RSMIRLKM.js.map} +0 -0
  394. /package/dist/{chunk-TNVZCLJU.js.map → chunk-S5TGRZWY.js.map} +0 -0
  395. /package/dist/{chunk-O24EWFPQ.js.map → chunk-SNXBXYUE.js.map} +0 -0
  396. /package/dist/{chunk-KW77LGDX.js.map → chunk-SUAX5JWY.js.map} +0 -0
  397. /package/dist/{chunk-PNFWIB4X.js.map → chunk-SWRN6U7Q.js.map} +0 -0
  398. /package/dist/{chunk-R4NGLTUS.js.map → chunk-TDMNADPI.js.map} +0 -0
  399. /package/dist/{chunk-QCP75JGO.js.map → chunk-TFA6HPOA.js.map} +0 -0
  400. /package/dist/{chunk-LI76ESJL.js.map → chunk-TZQOCQXB.js.map} +0 -0
  401. /package/dist/{chunk-OV7EYM6M.js.map → chunk-U6OXJQEH.js.map} +0 -0
  402. /package/dist/{chunk-OWHPA4JS.js.map → chunk-V32NHP2R.js.map} +0 -0
  403. /package/dist/{chunk-JSUA4YFE.js.map → chunk-WG4TMZJ2.js.map} +0 -0
  404. /package/dist/{chunk-DQTCGVFK.js.map → chunk-WHCD4Z3D.js.map} +0 -0
  405. /package/dist/{chunk-KATEWTQJ.js.map → chunk-X7J56GPG.js.map} +0 -0
  406. /package/dist/{chunk-7KICGR5W.js.map → chunk-XPRAOTJY.js.map} +0 -0
  407. /package/dist/{chunk-2NV7MMMM.js.map → chunk-XQSJXNWC.js.map} +0 -0
  408. /package/dist/{chunk-RXT6UB25.js.map → chunk-YJAOYEWI.js.map} +0 -0
  409. /package/dist/{chunk-L6DJJEFW.js.map → chunk-YJEUHGZZ.js.map} +0 -0
  410. /package/dist/{chunk-AXFWMRKI.js.map → chunk-YQJCWR4R.js.map} +0 -0
package/dist/who-knows.js CHANGED
@@ -9,29 +9,29 @@ import {
9
9
  loadWhoKnowsEntities,
10
10
  tokenizeTopic,
11
11
  validateWhoKnowsInput
12
- } from "./chunk-2NV7MMMM.js";
13
- import "./chunk-6JIHC5AS.js";
14
- import "./chunk-UHVXE24Y.js";
12
+ } from "./chunk-XQSJXNWC.js";
13
+ import "./chunk-37HCPM56.js";
15
14
  import "./chunk-46WM6JX2.js";
15
+ import "./chunk-UHVXE24Y.js";
16
16
  import "./chunk-V4JZCTMK.js";
17
- import "./chunk-GUD6FYQG.js";
18
- import "./chunk-OV7EYM6M.js";
19
- import "./chunk-S7LWX2PQ.js";
20
- import "./chunk-T2YX56QI.js";
21
- import "./chunk-CYEPCZN5.js";
17
+ import "./chunk-RSMIRLKM.js";
18
+ import "./chunk-U6OXJQEH.js";
22
19
  import "./chunk-T3FMRLWQ.js";
23
20
  import "./chunk-7VO6E5UD.js";
24
- import "./chunk-4O6WRBGE.js";
25
21
  import "./chunk-5BUCKFRE.js";
22
+ import "./chunk-S7LWX2PQ.js";
23
+ import "./chunk-T2YX56QI.js";
24
+ import "./chunk-4O6WRBGE.js";
26
25
  import "./chunk-GUMZC2BO.js";
27
- import "./chunk-QCP75JGO.js";
28
- import "./chunk-A7Q43EUZ.js";
26
+ import "./chunk-CYEPCZN5.js";
27
+ import "./chunk-TFA6HPOA.js";
29
28
  import "./chunk-F4TWWUMP.js";
30
29
  import "./chunk-72A4L5JJ.js";
30
+ import "./chunk-A7Q43EUZ.js";
31
31
  import "./chunk-S2V7RUCL.js";
32
32
  import "./chunk-X3724WL4.js";
33
- import "./chunk-S2HLHAZ4.js";
34
33
  import "./chunk-MRPOZBJC.js";
34
+ import "./chunk-S2HLHAZ4.js";
35
35
  import "./chunk-DM2T26WE.js";
36
36
  import "./chunk-LDXUBPMO.js";
37
37
  import "./chunk-FF6N7BXC.js";
@@ -39,13 +39,12 @@ import "./chunk-2DT7PIDZ.js";
39
39
  import "./chunk-AAD2ZS6P.js";
40
40
  import "./chunk-EIFYYHAF.js";
41
41
  import "./chunk-ZIKENA2C.js";
42
- import "./chunk-345MEMRU.js";
42
+ import "./chunk-3OUGSOJP.js";
43
43
  import "./chunk-SCU65EZI.js";
44
44
  import "./chunk-3ONXXHQO.js";
45
45
  import "./chunk-YXZG5TVN.js";
46
- import "./chunk-5GINB5LC.js";
47
46
  import "./chunk-3WU7XOFN.js";
48
- import "./chunk-G7D6GZ5J.js";
47
+ import "./chunk-6MKLMEBE.js";
49
48
  import "./chunk-W5XWHTDO.js";
50
49
  import "./chunk-M5GVCJSJ.js";
51
50
  import "./chunk-RBOJCG4T.js";
@@ -53,12 +52,13 @@ import "./chunk-R7QY5ZVB.js";
53
52
  import "./chunk-5WITETWU.js";
54
53
  import "./chunk-6CIAGZ6X.js";
55
54
  import "./chunk-7CT3AI52.js";
56
- import "./chunk-IB63OVUB.js";
55
+ import "./chunk-G7D6GZ5J.js";
56
+ import "./chunk-AJ6ORARY.js";
57
+ import "./chunk-IUM3VSHI.js";
57
58
  import "./chunk-G26YNEOC.js";
58
59
  import "./chunk-IM2GO42H.js";
59
60
  import "./chunk-TPSLVZHS.js";
60
61
  import "./chunk-SIGAGKNE.js";
61
- import "./chunk-IUM3VSHI.js";
62
62
  import "./chunk-23G5P7TA.js";
63
63
  import "./chunk-C64XATK7.js";
64
64
  import "./chunk-42JKGUFJ.js";
@@ -68,12 +68,14 @@ import "./chunk-L2EXJQJP.js";
68
68
  import "./chunk-45GF7Y3V.js";
69
69
  import "./chunk-EP6BA7VV.js";
70
70
  import "./chunk-E2AWJ7KQ.js";
71
+ import "./chunk-Z7L72ZHL.js";
72
+ import "./chunk-4O4TKIXQ.js";
71
73
  import "./chunk-YCVB7X56.js";
72
74
  import "./chunk-PQVCH2AE.js";
73
75
  import "./chunk-PJKTFXE2.js";
74
76
  import "./chunk-W5BIQOAJ.js";
75
- import "./chunk-Z7L72ZHL.js";
76
- import "./chunk-4O4TKIXQ.js";
77
+ import "./chunk-QWWMS4AE.js";
78
+ import "./chunk-YBA52OKG.js";
77
79
  import "./chunk-5AYUHSAU.js";
78
80
  import "./chunk-BT7NVCML.js";
79
81
  import "./chunk-PO7NXNGC.js";
@@ -81,22 +83,20 @@ import "./chunk-BJMBJZ2Y.js";
81
83
  import "./chunk-UKJAGEXH.js";
82
84
  import "./chunk-FP2373TW.js";
83
85
  import "./chunk-L272A5QW.js";
84
- import "./chunk-22DYJLFN.js";
86
+ import "./chunk-XVC7JU2N.js";
85
87
  import "./chunk-ZA53AZND.js";
86
88
  import "./chunk-7RJUVTVF.js";
87
89
  import "./chunk-AL3UYZ5N.js";
88
90
  import "./chunk-RL6NEVXT.js";
91
+ import "./chunk-PWPIERBM.js";
89
92
  import "./chunk-C7HJ3NEI.js";
90
93
  import "./chunk-N4PYB235.js";
91
- import "./chunk-AW4QUFQF.js";
94
+ import "./chunk-BTNNL7ZW.js";
92
95
  import "./chunk-5FVVY2EB.js";
93
- import "./chunk-FFAZ2XFU.js";
94
- import "./chunk-RKDSELA3.js";
95
- import "./chunk-YBA52OKG.js";
96
- import "./chunk-PWPIERBM.js";
97
96
  import "./chunk-JDSVLVCG.js";
98
97
  import "./chunk-5GKPFL3S.js";
99
98
  import "./chunk-JAKIDQB2.js";
99
+ import "./chunk-FFAZ2XFU.js";
100
100
  import "./chunk-P7FMDTKL.js";
101
101
  import "./chunk-VUFL7X3H.js";
102
102
  import "./chunk-2EMROIXS.js";
@@ -17,10 +17,10 @@ import "./chunk-BT7NVCML.js";
17
17
  import "./chunk-PO7NXNGC.js";
18
18
  import "./chunk-N4PYB235.js";
19
19
  import "./chunk-5FVVY2EB.js";
20
- import "./chunk-FFAZ2XFU.js";
21
20
  import "./chunk-JDSVLVCG.js";
22
21
  import "./chunk-5GKPFL3S.js";
23
22
  import "./chunk-JAKIDQB2.js";
23
+ import "./chunk-FFAZ2XFU.js";
24
24
  import "./chunk-P7FMDTKL.js";
25
25
  import "./chunk-MAAL6OZV.js";
26
26
  import "./chunk-A6XUJE5D.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "10.0.3",
3
+ "version": "10.0.5",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3327,7 +3327,7 @@
3327
3327
  "core"
3328
3328
  ],
3329
3329
  "peerDependencies": {
3330
- "@remnic/coding-graph": "^10.0.3"
3330
+ "@remnic/coding-graph": "^10.0.5"
3331
3331
  },
3332
3332
  "peerDependenciesMeta": {
3333
3333
  "@remnic/coding-graph": {
package/src/access-cli.ts CHANGED
@@ -207,6 +207,7 @@ function usage(): string {
207
207
  "Correct options (issue #1580 — one plan/apply pipeline for all corrections):",
208
208
  " --text \"<correction>\" plan a correction from natural language",
209
209
  " --id <memoryId> (repeatable) explicit target memory ids",
210
+ " --duplicate-of <memoryId> winner id; requires exactly one --id (skips the classifier)",
210
211
  " --apply apply a pending plan (requires --plan-id + --confirm)",
211
212
  " --plan-id <id> the plan to apply or discard",
212
213
  " --confirm confirm the apply (safety guard, rule 48)",
@@ -297,6 +298,7 @@ const COMMAND_SPECS: Record<CommandName, CommandSpec> = {
297
298
  valueOptions: new Set([
298
299
  "text",
299
300
  "id",
301
+ "duplicate-of",
300
302
  "plan-id",
301
303
  "namespace",
302
304
  "session-key",
@@ -830,6 +832,7 @@ async function runCorrect(args: ParsedArgs, preferredId?: string): Promise<void>
830
832
  // so schema validation + namespace policy reach this path (same as MCP/HTTP).
831
833
  const text = requireOption(args, "text");
832
834
  const targetIds = getAllOptions(args, "id");
835
+ const duplicateOf = getLastOption(args, "duplicate-of");
833
836
  const planOp = getOperation("memory_correct_plan");
834
837
  if (!planOp) {
835
838
  throw new Error("access-boundary: operation not registered: memory_correct_plan");
@@ -838,6 +841,7 @@ async function runCorrect(args: ParsedArgs, preferredId?: string): Promise<void>
838
841
  {
839
842
  text,
840
843
  ...(targetIds.length > 0 ? { targetIds } : {}),
844
+ ...(duplicateOf ? { duplicateOf } : {}),
841
845
  ...(sessionKey ? { sessionKey } : {}),
842
846
  ...(namespace ? { namespace } : {}),
843
847
  },
@@ -1999,6 +1999,7 @@ export class EngramAccessHttpServer extends ReviewDeckAccessHttpBase {
1999
1999
  const output = (await op.run(this.gatedBodyNamespace(req, body), {
2000
2000
  service: this.service,
2001
2001
  authenticatedPrincipal: this.resolveRequestPrincipal(req),
2002
+ ...(abortSignal ? { abortSignal } : {}),
2002
2003
  })) as { result: unknown };
2003
2004
  this.recordWriteRateLimitHit(req);
2004
2005
  this.respondJson(res, 200, output.result);
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Correction MCP tool descriptors.
3
+ *
4
+ * Extracted from access-mcp.ts (over its fileSizeGrandfather ceiling) so
5
+ * `duplicateOf` can land without growing that file. Aliases are applied by
6
+ * the caller via withToolAliases.
7
+ */
8
+ import type { McpTool } from "./access-mcp.js";
9
+
10
+ export const correctionMcpTools: McpTool[] = [
11
+ {
12
+ name: "engram.memory_correct_plan",
13
+ description:
14
+ "Plan a memory correction from a plain-language statement. Returns a CorrectionPlan with a diff preview; apply via memory_correct_apply. Pass duplicateOf plus one targetIds entry to supersede that duplicate without calling the classifier.",
15
+ inputSchema: {
16
+ type: "object",
17
+ properties: {
18
+ text: {
19
+ type: "string",
20
+ description: 'The natural-language correction (e.g. "we migrated to MySQL in March").',
21
+ },
22
+ targetIds: {
23
+ type: "array",
24
+ items: { type: "string" },
25
+ description:
26
+ "Optional explicit target memory ids. When omitted, the planner searches. With duplicateOf, pass exactly the duplicate id.",
27
+ },
28
+ duplicateOf: {
29
+ type: "string",
30
+ description:
31
+ "Optional winner memory id. Requires targetIds to be exactly the duplicate. Skips classification and drafts one recoverable supersede (no hard delete) linking the duplicate to this id.",
32
+ },
33
+ sessionKey: { type: "string", description: "Session identifier for namespace resolution." },
34
+ namespace: { type: "string", description: "Optional explicit namespace (validated by policy)." },
35
+ },
36
+ required: ["text"],
37
+ additionalProperties: false,
38
+ },
39
+ },
40
+ {
41
+ name: "engram.memory_correct_apply",
42
+ description:
43
+ "Apply a planned memory correction by planId. Requires confirm: true when correction.applyRequiresConfirm is on (default).",
44
+ inputSchema: {
45
+ type: "object",
46
+ properties: {
47
+ planId: { type: "string", description: "The plan id returned by memory_correct_plan." },
48
+ confirm: { type: "boolean", description: "Must be true to apply (safety guard)." },
49
+ sessionKey: { type: "string", description: "Session identifier for namespace resolution." },
50
+ namespace: { type: "string", description: "Optional explicit namespace (validated by policy)." },
51
+ },
52
+ required: ["planId"],
53
+ additionalProperties: false,
54
+ },
55
+ },
56
+ ];
package/src/access-mcp.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { sharedContextMcpTools } from "./access-mcp-shared-context-tools.js";
2
+ import { correctionMcpTools } from "./access-mcp-correction-tools.js";
2
3
  import { randomUUID } from "node:crypto";
3
4
  import {
4
5
  MCP_ADMIN_OPS_MIGRATED_OPERATIONS,
@@ -2133,56 +2134,10 @@ export class EngramMcpServer {
2133
2134
  this.tools = [...this.tools, ...deltaTools];
2134
2135
  }
2135
2136
  if (this.correctionVisible) {
2136
- // Correction Contract (issue #1580) — one plan/apply pipeline for every
2137
- // memory correction. Both tools dispatch through the boundary operations
2138
- // (memory_correct_plan / memory_correct_apply) which delegate to the
2139
- // CorrectionService.
2140
- const planTool = withToolAliases(
2141
- {
2142
- name: "engram.memory_correct_plan",
2143
- description:
2144
- "Plan a memory correction from a plain-language statement (issue #1580). Returns a CorrectionPlan with a diff preview; apply via memory_correct_apply.",
2145
- inputSchema: {
2146
- type: "object",
2147
- properties: {
2148
- text: {
2149
- type: "string",
2150
- description: 'The natural-language correction (e.g. "we migrated to MySQL in March").',
2151
- },
2152
- targetIds: {
2153
- type: "array",
2154
- items: { type: "string" },
2155
- description: "Optional explicit target memory ids. When omitted, the planner searches.",
2156
- },
2157
- sessionKey: { type: "string", description: "Session identifier for namespace resolution." },
2158
- namespace: { type: "string", description: "Optional explicit namespace (validated by policy)." },
2159
- },
2160
- required: ["text"],
2161
- additionalProperties: false,
2162
- },
2163
- },
2164
- this.emitLegacyTools
2165
- );
2166
- const applyTool = withToolAliases(
2167
- {
2168
- name: "engram.memory_correct_apply",
2169
- description:
2170
- "Apply a planned memory correction by planId (issue #1580). Requires confirm: true when correction.applyRequiresConfirm is on (default).",
2171
- inputSchema: {
2172
- type: "object",
2173
- properties: {
2174
- planId: { type: "string", description: "The plan id returned by memory_correct_plan." },
2175
- confirm: { type: "boolean", description: "Must be true to apply (safety guard, rule 48)." },
2176
- sessionKey: { type: "string", description: "Session identifier for namespace resolution." },
2177
- namespace: { type: "string", description: "Optional explicit namespace (validated by policy)." },
2178
- },
2179
- required: ["planId"],
2180
- additionalProperties: false,
2181
- },
2182
- },
2183
- this.emitLegacyTools
2137
+ const correctionTools = correctionMcpTools.flatMap((tool) =>
2138
+ withToolAliases(tool, this.emitLegacyTools),
2184
2139
  );
2185
- this.tools = [...this.tools, ...planTool, ...applyTool];
2140
+ this.tools = [...this.tools, ...correctionTools];
2186
2141
  }
2187
2142
  if (this.chatVisible) {
2188
2143
  const chatTools = withToolAliases(
@@ -384,6 +384,7 @@ const memoryCorrectPlanSchema = z.preprocess(
384
384
  z.object({
385
385
  text: z.string().trim().min(1).max(10_000),
386
386
  targetIds: z.array(z.string().trim().min(1).max(512)).optional(),
387
+ duplicateOf: z.string().trim().min(1).max(512).optional(),
387
388
  sessionKey: z.string().trim().max(512).optional(),
388
389
  namespace: z.string().trim().max(256).optional(),
389
390
  }),
@@ -392,6 +393,7 @@ const memoryCorrectPlanSchema = z.preprocess(
392
393
  export interface MemoryCorrectPlanInput {
393
394
  text: string;
394
395
  targetIds?: string[];
396
+ duplicateOf?: string;
395
397
  sessionKey?: string;
396
398
  namespace?: string;
397
399
  }
@@ -414,6 +416,7 @@ export const memoryCorrectPlanOperation = defineOperation<
414
416
  {
415
417
  text: input.text,
416
418
  ...(input.targetIds ? { targetIds: input.targetIds } : {}),
419
+ ...(input.duplicateOf ? { duplicateOf: input.duplicateOf } : {}),
417
420
  ...(input.sessionKey ? { sessionKey: input.sessionKey } : {}),
418
421
  ...(input.namespace ? { namespace: input.namespace } : {}),
419
422
  ...(ctx.authenticatedPrincipal ? { principal: ctx.authenticatedPrincipal } : {}),
@@ -3349,24 +3349,6 @@ export class EngramAccessService extends SupportPassportAccessServiceBase {
3349
3349
  return Promise.resolve(false);
3350
3350
  }
3351
3351
  },
3352
- // Wire the orchestrator's extraction LLM so classify+draft actually
3353
- // drafts actions instead of always hitting the deterministic fallback
3354
- // (review thread PG5). The planner's classifyAndDraft already falls back
3355
- // on any LLM outage, so returning null (LLM disabled/cooldown) or a
3356
- // thrown error both degrade safely to the deterministic path (rule 13).
3357
- llmComplete: async ({ system, user }) => {
3358
- const result = await this.orchestrator.localLlm.chatCompletion(
3359
- [
3360
- { role: "system", content: system },
3361
- { role: "user", content: user },
3362
- ],
3363
- { operation: "correction-classify", priority: "background" }
3364
- );
3365
- if (!result) {
3366
- throw new Error("correction classify+draft: local LLM unavailable (disabled or in cooldown)");
3367
- }
3368
- return result.content;
3369
- },
3370
3352
  });
3371
3353
  this._correctionService = service;
3372
3354
  return service;
@@ -3389,11 +3371,20 @@ export class EngramAccessService extends SupportPassportAccessServiceBase {
3389
3371
  }
3390
3372
 
3391
3373
  async correctionPlan(request: CorrectionRequest, opts?: { abortSignal?: AbortSignal }): Promise<CorrectionPlan> {
3374
+ let next = request;
3392
3375
  if (request.targetIds?.some((id) => isHandleToken(id))) {
3393
- const targetIds = request.targetIds.map((id) => this.resolveMemoryIdOrHandleInput(id, request.sessionKey));
3394
- return this.correctionService().plan({ ...request, targetIds }, opts);
3376
+ next = {
3377
+ ...next,
3378
+ targetIds: request.targetIds.map((id) => this.resolveMemoryIdOrHandleInput(id, request.sessionKey)),
3379
+ };
3380
+ }
3381
+ if (request.duplicateOf && isHandleToken(request.duplicateOf)) {
3382
+ next = {
3383
+ ...next,
3384
+ duplicateOf: this.resolveMemoryIdOrHandleInput(request.duplicateOf, request.sessionKey),
3385
+ };
3395
3386
  }
3396
- return this.correctionService().plan(request, opts);
3387
+ return this.correctionService().plan(next, opts);
3397
3388
  }
3398
3389
 
3399
3390
  async correctionApply(
@@ -2463,6 +2463,32 @@ test("parseConfig rejects invalid correction.planTtlHours instead of silently de
2463
2463
  assert.equal(parseConfig({}).correctionPlanTtlHours, 24, "absent → documented default");
2464
2464
  });
2465
2465
 
2466
+ test("parseConfig correction.classifyTimeoutMs defaults to 45000 and rejects invalid values", () => {
2467
+ assert.equal(parseConfig({}).correctionClassifyTimeoutMs, 45_000);
2468
+ assert.equal(parseConfig({ correction: { classifyTimeoutMs: 12000 } }).correctionClassifyTimeoutMs, 12_000);
2469
+ assert.equal(
2470
+ parseConfig({
2471
+ correction: { classifyTimeoutMs: 8000 },
2472
+ correctionClassifyTimeoutMs: 1000,
2473
+ }).correctionClassifyTimeoutMs,
2474
+ 8000,
2475
+ "nested correction.classifyTimeoutMs wins",
2476
+ );
2477
+ assert.equal(parseConfig({ correctionClassifyTimeoutMs: 15000 }).correctionClassifyTimeoutMs, 15_000);
2478
+ for (const value of [0, -1, 3.7, "abc", 300_001, true]) {
2479
+ assert.throws(
2480
+ () => parseConfig({ correctionClassifyTimeoutMs: value } as Record<string, unknown>),
2481
+ /Invalid correction\.classifyTimeoutMs/,
2482
+ `correctionClassifyTimeoutMs=${JSON.stringify(value)} should throw`,
2483
+ );
2484
+ assert.throws(
2485
+ () => parseConfig({ correction: { classifyTimeoutMs: value } } as Record<string, unknown>),
2486
+ /Invalid correction\.classifyTimeoutMs/,
2487
+ `nested classifyTimeoutMs=${JSON.stringify(value)} should throw`,
2488
+ );
2489
+ }
2490
+ });
2491
+
2466
2492
  test("parseConfig correction.maxAffected rejects non-integers (Number.isInteger, #1678)", () => {
2467
2493
  // The error message says "integer" — 3.7 must be rejected, not silently floored to 3.
2468
2494
  for (const value of [3.7, 2.5, "1.5", 0.99]) {
@@ -2625,6 +2651,15 @@ test("parseConfig projection-rebuild knobs: defaults, boolean coercion, numeric
2625
2651
  assert.throws(() => parseConfig({ projectionRebuildIntervalMs: 1000 }), /projectionRebuildIntervalMs/);
2626
2652
  assert.throws(() => parseConfig({ projectionRebuildIntervalMs: 3600000.5 }), /projectionRebuildIntervalMs/);
2627
2653
  assert.throws(() => parseConfig({ projectionRebuildIntervalMs: "abc" }), /projectionRebuildIntervalMs/);
2654
+
2655
+ assert.equal(defaults.projectionRebuildHeapUsageLimit, 0.6);
2656
+ assert.equal(parseConfig({ projectionRebuildHeapUsageLimit: 0.5 }).projectionRebuildHeapUsageLimit, 0.5);
2657
+ assert.equal(parseConfig({ projectionRebuildHeapUsageLimit: "0.5" }).projectionRebuildHeapUsageLimit, 0.5);
2658
+ assert.equal(parseConfig({ projectionRebuildHeapUsageLimit: 1 }).projectionRebuildHeapUsageLimit, 1);
2659
+ assert.throws(() => parseConfig({ projectionRebuildHeapUsageLimit: 0 }), /projectionRebuildHeapUsageLimit/);
2660
+ assert.throws(() => parseConfig({ projectionRebuildHeapUsageLimit: -0.2 }), /projectionRebuildHeapUsageLimit/);
2661
+ assert.throws(() => parseConfig({ projectionRebuildHeapUsageLimit: 1.1 }), /projectionRebuildHeapUsageLimit/);
2662
+ assert.throws(() => parseConfig({ projectionRebuildHeapUsageLimit: "abc" }), /projectionRebuildHeapUsageLimit/);
2628
2663
  });
2629
2664
 
2630
2665
  test("parseConfig forwards activity source settings", () => {
package/src/config.ts CHANGED
@@ -28,6 +28,7 @@ import type {
28
28
  import { parseBackgroundGeneration } from "./background-generation-config.js";
29
29
  import { parseSearchBackend } from "./config-search-backend.js";
30
30
  import { parseLocalLlmConfig } from "./local-llm-config.js";
31
+ import { parseCorrectionConfig } from "./correction/correction-config.js";
31
32
  import { parseConvergeConfig } from "./converge-config.js";
32
33
  import { parseExternalWikiRecallGuard } from "./external-wiki-guard.js";
33
34
  import { log } from "./logger.js";
@@ -81,6 +82,7 @@ import { parseCaptureCompanionConfigs } from "./location/parse-companions.js";
81
82
  import { parseLocationConfig } from "./location/config.js";
82
83
  import { parseOkfConfig } from "./okf/config.js";
83
84
  import { parseBoundedJsonlStateConfig } from "./bounded-jsonl-state.js";
85
+ import { parseProjectionRebuildScheduleConfig } from "./projection-rebuild-config.js";
84
86
  import { parseCodingKnowledgeConfig } from "./coding/coding-knowledge-config.js";
85
87
  import { parseActionGateConfig } from "./coding/action-gate.js";
86
88
  import { parseChatConfig } from "./chat/chat-config.js";
@@ -1854,66 +1856,9 @@ export function parseConfig(
1854
1856
  // (docs kept honest — review: wire resolver before exposing the gate).
1855
1857
  temporalBiTemporal: coerceBool(cfg.temporalBiTemporal) ?? false,
1856
1858
  temporalExpiredInInjection: coerceBool(cfg.temporalExpiredInInjection) ?? false,
1857
- // Correction Contract (issue #1580). Parsed here so operators can actually
1858
- // set the documented toggles/limits (review thread Txp): parseConfig builds
1859
- // an explicit output, so without these lines the raw `correction` block /
1860
- // flat legacy keys are dropped and the runtime always sees defaults. Nested
1861
- // `correction.<key>` wins; flat `correction<Key>` is the legacy fallback.
1862
- correctionEnabled: (() => {
1863
- const nested = (cfg.correction as Record<string, unknown> | undefined)?.enabled;
1864
- const raw = nested !== undefined ? nested : cfg.correctionEnabled;
1865
- if (raw === undefined || raw === null) return true;
1866
- const v = coerceBool(raw);
1867
- if (v === undefined) {
1868
- throw new Error(`Invalid correction.enabled: expected a boolean, got ${JSON.stringify(raw)}`);
1869
- }
1870
- return v;
1871
- })(),
1872
- correctionApplyRequiresConfirm: (() => {
1873
- const nested = (cfg.correction as Record<string, unknown> | undefined)?.applyRequiresConfirm;
1874
- const raw = nested !== undefined ? nested : cfg.correctionApplyRequiresConfirm;
1875
- if (raw === undefined || raw === null) return true;
1876
- const v = coerceBool(raw);
1877
- if (v === undefined) {
1878
- throw new Error(`Invalid correction.applyRequiresConfirm: expected a boolean, got ${JSON.stringify(raw)}`);
1879
- }
1880
- return v;
1881
- })(),
1882
- correctionMaxAffected: (() => {
1883
- const rawNested = (cfg.correction as Record<string, unknown> | undefined)?.maxAffected;
1884
- const raw = rawNested !== undefined ? rawNested : cfg.correctionMaxAffected;
1885
- if (raw === undefined || raw === null) return 10;
1886
- const n = coerceNumber(raw);
1887
- // #1678 (thread Oiup6): the error message says "integer" — enforce it
1888
- // with Number.isInteger so 3.7 is rejected rather than silently floored.
1889
- if (n === undefined || !Number.isFinite(n) || n < 1 || !Number.isInteger(n)) {
1890
- throw new Error(`Invalid correction.maxAffected: expected an integer >= 1, got ${JSON.stringify(raw)}`);
1891
- }
1892
- return n;
1893
- })(),
1894
- correctionPlanTtlHours: (() => {
1895
- const nested = (cfg.correction as Record<string, unknown> | undefined)?.planTtlHours;
1896
- const fromNested = nested !== undefined ? coerceNumber(nested) : undefined;
1897
- if (fromNested !== undefined && fromNested >= 1) return fromNested;
1898
- // #1678 (threads Ohtvi/Ohyvf): reject invalid (0/negative/non-numeric)
1899
- // instead of silently defaulting to 24h — completes the config-reject
1900
- // class already enforced for enabled/applyRequiresConfirm/maxAffected.
1901
- if (nested !== undefined && fromNested === undefined) {
1902
- throw new Error(`Invalid correction.planTtlHours: expected a number >= 1, got ${JSON.stringify(nested)}`);
1903
- }
1904
- if (fromNested !== undefined && fromNested < 1) {
1905
- throw new Error(`Invalid correction.planTtlHours: expected a number >= 1, got ${JSON.stringify(nested)}`);
1906
- }
1907
- const fromFlat = coerceNumber(cfg.correctionPlanTtlHours);
1908
- if (fromFlat !== undefined && fromFlat >= 1) return fromFlat;
1909
- if (cfg.correctionPlanTtlHours !== undefined && fromFlat === undefined) {
1910
- throw new Error(`Invalid correction.planTtlHours: expected a number >= 1, got ${JSON.stringify(cfg.correctionPlanTtlHours)}`);
1911
- }
1912
- if (fromFlat !== undefined && fromFlat < 1) {
1913
- throw new Error(`Invalid correction.planTtlHours: expected a number >= 1, got ${JSON.stringify(cfg.correctionPlanTtlHours)}`);
1914
- }
1915
- return 24;
1916
- })(),
1859
+ // Correction Contract (#1580). Nested `correction.<key>` wins over flat
1860
+ // `correction<Key>`. Parser lives in correction/correction-config.ts.
1861
+ ...parseCorrectionConfig(cfg),
1917
1862
  // Passive correction capture (issue #1581). Parsed from
1918
1863
  // `correctionCapture.<key>` (nested) or flat legacy keys. Default "off" —
1919
1864
  // operators opt in (rule 48). Invalid mode → rejected listing options (rule 51).
@@ -3560,11 +3505,7 @@ export function parseConfig(
3560
3505
  Number.isFinite(cfg.graphEdgeDecayVisibilityThreshold)
3561
3506
  ? Math.max(0, Math.min(1, cfg.graphEdgeDecayVisibilityThreshold))
3562
3507
  : 0.2,
3563
- // Issue #2119 — maintenance-scheduled memory-projection rebuild.
3564
- // Enabled-by-default (gotcha #36 coercion); interval via the strict shared parser (strings coerced, non-integer/sub-60s rejected — pattern #39).
3565
- projectionRebuildEnabled: coerceBooleanLike(cfg.projectionRebuildEnabled) ?? true,
3566
- projectionRebuildIntervalMs: parseIntegerAtLeast(
3567
- cfg.projectionRebuildIntervalMs, 6 * 60 * 60 * 1000, 60_000, "projectionRebuildIntervalMs"),
3508
+ ...parseProjectionRebuildScheduleConfig(cfg, parseIntegerAtLeast),
3568
3509
  ...parseBoundedJsonlStateConfig(cfg, parseIntegerAtLeast),
3569
3510
  // Issue #681 PR 3/3 — confidence-aware traversal. Floor clamps to [0,1]; a
3570
3511
  // documented 0 iterations disables PageRank refinement (BFS scores pass through).
@@ -34,6 +34,13 @@ export interface CorpusReadOptions {
34
34
  * work, and on a tree large enough to matter there are thousands of them.
35
35
  */
36
36
  abortSignal?: AbortSignal;
37
+ /**
38
+ * When `false`, parsed memories are returned without the raw file text kept
39
+ * beside them (`rememberRawFrontmatter`). Default (unset) retains that copy.
40
+ * A `false` read bypasses the shared corpus caches so it cannot replace a
41
+ * raw-retaining snapshot other callers still need.
42
+ */
43
+ retainRaw?: boolean;
37
44
  }
38
45
 
39
46
  /** Stop a corpus read at a scan boundary when its caller has given up. */