@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
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-NHLLKEKK.js";
12
12
  import {
13
13
  parseConfig
14
- } from "./chunk-W6YDAIVB.js";
14
+ } from "./chunk-OSTXIFZW.js";
15
15
  import {
16
16
  resolveObjectiveStateStoreDir,
17
17
  validateObjectiveStateSnapshot
@@ -268,4 +268,4 @@ export {
268
268
  recordResumeBundle,
269
269
  getResumeBundleStatus
270
270
  };
271
- //# sourceMappingURL=chunk-JMBTNVMW.js.map
271
+ //# sourceMappingURL=chunk-FGRJJBFO.js.map
@@ -18,6 +18,9 @@ var MCP_READ_ONLY_TOOL_SUFFIXES = {
18
18
  deep_recall: true,
19
19
  memory_expand: true,
20
20
  memory_traverse: true,
21
+ memory_ls: true,
22
+ memory_tree: true,
23
+ memory_find: true,
21
24
  standup: true,
22
25
  action_confidence: true,
23
26
  capsule_list: true,
@@ -65,4 +68,4 @@ var MCP_READ_ONLY_TOOL_SUFFIXES = {
65
68
  export {
66
69
  MCP_READ_ONLY_TOOL_SUFFIXES
67
70
  };
68
- //# sourceMappingURL=chunk-F3TURDFG.js.map
71
+ //# sourceMappingURL=chunk-FPB5LQWW.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mcp-read-only-tools.ts"],"sourcesContent":["/**\n * Conservative allowlist of canonical MCP tool suffixes that are\n * unambiguously read-only. Tools in this set are tagged with\n * `annotations: { readOnlyHint: true }` so ChatGPT (and other MCP\n * clients that honor the hint) can skip per-call confirmation.\n *\n * The list is suffix-based so it covers both the `remnic.*` and\n * `engram.*` naming forms. Anything not on it stays unannotated:\n * uncertainty is resolved as \"might mutate\".\n *\n * Excluded by construction: anything that writes, runs a pipeline,\n * flushes, applies, records, imports, or destructively deletes.\n */\nexport const MCP_READ_ONLY_TOOL_SUFFIXES: Readonly<Record<string, true>> = {\n recall: true,\n recall_explain: true,\n recall_tier_explain: true,\n recall_xray: true,\n who_knows: true,\n promotion_candidates: true,\n briefing: true,\n wearables_status: true,\n transcript_day: true,\n transcript_search: true,\n transcript_memories: true,\n location_status: true,\n location_day: true,\n meetings_list: true,\n meetings_get: true,\n deep_recall: true,\n memory_expand: true,\n memory_traverse: true,\n standup: true,\n action_confidence: true,\n capsule_list: true,\n procedural_stats: true,\n memory_get: true,\n memory_timeline: true,\n entity_get: true,\n review_queue_list: true,\n lcm_search: true,\n continuity_incident_list: true,\n identity_anchor_get: true,\n memory_identity: true,\n memory_search: true,\n external_wiki_search: true,\n memory_profile: true,\n memory_entities_list: true,\n memory_questions: true,\n memory_last_recall: true,\n memory_intent_debug: true,\n memory_qmd_debug: true,\n memory_graph_explain: true,\n graph_snapshot: true,\n review_list: true,\n profiling_report: true,\n peer_list: true,\n peer_get: true,\n peer_profile_get: true,\n console_state: true,\n dreams_status: true,\n codegraph_list_projects: true,\n codegraph_index_status: true,\n codegraph_search_graph: true,\n codegraph_trace_path: true,\n codegraph_detect_changes: true,\n codegraph_query_graph: true,\n codegraph_get_schema: true,\n codegraph_get_snippet: true,\n codegraph_get_architecture: true,\n codegraph_search_code: true,\n support_passport_memory_preview: true,\n support_passport_cards_list: true,\n support_passport_grants_list: true,\n};\n"],"mappings":";AAaO,IAAM,8BAA8D;AAAA,EACzE,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,uBAAuB;AAAA,EACvB,iCAAiC;AAAA,EACjC,6BAA6B;AAAA,EAC7B,8BAA8B;AAChC;","names":[]}
1
+ {"version":3,"sources":["../src/mcp-read-only-tools.ts"],"sourcesContent":["/**\n * Conservative allowlist of canonical MCP tool suffixes that are\n * unambiguously read-only. Tools in this set are tagged with\n * `annotations: { readOnlyHint: true }` so ChatGPT (and other MCP\n * clients that honor the hint) can skip per-call confirmation.\n *\n * The list is suffix-based so it covers both the `remnic.*` and\n * `engram.*` naming forms. Anything not on it stays unannotated:\n * uncertainty is resolved as \"might mutate\".\n *\n * Excluded by construction: anything that writes, runs a pipeline,\n * flushes, applies, records, imports, or destructively deletes.\n */\nexport const MCP_READ_ONLY_TOOL_SUFFIXES: Readonly<Record<string, true>> = {\n recall: true,\n recall_explain: true,\n recall_tier_explain: true,\n recall_xray: true,\n who_knows: true,\n promotion_candidates: true,\n briefing: true,\n wearables_status: true,\n transcript_day: true,\n transcript_search: true,\n transcript_memories: true,\n location_status: true,\n location_day: true,\n meetings_list: true,\n meetings_get: true,\n deep_recall: true,\n memory_expand: true,\n memory_traverse: true,\n memory_ls: true,\n memory_tree: true,\n memory_find: true,\n standup: true,\n action_confidence: true,\n capsule_list: true,\n procedural_stats: true,\n memory_get: true,\n memory_timeline: true,\n entity_get: true,\n review_queue_list: true,\n lcm_search: true,\n continuity_incident_list: true,\n identity_anchor_get: true,\n memory_identity: true,\n memory_search: true,\n external_wiki_search: true,\n memory_profile: true,\n memory_entities_list: true,\n memory_questions: true,\n memory_last_recall: true,\n memory_intent_debug: true,\n memory_qmd_debug: true,\n memory_graph_explain: true,\n graph_snapshot: true,\n review_list: true,\n profiling_report: true,\n peer_list: true,\n peer_get: true,\n peer_profile_get: true,\n console_state: true,\n dreams_status: true,\n codegraph_list_projects: true,\n codegraph_index_status: true,\n codegraph_search_graph: true,\n codegraph_trace_path: true,\n codegraph_detect_changes: true,\n codegraph_query_graph: true,\n codegraph_get_schema: true,\n codegraph_get_snippet: true,\n codegraph_get_architecture: true,\n codegraph_search_code: true,\n support_passport_memory_preview: true,\n support_passport_cards_list: true,\n support_passport_grants_list: true,\n};\n"],"mappings":";AAaO,IAAM,8BAA8D;AAAA,EACzE,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa;AAAA,EACb,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,0BAA0B;AAAA,EAC1B,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,0BAA0B;AAAA,EAC1B,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,uBAAuB;AAAA,EACvB,iCAAiC;AAAA,EACjC,6BAA6B;AAAA,EAC7B,8BAA8B;AAChC;","names":[]}
@@ -1,9 +1,9 @@
1
- import {
2
- normalizeDreamsStatusWindowHours
3
- } from "./chunk-EQWEIIKQ.js";
4
1
  import {
5
2
  runGraphEdgeDecayMaintenanceAcrossNamespaces
6
3
  } from "./chunk-SCXURCVT.js";
4
+ import {
5
+ normalizeDreamsStatusWindowHours
6
+ } from "./chunk-EQWEIIKQ.js";
7
7
  import {
8
8
  executeResolution,
9
9
  isValidResolutionVerb,
@@ -29,13 +29,13 @@ import {
29
29
  defineOperation,
30
30
  parseNamespacePreflightWriteOp,
31
31
  resolveAuthorizedNamespaceWritablePreflight
32
- } from "./chunk-NKDQXDFL.js";
32
+ } from "./chunk-AS4YKT75.js";
33
33
  import {
34
34
  parseSharedWriteOutputControls
35
35
  } from "./chunk-IFBSZGW3.js";
36
36
  import {
37
37
  validateBriefingFormat
38
- } from "./chunk-YHSEUZV5.js";
38
+ } from "./chunk-QLCMOHRE.js";
39
39
  import {
40
40
  parseDeepRecallMaxSteps
41
41
  } from "./chunk-7RGX7BMF.js";
@@ -594,4 +594,4 @@ defineOperation({ name: "graph_events", description: "SSE graph events.", schema
594
594
  defineOperation({ name: "chat_message", description: "Chat message.", schema: strictSchema({ message: S.str, chatSessionId: S.str }), handler: async (_i, _ctx) => ({ result: { ok: true } }) });
595
595
  defineOperation({ name: "chat_events", description: "SSE chat events.", schema: strictSchema({}), handler: async (_i, _ctx) => ({ result: { stream: "sse" } }) });
596
596
  defineOperation({ name: "adapters_status", description: "Adapter registry metadata (issue #1850 round 5). Marker op: the HTTP transport builds the response from its own adapterRegistry, but the op still must be registered so it appears in listRegisteredOperations and enforceTokenOp can gate it for scoped tokens.", schema: strictSchema({}), handler: async (_i, _ctx) => ({ result: { ok: true } }) });
597
- //# sourceMappingURL=chunk-OOBUWMPY.js.map
597
+ //# sourceMappingURL=chunk-G2SJRFGP.js.map
@@ -1,6 +1,3 @@
1
- import {
2
- ChatTransport
3
- } from "./chunk-JUXOTY6J.js";
4
1
  import {
5
2
  SingleFlightProbe,
6
3
  extractNonRecoverableBackendReason,
@@ -11,6 +8,9 @@ import {
11
8
  resolveUnavailableVerdict,
12
9
  waitForRetryBackoff
13
10
  } from "./chunk-QM2SPLKQ.js";
11
+ import {
12
+ ChatTransport
13
+ } from "./chunk-JUXOTY6J.js";
14
14
  import {
15
15
  estimateTokenCount
16
16
  } from "./chunk-TOTT6S2V.js";
@@ -1100,4 +1100,4 @@ var LocalLlmClient = class _LocalLlmClient {
1100
1100
  export {
1101
1101
  LocalLlmClient
1102
1102
  };
1103
- //# sourceMappingURL=chunk-WGZHSQDV.js.map
1103
+ //# sourceMappingURL=chunk-G2XZFGYN.js.map
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-3UXOZBHV.js";
15
15
  import {
16
16
  StorageManager
17
- } from "./chunk-IAT5WFEU.js";
17
+ } from "./chunk-MNG536IS.js";
18
18
  import {
19
19
  OKF_PROFILE_TYPE,
20
20
  okfTypeForMemory
@@ -272,4 +272,4 @@ export {
272
272
  exportOkfBundle,
273
273
  firstHeading
274
274
  };
275
- //# sourceMappingURL=chunk-JPNUKKSL.js.map
275
+ //# sourceMappingURL=chunk-GGROFIYX.js.map
@@ -0,0 +1,74 @@
1
+ import {
2
+ defineOperation
3
+ } from "./chunk-AS4YKT75.js";
4
+ import {
5
+ EngramAccessInputError
6
+ } from "./chunk-2Z24E5W2.js";
7
+
8
+ // src/memory-browse-operations.ts
9
+ import { z } from "zod";
10
+ function strictSchema(shape) {
11
+ return z.preprocess(
12
+ (data) => {
13
+ if (data !== null && typeof data === "object" && !Array.isArray(data)) {
14
+ return Object.fromEntries(Object.entries(data).filter(([, value]) => value !== null));
15
+ }
16
+ return data;
17
+ },
18
+ z.object(shape).passthrough()
19
+ );
20
+ }
21
+ function optStr(value) {
22
+ return typeof value === "string" ? value : void 0;
23
+ }
24
+ function optInt(value) {
25
+ if (typeof value === "number") return value;
26
+ if (typeof value === "string" && Number.isFinite(Number(value))) return Number(value);
27
+ return void 0;
28
+ }
29
+ function reqStr(value, field) {
30
+ if (typeof value !== "string" || value.trim().length === 0) {
31
+ throw new EngramAccessInputError(`${field} is required`);
32
+ }
33
+ return value;
34
+ }
35
+ var verbShape = {
36
+ namespace: z.string().optional()
37
+ };
38
+ function browseRequest(verb, input) {
39
+ return {
40
+ verb,
41
+ ...optStr(input.path) !== void 0 ? { path: optStr(input.path) } : {},
42
+ ...optInt(input.depth) !== void 0 ? { depth: optInt(input.depth) } : {},
43
+ ...optStr(input.pattern) !== void 0 ? { pattern: optStr(input.pattern) } : {},
44
+ namespace: optStr(input.namespace)
45
+ };
46
+ }
47
+ defineOperation({
48
+ name: "memory_ls",
49
+ description: "List the children of one store path in the caller's namespace: category dirs with counts, memory files with a one-line description.",
50
+ schema: strictSchema({ ...verbShape, path: z.string().optional() }),
51
+ handler: async (input, ctx) => ({
52
+ result: await ctx.service.memoryStoreBrowse({ ...browseRequest("ls", input), authenticatedPrincipal: ctx.authenticatedPrincipal })
53
+ })
54
+ });
55
+ defineOperation({
56
+ name: "memory_tree",
57
+ description: "Depth-limited tree of store paths under one directory, one-line descriptions, entry-capped.",
58
+ schema: strictSchema({ ...verbShape, path: z.string().optional(), depth: z.union([z.number(), z.string()]).optional() }),
59
+ handler: async (input, ctx) => ({
60
+ result: await ctx.service.memoryStoreBrowse({ ...browseRequest("tree", input), authenticatedPrincipal: ctx.authenticatedPrincipal })
61
+ })
62
+ });
63
+ defineOperation({
64
+ name: "memory_find",
65
+ description: "Deterministic name/path match (`*` glob or substring) over the caller's namespace store; semantic search stays memory_search.",
66
+ schema: strictSchema({ ...verbShape, pattern: z.string() }),
67
+ handler: async (input, ctx) => ({
68
+ result: await ctx.service.memoryStoreBrowse({
69
+ ...browseRequest("find", { ...input, pattern: reqStr(input.pattern, "pattern") }),
70
+ authenticatedPrincipal: ctx.authenticatedPrincipal
71
+ })
72
+ })
73
+ });
74
+ //# sourceMappingURL=chunk-GXJSLNYO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/memory-browse-operations.ts"],"sourcesContent":["/**\n * Memory-store browse boundary operations (issue #2978).\n *\n * `memory_ls` / `memory_tree` / `memory_find` route MCP, HTTP, and CLI\n * dispatch through the shared validation + error-mapping layer\n * (access-boundary.ts) to the single `EngramAccessService.memoryStoreBrowse`\n * implementation. Sibling module so access-operations-batch.ts stays at its\n * ceiling seam (same layout as recall-navigation-operations.ts).\n */\n\nimport { z } from \"zod\";\n\nimport { defineOperation } from \"./access-boundary.js\";\nimport { EngramAccessInputError } from \"./access-errors.js\";\nimport type { BrowseVerb, MemoryStoreBrowseRequest } from \"./memory-browse.js\";\n\nfunction strictSchema<T extends z.ZodRawShape>(shape: T): z.ZodType<Record<string, unknown>> {\n return z.preprocess(\n (data) => {\n if (data !== null && typeof data === \"object\" && !Array.isArray(data)) {\n return Object.fromEntries(Object.entries(data as Record<string, unknown>).filter(([, value]) => value !== null));\n }\n return data;\n },\n z.object(shape).passthrough(),\n ) as unknown as z.ZodType<Record<string, unknown>>;\n}\n\nfunction optStr(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction optInt(value: unknown): number | undefined {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && Number.isFinite(Number(value))) return Number(value);\n return undefined;\n}\n\nfunction reqStr(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new EngramAccessInputError(`${field} is required`);\n }\n return value;\n}\n\nconst verbShape = {\n namespace: z.string().optional(),\n} as const;\n\nfunction browseRequest(verb: BrowseVerb, input: Record<string, unknown>): MemoryStoreBrowseRequest {\n return {\n verb,\n ...(optStr(input.path) !== undefined ? { path: optStr(input.path) } : {}),\n ...(optInt(input.depth) !== undefined ? { depth: optInt(input.depth) } : {}),\n ...(optStr(input.pattern) !== undefined ? { pattern: optStr(input.pattern) } : {}),\n namespace: optStr(input.namespace),\n };\n}\n\ndefineOperation({\n name: \"memory_ls\",\n description: \"List the children of one store path in the caller's namespace: category dirs with counts, memory files with a one-line description.\",\n schema: strictSchema({ ...verbShape, path: z.string().optional() }),\n handler: async (input, ctx) => ({\n result: await ctx.service.memoryStoreBrowse({ ...browseRequest(\"ls\", input), authenticatedPrincipal: ctx.authenticatedPrincipal }),\n }),\n});\n\ndefineOperation({\n name: \"memory_tree\",\n description: \"Depth-limited tree of store paths under one directory, one-line descriptions, entry-capped.\",\n schema: strictSchema({ ...verbShape, path: z.string().optional(), depth: z.union([z.number(), z.string()]).optional() }),\n handler: async (input, ctx) => ({\n result: await ctx.service.memoryStoreBrowse({ ...browseRequest(\"tree\", input), authenticatedPrincipal: ctx.authenticatedPrincipal }),\n }),\n});\n\ndefineOperation({\n name: \"memory_find\",\n description: \"Deterministic name/path match (`*` glob or substring) over the caller's namespace store; semantic search stays memory_search.\",\n schema: strictSchema({ ...verbShape, pattern: z.string() }),\n handler: async (input, ctx) => ({\n result: await ctx.service.memoryStoreBrowse({\n ...browseRequest(\"find\", { ...input, pattern: reqStr(input.pattern, \"pattern\") }),\n authenticatedPrincipal: ctx.authenticatedPrincipal,\n }),\n }),\n});\n"],"mappings":";;;;;;;;AAUA,SAAS,SAAS;AAMlB,SAAS,aAAsC,OAA8C;AAC3F,SAAO,EAAE;AAAA,IACP,CAAC,SAAS;AACR,UAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AACrE,eAAO,OAAO,YAAY,OAAO,QAAQ,IAA+B,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,IAAI,CAAC;AAAA,MACjH;AACA,aAAO;AAAA,IACT;AAAA,IACA,EAAE,OAAO,KAAK,EAAE,YAAY;AAAA,EAC9B;AACF;AAEA,SAAS,OAAO,OAAoC;AAClD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,OAAO,OAAoC;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,OAAO,KAAK,CAAC,EAAG,QAAO,OAAO,KAAK;AACpF,SAAO;AACT;AAEA,SAAS,OAAO,OAAgB,OAAuB;AACrD,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,UAAM,IAAI,uBAAuB,GAAG,KAAK,cAAc;AAAA,EACzD;AACA,SAAO;AACT;AAEA,IAAM,YAAY;AAAA,EAChB,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC;AAEA,SAAS,cAAc,MAAkB,OAA0D;AACjG,SAAO;AAAA,IACL;AAAA,IACA,GAAI,OAAO,MAAM,IAAI,MAAM,SAAY,EAAE,MAAM,OAAO,MAAM,IAAI,EAAE,IAAI,CAAC;AAAA,IACvE,GAAI,OAAO,MAAM,KAAK,MAAM,SAAY,EAAE,OAAO,OAAO,MAAM,KAAK,EAAE,IAAI,CAAC;AAAA,IAC1E,GAAI,OAAO,MAAM,OAAO,MAAM,SAAY,EAAE,SAAS,OAAO,MAAM,OAAO,EAAE,IAAI,CAAC;AAAA,IAChF,WAAW,OAAO,MAAM,SAAS;AAAA,EACnC;AACF;AAEA,gBAAgB;AAAA,EACd,MAAM;AAAA,EACN,aAAa;AAAA,EACb,QAAQ,aAAa,EAAE,GAAG,WAAW,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAAA,EAClE,SAAS,OAAO,OAAO,SAAS;AAAA,IAC9B,QAAQ,MAAM,IAAI,QAAQ,kBAAkB,EAAE,GAAG,cAAc,MAAM,KAAK,GAAG,wBAAwB,IAAI,uBAAuB,CAAC;AAAA,EACnI;AACF,CAAC;AAED,gBAAgB;AAAA,EACd,MAAM;AAAA,EACN,aAAa;AAAA,EACb,QAAQ,aAAa,EAAE,GAAG,WAAW,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;AAAA,EACvH,SAAS,OAAO,OAAO,SAAS;AAAA,IAC9B,QAAQ,MAAM,IAAI,QAAQ,kBAAkB,EAAE,GAAG,cAAc,QAAQ,KAAK,GAAG,wBAAwB,IAAI,uBAAuB,CAAC;AAAA,EACrI;AACF,CAAC;AAED,gBAAgB;AAAA,EACd,MAAM;AAAA,EACN,aAAa;AAAA,EACb,QAAQ,aAAa,EAAE,GAAG,WAAW,SAAS,EAAE,OAAO,EAAE,CAAC;AAAA,EAC1D,SAAS,OAAO,OAAO,SAAS;AAAA,IAC9B,QAAQ,MAAM,IAAI,QAAQ,kBAAkB;AAAA,MAC1C,GAAG,cAAc,QAAQ,EAAE,GAAG,OAAO,SAAS,OAAO,MAAM,SAAS,SAAS,EAAE,CAAC;AAAA,MAChF,wBAAwB,IAAI;AAAA,IAC9B,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-5JMAGU26.js";
6
6
  import {
7
7
  runPostConsolidationMaterialize
8
- } from "./chunk-MDYZCPNQ.js";
8
+ } from "./chunk-WL3PGPGU.js";
9
9
  import {
10
10
  isSemanticConsolidationLlmOperator
11
11
  } from "./chunk-G7D6GZ5J.js";
@@ -220,4 +220,4 @@ export {
220
220
  buildExtensionsBlockForConsolidation,
221
221
  materializeAfterSemanticConsolidation
222
222
  };
223
- //# sourceMappingURL=chunk-VA5QRTZX.js.map
223
+ //# sourceMappingURL=chunk-HG74GEVY.js.map
@@ -0,0 +1,54 @@
1
+ import {
2
+ EngramAccessInputError
3
+ } from "./chunk-2Z24E5W2.js";
4
+
5
+ // src/memory-browse-http-glue.ts
6
+ function optStr(value) {
7
+ return typeof value === "string" ? value : void 0;
8
+ }
9
+ function optInt(value) {
10
+ if (value === void 0 || value === null || value === "") return void 0;
11
+ const parsed = typeof value === "string" ? Number(value) : value;
12
+ if (typeof parsed !== "number" || !Number.isInteger(parsed)) {
13
+ throw new EngramAccessInputError("depth must be an integer");
14
+ }
15
+ return parsed;
16
+ }
17
+ async function respondBrowse(req, res, respondJson, readJsonBody, service, scopeFor, verb) {
18
+ const body = await readJsonBody(req);
19
+ const scope = scopeFor(optStr(body.namespace));
20
+ const depth = verb === "tree" ? optInt(body.depth) : void 0;
21
+ const result = await service.memoryStoreBrowse({
22
+ verb,
23
+ ...optStr(body.path) !== void 0 ? { path: optStr(body.path) } : {},
24
+ ...depth !== void 0 ? { depth } : {},
25
+ ...verb === "find" && optStr(body.pattern) !== void 0 ? { pattern: optStr(body.pattern) } : {},
26
+ namespace: scope.namespace,
27
+ authenticatedPrincipal: scope.authenticatedPrincipal
28
+ });
29
+ const { rendered: _rendered, ...payload } = result;
30
+ respondJson(res, 200, payload);
31
+ }
32
+ async function maybeRespondMemoryBrowse(req, res, pathname, method, enforceTokenOp, respondJson, readJsonBody, service, scopeFor) {
33
+ if (method === "POST" && (pathname === "/engram/v1/memory/ls" || pathname === "/remnic/v1/memory/ls")) {
34
+ enforceTokenOp("memory_ls");
35
+ await respondBrowse(req, res, respondJson, readJsonBody, service, scopeFor, "ls");
36
+ return true;
37
+ }
38
+ if (method === "POST" && (pathname === "/engram/v1/memory/tree" || pathname === "/remnic/v1/memory/tree")) {
39
+ enforceTokenOp("memory_tree");
40
+ await respondBrowse(req, res, respondJson, readJsonBody, service, scopeFor, "tree");
41
+ return true;
42
+ }
43
+ if (method === "POST" && (pathname === "/engram/v1/memory/find" || pathname === "/remnic/v1/memory/find")) {
44
+ enforceTokenOp("memory_find");
45
+ await respondBrowse(req, res, respondJson, readJsonBody, service, scopeFor, "find");
46
+ return true;
47
+ }
48
+ return false;
49
+ }
50
+
51
+ export {
52
+ maybeRespondMemoryBrowse
53
+ };
54
+ //# sourceMappingURL=chunk-HMDYSGY6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/memory-browse-http-glue.ts"],"sourcesContent":["/**\n * Memory-store browse HTTP glue (issue #2978) — route bodies live here so\n * access-http.ts stays at its structural ceiling (same seam as\n * recall-navigation-http-glue.ts).\n *\n * Each route carries its literal `enforceTokenOp(\"<op>\")` boundary-dispatch\n * marker so `access-surface-catalog.test.ts` can prove dispatch statically.\n * Input errors map to 400; everything else rethrows to the global 500\n * handler. Namespace resolution flows through the caller-supplied\n * `scopeFor` gate so a body-supplied namespace passes the SAME\n * effective-namespace allow-list as the query string (issue #1850 finding\n * 2), and `authenticatedPrincipal` reaches the service so authorization\n * derives from the presenting principal, never client-supplied input.\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport { EngramAccessInputError } from \"./access-errors.js\";\nimport type { EngramAccessService } from \"./access-service.js\";\nimport type { BrowseVerb } from \"./memory-browse.js\";\n\ntype RespondJson = (res: ServerResponse, status: number, payload: unknown) => void;\ntype ReadJsonBody = (req: IncomingMessage) => Promise<unknown>;\n\ntype ScopeFor = (\n bodyNamespace?: string,\n) => { namespace?: string; authenticatedPrincipal?: string };\n\nfunction optStr(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction optInt(value: unknown): number | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n const parsed = typeof value === \"string\" ? Number(value) : value;\n if (typeof parsed !== \"number\" || !Number.isInteger(parsed)) {\n throw new EngramAccessInputError(\"depth must be an integer\");\n }\n return parsed;\n}\n\nasync function respondBrowse(\n req: IncomingMessage,\n res: ServerResponse,\n respondJson: RespondJson,\n readJsonBody: ReadJsonBody,\n service: EngramAccessService,\n scopeFor: ScopeFor,\n verb: BrowseVerb,\n): Promise<void> {\n const body = (await readJsonBody(req)) as Record<string, unknown>;\n const scope = scopeFor(optStr(body.namespace));\n const depth = verb === \"tree\" ? optInt(body.depth) : undefined;\n const result = await service.memoryStoreBrowse({\n verb,\n ...(optStr(body.path) !== undefined ? { path: optStr(body.path) } : {}),\n ...(depth !== undefined ? { depth } : {}),\n ...(verb === \"find\" && optStr(body.pattern) !== undefined ? { pattern: optStr(body.pattern) } : {}),\n namespace: scope.namespace,\n authenticatedPrincipal: scope.authenticatedPrincipal,\n });\n const { rendered: _rendered, ...payload } = result;\n respondJson(res, 200, payload);\n}\n\nexport async function maybeRespondMemoryBrowse(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n method: string | undefined,\n enforceTokenOp: (op: \"memory_ls\" | \"memory_tree\" | \"memory_find\") => void,\n respondJson: RespondJson,\n readJsonBody: ReadJsonBody,\n service: EngramAccessService,\n scopeFor: ScopeFor,\n): Promise<boolean> {\n if (method === \"POST\" && (pathname === \"/engram/v1/memory/ls\" || pathname === \"/remnic/v1/memory/ls\")) {\n enforceTokenOp(\"memory_ls\");\n await respondBrowse(req, res, respondJson, readJsonBody, service, scopeFor, \"ls\");\n return true;\n }\n if (method === \"POST\" && (pathname === \"/engram/v1/memory/tree\" || pathname === \"/remnic/v1/memory/tree\")) {\n enforceTokenOp(\"memory_tree\");\n await respondBrowse(req, res, respondJson, readJsonBody, service, scopeFor, \"tree\");\n return true;\n }\n if (method === \"POST\" && (pathname === \"/engram/v1/memory/find\" || pathname === \"/remnic/v1/memory/find\")) {\n enforceTokenOp(\"memory_find\");\n await respondBrowse(req, res, respondJson, readJsonBody, service, scopeFor, \"find\");\n return true;\n }\n return false;\n}\n"],"mappings":";;;;;AA4BA,SAAS,OAAO,OAAoC;AAClD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,OAAO,OAAoC;AAClD,MAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,GAAI,QAAO;AAClE,QAAM,SAAS,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AAC3D,MAAI,OAAO,WAAW,YAAY,CAAC,OAAO,UAAU,MAAM,GAAG;AAC3D,UAAM,IAAI,uBAAuB,0BAA0B;AAAA,EAC7D;AACA,SAAO;AACT;AAEA,eAAe,cACb,KACA,KACA,aACA,cACA,SACA,UACA,MACe;AACf,QAAM,OAAQ,MAAM,aAAa,GAAG;AACpC,QAAM,QAAQ,SAAS,OAAO,KAAK,SAAS,CAAC;AAC7C,QAAM,QAAQ,SAAS,SAAS,OAAO,KAAK,KAAK,IAAI;AACrD,QAAM,SAAS,MAAM,QAAQ,kBAAkB;AAAA,IAC7C;AAAA,IACA,GAAI,OAAO,KAAK,IAAI,MAAM,SAAY,EAAE,MAAM,OAAO,KAAK,IAAI,EAAE,IAAI,CAAC;AAAA,IACrE,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC,GAAI,SAAS,UAAU,OAAO,KAAK,OAAO,MAAM,SAAY,EAAE,SAAS,OAAO,KAAK,OAAO,EAAE,IAAI,CAAC;AAAA,IACjG,WAAW,MAAM;AAAA,IACjB,wBAAwB,MAAM;AAAA,EAChC,CAAC;AACD,QAAM,EAAE,UAAU,WAAW,GAAG,QAAQ,IAAI;AAC5C,cAAY,KAAK,KAAK,OAAO;AAC/B;AAEA,eAAsB,yBACpB,KACA,KACA,UACA,QACA,gBACA,aACA,cACA,SACA,UACkB;AAClB,MAAI,WAAW,WAAW,aAAa,0BAA0B,aAAa,yBAAyB;AACrG,mBAAe,WAAW;AAC1B,UAAM,cAAc,KAAK,KAAK,aAAa,cAAc,SAAS,UAAU,IAAI;AAChF,WAAO;AAAA,EACT;AACA,MAAI,WAAW,WAAW,aAAa,4BAA4B,aAAa,2BAA2B;AACzG,mBAAe,aAAa;AAC5B,UAAM,cAAc,KAAK,KAAK,aAAa,cAAc,SAAS,UAAU,MAAM;AAClF,WAAO;AAAA,EACT;AACA,MAAI,WAAW,WAAW,aAAa,4BAA4B,aAAa,2BAA2B;AACzG,mBAAe,aAAa;AAC5B,UAAM,cAAc,KAAK,KAAK,aAAa,cAAc,SAAS,UAAU,MAAM;AAClF,WAAO;AAAA,EACT;AACA,SAAO;AACT;","names":[]}
@@ -1,12 +1,12 @@
1
- import {
2
- rankDeepRecallFrontier
3
- } from "./chunk-HRATODNO.js";
4
1
  import {
5
2
  validateRefineRewrite
6
3
  } from "./chunk-WTWQA7BB.js";
7
4
  import {
8
5
  selectExpandNodeIds
9
6
  } from "./chunk-VZIAVM72.js";
7
+ import {
8
+ rankDeepRecallFrontier
9
+ } from "./chunk-HRATODNO.js";
10
10
  import {
11
11
  extractJsonCandidates,
12
12
  stripCodeFences
@@ -384,4 +384,4 @@ async function runBudgetedDeepRecall(deps, query) {
384
384
  export {
385
385
  runBudgetedDeepRecall
386
386
  };
387
- //# sourceMappingURL=chunk-WUUGE7QC.js.map
387
+ //# sourceMappingURL=chunk-HS75MCQF.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-DBB5JPSL.js";
4
4
  import {
5
5
  isGenericRecallExcludedPath
6
- } from "./chunk-EC5SVM6H.js";
6
+ } from "./chunk-DE4ZGH2N.js";
7
7
  import {
8
8
  shouldFilterSupersededFromRecall
9
9
  } from "./chunk-5WITETWU.js";
@@ -69,4 +69,4 @@ export {
69
69
  filterRecentScanMemoriesForStateView,
70
70
  indexStateViewAnnotatedResults
71
71
  };
72
- //# sourceMappingURL=chunk-DO6R3LIE.js.map
72
+ //# sourceMappingURL=chunk-I6IJDTRP.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createSearchBackend
3
- } from "./chunk-C3YEB7CR.js";
3
+ } from "./chunk-PA67GXYJ.js";
4
4
  import {
5
5
  namespaceIdentityToken,
6
6
  normalizeNamespaceIdentity
@@ -508,4 +508,4 @@ export {
508
508
  NamespaceSearchRouter,
509
509
  normalizeQmdResultPath
510
510
  };
511
- //# sourceMappingURL=chunk-T3F2HWIG.js.map
511
+ //# sourceMappingURL=chunk-IO7K7GES.js.map
@@ -23,7 +23,7 @@ import {
23
23
  } from "./chunk-7ZNJN5WZ.js";
24
24
  import {
25
25
  compareEntityTimestamps
26
- } from "./chunk-IAT5WFEU.js";
26
+ } from "./chunk-MNG536IS.js";
27
27
  import {
28
28
  normalizeEntityName
29
29
  } from "./chunk-YXZG5TVN.js";
@@ -918,4 +918,4 @@ export {
918
918
  entityIndexVersion,
919
919
  entityRecentTranscriptLookbackHours
920
920
  };
921
- //# sourceMappingURL=chunk-6II55MXS.js.map
921
+ //# sourceMappingURL=chunk-JXLEQIJ7.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  applyExtractionSourceGrounding
3
- } from "./chunk-PGAB2V53.js";
3
+ } from "./chunk-SMBWBEE7.js";
4
4
  import {
5
5
  CONNECTOR_LABEL_MAX_LENGTH,
6
6
  knownConnectorIds
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-SGUDMW2K.js";
11
11
  import {
12
12
  deriveSourceConnector
13
- } from "./chunk-EUP4AXIW.js";
13
+ } from "./chunk-B6VDWDFN.js";
14
14
  import {
15
15
  resolvePipelineProcessingCapabilities
16
16
  } from "./chunk-JUOZ62Y7.js";
@@ -112,4 +112,4 @@ export {
112
112
  renderExtractionConversation,
113
113
  applyGroundingWithConnector
114
114
  };
115
- //# sourceMappingURL=chunk-4XTSKGLX.js.map
115
+ //# sourceMappingURL=chunk-JYXLW22X.js.map
@@ -0,0 +1,218 @@
1
+ import {
2
+ coerceBooleanLike,
3
+ coerceNumber
4
+ } from "./chunk-PQVCH2AE.js";
5
+
6
+ // src/standing-memory-block.ts
7
+ var DEFAULT_RECALL_STANDING_BLOCK = false;
8
+ var DEFAULT_STANDING_BLOCK_FRESH_DAYS = 14;
9
+ var DEFAULT_STANDING_BLOCK_MAX_CHARS = 2048;
10
+ var DEFAULT_STANDING_BLOCK_HOOK_CHARS = 96;
11
+ var STANDING_BLOCK_HEADER = "## Standing Memory (Remnic)";
12
+ var STANDING_BLOCK_INSTRUCTION = "Use this standing index for orientation. It changes only when the memory store changes.";
13
+ var STANDING_BLOCK_TRIMMED_MARKER = "- ...(older lines trimmed)";
14
+ function standingHookLedgerKey(description, hookMaxChars) {
15
+ return `${description}\0${hookMaxChars}`;
16
+ }
17
+ var ISO_DATE_RE = /\b\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2})?/;
18
+ var CLOCK_TIME_RE = /\b\d{1,2}:\d{2}(?::\d{2})?\b/;
19
+ var RELATIVE_DATE_RE = /\b(?:today|tonight|tomorrow|yesterday|this\s+(?:morning|afternoon|evening|week|month|year))\b/i;
20
+ var COUNTER_RE = /\b(?:count|total|entries|memories|items)\s*[:=]\s*\d+\b/i;
21
+ function lintStandingBlockVolatility(text) {
22
+ const matches = [];
23
+ for (const [kind, re] of [
24
+ ["iso-date", ISO_DATE_RE],
25
+ ["clock-time", CLOCK_TIME_RE],
26
+ ["relative-date", RELATIVE_DATE_RE],
27
+ ["counter", COUNTER_RE]
28
+ ]) {
29
+ const hit = text.match(re);
30
+ if (hit) matches.push({ kind, token: hit[0] });
31
+ }
32
+ return matches;
33
+ }
34
+ var StandingBlockError = class extends Error {
35
+ constructor(message) {
36
+ super(message);
37
+ this.name = "StandingBlockError";
38
+ }
39
+ };
40
+ var StandingBlockVolatilityError = class extends StandingBlockError {
41
+ matches;
42
+ constructor(matches) {
43
+ super(
44
+ `standing memory block refused: volatile content busts the prefix cache (${matches.map((m) => `${m.kind}:${JSON.stringify(m.token)}`).join(", ")})`
45
+ );
46
+ this.name = "StandingBlockVolatilityError";
47
+ this.matches = matches;
48
+ }
49
+ };
50
+ var StandingBlockBudgetError = class extends StandingBlockError {
51
+ constructor(maxChars) {
52
+ super(
53
+ `standing memory block does not fit: pinned lines alone exceed maxChars=${maxChars}; raise standingBlockMaxChars or unpin entries`
54
+ );
55
+ this.name = "StandingBlockBudgetError";
56
+ }
57
+ };
58
+ function parseRecallStandingBlock(raw) {
59
+ return coerceBooleanLike(raw, "recallStandingBlock") === true;
60
+ }
61
+ function parseStandingBlockFreshDays(raw) {
62
+ if (raw === void 0 || raw === null) return DEFAULT_STANDING_BLOCK_FRESH_DAYS;
63
+ const n = coerceNumber(raw, "standingBlockFreshDays");
64
+ if (n === void 0 || !Number.isFinite(n) || n < 0) {
65
+ throw new Error(`Invalid standingBlockFreshDays: expected a number >= 0, got ${JSON.stringify(raw)}`);
66
+ }
67
+ return n;
68
+ }
69
+ function parseStandingBlockMaxChars(raw) {
70
+ if (raw === void 0 || raw === null) return DEFAULT_STANDING_BLOCK_MAX_CHARS;
71
+ const n = coerceNumber(raw, "standingBlockMaxChars");
72
+ if (n === void 0 || !Number.isFinite(n) || n < 1) {
73
+ throw new Error(`Invalid standingBlockMaxChars: expected an integer >= 1, got ${JSON.stringify(raw)}`);
74
+ }
75
+ return Math.floor(n);
76
+ }
77
+ function mechanicalHook(description, budget) {
78
+ if (description.length <= budget) return description;
79
+ const cut = description.slice(0, budget);
80
+ const lastSpace = cut.lastIndexOf(" ");
81
+ const base = lastSpace > Math.floor(budget * 0.6) ? cut.slice(0, lastSpace) : cut;
82
+ return `${base.replace(/[\s,;:]+$/, "")}...`;
83
+ }
84
+ var BAND_RANK = { pinned: 0, fresh: 1, compressed: 2 };
85
+ function validateEntries(entries) {
86
+ if (!Array.isArray(entries)) {
87
+ throw new StandingBlockError("standing memory block entries must be an array");
88
+ }
89
+ const seen = /* @__PURE__ */ new Set();
90
+ const validated = /* @__PURE__ */ new Map();
91
+ for (const entry of entries) {
92
+ if (typeof entry !== "object" || entry === null) {
93
+ throw new StandingBlockError(`standing memory block entry must be an object, got ${JSON.stringify(entry)}`);
94
+ }
95
+ const id = typeof entry.id === "string" ? entry.id.trim() : "";
96
+ const description = typeof entry.description === "string" ? entry.description.trim() : "";
97
+ if (id.length === 0) {
98
+ throw new StandingBlockError("standing memory block entry requires a non-empty id");
99
+ }
100
+ if (description.length === 0) {
101
+ throw new StandingBlockError(`standing memory block entry ${id} requires a non-empty description`);
102
+ }
103
+ if (seen.has(id)) {
104
+ throw new StandingBlockError(`standing memory block entry ids must be unique; duplicate: ${id}`);
105
+ }
106
+ if (entry.lastChangedAt !== void 0 && Number.isNaN(Date.parse(entry.lastChangedAt))) {
107
+ throw new StandingBlockError(
108
+ `standing memory block entry ${id} has an unparseable lastChangedAt: ${JSON.stringify(entry.lastChangedAt)}`
109
+ );
110
+ }
111
+ seen.add(id);
112
+ validated.set(id, { ...entry, id, description });
113
+ }
114
+ return validated;
115
+ }
116
+ function buildStandingMemoryBlock(input) {
117
+ const freshDays = input.freshDays ?? DEFAULT_STANDING_BLOCK_FRESH_DAYS;
118
+ const maxChars = input.maxChars ?? DEFAULT_STANDING_BLOCK_MAX_CHARS;
119
+ const hookMaxChars = input.hookMaxChars ?? DEFAULT_STANDING_BLOCK_HOOK_CHARS;
120
+ if (!Number.isFinite(input.nowMs)) {
121
+ throw new StandingBlockError("standing memory block requires a finite nowMs");
122
+ }
123
+ if (!(freshDays >= 0) || !Number.isFinite(freshDays)) {
124
+ throw new StandingBlockError("standing memory block requires freshDays >= 0");
125
+ }
126
+ if (!(maxChars >= 1) || !Number.isFinite(maxChars)) {
127
+ throw new StandingBlockError("standing memory block requires maxChars >= 1");
128
+ }
129
+ if (!(hookMaxChars >= 1) || !Number.isFinite(hookMaxChars)) {
130
+ throw new StandingBlockError("standing memory block requires hookMaxChars >= 1");
131
+ }
132
+ const entries = validateEntries(input.entries);
133
+ const ledger = new Map(input.ledger ?? []);
134
+ if (entries.size === 0) {
135
+ return {
136
+ text: "",
137
+ lines: [],
138
+ ledger,
139
+ bandCounts: { pinned: 0, fresh: 0, compressed: 0, dropped: 0 }
140
+ };
141
+ }
142
+ const freshCutoff = input.nowMs - freshDays * 864e5;
143
+ const layered = [];
144
+ for (const entry of entries.values()) {
145
+ let band;
146
+ if (entry.pinned === true) {
147
+ band = "pinned";
148
+ } else if (typeof entry.lastChangedAt === "string" && Date.parse(entry.lastChangedAt) >= freshCutoff && Date.parse(entry.lastChangedAt) <= input.nowMs) {
149
+ band = "fresh";
150
+ } else {
151
+ band = "compressed";
152
+ }
153
+ if (band !== "compressed") {
154
+ layered.push({ id: entry.id, band, line: `- ${entry.description}` });
155
+ continue;
156
+ }
157
+ const key = standingHookLedgerKey(entry.description, hookMaxChars);
158
+ const cached = ledger.get(key);
159
+ const hook = cached ?? mechanicalHook(entry.description, hookMaxChars);
160
+ if (cached === void 0) ledger.set(key, hook);
161
+ layered.push({ id: entry.id, band, line: `- ${hook}` });
162
+ }
163
+ layered.sort(
164
+ (a, b) => BAND_RANK[a.band] - BAND_RANK[b.band] || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)
165
+ );
166
+ const render = (keep2, withMarker) => {
167
+ const body = layered.slice(0, keep2).map((item) => item.line);
168
+ if (withMarker) body.push(STANDING_BLOCK_TRIMMED_MARKER);
169
+ const lines = [STANDING_BLOCK_HEADER, "", ...body, "", STANDING_BLOCK_INSTRUCTION];
170
+ return { text: lines.join("\n"), lines };
171
+ };
172
+ const pinnedCount = layered.filter((item) => item.band === "pinned").length;
173
+ let keep = layered.length;
174
+ let rendered = render(keep, false);
175
+ while (rendered.text.length > maxChars && keep > pinnedCount) {
176
+ keep -= 1;
177
+ rendered = render(keep, true);
178
+ }
179
+ if (rendered.text.length > maxChars) {
180
+ throw new StandingBlockBudgetError(maxChars);
181
+ }
182
+ const volatility = lintStandingBlockVolatility(rendered.text);
183
+ if (volatility.length > 0) {
184
+ throw new StandingBlockVolatilityError(volatility);
185
+ }
186
+ const kept = layered.slice(0, keep);
187
+ return {
188
+ text: rendered.text,
189
+ lines: rendered.lines,
190
+ ledger,
191
+ bandCounts: {
192
+ pinned: kept.filter((item) => item.band === "pinned").length,
193
+ fresh: kept.filter((item) => item.band === "fresh").length,
194
+ compressed: kept.filter((item) => item.band === "compressed").length,
195
+ dropped: layered.length - keep
196
+ }
197
+ };
198
+ }
199
+
200
+ export {
201
+ DEFAULT_RECALL_STANDING_BLOCK,
202
+ DEFAULT_STANDING_BLOCK_FRESH_DAYS,
203
+ DEFAULT_STANDING_BLOCK_MAX_CHARS,
204
+ DEFAULT_STANDING_BLOCK_HOOK_CHARS,
205
+ STANDING_BLOCK_HEADER,
206
+ STANDING_BLOCK_INSTRUCTION,
207
+ STANDING_BLOCK_TRIMMED_MARKER,
208
+ standingHookLedgerKey,
209
+ lintStandingBlockVolatility,
210
+ StandingBlockError,
211
+ StandingBlockVolatilityError,
212
+ StandingBlockBudgetError,
213
+ parseRecallStandingBlock,
214
+ parseStandingBlockFreshDays,
215
+ parseStandingBlockMaxChars,
216
+ buildStandingMemoryBlock
217
+ };
218
+ //# sourceMappingURL=chunk-LI4APB6M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/standing-memory-block.ts"],"sourcesContent":["/**\n * Prefix-cache-stable standing memory block (issue #2971, foundation slice).\n *\n * A standing block is a compact, byte-stable index over pinned/high-value\n * memories that a host injects as the FIRST part of the system prompt, so\n * the LLM prefix cache survives across turns. Measured motivation\n * (distill-kura, local OpenAI-compatible server): an identical 4k-token\n * prefix reprices at 0.14 s vs 0.68 s cold, and one changed word at the\n * front costs the whole cache. So the block contains no clock, no date,\n * and no counter — and the builder REFUSES, at build time, any block that\n * carries one instead of discovering slow turns weeks later.\n *\n * Determinism rules (byte-identical between rebuilds):\n * - line order is band rank, then id codepoint order — never wall clock,\n * never insertion order, never locale collation;\n * - `nowMs` classifies bands but never renders into the text;\n * - the trimmed-tail marker is a constant string (no count of dropped\n * lines, which would itself be a counter).\n *\n * Host contract for the full feature (later wiring slices):\n * - rebuild only when the underlying store changes (store version), not\n * per turn and not on a timer — band edges must not drift mid-session;\n * - inject the standing block BEFORE per-turn dynamic recall and any\n * ticking content (persona with a clock), see docs/config-reference.md;\n * - selection of which memories qualify (pinned/high-value) happens\n * before this builder — it only layers and renders what it is given;\n * - on build failure (volatility, budget) skip injection and log — the\n * dynamic recall surface must not go blank.\n *\n * Pure: no I/O, inputs never mutated, the returned ledger is a fresh Map.\n */\nimport { coerceBooleanLike, coerceNumber } from \"./connectors/coerce.js\";\n\nexport const DEFAULT_RECALL_STANDING_BLOCK = false;\nexport const DEFAULT_STANDING_BLOCK_FRESH_DAYS = 14;\nexport const DEFAULT_STANDING_BLOCK_MAX_CHARS = 2048;\n/** ~24-token recognition hook at the repo's 4-chars-per-token Latin headroom. */\nexport const DEFAULT_STANDING_BLOCK_HOOK_CHARS = 96;\n\nexport const STANDING_BLOCK_HEADER = \"## Standing Memory (Remnic)\";\nexport const STANDING_BLOCK_INSTRUCTION =\n \"Use this standing index for orientation. It changes only when the memory store changes.\";\nexport const STANDING_BLOCK_TRIMMED_MARKER = \"- ...(older lines trimmed)\";\n\nexport type StandingBand = \"pinned\" | \"fresh\" | \"compressed\";\n\nexport interface StandingMemoryEntry {\n /** Stable document id. Total order within a band is id codepoint order. */\n id: string;\n /** The one-line description to stand in the index. */\n description: string;\n /** Pinned entries render in full, first band, never trimmed away. */\n pinned?: boolean;\n /** ISO timestamp of the last content change; drives the fresh band. */\n lastChangedAt?: string;\n}\n\n/** Cache of compressed hooks keyed on `${description}\\u0000${hookMaxChars}`. */\nexport type StandingHookLedger = ReadonlyMap<string, string>;\n\nexport function standingHookLedgerKey(description: string, hookMaxChars: number): string {\n return `${description}\\u0000${hookMaxChars}`;\n}\n\nexport interface StandingBlockBandCounts {\n pinned: number;\n fresh: number;\n compressed: number;\n dropped: number;\n}\n\nexport interface StandingMemoryBlock {\n /** Full block text (header + lines + instruction). Empty string for no entries. */\n text: string;\n /** Lines without a trailing newline; empty for no entries. */\n lines: string[];\n /** Ledger including hooks generated this build. Fresh Map; input never mutated. */\n ledger: StandingHookLedger;\n bandCounts: StandingBlockBandCounts;\n}\n\nexport type StandingVolatilityKind = \"iso-date\" | \"clock-time\" | \"relative-date\" | \"counter\";\n\nexport interface StandingVolatilityMatch {\n kind: StandingVolatilityKind;\n token: string;\n}\n\nconst ISO_DATE_RE = /\\b\\d{4}-\\d{2}-\\d{2}(?:[T ]\\d{2}:\\d{2})?/;\nconst CLOCK_TIME_RE = /\\b\\d{1,2}:\\d{2}(?::\\d{2})?\\b/;\nconst RELATIVE_DATE_RE =\n /\\b(?:today|tonight|tomorrow|yesterday|this\\s+(?:morning|afternoon|evening|week|month|year))\\b/i;\nconst COUNTER_RE = /\\b(?:count|total|entries|memories|items)\\s*[:=]\\s*\\d+\\b/i;\n\n/**\n * Build-time volatility lint. Returns every cache-busting token class found:\n * ISO dates/datetimes, clock times, relative date words, and index counters.\n * Refusal is the designed behavior (a memory surface skips the block and\n * logs) — a silently repricing prefix is the failure this catches.\n */\nexport function lintStandingBlockVolatility(text: string): StandingVolatilityMatch[] {\n const matches: StandingVolatilityMatch[] = [];\n for (const [kind, re] of [\n [\"iso-date\", ISO_DATE_RE],\n [\"clock-time\", CLOCK_TIME_RE],\n [\"relative-date\", RELATIVE_DATE_RE],\n [\"counter\", COUNTER_RE],\n ] as const) {\n const hit = text.match(re);\n if (hit) matches.push({ kind, token: hit[0] });\n }\n return matches;\n}\n\nexport class StandingBlockError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StandingBlockError\";\n }\n}\n\nexport class StandingBlockVolatilityError extends StandingBlockError {\n readonly matches: readonly StandingVolatilityMatch[];\n constructor(matches: readonly StandingVolatilityMatch[]) {\n super(\n `standing memory block refused: volatile content busts the prefix cache (${matches\n .map((m) => `${m.kind}:${JSON.stringify(m.token)}`)\n .join(\", \")})`,\n );\n this.name = \"StandingBlockVolatilityError\";\n this.matches = matches;\n }\n}\n\nexport class StandingBlockBudgetError extends StandingBlockError {\n constructor(maxChars: number) {\n super(\n `standing memory block does not fit: pinned lines alone exceed maxChars=${maxChars}; raise standingBlockMaxChars or unpin entries`,\n );\n this.name = \"StandingBlockBudgetError\";\n }\n}\n\nexport function parseRecallStandingBlock(raw: unknown): boolean {\n return coerceBooleanLike(raw, \"recallStandingBlock\") === true;\n}\n\nexport function parseStandingBlockFreshDays(raw: unknown): number {\n if (raw === undefined || raw === null) return DEFAULT_STANDING_BLOCK_FRESH_DAYS;\n const n = coerceNumber(raw, \"standingBlockFreshDays\");\n if (n === undefined || !Number.isFinite(n) || n < 0) {\n throw new Error(`Invalid standingBlockFreshDays: expected a number >= 0, got ${JSON.stringify(raw)}`);\n }\n return n;\n}\n\nexport function parseStandingBlockMaxChars(raw: unknown): number {\n if (raw === undefined || raw === null) return DEFAULT_STANDING_BLOCK_MAX_CHARS;\n const n = coerceNumber(raw, \"standingBlockMaxChars\");\n if (n === undefined || !Number.isFinite(n) || n < 1) {\n throw new Error(`Invalid standingBlockMaxChars: expected an integer >= 1, got ${JSON.stringify(raw)}`);\n }\n return Math.floor(n);\n}\n\n/**\n * Mechanical hook: deterministic first-cut of the description to the char\n * budget at a word boundary. This is also the fallback when no model is\n * reachable for compression — the standing surface never goes blank because\n * a model is down. Model-generated hooks arrive pre-seeded in the ledger.\n */\nfunction mechanicalHook(description: string, budget: number): string {\n if (description.length <= budget) return description;\n const cut = description.slice(0, budget);\n const lastSpace = cut.lastIndexOf(\" \");\n const base = lastSpace > Math.floor(budget * 0.6) ? cut.slice(0, lastSpace) : cut;\n return `${base.replace(/[\\s,;:]+$/, \"\")}...`;\n}\n\ninterface LayeredEntry {\n id: string;\n band: StandingBand;\n line: string;\n}\n\nconst BAND_RANK: Record<StandingBand, number> = { pinned: 0, fresh: 1, compressed: 2 };\n\nfunction validateEntries(entries: readonly StandingMemoryEntry[]): Map<string, StandingMemoryEntry> {\n if (!Array.isArray(entries)) {\n throw new StandingBlockError(\"standing memory block entries must be an array\");\n }\n const seen = new Set<string>();\n const validated = new Map<string, StandingMemoryEntry>();\n for (const entry of entries) {\n if (typeof entry !== \"object\" || entry === null) {\n throw new StandingBlockError(`standing memory block entry must be an object, got ${JSON.stringify(entry)}`);\n }\n const id = typeof entry.id === \"string\" ? entry.id.trim() : \"\";\n const description = typeof entry.description === \"string\" ? entry.description.trim() : \"\";\n if (id.length === 0) {\n throw new StandingBlockError(\"standing memory block entry requires a non-empty id\");\n }\n if (description.length === 0) {\n throw new StandingBlockError(`standing memory block entry ${id} requires a non-empty description`);\n }\n if (seen.has(id)) {\n throw new StandingBlockError(`standing memory block entry ids must be unique; duplicate: ${id}`);\n }\n if (entry.lastChangedAt !== undefined && Number.isNaN(Date.parse(entry.lastChangedAt))) {\n throw new StandingBlockError(\n `standing memory block entry ${id} has an unparseable lastChangedAt: ${JSON.stringify(entry.lastChangedAt)}`,\n );\n }\n seen.add(id);\n validated.set(id, { ...entry, id, description });\n }\n return validated;\n}\n\nexport interface StandingMemoryBlockInput {\n entries: readonly StandingMemoryEntry[];\n /**\n * Evaluation instant for the fresh band. Hosts must key rebuilds on the\n * store version, not on this clock, or band edges drift per turn.\n */\n nowMs: number;\n freshDays?: number;\n maxChars?: number;\n hookMaxChars?: number;\n ledger?: StandingHookLedger;\n}\n\nexport function buildStandingMemoryBlock(input: StandingMemoryBlockInput): StandingMemoryBlock {\n const freshDays = input.freshDays ?? DEFAULT_STANDING_BLOCK_FRESH_DAYS;\n const maxChars = input.maxChars ?? DEFAULT_STANDING_BLOCK_MAX_CHARS;\n const hookMaxChars = input.hookMaxChars ?? DEFAULT_STANDING_BLOCK_HOOK_CHARS;\n if (!Number.isFinite(input.nowMs)) {\n throw new StandingBlockError(\"standing memory block requires a finite nowMs\");\n }\n if (!(freshDays >= 0) || !Number.isFinite(freshDays)) {\n throw new StandingBlockError(\"standing memory block requires freshDays >= 0\");\n }\n if (!(maxChars >= 1) || !Number.isFinite(maxChars)) {\n throw new StandingBlockError(\"standing memory block requires maxChars >= 1\");\n }\n if (!(hookMaxChars >= 1) || !Number.isFinite(hookMaxChars)) {\n throw new StandingBlockError(\"standing memory block requires hookMaxChars >= 1\");\n }\n\n const entries = validateEntries(input.entries);\n const ledger = new Map(input.ledger ?? []);\n if (entries.size === 0) {\n return {\n text: \"\",\n lines: [],\n ledger,\n bandCounts: { pinned: 0, fresh: 0, compressed: 0, dropped: 0 },\n };\n }\n\n const freshCutoff = input.nowMs - freshDays * 86_400_000;\n const layered: LayeredEntry[] = [];\n for (const entry of entries.values()) {\n let band: StandingBand;\n if (entry.pinned === true) {\n band = \"pinned\";\n } else if (\n typeof entry.lastChangedAt === \"string\" &&\n Date.parse(entry.lastChangedAt) >= freshCutoff &&\n Date.parse(entry.lastChangedAt) <= input.nowMs\n ) {\n band = \"fresh\";\n } else {\n band = \"compressed\";\n }\n if (band !== \"compressed\") {\n layered.push({ id: entry.id, band, line: `- ${entry.description}` });\n continue;\n }\n const key = standingHookLedgerKey(entry.description, hookMaxChars);\n const cached = ledger.get(key);\n const hook = cached ?? mechanicalHook(entry.description, hookMaxChars);\n if (cached === undefined) ledger.set(key, hook);\n layered.push({ id: entry.id, band, line: `- ${hook}` });\n }\n\n // Band rank, then id codepoint order. Never localeCompare: collation is\n // ICU-dependent and this text must be byte-identical across rebuilds.\n layered.sort(\n (a, b) =>\n BAND_RANK[a.band] - BAND_RANK[b.band] || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0),\n );\n\n const render = (keep: number, withMarker: boolean): { text: string; lines: string[] } => {\n const body = layered.slice(0, keep).map((item) => item.line);\n if (withMarker) body.push(STANDING_BLOCK_TRIMMED_MARKER);\n const lines = [STANDING_BLOCK_HEADER, \"\", ...body, \"\", STANDING_BLOCK_INSTRUCTION];\n return { text: lines.join(\"\\n\"), lines };\n };\n\n const pinnedCount = layered.filter((item) => item.band === \"pinned\").length;\n let keep = layered.length;\n let rendered = render(keep, false);\n // Mechanical trim: drop from the tail. The sort puts compressed lines\n // last, so oldest-band hooks go first and pinned lines are never reached.\n while (rendered.text.length > maxChars && keep > pinnedCount) {\n keep -= 1;\n rendered = render(keep, true);\n }\n if (rendered.text.length > maxChars) {\n throw new StandingBlockBudgetError(maxChars);\n }\n\n const volatility = lintStandingBlockVolatility(rendered.text);\n if (volatility.length > 0) {\n throw new StandingBlockVolatilityError(volatility);\n }\n\n const kept = layered.slice(0, keep);\n return {\n text: rendered.text,\n lines: rendered.lines,\n ledger,\n bandCounts: {\n pinned: kept.filter((item) => item.band === \"pinned\").length,\n fresh: kept.filter((item) => item.band === \"fresh\").length,\n compressed: kept.filter((item) => item.band === \"compressed\").length,\n dropped: layered.length - keep,\n },\n };\n}\n"],"mappings":"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","names":["keep"]}