@remnic/core 10.0.14 → 10.0.15

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 (355) hide show
  1. package/dist/abstraction-nodes.js +3 -2
  2. package/dist/access-admin-ops-surface.js +33 -31
  3. package/dist/access-authorization-probe.js +34 -32
  4. package/dist/access-boundary.js +33 -31
  5. package/dist/access-cli.js +87 -85
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-extraction-force-flush.js +33 -31
  8. package/dist/access-http-briefing.js +34 -32
  9. package/dist/access-http-query.js +35 -33
  10. package/dist/access-http.js +52 -50
  11. package/dist/access-identity-continuity-surface.js +33 -31
  12. package/dist/access-lcm-surface.js +33 -31
  13. package/dist/access-mcp.js +44 -42
  14. package/dist/access-namespace-preflight.js +33 -31
  15. package/dist/access-observe-write-category.js +4 -3
  16. package/dist/access-observe-write-surface.js +33 -31
  17. package/dist/access-offline-manifest.js +3 -2
  18. package/dist/access-operations-batch.js +36 -34
  19. package/dist/access-operations.js +43 -41
  20. package/dist/access-recall-concurrency.js +33 -31
  21. package/dist/access-recall-response.js +33 -31
  22. package/dist/access-recall-surface.js +33 -31
  23. package/dist/access-schema.js +3 -2
  24. package/dist/access-service.js +33 -31
  25. package/dist/access-surface-catalog.js +35 -33
  26. package/dist/access-surface-catalog.js.map +1 -1
  27. package/dist/active-recall.js +14 -12
  28. package/dist/active-recall.js.map +1 -1
  29. package/dist/briefing.js +10 -8
  30. package/dist/calibration.d.ts.map +1 -1
  31. package/dist/calibration.js +6 -3
  32. package/dist/calibration.js.map +1 -1
  33. package/dist/causal-behavior.js +4 -3
  34. package/dist/causal-behavior.js.map +1 -1
  35. package/dist/causal-chain.js +4 -3
  36. package/dist/causal-consolidation.js +14 -12
  37. package/dist/causal-consolidation.js.map +1 -1
  38. package/dist/causal-retrieval.js +4 -3
  39. package/dist/causal-retrieval.js.map +1 -1
  40. package/dist/causal-trajectory.js +3 -2
  41. package/dist/{chunk-J7JWFZHI.js → chunk-22RM2ZUJ.js} +37 -37
  42. package/dist/{chunk-63B2IZYE.js → chunk-23ZQPP2G.js} +6 -1
  43. package/dist/chunk-23ZQPP2G.js.map +1 -0
  44. package/dist/{chunk-YFMBHQRG.js → chunk-2PTH4PRL.js} +2 -2
  45. package/dist/{chunk-TITG2NBS.js → chunk-2PYHLSXK.js} +2 -2
  46. package/dist/{chunk-B6O2YLUR.js → chunk-2Z5DIDQD.js} +6 -1
  47. package/dist/chunk-2Z5DIDQD.js.map +1 -0
  48. package/dist/{chunk-KH2LKDX7.js → chunk-33G67YZF.js} +2 -2
  49. package/dist/{chunk-LCKVXX5F.js → chunk-3GNIJUUE.js} +2 -2
  50. package/dist/{chunk-SWIKABKI.js → chunk-3Q3XD3NO.js} +2 -2
  51. package/dist/{chunk-4KY5GSMB.js → chunk-4PDTVVSW.js} +2 -2
  52. package/dist/{chunk-HM7RHKS4.js → chunk-4RNBLLZR.js} +2 -2
  53. package/dist/{chunk-PAZ35RJ4.js → chunk-4SCZZ3U7.js} +240 -55
  54. package/dist/chunk-4SCZZ3U7.js.map +1 -0
  55. package/dist/{chunk-Y4NKEXQT.js → chunk-5ATSXCAG.js} +3 -3
  56. package/dist/{chunk-JDZFIR2S.js → chunk-5KGYTX5O.js} +2 -2
  57. package/dist/{chunk-NW2E4CI2.js → chunk-5SMR542T.js} +2 -2
  58. package/dist/{chunk-S7LWX2PQ.js → chunk-655FVTCD.js} +2 -2
  59. package/dist/{chunk-ZSH2NRDV.js → chunk-6WGMZQGG.js} +2 -2
  60. package/dist/{chunk-W47S5TIH.js → chunk-7VQ6AI7H.js} +2 -2
  61. package/dist/{chunk-G7NYVKD6.js → chunk-B2NXOVZN.js} +2 -2
  62. package/dist/{chunk-N7KYEVLK.js → chunk-BK2BVLZW.js} +2 -2
  63. package/dist/{chunk-QJ622LTI.js → chunk-BQOGQULP.js} +30 -8
  64. package/dist/chunk-BQOGQULP.js.map +1 -0
  65. package/dist/{chunk-S2I7DL5Q.js → chunk-C2RW36YR.js} +2 -2
  66. package/dist/{chunk-P5NQN4JE.js → chunk-C6JMGAMO.js} +6 -2
  67. package/dist/chunk-C6JMGAMO.js.map +1 -0
  68. package/dist/{chunk-6LG7BWKW.js → chunk-CFZ4SXXH.js} +2 -2
  69. package/dist/{chunk-BLVHDY2U.js → chunk-DOWACHYO.js} +5 -2
  70. package/dist/chunk-DOWACHYO.js.map +1 -0
  71. package/dist/{chunk-4OSG5Y6M.js → chunk-DPSOFK4D.js} +2 -2
  72. package/dist/{chunk-QOZJCSFO.js → chunk-DQR2LD3V.js} +2 -2
  73. package/dist/{chunk-EBA5DA77.js → chunk-EOU6V4IN.js} +2 -2
  74. package/dist/{chunk-5WCJLQTM.js → chunk-F2772ATT.js} +2 -2
  75. package/dist/{chunk-46EST7JO.js → chunk-F2XNSIPP.js} +2 -2
  76. package/dist/{chunk-PZHQWFR3.js → chunk-G3UUAQOD.js} +2 -2
  77. package/dist/{chunk-YE36AJL7.js → chunk-GCVDFX66.js} +2 -2
  78. package/dist/{chunk-FFOVKNQV.js → chunk-GFAM2LTC.js} +2 -2
  79. package/dist/{chunk-T2YX56QI.js → chunk-GQJKVQJR.js} +2 -2
  80. package/dist/{chunk-L5DAHSEZ.js → chunk-GWVNGDJW.js} +2 -2
  81. package/dist/{chunk-N45NEBOD.js → chunk-GZXXPCWJ.js} +3 -3
  82. package/dist/{chunk-EPJDSQHF.js → chunk-H5IUN433.js} +2 -2
  83. package/dist/{chunk-EUAIYYYR.js → chunk-H6FREOYX.js} +7 -7
  84. package/dist/{chunk-FSIMZNBC.js → chunk-HBAOOSHU.js} +2 -2
  85. package/dist/{chunk-Q4E24IRR.js → chunk-HDN7IVIO.js} +14 -11
  86. package/dist/chunk-HDN7IVIO.js.map +1 -0
  87. package/dist/{chunk-T3FMRLWQ.js → chunk-HFSPY26A.js} +2 -2
  88. package/dist/{chunk-GH7AOMJD.js → chunk-IJMDBYCO.js} +2 -2
  89. package/dist/{chunk-JQ7XU625.js → chunk-IUCPLBDS.js} +6 -6
  90. package/dist/{chunk-WSGPFRBH.js → chunk-IWD33CF4.js} +2 -2
  91. package/dist/{chunk-4IHBN6WU.js → chunk-JKMIGCK6.js} +2 -2
  92. package/dist/{chunk-ROBHL3GL.js → chunk-JWX2Q6HS.js} +2 -2
  93. package/dist/{chunk-4O6WRBGE.js → chunk-KJXP6RUG.js} +5 -1
  94. package/dist/chunk-KJXP6RUG.js.map +1 -0
  95. package/dist/{chunk-JIHMUOOS.js → chunk-KLJVTZ3R.js} +3 -3
  96. package/dist/{chunk-FP4JYE66.js → chunk-KW4AJ7T3.js} +2 -2
  97. package/dist/{chunk-NIRQGDYC.js → chunk-L5VCT7LU.js} +5 -1
  98. package/dist/chunk-L5VCT7LU.js.map +1 -0
  99. package/dist/{chunk-LS2FHUML.js → chunk-LQ5SS4OP.js} +3 -3
  100. package/dist/{chunk-SIIRTDJ4.js → chunk-LWFWZTWX.js} +2 -2
  101. package/dist/{chunk-BMWN7B3Y.js → chunk-LXATZLSC.js} +3 -3
  102. package/dist/{chunk-B665A6BO.js → chunk-MJIOGYKX.js} +2 -2
  103. package/dist/{chunk-RTKV5XHL.js → chunk-MO6N4QYY.js} +2 -2
  104. package/dist/{chunk-N4C7QKOG.js → chunk-MWWAQXZ6.js} +2 -2
  105. package/dist/{chunk-ZJVMUBYF.js → chunk-NHUX6GXA.js} +6 -6
  106. package/dist/{chunk-CB6ANA2I.js → chunk-NZCKG25S.js} +2 -2
  107. package/dist/{chunk-UMTCNEVQ.js → chunk-O2YPCFJT.js} +11 -11
  108. package/dist/{chunk-TZNDKTX5.js → chunk-OQR42XCN.js} +37 -33
  109. package/dist/chunk-OQR42XCN.js.map +1 -0
  110. package/dist/{chunk-JYZSRNR7.js → chunk-PIITB2YZ.js} +2 -2
  111. package/dist/chunk-PPUNC7UX.js +73 -0
  112. package/dist/chunk-PPUNC7UX.js.map +1 -0
  113. package/dist/{chunk-EQWEIIKQ.js → chunk-PQM3B54K.js} +6 -1
  114. package/dist/chunk-PQM3B54K.js.map +1 -0
  115. package/dist/{chunk-UQDG3YLN.js → chunk-PRU7OF3Y.js} +3 -3
  116. package/dist/{chunk-EU534WGS.js → chunk-PVHQSLNN.js} +7 -7
  117. package/dist/{chunk-5VC7J76U.js → chunk-QPH52AZB.js} +2 -2
  118. package/dist/{chunk-XISROV24.js → chunk-QSEUUQUF.js} +2 -2
  119. package/dist/chunk-QUIRIG2P.js +31 -0
  120. package/dist/chunk-QUIRIG2P.js.map +1 -0
  121. package/dist/{chunk-FUFAXVBA.js → chunk-RI2KCQHP.js} +6 -2
  122. package/dist/chunk-RI2KCQHP.js.map +1 -0
  123. package/dist/{chunk-QX6JN3O4.js → chunk-RP7PQWZM.js} +6 -6
  124. package/dist/{chunk-O2IPAX26.js → chunk-RTTPBBAN.js} +4 -4
  125. package/dist/{chunk-W5MCEVUS.js → chunk-RYYVMZBR.js} +2 -2
  126. package/dist/{chunk-WLMZ2L5P.js → chunk-T7ASDYNK.js} +2 -2
  127. package/dist/{chunk-P7TOIOT7.js → chunk-THEPGZBM.js} +2 -2
  128. package/dist/{chunk-QODKDRSP.js → chunk-TMC7HBED.js} +4 -4
  129. package/dist/{chunk-I7S55EOB.js → chunk-TPNCXSXP.js} +2 -2
  130. package/dist/{chunk-SS3IS2JR.js → chunk-UGYUBENJ.js} +2 -2
  131. package/dist/{chunk-GELS5Z5Z.js → chunk-V3TXIXXY.js} +3 -3
  132. package/dist/{chunk-WVADKFWV.js → chunk-VNZMZPAC.js} +2 -2
  133. package/dist/{chunk-JPTPS4OB.js → chunk-VPXIKBPX.js} +2 -2
  134. package/dist/{chunk-OP6N4H6A.js → chunk-W3FVQBGF.js} +2 -2
  135. package/dist/{chunk-DPR2WTN3.js → chunk-WGTR573G.js} +16 -16
  136. package/dist/{chunk-W3K3HITK.js → chunk-WLT6LTQP.js} +2 -2
  137. package/dist/{chunk-GMXWTJNU.js → chunk-XKRXN63M.js} +2 -2
  138. package/dist/{chunk-ZV65I6ME.js → chunk-XLBFX63V.js} +28 -25
  139. package/dist/chunk-XLBFX63V.js.map +1 -0
  140. package/dist/{chunk-KR6ZKECI.js → chunk-XYGQSDTH.js} +3 -3
  141. package/dist/{chunk-6WHJ2EAB.js → chunk-Z64TS5V4.js} +2 -2
  142. package/dist/{chunk-NHLLKEKK.js → chunk-ZAJLJ35W.js} +2 -2
  143. package/dist/{chunk-O4SGYW7H.js → chunk-ZKHSAMTE.js} +2 -2
  144. package/dist/cli.d.ts.map +1 -1
  145. package/dist/cli.js +72 -70
  146. package/dist/coding/export-okf-codegraph.js +9 -7
  147. package/dist/coding/export-okf-codegraph.js.map +1 -1
  148. package/dist/coding/pre-action-gate.js +4 -3
  149. package/dist/commitment-ledger.js +3 -2
  150. package/dist/compounding/engine.js +11 -9
  151. package/dist/config.js +14 -12
  152. package/dist/connectors/codex-materialize-runner.js +10 -8
  153. package/dist/connectors/index.js +10 -8
  154. package/dist/consolidation-provenance-check.d.ts.map +1 -1
  155. package/dist/consolidation-provenance-check.js +2 -1
  156. package/dist/contradiction/index.js +3 -2
  157. package/dist/convergence-refresh.js +12 -10
  158. package/dist/corpus-watermark.js +12 -10
  159. package/dist/correction/correction-planner.d.ts.map +1 -1
  160. package/dist/cue-anchors.js +4 -3
  161. package/dist/deep-recall-http-glue.js +4 -3
  162. package/dist/{dreams-ledger-567VKVOU.js → dreams-ledger-UCHHRQ4R.js} +3 -2
  163. package/dist/entity-retrieval.js +10 -8
  164. package/dist/eval-trajectory-store.js +4 -3
  165. package/dist/eval-trajectory.js +4 -3
  166. package/dist/evals.js +3 -2
  167. package/dist/external-wiki-access.js +34 -32
  168. package/dist/extraction.js +12 -10
  169. package/dist/{first-start-migration-6A5BJPDW.js → first-start-migration-QVD22WWS.js} +6 -5
  170. package/dist/{first-start-migration-6A5BJPDW.js.map → first-start-migration-QVD22WWS.js.map} +1 -1
  171. package/dist/harmonic-construction.js +5 -4
  172. package/dist/harmonic-retrieval.js +14 -12
  173. package/dist/harmonic-source-lookup.js +3 -2
  174. package/dist/index.js +87 -85
  175. package/dist/json-store.d.ts.map +1 -1
  176. package/dist/json-store.js +2 -1
  177. package/dist/location/index.js +12 -10
  178. package/dist/maintenance/dreams-ledger.d.ts.map +1 -1
  179. package/dist/maintenance/memory-governance.d.ts.map +1 -1
  180. package/dist/maintenance/memory-governance.js +10 -8
  181. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -8
  182. package/dist/maintenance/rebuild-memory-projection-runner.js +12 -10
  183. package/dist/maintenance/rebuild-memory-projection.js +11 -9
  184. package/dist/memory-browse-operations.js +34 -32
  185. package/dist/namespaces/migrate.js +11 -9
  186. package/dist/namespaces/search.js +7 -6
  187. package/dist/namespaces/storage.d.ts.map +1 -1
  188. package/dist/namespaces/storage.js +10 -8
  189. package/dist/objective-state-writers.js +4 -3
  190. package/dist/objective-state.js +3 -2
  191. package/dist/offline-sync-snapshot-stream.js +3 -2
  192. package/dist/offline-sync.d.ts.map +1 -1
  193. package/dist/offline-sync.js +2 -1
  194. package/dist/operator-doctor-corpus.js +13 -11
  195. package/dist/operator-toolkit.js +25 -23
  196. package/dist/orchestration/maintenance.js +20 -18
  197. package/dist/orchestrator.js +87 -85
  198. package/dist/profiling.d.ts.map +1 -1
  199. package/dist/profiling.js +2 -1
  200. package/dist/recall-navigation-operations.js +34 -32
  201. package/dist/recall-navigation.js +33 -31
  202. package/dist/{resolution-7AY36LGJ.js → resolution-ZU5BIAJA.js} +4 -3
  203. package/dist/resume-bundles.js +19 -17
  204. package/dist/retrieval-agents.d.ts +1 -1
  205. package/dist/retrieval-agents.d.ts.map +1 -1
  206. package/dist/retrieval-agents.js +7 -1
  207. package/dist/search/document-scanner.d.ts.map +1 -1
  208. package/dist/search/document-scanner.js +2 -1
  209. package/dist/search/factory.js +6 -5
  210. package/dist/search/index.js +6 -5
  211. package/dist/search/lancedb-backend.js +3 -2
  212. package/dist/search/meilisearch-backend.js +3 -2
  213. package/dist/search/orama-backend.js +3 -2
  214. package/dist/semantic-consolidation.js +11 -9
  215. package/dist/semantic-rule-promotion.js +10 -8
  216. package/dist/semantic-rule-verifier.js +10 -8
  217. package/dist/source-agent-qualifier.js +10 -8
  218. package/dist/standup/build.js +10 -8
  219. package/dist/storage/entity-canonical-id-migration.d.ts.map +1 -1
  220. package/dist/storage/entity-store.d.ts +32 -1
  221. package/dist/storage/entity-store.d.ts.map +1 -1
  222. package/dist/storage/memory-read-store.d.ts.map +1 -1
  223. package/dist/storage/supersession-audit.d.ts.map +1 -1
  224. package/dist/storage.d.ts.map +1 -1
  225. package/dist/storage.js +9 -7
  226. package/dist/support-passport/index.js +36 -34
  227. package/dist/{tier-stats-RQM76XYY.js → tier-stats-C3IAMS4X.js} +6 -5
  228. package/dist/{tier-stats-RQM76XYY.js.map → tier-stats-C3IAMS4X.js.map} +1 -1
  229. package/dist/transcript.d.ts.map +1 -1
  230. package/dist/transcript.js +2 -1
  231. package/dist/transfer/export-okf.js +10 -8
  232. package/dist/trust-zones.js +3 -2
  233. package/dist/utility-learner.js +4 -3
  234. package/dist/utility-runtime.js +5 -4
  235. package/dist/utility-telemetry.js +3 -2
  236. package/dist/utils/macos-replication-junk.d.ts +32 -0
  237. package/dist/utils/macos-replication-junk.d.ts.map +1 -0
  238. package/dist/utils/malformed-entity-record.d.ts +24 -0
  239. package/dist/utils/malformed-entity-record.d.ts.map +1 -0
  240. package/dist/verified-recall.js +10 -8
  241. package/dist/who-knows-cli.js +11 -9
  242. package/dist/who-knows.js +10 -8
  243. package/dist/work-product-ledger.js +3 -2
  244. package/package.json +2 -2
  245. package/src/calibration.ts +3 -2
  246. package/src/cli.ts +2 -2
  247. package/src/consolidation-provenance-check.ts +2 -0
  248. package/src/correction/correction-planner.ts +3 -2
  249. package/src/json-store.ts +3 -0
  250. package/src/macos-replication-junk-scanners.test.ts +275 -0
  251. package/src/maintenance/dreams-ledger.ts +2 -0
  252. package/src/maintenance/memory-governance.ts +2 -0
  253. package/src/namespaces/storage.ts +2 -0
  254. package/src/offline-sync-macos-junk.test.ts +169 -0
  255. package/src/offline-sync.ts +7 -0
  256. package/src/profiling.ts +2 -1
  257. package/src/retrieval-agents.ts +29 -12
  258. package/src/search/document-scanner.ts +4 -0
  259. package/src/storage/entity-canonical-id-migration.ts +56 -13
  260. package/src/storage/entity-store.ts +173 -15
  261. package/src/storage/memory-read-store.ts +30 -5
  262. package/src/storage/supersession-audit.ts +2 -0
  263. package/src/storage.ts +3 -2
  264. package/src/transcript.ts +11 -10
  265. package/src/utils/macos-replication-junk.test.ts +46 -0
  266. package/src/utils/macos-replication-junk.ts +65 -0
  267. package/src/utils/malformed-entity-record.ts +101 -0
  268. package/dist/chunk-4O6WRBGE.js.map +0 -1
  269. package/dist/chunk-63B2IZYE.js.map +0 -1
  270. package/dist/chunk-B6O2YLUR.js.map +0 -1
  271. package/dist/chunk-BLVHDY2U.js.map +0 -1
  272. package/dist/chunk-EQWEIIKQ.js.map +0 -1
  273. package/dist/chunk-FUFAXVBA.js.map +0 -1
  274. package/dist/chunk-NIRQGDYC.js.map +0 -1
  275. package/dist/chunk-P5NQN4JE.js.map +0 -1
  276. package/dist/chunk-PAZ35RJ4.js.map +0 -1
  277. package/dist/chunk-Q4E24IRR.js.map +0 -1
  278. package/dist/chunk-QJ622LTI.js.map +0 -1
  279. package/dist/chunk-TZNDKTX5.js.map +0 -1
  280. package/dist/chunk-ZV65I6ME.js.map +0 -1
  281. /package/dist/{chunk-J7JWFZHI.js.map → chunk-22RM2ZUJ.js.map} +0 -0
  282. /package/dist/{chunk-YFMBHQRG.js.map → chunk-2PTH4PRL.js.map} +0 -0
  283. /package/dist/{chunk-TITG2NBS.js.map → chunk-2PYHLSXK.js.map} +0 -0
  284. /package/dist/{chunk-KH2LKDX7.js.map → chunk-33G67YZF.js.map} +0 -0
  285. /package/dist/{chunk-LCKVXX5F.js.map → chunk-3GNIJUUE.js.map} +0 -0
  286. /package/dist/{chunk-SWIKABKI.js.map → chunk-3Q3XD3NO.js.map} +0 -0
  287. /package/dist/{chunk-4KY5GSMB.js.map → chunk-4PDTVVSW.js.map} +0 -0
  288. /package/dist/{chunk-HM7RHKS4.js.map → chunk-4RNBLLZR.js.map} +0 -0
  289. /package/dist/{chunk-Y4NKEXQT.js.map → chunk-5ATSXCAG.js.map} +0 -0
  290. /package/dist/{chunk-JDZFIR2S.js.map → chunk-5KGYTX5O.js.map} +0 -0
  291. /package/dist/{chunk-NW2E4CI2.js.map → chunk-5SMR542T.js.map} +0 -0
  292. /package/dist/{chunk-S7LWX2PQ.js.map → chunk-655FVTCD.js.map} +0 -0
  293. /package/dist/{chunk-ZSH2NRDV.js.map → chunk-6WGMZQGG.js.map} +0 -0
  294. /package/dist/{chunk-W47S5TIH.js.map → chunk-7VQ6AI7H.js.map} +0 -0
  295. /package/dist/{chunk-G7NYVKD6.js.map → chunk-B2NXOVZN.js.map} +0 -0
  296. /package/dist/{chunk-N7KYEVLK.js.map → chunk-BK2BVLZW.js.map} +0 -0
  297. /package/dist/{chunk-S2I7DL5Q.js.map → chunk-C2RW36YR.js.map} +0 -0
  298. /package/dist/{chunk-6LG7BWKW.js.map → chunk-CFZ4SXXH.js.map} +0 -0
  299. /package/dist/{chunk-4OSG5Y6M.js.map → chunk-DPSOFK4D.js.map} +0 -0
  300. /package/dist/{chunk-QOZJCSFO.js.map → chunk-DQR2LD3V.js.map} +0 -0
  301. /package/dist/{chunk-EBA5DA77.js.map → chunk-EOU6V4IN.js.map} +0 -0
  302. /package/dist/{chunk-5WCJLQTM.js.map → chunk-F2772ATT.js.map} +0 -0
  303. /package/dist/{chunk-46EST7JO.js.map → chunk-F2XNSIPP.js.map} +0 -0
  304. /package/dist/{chunk-PZHQWFR3.js.map → chunk-G3UUAQOD.js.map} +0 -0
  305. /package/dist/{chunk-YE36AJL7.js.map → chunk-GCVDFX66.js.map} +0 -0
  306. /package/dist/{chunk-FFOVKNQV.js.map → chunk-GFAM2LTC.js.map} +0 -0
  307. /package/dist/{chunk-T2YX56QI.js.map → chunk-GQJKVQJR.js.map} +0 -0
  308. /package/dist/{chunk-L5DAHSEZ.js.map → chunk-GWVNGDJW.js.map} +0 -0
  309. /package/dist/{chunk-N45NEBOD.js.map → chunk-GZXXPCWJ.js.map} +0 -0
  310. /package/dist/{chunk-EPJDSQHF.js.map → chunk-H5IUN433.js.map} +0 -0
  311. /package/dist/{chunk-EUAIYYYR.js.map → chunk-H6FREOYX.js.map} +0 -0
  312. /package/dist/{chunk-FSIMZNBC.js.map → chunk-HBAOOSHU.js.map} +0 -0
  313. /package/dist/{chunk-T3FMRLWQ.js.map → chunk-HFSPY26A.js.map} +0 -0
  314. /package/dist/{chunk-GH7AOMJD.js.map → chunk-IJMDBYCO.js.map} +0 -0
  315. /package/dist/{chunk-JQ7XU625.js.map → chunk-IUCPLBDS.js.map} +0 -0
  316. /package/dist/{chunk-WSGPFRBH.js.map → chunk-IWD33CF4.js.map} +0 -0
  317. /package/dist/{chunk-4IHBN6WU.js.map → chunk-JKMIGCK6.js.map} +0 -0
  318. /package/dist/{chunk-ROBHL3GL.js.map → chunk-JWX2Q6HS.js.map} +0 -0
  319. /package/dist/{chunk-JIHMUOOS.js.map → chunk-KLJVTZ3R.js.map} +0 -0
  320. /package/dist/{chunk-FP4JYE66.js.map → chunk-KW4AJ7T3.js.map} +0 -0
  321. /package/dist/{chunk-LS2FHUML.js.map → chunk-LQ5SS4OP.js.map} +0 -0
  322. /package/dist/{chunk-SIIRTDJ4.js.map → chunk-LWFWZTWX.js.map} +0 -0
  323. /package/dist/{chunk-BMWN7B3Y.js.map → chunk-LXATZLSC.js.map} +0 -0
  324. /package/dist/{chunk-B665A6BO.js.map → chunk-MJIOGYKX.js.map} +0 -0
  325. /package/dist/{chunk-RTKV5XHL.js.map → chunk-MO6N4QYY.js.map} +0 -0
  326. /package/dist/{chunk-N4C7QKOG.js.map → chunk-MWWAQXZ6.js.map} +0 -0
  327. /package/dist/{chunk-ZJVMUBYF.js.map → chunk-NHUX6GXA.js.map} +0 -0
  328. /package/dist/{chunk-CB6ANA2I.js.map → chunk-NZCKG25S.js.map} +0 -0
  329. /package/dist/{chunk-UMTCNEVQ.js.map → chunk-O2YPCFJT.js.map} +0 -0
  330. /package/dist/{chunk-JYZSRNR7.js.map → chunk-PIITB2YZ.js.map} +0 -0
  331. /package/dist/{chunk-UQDG3YLN.js.map → chunk-PRU7OF3Y.js.map} +0 -0
  332. /package/dist/{chunk-EU534WGS.js.map → chunk-PVHQSLNN.js.map} +0 -0
  333. /package/dist/{chunk-5VC7J76U.js.map → chunk-QPH52AZB.js.map} +0 -0
  334. /package/dist/{chunk-XISROV24.js.map → chunk-QSEUUQUF.js.map} +0 -0
  335. /package/dist/{chunk-QX6JN3O4.js.map → chunk-RP7PQWZM.js.map} +0 -0
  336. /package/dist/{chunk-O2IPAX26.js.map → chunk-RTTPBBAN.js.map} +0 -0
  337. /package/dist/{chunk-W5MCEVUS.js.map → chunk-RYYVMZBR.js.map} +0 -0
  338. /package/dist/{chunk-WLMZ2L5P.js.map → chunk-T7ASDYNK.js.map} +0 -0
  339. /package/dist/{chunk-P7TOIOT7.js.map → chunk-THEPGZBM.js.map} +0 -0
  340. /package/dist/{chunk-QODKDRSP.js.map → chunk-TMC7HBED.js.map} +0 -0
  341. /package/dist/{chunk-I7S55EOB.js.map → chunk-TPNCXSXP.js.map} +0 -0
  342. /package/dist/{chunk-SS3IS2JR.js.map → chunk-UGYUBENJ.js.map} +0 -0
  343. /package/dist/{chunk-GELS5Z5Z.js.map → chunk-V3TXIXXY.js.map} +0 -0
  344. /package/dist/{chunk-WVADKFWV.js.map → chunk-VNZMZPAC.js.map} +0 -0
  345. /package/dist/{chunk-JPTPS4OB.js.map → chunk-VPXIKBPX.js.map} +0 -0
  346. /package/dist/{chunk-OP6N4H6A.js.map → chunk-W3FVQBGF.js.map} +0 -0
  347. /package/dist/{chunk-DPR2WTN3.js.map → chunk-WGTR573G.js.map} +0 -0
  348. /package/dist/{chunk-W3K3HITK.js.map → chunk-WLT6LTQP.js.map} +0 -0
  349. /package/dist/{chunk-GMXWTJNU.js.map → chunk-XKRXN63M.js.map} +0 -0
  350. /package/dist/{chunk-KR6ZKECI.js.map → chunk-XYGQSDTH.js.map} +0 -0
  351. /package/dist/{chunk-6WHJ2EAB.js.map → chunk-Z64TS5V4.js.map} +0 -0
  352. /package/dist/{chunk-NHLLKEKK.js.map → chunk-ZAJLJ35W.js.map} +0 -0
  353. /package/dist/{chunk-O4SGYW7H.js.map → chunk-ZKHSAMTE.js.map} +0 -0
  354. /package/dist/{dreams-ledger-567VKVOU.js.map → dreams-ledger-UCHHRQ4R.js.map} +0 -0
  355. /package/dist/{resolution-7AY36LGJ.js.map → resolution-ZU5BIAJA.js.map} +0 -0
@@ -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":[]}
@@ -1,15 +1,16 @@
1
1
  import {
2
2
  readChainIndex,
3
3
  resolveChainsDir
4
- } from "./chunk-N45NEBOD.js";
4
+ } from "./chunk-GZXXPCWJ.js";
5
5
  import "./chunk-B7RWBZXW.js";
6
6
  import {
7
7
  readCausalTrajectoryRecords,
8
8
  searchCausalTrajectories
9
- } from "./chunk-S2I7DL5Q.js";
9
+ } from "./chunk-C2RW36YR.js";
10
10
  import "./chunk-YCVB7X56.js";
11
11
  import "./chunk-A2IYSXDQ.js";
12
- import "./chunk-B6O2YLUR.js";
12
+ import "./chunk-2Z5DIDQD.js";
13
+ import "./chunk-QUIRIG2P.js";
13
14
  import "./chunk-KNA3BXXL.js";
14
15
  import {
15
16
  log
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/causal-retrieval.ts"],"sourcesContent":["/**\n * causal-retrieval.ts — CMC Phase 3: Causal Retrieval Channel\n *\n * Walks upstream/downstream causal chains during recall to surface\n * connected trajectories. Branching points (multiple outgoing edges\n * with different outcomes) get a counterfactual boost as they represent\n * decision points worth surfacing.\n */\n\nimport type { CausalTrajectoryRecord } from \"./causal-trajectory.js\";\nimport { readCausalTrajectoryRecords, searchCausalTrajectories } from \"./causal-trajectory.js\";\nimport {\n readChainIndex,\n resolveChainsDir,\n type CausalChainIndex,\n type CausalEdge,\n} from \"./causal-chain.js\";\nimport { log } from \"./logger.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface CausalRetrievalConfig {\n maxDepth: number;\n maxChars: number;\n counterfactualBoost: number;\n}\n\nexport interface CausalRetrievalResult {\n trajectoryId: string;\n direction: \"upstream\" | \"downstream\" | \"seed\";\n depth: number;\n score: number;\n edgeType?: CausalEdge[\"edgeType\"];\n edgeConfidence?: number;\n isCounterfactual: boolean;\n summary: string;\n}\n\n// ─── Graph Traversal ─────────────────────────────────────────────────────────\n\n/**\n * Walk upstream (incoming edges) from a seed trajectory.\n */\nfunction walkUpstream(\n seedId: string,\n index: CausalChainIndex,\n maxDepth: number,\n counterfactualBoost: number,\n): Array<{ trajectoryId: string; depth: number; score: number; edgeType: CausalEdge[\"edgeType\"]; edgeConfidence: number; isCounterfactual: boolean }> {\n const visited = new Set<string>([seedId]);\n const results: Array<{ trajectoryId: string; depth: number; score: number; edgeType: CausalEdge[\"edgeType\"]; edgeConfidence: number; isCounterfactual: boolean }> = [];\n\n let frontier = [seedId];\n for (let depth = 1; depth <= maxDepth; depth++) {\n const nextFrontier: string[] = [];\n\n for (const currentId of frontier) {\n const incomingEdgeIds = index.incoming[currentId] ?? [];\n\n for (const edgeId of incomingEdgeIds) {\n const edge = index.edges[edgeId];\n if (!edge) continue;\n\n const fromId = edge.fromTrajectoryId;\n if (visited.has(fromId)) continue;\n visited.add(fromId);\n\n // Check if this is a counterfactual branching point\n const outgoingFromSource = index.outgoing[fromId] ?? [];\n const isCounterfactual = outgoingFromSource.length > 1;\n\n const depthDecay = 1 / depth;\n let score = depthDecay * edge.confidence;\n if (isCounterfactual) score += counterfactualBoost;\n\n results.push({\n trajectoryId: fromId,\n depth,\n score,\n edgeType: edge.edgeType,\n edgeConfidence: edge.confidence,\n isCounterfactual,\n });\n\n nextFrontier.push(fromId);\n }\n }\n\n frontier = nextFrontier;\n if (frontier.length === 0) break;\n }\n\n return results;\n}\n\n/**\n * Walk downstream (outgoing edges) from a seed trajectory.\n * Max 2 hops downstream (less relevant than upstream context).\n */\nfunction walkDownstream(\n seedId: string,\n index: CausalChainIndex,\n maxDepth: number,\n counterfactualBoost: number,\n): Array<{ trajectoryId: string; depth: number; score: number; edgeType: CausalEdge[\"edgeType\"]; edgeConfidence: number; isCounterfactual: boolean }> {\n const downstreamMaxDepth = Math.min(maxDepth, 2);\n const visited = new Set<string>([seedId]);\n const results: Array<{ trajectoryId: string; depth: number; score: number; edgeType: CausalEdge[\"edgeType\"]; edgeConfidence: number; isCounterfactual: boolean }> = [];\n\n let frontier = [seedId];\n for (let depth = 1; depth <= downstreamMaxDepth; depth++) {\n const nextFrontier: string[] = [];\n\n for (const currentId of frontier) {\n const outgoingEdgeIds = index.outgoing[currentId] ?? [];\n\n // Counterfactual: multiple outgoing = branching point\n const isCounterfactual = outgoingEdgeIds.length > 1;\n\n for (const edgeId of outgoingEdgeIds) {\n const edge = index.edges[edgeId];\n if (!edge) continue;\n\n const toId = edge.toTrajectoryId;\n if (visited.has(toId)) continue;\n visited.add(toId);\n\n const depthDecay = 1 / (depth + 1); // downstream penalized more\n let score = depthDecay * edge.confidence;\n if (isCounterfactual) score += counterfactualBoost;\n\n results.push({\n trajectoryId: toId,\n depth,\n score,\n edgeType: edge.edgeType,\n edgeConfidence: edge.confidence,\n isCounterfactual,\n });\n\n nextFrontier.push(toId);\n }\n }\n\n frontier = nextFrontier;\n if (frontier.length === 0) break;\n }\n\n return results;\n}\n\n// ─── Section Formatting ──────────────────────────────────────────────────────\n\nfunction formatRetrievalResult(result: CausalRetrievalResult): string {\n const direction = result.direction === \"upstream\" ? \"↑\" : result.direction === \"downstream\" ? \"↓\" : \"•\";\n const counterfactual = result.isCounterfactual ? \" [branching point]\" : \"\";\n const edgeInfo = result.edgeType ? ` (${result.edgeType})` : \"\";\n return `- ${direction} ${result.summary}${edgeInfo}${counterfactual}`;\n}\n\nfunction formatConnectedTrajectorySummary(\n trajectoryId: string,\n depth: number,\n trajectoriesById: Map<string, CausalTrajectoryRecord>,\n): string {\n const record = trajectoriesById.get(trajectoryId);\n if (!record) return `Depth ${depth}: trajectory ${trajectoryId.slice(0, 12)}`;\n return `Depth ${depth}: [${record.outcomeKind}] ${record.goal} → ${record.outcomeSummary}`;\n}\n\nexport function formatCausalRetrievalSection(\n results: CausalRetrievalResult[],\n maxChars: number,\n): string | null {\n if (results.length === 0) return null;\n\n const lines: string[] = [\n \"## Causal Chain Context\",\n \"\",\n \"Related causal trajectories from connected sessions:\",\n \"\",\n ];\n\n let totalChars = lines.join(\"\\n\").length;\n\n for (const result of results) {\n const line = formatRetrievalResult(result);\n if (totalChars + line.length + 1 > maxChars) break;\n lines.push(line);\n totalChars += line.length + 1;\n }\n\n if (lines.length <= 4) return null; // only header, no content\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Retrieve causal chain context for a recall query.\n * 1. Use existing causal trajectory search for seed trajectories\n * 2. Walk upstream/downstream from seeds\n * 3. Format as recall section\n */\nexport async function retrieveCausalChains(options: {\n memoryDir: string;\n causalTrajectoryStoreDir?: string;\n query: string;\n sessionKey?: string;\n config: CausalRetrievalConfig;\n}): Promise<string | null> {\n try {\n const { memoryDir, causalTrajectoryStoreDir, query, sessionKey, config: retrievalConfig } = options;\n\n // 1. Search for seed trajectories matching the query\n const seeds = await searchCausalTrajectories({\n memoryDir,\n causalTrajectoryStoreDir,\n query,\n maxResults: 3,\n sessionKey,\n });\n\n if (seeds.length === 0) return null;\n\n // 2. Load chain index\n const chainsDir = resolveChainsDir(memoryDir, causalTrajectoryStoreDir);\n const chainIndex = await readChainIndex(chainsDir);\n\n if (Object.keys(chainIndex.edges).length === 0) return null;\n\n const { trajectories } = await readCausalTrajectoryRecords({ memoryDir, causalTrajectoryStoreDir });\n const trajectoriesById = new Map(trajectories.map((trajectory) => [trajectory.trajectoryId, trajectory]));\n\n // 3. Walk chains from each seed\n const allResults: CausalRetrievalResult[] = [];\n\n for (const seed of seeds) {\n // Add seed itself\n allResults.push({\n trajectoryId: seed.record.trajectoryId,\n direction: \"seed\",\n depth: 0,\n score: seed.score,\n isCounterfactual: false,\n summary: `[${seed.record.outcomeKind}] ${seed.record.goal} → ${seed.record.outcomeSummary}`,\n });\n\n // Walk upstream\n const upstream = walkUpstream(\n seed.record.trajectoryId,\n chainIndex,\n retrievalConfig.maxDepth,\n retrievalConfig.counterfactualBoost,\n );\n for (const u of upstream) {\n allResults.push({\n trajectoryId: u.trajectoryId,\n direction: \"upstream\",\n depth: u.depth,\n score: u.score,\n edgeType: u.edgeType,\n edgeConfidence: u.edgeConfidence,\n isCounterfactual: u.isCounterfactual,\n summary: formatConnectedTrajectorySummary(u.trajectoryId, u.depth, trajectoriesById),\n });\n }\n\n // Walk downstream\n const downstream = walkDownstream(\n seed.record.trajectoryId,\n chainIndex,\n retrievalConfig.maxDepth,\n retrievalConfig.counterfactualBoost,\n );\n for (const d of downstream) {\n allResults.push({\n trajectoryId: d.trajectoryId,\n direction: \"downstream\",\n depth: d.depth,\n score: d.score,\n edgeType: d.edgeType,\n edgeConfidence: d.edgeConfidence,\n isCounterfactual: d.isCounterfactual,\n summary: formatConnectedTrajectorySummary(d.trajectoryId, d.depth, trajectoriesById),\n });\n }\n }\n\n // 4. Sort by score and format\n allResults.sort((a, b) => b.score - a.score);\n\n return formatCausalRetrievalSection(allResults, retrievalConfig.maxChars);\n } catch (error) {\n log.warn(`[cmc] causal retrieval failed (non-fatal): ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/causal-retrieval.ts"],"sourcesContent":["/**\n * causal-retrieval.ts — CMC Phase 3: Causal Retrieval Channel\n *\n * Walks upstream/downstream causal chains during recall to surface\n * connected trajectories. Branching points (multiple outgoing edges\n * with different outcomes) get a counterfactual boost as they represent\n * decision points worth surfacing.\n */\n\nimport type { CausalTrajectoryRecord } from \"./causal-trajectory.js\";\nimport { readCausalTrajectoryRecords, searchCausalTrajectories } from \"./causal-trajectory.js\";\nimport {\n readChainIndex,\n resolveChainsDir,\n type CausalChainIndex,\n type CausalEdge,\n} from \"./causal-chain.js\";\nimport { log } from \"./logger.js\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface CausalRetrievalConfig {\n maxDepth: number;\n maxChars: number;\n counterfactualBoost: number;\n}\n\nexport interface CausalRetrievalResult {\n trajectoryId: string;\n direction: \"upstream\" | \"downstream\" | \"seed\";\n depth: number;\n score: number;\n edgeType?: CausalEdge[\"edgeType\"];\n edgeConfidence?: number;\n isCounterfactual: boolean;\n summary: string;\n}\n\n// ─── Graph Traversal ─────────────────────────────────────────────────────────\n\n/**\n * Walk upstream (incoming edges) from a seed trajectory.\n */\nfunction walkUpstream(\n seedId: string,\n index: CausalChainIndex,\n maxDepth: number,\n counterfactualBoost: number,\n): Array<{ trajectoryId: string; depth: number; score: number; edgeType: CausalEdge[\"edgeType\"]; edgeConfidence: number; isCounterfactual: boolean }> {\n const visited = new Set<string>([seedId]);\n const results: Array<{ trajectoryId: string; depth: number; score: number; edgeType: CausalEdge[\"edgeType\"]; edgeConfidence: number; isCounterfactual: boolean }> = [];\n\n let frontier = [seedId];\n for (let depth = 1; depth <= maxDepth; depth++) {\n const nextFrontier: string[] = [];\n\n for (const currentId of frontier) {\n const incomingEdgeIds = index.incoming[currentId] ?? [];\n\n for (const edgeId of incomingEdgeIds) {\n const edge = index.edges[edgeId];\n if (!edge) continue;\n\n const fromId = edge.fromTrajectoryId;\n if (visited.has(fromId)) continue;\n visited.add(fromId);\n\n // Check if this is a counterfactual branching point\n const outgoingFromSource = index.outgoing[fromId] ?? [];\n const isCounterfactual = outgoingFromSource.length > 1;\n\n const depthDecay = 1 / depth;\n let score = depthDecay * edge.confidence;\n if (isCounterfactual) score += counterfactualBoost;\n\n results.push({\n trajectoryId: fromId,\n depth,\n score,\n edgeType: edge.edgeType,\n edgeConfidence: edge.confidence,\n isCounterfactual,\n });\n\n nextFrontier.push(fromId);\n }\n }\n\n frontier = nextFrontier;\n if (frontier.length === 0) break;\n }\n\n return results;\n}\n\n/**\n * Walk downstream (outgoing edges) from a seed trajectory.\n * Max 2 hops downstream (less relevant than upstream context).\n */\nfunction walkDownstream(\n seedId: string,\n index: CausalChainIndex,\n maxDepth: number,\n counterfactualBoost: number,\n): Array<{ trajectoryId: string; depth: number; score: number; edgeType: CausalEdge[\"edgeType\"]; edgeConfidence: number; isCounterfactual: boolean }> {\n const downstreamMaxDepth = Math.min(maxDepth, 2);\n const visited = new Set<string>([seedId]);\n const results: Array<{ trajectoryId: string; depth: number; score: number; edgeType: CausalEdge[\"edgeType\"]; edgeConfidence: number; isCounterfactual: boolean }> = [];\n\n let frontier = [seedId];\n for (let depth = 1; depth <= downstreamMaxDepth; depth++) {\n const nextFrontier: string[] = [];\n\n for (const currentId of frontier) {\n const outgoingEdgeIds = index.outgoing[currentId] ?? [];\n\n // Counterfactual: multiple outgoing = branching point\n const isCounterfactual = outgoingEdgeIds.length > 1;\n\n for (const edgeId of outgoingEdgeIds) {\n const edge = index.edges[edgeId];\n if (!edge) continue;\n\n const toId = edge.toTrajectoryId;\n if (visited.has(toId)) continue;\n visited.add(toId);\n\n const depthDecay = 1 / (depth + 1); // downstream penalized more\n let score = depthDecay * edge.confidence;\n if (isCounterfactual) score += counterfactualBoost;\n\n results.push({\n trajectoryId: toId,\n depth,\n score,\n edgeType: edge.edgeType,\n edgeConfidence: edge.confidence,\n isCounterfactual,\n });\n\n nextFrontier.push(toId);\n }\n }\n\n frontier = nextFrontier;\n if (frontier.length === 0) break;\n }\n\n return results;\n}\n\n// ─── Section Formatting ──────────────────────────────────────────────────────\n\nfunction formatRetrievalResult(result: CausalRetrievalResult): string {\n const direction = result.direction === \"upstream\" ? \"↑\" : result.direction === \"downstream\" ? \"↓\" : \"•\";\n const counterfactual = result.isCounterfactual ? \" [branching point]\" : \"\";\n const edgeInfo = result.edgeType ? ` (${result.edgeType})` : \"\";\n return `- ${direction} ${result.summary}${edgeInfo}${counterfactual}`;\n}\n\nfunction formatConnectedTrajectorySummary(\n trajectoryId: string,\n depth: number,\n trajectoriesById: Map<string, CausalTrajectoryRecord>,\n): string {\n const record = trajectoriesById.get(trajectoryId);\n if (!record) return `Depth ${depth}: trajectory ${trajectoryId.slice(0, 12)}`;\n return `Depth ${depth}: [${record.outcomeKind}] ${record.goal} → ${record.outcomeSummary}`;\n}\n\nexport function formatCausalRetrievalSection(\n results: CausalRetrievalResult[],\n maxChars: number,\n): string | null {\n if (results.length === 0) return null;\n\n const lines: string[] = [\n \"## Causal Chain Context\",\n \"\",\n \"Related causal trajectories from connected sessions:\",\n \"\",\n ];\n\n let totalChars = lines.join(\"\\n\").length;\n\n for (const result of results) {\n const line = formatRetrievalResult(result);\n if (totalChars + line.length + 1 > maxChars) break;\n lines.push(line);\n totalChars += line.length + 1;\n }\n\n if (lines.length <= 4) return null; // only header, no content\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Retrieve causal chain context for a recall query.\n * 1. Use existing causal trajectory search for seed trajectories\n * 2. Walk upstream/downstream from seeds\n * 3. Format as recall section\n */\nexport async function retrieveCausalChains(options: {\n memoryDir: string;\n causalTrajectoryStoreDir?: string;\n query: string;\n sessionKey?: string;\n config: CausalRetrievalConfig;\n}): Promise<string | null> {\n try {\n const { memoryDir, causalTrajectoryStoreDir, query, sessionKey, config: retrievalConfig } = options;\n\n // 1. Search for seed trajectories matching the query\n const seeds = await searchCausalTrajectories({\n memoryDir,\n causalTrajectoryStoreDir,\n query,\n maxResults: 3,\n sessionKey,\n });\n\n if (seeds.length === 0) return null;\n\n // 2. Load chain index\n const chainsDir = resolveChainsDir(memoryDir, causalTrajectoryStoreDir);\n const chainIndex = await readChainIndex(chainsDir);\n\n if (Object.keys(chainIndex.edges).length === 0) return null;\n\n const { trajectories } = await readCausalTrajectoryRecords({ memoryDir, causalTrajectoryStoreDir });\n const trajectoriesById = new Map(trajectories.map((trajectory) => [trajectory.trajectoryId, trajectory]));\n\n // 3. Walk chains from each seed\n const allResults: CausalRetrievalResult[] = [];\n\n for (const seed of seeds) {\n // Add seed itself\n allResults.push({\n trajectoryId: seed.record.trajectoryId,\n direction: \"seed\",\n depth: 0,\n score: seed.score,\n isCounterfactual: false,\n summary: `[${seed.record.outcomeKind}] ${seed.record.goal} → ${seed.record.outcomeSummary}`,\n });\n\n // Walk upstream\n const upstream = walkUpstream(\n seed.record.trajectoryId,\n chainIndex,\n retrievalConfig.maxDepth,\n retrievalConfig.counterfactualBoost,\n );\n for (const u of upstream) {\n allResults.push({\n trajectoryId: u.trajectoryId,\n direction: \"upstream\",\n depth: u.depth,\n score: u.score,\n edgeType: u.edgeType,\n edgeConfidence: u.edgeConfidence,\n isCounterfactual: u.isCounterfactual,\n summary: formatConnectedTrajectorySummary(u.trajectoryId, u.depth, trajectoriesById),\n });\n }\n\n // Walk downstream\n const downstream = walkDownstream(\n seed.record.trajectoryId,\n chainIndex,\n retrievalConfig.maxDepth,\n retrievalConfig.counterfactualBoost,\n );\n for (const d of downstream) {\n allResults.push({\n trajectoryId: d.trajectoryId,\n direction: \"downstream\",\n depth: d.depth,\n score: d.score,\n edgeType: d.edgeType,\n edgeConfidence: d.edgeConfidence,\n isCounterfactual: d.isCounterfactual,\n summary: formatConnectedTrajectorySummary(d.trajectoryId, d.depth, trajectoriesById),\n });\n }\n }\n\n // 4. Sort by score and format\n allResults.sort((a, b) => b.score - a.score);\n\n return formatCausalRetrievalSection(allResults, retrievalConfig.maxChars);\n } catch (error) {\n log.warn(`[cmc] causal retrieval failed (non-fatal): ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA2CA,SAAS,aACP,QACA,OACA,UACA,qBACoJ;AACpJ,QAAM,UAAU,oBAAI,IAAY,CAAC,MAAM,CAAC;AACxC,QAAM,UAA8J,CAAC;AAErK,MAAI,WAAW,CAAC,MAAM;AACtB,WAAS,QAAQ,GAAG,SAAS,UAAU,SAAS;AAC9C,UAAM,eAAyB,CAAC;AAEhC,eAAW,aAAa,UAAU;AAChC,YAAM,kBAAkB,MAAM,SAAS,SAAS,KAAK,CAAC;AAEtD,iBAAW,UAAU,iBAAiB;AACpC,cAAM,OAAO,MAAM,MAAM,MAAM;AAC/B,YAAI,CAAC,KAAM;AAEX,cAAM,SAAS,KAAK;AACpB,YAAI,QAAQ,IAAI,MAAM,EAAG;AACzB,gBAAQ,IAAI,MAAM;AAGlB,cAAM,qBAAqB,MAAM,SAAS,MAAM,KAAK,CAAC;AACtD,cAAM,mBAAmB,mBAAmB,SAAS;AAErD,cAAM,aAAa,IAAI;AACvB,YAAI,QAAQ,aAAa,KAAK;AAC9B,YAAI,iBAAkB,UAAS;AAE/B,gBAAQ,KAAK;AAAA,UACX,cAAc;AAAA,UACd;AAAA,UACA;AAAA,UACA,UAAU,KAAK;AAAA,UACf,gBAAgB,KAAK;AAAA,UACrB;AAAA,QACF,CAAC;AAED,qBAAa,KAAK,MAAM;AAAA,MAC1B;AAAA,IACF;AAEA,eAAW;AACX,QAAI,SAAS,WAAW,EAAG;AAAA,EAC7B;AAEA,SAAO;AACT;AAMA,SAAS,eACP,QACA,OACA,UACA,qBACoJ;AACpJ,QAAM,qBAAqB,KAAK,IAAI,UAAU,CAAC;AAC/C,QAAM,UAAU,oBAAI,IAAY,CAAC,MAAM,CAAC;AACxC,QAAM,UAA8J,CAAC;AAErK,MAAI,WAAW,CAAC,MAAM;AACtB,WAAS,QAAQ,GAAG,SAAS,oBAAoB,SAAS;AACxD,UAAM,eAAyB,CAAC;AAEhC,eAAW,aAAa,UAAU;AAChC,YAAM,kBAAkB,MAAM,SAAS,SAAS,KAAK,CAAC;AAGtD,YAAM,mBAAmB,gBAAgB,SAAS;AAElD,iBAAW,UAAU,iBAAiB;AACpC,cAAM,OAAO,MAAM,MAAM,MAAM;AAC/B,YAAI,CAAC,KAAM;AAEX,cAAM,OAAO,KAAK;AAClB,YAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,gBAAQ,IAAI,IAAI;AAEhB,cAAM,aAAa,KAAK,QAAQ;AAChC,YAAI,QAAQ,aAAa,KAAK;AAC9B,YAAI,iBAAkB,UAAS;AAE/B,gBAAQ,KAAK;AAAA,UACX,cAAc;AAAA,UACd;AAAA,UACA;AAAA,UACA,UAAU,KAAK;AAAA,UACf,gBAAgB,KAAK;AAAA,UACrB;AAAA,QACF,CAAC;AAED,qBAAa,KAAK,IAAI;AAAA,MACxB;AAAA,IACF;AAEA,eAAW;AACX,QAAI,SAAS,WAAW,EAAG;AAAA,EAC7B;AAEA,SAAO;AACT;AAIA,SAAS,sBAAsB,QAAuC;AACpE,QAAM,YAAY,OAAO,cAAc,aAAa,WAAM,OAAO,cAAc,eAAe,WAAM;AACpG,QAAM,iBAAiB,OAAO,mBAAmB,uBAAuB;AACxE,QAAM,WAAW,OAAO,WAAW,KAAK,OAAO,QAAQ,MAAM;AAC7D,SAAO,KAAK,SAAS,IAAI,OAAO,OAAO,GAAG,QAAQ,GAAG,cAAc;AACrE;AAEA,SAAS,iCACP,cACA,OACA,kBACQ;AACR,QAAM,SAAS,iBAAiB,IAAI,YAAY;AAChD,MAAI,CAAC,OAAQ,QAAO,SAAS,KAAK,gBAAgB,aAAa,MAAM,GAAG,EAAE,CAAC;AAC3E,SAAO,SAAS,KAAK,MAAM,OAAO,WAAW,KAAK,OAAO,IAAI,WAAM,OAAO,cAAc;AAC1F;AAEO,SAAS,6BACd,SACA,UACe;AACf,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,aAAa,MAAM,KAAK,IAAI,EAAE;AAElC,aAAW,UAAU,SAAS;AAC5B,UAAM,OAAO,sBAAsB,MAAM;AACzC,QAAI,aAAa,KAAK,SAAS,IAAI,SAAU;AAC7C,UAAM,KAAK,IAAI;AACf,kBAAc,KAAK,SAAS;AAAA,EAC9B;AAEA,MAAI,MAAM,UAAU,EAAG,QAAO;AAC9B,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;AAUA,eAAsB,qBAAqB,SAMhB;AACzB,MAAI;AACF,UAAM,EAAE,WAAW,0BAA0B,OAAO,YAAY,QAAQ,gBAAgB,IAAI;AAG5F,UAAM,QAAQ,MAAM,yBAAyB;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,IACF,CAAC;AAED,QAAI,MAAM,WAAW,EAAG,QAAO;AAG/B,UAAM,YAAY,iBAAiB,WAAW,wBAAwB;AACtE,UAAM,aAAa,MAAM,eAAe,SAAS;AAEjD,QAAI,OAAO,KAAK,WAAW,KAAK,EAAE,WAAW,EAAG,QAAO;AAEvD,UAAM,EAAE,aAAa,IAAI,MAAM,4BAA4B,EAAE,WAAW,yBAAyB,CAAC;AAClG,UAAM,mBAAmB,IAAI,IAAI,aAAa,IAAI,CAAC,eAAe,CAAC,WAAW,cAAc,UAAU,CAAC,CAAC;AAGxG,UAAM,aAAsC,CAAC;AAE7C,eAAW,QAAQ,OAAO;AAExB,iBAAW,KAAK;AAAA,QACd,cAAc,KAAK,OAAO;AAAA,QAC1B,WAAW;AAAA,QACX,OAAO;AAAA,QACP,OAAO,KAAK;AAAA,QACZ,kBAAkB;AAAA,QAClB,SAAS,IAAI,KAAK,OAAO,WAAW,KAAK,KAAK,OAAO,IAAI,WAAM,KAAK,OAAO,cAAc;AAAA,MAC3F,CAAC;AAGD,YAAM,WAAW;AAAA,QACf,KAAK,OAAO;AAAA,QACZ;AAAA,QACA,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,MAClB;AACA,iBAAW,KAAK,UAAU;AACxB,mBAAW,KAAK;AAAA,UACd,cAAc,EAAE;AAAA,UAChB,WAAW;AAAA,UACX,OAAO,EAAE;AAAA,UACT,OAAO,EAAE;AAAA,UACT,UAAU,EAAE;AAAA,UACZ,gBAAgB,EAAE;AAAA,UAClB,kBAAkB,EAAE;AAAA,UACpB,SAAS,iCAAiC,EAAE,cAAc,EAAE,OAAO,gBAAgB;AAAA,QACrF,CAAC;AAAA,MACH;AAGA,YAAM,aAAa;AAAA,QACjB,KAAK,OAAO;AAAA,QACZ;AAAA,QACA,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,MAClB;AACA,iBAAW,KAAK,YAAY;AAC1B,mBAAW,KAAK;AAAA,UACd,cAAc,EAAE;AAAA,UAChB,WAAW;AAAA,UACX,OAAO,EAAE;AAAA,UACT,OAAO,EAAE;AAAA,UACT,UAAU,EAAE;AAAA,UACZ,gBAAgB,EAAE;AAAA,UAClB,kBAAkB,EAAE;AAAA,UACpB,SAAS,iCAAiC,EAAE,cAAc,EAAE,OAAO,gBAAgB;AAAA,QACrF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,eAAW,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAE3C,WAAO,6BAA6B,YAAY,gBAAgB,QAAQ;AAAA,EAC1E,SAAS,OAAO;AACd,QAAI,KAAK,8CAA8C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAC/G,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -9,10 +9,11 @@ import {
9
9
  resolveCausalTrajectoryStoreDir,
10
10
  searchCausalTrajectories,
11
11
  validateCausalTrajectoryRecord
12
- } from "./chunk-S2I7DL5Q.js";
12
+ } from "./chunk-C2RW36YR.js";
13
13
  import "./chunk-YCVB7X56.js";
14
14
  import "./chunk-A2IYSXDQ.js";
15
- import "./chunk-B6O2YLUR.js";
15
+ import "./chunk-2Z5DIDQD.js";
16
+ import "./chunk-QUIRIG2P.js";
16
17
  import "./chunk-KNA3BXXL.js";
17
18
  import "./chunk-PZ5AY32C.js";
18
19
  export {
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  ActivityStore,
12
12
  MaintenanceScheduler
13
- } from "./chunk-EUAIYYYR.js";
13
+ } from "./chunk-H6FREOYX.js";
14
14
  import {
15
15
  runPeerProfileReasoner
16
16
  } from "./chunk-I74SUMNI.js";
@@ -32,7 +32,7 @@ import {
32
32
  import {
33
33
  CompoundingEngine,
34
34
  defaultTierMigrationCycleBudget
35
- } from "./chunk-UQDG3YLN.js";
35
+ } from "./chunk-PRU7OF3Y.js";
36
36
  import {
37
37
  SharedContextManager
38
38
  } from "./chunk-LZACDIM2.js";
@@ -43,7 +43,7 @@ import {
43
43
  applyUtilityPromotionRuntimePolicy,
44
44
  applyUtilityRankingRuntimeDelta,
45
45
  loadUtilityRuntimeValues
46
- } from "./chunk-SWIKABKI.js";
46
+ } from "./chunk-3Q3XD3NO.js";
47
47
  import {
48
48
  decideTierTransition
49
49
  } from "./chunk-GCBIXUPT.js";
@@ -83,7 +83,7 @@ import {
83
83
  runDirectAgent,
84
84
  runTemporalAgent,
85
85
  shouldRunAgent
86
- } from "./chunk-QJ622LTI.js";
86
+ } from "./chunk-BQOGQULP.js";
87
87
  import {
88
88
  clearIndexesAsync,
89
89
  deindexMemoriesBatchAsync,
@@ -160,7 +160,7 @@ import {
160
160
  harmonicEntitySegment,
161
161
  normalizedHarmonicEntityIdentity,
162
162
  persistHarmonicRecords
163
- } from "./chunk-LS2FHUML.js";
163
+ } from "./chunk-LQ5SS4OP.js";
164
164
  import {
165
165
  classifyMemoryKind
166
166
  } from "./chunk-YAZNBMNF.js";
@@ -169,7 +169,7 @@ import {
169
169
  } from "./chunk-XXSOVESA.js";
170
170
  import {
171
171
  ExtractionEngine
172
- } from "./chunk-WSGPFRBH.js";
172
+ } from "./chunk-IWD33CF4.js";
173
173
  import {
174
174
  buildFocusedListRecallSection,
175
175
  shouldRecallFocusedListEvidence
@@ -201,7 +201,7 @@ import {
201
201
  buildEntityRecallSection,
202
202
  entityRecentTranscriptLookbackHours,
203
203
  readRecentEntityTranscriptEntries
204
- } from "./chunk-W47S5TIH.js";
204
+ } from "./chunk-7VQ6AI7H.js";
205
205
  import {
206
206
  planEpisodeWindowsWithFallback
207
207
  } from "./chunk-T3GIETKV.js";
@@ -219,7 +219,7 @@ import {
219
219
  } from "./chunk-7G5NTS7F.js";
220
220
  import {
221
221
  refreshConvergedNamespaces
222
- } from "./chunk-GMXWTJNU.js";
222
+ } from "./chunk-XKRXN63M.js";
223
223
  import {
224
224
  builtInConnectorPackageSpecifier,
225
225
  ensureBuiltInWearableConnectors,
@@ -228,7 +228,7 @@ import {
228
228
  runTimelinePublishCli,
229
229
  screenCandidateFact,
230
230
  summarizeVaultPublish
231
- } from "./chunk-TZNDKTX5.js";
231
+ } from "./chunk-OQR42XCN.js";
232
232
  import {
233
233
  RoutingRulesStore
234
234
  } from "./chunk-TBUEE7XF.js";
@@ -238,30 +238,30 @@ import {
238
238
  import {
239
239
  compareVerifiedEpisodeResults,
240
240
  searchVerifiedEpisodes
241
- } from "./chunk-EPJDSQHF.js";
241
+ } from "./chunk-H5IUN433.js";
242
242
  import {
243
243
  ThreadingManager
244
244
  } from "./chunk-R7WYAXPO.js";
245
245
  import {
246
246
  compareVerifiedSemanticRuleResults,
247
247
  searchVerifiedSemanticRules
248
- } from "./chunk-YFMBHQRG.js";
248
+ } from "./chunk-2PTH4PRL.js";
249
249
  import {
250
250
  searchWorkProductLedgerEntries
251
- } from "./chunk-G7NYVKD6.js";
251
+ } from "./chunk-B2NXOVZN.js";
252
252
  import {
253
253
  TranscriptManager
254
- } from "./chunk-Q4E24IRR.js";
254
+ } from "./chunk-HDN7IVIO.js";
255
255
  import {
256
256
  PolicyRuntimeManager
257
257
  } from "./chunk-2LA3H54D.js";
258
258
  import {
259
259
  runNamespaceMaintenanceFanout,
260
260
  summarizeNamespaceMaintenanceHealth
261
- } from "./chunk-UMTCNEVQ.js";
261
+ } from "./chunk-O2YPCFJT.js";
262
262
  import {
263
263
  planNamespaceMaintenance
264
- } from "./chunk-JIHMUOOS.js";
264
+ } from "./chunk-KLJVTZ3R.js";
265
265
  import {
266
266
  isAboveImportanceThreshold,
267
267
  scoreImportance
@@ -272,7 +272,7 @@ import {
272
272
  } from "./chunk-OZKOPQCM.js";
273
273
  import {
274
274
  recordEvalShadowRecall
275
- } from "./chunk-4IHBN6WU.js";
275
+ } from "./chunk-JKMIGCK6.js";
276
276
  import {
277
277
  collectNativeKnowledgeChunks,
278
278
  formatNativeKnowledgeSection,
@@ -280,7 +280,7 @@ import {
280
280
  } from "./chunk-2DQ2XREU.js";
281
281
  import {
282
282
  applyCommitmentLedgerLifecycle
283
- } from "./chunk-NHLLKEKK.js";
283
+ } from "./chunk-ZAJLJ35W.js";
284
284
  import {
285
285
  buildConsolidationPrompt,
286
286
  buildExtensionsBlockForConsolidation,
@@ -290,7 +290,7 @@ import {
290
290
  materializeAfterSemanticConsolidation,
291
291
  parseConsolidationResponse,
292
292
  parseOperatorAwareConsolidationResponse
293
- } from "./chunk-PZHQWFR3.js";
293
+ } from "./chunk-G3UUAQOD.js";
294
294
  import {
295
295
  semanticChunkContent
296
296
  } from "./chunk-2GBFKHBZ.js";
@@ -329,7 +329,7 @@ import {
329
329
  embeddingsFromCosineHits,
330
330
  normalizeConnectorScope,
331
331
  runSeedGraduationPass
332
- } from "./chunk-JPTPS4OB.js";
332
+ } from "./chunk-VPXIKBPX.js";
333
333
  import {
334
334
  compileCorrectionRule,
335
335
  correctionsFilePath,
@@ -367,14 +367,14 @@ import {
367
367
  } from "./chunk-QW27DOHG.js";
368
368
  import {
369
369
  MeetingsInputError
370
- } from "./chunk-DPR2WTN3.js";
370
+ } from "./chunk-WGTR573G.js";
371
371
  import {
372
372
  WearablesInputError,
373
373
  describeErrorForOperator
374
374
  } from "./chunk-V7IZKJI3.js";
375
375
  import {
376
376
  recordDreamsPhaseRun
377
- } from "./chunk-EQWEIIKQ.js";
377
+ } from "./chunk-PQM3B54K.js";
378
378
  import {
379
379
  foldQueueWaitTiming,
380
380
  recordRecallTiming
@@ -385,7 +385,7 @@ import {
385
385
  } from "./chunk-YYEOR4XN.js";
386
386
  import {
387
387
  NamespaceCatalog
388
- } from "./chunk-L5DAHSEZ.js";
388
+ } from "./chunk-GWVNGDJW.js";
389
389
  import {
390
390
  RecallResultFormatter,
391
391
  SessionContextCoordinator,
@@ -394,7 +394,7 @@ import {
394
394
  detectPassiveCorrections,
395
395
  renderSessionExperiencePreview,
396
396
  scoreSessionExperienceForPrompt
397
- } from "./chunk-ZV65I6ME.js";
397
+ } from "./chunk-XLBFX63V.js";
398
398
  import {
399
399
  importCapsule
400
400
  } from "./chunk-V4MB5ONM.js";
@@ -404,7 +404,7 @@ import {
404
404
  import {
405
405
  listTrustZoneRecords,
406
406
  searchTrustZoneRecords
407
- } from "./chunk-ROBHL3GL.js";
407
+ } from "./chunk-JWX2Q6HS.js";
408
408
  import {
409
409
  applyTrustScoreStage,
410
410
  buildTrustSignalsForRerank,
@@ -427,7 +427,7 @@ import {
427
427
  import {
428
428
  objectiveStateStoreOverrideForNamespace,
429
429
  searchObjectiveStateSnapshots
430
- } from "./chunk-HM7RHKS4.js";
430
+ } from "./chunk-4RNBLLZR.js";
431
431
  import {
432
432
  filterRecallCandidates,
433
433
  isGenericRecallExcludedPath,
@@ -437,10 +437,10 @@ import {
437
437
  } from "./chunk-FT4UQYOV.js";
438
438
  import {
439
439
  searchHarmonicRetrieval
440
- } from "./chunk-ZJVMUBYF.js";
440
+ } from "./chunk-NHUX6GXA.js";
441
441
  import {
442
442
  ProfilingCollector
443
- } from "./chunk-BLVHDY2U.js";
443
+ } from "./chunk-DOWACHYO.js";
444
444
  import {
445
445
  ModelRegistry
446
446
  } from "./chunk-5MA7ZLPD.js";
@@ -460,10 +460,10 @@ import {
460
460
  } from "./chunk-NVKO5YKP.js";
461
461
  import {
462
462
  NamespaceStorageRouter
463
- } from "./chunk-FUFAXVBA.js";
463
+ } from "./chunk-RI2KCQHP.js";
464
464
  import {
465
465
  pruneOrphanCueAnchors
466
- } from "./chunk-BMWN7B3Y.js";
466
+ } from "./chunk-LXATZLSC.js";
467
467
  import {
468
468
  GraphIndex
469
469
  } from "./chunk-4IYIGN53.js";
@@ -472,7 +472,7 @@ import {
472
472
  } from "./chunk-GKCXTSFF.js";
473
473
  import {
474
474
  buildChainFollowupGenerator
475
- } from "./chunk-WVADKFWV.js";
475
+ } from "./chunk-VNZMZPAC.js";
476
476
  import {
477
477
  ExtractionDeadlineError,
478
478
  ExtractionRunCoordinator,
@@ -551,7 +551,7 @@ import {
551
551
  } from "./chunk-QDW3E4RD.js";
552
552
  import {
553
553
  searchCausalTrajectories
554
- } from "./chunk-S2I7DL5Q.js";
554
+ } from "./chunk-C2RW36YR.js";
555
555
  import {
556
556
  QmdResultResolver,
557
557
  StorageManager,
@@ -570,7 +570,7 @@ import {
570
570
  reconstructFusionInputs,
571
571
  selfDeps,
572
572
  serializeFusionDay
573
- } from "./chunk-PAZ35RJ4.js";
573
+ } from "./chunk-4SCZZ3U7.js";
574
574
  import {
575
575
  bodyIsEscaped,
576
576
  decodeTranscriptBody,
@@ -587,12 +587,12 @@ import {
587
587
  import {
588
588
  NamespaceSearchRouter,
589
589
  namespaceCollectionName
590
- } from "./chunk-N4C7QKOG.js";
590
+ } from "./chunk-MWWAQXZ6.js";
591
591
  import {
592
592
  createConversationIndexRuntime,
593
593
  createSearchBackend,
594
594
  isSearchBackendEnabled
595
- } from "./chunk-O2IPAX26.js";
595
+ } from "./chunk-RTTPBBAN.js";
596
596
  import {
597
597
  NoopSearchBackend
598
598
  } from "./chunk-CYEPCZN5.js";
@@ -848,7 +848,7 @@ import {
848
848
  listJsonFilesStrict,
849
849
  withJsonStoreMutationLock,
850
850
  writeJsonFileAtomic
851
- } from "./chunk-B6O2YLUR.js";
851
+ } from "./chunk-2Z5DIDQD.js";
852
852
  import {
853
853
  isPathInsideStorageRoot,
854
854
  resolveSafeStoragePath
@@ -17380,7 +17380,7 @@ var OrchestratorInitCoordinator = class {
17380
17380
  if (signal.aborted || !this.isCurrentStartupEpoch(epoch)) return;
17381
17381
  if (lifecycleCaps.lifecyclePolicy && resolveQmdCapabilities(this.deps.config).qmdTierMigration) {
17382
17382
  try {
17383
- const { runFirstStartMigration } = await import("./first-start-migration-6A5BJPDW.js");
17383
+ const { runFirstStartMigration } = await import("./first-start-migration-QVD22WWS.js");
17384
17384
  if (signal.aborted || !this.isCurrentStartupEpoch(epoch)) return;
17385
17385
  const result = await runFirstStartMigration({
17386
17386
  storage: this.deps.storage,
@@ -31096,4 +31096,4 @@ export {
31096
31096
  qmdStartupCollectionChecksWithTimeout,
31097
31097
  Orchestrator
31098
31098
  };
31099
- //# sourceMappingURL=chunk-J7JWFZHI.js.map
31099
+ //# sourceMappingURL=chunk-22RM2ZUJ.js.map
@@ -59,6 +59,9 @@ import {
59
59
  import {
60
60
  parseFlexibleIsoTimestamp
61
61
  } from "./chunk-P7FMDTKL.js";
62
+ import {
63
+ isMacOsReplicationJunkBasename
64
+ } from "./chunk-QUIRIG2P.js";
62
65
 
63
66
  // src/offline-sync.ts
64
67
  import { randomUUID } from "crypto";
@@ -400,6 +403,7 @@ function shouldExcludeRelPath(relPosix, includeTranscripts) {
400
403
  if (parts.some((part) => part === SYNC_INTERNAL_DIR)) return true;
401
404
  if (!includeTranscripts && parts[0] === "transcripts") return true;
402
405
  const basename = parts[parts.length - 1] ?? "";
406
+ if (parts.some((part) => isMacOsReplicationJunkBasename(part))) return true;
403
407
  if (isCanonicalRuntimeStatePath(parts) && basename.includes(".tmp-")) return true;
404
408
  if (EXCLUDED_FILE_NAMES.has(basename)) return true;
405
409
  if (EXCLUDED_FILE_PREFIXES.some((prefix) => basename.startsWith(prefix))) return true;
@@ -415,6 +419,7 @@ function shouldIgnoreIncomingRuntimePath(relPosix) {
415
419
  if (isInternalRemnicStatePath(relPosix)) return true;
416
420
  const parts = relPosix.split("/");
417
421
  const basename = parts[parts.length - 1] ?? "";
422
+ if (parts.some((part) => isMacOsReplicationJunkBasename(part))) return true;
418
423
  return isCanonicalRuntimeStatePath(parts) && basename.includes(".tmp-");
419
424
  }
420
425
  function filterBaseFilesForMode(files, includeTranscripts) {
@@ -1787,4 +1792,4 @@ export {
1787
1792
  normalizeOfflineSyncState,
1788
1793
  fileStatesFromSnapshot
1789
1794
  };
1790
- //# sourceMappingURL=chunk-63B2IZYE.js.map
1795
+ //# sourceMappingURL=chunk-23ZQPP2G.js.map