@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
@@ -11,6 +11,7 @@
11
11
  * Behavior-preserving move (late-binding selfDeps wiring, seams 18–27).
12
12
  */
13
13
 
14
+ import { abortError, throwIfAborted } from "../abort-error.js";
14
15
  import { SmartBuffer } from "../buffer.js";
15
16
  import { resolveNamespaceCapabilities } from "../capabilities.js";
16
17
  import { combineNamespaces, resolveCodingNamespaceOverlay } from "../coding/coding-namespace.js";
@@ -21,9 +22,11 @@ import { StorageManager } from "../index.js";
21
22
  import { LocalLlmClient } from "../local-llm.js";
22
23
  import { log } from "../logger.js";
23
24
  import { canWriteNamespace, defaultNamespaceForPrincipal, recallNamespacesForPrincipal, resolvePrincipal } from "../namespaces/principal.js";
25
+ import { ExtractionDeadlineError } from "./extraction-run.js";
24
26
  import type { ExtractionRunResult } from "./extraction-run.js";
25
27
  import type { EntitySynthesisCoordinator } from "./entity-synthesis-coordinator.js";
26
28
  import type { BufferTurn, CodingContext, DaySummaryResult, MemoryFile, PluginConfig } from "../types.js";
29
+ import type { ResolvedScopeProfilePlan } from "../namespaces/scope-profiles.js";
27
30
  import {
28
31
  Orchestrator,
29
32
  } from "../orchestrator.js";
@@ -48,10 +51,12 @@ export interface SessionContextDeps {
48
51
  options?: {
49
52
  skipDedupeCheck?: boolean;
50
53
  clearBufferAfterExtraction?: boolean;
54
+ clearMatchingTurns?: boolean;
51
55
  skipCharThreshold?: boolean;
52
56
  skipUserTurnThreshold?: boolean;
53
57
  extractionDeadlineMs?: number;
54
58
  failOnExtractionFailure?: boolean;
59
+ onDurableCommit?: () => void;
55
60
  forceExtractionAttempt?: boolean;
56
61
  onTaskSettled?: (
57
62
  error?: unknown,
@@ -73,6 +78,7 @@ export interface SessionContextDeps {
73
78
  * authenticated principal instead of `resolvePrincipal(sessionKey)`.
74
79
  */
75
80
  principalOverride?: string;
81
+ scopeProfileWritePlan?: ResolvedScopeProfilePlan | null;
76
82
  },
77
83
  ): Promise<void>;
78
84
  resolvePrincipal(sessionKey?: string): string | undefined;
@@ -82,6 +88,89 @@ export interface SessionContextDeps {
82
88
  readonly orchestratorSelf: Orchestrator;
83
89
  }
84
90
 
91
+
92
+ export interface SessionFlushOptions {
93
+ reason: string;
94
+ abortSignal?: AbortSignal;
95
+ bufferKey?: string;
96
+ clearMatchingTurns?: boolean;
97
+ extractionDeadlineMs?: number;
98
+ writeNamespaceOverride?: string;
99
+ /** Called at the first durable extraction commit in this flush. */
100
+ onCommitted?: () => void;
101
+ failOnExtractionFailure?: boolean;
102
+ /** Resolved profile plan from access scope resolution; avoids recomputing from shared session context. */
103
+ scopeProfileWritePlan?: ResolvedScopeProfilePlan | null;
104
+ principalOverride?: string;
105
+ }
106
+
107
+ /** Scoped flushes must never claim an opaque buffer without trusted ingestion ownership. */
108
+ export class SessionOwnershipError extends Error {
109
+ constructor(message: string) {
110
+ super(message);
111
+ this.name = "SessionOwnershipError";
112
+ }
113
+ }
114
+
115
+ const MAX_SET_TIMEOUT_MS = 2_147_483_647;
116
+
117
+ export async function awaitSessionFlushPhase<T>(
118
+ task: () => Promise<T>,
119
+ options: Pick<SessionFlushOptions, "abortSignal" | "extractionDeadlineMs" | "reason"> & {
120
+ deadlineStage?: string;
121
+ onDeadline?: () => void;
122
+ },
123
+ ): Promise<T> {
124
+ const abortMessage =
125
+ options.reason === "access_force_flush" ? "extraction force-flush aborted" : "session flush aborted";
126
+ throwIfAborted(options.abortSignal, abortMessage);
127
+ const deadline = options.extractionDeadlineMs;
128
+ if (typeof deadline === "number" && Date.now() >= deadline) {
129
+ options.onDeadline?.();
130
+ throw new ExtractionDeadlineError(options.deadlineStage ?? "before_buffer_flush");
131
+ }
132
+
133
+ const taskPromise = Promise.resolve().then(task);
134
+ if (!options.abortSignal && typeof deadline !== "number") return taskPromise;
135
+
136
+ let abortHandler: (() => void) | undefined;
137
+ let deadlineTimer: ReturnType<typeof setTimeout> | undefined;
138
+ const abortPromise =
139
+ options.abortSignal === undefined
140
+ ? undefined
141
+ : new Promise<T>((_resolve, reject) => {
142
+ abortHandler = () => reject(abortError(abortMessage));
143
+ options.abortSignal?.addEventListener("abort", abortHandler, { once: true });
144
+ });
145
+ const deadlinePromise =
146
+ typeof deadline !== "number"
147
+ ? undefined
148
+ : new Promise<T>((_resolve, reject) => {
149
+ const schedule = (): void => {
150
+ const remainingMs = deadline - Date.now();
151
+ if (remainingMs <= 0) {
152
+ options.onDeadline?.();
153
+ reject(new ExtractionDeadlineError(options.deadlineStage ?? "before_buffer_flush"));
154
+ return;
155
+ }
156
+ deadlineTimer = setTimeout(schedule, Math.min(remainingMs, MAX_SET_TIMEOUT_MS));
157
+ deadlineTimer.unref?.();
158
+ };
159
+ schedule();
160
+ });
161
+ const races: Promise<T>[] = [taskPromise];
162
+ if (abortPromise) races.push(abortPromise);
163
+ if (deadlinePromise) races.push(deadlinePromise);
164
+ try {
165
+ return await Promise.race(races);
166
+ } finally {
167
+ if (abortHandler && options.abortSignal) {
168
+ options.abortSignal.removeEventListener("abort", abortHandler);
169
+ }
170
+ if (deadlineTimer) clearTimeout(deadlineTimer);
171
+ }
172
+ }
173
+
85
174
  export class SessionContextCoordinator {
86
175
  constructor(
87
176
  private readonly deps: SessionContextDeps,
@@ -316,11 +405,7 @@ export class SessionContextCoordinator {
316
405
 
317
406
  async flushSession(
318
407
  sessionKey: string,
319
- options: {
320
- reason: string;
321
- abortSignal?: AbortSignal;
322
- bufferKey?: string;
323
- },
408
+ options: SessionFlushOptions,
324
409
  ): Promise<void> {
325
410
  // Force any pending debounced buffer save to land durably BEFORE we read
326
411
  // and (via clearBufferAfterExtraction below) clear turns (issue #1909, PR
@@ -334,14 +419,20 @@ export class SessionContextCoordinator {
334
419
  // extraction leaves them on disk for re-extraction on next startup.
335
420
  // Durability-preserving AND fail-closed: pass throwOnFailure so a failed
336
421
  // durable save stops this lifecycle drain BEFORE any extraction runs
337
- // (issue #1909, PR #2016). flushPendingSave still retains the pending state
338
- // and re-arms a background retry on write failure, but it now rethrows so
339
- // flushSession rejects instead of clearing turns behind a non-durable save.
340
- // Without this, a force-drain could queue extraction with
341
- // clearBufferAfterExtraction on turns that never reached disk; if extraction
342
- // then failed and the host exited, the turn was lost.
422
+ // flushPendingSave retains pending state and re-arms a retry on failure.
343
423
  if (typeof this.deps.buffer.flushPendingSave === "function") {
344
- await this.deps.buffer.flushPendingSave({ throwOnFailure: true });
424
+ await awaitSessionFlushPhase(
425
+ () => this.deps.buffer.flushPendingSave!({ throwOnFailure: true }),
426
+ options,
427
+ );
428
+ } else {
429
+ throwIfAborted(
430
+ options.abortSignal,
431
+ options.reason === "access_force_flush" ? "extraction force-flush aborted" : "session flush aborted",
432
+ );
433
+ if (typeof options.extractionDeadlineMs === "number" && Date.now() >= options.extractionDeadlineMs) {
434
+ throw new ExtractionDeadlineError("before_buffer_flush");
435
+ }
345
436
  }
346
437
  const explicitBufferKey =
347
438
  typeof options.bufferKey === "string" && options.bufferKey.length > 0
@@ -353,7 +444,10 @@ export class SessionContextCoordinator {
353
444
  sessionKey.length === 0 ||
354
445
  typeof this.deps.buffer.findBufferKeysForSession !== "function"
355
446
  ? []
356
- : await this.deps.buffer.findBufferKeysForSession(sessionKey);
447
+ : await awaitSessionFlushPhase(
448
+ () => this.deps.buffer.findBufferKeysForSession!(sessionKey),
449
+ options,
450
+ );
357
451
  const bufferKeys = explicitBufferKey
358
452
  ? [explicitBufferKey]
359
453
  : discoveredBufferKeys.length > 0
@@ -361,20 +455,101 @@ export class SessionContextCoordinator {
361
455
  : typeof sessionKey === "string" && sessionKey.length > 0
362
456
  ? [sessionKey]
363
457
  : ["default"];
458
+ const namespacesEnabled =
459
+ this.deps.config === undefined ||
460
+ resolveNamespaceCapabilities(this.deps.config).namespaces === true;
461
+ const scopedRequest =
462
+ typeof options.writeNamespaceOverride === "string" ||
463
+ typeof options.principalOverride === "string";
464
+ const ownershipEnforced = namespacesEnabled && scopedRequest;
465
+ const ownerPrincipal =
466
+ typeof options.principalOverride === "string" && options.principalOverride.trim().length > 0
467
+ ? options.principalOverride.trim()
468
+ : undefined;
469
+ const resolvedSessionPrincipal =
470
+ ownershipEnforced && ownerPrincipal !== undefined && this.deps.config
471
+ ? resolvePrincipal(sessionKey, this.deps.config)
472
+ : undefined;
473
+ const opaqueScopedSession =
474
+ ownershipEnforced &&
475
+ ownerPrincipal !== undefined &&
476
+ (resolvedSessionPrincipal === undefined || resolvedSessionPrincipal === "default");
477
+ const belongsToSession = (turn: BufferTurn): boolean => {
478
+ if (turn.sessionKey !== sessionKey) return false;
479
+ if (!ownershipEnforced || ownerPrincipal === undefined) return true;
480
+ if (turn.sessionOwnerPrincipal === ownerPrincipal) return true;
481
+ return (
482
+ turn.sessionOwnerPrincipal === undefined &&
483
+ this.deps.config !== undefined &&
484
+ resolvePrincipal(turn.sessionKey, this.deps.config) === ownerPrincipal
485
+ );
486
+ };
487
+ if (
488
+ opaqueScopedSession &&
489
+ bufferKeys.some((bufferKey) =>
490
+ this.deps.buffer
491
+ .getTurns(bufferKey)
492
+ .some((turn) => turn.sessionKey === sessionKey && turn.sessionOwnerPrincipal === undefined),
493
+ )
494
+ ) {
495
+ throw new SessionOwnershipError(
496
+ `session ${sessionKey} has buffered turns without trusted ownership`,
497
+ );
498
+ }
364
499
  for (const bufferKey of bufferKeys) {
365
500
  const turns = this.deps.buffer.getTurns(bufferKey);
366
- if (turns.length === 0) continue;
367
- await new Promise<void>((resolve, reject) => {
368
- void this.deps.queueBufferedExtraction(turns, "trigger_mode", {
501
+ const turnsForSession = scopedRequest ? turns.filter(belongsToSession) : turns;
502
+ if (turnsForSession.length === 0) continue;
503
+ const retainedTurnsForOtherSessions =
504
+ scopedRequest && typeof this.deps.buffer.getRetainedDeferredTurns === "function"
505
+ ? this.deps.buffer
506
+ .getRetainedDeferredTurns(bufferKey)
507
+ .filter((turn) => !belongsToSession(turn))
508
+ : [];
509
+ try {
510
+ await new Promise<void>((resolve, reject) => {
511
+ void this.deps.queueBufferedExtraction(turnsForSession, "trigger_mode", {
369
512
  bufferKey,
370
513
  clearBufferAfterExtraction: true,
371
514
  skipDedupeCheck: true,
515
+ skipCharThreshold: true,
516
+ skipUserTurnThreshold: true,
517
+ failOnExtractionFailure: options.failOnExtractionFailure === true,
372
518
  forceExtractionAttempt: true,
373
519
  abortSignal: options.abortSignal,
520
+ extractionDeadlineMs: options.extractionDeadlineMs,
521
+ writeNamespaceOverride: options.writeNamespaceOverride,
522
+ principalOverride: options.principalOverride,
523
+ scopeProfileWritePlan: options.scopeProfileWritePlan,
524
+ clearMatchingTurns: options.clearMatchingTurns ?? scopedRequest,
525
+ onDurableCommit: options.onCommitted,
374
526
  onTaskSettled: (error) => (error ? reject(error) : resolve()),
375
527
  })
376
- .catch(reject);
377
- });
528
+ .catch(reject);
529
+ });
530
+ } finally {
531
+ if (
532
+ retainedTurnsForOtherSessions.length > 0 &&
533
+ typeof this.deps.buffer.retainDeferredTurns === "function"
534
+ ) {
535
+ const retainedAfterExtraction = this.deps.buffer.getRetainedDeferredTurns(bufferKey);
536
+ await this.deps.buffer
537
+ .retainDeferredTurns(
538
+ bufferKey,
539
+ [
540
+ ...retainedAfterExtraction.filter((turn) => belongsToSession(turn)),
541
+ ...retainedTurnsForOtherSessions,
542
+ ],
543
+ 10,
544
+ )
545
+ .catch((error: unknown) => {
546
+ log.warn(
547
+ `session flush could not restore retained turns for other sessions in ${bufferKey}`,
548
+ error,
549
+ );
550
+ });
551
+ }
552
+ }
378
553
  }
379
554
  }
380
555
 
@@ -17,6 +17,7 @@
17
17
  */
18
18
 
19
19
  import { createHash, randomBytes } from "node:crypto";
20
+ import { abortError } from "../abort-error.js";
20
21
  import { SmartBuffer } from "../buffer.js";
21
22
  import type { ImportTurn } from "../bulk-import/types.js";
22
23
  import { resolvePipelineProcessingCapabilities, resolveRecallAuxiliaryCapabilities } from "../capabilities.js";
@@ -28,13 +29,18 @@ import { StorageManager } from "../index.js";
28
29
  import { LcmEngine } from "../lcm/index.js";
29
30
  import { log } from "../logger.js";
30
31
  import { ExtractionQueueCoordinator } from "./extraction-queue-coordinator.js";
31
- import { ExtractionRunCoordinator, type ExtractionRunResult } from "./extraction-run.js";
32
+ import {
33
+ ExtractionDeadlineError,
34
+ ExtractionRunCoordinator,
35
+ type ExtractionRunResult,
36
+ } from "./extraction-run.js";
32
37
  import { stripHandles } from "../recall-handles.js";
33
38
  import { type ReplayTurn, normalizeReplaySessionKey } from "../replay/types.js";
34
39
  import { SessionObserverState } from "../session-observer-state.js";
35
40
  import { CODEX_THREAD_KEY_PREFIX } from "../thread-key.js";
36
41
  import { TranscriptManager } from "../transcript.js";
37
42
  import type { BufferTurn, PluginConfig, SourceConnectorProvenance } from "../types.js";
43
+ import type { ResolvedScopeProfilePlan } from "../namespaces/scope-profiles.js";
38
44
  import {
39
45
  BulkImportBatchPartialFailureError,
40
46
  splitTurnsBySourceValidAt,
@@ -64,10 +70,12 @@ export interface TurnIngestionDeps {
64
70
  options?: {
65
71
  skipDedupeCheck?: boolean;
66
72
  clearBufferAfterExtraction?: boolean;
73
+ clearMatchingTurns?: boolean;
67
74
  skipCharThreshold?: boolean;
68
75
  skipUserTurnThreshold?: boolean;
69
76
  extractionDeadlineMs?: number;
70
77
  failOnExtractionFailure?: boolean;
78
+ onDurableCommit?: () => void;
71
79
  forceExtractionAttempt?: boolean;
72
80
  onTaskSettled?: (
73
81
  error?: unknown,
@@ -88,6 +96,7 @@ export interface TurnIngestionDeps {
88
96
  * `runExtraction` so access `observe` can record provenance under the
89
97
  * authenticated principal instead of `resolvePrincipal(sessionKey)`.
90
98
  */
99
+ scopeProfileWritePlan?: ResolvedScopeProfilePlan | null;
91
100
  principalOverride?: string;
92
101
  },
93
102
  ): Promise<void>;
@@ -208,6 +217,12 @@ export class TurnIngestionCoordinator {
208
217
  * `principalOverride` (issue #570 PR 4).
209
218
  */
210
219
  principalOverride?: string;
220
+ /**
221
+ * Persist the authenticated principal that owns the replay session.
222
+ * Access observe supplies this from the transport auth boundary; replay
223
+ * and import callers leave it unset.
224
+ */
225
+ sessionOwnerPrincipal?: string;
211
226
  } = {},
212
227
  ): Promise<void> {
213
228
  if (!Array.isArray(turns) || turns.length === 0) return;
@@ -234,6 +249,7 @@ export class TurnIngestionCoordinator {
234
249
  timestamp: turn.timestamp,
235
250
  sourceValidAt: turn.sourceValidAt,
236
251
  sessionKey: key,
252
+ ...(options.sessionOwnerPrincipal ? { sessionOwnerPrincipal: options.sessionOwnerPrincipal } : {}),
237
253
  parts: turn.parts,
238
254
  rawContent: turn.rawContent,
239
255
  sourceFormat: turn.sourceFormat,
@@ -605,10 +621,12 @@ export class TurnIngestionCoordinator {
605
621
  options: {
606
622
  skipDedupeCheck?: boolean;
607
623
  clearBufferAfterExtraction?: boolean;
624
+ clearMatchingTurns?: boolean;
608
625
  skipCharThreshold?: boolean;
609
626
  skipUserTurnThreshold?: boolean;
610
627
  extractionDeadlineMs?: number;
611
628
  failOnExtractionFailure?: boolean;
629
+ onDurableCommit?: () => void;
612
630
  forceExtractionAttempt?: boolean;
613
631
  onTaskSettled?: (
614
632
  error?: unknown,
@@ -630,6 +648,7 @@ export class TurnIngestionCoordinator {
630
648
  * authenticated principal instead of `resolvePrincipal(sessionKey)`.
631
649
  */
632
650
  principalOverride?: string;
651
+ scopeProfileWritePlan?: ResolvedScopeProfilePlan | null;
633
652
  } = {},
634
653
  ): Promise<void> {
635
654
  const bufferKey = options.bufferKey ?? turnsToExtract[0]?.sessionKey ?? "default";
@@ -660,6 +679,13 @@ export class TurnIngestionCoordinator {
660
679
  timeout = undefined;
661
680
  }
662
681
  };
682
+ let abortHandler: (() => void) | undefined;
683
+ const clearAbortListener = (): void => {
684
+ if (abortHandler && options.abortSignal) {
685
+ options.abortSignal.removeEventListener("abort", abortHandler);
686
+ abortHandler = undefined;
687
+ }
688
+ };
663
689
  const settleTask = (
664
690
  error?: unknown,
665
691
  result?: ExtractionRunResult,
@@ -667,19 +693,38 @@ export class TurnIngestionCoordinator {
667
693
  if (settled) return false;
668
694
  settled = true;
669
695
  clearQueueWaitTimer();
696
+ clearAbortListener();
670
697
  options.onTaskSettled?.(error, result);
671
698
  return true;
672
699
  };
673
-
674
- if (typeof extractionDeadlineMs === "number") {
675
- const remainingMs = extractionDeadlineMs - Date.now();
676
- if (remainingMs <= 0) {
677
- settleTask(new Error("replay extraction deadline exceeded (queue_wait)"));
700
+ if (options.abortSignal) {
701
+ const signal = options.abortSignal;
702
+ abortHandler = () => settleTask(signal.reason ?? abortError("extraction aborted (queue_wait)"));
703
+ signal.addEventListener("abort", abortHandler, { once: true });
704
+ if (signal.aborted) {
705
+ settleTask(signal.reason ?? abortError("extraction aborted (queue_wait)"));
678
706
  return;
679
707
  }
680
- timeout = setTimeout(() => {
681
- settleTask(new Error("replay extraction deadline exceeded (queue_wait)"));
682
- }, remainingMs);
708
+ }
709
+
710
+ if (typeof extractionDeadlineMs === "number") {
711
+ const deadline = extractionDeadlineMs;
712
+ const maxTimerDelayMs = 2_147_483_647;
713
+ const scheduleQueueWaitTimeout = (): void => {
714
+ const remainingMs = deadline - Date.now();
715
+ if (remainingMs <= 0) {
716
+ settleTask(new ExtractionDeadlineError("queue_wait"));
717
+ return;
718
+ }
719
+ timeout = setTimeout(() => {
720
+ if (Date.now() >= deadline) {
721
+ settleTask(new ExtractionDeadlineError("queue_wait"));
722
+ } else {
723
+ scheduleQueueWaitTimeout();
724
+ }
725
+ }, Math.min(remainingMs, maxTimerDelayMs));
726
+ };
727
+ scheduleQueueWaitTimeout();
683
728
  }
684
729
 
685
730
  this.deps.extractionQueueCoordinator.enqueue(async () => {
@@ -688,7 +733,7 @@ export class TurnIngestionCoordinator {
688
733
  typeof extractionDeadlineMs === "number" &&
689
734
  extractionDeadlineMs <= Date.now()
690
735
  ) {
691
- settleTask(new Error("replay extraction deadline exceeded (queue_wait)"));
736
+ settleTask(new ExtractionDeadlineError("queue_wait"));
692
737
  return;
693
738
  }
694
739
  clearQueueWaitTimer();
@@ -696,14 +741,17 @@ export class TurnIngestionCoordinator {
696
741
  const result = await this.deps.runExtraction(turnsToExtract, {
697
742
  clearBufferAfterExtraction:
698
743
  options.clearBufferAfterExtraction ?? true,
744
+ clearMatchingTurns: options.clearMatchingTurns === true,
699
745
  skipCharThreshold: options.skipCharThreshold ?? false,
700
746
  skipUserTurnThreshold: options.skipUserTurnThreshold ?? false,
701
747
  deadlineMs: extractionDeadlineMs,
702
748
  bufferKey,
749
+ onDurableCommit: options.onDurableCommit,
703
750
  abortSignal: options.abortSignal,
704
751
  failOnExtractionFailure: options.failOnExtractionFailure === true,
705
752
  writeNamespaceOverride: options.writeNamespaceOverride,
706
753
  principalOverride: options.principalOverride,
754
+ scopeProfileWritePlan: options.scopeProfileWritePlan,
707
755
  forceExtractionAttempt: options.forceExtractionAttempt === true,
708
756
  });
709
757
  settleTask(undefined, result);
@@ -735,6 +783,7 @@ export class TurnIngestionCoordinator {
735
783
  namespace: string;
736
784
  bufferKey: string;
737
785
  isLiveSession: boolean;
786
+ abortSignal?: AbortSignal;
738
787
  },
739
788
  ): Promise<void> {
740
789
  const mode = this.deps.config.correctionCaptureMode;
@@ -765,10 +814,11 @@ export class TurnIngestionCoordinator {
765
814
  sessionKey: opts.sessionKey,
766
815
  principal: opts.principal,
767
816
  namespace: opts.namespace,
817
+ abortSignal: opts.abortSignal,
768
818
  },
769
819
  captureConfig,
770
820
  {
771
- planCorrection: (req) => service.plan(req),
821
+ planCorrection: (req, planOpts) => service.plan(req, planOpts),
772
822
  applyCorrection: (planId, applyOpts) => service.apply(planId, applyOpts),
773
823
  storageDir: async (ns) => (await this.deps.getStorage(ns)).dir,
774
824
  // Resolve `[m:xxxx]` handles to concrete memory ids via the single