@remnic/core 9.69.74 → 9.69.76

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 (293) hide show
  1. package/dist/access-admin-ops-surface.js +35 -36
  2. package/dist/access-authorization-probe.js +36 -37
  3. package/dist/access-boundary.js +35 -36
  4. package/dist/access-cli.js +94 -94
  5. package/dist/access-extraction-force-flush.js +35 -36
  6. package/dist/access-http-briefing.js +36 -37
  7. package/dist/access-http-query.js +37 -38
  8. package/dist/access-http.js +55 -56
  9. package/dist/access-identity-continuity-surface.js +35 -36
  10. package/dist/access-lcm-surface.js +35 -36
  11. package/dist/access-mcp.js +46 -47
  12. package/dist/access-namespace-preflight.js +35 -36
  13. package/dist/access-observe-write-category.js +7 -7
  14. package/dist/access-observe-write-surface.js +35 -36
  15. package/dist/access-offline-manifest.js +3 -3
  16. package/dist/access-operations-batch.js +37 -38
  17. package/dist/access-operations.js +44 -45
  18. package/dist/access-recall-concurrency.js +35 -36
  19. package/dist/access-recall-diagnostics.js +2 -2
  20. package/dist/access-recall-response.js +35 -36
  21. package/dist/access-recall-surface.js +35 -36
  22. package/dist/access-schema.js +4 -4
  23. package/dist/access-service.js +35 -36
  24. package/dist/access-surface-catalog.js +37 -38
  25. package/dist/access-surface-catalog.js.map +1 -1
  26. package/dist/active-recall.js +9 -8
  27. package/dist/active-recall.js.map +1 -1
  28. package/dist/{auto-sync-QJNIKZHV.js → auto-sync-WEUDMXUW.js} +4 -4
  29. package/dist/briefing.js +8 -7
  30. package/dist/buffer.js +4 -4
  31. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  32. package/dist/causal-consolidation.js +9 -8
  33. package/dist/causal-consolidation.js.map +1 -1
  34. package/dist/{chunk-SYTPPMCM.js → chunk-252U6XYX.js} +2 -2
  35. package/dist/{chunk-IXLHREAB.js → chunk-2MLWQMXH.js} +2 -2
  36. package/dist/{chunk-ZL3Q4OWJ.js → chunk-34R75BVF.js} +2 -2
  37. package/dist/{chunk-3SBDUMPW.js → chunk-364F6EMG.js} +2 -2
  38. package/dist/{chunk-ZMV67JXV.js → chunk-4GPI3GVE.js} +4 -4
  39. package/dist/{chunk-V6ULW25E.js → chunk-4MONIKIY.js} +2 -2
  40. package/dist/{chunk-SIV2ENTD.js → chunk-5D6IMOW6.js} +30 -30
  41. package/dist/{chunk-BRJNNP7R.js → chunk-5ELXQQY7.js} +2 -2
  42. package/dist/{chunk-ZUT4FK5W.js → chunk-5Z574AVZ.js} +2 -2
  43. package/dist/{chunk-NS2SFWKC.js → chunk-6FJCKMSJ.js} +3 -3
  44. package/dist/{chunk-PDY7C73D.js → chunk-6OACG7JV.js} +2 -2
  45. package/dist/{chunk-QOL6OTIK.js → chunk-6OR3AQHP.js} +2 -2
  46. package/dist/{chunk-AG5QWIU7.js → chunk-6RBUAPQT.js} +19 -25
  47. package/dist/chunk-6RBUAPQT.js.map +1 -0
  48. package/dist/{chunk-WQC54W25.js → chunk-6VQFPA3J.js} +2 -2
  49. package/dist/{chunk-GM2UUMWJ.js → chunk-74C5FI4S.js} +5 -5
  50. package/dist/{chunk-A7AI3WDN.js → chunk-AV5K5QH4.js} +4 -4
  51. package/dist/{chunk-BMTR244T.js → chunk-BFDBLAVG.js} +2 -2
  52. package/dist/{chunk-IGEZE6QB.js → chunk-BMYZTZ5D.js} +4 -4
  53. package/dist/{chunk-7JFQI6DQ.js → chunk-BOUFVFV2.js} +2 -2
  54. package/dist/{chunk-CGO3A7SR.js → chunk-BRBB62TS.js} +2 -2
  55. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  56. package/dist/{chunk-GZBNEZIU.js → chunk-DBYAY6UW.js} +3 -3
  57. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  58. package/dist/{chunk-U3NBO4IX.js → chunk-FAT6HY7N.js} +119 -37
  59. package/dist/chunk-FAT6HY7N.js.map +1 -0
  60. package/dist/{chunk-ML64HXAN.js → chunk-FCVPZIHF.js} +2 -2
  61. package/dist/{chunk-B5EZWPSM.js → chunk-FUWW7ED4.js} +2 -2
  62. package/dist/{chunk-HXRZRYHQ.js → chunk-GN7YTM5I.js} +2 -2
  63. package/dist/{chunk-XDOXR3U6.js → chunk-HC4RWJR3.js} +2 -2
  64. package/dist/{chunk-HA5V67N4.js → chunk-HKPGEFIT.js} +2 -2
  65. package/dist/{chunk-MB3HMRXM.js → chunk-I6PZTU3Q.js} +2 -2
  66. package/dist/{chunk-KSJP3AWY.js → chunk-IGJL6JOD.js} +2 -2
  67. package/dist/{chunk-KK6TS7ED.js → chunk-IV2CY3RE.js} +3 -3
  68. package/dist/{chunk-ZIJ5FAI4.js → chunk-J3NN2Q4Z.js} +5 -5
  69. package/dist/{chunk-2JJVJMN6.js → chunk-JBHCTDYF.js} +2 -2
  70. package/dist/{chunk-D4SPMHEW.js → chunk-JLPNONPH.js} +2 -2
  71. package/dist/{chunk-BFUYPEJB.js → chunk-JOAR32R6.js} +2 -2
  72. package/dist/{chunk-FJZUIM5G.js → chunk-JU5MAF2L.js} +2 -2
  73. package/dist/{chunk-AEGQ5PJ7.js → chunk-JX6USXZR.js} +2 -2
  74. package/dist/{chunk-VEBYLZQQ.js → chunk-KN6CIN7I.js} +2 -2
  75. package/dist/{chunk-UJX4I26O.js → chunk-KOXUUJE3.js} +2 -2
  76. package/dist/{chunk-5UBH37SL.js → chunk-LI76ESJL.js} +4 -4
  77. package/dist/chunk-LJLGH2DE.js +65 -0
  78. package/dist/chunk-LJLGH2DE.js.map +1 -0
  79. package/dist/{chunk-B2PGHXTP.js → chunk-LTS2XIU3.js} +2 -2
  80. package/dist/{chunk-A7GQBJP5.js → chunk-LVFI5LG7.js} +7 -7
  81. package/dist/{chunk-WZGSSLYI.js → chunk-MKGIW5W6.js} +2 -2
  82. package/dist/{chunk-5LWVTSF7.js → chunk-MOQPEFLN.js} +4 -4
  83. package/dist/{chunk-4ETSHAIZ.js → chunk-N25RPRSI.js} +8 -8
  84. package/dist/{chunk-5W62ZVC6.js → chunk-N6TUO3O6.js} +2 -2
  85. package/dist/{chunk-2IH2WNM6.js → chunk-NC7OAEYY.js} +3 -3
  86. package/dist/{chunk-GXHRNONR.js → chunk-NQBD3R24.js} +2 -2
  87. package/dist/{chunk-S52VKUUW.js → chunk-NRPLDEFR.js} +2 -2
  88. package/dist/{chunk-VSBY5HAI.js → chunk-OH6AMNSA.js} +2 -2
  89. package/dist/{chunk-NVPE6AJ3.js → chunk-OIKX22FU.js} +1 -1
  90. package/dist/{chunk-T3XDF5RO.js → chunk-OJMAM4RO.js} +2 -2
  91. package/dist/{chunk-NKIK4VFP.js → chunk-OMYCECTS.js} +2 -2
  92. package/dist/{chunk-UHQ5UPAQ.js → chunk-OOWUOWXK.js} +2 -2
  93. package/dist/{chunk-RBAG3VUT.js → chunk-P2FJ2KYJ.js} +17 -17
  94. package/dist/{chunk-F5O6WEDO.js → chunk-PWF4JXKD.js} +1 -1
  95. package/dist/chunk-PWF4JXKD.js.map +1 -0
  96. package/dist/{chunk-A5HBAR5Y.js → chunk-RQIETS2K.js} +2 -2
  97. package/dist/{chunk-RWQXTR35.js → chunk-SFDZ66MD.js} +2 -2
  98. package/dist/{chunk-YR6A6ZK7.js → chunk-SSUDD72S.js} +2 -2
  99. package/dist/{chunk-5TS5QOZS.js → chunk-TWUMZCGA.js} +6 -6
  100. package/dist/{chunk-Y4IQFWGD.js → chunk-TYR4D4GH.js} +2 -2
  101. package/dist/{chunk-VE456O3R.js → chunk-UHKME3I7.js} +2 -2
  102. package/dist/{chunk-IPLYGWQF.js → chunk-VDX2J7OX.js} +6 -6
  103. package/dist/{chunk-542IROS3.js → chunk-VKWMW32Y.js} +2 -2
  104. package/dist/{chunk-YF3JERFZ.js → chunk-VL4X7ZHC.js} +2 -2
  105. package/dist/{chunk-ZHXSOMYH.js → chunk-VVX5PZFS.js} +2 -2
  106. package/dist/{chunk-GLX4SU4W.js → chunk-W5VYWOU3.js} +2 -2
  107. package/dist/{chunk-FRD5N3CS.js → chunk-WZ7M2QRP.js} +2 -2
  108. package/dist/{chunk-OMU54WOM.js → chunk-X2PBZOYZ.js} +2 -2
  109. package/dist/{chunk-HVWLZ7ZQ.js → chunk-XC4MDMQE.js} +4 -4
  110. package/dist/{chunk-JLNJ7AGH.js → chunk-XIA4CN3T.js} +7 -7
  111. package/dist/{chunk-JTGL6UX7.js → chunk-XLLRMUMH.js} +8 -7
  112. package/dist/chunk-XLLRMUMH.js.map +1 -0
  113. package/dist/{chunk-SUD76OMV.js → chunk-XNTIX4LA.js} +97 -50
  114. package/dist/chunk-XNTIX4LA.js.map +1 -0
  115. package/dist/{chunk-QNUK4SUE.js → chunk-XQSAPG34.js} +2 -2
  116. package/dist/{chunk-QXDZYPBL.js → chunk-Y37KZVUM.js} +2 -2
  117. package/dist/{chunk-NNPJWVGN.js → chunk-YNNXM6FN.js} +38 -38
  118. package/dist/{chunk-SB4ZWVKI.js → chunk-YPWOZ6ME.js} +3 -5
  119. package/dist/{chunk-SB4ZWVKI.js.map → chunk-YPWOZ6ME.js.map} +1 -1
  120. package/dist/{chunk-47AONXWB.js → chunk-YYI5DZAQ.js} +2 -2
  121. package/dist/{chunk-HZZIH5SW.js → chunk-YZENVZWY.js} +2 -2
  122. package/dist/cli.js +74 -75
  123. package/dist/coding/export-okf-codegraph.js +8 -7
  124. package/dist/coding/export-okf-codegraph.js.map +1 -1
  125. package/dist/compounding/engine.js +8 -7
  126. package/dist/config.d.ts.map +1 -1
  127. package/dist/config.js +9 -8
  128. package/dist/connectors/codex-materialize-runner.js +8 -7
  129. package/dist/connectors/index.js +8 -7
  130. package/dist/convergence-refresh.js +10 -10
  131. package/dist/corpus-watermark.js +10 -9
  132. package/dist/deep-recall-http-glue.js +5 -5
  133. package/dist/directory-sidecars.d.ts +3 -0
  134. package/dist/directory-sidecars.d.ts.map +1 -1
  135. package/dist/directory-sidecars.js +7 -4
  136. package/dist/entity-retrieval.js +8 -7
  137. package/dist/external-wiki-access.js +36 -37
  138. package/dist/extraction.js +12 -12
  139. package/dist/harmonic-retrieval.js +1 -1
  140. package/dist/index.js +102 -102
  141. package/dist/lcm/engine.js +3 -3
  142. package/dist/lcm/index.js +8 -8
  143. package/dist/location/index.js +11 -11
  144. package/dist/maintenance/memory-governance.js +8 -7
  145. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +8 -8
  146. package/dist/maintenance/rebuild-memory-projection.js +9 -9
  147. package/dist/memory-browse-operations.js +36 -37
  148. package/dist/memory-browse.js +3 -4
  149. package/dist/namespaces/migrate.js +9 -8
  150. package/dist/namespaces/search.js +3 -3
  151. package/dist/namespaces/storage.js +8 -7
  152. package/dist/offline-sync-impression-drain.js +2 -2
  153. package/dist/operator-doctor-corpus.js +11 -10
  154. package/dist/operator-toolkit.js +18 -17
  155. package/dist/orchestration/maintenance.js +17 -17
  156. package/dist/orchestration/recall-entry.d.ts.map +1 -1
  157. package/dist/orchestration/recall-search-pipeline.d.ts.map +1 -1
  158. package/dist/orchestrator.d.ts.map +1 -1
  159. package/dist/orchestrator.js +94 -94
  160. package/dist/recall-explain-renderer.js +3 -3
  161. package/dist/recall-navigate-access.js +2 -2
  162. package/dist/recall-navigate-disclosure.js +2 -2
  163. package/dist/recall-navigate.js +2 -2
  164. package/dist/recall-navigation-operations.js +36 -37
  165. package/dist/recall-navigation.js +35 -36
  166. package/dist/recall-state-view-admission.js +3 -4
  167. package/dist/recall-state.js +2 -2
  168. package/dist/recall-why-service.js +3 -4
  169. package/dist/recall-xray-cli.js +4 -4
  170. package/dist/recall-xray-renderer.js +3 -3
  171. package/dist/recall-xray.js +2 -2
  172. package/dist/resume-bundles.js +10 -9
  173. package/dist/search/factory.js +2 -2
  174. package/dist/search/index.js +4 -4
  175. package/dist/semantic-consolidation.js +9 -8
  176. package/dist/semantic-rule-promotion.js +8 -7
  177. package/dist/semantic-rule-verifier.js +8 -7
  178. package/dist/source-agent-qualifier.js +11 -11
  179. package/dist/standing-memory-recall.d.ts +22 -0
  180. package/dist/standing-memory-recall.d.ts.map +1 -0
  181. package/dist/standing-memory-recall.js +16 -0
  182. package/dist/standing-memory-recall.js.map +1 -0
  183. package/dist/standup/build.js +8 -7
  184. package/dist/storage.d.ts +1 -19
  185. package/dist/storage.d.ts.map +1 -1
  186. package/dist/storage.js +7 -6
  187. package/dist/support-passport/index.js +38 -39
  188. package/dist/transfer/autodetect.js +1 -1
  189. package/dist/transfer/backup.js +2 -2
  190. package/dist/transfer/capsule-export.js +3 -3
  191. package/dist/transfer/capsule-import.js +2 -2
  192. package/dist/transfer/export-okf.js +9 -8
  193. package/dist/types.d.ts +3 -3
  194. package/dist/types.d.ts.map +1 -1
  195. package/dist/types.js +1 -1
  196. package/dist/verified-recall.js +8 -7
  197. package/dist/who-knows-cli.js +9 -8
  198. package/dist/who-knows.js +8 -7
  199. package/package.json +2 -2
  200. package/src/config.ts +2 -3
  201. package/src/directory-sidecars-config.test.ts +34 -0
  202. package/src/directory-sidecars.ts +27 -6
  203. package/src/orchestration/recall-entry.ts +54 -13
  204. package/src/orchestration/recall-search-pipeline.ts +4 -6
  205. package/src/orchestrator.ts +8 -0
  206. package/src/standing-memory-block.test.ts +4 -3
  207. package/src/standing-memory-recall.test.ts +30 -0
  208. package/src/standing-memory-recall.ts +87 -0
  209. package/src/storage.ts +13 -22
  210. package/src/types.ts +3 -3
  211. package/dist/chunk-AG5QWIU7.js.map +0 -1
  212. package/dist/chunk-F5O6WEDO.js.map +0 -1
  213. package/dist/chunk-JTGL6UX7.js.map +0 -1
  214. package/dist/chunk-PCEYGOSL.js +0 -66
  215. package/dist/chunk-PCEYGOSL.js.map +0 -1
  216. package/dist/chunk-SUD76OMV.js.map +0 -1
  217. package/dist/chunk-U3NBO4IX.js.map +0 -1
  218. /package/dist/{auto-sync-QJNIKZHV.js.map → auto-sync-WEUDMXUW.js.map} +0 -0
  219. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  220. /package/dist/{chunk-SYTPPMCM.js.map → chunk-252U6XYX.js.map} +0 -0
  221. /package/dist/{chunk-IXLHREAB.js.map → chunk-2MLWQMXH.js.map} +0 -0
  222. /package/dist/{chunk-ZL3Q4OWJ.js.map → chunk-34R75BVF.js.map} +0 -0
  223. /package/dist/{chunk-3SBDUMPW.js.map → chunk-364F6EMG.js.map} +0 -0
  224. /package/dist/{chunk-ZMV67JXV.js.map → chunk-4GPI3GVE.js.map} +0 -0
  225. /package/dist/{chunk-V6ULW25E.js.map → chunk-4MONIKIY.js.map} +0 -0
  226. /package/dist/{chunk-SIV2ENTD.js.map → chunk-5D6IMOW6.js.map} +0 -0
  227. /package/dist/{chunk-BRJNNP7R.js.map → chunk-5ELXQQY7.js.map} +0 -0
  228. /package/dist/{chunk-ZUT4FK5W.js.map → chunk-5Z574AVZ.js.map} +0 -0
  229. /package/dist/{chunk-NS2SFWKC.js.map → chunk-6FJCKMSJ.js.map} +0 -0
  230. /package/dist/{chunk-PDY7C73D.js.map → chunk-6OACG7JV.js.map} +0 -0
  231. /package/dist/{chunk-QOL6OTIK.js.map → chunk-6OR3AQHP.js.map} +0 -0
  232. /package/dist/{chunk-WQC54W25.js.map → chunk-6VQFPA3J.js.map} +0 -0
  233. /package/dist/{chunk-GM2UUMWJ.js.map → chunk-74C5FI4S.js.map} +0 -0
  234. /package/dist/{chunk-A7AI3WDN.js.map → chunk-AV5K5QH4.js.map} +0 -0
  235. /package/dist/{chunk-BMTR244T.js.map → chunk-BFDBLAVG.js.map} +0 -0
  236. /package/dist/{chunk-IGEZE6QB.js.map → chunk-BMYZTZ5D.js.map} +0 -0
  237. /package/dist/{chunk-7JFQI6DQ.js.map → chunk-BOUFVFV2.js.map} +0 -0
  238. /package/dist/{chunk-CGO3A7SR.js.map → chunk-BRBB62TS.js.map} +0 -0
  239. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  240. /package/dist/{chunk-GZBNEZIU.js.map → chunk-DBYAY6UW.js.map} +0 -0
  241. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  242. /package/dist/{chunk-ML64HXAN.js.map → chunk-FCVPZIHF.js.map} +0 -0
  243. /package/dist/{chunk-B5EZWPSM.js.map → chunk-FUWW7ED4.js.map} +0 -0
  244. /package/dist/{chunk-HXRZRYHQ.js.map → chunk-GN7YTM5I.js.map} +0 -0
  245. /package/dist/{chunk-XDOXR3U6.js.map → chunk-HC4RWJR3.js.map} +0 -0
  246. /package/dist/{chunk-HA5V67N4.js.map → chunk-HKPGEFIT.js.map} +0 -0
  247. /package/dist/{chunk-MB3HMRXM.js.map → chunk-I6PZTU3Q.js.map} +0 -0
  248. /package/dist/{chunk-KSJP3AWY.js.map → chunk-IGJL6JOD.js.map} +0 -0
  249. /package/dist/{chunk-KK6TS7ED.js.map → chunk-IV2CY3RE.js.map} +0 -0
  250. /package/dist/{chunk-ZIJ5FAI4.js.map → chunk-J3NN2Q4Z.js.map} +0 -0
  251. /package/dist/{chunk-2JJVJMN6.js.map → chunk-JBHCTDYF.js.map} +0 -0
  252. /package/dist/{chunk-D4SPMHEW.js.map → chunk-JLPNONPH.js.map} +0 -0
  253. /package/dist/{chunk-BFUYPEJB.js.map → chunk-JOAR32R6.js.map} +0 -0
  254. /package/dist/{chunk-FJZUIM5G.js.map → chunk-JU5MAF2L.js.map} +0 -0
  255. /package/dist/{chunk-AEGQ5PJ7.js.map → chunk-JX6USXZR.js.map} +0 -0
  256. /package/dist/{chunk-VEBYLZQQ.js.map → chunk-KN6CIN7I.js.map} +0 -0
  257. /package/dist/{chunk-UJX4I26O.js.map → chunk-KOXUUJE3.js.map} +0 -0
  258. /package/dist/{chunk-5UBH37SL.js.map → chunk-LI76ESJL.js.map} +0 -0
  259. /package/dist/{chunk-B2PGHXTP.js.map → chunk-LTS2XIU3.js.map} +0 -0
  260. /package/dist/{chunk-A7GQBJP5.js.map → chunk-LVFI5LG7.js.map} +0 -0
  261. /package/dist/{chunk-WZGSSLYI.js.map → chunk-MKGIW5W6.js.map} +0 -0
  262. /package/dist/{chunk-5LWVTSF7.js.map → chunk-MOQPEFLN.js.map} +0 -0
  263. /package/dist/{chunk-4ETSHAIZ.js.map → chunk-N25RPRSI.js.map} +0 -0
  264. /package/dist/{chunk-5W62ZVC6.js.map → chunk-N6TUO3O6.js.map} +0 -0
  265. /package/dist/{chunk-2IH2WNM6.js.map → chunk-NC7OAEYY.js.map} +0 -0
  266. /package/dist/{chunk-GXHRNONR.js.map → chunk-NQBD3R24.js.map} +0 -0
  267. /package/dist/{chunk-S52VKUUW.js.map → chunk-NRPLDEFR.js.map} +0 -0
  268. /package/dist/{chunk-VSBY5HAI.js.map → chunk-OH6AMNSA.js.map} +0 -0
  269. /package/dist/{chunk-NVPE6AJ3.js.map → chunk-OIKX22FU.js.map} +0 -0
  270. /package/dist/{chunk-T3XDF5RO.js.map → chunk-OJMAM4RO.js.map} +0 -0
  271. /package/dist/{chunk-NKIK4VFP.js.map → chunk-OMYCECTS.js.map} +0 -0
  272. /package/dist/{chunk-UHQ5UPAQ.js.map → chunk-OOWUOWXK.js.map} +0 -0
  273. /package/dist/{chunk-RBAG3VUT.js.map → chunk-P2FJ2KYJ.js.map} +0 -0
  274. /package/dist/{chunk-A5HBAR5Y.js.map → chunk-RQIETS2K.js.map} +0 -0
  275. /package/dist/{chunk-RWQXTR35.js.map → chunk-SFDZ66MD.js.map} +0 -0
  276. /package/dist/{chunk-YR6A6ZK7.js.map → chunk-SSUDD72S.js.map} +0 -0
  277. /package/dist/{chunk-5TS5QOZS.js.map → chunk-TWUMZCGA.js.map} +0 -0
  278. /package/dist/{chunk-Y4IQFWGD.js.map → chunk-TYR4D4GH.js.map} +0 -0
  279. /package/dist/{chunk-VE456O3R.js.map → chunk-UHKME3I7.js.map} +0 -0
  280. /package/dist/{chunk-IPLYGWQF.js.map → chunk-VDX2J7OX.js.map} +0 -0
  281. /package/dist/{chunk-542IROS3.js.map → chunk-VKWMW32Y.js.map} +0 -0
  282. /package/dist/{chunk-YF3JERFZ.js.map → chunk-VL4X7ZHC.js.map} +0 -0
  283. /package/dist/{chunk-ZHXSOMYH.js.map → chunk-VVX5PZFS.js.map} +0 -0
  284. /package/dist/{chunk-GLX4SU4W.js.map → chunk-W5VYWOU3.js.map} +0 -0
  285. /package/dist/{chunk-FRD5N3CS.js.map → chunk-WZ7M2QRP.js.map} +0 -0
  286. /package/dist/{chunk-OMU54WOM.js.map → chunk-X2PBZOYZ.js.map} +0 -0
  287. /package/dist/{chunk-HVWLZ7ZQ.js.map → chunk-XC4MDMQE.js.map} +0 -0
  288. /package/dist/{chunk-JLNJ7AGH.js.map → chunk-XIA4CN3T.js.map} +0 -0
  289. /package/dist/{chunk-QNUK4SUE.js.map → chunk-XQSAPG34.js.map} +0 -0
  290. /package/dist/{chunk-QXDZYPBL.js.map → chunk-Y37KZVUM.js.map} +0 -0
  291. /package/dist/{chunk-NNPJWVGN.js.map → chunk-YNNXM6FN.js.map} +0 -0
  292. /package/dist/{chunk-47AONXWB.js.map → chunk-YYI5DZAQ.js.map} +0 -0
  293. /package/dist/{chunk-HZZIH5SW.js.map → chunk-YZENVZWY.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,SAAS,kBAAkB;AAO3B,OAAO,UAAU;AA0CjB,IAAM,yBAAyB,oBAAI,IAAI,CAAC,QAAQ,aAAa,YAAY,CAAC;AAY1E,eAAe,oBACb,WACA,0BACmC;AACnC,QAAM,OAAO,gCAAgC,WAAW,wBAAwB;AAChF,QAAM,kBAAkB,KAAK,KAAK,MAAM,cAAc;AAEtD,QAAM,QAAQ,MAAM,cAAc,eAAe,EAAE,MAAM,MAAM,CAAC,CAAa;AAC7E,QAAM,UAAoC,CAAC;AAE3C,aAAW,YAAY,OAAO;AAC5B,QAAI;AACF,YAAM,MAAM,MAAM,aAAa,QAAQ;AACvC,UAAI,SAAS,GAAG,KAAK,OAAO,IAAI,iBAAiB,UAAU;AACzD,gBAAQ,KAAK,GAAwC;AAAA,MACvD;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAQA,SAAS,oBACP,cACA,YACA,WAAmB,KACX;AAER,QAAM,YAAY,oBAAI,IAAsC;AAC5D,aAAW,KAAK,cAAc;AAC5B,UAAM,OAAO,UAAU,IAAI,EAAE,UAAU,KAAK,CAAC;AAC7C,SAAK,KAAK,CAAC;AACX,cAAU,IAAI,EAAE,YAAY,IAAI;AAAA,EAClC;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,2BAA2B,aAAa,MAAM,WAAW,UAAU,IAAI,YAAY;AAC9F,QAAM,KAAK,EAAE;AAGb,aAAW,CAAC,YAAY,YAAY,KAAK,WAAW;AAClD,UAAM,KAAK,gBAAgB,UAAU,EAAE;AACvC,eAAW,KAAK,aAAa,MAAM,GAAG,CAAC,GAAG;AACxC,YAAM,UAAU,EAAE,gBAAgB,YAAY,MAAM,EAAE,gBAAgB,YAAY,MAAM;AACxF,YAAM,KAAK,IAAI,OAAO,WAAW,EAAE,IAAI,EAAE;AACzC,YAAM,KAAK,eAAe,EAAE,aAAa,EAAE;AAC3C,YAAM,KAAK,gBAAgB,EAAE,cAAc,EAAE;AAC7C,UAAI,EAAE,gBAAiB,OAAM,KAAK,kBAAkB,EAAE,eAAe,EAAE;AACvE,UAAI,EAAE,YAAY,OAAQ,OAAM,KAAK,iBAAiB,EAAE,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,IACjF;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,QAAM,YAAY,OAAO,KAAK,WAAW,KAAK,EAAE;AAChD,MAAI,YAAY,GAAG;AACjB,UAAM,KAAK,mCAAmC,SAAS,eAAe;AACtE,UAAM,KAAK,EAAE;AAEb,UAAM,gBAAgB,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;AAC1E,UAAM,QAAQ,oBAAI,IAAY;AAE9B,eAAW,CAAC,QAAQ,IAAI,KAAK,OAAO,QAAQ,WAAW,KAAK,GAAG;AAC7D,UAAI,MAAM,QAAQ,GAAI;AACtB,YAAM,OAAO,cAAc,IAAI,KAAK,gBAAgB;AACpD,YAAM,KAAK,cAAc,IAAI,KAAK,cAAc;AAChD,UAAI,CAAC,QAAQ,CAAC,GAAI;AAElB,YAAM,KAAK,GAAG,KAAK,QAAQ,MAAM,KAAK,IAAI,MAAM,KAAK,UAAU,aAAQ,GAAG,IAAI,MAAM,GAAG,UAAU,GAAG;AACpG,YAAM,IAAI,MAAM;AAAA,IAClB;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,SAAS,MAAM,KAAK,IAAI;AAC9B,SAAO,OAAO,SAAS,WAAW,OAAO,MAAM,GAAG,QAAQ,IAAI,kBAAkB;AAClF;AAIA,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwB7B,eAAe,mBACb,SACA,KACA,UAAsE,CAAC,GACtC;AACjC,QAAM,WAAW,MAAM,IAAI;AAAA,IACzB;AAAA,MACE,EAAE,MAAM,UAAU,SAAS,qBAAqB;AAAA,MAChD,EAAE,MAAM,QAAQ,SAAS,QAAQ;AAAA,IACnC;AAAA,IACA,EAAE,aAAa,KAAK,WAAW,KAAM,SAAS,QAAQ,SAAS,YAAY,QAAQ,WAAW;AAAA,EAChG;AAEA,MAAI,CAAC,UAAU,SAAS;AACtB,WAAO,EAAE,OAAO,CAAC,GAAG,aAAa,CAAC,EAAE;AAAA,EACtC;AAEA,MAAI;AAEF,QAAI,UAAU,SAAS,QAAQ,KAAK;AACpC,UAAM,aAAa,QAAQ,MAAM,uCAAuC;AACxE,QAAI,WAAY,WAAU,WAAW,CAAC;AAEtC,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAM,WAAsB,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,QAAQ,CAAC;AAC1E,UAAM,iBAA4B,MAAM,QAAQ,OAAO,WAAW,IAAI,OAAO,cAAc,CAAC;AAC5F,WAAO;AAAA,MACL,OAAO,SACJ,IAAI,YAAY,EAChB,OAAO,CAAC,SAA0D,CAAC,CAAC,IAAI;AAAA,MAC3E,aAAa,eACV,IAAI,kBAAkB,EACtB,OAAO,CAAC,SAAgE,CAAC,CAAC,IAAI;AAAA,IACnF;AAAA,EACF,QAAQ;AACN,QAAI,KAAK,kDAAkD;AAC3D,WAAO,EAAE,OAAO,CAAC,GAAG,aAAa,CAAC,EAAE;AAAA,EACtC;AACF;AAIA,SAAS,gBAAgB,SAAyB;AAChD,QAAM,SAAS,WAAW,QAAQ,EAC/B,OAAO,mBAAmB,OAAO,EAAE,EACnC,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AACd,SAAO,kBAAkB,MAAM;AACjC;AAEA,SAAS,gBAAgB,OAAoC;AAC3D,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACjE,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACvC;AAEA,SAAS,cAAc,OAA0B;AAC/C,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,YAAY,KAAK,KAAK,EAAE,SAAS,CAAC;AAClG;AAEA,SAAS,aAAa,KAAmE;AACvF,MAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,EAAG,QAAO;AAClE,QAAM,IAAI;AACV,QAAM,UAAU,OAAO,EAAE,YAAY,WAAW,EAAE,QAAQ,KAAK,IAAI;AACnE,QAAM,WAAW,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW;AAC/D,QAAM,aAAa,gBAAgB,EAAE,UAAU;AAC/C,MAAI,QAAQ,UAAU,KAAK,CAAC,uBAAuB,IAAI,QAAQ,KAAK,eAAe,QAAW;AAC5F,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,cAAc,EAAE,QAAQ;AAAA,EACpC;AACF;AAEA,SAAS,mBAAmB,KAAyE;AACnG,MAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,EAAG,QAAO;AAClE,QAAM,IAAI;AACV,QAAM,YAAY,OAAO,EAAE,cAAc,WAAW,EAAE,UAAU,KAAK,IAAI;AACzE,QAAM,aAAa,gBAAgB,EAAE,UAAU;AAC/C,MAAI,UAAU,UAAU,KAAK,eAAe,OAAW,QAAO;AAC9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,cAAc,EAAE,QAAQ;AAAA,EACpC;AACF;AAEA,SAAS,sBAAsB,QAA0D;AACvF,QAAM,aAAuC,CAAC;AAE9C,aAAW,QAAQ,OAAO,OAAO;AAC/B,UAAM,WACJ,KAAK,aAAa,eAAe,KAAK,aAAa,eAC/C,KAAK,WACL;AACN,eAAW,KAAK;AAAA,MACd,IAAI,gBAAgB,KAAK,OAAO;AAAA,MAChC,YAAY;AAAA,MACZ,SAAS,KAAK,QAAQ,MAAM,GAAG,EAAE;AAAA,MACjC;AAAA,MACA,SAAS,KAAK;AAAA,MACd,OAAO,KAAK,IAAI,GAAG,KAAK,cAAc,GAAG;AAAA,MACzC,WAAW;AAAA,MACX,SAAS;AAAA,MACT,aAAa,KAAK,YAAY,CAAC,GAAG,MAAM,GAAG,CAAC;AAAA,MAC5C,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,aAAW,cAAc,OAAO,aAAa;AAC3C,eAAW,KAAK;AAAA,MACd,IAAI,gBAAgB,WAAW,SAAS;AAAA,MACxC,YAAY;AAAA,MACZ,SAAS,WAAW,UAAU,MAAM,GAAG,EAAE;AAAA,MACzC,UAAU;AAAA,MACV,SAAS,WAAW;AAAA,MACpB,OAAO,KAAK,IAAI,GAAG,WAAW,cAAc,GAAG;AAAA,MAC/C,WAAW;AAAA,MACX,SAAS;AAAA,MACT,aAAa,WAAW,YAAY,CAAC,GAAG,MAAM,GAAG,CAAC;AAAA,MAClD,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,OAAe,UAA0B;AACzE,SAAO,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,IAAI;AACnE;AAEA,SAAS,0BAA0B,OAAuB;AACxD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAClD,SAAO,KAAK,IAAI,GAAG,KAAK;AAC1B;AAEA,SAAS,uBAAuB,YAA4C;AAC1E,MAAI,WAAW,gBAAgB,UAAW,QAAO;AACjD,MAAI,WAAW,gBAAgB,UAAW,QAAO;AACjD,SAAO;AACT;AAEA,SAAS,oBAAoB,cAAgD;AAC3E,MAAI,aAAa,WAAW,EAAG,QAAO;AACtC,QAAM,QAAQ,aAAa,OAAO,CAAC,KAAK,eAAe,MAAM,uBAAuB,UAAU,GAAG,CAAC;AAClG,SAAO,QAAQ,aAAa;AAC9B;AAEA,SAAS,yBACP,cACA,QACS;AACT,QAAM,gBAAgB,yBAAyB,OAAO,eAAe,CAAC;AACtE,MAAI,aAAa,SAAS,cAAe,QAAO;AAEhD,QAAM,cAAc,yBAAyB,OAAO,aAAa,CAAC;AAClE,QAAM,eAAe,IAAI,IAAI,aAAa,IAAI,CAAC,eAAe,WAAW,UAAU,CAAC,EAAE;AACtF,MAAI,eAAe,YAAa,QAAO;AAEvC,QAAM,mBAAmB,0BAA0B,OAAO,gBAAgB;AAC1E,MAAI,mBAAmB,KAAK,oBAAoB,YAAY,IAAI,kBAAkB;AAChF,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAQA,eAAsB,gCAAgC,SAUhB;AACpC,MAAI;AACF,UAAM,eAAe,MAAM,oBAAoB,QAAQ,WAAW,QAAQ,wBAAwB;AAClG,QAAI,CAAC,yBAAyB,cAAc,QAAQ,MAAM,EAAG,QAAO,CAAC;AAErE,UAAM,YAAY,iBAAiB,QAAQ,WAAW,QAAQ,wBAAwB;AACtF,UAAM,aAAa,MAAM,eAAe,SAAS;AAGjD,QAAI,UAAU,oBAAoB,cAAc,UAAU;AAG1D,QAAI,QAAQ,cAAc;AACxB,YAAM,WAAW,MAAM,qCAAqC,QAAQ,YAAY;AAChF,UAAI,SAAS,SAAS,GAAG;AACvB,mBAAW,SAAS;AAAA,MACtB;AAAA,IACF;AAGA,UAAM,MAAM,QAAQ,aAAa,IAAI;AAAA,MACnC,QAAQ;AAAA,MACR,QAAQ,eACJ,oCAAoC,QAAQ,cAAc;AAAA,QACxD,cAAc,QAAQ,gBAAgB,QAAQ,aAAa;AAAA,MAC7D,CAAC,IACD,EAAE,cAAc,QAAQ,aAAa;AAAA,IAC3C;AACA,UAAM,aAAa,EAAE,SAAS,QAAQ,gBAAgB,YAAY,QAAQ,WAAW;AACrF,QAAI,CAAC,IAAI,YAAY,UAAU,GAAG;AAChC,UAAI,MAAM,0DAAqD;AAC/D,aAAO,CAAC;AAAA,IACV;AAGA,UAAM,SAAS,MAAM,mBAAmB,SAAS,KAAK,UAAU;AAChE,UAAM,aAAa,sBAAsB,MAAM;AAE/C,QAAI,MAAM,oCAAoC,WAAW,MAAM,gBAAgB,OAAO,YAAY,MAAM,gBAAgB;AACxH,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,KAAK,2CAA2C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAC5G,WAAO,CAAC;AAAA,EACV;AACF;AAMA,eAAsB,kCAAkC,SAQ7B;AACzB,MAAI;AACF,UAAM,eAAe,MAAM,oBAAoB,QAAQ,WAAW,QAAQ,wBAAwB;AAClG,QAAI,aAAa,UAAU,QAAQ,mBAAmB,GAAI,QAAO;AAEjE,UAAM,YAAY,iBAAiB,QAAQ,WAAW,QAAQ,wBAAwB;AACtF,UAAM,aAAa,MAAM,eAAe,SAAS;AACjD,UAAM,UAAU,oBAAoB,cAAc,UAAU;AAE5D,UAAM,MAAM,IAAI,kBAAkB,QAAQ,eAAe;AAAA,MACvD,cAAc,QAAQ;AAAA,IACxB,CAAC;AACD,UAAM,aAAa,EAAE,SAAS,QAAQ,gBAAgB,YAAY,QAAQ,WAAW;AACrF,QAAI,CAAC,IAAI,YAAY,UAAU,EAAG,QAAO;AAEzC,UAAM,SAAS,MAAM,mBAAmB,SAAS,KAAK,UAAU;AAChE,QAAI,OAAO,YAAY,WAAW,KAAK,OAAO,MAAM,WAAW,EAAG,QAAO;AAEzE,UAAM,QAAkB,CAAC,uDAAuD,EAAE;AAElF,eAAW,QAAQ,OAAO,aAAa;AACrC,YAAM,KAAK,KAAK,KAAK,SAAS,EAAE;AAAA,IAClC;AAEA,eAAW,QAAQ,OAAO,OAAO;AAC/B,YAAM,KAAK,KAAK,KAAK,OAAO,EAAE;AAAA,IAChC;AAEA,UAAM,KAAK,EAAE;AACb,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB,SAAS,OAAO;AACd,QAAI,KAAK,kDAAkD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AACnH,WAAO;AAAA,EACT;AACF;AAWA,eAAsB,oCAAoC,SAQpB;AAGpC,SAAO,gCAAgC,SAAS,OAAO;AACzD;","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,7 +1,7 @@
1
1
  import {
2
2
  SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS,
3
3
  SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES
4
- } from "./chunk-SIV2ENTD.js";
4
+ } from "./chunk-5D6IMOW6.js";
5
5
  import {
6
6
  SUPPORT_PASSPORT_SOURCE_MEMORY_ID_MAX_LENGTH
7
7
  } from "./chunk-PWPIERBM.js";
@@ -343,4 +343,4 @@ export {
343
343
  parseSupportPassportModelJob,
344
344
  SupportPassportModelBridge
345
345
  };
346
- //# sourceMappingURL=chunk-SYTPPMCM.js.map
346
+ //# sourceMappingURL=chunk-252U6XYX.js.map
@@ -3,7 +3,7 @@ import {
3
3
  headerConnector,
4
4
  renderExtractionConversation,
5
5
  resolveSourceConnector
6
- } from "./chunk-MB3HMRXM.js";
6
+ } from "./chunk-I6PZTU3Q.js";
7
7
  import {
8
8
  normalizeReasoningTrace
9
9
  } from "./chunk-54V4BZWP.js";
@@ -2437,4 +2437,4 @@ export {
2437
2437
  shouldEnableLocalExtractionThinking,
2438
2438
  ExtractionEngine
2439
2439
  };
2440
- //# sourceMappingURL=chunk-IXLHREAB.js.map
2440
+ //# sourceMappingURL=chunk-2MLWQMXH.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveCorpusNamespaceRoots
3
- } from "./chunk-QXDZYPBL.js";
3
+ } from "./chunk-Y37KZVUM.js";
4
4
  import {
5
5
  capabilityAllowsNamespace
6
6
  } from "./chunk-IG747LRN.js";
@@ -200,4 +200,4 @@ async function readAggregateExtractionWatermark(options) {
200
200
  export {
201
201
  readAggregateExtractionWatermark
202
202
  };
203
- //# sourceMappingURL=chunk-ZL3Q4OWJ.js.map
203
+ //# sourceMappingURL=chunk-34R75BVF.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-7T4TOGMS.js";
4
4
  import {
5
5
  defineOperation
6
- } from "./chunk-SIV2ENTD.js";
6
+ } from "./chunk-5D6IMOW6.js";
7
7
 
8
8
  // src/external-wiki-access.ts
9
9
  import { z } from "zod";
@@ -26,4 +26,4 @@ var externalWikiSearchOperation = defineOperation({
26
26
  export {
27
27
  externalWikiSearchOperation
28
28
  };
29
- //# sourceMappingURL=chunk-3SBDUMPW.js.map
29
+ //# sourceMappingURL=chunk-364F6EMG.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ MeilisearchBackend
3
+ } from "./chunk-T2YX56QI.js";
1
4
  import {
2
5
  NoopSearchBackend
3
6
  } from "./chunk-CYEPCZN5.js";
@@ -13,9 +16,6 @@ import {
13
16
  import {
14
17
  LanceDbBackend
15
18
  } from "./chunk-S7LWX2PQ.js";
16
- import {
17
- MeilisearchBackend
18
- } from "./chunk-T2YX56QI.js";
19
19
  import {
20
20
  createConversationIndexBackend
21
21
  } from "./chunk-TFA6HPOA.js";
@@ -179,4 +179,4 @@ export {
179
179
  createConversationSearchBackend,
180
180
  createConversationIndexRuntime
181
181
  };
182
- //# sourceMappingURL=chunk-ZMV67JXV.js.map
182
+ //# sourceMappingURL=chunk-4GPI3GVE.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-6JMQR72P.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-AG5QWIU7.js";
6
+ } from "./chunk-6RBUAPQT.js";
7
7
  import {
8
8
  normalizeEntityName
9
9
  } from "./chunk-YXZG5TVN.js";
@@ -957,4 +957,4 @@ export {
957
957
  resolveBriefingSaveDir,
958
958
  briefingFilename
959
959
  };
960
- //# sourceMappingURL=chunk-V6ULW25E.js.map
960
+ //# sourceMappingURL=chunk-4MONIKIY.js.map
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-MPC7TYTZ.js";
9
9
  import {
10
10
  importCapsule
11
- } from "./chunk-ZHXSOMYH.js";
11
+ } from "./chunk-VVX5PZFS.js";
12
12
  import {
13
13
  isSharedContextWriteInputError
14
14
  } from "./chunk-IFBSZGW3.js";
@@ -38,16 +38,10 @@ import {
38
38
  computeWhoKnows,
39
39
  loadWhoKnowsEntities,
40
40
  validateWhoKnowsInput
41
- } from "./chunk-47AONXWB.js";
41
+ } from "./chunk-YYI5DZAQ.js";
42
42
  import {
43
43
  WriteQuarantineStore
44
44
  } from "./chunk-PJSK6OJM.js";
45
- import {
46
- trustResultFor
47
- } from "./chunk-GNVZQ5JN.js";
48
- import {
49
- renderEpistemicHedge
50
- } from "./chunk-YN2UN7N3.js";
51
45
  import {
52
46
  getTrustZoneStoreStatus,
53
47
  isTrustZoneName,
@@ -57,6 +51,12 @@ import {
57
51
  seedTrustZoneDemoDataset,
58
52
  summarizeTrustZonePromotionReadiness
59
53
  } from "./chunk-ROBHL3GL.js";
54
+ import {
55
+ trustResultFor
56
+ } from "./chunk-GNVZQ5JN.js";
57
+ import {
58
+ renderEpistemicHedge
59
+ } from "./chunk-YN2UN7N3.js";
60
60
  import {
61
61
  summarizeHourlyStatus
62
62
  } from "./chunk-OAOBL6OY.js";
@@ -68,7 +68,7 @@ import {
68
68
  } from "./chunk-6ET2VII7.js";
69
69
  import {
70
70
  runRecallWhy
71
- } from "./chunk-WQC54W25.js";
71
+ } from "./chunk-6VQFPA3J.js";
72
72
  import {
73
73
  assertIdInNavigationWindow
74
74
  } from "./chunk-5KVT6G5U.js";
@@ -77,7 +77,7 @@ import {
77
77
  } from "./chunk-KIW3OOZE.js";
78
78
  import {
79
79
  planDisclosureStep
80
- } from "./chunk-D4SPMHEW.js";
80
+ } from "./chunk-JLPNONPH.js";
81
81
  import {
82
82
  DEFAULT_TRAVERSE_LIMIT,
83
83
  selectTraverseNeighbors
@@ -87,11 +87,11 @@ import {
87
87
  } from "./chunk-7O5EW7KX.js";
88
88
  import {
89
89
  toRecallExplainJson
90
- } from "./chunk-VEBYLZQQ.js";
90
+ } from "./chunk-KN6CIN7I.js";
91
91
  import {
92
92
  estimateRecallTokens,
93
93
  summarizeDisclosureTokens
94
- } from "./chunk-YR6A6ZK7.js";
94
+ } from "./chunk-SSUDD72S.js";
95
95
  import {
96
96
  takeNavigateBudget
97
97
  } from "./chunk-VYDGHJIN.js";
@@ -100,7 +100,7 @@ import {
100
100
  } from "./chunk-H7XKCNR6.js";
101
101
  import {
102
102
  readAggregateExtractionWatermark
103
- } from "./chunk-ZL3Q4OWJ.js";
103
+ } from "./chunk-34R75BVF.js";
104
104
  import {
105
105
  ReplicaDivergenceMonitor
106
106
  } from "./chunk-E6UNM67F.js";
@@ -115,16 +115,16 @@ import {
115
115
  } from "./chunk-UD7UNYRD.js";
116
116
  import {
117
117
  runMemoryBrowse
118
- } from "./chunk-ZUT4FK5W.js";
118
+ } from "./chunk-5Z574AVZ.js";
119
119
  import {
120
120
  isSearchExcludedPath
121
- } from "./chunk-SB4ZWVKI.js";
121
+ } from "./chunk-YPWOZ6ME.js";
122
122
  import {
123
123
  coerceIncludedMemories
124
124
  } from "./chunk-2YA5N2BY.js";
125
125
  import {
126
126
  readProjectedHarmonicGraph
127
- } from "./chunk-NVPE6AJ3.js";
127
+ } from "./chunk-OIKX22FU.js";
128
128
  import {
129
129
  buildGraphSnapshot
130
130
  } from "./chunk-CHDGJJV6.js";
@@ -179,18 +179,18 @@ import {
179
179
  listMemoryGovernanceRuns,
180
180
  readMemoryGovernanceRunArtifact,
181
181
  runMemoryGovernance
182
- } from "./chunk-BFUYPEJB.js";
182
+ } from "./chunk-JOAR32R6.js";
183
183
  import {
184
184
  CorpusWatermarkCache,
185
185
  computeServiceCorpusCensus
186
- } from "./chunk-QXDZYPBL.js";
186
+ } from "./chunk-Y37KZVUM.js";
187
187
  import {
188
188
  CrossNamespaceBudget,
189
189
  toBudgetWarning
190
190
  } from "./chunk-UFGFMWAD.js";
191
191
  import {
192
192
  ExtractionDeadlineError
193
- } from "./chunk-S52VKUUW.js";
193
+ } from "./chunk-NRPLDEFR.js";
194
194
  import {
195
195
  defaultCapsulesDir
196
196
  } from "./chunk-ZY2MNJR6.js";
@@ -200,7 +200,7 @@ import {
200
200
  enqueuePassiveCorrectionNotification,
201
201
  parseBriefingFocus,
202
202
  parseBriefingWindow
203
- } from "./chunk-V6ULW25E.js";
203
+ } from "./chunk-4MONIKIY.js";
204
204
  import {
205
205
  CORRECTION_TEXT_MAX,
206
206
  CorrectionContractError,
@@ -241,10 +241,10 @@ import {
241
241
  qmdCollectionPathParts,
242
242
  qmdResultPathCandidates,
243
243
  selfDeps
244
- } from "./chunk-AG5QWIU7.js";
244
+ } from "./chunk-6RBUAPQT.js";
245
245
  import {
246
246
  namespaceCollectionName
247
- } from "./chunk-NKIK4VFP.js";
247
+ } from "./chunk-OMYCECTS.js";
248
248
  import {
249
249
  normalizeProjectionPreview,
250
250
  normalizeProjectionTags
@@ -284,11 +284,11 @@ import {
284
284
  } from "./chunk-SYOIVK7K.js";
285
285
  import {
286
286
  splitCanonicalWriteRequest
287
- } from "./chunk-HZZIH5SW.js";
287
+ } from "./chunk-YZENVZWY.js";
288
288
  import {
289
289
  applyBriefingLocationContext,
290
290
  daySummaryAutoOptions
291
- } from "./chunk-IGEZE6QB.js";
291
+ } from "./chunk-BMYZTZ5D.js";
292
292
  import {
293
293
  STRUCTURED_ATTRIBUTE_LIMITS,
294
294
  buildAccessWriteRequestFingerprint,
@@ -306,19 +306,19 @@ import {
306
306
  } from "./chunk-VYCOJKSX.js";
307
307
  import {
308
308
  reapplyCategoryCoercion
309
- } from "./chunk-PDY7C73D.js";
309
+ } from "./chunk-6OACG7JV.js";
310
310
  import {
311
311
  exportCapsule
312
- } from "./chunk-IPLYGWQF.js";
312
+ } from "./chunk-VDX2J7OX.js";
313
313
  import {
314
314
  evaluateActionConfidence
315
315
  } from "./chunk-Z2YFLXHU.js";
316
316
  import {
317
317
  createOfflineSyncManifestStream
318
- } from "./chunk-CGO3A7SR.js";
318
+ } from "./chunk-BRBB62TS.js";
319
319
  import {
320
320
  offlineSyncStorageForSnapshot
321
- } from "./chunk-5LWVTSF7.js";
321
+ } from "./chunk-MOQPEFLN.js";
322
322
  import {
323
323
  resolveScopePlan,
324
324
  resolveScopedWritableNamespaceValue,
@@ -375,7 +375,7 @@ import {
375
375
  import {
376
376
  DEFAULT_RECALL_DISCLOSURE,
377
377
  isRecallDisclosure
378
- } from "./chunk-F5O6WEDO.js";
378
+ } from "./chunk-PWF4JXKD.js";
379
379
  import {
380
380
  extractJsonCandidates
381
381
  } from "./chunk-RGMVMVMF.js";
@@ -18532,4 +18532,4 @@ export {
18532
18532
  EngramAccessService,
18533
18533
  AccessAdminOpsSurface
18534
18534
  };
18535
- //# sourceMappingURL=chunk-SIV2ENTD.js.map
18535
+ //# sourceMappingURL=chunk-5D6IMOW6.js.map
@@ -2,7 +2,7 @@ import {
2
2
  WHO_KNOWS_DEFAULT_LIMIT,
3
3
  WHO_KNOWS_MAX_LIMIT,
4
4
  validateWhoKnowsInput
5
- } from "./chunk-47AONXWB.js";
5
+ } from "./chunk-YYI5DZAQ.js";
6
6
 
7
7
  // src/who-knows-cli.ts
8
8
  function extractWhoKnowsRawArgs(rest) {
@@ -74,4 +74,4 @@ export {
74
74
  renderWhoKnowsText,
75
75
  renderWhoKnows
76
76
  };
77
- //# sourceMappingURL=chunk-BRJNNP7R.js.map
77
+ //# sourceMappingURL=chunk-5ELXQQY7.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isGenericRecallExcludedPath
3
- } from "./chunk-SB4ZWVKI.js";
3
+ } from "./chunk-YPWOZ6ME.js";
4
4
  import {
5
5
  normalizeProjectionPreview
6
6
  } from "./chunk-SCU65EZI.js";
@@ -209,4 +209,4 @@ export {
209
209
  browsePatternMatches,
210
210
  runMemoryBrowse
211
211
  };
212
- //# sourceMappingURL=chunk-ZUT4FK5W.js.map
212
+ //# sourceMappingURL=chunk-5Z574AVZ.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  hasMemoryData
3
- } from "./chunk-RWQXTR35.js";
3
+ } from "./chunk-SFDZ66MD.js";
4
4
  import {
5
5
  resolveNamespaceStorageRoot
6
- } from "./chunk-QOL6OTIK.js";
6
+ } from "./chunk-6OR3AQHP.js";
7
7
  import {
8
8
  getConfiguredNamespaces
9
9
  } from "./chunk-OWYHHW67.js";
@@ -724,4 +724,4 @@ export {
724
724
  runNamespaceMaintenancePlan,
725
725
  runNamespaceMaintenanceBatchPlan
726
726
  };
727
- //# sourceMappingURL=chunk-NS2SFWKC.js.map
727
+ //# sourceMappingURL=chunk-6FJCKMSJ.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isValidCapsuleSince
3
- } from "./chunk-IPLYGWQF.js";
3
+ } from "./chunk-VDX2J7OX.js";
4
4
  import {
5
5
  CAPSULE_ID_PATTERN
6
6
  } from "./chunk-WEHSQBFR.js";
@@ -563,4 +563,4 @@ export {
563
563
  actionConfidenceRequestSchema,
564
564
  validateRequest
565
565
  };
566
- //# sourceMappingURL=chunk-PDY7C73D.js.map
566
+ //# sourceMappingURL=chunk-6OACG7JV.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-AG5QWIU7.js";
3
+ } from "./chunk-6RBUAPQT.js";
4
4
  import {
5
5
  keyring_exports,
6
6
  secureStoreDir
@@ -412,4 +412,4 @@ export {
412
412
  resolveNamespaceStorageRoot,
413
413
  NamespaceStorageRouter
414
414
  };
415
- //# sourceMappingURL=chunk-QOL6OTIK.js.map
415
+ //# sourceMappingURL=chunk-6OR3AQHP.js.map
@@ -17,7 +17,7 @@ import {
17
17
  } from "./chunk-46WM6JX2.js";
18
18
  import {
19
19
  normalizeQmdResultPath
20
- } from "./chunk-NKIK4VFP.js";
20
+ } from "./chunk-OMYCECTS.js";
21
21
  import {
22
22
  withholdToolScopedFromSharedNamespace
23
23
  } from "./chunk-S2V7RUCL.js";
@@ -73,9 +73,11 @@ import {
73
73
  import {
74
74
  OKF_QUESTION_TYPE,
75
75
  assertNotOkfReservedBasename,
76
+ isDirectorySidecarsEnabledForDir,
76
77
  okfTypeForEntityKind,
77
- okfTypeForMemory
78
- } from "./chunk-PCEYGOSL.js";
78
+ okfTypeForMemory,
79
+ refreshDirectorySidecarsAfterWrite
80
+ } from "./chunk-FAT6HY7N.js";
79
81
  import {
80
82
  normalizeProjectionPreview,
81
83
  normalizeProjectionTags
@@ -205,7 +207,7 @@ import {
205
207
  import {
206
208
  SPECULATIVE_TTL_DAYS,
207
209
  confidenceTier
208
- } from "./chunk-F5O6WEDO.js";
210
+ } from "./chunk-PWF4JXKD.js";
209
211
  import {
210
212
  isSupportPassportPrivateMemory
211
213
  } from "./chunk-PWPIERBM.js";
@@ -8729,25 +8731,7 @@ ${sanitized.text}
8729
8731
  log.debug(`wrote memory ${id} to ${filePath}`);
8730
8732
  return { id, tombstoneBlocked: tombstoneBlocked2, ...fm.blockedBy ? { blockedBy: fm.blockedBy } : {}, memory: { path: filePath, frontmatter: fm, content: sanitized.text } };
8731
8733
  }
8732
- /**
8733
- * Sealed-envelope write entry point (issue #1989 PR2).
8734
- *
8735
- * Byte-identity with `writeMemory` is BY DELEGATION: the envelope-owned
8736
- * fields are unpacked into the exact `writeMemory` arguments a legacy
8737
- * caller would have passed, so the persisted output is produced by the
8738
- * same code path. The composer's `persistedBody` was assembled with the
8739
- * same `assemblePersistedBody` helper `writeMemory` uses, so fingerprints
8740
- * derived from the envelope match the stored body (§13).
8741
- *
8742
- * Differences from a raw `writeMemory` call are REJECTIONS, not silent
8743
- * changes: the composer enforces tag/attribute caps, strict validAt, and
8744
- * plain-object attributes that the legacy path never validated.
8745
- *
8746
- * `envelope.ttl` maps to `expiresAt` verbatim; converting duration
8747
- * expressions (`"90d"`) to instants remains the access layer's job (PR3).
8748
- * `envelope.sourceReason` is access-layer metadata with no frontmatter
8749
- * field and is deliberately not persisted here.
8750
- */
8734
+ /** Sealed-envelope write entry point (issue #1989 PR2). */
8751
8735
  async writeSealedMemory(envelope, extras = {}) {
8752
8736
  if (!isSealedMemoryEnvelope(envelope)) {
8753
8737
  throw new Error(
@@ -8755,7 +8739,17 @@ ${sanitized.text}
8755
8739
  );
8756
8740
  }
8757
8741
  const { category, content, options } = sealedWriteToLegacyArgs(envelope, extras);
8758
- return this.writeMemory(category, content, options);
8742
+ const result = await this.writeMemory(category, content, options);
8743
+ try {
8744
+ await refreshDirectorySidecarsAfterWrite(
8745
+ this.dir,
8746
+ result.memory?.path ?? "",
8747
+ isDirectorySidecarsEnabledForDir(this.dir)
8748
+ );
8749
+ } catch (err) {
8750
+ log.warn(`directory sidecar refresh failed after write: ${err}`);
8751
+ }
8752
+ return result;
8759
8753
  }
8760
8754
  async hasFactContentHash(content) {
8761
8755
  const authoritative = await this.ensureFactHashIndexAuthoritative();
@@ -11348,4 +11342,4 @@ export {
11348
11342
  isValidBufferSurpriseEvent,
11349
11343
  StorageManager3 as StorageManager
11350
11344
  };
11351
- //# sourceMappingURL=chunk-AG5QWIU7.js.map
11345
+ //# sourceMappingURL=chunk-6RBUAPQT.js.map