@remnic/core 9.30.1 → 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 (493) 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-YNQBRLC5.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/session-context.ts +193 -18
  427. package/src/orchestration/turn-ingestion.ts +61 -11
  428. package/src/orchestrator-flush.test.ts +511 -5
  429. package/src/orchestrator.ts +8 -6
  430. package/src/types.ts +2 -2
  431. package/dist/chunk-4A6YGWQN.js.map +0 -1
  432. package/dist/chunk-4WKA6I65.js.map +0 -1
  433. package/dist/chunk-4Z4XNEWZ.js.map +0 -1
  434. package/dist/chunk-6FUPCJUL.js.map +0 -1
  435. package/dist/chunk-B6JDYXL7.js.map +0 -1
  436. package/dist/chunk-GBJ4RDFR.js.map +0 -1
  437. package/dist/chunk-HUHX2OCX.js.map +0 -1
  438. package/dist/chunk-IYZ5K7MU.js.map +0 -1
  439. package/dist/chunk-LGHKJABJ.js.map +0 -1
  440. package/dist/chunk-PHWUFPCO.js.map +0 -1
  441. package/dist/chunk-RPW2NOU6.js.map +0 -1
  442. package/dist/chunk-SPJXKAVF.js.map +0 -1
  443. package/dist/chunk-YNQBRLC5.js.map +0 -1
  444. package/dist/chunk-YTSNAUXN.js.map +0 -1
  445. /package/dist/{capsule-crypto-GWVG7LGC.js.map → access-extraction-force-flush.js.map} +0 -0
  446. /package/dist/{capsule-merge-5KKJQBWQ.js.map → capsule-merge-2H2IUTBT.js.map} +0 -0
  447. /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
  448. /package/dist/{chunk-GIBMDSJ2.js.map → chunk-27P5YVDU.js.map} +0 -0
  449. /package/dist/{chunk-2SA56WMI.js.map → chunk-2LTDWSR6.js.map} +0 -0
  450. /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
  451. /package/dist/{chunk-6U7F52DE.js.map → chunk-4XHR3I67.js.map} +0 -0
  452. /package/dist/{chunk-2EUVEDF5.js.map → chunk-5XA7PQ5I.js.map} +0 -0
  453. /package/dist/{chunk-ALSGMEJR.js.map → chunk-65ZPVYTA.js.map} +0 -0
  454. /package/dist/{chunk-5VQJBH2G.js.map → chunk-6TAUHL33.js.map} +0 -0
  455. /package/dist/{chunk-RGIWINDN.js.map → chunk-7G5MH4NT.js.map} +0 -0
  456. /package/dist/{chunk-WVO4G37W.js.map → chunk-7TEZUUGM.js.map} +0 -0
  457. /package/dist/{chunk-MJCGLM25.js.map → chunk-7VUAG236.js.map} +0 -0
  458. /package/dist/{chunk-M3C2V3PV.js.map → chunk-AJEMDQNA.js.map} +0 -0
  459. /package/dist/{chunk-RKNJBZ55.js.map → chunk-AU7Q3LSC.js.map} +0 -0
  460. /package/dist/{chunk-ACXPX4AG.js.map → chunk-BR2K43MK.js.map} +0 -0
  461. /package/dist/{chunk-CZRYLSSW.js.map → chunk-BUGVGH4N.js.map} +0 -0
  462. /package/dist/{chunk-YTQNQ4KB.js.map → chunk-C4VQMFVM.js.map} +0 -0
  463. /package/dist/{chunk-ZPSVBSOF.js.map → chunk-CIVDJD6P.js.map} +0 -0
  464. /package/dist/{chunk-K5GB36ME.js.map → chunk-CZDOT5I2.js.map} +0 -0
  465. /package/dist/{chunk-VI2JQPNQ.js.map → chunk-E4PWACUN.js.map} +0 -0
  466. /package/dist/{chunk-D2ANTDGO.js.map → chunk-E6BMSH7U.js.map} +0 -0
  467. /package/dist/{chunk-P5PXWTW7.js.map → chunk-EJCAV3QZ.js.map} +0 -0
  468. /package/dist/{chunk-CKMO4RDY.js.map → chunk-EMDLM3LW.js.map} +0 -0
  469. /package/dist/{chunk-G5R3D5UP.js.map → chunk-GTTAHHD3.js.map} +0 -0
  470. /package/dist/{chunk-H5CPS5JP.js.map → chunk-H36LJIPD.js.map} +0 -0
  471. /package/dist/{chunk-AITCS2RC.js.map → chunk-IJ7HK452.js.map} +0 -0
  472. /package/dist/{chunk-D3LMYTBV.js.map → chunk-J7WZUL2K.js.map} +0 -0
  473. /package/dist/{chunk-5W4ZLBEZ.js.map → chunk-JCFTIQBR.js.map} +0 -0
  474. /package/dist/{chunk-XOZ4ALGB.js.map → chunk-KE353EWI.js.map} +0 -0
  475. /package/dist/{chunk-W5EG6LE3.js.map → chunk-KIT6M7EB.js.map} +0 -0
  476. /package/dist/{chunk-5W7CTZ2E.js.map → chunk-KQAFEZQX.js.map} +0 -0
  477. /package/dist/{chunk-Z54EM5YZ.js.map → chunk-MAXVH44E.js.map} +0 -0
  478. /package/dist/{chunk-WZFAPHIK.js.map → chunk-MU7ZHSZE.js.map} +0 -0
  479. /package/dist/{chunk-66772WBP.js.map → chunk-NFXQJHJD.js.map} +0 -0
  480. /package/dist/{chunk-AZ5BTEKX.js.map → chunk-NQUF7XKR.js.map} +0 -0
  481. /package/dist/{chunk-W4FBGYGK.js.map → chunk-NRV4Y3PM.js.map} +0 -0
  482. /package/dist/{chunk-NHWB6HG2.js.map → chunk-NYCGIQRA.js.map} +0 -0
  483. /package/dist/{chunk-QJAQNXWI.js.map → chunk-ONHRRJZM.js.map} +0 -0
  484. /package/dist/{chunk-FDAMS4PK.js.map → chunk-PNPOWBGC.js.map} +0 -0
  485. /package/dist/{chunk-IC6CBHCA.js.map → chunk-QGENAYVS.js.map} +0 -0
  486. /package/dist/{chunk-62U4J2GN.js.map → chunk-UR77VKF7.js.map} +0 -0
  487. /package/dist/{chunk-JCBWCYEJ.js.map → chunk-VANLTS5F.js.map} +0 -0
  488. /package/dist/{chunk-RMMVQQA6.js.map → chunk-WDISJRMG.js.map} +0 -0
  489. /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
  490. /package/dist/{chunk-TH2LSRMG.js.map → chunk-XHDIB4T4.js.map} +0 -0
  491. /package/dist/{chunk-CVILPI77.js.map → chunk-XOQSEF7X.js.map} +0 -0
  492. /package/dist/{chunk-LBOD4U5B.js.map → chunk-YFOMN2II.js.map} +0 -0
  493. /package/dist/{chunk-I5NLEENJ.js.map → chunk-Z4SWV4VW.js.map} +0 -0
@@ -0,0 +1,180 @@
1
+ type PendingObservePreparation = {
2
+ cancelled: boolean;
3
+ scopeHint?: string;
4
+ principal?: string;
5
+ namespace?: string;
6
+ released: Promise<void>;
7
+ release: () => void;
8
+ };
9
+
10
+ export type PendingObservePreparationHandle = {
11
+ isCancelled(): boolean;
12
+ setScope(principal?: string, namespace?: string): void;
13
+ release(): void;
14
+ };
15
+
16
+ export function pendingObserveScopeHint(options: {
17
+ namespace?: string;
18
+ projectTag?: string;
19
+ cwd?: string;
20
+ }): string | undefined {
21
+ const namespace = options.namespace?.trim();
22
+ if (namespace) return `namespace:${namespace}`;
23
+ const projectTag = options.projectTag?.trim();
24
+ if (projectTag) return `projectTag:${projectTag}`;
25
+ const cwd = options.cwd?.trim();
26
+ return cwd ? `cwd:${cwd}` : undefined;
27
+ }
28
+
29
+ type PendingObserveExtraction = {
30
+ promise: Promise<void>;
31
+ controllers: Set<AbortController>;
32
+ };
33
+
34
+ export class PendingObserveExtractionTracker {
35
+ private readonly entries = new Map<string, PendingObserveExtraction>();
36
+ private readonly preparations = new Map<string, Set<PendingObservePreparation>>();
37
+
38
+ reserve(sessionKey: string, scopeHint?: string): PendingObservePreparationHandle {
39
+ let released = false;
40
+ let resolveReleased: () => void = () => {};
41
+ const reservation: PendingObservePreparation = {
42
+ cancelled: false,
43
+ scopeHint,
44
+ released: new Promise<void>((resolve) => {
45
+ resolveReleased = resolve;
46
+ }),
47
+ release: () => {
48
+ if (released) return;
49
+ released = true;
50
+ const entries = this.preparations.get(sessionKey);
51
+ entries?.delete(reservation);
52
+ if (entries?.size === 0) this.preparations.delete(sessionKey);
53
+ resolveReleased();
54
+ },
55
+ };
56
+ const entries = this.preparations.get(sessionKey) ?? new Set<PendingObservePreparation>();
57
+ entries.add(reservation);
58
+ this.preparations.set(sessionKey, entries);
59
+ return {
60
+ isCancelled: () => reservation.cancelled,
61
+ setScope: (principal, namespace) => {
62
+ reservation.principal = principal;
63
+ reservation.namespace = namespace;
64
+ },
65
+ release: reservation.release,
66
+ };
67
+ }
68
+
69
+ private async waitForPreparations(sessionKey: string): Promise<void> {
70
+ while (true) {
71
+ const pending = [...(this.preparations.get(sessionKey) ?? [])].filter(
72
+ (reservation) => !reservation.cancelled,
73
+ );
74
+ if (pending.length === 0) return;
75
+ await Promise.all(pending.map((reservation) => reservation.released));
76
+ }
77
+ }
78
+
79
+
80
+ key(sessionKey: string, principal: string | undefined, namespace: string | undefined): string {
81
+ return `${sessionKey}\u0000${principal ?? ""}\u0000${namespace ?? ""}`;
82
+ }
83
+
84
+ track(key: string, extraction: Promise<void>, controller: AbortController): void {
85
+ const previous = this.entries.get(key);
86
+ const promise = previous
87
+ ? Promise.allSettled([previous.promise, extraction]).then((results) => {
88
+ const rejected = results.find((result): result is PromiseRejectedResult => result.status === "rejected");
89
+ if (rejected) throw rejected.reason;
90
+ })
91
+ : extraction;
92
+ const entry = {
93
+ promise,
94
+ controllers: new Set(previous ? [...previous.controllers, controller] : [controller]),
95
+ };
96
+ this.entries.set(key, entry);
97
+ void promise
98
+ .then(() => {
99
+ if (this.entries.get(key) === entry) this.entries.delete(key);
100
+ })
101
+ .catch(() => {
102
+ // Keep a failed barrier visible to the next lifecycle flush.
103
+ });
104
+ }
105
+
106
+ cancel(
107
+ sessionKey: string,
108
+ principal?: string,
109
+ namespace?: string,
110
+ scopeHint?: string,
111
+ ): void {
112
+ for (const reservation of this.preparations.get(sessionKey) ?? []) {
113
+ const principalMatches =
114
+ principal === undefined ||
115
+ reservation.principal === undefined ||
116
+ reservation.principal === principal;
117
+ const namespaceMatches =
118
+ namespace === undefined ||
119
+ reservation.namespace === undefined ||
120
+ reservation.namespace === namespace;
121
+ const resolvedScopeMatches =
122
+ namespace !== undefined &&
123
+ reservation.namespace === namespace &&
124
+ principalMatches;
125
+ const scopeHintMismatch =
126
+ (reservation.scopeHint !== undefined && reservation.scopeHint !== scopeHint) ||
127
+ (reservation.scopeHint === undefined && scopeHint !== undefined);
128
+ if ((!resolvedScopeMatches && scopeHintMismatch) || !principalMatches || !namespaceMatches) {
129
+ continue;
130
+ }
131
+ reservation.cancelled = true;
132
+ }
133
+
134
+ for (const [key, entry] of this.entries) {
135
+ const [entrySessionKey, entryPrincipal, entryNamespace] = key.split("\u0000");
136
+ if (
137
+ entrySessionKey !== sessionKey ||
138
+ (principal !== undefined && entryPrincipal !== (principal ?? "")) ||
139
+ (namespace !== undefined && entryNamespace !== (namespace ?? ""))
140
+ )
141
+ continue;
142
+ for (const controller of entry.controllers) controller.abort();
143
+ }
144
+ }
145
+
146
+ async wait(
147
+ sessionKey: string,
148
+ principal: string | undefined,
149
+ namespace: string | undefined,
150
+ abortSignal?: AbortSignal,
151
+ registerCancellation?: (cancel: () => void) => void,
152
+ scopeHint?: string,
153
+ ): Promise<void> {
154
+ const key = this.key(sessionKey, principal, namespace);
155
+ const abortTracked = (): void => {
156
+ this.cancel(sessionKey, principal, namespace, scopeHint);
157
+ };
158
+ registerCancellation?.(abortTracked);
159
+ abortSignal?.addEventListener("abort", abortTracked, { once: true });
160
+ try {
161
+ await this.waitForPreparations(sessionKey);
162
+ while (true) {
163
+ const entry = this.entries.get(key);
164
+ if (!entry) return;
165
+ try {
166
+ await entry.promise;
167
+ } catch (error) {
168
+ if (this.entries.get(key) !== entry) continue;
169
+ this.entries.delete(key);
170
+ throw error;
171
+ }
172
+ if (this.entries.get(key) !== entry) continue;
173
+ this.entries.delete(key);
174
+ return;
175
+ }
176
+ } finally {
177
+ abortSignal?.removeEventListener("abort", abortTracked);
178
+ }
179
+ }
180
+ }
@@ -11,7 +11,25 @@
11
11
  */
12
12
 
13
13
  import { createHash } from "node:crypto";
14
- import { buildAccessWriteRequestFingerprint } from "./write-envelope.js";
14
+ import {
15
+ type CodingScopedWriteInput,
16
+ ENGRAM_ACCESS_WRITE_SCHEMA_VERSION,
17
+ type EngramAccessBriefingRequest,
18
+ type EngramAccessBriefingResponse,
19
+ type EngramAccessExtractionForceFlushRequest,
20
+ type EngramAccessExtractionForceFlushResponse,
21
+ EngramAccessInputError,
22
+ type EngramAccessMemoryStoreRequest,
23
+ type EngramAccessObserveRequest,
24
+ type EngramAccessObserveResponse,
25
+ type EngramAccessQmdCollectionState,
26
+ type EngramAccessQmdHealthResponse,
27
+ type EngramAccessSuggestionSubmitRequest,
28
+ type EngramAccessWriteResponse,
29
+ type MemoryScopePlan,
30
+ NamespaceNotWritableError,
31
+ } from "./access-service.js";
32
+ import { extractionForceFlush } from "./access-extraction-force-flush.js";
15
33
  import { FileCalendarSource, buildBriefing, parseBriefingFocus, parseBriefingWindow } from "./briefing.js";
16
34
  import {
17
35
  resolveCompressionCapabilities,
@@ -32,24 +50,9 @@ import type { MemoryActionOutcome, MemoryActionType } from "./types.js";
32
50
  import { exportWorkBoardMarkdown, exportWorkBoardSnapshot, importWorkBoardSnapshot } from "./work/board.js";
33
51
  import { wrapWorkLayerContext } from "./work/boundary.js";
34
52
  import { WorkStorage } from "./work/storage.js";
35
- import { WriteQuarantineStore, type QuarantineOperation } from "./write-quarantine.js";
36
- import {
37
- ENGRAM_ACCESS_WRITE_SCHEMA_VERSION,
38
- EngramAccessInputError,
39
- NamespaceNotWritableError,
40
- type CodingScopedWriteInput,
41
- type EngramAccessBriefingRequest,
42
- type EngramAccessBriefingResponse,
43
- type EngramAccessMemoryStoreRequest,
44
- type EngramAccessObserveRequest,
45
- type EngramAccessObserveResponse,
46
- type EngramAccessQmdCollectionState,
47
- type EngramAccessQmdHealthResponse,
48
- type EngramAccessSuggestionSubmitRequest,
49
- type EngramAccessWriteResponse,
50
- type MemoryScopePlan,
51
- } from "./access-service.js";
52
-
53
+ import { buildAccessWriteRequestFingerprint } from "./write-envelope.js";
54
+ import { type QuarantineOperation, WriteQuarantineStore } from "./write-quarantine.js";
55
+ import { PendingObserveExtractionTracker, pendingObserveScopeHint } from "./access-observe-helpers.js";
53
56
  export interface AccessObserveWriteSurfaceDeps {
54
57
  attachCodingContextAfterScopedWrite(
55
58
  request: CodingScopedWriteInput & { namespace?: string; sessionKey?: string }
@@ -107,6 +110,12 @@ export interface AccessObserveWriteSurfaceDeps {
107
110
  authenticatedPrincipal?: string;
108
111
  }
109
112
  ): Promise<MemoryScopePlan>;
113
+ cancelPendingObserveExtractions?(
114
+ sessionKey: string,
115
+ principal?: string,
116
+ namespace?: string,
117
+ scopeHint?: string,
118
+ ): void;
110
119
  resolveReadableNamespace(namespace: string | undefined, principal?: string): string;
111
120
  validateWriteCandidate(
112
121
  request: EngramAccessMemoryStoreRequest | EngramAccessSuggestionSubmitRequest,
@@ -121,7 +130,16 @@ export interface AccessObserveWriteSurfaceDeps {
121
130
 
122
131
  export class AccessObserveWriteSurface {
123
132
  private quarantineStoreInstance?: WriteQuarantineStore;
133
+ private readonly pendingObserveExtractions = new PendingObserveExtractionTracker();
124
134
 
135
+ public cancelPendingObserveExtractions(
136
+ sessionKey: string,
137
+ principal?: string,
138
+ namespace?: string,
139
+ scopeHint?: string,
140
+ ): void {
141
+ this.pendingObserveExtractions.cancel(sessionKey, principal, namespace, scopeHint);
142
+ }
125
143
  constructor(private readonly deps: AccessObserveWriteSurfaceDeps) {}
126
144
 
127
145
  private quarantineStore(): WriteQuarantineStore {
@@ -654,6 +672,12 @@ export class AccessObserveWriteSurface {
654
672
  // self base leaves NO coding context bound to the session, matching how
655
673
  // `memory_store` resolves its full scoped write namespace before any
656
674
  // session mutation.
675
+ const observePreparation = this.pendingObserveExtractions.reserve(
676
+ request.sessionKey,
677
+ pendingObserveScopeHint(request),
678
+ );
679
+ try {
680
+
657
681
  let scope: MemoryScopePlan;
658
682
  try {
659
683
  scope = await this.deps.resolveMemoryScopePlan(request);
@@ -666,6 +690,7 @@ export class AccessObserveWriteSurface {
666
690
  throw err;
667
691
  }
668
692
  const writeNamespace = scope.writeNamespace;
693
+ observePreparation.setScope(scope.principal, writeNamespace);
669
694
 
670
695
  // Backward-compatible BASE writable namespace (pre-#1495 response semantics)
671
696
  // for the legacy `namespace` response field. DERIVED from the already-resolved
@@ -812,21 +837,35 @@ export class AccessObserveWriteSurface {
812
837
  // limits concurrency (one extraction at a time per session via
813
838
  // queueBufferedExtraction). Fire-and-forget here just decouples
814
839
  // the HTTP response from the queue drain.
840
+ if (!observePreparation.isCancelled()) {
841
+
815
842
  try {
843
+ const observeAbortController = new AbortController();
816
844
  const extractionPromise = this.deps.orchestrator.ingestReplayBatch(turns, {
817
845
  archiveLcm: false,
818
846
  writeNamespaceOverride,
819
847
  principalOverride,
848
+ abortSignal: observeAbortController.signal,
849
+ ...(typeof request.authenticatedPrincipal === "string" && request.authenticatedPrincipal.trim().length > 0
850
+ ? { sessionOwnerPrincipal: request.authenticatedPrincipal.trim() }
851
+ : {}),
820
852
  });
821
853
  extractionPromise.catch((err) => {
822
854
  log.error(`access-observe background extraction failed: ${err}`);
823
855
  });
856
+ this.pendingObserveExtractions.track(
857
+ this.pendingObserveExtractions.key(request.sessionKey, scope.principal, writeNamespace),
858
+ extractionPromise,
859
+ observeAbortController,
860
+ );
824
861
  extractionQueued = true;
825
862
  } catch (err) {
826
863
  // Synchronous enqueue failure (e.g. orchestrator disposed)
827
864
  log.error(`access-observe extraction enqueue failed: ${err}`);
828
865
  }
829
866
  }
867
+ }
868
+
830
869
 
831
870
  log.info(
832
871
  `access-observe namespace=${namespace} effectiveNamespace=${writeNamespace} sessionKey=${request.sessionKey} messages=${request.messages.length} lcm=${lcmArchived} extraction=${extractionQueued}`
@@ -852,8 +891,28 @@ export class AccessObserveWriteSurface {
852
891
  lcmArchived,
853
892
  extractionQueued,
854
893
  };
894
+ } finally {
895
+ observePreparation.release();
896
+ }
855
897
  }
856
898
 
899
+ async extractionForceFlush(
900
+ request: EngramAccessExtractionForceFlushRequest,
901
+ ): Promise<EngramAccessExtractionForceFlushResponse> {
902
+ return extractionForceFlush(
903
+ this.deps,
904
+ request,
905
+ (sessionKey, principal, namespace, abortSignal, registerCancellation, scopeHint) =>
906
+ this.pendingObserveExtractions.wait(
907
+ sessionKey,
908
+ principal,
909
+ namespace,
910
+ abortSignal,
911
+ registerCancellation,
912
+ scopeHint,
913
+ ),
914
+ );
915
+ }
857
916
  async workTask(request: {
858
917
  action: "create" | "get" | "list" | "update" | "transition" | "delete";
859
918
  id?: string;
@@ -194,7 +194,8 @@ defineOperation({ name: "observe", description: "Observe messages.", schema: str
194
194
  handler: async (input, ctx) => ({ result: await ctx.service.observe({ sessionKey: defStr(input.sessionKey, ""), messages: (input.messages as unknown[]).map((m: unknown) => { const r = m as Record<string, unknown>; return { role: String(r.role), content: String(r.content), parts: r.parts as unknown[], rawContent: r.rawContent as string | undefined, sourceFormat: r.sourceFormat as string | undefined }; }) as never, skipExtraction: input.skipExtraction === true, idempotencyKey: optStr(input.idempotencyKey), namespace: optStr(input.namespace), authenticatedPrincipal: ctx.authenticatedPrincipal, cwd: optStr(input.cwd), projectTag: optStr(input.projectTag), ...(ctx.sourceConnector ? { sourceConnector: ctx.sourceConnector } : {}) }, ctx.hooks?.enforceWriteQuota ? { enforceWriteQuota: ctx.hooks.enforceWriteQuota } : undefined) }),
195
195
  });
196
196
  defineOperation({ name: "lcm_search", description: "Search LCM.", schema: strictSchema({ query: S.str, sessionKey: S.str, sessionPrefix: S.str, namespace: S.str, limit: S.num }), handler: async (input, ctx) => ({ result: await ctx.service.lcmSearch({ query: defStr(input.query, ""), sessionKey: optStr(input.sessionKey), sessionPrefix: optStr(input.sessionPrefix), namespace: optStr(input.namespace), limit: optNum(input.limit), authenticatedPrincipal: ctx.authenticatedPrincipal }) }) });
197
- defineOperation({ name: "lcm_compaction_flush", description: "Flush LCM compaction.", schema: strictSchema({ sessionKey: S.str, namespace: S.str }), handler: async (input, ctx) => ({ result: await ctx.service.lcmCompactionFlush({ sessionKey: optStr(input.sessionKey) ?? "", namespace: optStr(input.namespace), authenticatedPrincipal: ctx.authenticatedPrincipal }) }) });
197
+ defineOperation({ name: "lcm_compaction_flush", description: "Flush LCM compaction.", schema: strictSchema({ sessionKey: S.str, namespace: S.str, cwd: S.str, projectTag: S.str }), handler: async (input, ctx) => ({ result: await ctx.service.lcmCompactionFlush({ sessionKey: optStr(input.sessionKey) ?? "", namespace: optStr(input.namespace), cwd: optStr(input.cwd), projectTag: optStr(input.projectTag), authenticatedPrincipal: ctx.authenticatedPrincipal }) }) });
198
+ defineOperation({ name: "extraction_force_flush", description: "Force-drain a session extraction buffer.", schema: strictSchema({ sessionKey: S.str, namespace: S.str, cwd: S.str, projectTag: S.str, deadlineMs: S.num }), handler: async (input, ctx) => ({ result: await ctx.service.extractionForceFlush({ sessionKey: optStr(input.sessionKey) ?? "", namespace: optStr(input.namespace), cwd: optStr(input.cwd), projectTag: optStr(input.projectTag), deadlineMs: optNum(input.deadlineMs), authenticatedPrincipal: ctx.authenticatedPrincipal, onCommitted: ctx.hooks?.recordWriteCommit, ...(ctx.abortSignal ? { abortSignal: ctx.abortSignal } : {}) }) }) });
198
199
  defineOperation({ name: "lcm_compaction_record", description: "Record LCM compaction.", schema: strictSchema({ sessionKey: S.str, namespace: S.str, tokensBefore: S.num, tokensAfter: S.num }), handler: async (input, ctx) => ({ result: await ctx.service.lcmCompactionRecord({ sessionKey: optStr(input.sessionKey) ?? "", namespace: optStr(input.namespace), tokensBefore: optNum(input.tokensBefore) ?? 0, tokensAfter: optNum(input.tokensAfter) ?? 0, authenticatedPrincipal: ctx.authenticatedPrincipal }) }) });
199
200
 
200
201
  // === CONTINUITY/IDENTITY ===
@@ -58,6 +58,23 @@ test("LCM compaction flush rejects duplicate namespace batches", () => {
58
58
  assert.equal(result.success, false);
59
59
  });
60
60
 
61
+ test("extraction force-flush schema accepts scoped deadlines and rejects invalid deadlines", () => {
62
+ const accepted = validateRequest("extractionForceFlush", {
63
+ sessionKey: "pi:session",
64
+ namespace: "work",
65
+ cwd: "/workspace/project",
66
+ projectTag: "Acme/Webshop",
67
+ deadlineMs: 1_900_000_000_000,
68
+ });
69
+ assert.equal(accepted.success, true);
70
+
71
+ const rejected = validateRequest("extractionForceFlush", {
72
+ sessionKey: "pi:session",
73
+ deadlineMs: -1,
74
+ });
75
+ assert.equal(rejected.success, false);
76
+ });
77
+
61
78
  test("LCM compaction record rejects invalid token counts", () => {
62
79
  const result = validateRequest("lcmCompactionRecord", {
63
80
  sessionKey: "pi:session",
@@ -44,6 +44,14 @@ export function formatZodError(error: z.ZodError): SchemaValidationError {
44
44
  const namespaceSchema = z.string().trim().max(256).optional();
45
45
  const sessionKeySchema = z.string().trim().min(1).max(512).optional();
46
46
  const idempotencyKeySchema = z.string().trim().min(1).max(256).optional();
47
+ const cwdSchema = z.string().trim().min(1, "cwd must be non-empty when provided").max(2048).optional();
48
+ const projectTagSchema = z
49
+ .string()
50
+ .trim()
51
+ .min(1, "projectTag must be non-empty when provided")
52
+ .max(256)
53
+ .optional();
54
+ const deadlineMsSchema = z.number().finite().min(0).max(Number.MAX_SAFE_INTEGER).optional();
47
55
  const dryRunSchema = z.boolean().optional();
48
56
  const schemaVersionSchema = z.number().int().optional();
49
57
  const timeZoneSchema = z
@@ -108,12 +116,12 @@ export const recallRequestSchema = z.object({
108
116
  disclosure: recallDisclosureSchema.optional(),
109
117
  codingContext: codingContextSchema.optional(),
110
118
  /** Working directory for auto git-context resolution (issue #569). */
111
- cwd: z.string().trim().min(1, "cwd must be non-empty when provided").max(2048).optional(),
119
+ cwd: cwdSchema,
112
120
  /**
113
121
  * Arbitrary project tag for non-git-based project scoping (issue #569).
114
122
  * Creates a coding context with `projectId: "tag:<projectTag>"`.
115
123
  */
116
- projectTag: z.string().trim().min(1, "projectTag must be non-empty when provided").max(256).optional(),
124
+ projectTag: projectTagSchema,
117
125
  /**
118
126
  * Historical recall pin (issue #680). ISO 8601 timestamp. The
119
127
  * schema only enforces the basic shape; the access service runs
@@ -225,12 +233,12 @@ export const observeRequestSchema = z.object({
225
233
  */
226
234
  idempotencyKey: idempotencyKeySchema,
227
235
  /** Working directory for auto git-context resolution (issue #569). */
228
- cwd: z.string().trim().min(1, "cwd must be non-empty when provided").max(2048).optional(),
236
+ cwd: cwdSchema,
229
237
  /**
230
238
  * Arbitrary project tag for non-git-based project scoping (issue #569).
231
239
  * Creates a coding context with `projectId: "tag:<projectTag>"`.
232
240
  */
233
- projectTag: z.string().trim().min(1, "projectTag must be non-empty when provided").max(256).optional(),
241
+ projectTag: projectTagSchema,
234
242
  });
235
243
 
236
244
  // ---------------------------------------------------------------------------
@@ -268,13 +276,8 @@ export const memoryStoreRequestSchema = z.object({
268
276
  // `namespace` is given, these route the write to the same project namespace
269
277
  // recall/observe resolve from `cwd`/`projectTag` (issue #569, rule 42). Also
270
278
  // lets MCP clients that auto-inject `cwd` (e.g. Pi MCPorter) call write tools.
271
- cwd: z.string().trim().min(1, "cwd must be non-empty when provided").max(2048).optional(),
272
- projectTag: z
273
- .string()
274
- .trim()
275
- .min(1, "projectTag must be non-empty when provided")
276
- .max(256)
277
- .optional(),
279
+ cwd: cwdSchema,
280
+ projectTag: projectTagSchema,
278
281
  });
279
282
 
280
283
  export const suggestionSubmitRequestSchema = memoryStoreRequestSchema;
@@ -335,6 +338,8 @@ export const lcmCompactionFlushRequestSchema = z
335
338
  .object({
336
339
  sessionKey: z.string().trim().min(1, "sessionKey is required").max(512),
337
340
  namespace: namespaceSchema,
341
+ cwd: cwdSchema,
342
+ projectTag: projectTagSchema,
338
343
  /**
339
344
  * Optional multi-namespace flush used by delegate lifecycle replay. The
340
345
  * server handles the whole list as one quota-counted write.
@@ -361,6 +366,14 @@ export const lcmCompactionFlushRequestSchema = z
361
366
  }
362
367
  });
363
368
 
369
+ export const extractionForceFlushRequestSchema = z.object({
370
+ sessionKey: z.string().trim().min(1, "sessionKey is required").max(512),
371
+ namespace: namespaceSchema,
372
+ cwd: cwdSchema,
373
+ projectTag: projectTagSchema,
374
+ deadlineMs: deadlineMsSchema,
375
+ });
376
+
364
377
  export const lcmCompactionRecordRequestSchema = z.object({
365
378
  sessionKey: z.string().trim().min(1, "sessionKey is required").max(512),
366
379
  namespace: namespaceSchema,
@@ -583,6 +596,7 @@ export type TrustZonePromoteRequest = z.infer<typeof trustZonePromoteRequestSche
583
596
  export type TrustZoneDemoSeedRequest = z.infer<typeof trustZoneDemoSeedRequestSchema>;
584
597
  export type LcmSearchRequest = z.infer<typeof lcmSearchRequestSchema>;
585
598
  export type LcmCompactionFlushRequest = z.infer<typeof lcmCompactionFlushRequestSchema>;
599
+ export type ExtractionForceFlushRequest = z.infer<typeof extractionForceFlushRequestSchema>;
586
600
  export type LcmCompactionRecordRequest = z.infer<typeof lcmCompactionRecordRequestSchema>;
587
601
  export type DaySummaryRequest = z.infer<typeof daySummaryRequestSchema>;
588
602
  export type CapsuleExportRequest = z.infer<typeof capsuleExportRequestSchema>;
@@ -610,6 +624,7 @@ export type SchemaName =
610
624
  | "trustZoneDemoSeed"
611
625
  | "lcmSearch"
612
626
  | "lcmCompactionFlush"
627
+ | "extractionForceFlush"
613
628
  | "lcmCompactionRecord"
614
629
  | "daySummary"
615
630
  | "capsuleExport"
@@ -633,6 +648,7 @@ export type SchemaTypeFor<N extends SchemaName> =
633
648
  : N extends "trustZoneDemoSeed" ? TrustZoneDemoSeedRequest
634
649
  : N extends "lcmSearch" ? LcmSearchRequest
635
650
  : N extends "lcmCompactionFlush" ? LcmCompactionFlushRequest
651
+ : N extends "extractionForceFlush" ? ExtractionForceFlushRequest
636
652
  : N extends "lcmCompactionRecord" ? LcmCompactionRecordRequest
637
653
  : N extends "daySummary" ? DaySummaryRequest
638
654
  : N extends "capsuleExport" ? CapsuleExportRequest
@@ -657,6 +673,7 @@ const schemas: Record<SchemaName, z.ZodTypeAny> = {
657
673
  trustZoneDemoSeed: trustZoneDemoSeedRequestSchema,
658
674
  lcmSearch: lcmSearchRequestSchema,
659
675
  lcmCompactionFlush: lcmCompactionFlushRequestSchema,
676
+ extractionForceFlush: extractionForceFlushRequestSchema,
660
677
  lcmCompactionRecord: lcmCompactionRecordRequestSchema,
661
678
  daySummary: daySummaryRequestSchema,
662
679
  capsuleExport: capsuleExportRequestSchema,
@@ -0,0 +1,46 @@
1
+ import type { CodingScopedWriteInput } from "./access-service.js";
2
+
3
+
4
+ export interface EngramAccessLcmCompactionFlushRequest extends CodingScopedWriteInput {
5
+ sessionKey: string;
6
+ namespace?: string;
7
+ authenticatedPrincipal?: string;
8
+ }
9
+
10
+ export interface EngramAccessLcmCompactionFlushResponse {
11
+ enabled: boolean;
12
+ flushed: boolean;
13
+ sessionKey: string;
14
+ namespace: string;
15
+ reason?: string;
16
+ }
17
+
18
+ export interface EngramAccessExtractionForceFlushRequest extends CodingScopedWriteInput {
19
+ sessionKey: string;
20
+ namespace?: string;
21
+ authenticatedPrincipal?: string;
22
+ deadlineMs?: number;
23
+ abortSignal?: AbortSignal;
24
+ /** Internal HTTP hook invoked at the durable commit boundary. */
25
+ onCommitted?: () => void;
26
+ }
27
+
28
+ export interface EngramAccessExtractionForceFlushResponse {
29
+ flushed: boolean;
30
+ sessionKey: string;
31
+ namespace: string;
32
+ effectiveNamespace: string;
33
+ }
34
+
35
+ export interface ExtractionForceFlushDelegate {
36
+ extractionForceFlush(
37
+ request: EngramAccessExtractionForceFlushRequest,
38
+ ): Promise<EngramAccessExtractionForceFlushResponse>;
39
+ }
40
+
41
+ export function delegateExtractionForceFlush(
42
+ delegate: ExtractionForceFlushDelegate,
43
+ request: EngramAccessExtractionForceFlushRequest,
44
+ ): Promise<EngramAccessExtractionForceFlushResponse> {
45
+ return delegate.extractionForceFlush(request);
46
+ }