@remnic/core 10.0.60 → 10.0.62

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 (289) hide show
  1. package/dist/access-admin-ops-surface.js +25 -24
  2. package/dist/access-authorization-probe.js +26 -25
  3. package/dist/access-boundary.js +25 -24
  4. package/dist/access-cli.js +73 -72
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +25 -24
  7. package/dist/access-http-briefing.js +26 -25
  8. package/dist/access-http-query.js +27 -26
  9. package/dist/access-http.js +44 -43
  10. package/dist/access-identity-continuity-surface.js +25 -24
  11. package/dist/access-lcm-surface.js +25 -24
  12. package/dist/access-mcp.js +36 -35
  13. package/dist/access-namespace-preflight.js +25 -24
  14. package/dist/access-observe-write-category.js +4 -4
  15. package/dist/access-observe-write-surface.js +25 -24
  16. package/dist/access-operations-batch.js +27 -26
  17. package/dist/access-operations.js +34 -33
  18. package/dist/access-recall-concurrency.js +25 -24
  19. package/dist/access-recall-diagnostics.js +2 -2
  20. package/dist/access-recall-response.js +25 -24
  21. package/dist/access-recall-surface.js +25 -24
  22. package/dist/access-schema.js +3 -3
  23. package/dist/access-service.js +25 -24
  24. package/dist/access-surface-catalog.js +27 -26
  25. package/dist/access-surface-catalog.js.map +1 -1
  26. package/dist/active-recall.js +8 -6
  27. package/dist/active-recall.js.map +1 -1
  28. package/dist/briefing.js +8 -6
  29. package/dist/buffer-persistence.d.ts +14 -3
  30. package/dist/buffer-persistence.d.ts.map +1 -1
  31. package/dist/buffer-persistence.js +1 -1
  32. package/dist/buffer-turn-helpers.d.ts +7 -0
  33. package/dist/buffer-turn-helpers.d.ts.map +1 -1
  34. package/dist/buffer-turn-helpers.js +5 -3
  35. package/dist/buffer.d.ts +5 -1
  36. package/dist/buffer.d.ts.map +1 -1
  37. package/dist/buffer.js +3 -3
  38. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-GWVG7LGC.js} +2 -2
  39. package/dist/causal-consolidation.js +9 -7
  40. package/dist/causal-consolidation.js.map +1 -1
  41. package/dist/{chunk-VHBGJAYC.js → chunk-25QK3LR2.js} +2 -2
  42. package/dist/{chunk-X2TZWVCC.js → chunk-3HLWLYRD.js} +2 -2
  43. package/dist/{chunk-TIS6T6UP.js → chunk-3VNRDRBM.js} +2 -2
  44. package/dist/{chunk-4O4VAEWH.js → chunk-4NLHEE2Z.js} +2 -2
  45. package/dist/{chunk-3DG2YAAX.js → chunk-6EZPYZT3.js} +62 -35
  46. package/dist/chunk-6EZPYZT3.js.map +1 -0
  47. package/dist/{chunk-I6UTOUBK.js → chunk-6VBKU3FY.js} +150 -345
  48. package/dist/chunk-6VBKU3FY.js.map +1 -0
  49. package/dist/{chunk-66CC6L6R.js → chunk-76LKZ42K.js} +2 -2
  50. package/dist/{chunk-LR7RW4T6.js → chunk-7ETWIBTO.js} +3 -3
  51. package/dist/{chunk-JM2WJBP7.js → chunk-7JFXXA57.js} +2 -2
  52. package/dist/{chunk-PIVSUPF2.js → chunk-A6JV3WHI.js} +2 -2
  53. package/dist/{chunk-MOB4JHG6.js → chunk-BDNPW3KM.js} +2 -2
  54. package/dist/{chunk-IJFX4JRI.js → chunk-BQOOUKEN.js} +7 -7
  55. package/dist/{chunk-PRSF7DWT.js → chunk-BU4W2ISH.js} +2 -2
  56. package/dist/{chunk-KQAFEZQX.js → chunk-BUKK5SWA.js} +2 -2
  57. package/dist/{chunk-JRY55I6Z.js → chunk-C2AYUXEF.js} +2 -2
  58. package/dist/{chunk-DF4SYU4Z.js → chunk-C5OW2FFB.js} +2 -2
  59. package/dist/{chunk-74Z2BYEK.js → chunk-CYEEVWQ6.js} +2 -2
  60. package/dist/{chunk-M7KAJBO2.js → chunk-EADUOZWH.js} +3 -3
  61. package/dist/{chunk-N5H22V75.js → chunk-ECT5ME6X.js} +2 -2
  62. package/dist/{chunk-M3GOWG2P.js → chunk-FMOUUWQN.js} +2 -2
  63. package/dist/{chunk-2EJAPJ5G.js → chunk-FYPKSR6Z.js} +2 -2
  64. package/dist/{chunk-L5RMURVI.js → chunk-GDCKOER4.js} +41 -13
  65. package/dist/chunk-GDCKOER4.js.map +1 -0
  66. package/dist/{chunk-LGLLCWA2.js → chunk-GNEB3WXR.js} +2 -2
  67. package/dist/{chunk-Z4EH5TSO.js → chunk-HNZH57JK.js} +2 -2
  68. package/dist/{chunk-PTJWUN4H.js → chunk-IJKBIOWL.js} +30 -30
  69. package/dist/{chunk-C5GTIRIO.js → chunk-IMNJJKHW.js} +22 -22
  70. package/dist/{chunk-ADK5TMQL.js → chunk-IVJI5FDA.js} +2 -2
  71. package/dist/{chunk-F3GX76LV.js → chunk-IWAB7JVH.js} +2 -2
  72. package/dist/{chunk-JFRO5HJY.js → chunk-J62O2UW5.js} +2 -2
  73. package/dist/chunk-JCL7RO2G.js +674 -0
  74. package/dist/chunk-JCL7RO2G.js.map +1 -0
  75. package/dist/{chunk-A3UFV4K3.js → chunk-JIYJIH5N.js} +2 -2
  76. package/dist/{chunk-UIX4JLVV.js → chunk-JVFYP2LD.js} +2 -2
  77. package/dist/{chunk-KJ3MDX4V.js → chunk-KXY4HW2Y.js} +2 -2
  78. package/dist/{chunk-VQ6H4DL6.js → chunk-L334PSLW.js} +4 -4
  79. package/dist/{chunk-IA3XZG4V.js → chunk-L74VVEJA.js} +2 -2
  80. package/dist/{chunk-UY67YP6Q.js → chunk-LIUI46BX.js} +2 -2
  81. package/dist/{chunk-4OFXLQJD.js → chunk-MPDLLLOG.js} +8 -3
  82. package/dist/chunk-MPDLLLOG.js.map +1 -0
  83. package/dist/{chunk-UP2Q7U4G.js → chunk-MTVC5S5N.js} +2 -2
  84. package/dist/{chunk-QWURVT5Z.js → chunk-N7CATBYH.js} +2 -2
  85. package/dist/{chunk-JEDS2QYV.js → chunk-OH55F76C.js} +2 -2
  86. package/dist/{chunk-2NLLXCJG.js → chunk-OWHERGF2.js} +2 -2
  87. package/dist/{chunk-G6GMZJQ4.js → chunk-PA6ZNFB7.js} +2 -2
  88. package/dist/{chunk-6BKSUA6P.js → chunk-PWEIZCPS.js} +2 -2
  89. package/dist/{chunk-T4SMMTGY.js → chunk-Q3DAWUAV.js} +2 -2
  90. package/dist/{chunk-AWKADEMO.js → chunk-QCAJMIAE.js} +3 -3
  91. package/dist/{chunk-ZRDEOC4X.js → chunk-QI7LLSWX.js} +2 -2
  92. package/dist/{chunk-7DHNBABU.js → chunk-QJ6IR35B.js} +3 -3
  93. package/dist/{chunk-J53IBVMF.js → chunk-R25JMO5O.js} +2 -2
  94. package/dist/{chunk-PARM6OYL.js → chunk-SEA56G6S.js} +1 -1
  95. package/dist/chunk-SEA56G6S.js.map +1 -0
  96. package/dist/{chunk-HL643H2F.js → chunk-TMWSCE2L.js} +8 -8
  97. package/dist/{chunk-FLDXEJFX.js → chunk-TPCRDPUY.js} +2 -2
  98. package/dist/{chunk-KZMRMKC7.js → chunk-U7MIMS2Y.js} +11 -1
  99. package/dist/chunk-U7MIMS2Y.js.map +1 -0
  100. package/dist/{chunk-WJC5KGYC.js → chunk-UFQB5VQ5.js} +6 -6
  101. package/dist/{chunk-64WHWIPL.js → chunk-UVHXLVFJ.js} +2 -2
  102. package/dist/{chunk-X7Y7WX73.js → chunk-UVYI6VIX.js} +1 -1
  103. package/dist/{chunk-5XY46Z2W.js → chunk-UXRCORZX.js} +3 -3
  104. package/dist/{chunk-WUL6LDJ4.js → chunk-VPEA63FC.js} +2 -2
  105. package/dist/{chunk-MHSUEA32.js → chunk-WA6XRNWE.js} +3 -3
  106. package/dist/{chunk-GGHX4YHM.js → chunk-WB3OFPM2.js} +2 -2
  107. package/dist/{chunk-RSYFSCKL.js → chunk-WZEDFDJ6.js} +14 -14
  108. package/dist/{chunk-2HVCTFKG.js → chunk-X2ZLHUEO.js} +2 -2
  109. package/dist/{chunk-PJLJN23N.js → chunk-XICJL56Z.js} +2 -2
  110. package/dist/{chunk-ZXEPLZUQ.js → chunk-YGM47S7M.js} +7 -7
  111. package/dist/{chunk-XWXBXBOX.js → chunk-YLB7TW2B.js} +2 -1
  112. package/dist/chunk-YLB7TW2B.js.map +1 -0
  113. package/dist/{chunk-KXDUSGPM.js → chunk-YRL4PGPP.js} +2 -2
  114. package/dist/{chunk-GJF337YM.js → chunk-Z45353ML.js} +2 -2
  115. package/dist/{chunk-NJZY5LOC.js → chunk-ZARHK7PT.js} +2 -2
  116. package/dist/{chunk-NF5EHQTJ.js → chunk-ZFU2B2GM.js} +5 -5
  117. package/dist/{chunk-W37MS6SX.js → chunk-ZRSXXWIX.js} +2 -2
  118. package/dist/cli.js +60 -59
  119. package/dist/coding/export-okf-codegraph.js +7 -5
  120. package/dist/coding/export-okf-codegraph.js.map +1 -1
  121. package/dist/compounding/engine.js +9 -7
  122. package/dist/config.d.ts.map +1 -1
  123. package/dist/config.js +8 -6
  124. package/dist/connectors/codex-materialize-runner.js +8 -6
  125. package/dist/connectors/index.js +8 -6
  126. package/dist/convergence-refresh.js +10 -8
  127. package/dist/corpus-watermark.js +10 -8
  128. package/dist/deep-recall-http-glue.js +4 -4
  129. package/dist/entity-retrieval.js +8 -6
  130. package/dist/external-wiki-access.js +26 -25
  131. package/dist/extraction.js +8 -6
  132. package/dist/harmonic-retrieval.js +8 -6
  133. package/dist/index.d.ts +1 -1
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +75 -72
  136. package/dist/location/index.js +10 -8
  137. package/dist/maintenance/memory-governance.js +8 -6
  138. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +8 -6
  139. package/dist/maintenance/rebuild-memory-projection-runner.js +10 -8
  140. package/dist/maintenance/rebuild-memory-projection.js +9 -7
  141. package/dist/memory-browse-operations.js +26 -25
  142. package/dist/namespaces/migrate.js +9 -7
  143. package/dist/namespaces/search.js +3 -3
  144. package/dist/namespaces/storage.js +8 -6
  145. package/dist/operator-doctor-corpus.js +11 -9
  146. package/dist/operator-toolkit.js +17 -15
  147. package/dist/orchestration/buffer-drain-gate.d.ts +21 -0
  148. package/dist/orchestration/buffer-drain-gate.d.ts.map +1 -0
  149. package/dist/orchestration/buffer-drain-runner.d.ts +79 -0
  150. package/dist/orchestration/buffer-drain-runner.d.ts.map +1 -0
  151. package/dist/orchestration/buffer-drain-runner.js +780 -0
  152. package/dist/orchestration/buffer-drain-runner.js.map +1 -0
  153. package/dist/orchestration/buffer-swap.d.ts +12 -0
  154. package/dist/orchestration/buffer-swap.d.ts.map +1 -0
  155. package/dist/orchestration/maintenance.js +18 -16
  156. package/dist/orchestration/turn-ingestion.d.ts.map +1 -1
  157. package/dist/orchestrator.d.ts +4 -1
  158. package/dist/orchestrator.d.ts.map +1 -1
  159. package/dist/orchestrator.js +73 -72
  160. package/dist/recall-explain-renderer.js +3 -3
  161. package/dist/recall-navigate-access.js +2 -2
  162. package/dist/recall-navigate-disclosure.js +2 -2
  163. package/dist/recall-navigate.js +2 -2
  164. package/dist/recall-navigation-operations.js +26 -25
  165. package/dist/recall-navigation.js +25 -24
  166. package/dist/recall-xray-cli.js +4 -4
  167. package/dist/recall-xray-renderer.js +3 -3
  168. package/dist/recall-xray.js +2 -2
  169. package/dist/resume-bundles.js +9 -7
  170. package/dist/search/factory.js +2 -2
  171. package/dist/search/index.js +4 -4
  172. package/dist/semantic-consolidation.js +9 -7
  173. package/dist/semantic-rule-promotion.js +8 -6
  174. package/dist/semantic-rule-verifier.js +8 -6
  175. package/dist/source-agent-qualifier.js +8 -6
  176. package/dist/standup/build.js +8 -6
  177. package/dist/storage/buffer-drain-claims.d.ts +159 -0
  178. package/dist/storage/buffer-drain-claims.d.ts.map +1 -0
  179. package/dist/storage/buffer-drain-claims.js +18 -0
  180. package/dist/storage/buffer-drain-claims.js.map +1 -0
  181. package/dist/storage/buffer-session-files.d.ts +14 -2
  182. package/dist/storage/buffer-session-files.d.ts.map +1 -1
  183. package/dist/storage/buffer-session-files.js +22 -0
  184. package/dist/storage/buffer-session-files.js.map +1 -0
  185. package/dist/storage.d.ts +6 -1
  186. package/dist/storage.d.ts.map +1 -1
  187. package/dist/storage.js +7 -5
  188. package/dist/support-passport/index.js +28 -27
  189. package/dist/transfer/backup.js +2 -2
  190. package/dist/transfer/capsule-export.js +2 -2
  191. package/dist/transfer/capsule-import.js +2 -2
  192. package/dist/transfer/export-okf.js +8 -6
  193. package/dist/types.d.ts +2 -0
  194. package/dist/types.d.ts.map +1 -1
  195. package/dist/types.js +1 -1
  196. package/dist/verified-recall.js +8 -6
  197. package/dist/who-knows-cli.js +9 -7
  198. package/dist/who-knows.js +8 -6
  199. package/package.json +32 -2
  200. package/src/access-observe-replay-durability.test.ts +1 -0
  201. package/src/buffer-drain-handover.test.ts +307 -0
  202. package/src/buffer-incremental-persistence.test.ts +19 -1
  203. package/src/buffer-persistence.ts +27 -5
  204. package/src/buffer-session.test.ts +3 -3
  205. package/src/buffer-turn-helpers.ts +16 -0
  206. package/src/buffer.ts +50 -10
  207. package/src/config.ts +1 -0
  208. package/src/index.ts +1 -1
  209. package/src/orchestration/buffer-drain-gate.test.ts +40 -0
  210. package/src/orchestration/buffer-drain-gate.ts +38 -0
  211. package/src/orchestration/buffer-drain-runner.ts +312 -0
  212. package/src/orchestration/buffer-swap.ts +27 -0
  213. package/src/orchestration/turn-ingestion.ts +2 -0
  214. package/src/orchestrator.ts +9 -6
  215. package/src/storage/buffer-drain-claims.test.ts +448 -0
  216. package/src/storage/buffer-drain-claims.ts +593 -0
  217. package/src/storage/buffer-session-files.ts +50 -3
  218. package/src/storage.ts +8 -11
  219. package/src/testing/subjects/extraction-lifecycle.test.ts +34 -0
  220. package/src/types.ts +2 -0
  221. package/dist/chunk-3DG2YAAX.js.map +0 -1
  222. package/dist/chunk-4OFXLQJD.js.map +0 -1
  223. package/dist/chunk-I6UTOUBK.js.map +0 -1
  224. package/dist/chunk-KZMRMKC7.js.map +0 -1
  225. package/dist/chunk-L5RMURVI.js.map +0 -1
  226. package/dist/chunk-PARM6OYL.js.map +0 -1
  227. package/dist/chunk-XWXBXBOX.js.map +0 -1
  228. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-GWVG7LGC.js.map} +0 -0
  229. /package/dist/{chunk-VHBGJAYC.js.map → chunk-25QK3LR2.js.map} +0 -0
  230. /package/dist/{chunk-X2TZWVCC.js.map → chunk-3HLWLYRD.js.map} +0 -0
  231. /package/dist/{chunk-TIS6T6UP.js.map → chunk-3VNRDRBM.js.map} +0 -0
  232. /package/dist/{chunk-4O4VAEWH.js.map → chunk-4NLHEE2Z.js.map} +0 -0
  233. /package/dist/{chunk-66CC6L6R.js.map → chunk-76LKZ42K.js.map} +0 -0
  234. /package/dist/{chunk-LR7RW4T6.js.map → chunk-7ETWIBTO.js.map} +0 -0
  235. /package/dist/{chunk-JM2WJBP7.js.map → chunk-7JFXXA57.js.map} +0 -0
  236. /package/dist/{chunk-PIVSUPF2.js.map → chunk-A6JV3WHI.js.map} +0 -0
  237. /package/dist/{chunk-MOB4JHG6.js.map → chunk-BDNPW3KM.js.map} +0 -0
  238. /package/dist/{chunk-IJFX4JRI.js.map → chunk-BQOOUKEN.js.map} +0 -0
  239. /package/dist/{chunk-PRSF7DWT.js.map → chunk-BU4W2ISH.js.map} +0 -0
  240. /package/dist/{chunk-KQAFEZQX.js.map → chunk-BUKK5SWA.js.map} +0 -0
  241. /package/dist/{chunk-JRY55I6Z.js.map → chunk-C2AYUXEF.js.map} +0 -0
  242. /package/dist/{chunk-DF4SYU4Z.js.map → chunk-C5OW2FFB.js.map} +0 -0
  243. /package/dist/{chunk-74Z2BYEK.js.map → chunk-CYEEVWQ6.js.map} +0 -0
  244. /package/dist/{chunk-M7KAJBO2.js.map → chunk-EADUOZWH.js.map} +0 -0
  245. /package/dist/{chunk-N5H22V75.js.map → chunk-ECT5ME6X.js.map} +0 -0
  246. /package/dist/{chunk-M3GOWG2P.js.map → chunk-FMOUUWQN.js.map} +0 -0
  247. /package/dist/{chunk-2EJAPJ5G.js.map → chunk-FYPKSR6Z.js.map} +0 -0
  248. /package/dist/{chunk-LGLLCWA2.js.map → chunk-GNEB3WXR.js.map} +0 -0
  249. /package/dist/{chunk-Z4EH5TSO.js.map → chunk-HNZH57JK.js.map} +0 -0
  250. /package/dist/{chunk-PTJWUN4H.js.map → chunk-IJKBIOWL.js.map} +0 -0
  251. /package/dist/{chunk-C5GTIRIO.js.map → chunk-IMNJJKHW.js.map} +0 -0
  252. /package/dist/{chunk-ADK5TMQL.js.map → chunk-IVJI5FDA.js.map} +0 -0
  253. /package/dist/{chunk-F3GX76LV.js.map → chunk-IWAB7JVH.js.map} +0 -0
  254. /package/dist/{chunk-JFRO5HJY.js.map → chunk-J62O2UW5.js.map} +0 -0
  255. /package/dist/{chunk-A3UFV4K3.js.map → chunk-JIYJIH5N.js.map} +0 -0
  256. /package/dist/{chunk-UIX4JLVV.js.map → chunk-JVFYP2LD.js.map} +0 -0
  257. /package/dist/{chunk-KJ3MDX4V.js.map → chunk-KXY4HW2Y.js.map} +0 -0
  258. /package/dist/{chunk-VQ6H4DL6.js.map → chunk-L334PSLW.js.map} +0 -0
  259. /package/dist/{chunk-IA3XZG4V.js.map → chunk-L74VVEJA.js.map} +0 -0
  260. /package/dist/{chunk-UY67YP6Q.js.map → chunk-LIUI46BX.js.map} +0 -0
  261. /package/dist/{chunk-UP2Q7U4G.js.map → chunk-MTVC5S5N.js.map} +0 -0
  262. /package/dist/{chunk-QWURVT5Z.js.map → chunk-N7CATBYH.js.map} +0 -0
  263. /package/dist/{chunk-JEDS2QYV.js.map → chunk-OH55F76C.js.map} +0 -0
  264. /package/dist/{chunk-2NLLXCJG.js.map → chunk-OWHERGF2.js.map} +0 -0
  265. /package/dist/{chunk-G6GMZJQ4.js.map → chunk-PA6ZNFB7.js.map} +0 -0
  266. /package/dist/{chunk-6BKSUA6P.js.map → chunk-PWEIZCPS.js.map} +0 -0
  267. /package/dist/{chunk-T4SMMTGY.js.map → chunk-Q3DAWUAV.js.map} +0 -0
  268. /package/dist/{chunk-AWKADEMO.js.map → chunk-QCAJMIAE.js.map} +0 -0
  269. /package/dist/{chunk-ZRDEOC4X.js.map → chunk-QI7LLSWX.js.map} +0 -0
  270. /package/dist/{chunk-7DHNBABU.js.map → chunk-QJ6IR35B.js.map} +0 -0
  271. /package/dist/{chunk-J53IBVMF.js.map → chunk-R25JMO5O.js.map} +0 -0
  272. /package/dist/{chunk-HL643H2F.js.map → chunk-TMWSCE2L.js.map} +0 -0
  273. /package/dist/{chunk-FLDXEJFX.js.map → chunk-TPCRDPUY.js.map} +0 -0
  274. /package/dist/{chunk-WJC5KGYC.js.map → chunk-UFQB5VQ5.js.map} +0 -0
  275. /package/dist/{chunk-64WHWIPL.js.map → chunk-UVHXLVFJ.js.map} +0 -0
  276. /package/dist/{chunk-X7Y7WX73.js.map → chunk-UVYI6VIX.js.map} +0 -0
  277. /package/dist/{chunk-5XY46Z2W.js.map → chunk-UXRCORZX.js.map} +0 -0
  278. /package/dist/{chunk-WUL6LDJ4.js.map → chunk-VPEA63FC.js.map} +0 -0
  279. /package/dist/{chunk-MHSUEA32.js.map → chunk-WA6XRNWE.js.map} +0 -0
  280. /package/dist/{chunk-GGHX4YHM.js.map → chunk-WB3OFPM2.js.map} +0 -0
  281. /package/dist/{chunk-RSYFSCKL.js.map → chunk-WZEDFDJ6.js.map} +0 -0
  282. /package/dist/{chunk-2HVCTFKG.js.map → chunk-X2ZLHUEO.js.map} +0 -0
  283. /package/dist/{chunk-PJLJN23N.js.map → chunk-XICJL56Z.js.map} +0 -0
  284. /package/dist/{chunk-ZXEPLZUQ.js.map → chunk-YGM47S7M.js.map} +0 -0
  285. /package/dist/{chunk-KXDUSGPM.js.map → chunk-YRL4PGPP.js.map} +0 -0
  286. /package/dist/{chunk-GJF337YM.js.map → chunk-Z45353ML.js.map} +0 -0
  287. /package/dist/{chunk-NJZY5LOC.js.map → chunk-ZARHK7PT.js.map} +0 -0
  288. /package/dist/{chunk-NF5EHQTJ.js.map → chunk-ZFU2B2GM.js.map} +0 -0
  289. /package/dist/{chunk-W37MS6SX.js.map → chunk-ZRSXXWIX.js.map} +0 -0
@@ -4,12 +4,12 @@ import {
4
4
  } from "./chunk-TPKB7T6Z.js";
5
5
  import {
6
6
  buildExtensionsBlockForConsolidation
7
- } from "./chunk-2HVCTFKG.js";
7
+ } from "./chunk-X2ZLHUEO.js";
8
8
  import "./chunk-5JMAGU26.js";
9
9
  import "./chunk-B7RWBZXW.js";
10
10
  import {
11
11
  runPostConsolidationMaterialize
12
- } from "./chunk-74Z2BYEK.js";
12
+ } from "./chunk-CYEEVWQ6.js";
13
13
  import "./chunk-3UXOZBHV.js";
14
14
  import "./chunk-AL3TCNSJ.js";
15
15
  import "./chunk-TOTT6S2V.js";
@@ -19,13 +19,15 @@ import "./chunk-QDW3E4RD.js";
19
19
  import {
20
20
  resolveCausalTrajectoryStoreDir
21
21
  } from "./chunk-4P4VLPGB.js";
22
- import "./chunk-I6UTOUBK.js";
22
+ import "./chunk-6VBKU3FY.js";
23
23
  import "./chunk-UHVXE24Y.js";
24
24
  import "./chunk-DM5QZ3YU.js";
25
25
  import "./chunk-WVEEVYMH.js";
26
+ import "./chunk-JCL7RO2G.js";
26
27
  import "./chunk-G6OFEGUR.js";
27
- import "./chunk-JEDS2QYV.js";
28
- import "./chunk-VQ6H4DL6.js";
28
+ import "./chunk-OH55F76C.js";
29
+ import "./chunk-L334PSLW.js";
30
+ import "./chunk-CYEPCZN5.js";
29
31
  import "./chunk-DLZGSZVC.js";
30
32
  import "./chunk-OVZIYLBZ.js";
31
33
  import "./chunk-EXYT52NR.js";
@@ -33,7 +35,6 @@ import "./chunk-DOJBV6WR.js";
33
35
  import "./chunk-PFUXPTBT.js";
34
36
  import "./chunk-WNEVEMJ3.js";
35
37
  import "./chunk-Y5NLBXPV.js";
36
- import "./chunk-CYEPCZN5.js";
37
38
  import "./chunk-TFA6HPOA.js";
38
39
  import "./chunk-F4TWWUMP.js";
39
40
  import "./chunk-72A4L5JJ.js";
@@ -77,6 +78,7 @@ import "./chunk-OR42ZI54.js";
77
78
  import "./chunk-23G5P7TA.js";
78
79
  import "./chunk-C64XATK7.js";
79
80
  import "./chunk-42JKGUFJ.js";
81
+ import "./chunk-U7MIMS2Y.js";
80
82
  import {
81
83
  FallbackLlmClient
82
84
  } from "./chunk-AVVCPA7U.js";
@@ -93,7 +95,7 @@ import "./chunk-YCVB7X56.js";
93
95
  import "./chunk-PQVCH2AE.js";
94
96
  import "./chunk-PJKTFXE2.js";
95
97
  import "./chunk-W5BIQOAJ.js";
96
- import "./chunk-PARM6OYL.js";
98
+ import "./chunk-SEA56G6S.js";
97
99
  import "./chunk-YBA52OKG.js";
98
100
  import "./chunk-TWRPWJJT.js";
99
101
  import "./chunk-BT7NVCML.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/causal-consolidation.ts"],"sourcesContent":["/**\n * causal-consolidation.ts — CMC Phase 2: LLM-Assisted Causal Consolidation\n *\n * Uses an LLM to analyze causal trajectory patterns across sessions.\n * The LLM receives the causal chain graph as context — connected trajectories\n * from different sessions — and identifies recurring behavioral patterns,\n * preference signals, and actionable rules.\n *\n * This is the core CMC innovation: the LLM gets cross-session causal context\n * that no other memory system provides. It can see that a user investigated\n * a bug in session 1, attempted a fix in session 2, and succeeded in session 3 —\n * and synthesize a rule or preference from that chain.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { resolveCausalTrajectoryStoreDir, type CausalTrajectoryRecord } from \"./causal-trajectory.js\";\nimport { readChainIndex, resolveChainsDir, type CausalChainIndex, type CausalEdge } from \"./causal-chain.js\";\nimport { listJsonFiles, readJsonFile } from \"./json-store.js\";\nimport { isRecord } from \"./store-contract.js\";\nimport { FallbackLlmClient, fallbackLlmRuntimeContextFromConfig } from \"./fallback-llm.js\";\nimport type { AgentPersonaModelConfig, GatewayConfig, MemoryFile, PluginConfig } from \"./types.js\";\nimport path from \"node:path\";\nimport { log } from \"./logger.js\";\nimport { runPostConsolidationMaterialize } from \"./connectors/codex-materialize-runner.js\";\nimport type { MaterializeResult, RolloutSummaryInput } from \"./connectors/codex-materialize.js\";\nimport { buildExtensionsBlockForConsolidation } from \"./semantic-consolidation.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface CausalPatternCandidate {\n id: string;\n sourceType: \"causal-pattern\";\n subject: string;\n category: \"principle\" | \"rule\" | \"preference\";\n content: string;\n score: number;\n rationale: string;\n outcome: null;\n provenance: string[];\n agent: string | null;\n workflow: string | null;\n}\n\nexport interface ConsolidationConfig {\n minRecurrence: number;\n minSessions: number;\n successThreshold: number;\n}\n\nexport interface LlmConsolidationResult {\n rules: Array<{\n content: string;\n category: \"rule\" | \"principle\" | \"preference\";\n confidence: number;\n evidence: string[];\n }>;\n preferences: Array<{\n statement: string;\n confidence: number;\n evidence: string[];\n }>;\n}\n\nconst CAUSAL_RULE_CATEGORIES = new Set([\"rule\", \"principle\", \"preference\"]);\n\ninterface ConsolidationLlmClient {\n isAvailable(options?: { agentId?: string; modelChain?: AgentPersonaModelConfig }): boolean;\n chatCompletion(\n messages: Array<{ role: \"system\" | \"user\" | \"assistant\"; content: string }>,\n options?: { temperature?: number; maxTokens?: number; agentId?: string; modelChain?: AgentPersonaModelConfig },\n ): Promise<{ content: string } | null>;\n}\n\n// ─── Trajectory Reading ──────────────────────────────────────────────────────\n\nasync function readAllTrajectories(\n memoryDir: string,\n causalTrajectoryStoreDir?: string,\n): Promise<CausalTrajectoryRecord[]> {\n const root = resolveCausalTrajectoryStoreDir(memoryDir, causalTrajectoryStoreDir);\n const trajectoriesDir = path.join(root, \"trajectories\");\n\n const files = await listJsonFiles(trajectoriesDir).catch(() => [] as string[]);\n const results: CausalTrajectoryRecord[] = [];\n\n for (const filePath of files) {\n try {\n const raw = await readJsonFile(filePath);\n if (isRecord(raw) && typeof raw.trajectoryId === \"string\") {\n results.push(raw as unknown as CausalTrajectoryRecord);\n }\n } catch {\n // skip invalid\n }\n }\n\n return results;\n}\n\n// ─── Context Formatting ──────────────────────────────────────────────────────\n\n/**\n * Format trajectories and their causal connections as a readable context\n * for the LLM. Groups by session and shows chain connections.\n */\nfunction formatCausalContext(\n trajectories: CausalTrajectoryRecord[],\n chainIndex: CausalChainIndex,\n maxChars: number = 8000,\n): string {\n // Group trajectories by session\n const bySession = new Map<string, CausalTrajectoryRecord[]>();\n for (const t of trajectories) {\n const list = bySession.get(t.sessionKey) ?? [];\n list.push(t);\n bySession.set(t.sessionKey, list);\n }\n\n const lines: string[] = [];\n lines.push(`## Causal Trajectories (${trajectories.length} across ${bySession.size} sessions)`);\n lines.push(\"\");\n\n // Format each session's trajectories\n for (const [sessionKey, sessionTrajs] of bySession) {\n lines.push(`### Session: ${sessionKey}`);\n for (const t of sessionTrajs.slice(0, 5)) {\n const outcome = t.outcomeKind === \"success\" ? \"+\" : t.outcomeKind === \"failure\" ? \"-\" : \"~\";\n lines.push(`[${outcome}] Goal: ${t.goal}`);\n lines.push(` Action: ${t.actionSummary}`);\n lines.push(` Outcome: ${t.outcomeSummary}`);\n if (t.followUpSummary) lines.push(` Follow-up: ${t.followUpSummary}`);\n if (t.entityRefs?.length) lines.push(` Entities: ${t.entityRefs.join(\", \")}`);\n }\n lines.push(\"\");\n }\n\n // Format causal chain connections\n const edgeCount = Object.keys(chainIndex.edges).length;\n if (edgeCount > 0) {\n lines.push(`## Cross-Session Causal Chains (${edgeCount} connections)`);\n lines.push(\"\");\n\n const trajectoryMap = new Map(trajectories.map((t) => [t.trajectoryId, t]));\n const shown = new Set<string>();\n\n for (const [edgeId, edge] of Object.entries(chainIndex.edges)) {\n if (shown.size >= 10) break; // limit output size\n const from = trajectoryMap.get(edge.fromTrajectoryId);\n const to = trajectoryMap.get(edge.toTrajectoryId);\n if (!from || !to) continue;\n\n lines.push(`${edge.edgeType}: \"${from.goal}\" (${from.sessionKey}) → \"${to.goal}\" (${to.sessionKey})`);\n shown.add(edgeId);\n }\n lines.push(\"\");\n }\n\n const result = lines.join(\"\\n\");\n return result.length > maxChars ? result.slice(0, maxChars) + \"\\n[truncated]\" : result;\n}\n\n// ─── LLM Consolidation ──────────────────────────────────────────────────────\n\nconst CONSOLIDATION_PROMPT = `You are analyzing a user's causal trajectory history across multiple sessions. Trajectories record what the user tried to do (goal), what they did (action), and what happened (outcome).\n\nYour job is to identify:\n1. BEHAVIORAL RULES: Recurring patterns where the same approach consistently succeeds or fails. These should be actionable guidance for future sessions.\n2. PREFERENCES: What the user cares about, prefers, or consistently chooses — even if never explicitly stated. Infer preferences from what they repeatedly do, retry until successful, or always include in their workflow.\n\nIMPORTANT:\n- Look for CROSS-SESSION patterns — things that repeat across different sessions are more significant than within-session patterns.\n- A user who retries the same goal across sessions has a strong implicit preference for that outcome.\n- Consistent action choices reveal preferences even when the user never says \"I prefer X.\"\n- Frame preferences as \"The user would prefer responses that...\" when applicable.\n\nOutput valid JSON only:\n{\n \"rules\": [\n {\"content\": \"actionable rule text\", \"category\": \"rule|principle\", \"confidence\": 0.0-1.0, \"evidence\": [\"trajectory IDs\"]}\n ],\n \"preferences\": [\n {\"statement\": \"The user would prefer...\", \"confidence\": 0.0-1.0, \"evidence\": [\"trajectory IDs\"]}\n ]\n}\n\nIf no clear patterns exist, return {\"rules\": [], \"preferences\": []}.`;\n\nasync function consolidateWithLlm(\n context: string,\n llm: ConsolidationLlmClient,\n options: { agentId?: string; modelChain?: AgentPersonaModelConfig } = {},\n): Promise<LlmConsolidationResult> {\n const response = await llm.chatCompletion(\n [\n { role: \"system\", content: CONSOLIDATION_PROMPT },\n { role: \"user\", content: context },\n ],\n { temperature: 0.2, maxTokens: 2000, agentId: options.agentId, modelChain: options.modelChain },\n );\n\n if (!response?.content) {\n return { rules: [], preferences: [] };\n }\n\n try {\n // Extract JSON from response (may have markdown code fences)\n let jsonStr = response.content.trim();\n const fenceMatch = jsonStr.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?\\s*```/);\n if (fenceMatch) jsonStr = fenceMatch[1];\n\n const parsed = JSON.parse(jsonStr);\n const rawRules: unknown[] = Array.isArray(parsed.rules) ? parsed.rules : [];\n const rawPreferences: unknown[] = Array.isArray(parsed.preferences) ? parsed.preferences : [];\n return {\n rules: rawRules\n .map(parseLlmRule)\n .filter((rule): rule is LlmConsolidationResult[\"rules\"][number] => !!rule),\n preferences: rawPreferences\n .map(parseLlmPreference)\n .filter((pref): pref is LlmConsolidationResult[\"preferences\"][number] => !!pref),\n };\n } catch {\n log.warn(\"[cmc] failed to parse LLM consolidation response\");\n return { rules: [], preferences: [] };\n }\n}\n\n// ─── Candidate Generation ────────────────────────────────────────────────────\n\nfunction stablePatternId(content: string): string {\n const digest = createHash(\"sha256\")\n .update(`causal-pattern\\0${content}`)\n .digest(\"hex\")\n .slice(0, 16);\n return `causal-pattern:${digest}`;\n}\n\nfunction parseConfidence(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n return Math.max(0, Math.min(1, value));\n}\n\nfunction parseEvidence(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0);\n}\n\nfunction parseLlmRule(raw: unknown): LlmConsolidationResult[\"rules\"][number] | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined;\n const r = raw as Record<string, unknown>;\n const content = typeof r.content === \"string\" ? r.content.trim() : \"\";\n const category = typeof r.category === \"string\" ? r.category : \"\";\n const confidence = parseConfidence(r.confidence);\n if (content.length <= 5 || !CAUSAL_RULE_CATEGORIES.has(category) || confidence === undefined) {\n return undefined;\n }\n return {\n content,\n category: category as \"rule\" | \"principle\" | \"preference\",\n confidence,\n evidence: parseEvidence(r.evidence),\n };\n}\n\nfunction parseLlmPreference(raw: unknown): LlmConsolidationResult[\"preferences\"][number] | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined;\n const p = raw as Record<string, unknown>;\n const statement = typeof p.statement === \"string\" ? p.statement.trim() : \"\";\n const confidence = parseConfidence(p.confidence);\n if (statement.length <= 5 || confidence === undefined) return undefined;\n return {\n statement,\n confidence,\n evidence: parseEvidence(p.evidence),\n };\n}\n\nfunction llmResultToCandidates(result: LlmConsolidationResult): CausalPatternCandidate[] {\n const candidates: CausalPatternCandidate[] = [];\n\n for (const rule of result.rules) {\n const category =\n rule.category === \"principle\" || rule.category === \"preference\"\n ? rule.category\n : \"rule\";\n candidates.push({\n id: stablePatternId(rule.content),\n sourceType: \"causal-pattern\",\n subject: rule.content.slice(0, 80),\n category,\n content: rule.content,\n score: Math.min(1, rule.confidence ?? 0.7),\n rationale: \"LLM-identified causal pattern from cross-session trajectory analysis\",\n outcome: null,\n provenance: (rule.evidence ?? []).slice(0, 5),\n agent: null,\n workflow: null,\n });\n }\n\n for (const preference of result.preferences) {\n candidates.push({\n id: stablePatternId(preference.statement),\n sourceType: \"causal-pattern\",\n subject: preference.statement.slice(0, 80),\n category: \"preference\",\n content: preference.statement,\n score: Math.min(1, preference.confidence ?? 0.7),\n rationale: \"LLM-identified preference from cross-session trajectory analysis\",\n outcome: null,\n provenance: (preference.evidence ?? []).slice(0, 5),\n agent: null,\n workflow: null,\n });\n }\n\n return candidates;\n}\n\nfunction normalizePositiveInteger(value: number, fallback: number): number {\n return Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;\n}\n\nfunction normalizeSuccessThreshold(value: number): number {\n if (!Number.isFinite(value) || value <= 0) return 0;\n return Math.min(1, value);\n}\n\nfunction trajectorySuccessScore(trajectory: CausalTrajectoryRecord): number {\n if (trajectory.outcomeKind === \"success\") return 1;\n if (trajectory.outcomeKind === \"partial\") return 0.5;\n return 0;\n}\n\nfunction averageSuccessScore(trajectories: CausalTrajectoryRecord[]): number {\n if (trajectories.length === 0) return 0;\n const total = trajectories.reduce((sum, trajectory) => sum + trajectorySuccessScore(trajectory), 0);\n return total / trajectories.length;\n}\n\nfunction passesConsolidationGates(\n trajectories: CausalTrajectoryRecord[],\n config: ConsolidationConfig,\n): boolean {\n const minRecurrence = normalizePositiveInteger(config.minRecurrence, 1);\n if (trajectories.length < minRecurrence) return false;\n\n const minSessions = normalizePositiveInteger(config.minSessions, 1);\n const sessionCount = new Set(trajectories.map((trajectory) => trajectory.sessionKey)).size;\n if (sessionCount < minSessions) return false;\n\n const successThreshold = normalizeSuccessThreshold(config.successThreshold);\n if (successThreshold > 0 && averageSuccessScore(trajectories) < successThreshold) {\n return false;\n }\n\n return true;\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Run LLM-assisted consolidation: read trajectories, format causal context,\n * ask LLM to identify patterns and preferences.\n */\nexport async function deriveCausalPromotionCandidates(options: {\n memoryDir: string;\n causalTrajectoryStoreDir?: string;\n config: ConsolidationConfig;\n gatewayConfig?: GatewayConfig;\n gatewayAgentId?: string;\n modelChain?: AgentPersonaModelConfig;\n workspaceDir?: string;\n pluginConfig?: PluginConfig;\n llmClient?: ConsolidationLlmClient;\n}): Promise<CausalPatternCandidate[]> {\n try {\n const trajectories = await readAllTrajectories(options.memoryDir, options.causalTrajectoryStoreDir);\n if (!passesConsolidationGates(trajectories, options.config)) return [];\n\n const chainsDir = resolveChainsDir(options.memoryDir, options.causalTrajectoryStoreDir);\n const chainIndex = await readChainIndex(chainsDir);\n\n // Format the causal context for the LLM\n let context = formatCausalContext(trajectories, chainIndex);\n\n // Append memory extensions block if available (#382)\n if (options.pluginConfig) {\n const extBlock = await buildExtensionsBlockForConsolidation(options.pluginConfig);\n if (extBlock.length > 0) {\n context += \"\\n\\n\" + extBlock;\n }\n }\n\n // If no LLM available, fall back to empty (no deterministic fallback)\n const llm = options.llmClient ?? new FallbackLlmClient(\n options.gatewayConfig,\n options.pluginConfig\n ? fallbackLlmRuntimeContextFromConfig(options.pluginConfig, {\n workspaceDir: options.workspaceDir ?? options.pluginConfig.workspaceDir,\n })\n : { workspaceDir: options.workspaceDir },\n );\n const llmOptions = { agentId: options.gatewayAgentId, modelChain: options.modelChain };\n if (!llm.isAvailable(llmOptions)) {\n log.debug(\"[cmc] no LLM available for consolidation — skipping\");\n return [];\n }\n\n // Call LLM for pattern analysis\n const result = await consolidateWithLlm(context, llm, llmOptions);\n const candidates = llmResultToCandidates(result);\n\n log.debug(`[cmc] LLM consolidation produced ${candidates.length} rule(s) and ${result.preferences.length} preference(s)`);\n return candidates;\n } catch (error) {\n log.warn(`[cmc] consolidation failed (non-fatal): ${error instanceof Error ? error.message : String(error)}`);\n return [];\n }\n}\n\n/**\n * Get LLM-synthesized preferences from causal trajectory analysis.\n * Returns formatted preference statements for recall injection.\n */\nexport async function synthesizeCausalPreferencesViaLlm(options: {\n memoryDir: string;\n causalTrajectoryStoreDir?: string;\n gatewayConfig?: GatewayConfig;\n gatewayAgentId?: string;\n modelChain?: AgentPersonaModelConfig;\n workspaceDir?: string;\n minTrajectories?: number;\n}): Promise<string | null> {\n try {\n const trajectories = await readAllTrajectories(options.memoryDir, options.causalTrajectoryStoreDir);\n if (trajectories.length < (options.minTrajectories ?? 2)) return null;\n\n const chainsDir = resolveChainsDir(options.memoryDir, options.causalTrajectoryStoreDir);\n const chainIndex = await readChainIndex(chainsDir);\n const context = formatCausalContext(trajectories, chainIndex);\n\n const llm = new FallbackLlmClient(options.gatewayConfig, {\n workspaceDir: options.workspaceDir,\n });\n const llmOptions = { agentId: options.gatewayAgentId, modelChain: options.modelChain };\n if (!llm.isAvailable(llmOptions)) return null;\n\n const result = await consolidateWithLlm(context, llm, llmOptions);\n if (result.preferences.length === 0 && result.rules.length === 0) return null;\n\n const lines: string[] = [\"## Behavioral Insights (from Causal Chain Analysis)\", \"\"];\n\n for (const pref of result.preferences) {\n lines.push(`- ${pref.statement}`);\n }\n\n for (const rule of result.rules) {\n lines.push(`- ${rule.content}`);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n } catch (error) {\n log.warn(`[cmc] preference synthesis failed (non-fatal): ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n}\n\n/**\n * Optional post-consolidation hook — materializes Codex-native memory artifacts\n * after a causal consolidation run. Guarded by `codexMaterializeMemories` and\n * `codexMaterializeOnConsolidation`. Returns `null` when disabled or when the\n * sentinel is missing (honors user hand-edits).\n *\n * Split from the orchestrator-owned flow so #378 avoids touching\n * orchestrator.ts while Wave 1 edits are in flight.\n */\nexport async function materializeAfterCausalConsolidation(options: {\n config: PluginConfig;\n namespace?: string;\n memories?: MemoryFile[];\n memoryDir?: string;\n codexHome?: string;\n rolloutSummaries?: RolloutSummaryInput[];\n now?: Date;\n}): Promise<MaterializeResult | null> {\n // Delegates to the shared post-consolidation helper — see\n // runPostConsolidationMaterialize in codex-materialize-runner.ts.\n return runPostConsolidationMaterialize(\"[cmc]\", options);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/causal-consolidation.ts"],"sourcesContent":["/**\n * causal-consolidation.ts — CMC Phase 2: LLM-Assisted Causal Consolidation\n *\n * Uses an LLM to analyze causal trajectory patterns across sessions.\n * The LLM receives the causal chain graph as context — connected trajectories\n * from different sessions — and identifies recurring behavioral patterns,\n * preference signals, and actionable rules.\n *\n * This is the core CMC innovation: the LLM gets cross-session causal context\n * that no other memory system provides. It can see that a user investigated\n * a bug in session 1, attempted a fix in session 2, and succeeded in session 3 —\n * and synthesize a rule or preference from that chain.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { resolveCausalTrajectoryStoreDir, type CausalTrajectoryRecord } from \"./causal-trajectory.js\";\nimport { readChainIndex, resolveChainsDir, type CausalChainIndex, type CausalEdge } from \"./causal-chain.js\";\nimport { listJsonFiles, readJsonFile } from \"./json-store.js\";\nimport { isRecord } from \"./store-contract.js\";\nimport { FallbackLlmClient, fallbackLlmRuntimeContextFromConfig } from \"./fallback-llm.js\";\nimport type { AgentPersonaModelConfig, GatewayConfig, MemoryFile, PluginConfig } from \"./types.js\";\nimport path from \"node:path\";\nimport { log } from \"./logger.js\";\nimport { runPostConsolidationMaterialize } from \"./connectors/codex-materialize-runner.js\";\nimport type { MaterializeResult, RolloutSummaryInput } from \"./connectors/codex-materialize.js\";\nimport { buildExtensionsBlockForConsolidation } from \"./semantic-consolidation.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface CausalPatternCandidate {\n id: string;\n sourceType: \"causal-pattern\";\n subject: string;\n category: \"principle\" | \"rule\" | \"preference\";\n content: string;\n score: number;\n rationale: string;\n outcome: null;\n provenance: string[];\n agent: string | null;\n workflow: string | null;\n}\n\nexport interface ConsolidationConfig {\n minRecurrence: number;\n minSessions: number;\n successThreshold: number;\n}\n\nexport interface LlmConsolidationResult {\n rules: Array<{\n content: string;\n category: \"rule\" | \"principle\" | \"preference\";\n confidence: number;\n evidence: string[];\n }>;\n preferences: Array<{\n statement: string;\n confidence: number;\n evidence: string[];\n }>;\n}\n\nconst CAUSAL_RULE_CATEGORIES = new Set([\"rule\", \"principle\", \"preference\"]);\n\ninterface ConsolidationLlmClient {\n isAvailable(options?: { agentId?: string; modelChain?: AgentPersonaModelConfig }): boolean;\n chatCompletion(\n messages: Array<{ role: \"system\" | \"user\" | \"assistant\"; content: string }>,\n options?: { temperature?: number; maxTokens?: number; agentId?: string; modelChain?: AgentPersonaModelConfig },\n ): Promise<{ content: string } | null>;\n}\n\n// ─── Trajectory Reading ──────────────────────────────────────────────────────\n\nasync function readAllTrajectories(\n memoryDir: string,\n causalTrajectoryStoreDir?: string,\n): Promise<CausalTrajectoryRecord[]> {\n const root = resolveCausalTrajectoryStoreDir(memoryDir, causalTrajectoryStoreDir);\n const trajectoriesDir = path.join(root, \"trajectories\");\n\n const files = await listJsonFiles(trajectoriesDir).catch(() => [] as string[]);\n const results: CausalTrajectoryRecord[] = [];\n\n for (const filePath of files) {\n try {\n const raw = await readJsonFile(filePath);\n if (isRecord(raw) && typeof raw.trajectoryId === \"string\") {\n results.push(raw as unknown as CausalTrajectoryRecord);\n }\n } catch {\n // skip invalid\n }\n }\n\n return results;\n}\n\n// ─── Context Formatting ──────────────────────────────────────────────────────\n\n/**\n * Format trajectories and their causal connections as a readable context\n * for the LLM. Groups by session and shows chain connections.\n */\nfunction formatCausalContext(\n trajectories: CausalTrajectoryRecord[],\n chainIndex: CausalChainIndex,\n maxChars: number = 8000,\n): string {\n // Group trajectories by session\n const bySession = new Map<string, CausalTrajectoryRecord[]>();\n for (const t of trajectories) {\n const list = bySession.get(t.sessionKey) ?? [];\n list.push(t);\n bySession.set(t.sessionKey, list);\n }\n\n const lines: string[] = [];\n lines.push(`## Causal Trajectories (${trajectories.length} across ${bySession.size} sessions)`);\n lines.push(\"\");\n\n // Format each session's trajectories\n for (const [sessionKey, sessionTrajs] of bySession) {\n lines.push(`### Session: ${sessionKey}`);\n for (const t of sessionTrajs.slice(0, 5)) {\n const outcome = t.outcomeKind === \"success\" ? \"+\" : t.outcomeKind === \"failure\" ? \"-\" : \"~\";\n lines.push(`[${outcome}] Goal: ${t.goal}`);\n lines.push(` Action: ${t.actionSummary}`);\n lines.push(` Outcome: ${t.outcomeSummary}`);\n if (t.followUpSummary) lines.push(` Follow-up: ${t.followUpSummary}`);\n if (t.entityRefs?.length) lines.push(` Entities: ${t.entityRefs.join(\", \")}`);\n }\n lines.push(\"\");\n }\n\n // Format causal chain connections\n const edgeCount = Object.keys(chainIndex.edges).length;\n if (edgeCount > 0) {\n lines.push(`## Cross-Session Causal Chains (${edgeCount} connections)`);\n lines.push(\"\");\n\n const trajectoryMap = new Map(trajectories.map((t) => [t.trajectoryId, t]));\n const shown = new Set<string>();\n\n for (const [edgeId, edge] of Object.entries(chainIndex.edges)) {\n if (shown.size >= 10) break; // limit output size\n const from = trajectoryMap.get(edge.fromTrajectoryId);\n const to = trajectoryMap.get(edge.toTrajectoryId);\n if (!from || !to) continue;\n\n lines.push(`${edge.edgeType}: \"${from.goal}\" (${from.sessionKey}) → \"${to.goal}\" (${to.sessionKey})`);\n shown.add(edgeId);\n }\n lines.push(\"\");\n }\n\n const result = lines.join(\"\\n\");\n return result.length > maxChars ? result.slice(0, maxChars) + \"\\n[truncated]\" : result;\n}\n\n// ─── LLM Consolidation ──────────────────────────────────────────────────────\n\nconst CONSOLIDATION_PROMPT = `You are analyzing a user's causal trajectory history across multiple sessions. Trajectories record what the user tried to do (goal), what they did (action), and what happened (outcome).\n\nYour job is to identify:\n1. BEHAVIORAL RULES: Recurring patterns where the same approach consistently succeeds or fails. These should be actionable guidance for future sessions.\n2. PREFERENCES: What the user cares about, prefers, or consistently chooses — even if never explicitly stated. Infer preferences from what they repeatedly do, retry until successful, or always include in their workflow.\n\nIMPORTANT:\n- Look for CROSS-SESSION patterns — things that repeat across different sessions are more significant than within-session patterns.\n- A user who retries the same goal across sessions has a strong implicit preference for that outcome.\n- Consistent action choices reveal preferences even when the user never says \"I prefer X.\"\n- Frame preferences as \"The user would prefer responses that...\" when applicable.\n\nOutput valid JSON only:\n{\n \"rules\": [\n {\"content\": \"actionable rule text\", \"category\": \"rule|principle\", \"confidence\": 0.0-1.0, \"evidence\": [\"trajectory IDs\"]}\n ],\n \"preferences\": [\n {\"statement\": \"The user would prefer...\", \"confidence\": 0.0-1.0, \"evidence\": [\"trajectory IDs\"]}\n ]\n}\n\nIf no clear patterns exist, return {\"rules\": [], \"preferences\": []}.`;\n\nasync function consolidateWithLlm(\n context: string,\n llm: ConsolidationLlmClient,\n options: { agentId?: string; modelChain?: AgentPersonaModelConfig } = {},\n): Promise<LlmConsolidationResult> {\n const response = await llm.chatCompletion(\n [\n { role: \"system\", content: CONSOLIDATION_PROMPT },\n { role: \"user\", content: context },\n ],\n { temperature: 0.2, maxTokens: 2000, agentId: options.agentId, modelChain: options.modelChain },\n );\n\n if (!response?.content) {\n return { rules: [], preferences: [] };\n }\n\n try {\n // Extract JSON from response (may have markdown code fences)\n let jsonStr = response.content.trim();\n const fenceMatch = jsonStr.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?\\s*```/);\n if (fenceMatch) jsonStr = fenceMatch[1];\n\n const parsed = JSON.parse(jsonStr);\n const rawRules: unknown[] = Array.isArray(parsed.rules) ? parsed.rules : [];\n const rawPreferences: unknown[] = Array.isArray(parsed.preferences) ? parsed.preferences : [];\n return {\n rules: rawRules\n .map(parseLlmRule)\n .filter((rule): rule is LlmConsolidationResult[\"rules\"][number] => !!rule),\n preferences: rawPreferences\n .map(parseLlmPreference)\n .filter((pref): pref is LlmConsolidationResult[\"preferences\"][number] => !!pref),\n };\n } catch {\n log.warn(\"[cmc] failed to parse LLM consolidation response\");\n return { rules: [], preferences: [] };\n }\n}\n\n// ─── Candidate Generation ────────────────────────────────────────────────────\n\nfunction stablePatternId(content: string): string {\n const digest = createHash(\"sha256\")\n .update(`causal-pattern\\0${content}`)\n .digest(\"hex\")\n .slice(0, 16);\n return `causal-pattern:${digest}`;\n}\n\nfunction parseConfidence(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n return Math.max(0, Math.min(1, value));\n}\n\nfunction parseEvidence(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0);\n}\n\nfunction parseLlmRule(raw: unknown): LlmConsolidationResult[\"rules\"][number] | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined;\n const r = raw as Record<string, unknown>;\n const content = typeof r.content === \"string\" ? r.content.trim() : \"\";\n const category = typeof r.category === \"string\" ? r.category : \"\";\n const confidence = parseConfidence(r.confidence);\n if (content.length <= 5 || !CAUSAL_RULE_CATEGORIES.has(category) || confidence === undefined) {\n return undefined;\n }\n return {\n content,\n category: category as \"rule\" | \"principle\" | \"preference\",\n confidence,\n evidence: parseEvidence(r.evidence),\n };\n}\n\nfunction parseLlmPreference(raw: unknown): LlmConsolidationResult[\"preferences\"][number] | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined;\n const p = raw as Record<string, unknown>;\n const statement = typeof p.statement === \"string\" ? p.statement.trim() : \"\";\n const confidence = parseConfidence(p.confidence);\n if (statement.length <= 5 || confidence === undefined) return undefined;\n return {\n statement,\n confidence,\n evidence: parseEvidence(p.evidence),\n };\n}\n\nfunction llmResultToCandidates(result: LlmConsolidationResult): CausalPatternCandidate[] {\n const candidates: CausalPatternCandidate[] = [];\n\n for (const rule of result.rules) {\n const category =\n rule.category === \"principle\" || rule.category === \"preference\"\n ? rule.category\n : \"rule\";\n candidates.push({\n id: stablePatternId(rule.content),\n sourceType: \"causal-pattern\",\n subject: rule.content.slice(0, 80),\n category,\n content: rule.content,\n score: Math.min(1, rule.confidence ?? 0.7),\n rationale: \"LLM-identified causal pattern from cross-session trajectory analysis\",\n outcome: null,\n provenance: (rule.evidence ?? []).slice(0, 5),\n agent: null,\n workflow: null,\n });\n }\n\n for (const preference of result.preferences) {\n candidates.push({\n id: stablePatternId(preference.statement),\n sourceType: \"causal-pattern\",\n subject: preference.statement.slice(0, 80),\n category: \"preference\",\n content: preference.statement,\n score: Math.min(1, preference.confidence ?? 0.7),\n rationale: \"LLM-identified preference from cross-session trajectory analysis\",\n outcome: null,\n provenance: (preference.evidence ?? []).slice(0, 5),\n agent: null,\n workflow: null,\n });\n }\n\n return candidates;\n}\n\nfunction normalizePositiveInteger(value: number, fallback: number): number {\n return Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;\n}\n\nfunction normalizeSuccessThreshold(value: number): number {\n if (!Number.isFinite(value) || value <= 0) return 0;\n return Math.min(1, value);\n}\n\nfunction trajectorySuccessScore(trajectory: CausalTrajectoryRecord): number {\n if (trajectory.outcomeKind === \"success\") return 1;\n if (trajectory.outcomeKind === \"partial\") return 0.5;\n return 0;\n}\n\nfunction averageSuccessScore(trajectories: CausalTrajectoryRecord[]): number {\n if (trajectories.length === 0) return 0;\n const total = trajectories.reduce((sum, trajectory) => sum + trajectorySuccessScore(trajectory), 0);\n return total / trajectories.length;\n}\n\nfunction passesConsolidationGates(\n trajectories: CausalTrajectoryRecord[],\n config: ConsolidationConfig,\n): boolean {\n const minRecurrence = normalizePositiveInteger(config.minRecurrence, 1);\n if (trajectories.length < minRecurrence) return false;\n\n const minSessions = normalizePositiveInteger(config.minSessions, 1);\n const sessionCount = new Set(trajectories.map((trajectory) => trajectory.sessionKey)).size;\n if (sessionCount < minSessions) return false;\n\n const successThreshold = normalizeSuccessThreshold(config.successThreshold);\n if (successThreshold > 0 && averageSuccessScore(trajectories) < successThreshold) {\n return false;\n }\n\n return true;\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Run LLM-assisted consolidation: read trajectories, format causal context,\n * ask LLM to identify patterns and preferences.\n */\nexport async function deriveCausalPromotionCandidates(options: {\n memoryDir: string;\n causalTrajectoryStoreDir?: string;\n config: ConsolidationConfig;\n gatewayConfig?: GatewayConfig;\n gatewayAgentId?: string;\n modelChain?: AgentPersonaModelConfig;\n workspaceDir?: string;\n pluginConfig?: PluginConfig;\n llmClient?: ConsolidationLlmClient;\n}): Promise<CausalPatternCandidate[]> {\n try {\n const trajectories = await readAllTrajectories(options.memoryDir, options.causalTrajectoryStoreDir);\n if (!passesConsolidationGates(trajectories, options.config)) return [];\n\n const chainsDir = resolveChainsDir(options.memoryDir, options.causalTrajectoryStoreDir);\n const chainIndex = await readChainIndex(chainsDir);\n\n // Format the causal context for the LLM\n let context = formatCausalContext(trajectories, chainIndex);\n\n // Append memory extensions block if available (#382)\n if (options.pluginConfig) {\n const extBlock = await buildExtensionsBlockForConsolidation(options.pluginConfig);\n if (extBlock.length > 0) {\n context += \"\\n\\n\" + extBlock;\n }\n }\n\n // If no LLM available, fall back to empty (no deterministic fallback)\n const llm = options.llmClient ?? new FallbackLlmClient(\n options.gatewayConfig,\n options.pluginConfig\n ? fallbackLlmRuntimeContextFromConfig(options.pluginConfig, {\n workspaceDir: options.workspaceDir ?? options.pluginConfig.workspaceDir,\n })\n : { workspaceDir: options.workspaceDir },\n );\n const llmOptions = { agentId: options.gatewayAgentId, modelChain: options.modelChain };\n if (!llm.isAvailable(llmOptions)) {\n log.debug(\"[cmc] no LLM available for consolidation — skipping\");\n return [];\n }\n\n // Call LLM for pattern analysis\n const result = await consolidateWithLlm(context, llm, llmOptions);\n const candidates = llmResultToCandidates(result);\n\n log.debug(`[cmc] LLM consolidation produced ${candidates.length} rule(s) and ${result.preferences.length} preference(s)`);\n return candidates;\n } catch (error) {\n log.warn(`[cmc] consolidation failed (non-fatal): ${error instanceof Error ? error.message : String(error)}`);\n return [];\n }\n}\n\n/**\n * Get LLM-synthesized preferences from causal trajectory analysis.\n * Returns formatted preference statements for recall injection.\n */\nexport async function synthesizeCausalPreferencesViaLlm(options: {\n memoryDir: string;\n causalTrajectoryStoreDir?: string;\n gatewayConfig?: GatewayConfig;\n gatewayAgentId?: string;\n modelChain?: AgentPersonaModelConfig;\n workspaceDir?: string;\n minTrajectories?: number;\n}): Promise<string | null> {\n try {\n const trajectories = await readAllTrajectories(options.memoryDir, options.causalTrajectoryStoreDir);\n if (trajectories.length < (options.minTrajectories ?? 2)) return null;\n\n const chainsDir = resolveChainsDir(options.memoryDir, options.causalTrajectoryStoreDir);\n const chainIndex = await readChainIndex(chainsDir);\n const context = formatCausalContext(trajectories, chainIndex);\n\n const llm = new FallbackLlmClient(options.gatewayConfig, {\n workspaceDir: options.workspaceDir,\n });\n const llmOptions = { agentId: options.gatewayAgentId, modelChain: options.modelChain };\n if (!llm.isAvailable(llmOptions)) return null;\n\n const result = await consolidateWithLlm(context, llm, llmOptions);\n if (result.preferences.length === 0 && result.rules.length === 0) return null;\n\n const lines: string[] = [\"## Behavioral Insights (from Causal Chain Analysis)\", \"\"];\n\n for (const pref of result.preferences) {\n lines.push(`- ${pref.statement}`);\n }\n\n for (const rule of result.rules) {\n lines.push(`- ${rule.content}`);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n } catch (error) {\n log.warn(`[cmc] preference synthesis failed (non-fatal): ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n}\n\n/**\n * Optional post-consolidation hook — materializes Codex-native memory artifacts\n * after a causal consolidation run. Guarded by `codexMaterializeMemories` and\n * `codexMaterializeOnConsolidation`. Returns `null` when disabled or when the\n * sentinel is missing (honors user hand-edits).\n *\n * Split from the orchestrator-owned flow so #378 avoids touching\n * orchestrator.ts while Wave 1 edits are in flight.\n */\nexport async function materializeAfterCausalConsolidation(options: {\n config: PluginConfig;\n namespace?: string;\n memories?: MemoryFile[];\n memoryDir?: string;\n codexHome?: string;\n rolloutSummaries?: RolloutSummaryInput[];\n now?: Date;\n}): Promise<MaterializeResult | null> {\n // Delegates to the shared post-consolidation helper — see\n // runPostConsolidationMaterialize in codex-materialize-runner.ts.\n return runPostConsolidationMaterialize(\"[cmc]\", options);\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-TOTT6S2V.js";
4
4
  import {
5
5
  isRecallDisclosure
6
- } from "./chunk-PARM6OYL.js";
6
+ } from "./chunk-SEA56G6S.js";
7
7
  import {
8
8
  normalizeRetrievedMemoryProvenance
9
9
  } from "./chunk-I4WBNM3M.js";
@@ -312,4 +312,4 @@ export {
312
312
  RecallXrayBuilder,
313
313
  summarizeDisclosureTokens
314
314
  };
315
- //# sourceMappingURL=chunk-VHBGJAYC.js.map
315
+ //# sourceMappingURL=chunk-25QK3LR2.js.map
@@ -3,7 +3,7 @@ import {
3
3
  getOperation,
4
4
  operationRequiresAuthorizedNamespace,
5
5
  operationUsesPrincipalNamespace
6
- } from "./chunk-C5GTIRIO.js";
6
+ } from "./chunk-IMNJJKHW.js";
7
7
  import {
8
8
  assertOperationAuthorizationAllowed
9
9
  } from "./chunk-YO2JEX2Z.js";
@@ -60,4 +60,4 @@ export {
60
60
  authorizationProbeNamespaces,
61
61
  authorizationProbeRequiresPrincipalNamespace
62
62
  };
63
- //# sourceMappingURL=chunk-X2TZWVCC.js.map
63
+ //# sourceMappingURL=chunk-3HLWLYRD.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defineOperation
3
- } from "./chunk-C5GTIRIO.js";
3
+ } from "./chunk-IMNJJKHW.js";
4
4
  import {
5
5
  EngramAccessInputError
6
6
  } from "./chunk-LGEH473S.js";
@@ -71,4 +71,4 @@ defineOperation({
71
71
  })
72
72
  })
73
73
  });
74
- //# sourceMappingURL=chunk-TIS6T6UP.js.map
74
+ //# sourceMappingURL=chunk-3VNRDRBM.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  parseFrontmatter
3
- } from "./chunk-I6UTOUBK.js";
3
+ } from "./chunk-6VBKU3FY.js";
4
4
  import {
5
5
  activityDigestPath,
6
6
  isValidActivityDate
@@ -199,4 +199,4 @@ export {
199
199
  buildStandup,
200
200
  standupHelp
201
201
  };
202
- //# sourceMappingURL=chunk-4O4VAEWH.js.map
202
+ //# sourceMappingURL=chunk-4NLHEE2Z.js.map
@@ -13,7 +13,7 @@ import {
13
13
  import {
14
14
  ActivityStore,
15
15
  MaintenanceScheduler
16
- } from "./chunk-ZXEPLZUQ.js";
16
+ } from "./chunk-YGM47S7M.js";
17
17
  import {
18
18
  runPeerProfileReasoner
19
19
  } from "./chunk-I74SUMNI.js";
@@ -32,7 +32,7 @@ import {
32
32
  import {
33
33
  CompoundingEngine,
34
34
  defaultTierMigrationCycleBudget
35
- } from "./chunk-M7KAJBO2.js";
35
+ } from "./chunk-EADUOZWH.js";
36
36
  import {
37
37
  SharedContextManager
38
38
  } from "./chunk-5KBIOI4G.js";
@@ -210,7 +210,7 @@ import {
210
210
  buildEntityRecallSection,
211
211
  entityRecentTranscriptLookbackHours,
212
212
  readRecentEntityTranscriptEntries
213
- } from "./chunk-UP2Q7U4G.js";
213
+ } from "./chunk-MTVC5S5N.js";
214
214
  import {
215
215
  planEpisodeWindowsWithFallback
216
216
  } from "./chunk-T3GIETKV.js";
@@ -225,7 +225,7 @@ import {
225
225
  } from "./chunk-7G5NTS7F.js";
226
226
  import {
227
227
  refreshConvergedNamespaces
228
- } from "./chunk-NJZY5LOC.js";
228
+ } from "./chunk-ZARHK7PT.js";
229
229
  import {
230
230
  builtInConnectorPackageSpecifier,
231
231
  ensureBuiltInWearableConnectors,
@@ -234,7 +234,7 @@ import {
234
234
  runTimelinePublishCli,
235
235
  screenCandidateFact,
236
236
  summarizeVaultPublish
237
- } from "./chunk-PTJWUN4H.js";
237
+ } from "./chunk-IJKBIOWL.js";
238
238
  import {
239
239
  normalizeReplaySessionKey
240
240
  } from "./chunk-AJVLDJU6.js";
@@ -244,14 +244,14 @@ import {
244
244
  import {
245
245
  compareVerifiedEpisodeResults,
246
246
  searchVerifiedEpisodes
247
- } from "./chunk-66CC6L6R.js";
247
+ } from "./chunk-76LKZ42K.js";
248
248
  import {
249
249
  ThreadingManager
250
250
  } from "./chunk-R7WYAXPO.js";
251
251
  import {
252
252
  compareVerifiedSemanticRuleResults,
253
253
  searchVerifiedSemanticRules
254
- } from "./chunk-QWURVT5Z.js";
254
+ } from "./chunk-N7CATBYH.js";
255
255
  import {
256
256
  searchWorkProductLedgerEntries
257
257
  } from "./chunk-B2NXOVZN.js";
@@ -264,10 +264,10 @@ import {
264
264
  import {
265
265
  runNamespaceMaintenanceFanout,
266
266
  summarizeNamespaceMaintenanceHealth
267
- } from "./chunk-HL643H2F.js";
267
+ } from "./chunk-TMWSCE2L.js";
268
268
  import {
269
269
  planNamespaceMaintenance
270
- } from "./chunk-AWKADEMO.js";
270
+ } from "./chunk-QCAJMIAE.js";
271
271
  import {
272
272
  isAboveImportanceThreshold,
273
273
  scoreImportance
@@ -296,10 +296,10 @@ import {
296
296
  materializeAfterSemanticConsolidation,
297
297
  parseConsolidationResponse,
298
298
  parseOperatorAwareConsolidationResponse
299
- } from "./chunk-2HVCTFKG.js";
299
+ } from "./chunk-X2ZLHUEO.js";
300
300
  import {
301
301
  SmartBuffer
302
- } from "./chunk-L5RMURVI.js";
302
+ } from "./chunk-GDCKOER4.js";
303
303
  import {
304
304
  semanticChunkContent
305
305
  } from "./chunk-2GBFKHBZ.js";
@@ -335,7 +335,7 @@ import {
335
335
  embeddingsFromCosineHits,
336
336
  normalizeConnectorScope,
337
337
  runSeedGraduationPass
338
- } from "./chunk-XWXBXBOX.js";
338
+ } from "./chunk-YLB7TW2B.js";
339
339
  import {
340
340
  compileCorrectionRule,
341
341
  correctionsFilePath,
@@ -373,7 +373,7 @@ import {
373
373
  } from "./chunk-QW27DOHG.js";
374
374
  import {
375
375
  MeetingsInputError
376
- } from "./chunk-RSYFSCKL.js";
376
+ } from "./chunk-WZEDFDJ6.js";
377
377
  import {
378
378
  WearablesInputError,
379
379
  describeErrorForOperator
@@ -391,7 +391,7 @@ import {
391
391
  } from "./chunk-FZVZYU5C.js";
392
392
  import {
393
393
  NamespaceCatalog
394
- } from "./chunk-ZRDEOC4X.js";
394
+ } from "./chunk-QI7LLSWX.js";
395
395
  import {
396
396
  RecallResultFormatter,
397
397
  SessionContextCoordinator,
@@ -400,10 +400,10 @@ import {
400
400
  detectPassiveCorrections,
401
401
  renderSessionExperiencePreview,
402
402
  scoreSessionExperienceForPrompt
403
- } from "./chunk-C5GTIRIO.js";
403
+ } from "./chunk-IMNJJKHW.js";
404
404
  import {
405
405
  importCapsule
406
- } from "./chunk-A3UFV4K3.js";
406
+ } from "./chunk-JIYJIH5N.js";
407
407
  import {
408
408
  isCodingGraphInstalled
409
409
  } from "./chunk-VQ7B2Q6M.js";
@@ -429,7 +429,7 @@ import {
429
429
  } from "./chunk-HTTZ3GJ6.js";
430
430
  import {
431
431
  buildXraySnapshot
432
- } from "./chunk-VHBGJAYC.js";
432
+ } from "./chunk-25QK3LR2.js";
433
433
  import {
434
434
  objectiveStateStoreOverrideForNamespace,
435
435
  searchObjectiveStateSnapshots
@@ -443,7 +443,7 @@ import {
443
443
  } from "./chunk-BJLCV2P3.js";
444
444
  import {
445
445
  searchHarmonicRetrieval
446
- } from "./chunk-DF4SYU4Z.js";
446
+ } from "./chunk-C5OW2FFB.js";
447
447
  import {
448
448
  ProfilingCollector
449
449
  } from "./chunk-DOWACHYO.js";
@@ -466,7 +466,7 @@ import {
466
466
  } from "./chunk-NVKO5YKP.js";
467
467
  import {
468
468
  NamespaceStorageRouter
469
- } from "./chunk-M3GOWG2P.js";
469
+ } from "./chunk-FMOUUWQN.js";
470
470
  import {
471
471
  pruneOrphanCueAnchors
472
472
  } from "./chunk-LXATZLSC.js";
@@ -527,17 +527,12 @@ import {
527
527
  isTaskInitiationIntent,
528
528
  planRecallMode
529
529
  } from "./chunk-CSAKJVXW.js";
530
- import {
531
- bufferTurnsEqual,
532
- describeError,
533
- groupTurnsByExtractionScope
534
- } from "./chunk-KZMRMKC7.js";
535
530
  import {
536
531
  LocalLlmClient
537
532
  } from "./chunk-74AY3S7U.js";
538
533
  import {
539
534
  buildChainFollowupGenerator
540
- } from "./chunk-W37MS6SX.js";
535
+ } from "./chunk-ZRSXXWIX.js";
541
536
  import {
542
537
  decideLifecycleTransition,
543
538
  resolveLifecycleState
@@ -582,7 +577,7 @@ import {
582
577
  reconstructFusionInputs,
583
578
  selfDeps,
584
579
  serializeFusionDay
585
- } from "./chunk-I6UTOUBK.js";
580
+ } from "./chunk-6VBKU3FY.js";
586
581
  import {
587
582
  bodyIsEscaped,
588
583
  decodeTranscriptBody,
@@ -599,12 +594,12 @@ import {
599
594
  import {
600
595
  NamespaceSearchRouter,
601
596
  namespaceCollectionName
602
- } from "./chunk-JEDS2QYV.js";
597
+ } from "./chunk-OH55F76C.js";
603
598
  import {
604
599
  createConversationIndexRuntime,
605
600
  createSearchBackend,
606
601
  isSearchBackendEnabled
607
- } from "./chunk-VQ6H4DL6.js";
602
+ } from "./chunk-L334PSLW.js";
608
603
  import {
609
604
  NoopSearchBackend
610
605
  } from "./chunk-CYEPCZN5.js";
@@ -683,6 +678,11 @@ import {
683
678
  getCachedQmdRecall,
684
679
  setCachedQmdRecall
685
680
  } from "./chunk-42JKGUFJ.js";
681
+ import {
682
+ bufferTurnsEqual,
683
+ describeError,
684
+ groupTurnsByExtractionScope
685
+ } from "./chunk-U7MIMS2Y.js";
686
686
  import {
687
687
  FallbackLlmClient,
688
688
  gatewayTaskChainOptions
@@ -707,7 +707,7 @@ import {
707
707
  } from "./chunk-PJKTFXE2.js";
708
708
  import {
709
709
  confidenceTier
710
- } from "./chunk-PARM6OYL.js";
710
+ } from "./chunk-SEA56G6S.js";
711
711
  import {
712
712
  extractJsonCandidates
713
713
  } from "./chunk-YBA52OKG.js";
@@ -893,6 +893,18 @@ import {
893
893
  import path23 from "path";
894
894
  import { createHash as createHash10 } from "crypto";
895
895
 
896
+ // src/orchestration/buffer-swap.ts
897
+ async function withBufferStorage(orchestrator, storage, task) {
898
+ const live = orchestrator.buffer;
899
+ orchestrator.buffer = new SmartBuffer(orchestrator.config, storage);
900
+ try {
901
+ await orchestrator.buffer.load();
902
+ return await task();
903
+ } finally {
904
+ orchestrator.buffer = live;
905
+ }
906
+ }
907
+
896
908
  // src/orchestration/tier-migration-coordinator.ts
897
909
  import path from "path";
898
910
  var TierMigrationCoordinator = class {
@@ -15864,6 +15876,19 @@ var ExtractionDrain = class {
15864
15876
  }
15865
15877
  };
15866
15878
 
15879
+ // src/orchestration/buffer-drain-gate.ts
15880
+ function skipClaimedSession(buffer, bufferKey, settle) {
15881
+ if (!buffer?.isSessionClaimed?.(bufferKey)) return false;
15882
+ log.debug(`extraction skip: session claimed by buffer drain (${bufferKey})`);
15883
+ settle({
15884
+ status: "skipped",
15885
+ reason: "claimed_by_buffer_drain",
15886
+ persistedCount: 0,
15887
+ durableOutputCount: 0
15888
+ });
15889
+ return true;
15890
+ }
15891
+
15867
15892
  // src/orchestration/turn-ingestion.ts
15868
15893
  var ReplayAdmissionRefusedError = class extends Error {
15869
15894
  constructor(message) {
@@ -16331,6 +16356,7 @@ var TurnIngestionCoordinator = class {
16331
16356
  }
16332
16357
  async queueBufferedExtraction(turnsToExtract, reason, options = {}) {
16333
16358
  const bufferKey = options.bufferKey ?? turnsToExtract[0]?.sessionKey ?? "default";
16359
+ if (skipClaimedSession(this.deps.buffer, bufferKey, (result) => options.onTaskSettled?.(void 0, result))) return;
16334
16360
  if (!options.skipDedupeCheck && !this.deps.shouldQueueExtraction(turnsToExtract, { bufferKey })) {
16335
16361
  log.debug(`extraction dedupe skip: preserving buffer (${reason})`);
16336
16362
  options.onTaskSettled?.(void 0, {
@@ -23152,11 +23178,7 @@ ${doc.content}` : doc.content,
23152
23178
  }
23153
23179
  async recall(prompt, sessionKey, options = {}) {
23154
23180
  if (options.xrayCapture === true) {
23155
- const { result } = await this.runRecallWithXrayCapture(
23156
- prompt,
23157
- sessionKey,
23158
- options
23159
- );
23181
+ const { result } = await this.runRecallWithXrayCapture(prompt, sessionKey, options);
23160
23182
  return result;
23161
23183
  }
23162
23184
  return this.invokeRecall(prompt, sessionKey, options);
@@ -23560,6 +23582,10 @@ ${doc.content}` : doc.content,
23560
23582
  options
23561
23583
  );
23562
23584
  }
23585
+ /** Run `task` with the buffer backed by `storage` (the drain claims). */
23586
+ async withBufferStorage(storage, task) {
23587
+ return withBufferStorage(this, storage, task);
23588
+ }
23563
23589
  async flushSession(sessionKey, options) {
23564
23590
  return (this.sessionContextCoordinator ?? new SessionContextCoordinator(
23565
23591
  selfDeps(this)
@@ -31614,7 +31640,8 @@ export {
31614
31640
  mergeGraphExpandedResults,
31615
31641
  graphPathRelativeToStorage,
31616
31642
  blendGraphExpandedRecallScore,
31643
+ TurnIngestionCoordinator,
31617
31644
  qmdStartupCollectionChecksWithTimeout,
31618
31645
  Orchestrator
31619
31646
  };
31620
- //# sourceMappingURL=chunk-3DG2YAAX.js.map
31647
+ //# sourceMappingURL=chunk-6EZPYZT3.js.map