@remnic/core 9.57.6 → 9.58.0

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 (471) hide show
  1. package/dist/access-admin-ops-surface.d.ts +12 -11
  2. package/dist/access-admin-ops-surface.js +25 -24
  3. package/dist/access-authorization-probe.d.ts +12 -11
  4. package/dist/access-authorization-probe.js +26 -25
  5. package/dist/access-boundary.d.ts +12 -11
  6. package/dist/access-boundary.js +25 -24
  7. package/dist/access-cli.js +77 -76
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +12 -11
  11. package/dist/access-extraction-force-flush.js +25 -24
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-lcm-compaction.d.ts +12 -11
  14. package/dist/access-http-lifecycle-flush.d.ts +12 -11
  15. package/dist/access-http-offline-stream.d.ts +12 -11
  16. package/dist/access-http-query.js +25 -24
  17. package/dist/access-http.d.ts +13 -12
  18. package/dist/access-http.js +36 -35
  19. package/dist/access-identity-continuity-surface.d.ts +10 -9
  20. package/dist/access-identity-continuity-surface.js +25 -24
  21. package/dist/access-lcm-surface.d.ts +12 -11
  22. package/dist/access-lcm-surface.js +25 -24
  23. package/dist/access-mcp.d.ts +12 -11
  24. package/dist/access-mcp.js +32 -31
  25. package/dist/access-memory-search-fanout.d.ts +2 -2
  26. package/dist/{access-namespace-preflight-Bpt-SYP0.d.ts → access-namespace-preflight-TBXz-8s_.d.ts} +1 -1
  27. package/dist/access-namespace-preflight.d.ts +3 -3
  28. package/dist/access-namespace-preflight.js +25 -24
  29. package/dist/access-observe-write-surface.d.ts +12 -11
  30. package/dist/access-observe-write-surface.js +25 -24
  31. package/dist/access-offline-manifest.d.ts +10 -9
  32. package/dist/access-operations-batch.js +27 -26
  33. package/dist/access-operations.d.ts +12 -11
  34. package/dist/access-operations.js +31 -30
  35. package/dist/access-recall-concurrency.d.ts +12 -11
  36. package/dist/access-recall-concurrency.js +25 -24
  37. package/dist/access-recall-response.d.ts +12 -11
  38. package/dist/access-recall-response.js +25 -24
  39. package/dist/access-recall-surface.d.ts +12 -11
  40. package/dist/access-recall-surface.js +25 -24
  41. package/dist/access-schema.js +3 -3
  42. package/dist/{access-service-4DO8XMq6.d.ts → access-service-BQkRul4d.d.ts} +7 -7
  43. package/dist/access-service-helpers.d.ts +12 -11
  44. package/dist/access-service.d.ts +12 -11
  45. package/dist/access-service.js +25 -24
  46. package/dist/access-surface-catalog.d.ts +12 -11
  47. package/dist/access-surface-catalog.js +27 -26
  48. package/dist/access-surface-catalog.js.map +1 -1
  49. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  50. package/dist/action-confidence.d.ts +1 -1
  51. package/dist/active-memory-bridge.d.ts +1 -1
  52. package/dist/active-recall.d.ts +1 -1
  53. package/dist/active-recall.js +1 -1
  54. package/dist/ambient-provenance.d.ts +1 -1
  55. package/dist/artifact-search.d.ts +1 -1
  56. package/dist/behavior-learner.d.ts +1 -1
  57. package/dist/behavior-signals.d.ts +1 -1
  58. package/dist/bootstrap.d.ts +10 -9
  59. package/dist/briefing-window.d.ts +2 -2
  60. package/dist/briefing.d.ts +2 -2
  61. package/dist/briefing.js +10 -10
  62. package/dist/buffer-surprise-report.d.ts +1 -1
  63. package/dist/buffer-surprise.js +4 -3
  64. package/dist/buffer-turn-helpers.d.ts +1 -1
  65. package/dist/buffer.d.ts +2 -2
  66. package/dist/bulk-import/index.d.ts +3 -3
  67. package/dist/calibration.d.ts +1 -1
  68. package/dist/capabilities.d.ts +1 -1
  69. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-GWVG7LGC.js} +2 -2
  70. package/dist/{catalog-BasnO3Bw.d.ts → catalog-z1UerMbh.d.ts} +1 -1
  71. package/dist/causal-behavior.d.ts +2 -1
  72. package/dist/causal-consolidation.d.ts +1 -1
  73. package/dist/causal-consolidation.js +14 -13
  74. package/dist/causal-consolidation.js.map +1 -1
  75. package/dist/causal-trajectory-graph.d.ts +1 -1
  76. package/dist/{chunk-P6WBAR27.js → chunk-2GBFKHBZ.js} +9 -9
  77. package/dist/chunk-2GBFKHBZ.js.map +1 -0
  78. package/dist/{chunk-YTZA7U6Q.js → chunk-2VHCLHZ5.js} +3 -3
  79. package/dist/{chunk-NEJQ65NV.js → chunk-4CLE2LXB.js} +2 -2
  80. package/dist/{chunk-3VFVQDZO.js → chunk-4IIKJOYM.js} +1 -1
  81. package/dist/{chunk-3VFVQDZO.js.map → chunk-4IIKJOYM.js.map} +1 -1
  82. package/dist/{chunk-JLNBQWZ2.js → chunk-5JMAGU26.js} +7 -6
  83. package/dist/{chunk-JLNBQWZ2.js.map → chunk-5JMAGU26.js.map} +1 -1
  84. package/dist/{chunk-VDX2J7OX.js → chunk-5W7CTZ2E.js} +4 -4
  85. package/dist/{chunk-CZUHNJHX.js → chunk-6C7Q6NG3.js} +13 -13
  86. package/dist/{chunk-LMXUWAXW.js → chunk-6TBIWIAG.js} +9 -8
  87. package/dist/chunk-6TBIWIAG.js.map +1 -0
  88. package/dist/{chunk-4O6R3GPK.js → chunk-6W2ISYUV.js} +4 -4
  89. package/dist/{chunk-3AJOJOFP.js → chunk-77DAFTUU.js} +3 -3
  90. package/dist/{chunk-IKT6ZVO7.js → chunk-7DHFB5SG.js} +3 -3
  91. package/dist/{chunk-SFR7J2G6.js → chunk-7G34CBKS.js} +2 -2
  92. package/dist/{chunk-IT57AOMC.js → chunk-AH2NX6S7.js} +3 -3
  93. package/dist/{chunk-HYQJQGD3.js → chunk-AM4T6CHX.js} +49 -35
  94. package/dist/chunk-AM4T6CHX.js.map +1 -0
  95. package/dist/{chunk-Z54EM5YZ.js → chunk-B2QHVLJO.js} +60 -30
  96. package/dist/chunk-B2QHVLJO.js.map +1 -0
  97. package/dist/{chunk-FI3PIOOI.js → chunk-B4CSPFYN.js} +8 -8
  98. package/dist/{chunk-7PJARJS4.js → chunk-BPM6UHUL.js} +2 -2
  99. package/dist/{chunk-PPUTUOC3.js → chunk-BTHDQOF4.js} +5 -5
  100. package/dist/{chunk-DUHMYBVE.js → chunk-CZGOLAEW.js} +41 -41
  101. package/dist/{chunk-5PGYCWA7.js → chunk-DE6YCZEE.js} +2 -2
  102. package/dist/{chunk-JOA4Q765.js → chunk-EUYWQ7TS.js} +2 -2
  103. package/dist/{chunk-O5AFC5KM.js → chunk-EWL5DICB.js} +2 -2
  104. package/dist/{chunk-4YZCIK5E.js → chunk-EZXGJJXM.js} +2 -2
  105. package/dist/{chunk-GXIY65UH.js → chunk-FI5EAP4N.js} +2 -2
  106. package/dist/{chunk-YOKSRIFI.js → chunk-FUWS2MNJ.js} +4 -4
  107. package/dist/{chunk-6RK2X7BR.js → chunk-G3JFFUKR.js} +2 -2
  108. package/dist/{chunk-VANZKHTN.js → chunk-G5OB4XZX.js} +4 -4
  109. package/dist/{chunk-TEHPIMXD.js → chunk-HK6KYIF6.js} +2 -2
  110. package/dist/{chunk-XBGLEOID.js → chunk-I4BLRM7X.js} +9 -9
  111. package/dist/{chunk-5ZIWRMZM.js → chunk-IVKIODHO.js} +7 -6
  112. package/dist/chunk-IVKIODHO.js.map +1 -0
  113. package/dist/{chunk-6SX4MY5Q.js → chunk-J65AKOD6.js} +2 -2
  114. package/dist/{chunk-BPWZDHFM.js → chunk-J6QIAYNR.js} +2 -2
  115. package/dist/{chunk-XL3TATMJ.js → chunk-JHMAYABJ.js} +4 -4
  116. package/dist/{chunk-F7M36OG2.js → chunk-JNWISMYG.js} +10 -10
  117. package/dist/{chunk-VYIXCMUP.js → chunk-KBIIE57I.js} +3 -3
  118. package/dist/{chunk-QKPDN325.js → chunk-KF75ANST.js} +6 -3
  119. package/dist/chunk-KF75ANST.js.map +1 -0
  120. package/dist/{chunk-24PNX2GF.js → chunk-KXYMU4IN.js} +3 -3
  121. package/dist/{chunk-FKTD7IVS.js → chunk-L3JVAM5Q.js} +2 -2
  122. package/dist/{chunk-5QHDXMXP.js → chunk-LLZKOSGM.js} +1 -1
  123. package/dist/{chunk-5QHDXMXP.js.map → chunk-LLZKOSGM.js.map} +1 -1
  124. package/dist/{chunk-LIF6DO6U.js → chunk-MG7GI4TT.js} +2 -2
  125. package/dist/{chunk-RUZM6Z52.js → chunk-MMZK2DWN.js} +1 -1
  126. package/dist/{chunk-NTJ6TY44.js → chunk-ODAE36PG.js} +3 -3
  127. package/dist/{chunk-QFN4U7AG.js → chunk-ODZKV2F7.js} +3 -3
  128. package/dist/{chunk-QFN4U7AG.js.map → chunk-ODZKV2F7.js.map} +1 -1
  129. package/dist/{chunk-YLHM5BQQ.js → chunk-OLX2HJFW.js} +4 -4
  130. package/dist/{chunk-DNC4A7RS.js → chunk-OU7RWWW6.js} +2 -2
  131. package/dist/{chunk-L3LRWDJW.js → chunk-OV36CROW.js} +3 -3
  132. package/dist/{chunk-BXLOS5AJ.js → chunk-OWHERGF2.js} +2 -2
  133. package/dist/{chunk-CSV34HIW.js → chunk-P5OYNV7B.js} +2 -2
  134. package/dist/{chunk-SNW3YRO6.js → chunk-P6GOYLHN.js} +2 -2
  135. package/dist/{chunk-REVMY7RA.js → chunk-PFPNUFKZ.js} +109 -59
  136. package/dist/chunk-PFPNUFKZ.js.map +1 -0
  137. package/dist/{chunk-USGKHF36.js → chunk-QUJC22CT.js} +2 -2
  138. package/dist/{chunk-BVRREV3N.js → chunk-R7IV3EUJ.js} +2 -2
  139. package/dist/{chunk-KSXJOC4F.js → chunk-RDFF2NAU.js} +18 -8
  140. package/dist/chunk-RDFF2NAU.js.map +1 -0
  141. package/dist/{chunk-D4LVHPOA.js → chunk-RXN7Z2V5.js} +3 -3
  142. package/dist/{chunk-7VSHDLJQ.js → chunk-T2VJ2EO5.js} +6 -6
  143. package/dist/chunk-TOTT6S2V.js +20 -0
  144. package/dist/chunk-TOTT6S2V.js.map +1 -0
  145. package/dist/{chunk-U7BMN33M.js → chunk-UBSM6TZP.js} +2 -2
  146. package/dist/{chunk-DQEMWVMT.js → chunk-UVYI6VIX.js} +1 -1
  147. package/dist/{chunk-U7XLOSG2.js → chunk-VIM6QH4D.js} +2 -2
  148. package/dist/{chunk-LJJWFV2Q.js → chunk-VJXSAJFW.js} +2 -2
  149. package/dist/{chunk-HZC3OECF.js → chunk-VOKK4WCG.js} +2 -2
  150. package/dist/{chunk-LTAVSOZW.js → chunk-WVP2I6C5.js} +5 -4
  151. package/dist/chunk-WVP2I6C5.js.map +1 -0
  152. package/dist/{chunk-LRDP2AC2.js → chunk-YBCZTBN2.js} +2 -2
  153. package/dist/{chunk-USAUBGBC.js → chunk-YKZFX2HQ.js} +2 -2
  154. package/dist/{chunk-I2GIYTRU.js → chunk-ZOGOOSB3.js} +2 -2
  155. package/dist/{chunk-PBGWYM3H.js → chunk-ZPUIRTIZ.js} +27 -15
  156. package/dist/chunk-ZPUIRTIZ.js.map +1 -0
  157. package/dist/chunking.js +2 -1
  158. package/dist/{cli-CQdYilcx.d.ts → cli-DsyVvOFP.d.ts} +5 -5
  159. package/dist/cli.d.ts +14 -13
  160. package/dist/cli.js +57 -56
  161. package/dist/coding/pre-action-gate.d.ts +1 -1
  162. package/dist/compounding/engine.d.ts +2 -2
  163. package/dist/compounding/engine.js +10 -10
  164. package/dist/compounding/preference-consolidator.d.ts +2 -1
  165. package/dist/compression-optimizer.d.ts +1 -1
  166. package/dist/config.d.ts +1 -1
  167. package/dist/config.js +1 -1
  168. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  169. package/dist/connectors/codex-materialize-runner.js +12 -11
  170. package/dist/connectors/codex-materialize.d.ts +7 -12
  171. package/dist/connectors/codex-materialize.js +2 -1
  172. package/dist/connectors/index.d.ts +1 -1
  173. package/dist/connectors/index.js +12 -11
  174. package/dist/consolidation-provenance-check.d.ts +2 -2
  175. package/dist/consolidation-undo.d.ts +2 -2
  176. package/dist/contradiction/index.d.ts +2 -2
  177. package/dist/contradiction/index.js +4 -4
  178. package/dist/converge-config.d.ts +1 -1
  179. package/dist/convergence-refresh.d.ts +2 -2
  180. package/dist/convergence-refresh.js +12 -12
  181. package/dist/conversation-index/backend.d.ts +1 -1
  182. package/dist/conversation-index/chunker.d.ts +1 -1
  183. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  184. package/dist/conversation-index/indexer.d.ts +1 -1
  185. package/dist/conversation-index/search.d.ts +1 -1
  186. package/dist/corpus-watermark.d.ts +1 -1
  187. package/dist/corpus-watermark.js +12 -12
  188. package/dist/day-summary.d.ts +1 -1
  189. package/dist/day-summary.js +3 -2
  190. package/dist/delinearize.d.ts +1 -1
  191. package/dist/dependency-propagation-config.d.ts +1 -1
  192. package/dist/{dependency-propagation-delivery-C_K_AHcv.d.ts → dependency-propagation-delivery-DdwSc1qh.d.ts} +1 -1
  193. package/dist/direct-answer-wiring.d.ts +1 -1
  194. package/dist/direct-answer.d.ts +1 -1
  195. package/dist/embedding-fallback.d.ts +1 -1
  196. package/dist/enrichment/index.d.ts +1 -1
  197. package/dist/entity-retrieval.d.ts +2 -2
  198. package/dist/entity-retrieval.js +10 -10
  199. package/dist/entity-schema.d.ts +1 -1
  200. package/dist/explicit-capture.d.ts +10 -9
  201. package/dist/external-wiki-access.d.ts +12 -11
  202. package/dist/external-wiki-access.js +26 -25
  203. package/dist/external-wiki-collection-registration.d.ts +1 -1
  204. package/dist/external-wiki-collection.d.ts +1 -1
  205. package/dist/external-wiki-mcp-tools.d.ts +12 -11
  206. package/dist/extraction-error-classification.d.ts +1 -1
  207. package/dist/extraction-faithfulness.d.ts +1 -1
  208. package/dist/extraction-judge-telemetry.d.ts +1 -1
  209. package/dist/extraction-judge-training.d.ts +1 -1
  210. package/dist/extraction-judge.d.ts +1 -1
  211. package/dist/extraction-liveness.d.ts +1 -1
  212. package/dist/extraction-normalization.d.ts +1 -1
  213. package/dist/extraction-prompt.d.ts +1 -1
  214. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  215. package/dist/extraction-source-grounding.d.ts +1 -1
  216. package/dist/extraction.d.ts +1 -1
  217. package/dist/extraction.js +16 -15
  218. package/dist/fallback-llm.d.ts +1 -1
  219. package/dist/graph-dashboard-diff.d.ts +1 -1
  220. package/dist/graph-dashboard-key.d.ts +1 -1
  221. package/dist/graph-dashboard-parser.d.ts +1 -1
  222. package/dist/graph-edge-reinforcement.d.ts +1 -1
  223. package/dist/graph-path-reconstruction.d.ts +1 -1
  224. package/dist/graph-path-scoring.d.ts +1 -1
  225. package/dist/graph-snapshot.d.ts +1 -1
  226. package/dist/graph.d.ts +1 -1
  227. package/dist/harmonic-retrieval.js +1 -1
  228. package/dist/importance.d.ts +1 -1
  229. package/dist/importers/index.d.ts +1 -1
  230. package/dist/in-flight-reads.d.ts +1 -1
  231. package/dist/index.d.ts +22 -21
  232. package/dist/index.js +81 -80
  233. package/dist/intent.d.ts +1 -1
  234. package/dist/lcm/archive.d.ts +3 -2
  235. package/dist/lcm/archive.js +2 -1
  236. package/dist/lcm/engine.d.ts +2 -1
  237. package/dist/lcm/engine.js +5 -4
  238. package/dist/lcm/index.d.ts +2 -1
  239. package/dist/lcm/index.js +7 -6
  240. package/dist/lcm/recall.d.ts +1 -0
  241. package/dist/lcm/summarizer.d.ts +1 -0
  242. package/dist/lcm/summarizer.js +3 -2
  243. package/dist/lcm/tools.d.ts +2 -1
  244. package/dist/lifecycle.d.ts +1 -1
  245. package/dist/live-connectors-runner.d.ts +1 -1
  246. package/dist/local-llm.d.ts +2 -3
  247. package/dist/local-llm.js +2 -1
  248. package/dist/local-model-endpoint.d.ts +1 -1
  249. package/dist/maintenance/memory-governance.d.ts +1 -1
  250. package/dist/maintenance/memory-governance.js +10 -10
  251. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  252. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -10
  253. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  254. package/dist/maintenance/rebuild-memory-projection.js +11 -11
  255. package/dist/{maintenance-DdP931i9.d.ts → maintenance-DvkiF7fm.d.ts} +3 -3
  256. package/dist/mcp-memory-inspector-app.d.ts +12 -11
  257. package/dist/memory-action-policy.d.ts +1 -1
  258. package/dist/memory-cache.d.ts +1 -1
  259. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  260. package/dist/memory-projection-store.d.ts +1 -1
  261. package/dist/memory-provenance.d.ts +1 -1
  262. package/dist/memory-snapshot.d.ts +1 -1
  263. package/dist/memory-worth-outcomes.d.ts +2 -2
  264. package/dist/models-json.d.ts +1 -1
  265. package/dist/namespaces/migrate.d.ts +3 -3
  266. package/dist/namespaces/migrate.js +11 -11
  267. package/dist/namespaces/principal.d.ts +1 -1
  268. package/dist/namespaces/search.d.ts +1 -1
  269. package/dist/namespaces/search.js +7 -7
  270. package/dist/namespaces/storage.d.ts +3 -3
  271. package/dist/namespaces/storage.js +10 -10
  272. package/dist/native-knowledge.d.ts +1 -1
  273. package/dist/offline-sync-impression-drain.d.ts +1 -1
  274. package/dist/operator-doctor-corpus.d.ts +1 -1
  275. package/dist/operator-doctor-corpus.js +13 -13
  276. package/dist/operator-doctor-replica.d.ts +1 -1
  277. package/dist/operator-toolkit.d.ts +3 -3
  278. package/dist/operator-toolkit.js +18 -18
  279. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  280. package/dist/orchestration/maintenance.d.ts +4 -4
  281. package/dist/orchestration/maintenance.js +15 -15
  282. package/dist/{orchestrator-DxUWX7gs.d.ts → orchestrator-CXPIzs3D.d.ts} +9 -9
  283. package/dist/orchestrator.d.ts +10 -9
  284. package/dist/orchestrator.js +77 -76
  285. package/dist/patterns-cli.d.ts +1 -1
  286. package/dist/{pipeline-BKUMU1vU.d.ts → pipeline-BuYWU9rt.d.ts} +1 -1
  287. package/dist/policy-runtime.d.ts +1 -1
  288. package/dist/proactive-contention.d.ts +1 -1
  289. package/dist/provenance.d.ts +1 -1
  290. package/dist/{public-http-Dw0bJhcC.d.ts → public-http-m9x1Qyzn.d.ts} +1 -1
  291. package/dist/{qmd-DJP-GLFe.d.ts → qmd-DYnrPw-m.d.ts} +1 -1
  292. package/dist/qmd-preflight.d.ts +2 -2
  293. package/dist/qmd-recall-cache.d.ts +1 -1
  294. package/dist/qmd.d.ts +2 -2
  295. package/dist/recall-concurrency-config.d.ts +1 -1
  296. package/dist/recall-disclosure-escalation.d.ts +1 -1
  297. package/dist/recall-explain-renderer.d.ts +1 -1
  298. package/dist/recall-explain-renderer.js +4 -3
  299. package/dist/recall-memory-map.d.ts +1 -1
  300. package/dist/recall-planner-llm.d.ts +1 -1
  301. package/dist/recall-state.d.ts +1 -1
  302. package/dist/recall-tag-filter.d.ts +1 -1
  303. package/dist/recall-timings.d.ts +1 -1
  304. package/dist/recall-xray-cli.d.ts +1 -1
  305. package/dist/recall-xray-cli.js +5 -4
  306. package/dist/recall-xray-renderer.d.ts +1 -1
  307. package/dist/recall-xray-renderer.js +4 -3
  308. package/dist/recall-xray.d.ts +2 -7
  309. package/dist/recall-xray.js +3 -2
  310. package/dist/reconcile/cursor.d.ts +1 -1
  311. package/dist/reconcile/manifest.d.ts +1 -1
  312. package/dist/reconcile/plan.d.ts +1 -1
  313. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  314. package/dist/replay/normalizers/claude.d.ts +1 -1
  315. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  316. package/dist/replay/normalizers/shared.d.ts +1 -1
  317. package/dist/replay/runner.d.ts +1 -1
  318. package/dist/replay/types.d.ts +1 -1
  319. package/dist/replica-divergence.d.ts +1 -1
  320. package/dist/replica-peers-config.d.ts +1 -1
  321. package/dist/resolve-auth-token.d.ts +1 -1
  322. package/dist/resume-bundles.js +4 -3
  323. package/dist/retrieval-agents.d.ts +2 -2
  324. package/dist/retrieval-tiers.d.ts +1 -1
  325. package/dist/routing/engine.d.ts +1 -1
  326. package/dist/routing/store.d.ts +1 -1
  327. package/dist/salvage-envelope.d.ts +1 -1
  328. package/dist/{scope-profiles-CaKcnB-6.d.ts → scope-profiles-C1QG4Cmv.d.ts} +1 -1
  329. package/dist/search/embed-helper.d.ts +1 -1
  330. package/dist/search/factory.d.ts +1 -1
  331. package/dist/search/factory.js +6 -6
  332. package/dist/search/index.d.ts +1 -1
  333. package/dist/search/index.js +11 -11
  334. package/dist/search/lancedb-backend.d.ts +1 -1
  335. package/dist/search/lancedb-backend.js +2 -2
  336. package/dist/search/meilisearch-backend.d.ts +1 -1
  337. package/dist/search/meilisearch-backend.js +2 -2
  338. package/dist/search/noop-backend.d.ts +1 -1
  339. package/dist/search/orama-backend.d.ts +1 -1
  340. package/dist/search/orama-backend.js +2 -2
  341. package/dist/search/port.d.ts +1 -1
  342. package/dist/search/remote-backend.d.ts +1 -1
  343. package/dist/semantic-chunking.js +3 -2
  344. package/dist/{semantic-consolidation-P0eMWqh-.d.ts → semantic-consolidation-DMeX8XS0.d.ts} +1 -1
  345. package/dist/semantic-consolidation.d.ts +2 -2
  346. package/dist/semantic-consolidation.js +14 -13
  347. package/dist/semantic-rule-promotion.js +10 -10
  348. package/dist/semantic-rule-verifier.d.ts +1 -1
  349. package/dist/semantic-rule-verifier.js +10 -10
  350. package/dist/{service-D5GQLxq_.d.ts → service-CT3ENiTO.d.ts} +2 -2
  351. package/dist/session-observer-bands.d.ts +1 -1
  352. package/dist/session-observer-state.d.ts +1 -1
  353. package/dist/session-observer-state.js +1 -1
  354. package/dist/shared-context/manager.d.ts +1 -1
  355. package/dist/signal.d.ts +1 -1
  356. package/dist/source-agent-qualifier.d.ts +1 -1
  357. package/dist/source-agent-qualifier.js +12 -11
  358. package/dist/{storage-DIyil2ll.d.ts → storage-B0L76y7N.d.ts} +1 -1
  359. package/dist/storage.d.ts +2 -2
  360. package/dist/storage.js +9 -9
  361. package/dist/summarizer.d.ts +1 -1
  362. package/dist/summarizer.js +3 -2
  363. package/dist/summary-snapshot.d.ts +1 -1
  364. package/dist/support-passport/index.d.ts +15 -14
  365. package/dist/support-passport/index.js +28 -27
  366. package/dist/temporal-supersession.d.ts +2 -2
  367. package/dist/temporal-timeline-recall.d.ts +1 -1
  368. package/dist/temporal-validity.d.ts +1 -1
  369. package/dist/threading.d.ts +1 -1
  370. package/dist/tier-migration.d.ts +2 -2
  371. package/dist/tier-routing.d.ts +1 -1
  372. package/dist/token-estimate.d.ts +10 -0
  373. package/dist/token-estimate.js +8 -0
  374. package/dist/token-estimate.js.map +1 -0
  375. package/dist/topics.d.ts +1 -1
  376. package/dist/transcript.d.ts +1 -6
  377. package/dist/transcript.js +2 -1
  378. package/dist/transfer/backup.js +2 -2
  379. package/dist/transfer/capsule-export.js +2 -2
  380. package/dist/transfer/capsule-import.js +2 -2
  381. package/dist/trust-score-stage.d.ts +1 -1
  382. package/dist/trust-score.d.ts +1 -1
  383. package/dist/{types-CbXieHKr.d.ts → types-D7pB0QwO.d.ts} +1 -1
  384. package/dist/types.d.ts +1 -1
  385. package/dist/types.js +1 -1
  386. package/dist/utility-runtime.d.ts +1 -1
  387. package/dist/verified-recall.js +10 -10
  388. package/dist/write-envelope.d.ts +1 -1
  389. package/package.json +12 -2
  390. package/src/chunking.ts +6 -12
  391. package/src/config.ts +2 -0
  392. package/src/connectors/codex-materialize.ts +21 -26
  393. package/src/lcm/archive.ts +4 -5
  394. package/src/lcm/engine.ts +55 -34
  395. package/src/lcm/summarizer.ts +27 -16
  396. package/src/lcm-engine.test.ts +82 -2
  397. package/src/local-llm.ts +4 -6
  398. package/src/memory-extension-host/render-extensions-block.ts +3 -9
  399. package/src/orchestration/recall-section-coordinator.ts +93 -27
  400. package/src/recall-token-budget.test.ts +51 -0
  401. package/src/recall-xray.ts +4 -11
  402. package/src/semantic-chunking.ts +5 -12
  403. package/src/session-observer-state.ts +3 -3
  404. package/src/testing/subjects/recall-budget.test.ts +21 -5
  405. package/src/token-estimate.test.ts +38 -0
  406. package/src/token-estimate.ts +22 -0
  407. package/src/transcript.test.ts +38 -3
  408. package/src/transcript.ts +58 -59
  409. package/src/types.ts +1 -1
  410. package/dist/chunk-5ZIWRMZM.js.map +0 -1
  411. package/dist/chunk-HYQJQGD3.js.map +0 -1
  412. package/dist/chunk-KSXJOC4F.js.map +0 -1
  413. package/dist/chunk-LMXUWAXW.js.map +0 -1
  414. package/dist/chunk-LTAVSOZW.js.map +0 -1
  415. package/dist/chunk-P6WBAR27.js.map +0 -1
  416. package/dist/chunk-PBGWYM3H.js.map +0 -1
  417. package/dist/chunk-QKPDN325.js.map +0 -1
  418. package/dist/chunk-REVMY7RA.js.map +0 -1
  419. package/dist/chunk-Z54EM5YZ.js.map +0 -1
  420. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → capsule-crypto-GWVG7LGC.js.map} +0 -0
  421. /package/dist/{chunk-YTZA7U6Q.js.map → chunk-2VHCLHZ5.js.map} +0 -0
  422. /package/dist/{chunk-NEJQ65NV.js.map → chunk-4CLE2LXB.js.map} +0 -0
  423. /package/dist/{chunk-VDX2J7OX.js.map → chunk-5W7CTZ2E.js.map} +0 -0
  424. /package/dist/{chunk-CZUHNJHX.js.map → chunk-6C7Q6NG3.js.map} +0 -0
  425. /package/dist/{chunk-4O6R3GPK.js.map → chunk-6W2ISYUV.js.map} +0 -0
  426. /package/dist/{chunk-3AJOJOFP.js.map → chunk-77DAFTUU.js.map} +0 -0
  427. /package/dist/{chunk-IKT6ZVO7.js.map → chunk-7DHFB5SG.js.map} +0 -0
  428. /package/dist/{chunk-SFR7J2G6.js.map → chunk-7G34CBKS.js.map} +0 -0
  429. /package/dist/{chunk-IT57AOMC.js.map → chunk-AH2NX6S7.js.map} +0 -0
  430. /package/dist/{chunk-FI3PIOOI.js.map → chunk-B4CSPFYN.js.map} +0 -0
  431. /package/dist/{chunk-7PJARJS4.js.map → chunk-BPM6UHUL.js.map} +0 -0
  432. /package/dist/{chunk-PPUTUOC3.js.map → chunk-BTHDQOF4.js.map} +0 -0
  433. /package/dist/{chunk-DUHMYBVE.js.map → chunk-CZGOLAEW.js.map} +0 -0
  434. /package/dist/{chunk-5PGYCWA7.js.map → chunk-DE6YCZEE.js.map} +0 -0
  435. /package/dist/{chunk-JOA4Q765.js.map → chunk-EUYWQ7TS.js.map} +0 -0
  436. /package/dist/{chunk-O5AFC5KM.js.map → chunk-EWL5DICB.js.map} +0 -0
  437. /package/dist/{chunk-4YZCIK5E.js.map → chunk-EZXGJJXM.js.map} +0 -0
  438. /package/dist/{chunk-GXIY65UH.js.map → chunk-FI5EAP4N.js.map} +0 -0
  439. /package/dist/{chunk-YOKSRIFI.js.map → chunk-FUWS2MNJ.js.map} +0 -0
  440. /package/dist/{chunk-6RK2X7BR.js.map → chunk-G3JFFUKR.js.map} +0 -0
  441. /package/dist/{chunk-VANZKHTN.js.map → chunk-G5OB4XZX.js.map} +0 -0
  442. /package/dist/{chunk-TEHPIMXD.js.map → chunk-HK6KYIF6.js.map} +0 -0
  443. /package/dist/{chunk-XBGLEOID.js.map → chunk-I4BLRM7X.js.map} +0 -0
  444. /package/dist/{chunk-6SX4MY5Q.js.map → chunk-J65AKOD6.js.map} +0 -0
  445. /package/dist/{chunk-BPWZDHFM.js.map → chunk-J6QIAYNR.js.map} +0 -0
  446. /package/dist/{chunk-XL3TATMJ.js.map → chunk-JHMAYABJ.js.map} +0 -0
  447. /package/dist/{chunk-F7M36OG2.js.map → chunk-JNWISMYG.js.map} +0 -0
  448. /package/dist/{chunk-VYIXCMUP.js.map → chunk-KBIIE57I.js.map} +0 -0
  449. /package/dist/{chunk-24PNX2GF.js.map → chunk-KXYMU4IN.js.map} +0 -0
  450. /package/dist/{chunk-FKTD7IVS.js.map → chunk-L3JVAM5Q.js.map} +0 -0
  451. /package/dist/{chunk-LIF6DO6U.js.map → chunk-MG7GI4TT.js.map} +0 -0
  452. /package/dist/{chunk-RUZM6Z52.js.map → chunk-MMZK2DWN.js.map} +0 -0
  453. /package/dist/{chunk-NTJ6TY44.js.map → chunk-ODAE36PG.js.map} +0 -0
  454. /package/dist/{chunk-YLHM5BQQ.js.map → chunk-OLX2HJFW.js.map} +0 -0
  455. /package/dist/{chunk-DNC4A7RS.js.map → chunk-OU7RWWW6.js.map} +0 -0
  456. /package/dist/{chunk-L3LRWDJW.js.map → chunk-OV36CROW.js.map} +0 -0
  457. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-OWHERGF2.js.map} +0 -0
  458. /package/dist/{chunk-CSV34HIW.js.map → chunk-P5OYNV7B.js.map} +0 -0
  459. /package/dist/{chunk-SNW3YRO6.js.map → chunk-P6GOYLHN.js.map} +0 -0
  460. /package/dist/{chunk-USGKHF36.js.map → chunk-QUJC22CT.js.map} +0 -0
  461. /package/dist/{chunk-BVRREV3N.js.map → chunk-R7IV3EUJ.js.map} +0 -0
  462. /package/dist/{chunk-D4LVHPOA.js.map → chunk-RXN7Z2V5.js.map} +0 -0
  463. /package/dist/{chunk-7VSHDLJQ.js.map → chunk-T2VJ2EO5.js.map} +0 -0
  464. /package/dist/{chunk-U7BMN33M.js.map → chunk-UBSM6TZP.js.map} +0 -0
  465. /package/dist/{chunk-DQEMWVMT.js.map → chunk-UVYI6VIX.js.map} +0 -0
  466. /package/dist/{chunk-U7XLOSG2.js.map → chunk-VIM6QH4D.js.map} +0 -0
  467. /package/dist/{chunk-LJJWFV2Q.js.map → chunk-VJXSAJFW.js.map} +0 -0
  468. /package/dist/{chunk-HZC3OECF.js.map → chunk-VOKK4WCG.js.map} +0 -0
  469. /package/dist/{chunk-LRDP2AC2.js.map → chunk-YBCZTBN2.js.map} +0 -0
  470. /package/dist/{chunk-USAUBGBC.js.map → chunk-YKZFX2HQ.js.map} +0 -0
  471. /package/dist/{chunk-I2GIYTRU.js.map → chunk-ZOGOOSB3.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-YTZA7U6Q.js";
3
+ } from "./chunk-2VHCLHZ5.js";
4
4
  import {
5
5
  keyring_exports,
6
6
  secureStoreDir
@@ -412,4 +412,4 @@ export {
412
412
  resolveNamespaceStorageRoot,
413
413
  NamespaceStorageRouter
414
414
  };
415
- //# sourceMappingURL=chunk-LIF6DO6U.js.map
415
+ //# sourceMappingURL=chunk-MG7GI4TT.js.map
@@ -279,4 +279,4 @@ async function searchHarmonicRetrieval(options) {
279
279
  export {
280
280
  searchHarmonicRetrieval
281
281
  };
282
- //# sourceMappingURL=chunk-RUZM6Z52.js.map
282
+ //# sourceMappingURL=chunk-MMZK2DWN.js.map
@@ -49,7 +49,7 @@ import {
49
49
  buildExtensionsFooterForSummary,
50
50
  formatDaySummaryMemories,
51
51
  loadDaySummaryPrompt
52
- } from "./chunk-BPWZDHFM.js";
52
+ } from "./chunk-J6QIAYNR.js";
53
53
  import {
54
54
  delinearize
55
55
  } from "./chunk-VEWZZM3H.js";
@@ -65,7 +65,7 @@ import {
65
65
  } from "./chunk-NLE6TSLG.js";
66
66
  import {
67
67
  LocalLlmClient
68
- } from "./chunk-5ZIWRMZM.js";
68
+ } from "./chunk-IVKIODHO.js";
69
69
  import {
70
70
  normalizeProcedureSteps
71
71
  } from "./chunk-QDW3E4RD.js";
@@ -2442,4 +2442,4 @@ export {
2442
2442
  shouldEnableLocalExtractionThinking,
2443
2443
  ExtractionEngine
2444
2444
  };
2445
- //# sourceMappingURL=chunk-NTJ6TY44.js.map
2445
+ //# sourceMappingURL=chunk-ODAE36PG.js.map
@@ -85,7 +85,7 @@ var SessionObserverState = class {
85
85
  try {
86
86
  const raw = await readFile(this.statePath, "utf-8");
87
87
  const parsed = JSON.parse(raw);
88
- if (parsed?.version !== 1 || !parsed.sessions || typeof parsed.sessions !== "object") {
88
+ if (parsed?.version !== 2 || !parsed.sessions || typeof parsed.sessions !== "object") {
89
89
  return null;
90
90
  }
91
91
  return parsed;
@@ -183,7 +183,7 @@ var SessionObserverState = class {
183
183
  for (const [key, value] of sessionsMap.entries()) {
184
184
  sessions[key] = value;
185
185
  }
186
- const payload = { version: 1, sessions };
186
+ const payload = { version: 2, sessions };
187
187
  await mkdir(path.dirname(this.statePath), { recursive: true });
188
188
  await writeFile(this.statePath, JSON.stringify(payload, null, 2), "utf-8");
189
189
  }
@@ -323,4 +323,4 @@ export {
323
323
  normalizeObserverBands,
324
324
  SessionObserverState
325
325
  };
326
- //# sourceMappingURL=chunk-QFN4U7AG.js.map
326
+ //# sourceMappingURL=chunk-ODZKV2F7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/session-observer-state.ts"],"sourcesContent":["import path from \"node:path\";\nimport { mkdir, open, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { log } from \"./logger.js\";\nimport type { SessionObserverBandConfig } from \"./types.js\";\nimport { cloneDefaultSessionObserverBands } from \"./session-observer-bands.js\";\n\ninterface SessionObserverCursor {\n sessionKey: string;\n cursorBytes: number;\n cursorTokens: number;\n lastObservedAt: string;\n lastTriggeredAt?: string;\n lastResetAt?: string;\n}\n\ninterface SessionObserverPersistedState {\n version: 1;\n sessions: Record<string, SessionObserverCursor>;\n}\n\nexport interface SessionObservationInput {\n sessionKey: string;\n totalBytes: number;\n totalTokens: number;\n observedAt?: string;\n}\n\nexport interface SessionObservationDecision {\n triggered: boolean;\n deltaBytes: number;\n deltaTokens: number;\n band: SessionObserverBandConfig;\n reason?: \"threshold\" | \"debounced\" | \"baseline\";\n}\n\nfunction sanitizeNonNegativeInt(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.max(0, Math.floor(value));\n}\n\nfunction parseIsoMs(value?: string): number {\n if (!value) return 0;\n const ms = Date.parse(value);\n return Number.isFinite(ms) ? ms : 0;\n}\n\nfunction mergeSessionCursor(\n existing: SessionObserverCursor,\n incoming: SessionObserverCursor,\n): SessionObserverCursor {\n const existingObservedMs = parseIsoMs(existing.lastObservedAt);\n const incomingObservedMs = parseIsoMs(incoming.lastObservedAt);\n const existingTriggeredMs = parseIsoMs(existing.lastTriggeredAt);\n const incomingTriggeredMs = parseIsoMs(incoming.lastTriggeredAt);\n const existingResetMs = parseIsoMs(existing.lastResetAt);\n const incomingResetMs = parseIsoMs(incoming.lastResetAt);\n\n const observedAt =\n incomingObservedMs >= existingObservedMs ? incoming.lastObservedAt : existing.lastObservedAt;\n const triggeredAt =\n incomingTriggeredMs >= existingTriggeredMs ? incoming.lastTriggeredAt : existing.lastTriggeredAt;\n\n // Preserve monotonic cursor progression except for explicit reset observations.\n const incomingIsNewer = incomingObservedMs >= existingObservedMs;\n const incomingHasNewerReset = incomingResetMs > existingResetMs;\n const allowIncomingReset = incomingIsNewer && incomingHasNewerReset;\n const keepExistingReset =\n existingResetMs > incomingResetMs && existingObservedMs >= incomingObservedMs;\n\n let cursorBytes = Math.max(\n sanitizeNonNegativeInt(existing.cursorBytes),\n sanitizeNonNegativeInt(incoming.cursorBytes),\n );\n let cursorTokens = Math.max(\n sanitizeNonNegativeInt(existing.cursorTokens),\n sanitizeNonNegativeInt(incoming.cursorTokens),\n );\n if (keepExistingReset) {\n cursorBytes = sanitizeNonNegativeInt(existing.cursorBytes);\n cursorTokens = sanitizeNonNegativeInt(existing.cursorTokens);\n } else if (allowIncomingReset) {\n cursorBytes = sanitizeNonNegativeInt(incoming.cursorBytes);\n cursorTokens = sanitizeNonNegativeInt(incoming.cursorTokens);\n }\n\n return {\n sessionKey: existing.sessionKey,\n cursorBytes,\n cursorTokens,\n lastObservedAt: observedAt,\n lastTriggeredAt: triggeredAt,\n lastResetAt:\n incomingResetMs >= existingResetMs ? incoming.lastResetAt : existing.lastResetAt,\n };\n}\n\nexport function normalizeObserverBands(\n bands: SessionObserverBandConfig[],\n): SessionObserverBandConfig[] {\n const normalized = bands\n .map((band) => ({\n maxBytes: sanitizeNonNegativeInt(band.maxBytes),\n triggerDeltaBytes: sanitizeNonNegativeInt(band.triggerDeltaBytes),\n triggerDeltaTokens: sanitizeNonNegativeInt(band.triggerDeltaTokens),\n }))\n .filter((band) => band.maxBytes > 0)\n .sort((a, b) => a.maxBytes - b.maxBytes);\n\n if (normalized.length === 0) {\n return cloneDefaultSessionObserverBands();\n }\n\n const last = normalized[normalized.length - 1];\n if (last && last.maxBytes < 1_000_000_000) {\n normalized.push({\n maxBytes: 1_000_000_000,\n triggerDeltaBytes: last.triggerDeltaBytes,\n triggerDeltaTokens: last.triggerDeltaTokens,\n });\n }\n return normalized;\n}\n\nexport class SessionObserverState {\n private readonly statePath: string;\n private readonly lockPath: string;\n private readonly lockStaleMs = 120_000;\n private readonly debounceMs: number;\n private readonly bands: SessionObserverBandConfig[];\n private sessions = new Map<string, SessionObserverCursor>();\n private saveQueue: Promise<void> = Promise.resolve();\n\n private async readPersistedState(): Promise<SessionObserverPersistedState | null> {\n try {\n const raw = await readFile(this.statePath, \"utf-8\");\n const parsed = JSON.parse(raw) as SessionObserverPersistedState;\n if (parsed?.version !== 1 || !parsed.sessions || typeof parsed.sessions !== \"object\") {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n }\n\n private normalizePersistedSessions(\n sessions: Record<string, SessionObserverCursor>,\n ): Map<string, SessionObserverCursor> {\n const next = new Map<string, SessionObserverCursor>();\n for (const [sessionKey, value] of Object.entries(sessions)) {\n if (!value || typeof value !== \"object\") continue;\n next.set(sessionKey, {\n sessionKey,\n cursorBytes: sanitizeNonNegativeInt(value.cursorBytes),\n cursorTokens: sanitizeNonNegativeInt(value.cursorTokens),\n lastObservedAt:\n typeof value.lastObservedAt === \"string\" ? value.lastObservedAt : new Date(0).toISOString(),\n lastTriggeredAt: typeof value.lastTriggeredAt === \"string\" ? value.lastTriggeredAt : undefined,\n lastResetAt: typeof value.lastResetAt === \"string\" ? value.lastResetAt : undefined,\n });\n }\n return next;\n }\n\n constructor(opts: {\n memoryDir: string;\n debounceMs: number;\n bands: SessionObserverBandConfig[];\n }) {\n this.statePath = path.join(opts.memoryDir, \"state\", \"session-observer-state.json\");\n this.lockPath = path.join(opts.memoryDir, \"state\", \"session-observer-state.lock\");\n this.debounceMs = Math.max(0, Math.floor(opts.debounceMs));\n this.bands = normalizeObserverBands(opts.bands);\n }\n\n private async withSaveLock(fn: () => Promise<void>): Promise<void> {\n await mkdir(path.dirname(this.lockPath), { recursive: true });\n for (let attempt = 0; attempt < 80; attempt++) {\n try {\n const handle = await open(this.lockPath, \"wx\");\n try {\n await fn();\n } finally {\n await handle.close();\n await unlink(this.lockPath).catch(() => {});\n }\n return;\n } catch (err: any) {\n if (err?.code !== \"EEXIST\") throw err;\n try {\n const lockInfo = await stat(this.lockPath);\n if (Date.now() - lockInfo.mtimeMs > this.lockStaleMs) {\n await unlink(this.lockPath).catch(() => {});\n continue;\n }\n } catch {\n // Lock might have been released between EEXIST and stat/read.\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n }\n const error = new Error(\"session observer save lock timeout\");\n log.debug(error.message);\n throw error;\n }\n\n async load(): Promise<void> {\n const parsed = await this.readPersistedState();\n if (!parsed) {\n this.sessions.clear();\n return;\n }\n this.sessions = this.normalizePersistedSessions(parsed.sessions);\n }\n\n async save(): Promise<void> {\n await this.withSaveLock(async () => {\n const merged = await this.readMergedSessions();\n this.sessions = merged;\n\n await this.writeSessions(merged);\n });\n }\n\n private async readMergedSessions(): Promise<Map<string, SessionObserverCursor>> {\n const merged = new Map<string, SessionObserverCursor>();\n const persisted = await this.readPersistedState();\n if (persisted) {\n for (const [key, value] of this.normalizePersistedSessions(persisted.sessions).entries()) {\n merged.set(key, value);\n }\n }\n for (const [key, current] of this.sessions.entries()) {\n const existing = merged.get(key);\n if (!existing) {\n merged.set(key, current);\n continue;\n }\n merged.set(key, mergeSessionCursor(existing, current));\n }\n return merged;\n }\n\n private async writeSessions(sessionsMap: Map<string, SessionObserverCursor>): Promise<void> {\n const sessions = Object.create(null) as Record<string, SessionObserverCursor>;\n for (const [key, value] of sessionsMap.entries()) {\n sessions[key] = value;\n }\n const payload: SessionObserverPersistedState = { version: 1, sessions };\n await mkdir(path.dirname(this.statePath), { recursive: true });\n await writeFile(this.statePath, JSON.stringify(payload, null, 2), \"utf-8\");\n }\n\n private enqueueObservation(\n input: SessionObservationInput,\n ): Promise<SessionObservationDecision> {\n const operation = this.saveQueue\n .catch(() => undefined)\n .then(() => this.observeWithSaveLock(input));\n this.saveQueue = operation.then(\n () => undefined,\n () => undefined,\n );\n return operation;\n }\n\n private bandForTotalBytes(totalBytes: number): SessionObserverBandConfig {\n const bytes = sanitizeNonNegativeInt(totalBytes);\n for (const band of this.bands) {\n if (bytes <= band.maxBytes) return band;\n }\n return this.bands[this.bands.length - 1];\n }\n\n async observe(input: SessionObservationInput): Promise<SessionObservationDecision> {\n return this.enqueueObservation(input);\n }\n\n private async observeWithSaveLock(\n input: SessionObservationInput,\n ): Promise<SessionObservationDecision> {\n let decision: SessionObservationDecision | undefined;\n await this.withSaveLock(async () => {\n const localExisting = this.sessions.get(input.sessionKey);\n const sessions = await this.readMergedSessions();\n decision = await this.observeMerged(\n input,\n sessions,\n localExisting ? { ...localExisting } : undefined,\n );\n });\n if (!decision) {\n throw new Error(\"session observer decision was not computed\");\n }\n return decision;\n }\n\n private async observeMerged(\n input: SessionObservationInput,\n sessions: Map<string, SessionObserverCursor>,\n localExisting?: SessionObserverCursor,\n ): Promise<SessionObservationDecision> {\n const nowIso = input.observedAt ?? new Date().toISOString();\n const totalBytes = sanitizeNonNegativeInt(input.totalBytes);\n const totalTokens = sanitizeNonNegativeInt(input.totalTokens);\n const band = this.bandForTotalBytes(totalBytes);\n\n const existing = sessions.get(input.sessionKey);\n if (!existing) {\n sessions.set(input.sessionKey, {\n sessionKey: input.sessionKey,\n cursorBytes: totalBytes,\n cursorTokens: totalTokens,\n lastObservedAt: nowIso,\n });\n this.sessions = sessions;\n await this.writeSessions(sessions);\n return {\n triggered: false,\n deltaBytes: 0,\n deltaTokens: 0,\n band,\n reason: \"baseline\",\n };\n }\n\n const session = { ...existing };\n const observedMs = parseIsoMs(nowIso);\n const existingObservedMs = parseIsoMs(session.lastObservedAt);\n const existingResetMs = parseIsoMs(session.lastResetAt);\n if (existingResetMs > 0 && observedMs < existingResetMs) {\n this.sessions = sessions;\n return { triggered: false, deltaBytes: 0, deltaTokens: 0, band, reason: \"baseline\" };\n }\n\n if (totalBytes < session.cursorBytes || totalTokens < session.cursorTokens) {\n const localSawReset =\n localExisting !== undefined\n && (totalBytes < sanitizeNonNegativeInt(localExisting.cursorBytes)\n || totalTokens < sanitizeNonNegativeInt(localExisting.cursorTokens));\n const canApplyReset = localSawReset && observedMs >= existingObservedMs;\n\n if (canApplyReset) {\n session.cursorBytes = totalBytes;\n session.cursorTokens = totalTokens;\n session.lastObservedAt = nowIso;\n session.lastResetAt = nowIso;\n } else if (observedMs >= existingObservedMs) {\n session.lastObservedAt = nowIso;\n }\n sessions.set(input.sessionKey, session);\n this.sessions = sessions;\n await this.writeSessions(sessions);\n return { triggered: false, deltaBytes: 0, deltaTokens: 0, band, reason: \"baseline\" };\n }\n\n const deltaBytes = totalBytes - session.cursorBytes;\n const deltaTokens = totalTokens - session.cursorTokens;\n const crossedThreshold =\n (band.triggerDeltaBytes > 0 && deltaBytes >= band.triggerDeltaBytes)\n || (band.triggerDeltaTokens > 0 && deltaTokens >= band.triggerDeltaTokens);\n session.lastObservedAt = nowIso;\n\n if (!crossedThreshold) {\n const unchanged = deltaBytes === 0 && deltaTokens === 0;\n if (!unchanged) {\n sessions.set(input.sessionKey, session);\n this.sessions = sessions;\n await this.writeSessions(sessions);\n } else {\n this.sessions = sessions;\n }\n return {\n triggered: false,\n deltaBytes,\n deltaTokens,\n band,\n };\n }\n\n const nowMs = Date.parse(nowIso);\n const lastTriggeredMs = session.lastTriggeredAt ? Date.parse(session.lastTriggeredAt) : NaN;\n const withinDebounce =\n Number.isFinite(lastTriggeredMs) && nowMs - lastTriggeredMs < this.debounceMs;\n\n if (withinDebounce) {\n sessions.set(input.sessionKey, session);\n this.sessions = sessions;\n await this.writeSessions(sessions);\n return {\n triggered: false,\n deltaBytes,\n deltaTokens,\n band,\n reason: \"debounced\",\n };\n }\n\n session.lastTriggeredAt = nowIso;\n session.cursorBytes = totalBytes;\n session.cursorTokens = totalTokens;\n sessions.set(input.sessionKey, session);\n this.sessions = sessions;\n await this.writeSessions(sessions);\n return {\n triggered: true,\n deltaBytes,\n deltaTokens,\n band,\n reason: \"threshold\",\n };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/session-observer-state.ts"],"sourcesContent":["import path from \"node:path\";\nimport { mkdir, open, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { log } from \"./logger.js\";\nimport type { SessionObserverBandConfig } from \"./types.js\";\nimport { cloneDefaultSessionObserverBands } from \"./session-observer-bands.js\";\n\ninterface SessionObserverCursor {\n sessionKey: string;\n cursorBytes: number;\n cursorTokens: number;\n lastObservedAt: string;\n lastTriggeredAt?: string;\n lastResetAt?: string;\n}\n\ninterface SessionObserverPersistedState {\n version: 2;\n sessions: Record<string, SessionObserverCursor>;\n}\n\nexport interface SessionObservationInput {\n sessionKey: string;\n totalBytes: number;\n totalTokens: number;\n observedAt?: string;\n}\n\nexport interface SessionObservationDecision {\n triggered: boolean;\n deltaBytes: number;\n deltaTokens: number;\n band: SessionObserverBandConfig;\n reason?: \"threshold\" | \"debounced\" | \"baseline\";\n}\n\nfunction sanitizeNonNegativeInt(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.max(0, Math.floor(value));\n}\n\nfunction parseIsoMs(value?: string): number {\n if (!value) return 0;\n const ms = Date.parse(value);\n return Number.isFinite(ms) ? ms : 0;\n}\n\nfunction mergeSessionCursor(\n existing: SessionObserverCursor,\n incoming: SessionObserverCursor,\n): SessionObserverCursor {\n const existingObservedMs = parseIsoMs(existing.lastObservedAt);\n const incomingObservedMs = parseIsoMs(incoming.lastObservedAt);\n const existingTriggeredMs = parseIsoMs(existing.lastTriggeredAt);\n const incomingTriggeredMs = parseIsoMs(incoming.lastTriggeredAt);\n const existingResetMs = parseIsoMs(existing.lastResetAt);\n const incomingResetMs = parseIsoMs(incoming.lastResetAt);\n\n const observedAt =\n incomingObservedMs >= existingObservedMs ? incoming.lastObservedAt : existing.lastObservedAt;\n const triggeredAt =\n incomingTriggeredMs >= existingTriggeredMs ? incoming.lastTriggeredAt : existing.lastTriggeredAt;\n\n // Preserve monotonic cursor progression except for explicit reset observations.\n const incomingIsNewer = incomingObservedMs >= existingObservedMs;\n const incomingHasNewerReset = incomingResetMs > existingResetMs;\n const allowIncomingReset = incomingIsNewer && incomingHasNewerReset;\n const keepExistingReset =\n existingResetMs > incomingResetMs && existingObservedMs >= incomingObservedMs;\n\n let cursorBytes = Math.max(\n sanitizeNonNegativeInt(existing.cursorBytes),\n sanitizeNonNegativeInt(incoming.cursorBytes),\n );\n let cursorTokens = Math.max(\n sanitizeNonNegativeInt(existing.cursorTokens),\n sanitizeNonNegativeInt(incoming.cursorTokens),\n );\n if (keepExistingReset) {\n cursorBytes = sanitizeNonNegativeInt(existing.cursorBytes);\n cursorTokens = sanitizeNonNegativeInt(existing.cursorTokens);\n } else if (allowIncomingReset) {\n cursorBytes = sanitizeNonNegativeInt(incoming.cursorBytes);\n cursorTokens = sanitizeNonNegativeInt(incoming.cursorTokens);\n }\n\n return {\n sessionKey: existing.sessionKey,\n cursorBytes,\n cursorTokens,\n lastObservedAt: observedAt,\n lastTriggeredAt: triggeredAt,\n lastResetAt:\n incomingResetMs >= existingResetMs ? incoming.lastResetAt : existing.lastResetAt,\n };\n}\n\nexport function normalizeObserverBands(\n bands: SessionObserverBandConfig[],\n): SessionObserverBandConfig[] {\n const normalized = bands\n .map((band) => ({\n maxBytes: sanitizeNonNegativeInt(band.maxBytes),\n triggerDeltaBytes: sanitizeNonNegativeInt(band.triggerDeltaBytes),\n triggerDeltaTokens: sanitizeNonNegativeInt(band.triggerDeltaTokens),\n }))\n .filter((band) => band.maxBytes > 0)\n .sort((a, b) => a.maxBytes - b.maxBytes);\n\n if (normalized.length === 0) {\n return cloneDefaultSessionObserverBands();\n }\n\n const last = normalized[normalized.length - 1];\n if (last && last.maxBytes < 1_000_000_000) {\n normalized.push({\n maxBytes: 1_000_000_000,\n triggerDeltaBytes: last.triggerDeltaBytes,\n triggerDeltaTokens: last.triggerDeltaTokens,\n });\n }\n return normalized;\n}\n\nexport class SessionObserverState {\n private readonly statePath: string;\n private readonly lockPath: string;\n private readonly lockStaleMs = 120_000;\n private readonly debounceMs: number;\n private readonly bands: SessionObserverBandConfig[];\n private sessions = new Map<string, SessionObserverCursor>();\n private saveQueue: Promise<void> = Promise.resolve();\n\n private async readPersistedState(): Promise<SessionObserverPersistedState | null> {\n try {\n const raw = await readFile(this.statePath, \"utf-8\");\n const parsed = JSON.parse(raw) as SessionObserverPersistedState;\n if (parsed?.version !== 2 || !parsed.sessions || typeof parsed.sessions !== \"object\") {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n }\n\n private normalizePersistedSessions(\n sessions: Record<string, SessionObserverCursor>,\n ): Map<string, SessionObserverCursor> {\n const next = new Map<string, SessionObserverCursor>();\n for (const [sessionKey, value] of Object.entries(sessions)) {\n if (!value || typeof value !== \"object\") continue;\n next.set(sessionKey, {\n sessionKey,\n cursorBytes: sanitizeNonNegativeInt(value.cursorBytes),\n cursorTokens: sanitizeNonNegativeInt(value.cursorTokens),\n lastObservedAt:\n typeof value.lastObservedAt === \"string\" ? value.lastObservedAt : new Date(0).toISOString(),\n lastTriggeredAt: typeof value.lastTriggeredAt === \"string\" ? value.lastTriggeredAt : undefined,\n lastResetAt: typeof value.lastResetAt === \"string\" ? value.lastResetAt : undefined,\n });\n }\n return next;\n }\n\n constructor(opts: {\n memoryDir: string;\n debounceMs: number;\n bands: SessionObserverBandConfig[];\n }) {\n this.statePath = path.join(opts.memoryDir, \"state\", \"session-observer-state.json\");\n this.lockPath = path.join(opts.memoryDir, \"state\", \"session-observer-state.lock\");\n this.debounceMs = Math.max(0, Math.floor(opts.debounceMs));\n this.bands = normalizeObserverBands(opts.bands);\n }\n\n private async withSaveLock(fn: () => Promise<void>): Promise<void> {\n await mkdir(path.dirname(this.lockPath), { recursive: true });\n for (let attempt = 0; attempt < 80; attempt++) {\n try {\n const handle = await open(this.lockPath, \"wx\");\n try {\n await fn();\n } finally {\n await handle.close();\n await unlink(this.lockPath).catch(() => {});\n }\n return;\n } catch (err: any) {\n if (err?.code !== \"EEXIST\") throw err;\n try {\n const lockInfo = await stat(this.lockPath);\n if (Date.now() - lockInfo.mtimeMs > this.lockStaleMs) {\n await unlink(this.lockPath).catch(() => {});\n continue;\n }\n } catch {\n // Lock might have been released between EEXIST and stat/read.\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n }\n const error = new Error(\"session observer save lock timeout\");\n log.debug(error.message);\n throw error;\n }\n\n async load(): Promise<void> {\n const parsed = await this.readPersistedState();\n if (!parsed) {\n this.sessions.clear();\n return;\n }\n this.sessions = this.normalizePersistedSessions(parsed.sessions);\n }\n\n async save(): Promise<void> {\n await this.withSaveLock(async () => {\n const merged = await this.readMergedSessions();\n this.sessions = merged;\n\n await this.writeSessions(merged);\n });\n }\n\n private async readMergedSessions(): Promise<Map<string, SessionObserverCursor>> {\n const merged = new Map<string, SessionObserverCursor>();\n const persisted = await this.readPersistedState();\n if (persisted) {\n for (const [key, value] of this.normalizePersistedSessions(persisted.sessions).entries()) {\n merged.set(key, value);\n }\n }\n for (const [key, current] of this.sessions.entries()) {\n const existing = merged.get(key);\n if (!existing) {\n merged.set(key, current);\n continue;\n }\n merged.set(key, mergeSessionCursor(existing, current));\n }\n return merged;\n }\n\n private async writeSessions(sessionsMap: Map<string, SessionObserverCursor>): Promise<void> {\n const sessions = Object.create(null) as Record<string, SessionObserverCursor>;\n for (const [key, value] of sessionsMap.entries()) {\n sessions[key] = value;\n }\n const payload: SessionObserverPersistedState = { version: 2, sessions };\n await mkdir(path.dirname(this.statePath), { recursive: true });\n await writeFile(this.statePath, JSON.stringify(payload, null, 2), \"utf-8\");\n }\n\n private enqueueObservation(\n input: SessionObservationInput,\n ): Promise<SessionObservationDecision> {\n const operation = this.saveQueue\n .catch(() => undefined)\n .then(() => this.observeWithSaveLock(input));\n this.saveQueue = operation.then(\n () => undefined,\n () => undefined,\n );\n return operation;\n }\n\n private bandForTotalBytes(totalBytes: number): SessionObserverBandConfig {\n const bytes = sanitizeNonNegativeInt(totalBytes);\n for (const band of this.bands) {\n if (bytes <= band.maxBytes) return band;\n }\n return this.bands[this.bands.length - 1];\n }\n\n async observe(input: SessionObservationInput): Promise<SessionObservationDecision> {\n return this.enqueueObservation(input);\n }\n\n private async observeWithSaveLock(\n input: SessionObservationInput,\n ): Promise<SessionObservationDecision> {\n let decision: SessionObservationDecision | undefined;\n await this.withSaveLock(async () => {\n const localExisting = this.sessions.get(input.sessionKey);\n const sessions = await this.readMergedSessions();\n decision = await this.observeMerged(\n input,\n sessions,\n localExisting ? { ...localExisting } : undefined,\n );\n });\n if (!decision) {\n throw new Error(\"session observer decision was not computed\");\n }\n return decision;\n }\n\n private async observeMerged(\n input: SessionObservationInput,\n sessions: Map<string, SessionObserverCursor>,\n localExisting?: SessionObserverCursor,\n ): Promise<SessionObservationDecision> {\n const nowIso = input.observedAt ?? new Date().toISOString();\n const totalBytes = sanitizeNonNegativeInt(input.totalBytes);\n const totalTokens = sanitizeNonNegativeInt(input.totalTokens);\n const band = this.bandForTotalBytes(totalBytes);\n\n const existing = sessions.get(input.sessionKey);\n if (!existing) {\n sessions.set(input.sessionKey, {\n sessionKey: input.sessionKey,\n cursorBytes: totalBytes,\n cursorTokens: totalTokens,\n lastObservedAt: nowIso,\n });\n this.sessions = sessions;\n await this.writeSessions(sessions);\n return {\n triggered: false,\n deltaBytes: 0,\n deltaTokens: 0,\n band,\n reason: \"baseline\",\n };\n }\n\n const session = { ...existing };\n const observedMs = parseIsoMs(nowIso);\n const existingObservedMs = parseIsoMs(session.lastObservedAt);\n const existingResetMs = parseIsoMs(session.lastResetAt);\n if (existingResetMs > 0 && observedMs < existingResetMs) {\n this.sessions = sessions;\n return { triggered: false, deltaBytes: 0, deltaTokens: 0, band, reason: \"baseline\" };\n }\n\n if (totalBytes < session.cursorBytes || totalTokens < session.cursorTokens) {\n const localSawReset =\n localExisting !== undefined\n && (totalBytes < sanitizeNonNegativeInt(localExisting.cursorBytes)\n || totalTokens < sanitizeNonNegativeInt(localExisting.cursorTokens));\n const canApplyReset = localSawReset && observedMs >= existingObservedMs;\n\n if (canApplyReset) {\n session.cursorBytes = totalBytes;\n session.cursorTokens = totalTokens;\n session.lastObservedAt = nowIso;\n session.lastResetAt = nowIso;\n } else if (observedMs >= existingObservedMs) {\n session.lastObservedAt = nowIso;\n }\n sessions.set(input.sessionKey, session);\n this.sessions = sessions;\n await this.writeSessions(sessions);\n return { triggered: false, deltaBytes: 0, deltaTokens: 0, band, reason: \"baseline\" };\n }\n\n const deltaBytes = totalBytes - session.cursorBytes;\n const deltaTokens = totalTokens - session.cursorTokens;\n const crossedThreshold =\n (band.triggerDeltaBytes > 0 && deltaBytes >= band.triggerDeltaBytes)\n || (band.triggerDeltaTokens > 0 && deltaTokens >= band.triggerDeltaTokens);\n session.lastObservedAt = nowIso;\n\n if (!crossedThreshold) {\n const unchanged = deltaBytes === 0 && deltaTokens === 0;\n if (!unchanged) {\n sessions.set(input.sessionKey, session);\n this.sessions = sessions;\n await this.writeSessions(sessions);\n } else {\n this.sessions = sessions;\n }\n return {\n triggered: false,\n deltaBytes,\n deltaTokens,\n band,\n };\n }\n\n const nowMs = Date.parse(nowIso);\n const lastTriggeredMs = session.lastTriggeredAt ? Date.parse(session.lastTriggeredAt) : NaN;\n const withinDebounce =\n Number.isFinite(lastTriggeredMs) && nowMs - lastTriggeredMs < this.debounceMs;\n\n if (withinDebounce) {\n sessions.set(input.sessionKey, session);\n this.sessions = sessions;\n await this.writeSessions(sessions);\n return {\n triggered: false,\n deltaBytes,\n deltaTokens,\n band,\n reason: \"debounced\",\n };\n }\n\n session.lastTriggeredAt = nowIso;\n session.cursorBytes = totalBytes;\n session.cursorTokens = totalTokens;\n sessions.set(input.sessionKey, session);\n this.sessions = sessions;\n await this.writeSessions(sessions);\n return {\n triggered: true,\n deltaBytes,\n deltaTokens,\n band,\n reason: \"threshold\",\n };\n }\n}\n"],"mappings":";;;;;;;;AAAA,OAAO,UAAU;AACjB,SAAS,OAAO,MAAM,UAAU,MAAM,QAAQ,iBAAiB;AAkC/D,SAAS,uBAAuB,OAAuB;AACrD,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;AACtC;AAEA,SAAS,WAAW,OAAwB;AAC1C,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,KAAK,KAAK,MAAM,KAAK;AAC3B,SAAO,OAAO,SAAS,EAAE,IAAI,KAAK;AACpC;AAEA,SAAS,mBACP,UACA,UACuB;AACvB,QAAM,qBAAqB,WAAW,SAAS,cAAc;AAC7D,QAAM,qBAAqB,WAAW,SAAS,cAAc;AAC7D,QAAM,sBAAsB,WAAW,SAAS,eAAe;AAC/D,QAAM,sBAAsB,WAAW,SAAS,eAAe;AAC/D,QAAM,kBAAkB,WAAW,SAAS,WAAW;AACvD,QAAM,kBAAkB,WAAW,SAAS,WAAW;AAEvD,QAAM,aACJ,sBAAsB,qBAAqB,SAAS,iBAAiB,SAAS;AAChF,QAAM,cACJ,uBAAuB,sBAAsB,SAAS,kBAAkB,SAAS;AAGnF,QAAM,kBAAkB,sBAAsB;AAC9C,QAAM,wBAAwB,kBAAkB;AAChD,QAAM,qBAAqB,mBAAmB;AAC9C,QAAM,oBACJ,kBAAkB,mBAAmB,sBAAsB;AAE7D,MAAI,cAAc,KAAK;AAAA,IACrB,uBAAuB,SAAS,WAAW;AAAA,IAC3C,uBAAuB,SAAS,WAAW;AAAA,EAC7C;AACA,MAAI,eAAe,KAAK;AAAA,IACtB,uBAAuB,SAAS,YAAY;AAAA,IAC5C,uBAAuB,SAAS,YAAY;AAAA,EAC9C;AACA,MAAI,mBAAmB;AACrB,kBAAc,uBAAuB,SAAS,WAAW;AACzD,mBAAe,uBAAuB,SAAS,YAAY;AAAA,EAC7D,WAAW,oBAAoB;AAC7B,kBAAc,uBAAuB,SAAS,WAAW;AACzD,mBAAe,uBAAuB,SAAS,YAAY;AAAA,EAC7D;AAEA,SAAO;AAAA,IACL,YAAY,SAAS;AAAA,IACrB;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,aACE,mBAAmB,kBAAkB,SAAS,cAAc,SAAS;AAAA,EACzE;AACF;AAEO,SAAS,uBACd,OAC6B;AAC7B,QAAM,aAAa,MAChB,IAAI,CAAC,UAAU;AAAA,IACd,UAAU,uBAAuB,KAAK,QAAQ;AAAA,IAC9C,mBAAmB,uBAAuB,KAAK,iBAAiB;AAAA,IAChE,oBAAoB,uBAAuB,KAAK,kBAAkB;AAAA,EACpE,EAAE,EACD,OAAO,CAAC,SAAS,KAAK,WAAW,CAAC,EAClC,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAEzC,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,iCAAiC;AAAA,EAC1C;AAEA,QAAM,OAAO,WAAW,WAAW,SAAS,CAAC;AAC7C,MAAI,QAAQ,KAAK,WAAW,KAAe;AACzC,eAAW,KAAK;AAAA,MACd,UAAU;AAAA,MACV,mBAAmB,KAAK;AAAA,MACxB,oBAAoB,KAAK;AAAA,IAC3B,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,IAAM,uBAAN,MAA2B;AAAA,EACf;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACT,WAAW,oBAAI,IAAmC;AAAA,EAClD,YAA2B,QAAQ,QAAQ;AAAA,EAEnD,MAAc,qBAAoE;AAChF,QAAI;AACF,YAAM,MAAM,MAAM,SAAS,KAAK,WAAW,OAAO;AAClD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,QAAQ,YAAY,KAAK,CAAC,OAAO,YAAY,OAAO,OAAO,aAAa,UAAU;AACpF,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,2BACN,UACoC;AACpC,UAAM,OAAO,oBAAI,IAAmC;AACpD,eAAW,CAAC,YAAY,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC1D,UAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,WAAK,IAAI,YAAY;AAAA,QACnB;AAAA,QACA,aAAa,uBAAuB,MAAM,WAAW;AAAA,QACrD,cAAc,uBAAuB,MAAM,YAAY;AAAA,QACvD,gBACE,OAAO,MAAM,mBAAmB,WAAW,MAAM,kBAAiB,oBAAI,KAAK,CAAC,GAAE,YAAY;AAAA,QAC5F,iBAAiB,OAAO,MAAM,oBAAoB,WAAW,MAAM,kBAAkB;AAAA,QACrF,aAAa,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAAA,MAC3E,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,MAIT;AACD,SAAK,YAAY,KAAK,KAAK,KAAK,WAAW,SAAS,6BAA6B;AACjF,SAAK,WAAW,KAAK,KAAK,KAAK,WAAW,SAAS,6BAA6B;AAChF,SAAK,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,UAAU,CAAC;AACzD,SAAK,QAAQ,uBAAuB,KAAK,KAAK;AAAA,EAChD;AAAA,EAEA,MAAc,aAAa,IAAwC;AACjE,UAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,aAAS,UAAU,GAAG,UAAU,IAAI,WAAW;AAC7C,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,KAAK,UAAU,IAAI;AAC7C,YAAI;AACF,gBAAM,GAAG;AAAA,QACX,UAAE;AACA,gBAAM,OAAO,MAAM;AACnB,gBAAM,OAAO,KAAK,QAAQ,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QAC5C;AACA;AAAA,MACF,SAAS,KAAU;AACjB,YAAI,KAAK,SAAS,SAAU,OAAM;AAClC,YAAI;AACF,gBAAM,WAAW,MAAM,KAAK,KAAK,QAAQ;AACzC,cAAI,KAAK,IAAI,IAAI,SAAS,UAAU,KAAK,aAAa;AACpD,kBAAM,OAAO,KAAK,QAAQ,EAAE,MAAM,MAAM;AAAA,YAAC,CAAC;AAC1C;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AACA,cAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,MACxD;AAAA,IACF;AACA,UAAM,QAAQ,IAAI,MAAM,oCAAoC;AAC5D,QAAI,MAAM,MAAM,OAAO;AACvB,UAAM;AAAA,EACR;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,SAAS,MAAM,KAAK,mBAAmB;AAC7C,QAAI,CAAC,QAAQ;AACX,WAAK,SAAS,MAAM;AACpB;AAAA,IACF;AACA,SAAK,WAAW,KAAK,2BAA2B,OAAO,QAAQ;AAAA,EACjE;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,KAAK,aAAa,YAAY;AAClC,YAAM,SAAS,MAAM,KAAK,mBAAmB;AAC7C,WAAK,WAAW;AAEhB,YAAM,KAAK,cAAc,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,qBAAkE;AAC9E,UAAM,SAAS,oBAAI,IAAmC;AACtD,UAAM,YAAY,MAAM,KAAK,mBAAmB;AAChD,QAAI,WAAW;AACb,iBAAW,CAAC,KAAK,KAAK,KAAK,KAAK,2BAA2B,UAAU,QAAQ,EAAE,QAAQ,GAAG;AACxF,eAAO,IAAI,KAAK,KAAK;AAAA,MACvB;AAAA,IACF;AACA,eAAW,CAAC,KAAK,OAAO,KAAK,KAAK,SAAS,QAAQ,GAAG;AACpD,YAAM,WAAW,OAAO,IAAI,GAAG;AAC/B,UAAI,CAAC,UAAU;AACb,eAAO,IAAI,KAAK,OAAO;AACvB;AAAA,MACF;AACA,aAAO,IAAI,KAAK,mBAAmB,UAAU,OAAO,CAAC;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,aAAgE;AAC1F,UAAM,WAAW,uBAAO,OAAO,IAAI;AACnC,eAAW,CAAC,KAAK,KAAK,KAAK,YAAY,QAAQ,GAAG;AAChD,eAAS,GAAG,IAAI;AAAA,IAClB;AACA,UAAM,UAAyC,EAAE,SAAS,GAAG,SAAS;AACtE,UAAM,MAAM,KAAK,QAAQ,KAAK,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7D,UAAM,UAAU,KAAK,WAAW,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,OAAO;AAAA,EAC3E;AAAA,EAEQ,mBACN,OACqC;AACrC,UAAM,YAAY,KAAK,UACpB,MAAM,MAAM,MAAS,EACrB,KAAK,MAAM,KAAK,oBAAoB,KAAK,CAAC;AAC7C,SAAK,YAAY,UAAU;AAAA,MACzB,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,YAA+C;AACvE,UAAM,QAAQ,uBAAuB,UAAU;AAC/C,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI,SAAS,KAAK,SAAU,QAAO;AAAA,IACrC;AACA,WAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,QAAQ,OAAqE;AACjF,WAAO,KAAK,mBAAmB,KAAK;AAAA,EACtC;AAAA,EAEA,MAAc,oBACZ,OACqC;AACrC,QAAI;AACJ,UAAM,KAAK,aAAa,YAAY;AAClC,YAAM,gBAAgB,KAAK,SAAS,IAAI,MAAM,UAAU;AACxD,YAAM,WAAW,MAAM,KAAK,mBAAmB;AAC/C,iBAAW,MAAM,KAAK;AAAA,QACpB;AAAA,QACA;AAAA,QACA,gBAAgB,EAAE,GAAG,cAAc,IAAI;AAAA,MACzC;AAAA,IACF,CAAC;AACD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cACZ,OACA,UACA,eACqC;AACrC,UAAM,SAAS,MAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC1D,UAAM,aAAa,uBAAuB,MAAM,UAAU;AAC1D,UAAM,cAAc,uBAAuB,MAAM,WAAW;AAC5D,UAAM,OAAO,KAAK,kBAAkB,UAAU;AAE9C,UAAM,WAAW,SAAS,IAAI,MAAM,UAAU;AAC9C,QAAI,CAAC,UAAU;AACb,eAAS,IAAI,MAAM,YAAY;AAAA,QAC7B,YAAY,MAAM;AAAA,QAClB,aAAa;AAAA,QACb,cAAc;AAAA,QACd,gBAAgB;AAAA,MAClB,CAAC;AACD,WAAK,WAAW;AAChB,YAAM,KAAK,cAAc,QAAQ;AACjC,aAAO;AAAA,QACL,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,aAAa;AAAA,QACb;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,UAAU,EAAE,GAAG,SAAS;AAC9B,UAAM,aAAa,WAAW,MAAM;AACpC,UAAM,qBAAqB,WAAW,QAAQ,cAAc;AAC5D,UAAM,kBAAkB,WAAW,QAAQ,WAAW;AACtD,QAAI,kBAAkB,KAAK,aAAa,iBAAiB;AACvD,WAAK,WAAW;AAChB,aAAO,EAAE,WAAW,OAAO,YAAY,GAAG,aAAa,GAAG,MAAM,QAAQ,WAAW;AAAA,IACrF;AAEA,QAAI,aAAa,QAAQ,eAAe,cAAc,QAAQ,cAAc;AAC1E,YAAM,gBACJ,kBAAkB,WACd,aAAa,uBAAuB,cAAc,WAAW,KAC5D,cAAc,uBAAuB,cAAc,YAAY;AACtE,YAAM,gBAAgB,iBAAiB,cAAc;AAErD,UAAI,eAAe;AACjB,gBAAQ,cAAc;AACtB,gBAAQ,eAAe;AACvB,gBAAQ,iBAAiB;AACzB,gBAAQ,cAAc;AAAA,MACxB,WAAW,cAAc,oBAAoB;AAC3C,gBAAQ,iBAAiB;AAAA,MAC3B;AACA,eAAS,IAAI,MAAM,YAAY,OAAO;AACtC,WAAK,WAAW;AAChB,YAAM,KAAK,cAAc,QAAQ;AACjC,aAAO,EAAE,WAAW,OAAO,YAAY,GAAG,aAAa,GAAG,MAAM,QAAQ,WAAW;AAAA,IACrF;AAEA,UAAM,aAAa,aAAa,QAAQ;AACxC,UAAM,cAAc,cAAc,QAAQ;AAC1C,UAAM,mBACH,KAAK,oBAAoB,KAAK,cAAc,KAAK,qBAC9C,KAAK,qBAAqB,KAAK,eAAe,KAAK;AACzD,YAAQ,iBAAiB;AAEzB,QAAI,CAAC,kBAAkB;AACrB,YAAM,YAAY,eAAe,KAAK,gBAAgB;AACtD,UAAI,CAAC,WAAW;AACd,iBAAS,IAAI,MAAM,YAAY,OAAO;AACtC,aAAK,WAAW;AAChB,cAAM,KAAK,cAAc,QAAQ;AAAA,MACnC,OAAO;AACL,aAAK,WAAW;AAAA,MAClB;AACA,aAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,UAAM,kBAAkB,QAAQ,kBAAkB,KAAK,MAAM,QAAQ,eAAe,IAAI;AACxF,UAAM,iBACJ,OAAO,SAAS,eAAe,KAAK,QAAQ,kBAAkB,KAAK;AAErE,QAAI,gBAAgB;AAClB,eAAS,IAAI,MAAM,YAAY,OAAO;AACtC,WAAK,WAAW;AAChB,YAAM,KAAK,cAAc,QAAQ;AACjC,aAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,YAAQ,kBAAkB;AAC1B,YAAQ,cAAc;AACtB,YAAQ,eAAe;AACvB,aAAS,IAAI,MAAM,YAAY,OAAO;AACtC,SAAK,WAAW;AAChB,UAAM,KAAK,cAAc,QAAQ;AACjC,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AACF;","names":[]}
@@ -1,10 +1,10 @@
1
- import {
2
- scanMemoryDir
3
- } from "./chunk-W7IGLX4G.js";
4
1
  import {
5
2
  isSearchAborted,
6
3
  throwIfSearchAborted
7
4
  } from "./chunk-GUMZC2BO.js";
5
+ import {
6
+ scanMemoryDir
7
+ } from "./chunk-W7IGLX4G.js";
8
8
  import {
9
9
  reportSearchDegradation,
10
10
  resolveEnsureCollectionArgs
@@ -613,4 +613,4 @@ export {
613
613
  resolveOramaCollectionDbFilePath,
614
614
  OramaBackend
615
615
  };
616
- //# sourceMappingURL=chunk-YLHM5BQQ.js.map
616
+ //# sourceMappingURL=chunk-OLX2HJFW.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KJTKLXTH.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-YTZA7U6Q.js";
6
+ } from "./chunk-2VHCLHZ5.js";
7
7
  import {
8
8
  copyExistingFileToBackup,
9
9
  writeFileAtomically
@@ -260,4 +260,4 @@ export {
260
260
  backupExistingLedger,
261
261
  rebuildMemoryLifecycleLedger
262
262
  };
263
- //# sourceMappingURL=chunk-DNC4A7RS.js.map
263
+ //# sourceMappingURL=chunk-OU7RWWW6.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  NamespaceStorageRouter
3
- } from "./chunk-LIF6DO6U.js";
3
+ } from "./chunk-MG7GI4TT.js";
4
4
  import {
5
5
  namespaceCollectionName
6
- } from "./chunk-SNW3YRO6.js";
6
+ } from "./chunk-P6GOYLHN.js";
7
7
  import {
8
8
  isSafeRouteNamespace
9
9
  } from "./chunk-PCXDUHQH.js";
@@ -213,4 +213,4 @@ export {
213
213
  verifyNamespaces,
214
214
  runNamespaceMigration
215
215
  };
216
- //# sourceMappingURL=chunk-L3LRWDJW.js.map
216
+ //# sourceMappingURL=chunk-OV36CROW.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-765K3SAT.js";
4
4
  import {
5
5
  encryptCapsuleFile
6
- } from "./chunk-DQEMWVMT.js";
6
+ } from "./chunk-UVYI6VIX.js";
7
7
  import {
8
8
  computeTransferOutputRel,
9
9
  isTransferPathExcluded
@@ -109,4 +109,4 @@ async function enforceRetention(outDirAbs, retentionDays) {
109
109
  export {
110
110
  backupMemoryDir
111
111
  };
112
- //# sourceMappingURL=chunk-BXLOS5AJ.js.map
112
+ //# sourceMappingURL=chunk-OWHERGF2.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-YTZA7U6Q.js";
3
+ } from "./chunk-2VHCLHZ5.js";
4
4
  import {
5
5
  normalizeEntityName
6
6
  } from "./chunk-YXZG5TVN.js";
@@ -956,4 +956,4 @@ export {
956
956
  resolveBriefingSaveDir,
957
957
  briefingFilename
958
958
  };
959
- //# sourceMappingURL=chunk-CSV34HIW.js.map
959
+ //# sourceMappingURL=chunk-P5OYNV7B.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createSearchBackend
3
- } from "./chunk-F7M36OG2.js";
3
+ } from "./chunk-JNWISMYG.js";
4
4
  import {
5
5
  namespaceIdentityToken,
6
6
  normalizeNamespaceIdentity
@@ -470,4 +470,4 @@ export {
470
470
  NamespaceSearchRouter,
471
471
  normalizeQmdResultPath
472
472
  };
473
- //# sourceMappingURL=chunk-SNW3YRO6.js.map
473
+ //# sourceMappingURL=chunk-P6GOYLHN.js.map