@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
@@ -1,6 +1,15 @@
1
+ import {
2
+ LcmSummarizer
3
+ } from "./chunk-AQNHEDXP.js";
4
+ import {
5
+ LcmArchive
6
+ } from "./chunk-SDL22RRW.js";
7
+ import {
8
+ LcmDag
9
+ } from "./chunk-7N4KAIGN.js";
1
10
  import {
2
11
  LcmWorkQueue
3
- } from "./chunk-MMCO4SRG.js";
12
+ } from "./chunk-QNN4FYBD.js";
4
13
  import {
5
14
  assembleCompressedHistoryWithTrace
6
15
  } from "./chunk-UXPUUL3G.js";
@@ -8,15 +17,6 @@ import {
8
17
  ensureLcmStateDir,
9
18
  openLcmDatabase
10
19
  } from "./chunk-DDA47TES.js";
11
- import {
12
- LcmSummarizer
13
- } from "./chunk-KOLJJN5G.js";
14
- import {
15
- LcmArchive
16
- } from "./chunk-WVP2I6C5.js";
17
- import {
18
- LcmDag
19
- } from "./chunk-7N4KAIGN.js";
20
20
  import {
21
21
  nativeBindingRecoveryHint
22
22
  } from "./chunk-LD72P4YS.js";
@@ -74,6 +74,9 @@ var EMPTY_LCM_STATS = {
74
74
  totalSummaryNodes: 0,
75
75
  maxDepth: -1
76
76
  };
77
+ var LCM_SUMMARIZE_MAX_LEAF_BATCHES_PER_JOB = 16;
78
+ var LCM_SUMMARIZE_RETRY_BASE_MS = 500;
79
+ var LCM_SUMMARIZE_RETRY_MAX_MS = 3e4;
77
80
  var LcmEngine = class {
78
81
  constructor(pluginConfig, summarizeFn) {
79
82
  this.summarizeFn = summarizeFn;
@@ -90,6 +93,14 @@ var LcmEngine = class {
90
93
  config;
91
94
  memoryDir;
92
95
  initPromise = null;
96
+ summarizeRetryTimers = /* @__PURE__ */ new Map();
97
+ summarizeRetryAttempts = /* @__PURE__ */ new Map();
98
+ /** Resolved when the session's pending retry timer has fired or been cleared. */
99
+ summarizeRetryWaiters = /* @__PURE__ */ new Map();
100
+ /** Explicit idle waiters per session; referenced only while nonzero. */
101
+ summarizeRetryIdleWaiters = /* @__PURE__ */ new Map();
102
+ /** Base backoff delay; tests shrink it to keep the retry loop fast. */
103
+ summarizeRetryBaseMs = LCM_SUMMARIZE_RETRY_BASE_MS;
93
104
  pendingObserveInitCounts = /* @__PURE__ */ new Map();
94
105
  pendingObserveInitWaiters = /* @__PURE__ */ new Map();
95
106
  pendingObserveInitIdleWaiters = [];
@@ -130,8 +141,8 @@ var LcmEngine = class {
130
141
  );
131
142
  const observeQueue = new LcmWorkQueue({
132
143
  concurrency: this.config.observeConcurrency,
133
- worker: async (sessionId, messages) => {
134
- await this.processObserveMessages(sessionId, messages);
144
+ worker: async (sessionId) => {
145
+ await this.processSummarizeJob(sessionId);
135
146
  },
136
147
  hooks: {
137
148
  onJobStart: ({ sessionId, depth, inFlight, waitMs }) => {
@@ -169,47 +180,73 @@ var LcmEngine = class {
169
180
  this.dag = dag;
170
181
  this.summarizer = summarizer;
171
182
  this.observeQueue = observeQueue;
183
+ this.resumeOutstandingSummaries();
172
184
  log.info("LCM engine initialized");
173
185
  }
174
186
  /**
175
- * Enqueue messages from agent_end hook.
176
- * The queue worker performs the archive append and incremental summarization.
187
+ * Restart resume: sessions whose durable archive still holds complete
188
+ * unsummarized batches get a summary job without any new observe call.
189
+ * Only session references are queued — the content already lives in SQLite.
190
+ */
191
+ resumeOutstandingSummaries() {
192
+ if (!this.archive || !this.observeQueue) return;
193
+ const sessions = this.archive.listSessionsWithUnsummarizedTurns(
194
+ this.config.leafBatchSize
195
+ );
196
+ if (sessions.length === 0) return;
197
+ for (const sessionId of sessions) this.observeQueue.enqueue(sessionId);
198
+ log.info(`LCM resume scheduled summary jobs: sessions=${sessions.length}`);
199
+ }
200
+ /**
201
+ * Archive observed messages and schedule background summarization.
202
+ *
203
+ * The archive append completes BEFORE this resolves: an accepted observe is
204
+ * already durable in SQLite, so a crash cannot lose it. Only the
205
+ * summarization is background work, and it resumes from the durable archive.
177
206
  */
178
207
  async observeMessages(sessionId, messages) {
179
208
  const normalizedSessionId = normalizeLcmSessionId(sessionId);
180
209
  if (!normalizedSessionId) return;
181
- this.enqueueObserveMessages(normalizedSessionId, messages);
210
+ await this.enqueueObserveMessages(normalizedSessionId, messages);
182
211
  }
183
- /** Enqueue an observe job without waiting for worker completion. */
184
- enqueueObserveMessages(sessionId, messages) {
185
- if (!this.config.enabled || this.closed) return;
212
+ /**
213
+ * Durably archive messages, then queue a metadata-only summary job.
214
+ *
215
+ * Rejects when the archive append fails — callers must not treat a failed
216
+ * archive as an accepted observation.
217
+ */
218
+ async enqueueObserveMessages(sessionId, messages) {
219
+ if (!this.config.enabled) return;
220
+ if (this.closed) throw new Error("LCM engine is closed");
186
221
  const normalizedSessionId = normalizeLcmSessionId(sessionId);
187
222
  if (!normalizedSessionId) return;
188
223
  if (messages.length === 0) return;
189
224
  this.reservePendingObserveInit(normalizedSessionId);
190
- void this.ensureInitialized().then(() => {
191
- if (this.closed || !this.observeQueue) return;
192
- this.observeQueue.enqueue(normalizedSessionId, messages);
225
+ try {
226
+ await this.ensureInitialized();
227
+ if (this.closed) throw new Error("LCM engine is closed");
228
+ if (!this.archive || !this.observeQueue) {
229
+ throw new Error("LCM engine is not initialized");
230
+ }
231
+ const archived = this.archiveObservedMessages(normalizedSessionId, messages);
232
+ this.observeQueue.enqueue(normalizedSessionId);
193
233
  log.debug(
194
- `LCM observe enqueued: session=${normalizedSessionId}, depth=${this.observeQueue.depth}, inFlight=${this.observeQueue.inFlightCount}`
234
+ `LCM observe archived: session=${normalizedSessionId}, messages=${archived}, depth=${this.observeQueue.depth}, inFlight=${this.observeQueue.inFlightCount}`
195
235
  );
196
- }).catch((err) => {
197
- if (this.closed) return;
236
+ } catch (err) {
198
237
  log.error(
199
- `LCM observe enqueue initialization error: ${err}${nativeBindingRecoveryHint(err)}`
238
+ `LCM observe archive failed: session=${normalizedSessionId}, error=${err}${nativeBindingRecoveryHint(err)}`
200
239
  );
201
- }).finally(() => {
240
+ throw err;
241
+ } finally {
202
242
  this.releasePendingObserveInit(normalizedSessionId);
203
- });
243
+ }
204
244
  }
205
- async processObserveMessages(sessionId, messages) {
206
- if (this.closed) return;
207
- await this.ensureInitialized();
208
- if (this.closed || !this.archive || !this.summarizer) return;
209
- if (messages.length === 0) return;
245
+ /** Append observed messages to the archive; returns the number of rows. */
246
+ archiveObservedMessages(sessionId, messages) {
210
247
  const currentMax = this.archive.getMaxTurnIndex(sessionId);
211
248
  const { messagePartsEnabled } = this.config;
212
- const newMessages = messages.map((m, i) => ({
249
+ const rows = messages.map((m, i) => ({
213
250
  turnIndex: currentMax + 1 + i,
214
251
  role: m.role,
215
252
  content: m.content,
@@ -217,14 +254,90 @@ var LcmEngine = class {
217
254
  rawContent: messagePartsEnabled ? m.rawContent : void 0,
218
255
  sourceFormat: messagePartsEnabled ? m.sourceFormat : void 0
219
256
  }));
220
- this.archive.appendMessages(sessionId, newMessages, {
221
- messagePartsEnabled
222
- });
257
+ this.archive.appendMessages(sessionId, rows, { messagePartsEnabled });
258
+ return rows.length;
259
+ }
260
+ /**
261
+ * Summarize one session's durable backlog.
262
+ *
263
+ * The pass is capped so a long backlog never holds a job open indefinitely;
264
+ * remaining batches stay durable and the job re-queues itself.
265
+ */
266
+ async processSummarizeJob(sessionId) {
267
+ if (this.closed) return;
268
+ await this.ensureInitialized();
269
+ if (this.closed || !this.archive || !this.summarizer || !this.observeQueue)
270
+ return;
223
271
  try {
224
- await this.summarizer.summarizeIncremental(sessionId);
272
+ await this.summarizer.summarizeIncremental(sessionId, {
273
+ maxLeafBatches: LCM_SUMMARIZE_MAX_LEAF_BATCHES_PER_JOB
274
+ });
225
275
  } catch (err) {
226
- log.debug(`LCM incremental summarization error: ${err}`);
276
+ log.error(`LCM incremental summarization failed: session=${sessionId}, error=${err}`);
277
+ this.scheduleSummarizeRetry(sessionId);
278
+ return;
279
+ }
280
+ this.clearSummarizeRetry(sessionId);
281
+ if (this.hasCompleteBatchPending(sessionId)) {
282
+ this.observeQueue.enqueue(sessionId);
283
+ }
284
+ }
285
+ /**
286
+ * Schedule a metadata-only retry for a failed summary pass.
287
+ *
288
+ * The retry keeps trying for as long as the engine is open and complete
289
+ * batches remain — a transient failure must never strand durable work.
290
+ * What is bounded is the RATE, not the ability to retry: one pending timer
291
+ * per session, exponential backoff capped at
292
+ * {@link LCM_SUMMARIZE_RETRY_MAX_MS}, and an unreferenced timer that is
293
+ * cleared when the engine closes.
294
+ */
295
+ scheduleSummarizeRetry(sessionId) {
296
+ if (this.closed || this.summarizeRetryTimers.has(sessionId)) return;
297
+ const attempt = (this.summarizeRetryAttempts.get(sessionId) ?? 0) + 1;
298
+ this.summarizeRetryAttempts.set(sessionId, attempt);
299
+ const delayMs = Math.min(
300
+ LCM_SUMMARIZE_RETRY_MAX_MS,
301
+ this.summarizeRetryBaseMs * 2 ** Math.min(attempt - 1, 16)
302
+ );
303
+ const retry = Promise.withResolvers();
304
+ this.summarizeRetryWaiters.set(sessionId, retry);
305
+ const timer = setTimeout(() => {
306
+ this.summarizeRetryTimers.delete(sessionId);
307
+ this.summarizeRetryWaiters.delete(sessionId);
308
+ if (this.closed) {
309
+ retry.resolve();
310
+ return;
311
+ }
312
+ if (!this.hasCompleteBatchPending(sessionId)) {
313
+ this.summarizeRetryAttempts.delete(sessionId);
314
+ retry.resolve();
315
+ return;
316
+ }
317
+ this.observeQueue?.enqueue(sessionId);
318
+ retry.resolve();
319
+ }, delayMs);
320
+ timer.unref?.();
321
+ this.summarizeRetryTimers.set(sessionId, timer);
322
+ }
323
+ /** True when the session still holds a complete unsummarized batch. */
324
+ hasCompleteBatchPending(sessionId) {
325
+ if (!this.archive) return false;
326
+ return this.archive.countUnsummarizedMessages(sessionId) >= this.config.leafBatchSize;
327
+ }
328
+ /** Drop a pending retry, its attempt counter, and release idle waiters. */
329
+ clearSummarizeRetry(sessionId) {
330
+ const timer = this.summarizeRetryTimers.get(sessionId);
331
+ if (timer) {
332
+ clearTimeout(timer);
333
+ this.summarizeRetryTimers.delete(sessionId);
334
+ }
335
+ const waiter = this.summarizeRetryWaiters.get(sessionId);
336
+ if (waiter) {
337
+ this.summarizeRetryWaiters.delete(sessionId);
338
+ waiter.resolve();
227
339
  }
340
+ this.summarizeRetryAttempts.delete(sessionId);
228
341
  }
229
342
  get observeQueueDepth() {
230
343
  return this.observeQueue?.depth ?? 0;
@@ -232,12 +345,21 @@ var LcmEngine = class {
232
345
  get observeQueueInFlightCount() {
233
346
  return this.observeQueue?.inFlightCount ?? 0;
234
347
  }
235
- async waitForObserveQueueIdle() {
348
+ async waitForObserveQueueIdle(abortSignal) {
349
+ abortSignal?.throwIfAborted();
236
350
  if (!this.config.enabled || this.closed) return;
237
351
  await this.ensureInitialized();
352
+ abortSignal?.throwIfAborted();
238
353
  if (this.closed) return;
239
- await this.waitForPendingObserveInitIdle();
240
- await this.observeQueue?.whenIdle();
354
+ for (; ; ) {
355
+ abortSignal?.throwIfAborted();
356
+ await this.waitForPendingObserveInitIdle(void 0, abortSignal);
357
+ await this.observeQueue?.whenIdle(abortSignal);
358
+ abortSignal?.throwIfAborted();
359
+ const entry = [...this.summarizeRetryWaiters.entries()][0];
360
+ if (!entry) return;
361
+ await this.awaitSummarizeRetry(entry[0], entry[1], abortSignal);
362
+ }
241
363
  }
242
364
  async waitForSessionObserveIdle(sessionId, abortSignal) {
243
365
  abortSignal?.throwIfAborted();
@@ -247,8 +369,34 @@ var LcmEngine = class {
247
369
  await this.ensureInitialized();
248
370
  abortSignal?.throwIfAborted();
249
371
  if (this.closed) return;
250
- await this.waitForPendingObserveInitIdle(normalizedSessionId, abortSignal);
251
- await this.observeQueue?.whenSessionIdle(normalizedSessionId, abortSignal) ?? Promise.resolve();
372
+ for (; ; ) {
373
+ await this.waitForPendingObserveInitIdle(normalizedSessionId, abortSignal);
374
+ await this.observeQueue?.whenSessionIdle(normalizedSessionId, abortSignal) ?? Promise.resolve();
375
+ const waiter = this.summarizeRetryWaiters.get(normalizedSessionId);
376
+ if (!waiter) return;
377
+ await this.awaitSummarizeRetry(normalizedSessionId, waiter, abortSignal);
378
+ }
379
+ }
380
+ /**
381
+ * Park an explicit idle wait on a pending retry. While any wait is parked,
382
+ * the retry timer is referenced so a one-shot host cannot exit under the
383
+ * wait; with no waiters the timer stays unreferenced background work.
384
+ */
385
+ async awaitSummarizeRetry(sessionId, waiter, abortSignal) {
386
+ const waiters = (this.summarizeRetryIdleWaiters.get(sessionId) ?? 0) + 1;
387
+ this.summarizeRetryIdleWaiters.set(sessionId, waiters);
388
+ this.summarizeRetryTimers.get(sessionId)?.ref?.();
389
+ try {
390
+ await abortOnSignal(abortSignal, waiter.promise);
391
+ } finally {
392
+ const remaining = (this.summarizeRetryIdleWaiters.get(sessionId) ?? 1) - 1;
393
+ if (remaining <= 0) {
394
+ this.summarizeRetryIdleWaiters.delete(sessionId);
395
+ this.summarizeRetryTimers.get(sessionId)?.unref?.();
396
+ } else {
397
+ this.summarizeRetryIdleWaiters.set(sessionId, remaining);
398
+ }
399
+ }
252
400
  }
253
401
  reservePendingObserveInit(sessionId) {
254
402
  const count = this.pendingObserveInitCounts.get(sessionId) ?? 0;
@@ -296,8 +444,18 @@ var LcmEngine = class {
296
444
  return;
297
445
  }
298
446
  if (this.pendingObserveInitCounts.size === 0) return;
299
- await new Promise((resolve) => {
300
- this.pendingObserveInitIdleWaiters.push(resolve);
447
+ await new Promise((resolve, reject) => {
448
+ const finish = () => {
449
+ abortSignal?.removeEventListener("abort", onAbort);
450
+ resolve();
451
+ };
452
+ const onAbort = () => {
453
+ const remaining = this.pendingObserveInitIdleWaiters.filter((waiter) => waiter !== finish);
454
+ this.pendingObserveInitIdleWaiters.splice(0, this.pendingObserveInitIdleWaiters.length, ...remaining);
455
+ reject(abortSignal?.reason instanceof Error ? abortSignal.reason : new DOMException("Aborted", "AbortError"));
456
+ };
457
+ this.pendingObserveInitIdleWaiters.push(finish);
458
+ abortSignal?.addEventListener("abort", onAbort, { once: true });
301
459
  });
302
460
  }
303
461
  /** Build the compressed history recall section for a session. */
@@ -536,22 +694,24 @@ ${preview}`,
536
694
  };
537
695
  }
538
696
  /** Clear all LCM archive and summary state for one session. */
539
- async clearSession(sessionId) {
697
+ async clearSession(sessionId, abortSignal) {
540
698
  if (!this.config.enabled || this.closed) return;
541
699
  const normalizedSessionId = normalizeLcmSessionId(sessionId);
542
700
  if (!normalizedSessionId) return;
543
701
  await this.ensureInitialized();
544
702
  if (this.closed || !this.archive || !this.dag) return;
545
- await this.waitForSessionObserveIdle(normalizedSessionId);
703
+ await this.waitForSessionObserveIdle(normalizedSessionId, abortSignal);
704
+ abortSignal?.throwIfAborted();
546
705
  this.dag.deleteSession(normalizedSessionId);
547
706
  this.archive.deleteSession(normalizedSessionId);
548
707
  }
549
708
  /** Clear all LCM archive and summary state without closing the engine. */
550
- async clearAll() {
709
+ async clearAll(abortSignal) {
551
710
  if (!this.config.enabled || this.closed) return;
552
711
  await this.ensureInitialized();
553
712
  if (this.closed || !this.archive || !this.dag) return;
554
- await this.waitForObserveQueueIdle();
713
+ await this.waitForObserveQueueIdle(abortSignal);
714
+ abortSignal?.throwIfAborted();
555
715
  this.dag.deleteAll();
556
716
  this.archive.deleteAll();
557
717
  }
@@ -570,6 +730,12 @@ ${preview}`,
570
730
  /** Close the database connection. */
571
731
  close() {
572
732
  this.closed = true;
733
+ for (const timer of this.summarizeRetryTimers.values()) clearTimeout(timer);
734
+ this.summarizeRetryTimers.clear();
735
+ this.summarizeRetryAttempts.clear();
736
+ for (const retry of this.summarizeRetryWaiters.values()) retry.resolve();
737
+ this.summarizeRetryWaiters.clear();
738
+ this.summarizeRetryIdleWaiters.clear();
573
739
  if (this.db) {
574
740
  this.db.close();
575
741
  }
@@ -602,4 +768,4 @@ export {
602
768
  extractLcmConfig,
603
769
  LcmEngine
604
770
  };
605
- //# sourceMappingURL=chunk-Y7427SL7.js.map
771
+ //# sourceMappingURL=chunk-ZG4GNPRE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lcm/engine.ts"],"sourcesContent":["import type Database from \"better-sqlite3\";\nimport { openLcmDatabase, ensureLcmStateDir } from \"./schema.js\";\nimport { LcmArchive, type LcmMessage, type LcmStructuredRecallMatch } from \"./archive.js\";\nimport { LcmDag } from \"./dag.js\";\nimport { LcmSummarizer, type SummarizeFn } from \"./summarizer.js\";\nimport {\n assembleCompressedHistoryWithTrace,\n type LcmRecallConfig,\n type LcmRecallWithTraceResult,\n} from \"./recall.js\";\nimport { LcmWorkQueue, type LcmObserveMessage } from \"./queue.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport { estimateTokenCount } from \"../token-estimate.js\";\nimport { log } from \"../logger.js\";\nimport { nativeBindingRecoveryHint } from \"../native-binding-hint.js\";\nexport interface LcmEngineConfig {\n enabled: boolean;\n leafBatchSize: number;\n rollupFanIn: number;\n freshTailTurns: number;\n maxDepth: number;\n deterministicMaxTokens: number;\n archiveRetentionDays: number;\n recallBudgetShare: number;\n observeConcurrency: number;\n telemetryPrefilterEnabled: boolean;\n messagePartsEnabled: boolean;\n messagePartsRecallMaxResults: number;\n}\n\n/** An expanded archive row with stable lineage identity; content may be budget-truncated. */\nexport interface LcmExpandedMessage {\n id: number;\n session_id: string;\n turn_index: number;\n role: string;\n content: string;\n}\n\nfunction positiveInteger(value: unknown, fallback: number, min = 1): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback;\n return Math.max(min, Math.floor(value));\n}\n\nfunction abortOnSignal<T>(abortSignal: AbortSignal | undefined, work: Promise<T>): Promise<T> {\n if (abortSignal === undefined) return work;\n abortSignal.throwIfAborted();\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n reject(abortSignal.reason instanceof Error ? abortSignal.reason : new DOMException(\"Aborted\", \"AbortError\"));\n };\n abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n work.then(resolve, reject).finally(() => abortSignal.removeEventListener(\"abort\", onAbort));\n });\n}\n\nexport function extractLcmConfig(cfg: PluginConfig): LcmEngineConfig {\n return {\n enabled: (cfg as any).lcmEnabled === true,\n leafBatchSize: positiveInteger((cfg as any).lcmLeafBatchSize, 8),\n rollupFanIn: positiveInteger((cfg as any).lcmRollupFanIn, 4, 2),\n freshTailTurns: positiveInteger((cfg as any).lcmFreshTailTurns, 16),\n maxDepth: positiveInteger((cfg as any).lcmMaxDepth, 5),\n deterministicMaxTokens: positiveInteger((cfg as any).lcmDeterministicMaxTokens, 512),\n archiveRetentionDays: positiveInteger((cfg as any).lcmArchiveRetentionDays, 90, 0),\n recallBudgetShare: (cfg as any).lcmRecallBudgetShare ?? 0.15,\n observeConcurrency:\n typeof (cfg as any).lcmObserveConcurrency === \"number\" &&\n Number.isFinite((cfg as any).lcmObserveConcurrency)\n ? Math.max(1, Math.floor((cfg as any).lcmObserveConcurrency))\n : 1,\n telemetryPrefilterEnabled: (cfg as any).lcmTelemetryPrefilterEnabled !== false,\n messagePartsEnabled: (cfg as any).messagePartsEnabled === true,\n messagePartsRecallMaxResults:\n typeof (cfg as any).messagePartsRecallMaxResults === \"number\"\n ? Math.max(0, Math.floor((cfg as any).messagePartsRecallMaxResults))\n : 6,\n };\n}\n\nfunction normalizeLcmSessionId(sessionId: string): string {\n return sessionId.trim();\n}\n\nfunction normalizeOptionalLcmSessionId(sessionId?: string): string | undefined {\n if (sessionId === undefined) {\n return undefined;\n }\n const normalized = normalizeLcmSessionId(sessionId);\n return normalized.length > 0 ? normalized : undefined;\n}\n\nconst EMPTY_LCM_STATS = {\n totalMessages: 0,\n totalSummaryNodes: 0,\n maxDepth: -1,\n} as const;\n\n/**\n * Upper bound on leaf batches summarized by one background job. Keeps a single\n * job's archive read and wall time bounded; leftover batches stay durable and\n * the job re-queues itself.\n */\nconst LCM_SUMMARIZE_MAX_LEAF_BATCHES_PER_JOB = 16;\n\n/** Retry pacing for a failed summary pass: base delay and backoff ceiling. */\nconst LCM_SUMMARIZE_RETRY_BASE_MS = 500;\nconst LCM_SUMMARIZE_RETRY_MAX_MS = 30_000;\n\nexport class LcmEngine {\n private db: Database.Database | null = null;\n private archive: LcmArchive | null = null;\n private dag: LcmDag | null = null;\n private summarizer: LcmSummarizer | null = null;\n private observeQueue: LcmWorkQueue | null = null;\n private closed = false;\n private readonly config: LcmEngineConfig;\n private readonly memoryDir: string;\n private initPromise: Promise<void> | null = null;\n private readonly summarizeRetryTimers = new Map<string, NodeJS.Timeout>();\n private readonly summarizeRetryAttempts = new Map<string, number>();\n /** Resolved when the session's pending retry timer has fired or been cleared. */\n private readonly summarizeRetryWaiters = new Map<\n string,\n { promise: Promise<void>; resolve: () => void }\n >();\n /** Explicit idle waiters per session; referenced only while nonzero. */\n private readonly summarizeRetryIdleWaiters = new Map<string, number>();\n /** Base backoff delay; tests shrink it to keep the retry loop fast. */\n private summarizeRetryBaseMs = LCM_SUMMARIZE_RETRY_BASE_MS;\n private readonly pendingObserveInitCounts = new Map<string, number>();\n private readonly pendingObserveInitWaiters = new Map<string, Array<() => void>>();\n private readonly pendingObserveInitIdleWaiters: Array<() => void> = [];\n\n constructor(\n pluginConfig: PluginConfig,\n private readonly summarizeFn: SummarizeFn,\n ) {\n this.config = extractLcmConfig(pluginConfig);\n this.memoryDir = pluginConfig.memoryDir;\n }\n\n get enabled(): boolean {\n return this.config.enabled;\n }\n\n /** Lazy init — open database on first use. */\n async ensureInitialized(): Promise<void> {\n if (this.closed) return;\n if (this.db) return;\n if (this.initPromise) {\n await this.initPromise;\n return;\n }\n this.initPromise = this.doInit().catch((err) => {\n // Reset so next call retries instead of caching the failure\n this.initPromise = null;\n throw err;\n });\n await this.initPromise;\n }\n\n private async doInit(): Promise<void> {\n await ensureLcmStateDir(this.memoryDir);\n const db = openLcmDatabase(this.memoryDir);\n const archive = new LcmArchive(db);\n const dag = new LcmDag(db);\n const { telemetryPrefilterEnabled } = this.config;\n const summarizer = new LcmSummarizer(\n archive,\n dag,\n this.summarizeFn,\n {\n leafBatchSize: this.config.leafBatchSize,\n rollupFanIn: this.config.rollupFanIn,\n maxDepth: this.config.maxDepth,\n deterministicMaxTokens: this.config.deterministicMaxTokens,\n telemetryPrefilterEnabled,\n },\n );\n const observeQueue = new LcmWorkQueue({\n concurrency: this.config.observeConcurrency,\n worker: async (sessionId) => {\n await this.processSummarizeJob(sessionId);\n },\n hooks: {\n onJobStart: ({ sessionId, depth, inFlight, waitMs }) => {\n log.debug(\n `LCM observe queue start: session=${sessionId}, depth=${depth}, inFlight=${inFlight}, wait=${waitMs}ms`,\n );\n },\n onJobFinish: ({\n sessionId,\n depth,\n inFlight,\n waitMs,\n runMs,\n totalMs,\n error,\n }) => {\n if (error) {\n log.error(\n `LCM observe queue failure: session=${sessionId}, depth=${depth}, inFlight=${inFlight}, wait=${waitMs}ms, run=${runMs}ms, total=${totalMs}ms, error=${error}`,\n );\n return;\n }\n\n log.debug(\n `LCM observe queue finish: session=${sessionId}, depth=${depth}, inFlight=${inFlight}, wait=${waitMs}ms, run=${runMs}ms, total=${totalMs}ms`,\n );\n },\n },\n });\n\n if (this.closed) {\n db.close();\n return;\n }\n\n this.db = db;\n this.archive = archive;\n this.dag = dag;\n this.summarizer = summarizer;\n this.observeQueue = observeQueue;\n this.resumeOutstandingSummaries();\n log.info(\"LCM engine initialized\");\n }\n\n /**\n * Restart resume: sessions whose durable archive still holds complete\n * unsummarized batches get a summary job without any new observe call.\n * Only session references are queued — the content already lives in SQLite.\n */\n private resumeOutstandingSummaries(): void {\n if (!this.archive || !this.observeQueue) return;\n const sessions = this.archive.listSessionsWithUnsummarizedTurns(\n this.config.leafBatchSize,\n );\n if (sessions.length === 0) return;\n for (const sessionId of sessions) this.observeQueue.enqueue(sessionId);\n log.info(`LCM resume scheduled summary jobs: sessions=${sessions.length}`);\n }\n\n /**\n * Archive observed messages and schedule background summarization.\n *\n * The archive append completes BEFORE this resolves: an accepted observe is\n * already durable in SQLite, so a crash cannot lose it. Only the\n * summarization is background work, and it resumes from the durable archive.\n */\n async observeMessages(\n sessionId: string,\n messages: LcmObserveMessage[],\n ): Promise<void> {\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n await this.enqueueObserveMessages(normalizedSessionId, messages);\n }\n\n /**\n * Durably archive messages, then queue a metadata-only summary job.\n *\n * Rejects when the archive append fails — callers must not treat a failed\n * archive as an accepted observation.\n */\n async enqueueObserveMessages(\n sessionId: string,\n messages: LcmObserveMessage[],\n ): Promise<void> {\n // LCM off is a feature gate (the caller reports \"not archived\"); a closed\n // engine is a failure — accepting the turn and archiving nothing would\n // acknowledge a turn the archive never stored.\n if (!this.config.enabled) return;\n if (this.closed) throw new Error(\"LCM engine is closed\");\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n if (messages.length === 0) return;\n\n this.reservePendingObserveInit(normalizedSessionId);\n\n try {\n await this.ensureInitialized();\n if (this.closed) throw new Error(\"LCM engine is closed\");\n if (!this.archive || !this.observeQueue) {\n throw new Error(\"LCM engine is not initialized\");\n }\n\n const archived = this.archiveObservedMessages(normalizedSessionId, messages);\n this.observeQueue.enqueue(normalizedSessionId);\n log.debug(\n `LCM observe archived: session=${normalizedSessionId}, messages=${archived}, depth=${this.observeQueue.depth}, inFlight=${this.observeQueue.inFlightCount}`,\n );\n } catch (err) {\n log.error(\n `LCM observe archive failed: session=${normalizedSessionId}, error=${err}${nativeBindingRecoveryHint(err)}`,\n );\n throw err;\n } finally {\n this.releasePendingObserveInit(normalizedSessionId);\n }\n }\n\n /** Append observed messages to the archive; returns the number of rows. */\n private archiveObservedMessages(\n sessionId: string,\n messages: LcmObserveMessage[],\n ): number {\n const currentMax = this.archive!.getMaxTurnIndex(sessionId);\n const { messagePartsEnabled } = this.config;\n const rows = messages.map((m, i) => ({\n turnIndex: currentMax + 1 + i,\n role: m.role,\n content: m.content,\n parts: messagePartsEnabled ? m.parts : undefined,\n rawContent: messagePartsEnabled ? m.rawContent : undefined,\n sourceFormat: messagePartsEnabled ? m.sourceFormat : undefined,\n }));\n\n this.archive!.appendMessages(sessionId, rows, { messagePartsEnabled });\n return rows.length;\n }\n\n /**\n * Summarize one session's durable backlog.\n *\n * The pass is capped so a long backlog never holds a job open indefinitely;\n * remaining batches stay durable and the job re-queues itself.\n */\n private async processSummarizeJob(sessionId: string): Promise<void> {\n if (this.closed) return;\n await this.ensureInitialized();\n if (this.closed || !this.archive || !this.summarizer || !this.observeQueue)\n return;\n\n try {\n await this.summarizer.summarizeIncremental(sessionId, {\n maxLeafBatches: LCM_SUMMARIZE_MAX_LEAF_BATCHES_PER_JOB,\n });\n } catch (err) {\n // The archived turns are durable; a failed pass must not strand them\n // until the next observe or a restart.\n log.error(`LCM incremental summarization failed: session=${sessionId}, error=${err}`);\n this.scheduleSummarizeRetry(sessionId);\n return;\n }\n\n this.clearSummarizeRetry(sessionId);\n\n if (this.hasCompleteBatchPending(sessionId)) {\n this.observeQueue.enqueue(sessionId);\n }\n }\n\n /**\n * Schedule a metadata-only retry for a failed summary pass.\n *\n * The retry keeps trying for as long as the engine is open and complete\n * batches remain — a transient failure must never strand durable work.\n * What is bounded is the RATE, not the ability to retry: one pending timer\n * per session, exponential backoff capped at\n * {@link LCM_SUMMARIZE_RETRY_MAX_MS}, and an unreferenced timer that is\n * cleared when the engine closes.\n */\n private scheduleSummarizeRetry(sessionId: string): void {\n if (this.closed || this.summarizeRetryTimers.has(sessionId)) return;\n const attempt = (this.summarizeRetryAttempts.get(sessionId) ?? 0) + 1;\n this.summarizeRetryAttempts.set(sessionId, attempt);\n const delayMs = Math.min(\n LCM_SUMMARIZE_RETRY_MAX_MS,\n this.summarizeRetryBaseMs * 2 ** Math.min(attempt - 1, 16),\n );\n // The waiter makes the pending retry visible to idle waits, so a direct\n // flush (pre-compaction) serializes with the retry instead of racing it.\n const retry = Promise.withResolvers<void>();\n this.summarizeRetryWaiters.set(sessionId, retry);\n const timer = setTimeout(() => {\n this.summarizeRetryTimers.delete(sessionId);\n this.summarizeRetryWaiters.delete(sessionId);\n if (this.closed) {\n retry.resolve();\n return;\n }\n if (!this.hasCompleteBatchPending(sessionId)) {\n this.summarizeRetryAttempts.delete(sessionId);\n retry.resolve();\n return;\n }\n // Re-queue before releasing the waiter: an idle wait released by the\n // retry must observe the queued job, never run beside it.\n this.observeQueue?.enqueue(sessionId);\n retry.resolve();\n }, delayMs);\n // Pure background: unreferenced, so a one-shot host is never kept alive\n // by a retry loop. An explicit idle waiter (see waitForSessionObserveIdle)\n // references it for the duration of the wait, and close() clears all.\n timer.unref?.();\n this.summarizeRetryTimers.set(sessionId, timer);\n }\n\n /** True when the session still holds a complete unsummarized batch. */\n private hasCompleteBatchPending(sessionId: string): boolean {\n if (!this.archive) return false;\n return (\n this.archive.countUnsummarizedMessages(sessionId) >=\n this.config.leafBatchSize\n );\n }\n\n /** Drop a pending retry, its attempt counter, and release idle waiters. */\n private clearSummarizeRetry(sessionId: string): void {\n const timer = this.summarizeRetryTimers.get(sessionId);\n if (timer) {\n clearTimeout(timer);\n this.summarizeRetryTimers.delete(sessionId);\n }\n const waiter = this.summarizeRetryWaiters.get(sessionId);\n if (waiter) {\n this.summarizeRetryWaiters.delete(sessionId);\n waiter.resolve();\n }\n this.summarizeRetryAttempts.delete(sessionId);\n }\n\n get observeQueueDepth(): number {\n return this.observeQueue?.depth ?? 0;\n }\n\n get observeQueueInFlightCount(): number {\n return this.observeQueue?.inFlightCount ?? 0;\n }\n\n async waitForObserveQueueIdle(abortSignal?: AbortSignal): Promise<void> {\n abortSignal?.throwIfAborted();\n if (!this.config.enabled || this.closed) return;\n await this.ensureInitialized();\n abortSignal?.throwIfAborted();\n if (this.closed) return;\n for (;;) {\n abortSignal?.throwIfAborted();\n await this.waitForPendingObserveInitIdle(undefined, abortSignal);\n await this.observeQueue?.whenIdle(abortSignal);\n abortSignal?.throwIfAborted();\n const entry = [...this.summarizeRetryWaiters.entries()][0];\n if (!entry) return;\n await this.awaitSummarizeRetry(entry[0], entry[1], abortSignal);\n // A fired retry may have re-queued a session: wait for the queue again.\n }\n }\n\n async waitForSessionObserveIdle(sessionId: string, abortSignal?: AbortSignal): Promise<void> {\n abortSignal?.throwIfAborted();\n if (!this.config.enabled || this.closed) return;\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n await this.ensureInitialized();\n abortSignal?.throwIfAborted();\n if (this.closed) return;\n // Serialize with pending summary retries: a direct flush (pre-compaction)\n // must not run beside a retry pass for the same session.\n for (;;) {\n await this.waitForPendingObserveInitIdle(normalizedSessionId, abortSignal);\n await this.observeQueue?.whenSessionIdle(normalizedSessionId, abortSignal) ?? Promise.resolve();\n const waiter = this.summarizeRetryWaiters.get(normalizedSessionId);\n if (!waiter) return;\n await this.awaitSummarizeRetry(normalizedSessionId, waiter, abortSignal);\n // The retry fired and may have re-queued the session: wait again.\n }\n }\n\n /**\n * Park an explicit idle wait on a pending retry. While any wait is parked,\n * the retry timer is referenced so a one-shot host cannot exit under the\n * wait; with no waiters the timer stays unreferenced background work.\n */\n private async awaitSummarizeRetry(\n sessionId: string,\n waiter: { promise: Promise<void>; resolve: () => void },\n abortSignal?: AbortSignal,\n ): Promise<void> {\n const waiters = (this.summarizeRetryIdleWaiters.get(sessionId) ?? 0) + 1;\n this.summarizeRetryIdleWaiters.set(sessionId, waiters);\n this.summarizeRetryTimers.get(sessionId)?.ref?.();\n try {\n await abortOnSignal(abortSignal, waiter.promise);\n } finally {\n const remaining = (this.summarizeRetryIdleWaiters.get(sessionId) ?? 1) - 1;\n if (remaining <= 0) {\n this.summarizeRetryIdleWaiters.delete(sessionId);\n this.summarizeRetryTimers.get(sessionId)?.unref?.();\n } else {\n this.summarizeRetryIdleWaiters.set(sessionId, remaining);\n }\n }\n }\n\n private reservePendingObserveInit(sessionId: string): void {\n const count = this.pendingObserveInitCounts.get(sessionId) ?? 0;\n this.pendingObserveInitCounts.set(sessionId, count + 1);\n }\n\n private releasePendingObserveInit(sessionId: string): void {\n const count = this.pendingObserveInitCounts.get(sessionId);\n if (!count) return;\n\n if (count === 1) {\n this.pendingObserveInitCounts.delete(sessionId);\n const waiters = this.pendingObserveInitWaiters.get(sessionId) ?? [];\n this.pendingObserveInitWaiters.delete(sessionId);\n for (const resolve of waiters) resolve();\n if (this.pendingObserveInitCounts.size === 0) {\n const idleWaiters = this.pendingObserveInitIdleWaiters.splice(\n 0,\n this.pendingObserveInitIdleWaiters.length,\n );\n for (const resolve of idleWaiters) resolve();\n }\n return;\n }\n\n this.pendingObserveInitCounts.set(sessionId, count - 1);\n }\n\n private async waitForPendingObserveInitIdle(sessionId?: string, abortSignal?: AbortSignal): Promise<void> {\n abortSignal?.throwIfAborted();\n if (sessionId) {\n if (!this.pendingObserveInitCounts.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.pendingObserveInitWaiters.get(sessionId) ?? []).filter((waiter) => waiter !== finish);\n if (remaining.length === 0) this.pendingObserveInitWaiters.delete(sessionId);\n else this.pendingObserveInitWaiters.set(sessionId, remaining);\n reject(abortSignal?.reason instanceof Error ? abortSignal.reason : new DOMException(\"Aborted\", \"AbortError\"));\n };\n const waiters = this.pendingObserveInitWaiters.get(sessionId) ?? [];\n waiters.push(finish);\n this.pendingObserveInitWaiters.set(sessionId, waiters);\n abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n return;\n }\n\n if (this.pendingObserveInitCounts.size === 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.pendingObserveInitIdleWaiters.filter((waiter) => waiter !== finish);\n this.pendingObserveInitIdleWaiters.splice(0, this.pendingObserveInitIdleWaiters.length, ...remaining);\n reject(abortSignal?.reason instanceof Error ? abortSignal.reason : new DOMException(\"Aborted\", \"AbortError\"));\n };\n this.pendingObserveInitIdleWaiters.push(finish);\n abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n /** Build the compressed history recall section for a session. */\n async assembleRecall(\n sessionId: string,\n budgetChars: number,\n ): Promise<string> {\n return (await this.assembleRecallWithTrace(sessionId, budgetChars)).text;\n }\n\n /** Build compressed recall plus content-free selected-summary receipts. */\n async assembleRecallWithTrace(\n sessionId: string,\n budgetChars: number,\n ): Promise<LcmRecallWithTraceResult> {\n if (!this.config.enabled) return { text: \"\", selectedSummaries: [] };\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return { text: \"\", selectedSummaries: [] };\n await this.ensureInitialized();\n\n const effectiveBudget = Math.ceil(\n budgetChars * this.config.recallBudgetShare,\n );\n if (effectiveBudget <= 0) return { text: \"\", selectedSummaries: [] };\n\n return assembleCompressedHistoryWithTrace(this.dag!, this.archive!, normalizedSessionId, {\n freshTailTurns: this.config.freshTailTurns,\n budgetChars: effectiveBudget,\n });\n }\n\n async searchStructuredParts(\n sessionId: string,\n query: string,\n limit = this.config.messagePartsRecallMaxResults,\n ): Promise<LcmStructuredRecallMatch[]> {\n const { messagePartsEnabled } = this.config;\n if (!this.config.enabled || !messagePartsEnabled) return [];\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return [];\n await this.ensureInitialized();\n if (!this.archive) return [];\n return this.archive.searchStructuredParts(query, limit, normalizedSessionId);\n }\n\n formatStructuredRecall(\n matches: LcmStructuredRecallMatch[],\n budgetChars: number,\n ): string {\n if (matches.length === 0 || budgetChars <= 0) return \"\";\n const lines: string[] = [];\n let used = \"## Structured Session Matches\\n\\n\".length;\n for (const match of matches) {\n const label = match.file_path\n ? `${match.kind} ${match.file_path}`\n : match.tool_name\n ? `${match.kind} ${match.tool_name}`\n : match.kind;\n const excerpt = match.content.replace(/\\s+/g, \" \").slice(0, 220);\n const line = `- turn ${match.turn_index} (${match.role}): ${label} — ${excerpt}`;\n if (used + line.length + 1 > budgetChars) break;\n lines.push(line);\n used += line.length + 1;\n }\n return lines.length > 0 ? `## Structured Session Matches\\n\\n${lines.join(\"\\n\")}` : \"\";\n }\n\n /** Flush pending summaries before compaction (called from before_compaction hook). */\n async preCompactionFlush(sessionId: string, abortSignal?: AbortSignal): Promise<void> {\n abortSignal?.throwIfAborted();\n if (!this.config.enabled) return;\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n await this.ensureInitialized();\n abortSignal?.throwIfAborted();\n await this.waitForSessionObserveIdle(normalizedSessionId, abortSignal);\n abortSignal?.throwIfAborted();\n\n try {\n await abortOnSignal(abortSignal, this.summarizer!.summarizeIncremental(normalizedSessionId));\n } catch (err) {\n if (abortSignal?.aborted) throw err;\n log.debug(`LCM pre-compaction flush error: ${err}`);\n }\n }\n\n /** Record a compaction event with real token counts (called from after_compaction hook). */\n async recordCompaction(\n sessionId: string,\n tokensBefore: number,\n tokensAfter: number,\n ): Promise<void> {\n if (!this.config.enabled) return;\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n await this.ensureInitialized();\n await this.waitForSessionObserveIdle(normalizedSessionId);\n\n const maxTurn = this.archive!.getMaxTurnIndex(normalizedSessionId);\n\n this.dag!.recordCompaction(normalizedSessionId, maxTurn, tokensBefore, tokensAfter);\n log.info(\n `LCM compaction recorded: session=${normalizedSessionId}, turn=${maxTurn}, tokens ${tokensBefore}→${tokensAfter}`,\n );\n }\n\n /** Verify archive coverage after compaction. */\n async verifyPostCompaction(sessionId: string): Promise<void> {\n if (!this.config.enabled) return;\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n await this.ensureInitialized();\n\n const msgCount = this.archive!.getMessageCount(normalizedSessionId);\n const nodeCount = this.dag!.getNodeCount(normalizedSessionId);\n log.debug(\n `LCM post-compaction verify: session=${normalizedSessionId}, messages=${msgCount}, summaryNodes=${nodeCount}`,\n );\n }\n\n // ── MCP Tool implementations ──\n\n /** Search across all conversation history via FTS (snippet mode). */\n async searchContext(\n query: string,\n limit: number,\n sessionId?: string,\n sessionPrefix?: string,\n ): Promise<\n Array<{\n turn_index: number;\n role: string;\n snippet: string;\n session_id: string;\n }>\n > {\n if (!this.config.enabled) return [];\n const normalizedSessionId = normalizeOptionalLcmSessionId(sessionId);\n if (sessionId !== undefined && !normalizedSessionId) return [];\n const normalizedSessionPrefix = normalizeOptionalLcmSessionId(sessionPrefix);\n if (sessionPrefix !== undefined && !normalizedSessionPrefix) return [];\n await this.ensureInitialized();\n return this.archive!.search(query, limit, normalizedSessionId, normalizedSessionPrefix);\n }\n\n /** Search via FTS returning full message content (not snippets). */\n async searchContextFull(\n query: string,\n limit: number,\n sessionId?: string,\n sessionPrefix?: string,\n ): Promise<\n Array<{\n id: number;\n turn_index: number;\n role: string;\n content: string;\n session_id: string;\n score: number;\n }>\n > {\n if (!this.config.enabled) return [];\n const normalizedSessionId = normalizeOptionalLcmSessionId(sessionId);\n if (sessionId !== undefined && !normalizedSessionId) return [];\n const normalizedSessionPrefix = normalizeOptionalLcmSessionId(sessionPrefix);\n if (sessionPrefix !== undefined && !normalizedSessionPrefix) return [];\n await this.ensureInitialized();\n return this.archive!.searchWithContent(\n query,\n limit,\n normalizedSessionId,\n 1000,\n normalizedSessionPrefix,\n );\n }\n\n /** Get a compressed summary of a turn range. */\n async describeContext(\n sessionId: string,\n fromTurn: number,\n toTurn: number,\n ): Promise<{ summary: string; turn_count: number; depth: number } | null> {\n if (!this.config.enabled) return null;\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return null;\n await this.ensureInitialized();\n\n const nodes = this.dag!.getCoveringNodes(normalizedSessionId, fromTurn, toTurn);\n if (nodes.length === 0) {\n // No summary exists — build a description from raw messages\n const messages = this.archive!.getMessages(normalizedSessionId, fromTurn, toTurn);\n if (messages.length === 0) return null;\n const preview = messages\n .slice(0, 5)\n .map((m) => `[${m.role}] ${m.content.slice(0, 100)}`)\n .join(\"\\n\");\n return {\n summary: `No summary available for this range. Preview of ${messages.length} messages:\\n${preview}`,\n turn_count: messages.length,\n depth: -1,\n };\n }\n\n // Use the deepest covering node\n const best = nodes[0]; // Already sorted by depth DESC\n return {\n summary: best.summary_text,\n turn_count: best.msg_end - best.msg_start + 1,\n depth: best.depth,\n };\n }\n\n /**\n * Retrieve raw archived messages for a turn range (inclusive bounds),\n * read-only and unshaped — no token-budget trimming (issue #2331\n * episodic-context). Callers own truncation and cleaning.\n */\n async getTurnRange(\n sessionId: string,\n fromTurn: number,\n toTurn: number,\n ): Promise<LcmMessage[]> {\n if (!this.config.enabled) return [];\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return [];\n await this.ensureInitialized();\n return this.archive!.getMessages(normalizedSessionId, fromTurn, toTurn);\n }\n\n /** Retrieve raw messages for a turn range (lossless expansion). */\n async expandContext(\n sessionId: string,\n fromTurn: number,\n toTurn: number,\n maxTokens: number,\n ): Promise<LcmExpandedMessage[]> {\n if (!this.config.enabled) return [];\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return [];\n await this.ensureInitialized();\n\n const messages = this.archive!.getMessages(normalizedSessionId, fromTurn, toTurn);\n if (messages.length === 0) return [];\n\n // Enforce the token budget while keeping the existing first/last shape.\n const tokenBudget = Math.max(0, Math.floor(maxTokens));\n if (tokenBudget === 0) return [];\n const totalTokens = messages.reduce(\n (sum, message) => sum + estimateTokenCount(message.content),\n 0,\n );\n if (totalTokens <= tokenBudget) {\n return messages.map((m) => ({\n id: m.id,\n session_id: m.session_id,\n turn_index: m.turn_index,\n role: m.role,\n content: m.content,\n }));\n }\n\n const result: LcmExpandedMessage[] = [];\n const lastMsg = messages[messages.length - 1];\n const reservedLastTokens = Math.min(\n estimateTokenCount(lastMsg.content),\n Math.max(1, Math.floor(tokenBudget * 0.3)),\n );\n let remainingTokens = tokenBudget - reservedLastTokens;\n\n for (let i = 0; i < messages.length - 1; i++) {\n if (remainingTokens <= 0) break;\n const content = truncateToTokenBudget(\n messages[i].content,\n remainingTokens,\n );\n if (!content) continue;\n result.push({\n id: messages[i].id,\n session_id: messages[i].session_id,\n turn_index: messages[i].turn_index,\n role: messages[i].role,\n content,\n });\n remainingTokens -= estimateTokenCount(content);\n }\n\n const lastContent = truncateToTokenBudget(\n lastMsg.content,\n reservedLastTokens + remainingTokens,\n );\n if (lastContent) {\n result.push({\n id: lastMsg.id,\n session_id: lastMsg.session_id,\n turn_index: lastMsg.turn_index,\n role: lastMsg.role,\n content: lastContent,\n });\n }\n return result;\n }\n\n\n /** Get statistics about the LCM archive. */\n async getStats(sessionId?: string): Promise<{\n totalMessages: number;\n totalSummaryNodes: number;\n maxDepth: number;\n maxTurnIndex?: number;\n }> {\n if (!this.config.enabled)\n return { totalMessages: 0, totalSummaryNodes: 0, maxDepth: -1 };\n const normalizedSessionId = normalizeOptionalLcmSessionId(sessionId);\n if (sessionId !== undefined && !normalizedSessionId) {\n return { ...EMPTY_LCM_STATS };\n }\n await this.ensureInitialized();\n\n if (normalizedSessionId) {\n return {\n totalMessages: this.archive!.getMessageCount(normalizedSessionId),\n totalSummaryNodes: this.dag!.getNodeCount(normalizedSessionId),\n maxDepth: this.dag!.getMaxDepth(normalizedSessionId),\n maxTurnIndex: this.archive!.getMaxTurnIndex(normalizedSessionId),\n };\n }\n\n return {\n totalMessages: this.archive!.getTotalMessageCount(),\n totalSummaryNodes: 0, // Would need a global count query\n maxDepth: -1,\n };\n }\n\n /** Clear all LCM archive and summary state for one session. */\n async clearSession(sessionId: string, abortSignal?: AbortSignal): Promise<void> {\n if (!this.config.enabled || this.closed) return;\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n await this.ensureInitialized();\n if (this.closed || !this.archive || !this.dag) return;\n await this.waitForSessionObserveIdle(normalizedSessionId, abortSignal);\n abortSignal?.throwIfAborted();\n this.dag.deleteSession(normalizedSessionId);\n this.archive.deleteSession(normalizedSessionId);\n }\n\n /** Clear all LCM archive and summary state without closing the engine. */\n async clearAll(abortSignal?: AbortSignal): Promise<void> {\n if (!this.config.enabled || this.closed) return;\n await this.ensureInitialized();\n if (this.closed || !this.archive || !this.dag) return;\n await this.waitForObserveQueueIdle(abortSignal);\n abortSignal?.throwIfAborted();\n this.dag.deleteAll();\n this.archive.deleteAll();\n }\n\n /** Prune old data beyond retention period. */\n async prune(): Promise<{ messagesPruned: number; nodesPruned: number }> {\n if (!this.config.enabled) return { messagesPruned: 0, nodesPruned: 0 };\n await this.ensureInitialized();\n\n const messagesPruned = this.archive!.pruneOldMessages(\n this.config.archiveRetentionDays,\n );\n const nodesPruned = this.dag!.pruneOldNodes(\n this.config.archiveRetentionDays,\n );\n return { messagesPruned, nodesPruned };\n }\n\n /** Close the database connection. */\n close(): void {\n this.closed = true;\n for (const timer of this.summarizeRetryTimers.values()) clearTimeout(timer);\n this.summarizeRetryTimers.clear();\n this.summarizeRetryAttempts.clear();\n for (const retry of this.summarizeRetryWaiters.values()) retry.resolve();\n this.summarizeRetryWaiters.clear();\n this.summarizeRetryIdleWaiters.clear();\n if (this.db) {\n this.db.close();\n }\n this.db = null;\n this.archive = null;\n this.dag = null;\n this.summarizer = null;\n this.observeQueue = null;\n this.initPromise = null;\n }\n}\nfunction truncateToTokenBudget(text: string, maxTokens: number): string {\n if (maxTokens <= 0) return \"\";\n if (estimateTokenCount(text) <= maxTokens) return text;\n const codePoints = [...text];\n let low = 0;\n let high = codePoints.length;\n while (low < high) {\n const mid = Math.ceil((low + high) / 2);\n if (estimateTokenCount(codePoints.slice(0, mid).join(\"\")) <= maxTokens) {\n low = mid;\n } else {\n high = mid - 1;\n }\n }\n return codePoints.slice(0, low).join(\"\");\n}\n"],"mappings":"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","names":[]}