@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,106 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import {
5
+ applyRecencyBoost,
6
+ assessMtimeTrust,
7
+ collectMtimeFallbackContext,
8
+ resolveMemoryAge,
9
+ utcDayKey,
10
+ } from "./memory-age.js";
11
+
12
+ const DAY_MS = 86_400_000;
13
+ const NOW = Date.parse("2026-08-25T12:00:00.000Z");
14
+
15
+ function spreadDays(count: number, startMs = NOW): number[] {
16
+ return Array.from({ length: count }, (_unused, i) => startMs + i * DAY_MS);
17
+ }
18
+
19
+ test("resolveMemoryAge: content dates win over a fresh mtime (#2976)", () => {
20
+ const created = new Date(NOW - 40 * DAY_MS).toISOString();
21
+ const resolved = resolveMemoryAge({ created });
22
+ assert.equal(resolved.source, "content");
23
+ assert.equal(resolved.referenceMs, Date.parse(created), "ages by the content date, not the fresh mtime");
24
+ });
25
+
26
+ test("resolveMemoryAge: created wins over updated; updated backs a missing created", () => {
27
+ const created = new Date(NOW - 90 * DAY_MS).toISOString();
28
+ const updated = new Date(NOW - 1 * DAY_MS).toISOString();
29
+ assert.equal(resolveMemoryAge({ created, updated }).referenceMs, Date.parse(created));
30
+ assert.equal(resolveMemoryAge({ created: undefined, updated }).referenceMs, Date.parse(updated));
31
+ });
32
+
33
+ test("resolveMemoryAge: unparsable content dates never produce a reference", () => {
34
+ for (const bad of ["not-a-date", "", "2026-13-45"] as const) {
35
+ const resolved = resolveMemoryAge({ created: bad, updated: bad });
36
+ assert.equal(resolved.referenceMs, null, `unparsable date ${JSON.stringify(bad)} must not resolve`);
37
+ assert.equal(resolved.source, "unknown");
38
+ }
39
+ });
40
+
41
+ test("resolveMemoryAge: mtime backs age only when trusted and no content date exists", () => {
42
+ const mtimeMs = NOW - 2 * DAY_MS;
43
+ const trusted = assessMtimeTrust([mtimeMs, NOW - 9 * DAY_MS]);
44
+ assert.equal(resolveMemoryAge({}, mtimeMs, trusted).source, "mtime");
45
+ assert.equal(resolveMemoryAge({ created: "garbage" }, mtimeMs, trusted).source, "mtime");
46
+ assert.equal(resolveMemoryAge({ created: new Date(NOW).toISOString() }, mtimeMs, trusted).source, "content");
47
+ const distrusted = assessMtimeTrust([mtimeMs, mtimeMs, NOW - 9 * DAY_MS, NOW - 11 * DAY_MS]);
48
+ assert.equal(distrusted.bulkTouchDays.has(utcDayKey(mtimeMs)), true, "two of four same-day files cluster");
49
+ const refused = resolveMemoryAge({}, mtimeMs, distrusted);
50
+ assert.equal(refused.source, "unknown", "an untrusted mtime is unknown age, never fresh");
51
+ assert.equal(refused.referenceMs, null);
52
+ });
53
+
54
+ test("assessMtimeTrust: the measured distill-kura shape (50 of 214 files on one day) is a bulk touch", () => {
55
+ const bulkDay = NOW - 400 * DAY_MS;
56
+ const sample = [...Array<number>(50).fill(bulkDay), ...spreadDays(164, NOW - 200 * DAY_MS)];
57
+ const trust = assessMtimeTrust(sample);
58
+ assert.equal(trust.bulkTouchDays.size, 1);
59
+ assert.equal(trust.bulkTouchDays.has(utcDayKey(bulkDay)), true);
60
+ assert.equal(trust.isTrusted(bulkDay), false);
61
+ assert.equal(trust.isTrusted(sample[sample.length - 1]!), true);
62
+ });
63
+
64
+ test("assessMtimeTrust: the 20% boundary is inclusive", () => {
65
+ // 43 of 214 = 20.09% -> flagged; 42 of 214 = 19.6% -> not flagged.
66
+ const flagged = assessMtimeTrust([...Array<number>(43).fill(NOW), ...spreadDays(171, NOW - 400 * DAY_MS)]);
67
+ assert.equal(flagged.bulkTouchDays.has(utcDayKey(NOW)), true, "43/214 on one day is >= 20%");
68
+ const clear = assessMtimeTrust([...Array<number>(42).fill(NOW), ...spreadDays(172, NOW - 400 * DAY_MS)]);
69
+ assert.equal(clear.bulkTouchDays.has(utcDayKey(NOW)), false, "42/214 on one day is < 20%");
70
+ });
71
+
72
+ test("assessMtimeTrust: a single file never forms a cluster (min 2)", () => {
73
+ const trust = assessMtimeTrust([NOW]);
74
+ assert.equal(trust.bulkTouchDays.size, 0);
75
+ assert.equal(trust.isTrusted(NOW), true);
76
+ const pair = assessMtimeTrust([NOW, NOW]);
77
+ assert.equal(pair.bulkTouchDays.size, 1, "two files on one day meet the min-2 rule");
78
+ });
79
+
80
+ test("applyRecencyBoost: exact blend, unknown age untouched, weight 0 untouched, future clamped", () => {
81
+ const memory = {
82
+ path: "facts/a.md",
83
+ frontmatter: { created: new Date(NOW - 14 * DAY_MS).toISOString() },
84
+ };
85
+ const expected = 1 * 0.5 + Math.pow(0.5, 14 / 7) * 0.5;
86
+ assert.ok(Math.abs(applyRecencyBoost(1, memory, 0.5, NOW) - expected) < 1e-12);
87
+ // Unknown age (no dates, no trusted mtime) leaves the score alone.
88
+ assert.equal(applyRecencyBoost(0.7, { path: "facts/b.md", frontmatter: {} }, 0.5, NOW), 0.7);
89
+ assert.equal(applyRecencyBoost(0.7, memory, 0, NOW), 0.7);
90
+ // A corrupt future date clamps to age zero instead of boosting past 1.
91
+ const future = {
92
+ path: "facts/c.md",
93
+ frontmatter: { created: new Date(NOW + 30 * DAY_MS).toISOString() },
94
+ };
95
+ assert.equal(applyRecencyBoost(1, future, 0.5, NOW), 1);
96
+ });
97
+
98
+ test("collectMtimeFallbackContext: fully dated memories skip it entirely (no stats)", async () => {
99
+ // The paths do not exist: any stat would surface below as a null mtime
100
+ // instead of the documented null short-circuit.
101
+ const context = await collectMtimeFallbackContext([
102
+ { path: "/nonexistent/facts/a.md", created: new Date(NOW).toISOString() },
103
+ { path: "/nonexistent/facts/b.md", updated: new Date(NOW).toISOString() },
104
+ ]);
105
+ assert.equal(context, null);
106
+ });
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Shared memory-age resolution (issue #2976).
3
+ *
4
+ * "Age is not mtime" (distill-kura `weave.py` `age_days`): `cp -r`, a
5
+ * restore, a checkout, or a bulk import resets file mtimes, so any freshness
6
+ * mechanism keyed on mtime either switches itself off or boosts everything
7
+ * equally. Remnic therefore resolves a memory's age from dates written
8
+ * INSIDE the memory first:
9
+ *
10
+ * 1. frontmatter `created` — the recall ranking reference before #2976,
11
+ * kept first so every dated memory scores exactly as it did;
12
+ * 2. frontmatter `updated` — the content-revision date;
13
+ * 3. file mtime — only when no content date exists AND the caller's trust
14
+ * assessment accepts it (see `assessMtimeTrust`);
15
+ * 4. otherwise UNKNOWN: no reference instant, and downstream scoring must
16
+ * treat unknown age as never-fresh (no recency boost), never as
17
+ * "just written".
18
+ *
19
+ * Bi-temporal `valid_at`/`observedAt` are deliberately NOT in the ladder:
20
+ * they date when the fact was true, not when the memory was written, so a
21
+ * fresh correction about an old event would be misaged by them.
22
+ *
23
+ * Bulk-touch heuristic (distill-kura measured 50/214 files sharing one
24
+ * bulk-touch day, mtime understating true age by a median of 11 days, worst
25
+ * case 425): a UTC calendar day shared by >= max(BULK_TOUCH_MIN_FILES,
26
+ * BULK_TOUCH_STORE_FRACTION of the sampled files) is a bulk-touch day, and
27
+ * mtimes falling on a bulk-touch day are untrusted — those ages are unknown,
28
+ * not fresh. The sample is the scored result set of the calling pipeline
29
+ * (bounded I/O), which observes a bulk-touched store as a same-day cluster.
30
+ */
31
+
32
+ import { stat } from "node:fs/promises";
33
+
34
+ /** Minimum files sharing one calendar day before that day is bulk-touched. */
35
+ export const BULK_TOUCH_MIN_FILES = 2;
36
+ /** Fraction of the sampled files on one day that marks a bulk touch. */
37
+ export const BULK_TOUCH_STORE_FRACTION = 0.2;
38
+
39
+ /** Recency half-life (days) used by `applyRecencyBoost`. */
40
+ export const RECENCY_HALF_LIFE_DAYS = 7;
41
+
42
+ /** How the resolved age reference was obtained. */
43
+ export type MemoryAgeSource = "content" | "mtime" | "unknown";
44
+
45
+ export interface ResolvedMemoryAge {
46
+ /** Reference instant for age computations, or null when age is unknown. */
47
+ referenceMs: number | null;
48
+ source: MemoryAgeSource;
49
+ }
50
+
51
+ /** Content dates written inside the memory (frontmatter). */
52
+ export interface MemoryAgeDates {
53
+ created?: string | null;
54
+ updated?: string | null;
55
+ }
56
+
57
+ /** Minimal memory shape the resolver needs; `path` keys the mtime fallback. */
58
+ export interface MemoryAgeSubject extends MemoryAgeDates {
59
+ path: string;
60
+ }
61
+
62
+ /** MemoryFile slice `applyRecencyBoost` reads; dates live in frontmatter. */
63
+ export interface RecencyBoostSubject {
64
+ path: string;
65
+ frontmatter: MemoryAgeDates;
66
+ }
67
+
68
+ /** Result of assessing a sample of mtimes for bulk-touch clustering. */
69
+ export interface MtimeTrust {
70
+ /** UTC day keys ("YYYY-MM-DD") whose mtime counts mark a bulk touch. */
71
+ bulkTouchDays: ReadonlySet<string>;
72
+ isTrusted(mtimeMs: number): boolean;
73
+ }
74
+
75
+ /** Per-recall mtime fallback context (null when no scored memory needs it). */
76
+ export interface MtimeFallbackContext {
77
+ mtimeMsByPath: Map<string, number | null>;
78
+ trust: MtimeTrust;
79
+ }
80
+
81
+ function finiteMs(value: string | null | undefined): number | null {
82
+ if (typeof value !== "string") return null;
83
+ const ms = Date.parse(value);
84
+ return Number.isFinite(ms) ? ms : null;
85
+ }
86
+
87
+ /**
88
+ * Resolve the reference instant for a memory's age. Content dates win over
89
+ * mtime; an mtime is consulted only when no content date parses and the
90
+ * trust assessment (when provided) accepts it; otherwise age is unknown.
91
+ */
92
+ export function resolveMemoryAge(
93
+ subject: MemoryAgeDates,
94
+ mtimeMs?: number | null,
95
+ trust?: MtimeTrust | null,
96
+ ): ResolvedMemoryAge {
97
+ const contentMs = finiteMs(subject.created) ?? finiteMs(subject.updated);
98
+ if (contentMs !== null) return { referenceMs: contentMs, source: "content" };
99
+ if (
100
+ typeof mtimeMs === "number" &&
101
+ Number.isFinite(mtimeMs) &&
102
+ trust?.isTrusted(mtimeMs) !== false
103
+ ) {
104
+ return { referenceMs: mtimeMs, source: "mtime" };
105
+ }
106
+ return { referenceMs: null, source: "unknown" };
107
+ }
108
+
109
+ /** UTC calendar-day key ("YYYY-MM-DD") for a millisecond instant. */
110
+ export function utcDayKey(ms: number): string {
111
+ return new Date(ms).toISOString().slice(0, 10);
112
+ }
113
+
114
+ /**
115
+ * Assess a sample of mtimes: days shared by >= max(BULK_TOUCH_MIN_FILES,
116
+ * BULK_TOUCH_STORE_FRACTION of the sample) are bulk-touch days, and their
117
+ * mtimes are untrusted for age. An empty or scattered sample trusts nothing
118
+ * less than it did before — only clustering changes anything.
119
+ */
120
+ export function assessMtimeTrust(sampleMtimesMs: readonly number[]): MtimeTrust {
121
+ const counts = new Map<string, number>();
122
+ for (const ms of sampleMtimesMs) {
123
+ if (!Number.isFinite(ms)) continue;
124
+ const key = utcDayKey(ms);
125
+ counts.set(key, (counts.get(key) ?? 0) + 1);
126
+ }
127
+ const threshold = Math.max(
128
+ BULK_TOUCH_MIN_FILES,
129
+ sampleMtimesMs.length * BULK_TOUCH_STORE_FRACTION,
130
+ );
131
+ const bulkTouchDays = new Set<string>();
132
+ for (const [day, count] of counts) {
133
+ if (count >= threshold) bulkTouchDays.add(day);
134
+ }
135
+ return {
136
+ bulkTouchDays,
137
+ isTrusted: (mtimeMs: number) => Number.isFinite(mtimeMs) && !bulkTouchDays.has(utcDayKey(mtimeMs)),
138
+ };
139
+ }
140
+
141
+ /**
142
+ * Build the mtime fallback context for a recall boost pass. Returns null —
143
+ * with zero stat calls — when every scored memory already has a content
144
+ * date, so the common path pays nothing. Otherwise stats the scored files
145
+ * (bounded by the result count) and assesses their mtimes for bulk-touch
146
+ * clustering. Unreadable files map to null mtimes (unknown age, never fresh).
147
+ */
148
+ export async function collectMtimeFallbackContext(
149
+ memories: ReadonlyArray<MemoryAgeSubject>,
150
+ ): Promise<MtimeFallbackContext | null> {
151
+ const needsFallback = memories.some(
152
+ (m) => finiteMs(m.created) === null && finiteMs(m.updated) === null,
153
+ );
154
+ if (!needsFallback) return null;
155
+ const stats = await Promise.all(
156
+ memories.map(async (m) => {
157
+ try {
158
+ return (await stat(m.path)).mtimeMs;
159
+ } catch {
160
+ return null;
161
+ }
162
+ }),
163
+ );
164
+ const mtimeMsByPath = new Map<string, number | null>(
165
+ memories.map((m, i) => [m.path, stats[i] ?? null]),
166
+ );
167
+ const trust = assessMtimeTrust(
168
+ stats.filter((ms): ms is number => ms !== null && Number.isFinite(ms)),
169
+ );
170
+ return { mtimeMsByPath, trust };
171
+ }
172
+
173
+ /**
174
+ * Apply the exponential recency blend to one score. Age resolves per
175
+ * `resolveMemoryAge`; unknown age leaves the score untouched (never fresh).
176
+ * A future reference instant clamps to age zero rather than boosting above
177
+ * the recency ceiling (corrupt dates are not super-fresh).
178
+ */
179
+ export function applyRecencyBoost(
180
+ score: number,
181
+ memory: RecencyBoostSubject,
182
+ recencyWeight: number,
183
+ nowMs: number,
184
+ fallback?: MtimeFallbackContext | null,
185
+ ): number {
186
+ if (recencyWeight <= 0) return score;
187
+ const resolved = resolveMemoryAge(
188
+ memory.frontmatter,
189
+ fallback?.mtimeMsByPath.get(memory.path) ?? null,
190
+ fallback?.trust,
191
+ );
192
+ if (resolved.referenceMs === null) return score;
193
+ const ageDays = Math.max(0, (nowMs - resolved.referenceMs) / 86_400_000);
194
+ const recencyScore = Math.pow(0.5, ageDays / RECENCY_HALF_LIFE_DAYS);
195
+ return score * (1 - recencyWeight) + recencyScore * recencyWeight;
196
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Memory-store browse HTTP glue (issue #2978) — route bodies live here so
3
+ * access-http.ts stays at its structural ceiling (same seam as
4
+ * recall-navigation-http-glue.ts).
5
+ *
6
+ * Each route carries its literal `enforceTokenOp("<op>")` boundary-dispatch
7
+ * marker so `access-surface-catalog.test.ts` can prove dispatch statically.
8
+ * Input errors map to 400; everything else rethrows to the global 500
9
+ * handler. Namespace resolution flows through the caller-supplied
10
+ * `scopeFor` gate so a body-supplied namespace passes the SAME
11
+ * effective-namespace allow-list as the query string (issue #1850 finding
12
+ * 2), and `authenticatedPrincipal` reaches the service so authorization
13
+ * derives from the presenting principal, never client-supplied input.
14
+ */
15
+
16
+ import type { IncomingMessage, ServerResponse } from "node:http";
17
+
18
+ import { EngramAccessInputError } from "./access-errors.js";
19
+ import type { EngramAccessService } from "./access-service.js";
20
+ import type { BrowseVerb } from "./memory-browse.js";
21
+
22
+ type RespondJson = (res: ServerResponse, status: number, payload: unknown) => void;
23
+ type ReadJsonBody = (req: IncomingMessage) => Promise<unknown>;
24
+
25
+ type ScopeFor = (
26
+ bodyNamespace?: string,
27
+ ) => { namespace?: string; authenticatedPrincipal?: string };
28
+
29
+ function optStr(value: unknown): string | undefined {
30
+ return typeof value === "string" ? value : undefined;
31
+ }
32
+
33
+ function optInt(value: unknown): number | undefined {
34
+ if (value === undefined || value === null || value === "") return undefined;
35
+ const parsed = typeof value === "string" ? Number(value) : value;
36
+ if (typeof parsed !== "number" || !Number.isInteger(parsed)) {
37
+ throw new EngramAccessInputError("depth must be an integer");
38
+ }
39
+ return parsed;
40
+ }
41
+
42
+ async function respondBrowse(
43
+ req: IncomingMessage,
44
+ res: ServerResponse,
45
+ respondJson: RespondJson,
46
+ readJsonBody: ReadJsonBody,
47
+ service: EngramAccessService,
48
+ scopeFor: ScopeFor,
49
+ verb: BrowseVerb,
50
+ ): Promise<void> {
51
+ const body = (await readJsonBody(req)) as Record<string, unknown>;
52
+ const scope = scopeFor(optStr(body.namespace));
53
+ const depth = verb === "tree" ? optInt(body.depth) : undefined;
54
+ const result = await service.memoryStoreBrowse({
55
+ verb,
56
+ ...(optStr(body.path) !== undefined ? { path: optStr(body.path) } : {}),
57
+ ...(depth !== undefined ? { depth } : {}),
58
+ ...(verb === "find" && optStr(body.pattern) !== undefined ? { pattern: optStr(body.pattern) } : {}),
59
+ namespace: scope.namespace,
60
+ authenticatedPrincipal: scope.authenticatedPrincipal,
61
+ });
62
+ const { rendered: _rendered, ...payload } = result;
63
+ respondJson(res, 200, payload);
64
+ }
65
+
66
+ export async function maybeRespondMemoryBrowse(
67
+ req: IncomingMessage,
68
+ res: ServerResponse,
69
+ pathname: string,
70
+ method: string | undefined,
71
+ enforceTokenOp: (op: "memory_ls" | "memory_tree" | "memory_find") => void,
72
+ respondJson: RespondJson,
73
+ readJsonBody: ReadJsonBody,
74
+ service: EngramAccessService,
75
+ scopeFor: ScopeFor,
76
+ ): Promise<boolean> {
77
+ if (method === "POST" && (pathname === "/engram/v1/memory/ls" || pathname === "/remnic/v1/memory/ls")) {
78
+ enforceTokenOp("memory_ls");
79
+ await respondBrowse(req, res, respondJson, readJsonBody, service, scopeFor, "ls");
80
+ return true;
81
+ }
82
+ if (method === "POST" && (pathname === "/engram/v1/memory/tree" || pathname === "/remnic/v1/memory/tree")) {
83
+ enforceTokenOp("memory_tree");
84
+ await respondBrowse(req, res, respondJson, readJsonBody, service, scopeFor, "tree");
85
+ return true;
86
+ }
87
+ if (method === "POST" && (pathname === "/engram/v1/memory/find" || pathname === "/remnic/v1/memory/find")) {
88
+ enforceTokenOp("memory_find");
89
+ await respondBrowse(req, res, respondJson, readJsonBody, service, scopeFor, "find");
90
+ return true;
91
+ }
92
+ return false;
93
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Memory-store browse MCP tool definitions (issue #2978) — extracted from
3
+ * access-mcp.ts so the surface file stays at its structural ceiling (same
4
+ * seam as recall-navigation-mcp-tools.ts). Spread back into `this.tools`
5
+ * (`...MEMORY_BROWSE_MCP_TOOLS`); the migrated-operation mapping lives in
6
+ * access-mcp.ts's MCP_MIGRATED_OPERATIONS. The `remnic.` canonical alias
7
+ * is minted by withToolAliases at tools/list time.
8
+ *
9
+ * Always listed: browse is a pure read over the caller's resolved
10
+ * namespace, so there is no gating flag (unlike recallNavigation).
11
+ */
12
+
13
+ import type { McpTool } from "./access-mcp.js";
14
+
15
+ export const MEMORY_BROWSE_MCP_TOOLS: McpTool[] = [
16
+ {
17
+ name: "engram.memory_ls",
18
+ description:
19
+ "List what exists at one store path in your namespace: category directories with memory counts, memory files with a one-line description. Answers \"is there anything here at all?\" without a search query. Derived stores (artifacts/, meetings records, wearables, state/) are invisible by design.",
20
+ inputSchema: {
21
+ type: "object",
22
+ properties: {
23
+ path: { type: "string", description: "Store path to list, relative to the namespace root (\"\" or \"/\" = root). Default root." },
24
+ namespace: { type: "string", description: "Caller namespace to scope this operation to." },
25
+ },
26
+ additionalProperties: false,
27
+ },
28
+ },
29
+ {
30
+ name: "engram.memory_tree",
31
+ description:
32
+ "Depth-limited tree under one store path (depth 1 acts like ls). Deterministic sorted output, entry-capped so a large store cannot flood the response.",
33
+ inputSchema: {
34
+ type: "object",
35
+ properties: {
36
+ path: { type: "string", description: "Store path to expand, relative to the namespace root (default root)." },
37
+ depth: { type: "integer", minimum: 1, maximum: 4, description: "Expansion depth, 1-4. Default 1." },
38
+ namespace: { type: "string", description: "Caller namespace to scope this operation to." },
39
+ },
40
+ additionalProperties: false,
41
+ },
42
+ },
43
+ {
44
+ name: "engram.memory_find",
45
+ description:
46
+ "Deterministic name/path lookup over your namespace's store: `*` glob (e.g. \"facts/2026-08-*/*.md\") or substring. Use memory_search for semantic matching; use this when you know (part of) the name.",
47
+ inputSchema: {
48
+ type: "object",
49
+ properties: {
50
+ pattern: { type: "string", description: "Glob with `*` wildcards or substring to match against path and filename. Required." },
51
+ namespace: { type: "string", description: "Caller namespace to scope this operation to." },
52
+ },
53
+ required: ["pattern"],
54
+ additionalProperties: false,
55
+ },
56
+ },
57
+ ];
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Memory-store browse boundary operations (issue #2978).
3
+ *
4
+ * `memory_ls` / `memory_tree` / `memory_find` route MCP, HTTP, and CLI
5
+ * dispatch through the shared validation + error-mapping layer
6
+ * (access-boundary.ts) to the single `EngramAccessService.memoryStoreBrowse`
7
+ * implementation. Sibling module so access-operations-batch.ts stays at its
8
+ * ceiling seam (same layout as recall-navigation-operations.ts).
9
+ */
10
+
11
+ import { z } from "zod";
12
+
13
+ import { defineOperation } from "./access-boundary.js";
14
+ import { EngramAccessInputError } from "./access-errors.js";
15
+ import type { BrowseVerb, MemoryStoreBrowseRequest } from "./memory-browse.js";
16
+
17
+ function strictSchema<T extends z.ZodRawShape>(shape: T): z.ZodType<Record<string, unknown>> {
18
+ return z.preprocess(
19
+ (data) => {
20
+ if (data !== null && typeof data === "object" && !Array.isArray(data)) {
21
+ return Object.fromEntries(Object.entries(data as Record<string, unknown>).filter(([, value]) => value !== null));
22
+ }
23
+ return data;
24
+ },
25
+ z.object(shape).passthrough(),
26
+ ) as unknown as z.ZodType<Record<string, unknown>>;
27
+ }
28
+
29
+ function optStr(value: unknown): string | undefined {
30
+ return typeof value === "string" ? value : undefined;
31
+ }
32
+
33
+ function optInt(value: unknown): number | undefined {
34
+ if (typeof value === "number") return value;
35
+ if (typeof value === "string" && Number.isFinite(Number(value))) return Number(value);
36
+ return undefined;
37
+ }
38
+
39
+ function reqStr(value: unknown, field: string): string {
40
+ if (typeof value !== "string" || value.trim().length === 0) {
41
+ throw new EngramAccessInputError(`${field} is required`);
42
+ }
43
+ return value;
44
+ }
45
+
46
+ const verbShape = {
47
+ namespace: z.string().optional(),
48
+ } as const;
49
+
50
+ function browseRequest(verb: BrowseVerb, input: Record<string, unknown>): MemoryStoreBrowseRequest {
51
+ return {
52
+ verb,
53
+ ...(optStr(input.path) !== undefined ? { path: optStr(input.path) } : {}),
54
+ ...(optInt(input.depth) !== undefined ? { depth: optInt(input.depth) } : {}),
55
+ ...(optStr(input.pattern) !== undefined ? { pattern: optStr(input.pattern) } : {}),
56
+ namespace: optStr(input.namespace),
57
+ };
58
+ }
59
+
60
+ defineOperation({
61
+ name: "memory_ls",
62
+ description: "List the children of one store path in the caller's namespace: category dirs with counts, memory files with a one-line description.",
63
+ schema: strictSchema({ ...verbShape, path: z.string().optional() }),
64
+ handler: async (input, ctx) => ({
65
+ result: await ctx.service.memoryStoreBrowse({ ...browseRequest("ls", input), authenticatedPrincipal: ctx.authenticatedPrincipal }),
66
+ }),
67
+ });
68
+
69
+ defineOperation({
70
+ name: "memory_tree",
71
+ description: "Depth-limited tree of store paths under one directory, one-line descriptions, entry-capped.",
72
+ schema: strictSchema({ ...verbShape, path: z.string().optional(), depth: z.union([z.number(), z.string()]).optional() }),
73
+ handler: async (input, ctx) => ({
74
+ result: await ctx.service.memoryStoreBrowse({ ...browseRequest("tree", input), authenticatedPrincipal: ctx.authenticatedPrincipal }),
75
+ }),
76
+ });
77
+
78
+ defineOperation({
79
+ name: "memory_find",
80
+ description: "Deterministic name/path match (`*` glob or substring) over the caller's namespace store; semantic search stays memory_search.",
81
+ schema: strictSchema({ ...verbShape, pattern: z.string() }),
82
+ handler: async (input, ctx) => ({
83
+ result: await ctx.service.memoryStoreBrowse({
84
+ ...browseRequest("find", { ...input, pattern: reqStr(input.pattern, "pattern") }),
85
+ authenticatedPrincipal: ctx.authenticatedPrincipal,
86
+ }),
87
+ }),
88
+ });