@remnic/core 9.30.0 → 9.31.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 (495) hide show
  1. package/dist/access-admin-ops-surface.d.ts +10 -10
  2. package/dist/access-admin-ops-surface.js +50 -44
  3. package/dist/access-authorization-probe.d.ts +10 -10
  4. package/dist/access-authorization-probe.js +51 -45
  5. package/dist/access-boundary.d.ts +13 -11
  6. package/dist/access-boundary.js +50 -44
  7. package/dist/access-cli.js +168 -123
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +119 -0
  10. package/dist/access-extraction-force-flush.js +166 -0
  11. package/dist/access-health-types.d.ts +1 -1
  12. package/dist/access-http-lcm-compaction.d.ts +47 -13
  13. package/dist/access-http-lcm-compaction.js +7 -3
  14. package/dist/access-http-lifecycle-flush.d.ts +132 -0
  15. package/dist/access-http-lifecycle-flush.js +9 -0
  16. package/dist/access-http-lifecycle-flush.js.map +1 -0
  17. package/dist/access-http.d.ts +11 -10
  18. package/dist/access-http.js +66 -59
  19. package/dist/access-identity-continuity-surface.d.ts +8 -8
  20. package/dist/access-identity-continuity-surface.js +50 -44
  21. package/dist/access-lcm-surface.d.ts +10 -10
  22. package/dist/access-lcm-surface.js +50 -44
  23. package/dist/access-mcp-output-schemas.js +1 -1
  24. package/dist/access-mcp.d.ts +16 -10
  25. package/dist/access-mcp.js +58 -52
  26. package/dist/access-memory-search-fanout.d.ts +2 -2
  27. package/dist/{access-namespace-preflight-VfXssvoI.d.ts → access-namespace-preflight-D4vW97H1.d.ts} +1 -1
  28. package/dist/access-namespace-preflight.d.ts +3 -3
  29. package/dist/access-namespace-preflight.js +50 -44
  30. package/dist/access-observe-helpers.d.ts +22 -0
  31. package/dist/access-observe-helpers.js +10 -0
  32. package/dist/access-observe-helpers.js.map +1 -0
  33. package/dist/access-observe-write-surface.d.ts +51 -47
  34. package/dist/access-observe-write-surface.js +50 -44
  35. package/dist/access-operations-batch.js +53 -47
  36. package/dist/access-operations.d.ts +11 -11
  37. package/dist/access-operations.js +55 -49
  38. package/dist/access-recall-concurrency.d.ts +10 -10
  39. package/dist/access-recall-concurrency.js +50 -44
  40. package/dist/access-recall-response.d.ts +10 -10
  41. package/dist/access-recall-response.js +50 -44
  42. package/dist/access-recall-surface.d.ts +10 -10
  43. package/dist/access-recall-surface.js +50 -44
  44. package/dist/access-schema.d.ts +37 -7
  45. package/dist/access-schema.js +5 -3
  46. package/dist/{access-service-B5RwVsTV.d.ts → access-service-B6PZ_xUL.d.ts} +44 -20
  47. package/dist/access-service-helpers.d.ts +113 -0
  48. package/dist/access-service-helpers.js +8 -0
  49. package/dist/access-service-helpers.js.map +1 -0
  50. package/dist/access-service.d.ts +10 -10
  51. package/dist/access-service.js +50 -44
  52. package/dist/access-surface-catalog.d.ts +10 -10
  53. package/dist/access-surface-catalog.js +2 -0
  54. package/dist/access-surface-catalog.js.map +1 -1
  55. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  56. package/dist/action-confidence.d.ts +1 -1
  57. package/dist/active-memory-bridge.d.ts +1 -1
  58. package/dist/active-recall.d.ts +1 -1
  59. package/dist/active-recall.js +1 -1
  60. package/dist/adapters/index.js +7 -7
  61. package/dist/adapters/registry.js +3 -3
  62. package/dist/behavior-learner.d.ts +1 -1
  63. package/dist/behavior-signals.d.ts +1 -1
  64. package/dist/bootstrap.d.ts +8 -8
  65. package/dist/briefing.d.ts +2 -2
  66. package/dist/briefing.js +14 -14
  67. package/dist/buffer-surprise-report.d.ts +1 -1
  68. package/dist/buffer-turn-helpers.d.ts +5 -0
  69. package/dist/buffer-turn-helpers.js +24 -0
  70. package/dist/buffer-turn-helpers.js.map +1 -0
  71. package/dist/buffer.d.ts +17 -4
  72. package/dist/buffer.js +21 -1
  73. package/dist/bulk-import/index.d.ts +3 -3
  74. package/dist/calibration.d.ts +1 -1
  75. package/dist/capabilities.d.ts +1 -1
  76. package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
  77. package/dist/capsule-crypto-7FJQINUR.js.map +1 -0
  78. package/dist/{capsule-merge-5KKJQBWQ.js → capsule-merge-2H2IUTBT.js} +4 -4
  79. package/dist/{catalog-V7inUQdp.d.ts → catalog-CGFYmTT8.d.ts} +1 -1
  80. package/dist/causal-behavior.d.ts +1 -1
  81. package/dist/causal-behavior.js +2 -2
  82. package/dist/causal-chain.js +2 -2
  83. package/dist/causal-consolidation.d.ts +1 -1
  84. package/dist/causal-consolidation.js +19 -19
  85. package/dist/causal-retrieval.js +2 -2
  86. package/dist/causal-trajectory-graph.d.ts +1 -1
  87. package/dist/causal-trajectory.js +1 -1
  88. package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
  89. package/dist/{chunk-GIBMDSJ2.js → chunk-27P5YVDU.js} +2 -2
  90. package/dist/{chunk-2SA56WMI.js → chunk-2LTDWSR6.js} +4 -4
  91. package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
  92. package/dist/{chunk-YTSNAUXN.js → chunk-3F2LKUMU.js} +22 -8
  93. package/dist/chunk-3F2LKUMU.js.map +1 -0
  94. package/dist/chunk-3QL24R5Y.js +9 -0
  95. package/dist/chunk-3QL24R5Y.js.map +1 -0
  96. package/dist/chunk-4RNZMRAV.js +60 -0
  97. package/dist/chunk-4RNZMRAV.js.map +1 -0
  98. package/dist/{chunk-6U7F52DE.js → chunk-4XHR3I67.js} +60 -60
  99. package/dist/chunk-5IVLTFOV.js +65 -0
  100. package/dist/chunk-5IVLTFOV.js.map +1 -0
  101. package/dist/{chunk-2EUVEDF5.js → chunk-5XA7PQ5I.js} +2 -2
  102. package/dist/{chunk-ALSGMEJR.js → chunk-65ZPVYTA.js} +7 -7
  103. package/dist/{chunk-5VQJBH2G.js → chunk-6TAUHL33.js} +2 -2
  104. package/dist/{chunk-HUHX2OCX.js → chunk-7DRETLP5.js} +1 -1
  105. package/dist/chunk-7DRETLP5.js.map +1 -0
  106. package/dist/{chunk-RGIWINDN.js → chunk-7G5MH4NT.js} +30 -30
  107. package/dist/{chunk-WVO4G37W.js → chunk-7TEZUUGM.js} +3 -3
  108. package/dist/{chunk-MJCGLM25.js → chunk-7VUAG236.js} +5 -5
  109. package/dist/{chunk-M3C2V3PV.js → chunk-AJEMDQNA.js} +12 -12
  110. package/dist/{chunk-RKNJBZ55.js → chunk-AU7Q3LSC.js} +7 -7
  111. package/dist/{chunk-ACXPX4AG.js → chunk-BR2K43MK.js} +2 -2
  112. package/dist/{chunk-IYZ5K7MU.js → chunk-BUE5E2HL.js} +4 -187
  113. package/dist/chunk-BUE5E2HL.js.map +1 -0
  114. package/dist/{chunk-CZRYLSSW.js → chunk-BUGVGH4N.js} +2 -2
  115. package/dist/{chunk-YTQNQ4KB.js → chunk-C4VQMFVM.js} +3 -3
  116. package/dist/{chunk-ZPSVBSOF.js → chunk-CIVDJD6P.js} +3 -3
  117. package/dist/{chunk-K5GB36ME.js → chunk-CZDOT5I2.js} +2 -2
  118. package/dist/{chunk-VI2JQPNQ.js → chunk-E4PWACUN.js} +2 -2
  119. package/dist/{chunk-D2ANTDGO.js → chunk-E6BMSH7U.js} +2 -2
  120. package/dist/{chunk-P5PXWTW7.js → chunk-EJCAV3QZ.js} +3 -3
  121. package/dist/{chunk-CKMO4RDY.js → chunk-EMDLM3LW.js} +4 -4
  122. package/dist/chunk-ER7W6H4T.js +112 -0
  123. package/dist/chunk-ER7W6H4T.js.map +1 -0
  124. package/dist/{chunk-6FUPCJUL.js → chunk-FI4F5X2V.js} +54 -54
  125. package/dist/chunk-FI4F5X2V.js.map +1 -0
  126. package/dist/{chunk-LGHKJABJ.js → chunk-GOUILH55.js} +40 -18
  127. package/dist/chunk-GOUILH55.js.map +1 -0
  128. package/dist/{chunk-G5R3D5UP.js → chunk-GTTAHHD3.js} +2 -2
  129. package/dist/{chunk-H5CPS5JP.js → chunk-H36LJIPD.js} +3 -3
  130. package/dist/{chunk-AITCS2RC.js → chunk-IJ7HK452.js} +4 -4
  131. package/dist/{chunk-D3LMYTBV.js → chunk-J7WZUL2K.js} +9 -9
  132. package/dist/{chunk-5W4ZLBEZ.js → chunk-JCFTIQBR.js} +2 -2
  133. package/dist/{chunk-XOZ4ALGB.js → chunk-KE353EWI.js} +3 -3
  134. package/dist/{chunk-W5EG6LE3.js → chunk-KIT6M7EB.js} +3 -3
  135. package/dist/{chunk-5W7CTZ2E.js → chunk-KQAFEZQX.js} +4 -4
  136. package/dist/{chunk-Z54EM5YZ.js → chunk-MAXVH44E.js} +7 -7
  137. package/dist/{chunk-WZFAPHIK.js → chunk-MU7ZHSZE.js} +2 -2
  138. package/dist/chunk-N5Z4EVOR.js +123 -0
  139. package/dist/chunk-N5Z4EVOR.js.map +1 -0
  140. package/dist/{chunk-66772WBP.js → chunk-NFXQJHJD.js} +5 -5
  141. package/dist/{chunk-AZ5BTEKX.js → chunk-NQUF7XKR.js} +2 -2
  142. package/dist/{chunk-W4FBGYGK.js → chunk-NRV4Y3PM.js} +1 -1
  143. package/dist/{chunk-NHWB6HG2.js → chunk-NYCGIQRA.js} +2 -2
  144. package/dist/{chunk-4WKA6I65.js → chunk-OGCNZPKX.js} +1119 -309
  145. package/dist/chunk-OGCNZPKX.js.map +1 -0
  146. package/dist/{chunk-QJAQNXWI.js → chunk-ONHRRJZM.js} +6 -6
  147. package/dist/{chunk-FDAMS4PK.js → chunk-PNPOWBGC.js} +2 -2
  148. package/dist/{chunk-IC6CBHCA.js → chunk-QGENAYVS.js} +2 -2
  149. package/dist/{chunk-GBJ4RDFR.js → chunk-QIHIHZYC.js} +66 -91
  150. package/dist/chunk-QIHIHZYC.js.map +1 -0
  151. package/dist/{chunk-PUS63Q3G.js → chunk-RUYJ7TWU.js} +517 -2011
  152. package/dist/chunk-RUYJ7TWU.js.map +1 -0
  153. package/dist/{chunk-4A6YGWQN.js → chunk-TL4TO3EA.js} +115 -120
  154. package/dist/chunk-TL4TO3EA.js.map +1 -0
  155. package/dist/{chunk-SPJXKAVF.js → chunk-U52AKICI.js} +14 -13
  156. package/dist/chunk-U52AKICI.js.map +1 -0
  157. package/dist/chunk-ULARSG5Z.js +203 -0
  158. package/dist/chunk-ULARSG5Z.js.map +1 -0
  159. package/dist/{chunk-62U4J2GN.js → chunk-UR77VKF7.js} +2 -2
  160. package/dist/{chunk-JCBWCYEJ.js → chunk-VANLTS5F.js} +2 -2
  161. package/dist/{chunk-4Z4XNEWZ.js → chunk-VCD4PSK2.js} +56 -12
  162. package/dist/chunk-VCD4PSK2.js.map +1 -0
  163. package/dist/{chunk-RMMVQQA6.js → chunk-WDISJRMG.js} +2 -2
  164. package/dist/{chunk-B6JDYXL7.js → chunk-WWUVONGW.js} +7 -1
  165. package/dist/chunk-WWUVONGW.js.map +1 -0
  166. package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
  167. package/dist/{chunk-TH2LSRMG.js → chunk-XHDIB4T4.js} +2 -2
  168. package/dist/{chunk-CVILPI77.js → chunk-XOQSEF7X.js} +6 -6
  169. package/dist/{chunk-LBOD4U5B.js → chunk-YFOMN2II.js} +6 -6
  170. package/dist/{chunk-RPW2NOU6.js → chunk-YIAA2X3D.js} +41 -1
  171. package/dist/chunk-YIAA2X3D.js.map +1 -0
  172. package/dist/chunk-YPC7W6GA.js +1604 -0
  173. package/dist/chunk-YPC7W6GA.js.map +1 -0
  174. package/dist/{chunk-I5NLEENJ.js → chunk-Z4SWV4VW.js} +3 -3
  175. package/dist/{chunk-PHWUFPCO.js → chunk-ZCPP5OW6.js} +61 -53
  176. package/dist/chunk-ZCPP5OW6.js.map +1 -0
  177. package/dist/{cli-C4GbETPC.d.ts → cli-BptUDTtp.d.ts} +5 -5
  178. package/dist/cli.d.ts +12 -12
  179. package/dist/cli.js +91 -84
  180. package/dist/compounding/engine.d.ts +2 -2
  181. package/dist/compounding/engine.js +14 -14
  182. package/dist/compounding/preference-consolidator.d.ts +1 -1
  183. package/dist/compression-optimizer.d.ts +1 -1
  184. package/dist/config.d.ts +1 -1
  185. package/dist/config.js +1 -1
  186. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  187. package/dist/connectors/codex-materialize-runner.js +14 -14
  188. package/dist/connectors/codex-materialize.d.ts +1 -1
  189. package/dist/connectors/index.d.ts +1 -1
  190. package/dist/connectors/index.js +17 -17
  191. package/dist/consolidation-provenance-check.d.ts +2 -2
  192. package/dist/consolidation-provenance-check.js +5 -5
  193. package/dist/consolidation-undo.d.ts +2 -2
  194. package/dist/consolidation-undo.js +3 -3
  195. package/dist/contradiction/index.d.ts +2 -2
  196. package/dist/contradiction/index.js +4 -4
  197. package/dist/conversation-index/backend.d.ts +1 -1
  198. package/dist/conversation-index/backend.js +2 -2
  199. package/dist/conversation-index/chunker.d.ts +1 -1
  200. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  201. package/dist/conversation-index/indexer.d.ts +1 -1
  202. package/dist/conversation-index/search.d.ts +1 -1
  203. package/dist/corpus-watermark.d.ts +1 -1
  204. package/dist/corpus-watermark.js +26 -26
  205. package/dist/day-summary.d.ts +1 -1
  206. package/dist/delinearize.d.ts +1 -1
  207. package/dist/direct-answer-wiring.d.ts +1 -1
  208. package/dist/direct-answer.d.ts +1 -1
  209. package/dist/embedding-fallback.d.ts +1 -1
  210. package/dist/enrichment/index.d.ts +1 -1
  211. package/dist/entity-retrieval.d.ts +2 -2
  212. package/dist/entity-retrieval.js +14 -14
  213. package/dist/entity-schema.d.ts +1 -1
  214. package/dist/explicit-capture.d.ts +8 -8
  215. package/dist/extraction-error-classification.d.ts +1 -1
  216. package/dist/extraction-faithfulness.d.ts +1 -1
  217. package/dist/extraction-judge-telemetry.d.ts +1 -1
  218. package/dist/extraction-judge-training.d.ts +1 -1
  219. package/dist/extraction-judge.d.ts +1 -1
  220. package/dist/extraction-liveness.d.ts +1 -1
  221. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  222. package/dist/extraction-source-grounding.d.ts +15 -2
  223. package/dist/extraction-source-grounding.js +10 -1
  224. package/dist/extraction.d.ts +2 -15
  225. package/dist/extraction.js +5 -4
  226. package/dist/fallback-llm.d.ts +1 -1
  227. package/dist/graph-dashboard-diff.d.ts +1 -1
  228. package/dist/graph-dashboard-key.d.ts +1 -1
  229. package/dist/graph-dashboard-parser.d.ts +1 -1
  230. package/dist/graph-edge-reinforcement.d.ts +1 -1
  231. package/dist/graph-snapshot.d.ts +1 -1
  232. package/dist/graph.d.ts +1 -1
  233. package/dist/importance.d.ts +1 -1
  234. package/dist/importers/index.d.ts +1 -1
  235. package/dist/in-flight-reads.d.ts +1 -1
  236. package/dist/index.d.ts +19 -19
  237. package/dist/index.js +215 -207
  238. package/dist/intent.d.ts +1 -1
  239. package/dist/lcm/engine.d.ts +1 -1
  240. package/dist/lcm/engine.js +3 -3
  241. package/dist/lcm/index.d.ts +1 -1
  242. package/dist/lcm/index.js +6 -6
  243. package/dist/lcm/tools.d.ts +1 -1
  244. package/dist/lifecycle.d.ts +1 -1
  245. package/dist/live-connectors-runner.d.ts +1 -1
  246. package/dist/local-llm-helpers.d.ts +7 -0
  247. package/dist/local-llm-helpers.js +16 -0
  248. package/dist/local-llm-helpers.js.map +1 -0
  249. package/dist/local-llm.d.ts +3 -6
  250. package/dist/local-llm.js +2 -1
  251. package/dist/local-model-endpoint.d.ts +1 -1
  252. package/dist/maintenance/memory-governance.d.ts +1 -1
  253. package/dist/maintenance/memory-governance.js +14 -14
  254. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  255. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -14
  256. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  257. package/dist/maintenance/rebuild-memory-projection.js +15 -15
  258. package/dist/{maintenance-CL30NWtc.d.ts → maintenance-b6f92bRz.d.ts} +3 -3
  259. package/dist/mcp-memory-inspector-app.d.ts +10 -10
  260. package/dist/memory-action-policy.d.ts +1 -1
  261. package/dist/memory-cache.d.ts +1 -1
  262. package/dist/memory-corpus-version.js +2 -2
  263. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  264. package/dist/memory-projection-store.d.ts +1 -1
  265. package/dist/memory-provenance.d.ts +1 -1
  266. package/dist/memory-worth-outcomes.d.ts +2 -2
  267. package/dist/models-json.d.ts +1 -1
  268. package/dist/namespaces/migrate.d.ts +3 -3
  269. package/dist/namespaces/migrate.js +24 -24
  270. package/dist/namespaces/principal.d.ts +1 -1
  271. package/dist/namespaces/search.d.ts +1 -1
  272. package/dist/namespaces/search.js +9 -9
  273. package/dist/namespaces/storage.d.ts +3 -3
  274. package/dist/namespaces/storage.js +14 -14
  275. package/dist/native-knowledge.d.ts +1 -1
  276. package/dist/offline-sync-impression-drain.d.ts +1 -1
  277. package/dist/offline-sync-impression-drain.js +6 -5
  278. package/dist/operator-doctor-corpus.d.ts +1 -1
  279. package/dist/operator-doctor-corpus.js +29 -29
  280. package/dist/operator-doctor-replica.d.ts +1 -1
  281. package/dist/operator-doctor-replica.js +3 -3
  282. package/dist/operator-toolkit.d.ts +3 -3
  283. package/dist/operator-toolkit.js +38 -37
  284. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  285. package/dist/orchestration/maintenance.d.ts +4 -4
  286. package/dist/orchestration/maintenance.js +22 -21
  287. package/dist/{orchestrator-CKTCRwWV.d.ts → orchestrator-3uGxC1qO.d.ts} +72 -34
  288. package/dist/orchestrator.d.ts +8 -8
  289. package/dist/orchestrator.js +167 -159
  290. package/dist/page-versioning.js +3 -3
  291. package/dist/patterns-cli.d.ts +1 -1
  292. package/dist/{pipeline-B7wj4rRZ.d.ts → pipeline-DepuNr-m.d.ts} +1 -1
  293. package/dist/policy-runtime.d.ts +1 -1
  294. package/dist/proactive-contention.d.ts +1 -1
  295. package/dist/provenance.d.ts +1 -1
  296. package/dist/{qmd-q9tg4dHp.d.ts → qmd-Dalr3Jby.d.ts} +1 -1
  297. package/dist/qmd-preflight.d.ts +2 -2
  298. package/dist/qmd-recall-cache.d.ts +1 -1
  299. package/dist/qmd.d.ts +2 -2
  300. package/dist/qmd.js +4 -4
  301. package/dist/recall-concurrency-config.d.ts +1 -1
  302. package/dist/recall-disclosure-escalation.d.ts +1 -1
  303. package/dist/recall-explain-renderer.d.ts +1 -1
  304. package/dist/recall-explain-renderer.js +3 -3
  305. package/dist/recall-memory-map.d.ts +1 -1
  306. package/dist/recall-planner-llm.d.ts +1 -1
  307. package/dist/recall-state.d.ts +1 -1
  308. package/dist/recall-tag-filter.d.ts +1 -1
  309. package/dist/recall-timings.d.ts +1 -1
  310. package/dist/recall-xray-cli.d.ts +1 -1
  311. package/dist/recall-xray-cli.js +4 -4
  312. package/dist/recall-xray-renderer.d.ts +1 -1
  313. package/dist/recall-xray-renderer.js +3 -3
  314. package/dist/recall-xray.d.ts +1 -1
  315. package/dist/recall-xray.js +2 -2
  316. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  317. package/dist/replay/normalizers/claude.d.ts +1 -1
  318. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  319. package/dist/replay/normalizers/shared.d.ts +1 -1
  320. package/dist/replay/runner.d.ts +1 -1
  321. package/dist/replay/types.d.ts +1 -1
  322. package/dist/replica-divergence.d.ts +1 -1
  323. package/dist/replica-divergence.js +2 -2
  324. package/dist/replica-peers-config.d.ts +1 -1
  325. package/dist/resolve-auth-token.d.ts +1 -1
  326. package/dist/resume-bundles.js +1 -1
  327. package/dist/retrieval-agents.d.ts +2 -2
  328. package/dist/retrieval-tiers.d.ts +1 -1
  329. package/dist/routing/engine.d.ts +1 -1
  330. package/dist/routing/store.d.ts +1 -1
  331. package/dist/salvage-envelope.d.ts +1 -1
  332. package/dist/{scope-profiles-CWDyglPM.d.ts → scope-profiles-BpiM5hTU.d.ts} +1 -1
  333. package/dist/search/embed-helper.d.ts +1 -1
  334. package/dist/search/factory.d.ts +1 -1
  335. package/dist/search/factory.js +8 -8
  336. package/dist/search/index.d.ts +1 -1
  337. package/dist/search/index.js +12 -12
  338. package/dist/search/lancedb-backend.d.ts +1 -1
  339. package/dist/search/meilisearch-backend.d.ts +1 -1
  340. package/dist/search/noop-backend.d.ts +1 -1
  341. package/dist/search/orama-backend.d.ts +1 -1
  342. package/dist/search/port.d.ts +1 -1
  343. package/dist/search/remote-backend.d.ts +1 -1
  344. package/dist/{semantic-consolidation-BUE3deLn.d.ts → semantic-consolidation-CMtVrf9f.d.ts} +1 -1
  345. package/dist/semantic-consolidation.d.ts +2 -2
  346. package/dist/semantic-consolidation.js +16 -16
  347. package/dist/semantic-rule-promotion.js +14 -14
  348. package/dist/semantic-rule-verifier.d.ts +1 -1
  349. package/dist/semantic-rule-verifier.js +14 -14
  350. package/dist/{service-CXgM0bQG.d.ts → service-DuAxwSgg.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/shared-context/manager.d.ts +1 -1
  354. package/dist/signal.d.ts +1 -1
  355. package/dist/{storage-DysJq-XH.d.ts → storage-CF0Ih8GP.d.ts} +1 -1
  356. package/dist/storage.d.ts +2 -2
  357. package/dist/storage.js +13 -13
  358. package/dist/summarizer.d.ts +1 -1
  359. package/dist/summarizer.js +3 -2
  360. package/dist/summary-snapshot.d.ts +1 -1
  361. package/dist/temporal-supersession.d.ts +2 -2
  362. package/dist/temporal-timeline-recall.d.ts +1 -1
  363. package/dist/temporal-validity.d.ts +1 -1
  364. package/dist/threading.d.ts +1 -1
  365. package/dist/tier-migration.d.ts +2 -2
  366. package/dist/tier-routing.d.ts +1 -1
  367. package/dist/tokens.js +2 -2
  368. package/dist/topics.d.ts +1 -1
  369. package/dist/transcript.d.ts +1 -1
  370. package/dist/transfer/backup.js +2 -2
  371. package/dist/transfer/capsule-export.js +2 -2
  372. package/dist/transfer/capsule-import.js +5 -5
  373. package/dist/trust-score-stage.d.ts +1 -1
  374. package/dist/trust-score.d.ts +1 -1
  375. package/dist/{types-aPPzhnjT.d.ts → types-BpaYvJ6v.d.ts} +22 -2
  376. package/dist/types.d.ts +1 -1
  377. package/dist/types.js +1 -1
  378. package/dist/utility-runtime.d.ts +1 -1
  379. package/dist/verified-recall.js +14 -14
  380. package/dist/write-envelope.d.ts +1 -1
  381. package/package.json +2 -2
  382. package/src/access-boundary.ts +3 -0
  383. package/src/access-cli.test.ts +93 -0
  384. package/src/access-cli.ts +56 -2
  385. package/src/access-extraction-force-flush.ts +177 -0
  386. package/src/access-http-extraction-force-flush.test.ts +132 -0
  387. package/src/access-http-lcm-compaction.ts +99 -22
  388. package/src/access-http-lifecycle-flush.ts +81 -0
  389. package/src/access-http.test.ts +227 -0
  390. package/src/access-http.ts +33 -40
  391. package/src/access-mcp-output-schemas.ts +6 -0
  392. package/src/access-mcp.test.ts +40 -0
  393. package/src/access-mcp.ts +32 -1
  394. package/src/access-observe-helpers.ts +180 -0
  395. package/src/access-observe-write-surface.ts +78 -19
  396. package/src/access-operations-batch.ts +2 -1
  397. package/src/access-schema-pi.test.ts +17 -0
  398. package/src/access-schema.ts +28 -11
  399. package/src/access-service-helpers.ts +46 -0
  400. package/src/access-service-observe-lcm-parity.test.ts +781 -31
  401. package/src/access-service-observe-scope.test.ts +88 -0
  402. package/src/access-service.ts +46 -128
  403. package/src/access-surface-catalog.test.ts +32 -0
  404. package/src/access-surface-catalog.ts +2 -0
  405. package/src/buffer-session.test.ts +148 -0
  406. package/src/buffer-turn-helpers.ts +152 -0
  407. package/src/buffer.ts +126 -201
  408. package/src/correction/correction-access-wiring.ts +79 -27
  409. package/src/correction/correction-executor.test.ts +542 -1
  410. package/src/correction/correction-executor.ts +309 -89
  411. package/src/correction/correction-planner.test.ts +35 -1
  412. package/src/correction/correction-planner.ts +50 -3
  413. package/src/correction/correction-service.ts +12 -7
  414. package/src/correction/correction-storage-integration.test.ts +172 -1
  415. package/src/correction/passive-capture.test.ts +35 -0
  416. package/src/correction/passive-capture.ts +17 -3
  417. package/src/extraction-source-grounding.ts +55 -1
  418. package/src/extraction-timeout.test.ts +51 -0
  419. package/src/extraction.ts +64 -90
  420. package/src/local-llm-headers-timeout.test.ts +48 -0
  421. package/src/local-llm-helpers.ts +58 -0
  422. package/src/local-llm.ts +62 -58
  423. package/src/orchestration/extraction-run-helpers.ts +309 -0
  424. package/src/orchestration/extraction-run.test.ts +350 -7
  425. package/src/orchestration/extraction-run.ts +327 -250
  426. package/src/orchestration/recall-internal-deps.ts +385 -0
  427. package/src/orchestration/recall-internal.ts +16 -375
  428. package/src/orchestration/session-context.ts +193 -18
  429. package/src/orchestration/turn-ingestion.ts +61 -11
  430. package/src/orchestrator-flush.test.ts +511 -5
  431. package/src/orchestrator.ts +8 -6
  432. package/src/types.ts +2 -2
  433. package/dist/chunk-4A6YGWQN.js.map +0 -1
  434. package/dist/chunk-4WKA6I65.js.map +0 -1
  435. package/dist/chunk-4Z4XNEWZ.js.map +0 -1
  436. package/dist/chunk-6FUPCJUL.js.map +0 -1
  437. package/dist/chunk-B6JDYXL7.js.map +0 -1
  438. package/dist/chunk-GBJ4RDFR.js.map +0 -1
  439. package/dist/chunk-HUHX2OCX.js.map +0 -1
  440. package/dist/chunk-IYZ5K7MU.js.map +0 -1
  441. package/dist/chunk-LGHKJABJ.js.map +0 -1
  442. package/dist/chunk-PHWUFPCO.js.map +0 -1
  443. package/dist/chunk-PUS63Q3G.js.map +0 -1
  444. package/dist/chunk-RPW2NOU6.js.map +0 -1
  445. package/dist/chunk-SPJXKAVF.js.map +0 -1
  446. package/dist/chunk-YTSNAUXN.js.map +0 -1
  447. /package/dist/{capsule-crypto-GWVG7LGC.js.map → access-extraction-force-flush.js.map} +0 -0
  448. /package/dist/{capsule-merge-5KKJQBWQ.js.map → capsule-merge-2H2IUTBT.js.map} +0 -0
  449. /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
  450. /package/dist/{chunk-GIBMDSJ2.js.map → chunk-27P5YVDU.js.map} +0 -0
  451. /package/dist/{chunk-2SA56WMI.js.map → chunk-2LTDWSR6.js.map} +0 -0
  452. /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
  453. /package/dist/{chunk-6U7F52DE.js.map → chunk-4XHR3I67.js.map} +0 -0
  454. /package/dist/{chunk-2EUVEDF5.js.map → chunk-5XA7PQ5I.js.map} +0 -0
  455. /package/dist/{chunk-ALSGMEJR.js.map → chunk-65ZPVYTA.js.map} +0 -0
  456. /package/dist/{chunk-5VQJBH2G.js.map → chunk-6TAUHL33.js.map} +0 -0
  457. /package/dist/{chunk-RGIWINDN.js.map → chunk-7G5MH4NT.js.map} +0 -0
  458. /package/dist/{chunk-WVO4G37W.js.map → chunk-7TEZUUGM.js.map} +0 -0
  459. /package/dist/{chunk-MJCGLM25.js.map → chunk-7VUAG236.js.map} +0 -0
  460. /package/dist/{chunk-M3C2V3PV.js.map → chunk-AJEMDQNA.js.map} +0 -0
  461. /package/dist/{chunk-RKNJBZ55.js.map → chunk-AU7Q3LSC.js.map} +0 -0
  462. /package/dist/{chunk-ACXPX4AG.js.map → chunk-BR2K43MK.js.map} +0 -0
  463. /package/dist/{chunk-CZRYLSSW.js.map → chunk-BUGVGH4N.js.map} +0 -0
  464. /package/dist/{chunk-YTQNQ4KB.js.map → chunk-C4VQMFVM.js.map} +0 -0
  465. /package/dist/{chunk-ZPSVBSOF.js.map → chunk-CIVDJD6P.js.map} +0 -0
  466. /package/dist/{chunk-K5GB36ME.js.map → chunk-CZDOT5I2.js.map} +0 -0
  467. /package/dist/{chunk-VI2JQPNQ.js.map → chunk-E4PWACUN.js.map} +0 -0
  468. /package/dist/{chunk-D2ANTDGO.js.map → chunk-E6BMSH7U.js.map} +0 -0
  469. /package/dist/{chunk-P5PXWTW7.js.map → chunk-EJCAV3QZ.js.map} +0 -0
  470. /package/dist/{chunk-CKMO4RDY.js.map → chunk-EMDLM3LW.js.map} +0 -0
  471. /package/dist/{chunk-G5R3D5UP.js.map → chunk-GTTAHHD3.js.map} +0 -0
  472. /package/dist/{chunk-H5CPS5JP.js.map → chunk-H36LJIPD.js.map} +0 -0
  473. /package/dist/{chunk-AITCS2RC.js.map → chunk-IJ7HK452.js.map} +0 -0
  474. /package/dist/{chunk-D3LMYTBV.js.map → chunk-J7WZUL2K.js.map} +0 -0
  475. /package/dist/{chunk-5W4ZLBEZ.js.map → chunk-JCFTIQBR.js.map} +0 -0
  476. /package/dist/{chunk-XOZ4ALGB.js.map → chunk-KE353EWI.js.map} +0 -0
  477. /package/dist/{chunk-W5EG6LE3.js.map → chunk-KIT6M7EB.js.map} +0 -0
  478. /package/dist/{chunk-5W7CTZ2E.js.map → chunk-KQAFEZQX.js.map} +0 -0
  479. /package/dist/{chunk-Z54EM5YZ.js.map → chunk-MAXVH44E.js.map} +0 -0
  480. /package/dist/{chunk-WZFAPHIK.js.map → chunk-MU7ZHSZE.js.map} +0 -0
  481. /package/dist/{chunk-66772WBP.js.map → chunk-NFXQJHJD.js.map} +0 -0
  482. /package/dist/{chunk-AZ5BTEKX.js.map → chunk-NQUF7XKR.js.map} +0 -0
  483. /package/dist/{chunk-W4FBGYGK.js.map → chunk-NRV4Y3PM.js.map} +0 -0
  484. /package/dist/{chunk-NHWB6HG2.js.map → chunk-NYCGIQRA.js.map} +0 -0
  485. /package/dist/{chunk-QJAQNXWI.js.map → chunk-ONHRRJZM.js.map} +0 -0
  486. /package/dist/{chunk-FDAMS4PK.js.map → chunk-PNPOWBGC.js.map} +0 -0
  487. /package/dist/{chunk-IC6CBHCA.js.map → chunk-QGENAYVS.js.map} +0 -0
  488. /package/dist/{chunk-62U4J2GN.js.map → chunk-UR77VKF7.js.map} +0 -0
  489. /package/dist/{chunk-JCBWCYEJ.js.map → chunk-VANLTS5F.js.map} +0 -0
  490. /package/dist/{chunk-RMMVQQA6.js.map → chunk-WDISJRMG.js.map} +0 -0
  491. /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
  492. /package/dist/{chunk-TH2LSRMG.js.map → chunk-XHDIB4T4.js.map} +0 -0
  493. /package/dist/{chunk-CVILPI77.js.map → chunk-XOQSEF7X.js.map} +0 -0
  494. /package/dist/{chunk-LBOD4U5B.js.map → chunk-YFOMN2II.js.map} +0 -0
  495. /package/dist/{chunk-I5NLEENJ.js.map → chunk-Z4SWV4VW.js.map} +0 -0
@@ -0,0 +1,152 @@
1
+ import type { BufferEntryState, BufferTurn } from "./types.js";
2
+
3
+ export interface BufferTurnOwner {
4
+ /**
5
+ * Server-resolved principal that owns this session at the authenticated
6
+ * observe/write boundary. Persisted with the buffered turn so lifecycle
7
+ * flushes do not have to infer ownership from a client-chosen session key.
8
+ */
9
+ sessionOwnerPrincipal?: string;
10
+ }
11
+
12
+ export function describeError(err: unknown): string {
13
+ if (err instanceof Error) return err.message;
14
+ if (err === null) return "null";
15
+ if (err === undefined) return "undefined";
16
+ if (typeof err === "string") return err;
17
+ try {
18
+ return JSON.stringify(err);
19
+ } catch {
20
+ return String(err);
21
+ }
22
+ }
23
+
24
+ export function copyBufferTurn(turn: BufferTurn): BufferTurn {
25
+ const copy: BufferTurn = {
26
+ role: turn.role,
27
+ content: turn.content,
28
+ timestamp: turn.timestamp,
29
+ };
30
+ if (typeof turn.sessionKey === "string") copy.sessionKey = turn.sessionKey;
31
+ if (typeof turn.logicalSessionKey === "string") {
32
+ copy.logicalSessionKey = turn.logicalSessionKey;
33
+ }
34
+ if (turn.providerThreadId === null || typeof turn.providerThreadId === "string") {
35
+ copy.providerThreadId = turn.providerThreadId;
36
+ }
37
+ if (typeof turn.sessionOwnerPrincipal === "string") {
38
+ copy.sessionOwnerPrincipal = turn.sessionOwnerPrincipal;
39
+ }
40
+ if (typeof turn.turnFingerprint === "string") {
41
+ copy.turnFingerprint = turn.turnFingerprint;
42
+ }
43
+ if (typeof turn.persistProcessedFingerprint === "boolean") {
44
+ copy.persistProcessedFingerprint = turn.persistProcessedFingerprint;
45
+ }
46
+ if (typeof turn.sourceConnector === "string") {
47
+ copy.sourceConnector = turn.sourceConnector;
48
+ }
49
+ return copy;
50
+ }
51
+
52
+ export function bufferTurnsEqual(left: BufferTurn | undefined, right: BufferTurn): boolean {
53
+ if (!left) return false;
54
+ return (
55
+ left.role === right.role &&
56
+ left.content === right.content &&
57
+ left.timestamp === right.timestamp &&
58
+ left.sessionKey === right.sessionKey &&
59
+ left.sessionOwnerPrincipal === right.sessionOwnerPrincipal &&
60
+ left.logicalSessionKey === right.logicalSessionKey &&
61
+ left.providerThreadId === right.providerThreadId &&
62
+ left.turnFingerprint === right.turnFingerprint &&
63
+ left.persistProcessedFingerprint === right.persistProcessedFingerprint &&
64
+ left.sourceConnector === right.sourceConnector
65
+ );
66
+ }
67
+
68
+ export function bufferTurnArraysEqual(
69
+ left: readonly BufferTurn[],
70
+ right: readonly BufferTurn[],
71
+ ): boolean {
72
+ return left.length === right.length && left.every((turn, index) => bufferTurnsEqual(turn, right[index]));
73
+ }
74
+
75
+ export function bufferTurnArrayIsSuffixOfSnapshot(
76
+ liveTurns: readonly BufferTurn[],
77
+ snapshot: readonly BufferTurn[],
78
+ ): boolean {
79
+ if (liveTurns.length === 0 || liveTurns.length > snapshot.length) {
80
+ return false;
81
+ }
82
+ const offset = snapshot.length - liveTurns.length;
83
+ return liveTurns.every((turn, index) => bufferTurnsEqual(turn, snapshot[offset + index]));
84
+ }
85
+
86
+ export function liveTurnsFromExtractionSnapshot(
87
+ entry: BufferEntryState,
88
+ extractedTurns: readonly BufferTurn[],
89
+ ): readonly BufferTurn[] {
90
+ const retainedTurns = entry.retainedTurns ?? [];
91
+ if (
92
+ retainedTurns.length > 0 &&
93
+ extractedTurns.length >= retainedTurns.length &&
94
+ retainedTurns.every((turn, index) => bufferTurnsEqual(extractedTurns[index], turn))
95
+ ) {
96
+ const withoutRetainedPrefix = extractedTurns.slice(retainedTurns.length);
97
+ if (withoutRetainedPrefix.length > 0 && matchingPrefixLength(entry.turns, withoutRetainedPrefix) > 0) {
98
+ return withoutRetainedPrefix;
99
+ }
100
+ }
101
+ return extractedTurns;
102
+ }
103
+
104
+ function matchingPrefixLength(
105
+ liveTurns: readonly BufferTurn[],
106
+ extractedTurns: readonly BufferTurn[],
107
+ ): number {
108
+ let index = 0;
109
+ while (
110
+ index < liveTurns.length &&
111
+ index < extractedTurns.length &&
112
+ bufferTurnsEqual(liveTurns[index], extractedTurns[index])
113
+ ) {
114
+ index += 1;
115
+ }
116
+ return index;
117
+ }
118
+
119
+ export function matchingQueuedExtractionPrefixLength(
120
+ liveTurns: readonly BufferTurn[],
121
+ extractedTurns: readonly BufferTurn[],
122
+ ): number {
123
+ let bestMatchedCount = 0;
124
+ for (let start = 0; start < extractedTurns.length; start += 1) {
125
+ const matchedCount = matchingPrefixLength(liveTurns, extractedTurns.slice(start));
126
+ if (matchedCount > bestMatchedCount) {
127
+ bestMatchedCount = matchedCount;
128
+ if (bestMatchedCount === liveTurns.length) break;
129
+ }
130
+ }
131
+ return bestMatchedCount;
132
+ }
133
+
134
+ export class ProbeTimeoutError extends Error {
135
+ constructor(timeoutMs: number) {
136
+ super(`probe exceeded ${timeoutMs}ms`);
137
+ this.name = "ProbeTimeoutError";
138
+ }
139
+ }
140
+
141
+ export function probeWithTimeout<T>(inflight: Promise<T>, timeoutMs: number): Promise<T> {
142
+ let timer: NodeJS.Timeout | null = null;
143
+ const timeout = new Promise<T>((_, reject) => {
144
+ timer = setTimeout(() => reject(new ProbeTimeoutError(timeoutMs)), timeoutMs);
145
+ if (typeof (timer as NodeJS.Timeout).unref === "function") {
146
+ (timer as NodeJS.Timeout).unref();
147
+ }
148
+ });
149
+ return Promise.race([inflight, timeout]).finally(() => {
150
+ if (timer) clearTimeout(timer);
151
+ });
152
+ }
package/src/buffer.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { log } from "./logger.js";
2
+ import { throwIfAborted } from "./abort-error.js";
2
3
  import { scanSignals } from "./signal.js";
3
4
  import type { StorageManager } from "./storage.js";
4
5
  import type {
@@ -10,7 +11,19 @@ import type {
10
11
  SignalLevel,
11
12
  } from "./types.js";
12
13
  import { resolvePresentationCapabilities } from "./capabilities.js";
14
+ import { resolvePrincipal } from "./namespaces/principal.js";
15
+ import { ExtractionDeadlineError } from "./orchestration/extraction-run.js";
13
16
  import type { ExtractionBufferSnapshot } from "./extraction-liveness.js";
17
+ import {
18
+ bufferTurnArrayIsSuffixOfSnapshot,
19
+ bufferTurnArraysEqual,
20
+ bufferTurnsEqual,
21
+ copyBufferTurn,
22
+ describeError,
23
+ liveTurnsFromExtractionSnapshot,
24
+ matchingQueuedExtractionPrefixLength,
25
+ probeWithTimeout,
26
+ } from "./buffer-turn-helpers.js";
14
27
 
15
28
  export type TriggerDecision = "extract_now" | "extract_batch" | "keep_buffering";
16
29
 
@@ -19,6 +32,11 @@ export interface AddTurnOutcome {
19
32
  extractionTurns?: BufferTurn[];
20
33
  }
21
34
 
35
+ export interface RetainedTurnCleanupOptions {
36
+ abortSignal?: AbortSignal;
37
+ deadlineMs?: number;
38
+ }
39
+
22
40
  /**
23
41
  * Optional surprise probe injected into `SmartBuffer`.
24
42
  *
@@ -875,6 +893,9 @@ export class SmartBuffer {
875
893
  : new Date().toISOString(),
876
894
  };
877
895
  if (typeof t.sessionKey === "string") copy.sessionKey = t.sessionKey;
896
+ if (typeof t.sessionOwnerPrincipal === "string") {
897
+ copy.sessionOwnerPrincipal = t.sessionOwnerPrincipal;
898
+ }
878
899
  if (typeof t.logicalSessionKey === "string") {
879
900
  copy.logicalSessionKey = t.logicalSessionKey;
880
901
  }
@@ -898,6 +919,7 @@ export class SmartBuffer {
898
919
  });
899
920
  }
900
921
 
922
+
901
923
  /**
902
924
  * Return the current retention window (issue #562, PR 2). Primarily for
903
925
  * tests and diagnostics.
@@ -907,31 +929,92 @@ export class SmartBuffer {
907
929
  return entry?.retainedTurns ? [...entry.retainedTurns] : [];
908
930
  }
909
931
 
932
+ /**
933
+ * Clear deferred retention copies for a force-flushed session. Normal
934
+ * extraction preserves these copies so a deferred candidate can be retried;
935
+ * an explicit force flush is the caller's request to drain that context.
936
+ */
937
+ async clearRetainedTurnsForSession(
938
+ sessionKey: string,
939
+ ownerPrincipal?: string,
940
+ options: RetainedTurnCleanupOptions = {},
941
+ ): Promise<void> {
942
+ if (typeof sessionKey !== "string" || sessionKey.length === 0) return;
943
+ const normalizedOwnerPrincipal =
944
+ typeof ownerPrincipal === "string" && ownerPrincipal.trim().length > 0
945
+ ? ownerPrincipal.trim()
946
+ : undefined;
947
+ const assertLifecycle = (): void => {
948
+ throwIfAborted(options.abortSignal, "extraction force-flush aborted");
949
+ if (typeof options.deadlineMs === "number" && Date.now() >= options.deadlineMs) {
950
+ throw new ExtractionDeadlineError("retained_turn_cleanup");
951
+ }
952
+ };
953
+ assertLifecycle();
954
+ await this.enqueueMutation(async () => {
955
+ assertLifecycle();
956
+ const hadPendingSave = this.pendingSave;
957
+ if (this.saveTimer) {
958
+ clearTimeout(this.saveTimer);
959
+ this.saveTimer = null;
960
+ }
961
+ await this.loadUnlocked();
962
+ assertLifecycle();
963
+ const bufferKeys = this.matchingSessionBufferKeysUnlocked(sessionKey);
964
+ if (bufferKeys.length === 0) {
965
+ if (hadPendingSave) {
966
+ assertLifecycle();
967
+ await this.saveNowRetainingPendingOnFailure("clearRetainedTurnsForSession");
968
+ }
969
+ return;
970
+ }
971
+ let changed = false;
972
+ const belongsToOwner = (turn: BufferTurn): boolean => {
973
+ if (turn.sessionKey !== sessionKey) return false;
974
+ if (normalizedOwnerPrincipal === undefined) return true;
975
+ if (turn.sessionOwnerPrincipal === normalizedOwnerPrincipal) return true;
976
+ return (
977
+ turn.sessionOwnerPrincipal === undefined &&
978
+ resolvePrincipal(turn.sessionKey, this.config) === normalizedOwnerPrincipal
979
+ );
980
+ };
981
+ for (const bufferKey of bufferKeys) {
982
+ const entry = this.entryFor(bufferKey);
983
+ const retainedTurns = entry.retainedTurns ?? [];
984
+ const remainingTurns = retainedTurns.filter((turn) => !belongsToOwner(turn));
985
+ if (remainingTurns.length === retainedTurns.length) continue;
986
+ changed = true;
987
+ if (remainingTurns.length > 0) entry.retainedTurns = remainingTurns;
988
+ else delete entry.retainedTurns;
989
+ if (bufferKey === "default") this.state.turns = entry.turns;
990
+ }
991
+ if (changed || hadPendingSave) {
992
+ assertLifecycle();
993
+ await this.saveNowRetainingPendingOnFailure("clearRetainedTurnsForSession");
994
+ }
995
+ assertLifecycle();
996
+ });
997
+ }
998
+
910
999
  async findBufferKeyForSession(sessionKey: string): Promise<string | null> {
911
1000
  const bufferKeys = await this.findBufferKeysForSession(sessionKey);
912
1001
  return bufferKeys[0] ?? null;
913
1002
  }
914
1003
 
915
- async findBufferKeysForSession(sessionKey: string): Promise<string[]> {
916
- if (typeof sessionKey !== "string" || sessionKey.length === 0) return [];
917
- await this.mutationChain.catch(() => {});
918
- await this.load();
919
-
1004
+ private matchingSessionBufferKeysUnlocked(sessionKey: string): string[] {
920
1005
  const matches: string[] = [];
1006
+ const hasSessionTurns = (entry: BufferEntryState | null | undefined): boolean =>
1007
+ [...(entry?.turns ?? []), ...(entry?.retainedTurns ?? [])].some(
1008
+ (turn) => typeof turn.sessionKey === "string" && turn.sessionKey === sessionKey,
1009
+ );
921
1010
  const directEntry = this.peekEntry(sessionKey);
922
- if ((directEntry?.turns.length ?? 0) > 0) {
1011
+ if (hasSessionTurns(directEntry)) {
923
1012
  matches.push(sessionKey);
924
1013
  }
925
1014
 
926
1015
  const entries = this.state.entries ?? {};
927
1016
  for (const [bufferKey, entry] of Object.entries(entries)) {
928
- if (
929
- !matches.includes(bufferKey) &&
930
- entry.turns.some(
931
- (turn) =>
932
- typeof turn.sessionKey === "string" && turn.sessionKey === sessionKey,
933
- )
934
- ) {
1017
+ if (!matches.includes(bufferKey) && hasSessionTurns(entry)) {
935
1018
  matches.push(bufferKey);
936
1019
  }
937
1020
  }
@@ -939,9 +1022,17 @@ export class SmartBuffer {
939
1022
  return matches;
940
1023
  }
941
1024
 
1025
+ async findBufferKeysForSession(sessionKey: string): Promise<string[]> {
1026
+ if (typeof sessionKey !== "string" || sessionKey.length === 0) return [];
1027
+ await this.mutationChain.catch(() => {});
1028
+ await this.load();
1029
+ return this.matchingSessionBufferKeysUnlocked(sessionKey);
1030
+ }
1031
+
942
1032
  async clearAfterExtraction(
943
1033
  bufferKey = "default",
944
1034
  extractedTurns?: readonly BufferTurn[],
1035
+ options?: { allowNonPrefix?: boolean },
945
1036
  ): Promise<void> {
946
1037
  await this.enqueueMutation(async () => {
947
1038
  // Drop any armed debounce TIMER so it cannot fire mid-mutation and race
@@ -964,14 +1055,29 @@ export class SmartBuffer {
964
1055
  );
965
1056
  let clearedLiveTurns = false;
966
1057
  if (liveExtractedTurns.length > 0) {
967
- const matchedCount = matchingQueuedExtractionPrefixLength(
968
- entry.turns,
969
- liveExtractedTurns,
970
- );
971
- if (matchedCount > 0) {
972
- entry.turns = entry.turns.slice(matchedCount);
973
- clearedLiveTurns = true;
1058
+ if (options?.allowNonPrefix === true) {
1059
+ const remainingTurns = [...entry.turns];
1060
+ for (const extractedTurn of liveExtractedTurns) {
1061
+ const matchingIndex = remainingTurns.findIndex((liveTurn) =>
1062
+ bufferTurnsEqual(liveTurn, extractedTurn),
1063
+ );
1064
+ if (matchingIndex >= 0) {
1065
+ remainingTurns.splice(matchingIndex, 1);
1066
+ clearedLiveTurns = true;
1067
+ }
1068
+ }
1069
+ if (clearedLiveTurns) entry.turns = remainingTurns;
974
1070
  } else {
1071
+ const matchedCount = matchingQueuedExtractionPrefixLength(
1072
+ entry.turns,
1073
+ liveExtractedTurns,
1074
+ );
1075
+ if (matchedCount > 0) {
1076
+ entry.turns = entry.turns.slice(matchedCount);
1077
+ clearedLiveTurns = true;
1078
+ }
1079
+ }
1080
+ if (!clearedLiveTurns) {
975
1081
  log.debug(
976
1082
  `buffer[${bufferKey}]: extraction clear skipped because live turns changed before clear`,
977
1083
  );
@@ -1016,184 +1122,3 @@ export class SmartBuffer {
1016
1122
  await this.surpriseTelemetryWriteChain;
1017
1123
  }
1018
1124
  }
1019
-
1020
- /**
1021
- * Render an arbitrary thrown value as a short string for debug logging.
1022
- *
1023
- * JavaScript permits throwing *any* value (`throw null`,
1024
- * `Promise.reject("x")`, `throw { reason: "timeout" }`) — not just
1025
- * `Error` instances. The defensive catch blocks in `SmartBuffer` must
1026
- * never themselves throw while trying to log the failure, or they
1027
- * would defeat the whole point of isolating the surprise path from the
1028
- * core extraction decision.
1029
- */
1030
- function describeError(err: unknown): string {
1031
- if (err instanceof Error) return err.message;
1032
- if (err === null) return "null";
1033
- if (err === undefined) return "undefined";
1034
- if (typeof err === "string") return err;
1035
- try {
1036
- return JSON.stringify(err);
1037
- } catch {
1038
- return String(err);
1039
- }
1040
- }
1041
-
1042
- function copyBufferTurn(turn: BufferTurn): BufferTurn {
1043
- const copy: BufferTurn = {
1044
- role: turn.role,
1045
- content: turn.content,
1046
- timestamp: turn.timestamp,
1047
- };
1048
- if (typeof turn.sessionKey === "string") copy.sessionKey = turn.sessionKey;
1049
- if (typeof turn.logicalSessionKey === "string") {
1050
- copy.logicalSessionKey = turn.logicalSessionKey;
1051
- }
1052
- if (
1053
- turn.providerThreadId === null ||
1054
- typeof turn.providerThreadId === "string"
1055
- ) {
1056
- copy.providerThreadId = turn.providerThreadId;
1057
- }
1058
- if (typeof turn.turnFingerprint === "string") {
1059
- copy.turnFingerprint = turn.turnFingerprint;
1060
- }
1061
- if (typeof turn.persistProcessedFingerprint === "boolean") {
1062
- copy.persistProcessedFingerprint = turn.persistProcessedFingerprint;
1063
- }
1064
- if (typeof turn.sourceConnector === "string") {
1065
- copy.sourceConnector = turn.sourceConnector;
1066
- }
1067
- return copy;
1068
- }
1069
-
1070
- function bufferTurnsEqual(left: BufferTurn | undefined, right: BufferTurn): boolean {
1071
- if (!left) return false;
1072
- return (
1073
- left.role === right.role &&
1074
- left.content === right.content &&
1075
- left.timestamp === right.timestamp &&
1076
- left.sessionKey === right.sessionKey &&
1077
- left.logicalSessionKey === right.logicalSessionKey &&
1078
- left.providerThreadId === right.providerThreadId &&
1079
- left.turnFingerprint === right.turnFingerprint &&
1080
- left.persistProcessedFingerprint === right.persistProcessedFingerprint &&
1081
- left.sourceConnector === right.sourceConnector
1082
- );
1083
- }
1084
-
1085
- function bufferTurnArraysEqual(
1086
- left: readonly BufferTurn[],
1087
- right: readonly BufferTurn[],
1088
- ): boolean {
1089
- return (
1090
- left.length === right.length &&
1091
- left.every((turn, index) => bufferTurnsEqual(turn, right[index]))
1092
- );
1093
- }
1094
-
1095
- function bufferTurnArrayIsSuffixOfSnapshot(
1096
- liveTurns: readonly BufferTurn[],
1097
- snapshot: readonly BufferTurn[],
1098
- ): boolean {
1099
- if (liveTurns.length === 0 || liveTurns.length > snapshot.length) {
1100
- return false;
1101
- }
1102
- const offset = snapshot.length - liveTurns.length;
1103
- return liveTurns.every((turn, index) =>
1104
- bufferTurnsEqual(turn, snapshot[offset + index]),
1105
- );
1106
- }
1107
-
1108
- function liveTurnsFromExtractionSnapshot(
1109
- entry: BufferEntryState,
1110
- extractedTurns: readonly BufferTurn[],
1111
- ): readonly BufferTurn[] {
1112
- const retainedTurns = entry.retainedTurns ?? [];
1113
- if (
1114
- retainedTurns.length > 0 &&
1115
- extractedTurns.length >= retainedTurns.length &&
1116
- retainedTurns.every((turn, index) =>
1117
- bufferTurnsEqual(extractedTurns[index], turn),
1118
- )
1119
- ) {
1120
- const withoutRetainedPrefix = extractedTurns.slice(retainedTurns.length);
1121
- if (
1122
- withoutRetainedPrefix.length > 0 &&
1123
- matchingPrefixLength(entry.turns, withoutRetainedPrefix) > 0
1124
- ) {
1125
- return withoutRetainedPrefix;
1126
- }
1127
- }
1128
- return extractedTurns;
1129
- }
1130
-
1131
- function matchingPrefixLength(
1132
- liveTurns: readonly BufferTurn[],
1133
- extractedTurns: readonly BufferTurn[],
1134
- ): number {
1135
- let index = 0;
1136
- while (
1137
- index < liveTurns.length &&
1138
- index < extractedTurns.length &&
1139
- bufferTurnsEqual(liveTurns[index], extractedTurns[index])
1140
- ) {
1141
- index += 1;
1142
- }
1143
- return index;
1144
- }
1145
-
1146
- function matchingQueuedExtractionPrefixLength(
1147
- liveTurns: readonly BufferTurn[],
1148
- extractedTurns: readonly BufferTurn[],
1149
- ): number {
1150
- let bestMatchedCount = 0;
1151
- for (let start = 0; start < extractedTurns.length; start += 1) {
1152
- const matchedCount = matchingPrefixLength(
1153
- liveTurns,
1154
- extractedTurns.slice(start),
1155
- );
1156
- if (matchedCount > bestMatchedCount) {
1157
- bestMatchedCount = matchedCount;
1158
- if (bestMatchedCount === liveTurns.length) break;
1159
- }
1160
- }
1161
- return bestMatchedCount;
1162
- }
1163
-
1164
- /**
1165
- * Sentinel error class for the probe timeout path. Catching it via
1166
- * `instanceof` lets the buffer's surprise helper distinguish a timeout
1167
- * from a probe rejection (which could carry operational context the
1168
- * operator wants to see).
1169
- */
1170
- class ProbeTimeoutError extends Error {
1171
- constructor(timeoutMs: number) {
1172
- super(`probe exceeded ${timeoutMs}ms`);
1173
- this.name = "ProbeTimeoutError";
1174
- }
1175
- }
1176
-
1177
- /**
1178
- * Race `inflight` against a timeout clock. Resolves with `inflight`'s
1179
- * value if it settles first, otherwise rejects with `ProbeTimeoutError`.
1180
- * The timer is cleared in both branches so a fast-resolving probe does
1181
- * not leak a handle that would keep the Node event loop alive.
1182
- */
1183
- function probeWithTimeout<T>(
1184
- inflight: Promise<T>,
1185
- timeoutMs: number,
1186
- ): Promise<T> {
1187
- let timer: NodeJS.Timeout | null = null;
1188
- const timeout = new Promise<T>((_, reject) => {
1189
- timer = setTimeout(() => reject(new ProbeTimeoutError(timeoutMs)), timeoutMs);
1190
- // `.unref()` so the timer does not hold the event loop open if the
1191
- // caller decides the probe result is no longer interesting.
1192
- if (typeof (timer as NodeJS.Timeout).unref === "function") {
1193
- (timer as NodeJS.Timeout).unref();
1194
- }
1195
- });
1196
- return Promise.race([inflight, timeout]).finally(() => {
1197
- if (timer) clearTimeout(timer);
1198
- });
1199
- }