@remnic/core 10.0.69 → 10.0.71

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 (412) hide show
  1. package/dist/access-admin-ops-surface.js +82 -79
  2. package/dist/access-authorization-probe.js +83 -80
  3. package/dist/access-boundary.js +82 -79
  4. package/dist/access-cli.js +196 -193
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +82 -79
  7. package/dist/access-http-briefing.js +83 -80
  8. package/dist/access-http-query.js +84 -81
  9. package/dist/access-http.js +106 -103
  10. package/dist/access-identity-continuity-surface.js +82 -79
  11. package/dist/access-lcm-surface.js +82 -79
  12. package/dist/access-mcp.js +95 -92
  13. package/dist/access-namespace-preflight.js +82 -79
  14. package/dist/access-observe-lcm-archive.d.ts +5 -0
  15. package/dist/access-observe-lcm-archive.d.ts.map +1 -0
  16. package/dist/access-observe-lcm-archive.js +9 -0
  17. package/dist/access-observe-objective-state.d.ts +8 -0
  18. package/dist/access-observe-objective-state.d.ts.map +1 -0
  19. package/dist/access-observe-objective-state.js +17 -0
  20. package/dist/access-observe-stage-timing.d.ts +11 -0
  21. package/dist/access-observe-stage-timing.d.ts.map +1 -0
  22. package/dist/access-observe-stage-timing.js +9 -0
  23. package/dist/access-observe-stage-timing.js.map +1 -0
  24. package/dist/access-observe-write-category.js +13 -13
  25. package/dist/access-observe-write-surface.d.ts.map +1 -1
  26. package/dist/access-observe-write-surface.js +82 -79
  27. package/dist/access-offline-manifest.js +8 -8
  28. package/dist/access-operations-batch.js +85 -82
  29. package/dist/access-operations.js +92 -89
  30. package/dist/access-recall-concurrency.js +82 -79
  31. package/dist/access-recall-response.js +82 -79
  32. package/dist/access-recall-surface.js +82 -79
  33. package/dist/access-schema.js +12 -12
  34. package/dist/access-service.d.ts +1 -0
  35. package/dist/access-service.d.ts.map +1 -1
  36. package/dist/access-service.js +82 -79
  37. package/dist/access-surface-catalog.js +84 -81
  38. package/dist/access-surface-catalog.js.map +1 -1
  39. package/dist/active-recall.js +26 -26
  40. package/dist/adapters/index.js +4 -4
  41. package/dist/adapters/registry.js +2 -2
  42. package/dist/briefing.js +17 -17
  43. package/dist/buffer-turn-helpers.d.ts +10 -1
  44. package/dist/buffer-turn-helpers.d.ts.map +1 -1
  45. package/dist/buffer-turn-helpers.js +3 -1
  46. package/dist/buffer.d.ts +4 -0
  47. package/dist/buffer.d.ts.map +1 -1
  48. package/dist/buffer.js +9 -9
  49. package/dist/calibration.js +4 -4
  50. package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
  51. package/dist/capsule-crypto-7FJQINUR.js.map +1 -0
  52. package/dist/causal-behavior.js +2 -2
  53. package/dist/causal-chain.js +2 -2
  54. package/dist/causal-consolidation.js +22 -22
  55. package/dist/causal-retrieval.js +2 -2
  56. package/dist/causal-trajectory-graph.js +3 -3
  57. package/dist/causal-trajectory.js +1 -1
  58. package/dist/{chunk-6WKWL53V.js → chunk-23BA3USG.js} +128 -122
  59. package/dist/chunk-23BA3USG.js.map +1 -0
  60. package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
  61. package/dist/{chunk-CI3MAAIY.js → chunk-2R44BBPK.js} +2 -2
  62. package/dist/{chunk-QDZWQBLU.js → chunk-2R7OCBRR.js} +2 -2
  63. package/dist/{chunk-B3MWELZ3.js → chunk-2WPWEVAH.js} +2 -2
  64. package/dist/{chunk-PLCYKAWH.js → chunk-3ICAWZUU.js} +4 -4
  65. package/dist/{chunk-R4ZHF4K2.js → chunk-43FLJLT2.js} +4 -4
  66. package/dist/{chunk-PMDOGXA2.js → chunk-4PMFSYH7.js} +2 -2
  67. package/dist/{chunk-HXFIILGF.js → chunk-4RASUAN3.js} +4 -4
  68. package/dist/{chunk-EI6M5NVK.js → chunk-5JBVPJCT.js} +2 -2
  69. package/dist/{chunk-4NV7O76Q.js → chunk-5ORJHH43.js} +2 -2
  70. package/dist/{chunk-74AY3S7U.js → chunk-5RW247F5.js} +10 -10
  71. package/dist/{chunk-4XINO77L.js → chunk-66JOLMWS.js} +2 -2
  72. package/dist/{chunk-AYJQ644F.js → chunk-6KBCUIZP.js} +2 -2
  73. package/dist/{chunk-GKL6QYZO.js → chunk-6L63IN3M.js} +1 -1
  74. package/dist/{chunk-OPFVXM2D.js → chunk-7P5VBRBS.js} +2 -2
  75. package/dist/{chunk-4SOWMA55.js → chunk-7WFY2L5J.js} +3 -3
  76. package/dist/{chunk-GJ4HU6LK.js → chunk-AGRMXXVA.js} +2 -2
  77. package/dist/{chunk-KOLJJN5G.js → chunk-AQNHEDXP.js} +11 -4
  78. package/dist/chunk-AQNHEDXP.js.map +1 -0
  79. package/dist/{chunk-IVUVQPTQ.js → chunk-AZNE2H6D.js} +2 -2
  80. package/dist/{chunk-HPB5TF55.js → chunk-BCBY5GYZ.js} +3 -3
  81. package/dist/{chunk-M4IEZGCK.js → chunk-BFBS7OFQ.js} +7 -7
  82. package/dist/{chunk-4PG5R6BJ.js → chunk-BNU5TQLR.js} +2 -2
  83. package/dist/{chunk-TVE7W67N.js → chunk-BTU77RB5.js} +2 -2
  84. package/dist/{chunk-H6VJSITJ.js → chunk-CIL4GHMD.js} +3 -3
  85. package/dist/{chunk-KZZ5EZ7O.js → chunk-DC3DWF2M.js} +2 -2
  86. package/dist/{chunk-R2BIVU2Z.js → chunk-DE4U5PTV.js} +50 -46
  87. package/dist/chunk-DE4U5PTV.js.map +1 -0
  88. package/dist/{chunk-DDBB55L2.js → chunk-DSSTOV5M.js} +534 -361
  89. package/dist/chunk-DSSTOV5M.js.map +1 -0
  90. package/dist/{chunk-4MPAKYZU.js → chunk-EGKDONTC.js} +12 -6
  91. package/dist/chunk-EGKDONTC.js.map +1 -0
  92. package/dist/{chunk-AUFPPBC3.js → chunk-ENPJX3BB.js} +3 -3
  93. package/dist/{chunk-CTH2CQCB.js → chunk-EQ6EMJRG.js} +2 -2
  94. package/dist/{chunk-63A2BU2B.js → chunk-F4ZHKDBW.js} +5 -5
  95. package/dist/{chunk-3LBDEGQA.js → chunk-FDUCIUQ5.js} +2 -2
  96. package/dist/{chunk-OCK4D5PC.js → chunk-FGGLVCHI.js} +2 -2
  97. package/dist/{chunk-XVZA6VXC.js → chunk-FZVROZKC.js} +4 -4
  98. package/dist/{chunk-3RHU5MD7.js → chunk-GXAZ4Q2S.js} +2 -2
  99. package/dist/{chunk-UVVFPCPX.js → chunk-H2X32F2K.js} +2 -2
  100. package/dist/{chunk-645WOU5I.js → chunk-H7BZBSP6.js} +4 -4
  101. package/dist/{chunk-W7K5BP3M.js → chunk-HQPFACXO.js} +2 -2
  102. package/dist/{chunk-TECK5IVY.js → chunk-HZNURRDS.js} +2 -2
  103. package/dist/{chunk-U2CAGMUD.js → chunk-ICBUTKLL.js} +2 -2
  104. package/dist/{chunk-B4DXREWC.js → chunk-IQXQ3KWR.js} +2 -2
  105. package/dist/{chunk-AL3TCNSJ.js → chunk-J6GZ2254.js} +4 -4
  106. package/dist/{chunk-5MGKGEL7.js → chunk-J72ZY7NU.js} +2 -2
  107. package/dist/{chunk-OH55F76C.js → chunk-JEX2JL3U.js} +2 -2
  108. package/dist/{chunk-Y3XPSGNF.js → chunk-JGLZ46JS.js} +2 -2
  109. package/dist/{chunk-EXQJMFRF.js → chunk-JY4LXMZR.js} +2 -2
  110. package/dist/{chunk-6P7U3HWG.js → chunk-K36RMINQ.js} +3 -3
  111. package/dist/{chunk-BUKK5SWA.js → chunk-KQAFEZQX.js} +2 -2
  112. package/dist/{chunk-LN4X2NDA.js → chunk-KY3KJUNN.js} +10 -10
  113. package/dist/chunk-L3E7MLMK.js +20 -0
  114. package/dist/chunk-L3E7MLMK.js.map +1 -0
  115. package/dist/{chunk-H5DIRCZP.js → chunk-LHMCZ6VW.js} +18 -18
  116. package/dist/{chunk-GGD2YDS6.js → chunk-LN7CWLAU.js} +2 -2
  117. package/dist/{chunk-GHHQLSSY.js → chunk-LYOCAUI6.js} +3 -3
  118. package/dist/{chunk-VA3GNAWQ.js → chunk-LZIOY7ZU.js} +4 -5
  119. package/dist/chunk-LZIOY7ZU.js.map +1 -0
  120. package/dist/{chunk-W26D2USW.js → chunk-MUH7RR6T.js} +6 -6
  121. package/dist/{chunk-IAGVM7EY.js → chunk-N2Y6COEM.js} +2 -2
  122. package/dist/{chunk-64JLBFCQ.js → chunk-N7NAGECH.js} +2 -2
  123. package/dist/{chunk-5Y6VA6X2.js → chunk-OGQGDOYK.js} +2 -2
  124. package/dist/{chunk-U7MIMS2Y.js → chunk-OUBEJWVI.js} +17 -1
  125. package/dist/chunk-OUBEJWVI.js.map +1 -0
  126. package/dist/{chunk-JLMOH5JA.js → chunk-OWZXDBV4.js} +2 -2
  127. package/dist/{chunk-ZORS5BG5.js → chunk-PJAMFIDE.js} +10 -10
  128. package/dist/chunk-QCFZDYYG.js +34 -0
  129. package/dist/chunk-QCFZDYYG.js.map +1 -0
  130. package/dist/{chunk-SXTVZ6JL.js → chunk-QIOQI7QZ.js} +2 -2
  131. package/dist/{chunk-MMCO4SRG.js → chunk-QNN4FYBD.js} +19 -11
  132. package/dist/chunk-QNN4FYBD.js.map +1 -0
  133. package/dist/{chunk-75DCOS6I.js → chunk-QUPTDKSX.js} +67 -67
  134. package/dist/{chunk-HH73M65H.js → chunk-QVZZE6VH.js} +3 -3
  135. package/dist/{chunk-XWE3EOWX.js → chunk-RZED7FAU.js} +2 -2
  136. package/dist/{chunk-IZBIDPMY.js → chunk-S37O4S6E.js} +2 -2
  137. package/dist/{chunk-NHWDTOBN.js → chunk-S73ZVU37.js} +21 -21
  138. package/dist/{chunk-YSATDEBY.js → chunk-SBRUTD5O.js} +5 -5
  139. package/dist/{chunk-WVP2I6C5.js → chunk-SDL22RRW.js} +50 -11
  140. package/dist/chunk-SDL22RRW.js.map +1 -0
  141. package/dist/{chunk-PRKNAIGZ.js → chunk-T6T2RMWW.js} +5 -5
  142. package/dist/{chunk-CIEEYVUB.js → chunk-TPX7XXY4.js} +2 -2
  143. package/dist/{chunk-L334PSLW.js → chunk-U2A56LLF.js} +8 -8
  144. package/dist/{chunk-P4TV3TQ2.js → chunk-U6IL4724.js} +5 -5
  145. package/dist/{chunk-5UM4H64E.js → chunk-UAOJVQXC.js} +2 -2
  146. package/dist/{chunk-MOIJWWNA.js → chunk-UE5JYPU6.js} +13 -13
  147. package/dist/{chunk-TGQW3AMK.js → chunk-UIFWZMO7.js} +23 -23
  148. package/dist/{chunk-UW6LBFYN.js → chunk-USX5YIKB.js} +6 -6
  149. package/dist/{chunk-QGFR73SN.js → chunk-VK5HKVQ7.js} +2 -2
  150. package/dist/{chunk-ZOBYTRBU.js → chunk-VNTQU6KB.js} +47 -2
  151. package/dist/chunk-VNTQU6KB.js.map +1 -0
  152. package/dist/{chunk-IHCXMYSE.js → chunk-VPEIWMUT.js} +2 -2
  153. package/dist/{chunk-O5ZINWW3.js → chunk-VSJ3ARFS.js} +2 -2
  154. package/dist/{chunk-RLVI2M5Q.js → chunk-W4V7P5HP.js} +2 -2
  155. package/dist/{chunk-ELHJK7LM.js → chunk-WBN66HPI.js} +6 -6
  156. package/dist/{chunk-BJLCV2P3.js → chunk-WGRAB3KB.js} +2 -2
  157. package/dist/{chunk-5KDDAQ6K.js → chunk-WN2DASTS.js} +10 -10
  158. package/dist/{chunk-IG3EZ3TF.js → chunk-WNQ3B3Q5.js} +2 -2
  159. package/dist/{chunk-V6SBA5O7.js → chunk-WYOHQJKC.js} +7 -7
  160. package/dist/chunk-WZU5AGO6.js +38 -0
  161. package/dist/chunk-WZU5AGO6.js.map +1 -0
  162. package/dist/{chunk-WHROVQ5Q.js → chunk-X4DHAXFO.js} +3 -3
  163. package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
  164. package/dist/{chunk-JLGBJ4AX.js → chunk-XPZM7GP6.js} +10 -10
  165. package/dist/{chunk-64S6X4IU.js → chunk-XTN54NML.js} +4 -4
  166. package/dist/{chunk-UYUFDTIX.js → chunk-YIXWY4OZ.js} +2 -2
  167. package/dist/{chunk-NCZGGGWI.js → chunk-YPYSC3TX.js} +12 -12
  168. package/dist/{chunk-AVGDYYMA.js → chunk-ZBET3W26.js} +3 -3
  169. package/dist/{chunk-Y7427SL7.js → chunk-ZG4GNPRE.js} +216 -50
  170. package/dist/chunk-ZG4GNPRE.js.map +1 -0
  171. package/dist/chunk-ZODKV27J.js +443 -0
  172. package/dist/chunk-ZODKV27J.js.map +1 -0
  173. package/dist/cli.js +133 -130
  174. package/dist/coding/export-okf-codegraph.js +16 -16
  175. package/dist/coding/pre-action-gate.js +2 -2
  176. package/dist/compounding/engine.js +18 -18
  177. package/dist/config.js +26 -26
  178. package/dist/connectors/codex-materialize-runner.js +19 -19
  179. package/dist/connectors/codex-materialize.js +2 -2
  180. package/dist/connectors/index.js +20 -20
  181. package/dist/consolidation-provenance-check.js +2 -2
  182. package/dist/convergence-refresh.js +20 -20
  183. package/dist/corpus-watermark.js +20 -20
  184. package/dist/deep-recall-http-glue.js +13 -13
  185. package/dist/deep-recall.js +2 -2
  186. package/dist/embedding-fallback.js +2 -2
  187. package/dist/entity-retrieval.js +20 -20
  188. package/dist/event-order-recall.js +2 -2
  189. package/dist/external-wiki-access.js +83 -80
  190. package/dist/extraction-span-materialize.js +2 -2
  191. package/dist/extraction-window-drain.d.ts.map +1 -1
  192. package/dist/extraction-window-drain.js +1 -1
  193. package/dist/extraction.js +32 -32
  194. package/dist/{graph-edge-decay-OEX5OGMI.js → graph-edge-decay-CXTNJ7IQ.js} +6 -6
  195. package/dist/graph-edge-decay-CXTNJ7IQ.js.map +1 -0
  196. package/dist/graph-jsonl.js +4 -4
  197. package/dist/graph-snapshot.js +4 -4
  198. package/dist/graph.js +3 -3
  199. package/dist/harmonic-retrieval.js +17 -17
  200. package/dist/index.js +281 -278
  201. package/dist/lcm/archive.d.ts +12 -2
  202. package/dist/lcm/archive.d.ts.map +1 -1
  203. package/dist/lcm/archive.js +2 -2
  204. package/dist/lcm/engine.d.ts +59 -8
  205. package/dist/lcm/engine.d.ts.map +1 -1
  206. package/dist/lcm/engine.js +6 -6
  207. package/dist/lcm/index.js +16 -16
  208. package/dist/lcm/queue.d.ts +7 -3
  209. package/dist/lcm/queue.d.ts.map +1 -1
  210. package/dist/lcm/queue.js +1 -1
  211. package/dist/lcm/summarizer.d.ts +8 -1
  212. package/dist/lcm/summarizer.d.ts.map +1 -1
  213. package/dist/lcm/summarizer.js +3 -3
  214. package/dist/local-llm.js +4 -4
  215. package/dist/location/index.js +19 -19
  216. package/dist/maintenance/memory-governance.js +18 -18
  217. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +17 -17
  218. package/dist/maintenance/rebuild-memory-projection-runner.js +20 -20
  219. package/dist/maintenance/rebuild-memory-projection.js +19 -19
  220. package/dist/memory-browse-operations.js +83 -80
  221. package/dist/memory-browse.js +6 -6
  222. package/dist/namespaces/migrate.js +18 -18
  223. package/dist/namespaces/search.js +7 -7
  224. package/dist/namespaces/storage.js +17 -17
  225. package/dist/offline-sync-changeset-generations.js +5 -5
  226. package/dist/offline-sync-embedding-generation.js +4 -4
  227. package/dist/offline-sync-snapshot-stream.js +7 -7
  228. package/dist/offline-sync.js +9 -9
  229. package/dist/operator-doctor-corpus.js +21 -21
  230. package/dist/operator-toolkit.js +41 -41
  231. package/dist/orchestration/backlog-scheduler.d.ts +151 -0
  232. package/dist/orchestration/backlog-scheduler.d.ts.map +1 -0
  233. package/dist/orchestration/backlog-scheduler.js +891 -0
  234. package/dist/orchestration/backlog-scheduler.js.map +1 -0
  235. package/dist/orchestration/buffer-drain-runner.d.ts +31 -27
  236. package/dist/orchestration/buffer-drain-runner.d.ts.map +1 -1
  237. package/dist/orchestration/buffer-drain-runner.js +202 -404
  238. package/dist/orchestration/buffer-drain-runner.js.map +1 -1
  239. package/dist/orchestration/extraction-drain.d.ts +50 -17
  240. package/dist/orchestration/extraction-drain.d.ts.map +1 -1
  241. package/dist/orchestration/extraction-queue-coordinator.d.ts +19 -1
  242. package/dist/orchestration/extraction-queue-coordinator.d.ts.map +1 -1
  243. package/dist/orchestration/extraction-run.d.ts +8 -0
  244. package/dist/orchestration/extraction-run.d.ts.map +1 -1
  245. package/dist/orchestration/extraction-task-queueing.d.ts +44 -0
  246. package/dist/orchestration/extraction-task-queueing.d.ts.map +1 -0
  247. package/dist/orchestration/maintenance.js +33 -33
  248. package/dist/orchestration/turn-ingestion.d.ts +11 -5
  249. package/dist/orchestration/turn-ingestion.d.ts.map +1 -1
  250. package/dist/orchestrator.d.ts +13 -0
  251. package/dist/orchestrator.d.ts.map +1 -1
  252. package/dist/orchestrator.js +196 -193
  253. package/dist/qmd.js +4 -4
  254. package/dist/recall-navigation-operations.js +83 -80
  255. package/dist/recall-navigation.js +82 -79
  256. package/dist/recall-state-view-admission.js +6 -6
  257. package/dist/recall-why-service.js +6 -6
  258. package/dist/resume-bundles.js +29 -29
  259. package/dist/search/factory.js +6 -6
  260. package/dist/search/index.js +12 -12
  261. package/dist/semantic-consolidation.js +25 -25
  262. package/dist/semantic-rule-promotion.js +17 -17
  263. package/dist/semantic-rule-verifier.js +17 -17
  264. package/dist/source-agent-qualifier.js +24 -24
  265. package/dist/standup/build.js +17 -17
  266. package/dist/storage/buffer-drain-claims.d.ts +15 -0
  267. package/dist/storage/buffer-drain-claims.d.ts.map +1 -1
  268. package/dist/storage/buffer-drain-claims.js +2 -2
  269. package/dist/storage/buffer-session-files.js +2 -2
  270. package/dist/storage.js +16 -16
  271. package/dist/summarizer.js +6 -6
  272. package/dist/support-passport/index.js +85 -82
  273. package/dist/transfer/backup.js +2 -2
  274. package/dist/transfer/capsule-export.js +2 -2
  275. package/dist/transfer/capsule-import.js +2 -2
  276. package/dist/transfer/export-okf.js +17 -17
  277. package/dist/verified-recall.js +17 -17
  278. package/dist/who-knows-cli.js +18 -18
  279. package/dist/who-knows.js +17 -17
  280. package/package.json +12 -2
  281. package/src/access-observe-lcm-archive.ts +30 -0
  282. package/src/access-observe-lcm-fail-closed.test.ts +118 -0
  283. package/src/access-observe-objective-state.ts +40 -0
  284. package/src/access-observe-stage-timing.test.ts +246 -0
  285. package/src/access-observe-stage-timing.ts +58 -0
  286. package/src/access-observe-write-surface.ts +45 -45
  287. package/src/access-service.ts +1 -0
  288. package/src/backlog-scheduler.test.ts +806 -0
  289. package/src/buffer-drain-handover.test.ts +363 -18
  290. package/src/buffer-drain-inprocess.test.ts +355 -0
  291. package/src/buffer-drain-model-boundary.test.ts +1062 -0
  292. package/src/buffer-drop-extraction-chunk.test.ts +237 -22
  293. package/src/buffer-turn-helpers.ts +26 -1
  294. package/src/buffer.ts +8 -0
  295. package/src/extraction-window-drain.ts +7 -7
  296. package/src/lcm/archive.ts +59 -7
  297. package/src/lcm/engine.ts +256 -53
  298. package/src/lcm/queue.test.ts +32 -14
  299. package/src/lcm/queue.ts +24 -16
  300. package/src/lcm/summarizer.ts +15 -2
  301. package/src/lcm-durability.test.ts +856 -0
  302. package/src/lcm-engine.test.ts +12 -3
  303. package/src/orchestration/backlog-scheduler.ts +481 -0
  304. package/src/orchestration/buffer-drain-runner.ts +545 -180
  305. package/src/orchestration/extraction-drain.ts +287 -108
  306. package/src/orchestration/extraction-queue-coordinator.ts +51 -3
  307. package/src/orchestration/extraction-run.test.ts +41 -0
  308. package/src/orchestration/extraction-run.ts +24 -5
  309. package/src/orchestration/extraction-task-queueing.ts +87 -0
  310. package/src/orchestration/turn-ingestion.ts +46 -59
  311. package/src/orchestrator-extraction-queue.test.ts +46 -2
  312. package/src/orchestrator-flush.test.ts +4 -1
  313. package/src/orchestrator.ts +47 -21
  314. package/src/storage/buffer-drain-claims.ts +55 -0
  315. package/dist/chunk-4MPAKYZU.js.map +0 -1
  316. package/dist/chunk-6WKWL53V.js.map +0 -1
  317. package/dist/chunk-DDBB55L2.js.map +0 -1
  318. package/dist/chunk-KOLJJN5G.js.map +0 -1
  319. package/dist/chunk-MMCO4SRG.js.map +0 -1
  320. package/dist/chunk-R2BIVU2Z.js.map +0 -1
  321. package/dist/chunk-U7MIMS2Y.js.map +0 -1
  322. package/dist/chunk-VA3GNAWQ.js.map +0 -1
  323. package/dist/chunk-WVP2I6C5.js.map +0 -1
  324. package/dist/chunk-Y7427SL7.js.map +0 -1
  325. package/dist/chunk-ZOBYTRBU.js.map +0 -1
  326. /package/dist/{capsule-crypto-GWVG7LGC.js.map → access-observe-lcm-archive.js.map} +0 -0
  327. /package/dist/{graph-edge-decay-OEX5OGMI.js.map → access-observe-objective-state.js.map} +0 -0
  328. /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
  329. /package/dist/{chunk-CI3MAAIY.js.map → chunk-2R44BBPK.js.map} +0 -0
  330. /package/dist/{chunk-QDZWQBLU.js.map → chunk-2R7OCBRR.js.map} +0 -0
  331. /package/dist/{chunk-B3MWELZ3.js.map → chunk-2WPWEVAH.js.map} +0 -0
  332. /package/dist/{chunk-PLCYKAWH.js.map → chunk-3ICAWZUU.js.map} +0 -0
  333. /package/dist/{chunk-R4ZHF4K2.js.map → chunk-43FLJLT2.js.map} +0 -0
  334. /package/dist/{chunk-PMDOGXA2.js.map → chunk-4PMFSYH7.js.map} +0 -0
  335. /package/dist/{chunk-HXFIILGF.js.map → chunk-4RASUAN3.js.map} +0 -0
  336. /package/dist/{chunk-EI6M5NVK.js.map → chunk-5JBVPJCT.js.map} +0 -0
  337. /package/dist/{chunk-4NV7O76Q.js.map → chunk-5ORJHH43.js.map} +0 -0
  338. /package/dist/{chunk-74AY3S7U.js.map → chunk-5RW247F5.js.map} +0 -0
  339. /package/dist/{chunk-4XINO77L.js.map → chunk-66JOLMWS.js.map} +0 -0
  340. /package/dist/{chunk-AYJQ644F.js.map → chunk-6KBCUIZP.js.map} +0 -0
  341. /package/dist/{chunk-GKL6QYZO.js.map → chunk-6L63IN3M.js.map} +0 -0
  342. /package/dist/{chunk-OPFVXM2D.js.map → chunk-7P5VBRBS.js.map} +0 -0
  343. /package/dist/{chunk-4SOWMA55.js.map → chunk-7WFY2L5J.js.map} +0 -0
  344. /package/dist/{chunk-GJ4HU6LK.js.map → chunk-AGRMXXVA.js.map} +0 -0
  345. /package/dist/{chunk-IVUVQPTQ.js.map → chunk-AZNE2H6D.js.map} +0 -0
  346. /package/dist/{chunk-HPB5TF55.js.map → chunk-BCBY5GYZ.js.map} +0 -0
  347. /package/dist/{chunk-M4IEZGCK.js.map → chunk-BFBS7OFQ.js.map} +0 -0
  348. /package/dist/{chunk-4PG5R6BJ.js.map → chunk-BNU5TQLR.js.map} +0 -0
  349. /package/dist/{chunk-TVE7W67N.js.map → chunk-BTU77RB5.js.map} +0 -0
  350. /package/dist/{chunk-H6VJSITJ.js.map → chunk-CIL4GHMD.js.map} +0 -0
  351. /package/dist/{chunk-KZZ5EZ7O.js.map → chunk-DC3DWF2M.js.map} +0 -0
  352. /package/dist/{chunk-AUFPPBC3.js.map → chunk-ENPJX3BB.js.map} +0 -0
  353. /package/dist/{chunk-CTH2CQCB.js.map → chunk-EQ6EMJRG.js.map} +0 -0
  354. /package/dist/{chunk-63A2BU2B.js.map → chunk-F4ZHKDBW.js.map} +0 -0
  355. /package/dist/{chunk-3LBDEGQA.js.map → chunk-FDUCIUQ5.js.map} +0 -0
  356. /package/dist/{chunk-OCK4D5PC.js.map → chunk-FGGLVCHI.js.map} +0 -0
  357. /package/dist/{chunk-XVZA6VXC.js.map → chunk-FZVROZKC.js.map} +0 -0
  358. /package/dist/{chunk-3RHU5MD7.js.map → chunk-GXAZ4Q2S.js.map} +0 -0
  359. /package/dist/{chunk-UVVFPCPX.js.map → chunk-H2X32F2K.js.map} +0 -0
  360. /package/dist/{chunk-645WOU5I.js.map → chunk-H7BZBSP6.js.map} +0 -0
  361. /package/dist/{chunk-W7K5BP3M.js.map → chunk-HQPFACXO.js.map} +0 -0
  362. /package/dist/{chunk-TECK5IVY.js.map → chunk-HZNURRDS.js.map} +0 -0
  363. /package/dist/{chunk-U2CAGMUD.js.map → chunk-ICBUTKLL.js.map} +0 -0
  364. /package/dist/{chunk-B4DXREWC.js.map → chunk-IQXQ3KWR.js.map} +0 -0
  365. /package/dist/{chunk-AL3TCNSJ.js.map → chunk-J6GZ2254.js.map} +0 -0
  366. /package/dist/{chunk-5MGKGEL7.js.map → chunk-J72ZY7NU.js.map} +0 -0
  367. /package/dist/{chunk-OH55F76C.js.map → chunk-JEX2JL3U.js.map} +0 -0
  368. /package/dist/{chunk-Y3XPSGNF.js.map → chunk-JGLZ46JS.js.map} +0 -0
  369. /package/dist/{chunk-EXQJMFRF.js.map → chunk-JY4LXMZR.js.map} +0 -0
  370. /package/dist/{chunk-6P7U3HWG.js.map → chunk-K36RMINQ.js.map} +0 -0
  371. /package/dist/{chunk-BUKK5SWA.js.map → chunk-KQAFEZQX.js.map} +0 -0
  372. /package/dist/{chunk-LN4X2NDA.js.map → chunk-KY3KJUNN.js.map} +0 -0
  373. /package/dist/{chunk-H5DIRCZP.js.map → chunk-LHMCZ6VW.js.map} +0 -0
  374. /package/dist/{chunk-GGD2YDS6.js.map → chunk-LN7CWLAU.js.map} +0 -0
  375. /package/dist/{chunk-GHHQLSSY.js.map → chunk-LYOCAUI6.js.map} +0 -0
  376. /package/dist/{chunk-W26D2USW.js.map → chunk-MUH7RR6T.js.map} +0 -0
  377. /package/dist/{chunk-IAGVM7EY.js.map → chunk-N2Y6COEM.js.map} +0 -0
  378. /package/dist/{chunk-64JLBFCQ.js.map → chunk-N7NAGECH.js.map} +0 -0
  379. /package/dist/{chunk-5Y6VA6X2.js.map → chunk-OGQGDOYK.js.map} +0 -0
  380. /package/dist/{chunk-JLMOH5JA.js.map → chunk-OWZXDBV4.js.map} +0 -0
  381. /package/dist/{chunk-ZORS5BG5.js.map → chunk-PJAMFIDE.js.map} +0 -0
  382. /package/dist/{chunk-SXTVZ6JL.js.map → chunk-QIOQI7QZ.js.map} +0 -0
  383. /package/dist/{chunk-75DCOS6I.js.map → chunk-QUPTDKSX.js.map} +0 -0
  384. /package/dist/{chunk-HH73M65H.js.map → chunk-QVZZE6VH.js.map} +0 -0
  385. /package/dist/{chunk-XWE3EOWX.js.map → chunk-RZED7FAU.js.map} +0 -0
  386. /package/dist/{chunk-IZBIDPMY.js.map → chunk-S37O4S6E.js.map} +0 -0
  387. /package/dist/{chunk-NHWDTOBN.js.map → chunk-S73ZVU37.js.map} +0 -0
  388. /package/dist/{chunk-YSATDEBY.js.map → chunk-SBRUTD5O.js.map} +0 -0
  389. /package/dist/{chunk-PRKNAIGZ.js.map → chunk-T6T2RMWW.js.map} +0 -0
  390. /package/dist/{chunk-CIEEYVUB.js.map → chunk-TPX7XXY4.js.map} +0 -0
  391. /package/dist/{chunk-L334PSLW.js.map → chunk-U2A56LLF.js.map} +0 -0
  392. /package/dist/{chunk-P4TV3TQ2.js.map → chunk-U6IL4724.js.map} +0 -0
  393. /package/dist/{chunk-5UM4H64E.js.map → chunk-UAOJVQXC.js.map} +0 -0
  394. /package/dist/{chunk-MOIJWWNA.js.map → chunk-UE5JYPU6.js.map} +0 -0
  395. /package/dist/{chunk-TGQW3AMK.js.map → chunk-UIFWZMO7.js.map} +0 -0
  396. /package/dist/{chunk-UW6LBFYN.js.map → chunk-USX5YIKB.js.map} +0 -0
  397. /package/dist/{chunk-QGFR73SN.js.map → chunk-VK5HKVQ7.js.map} +0 -0
  398. /package/dist/{chunk-IHCXMYSE.js.map → chunk-VPEIWMUT.js.map} +0 -0
  399. /package/dist/{chunk-O5ZINWW3.js.map → chunk-VSJ3ARFS.js.map} +0 -0
  400. /package/dist/{chunk-RLVI2M5Q.js.map → chunk-W4V7P5HP.js.map} +0 -0
  401. /package/dist/{chunk-ELHJK7LM.js.map → chunk-WBN66HPI.js.map} +0 -0
  402. /package/dist/{chunk-BJLCV2P3.js.map → chunk-WGRAB3KB.js.map} +0 -0
  403. /package/dist/{chunk-5KDDAQ6K.js.map → chunk-WN2DASTS.js.map} +0 -0
  404. /package/dist/{chunk-IG3EZ3TF.js.map → chunk-WNQ3B3Q5.js.map} +0 -0
  405. /package/dist/{chunk-V6SBA5O7.js.map → chunk-WYOHQJKC.js.map} +0 -0
  406. /package/dist/{chunk-WHROVQ5Q.js.map → chunk-X4DHAXFO.js.map} +0 -0
  407. /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
  408. /package/dist/{chunk-JLGBJ4AX.js.map → chunk-XPZM7GP6.js.map} +0 -0
  409. /package/dist/{chunk-64S6X4IU.js.map → chunk-XTN54NML.js.map} +0 -0
  410. /package/dist/{chunk-UYUFDTIX.js.map → chunk-YIXWY4OZ.js.map} +0 -0
  411. /package/dist/{chunk-NCZGGGWI.js.map → chunk-YPYSC3TX.js.map} +0 -0
  412. /package/dist/{chunk-AVGDYYMA.js.map → chunk-ZBET3W26.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/access-observe-lcm-archive.ts"],"sourcesContent":["/**\n * LCM archival acceptance for the observe surface.\n *\n * The archive append is durable before this returns: the queue holds only a\n * session reference and summary DAGs are built in the background, so the\n * caller is never blocked on inference.\n *\n * An archive failure rejects the observe (fail closed). An acknowledged\n * observe must never lose its lossless copy: the client would not retry a\n * request it was told succeeded.\n */\nimport { log } from \"./logger.js\";\nimport type { LcmEngine } from \"./lcm/engine.js\";\nimport type { LcmObserveMessage } from \"./lcm/queue.js\";\n\n/** Archive the observed turns; returns false when LCM is off. */\nexport async function archiveObservedTurns(\n lcmEngine: LcmEngine | null,\n lcmSessionKey: string,\n messages: LcmObserveMessage[],\n): Promise<boolean> {\n if (!lcmEngine || !lcmEngine.enabled) return false;\n try {\n await lcmEngine.enqueueObserveMessages(lcmSessionKey, messages);\n return true;\n } catch (err) {\n log.error(`access-observe LCM archival failed: ${err}`);\n throw err;\n }\n}\n"],"mappings":";;;;;AAgBA,eAAsB,qBACpB,WACA,eACA,UACkB;AAClB,MAAI,CAAC,aAAa,CAAC,UAAU,QAAS,QAAO;AAC7C,MAAI;AACF,UAAM,UAAU,uBAAuB,eAAe,QAAQ;AAC9D,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QAAI,MAAM,uCAAuC,GAAG,EAAE;AACtD,UAAM;AAAA,EACR;AACF;","names":[]}
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  WearablesInputError
3
3
  } from "./chunk-V7IZKJI3.js";
4
- import {
5
- AdapterRegistry
6
- } from "./chunk-64S6X4IU.js";
7
4
  import {
8
5
  WriteRateLimiter
9
6
  } from "./chunk-TB6CBZ5V.js";
7
+ import {
8
+ AdapterRegistry
9
+ } from "./chunk-XTN54NML.js";
10
10
  import {
11
11
  maybeRespondRecallNavigation
12
12
  } from "./chunk-2TGIKMMZ.js";
@@ -18,13 +18,13 @@ import {
18
18
  } from "./chunk-3HSRWJTC.js";
19
19
  import {
20
20
  respondDeepRecall
21
- } from "./chunk-UYUFDTIX.js";
21
+ } from "./chunk-YIXWY4OZ.js";
22
22
  import {
23
23
  handleSupportPassportOwnerHttp
24
- } from "./chunk-SXTVZ6JL.js";
24
+ } from "./chunk-QIOQI7QZ.js";
25
25
  import {
26
26
  buildSupportPassportPublicRequestHandler
27
- } from "./chunk-GJ4HU6LK.js";
27
+ } from "./chunk-AGRMXXVA.js";
28
28
  import {
29
29
  handleMcpGetSse
30
30
  } from "./chunk-SRT6SHVZ.js";
@@ -37,14 +37,14 @@ import {
37
37
  processChatMessage,
38
38
  sessionBelongsToPrincipal,
39
39
  subscribeChatTranscript
40
- } from "./chunk-ZORS5BG5.js";
40
+ } from "./chunk-PJAMFIDE.js";
41
+ import {
42
+ RelayMissionStoreError
43
+ } from "./chunk-USX5YIKB.js";
41
44
  import {
42
45
  handleRecallWhyHttpQuery,
43
46
  handleRecallXrayHttpQuery
44
47
  } from "./chunk-ZXF3O7P4.js";
45
- import {
46
- RelayMissionStoreError
47
- } from "./chunk-UW6LBFYN.js";
48
48
  import {
49
49
  executeResolution,
50
50
  isValidResolutionVerb
@@ -61,10 +61,10 @@ import {
61
61
  optionalNamespaceKindQueryParam,
62
62
  optionalQueryString,
63
63
  positiveIntQueryParam
64
- } from "./chunk-JLMOH5JA.js";
64
+ } from "./chunk-OWZXDBV4.js";
65
65
  import {
66
66
  respondBriefingHttp
67
- } from "./chunk-B3MWELZ3.js";
67
+ } from "./chunk-2WPWEVAH.js";
68
68
  import {
69
69
  maybeHandleLifecycleFlush
70
70
  } from "./chunk-2BPPGNAQ.js";
@@ -75,14 +75,14 @@ import {
75
75
  authorizationProbeNamespaces,
76
76
  authorizationProbeRequiresPrincipalNamespace,
77
77
  probeOperationAuthorization
78
- } from "./chunk-PMDOGXA2.js";
78
+ } from "./chunk-4PMFSYH7.js";
79
79
  import {
80
80
  getOperation,
81
81
  resolveQueryNamespaceWritablePreflight
82
- } from "./chunk-6WKWL53V.js";
82
+ } from "./chunk-23BA3USG.js";
83
83
  import {
84
84
  handleWhoKnowsHttpQuery
85
- } from "./chunk-Y3XPSGNF.js";
85
+ } from "./chunk-JGLZ46JS.js";
86
86
  import {
87
87
  isTrustZoneName
88
88
  } from "./chunk-JWX2Q6HS.js";
@@ -105,7 +105,7 @@ import {
105
105
  } from "./chunk-V4XE263I.js";
106
106
  import {
107
107
  validateRequest
108
- } from "./chunk-H6VJSITJ.js";
108
+ } from "./chunk-CIL4GHMD.js";
109
109
  import {
110
110
  peerManifestRevision
111
111
  } from "./chunk-A7BM2JTH.js";
@@ -120,7 +120,7 @@ import {
120
120
  OFFLINE_SYNC_APPLY_MAX_BODY_BYTES,
121
121
  OFFLINE_SYNC_FILE_CONTENT_MAX_CHUNK_BYTES,
122
122
  OFFLINE_SYNC_SNAPSHOT_BASE_MAX_BODY_BYTES
123
- } from "./chunk-TGQW3AMK.js";
123
+ } from "./chunk-UIFWZMO7.js";
124
124
  import {
125
125
  resolveNamespaceCapabilities
126
126
  } from "./chunk-C5LWPYS3.js";
@@ -3573,4 +3573,4 @@ export {
3573
3573
  resolveDefaultAdminConsolePublicDir,
3574
3574
  EngramAccessHttpServer
3575
3575
  };
3576
- //# sourceMappingURL=chunk-H5DIRCZP.js.map
3576
+ //# sourceMappingURL=chunk-LHMCZ6VW.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS,
3
3
  SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES
4
- } from "./chunk-6WKWL53V.js";
4
+ } from "./chunk-23BA3USG.js";
5
5
  import {
6
6
  SUPPORT_PASSPORT_SOURCE_MEMORY_ID_MAX_LENGTH
7
7
  } from "./chunk-PWPIERBM.js";
@@ -343,4 +343,4 @@ export {
343
343
  parseSupportPassportModelJob,
344
344
  SupportPassportModelBridge
345
345
  };
346
- //# sourceMappingURL=chunk-GGD2YDS6.js.map
346
+ //# sourceMappingURL=chunk-LN7CWLAU.js.map
@@ -8,11 +8,11 @@ import {
8
8
  } from "./chunk-YUTT4ZTI.js";
9
9
  import {
10
10
  resolveDefaultNamespaceRoot
11
- } from "./chunk-5UM4H64E.js";
11
+ } from "./chunk-UAOJVQXC.js";
12
12
  import {
13
13
  StorageManager,
14
14
  readRawMemoryDocument
15
- } from "./chunk-NHWDTOBN.js";
15
+ } from "./chunk-S73ZVU37.js";
16
16
  import {
17
17
  parseContinuityImprovementLoops
18
18
  } from "./chunk-LDXUBPMO.js";
@@ -1869,4 +1869,4 @@ export {
1869
1869
  defaultTierMigrationCycleBudget,
1870
1870
  CompoundingEngine
1871
1871
  };
1872
- //# sourceMappingURL=chunk-GHHQLSSY.js.map
1872
+ //# sourceMappingURL=chunk-LYOCAUI6.js.map
@@ -20,14 +20,13 @@ function chunkExtractionWindow(turns, maxChars) {
20
20
  }
21
21
  var DRAIN_DEFERRAL_REASONS = {
22
22
  provider_circuit_open: true,
23
- extraction_backoff: true
23
+ extraction_backoff: true,
24
+ scope_profile_no_writable_layer: true
24
25
  };
25
26
  function classifyDrainResult(result) {
26
27
  if (result.status !== "skipped") return "drained";
27
- if (result.reason === "empty_extraction_result") {
28
- return result.retainedBuffer === true ? "failed" : "drained";
29
- }
30
28
  if (result.reason !== void 0 && result.reason in DRAIN_DEFERRAL_REASONS) return "deferred";
29
+ if (result.retainedBuffer === true) return "failed";
31
30
  return "drained";
32
31
  }
33
32
  function mergeDrainResults(previous, next) {
@@ -55,4 +54,4 @@ export {
55
54
  mergeDrainResults,
56
55
  extractionWindowBudgetChars
57
56
  };
58
- //# sourceMappingURL=chunk-VA3GNAWQ.js.map
57
+ //# sourceMappingURL=chunk-LZIOY7ZU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extraction-window-drain.ts"],"sourcesContent":["/**\n * Trigger-drain helpers (extraction trigger stall fix).\n *\n * A session whose buffered window outgrows the extraction model's context\n * never drains: the trigger fires `extract_batch` on every observe, the\n * oversized request fails, nothing is cleared, and the window only grows.\n * These helpers split such a window into budget-fitting chunks and classify\n * each extraction run so the caller can drain successes, defer on breaker/\n * backoff retention, and drop repeatedly failing chunks.\n */\n\nimport type { ExtractionRunResult } from \"./orchestration/extraction-run.js\";\n\n/**\n * Split `turns` into chunks whose summed content length stays within\n * `maxChars`. Chunks keep turn order and never split a turn; a single turn\n * longer than the budget becomes its own chunk (the extraction prompt still\n * clamps per-turn content). A non-positive or non-finite budget, or an empty\n * window, yields at most one chunk (no chunking).\n */\nexport function chunkExtractionWindow<T extends { content: string }>(\n turns: readonly T[],\n maxChars: number,\n): T[][] {\n if (turns.length === 0) return [];\n const budget =\n Number.isFinite(maxChars) && maxChars > 0 ? Math.floor(maxChars) : Number.POSITIVE_INFINITY;\n const chunks: T[][] = [];\n let current: T[] = [];\n let currentChars = 0;\n for (const turn of turns) {\n const turnChars = turn.content.length;\n if (current.length > 0 && currentChars + turnChars > budget) {\n chunks.push(current);\n current = [];\n currentChars = 0;\n }\n current.push(turn);\n currentChars += turnChars;\n }\n if (current.length > 0) chunks.push(current);\n return chunks;\n}\n\nexport type DrainVerdict = \"drained\" | \"deferred\" | \"failed\";\n\n/**\n * Run results that deliberately RETAIN the buffer (provider breaker open,\n * per-fingerprint backoff, a scope policy refusal) are deferrals, not chunk\n * failures — counting them would eventually drop good content that never got\n * its attempt.\n */\nconst DRAIN_DEFERRAL_REASONS = {\n provider_circuit_open: true,\n extraction_backoff: true,\n scope_profile_no_writable_layer: true,\n};\n\nexport function classifyDrainResult(result: ExtractionRunResult): DrainVerdict {\n if (result.status !== \"skipped\") return \"drained\";\n if (result.reason !== undefined && result.reason in DRAIN_DEFERRAL_REASONS) return \"deferred\";\n // A run that kept its window for retry did NOT consume the content: it is a\n // chunk failure, never a drain — even when the window was retained.\n if (result.retainedBuffer === true) return \"failed\";\n return \"drained\";\n}\n\n/**\n * Combine chunk results into the single `ExtractionRunResult` the queue\n * contract settles with: counts sum, any completed chunk completes the drain,\n * and the last non-completed reason wins.\n */\nexport function mergeDrainResults(\n previous: ExtractionRunResult | null,\n next: ExtractionRunResult,\n): ExtractionRunResult {\n if (previous === null) return next;\n const completed = previous.status === \"completed\" || next.status === \"completed\";\n const merged: ExtractionRunResult = {\n status: completed ? \"completed\" : \"skipped\",\n persistedCount: previous.persistedCount + next.persistedCount,\n durableOutputCount: previous.durableOutputCount + next.durableOutputCount,\n };\n if (!completed) merged.reason = next.reason ?? previous.reason;\n if (previous.postPersistMetadataFailed === true || next.postPersistMetadataFailed === true) {\n merged.postPersistMetadataFailed = true;\n }\n return merged;\n}\n\n/** The slice of ModelRegistry the drain budget needs. */\nexport interface WindowBudgetRegistry {\n calculateContextSizes(modelId: string, maxContextOverride?: number): { maxInputChars: number };\n}\n\n/**\n * Character budget for one extraction request. The learned local-model window\n * only describes the extractor when the local LLM does the extracting; with a\n * gateway extractor, a disabled local LLM, or no registry (legacy hosts, test\n * doubles) there is no budget and the window runs in one request as before.\n */\nexport function extractionWindowBudgetChars(input: {\n registry: WindowBudgetRegistry | undefined;\n localExtractionActive: boolean;\n model: string;\n maxContext: number | undefined;\n}): number {\n if (!input.registry || !input.localExtractionActive) return Number.POSITIVE_INFINITY;\n return input.registry.calculateContextSizes(input.model, input.maxContext).maxInputChars;\n}\n"],"mappings":";AAoBO,SAAS,sBACd,OACA,UACO;AACP,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAChC,QAAM,SACJ,OAAO,SAAS,QAAQ,KAAK,WAAW,IAAI,KAAK,MAAM,QAAQ,IAAI,OAAO;AAC5E,QAAM,SAAgB,CAAC;AACvB,MAAI,UAAe,CAAC;AACpB,MAAI,eAAe;AACnB,aAAW,QAAQ,OAAO;AACxB,UAAM,YAAY,KAAK,QAAQ;AAC/B,QAAI,QAAQ,SAAS,KAAK,eAAe,YAAY,QAAQ;AAC3D,aAAO,KAAK,OAAO;AACnB,gBAAU,CAAC;AACX,qBAAe;AAAA,IACjB;AACA,YAAQ,KAAK,IAAI;AACjB,oBAAgB;AAAA,EAClB;AACA,MAAI,QAAQ,SAAS,EAAG,QAAO,KAAK,OAAO;AAC3C,SAAO;AACT;AAUA,IAAM,yBAAyB;AAAA,EAC7B,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,iCAAiC;AACnC;AAEO,SAAS,oBAAoB,QAA2C;AAC7E,MAAI,OAAO,WAAW,UAAW,QAAO;AACxC,MAAI,OAAO,WAAW,UAAa,OAAO,UAAU,uBAAwB,QAAO;AAGnF,MAAI,OAAO,mBAAmB,KAAM,QAAO;AAC3C,SAAO;AACT;AAOO,SAAS,kBACd,UACA,MACqB;AACrB,MAAI,aAAa,KAAM,QAAO;AAC9B,QAAM,YAAY,SAAS,WAAW,eAAe,KAAK,WAAW;AACrE,QAAM,SAA8B;AAAA,IAClC,QAAQ,YAAY,cAAc;AAAA,IAClC,gBAAgB,SAAS,iBAAiB,KAAK;AAAA,IAC/C,oBAAoB,SAAS,qBAAqB,KAAK;AAAA,EACzD;AACA,MAAI,CAAC,UAAW,QAAO,SAAS,KAAK,UAAU,SAAS;AACxD,MAAI,SAAS,8BAA8B,QAAQ,KAAK,8BAA8B,MAAM;AAC1F,WAAO,4BAA4B;AAAA,EACrC;AACA,SAAO;AACT;AAaO,SAAS,4BAA4B,OAKjC;AACT,MAAI,CAAC,MAAM,YAAY,CAAC,MAAM,sBAAuB,QAAO,OAAO;AACnE,SAAO,MAAM,SAAS,sBAAsB,MAAM,OAAO,MAAM,UAAU,EAAE;AAC7E;","names":[]}
@@ -11,11 +11,7 @@ import {
11
11
  } from "./chunk-5MA7ZLPD.js";
12
12
  import {
13
13
  LocalLlmClient
14
- } from "./chunk-74AY3S7U.js";
15
- import {
16
- completeBackgroundGeneration,
17
- parseBackgroundGenerationJson
18
- } from "./chunk-KF7PQ7G2.js";
14
+ } from "./chunk-5RW247F5.js";
19
15
  import {
20
16
  FallbackLlmClient,
21
17
  gatewayTaskChainOptions
@@ -23,6 +19,10 @@ import {
23
19
  import {
24
20
  fallbackLlmRuntimeContextFromConfig
25
21
  } from "./chunk-YIJECSIX.js";
22
+ import {
23
+ completeBackgroundGeneration,
24
+ parseBackgroundGenerationJson
25
+ } from "./chunk-KF7PQ7G2.js";
26
26
  import {
27
27
  extractJsonCandidates
28
28
  } from "./chunk-YBA52OKG.js";
@@ -798,4 +798,4 @@ export {
798
798
  summarizeHourlyStatus,
799
799
  HourlySummarizer
800
800
  };
801
- //# sourceMappingURL=chunk-W26D2USW.js.map
801
+ //# sourceMappingURL=chunk-MUH7RR6T.js.map
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-EKUI7I2X.js";
11
11
  import {
12
12
  StorageManager
13
- } from "./chunk-NHWDTOBN.js";
13
+ } from "./chunk-S73ZVU37.js";
14
14
  import {
15
15
  normalizeEntityName
16
16
  } from "./chunk-YXZG5TVN.js";
@@ -974,4 +974,4 @@ export {
974
974
  resolveBriefingSaveDir,
975
975
  briefingFilename
976
976
  };
977
- //# sourceMappingURL=chunk-IAGVM7EY.js.map
977
+ //# sourceMappingURL=chunk-N2Y6COEM.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-DBB5JPSL.js";
4
4
  import {
5
5
  isGenericRecallExcludedPath
6
- } from "./chunk-BJLCV2P3.js";
6
+ } from "./chunk-WGRAB3KB.js";
7
7
  import {
8
8
  isChangeOrientedQuery
9
9
  } from "./chunk-EH3HNCAM.js";
@@ -69,4 +69,4 @@ export {
69
69
  filterRecentScanMemoriesForStateView,
70
70
  indexStateViewAnnotatedResults
71
71
  };
72
- //# sourceMappingURL=chunk-64JLBFCQ.js.map
72
+ //# sourceMappingURL=chunk-N7NAGECH.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-NHWDTOBN.js";
3
+ } from "./chunk-S73ZVU37.js";
4
4
  import {
5
5
  composeMemoryEnvelope
6
6
  } from "./chunk-JRVMCZE3.js";
@@ -546,4 +546,4 @@ export {
546
546
  setSemanticRulePromotionTestHooks,
547
547
  promoteSemanticRuleFromMemory
548
548
  };
549
- //# sourceMappingURL=chunk-5Y6VA6X2.js.map
549
+ //# sourceMappingURL=chunk-OGQGDOYK.js.map
@@ -85,6 +85,15 @@ function subtractBufferTurns(turns, drained) {
85
85
  }
86
86
  return kept;
87
87
  }
88
+ function bufferEntryCounts(state) {
89
+ const out = /* @__PURE__ */ new Map();
90
+ const entries = state.entries;
91
+ if (!entries) return out;
92
+ for (const [key, entry] of Object.entries(entries)) {
93
+ out.set(key, { turns: entry.turns.length, retainedTurns: entry.retainedTurns?.length ?? 0 });
94
+ }
95
+ return out;
96
+ }
88
97
  function bufferTurnsEqual(left, right) {
89
98
  if (!left) return false;
90
99
  return left.role === right.role && left.content === right.content && left.timestamp === right.timestamp && left.sessionKey === right.sessionKey && left.sessionOwnerPrincipal === right.sessionOwnerPrincipal && left.logicalSessionKey === right.logicalSessionKey && left.providerThreadId === right.providerThreadId && left.turnFingerprint === right.turnFingerprint && left.persistProcessedFingerprint === right.persistProcessedFingerprint && left.sourceConnector === right.sourceConnector && left.originRole === right.originRole && left.ambientCapture === right.ambientCapture && left.sourceValidAt === right.sourceValidAt && left.acceptedCapture === right.acceptedCapture && left.codingContext?.projectId === right.codingContext?.projectId && left.codingContext?.rootPath === right.codingContext?.rootPath && left.codingContext?.branch === right.codingContext?.branch && left.codingContext?.defaultBranch === right.codingContext?.defaultBranch && // #3251 scope pins compare by identity triple, not deep plan equality: a
@@ -112,6 +121,12 @@ function groupTurnsByExtractionScope(turns) {
112
121
  turn.writeNamespaceOverride ?? "",
113
122
  turn.principalOverride ?? "",
114
123
  scopeProfilePlanIdentity(turn.scopeProfileWritePlan),
124
+ // Accepted captures are deliberately accepted content: they must never
125
+ // share a scope group with ordinary turns, or a group-level capture
126
+ // policy (the explicit-mode gate, the planless-accepted null pin) is
127
+ // applied to ordinary conversation turns because `.some(acceptedCapture)`
128
+ // only looked at the merged group.
129
+ turn.acceptedCapture === true ? "accepted" : "",
115
130
  turn.codingContext?.projectId ?? "",
116
131
  turn.codingContext?.rootPath ?? "",
117
132
  turn.codingContext?.branch ?? "",
@@ -192,6 +207,7 @@ export {
192
207
  describeError,
193
208
  copyBufferTurn,
194
209
  subtractBufferTurns,
210
+ bufferEntryCounts,
195
211
  bufferTurnsEqual,
196
212
  selectRetainedDeferredTurns,
197
213
  hasPinnedCaptureScope,
@@ -204,4 +220,4 @@ export {
204
220
  ProbeTimeoutError,
205
221
  probeWithTimeout
206
222
  };
207
- //# sourceMappingURL=chunk-U7MIMS2Y.js.map
223
+ //# sourceMappingURL=chunk-OUBEJWVI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/buffer-turn-helpers.ts"],"sourcesContent":["import type { BufferEntryState, BufferState, BufferTurn } from \"./types.js\";\n\nexport interface BufferTurnOwner {\n /**\n * Server-resolved principal that owns this session at the authenticated\n * observe/write boundary. Persisted with the buffered turn so lifecycle\n * flushes do not have to infer ownership from a client-chosen session key.\n */\n sessionOwnerPrincipal?: string;\n}\n\nexport interface AmbientCaptureProvenance {\n /**\n * True when this turn's content came from an always-on ambient capture\n * device (a wearable recorder, a room microphone) and may therefore carry\n * speech the user never authored: TV, podcasts, music, overheard\n * conversation (issue #2294). Set by the ingesting subsystem, never from\n * tool arguments — extraction reads it to warn the model about media audio\n * and to clamp high-impact personal facts to the speculative tier.\n */\n ambientCapture?: boolean;\n}\n\nexport function describeError(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (err === null) return \"null\";\n if (err === undefined) return \"undefined\";\n if (typeof err === \"string\") return err;\n try {\n return JSON.stringify(err);\n } catch {\n return String(err);\n }\n}\n\nexport function copyBufferTurn(turn: BufferTurn): BufferTurn {\n const copy: BufferTurn = {\n role: turn.role,\n content: turn.content,\n timestamp: turn.timestamp,\n };\n if (typeof turn.sessionKey === \"string\") copy.sessionKey = turn.sessionKey;\n if (typeof turn.logicalSessionKey === \"string\") {\n copy.logicalSessionKey = turn.logicalSessionKey;\n }\n if (turn.providerThreadId === null || typeof turn.providerThreadId === \"string\") {\n copy.providerThreadId = turn.providerThreadId;\n }\n if (typeof turn.sessionOwnerPrincipal === \"string\") {\n copy.sessionOwnerPrincipal = turn.sessionOwnerPrincipal;\n }\n if (typeof turn.turnFingerprint === \"string\") {\n copy.turnFingerprint = turn.turnFingerprint;\n }\n if (typeof turn.persistProcessedFingerprint === \"boolean\") {\n copy.persistProcessedFingerprint = turn.persistProcessedFingerprint;\n }\n if (typeof turn.sourceConnector === \"string\") {\n copy.sourceConnector = turn.sourceConnector;\n }\n if (turn.originRole === \"user\" || turn.originRole === \"assistant\" || turn.originRole === \"tool\") {\n copy.originRole = turn.originRole;\n }\n if (typeof turn.ambientCapture === \"boolean\") {\n copy.ambientCapture = turn.ambientCapture;\n }\n if (turn.sourceValidAt !== undefined) {\n copy.sourceValidAt = turn.sourceValidAt;\n }\n if (turn.parts !== undefined) {\n copy.parts = turn.parts;\n }\n if (turn.rawContent !== undefined) {\n copy.rawContent = turn.rawContent;\n }\n if (turn.sourceFormat !== undefined) {\n copy.sourceFormat = turn.sourceFormat;\n }\n // #3251 scope pins: strings copy by value; the plan object is an immutable\n // config-derived identity passed by reference.\n if (turn.writeNamespaceOverride !== undefined) {\n copy.writeNamespaceOverride = turn.writeNamespaceOverride;\n }\n if (turn.principalOverride !== undefined) {\n copy.principalOverride = turn.principalOverride;\n }\n if (turn.scopeProfileWritePlan !== undefined) {\n copy.scopeProfileWritePlan = turn.scopeProfileWritePlan;\n }\n if (turn.acceptedCapture === true) {\n copy.acceptedCapture = true;\n }\n const ctx = turn.codingContext;\n if (ctx) {\n // All four fields are identity inputs (branchScope uses branch) — copy\n // explicitly as-is; never a spread of external input.\n copy.codingContext = {\n projectId: ctx.projectId,\n branch: ctx.branch,\n rootPath: ctx.rootPath,\n defaultBranch: ctx.defaultBranch,\n };\n }\n return copy;\n}\n\n/**\n * Remove the turns that a drain already extracted (`drained`) from `turns`.\n * Identity-based (role/content/timestamp/session/...): the same comparison\n * the buffer uses to match live turns, so a stale owner can subtract exactly\n * what the drain took and keep everything else.\n */\nexport function subtractBufferTurns(turns: readonly BufferTurn[], drained: readonly BufferTurn[]): BufferTurn[] {\n if (drained.length === 0) return [...turns];\n const kept = [...turns];\n for (const gone of drained) {\n const at = kept.findIndex((live) => bufferTurnsEqual(live, gone));\n if (at >= 0) kept.splice(at, 1);\n }\n return kept;\n}\n\n/** Per-key pending counts over the IN-MEMORY buffer state (counts only — no\n * turn payloads). The claim store's answer stays authoritative for claimed\n * keys; callers must filter through `BufferDrainClaims.isClaimed` before\n * treating a count here as work. */\nexport interface BufferEntryCounts {\n turns: number;\n retainedTurns: number;\n}\n\nexport function bufferEntryCounts(state: BufferState): Map<string, BufferEntryCounts> {\n const out = new Map<string, BufferEntryCounts>();\n const entries = state.entries;\n if (!entries) return out;\n for (const [key, entry] of Object.entries(entries)) {\n out.set(key, { turns: entry.turns.length, retainedTurns: entry.retainedTurns?.length ?? 0 });\n }\n return out;\n}\n\nexport function bufferTurnsEqual(left: BufferTurn | undefined, right: BufferTurn): boolean {\n if (!left) return false;\n return (\n left.role === right.role &&\n left.content === right.content &&\n left.timestamp === right.timestamp &&\n left.sessionKey === right.sessionKey &&\n left.sessionOwnerPrincipal === right.sessionOwnerPrincipal &&\n left.logicalSessionKey === right.logicalSessionKey &&\n left.providerThreadId === right.providerThreadId &&\n left.turnFingerprint === right.turnFingerprint &&\n left.persistProcessedFingerprint === right.persistProcessedFingerprint &&\n left.sourceConnector === right.sourceConnector &&\n left.originRole === right.originRole &&\n left.ambientCapture === right.ambientCapture &&\n left.sourceValidAt === right.sourceValidAt &&\n left.acceptedCapture === right.acceptedCapture &&\n left.codingContext?.projectId === right.codingContext?.projectId &&\n left.codingContext?.rootPath === right.codingContext?.rootPath &&\n left.codingContext?.branch === right.codingContext?.branch &&\n left.codingContext?.defaultBranch === right.codingContext?.defaultBranch &&\n // #3251 scope pins compare by identity triple, not deep plan equality: a\n // restart-rehydrated plan must still match the pin it was accepted under.\n left.writeNamespaceOverride === right.writeNamespaceOverride &&\n left.principalOverride === right.principalOverride &&\n scopeProfilePlanIdentity(left.scopeProfileWritePlan) ===\n scopeProfilePlanIdentity(right.scopeProfileWritePlan)\n );\n}\n\n/** Replace only the processed snapshot; callers without one retain legacy whole-slot semantics. */\nexport function selectRetainedDeferredTurns(\n existing: readonly BufferTurn[],\n turns: BufferTurn[],\n max: number,\n originalTurns?: readonly BufferTurn[],\n): BufferTurn[] {\n const others = originalTurns === undefined ? [] : existing.filter(\n (turn) => !originalTurns.some((original) => bufferTurnsEqual(turn, original)),\n );\n if (!Array.isArray(turns) || max <= 0) return others;\n return [...others, ...turns.slice(-max).map(copyBufferTurn)];\n}\n\nexport function hasPinnedCaptureScope(turn: BufferTurn): boolean {\n return turn.acceptedCapture === true ||\n turn.writeNamespaceOverride !== undefined ||\n turn.scopeProfileWritePlan !== undefined;\n}\n\n/** Stable identity string for a pinned scope-profile plan (#3251). */\nexport function scopeProfilePlanIdentity(\n plan: BufferTurn[\"scopeProfileWritePlan\"],\n): string {\n if (!plan) return \"\";\n return `${plan.profileId}\\u0000${plan.writeLayer}\\u0000${plan.writeNamespace}`;\n}\n\nexport interface ExtractionScopeGroup {\n writeNamespaceOverride?: string;\n principalOverride?: string;\n scopeProfileWritePlan?: BufferTurn[\"scopeProfileWritePlan\"];\n codingContext?: BufferTurn[\"codingContext\"];\n turns: BufferTurn[];\n}\n\n/**\n * Partition extraction turns by their durable scope pins (#3251). Turns\n * captured under different namespaces / principals / scope profiles /\n * project bindings must never be extracted together — each group runs its\n * own extraction under its own scope. Native (unpinned) turns form their own\n * group and keep today's single-store routing.\n */\nexport function groupTurnsByExtractionScope(turns: BufferTurn[]): ExtractionScopeGroup[] {\n const groups = new Map<string, ExtractionScopeGroup>();\n for (const turn of turns) {\n const key = [\n turn.writeNamespaceOverride ?? \"\",\n turn.principalOverride ?? \"\",\n scopeProfilePlanIdentity(turn.scopeProfileWritePlan),\n // Accepted captures are deliberately accepted content: they must never\n // share a scope group with ordinary turns, or a group-level capture\n // policy (the explicit-mode gate, the planless-accepted null pin) is\n // applied to ordinary conversation turns because `.some(acceptedCapture)`\n // only looked at the merged group.\n turn.acceptedCapture === true ? \"accepted\" : \"\",\n turn.codingContext?.projectId ?? \"\",\n turn.codingContext?.rootPath ?? \"\",\n turn.codingContext?.branch ?? \"\",\n turn.codingContext?.defaultBranch ?? \"\",\n ].join(\"\\u0000\");\n const group = groups.get(key);\n if (group) {\n group.turns.push(turn);\n } else {\n const created: ExtractionScopeGroup = { turns: [turn] };\n if (turn.writeNamespaceOverride !== undefined) created.writeNamespaceOverride = turn.writeNamespaceOverride;\n if (turn.principalOverride !== undefined) created.principalOverride = turn.principalOverride;\n if (turn.scopeProfileWritePlan !== undefined) created.scopeProfileWritePlan = turn.scopeProfileWritePlan;\n if (turn.codingContext !== undefined) created.codingContext = turn.codingContext;\n groups.set(key, created);\n }\n }\n return [...groups.values()];\n}\n\nexport function bufferTurnArraysEqual(\n left: readonly BufferTurn[],\n right: readonly BufferTurn[],\n): boolean {\n return left.length === right.length && left.every((turn, index) => bufferTurnsEqual(turn, right[index]));\n}\n\nexport function bufferTurnArrayIsSuffixOfSnapshot(\n liveTurns: readonly BufferTurn[],\n snapshot: readonly BufferTurn[],\n): boolean {\n if (liveTurns.length === 0 || liveTurns.length > snapshot.length) {\n return false;\n }\n const offset = snapshot.length - liveTurns.length;\n return liveTurns.every((turn, index) => bufferTurnsEqual(turn, snapshot[offset + index]));\n}\n\nexport function liveTurnsFromExtractionSnapshot(\n entry: BufferEntryState,\n extractedTurns: readonly BufferTurn[],\n): readonly BufferTurn[] {\n const retainedTurns = entry.retainedTurns ?? [];\n if (\n retainedTurns.length > 0 &&\n extractedTurns.length >= retainedTurns.length &&\n retainedTurns.every((turn, index) => bufferTurnsEqual(extractedTurns[index], turn))\n ) {\n const withoutRetainedPrefix = extractedTurns.slice(retainedTurns.length);\n if (withoutRetainedPrefix.length > 0 && matchingPrefixLength(entry.turns, withoutRetainedPrefix) > 0) {\n return withoutRetainedPrefix;\n }\n }\n return extractedTurns;\n}\n\nfunction matchingPrefixLength(\n liveTurns: readonly BufferTurn[],\n extractedTurns: readonly BufferTurn[],\n): number {\n let index = 0;\n while (\n index < liveTurns.length &&\n index < extractedTurns.length &&\n bufferTurnsEqual(liveTurns[index], extractedTurns[index])\n ) {\n index += 1;\n }\n return index;\n}\n\nexport function matchingQueuedExtractionPrefixLength(\n liveTurns: readonly BufferTurn[],\n extractedTurns: readonly BufferTurn[],\n): number {\n let bestMatchedCount = 0;\n for (let start = 0; start < extractedTurns.length; start += 1) {\n const matchedCount = matchingPrefixLength(liveTurns, extractedTurns.slice(start));\n if (matchedCount > bestMatchedCount) {\n bestMatchedCount = matchedCount;\n if (bestMatchedCount === liveTurns.length) break;\n }\n }\n return bestMatchedCount;\n}\n\nexport class ProbeTimeoutError extends Error {\n constructor(timeoutMs: number) {\n super(`probe exceeded ${timeoutMs}ms`);\n this.name = \"ProbeTimeoutError\";\n }\n}\n\nexport function probeWithTimeout<T>(inflight: Promise<T>, timeoutMs: number): Promise<T> {\n let timer: NodeJS.Timeout | null = null;\n const timeout = new Promise<T>((_, reject) => {\n timer = setTimeout(() => reject(new ProbeTimeoutError(timeoutMs)), timeoutMs);\n if (typeof (timer as NodeJS.Timeout).unref === \"function\") {\n (timer as NodeJS.Timeout).unref();\n }\n });\n return Promise.race([inflight, timeout]).finally(() => {\n if (timer) clearTimeout(timer);\n });\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isNamespaceKind
3
- } from "./chunk-CI3MAAIY.js";
3
+ } from "./chunk-2R44BBPK.js";
4
4
  import {
5
5
  EngramAccessInputError
6
6
  } from "./chunk-LGEH473S.js";
@@ -40,4 +40,4 @@ export {
40
40
  positiveIntQueryParam,
41
41
  optionalNamespaceKindQueryParam
42
42
  };
43
- //# sourceMappingURL=chunk-JLMOH5JA.js.map
43
+ //# sourceMappingURL=chunk-OWZXDBV4.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  RECALL_NAVIGATION_MCP_TOOLS
3
3
  } from "./chunk-TE6S7KDF.js";
4
- import {
5
- MCP_READ_ONLY_TOOL_SUFFIXES
6
- } from "./chunk-MZUQVWVC.js";
7
4
  import {
8
5
  MEMORY_BROWSE_MCP_TOOLS
9
6
  } from "./chunk-EIB4FJVR.js";
7
+ import {
8
+ MCP_READ_ONLY_TOOL_SUFFIXES
9
+ } from "./chunk-MZUQVWVC.js";
10
10
  import {
11
11
  EXTERNAL_WIKI_MCP_TOOLS
12
12
  } from "./chunk-A5KNZSNA.js";
@@ -49,25 +49,25 @@ import {
49
49
  } from "./chunk-KIUVEMBI.js";
50
50
  import {
51
51
  getOperation
52
- } from "./chunk-6WKWL53V.js";
52
+ } from "./chunk-23BA3USG.js";
53
53
  import {
54
54
  WHO_KNOWS_MCP_TOOLS
55
- } from "./chunk-Y3XPSGNF.js";
55
+ } from "./chunk-JGLZ46JS.js";
56
56
  import {
57
57
  PROMOTION_CANDIDATES_MCP_TOOLS
58
58
  } from "./chunk-IZJQNDGI.js";
59
59
  import {
60
60
  validateRequest
61
- } from "./chunk-H6VJSITJ.js";
62
- import {
63
- SUPPORT_PASSPORT_SOURCE_MEMORY_ID_MAX_LENGTH
64
- } from "./chunk-PWPIERBM.js";
61
+ } from "./chunk-CIL4GHMD.js";
65
62
  import {
66
63
  assertOperationAllowed,
67
64
  capabilityAllowsOp,
68
65
  enforceNamespaceAllowList,
69
66
  tokenCapabilityStore
70
67
  } from "./chunk-YO2JEX2Z.js";
68
+ import {
69
+ SUPPORT_PASSPORT_SOURCE_MEMORY_ID_MAX_LENGTH
70
+ } from "./chunk-PWPIERBM.js";
71
71
  import {
72
72
  readEnvVar
73
73
  } from "./chunk-P2QRMMVQ.js";
@@ -3986,4 +3986,4 @@ export {
3986
3986
  MCP_MIGRATED_OPERATIONS,
3987
3987
  EngramMcpServer
3988
3988
  };
3989
- //# sourceMappingURL=chunk-ZORS5BG5.js.map
3989
+ //# sourceMappingURL=chunk-PJAMFIDE.js.map
@@ -0,0 +1,34 @@
1
+ import {
2
+ recordObjectiveStateSnapshotsFromObservedMessages
3
+ } from "./chunk-Z64TS5V4.js";
4
+ import {
5
+ resolveObjectiveStateCapabilities
6
+ } from "./chunk-C5LWPYS3.js";
7
+ import {
8
+ log
9
+ } from "./chunk-3WCASNQZ.js";
10
+
11
+ // src/access-observe-objective-state.ts
12
+ async function recordObserveObjectiveState(orchestrator, objectiveStateStoreLocationForNamespace, scope, request) {
13
+ try {
14
+ const objectiveStateLocation = await objectiveStateStoreLocationForNamespace(
15
+ scope.objectiveStateNamespace
16
+ );
17
+ await recordObjectiveStateSnapshotsFromObservedMessages({
18
+ memoryDir: objectiveStateLocation.memoryDir,
19
+ objectiveStateStoreDir: objectiveStateLocation.objectiveStateStoreDir,
20
+ objectiveStateMemoryEnabled: resolveObjectiveStateCapabilities(orchestrator.config).objectiveStateMemory,
21
+ objectiveStateSnapshotWritesEnabled: resolveObjectiveStateCapabilities(orchestrator.config).objectiveStateSnapshotWrites,
22
+ sessionKey: request.sessionKey,
23
+ recordedAt: (/* @__PURE__ */ new Date()).toISOString(),
24
+ messages: request.messages
25
+ });
26
+ } catch (err) {
27
+ log.error(`access-observe objective-state snapshot write failed: ${err}`);
28
+ }
29
+ }
30
+
31
+ export {
32
+ recordObserveObjectiveState
33
+ };
34
+ //# sourceMappingURL=chunk-QCFZDYYG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/access-observe-objective-state.ts"],"sourcesContent":["/**\n * Objective-state snapshots written from observed messages.\n *\n * Best-effort like the transcript write: a snapshot failure must not fail\n * the observe, so it is logged and swallowed here.\n */\nimport { log } from \"./logger.js\";\nimport { recordObjectiveStateSnapshotsFromObservedMessages } from \"./objective-state-writers.js\";\nimport { resolveObjectiveStateCapabilities } from \"./capabilities.js\";\nimport type { Orchestrator } from \"./orchestrator.js\";\nimport type { EngramAccessObserveRequest, MemoryScopePlan } from \"./access-service.js\";\n\n/** Write the objective-state snapshots for one accepted observe. */\nexport async function recordObserveObjectiveState(\n orchestrator: Orchestrator,\n objectiveStateStoreLocationForNamespace: (\n namespace: string,\n ) => Promise<{ memoryDir: string; objectiveStateStoreDir?: string }>,\n scope: MemoryScopePlan,\n request: EngramAccessObserveRequest,\n): Promise<void> {\n try {\n const objectiveStateLocation = await objectiveStateStoreLocationForNamespace(\n scope.objectiveStateNamespace,\n );\n await recordObjectiveStateSnapshotsFromObservedMessages({\n memoryDir: objectiveStateLocation.memoryDir,\n objectiveStateStoreDir: objectiveStateLocation.objectiveStateStoreDir,\n objectiveStateMemoryEnabled:\n resolveObjectiveStateCapabilities(orchestrator.config).objectiveStateMemory,\n objectiveStateSnapshotWritesEnabled:\n resolveObjectiveStateCapabilities(orchestrator.config).objectiveStateSnapshotWrites,\n sessionKey: request.sessionKey,\n recordedAt: new Date().toISOString(),\n messages: request.messages,\n });\n } catch (err) {\n log.error(`access-observe objective-state snapshot write failed: ${err}`);\n }\n}\n"],"mappings":";;;;;;;;;;;AAaA,eAAsB,4BACpB,cACA,yCAGA,OACA,SACe;AACf,MAAI;AACF,UAAM,yBAAyB,MAAM;AAAA,MACnC,MAAM;AAAA,IACR;AACA,UAAM,kDAAkD;AAAA,MACtD,WAAW,uBAAuB;AAAA,MAClC,wBAAwB,uBAAuB;AAAA,MAC/C,6BACE,kCAAkC,aAAa,MAAM,EAAE;AAAA,MACzD,qCACE,kCAAkC,aAAa,MAAM,EAAE;AAAA,MACzD,YAAY,QAAQ;AAAA,MACpB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,UAAU,QAAQ;AAAA,IACpB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,MAAM,yDAAyD,GAAG,EAAE;AAAA,EAC1E;AACF;","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  SupportPassportError,
3
3
  SupportPassportOwnerCreateGrantRequestSchema,
4
4
  getOperation
5
- } from "./chunk-6WKWL53V.js";
5
+ } from "./chunk-23BA3USG.js";
6
6
 
7
7
  // src/support-passport/access-http.ts
8
8
  var OWNER_ROOT = "/engram/v1/support-passport";
@@ -137,4 +137,4 @@ export {
137
137
  SUPPORT_PASSPORT_OWNER_HTTP_ROUTES,
138
138
  handleSupportPassportOwnerHttp
139
139
  };
140
- //# sourceMappingURL=chunk-SXTVZ6JL.js.map
140
+ //# sourceMappingURL=chunk-QIOQI7QZ.js.map
@@ -14,16 +14,13 @@ var LcmWorkQueue = class {
14
14
  this.worker = options.worker;
15
15
  this.hooks = options.hooks ?? {};
16
16
  }
17
- enqueue(sessionId, messages) {
18
- if (messages.length === 0) return;
17
+ enqueue(sessionId) {
18
+ if (sessionId.length === 0) return;
19
19
  const now = Date.now();
20
20
  const existing = this.pending.get(sessionId);
21
- if (existing) {
22
- existing.messages.push(...messages.map((message) => ({ ...message })));
23
- } else {
21
+ if (!existing) {
24
22
  this.pending.set(sessionId, {
25
23
  sessionId,
26
- messages: messages.map((message) => ({ ...message })),
27
24
  enqueuedAt: now
28
25
  });
29
26
  }
@@ -35,10 +32,21 @@ var LcmWorkQueue = class {
35
32
  get inFlightCount() {
36
33
  return this.inFlight;
37
34
  }
38
- async whenIdle() {
35
+ async whenIdle(abortSignal) {
36
+ abortSignal?.throwIfAborted();
39
37
  if (this.depth === 0 && this.inFlight === 0) return;
40
- await new Promise((resolve) => {
41
- this.idleWaiters.push(resolve);
38
+ await new Promise((resolve, reject) => {
39
+ const finish = () => {
40
+ abortSignal?.removeEventListener("abort", onAbort);
41
+ resolve();
42
+ };
43
+ const onAbort = () => {
44
+ const remaining = this.idleWaiters.filter((waiter) => waiter !== finish);
45
+ this.idleWaiters.splice(0, this.idleWaiters.length, ...remaining);
46
+ reject(abortSignal?.reason instanceof Error ? abortSignal.reason : new DOMException("Aborted", "AbortError"));
47
+ };
48
+ this.idleWaiters.push(finish);
49
+ abortSignal?.addEventListener("abort", onAbort, { once: true });
42
50
  });
43
51
  }
44
52
  async whenSessionIdle(sessionId, abortSignal) {
@@ -94,7 +102,7 @@ var LcmWorkQueue = class {
94
102
  async runJob(job, startedAt, waitMs) {
95
103
  let error;
96
104
  try {
97
- await this.worker(job.sessionId, job.messages);
105
+ await this.worker(job.sessionId);
98
106
  } catch (err) {
99
107
  error = err;
100
108
  } finally {
@@ -138,4 +146,4 @@ var LcmWorkQueue = class {
138
146
  export {
139
147
  LcmWorkQueue
140
148
  };
141
- //# sourceMappingURL=chunk-MMCO4SRG.js.map
149
+ //# sourceMappingURL=chunk-QNN4FYBD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lcm/queue.ts"],"sourcesContent":["export interface LcmObserveMessage {\n role: string;\n content: string;\n parts?: import(\"../message-parts/index.js\").LcmMessagePartInput[];\n rawContent?: unknown;\n sourceFormat?: import(\"../message-parts/index.js\").MessagePartSourceFormat;\n}\n\nexport interface LcmWorkQueueHooks {\n onJobStart?: (input: {\n sessionId: string;\n depth: number;\n inFlight: number;\n waitMs: number;\n }) => void;\n onJobFinish?: (input: {\n sessionId: string;\n depth: number;\n inFlight: number;\n waitMs: number;\n runMs: number;\n totalMs: number;\n error?: unknown;\n }) => void;\n}\n\nexport interface LcmWorkQueueOptions {\n concurrency?: number;\n worker: (sessionId: string) => Promise<void>;\n hooks?: LcmWorkQueueHooks;\n}\n\ninterface PendingJob {\n sessionId: string;\n enqueuedAt: number;\n}\n\n/**\n * Small keyed work queue for LCM observe processing.\n *\n * Jobs are coalesced per session while they are pending. A session can have\n * at most one in-flight job at a time, and the queue processes jobs FIFO up to\n * the configured concurrency limit.\n *\n * The queue carries session references only — never message payloads. Observe\n * content is archived in SQLite before it is queued, so a pending job is a\n * \"this session has durable unsummarized turns\" marker.\n */\nexport class LcmWorkQueue {\n private readonly concurrency: number;\n private readonly worker: (sessionId: string) => Promise<void>;\n private readonly hooks: LcmWorkQueueHooks;\n private readonly pending = new Map<string, PendingJob>();\n private readonly inFlightSessions = new Set<string>();\n private inFlight = 0;\n private readonly idleWaiters: Array<() => void> = [];\n private readonly sessionIdleWaiters = new Map<string, Array<() => void>>();\n private drainScheduled = false;\n\n constructor(options: LcmWorkQueueOptions) {\n this.concurrency = Math.max(1, Math.floor(options.concurrency ?? 1));\n this.worker = options.worker;\n this.hooks = options.hooks ?? {};\n }\n\n enqueue(sessionId: string): void {\n if (sessionId.length === 0) return;\n\n const now = Date.now();\n const existing = this.pending.get(sessionId);\n if (!existing) {\n this.pending.set(sessionId, {\n sessionId,\n enqueuedAt: now,\n });\n }\n\n this.scheduleDrain();\n }\n\n get depth(): number {\n return this.pending.size;\n }\n\n get inFlightCount(): number {\n return this.inFlight;\n }\n\n async whenIdle(abortSignal?: AbortSignal): Promise<void> {\n abortSignal?.throwIfAborted();\n if (this.depth === 0 && this.inFlight === 0) return;\n await new Promise<void>((resolve, reject) => {\n const finish = (): void => {\n abortSignal?.removeEventListener(\"abort\", onAbort);\n resolve();\n };\n const onAbort = (): void => {\n const remaining = this.idleWaiters.filter((waiter) => waiter !== finish);\n this.idleWaiters.splice(0, this.idleWaiters.length, ...remaining);\n reject(abortSignal?.reason instanceof Error ? abortSignal.reason : new DOMException(\"Aborted\", \"AbortError\"));\n };\n this.idleWaiters.push(finish);\n abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n async whenSessionIdle(sessionId: string, abortSignal?: AbortSignal): Promise<void> {\n abortSignal?.throwIfAborted();\n if (!this.pending.has(sessionId) && !this.inFlightSessions.has(sessionId)) return;\n await new Promise<void>((resolve, reject) => {\n const finish = (): void => {\n abortSignal?.removeEventListener(\"abort\", onAbort);\n resolve();\n };\n const onAbort = (): void => {\n const remaining = (this.sessionIdleWaiters.get(sessionId) ?? []).filter((waiter) => waiter !== finish);\n if (remaining.length === 0) this.sessionIdleWaiters.delete(sessionId);\n else this.sessionIdleWaiters.set(sessionId, remaining);\n reject(abortSignal?.reason instanceof Error ? abortSignal.reason : new DOMException(\"Aborted\", \"AbortError\"));\n };\n const waiters = this.sessionIdleWaiters.get(sessionId) ?? [];\n waiters.push(finish);\n this.sessionIdleWaiters.set(sessionId, waiters);\n abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n private startAvailableJobs(): void {\n while (this.inFlight < this.concurrency && this.pending.size > 0) {\n const next = Array.from(this.pending.entries()).find(\n ([sessionId]) => !this.inFlightSessions.has(sessionId),\n );\n if (!next) break;\n\n const [sessionId, job] = next;\n this.pending.delete(sessionId);\n this.inFlight++;\n this.inFlightSessions.add(sessionId);\n\n const startedAt = Date.now();\n const waitMs = startedAt - job.enqueuedAt;\n this.hooks.onJobStart?.({\n sessionId,\n depth: this.depth,\n inFlight: this.inFlight,\n waitMs,\n });\n\n void this.runJob(job, startedAt, waitMs);\n }\n\n this.resolveIdleWaitersIfNeeded();\n }\n\n private scheduleDrain(): void {\n if (this.drainScheduled) return;\n this.drainScheduled = true;\n\n queueMicrotask(() => {\n this.drainScheduled = false;\n this.startAvailableJobs();\n });\n }\n\n private async runJob(\n job: PendingJob,\n startedAt: number,\n waitMs: number,\n ): Promise<void> {\n let error: unknown;\n\n try {\n await this.worker(job.sessionId);\n } catch (err) {\n error = err;\n } finally {\n const finishedAt = Date.now();\n const runMs = finishedAt - startedAt;\n const totalMs = finishedAt - job.enqueuedAt;\n\n this.inFlight--;\n this.inFlightSessions.delete(job.sessionId);\n this.hooks.onJobFinish?.({\n sessionId: job.sessionId,\n depth: this.depth,\n inFlight: this.inFlight,\n waitMs,\n runMs,\n totalMs,\n error,\n });\n\n if (this.pending.size > 0) {\n this.scheduleDrain();\n } else {\n this.resolveIdleWaitersIfNeeded();\n }\n this.resolveSessionIdleWaitersIfNeeded(job.sessionId);\n }\n }\n\n private resolveIdleWaitersIfNeeded(): void {\n if (this.depth !== 0 || this.inFlight !== 0) return;\n\n const waiters = this.idleWaiters.splice(0, this.idleWaiters.length);\n for (const resolve of waiters) resolve();\n }\n\n private resolveSessionIdleWaitersIfNeeded(sessionId: string): void {\n if (this.pending.has(sessionId) || this.inFlightSessions.has(sessionId))\n return;\n\n const waiters = this.sessionIdleWaiters.get(sessionId);\n if (!waiters || waiters.length === 0) return;\n\n this.sessionIdleWaiters.delete(sessionId);\n for (const resolve of waiters) resolve();\n }\n}\n"],"mappings":"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","names":["sessionId"]}