@remnic/core 9.69.45 → 9.69.47

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 (603) hide show
  1. package/dist/access-admin-ops-surface.d.ts +15 -14
  2. package/dist/access-admin-ops-surface.js +40 -39
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +15 -14
  5. package/dist/access-authorization-probe.js +41 -40
  6. package/dist/access-boundary.d.ts +15 -14
  7. package/dist/access-boundary.js +40 -39
  8. package/dist/access-cli.js +110 -104
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +1 -1
  11. package/dist/access-extraction-force-flush.d.ts +15 -14
  12. package/dist/access-extraction-force-flush.js +40 -39
  13. package/dist/access-health-types.d.ts +1 -1
  14. package/dist/access-http-briefing.d.ts +15 -14
  15. package/dist/access-http-briefing.js +41 -40
  16. package/dist/access-http-lcm-compaction.d.ts +15 -14
  17. package/dist/access-http-lifecycle-flush.d.ts +15 -14
  18. package/dist/access-http-offline-stream.d.ts +15 -14
  19. package/dist/access-http-query.d.ts +2 -2
  20. package/dist/access-http-query.js +42 -41
  21. package/dist/access-http.d.ts +16 -15
  22. package/dist/access-http.js +64 -60
  23. package/dist/access-identity-continuity-surface.d.ts +11 -11
  24. package/dist/access-identity-continuity-surface.js +40 -39
  25. package/dist/access-lcm-surface.d.ts +15 -14
  26. package/dist/access-lcm-surface.js +40 -39
  27. package/dist/access-mcp-output-schemas.js +1 -1
  28. package/dist/access-mcp-shared-context-tools.d.ts +15 -14
  29. package/dist/access-mcp.d.ts +15 -14
  30. package/dist/access-mcp.js +53 -50
  31. package/dist/access-memory-search-fanout.d.ts +2 -2
  32. package/dist/{access-namespace-preflight-DDnsN22V.d.ts → access-namespace-preflight-CetF9ziA.d.ts} +1 -1
  33. package/dist/access-namespace-preflight.d.ts +3 -3
  34. package/dist/access-namespace-preflight.js +40 -39
  35. package/dist/access-observe-transcript.d.ts +11 -11
  36. package/dist/access-observe-write-category.d.ts +3 -3
  37. package/dist/access-observe-write-surface.d.ts +15 -14
  38. package/dist/access-observe-write-surface.js +40 -39
  39. package/dist/access-offline-manifest.d.ts +11 -11
  40. package/dist/access-offline-manifest.js +2 -2
  41. package/dist/access-operations-batch.js +42 -41
  42. package/dist/access-operations.d.ts +16 -15
  43. package/dist/access-operations.js +49 -47
  44. package/dist/access-recall-concurrency.d.ts +15 -14
  45. package/dist/access-recall-concurrency.js +40 -39
  46. package/dist/access-recall-response.d.ts +15 -14
  47. package/dist/access-recall-response.js +40 -39
  48. package/dist/access-recall-surface.d.ts +15 -14
  49. package/dist/access-recall-surface.js +40 -39
  50. package/dist/access-schema.d.ts +1 -1
  51. package/dist/{access-service-CDteK_Gt.d.ts → access-service-BXYrJ3pO.d.ts} +13 -10
  52. package/dist/access-service-helpers.d.ts +15 -14
  53. package/dist/access-service.d.ts +15 -14
  54. package/dist/access-service.js +40 -39
  55. package/dist/access-surface-catalog.d.ts +15 -14
  56. package/dist/access-surface-catalog.js +48 -41
  57. package/dist/access-surface-catalog.js.map +1 -1
  58. package/dist/access-wearables-meetings-surface.d.ts +4 -4
  59. package/dist/action-confidence.d.ts +1 -1
  60. package/dist/active-memory-bridge.d.ts +1 -1
  61. package/dist/active-recall.d.ts +1 -1
  62. package/dist/active-recall.js +3 -2
  63. package/dist/active-recall.js.map +1 -1
  64. package/dist/activity/digest.d.ts +1 -1
  65. package/dist/adapters/index.js +4 -4
  66. package/dist/adapters/registry.js +2 -2
  67. package/dist/ambient-provenance.d.ts +1 -1
  68. package/dist/artifact-search.d.ts +1 -1
  69. package/dist/background-generation.d.ts +1 -1
  70. package/dist/behavior-learner.d.ts +1 -1
  71. package/dist/behavior-signals.d.ts +1 -1
  72. package/dist/bootstrap.d.ts +11 -11
  73. package/dist/briefing-window.d.ts +2 -2
  74. package/dist/briefing.d.ts +2 -2
  75. package/dist/briefing.js +13 -13
  76. package/dist/buffer-surprise-report.d.ts +1 -1
  77. package/dist/buffer-turn-helpers.d.ts +1 -1
  78. package/dist/buffer.d.ts +2 -2
  79. package/dist/buffer.js +5 -5
  80. package/dist/bulk-import/index.d.ts +3 -3
  81. package/dist/calibration.d.ts +1 -1
  82. package/dist/capabilities.d.ts +1 -1
  83. package/dist/{catalog-Dl2hYqpS.d.ts → catalog-Bns9zpl3.d.ts} +1 -1
  84. package/dist/causal-behavior.d.ts +1 -1
  85. package/dist/causal-consolidation.d.ts +1 -1
  86. package/dist/causal-consolidation.js +14 -14
  87. package/dist/causal-trajectory-graph.d.ts +1 -1
  88. package/dist/{chunk-OREGA7GY.js → chunk-2JFSQWFH.js} +5 -5
  89. package/dist/chunk-2JFSQWFH.js.map +1 -0
  90. package/dist/{chunk-C3MCMFNV.js → chunk-2QX65IEC.js} +2 -2
  91. package/dist/{chunk-HBGSZ62Z.js → chunk-3RKVSECD.js} +8 -8
  92. package/dist/{chunk-7LKXP4QG.js → chunk-44BILQ7U.js} +85 -43
  93. package/dist/chunk-44BILQ7U.js.map +1 -0
  94. package/dist/{chunk-R4HFCATE.js → chunk-4LPIVP77.js} +2 -2
  95. package/dist/{chunk-PW4HTWXL.js → chunk-55XWRL6F.js} +2 -2
  96. package/dist/{chunk-E5VOKZQV.js → chunk-5KBI2MOC.js} +1 -1
  97. package/dist/{chunk-ZQ533JDE.js → chunk-6A6HSXWV.js} +2 -2
  98. package/dist/{chunk-4HTQ76O4.js → chunk-7SJCSDQ3.js} +2 -2
  99. package/dist/{chunk-A2YN3FR4.js → chunk-7YUX52XZ.js} +3 -3
  100. package/dist/{chunk-NKDQXDFL.js → chunk-AS4YKT75.js} +36 -26
  101. package/dist/chunk-AS4YKT75.js.map +1 -0
  102. package/dist/{chunk-LQVXSRAJ.js → chunk-B4EGAHHS.js} +2 -2
  103. package/dist/{chunk-EUP4AXIW.js → chunk-B6VDWDFN.js} +2 -2
  104. package/dist/{chunk-Z5YNVWRD.js → chunk-BMENHAJL.js} +2 -2
  105. package/dist/{chunk-5ZXGH2ZL.js → chunk-BXOPUJ3W.js} +2 -2
  106. package/dist/{chunk-J6NEOCQC.js → chunk-CD7VTZIG.js} +2 -2
  107. package/dist/{chunk-EC5SVM6H.js → chunk-DE4ZGH2N.js} +2 -2
  108. package/dist/{chunk-2LRO73MN.js → chunk-DRLZB3CN.js} +2 -2
  109. package/dist/{chunk-SHEHQBCG.js → chunk-DUJYRVUD.js} +638 -45
  110. package/dist/chunk-DUJYRVUD.js.map +1 -0
  111. package/dist/{chunk-Q4MI2KCG.js → chunk-EGOWY342.js} +2 -2
  112. package/dist/chunk-EIB4FJVR.js +46 -0
  113. package/dist/chunk-EIB4FJVR.js.map +1 -0
  114. package/dist/{chunk-W44T2KHG.js → chunk-EWBDJQ5Y.js} +3 -3
  115. package/dist/{chunk-JMBTNVMW.js → chunk-FGRJJBFO.js} +2 -2
  116. package/dist/{chunk-F3TURDFG.js → chunk-FPB5LQWW.js} +4 -1
  117. package/dist/{chunk-F3TURDFG.js.map → chunk-FPB5LQWW.js.map} +1 -1
  118. package/dist/{chunk-OOBUWMPY.js → chunk-G2SJRFGP.js} +6 -6
  119. package/dist/{chunk-WGZHSQDV.js → chunk-G2XZFGYN.js} +4 -4
  120. package/dist/{chunk-JPNUKKSL.js → chunk-GGROFIYX.js} +2 -2
  121. package/dist/chunk-GXJSLNYO.js +74 -0
  122. package/dist/chunk-GXJSLNYO.js.map +1 -0
  123. package/dist/{chunk-VA5QRTZX.js → chunk-HG74GEVY.js} +2 -2
  124. package/dist/chunk-HMDYSGY6.js +54 -0
  125. package/dist/chunk-HMDYSGY6.js.map +1 -0
  126. package/dist/{chunk-WUUGE7QC.js → chunk-HS75MCQF.js} +4 -4
  127. package/dist/{chunk-DO6R3LIE.js → chunk-I6IJDTRP.js} +2 -2
  128. package/dist/{chunk-T3F2HWIG.js → chunk-IO7K7GES.js} +2 -2
  129. package/dist/{chunk-6II55MXS.js → chunk-JXLEQIJ7.js} +2 -2
  130. package/dist/{chunk-4XTSKGLX.js → chunk-JYXLW22X.js} +3 -3
  131. package/dist/chunk-LI4APB6M.js +218 -0
  132. package/dist/chunk-LI4APB6M.js.map +1 -0
  133. package/dist/{chunk-IFULZYYQ.js → chunk-LIAM7U2J.js} +2 -2
  134. package/dist/{chunk-LZAJONO5.js → chunk-LIDJWAQV.js} +2 -2
  135. package/dist/{chunk-B55FYF6F.js → chunk-LYMJ36UI.js} +2 -2
  136. package/dist/chunk-M4DB6ZNN.js +87 -0
  137. package/dist/chunk-M4DB6ZNN.js.map +1 -0
  138. package/dist/{chunk-5TKHJ5RW.js → chunk-MMQVWKFY.js} +17 -13
  139. package/dist/chunk-MMQVWKFY.js.map +1 -0
  140. package/dist/{chunk-IAT5WFEU.js → chunk-MNG536IS.js} +261 -797
  141. package/dist/chunk-MNG536IS.js.map +1 -0
  142. package/dist/{chunk-AOMUIF3R.js → chunk-MQT3WP3F.js} +2 -2
  143. package/dist/{chunk-F6AYWLRN.js → chunk-NE45P3OF.js} +2 -2
  144. package/dist/{chunk-5XTILJRI.js → chunk-NMA7RQPR.js} +2 -2
  145. package/dist/{chunk-46A4RGBC.js → chunk-OS4JVTHR.js} +3 -3
  146. package/dist/{chunk-W6YDAIVB.js → chunk-OSTXIFZW.js} +13 -2
  147. package/dist/chunk-OSTXIFZW.js.map +1 -0
  148. package/dist/chunk-P3YNEMYY.js +212 -0
  149. package/dist/chunk-P3YNEMYY.js.map +1 -0
  150. package/dist/{chunk-C3YEB7CR.js → chunk-PA67GXYJ.js} +5 -5
  151. package/dist/{chunk-NGAFYIHQ.js → chunk-PPJLJD2D.js} +2 -2
  152. package/dist/{chunk-AG6PANBG.js → chunk-PXJ6HE2W.js} +11 -11
  153. package/dist/{chunk-BOWAP64Q.js → chunk-QB4VXCFN.js} +2 -2
  154. package/dist/{chunk-L63M2PE4.js → chunk-QGAKUOKU.js} +2 -2
  155. package/dist/{chunk-T2ZNUWUY.js → chunk-QKFYJVDG.js} +2 -2
  156. package/dist/{chunk-YHSEUZV5.js → chunk-QLCMOHRE.js} +2 -2
  157. package/dist/{chunk-Q4AUIFUA.js → chunk-QMWKENNK.js} +4 -4
  158. package/dist/{chunk-UJXNBZYJ.js → chunk-R4JTUTU6.js} +12 -5
  159. package/dist/chunk-R4JTUTU6.js.map +1 -0
  160. package/dist/{chunk-TFS5FAAC.js → chunk-ROBGBT3D.js} +213 -77
  161. package/dist/chunk-ROBGBT3D.js.map +1 -0
  162. package/dist/{chunk-TNQR7N52.js → chunk-S3YM4SZQ.js} +2 -1
  163. package/dist/chunk-S3YM4SZQ.js.map +1 -0
  164. package/dist/{chunk-RW4QNB4J.js → chunk-S45INSV3.js} +3 -1
  165. package/dist/{chunk-RW4QNB4J.js.map → chunk-S45INSV3.js.map} +1 -1
  166. package/dist/{chunk-HVGCQMTQ.js → chunk-SJ7ZNUXB.js} +2 -2
  167. package/dist/{chunk-WCQ7L54B.js → chunk-SK6HEQTW.js} +2 -2
  168. package/dist/{chunk-PGAB2V53.js → chunk-SMBWBEE7.js} +2 -2
  169. package/dist/{chunk-SPN5YFXN.js → chunk-SS33RR4F.js} +8 -8
  170. package/dist/{chunk-NRFUYVW7.js → chunk-T3T5HTZZ.js} +2 -2
  171. package/dist/{chunk-KG2OOAFF.js → chunk-TQSCR5DU.js} +6 -6
  172. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  173. package/dist/{chunk-ZLVURGAJ.js → chunk-V2XNMIAM.js} +2 -2
  174. package/dist/{chunk-AS2NOPDM.js → chunk-V7IONNTJ.js} +2 -2
  175. package/dist/{chunk-OFBJD3V5.js → chunk-VV5GCNKG.js} +2 -2
  176. package/dist/{chunk-MDYZCPNQ.js → chunk-WL3PGPGU.js} +2 -2
  177. package/dist/{chunk-66YUOI53.js → chunk-WQW6KPVC.js} +1 -1
  178. package/dist/chunk-WQW6KPVC.js.map +1 -0
  179. package/dist/{chunk-2AV75BJW.js → chunk-WVI43D54.js} +24 -1
  180. package/dist/chunk-WVI43D54.js.map +1 -0
  181. package/dist/{chunk-N6I257OM.js → chunk-WYU66IVZ.js} +3 -3
  182. package/dist/{chunk-A7GQBJP5.js → chunk-X2NFFBTO.js} +4 -4
  183. package/dist/{chunk-D3DJYGU2.js → chunk-XEHLYA5Z.js} +3 -3
  184. package/dist/{chunk-JIWZVOQM.js → chunk-XKHRNAK7.js} +2 -2
  185. package/dist/{chunk-VW5TGNJN.js → chunk-XXLH6KFO.js} +2 -2
  186. package/dist/{chunk-WMTYEQO5.js → chunk-XZUHXKM3.js} +2 -2
  187. package/dist/{chunk-K4KE5MYE.js → chunk-Y5VT7BIT.js} +2 -2
  188. package/dist/{chunk-M7ECD3KN.js → chunk-YOSLKZLZ.js} +2 -2
  189. package/dist/{chunk-K75H7FSO.js → chunk-YXWMZAAN.js} +2 -2
  190. package/dist/{chunk-DSHSQGSN.js → chunk-ZEIJQ4I3.js} +2 -2
  191. package/dist/{cli-CZDhIcxu.d.ts → cli-B8YyIrPR.d.ts} +5 -5
  192. package/dist/cli.d.ts +17 -16
  193. package/dist/cli.js +81 -76
  194. package/dist/coding/export-okf-codegraph.d.ts +1 -1
  195. package/dist/coding/export-okf-codegraph.js +12 -12
  196. package/dist/coding/pre-action-gate.d.ts +1 -1
  197. package/dist/compounding/engine.d.ts +2 -2
  198. package/dist/compounding/engine.js +13 -13
  199. package/dist/compounding/preference-consolidator.d.ts +1 -1
  200. package/dist/compression-optimizer.d.ts +1 -1
  201. package/dist/config.d.ts +1 -1
  202. package/dist/config.js +3 -2
  203. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  204. package/dist/connectors/codex-materialize-runner.js +13 -13
  205. package/dist/connectors/codex-materialize.d.ts +1 -1
  206. package/dist/connectors/index.d.ts +1 -1
  207. package/dist/connectors/index.js +13 -13
  208. package/dist/consolidation-provenance-check.d.ts +2 -2
  209. package/dist/consolidation-undo.d.ts +2 -2
  210. package/dist/contradiction/index.d.ts +4 -4
  211. package/dist/converge-config.d.ts +1 -1
  212. package/dist/convergence-refresh.d.ts +2 -2
  213. package/dist/convergence-refresh.js +15 -15
  214. package/dist/conversation-index/backend.d.ts +1 -1
  215. package/dist/conversation-index/chunker.d.ts +1 -1
  216. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  217. package/dist/conversation-index/indexer.d.ts +1 -1
  218. package/dist/conversation-index/search.d.ts +1 -1
  219. package/dist/corpus-watermark.d.ts +1 -1
  220. package/dist/corpus-watermark.js +15 -15
  221. package/dist/cross-lingual-recall.d.ts +1 -1
  222. package/dist/day-summary.d.ts +1 -1
  223. package/dist/deep-recall-http-glue.d.ts +15 -14
  224. package/dist/deep-recall-mcp-tools.d.ts +15 -14
  225. package/dist/deep-recall-policy-llm.d.ts +2 -2
  226. package/dist/deep-recall-seeds.d.ts +1 -1
  227. package/dist/deep-recall.js +2 -2
  228. package/dist/delinearize.d.ts +1 -1
  229. package/dist/dependency-propagation-config.d.ts +1 -1
  230. package/dist/{dependency-propagation-delivery-BXaUoVUf.d.ts → dependency-propagation-delivery-B-LvcDaq.d.ts} +1 -1
  231. package/dist/direct-answer-wiring.d.ts +1 -1
  232. package/dist/direct-answer.d.ts +1 -1
  233. package/dist/embedding-fallback.d.ts +1 -1
  234. package/dist/enrichment/index.d.ts +1 -1
  235. package/dist/entity-origin-fields.d.ts +1 -1
  236. package/dist/entity-retrieval.d.ts +2 -2
  237. package/dist/entity-retrieval.js +13 -13
  238. package/dist/entity-schema.d.ts +1 -1
  239. package/dist/episodic-context.d.ts +1 -1
  240. package/dist/eval-trajectory-contracts.d.ts +1 -1
  241. package/dist/eval-trajectory-store.d.ts +1 -1
  242. package/dist/eval-trajectory.d.ts +1 -1
  243. package/dist/explicit-capture.d.ts +11 -11
  244. package/dist/explicit-capture.js +2 -2
  245. package/dist/external-wiki-access.d.ts +15 -14
  246. package/dist/external-wiki-access.js +41 -40
  247. package/dist/external-wiki-collection-registration.d.ts +1 -1
  248. package/dist/external-wiki-collection.d.ts +1 -1
  249. package/dist/external-wiki-mcp-tools.d.ts +15 -14
  250. package/dist/extraction-error-classification.d.ts +1 -1
  251. package/dist/extraction-evidence-class.d.ts +142 -0
  252. package/dist/extraction-evidence-class.js +113 -0
  253. package/dist/extraction-evidence-class.js.map +1 -0
  254. package/dist/extraction-faithfulness.d.ts +2 -2
  255. package/dist/extraction-judge-telemetry.d.ts +2 -2
  256. package/dist/extraction-judge-training.d.ts +2 -2
  257. package/dist/extraction-judge.d.ts +2 -2
  258. package/dist/extraction-liveness.d.ts +1 -1
  259. package/dist/extraction-normalization.d.ts +1 -1
  260. package/dist/extraction-prompt.d.ts +1 -1
  261. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  262. package/dist/extraction-source-grounding.d.ts +1 -1
  263. package/dist/extraction-source-grounding.js +2 -2
  264. package/dist/extraction-span-config.d.ts +1 -1
  265. package/dist/extraction-span-materialize.d.ts +1 -1
  266. package/dist/extraction-span-wire.d.ts +1 -1
  267. package/dist/extraction.d.ts +2 -2
  268. package/dist/extraction.js +21 -21
  269. package/dist/fallback-llm-codex-subscription.d.ts +1 -1
  270. package/dist/fallback-llm.d.ts +1 -1
  271. package/dist/{generic-recall-paths-BkVVEoeO.d.ts → generic-recall-paths-Bfc7zigS.d.ts} +1 -1
  272. package/dist/graph-append-error.d.ts +1 -1
  273. package/dist/graph-dashboard-diff.d.ts +1 -1
  274. package/dist/graph-dashboard-key.d.ts +1 -1
  275. package/dist/graph-dashboard-parser.d.ts +1 -1
  276. package/dist/graph-edge-reinforcement.d.ts +1 -1
  277. package/dist/graph-jsonl.d.ts +1 -1
  278. package/dist/graph-path-reconstruction.d.ts +1 -1
  279. package/dist/graph-path-scoring.d.ts +1 -1
  280. package/dist/graph-snapshot.d.ts +1 -1
  281. package/dist/graph.d.ts +1 -1
  282. package/dist/harmonic-retrieval.js +1 -1
  283. package/dist/importance.d.ts +1 -1
  284. package/dist/importers/index.d.ts +1 -1
  285. package/dist/importers/test-utils.d.ts +1 -1
  286. package/dist/in-flight-reads.d.ts +1 -1
  287. package/dist/{index-TBPe6NvB.d.ts → index-C7IA1DxB.d.ts} +3 -3
  288. package/dist/index.d.ts +121 -30
  289. package/dist/index.js +170 -123
  290. package/dist/intent.d.ts +1 -1
  291. package/dist/lcm/engine.d.ts +1 -1
  292. package/dist/lcm/engine.js +2 -2
  293. package/dist/lcm/index.d.ts +1 -1
  294. package/dist/lcm/index.js +4 -4
  295. package/dist/lcm/tools.d.ts +1 -1
  296. package/dist/lifecycle.d.ts +1 -1
  297. package/dist/live-connectors-runner.d.ts +1 -1
  298. package/dist/{local-llm-DdrhmecM.d.ts → local-llm-DH4tWtck.d.ts} +1 -1
  299. package/dist/local-llm-helpers.d.ts +2 -2
  300. package/dist/local-llm.d.ts +2 -2
  301. package/dist/local-llm.js +2 -2
  302. package/dist/local-model-endpoint.d.ts +1 -1
  303. package/dist/location/index.d.ts +5 -5
  304. package/dist/location/index.js +15 -15
  305. package/dist/maintenance/memory-governance.d.ts +1 -1
  306. package/dist/maintenance/memory-governance.js +13 -13
  307. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  308. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +13 -13
  309. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  310. package/dist/maintenance/rebuild-memory-projection.js +14 -14
  311. package/dist/{maintenance-B813YFWJ.d.ts → maintenance-n6yeTQhR.d.ts} +4 -4
  312. package/dist/mcp-memory-inspector-app.d.ts +15 -14
  313. package/dist/mcp-read-only-tools.js +1 -1
  314. package/dist/memory-action-policy.d.ts +1 -1
  315. package/dist/memory-age.d.ts +100 -0
  316. package/dist/memory-age.js +22 -0
  317. package/dist/memory-age.js.map +1 -0
  318. package/dist/memory-browse-http-glue.d.ts +170 -0
  319. package/dist/memory-browse-http-glue.js +9 -0
  320. package/dist/memory-browse-http-glue.js.map +1 -0
  321. package/dist/memory-browse-mcp-tools.d.ts +160 -0
  322. package/dist/memory-browse-mcp-tools.js +8 -0
  323. package/dist/memory-browse-mcp-tools.js.map +1 -0
  324. package/dist/memory-browse-operations.d.ts +2 -0
  325. package/dist/memory-browse-operations.js +246 -0
  326. package/dist/memory-browse-operations.js.map +1 -0
  327. package/dist/memory-browse.d.ts +113 -0
  328. package/dist/memory-browse.js +49 -0
  329. package/dist/memory-browse.js.map +1 -0
  330. package/dist/memory-cache.d.ts +1 -1
  331. package/dist/memory-controller.d.ts +1 -1
  332. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  333. package/dist/memory-projection-store.d.ts +1 -1
  334. package/dist/memory-provenance.d.ts +1 -1
  335. package/dist/memory-snapshot.d.ts +1 -1
  336. package/dist/memory-subject-cli.d.ts +15 -14
  337. package/dist/memory-subject.d.ts +15 -14
  338. package/dist/memory-worth-outcomes.d.ts +2 -2
  339. package/dist/models-json.d.ts +1 -1
  340. package/dist/namespaces/migrate.d.ts +3 -3
  341. package/dist/namespaces/migrate.js +14 -14
  342. package/dist/namespaces/principal.d.ts +1 -1
  343. package/dist/namespaces/search.d.ts +1 -1
  344. package/dist/namespaces/search.js +6 -6
  345. package/dist/namespaces/storage.d.ts +3 -3
  346. package/dist/namespaces/storage.js +13 -13
  347. package/dist/native-knowledge.d.ts +1 -1
  348. package/dist/offline-sync-impression-drain.d.ts +1 -1
  349. package/dist/operator-doctor-corpus.d.ts +1 -1
  350. package/dist/operator-doctor-corpus.js +16 -16
  351. package/dist/operator-doctor-replica.d.ts +1 -1
  352. package/dist/operator-toolkit.d.ts +3 -3
  353. package/dist/operator-toolkit.js +23 -22
  354. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  355. package/dist/orchestration/maintenance.d.ts +4 -4
  356. package/dist/orchestration/maintenance.js +23 -23
  357. package/dist/{orchestrator-BCvQavIS.d.ts → orchestrator-Cirjo3ZB.d.ts} +10 -10
  358. package/dist/orchestrator.d.ts +11 -11
  359. package/dist/orchestrator.js +112 -106
  360. package/dist/patterns-cli.d.ts +1 -1
  361. package/dist/{pipeline-4lqKJZ_0.d.ts → pipeline-DK79FrgH.d.ts} +1 -1
  362. package/dist/policy-runtime.d.ts +1 -1
  363. package/dist/proactive-contention.d.ts +2 -2
  364. package/dist/provenance.d.ts +77 -2
  365. package/dist/provenance.js +7 -3
  366. package/dist/{public-http-NH72a6aa.d.ts → public-http-VB85y0ZH.d.ts} +1 -1
  367. package/dist/{qmd-DnoWaXKb.d.ts → qmd-BT0ErlRS.d.ts} +1 -1
  368. package/dist/qmd-preflight.d.ts +2 -2
  369. package/dist/qmd-recall-cache.d.ts +1 -1
  370. package/dist/qmd.d.ts +2 -2
  371. package/dist/qmd.js +4 -4
  372. package/dist/recall-concurrency-config.d.ts +1 -1
  373. package/dist/recall-disclosure-escalation.d.ts +1 -1
  374. package/dist/recall-explain-renderer.d.ts +1 -1
  375. package/dist/recall-explain-renderer.js +3 -3
  376. package/dist/recall-memory-map.d.ts +1 -1
  377. package/dist/recall-navigate-access.d.ts +1 -1
  378. package/dist/recall-navigate-access.js +2 -2
  379. package/dist/recall-navigate-disclosure.d.ts +1 -1
  380. package/dist/recall-navigate-disclosure.js +2 -2
  381. package/dist/recall-navigate.d.ts +1 -1
  382. package/dist/recall-navigate.js +2 -2
  383. package/dist/recall-navigation-http-glue.d.ts +15 -14
  384. package/dist/recall-navigation-mcp-tools.d.ts +15 -14
  385. package/dist/recall-navigation-operations.js +41 -40
  386. package/dist/recall-navigation-renderer.d.ts +1 -1
  387. package/dist/recall-navigation.d.ts +1 -1
  388. package/dist/recall-navigation.js +40 -39
  389. package/dist/recall-planner-llm.d.ts +1 -1
  390. package/dist/recall-state-view-admission.d.ts +2 -2
  391. package/dist/recall-state-view-admission.js +5 -5
  392. package/dist/recall-state-view-anchors.d.ts +1 -1
  393. package/dist/recall-state.d.ts +1 -1
  394. package/dist/recall-tag-filter.d.ts +1 -1
  395. package/dist/recall-timings.d.ts +1 -1
  396. package/dist/recall-xray-cli.d.ts +1 -1
  397. package/dist/recall-xray-cli.js +4 -4
  398. package/dist/recall-xray-renderer.d.ts +1 -1
  399. package/dist/recall-xray-renderer.js +3 -3
  400. package/dist/recall-xray.d.ts +1 -1
  401. package/dist/recall-xray.js +2 -2
  402. package/dist/reconcile/cursor.d.ts +1 -1
  403. package/dist/reconcile/manifest.d.ts +4 -1
  404. package/dist/reconcile/manifest.js +1 -1
  405. package/dist/reconcile/plan.d.ts +1 -1
  406. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  407. package/dist/replay/normalizers/claude.d.ts +1 -1
  408. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  409. package/dist/replay/normalizers/shared.d.ts +1 -1
  410. package/dist/replay/runner.d.ts +1 -1
  411. package/dist/replay/types.d.ts +1 -1
  412. package/dist/replica-divergence.d.ts +1 -1
  413. package/dist/replica-peers-config.d.ts +1 -1
  414. package/dist/resolve-auth-token.d.ts +1 -1
  415. package/dist/resume-bundles.js +4 -3
  416. package/dist/retrieval-agents.d.ts +2 -2
  417. package/dist/retrieval-tiers.d.ts +1 -1
  418. package/dist/routing/engine.d.ts +1 -1
  419. package/dist/routing/store.d.ts +1 -1
  420. package/dist/salvage-envelope.d.ts +1 -1
  421. package/dist/{scope-profiles-crazXegZ.d.ts → scope-profiles-BgPQx9iE.d.ts} +1 -1
  422. package/dist/search/embed-helper.d.ts +1 -1
  423. package/dist/search/factory.d.ts +1 -1
  424. package/dist/search/factory.js +5 -5
  425. package/dist/search/index.d.ts +1 -1
  426. package/dist/search/index.js +9 -9
  427. package/dist/search/lancedb-backend.d.ts +1 -1
  428. package/dist/search/meilisearch-backend.d.ts +1 -1
  429. package/dist/search/noop-backend.d.ts +1 -1
  430. package/dist/search/orama-backend.d.ts +1 -1
  431. package/dist/search/port.d.ts +1 -1
  432. package/dist/search/remote-backend.d.ts +1 -1
  433. package/dist/{semantic-consolidation-B09JI9WM.d.ts → semantic-consolidation-BrAWKVcm.d.ts} +1 -1
  434. package/dist/semantic-consolidation.d.ts +2 -2
  435. package/dist/semantic-consolidation.js +14 -14
  436. package/dist/semantic-rule-promotion.js +13 -13
  437. package/dist/semantic-rule-verifier.d.ts +1 -1
  438. package/dist/semantic-rule-verifier.js +13 -13
  439. package/dist/{service-Echc5Xso.d.ts → service-CqHOTg87.d.ts} +2 -2
  440. package/dist/session-observer-bands.d.ts +1 -1
  441. package/dist/session-observer-state.d.ts +1 -1
  442. package/dist/shared-context/manager.d.ts +1 -1
  443. package/dist/signal.d.ts +1 -1
  444. package/dist/source-agent-qualifier.d.ts +1 -1
  445. package/dist/source-agent-qualifier.js +17 -17
  446. package/dist/standing-memory-block.d.ts +77 -0
  447. package/dist/standing-memory-block.js +40 -0
  448. package/dist/standing-memory-block.js.map +1 -0
  449. package/dist/standup/build.js +13 -13
  450. package/dist/{storage-ClkHCQSE.d.ts → storage-mD2YQ8_2.d.ts} +17 -3
  451. package/dist/storage.d.ts +2 -2
  452. package/dist/storage.js +12 -12
  453. package/dist/subject-config.d.ts +1 -1
  454. package/dist/summarizer.d.ts +1 -1
  455. package/dist/summarizer.js +3 -3
  456. package/dist/summary-snapshot.d.ts +1 -1
  457. package/dist/support-passport/index.d.ts +18 -17
  458. package/dist/support-passport/index.js +43 -42
  459. package/dist/{tagging-ksktJ60G.d.ts → tagging-CiAVA-ID.d.ts} +2 -2
  460. package/dist/temporal-supersession.d.ts +2 -2
  461. package/dist/temporal-timeline-recall.d.ts +1 -1
  462. package/dist/temporal-validity.d.ts +1 -1
  463. package/dist/threading.d.ts +1 -1
  464. package/dist/tier-migration.d.ts +2 -2
  465. package/dist/tier-routing.d.ts +1 -1
  466. package/dist/topics.d.ts +1 -1
  467. package/dist/transcript.d.ts +1 -1
  468. package/dist/transfer/export-okf.d.ts +1 -1
  469. package/dist/transfer/export-okf.js +13 -13
  470. package/dist/trust-score-stage.d.ts +1 -1
  471. package/dist/trust-score.d.ts +1 -1
  472. package/dist/{types-nmhnJpxx.d.ts → types-DgDaoY61.d.ts} +6 -0
  473. package/dist/types.d.ts +1 -1
  474. package/dist/types.js +1 -1
  475. package/dist/utility-runtime.d.ts +1 -1
  476. package/dist/verified-recall.js +13 -13
  477. package/dist/who-knows-cli.d.ts +15 -14
  478. package/dist/who-knows-cli.js +14 -14
  479. package/dist/who-knows.d.ts +15 -14
  480. package/dist/who-knows.js +13 -13
  481. package/dist/write-envelope.d.ts +1 -1
  482. package/package.json +2 -2
  483. package/src/access-boundary.ts +3 -0
  484. package/src/access-http.ts +2 -2
  485. package/src/access-mcp-output-schemas.ts +25 -0
  486. package/src/access-mcp.ts +3 -3
  487. package/src/access-operations.ts +2 -0
  488. package/src/access-service.ts +6 -1
  489. package/src/access-surface-catalog.test.ts +20 -0
  490. package/src/access-surface-catalog.ts +6 -0
  491. package/src/activity/timeline/index.ts +1 -0
  492. package/src/activity/timeline/journal-recap.test.ts +17 -0
  493. package/src/activity/timeline/journal-recap.ts +19 -6
  494. package/src/activity/timeline/recap-export-range.test.ts +289 -0
  495. package/src/activity/timeline/recap-export-range.ts +169 -0
  496. package/src/activity/timeline/recap-export.test.ts +73 -1
  497. package/src/activity/timeline/recap-export.ts +57 -4
  498. package/src/cli/memory-browse-commands.ts +77 -0
  499. package/src/cli.ts +2 -2
  500. package/src/config.ts +11 -0
  501. package/src/dedup/merge.test.ts +185 -8
  502. package/src/extraction-evidence-class.test.ts +355 -0
  503. package/src/extraction-evidence-class.ts +241 -0
  504. package/src/index.ts +1 -0
  505. package/src/mcp-read-only-tools.ts +3 -0
  506. package/src/memory-age.test.ts +106 -0
  507. package/src/memory-age.ts +196 -0
  508. package/src/memory-browse-http-glue.ts +93 -0
  509. package/src/memory-browse-mcp-tools.ts +57 -0
  510. package/src/memory-browse-operations.ts +88 -0
  511. package/src/memory-browse-surface.test.ts +500 -0
  512. package/src/memory-browse.ts +316 -0
  513. package/src/orchestration/recall-search-pipeline.test.ts +207 -1
  514. package/src/orchestration/recall-search-pipeline.ts +13 -9
  515. package/src/orchestration/semantic-merge-commit-effects.ts +31 -9
  516. package/src/orchestration/semantic-merge-persist.ts +16 -5
  517. package/src/provenance.ts +3 -3
  518. package/src/reconcile/manifest.test.ts +27 -0
  519. package/src/reconcile/manifest.ts +7 -0
  520. package/src/standing-memory-block.test.ts +262 -0
  521. package/src/standing-memory-block.ts +331 -0
  522. package/src/storage/cas-revision-host.ts +22 -0
  523. package/src/storage/cas-revision-store.test.ts +44 -1
  524. package/src/storage/cas-revision-store.ts +23 -0
  525. package/src/storage/tombstone-blocked-capture-sync.ts +26 -1
  526. package/src/storage-frontmatter-cas.test.ts +49 -1
  527. package/src/storage.ts +1 -1
  528. package/src/types.ts +6 -0
  529. package/dist/chunk-2AV75BJW.js.map +0 -1
  530. package/dist/chunk-5TKHJ5RW.js.map +0 -1
  531. package/dist/chunk-66YUOI53.js.map +0 -1
  532. package/dist/chunk-7LKXP4QG.js.map +0 -1
  533. package/dist/chunk-IAT5WFEU.js.map +0 -1
  534. package/dist/chunk-NKDQXDFL.js.map +0 -1
  535. package/dist/chunk-OREGA7GY.js.map +0 -1
  536. package/dist/chunk-SHEHQBCG.js.map +0 -1
  537. package/dist/chunk-TFS5FAAC.js.map +0 -1
  538. package/dist/chunk-TNQR7N52.js.map +0 -1
  539. package/dist/chunk-UJXNBZYJ.js.map +0 -1
  540. package/dist/chunk-W6YDAIVB.js.map +0 -1
  541. /package/dist/{chunk-C3MCMFNV.js.map → chunk-2QX65IEC.js.map} +0 -0
  542. /package/dist/{chunk-HBGSZ62Z.js.map → chunk-3RKVSECD.js.map} +0 -0
  543. /package/dist/{chunk-R4HFCATE.js.map → chunk-4LPIVP77.js.map} +0 -0
  544. /package/dist/{chunk-PW4HTWXL.js.map → chunk-55XWRL6F.js.map} +0 -0
  545. /package/dist/{chunk-E5VOKZQV.js.map → chunk-5KBI2MOC.js.map} +0 -0
  546. /package/dist/{chunk-ZQ533JDE.js.map → chunk-6A6HSXWV.js.map} +0 -0
  547. /package/dist/{chunk-4HTQ76O4.js.map → chunk-7SJCSDQ3.js.map} +0 -0
  548. /package/dist/{chunk-A2YN3FR4.js.map → chunk-7YUX52XZ.js.map} +0 -0
  549. /package/dist/{chunk-LQVXSRAJ.js.map → chunk-B4EGAHHS.js.map} +0 -0
  550. /package/dist/{chunk-EUP4AXIW.js.map → chunk-B6VDWDFN.js.map} +0 -0
  551. /package/dist/{chunk-Z5YNVWRD.js.map → chunk-BMENHAJL.js.map} +0 -0
  552. /package/dist/{chunk-5ZXGH2ZL.js.map → chunk-BXOPUJ3W.js.map} +0 -0
  553. /package/dist/{chunk-J6NEOCQC.js.map → chunk-CD7VTZIG.js.map} +0 -0
  554. /package/dist/{chunk-EC5SVM6H.js.map → chunk-DE4ZGH2N.js.map} +0 -0
  555. /package/dist/{chunk-2LRO73MN.js.map → chunk-DRLZB3CN.js.map} +0 -0
  556. /package/dist/{chunk-Q4MI2KCG.js.map → chunk-EGOWY342.js.map} +0 -0
  557. /package/dist/{chunk-W44T2KHG.js.map → chunk-EWBDJQ5Y.js.map} +0 -0
  558. /package/dist/{chunk-JMBTNVMW.js.map → chunk-FGRJJBFO.js.map} +0 -0
  559. /package/dist/{chunk-OOBUWMPY.js.map → chunk-G2SJRFGP.js.map} +0 -0
  560. /package/dist/{chunk-WGZHSQDV.js.map → chunk-G2XZFGYN.js.map} +0 -0
  561. /package/dist/{chunk-JPNUKKSL.js.map → chunk-GGROFIYX.js.map} +0 -0
  562. /package/dist/{chunk-VA5QRTZX.js.map → chunk-HG74GEVY.js.map} +0 -0
  563. /package/dist/{chunk-WUUGE7QC.js.map → chunk-HS75MCQF.js.map} +0 -0
  564. /package/dist/{chunk-DO6R3LIE.js.map → chunk-I6IJDTRP.js.map} +0 -0
  565. /package/dist/{chunk-T3F2HWIG.js.map → chunk-IO7K7GES.js.map} +0 -0
  566. /package/dist/{chunk-6II55MXS.js.map → chunk-JXLEQIJ7.js.map} +0 -0
  567. /package/dist/{chunk-4XTSKGLX.js.map → chunk-JYXLW22X.js.map} +0 -0
  568. /package/dist/{chunk-IFULZYYQ.js.map → chunk-LIAM7U2J.js.map} +0 -0
  569. /package/dist/{chunk-LZAJONO5.js.map → chunk-LIDJWAQV.js.map} +0 -0
  570. /package/dist/{chunk-B55FYF6F.js.map → chunk-LYMJ36UI.js.map} +0 -0
  571. /package/dist/{chunk-AOMUIF3R.js.map → chunk-MQT3WP3F.js.map} +0 -0
  572. /package/dist/{chunk-F6AYWLRN.js.map → chunk-NE45P3OF.js.map} +0 -0
  573. /package/dist/{chunk-5XTILJRI.js.map → chunk-NMA7RQPR.js.map} +0 -0
  574. /package/dist/{chunk-46A4RGBC.js.map → chunk-OS4JVTHR.js.map} +0 -0
  575. /package/dist/{chunk-C3YEB7CR.js.map → chunk-PA67GXYJ.js.map} +0 -0
  576. /package/dist/{chunk-NGAFYIHQ.js.map → chunk-PPJLJD2D.js.map} +0 -0
  577. /package/dist/{chunk-AG6PANBG.js.map → chunk-PXJ6HE2W.js.map} +0 -0
  578. /package/dist/{chunk-BOWAP64Q.js.map → chunk-QB4VXCFN.js.map} +0 -0
  579. /package/dist/{chunk-L63M2PE4.js.map → chunk-QGAKUOKU.js.map} +0 -0
  580. /package/dist/{chunk-T2ZNUWUY.js.map → chunk-QKFYJVDG.js.map} +0 -0
  581. /package/dist/{chunk-YHSEUZV5.js.map → chunk-QLCMOHRE.js.map} +0 -0
  582. /package/dist/{chunk-Q4AUIFUA.js.map → chunk-QMWKENNK.js.map} +0 -0
  583. /package/dist/{chunk-HVGCQMTQ.js.map → chunk-SJ7ZNUXB.js.map} +0 -0
  584. /package/dist/{chunk-WCQ7L54B.js.map → chunk-SK6HEQTW.js.map} +0 -0
  585. /package/dist/{chunk-PGAB2V53.js.map → chunk-SMBWBEE7.js.map} +0 -0
  586. /package/dist/{chunk-SPN5YFXN.js.map → chunk-SS33RR4F.js.map} +0 -0
  587. /package/dist/{chunk-NRFUYVW7.js.map → chunk-T3T5HTZZ.js.map} +0 -0
  588. /package/dist/{chunk-KG2OOAFF.js.map → chunk-TQSCR5DU.js.map} +0 -0
  589. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  590. /package/dist/{chunk-ZLVURGAJ.js.map → chunk-V2XNMIAM.js.map} +0 -0
  591. /package/dist/{chunk-AS2NOPDM.js.map → chunk-V7IONNTJ.js.map} +0 -0
  592. /package/dist/{chunk-OFBJD3V5.js.map → chunk-VV5GCNKG.js.map} +0 -0
  593. /package/dist/{chunk-MDYZCPNQ.js.map → chunk-WL3PGPGU.js.map} +0 -0
  594. /package/dist/{chunk-N6I257OM.js.map → chunk-WYU66IVZ.js.map} +0 -0
  595. /package/dist/{chunk-A7GQBJP5.js.map → chunk-X2NFFBTO.js.map} +0 -0
  596. /package/dist/{chunk-D3DJYGU2.js.map → chunk-XEHLYA5Z.js.map} +0 -0
  597. /package/dist/{chunk-JIWZVOQM.js.map → chunk-XKHRNAK7.js.map} +0 -0
  598. /package/dist/{chunk-VW5TGNJN.js.map → chunk-XXLH6KFO.js.map} +0 -0
  599. /package/dist/{chunk-WMTYEQO5.js.map → chunk-XZUHXKM3.js.map} +0 -0
  600. /package/dist/{chunk-K4KE5MYE.js.map → chunk-Y5VT7BIT.js.map} +0 -0
  601. /package/dist/{chunk-M7ECD3KN.js.map → chunk-YOSLKZLZ.js.map} +0 -0
  602. /package/dist/{chunk-K75H7FSO.js.map → chunk-YXWMZAAN.js.map} +0 -0
  603. /package/dist/{chunk-DSHSQGSN.js.map → chunk-ZEIJQ4I3.js.map} +0 -0
@@ -0,0 +1,331 @@
1
+ /**
2
+ * Prefix-cache-stable standing memory block (issue #2971, foundation slice).
3
+ *
4
+ * A standing block is a compact, byte-stable index over pinned/high-value
5
+ * memories that a host injects as the FIRST part of the system prompt, so
6
+ * the LLM prefix cache survives across turns. Measured motivation
7
+ * (distill-kura, local OpenAI-compatible server): an identical 4k-token
8
+ * prefix reprices at 0.14 s vs 0.68 s cold, and one changed word at the
9
+ * front costs the whole cache. So the block contains no clock, no date,
10
+ * and no counter — and the builder REFUSES, at build time, any block that
11
+ * carries one instead of discovering slow turns weeks later.
12
+ *
13
+ * Determinism rules (byte-identical between rebuilds):
14
+ * - line order is band rank, then id codepoint order — never wall clock,
15
+ * never insertion order, never locale collation;
16
+ * - `nowMs` classifies bands but never renders into the text;
17
+ * - the trimmed-tail marker is a constant string (no count of dropped
18
+ * lines, which would itself be a counter).
19
+ *
20
+ * Host contract for the full feature (later wiring slices):
21
+ * - rebuild only when the underlying store changes (store version), not
22
+ * per turn and not on a timer — band edges must not drift mid-session;
23
+ * - inject the standing block BEFORE per-turn dynamic recall and any
24
+ * ticking content (persona with a clock), see docs/config-reference.md;
25
+ * - selection of which memories qualify (pinned/high-value) happens
26
+ * before this builder — it only layers and renders what it is given;
27
+ * - on build failure (volatility, budget) skip injection and log — the
28
+ * dynamic recall surface must not go blank.
29
+ *
30
+ * Pure: no I/O, inputs never mutated, the returned ledger is a fresh Map.
31
+ */
32
+ import { coerceBooleanLike, coerceNumber } from "./connectors/coerce.js";
33
+
34
+ export const DEFAULT_RECALL_STANDING_BLOCK = false;
35
+ export const DEFAULT_STANDING_BLOCK_FRESH_DAYS = 14;
36
+ export const DEFAULT_STANDING_BLOCK_MAX_CHARS = 2048;
37
+ /** ~24-token recognition hook at the repo's 4-chars-per-token Latin headroom. */
38
+ export const DEFAULT_STANDING_BLOCK_HOOK_CHARS = 96;
39
+
40
+ export const STANDING_BLOCK_HEADER = "## Standing Memory (Remnic)";
41
+ export const STANDING_BLOCK_INSTRUCTION =
42
+ "Use this standing index for orientation. It changes only when the memory store changes.";
43
+ export const STANDING_BLOCK_TRIMMED_MARKER = "- ...(older lines trimmed)";
44
+
45
+ export type StandingBand = "pinned" | "fresh" | "compressed";
46
+
47
+ export interface StandingMemoryEntry {
48
+ /** Stable document id. Total order within a band is id codepoint order. */
49
+ id: string;
50
+ /** The one-line description to stand in the index. */
51
+ description: string;
52
+ /** Pinned entries render in full, first band, never trimmed away. */
53
+ pinned?: boolean;
54
+ /** ISO timestamp of the last content change; drives the fresh band. */
55
+ lastChangedAt?: string;
56
+ }
57
+
58
+ /** Cache of compressed hooks keyed on `${description}\u0000${hookMaxChars}`. */
59
+ export type StandingHookLedger = ReadonlyMap<string, string>;
60
+
61
+ export function standingHookLedgerKey(description: string, hookMaxChars: number): string {
62
+ return `${description}\u0000${hookMaxChars}`;
63
+ }
64
+
65
+ export interface StandingBlockBandCounts {
66
+ pinned: number;
67
+ fresh: number;
68
+ compressed: number;
69
+ dropped: number;
70
+ }
71
+
72
+ export interface StandingMemoryBlock {
73
+ /** Full block text (header + lines + instruction). Empty string for no entries. */
74
+ text: string;
75
+ /** Lines without a trailing newline; empty for no entries. */
76
+ lines: string[];
77
+ /** Ledger including hooks generated this build. Fresh Map; input never mutated. */
78
+ ledger: StandingHookLedger;
79
+ bandCounts: StandingBlockBandCounts;
80
+ }
81
+
82
+ export type StandingVolatilityKind = "iso-date" | "clock-time" | "relative-date" | "counter";
83
+
84
+ export interface StandingVolatilityMatch {
85
+ kind: StandingVolatilityKind;
86
+ token: string;
87
+ }
88
+
89
+ const ISO_DATE_RE = /\b\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2})?/;
90
+ const CLOCK_TIME_RE = /\b\d{1,2}:\d{2}(?::\d{2})?\b/;
91
+ const RELATIVE_DATE_RE =
92
+ /\b(?:today|tonight|tomorrow|yesterday|this\s+(?:morning|afternoon|evening|week|month|year))\b/i;
93
+ const COUNTER_RE = /\b(?:count|total|entries|memories|items)\s*[:=]\s*\d+\b/i;
94
+
95
+ /**
96
+ * Build-time volatility lint. Returns every cache-busting token class found:
97
+ * ISO dates/datetimes, clock times, relative date words, and index counters.
98
+ * Refusal is the designed behavior (a memory surface skips the block and
99
+ * logs) — a silently repricing prefix is the failure this catches.
100
+ */
101
+ export function lintStandingBlockVolatility(text: string): StandingVolatilityMatch[] {
102
+ const matches: StandingVolatilityMatch[] = [];
103
+ for (const [kind, re] of [
104
+ ["iso-date", ISO_DATE_RE],
105
+ ["clock-time", CLOCK_TIME_RE],
106
+ ["relative-date", RELATIVE_DATE_RE],
107
+ ["counter", COUNTER_RE],
108
+ ] as const) {
109
+ const hit = text.match(re);
110
+ if (hit) matches.push({ kind, token: hit[0] });
111
+ }
112
+ return matches;
113
+ }
114
+
115
+ export class StandingBlockError extends Error {
116
+ constructor(message: string) {
117
+ super(message);
118
+ this.name = "StandingBlockError";
119
+ }
120
+ }
121
+
122
+ export class StandingBlockVolatilityError extends StandingBlockError {
123
+ readonly matches: readonly StandingVolatilityMatch[];
124
+ constructor(matches: readonly StandingVolatilityMatch[]) {
125
+ super(
126
+ `standing memory block refused: volatile content busts the prefix cache (${matches
127
+ .map((m) => `${m.kind}:${JSON.stringify(m.token)}`)
128
+ .join(", ")})`,
129
+ );
130
+ this.name = "StandingBlockVolatilityError";
131
+ this.matches = matches;
132
+ }
133
+ }
134
+
135
+ export class StandingBlockBudgetError extends StandingBlockError {
136
+ constructor(maxChars: number) {
137
+ super(
138
+ `standing memory block does not fit: pinned lines alone exceed maxChars=${maxChars}; raise standingBlockMaxChars or unpin entries`,
139
+ );
140
+ this.name = "StandingBlockBudgetError";
141
+ }
142
+ }
143
+
144
+ export function parseRecallStandingBlock(raw: unknown): boolean {
145
+ return coerceBooleanLike(raw, "recallStandingBlock") === true;
146
+ }
147
+
148
+ export function parseStandingBlockFreshDays(raw: unknown): number {
149
+ if (raw === undefined || raw === null) return DEFAULT_STANDING_BLOCK_FRESH_DAYS;
150
+ const n = coerceNumber(raw, "standingBlockFreshDays");
151
+ if (n === undefined || !Number.isFinite(n) || n < 0) {
152
+ throw new Error(`Invalid standingBlockFreshDays: expected a number >= 0, got ${JSON.stringify(raw)}`);
153
+ }
154
+ return n;
155
+ }
156
+
157
+ export function parseStandingBlockMaxChars(raw: unknown): number {
158
+ if (raw === undefined || raw === null) return DEFAULT_STANDING_BLOCK_MAX_CHARS;
159
+ const n = coerceNumber(raw, "standingBlockMaxChars");
160
+ if (n === undefined || !Number.isFinite(n) || n < 1) {
161
+ throw new Error(`Invalid standingBlockMaxChars: expected an integer >= 1, got ${JSON.stringify(raw)}`);
162
+ }
163
+ return Math.floor(n);
164
+ }
165
+
166
+ /**
167
+ * Mechanical hook: deterministic first-cut of the description to the char
168
+ * budget at a word boundary. This is also the fallback when no model is
169
+ * reachable for compression — the standing surface never goes blank because
170
+ * a model is down. Model-generated hooks arrive pre-seeded in the ledger.
171
+ */
172
+ function mechanicalHook(description: string, budget: number): string {
173
+ if (description.length <= budget) return description;
174
+ const cut = description.slice(0, budget);
175
+ const lastSpace = cut.lastIndexOf(" ");
176
+ const base = lastSpace > Math.floor(budget * 0.6) ? cut.slice(0, lastSpace) : cut;
177
+ return `${base.replace(/[\s,;:]+$/, "")}...`;
178
+ }
179
+
180
+ interface LayeredEntry {
181
+ id: string;
182
+ band: StandingBand;
183
+ line: string;
184
+ }
185
+
186
+ const BAND_RANK: Record<StandingBand, number> = { pinned: 0, fresh: 1, compressed: 2 };
187
+
188
+ function validateEntries(entries: readonly StandingMemoryEntry[]): Map<string, StandingMemoryEntry> {
189
+ if (!Array.isArray(entries)) {
190
+ throw new StandingBlockError("standing memory block entries must be an array");
191
+ }
192
+ const seen = new Set<string>();
193
+ const validated = new Map<string, StandingMemoryEntry>();
194
+ for (const entry of entries) {
195
+ if (typeof entry !== "object" || entry === null) {
196
+ throw new StandingBlockError(`standing memory block entry must be an object, got ${JSON.stringify(entry)}`);
197
+ }
198
+ const id = typeof entry.id === "string" ? entry.id.trim() : "";
199
+ const description = typeof entry.description === "string" ? entry.description.trim() : "";
200
+ if (id.length === 0) {
201
+ throw new StandingBlockError("standing memory block entry requires a non-empty id");
202
+ }
203
+ if (description.length === 0) {
204
+ throw new StandingBlockError(`standing memory block entry ${id} requires a non-empty description`);
205
+ }
206
+ if (seen.has(id)) {
207
+ throw new StandingBlockError(`standing memory block entry ids must be unique; duplicate: ${id}`);
208
+ }
209
+ if (entry.lastChangedAt !== undefined && Number.isNaN(Date.parse(entry.lastChangedAt))) {
210
+ throw new StandingBlockError(
211
+ `standing memory block entry ${id} has an unparseable lastChangedAt: ${JSON.stringify(entry.lastChangedAt)}`,
212
+ );
213
+ }
214
+ seen.add(id);
215
+ validated.set(id, { ...entry, id, description });
216
+ }
217
+ return validated;
218
+ }
219
+
220
+ export interface StandingMemoryBlockInput {
221
+ entries: readonly StandingMemoryEntry[];
222
+ /**
223
+ * Evaluation instant for the fresh band. Hosts must key rebuilds on the
224
+ * store version, not on this clock, or band edges drift per turn.
225
+ */
226
+ nowMs: number;
227
+ freshDays?: number;
228
+ maxChars?: number;
229
+ hookMaxChars?: number;
230
+ ledger?: StandingHookLedger;
231
+ }
232
+
233
+ export function buildStandingMemoryBlock(input: StandingMemoryBlockInput): StandingMemoryBlock {
234
+ const freshDays = input.freshDays ?? DEFAULT_STANDING_BLOCK_FRESH_DAYS;
235
+ const maxChars = input.maxChars ?? DEFAULT_STANDING_BLOCK_MAX_CHARS;
236
+ const hookMaxChars = input.hookMaxChars ?? DEFAULT_STANDING_BLOCK_HOOK_CHARS;
237
+ if (!Number.isFinite(input.nowMs)) {
238
+ throw new StandingBlockError("standing memory block requires a finite nowMs");
239
+ }
240
+ if (!(freshDays >= 0) || !Number.isFinite(freshDays)) {
241
+ throw new StandingBlockError("standing memory block requires freshDays >= 0");
242
+ }
243
+ if (!(maxChars >= 1) || !Number.isFinite(maxChars)) {
244
+ throw new StandingBlockError("standing memory block requires maxChars >= 1");
245
+ }
246
+ if (!(hookMaxChars >= 1) || !Number.isFinite(hookMaxChars)) {
247
+ throw new StandingBlockError("standing memory block requires hookMaxChars >= 1");
248
+ }
249
+
250
+ const entries = validateEntries(input.entries);
251
+ const ledger = new Map(input.ledger ?? []);
252
+ if (entries.size === 0) {
253
+ return {
254
+ text: "",
255
+ lines: [],
256
+ ledger,
257
+ bandCounts: { pinned: 0, fresh: 0, compressed: 0, dropped: 0 },
258
+ };
259
+ }
260
+
261
+ const freshCutoff = input.nowMs - freshDays * 86_400_000;
262
+ const layered: LayeredEntry[] = [];
263
+ for (const entry of entries.values()) {
264
+ let band: StandingBand;
265
+ if (entry.pinned === true) {
266
+ band = "pinned";
267
+ } else if (
268
+ typeof entry.lastChangedAt === "string" &&
269
+ Date.parse(entry.lastChangedAt) >= freshCutoff &&
270
+ Date.parse(entry.lastChangedAt) <= input.nowMs
271
+ ) {
272
+ band = "fresh";
273
+ } else {
274
+ band = "compressed";
275
+ }
276
+ if (band !== "compressed") {
277
+ layered.push({ id: entry.id, band, line: `- ${entry.description}` });
278
+ continue;
279
+ }
280
+ const key = standingHookLedgerKey(entry.description, hookMaxChars);
281
+ const cached = ledger.get(key);
282
+ const hook = cached ?? mechanicalHook(entry.description, hookMaxChars);
283
+ if (cached === undefined) ledger.set(key, hook);
284
+ layered.push({ id: entry.id, band, line: `- ${hook}` });
285
+ }
286
+
287
+ // Band rank, then id codepoint order. Never localeCompare: collation is
288
+ // ICU-dependent and this text must be byte-identical across rebuilds.
289
+ layered.sort(
290
+ (a, b) =>
291
+ BAND_RANK[a.band] - BAND_RANK[b.band] || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0),
292
+ );
293
+
294
+ const render = (keep: number, withMarker: boolean): { text: string; lines: string[] } => {
295
+ const body = layered.slice(0, keep).map((item) => item.line);
296
+ if (withMarker) body.push(STANDING_BLOCK_TRIMMED_MARKER);
297
+ const lines = [STANDING_BLOCK_HEADER, "", ...body, "", STANDING_BLOCK_INSTRUCTION];
298
+ return { text: lines.join("\n"), lines };
299
+ };
300
+
301
+ const pinnedCount = layered.filter((item) => item.band === "pinned").length;
302
+ let keep = layered.length;
303
+ let rendered = render(keep, false);
304
+ // Mechanical trim: drop from the tail. The sort puts compressed lines
305
+ // last, so oldest-band hooks go first and pinned lines are never reached.
306
+ while (rendered.text.length > maxChars && keep > pinnedCount) {
307
+ keep -= 1;
308
+ rendered = render(keep, true);
309
+ }
310
+ if (rendered.text.length > maxChars) {
311
+ throw new StandingBlockBudgetError(maxChars);
312
+ }
313
+
314
+ const volatility = lintStandingBlockVolatility(rendered.text);
315
+ if (volatility.length > 0) {
316
+ throw new StandingBlockVolatilityError(volatility);
317
+ }
318
+
319
+ const kept = layered.slice(0, keep);
320
+ return {
321
+ text: rendered.text,
322
+ lines: rendered.lines,
323
+ ledger,
324
+ bandCounts: {
325
+ pinned: kept.filter((item) => item.band === "pinned").length,
326
+ fresh: kept.filter((item) => item.band === "fresh").length,
327
+ compressed: kept.filter((item) => item.band === "compressed").length,
328
+ dropped: layered.length - keep,
329
+ },
330
+ };
331
+ }
@@ -72,4 +72,26 @@ export class CasRevisionHost extends CasRevisionStore {
72
72
  await this.recoverPendingRevision(pathname);
73
73
  return await this.beginRevisionTransaction(pathname, expectedContent);
74
74
  }
75
+
76
+ /** #2837: best-effort post-deletion sweep of the target's receipt shard.
77
+ * The durable memory file is already gone, so a failed sweep must never
78
+ * fail the deletion itself — it logs instead. A PENDING shard (crash
79
+ * recovery evidence) and a foreign shard (another target's receipt) are
80
+ * kept, with a warning naming the recovery path. */
81
+ async sweepShardAfterDeletion(filePath: string): Promise<void> {
82
+ try {
83
+ const outcome = await this.removeRevisionShard(filePath);
84
+ if (outcome === "pending") {
85
+ log.warn(
86
+ `CAS revision shard for ${filePath} kept after memory deletion: a pending reservation stands — run recovery before the path is reused`,
87
+ );
88
+ } else if (outcome === "foreign") {
89
+ log.warn(
90
+ `CAS revision shard for ${filePath} kept after memory deletion: the shard names another target`,
91
+ );
92
+ }
93
+ } catch (err) {
94
+ log.warn(`failed to sweep CAS revision shard for deleted memory ${filePath}: ${err}`);
95
+ }
96
+ }
75
97
  }
@@ -1,6 +1,6 @@
1
1
  import assert from "node:assert/strict";
2
2
  import { createHash } from "node:crypto";
3
- import { mkdir, mkdtemp, readFile, readdir, rm, symlink, writeFile } from "node:fs/promises";
3
+ import { mkdir, mkdtemp, readFile, readdir, rm, stat, symlink, writeFile } from "node:fs/promises";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
6
6
  import test from "node:test";
@@ -461,3 +461,46 @@ test("legacy landed pending whose file no longer matches expectedDigest is ambig
461
461
  assert.equal((await store.readRevisionStatus(target)).status, "unavailable");
462
462
  });
463
463
  });
464
+
465
+ test("removeRevisionShard sweeps a committed shard, keeps pending evidence, never touches a foreign shard (#2837)", async () => {
466
+ await withStore(async (store, root) => {
467
+ const target = path.join(root, "memories", "fact-deleted.md");
468
+ const shard = shardPathFor(root, target);
469
+ const shardExists = async () =>
470
+ stat(shard).then(
471
+ () => true,
472
+ () => false,
473
+ );
474
+
475
+ // No receipt was ever minted: the sweep reports absence, not an error.
476
+ assert.equal(await store.removeRevisionShard(target), "absent");
477
+
478
+ const a = await store.beginRevisionTransaction(target);
479
+ await a.commit();
480
+ assert.equal(await shardExists(), true);
481
+ assert.equal(await store.removeRevisionShard(target), "removed");
482
+ assert.equal(await shardExists(), false, "the committed shard is gone once its memory is deleted");
483
+ assert.equal((await store.readRevisionStatus(target)).status, "absent");
484
+
485
+ // A PENDING marker is crash-recovery evidence: the sweep must keep it.
486
+ const b = await store.beginRevisionTransaction(target);
487
+ assert.equal(await store.removeRevisionShard(target), "pending");
488
+ assert.equal(await shardExists(), true, "the pending marker survives the deletion sweep");
489
+ await b.abort();
490
+
491
+ // A shard naming another target is never destroyed by this target's sweep.
492
+ await mkdir(path.dirname(shard), { recursive: true });
493
+ await writeFile(
494
+ shard,
495
+ `${JSON.stringify({
496
+ version: 1,
497
+ path: "memories/someone-else.md",
498
+ revision: "2026-08-01T00:00:00.000Z",
499
+ state: "committed",
500
+ })}\n`,
501
+ "utf8",
502
+ );
503
+ assert.equal(await store.removeRevisionShard(target), "foreign");
504
+ assert.equal(await shardExists(), true, "a foreign shard is kept — it names another target");
505
+ });
506
+ });
@@ -641,6 +641,29 @@ export class CasRevisionStore {
641
641
  });
642
642
  }
643
643
 
644
+ /** #2837: remove the target's receipt shard once its durable memory file
645
+ * has been deleted, so orphan shards cannot accumulate. Under the shard
646
+ * lock: a PENDING marker is crash-recovery evidence for
647
+ * {@link recoverPendingRevision} and is KEPT ("pending"); a shard naming
648
+ * another target is KEPT ("foreign") — never destroy a receipt you cannot
649
+ * attribute. Never touches the durable memory file or the legacy global
650
+ * metadata: a stale legacy entry keeps per-path monotonicity if the path
651
+ * is ever reused. */
652
+ async removeRevisionShard(
653
+ filePath: string,
654
+ ): Promise<"removed" | "absent" | "pending" | "foreign"> {
655
+ const relativePath = await this.resolveRelativePath(filePath);
656
+ return await this.withShardLock(relativePath, async () => {
657
+ const { shardPath } = await this.getSafeShardInfo(relativePath);
658
+ const view = await this.readShardView(shardPath, relativePath);
659
+ if (view.kind === "missing") return "absent";
660
+ if (view.kind === "pending") return view.foreign ? "foreign" : "pending";
661
+ if (view.kind === "foreign" || view.foreign) return "foreign";
662
+ await unlink(shardPath);
663
+ return "removed";
664
+ });
665
+ }
666
+
644
667
  /** #2813 (P1 C): recovery for a reservation left PENDING by a crash or a
645
668
  * failed publication. The caller supplies the KNOWN outcome of the
646
669
  * durable memory write: `fileWriteLanded` publishes the pending token as
@@ -10,6 +10,7 @@ import { withRawEntityPageMutation } from "./entity-canonical-id-lock.js";
10
10
  import { readMaybeEncryptedFileFromChunks, writeMaybeEncryptedFileFromChunks } from "../secure-store/secure-fs.js";
11
11
  import * as archiveMutation from "../archive-mutation-version.js";
12
12
  import { invalidationCommitFingerprint, isSemanticFrontmatterChange } from "./deletion-revision-store.js";
13
+ import { CasRevisionHost } from "./cas-revision-host.js";
13
14
  import type { CasRevisionTransaction } from "./cas-revision-store.js";
14
15
  import {
15
16
  buildExplicitCaptureDedupKey,
@@ -208,7 +209,11 @@ export abstract class TombstoneBlockedCaptureIndexHost {
208
209
  protected abstract bumpMemoryStatusVersion(): void;
209
210
  protected abstract bumpMemoryCorpusVersion(): void;
210
211
  protected abstract markFactHashIndexNotAuthoritative(): void;
211
- protected abstract deleteManagedStorageFile(filePath: string, deletionMtimeMs?: number | null): Promise<boolean>;
212
+ /** #2837: durable unlink plus deletion-revision record, WITHOUT the CAS
213
+ * shard sweep — the concrete {@link deleteManagedStorageFile} composes the
214
+ * two so every deletion funnel (invalidation, maintenance purge, archive
215
+ * move, offline sync) sweeps. */
216
+ protected abstract deleteManagedStorageFileDurable(filePath: string, deletionMtimeMs?: number | null): Promise<boolean>;
212
217
  protected abstract writeManagedStorageFile(filePath: string, write: () => Promise<void>): Promise<void>;
213
218
 
214
219
  /** #2813 (P1 C, #2807): reserve the target's next durable CAS revision
@@ -221,6 +226,26 @@ export abstract class TombstoneBlockedCaptureIndexHost {
221
226
  return undefined;
222
227
  }
223
228
 
229
+ /** #2837 (shard cleanup): after a managed memory file is durably deleted,
230
+ * sweep its per-target CAS receipt shard so orphan shards cannot grow
231
+ * forever. The sweep runs under the shard's own lock and is best-effort —
232
+ * the memory file is already gone, so a sweep failure logs and never
233
+ * fails the delete. The sweeper is a second CasRevisionHost over the same
234
+ * memory dir; the host is stateless and every mutation serializes through
235
+ * the sidecar's file locks, so it shares the same shard files
236
+ * StorageManager's own host operates on. */
237
+ private deletedMemoryShardSweeper: CasRevisionHost | null = null;
238
+
239
+ protected async deleteManagedStorageFile(filePath: string, deletionMtimeMs?: number | null): Promise<boolean> {
240
+ const deleted = await this.deleteManagedStorageFileDurable(filePath, deletionMtimeMs);
241
+ if (!deleted) return false;
242
+ if (this.deletedMemoryShardSweeper === null) {
243
+ this.deletedMemoryShardSweeper = new CasRevisionHost(this.tombstoneBlockedCaptureIndexOptions().memoryDir);
244
+ }
245
+ await this.deletedMemoryShardSweeper.sweepShardAfterDeletion(filePath);
246
+ return true;
247
+ }
248
+
224
249
  private async writeStorageSecureFileChunks(filePath: string, chunks: AsyncIterable<Buffer>): Promise<void> {
225
250
  const options = this.tombstoneBlockedCaptureIndexOptions();
226
251
  await writeMaybeEncryptedFileFromChunks(
@@ -1,5 +1,5 @@
1
1
  import assert from "node:assert/strict";
2
- import { mkdir, mkdtemp, readdir, readFile, rm, symlink, writeFile } from "node:fs/promises";
2
+ import { mkdir, mkdtemp, readdir, readFile, rm, stat, symlink, writeFile } from "node:fs/promises";
3
3
  import { createHash } from "node:crypto";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
@@ -838,3 +838,51 @@ test("crash after memory write before writeLanded recovers from host-forwarded e
838
838
  );
839
839
  });
840
840
  });
841
+
842
+ test("deleting a memory sweeps its CAS revision shard (#2837)", async () => {
843
+ await withStorageDir(async (dir) => {
844
+ const storage = new StorageManager(dir);
845
+ const created = await storage.writeMemory("fact", "Deletion shard sweep content.", { source: "test" });
846
+ const memory = await storage.getMemoryById(created.id);
847
+ assert.ok(memory);
848
+
849
+ // Mint a standing receipt, then delete the memory through the public
850
+ // invalidation funnel (the same funnel maintenance purge and archive
851
+ // moves use underneath).
852
+ assert.equal(await storage.writeMemoryFrontmatter(memory, { tags: ["sweep"] }), true);
853
+ const shard = casShardPath(dir, memory.path);
854
+ assert.equal((await storage.readCasRevisionStatus(memory.path)).status, "present");
855
+ await stat(shard);
856
+
857
+ assert.equal(await storage.invalidateMemory(created.id), true);
858
+ assert.equal(await stat(shard).then(() => true, () => false), false, "the deleted memory's shard is swept");
859
+ assert.equal(
860
+ (await storage.readCasRevisionStatus(memory.path)).status,
861
+ "absent",
862
+ "no standing receipt survives the memory",
863
+ );
864
+ });
865
+ });
866
+
867
+ test("a pending shard survives memory deletion as recovery evidence, and the delete still succeeds (#2837)", async () => {
868
+ await withStorageDir(async (dir) => {
869
+ const storage = new StorageManager(dir);
870
+ const created = await storage.writeMemory("fact", "Pending shard kept on delete.", { source: "test" });
871
+ const memory = await storage.getMemoryById(created.id);
872
+ assert.ok(memory);
873
+
874
+ // Crash simulation: a reservation left PENDING for this target.
875
+ const seams = storage as unknown as { casRevisions: CasRevisionStore };
876
+ await seams.casRevisions.beginRevisionTransaction(memory.path);
877
+ const shard = casShardPath(dir, memory.path);
878
+ await stat(shard);
879
+
880
+ assert.equal(await storage.invalidateMemory(created.id), true, "the deletion itself never fails on the sweep");
881
+ assert.equal(
882
+ await stat(shard).then(() => true, () => false),
883
+ true,
884
+ "a PENDING marker is crash-recovery evidence and is kept",
885
+ );
886
+ assert.equal((await storage.readCasRevisionStatus(memory.path)).status, "unavailable");
887
+ });
888
+ });
package/src/storage.ts CHANGED
@@ -2732,7 +2732,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
2732
2732
  protected async writeManagedStorageFile(filePath: string, write: () => Promise<void>): Promise<void> {
2733
2733
  return this.deletionRevisionStore.writeManagedStorageFile(filePath, write);
2734
2734
  }
2735
- protected async deleteManagedStorageFile(filePath: string, deletionMtimeMs?: number | null): Promise<boolean> {
2735
+ protected async deleteManagedStorageFileDurable(filePath: string, deletionMtimeMs?: number | null): Promise<boolean> {
2736
2736
  return this.deletionRevisionStore.deleteManagedStorageFile(filePath, deletionMtimeMs);
2737
2737
  }
2738
2738
 
package/src/types.ts CHANGED
@@ -991,6 +991,12 @@ export interface PluginConfig
991
991
  recallDirectAnswerEnabled: boolean;
992
992
  /** Recall state views (issue #1952): label current/historical/transition on change-intent queries. Default false. */
993
993
  recallStateViews: boolean;
994
+ /** Standing memory block (issue #2971): byte-stable pinned-memory index injected before per-turn recall; parsed now, injection lands in a later slice. Default false. */
995
+ recallStandingBlock: boolean;
996
+ /** Days a memory stays in the standing block's full-text fresh band. Default 14. */
997
+ standingBlockFreshDays: number;
998
+ /** Hard character budget for the standing memory block. Default 2048. */
999
+ standingBlockMaxChars: number;
994
1000
  /**
995
1001
  * Disclosure auto-escalation policy (issue #677 PR 4/4). `"auto"`
996
1002
  * escalates chunk → section when top-K confidence falls below
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/access-mcp-output-schemas.ts"],"sourcesContent":["/**\n * Output-schema registry for MCP tools — extracted from access-mcp.ts to\n * keep that file under the 3000-LOC structural ratchet.\n *\n * Contains the per-suffix JSON-Schema declarations (derived from\n * production TS return contracts) and the application helper that\n * assigns schemas to tool objects.\n */\n\nconst T_STRING = { type: \"string\" } as const;\nconst T_NUMBER = { type: \"number\" } as const;\nconst T_BOOLEAN = { type: \"boolean\" } as const;\nconst T_ARRAY = { type: \"array\" } as const;\nconst T_OBJECT = { type: \"object\" } as const;\nconst T_NULLABLE_OBJECT = { type: [\"object\", \"null\"] } as const;\nconst T_NULLABLE_STRING = { type: [\"string\", \"null\"] } as const;\n\n/** Build a JSON Schema object type with the given properties. */\nfunction objectSchema(\n properties: Record<string, Readonly<Record<string, unknown>>>,\n required?: readonly string[]\n): Record<string, unknown> {\n return {\n type: \"object\",\n properties,\n ...(required && required.length > 0 ? { required } : {}),\n additionalProperties: true,\n };\n}\n\n/** RecallNavigationResult-shaped schema — shared by memory_expand/memory_traverse. */\nfunction navigationResultSchema(): Record<string, unknown> {\n return objectSchema(\n {\n ok: T_BOOLEAN,\n action: T_STRING,\n memoryId: T_STRING,\n namespace: T_STRING,\n items: T_ARRAY,\n truncated: T_BOOLEAN,\n budget: objectSchema({ chars: T_NUMBER, used: T_NUMBER }),\n disclosureSpend: objectSchema({\n chunk: objectSchema({ count: T_NUMBER, estimatedTokens: T_NUMBER }),\n section: objectSchema({ count: T_NUMBER, estimatedTokens: T_NUMBER }),\n raw: objectSchema({ count: T_NUMBER, estimatedTokens: T_NUMBER }),\n unspecified: objectSchema({ count: T_NUMBER, estimatedTokens: T_NUMBER }),\n }),\n error: T_NULLABLE_STRING,\n message: T_NULLABLE_STRING,\n rendered: T_STRING,\n },\n [\"ok\", \"action\", \"rendered\"]\n );\n}\n\n/**\n * Per-suffix outputSchema registry. Tools not present here fall back to\n * `{ type: \"object\", additionalProperties: true }` in the constructor pass.\n * The `chatgpt_memory_inspector` tool ships its own precise schema and is\n * intentionally absent — the apply pass skips tools that already have one.\n */\nconst TOOL_OUTPUT_SCHEMAS: Readonly<Record<string, Record<string, unknown>>> = {\n recall: objectSchema({\n query: T_STRING,\n namespace: T_STRING,\n context: T_STRING,\n contextComposition: objectSchema({ context: T_STRING, footer: T_STRING }),\n count: T_NUMBER,\n memoryIds: T_ARRAY,\n results: T_ARRAY,\n fallbackUsed: T_BOOLEAN,\n sourcesUsed: T_ARRAY,\n }),\n recall_explain: objectSchema({\n found: T_BOOLEAN,\n snapshot: T_OBJECT,\n intent: T_NULLABLE_OBJECT,\n graph: T_NULLABLE_OBJECT,\n }),\n recall_tier_explain: objectSchema({ snapshotFound: T_BOOLEAN, tierExplain: T_NULLABLE_OBJECT }),\n recall_xray: objectSchema({ snapshotFound: T_BOOLEAN, snapshot: T_OBJECT }),\n who_knows: objectSchema({ topic: T_STRING, results: T_ARRAY }),\n promotion_candidates: objectSchema({ namespace: T_STRING, targetNamespace: T_STRING, candidates: T_ARRAY }),\n set_coding_context: objectSchema({ ok: T_BOOLEAN }),\n wearables_status: objectSchema({\n enabled: T_BOOLEAN,\n timezone: T_STRING,\n sources: T_ARRAY,\n connectorsInstalled: T_ARRAY,\n }),\n wearables_sync: objectSchema({ summaries: T_ARRAY }, [\"summaries\"]),\n transcript_day: objectSchema({ transcripts: T_ARRAY }, [\"transcripts\"]),\n transcript_search: objectSchema({ results: T_ARRAY }, [\"results\"]),\n transcript_memories: objectSchema({ memories: T_ARRAY }, [\"memories\"]),\n location_status: objectSchema({ enabled: T_BOOLEAN, timezone: T_STRING, sources: T_ARRAY, recentDays: T_ARRAY }),\n location_check: objectSchema({ results: T_ARRAY }, [\"results\"]),\n location_sync: objectSchema({ days: T_ARRAY }, [\"days\"]),\n location_backfill: objectSchema({ days: T_ARRAY }, [\"days\"]),\n location_day: objectSchema({ date: T_STRING, found: T_BOOLEAN, sources: T_ARRAY, observationCount: T_NUMBER }),\n meetings_list: objectSchema({ enabled: T_BOOLEAN, days: T_ARRAY }),\n meetings_get: objectSchema({ enabled: T_BOOLEAN, found: T_BOOLEAN, id: T_STRING, record: T_NULLABLE_STRING }),\n meetings_build: objectSchema({\n date: T_STRING,\n enabled: T_BOOLEAN,\n meetings: T_ARRAY,\n built: T_NUMBER,\n skipped: T_NUMBER,\n removed: T_ARRAY,\n }),\n deep_recall: objectSchema(\n { ok: T_BOOLEAN, error: T_NULLABLE_STRING, entries: T_ARRAY, trace: T_ARRAY, rendered: T_STRING },\n [\"entries\", \"trace\"]\n ),\n // RecallNavigationResult union (recall-navigation.ts): success carries\n // items/budget/disclosureSpend; error carries error/message. ok/action/\n // rendered are the fields every variant returns.\n memory_expand: navigationResultSchema(),\n memory_traverse: navigationResultSchema(),\n standup: objectSchema({\n date: T_STRING,\n yesterday: T_STRING,\n today: T_STRING,\n highlights: T_ARRAY,\n priorities: T_ARRAY,\n blockers: T_ARRAY,\n activityGrid: T_STRING,\n markdown: T_STRING,\n }),\n action_confidence: objectSchema({\n schemaVersion: T_NUMBER,\n decision: T_STRING,\n confidence: T_NUMBER,\n risk: T_STRING,\n contextReadiness: T_STRING,\n intendedAction: T_STRING,\n attentionPolicy: T_STRING,\n principle: T_STRING,\n reasons: T_ARRAY,\n blockers: T_ARRAY,\n factors: T_ARRAY,\n retrievedMemoryCount: T_NUMBER,\n scopeMismatchCount: T_NUMBER,\n safeToAct: T_BOOLEAN,\n }),\n day_summary: objectSchema({\n summary: T_STRING,\n bullets: T_ARRAY,\n next_actions: T_ARRAY,\n risks_or_open_loops: T_ARRAY,\n }),\n capsule_export: objectSchema({\n archivePath: T_STRING,\n manifestPath: T_STRING,\n encryptedArchivePath: T_NULLABLE_STRING,\n manifest: T_OBJECT,\n }),\n capsule_import: objectSchema({ imported: T_ARRAY, skipped: T_ARRAY, manifest: T_OBJECT }),\n capsule_list: objectSchema({ namespace: T_STRING, capsulesDir: T_STRING, capsules: T_ARRAY }),\n entity_synthesis_run: objectSchema({\n namespace: T_STRING,\n requested: T_NUMBER,\n processed: T_NUMBER,\n remaining: T_NUMBER,\n }),\n memory_governance_run: objectSchema({\n namespace: T_STRING,\n runId: T_STRING,\n traceId: T_STRING,\n mode: T_STRING,\n reviewQueueCount: T_NUMBER,\n proposedActionCount: T_NUMBER,\n appliedActionCount: T_NUMBER,\n summaryPath: T_STRING,\n reportPath: T_STRING,\n }),\n procedure_mining_run: objectSchema({ namespace: T_STRING, clustersProcessed: T_NUMBER, proceduresWritten: T_NUMBER }),\n pattern_reinforcement_run: objectSchema({\n namespace: T_STRING,\n ran: T_BOOLEAN,\n clustersFound: T_NUMBER,\n canonicalsUpdated: T_NUMBER,\n duplicatesSuperseded: T_NUMBER,\n }),\n procedural_stats: objectSchema({ namespace: T_STRING, counts: T_OBJECT, recent: T_OBJECT }),\n procedure_library_maintenance: objectSchema({\n enabled: T_BOOLEAN,\n namespace: T_STRING,\n report: T_OBJECT,\n }),\n memory_get: objectSchema({ found: T_BOOLEAN, namespace: T_STRING, memory: T_NULLABLE_OBJECT }),\n memory_timeline: objectSchema({ found: T_BOOLEAN, namespace: T_STRING, count: T_NUMBER, timeline: T_ARRAY }),\n memory_store: objectSchema({\n schemaVersion: T_NUMBER,\n operation: T_STRING,\n namespace: T_STRING,\n dryRun: T_BOOLEAN,\n accepted: T_BOOLEAN,\n queued: T_BOOLEAN,\n status: T_STRING,\n memoryId: T_STRING,\n }),\n suggestion_submit: objectSchema({\n schemaVersion: T_NUMBER,\n operation: T_STRING,\n namespace: T_STRING,\n dryRun: T_BOOLEAN,\n accepted: T_BOOLEAN,\n queued: T_BOOLEAN,\n status: T_STRING,\n memoryId: T_STRING,\n }),\n entity_get: objectSchema({ found: T_BOOLEAN, namespace: T_STRING, entity: T_NULLABLE_OBJECT }),\n review_queue_list: objectSchema({ found: T_BOOLEAN, runId: T_STRING, reviewQueue: T_ARRAY }),\n observe: objectSchema({\n accepted: T_NUMBER,\n sessionKey: T_STRING,\n namespace: T_STRING,\n effectiveNamespace: T_STRING,\n lcmArchived: T_BOOLEAN,\n extractionQueued: T_BOOLEAN,\n transcriptPersisted: T_BOOLEAN,\n }),\n lcm_search: objectSchema({\n query: T_STRING,\n namespace: T_STRING,\n results: T_ARRAY,\n count: T_NUMBER,\n lcmEnabled: T_BOOLEAN,\n }),\n lcm_compaction_flush: objectSchema({\n enabled: T_BOOLEAN,\n flushed: T_BOOLEAN,\n sessionKey: T_STRING,\n namespace: T_STRING,\n }),\n extraction_force_flush: objectSchema({\n flushed: T_BOOLEAN,\n sessionKey: T_STRING,\n namespace: T_STRING,\n effectiveNamespace: T_STRING,\n }),\n lcm_compaction_record: objectSchema({\n enabled: T_BOOLEAN,\n recorded: T_BOOLEAN,\n sessionKey: T_STRING,\n namespace: T_STRING,\n }),\n continuity_audit_generate: objectSchema({ enabled: T_BOOLEAN, period: T_STRING, reportPath: T_STRING }),\n continuity_incident_open: objectSchema({ created: T_BOOLEAN, incident: T_NULLABLE_OBJECT }),\n continuity_incident_close: objectSchema({ closed: T_BOOLEAN, incident: T_NULLABLE_OBJECT }),\n continuity_incident_list: objectSchema({ incidents: T_ARRAY }),\n continuity_loop_add_or_update: objectSchema({ saved: T_BOOLEAN, loop: T_NULLABLE_OBJECT }),\n continuity_loop_review: objectSchema({ reviewed: T_BOOLEAN, loop: T_NULLABLE_OBJECT }),\n identity_anchor_get: objectSchema({ found: T_BOOLEAN, anchor: T_NULLABLE_STRING }),\n identity_anchor_update: objectSchema({ updated: T_BOOLEAN, sections: T_ARRAY }),\n memory_identity: objectSchema({ found: T_BOOLEAN, identity: T_NULLABLE_STRING, message: T_STRING }),\n work_task: objectSchema({\n action: T_STRING,\n task: T_NULLABLE_OBJECT,\n tasks: T_ARRAY,\n count: T_NUMBER,\n deleted: T_BOOLEAN,\n }),\n work_project: objectSchema({\n action: T_STRING,\n project: T_NULLABLE_OBJECT,\n projects: T_ARRAY,\n count: T_NUMBER,\n deleted: T_BOOLEAN,\n }),\n work_board: objectSchema({ action: T_STRING, markdown: T_STRING, snapshot: T_OBJECT, result: T_OBJECT }),\n shared_context_write_output: objectSchema({ written: T_BOOLEAN, path: T_STRING }),\n shared_feedback_record: objectSchema({ recorded: T_BOOLEAN }),\n shared_priorities_append: objectSchema({ appended: T_BOOLEAN }),\n shared_context_cross_signals_run: objectSchema({\n crossSignalsMarkdownPath: T_STRING,\n crossSignalsPath: T_STRING,\n sourceCount: T_NUMBER,\n feedbackCount: T_NUMBER,\n overlapCount: T_NUMBER,\n }),\n shared_context_curate_daily: objectSchema({\n roundtablePath: T_STRING,\n crossSignalsMarkdownPath: T_STRING,\n crossSignalsPath: T_STRING,\n overlapCount: T_NUMBER,\n }),\n compounding_weekly_synthesize: objectSchema({\n weekId: T_STRING,\n reportPath: T_STRING,\n reportJsonPath: T_STRING,\n rubricsPath: T_STRING,\n rubricsIndexPath: T_STRING,\n mistakesCount: T_NUMBER,\n promotionCandidateCount: T_NUMBER,\n }),\n compounding_promote_candidate: objectSchema({\n enabled: T_BOOLEAN,\n dryRun: T_BOOLEAN,\n weekId: T_STRING,\n promoted: T_ARRAY,\n skipped: T_ARRAY,\n tombstoneBlocked: T_ARRAY,\n }),\n compression_guidelines_optimize: objectSchema({\n enabled: T_BOOLEAN,\n dryRun: T_BOOLEAN,\n eventCount: T_NUMBER,\n nextGuidelineVersion: T_NUMBER,\n changedRules: T_NUMBER,\n semanticRefinementApplied: T_BOOLEAN,\n persisted: T_BOOLEAN,\n }),\n compression_guidelines_activate: objectSchema({\n enabled: T_BOOLEAN,\n activated: T_BOOLEAN,\n guidelineVersion: { type: [\"number\", \"null\"] } as const,\n }),\n memory_search: objectSchema({ query: T_STRING, results: T_ARRAY, count: T_NUMBER }),\n external_wiki_search: objectSchema(\n {\n query: T_STRING,\n hits: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n wikiId: T_STRING,\n title: T_STRING,\n path: T_STRING,\n snippet: T_STRING,\n score: T_NUMBER,\n rank: T_NUMBER,\n citations: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n path: T_STRING,\n lineStart: T_NUMBER,\n lineEnd: T_NUMBER,\n note: T_STRING,\n },\n required: [\"path\", \"lineStart\", \"lineEnd\", \"note\"],\n additionalProperties: false,\n },\n },\n indexBlurb: T_STRING,\n },\n required: [\"wikiId\", \"title\", \"path\", \"snippet\", \"score\", \"rank\", \"citations\"],\n additionalProperties: false,\n },\n },\n count: T_NUMBER,\n degradedWikiIds: T_ARRAY,\n },\n [\"query\", \"hits\", \"count\", \"degradedWikiIds\"]\n ),\n memory_profile: objectSchema({ profile: T_STRING }),\n memory_entities_list: objectSchema({ entities: T_ARRAY, count: T_NUMBER }),\n memory_questions: objectSchema({ questions: T_ARRAY, count: T_NUMBER }),\n memory_last_recall: objectSchema({\n sessionKey: T_STRING,\n recordedAt: T_STRING,\n queryHash: T_STRING,\n queryLen: T_NUMBER,\n memoryIds: T_ARRAY,\n namespace: T_STRING,\n recallNamespaces: T_ARRAY,\n plannerMode: T_STRING,\n requestedMode: T_STRING,\n source: T_STRING,\n fallbackUsed: T_BOOLEAN,\n sourcesUsed: T_ARRAY,\n latencyMs: T_NUMBER,\n includedMemories: T_ARRAY,\n message: T_NULLABLE_STRING,\n }),\n memory_intent_debug: objectSchema({\n recordedAt: T_STRING,\n promptHash: T_STRING,\n promptLength: T_NUMBER,\n retrievalQueryHash: T_STRING,\n retrievalQueryLength: T_NUMBER,\n plannerEnabled: T_BOOLEAN,\n plannedMode: T_STRING,\n effectiveMode: T_STRING,\n recallResultLimit: T_NUMBER,\n queryIntent: T_OBJECT,\n graphExpandedIntentDetected: T_BOOLEAN,\n graphDecision: T_OBJECT,\n message: T_NULLABLE_STRING,\n }),\n memory_qmd_debug: objectSchema({\n recordedAt: T_STRING,\n queryHash: T_STRING,\n queryLength: T_NUMBER,\n collection: T_STRING,\n namespaces: T_ARRAY,\n fetchLimit: T_NUMBER,\n primaryResultCount: T_NUMBER,\n hybridResultCount: T_NUMBER,\n queryAwareSeedCount: T_NUMBER,\n resultCount: T_NUMBER,\n intentHint: T_STRING,\n explainEnabled: T_BOOLEAN,\n hybridTopUpUsed: T_BOOLEAN,\n hybridTopUpSkippedReason: T_STRING,\n results: T_ARRAY,\n message: T_NULLABLE_STRING,\n }),\n memory_graph_explain: objectSchema({ explanation: T_STRING }),\n graph_snapshot: objectSchema({ nodes: T_ARRAY, edges: T_ARRAY }),\n memory_feedback: objectSchema({ recorded: T_BOOLEAN, enabled: T_BOOLEAN }),\n memory_promote: objectSchema({ promoted: T_BOOLEAN, memoryId: T_STRING }),\n memory_outcome: objectSchema({\n ok: T_BOOLEAN,\n memoryId: T_STRING,\n mw_success: T_NUMBER,\n mw_fail: T_NUMBER,\n reason: T_STRING,\n message: T_STRING,\n }),\n memory_action_apply: objectSchema({ recorded: T_BOOLEAN, event: T_OBJECT }),\n context_checkpoint: objectSchema({ saved: T_BOOLEAN }),\n briefing: objectSchema({\n markdown: T_STRING,\n json: T_OBJECT,\n window: T_OBJECT,\n format: T_STRING,\n namespace: T_STRING,\n }),\n review_list: objectSchema({ pairs: T_ARRAY, total: T_NUMBER, durationMs: T_NUMBER }),\n review_resolve: objectSchema({ pairId: T_STRING, verb: T_STRING, affectedIds: T_ARRAY, message: T_STRING }),\n contradiction_scan_run: objectSchema({\n scanned: T_NUMBER,\n candidates: T_NUMBER,\n judged: T_NUMBER,\n queued: T_NUMBER,\n cooledDown: T_NUMBER,\n elapsedMs: T_NUMBER,\n }),\n preference_drift_scan: objectSchema({\n schemaVersion: T_NUMBER,\n generatedAt: T_STRING,\n mode: T_STRING,\n namespace: T_STRING,\n scanned: T_NUMBER,\n eligible: T_NUMBER,\n findings: T_ARRAY,\n counts: T_OBJECT,\n appliedCount: T_NUMBER,\n reviewItemsOpened: T_NUMBER,\n elapsedMs: T_NUMBER,\n skippedReason: T_STRING,\n }),\n memory_summarize_hourly: objectSchema({\n ok: T_BOOLEAN,\n message: T_STRING,\n sessionsConsidered: T_NUMBER,\n sessionsWithEntries: T_NUMBER,\n summariesWritten: T_NUMBER,\n staleStore: T_BOOLEAN,\n newestEntryTimestamp: T_NULLABLE_STRING,\n scanFailed: T_BOOLEAN,\n warning: T_STRING,\n }),\n conversation_index_update: objectSchema({\n enabled: T_BOOLEAN,\n sessions: T_NUMBER,\n chunks: T_NUMBER,\n skipped: T_NUMBER,\n embeddedRuns: T_NUMBER,\n }),\n profiling_report: objectSchema({\n enabled: T_BOOLEAN,\n format: T_STRING,\n traces: T_ARRAY,\n stats: T_OBJECT,\n bottleneck: T_NULLABLE_STRING,\n }),\n graph_edge_decay_run: objectSchema({ ranAt: T_STRING, disabled: T_BOOLEAN, reason: T_STRING, results: T_ARRAY }),\n live_connectors_run: objectSchema({\n ranAt: T_STRING,\n force: T_BOOLEAN,\n totalDocsImported: T_NUMBER,\n ranCount: T_NUMBER,\n skippedCount: T_NUMBER,\n errorCount: T_NUMBER,\n results: T_ARRAY,\n }),\n peer_list: objectSchema({ peers: T_ARRAY }),\n peer_get: objectSchema({ found: T_BOOLEAN, peer: T_NULLABLE_OBJECT }),\n peer_set: objectSchema({ ok: T_BOOLEAN, created: T_BOOLEAN, peer: T_OBJECT }),\n peer_delete: objectSchema({ ok: T_BOOLEAN, deleted: T_BOOLEAN }),\n peer_profile_get: objectSchema({\n found: T_BOOLEAN,\n profile: {\n type: \"object\",\n properties: {\n peerId: T_STRING,\n updatedAt: T_STRING,\n fields: { type: \"object\", additionalProperties: T_STRING },\n provenance: {\n type: \"object\",\n additionalProperties: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n observedAt: T_STRING,\n signal: T_STRING,\n sourceSessionId: T_STRING,\n note: T_STRING,\n },\n required: [\"observedAt\", \"signal\"],\n additionalProperties: true,\n },\n },\n },\n },\n required: [\"peerId\", \"updatedAt\", \"fields\", \"provenance\"],\n additionalProperties: true,\n },\n }),\n peer_forget: objectSchema({ ok: T_BOOLEAN, purged: T_BOOLEAN }),\n console_state: objectSchema({\n capturedAt: T_STRING,\n bufferState: T_OBJECT,\n extractionQueue: T_OBJECT,\n dedupRecent: T_ARRAY,\n maintenanceLedgerTail: T_ARRAY,\n qmdProbe: T_OBJECT,\n daemon: T_OBJECT,\n errors: T_ARRAY,\n }),\n dreams_status: objectSchema({ phases: T_OBJECT, windowStart: T_STRING, windowEnd: T_STRING }),\n dreams_run: objectSchema({ phase: T_STRING, durationMs: T_NUMBER, itemsProcessed: T_NUMBER }),\n coding_decision: objectSchema({\n subcommand: T_STRING,\n records: T_ARRAY,\n count: T_NUMBER,\n found: T_BOOLEAN,\n memoryId: T_STRING,\n status: T_STRING,\n supersededMemoryId: T_STRING,\n replacementMemoryId: T_STRING,\n }),\n coding_architecture: objectSchema({\n subcommand: T_STRING,\n found: T_BOOLEAN,\n refreshed: T_BOOLEAN,\n memoryId: T_STRING,\n }),\n coding_delta: objectSchema({\n subcommand: T_STRING,\n ok: T_BOOLEAN,\n kind: T_STRING,\n delta: T_OBJECT,\n nextState: T_OBJECT,\n }),\n memory_correct_plan: objectSchema({\n planId: T_STRING,\n namespace: T_STRING,\n diff: T_STRING,\n actions: T_ARRAY,\n confidence: T_NUMBER,\n }),\n memory_correct_apply: objectSchema({\n planId: T_STRING,\n status: T_STRING,\n results: T_ARRAY,\n auditMemoryId: T_STRING,\n appliedAt: T_STRING,\n }),\n memory_chat: objectSchema({\n reply: T_STRING,\n chatSessionId: T_STRING,\n pendingPlan: {\n type: \"object\",\n properties: { planId: T_STRING, preview: T_STRING },\n required: [\"planId\", \"preview\"],\n additionalProperties: true,\n },\n skippedTools: { type: \"array\", items: T_STRING },\n }),\n codegraph_index: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_list_projects: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_delete_project: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_index_status: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_search_graph: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_trace_path: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_detect_changes: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_query_graph: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_get_schema: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_get_snippet: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_get_architecture: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_search_code: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_manage_adr: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n codegraph_ingest_traces: objectSchema({ ok: T_BOOLEAN, result: T_OBJECT }),\n};\n\n/**\n * Apply outputSchema from the registry to every tool that lacks one.\n * Suffix resolution strips the canonical or legacy prefix so both\n * `remnic_*` and `engram.*` aliases inherit the same schema.\n * Tools that already have an explicit outputSchema are skipped.\n */\nexport function applyToolOutputSchemas<T extends { name: string; outputSchema?: unknown }>(\n tools: ReadonlyArray<T>,\n canonicalPrefix: string,\n legacyPrefix: string\n): T[] {\n return tools.map((tool) => {\n if (tool.outputSchema) return tool;\n const name = tool.name as string;\n const suffix = name.startsWith(canonicalPrefix)\n ? name.slice(canonicalPrefix.length)\n : name.startsWith(legacyPrefix)\n ? name.slice(legacyPrefix.length)\n : name;\n return { ...tool, outputSchema: TOOL_OUTPUT_SCHEMAS[suffix] ?? { type: \"object\", additionalProperties: true } };\n });\n}\n"],"mappings":"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","names":[]}