@remnic/core 9.3.613 → 9.3.615

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 (386) hide show
  1. package/dist/access-cli.js +59 -58
  2. package/dist/access-cli.js.map +1 -1
  3. package/dist/access-http.d.ts +4 -2
  4. package/dist/access-http.js +23 -23
  5. package/dist/access-mcp.d.ts +9 -2
  6. package/dist/access-mcp.js +20 -20
  7. package/dist/access-schema.d.ts +26 -14
  8. package/dist/access-schema.js +3 -3
  9. package/dist/{access-service-D2J9dh_9.d.ts → access-service-CBNEKjzN.d.ts} +71 -6
  10. package/dist/access-service.d.ts +2 -2
  11. package/dist/access-service.js +17 -17
  12. package/dist/active-recall.js +20 -3
  13. package/dist/active-recall.js.map +1 -1
  14. package/dist/adapters/index.js +4 -4
  15. package/dist/adapters/registry.js +2 -2
  16. package/dist/behavior-learner.js +2 -3
  17. package/dist/behavior-learner.js.map +1 -1
  18. package/dist/bootstrap.d.ts +1 -1
  19. package/dist/briefing.js +3 -3
  20. package/dist/buffer.d.ts +1 -1
  21. package/dist/buffer.js +1 -1
  22. package/dist/calibration.d.ts +5 -2
  23. package/dist/calibration.js +7 -5
  24. package/dist/calibration.js.map +1 -1
  25. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  26. package/dist/causal-consolidation.d.ts +8 -2
  27. package/dist/causal-consolidation.js +13 -11
  28. package/dist/causal-consolidation.js.map +1 -1
  29. package/dist/{chunk-3BP57I6J.js → chunk-2F6NP3NT.js} +2 -1
  30. package/dist/{chunk-3BP57I6J.js.map → chunk-2F6NP3NT.js.map} +1 -1
  31. package/dist/{chunk-AU7Q3LSC.js → chunk-2QSZNTDO.js} +4 -4
  32. package/dist/{chunk-HSVJGWYS.js → chunk-2ROPI5OE.js} +2 -2
  33. package/dist/{chunk-C4SQJZAF.js → chunk-2SGJY2UY.js} +6 -3
  34. package/dist/chunk-2SGJY2UY.js.map +1 -0
  35. package/dist/{chunk-ZDTVJXIP.js → chunk-3MAONBX3.js} +13 -5
  36. package/dist/chunk-3MAONBX3.js.map +1 -0
  37. package/dist/{chunk-G3Z3QEF5.js → chunk-3PY7VHV7.js} +2 -2
  38. package/dist/chunk-3PY7VHV7.js.map +1 -0
  39. package/dist/{chunk-CF3ZF2YU.js → chunk-3QSU4NFF.js} +3 -3
  40. package/dist/{chunk-AJA46VX5.js → chunk-3T74IZB3.js} +11 -2
  41. package/dist/chunk-3T74IZB3.js.map +1 -0
  42. package/dist/{chunk-KVEVLBKC.js → chunk-4HFJQCJZ.js} +13 -8
  43. package/dist/chunk-4HFJQCJZ.js.map +1 -0
  44. package/dist/{chunk-KGK2QKWL.js → chunk-4R4KTDIE.js} +1 -1
  45. package/dist/chunk-4R4KTDIE.js.map +1 -0
  46. package/dist/{chunk-OI27U2HT.js → chunk-5BTCT236.js} +2 -2
  47. package/dist/{chunk-TH67Q46T.js → chunk-5OHHEORR.js} +64 -21
  48. package/dist/chunk-5OHHEORR.js.map +1 -0
  49. package/dist/{chunk-CO7ZO4TU.js → chunk-5VDJMYTF.js} +2 -2
  50. package/dist/{chunk-BFBF3XEF.js → chunk-6BDVBBBY.js} +33 -25
  51. package/dist/{chunk-BFBF3XEF.js.map → chunk-6BDVBBBY.js.map} +1 -1
  52. package/dist/{chunk-EAZGEEG2.js → chunk-6L46YAEZ.js} +45 -9
  53. package/dist/chunk-6L46YAEZ.js.map +1 -0
  54. package/dist/{chunk-YFS5OEKO.js → chunk-7MLB4NCL.js} +2 -2
  55. package/dist/{chunk-LZ3VEOU5.js → chunk-AL4RAJL5.js} +22 -5
  56. package/dist/chunk-AL4RAJL5.js.map +1 -0
  57. package/dist/{chunk-557IAFPD.js → chunk-APRRL26Q.js} +2 -2
  58. package/dist/{chunk-QDDHYAKV.js → chunk-AZDOWD2L.js} +2 -2
  59. package/dist/{chunk-MLT75J5S.js → chunk-B6SU7YSE.js} +3 -3
  60. package/dist/{chunk-FXKPZ3H6.js → chunk-BPSGLMQ4.js} +2 -2
  61. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  62. package/dist/{chunk-NOMEVTUD.js → chunk-C6C7XVKG.js} +5 -4
  63. package/dist/chunk-C6C7XVKG.js.map +1 -0
  64. package/dist/{chunk-XKIQZXUB.js → chunk-CI7RKSRE.js} +7 -1
  65. package/dist/chunk-CI7RKSRE.js.map +1 -0
  66. package/dist/{chunk-IK34DVAC.js → chunk-CIOMS6DI.js} +2 -2
  67. package/dist/{chunk-2I5JGH3M.js → chunk-CYEPCZN5.js} +2 -2
  68. package/dist/{chunk-2I5JGH3M.js.map → chunk-CYEPCZN5.js.map} +1 -1
  69. package/dist/{chunk-JHMFYY7L.js → chunk-DCGT4FPP.js} +13 -5
  70. package/dist/chunk-DCGT4FPP.js.map +1 -0
  71. package/dist/{chunk-7DZRO2DC.js → chunk-DEPRLVLK.js} +2 -2
  72. package/dist/{chunk-CSKLPDN6.js → chunk-DEVUWMME.js} +52 -19
  73. package/dist/chunk-DEVUWMME.js.map +1 -0
  74. package/dist/{chunk-DHGSZ3UD.js → chunk-DGNQRNLL.js} +2 -2
  75. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  76. package/dist/{chunk-HJNQQICM.js → chunk-EXUAP5LH.js} +108 -51
  77. package/dist/chunk-EXUAP5LH.js.map +1 -0
  78. package/dist/chunk-FAV25DUZ.js +12 -0
  79. package/dist/chunk-FAV25DUZ.js.map +1 -0
  80. package/dist/{chunk-ETUPBUHB.js → chunk-GDASG7NC.js} +2 -2
  81. package/dist/{chunk-L227SKTB.js → chunk-GDB4J2H3.js} +17 -1
  82. package/dist/chunk-GDB4J2H3.js.map +1 -0
  83. package/dist/{chunk-IP73YCZP.js → chunk-GLPBYIXN.js} +4 -2
  84. package/dist/chunk-GLPBYIXN.js.map +1 -0
  85. package/dist/{chunk-4HP7HIE3.js → chunk-HP5FMB6L.js} +2 -2
  86. package/dist/{chunk-EVZFIAPG.js → chunk-IBTZEBUD.js} +23 -10
  87. package/dist/chunk-IBTZEBUD.js.map +1 -0
  88. package/dist/{chunk-DOX2CG6Y.js → chunk-IEUU7O4F.js} +2 -2
  89. package/dist/{chunk-EUML3N6B.js → chunk-IMA6GU4Y.js} +3 -3
  90. package/dist/chunk-IMA6GU4Y.js.map +1 -0
  91. package/dist/{chunk-JNANKJLN.js → chunk-JOASJWQR.js} +2 -2
  92. package/dist/chunk-JOASJWQR.js.map +1 -0
  93. package/dist/{chunk-WSGF57U2.js → chunk-JQDZQ4TB.js} +2 -2
  94. package/dist/{chunk-HINSGUA7.js → chunk-KBL3JJR6.js} +9 -13
  95. package/dist/chunk-KBL3JJR6.js.map +1 -0
  96. package/dist/{chunk-IOTENEVL.js → chunk-KGLPJROV.js} +57 -50
  97. package/dist/chunk-KGLPJROV.js.map +1 -0
  98. package/dist/{chunk-W7L6HXUC.js → chunk-LXOM6IQU.js} +2 -2
  99. package/dist/{chunk-G6R5UD3Q.js → chunk-MGN7VHWQ.js} +42 -1
  100. package/dist/{chunk-G6R5UD3Q.js.map → chunk-MGN7VHWQ.js.map} +1 -1
  101. package/dist/{chunk-DLJ4IR6M.js → chunk-MHQC2WU2.js} +2 -2
  102. package/dist/chunk-MHQC2WU2.js.map +1 -0
  103. package/dist/{chunk-5RPTH6AU.js → chunk-NM5NQYJE.js} +20 -19
  104. package/dist/chunk-NM5NQYJE.js.map +1 -0
  105. package/dist/{chunk-6JGNHWCI.js → chunk-OBIRVF36.js} +3 -3
  106. package/dist/{chunk-CHCA44C3.js → chunk-ODPLEWB6.js} +3 -3
  107. package/dist/chunk-ODPLEWB6.js.map +1 -0
  108. package/dist/{chunk-HENLZHIT.js → chunk-OIF36KGD.js} +7 -4
  109. package/dist/chunk-OIF36KGD.js.map +1 -0
  110. package/dist/{chunk-GUPISBV2.js → chunk-PP2JH3GP.js} +2 -2
  111. package/dist/{chunk-OXJBNGBK.js → chunk-PSUB67YB.js} +2 -2
  112. package/dist/{chunk-UWY7GIVS.js → chunk-PYIFUBRK.js} +45 -13
  113. package/dist/chunk-PYIFUBRK.js.map +1 -0
  114. package/dist/{chunk-KIB7SDIJ.js → chunk-Q6YIJGXJ.js} +2 -2
  115. package/dist/{chunk-ZT3EGNLR.js → chunk-QPD426WT.js} +2 -2
  116. package/dist/{chunk-RLV3PQGH.js → chunk-QVO4YOB7.js} +6 -6
  117. package/dist/{chunk-GMAG2HS4.js → chunk-RG3LBSGH.js} +46 -9
  118. package/dist/chunk-RG3LBSGH.js.map +1 -0
  119. package/dist/{chunk-XSWKORGM.js → chunk-S53OYO3F.js} +3 -1
  120. package/dist/chunk-S53OYO3F.js.map +1 -0
  121. package/dist/{chunk-YCN4BVDK.js → chunk-SCPFRKIT.js} +4 -2
  122. package/dist/chunk-SCPFRKIT.js.map +1 -0
  123. package/dist/{chunk-NZPF2SYV.js → chunk-T7N6KQGS.js} +138 -5
  124. package/dist/chunk-T7N6KQGS.js.map +1 -0
  125. package/dist/{chunk-VJXSUAO7.js → chunk-TNOWU6RP.js} +13 -10
  126. package/dist/chunk-TNOWU6RP.js.map +1 -0
  127. package/dist/{chunk-PCI747N2.js → chunk-TZVQQTG4.js} +48 -19
  128. package/dist/chunk-TZVQQTG4.js.map +1 -0
  129. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  130. package/dist/{chunk-IK7DCC5H.js → chunk-VMGLYN42.js} +2 -2
  131. package/dist/{chunk-KM2A35EO.js → chunk-WB3LYXC5.js} +11 -7
  132. package/dist/chunk-WB3LYXC5.js.map +1 -0
  133. package/dist/{chunk-PPPZY2EU.js → chunk-WD2W4234.js} +9 -3
  134. package/dist/chunk-WD2W4234.js.map +1 -0
  135. package/dist/{chunk-NSKYFGDL.js → chunk-X4QQB7O6.js} +2 -2
  136. package/dist/{chunk-HPWVAEET.js → chunk-X6IRLNOO.js} +3 -7
  137. package/dist/chunk-X6IRLNOO.js.map +1 -0
  138. package/dist/{chunk-46GJIW5M.js → chunk-XAZOWLW4.js} +5 -5
  139. package/dist/{chunk-46GJIW5M.js.map → chunk-XAZOWLW4.js.map} +1 -1
  140. package/dist/{chunk-XPSVGJYA.js → chunk-YRMKDTKF.js} +12 -9
  141. package/dist/chunk-YRMKDTKF.js.map +1 -0
  142. package/dist/{chunk-6ZZP4EJF.js → chunk-ZJR7VG5L.js} +3 -3
  143. package/dist/{chunk-6ZZP4EJF.js.map → chunk-ZJR7VG5L.js.map} +1 -1
  144. package/dist/{chunk-2QANQKSQ.js → chunk-ZK32E74R.js} +156 -45
  145. package/dist/chunk-ZK32E74R.js.map +1 -0
  146. package/dist/{cli-OrfKXNU4.d.ts → cli-Cw729yLf.d.ts} +6 -2
  147. package/dist/cli.d.ts +3 -3
  148. package/dist/cli.js +61 -60
  149. package/dist/compounding/engine.js +3 -3
  150. package/dist/compounding/preference-consolidator.js +39 -11
  151. package/dist/compounding/preference-consolidator.js.map +1 -1
  152. package/dist/config.js +1 -1
  153. package/dist/connectors/codex-materialize-runner.js +3 -3
  154. package/dist/connectors/index.js +3 -3
  155. package/dist/consolidation-provenance-check.js +1 -1
  156. package/dist/contradiction/index.js +4 -4
  157. package/dist/conversation-index/backend.js +2 -2
  158. package/dist/conversation-index/indexer.js +1 -1
  159. package/dist/cross-namespace-budget.js +1 -1
  160. package/dist/enrichment/index.js +1 -1
  161. package/dist/entity-retrieval.js +3 -3
  162. package/dist/evals.js +1 -1
  163. package/dist/explicit-capture.d.ts +11 -1
  164. package/dist/explicit-capture.js +1 -1
  165. package/dist/extraction-judge.js +8 -1
  166. package/dist/extraction.js +2 -2
  167. package/dist/fallback-llm.d.ts +23 -6
  168. package/dist/fallback-llm.js +5 -3
  169. package/dist/{first-start-migration-GYJWIH36.js → first-start-migration-FF7YFGRP.js} +6 -6
  170. package/dist/index.d.ts +3 -3
  171. package/dist/index.js +95 -94
  172. package/dist/index.js.map +1 -1
  173. package/dist/lcm/archive.js +2 -2
  174. package/dist/lcm/engine.js +5 -5
  175. package/dist/lcm/index.js +7 -7
  176. package/dist/lcm/summarizer.js +3 -3
  177. package/dist/maintenance/memory-governance-cron.d.ts +6 -4
  178. package/dist/maintenance/memory-governance-cron.js +1 -1
  179. package/dist/maintenance/memory-governance.js +3 -3
  180. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  181. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  182. package/dist/mcp-memory-inspector-app.d.ts +2 -2
  183. package/dist/mcp-memory-inspector-app.js +1 -1
  184. package/dist/migrate/from-engram.js +1 -1
  185. package/dist/namespaces/migrate.js +16 -15
  186. package/dist/namespaces/search.js +12 -11
  187. package/dist/namespaces/storage.js +3 -3
  188. package/dist/network/webdav.d.ts +2 -0
  189. package/dist/network/webdav.js +1 -1
  190. package/dist/objective-state-writers.js +2 -2
  191. package/dist/operator-toolkit.d.ts +3 -1
  192. package/dist/operator-toolkit.js +21 -20
  193. package/dist/{orchestrator-DTRQG75J.d.ts → orchestrator-CqWOjfgl.d.ts} +46 -3
  194. package/dist/orchestrator.d.ts +1 -1
  195. package/dist/orchestrator.js +48 -45
  196. package/dist/patterns-cli.js +1 -1
  197. package/dist/qmd-recall-cache.d.ts +2 -0
  198. package/dist/qmd-recall-cache.js +1 -1
  199. package/dist/qmd.d.ts +37 -2
  200. package/dist/qmd.js +4 -1
  201. package/dist/recall-explain-renderer.js +3 -3
  202. package/dist/recall-planner-llm.d.ts +57 -0
  203. package/dist/recall-planner-llm.js +167 -0
  204. package/dist/recall-planner-llm.js.map +1 -0
  205. package/dist/recall-xray-cli.js +4 -4
  206. package/dist/recall-xray-renderer.js +3 -3
  207. package/dist/recall-xray.js +2 -2
  208. package/dist/resume-bundles.js +2 -2
  209. package/dist/retrieval-agents.js +2 -2
  210. package/dist/routing/store.js +1 -1
  211. package/dist/schemas.d.ts +22 -22
  212. package/dist/search/factory.js +11 -10
  213. package/dist/search/index.js +11 -10
  214. package/dist/search/lancedb-backend.d.ts +1 -1
  215. package/dist/search/lancedb-backend.js +3 -2
  216. package/dist/search/meilisearch-backend.d.ts +1 -1
  217. package/dist/search/meilisearch-backend.js +3 -2
  218. package/dist/search/noop-backend.d.ts +1 -1
  219. package/dist/search/noop-backend.js +1 -1
  220. package/dist/search/orama-backend.d.ts +1 -1
  221. package/dist/search/orama-backend.js +3 -2
  222. package/dist/search/port.d.ts +6 -1
  223. package/dist/search/port.js +7 -0
  224. package/dist/search/remote-backend.d.ts +1 -1
  225. package/dist/search/remote-backend.js +1 -1
  226. package/dist/semantic-consolidation.js +4 -4
  227. package/dist/semantic-rule-promotion.js +3 -3
  228. package/dist/semantic-rule-verifier.js +3 -3
  229. package/dist/session-observer-state.js +1 -1
  230. package/dist/storage.js +2 -2
  231. package/dist/summarizer.js +2 -2
  232. package/dist/temporal-index.js +1 -1
  233. package/dist/{tier-stats-SKML2OSF.js → tier-stats-3LYQ3VV5.js} +3 -3
  234. package/dist/transfer/backup.js +2 -2
  235. package/dist/transfer/capsule-export.js +2 -2
  236. package/dist/transfer/capsule-import.js +2 -2
  237. package/dist/transfer/export-sqlite.js +1 -1
  238. package/dist/transfer/types.d.ts +12 -12
  239. package/dist/types.d.ts +32 -0
  240. package/dist/types.js +1 -1
  241. package/dist/utility-learner.js +1 -1
  242. package/dist/utility-runtime.js +2 -2
  243. package/dist/verified-recall.js +3 -3
  244. package/dist/work/board.js +2 -2
  245. package/dist/work/storage.d.ts +2 -0
  246. package/dist/work/storage.js +1 -1
  247. package/package.json +1 -1
  248. package/src/access-http.ts +24 -10
  249. package/src/access-mcp.test.ts +160 -0
  250. package/src/access-mcp.ts +72 -7
  251. package/src/access-schema.ts +11 -0
  252. package/src/access-service-coding-write.test.ts +478 -0
  253. package/src/access-service.ts +237 -32
  254. package/src/active-recall.test.ts +40 -0
  255. package/src/active-recall.ts +19 -2
  256. package/src/behavior-learner.ts +5 -3
  257. package/src/buffer-session.test.ts +58 -0
  258. package/src/buffer-surprise-trigger.test.ts +4 -18
  259. package/src/buffer.ts +39 -11
  260. package/src/calibration.ts +10 -4
  261. package/src/causal-consolidation.test.ts +47 -2
  262. package/src/causal-consolidation.ts +13 -9
  263. package/src/cli.ts +19 -4
  264. package/src/compounding/engine.ts +2 -0
  265. package/src/compounding/preference-consolidator.test.ts +292 -0
  266. package/src/compounding/preference-consolidator.ts +55 -19
  267. package/src/config.test.ts +213 -0
  268. package/src/config.ts +175 -4
  269. package/src/connectors/codex-materialize-runner.ts +7 -4
  270. package/src/consolidation-provenance-check.ts +24 -5
  271. package/src/conversation-index/indexer.test.ts +22 -0
  272. package/src/conversation-index/indexer.ts +7 -3
  273. package/src/cross-namespace-budget.test.ts +44 -21
  274. package/src/cross-namespace-budget.ts +2 -2
  275. package/src/enrichment/pipeline.ts +11 -16
  276. package/src/evals.ts +1 -1
  277. package/src/explicit-capture.ts +19 -2
  278. package/src/extraction-judge-chain.test.ts +55 -0
  279. package/src/extraction-judge.ts +7 -9
  280. package/src/extraction.ts +16 -5
  281. package/src/fallback-llm.test.ts +600 -1
  282. package/src/fallback-llm.ts +91 -22
  283. package/src/maintenance/memory-governance-cron.ts +39 -29
  284. package/src/mcp-memory-inspector-app.ts +54 -12
  285. package/src/message-parts/index.ts +6 -0
  286. package/src/message-parts/message-parts.test.ts +30 -0
  287. package/src/migrate/from-engram.ts +19 -5
  288. package/src/namespaces/search.test.ts +15 -2
  289. package/src/namespaces/search.ts +1 -1
  290. package/src/network/webdav.ts +61 -21
  291. package/src/operator-toolkit.ts +6 -2
  292. package/src/orchestrator.ts +173 -20
  293. package/src/qmd-client.test.ts +85 -0
  294. package/src/qmd-recall-cache.test.ts +16 -0
  295. package/src/qmd-recall-cache.ts +7 -0
  296. package/src/qmd.test.ts +54 -0
  297. package/src/qmd.ts +119 -19
  298. package/src/recall-planner-llm.test.ts +224 -0
  299. package/src/recall-planner-llm.ts +289 -0
  300. package/src/routing/store.ts +4 -8
  301. package/src/search/factory.ts +3 -0
  302. package/src/search/lancedb-backend.ts +15 -3
  303. package/src/search/meilisearch-backend.ts +70 -7
  304. package/src/search/noop-backend.ts +5 -1
  305. package/src/search/orama-backend.ts +15 -3
  306. package/src/search/port.ts +15 -0
  307. package/src/search/remote-backend.ts +5 -1
  308. package/src/session-observer-state.ts +1 -1
  309. package/src/summarizer.ts +3 -3
  310. package/src/temporal-index.test.ts +18 -0
  311. package/src/temporal-index.ts +45 -0
  312. package/src/training-export/cli-date-validation.test.ts +36 -0
  313. package/src/training-export/date-parse.ts +21 -2
  314. package/src/transfer/export-sqlite.ts +3 -0
  315. package/src/types.ts +35 -0
  316. package/src/utility-learner.ts +1 -0
  317. package/src/work/storage.ts +23 -0
  318. package/dist/chunk-2QANQKSQ.js.map +0 -1
  319. package/dist/chunk-5RPTH6AU.js.map +0 -1
  320. package/dist/chunk-AJA46VX5.js.map +0 -1
  321. package/dist/chunk-C4SQJZAF.js.map +0 -1
  322. package/dist/chunk-CHCA44C3.js.map +0 -1
  323. package/dist/chunk-CSKLPDN6.js.map +0 -1
  324. package/dist/chunk-DLJ4IR6M.js.map +0 -1
  325. package/dist/chunk-EAZGEEG2.js.map +0 -1
  326. package/dist/chunk-EUML3N6B.js.map +0 -1
  327. package/dist/chunk-EVZFIAPG.js.map +0 -1
  328. package/dist/chunk-G3Z3QEF5.js.map +0 -1
  329. package/dist/chunk-GMAG2HS4.js.map +0 -1
  330. package/dist/chunk-HENLZHIT.js.map +0 -1
  331. package/dist/chunk-HINSGUA7.js.map +0 -1
  332. package/dist/chunk-HJNQQICM.js.map +0 -1
  333. package/dist/chunk-HPWVAEET.js.map +0 -1
  334. package/dist/chunk-IOTENEVL.js.map +0 -1
  335. package/dist/chunk-IP73YCZP.js.map +0 -1
  336. package/dist/chunk-JHMFYY7L.js.map +0 -1
  337. package/dist/chunk-JNANKJLN.js.map +0 -1
  338. package/dist/chunk-KGK2QKWL.js.map +0 -1
  339. package/dist/chunk-KM2A35EO.js.map +0 -1
  340. package/dist/chunk-KVEVLBKC.js.map +0 -1
  341. package/dist/chunk-L227SKTB.js.map +0 -1
  342. package/dist/chunk-LZ3VEOU5.js.map +0 -1
  343. package/dist/chunk-NOMEVTUD.js.map +0 -1
  344. package/dist/chunk-NZPF2SYV.js.map +0 -1
  345. package/dist/chunk-PCI747N2.js.map +0 -1
  346. package/dist/chunk-PPPZY2EU.js.map +0 -1
  347. package/dist/chunk-TH67Q46T.js.map +0 -1
  348. package/dist/chunk-UWY7GIVS.js.map +0 -1
  349. package/dist/chunk-VJXSUAO7.js.map +0 -1
  350. package/dist/chunk-XKIQZXUB.js.map +0 -1
  351. package/dist/chunk-XPSVGJYA.js.map +0 -1
  352. package/dist/chunk-XSWKORGM.js.map +0 -1
  353. package/dist/chunk-YCN4BVDK.js.map +0 -1
  354. package/dist/chunk-ZDTVJXIP.js.map +0 -1
  355. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  356. /package/dist/{chunk-AU7Q3LSC.js.map → chunk-2QSZNTDO.js.map} +0 -0
  357. /package/dist/{chunk-HSVJGWYS.js.map → chunk-2ROPI5OE.js.map} +0 -0
  358. /package/dist/{chunk-CF3ZF2YU.js.map → chunk-3QSU4NFF.js.map} +0 -0
  359. /package/dist/{chunk-OI27U2HT.js.map → chunk-5BTCT236.js.map} +0 -0
  360. /package/dist/{chunk-CO7ZO4TU.js.map → chunk-5VDJMYTF.js.map} +0 -0
  361. /package/dist/{chunk-YFS5OEKO.js.map → chunk-7MLB4NCL.js.map} +0 -0
  362. /package/dist/{chunk-557IAFPD.js.map → chunk-APRRL26Q.js.map} +0 -0
  363. /package/dist/{chunk-QDDHYAKV.js.map → chunk-AZDOWD2L.js.map} +0 -0
  364. /package/dist/{chunk-MLT75J5S.js.map → chunk-B6SU7YSE.js.map} +0 -0
  365. /package/dist/{chunk-FXKPZ3H6.js.map → chunk-BPSGLMQ4.js.map} +0 -0
  366. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  367. /package/dist/{chunk-IK34DVAC.js.map → chunk-CIOMS6DI.js.map} +0 -0
  368. /package/dist/{chunk-7DZRO2DC.js.map → chunk-DEPRLVLK.js.map} +0 -0
  369. /package/dist/{chunk-DHGSZ3UD.js.map → chunk-DGNQRNLL.js.map} +0 -0
  370. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  371. /package/dist/{chunk-ETUPBUHB.js.map → chunk-GDASG7NC.js.map} +0 -0
  372. /package/dist/{chunk-4HP7HIE3.js.map → chunk-HP5FMB6L.js.map} +0 -0
  373. /package/dist/{chunk-DOX2CG6Y.js.map → chunk-IEUU7O4F.js.map} +0 -0
  374. /package/dist/{chunk-WSGF57U2.js.map → chunk-JQDZQ4TB.js.map} +0 -0
  375. /package/dist/{chunk-W7L6HXUC.js.map → chunk-LXOM6IQU.js.map} +0 -0
  376. /package/dist/{chunk-6JGNHWCI.js.map → chunk-OBIRVF36.js.map} +0 -0
  377. /package/dist/{chunk-GUPISBV2.js.map → chunk-PP2JH3GP.js.map} +0 -0
  378. /package/dist/{chunk-OXJBNGBK.js.map → chunk-PSUB67YB.js.map} +0 -0
  379. /package/dist/{chunk-KIB7SDIJ.js.map → chunk-Q6YIJGXJ.js.map} +0 -0
  380. /package/dist/{chunk-ZT3EGNLR.js.map → chunk-QPD426WT.js.map} +0 -0
  381. /package/dist/{chunk-RLV3PQGH.js.map → chunk-QVO4YOB7.js.map} +0 -0
  382. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  383. /package/dist/{chunk-IK7DCC5H.js.map → chunk-VMGLYN42.js.map} +0 -0
  384. /package/dist/{chunk-NSKYFGDL.js.map → chunk-X4QQB7O6.js.map} +0 -0
  385. /package/dist/{first-start-migration-GYJWIH36.js.map → first-start-migration-FF7YFGRP.js.map} +0 -0
  386. /package/dist/{tier-stats-SKML2OSF.js.map → tier-stats-3LYQ3VV5.js.map} +0 -0
@@ -0,0 +1,12 @@
1
+ // src/search/port.ts
2
+ function resolveEnsureCollectionArgs(collectionOrExecution, execution) {
3
+ if (typeof collectionOrExecution === "string") {
4
+ return { collection: collectionOrExecution, execution };
5
+ }
6
+ return { collection: void 0, execution: collectionOrExecution ?? execution };
7
+ }
8
+
9
+ export {
10
+ resolveEnsureCollectionArgs
11
+ };
12
+ //# sourceMappingURL=chunk-FAV25DUZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/search/port.ts"],"sourcesContent":["import type { QmdSearchResult } from \"../types.js\";\n\n/** Alias so consumers don't need to reference \"Qmd\" in a backend-agnostic context. */\nexport type SearchResult = QmdSearchResult;\n\nexport interface SearchQueryOptions {\n intent?: string;\n explain?: boolean;\n candidateLimit?: number;\n rerank?: boolean;\n chunkStrategy?: \"auto\" | \"regex\";\n structuredSearches?: Array<{ type: \"lex\" | \"vec\" | \"hyde\"; query: string }>;\n}\n\nexport interface SearchExecutionOptions {\n signal?: AbortSignal;\n}\n\nexport function resolveEnsureCollectionArgs(\n collectionOrExecution?: string | SearchExecutionOptions,\n execution?: SearchExecutionOptions,\n): { collection?: string; execution?: SearchExecutionOptions } {\n if (typeof collectionOrExecution === \"string\") {\n return { collection: collectionOrExecution, execution };\n }\n return { collection: undefined, execution: collectionOrExecution ?? execution };\n}\n\n/**\n * Abstract search backend interface.\n *\n * Implementations:\n * - QmdClient (default, local hybrid BM25+vector+reranking)\n * - OramaBackend (embedded, pure JS, hybrid FTS+vector)\n * - LanceDbBackend (embedded, native Arrow bindings, RRF reranking)\n * - MeilisearchBackend (server-based SDK, hybrid search)\n * - RemoteSearchBackend (HTTP REST adapter)\n * - NoopSearchBackend (graceful degradation)\n *\n * See docs/writing-a-search-backend.md for the implementation guide.\n */\nexport interface SearchBackend {\n // ── Lifecycle ──\n probe(): Promise<boolean>;\n isAvailable(): boolean;\n debugStatus(): string;\n\n // ── Search ──\n search(\n query: string,\n collection?: string,\n maxResults?: number,\n options?: SearchQueryOptions,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]>;\n searchGlobal(query: string, maxResults?: number, execution?: SearchExecutionOptions): Promise<SearchResult[]>;\n bm25Search(\n query: string,\n collection?: string,\n maxResults?: number,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]>;\n vectorSearch(\n query: string,\n collection?: string,\n maxResults?: number,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]>;\n hybridSearch(\n query: string,\n collection?: string,\n maxResults?: number,\n execution?: SearchExecutionOptions,\n ): Promise<SearchResult[]>;\n\n // ── Maintenance ──\n update(execution?: SearchExecutionOptions): Promise<void>;\n updateCollection(collection: string, execution?: SearchExecutionOptions): Promise<void>;\n updateCollectionFromDir?(collection: string, memoryDir: string, execution?: SearchExecutionOptions): Promise<void>;\n /**\n * True when update() refreshes every indexed collection, not just this\n * backend's configured collection. Namespace routers use this to avoid\n * repeating the same expensive global update once per namespace.\n */\n updatesAllCollections?(): boolean;\n /**\n * Optional strict refresh used by callers that must know whether a collection\n * was actually refreshed before writing success markers. Ordinary update\n * calls remain fail-open for migration/maintenance resilience.\n */\n updateCollectionStrict?(collection: string, execution?: SearchExecutionOptions): Promise<void>;\n embed(): Promise<void>;\n embedCollection(collection: string): Promise<void>;\n\n // ── Collection management ──\n ensureCollection(\n memoryDir: string,\n execution?: SearchExecutionOptions,\n ): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\">;\n ensureCollection(\n memoryDir: string,\n collection?: string,\n execution?: SearchExecutionOptions,\n ): Promise<\"present\" | \"missing\" | \"unknown\" | \"skipped\">;\n}\n"],"mappings":";AAkBO,SAAS,4BACd,uBACA,WAC6D;AAC7D,MAAI,OAAO,0BAA0B,UAAU;AAC7C,WAAO,EAAE,YAAY,uBAAuB,UAAU;AAAA,EACxD;AACA,SAAO,EAAE,YAAY,QAAW,WAAW,yBAAyB,UAAU;AAChF;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  WORK_ID_PATTERN,
3
3
  WorkStorage
4
- } from "./chunk-L227SKTB.js";
4
+ } from "./chunk-GDB4J2H3.js";
5
5
 
6
6
  // src/work/board.ts
7
7
  var BOARD_STATUS_ORDER = [
@@ -266,4 +266,4 @@ export {
266
266
  exportWorkBoardMarkdown,
267
267
  importWorkBoardSnapshot
268
268
  };
269
- //# sourceMappingURL=chunk-ETUPBUHB.js.map
269
+ //# sourceMappingURL=chunk-GDASG7NC.js.map
@@ -14,6 +14,7 @@ var TASK_TRANSITIONS = {
14
14
  cancelled: /* @__PURE__ */ new Set()
15
15
  };
16
16
  var PROJECT_MUTATION_CHAINS = /* @__PURE__ */ new Map();
17
+ var TASK_MUTATION_CHAINS = /* @__PURE__ */ new Map();
17
18
  function serializeFrontmatter(values) {
18
19
  const lines = Object.entries(values).map(([k, v]) => `${k}: ${JSON.stringify(v)}`);
19
20
  return `---
@@ -154,6 +155,18 @@ ${project.description}
154
155
  PROJECT_MUTATION_CHAINS.set(mutationKey, cleanup);
155
156
  return run;
156
157
  }
158
+ async enqueueTaskMutation(taskId, op) {
159
+ const mutationKey = this.taskPath(taskId);
160
+ const previous = TASK_MUTATION_CHAINS.get(mutationKey) ?? Promise.resolve();
161
+ const run = previous.catch(() => void 0).then(op);
162
+ const cleanup = run.then(() => void 0, () => void 0).then(() => {
163
+ if (TASK_MUTATION_CHAINS.get(mutationKey) === cleanup) {
164
+ TASK_MUTATION_CHAINS.delete(mutationKey);
165
+ }
166
+ });
167
+ TASK_MUTATION_CHAINS.set(mutationKey, cleanup);
168
+ return run;
169
+ }
157
170
  parseTask(raw) {
158
171
  const parsed = parseFrontmatter(raw);
159
172
  if (!parsed) return null;
@@ -256,6 +269,9 @@ ${project.description}
256
269
  return out;
257
270
  }
258
271
  async updateTask(id, patch, now = /* @__PURE__ */ new Date(), options) {
272
+ return this.enqueueTaskMutation(id, async () => this.updateTaskUnlocked(id, patch, now, options));
273
+ }
274
+ async updateTaskUnlocked(id, patch, now = /* @__PURE__ */ new Date(), options) {
259
275
  const existing = await this.getTask(id);
260
276
  if (!existing) return null;
261
277
  const projectIdPatched = Object.prototype.hasOwnProperty.call(patch, "projectId");
@@ -450,4 +466,4 @@ export {
450
466
  WORK_ID_PATTERN,
451
467
  WorkStorage
452
468
  };
453
- //# sourceMappingURL=chunk-L227SKTB.js.map
469
+ //# sourceMappingURL=chunk-GDB4J2H3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/work/storage.ts"],"sourcesContent":["import path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport type {\n CreateWorkProjectInput,\n CreateWorkTaskInput,\n UpdateWorkProjectInput,\n UpdateWorkTaskInput,\n WorkProject,\n WorkProjectStatus,\n WorkTask,\n WorkTaskListFilter,\n WorkTaskStatus,\n} from \"./types.js\";\nimport { isErrnoCode } from \"../utils/errno.js\";\n\nconst TASK_TRANSITIONS: Record<WorkTaskStatus, Set<WorkTaskStatus>> = {\n todo: new Set([\"in_progress\", \"blocked\", \"cancelled\"]),\n in_progress: new Set([\"todo\", \"blocked\", \"done\", \"cancelled\"]),\n blocked: new Set([\"todo\", \"in_progress\", \"cancelled\"]),\n done: new Set(),\n cancelled: new Set(),\n};\n\nconst PROJECT_MUTATION_CHAINS = new Map<string, Promise<unknown>>();\nconst TASK_MUTATION_CHAINS = new Map<string, Promise<unknown>>();\n\nfunction serializeFrontmatter(values: object): string {\n const lines = Object.entries(values).map(([k, v]) => `${k}: ${JSON.stringify(v)}`);\n return `---\\n${lines.join(\"\\n\")}\\n---`;\n}\n\nfunction parseFrontmatter(raw: string): { data: Record<string, unknown>; body: string } | null {\n const match = raw.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) return null;\n const fm = match[1] ?? \"\";\n const body = match[2] ?? \"\";\n const data: Record<string, unknown> = {};\n for (const line of fm.split(\"\\n\")) {\n if (!line.trim()) continue;\n const idx = line.indexOf(\":\");\n if (idx <= 0) continue;\n const key = line.slice(0, idx).trim();\n const rawValue = line.slice(idx + 1).trim();\n try {\n data[key] = JSON.parse(rawValue);\n } catch {\n data[key] = rawValue;\n }\n }\n return { data, body };\n}\n\nfunction toSafeSlug(value: string): string {\n let slug = value.toLowerCase().trim().replace(/[^a-z0-9]+/g, \"-\");\n // Trim leading/trailing dashes without ReDoS-prone anchored quantifiers\n let start = 0;\n while (start < slug.length && slug[start] === \"-\") start++;\n let end = slug.length;\n while (end > start && slug[end - 1] === \"-\") end--;\n return slug.slice(start, end).slice(0, 80);\n}\n\nexport const WORK_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9-]{0,127}$/;\n\nfunction makeId(prefix: string, titleOrName: string, now: Date): string {\n const slug = toSafeSlug(titleOrName) || \"item\";\n const nonce = randomUUID().slice(0, 8);\n return `${prefix}-${now.getTime()}-${slug}-${nonce}`;\n}\n\nfunction assertValidWorkId(id: string, kind: \"task\" | \"project\"): void {\n if (!WORK_ID_PATTERN.test(id)) {\n throw new Error(`invalid ${kind} id: ${id}`);\n }\n}\n\nfunction ensureString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction ensureStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((entry) => typeof entry === \"string\");\n}\n\nfunction ensureNullableString(value: unknown): string | null {\n return typeof value === \"string\" ? value : null;\n}\n\nfunction ensureTaskStatus(value: unknown): WorkTaskStatus {\n if (value === \"todo\" || value === \"in_progress\" || value === \"blocked\" || value === \"done\" || value === \"cancelled\") {\n return value;\n }\n return \"todo\";\n}\n\nfunction ensureTaskPriority(value: unknown): WorkTask[\"priority\"] {\n if (value === \"low\" || value === \"medium\" || value === \"high\") return value;\n return \"medium\";\n}\n\nfunction ensureProjectStatus(value: unknown): WorkProjectStatus {\n if (value === \"active\" || value === \"on_hold\" || value === \"completed\" || value === \"archived\") return value;\n return \"active\";\n}\n\nexport class WorkStorage {\n private readonly tasksDir: string;\n private readonly projectsDir: string;\n\n constructor(private readonly memoryDir: string) {\n this.tasksDir = path.join(memoryDir, \"work\", \"tasks\");\n this.projectsDir = path.join(memoryDir, \"work\", \"projects\");\n }\n\n async ensureDirectories(): Promise<void> {\n await mkdir(this.tasksDir, { recursive: true });\n await mkdir(this.projectsDir, { recursive: true });\n }\n\n private taskPath(id: string): string {\n assertValidWorkId(id, \"task\");\n return path.join(this.tasksDir, `${id}.md`);\n }\n\n private projectPath(id: string): string {\n assertValidWorkId(id, \"project\");\n return path.join(this.projectsDir, `${id}.md`);\n }\n\n private serializeTask(task: WorkTask): string {\n return `${serializeFrontmatter(task)}\\n\\n${task.description}\\n`;\n }\n\n private serializeProject(project: WorkProject): string {\n return `${serializeFrontmatter(project)}\\n\\n${project.description}\\n`;\n }\n\n private async writeNewTask(task: WorkTask): Promise<void> {\n try {\n await writeFile(this.taskPath(task.id), this.serializeTask(task), { encoding: \"utf-8\", flag: \"wx\" });\n } catch (error) {\n if (isErrnoCode(error, \"EEXIST\")) {\n throw new Error(`task already exists: ${task.id}`);\n }\n throw error;\n }\n }\n\n private async writeTaskRecord(task: WorkTask): Promise<void> {\n await writeFile(this.taskPath(task.id), this.serializeTask(task), \"utf-8\");\n }\n\n private async writeNewProject(project: WorkProject): Promise<void> {\n try {\n await writeFile(this.projectPath(project.id), this.serializeProject(project), { encoding: \"utf-8\", flag: \"wx\" });\n } catch (error) {\n if (isErrnoCode(error, \"EEXIST\")) {\n throw new Error(`project already exists: ${project.id}`);\n }\n throw error;\n }\n }\n\n private async writeProjectRecord(project: WorkProject): Promise<void> {\n await writeFile(this.projectPath(project.id), this.serializeProject(project), \"utf-8\");\n }\n\n private async enqueueProjectMutation<T>(projectId: string, op: () => Promise<T>): Promise<T> {\n const mutationKey = this.projectPath(projectId);\n const previous = PROJECT_MUTATION_CHAINS.get(mutationKey) ?? Promise.resolve();\n const run = previous.catch(() => undefined).then(op);\n const cleanup = run.then(() => undefined, () => undefined).then(() => {\n if (PROJECT_MUTATION_CHAINS.get(mutationKey) === cleanup) {\n PROJECT_MUTATION_CHAINS.delete(mutationKey);\n }\n });\n PROJECT_MUTATION_CHAINS.set(mutationKey, cleanup);\n return run;\n }\n\n private async enqueueTaskMutation<T>(taskId: string, op: () => Promise<T>): Promise<T> {\n const mutationKey = this.taskPath(taskId);\n const previous = TASK_MUTATION_CHAINS.get(mutationKey) ?? Promise.resolve();\n const run = previous.catch(() => undefined).then(op);\n const cleanup = run.then(() => undefined, () => undefined).then(() => {\n if (TASK_MUTATION_CHAINS.get(mutationKey) === cleanup) {\n TASK_MUTATION_CHAINS.delete(mutationKey);\n }\n });\n TASK_MUTATION_CHAINS.set(mutationKey, cleanup);\n return run;\n }\n\n private parseTask(raw: string): WorkTask | null {\n const parsed = parseFrontmatter(raw);\n if (!parsed) return null;\n const d = parsed.data;\n return {\n id: ensureString(d.id),\n title: ensureString(d.title),\n description: ensureString(d.description, parsed.body.trim()),\n status: ensureTaskStatus(d.status),\n priority: ensureTaskPriority(d.priority),\n owner: ensureNullableString(d.owner),\n assignee: ensureNullableString(d.assignee),\n projectId: ensureNullableString(d.projectId),\n tags: ensureStringArray(d.tags),\n dueAt: ensureNullableString(d.dueAt),\n createdAt: ensureString(d.createdAt),\n updatedAt: ensureString(d.updatedAt),\n };\n }\n\n private parseProject(raw: string): WorkProject | null {\n const parsed = parseFrontmatter(raw);\n if (!parsed) return null;\n const d = parsed.data;\n return {\n id: ensureString(d.id),\n name: ensureString(d.name),\n description: ensureString(d.description, parsed.body.trim()),\n status: ensureProjectStatus(d.status),\n owner: ensureNullableString(d.owner),\n tags: ensureStringArray(d.tags),\n taskIds: ensureStringArray(d.taskIds),\n createdAt: ensureString(d.createdAt),\n updatedAt: ensureString(d.updatedAt),\n };\n }\n\n async createTask(input: CreateWorkTaskInput, now = new Date()): Promise<WorkTask> {\n await this.ensureDirectories();\n const timestamp = now.toISOString();\n const task: WorkTask = {\n id: input.id ?? makeId(\"task\", input.title, now),\n title: input.title,\n description: input.description ?? \"\",\n status: input.status ?? \"todo\",\n priority: input.priority ?? \"medium\",\n owner: input.owner ?? null,\n assignee: input.assignee ?? null,\n projectId: input.projectId ?? null,\n tags: input.tags ?? [],\n dueAt: input.dueAt ?? null,\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n\n if (task.projectId) {\n const project = await this.getProject(task.projectId);\n if (!project) {\n throw new Error(`project not found: ${task.projectId}`);\n }\n }\n\n if (task.projectId) {\n let taskFileCreated = false;\n try {\n await this.writeNewTask(task);\n taskFileCreated = true;\n await this.addTaskIdToProject(task.projectId, task.id, now);\n } catch (error) {\n if (taskFileCreated) {\n await rm(this.taskPath(task.id), { force: true }).catch(() => undefined);\n }\n throw error;\n }\n } else {\n await this.writeNewTask(task);\n }\n\n return task;\n }\n\n async getTask(id: string): Promise<WorkTask | null> {\n try {\n const raw = await readFile(this.taskPath(id), \"utf-8\");\n return this.parseTask(raw);\n } catch {\n return null;\n }\n }\n\n async listTasks(filter?: WorkTaskListFilter): Promise<WorkTask[]> {\n await this.ensureDirectories();\n const entries = await readdir(this.tasksDir, { withFileTypes: true });\n const out: WorkTask[] = [];\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".md\")) continue;\n const raw = await readFile(path.join(this.tasksDir, entry.name), \"utf-8\");\n const task = this.parseTask(raw);\n if (!task) continue;\n if (filter?.status && task.status !== filter.status) continue;\n if (filter?.owner && task.owner !== filter.owner) continue;\n if (filter?.assignee && task.assignee !== filter.assignee) continue;\n if (filter?.projectId && task.projectId !== filter.projectId) continue;\n out.push(task);\n }\n out.sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n return out;\n }\n\n async updateTask(\n id: string,\n patch: UpdateWorkTaskInput,\n now = new Date(),\n options?: { skipStatusTransitionValidation?: boolean },\n ): Promise<WorkTask | null> {\n return this.enqueueTaskMutation(id, async () => this.updateTaskUnlocked(id, patch, now, options));\n }\n\n private async updateTaskUnlocked(\n id: string,\n patch: UpdateWorkTaskInput,\n now = new Date(),\n options?: { skipStatusTransitionValidation?: boolean },\n ): Promise<WorkTask | null> {\n const existing = await this.getTask(id);\n if (!existing) return null;\n\n const projectIdPatched = Object.prototype.hasOwnProperty.call(patch, \"projectId\");\n const statusPatched = Object.prototype.hasOwnProperty.call(patch, \"status\");\n const nextProjectId = projectIdPatched ? patch.projectId ?? null : existing.projectId;\n\n if (\n statusPatched\n && patch.status\n && existing.status !== patch.status\n && options?.skipStatusTransitionValidation !== true\n && !TASK_TRANSITIONS[existing.status].has(patch.status)\n ) {\n throw new Error(`invalid task status transition: ${existing.status} -> ${patch.status}`);\n }\n\n if (projectIdPatched && nextProjectId) {\n const nextProject = await this.getProject(nextProjectId);\n if (!nextProject) {\n throw new Error(`project not found: ${nextProjectId}`);\n }\n }\n\n const next: WorkTask = {\n ...existing,\n ...patch,\n projectId: nextProjectId,\n tags: patch.tags ?? existing.tags,\n updatedAt: now.toISOString(),\n };\n await this.writeTaskRecord(next);\n if (projectIdPatched && existing.projectId !== nextProjectId) {\n try {\n if (nextProjectId) {\n await this.addTaskIdToProject(nextProjectId, id, now);\n }\n if (existing.projectId) {\n await this.removeTaskIdFromProject(existing.projectId, id, now);\n }\n } catch (error) {\n await this.writeTaskRecord(existing);\n if (nextProjectId) {\n await this.removeTaskIdFromProject(nextProjectId, id, now).catch(() => undefined);\n }\n if (existing.projectId) {\n await this.addTaskIdToProject(existing.projectId, id, now).catch(() => undefined);\n }\n throw error;\n }\n }\n return next;\n }\n\n async transitionTask(id: string, nextStatus: WorkTaskStatus, now = new Date()): Promise<WorkTask> {\n const existing = await this.getTask(id);\n if (!existing) throw new Error(`task not found: ${id}`);\n if (existing.status === nextStatus) return existing;\n if (!TASK_TRANSITIONS[existing.status].has(nextStatus)) {\n throw new Error(`invalid task status transition: ${existing.status} -> ${nextStatus}`);\n }\n const updated = await this.updateTask(id, { status: nextStatus }, now);\n if (!updated) throw new Error(`task not found after update: ${id}`);\n return updated;\n }\n\n async deleteTask(id: string): Promise<boolean> {\n const existing = await this.getTask(id);\n if (!existing) return false;\n let removedProjectLink = false;\n if (existing.projectId) {\n await this.removeTaskIdFromProject(existing.projectId, id);\n removedProjectLink = true;\n }\n try {\n await rm(this.taskPath(id));\n return true;\n } catch (error) {\n if (isErrnoCode(error, \"ENOENT\")) return false;\n if (removedProjectLink && existing.projectId) {\n await this.addTaskIdToProject(existing.projectId, id).catch(() => undefined);\n }\n throw error;\n }\n }\n\n async createProject(input: CreateWorkProjectInput, now = new Date()): Promise<WorkProject> {\n await this.ensureDirectories();\n const timestamp = now.toISOString();\n const project: WorkProject = {\n id: input.id ?? makeId(\"project\", input.name, now),\n name: input.name,\n description: input.description ?? \"\",\n status: input.status ?? \"active\",\n owner: input.owner ?? null,\n tags: input.tags ?? [],\n taskIds: [],\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n await this.writeNewProject(project);\n return project;\n }\n\n async getProject(id: string): Promise<WorkProject | null> {\n try {\n const raw = await readFile(this.projectPath(id), \"utf-8\");\n return this.parseProject(raw);\n } catch {\n return null;\n }\n }\n\n async listProjects(): Promise<WorkProject[]> {\n await this.ensureDirectories();\n const entries = await readdir(this.projectsDir, { withFileTypes: true });\n const out: WorkProject[] = [];\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".md\")) continue;\n const raw = await readFile(path.join(this.projectsDir, entry.name), \"utf-8\");\n const project = this.parseProject(raw);\n if (project) out.push(project);\n }\n out.sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n return out;\n }\n\n async updateProject(id: string, patch: UpdateWorkProjectInput, now = new Date()): Promise<WorkProject | null> {\n return this.enqueueProjectMutation(id, async () => this.updateProjectUnlocked(id, patch, now));\n }\n\n private async updateProjectUnlocked(id: string, patch: UpdateWorkProjectInput, now = new Date()): Promise<WorkProject | null> {\n const existing = await this.getProject(id);\n if (!existing) return null;\n const next: WorkProject = {\n ...existing,\n ...patch,\n tags: patch.tags ?? existing.tags,\n taskIds: patch.taskIds ? [...patch.taskIds].sort() : existing.taskIds,\n updatedAt: now.toISOString(),\n };\n await this.writeProjectRecord(next);\n return next;\n }\n\n async deleteProject(id: string): Promise<boolean> {\n return this.enqueueProjectMutation(id, async () => this.deleteProjectUnlocked(id));\n }\n\n private async deleteProjectUnlocked(id: string): Promise<boolean> {\n const existing = await this.getProject(id);\n if (!existing) return false;\n const unlinkedTasks: WorkTask[] = [];\n try {\n for (const taskId of existing.taskIds) {\n const task = await this.getTask(taskId);\n if (!task || task.projectId !== id) continue;\n const next: WorkTask = {\n ...task,\n projectId: null,\n updatedAt: new Date().toISOString(),\n };\n await this.writeTaskRecord(next);\n unlinkedTasks.push(task);\n }\n await rm(this.projectPath(id));\n return true;\n } catch (error) {\n for (const task of unlinkedTasks.reverse()) {\n try {\n await this.writeTaskRecord(task);\n } catch {\n // Preserve the original relationship failure for callers.\n }\n }\n if (isErrnoCode(error, \"ENOENT\")) return false;\n throw error;\n }\n }\n\n async linkTaskToProject(taskId: string, projectId: string, now = new Date()): Promise<{ task: WorkTask; project: WorkProject }> {\n const task = await this.getTask(taskId);\n if (!task) throw new Error(`task not found: ${taskId}`);\n const project = await this.getProject(projectId);\n if (!project) throw new Error(`project not found: ${projectId}`);\n\n const updatedTask = await this.updateTask(taskId, { projectId }, now);\n if (!updatedTask) throw new Error(`task not found after update: ${taskId}`);\n\n const updatedProject = await this.getProject(projectId);\n if (!updatedProject) throw new Error(`project not found after update: ${projectId}`);\n\n return { task: updatedTask, project: updatedProject };\n }\n\n private async removeTaskIdFromProject(projectId: string, taskId: string, now = new Date()): Promise<void> {\n await this.enqueueProjectMutation(projectId, async () => {\n const project = await this.getProject(projectId);\n if (!project) return;\n\n const filtered = project.taskIds.filter((id) => id !== taskId);\n if (filtered.length === project.taskIds.length) return;\n\n await this.updateProjectUnlocked(projectId, { taskIds: filtered }, now);\n });\n }\n\n private async addTaskIdToProject(projectId: string, taskId: string, now = new Date()): Promise<void> {\n await this.enqueueProjectMutation(projectId, async () => {\n const project = await this.getProject(projectId);\n if (!project) throw new Error(`project not found: ${projectId}`);\n\n const taskIds = new Set(project.taskIds);\n taskIds.add(taskId);\n await this.updateProjectUnlocked(projectId, { taskIds: Array.from(taskIds) }, now);\n });\n }\n}\n"],"mappings":"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","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-DRD2Q7HQ.js";
5
5
  import {
6
6
  StorageManager
7
- } from "./chunk-YFS5OEKO.js";
7
+ } from "./chunk-7MLB4NCL.js";
8
8
  import {
9
9
  parseContinuityImprovementLoops
10
10
  } from "./chunk-QSVPYQPG.js";
@@ -265,6 +265,7 @@ var CompoundingEngine = class {
265
265
  causalTrajectoryStoreDir: this.config.causalTrajectoryStoreDir,
266
266
  gatewayConfig: this.config.gatewayConfig,
267
267
  gatewayAgentId: this.config.modelSource === "gateway" ? this.config.gatewayAgentId || void 0 : void 0,
268
+ modelChain: this.config.modelSource === "gateway" ? this.config.taskModelChain : void 0,
268
269
  workspaceDir: this.config.workspaceDir,
269
270
  pluginConfig: this.config,
270
271
  config: {
@@ -297,6 +298,7 @@ var CompoundingEngine = class {
297
298
  memoryDir: this.config.memoryDir,
298
299
  gatewayConfig: this.config.gatewayConfig,
299
300
  gatewayAgentId: this.config.modelSource === "gateway" ? this.config.gatewayAgentId || void 0 : void 0,
301
+ modelChain: this.config.modelSource === "gateway" ? this.config.taskModelChain : void 0,
300
302
  workspaceDir: this.config.workspaceDir
301
303
  });
302
304
  log.debug(`[calibration] weekly synthesis produced ${calRules.length} calibration rule(s)`);
@@ -1259,4 +1261,4 @@ export {
1259
1261
  defaultTierMigrationCycleBudget,
1260
1262
  CompoundingEngine
1261
1263
  };
1262
- //# sourceMappingURL=chunk-IP73YCZP.js.map
1264
+ //# sourceMappingURL=chunk-GLPBYIXN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/compounding/engine.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, readdir, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { log } from \"../logger.js\";\nimport { sanitizeMemoryContent } from \"../sanitize.js\";\nimport { StorageManager } from \"../storage.js\";\nimport type { ContinuityIncidentRecord, PluginConfig } from \"../types.js\";\nimport { resolveSharedContextDir, SharedFeedbackEntrySchema, type SharedFeedbackEntry } from \"../shared-context/manager.js\";\nimport { parseContinuityImprovementLoops } from \"../identity-continuity.js\";\n\ntype MistakesFile = {\n version?: number;\n updatedAt: string;\n patterns: string[];\n registry?: MistakeRegistryEntry[];\n};\n\ntype FeedbackEntryWithProvenance = {\n entry: SharedFeedbackEntry;\n sourceLine: number;\n sourcePath: string;\n entryId: string;\n};\n\ntype PatternWithProvenance = {\n pattern: string;\n provenance: string[];\n};\n\ntype ActionOutcomeCounts = {\n applied: number;\n skipped: number;\n failed: number;\n};\n\ntype ActionOutcomeSummary = {\n action: string;\n counts: ActionOutcomeCounts;\n total: number;\n weightedScore: number;\n provenance: string[];\n};\n\ntype PromotionCandidate = {\n id: string;\n sourceType: \"action-outcome\" | \"mistake-pattern\" | \"rubric\" | \"causal-pattern\";\n subject: string;\n category: \"principle\" | \"rule\" | \"preference\";\n content: string;\n score: number;\n rationale: string;\n outcome: ActionOutcomeCounts | null;\n provenance: string[];\n agent: string | null;\n workflow: string | null;\n};\n\ntype CompoundingEntrySeverity = \"low\" | \"medium\" | \"high\";\n\ntype EvidenceWindow = {\n start: string | null;\n end: string | null;\n};\n\ntype MistakeRegistryEntry = {\n id: string;\n pattern: string;\n category: \"feedback\" | \"action\";\n status: \"active\" | \"retired\";\n agent: string | null;\n workflow: string | null;\n tags: string[];\n severity: CompoundingEntrySeverity | null;\n confidence: number | null;\n outcome: string | null;\n provenance: string[];\n firstSeenAt: string;\n lastSeenAt: string;\n recurrenceCount: number;\n lastWeekId: string;\n evidenceWindow: EvidenceWindow;\n mergedFromIds?: string[];\n retiredAt?: string | null;\n};\n\ntype RubricSnapshotEntry = {\n id: string;\n kind: \"agent\" | \"workflow\";\n subject: string;\n observations: string[];\n tags: string[];\n provenance: string[];\n observationEntries?: Array<{\n note: string;\n provenance: string[];\n }>;\n updatedAt: string;\n};\n\ntype RubricSnapshot = {\n updatedAt: string;\n agents: RubricSnapshotEntry[];\n workflows: RubricSnapshotEntry[];\n};\n\ntype WeeklyCompoundingArtifact = {\n version: number;\n generatedAt: string;\n weekId: string;\n feedback: {\n count: number;\n byDecision: Record<\"approved\" | \"approved_with_feedback\" | \"rejected\", number>;\n entries: Array<{\n agent: string;\n workflow: string | null;\n decision: SharedFeedbackEntry[\"decision\"];\n reason: string;\n learning: string | null;\n outcome: string | null;\n severity: CompoundingEntrySeverity | null;\n confidence: number | null;\n tags: string[];\n provenance: string;\n evidenceWindow: EvidenceWindow;\n }>;\n };\n mistakes: {\n count: number;\n patterns: string[];\n registry: MistakeRegistryEntry[];\n };\n rubrics: RubricSnapshot;\n outcomes: ActionOutcomeSummary[];\n promotionCandidates: PromotionCandidate[];\n continuity: { monthId: string; weeklyPath: string | null; monthlyPath: string | null };\n};\n\nexport interface CompoundingPromotionReport {\n enabled: boolean;\n dryRun: boolean;\n weekId: string;\n promoted: Array<{\n id: string;\n candidateId: string;\n category: \"principle\" | \"rule\" | \"preference\";\n content: string;\n confidence: number;\n tags: string[];\n lineage: string[];\n }>;\n skipped: Array<{\n weekId: string;\n candidateId?: string;\n reason: \"disabled\" | \"weekly-artifact-missing\" | \"candidate-not-found\" | \"duplicate-guidance\";\n existingMemoryId?: string;\n }>;\n}\n\ntype WeeklyActionEvent = {\n line: number;\n action: string;\n outcome: \"applied\" | \"skipped\" | \"failed\";\n policyDecision: \"deny\" | \"defer\" | null;\n namespace: string;\n reason: string | null;\n};\n\nconst COMPOUNDING_VERSION = 2;\nconst RETIREMENT_WINDOW_WEEKS = 8;\n\nfunction stableSlug(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80) || \"item\";\n}\n\nfunction tokenizeRecallQuery(text: string): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const token of text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]+/g, \" \")\n .split(/\\s+/)\n .map((part) => part.trim())\n .filter((part) => part.length >= 3)) {\n if (seen.has(token)) continue;\n seen.add(token);\n out.push(token);\n }\n return out;\n}\n\nfunction weekIdToIndex(weekId: string): number {\n const match = weekId.match(/^(\\d{4})-W(\\d{2})$/);\n if (!match) return Number.POSITIVE_INFINITY;\n const year = Number(match[1]);\n const week = Number(match[2]);\n if (!Number.isInteger(year) || !Number.isInteger(week) || week < 1 || week > 53) {\n return Number.POSITIVE_INFINITY;\n }\n const jan4 = new Date(Date.UTC(year, 0, 4));\n const jan4Day = jan4.getUTCDay() || 7;\n const isoWeekOneStart = new Date(jan4);\n isoWeekOneStart.setUTCDate(jan4.getUTCDate() - (jan4Day - 1));\n const targetWeekStart = new Date(isoWeekOneStart);\n targetWeekStart.setUTCDate(isoWeekOneStart.getUTCDate() + ((week - 1) * 7));\n return Math.floor(targetWeekStart.getTime() / (7 * 24 * 60 * 60 * 1000));\n}\n\nfunction normalizeConfidence(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n const clamped = Math.max(0, Math.min(1, value));\n return Number(clamped.toFixed(3));\n}\n\nfunction normalizeTags(tags: string[] | undefined): string[] {\n if (!Array.isArray(tags)) return [];\n return [...new Set(tags.map((tag) => String(tag).trim()).filter((tag) => tag.length > 0))].sort();\n}\n\nfunction normalizeEvidenceWindow(start?: string, end?: string): EvidenceWindow {\n const safeStart = typeof start === \"string\" && start.trim().length > 0 ? start : null;\n const safeEnd = typeof end === \"string\" && end.trim().length > 0 ? end : null;\n return { start: safeStart, end: safeEnd };\n}\n\nfunction mergeEvidenceWindows(current: EvidenceWindow, next: EvidenceWindow): EvidenceWindow {\n return {\n start: current.start === null ? next.start : next.start === null ? current.start : current.start <= next.start ? current.start : next.start,\n end: current.end === null ? next.end : next.end === null ? current.end : current.end >= next.end ? current.end : next.end,\n };\n}\n\nfunction stableMistakeId(\n category: \"feedback\" | \"action\",\n pattern: string,\n agent: string | null,\n workflow: string | null,\n): string {\n return [\n category,\n agent ? stableSlug(agent) : \"global\",\n workflow ? stableSlug(workflow) : \"default\",\n stableSlug(pattern).slice(0, 48),\n ].join(\":\");\n}\n\nfunction stableRubricId(kind: \"agent\" | \"workflow\", subject: string): string {\n return `${kind}:${stableSlug(subject)}`;\n}\n\nfunction stablePromotionCandidateId(\n sourceType: PromotionCandidate[\"sourceType\"],\n subject: string,\n content: string,\n): string {\n const digest = createHash(\"sha256\")\n .update(`${sourceType}\\u0000${subject}\\u0000${content}`)\n .digest(\"hex\")\n .slice(0, 12);\n return `${sourceType}:${digest}`;\n}\n\nfunction rubricArtifactFileName(\n entry: Pick<RubricSnapshotEntry, \"kind\" | \"subject\">,\n slugCollisions: ReadonlyMap<string, number>,\n): string {\n const slug = stableSlug(entry.subject);\n if ((slugCollisions.get(slug) ?? 0) <= 1) return `${slug}.md`;\n const suffix = createHash(\"sha256\").update(`${entry.kind}:${entry.subject}`).digest(\"hex\").slice(0, 8);\n return `${slug}-${suffix}.md`;\n}\n\nfunction inferLegacyMistakeScope(pattern: string): { agent: string | null; workflow: string | null } {\n const separatorIndex = pattern.indexOf(\":\");\n if (separatorIndex <= 0) return { agent: null, workflow: null };\n const subject = pattern.slice(0, separatorIndex).trim();\n return {\n agent: subject.length > 0 ? subject : null,\n workflow: null,\n };\n}\n\nfunction inferLegacyMistakeMetadata(pattern: string): {\n category: \"feedback\" | \"action\";\n agent: string | null;\n workflow: string | null;\n} {\n if (pattern.startsWith(\"memory-action/\")) {\n return {\n category: \"action\",\n agent: null,\n workflow: \"memory-actions\",\n };\n }\n const scope = inferLegacyMistakeScope(pattern);\n return {\n category: \"feedback\",\n agent: scope.agent,\n workflow: scope.workflow,\n };\n}\n\nfunction normalizePromotionWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction stripTrailingPromotionPunctuation(value: string): string {\n return value.replace(/[,:;]+$/g, \"\").trim();\n}\n\nfunction extractExplicitIfThenRule(value: string): string | null {\n const normalized = normalizePromotionWhitespace(value);\n const match = normalized.match(/^if\\b([\\s\\S]+?)\\bthen\\b([\\s\\S]+?)(?:[.!?])?$/i);\n if (!match) return null;\n const condition = stripTrailingPromotionPunctuation(normalizePromotionWhitespace(match[1] ?? \"\"));\n const outcome = stripTrailingPromotionPunctuation(normalizePromotionWhitespace(match[2] ?? \"\"));\n if (condition.length === 0 || outcome.length === 0) return null;\n return `IF ${condition} THEN ${outcome}.`;\n}\n\nfunction normalizePromotedGuidanceContent(value: string): string {\n const explicitRule = extractExplicitIfThenRule(value);\n if (explicitRule) return explicitRule;\n const normalized = normalizePromotionWhitespace(value);\n if (normalized.length === 0) return normalized;\n return /[.!?]$/.test(normalized) ? normalized : `${normalized}.`;\n}\n\nfunction canonicalPromotionContentKey(value: string): string {\n return normalizePromotedGuidanceContent(value).toLowerCase();\n}\n\nfunction lessonContentFromPattern(pattern: string, agent: string | null): string {\n if (!agent) return normalizePromotionWhitespace(pattern);\n const prefix = `${agent}:`;\n if (!pattern.startsWith(prefix)) return normalizePromotionWhitespace(pattern);\n const withoutPrefix = pattern.slice(prefix.length).trim();\n return withoutPrefix.length > 0 ? normalizePromotionWhitespace(withoutPrefix) : normalizePromotionWhitespace(pattern);\n}\n\nfunction promotionCategoryForContent(content: string): \"principle\" | \"rule\" {\n return extractExplicitIfThenRule(content) ? \"rule\" : \"principle\";\n}\n\nfunction clampPromotionScore(value: number): number {\n if (!Number.isFinite(value)) return 0.65;\n return Number(Math.max(0.65, Math.min(0.98, value)).toFixed(3));\n}\n\nexport type TierMigrationCycleTrigger = \"extraction\" | \"maintenance\";\nexport interface TierMigrationCycleBudget {\n limit: number;\n scanLimit: number;\n minIntervalMs: number;\n}\n\nexport function defaultTierMigrationCycleBudget(\n config: Pick<PluginConfig, \"qmdTierAutoBackfillEnabled\">,\n trigger: TierMigrationCycleTrigger,\n): TierMigrationCycleBudget {\n if (trigger === \"extraction\") {\n const limit = 12;\n return {\n limit,\n scanLimit: limit * 4,\n minIntervalMs: 60_000,\n };\n }\n const limit = config.qmdTierAutoBackfillEnabled ? 200 : 50;\n return {\n limit,\n scanLimit: limit * 4,\n minIntervalMs: config.qmdTierAutoBackfillEnabled ? 120_000 : 300_000,\n };\n}\n\nfunction isoWeekId(d: Date): string {\n // ISO week based on Thursday\n const dt = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));\n const day = dt.getUTCDay() || 7;\n dt.setUTCDate(dt.getUTCDate() + 4 - day);\n const yearStart = new Date(Date.UTC(dt.getUTCFullYear(), 0, 1));\n const week = Math.ceil((((dt.getTime() - yearStart.getTime()) / 86400000) + 1) / 7);\n const yyyy = dt.getUTCFullYear();\n return `${yyyy}-W${String(week).padStart(2, \"0\")}`;\n}\n\nfunction isoMonthId(d: Date): string {\n return `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, \"0\")}`;\n}\n\nfunction monthIdFromIsoWeek(weekId: string): string {\n const match = weekId.match(/^(\\d{4})-W(\\d{2})$/);\n if (!match) return isoMonthId(new Date());\n const year = Number(match[1]);\n const week = Number(match[2]);\n const jan4 = new Date(Date.UTC(year, 0, 4));\n const jan4Day = jan4.getUTCDay() || 7;\n const isoWeekOneMonday = new Date(jan4);\n isoWeekOneMonday.setUTCDate(jan4.getUTCDate() - (jan4Day - 1));\n const monday = new Date(isoWeekOneMonday);\n monday.setUTCDate(isoWeekOneMonday.getUTCDate() + (week - 1) * 7);\n return isoMonthId(monday);\n}\n\nfunction cadenceStaleWindowMs(cadence: \"daily\" | \"weekly\" | \"monthly\" | \"quarterly\"): number {\n switch (cadence) {\n case \"daily\":\n return 2 * 24 * 60 * 60 * 1000;\n case \"weekly\":\n return 10 * 24 * 60 * 60 * 1000;\n case \"monthly\":\n return 45 * 24 * 60 * 60 * 1000;\n case \"quarterly\":\n return 120 * 24 * 60 * 60 * 1000;\n default:\n return 45 * 24 * 60 * 60 * 1000;\n }\n}\n\nexport class CompoundingEngine {\n private readonly weeklyDir: string;\n private readonly rubricsDir: string;\n private readonly rubricsIndexPath: string;\n private readonly rubricsAgentsDir: string;\n private readonly rubricsWorkflowsDir: string;\n private readonly rubricsPath: string;\n private readonly mistakesPath: string;\n private readonly feedbackInboxPath: string;\n private readonly identityAuditWeeklyDir: string;\n private readonly identityAuditMonthlyDir: string;\n private readonly memoryActionEventsPath: string;\n\n constructor(\n private readonly config: PluginConfig,\n private readonly storage: StorageManager = new StorageManager(config.memoryDir),\n ) {\n this.weeklyDir = path.join(config.memoryDir, \"compounding\", \"weekly\");\n this.rubricsDir = path.join(config.memoryDir, \"compounding\", \"rubrics\");\n this.rubricsIndexPath = path.join(this.rubricsDir, \"index.json\");\n this.rubricsAgentsDir = path.join(this.rubricsDir, \"agents\");\n this.rubricsWorkflowsDir = path.join(this.rubricsDir, \"workflows\");\n this.rubricsPath = path.join(config.memoryDir, \"compounding\", \"rubrics.md\");\n this.mistakesPath = path.join(config.memoryDir, \"compounding\", \"mistakes.json\");\n this.feedbackInboxPath = path.join(resolveSharedContextDir(config), \"feedback\", \"inbox.jsonl\");\n this.identityAuditWeeklyDir = path.join(config.memoryDir, \"identity\", \"audits\", \"weekly\");\n this.identityAuditMonthlyDir = path.join(config.memoryDir, \"identity\", \"audits\", \"monthly\");\n this.memoryActionEventsPath = path.join(config.memoryDir, \"state\", \"memory-actions.jsonl\");\n }\n\n async ensureDirs(): Promise<void> {\n await mkdir(this.weeklyDir, { recursive: true });\n await mkdir(path.dirname(this.mistakesPath), { recursive: true });\n await mkdir(path.dirname(this.rubricsPath), { recursive: true });\n await mkdir(this.rubricsDir, { recursive: true });\n await mkdir(this.rubricsAgentsDir, { recursive: true });\n await mkdir(this.rubricsWorkflowsDir, { recursive: true });\n }\n\n async synthesizeWeekly(opts?: {\n weekId?: string;\n }): Promise<{\n weekId: string;\n reportPath: string;\n reportJsonPath: string;\n mistakesCount: number;\n rubricsPath: string;\n rubricsIndexPath: string;\n promotionCandidateCount: number;\n }> {\n await this.ensureDirs();\n const weekId = opts?.weekId ?? isoWeekId(new Date());\n\n const entries = await this.readFeedbackEntriesForWeek(weekId);\n const actionEvents = await this.readActionEventsForWeek(weekId);\n const actionPatterns = this.buildActionFailurePatterns(actionEvents);\n const outcomeSummary = this.buildActionOutcomeSummary(actionEvents);\n const previousMistakes = await this.readMistakes();\n const mistakes = this.buildMistakes(entries, actionPatterns, weekId, previousMistakes?.registry ?? []);\n const rubrics = this.buildRubricSnapshot(entries, outcomeSummary);\n let promotionCandidates = this.config.compoundingSemanticEnabled\n ? this.derivePromotionCandidates(outcomeSummary, mistakes.registry, rubrics)\n : [];\n if (this.config.cmcConsolidationEnabled) {\n try {\n const { deriveCausalPromotionCandidates, materializeAfterCausalConsolidation } = await import(\"../causal-consolidation.js\");\n const causalCandidates = await deriveCausalPromotionCandidates({\n memoryDir: this.config.memoryDir,\n causalTrajectoryStoreDir: this.config.causalTrajectoryStoreDir,\n gatewayConfig: this.config.gatewayConfig,\n gatewayAgentId: this.config.modelSource === \"gateway\" ? (this.config.gatewayAgentId || undefined) : undefined,\n modelChain: this.config.modelSource === \"gateway\" ? this.config.taskModelChain : undefined,\n workspaceDir: this.config.workspaceDir,\n pluginConfig: this.config,\n config: {\n minRecurrence: this.config.cmcConsolidationMinRecurrence,\n minSessions: this.config.cmcConsolidationMinSessions,\n successThreshold: this.config.cmcConsolidationSuccessThreshold,\n },\n });\n if (causalCandidates.length > 0) {\n promotionCandidates = [...promotionCandidates, ...causalCandidates];\n }\n // #378: fire the Codex materialize post-hook so\n // `codexMaterializeOnConsolidation` actually has a runtime effect\n // when the causal consolidation path runs. The helper silently no-ops\n // when the feature flag or the per-trigger toggle is off, when the\n // sentinel is missing, or when nothing has changed since the previous\n // run. Wrapped in its own try/catch so a failed materialize never\n // aborts weekly synthesis.\n try {\n await materializeAfterCausalConsolidation({\n config: this.config,\n memoryDir: this.config.memoryDir,\n });\n } catch (materializeError) {\n log.warn(\n `[cmc] Codex materialize post-hook failed (non-fatal): ${\n materializeError instanceof Error ? materializeError.message : String(materializeError)\n }`,\n );\n }\n } catch (error) {\n log.warn(`[cmc] causal consolidation in synthesizeWeekly failed (non-fatal): ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n // PEDC: Run calibration consolidation during weekly synthesis\n if (this.config.calibrationEnabled) {\n try {\n const { runCalibrationConsolidation } = await import(\"../calibration.js\");\n const calRules = await runCalibrationConsolidation({\n memoryDir: this.config.memoryDir,\n gatewayConfig: this.config.gatewayConfig,\n gatewayAgentId: this.config.modelSource === \"gateway\" ? (this.config.gatewayAgentId || undefined) : undefined,\n modelChain: this.config.modelSource === \"gateway\" ? this.config.taskModelChain : undefined,\n workspaceDir: this.config.workspaceDir,\n });\n log.debug(`[calibration] weekly synthesis produced ${calRules.length} calibration rule(s)`);\n } catch (error) {\n log.warn(`[calibration] weekly consolidation failed (non-fatal): ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n const continuity = this.config.continuityAuditEnabled\n ? await this.readContinuityAuditReferences(weekId)\n : { monthId: monthIdFromIsoWeek(weekId), weeklyPath: null, monthlyPath: null };\n\n // Write weekly report (always, even if empty: \"day-one outcomes\").\n const reportPath = path.join(this.weeklyDir, `${weekId}.md`);\n const md = this.formatWeeklyReport(weekId, entries, mistakes.patterns, mistakes.details, continuity, outcomeSummary, promotionCandidates);\n await writeFile(reportPath, md, \"utf-8\");\n\n const reportJsonPath = path.join(this.weeklyDir, `${weekId}.json`);\n const weeklyArtifact: WeeklyCompoundingArtifact = {\n version: COMPOUNDING_VERSION,\n generatedAt: mistakes.updatedAt,\n weekId,\n feedback: {\n count: entries.length,\n byDecision: {\n approved: entries.filter((wrapped) => wrapped.entry.decision === \"approved\").length,\n approved_with_feedback: entries.filter((wrapped) => wrapped.entry.decision === \"approved_with_feedback\").length,\n rejected: entries.filter((wrapped) => wrapped.entry.decision === \"rejected\").length,\n },\n entries: entries.map((wrapped) => ({\n agent: wrapped.entry.agent,\n workflow: wrapped.entry.workflow ?? null,\n decision: wrapped.entry.decision,\n reason: wrapped.entry.reason,\n learning: wrapped.entry.learning?.trim() || null,\n outcome: wrapped.entry.outcome?.trim() || null,\n severity: wrapped.entry.severity ?? null,\n confidence: normalizeConfidence(wrapped.entry.confidence),\n tags: normalizeTags(wrapped.entry.tags),\n provenance: `${path.basename(wrapped.sourcePath)}:L${wrapped.sourceLine}#${wrapped.entryId}`,\n evidenceWindow: normalizeEvidenceWindow(wrapped.entry.evidenceWindowStart, wrapped.entry.evidenceWindowEnd),\n })),\n },\n mistakes: {\n count: mistakes.patterns.length,\n patterns: mistakes.patterns,\n registry: mistakes.registry,\n },\n rubrics,\n outcomes: outcomeSummary,\n promotionCandidates,\n continuity,\n };\n await writeFile(reportJsonPath, JSON.stringify(weeklyArtifact, null, 2) + \"\\n\", \"utf-8\");\n\n // Write stable rubric artifact.\n const rubricsMarkdown = this.formatRubrics(outcomeSummary, rubrics);\n await writeFile(this.rubricsPath, rubricsMarkdown, \"utf-8\");\n await writeFile(this.rubricsIndexPath, JSON.stringify(rubrics, null, 2) + \"\\n\", \"utf-8\");\n await this.syncRubricArtifacts(rubrics);\n\n // Update mistakes.json (always).\n await writeFile(\n this.mistakesPath,\n JSON.stringify({\n version: COMPOUNDING_VERSION,\n updatedAt: mistakes.updatedAt,\n patterns: mistakes.patterns,\n registry: mistakes.registry,\n }, null, 2) + \"\\n\",\n \"utf-8\",\n );\n\n log.info(\n `compounding: wrote weekly=${reportPath} weeklyJson=${reportJsonPath} rubrics=${this.rubricsPath} rubricsIndex=${this.rubricsIndexPath} mistakes=${this.mistakesPath}`,\n );\n return {\n weekId,\n reportPath,\n reportJsonPath,\n rubricsPath: this.rubricsPath,\n rubricsIndexPath: this.rubricsIndexPath,\n mistakesCount: mistakes.patterns.length,\n promotionCandidateCount: promotionCandidates.length,\n };\n }\n\n async promoteCandidate(opts: {\n weekId: string;\n candidateId: string;\n dryRun?: boolean;\n storage?: StorageManager;\n }): Promise<CompoundingPromotionReport> {\n const report: CompoundingPromotionReport = {\n enabled: this.config.compoundingEnabled === true && this.config.compoundingSemanticEnabled === true,\n dryRun: opts.dryRun === true,\n weekId: opts.weekId,\n promoted: [],\n skipped: [],\n };\n if (!report.enabled) {\n report.skipped.push({ weekId: opts.weekId, candidateId: opts.candidateId, reason: \"disabled\" });\n return report;\n }\n\n const artifact = await this.readWeeklyArtifact(opts.weekId);\n if (!artifact) {\n report.skipped.push({ weekId: opts.weekId, candidateId: opts.candidateId, reason: \"weekly-artifact-missing\" });\n return report;\n }\n\n const candidate = artifact.promotionCandidates.find((entry) => entry.id === opts.candidateId);\n if (!candidate) {\n report.skipped.push({ weekId: opts.weekId, candidateId: opts.candidateId, reason: \"candidate-not-found\" });\n return report;\n }\n\n const content = normalizePromotedGuidanceContent(candidate.content);\n const persistedContent = sanitizeMemoryContent(content).text;\n const storage = opts.storage ?? new StorageManager(this.config.memoryDir);\n const existing = (await storage.readAllMemories()).find((memory) =>\n memory.frontmatter.category === candidate.category &&\n memory.frontmatter.status !== \"archived\" &&\n memory.frontmatter.status !== \"forgotten\" &&\n canonicalPromotionContentKey(memory.content) === canonicalPromotionContentKey(persistedContent)\n );\n if (existing) {\n report.skipped.push({\n weekId: opts.weekId,\n candidateId: opts.candidateId,\n reason: \"duplicate-guidance\",\n existingMemoryId: existing.frontmatter.id,\n });\n return report;\n }\n\n const tags = [\n \"compounding\",\n \"compounding-promotion\",\n `compounding-source-${candidate.sourceType}`,\n ...(candidate.agent ? [`agent:${stableSlug(candidate.agent)}`] : []),\n ...(candidate.workflow ? [`workflow:${stableSlug(candidate.workflow)}`] : []),\n ];\n const uniqueTags = [...new Set(tags)];\n const lineage = [`compounding:${opts.weekId}:${opts.candidateId}`];\n const confidence = clampPromotionScore(candidate.score);\n\n if (opts.dryRun === true) {\n report.promoted.push({\n id: `dry-run:${opts.weekId}:${opts.candidateId}`,\n candidateId: opts.candidateId,\n category: candidate.category,\n content: persistedContent,\n confidence,\n tags: uniqueTags,\n lineage,\n });\n return report;\n }\n\n const id = await storage.writeMemory(candidate.category, persistedContent, {\n source: \"compounding-promotion\",\n tags: uniqueTags,\n confidence,\n lineage,\n memoryKind: \"note\",\n });\n report.promoted.push({\n id,\n candidateId: opts.candidateId,\n category: candidate.category,\n content: persistedContent,\n confidence,\n tags: uniqueTags,\n lineage,\n });\n return report;\n }\n\n async synthesizeContinuityAudit(opts?: {\n period?: \"weekly\" | \"monthly\";\n key?: string;\n }): Promise<{ period: \"weekly\" | \"monthly\"; key: string; reportPath: string }> {\n const period = opts?.period === \"monthly\" ? \"monthly\" : \"weekly\";\n const key = opts?.key?.trim() || (period === \"weekly\" ? isoWeekId(new Date()) : isoMonthId(new Date()));\n const nowIso = new Date().toISOString();\n const [identityAnchor, improvementLoopsRaw, openIncidents, closedIncidents, mistakes] = await Promise.all([\n this.readOptionalIdentityAnchorForAudit(),\n this.readOptionalImprovementLoopsForAudit(),\n this.readContinuityIncidentsForAudit(200, \"open\"),\n this.readContinuityIncidentsForAudit(200, \"closed\"),\n this.readMistakes(),\n ]);\n const anchorPresent = (identityAnchor ?? \"\").trim().length > 0;\n const improvementLoops = improvementLoopsRaw ? parseContinuityImprovementLoops(improvementLoopsRaw) : [];\n const activeLoops = improvementLoops.filter((loop) => loop.status === \"active\");\n const staleActiveLoops = activeLoops.filter((loop) => {\n const reviewedAt = Date.parse(loop.lastReviewed);\n if (!Number.isFinite(reviewedAt)) return true;\n return Date.now() - reviewedAt > cadenceStaleWindowMs(loop.cadence);\n });\n const hardeningCandidates: string[] = [];\n if (!anchorPresent) {\n hardeningCandidates.push(\"Create/update identity anchor baseline and verify recovery injection path.\");\n }\n if (openIncidents.length > 0) {\n hardeningCandidates.push(\n `Close or downgrade ${openIncidents.length} open continuity incident${openIncidents.length === 1 ? \"\" : \"s\"}.`,\n );\n }\n if (improvementLoops.length === 0) {\n hardeningCandidates.push(\"Initialize continuity improvement-loops register with cadence and kill conditions.\");\n } else if (staleActiveLoops.length > 0) {\n hardeningCandidates.push(\n `Review stale active continuity loop${staleActiveLoops.length === 1 ? \"\" : \"s\"}: ${staleActiveLoops\n .slice(0, 3)\n .map((loop) => loop.id)\n .join(\", \")}.`,\n );\n }\n if ((mistakes?.patterns.length ?? 0) > 0) {\n hardeningCandidates.push(\"Review latest compounding mistakes and convert one pattern into preventive continuity rule.\");\n }\n const nextAction = hardeningCandidates[0] ?? \"No critical drift detected; keep weekly/monthly continuity audit cadence.\";\n\n const lines: string[] = [\n `# Continuity Audit — ${period} ${key}`,\n \"\",\n `Generated: ${nowIso}`,\n `Scope: ${period}`,\n \"\",\n \"## Signal Summary\",\n `- Identity anchor present: ${anchorPresent ? \"yes\" : \"no\"}`,\n `- Improvement loops tracked: ${improvementLoops.length}`,\n `- Active improvement loops: ${activeLoops.length}`,\n `- Stale active loops: ${staleActiveLoops.length}`,\n `- Open incidents: ${openIncidents.length}`,\n `- Closed incidents: ${closedIncidents.length}`,\n `- Compounding mistake patterns: ${mistakes?.patterns.length ?? 0}`,\n \"\",\n \"## Drift Checks\",\n `- Identity anchor drift: ${anchorPresent ? \"pass\" : \"needs attention\"}`,\n `- Incident backlog: ${openIncidents.length === 0 ? \"pass\" : \"needs attention\"}`,\n `- Improvement-loop coverage: ${improvementLoops.length > 0 ? \"pass\" : \"needs attention\"}`,\n `- Improvement-loop freshness: ${staleActiveLoops.length === 0 ? \"pass\" : \"needs attention\"}`,\n \"\",\n \"## Stale Rule Detection\",\n `- Open incidents older than closure window: ${openIncidents.length > 0 ? \"possible\" : \"none detected\"}`,\n `- Stale active continuity loops: ${staleActiveLoops.length > 0 ? staleActiveLoops.map((l) => l.id).join(\", \") : \"none detected\"}`,\n `- Preventive rule coverage on closed incidents: ${\n closedIncidents.some((i) => (i.preventiveRule ?? \"\").trim().length > 0) ? \"present\" : \"not detected\"\n }`,\n \"\",\n \"## Next Hardening Action\",\n `- ${nextAction}`,\n \"\",\n \"## Open Incident IDs\",\n ...(openIncidents.length > 0 ? openIncidents.slice(0, 20).map((i) => `- ${i.id}`) : [\"- (none)\"]),\n \"\",\n ];\n\n const reportPath = await this.storage.writeIdentityAudit(period, key, lines.join(\"\\n\"));\n return { period, key, reportPath };\n }\n\n async readMistakes(): Promise<MistakesFile | null> {\n try {\n const raw = await readFile(this.mistakesPath, \"utf-8\");\n const parsed = JSON.parse(raw) as MistakesFile;\n if (!parsed || !Array.isArray(parsed.patterns)) return null;\n if (!Array.isArray(parsed.registry)) {\n const updatedAt = typeof parsed.updatedAt === \"string\" && parsed.updatedAt.length > 0\n ? parsed.updatedAt\n : new Date(0).toISOString();\n parsed.registry = parsed.patterns.map((pattern) => {\n const metadata = inferLegacyMistakeMetadata(pattern);\n return {\n id: stableMistakeId(metadata.category, pattern, metadata.agent, metadata.workflow),\n pattern,\n category: metadata.category,\n status: \"active\",\n agent: metadata.agent,\n workflow: metadata.workflow,\n tags: [],\n severity: null,\n confidence: null,\n outcome: null,\n provenance: [],\n firstSeenAt: updatedAt,\n lastSeenAt: updatedAt,\n recurrenceCount: 1,\n lastWeekId: isoWeekId(new Date(updatedAt)),\n evidenceWindow: { start: null, end: null },\n };\n });\n }\n return parsed;\n } catch {\n return null;\n }\n }\n\n async readRubrics(): Promise<RubricSnapshot | null> {\n try {\n const raw = await readFile(this.rubricsIndexPath, \"utf-8\");\n const parsed = JSON.parse(raw) as RubricSnapshot;\n if (!parsed || !Array.isArray(parsed.agents) || !Array.isArray(parsed.workflows)) return null;\n parsed.agents = parsed.agents.map((entry) => this.normalizeRubricEntry(entry));\n parsed.workflows = parsed.workflows.map((entry) => this.normalizeRubricEntry(entry));\n return parsed;\n } catch {\n return null;\n }\n }\n\n async readWeeklyArtifact(weekId: string): Promise<WeeklyCompoundingArtifact | null> {\n try {\n const raw = await readFile(path.join(this.weeklyDir, `${weekId}.json`), \"utf-8\");\n const parsed = JSON.parse(raw) as WeeklyCompoundingArtifact;\n if (\n !parsed ||\n parsed.weekId !== weekId ||\n !Array.isArray(parsed.promotionCandidates)\n ) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n }\n\n async buildRecallSection(\n query: string,\n opts?: { maxPatterns?: number; maxRubrics?: number },\n ): Promise<string | null> {\n const [mistakes, rubrics] = await Promise.all([\n this.readMistakes(),\n this.readRubrics(),\n ]);\n const maxPatterns = Math.max(0, Math.floor(opts?.maxPatterns ?? 40));\n const maxRubrics = Math.max(0, Math.floor(opts?.maxRubrics ?? 4));\n const queryTokens = tokenizeRecallQuery(query);\n\n const activePatterns = (mistakes?.registry ?? [])\n .filter((entry) => entry.status === \"active\")\n .sort((a, b) =>\n b.recurrenceCount - a.recurrenceCount ||\n b.lastSeenAt.localeCompare(a.lastSeenAt) ||\n a.pattern.localeCompare(b.pattern),\n );\n const topPatterns = activePatterns.slice(0, maxPatterns);\n\n const allRubrics = [\n ...(rubrics?.workflows ?? []),\n ...(rubrics?.agents ?? []),\n ];\n const scoredRubrics = allRubrics\n .map((entry) => ({\n entry,\n score: this.scoreRubricForQuery(entry, queryTokens),\n }))\n .sort((a, b) =>\n b.score - a.score ||\n b.entry.observations.length - a.entry.observations.length ||\n a.entry.subject.localeCompare(b.entry.subject),\n );\n const topRubrics = scoredRubrics\n .filter((item) => item.score > 0 || queryTokens.length === 0)\n .slice(0, maxRubrics)\n .map((item) => item.entry);\n\n if (topPatterns.length === 0 && topRubrics.length === 0) return null;\n\n const lines: string[] = [\n \"## Institutional Learning (Compounded)\",\n \"\",\n ];\n\n if (topPatterns.length > 0) {\n lines.push(\"Avoid repeating these patterns:\");\n for (const entry of topPatterns) {\n const scope = entry.workflow ?? entry.agent ?? null;\n const metadata = [`recurrence=${entry.recurrenceCount}`];\n if (scope) metadata.push(`scope=${scope}`);\n lines.push(`- ${entry.pattern} _(${metadata.join(\", \")})_`);\n }\n lines.push(\"\");\n }\n\n if (topRubrics.length > 0) {\n lines.push(\"Active rubrics:\");\n for (const rubric of topRubrics) {\n const notes = rubric.observations.slice(0, 2).join(\"; \");\n lines.push(`- ${rubric.kind} ${rubric.subject}: ${notes}`);\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n tierMigrationCycleBudget(trigger: TierMigrationCycleTrigger): TierMigrationCycleBudget {\n return defaultTierMigrationCycleBudget(this.config, trigger);\n }\n\n private async readFeedbackEntriesForWeek(weekId: string): Promise<FeedbackEntryWithProvenance[]> {\n // Minimal implementation: includes entries where date starts with any day in the ISO week.\n // We approximate by taking all entries and filtering by computed isoWeekId(date).\n const out: FeedbackEntryWithProvenance[] = [];\n try {\n const raw = await readFile(this.feedbackInboxPath, \"utf-8\");\n const lines = raw.split(\"\\n\");\n for (let idx = 0; idx < lines.length; idx += 1) {\n const line = lines[idx];\n if (!line.trim()) continue;\n try {\n const obj = JSON.parse(line);\n const parsed = SharedFeedbackEntrySchema.safeParse(obj);\n if (!parsed.success) continue;\n const d = new Date(parsed.data.date);\n if (!Number.isFinite(d.getTime())) continue;\n if (isoWeekId(d) !== weekId) continue;\n const sourceLine = idx + 1;\n out.push({\n entry: parsed.data,\n sourceLine,\n sourcePath: this.feedbackInboxPath,\n entryId: `${parsed.data.agent}-${parsed.data.date}-${sourceLine}`.replace(/[^a-zA-Z0-9._:-]/g, \"_\"),\n });\n } catch {\n // ignore\n }\n }\n } catch {\n // missing feedback is normal\n }\n return out;\n }\n\n private buildActionFailurePatterns(events: WeeklyActionEvent[]): string[] {\n const out: string[] = [];\n for (const event of events) {\n const failed = event.outcome === \"failed\" || event.outcome === \"skipped\";\n if (!failed && event.policyDecision === null) continue;\n const suffix = event.reason && event.reason.trim().length > 0\n ? ` - ${event.reason.trim().slice(0, 140)}`\n : \"\";\n out.push(\n `memory-action/${event.namespace}: ${event.action} ${event.outcome}${event.policyDecision ? `/${event.policyDecision}` : \"\"}${suffix}`,\n );\n }\n return out;\n }\n\n private async readActionEventsForWeek(weekId: string): Promise<WeeklyActionEvent[]> {\n const out: WeeklyActionEvent[] = [];\n const rows = await this.storage.readMemoryActionEventRows(Number.MAX_SAFE_INTEGER);\n for (const row of rows) {\n const event = row.event;\n const ts = new Date(event.timestamp);\n if (!Number.isFinite(ts.getTime()) || isoWeekId(ts) !== weekId) continue;\n out.push({\n line: row.line,\n action: event.action,\n outcome: event.outcome,\n policyDecision: event.policyDecision === \"deny\" || event.policyDecision === \"defer\"\n ? event.policyDecision\n : null,\n namespace: typeof event.namespace === \"string\" && event.namespace.length > 0 ? event.namespace : \"default\",\n reason: typeof event.reason === \"string\" ? event.reason : null,\n });\n }\n return out;\n }\n\n private buildActionOutcomeSummary(events: WeeklyActionEvent[]): ActionOutcomeSummary[] {\n const byAction = new Map<string, { counts: ActionOutcomeCounts; provenance: Set<string> }>();\n for (const event of events) {\n const key = event.action;\n const acc = byAction.get(key) ?? {\n counts: { applied: 0, skipped: 0, failed: 0 },\n provenance: new Set<string>(),\n };\n if (event.outcome === \"applied\") acc.counts.applied += 1;\n else if (event.outcome === \"skipped\") acc.counts.skipped += 1;\n else acc.counts.failed += 1;\n acc.provenance.add(`${path.basename(this.memoryActionEventsPath)}:L${event.line}`);\n byAction.set(key, acc);\n }\n\n const out: ActionOutcomeSummary[] = [];\n for (const [action, data] of byAction.entries()) {\n const total = data.counts.applied + data.counts.skipped + data.counts.failed;\n if (total <= 0) continue;\n // Conservative weighting: reward applied, penalize skipped/failed.\n const weightedScore = Number((((data.counts.applied * 1) - (data.counts.skipped * 0.5) - (data.counts.failed * 1.5)) / total).toFixed(3));\n out.push({\n action,\n counts: data.counts,\n total,\n weightedScore,\n provenance: [...data.provenance].sort().slice(0, 8),\n });\n }\n out.sort((a, b) => b.total - a.total || b.weightedScore - a.weightedScore || a.action.localeCompare(b.action));\n return out;\n }\n\n private derivePromotionCandidates(\n summary: ActionOutcomeSummary[],\n mistakes: MistakeRegistryEntry[],\n rubrics: RubricSnapshot,\n ): PromotionCandidate[] {\n const deduped = new Map<string, PromotionCandidate>();\n const upsert = (candidate: PromotionCandidate) => {\n const key = `${candidate.category}:${canonicalPromotionContentKey(candidate.content)}`;\n const existing = deduped.get(key);\n if (!existing) {\n deduped.set(key, candidate);\n return;\n }\n const mergedProvenance = [...new Set([...existing.provenance, ...candidate.provenance])];\n if (candidate.score > existing.score) {\n deduped.set(key, {\n ...candidate,\n provenance: mergedProvenance,\n });\n return;\n }\n existing.provenance = mergedProvenance;\n };\n\n for (const item of summary) {\n if (item.total < 3) continue;\n if (item.weightedScore < 0.3) continue;\n const content = normalizePromotedGuidanceContent(\n `Prefer ${item.action} when the same workflow recurs; this week's outcomes were applied=${item.counts.applied}, skipped=${item.counts.skipped}, failed=${item.counts.failed}.`,\n );\n upsert({\n id: stablePromotionCandidateId(\"action-outcome\", item.action, content),\n sourceType: \"action-outcome\",\n subject: item.action,\n category: promotionCategoryForContent(content),\n content,\n score: item.weightedScore,\n rationale: \"High applied ratio with low failure/skips in weekly outcome telemetry.\",\n outcome: item.counts,\n provenance: item.provenance,\n agent: null,\n workflow: \"memory-actions\",\n });\n }\n\n for (const entry of mistakes) {\n if (entry.status !== \"active\") continue;\n if (entry.recurrenceCount < 2) continue;\n const content = normalizePromotedGuidanceContent(lessonContentFromPattern(entry.pattern, entry.agent));\n if (content.length === 0) continue;\n const confidence = entry.confidence ?? 0.75;\n const score = Number(Math.min(0.97, 0.45 + Math.min(entry.recurrenceCount, 6) * 0.08 + confidence * 0.15).toFixed(3));\n upsert({\n id: stablePromotionCandidateId(\"mistake-pattern\", entry.id, content),\n sourceType: \"mistake-pattern\",\n subject: entry.pattern,\n category: promotionCategoryForContent(content),\n content,\n score,\n rationale: `Recurring lesson still active after ${entry.recurrenceCount} confirmations in the mistake registry.`,\n outcome: null,\n provenance: entry.provenance.length > 0 ? entry.provenance : [`mistakes.json#${entry.id}`],\n agent: entry.agent,\n workflow: entry.workflow,\n });\n }\n\n for (const rubric of [...rubrics.workflows, ...rubrics.agents]) {\n for (const observation of this.getRubricObservationEntries(rubric)) {\n if (this.isSyntheticOutcomeRubricObservation(observation.note)) continue;\n const evidenceCount = observation.provenance.length;\n if (evidenceCount < 2) continue;\n const content = normalizePromotedGuidanceContent(observation.note);\n if (content.length === 0) continue;\n const score = Number(Math.min(0.95, 0.5 + Math.min(evidenceCount, 5) * 0.08).toFixed(3));\n upsert({\n id: stablePromotionCandidateId(\"rubric\", `${rubric.id}:${observation.note}`, content),\n sourceType: \"rubric\",\n subject: `${rubric.kind}:${rubric.subject}`,\n category: promotionCategoryForContent(content),\n content,\n score,\n rationale: `Rubric guidance repeated across ${evidenceCount} supporting observations.`,\n outcome: null,\n provenance: observation.provenance,\n agent: rubric.kind === \"agent\" ? rubric.subject : null,\n workflow: rubric.kind === \"workflow\" ? rubric.subject : null,\n });\n }\n }\n\n return [...deduped.values()]\n .sort((a, b) => b.score - a.score || a.subject.localeCompare(b.subject))\n .slice(0, 10);\n }\n\n private buildMistakes(\n entries: FeedbackEntryWithProvenance[],\n actionPatterns: string[] = [],\n weekId: string,\n previousRegistry: MistakeRegistryEntry[] = [],\n ): MistakesFile & { details: PatternWithProvenance[]; registry: MistakeRegistryEntry[] } {\n const patterns: PatternWithProvenance[] = [];\n const evidenceByPattern = new Map<string, {\n category: \"feedback\" | \"action\";\n agent: string | null;\n workflow: string | null;\n tags: Set<string>;\n severity: CompoundingEntrySeverity | null;\n confidence: number | null;\n outcome: string | null;\n timestamps: string[];\n evidenceWindow: EvidenceWindow;\n }>();\n\n for (const wrapped of entries) {\n const e = wrapped.entry;\n const pattern = e.learning && e.learning.trim().length > 0\n ? `${e.agent}: ${e.learning.trim()}`\n : e.decision === \"rejected\"\n ? `${e.agent}: ${e.reason.trim()}`.slice(0, 240)\n : null;\n if (!pattern) continue;\n const provenance = [`${path.basename(wrapped.sourcePath)}:L${wrapped.sourceLine}#${wrapped.entryId}`];\n patterns.push({ pattern, provenance });\n\n const previous = evidenceByPattern.get(pattern) ?? {\n category: \"feedback\" as const,\n agent: e.agent,\n workflow: e.workflow ?? null,\n tags: new Set<string>(),\n severity: e.severity ?? null,\n confidence: normalizeConfidence(e.confidence),\n outcome: e.outcome?.trim() || null,\n timestamps: [],\n evidenceWindow: normalizeEvidenceWindow(e.evidenceWindowStart, e.evidenceWindowEnd),\n };\n for (const tag of normalizeTags(e.tags)) previous.tags.add(tag);\n previous.timestamps.push(e.date);\n if (previous.workflow === null && e.workflow) previous.workflow = e.workflow;\n if (previous.severity === null && e.severity) previous.severity = e.severity;\n if (previous.confidence === null) previous.confidence = normalizeConfidence(e.confidence);\n if (previous.outcome === null && e.outcome) previous.outcome = e.outcome.trim();\n const nextEvidenceWindow = normalizeEvidenceWindow(e.evidenceWindowStart, e.evidenceWindowEnd);\n previous.evidenceWindow = mergeEvidenceWindows(previous.evidenceWindow, nextEvidenceWindow);\n evidenceByPattern.set(pattern, previous);\n }\n\n for (const pattern of actionPatterns) {\n patterns.push({ pattern, provenance: [`${path.basename(this.memoryActionEventsPath)}:*`] });\n const previous = evidenceByPattern.get(pattern) ?? {\n category: \"action\" as const,\n agent: null,\n workflow: \"memory-actions\",\n tags: new Set<string>(),\n severity: \"medium\" as CompoundingEntrySeverity,\n confidence: null,\n outcome: null,\n timestamps: [],\n evidenceWindow: { start: null, end: null },\n };\n evidenceByPattern.set(pattern, previous);\n }\n\n const byPattern = new Map<string, Set<string>>();\n for (const item of patterns) {\n const existing = byPattern.get(item.pattern) ?? new Set<string>();\n for (const provenance of item.provenance) existing.add(provenance);\n byPattern.set(item.pattern, existing);\n }\n\n const details = [...byPattern.entries()]\n .map(([pattern, provenance]) => ({ pattern, provenance: [...provenance].sort() }))\n .slice(0, 500);\n const previousById = new Map(previousRegistry.map((entry) => [entry.id, entry]));\n const previousByPattern = new Map(previousRegistry.map((entry) => [entry.pattern, entry]));\n const registry: MistakeRegistryEntry[] = details.map((detail) => {\n const evidence = evidenceByPattern.get(detail.pattern);\n const id = stableMistakeId(\n evidence?.category ?? \"feedback\",\n detail.pattern,\n evidence?.agent ?? null,\n evidence?.workflow ?? null,\n );\n const previous = previousById.get(id) ?? previousByPattern.get(detail.pattern);\n const timestamps = (evidence?.timestamps ?? []).filter((value) => typeof value === \"string\" && value.length > 0).sort();\n const firstSeenAt = previous?.firstSeenAt ?? timestamps[0] ?? new Date().toISOString();\n const lastSeenAt = timestamps[timestamps.length - 1] ?? previous?.lastSeenAt ?? firstSeenAt;\n return {\n id,\n pattern: detail.pattern,\n category: evidence?.category ?? \"feedback\",\n status: \"active\" as const,\n agent: evidence?.agent ?? null,\n workflow: evidence?.workflow ?? null,\n tags: evidence ? [...evidence.tags].sort() : [],\n severity: evidence?.severity ?? null,\n confidence: evidence?.confidence ?? null,\n outcome: evidence?.outcome ?? null,\n provenance: detail.provenance,\n firstSeenAt,\n lastSeenAt,\n recurrenceCount: previous?.lastWeekId === weekId ? previous.recurrenceCount : (previous?.recurrenceCount ?? 0) + 1,\n lastWeekId: weekId,\n evidenceWindow: evidence?.evidenceWindow ?? { start: null, end: null },\n retiredAt: null,\n } satisfies MistakeRegistryEntry;\n });\n\n const seenIds = new Set(registry.map((entry) => entry.id));\n const seenPatterns = new Set(registry.map((entry) => entry.pattern));\n for (const previous of previousRegistry) {\n if (seenIds.has(previous.id) || seenPatterns.has(previous.pattern)) continue;\n const staleWeeks = weekIdToIndex(weekId) - weekIdToIndex(previous.lastWeekId);\n registry.push({\n ...previous,\n status: staleWeeks >= RETIREMENT_WINDOW_WEEKS ? \"retired\" : previous.status,\n retiredAt: staleWeeks >= RETIREMENT_WINDOW_WEEKS\n ? previous.retiredAt ?? new Date().toISOString()\n : previous.retiredAt ?? null,\n });\n }\n\n registry.sort((a, b) =>\n Number(b.status === \"active\") - Number(a.status === \"active\") ||\n b.recurrenceCount - a.recurrenceCount ||\n b.lastSeenAt.localeCompare(a.lastSeenAt) ||\n a.pattern.localeCompare(b.pattern),\n );\n\n return {\n version: COMPOUNDING_VERSION,\n updatedAt: new Date().toISOString(),\n patterns: details.map((d) => d.pattern),\n details,\n registry,\n };\n }\n\n private formatWeeklyReport(\n weekId: string,\n entries: FeedbackEntryWithProvenance[],\n patterns: string[],\n patternDetails: PatternWithProvenance[],\n continuity: { monthId: string; weeklyPath: string | null; monthlyPath: string | null },\n outcomeSummary: ActionOutcomeSummary[],\n promotionCandidates: PromotionCandidate[],\n ): string {\n const byAgent = new Map<string, FeedbackEntryWithProvenance[]>();\n for (const wrapped of entries) {\n const list = byAgent.get(wrapped.entry.agent) ?? [];\n list.push(wrapped);\n byAgent.set(wrapped.entry.agent, list);\n }\n\n const lines: string[] = [\n `# Weekly Compounding — ${weekId}`,\n \"\",\n \"This file is generated by Engram's compounding engine (v5.0).\",\n \"\",\n \"## Summary\",\n `- Feedback entries: ${entries.length}`,\n `- Mistake patterns: ${patterns.length}`,\n \"\",\n \"## By Agent\",\n ];\n\n if (byAgent.size === 0) {\n lines.push(\"- (none)\");\n } else {\n for (const [agent, list] of Array.from(byAgent.entries()).sort((a, b) => a[0].localeCompare(b[0]))) {\n const approved = list.filter((e) => e.entry.decision === \"approved\").length;\n const awf = list.filter((e) => e.entry.decision === \"approved_with_feedback\").length;\n const rejected = list.filter((e) => e.entry.decision === \"rejected\").length;\n lines.push(`### ${agent}`);\n lines.push(`- approved: ${approved}`);\n lines.push(`- approved_with_feedback: ${awf}`);\n lines.push(`- rejected: ${rejected}`);\n const provenance = list\n .slice(0, 3)\n .map((e) => `${path.basename(e.sourcePath)}:L${e.sourceLine}#${e.entryId}`);\n if (provenance.length > 0) {\n lines.push(`- provenance: ${provenance.join(\", \")}`);\n }\n lines.push(\"\");\n }\n }\n\n lines.push(\"## Patterns (Avoid / Prefer)\");\n if (patterns.length === 0) {\n lines.push(\"- (none yet)\");\n } else {\n const detailMap = new Map(patternDetails.map((d) => [d.pattern, d.provenance]));\n for (const p of patterns.slice(0, 100)) {\n const provenance = detailMap.get(p) ?? [];\n if (provenance.length > 0) {\n lines.push(`- ${p} _(source: ${provenance.join(\", \")})_`);\n } else {\n lines.push(`- ${p}`);\n }\n }\n }\n lines.push(\"\");\n\n lines.push(\"## Outcome Weighting\");\n if (outcomeSummary.length === 0) {\n lines.push(\"- (no action outcomes recorded this week)\");\n } else {\n for (const item of outcomeSummary.slice(0, 20)) {\n lines.push(\n `- ${item.action}: applied=${item.counts.applied}, skipped=${item.counts.skipped}, failed=${item.counts.failed}, weight=${item.weightedScore} _(source: ${item.provenance.join(\", \")})_`,\n );\n }\n }\n lines.push(\"\");\n\n if (this.config.compoundingSemanticEnabled) {\n lines.push(\"## Promotion Candidates (Advisory)\");\n if (promotionCandidates.length === 0) {\n lines.push(\"- (no advisory promotion candidates this week)\");\n } else {\n for (const candidate of promotionCandidates) {\n const outcomeSummaryText = candidate.outcome\n ? ` outcomes[a=${candidate.outcome.applied}, s=${candidate.outcome.skipped}, f=${candidate.outcome.failed}]`\n : \"\";\n lines.push(\n `- [${candidate.sourceType}] ${candidate.subject} -> ${candidate.content} (category=${candidate.category}, score=${candidate.score}, id=${candidate.id}): ${candidate.rationale}${outcomeSummaryText} _(source: ${candidate.provenance.join(\", \")})_`,\n );\n }\n }\n lines.push(\"\");\n lines.push(\"_Advisory only: no automatic promotion write is performed by this report. Use `compounding_promote_candidate` or `openclaw engram compounding-promote` to persist one manually._\");\n lines.push(\"\");\n }\n\n if (this.config.continuityAuditEnabled) {\n lines.push(\"## Continuity Audits\");\n if (continuity.weeklyPath) {\n lines.push(`- weekly: ${continuity.weeklyPath}`);\n } else {\n lines.push(`- weekly: (missing for ${weekId})`);\n }\n if (continuity.monthlyPath) {\n lines.push(`- monthly: ${continuity.monthlyPath}`);\n } else {\n lines.push(`- monthly: (missing for ${continuity.monthId})`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n }\n\n private buildRubricSnapshot(\n entries: FeedbackEntryWithProvenance[],\n outcomeSummary: ActionOutcomeSummary[],\n ): RubricSnapshot {\n const updatedAt = new Date().toISOString();\n const byAgent = new Map<string, RubricSnapshotEntry>();\n const byWorkflow = new Map<string, RubricSnapshotEntry>();\n\n for (const wrapped of entries) {\n const note = ((wrapped.entry.learning && wrapped.entry.learning.trim().length > 0)\n ? wrapped.entry.learning\n : wrapped.entry.decision === \"rejected\"\n ? wrapped.entry.reason\n : \"\").trim();\n if (!note) continue;\n const provenance = `${path.basename(wrapped.sourcePath)}:L${wrapped.sourceLine}#${wrapped.entryId}`;\n const agentEntry = byAgent.get(wrapped.entry.agent) ?? {\n id: stableRubricId(\"agent\", wrapped.entry.agent),\n kind: \"agent\" as const,\n subject: wrapped.entry.agent,\n observations: [],\n tags: [],\n provenance: [],\n observationEntries: [],\n updatedAt,\n };\n this.addRubricObservation(agentEntry, note, provenance);\n agentEntry.tags = normalizeTags([...agentEntry.tags, ...normalizeTags(wrapped.entry.tags)]);\n byAgent.set(wrapped.entry.agent, agentEntry);\n\n const workflow = wrapped.entry.workflow?.trim();\n if (!workflow) continue;\n const workflowEntry = byWorkflow.get(workflow) ?? {\n id: stableRubricId(\"workflow\", workflow),\n kind: \"workflow\" as const,\n subject: workflow,\n observations: [],\n tags: [],\n provenance: [],\n observationEntries: [],\n updatedAt,\n };\n this.addRubricObservation(workflowEntry, note, provenance);\n workflowEntry.tags = normalizeTags([...workflowEntry.tags, ...normalizeTags(wrapped.entry.tags)]);\n byWorkflow.set(workflow, workflowEntry);\n }\n\n for (const item of outcomeSummary) {\n const workflowEntry = byWorkflow.get(item.action) ?? {\n id: stableRubricId(\"workflow\", item.action),\n kind: \"workflow\" as const,\n subject: item.action,\n observations: [],\n tags: [],\n provenance: [],\n observationEntries: [],\n updatedAt,\n };\n this.addRubricObservation(\n workflowEntry,\n `Outcome weight=${item.weightedScore} (applied=${item.counts.applied}, skipped=${item.counts.skipped}, failed=${item.counts.failed})`,\n ...item.provenance,\n );\n byWorkflow.set(item.action, workflowEntry);\n }\n\n return {\n updatedAt,\n agents: [...byAgent.values()].sort((a, b) => a.subject.localeCompare(b.subject)),\n workflows: [...byWorkflow.values()].sort((a, b) => a.subject.localeCompare(b.subject)),\n };\n }\n\n private formatRubrics(outcomeSummary: ActionOutcomeSummary[], snapshot: RubricSnapshot): string {\n const lines: string[] = [\n \"# Compounding Rubrics\",\n \"\",\n `Generated: ${snapshot.updatedAt}`,\n \"\",\n \"Stable, deterministic rubric snapshot generated from weekly feedback + action outcomes.\",\n \"\",\n ];\n\n lines.push(\"## Agent Rubrics\");\n if (snapshot.agents.length === 0) {\n lines.push(\"- (none yet)\");\n } else {\n for (const rubric of snapshot.agents) {\n lines.push(`### ${rubric.subject}`);\n const observations = this.getRubricObservationEntries(rubric).slice(0, 8);\n if (observations.length === 0) {\n lines.push(\"- No rubric deltas this week.\");\n } else {\n for (const observation of observations) {\n const provenance = observation.provenance.join(\", \");\n lines.push(`- ${observation.note}${provenance ? ` _(source: ${provenance})_` : \"\"}`);\n }\n }\n lines.push(\"\");\n }\n }\n\n lines.push(\"## Workflow Rubrics\");\n if (snapshot.workflows.length === 0) {\n lines.push(\"- (none yet)\");\n } else {\n for (const rubric of snapshot.workflows) {\n lines.push(`### ${rubric.subject}`);\n for (const observation of this.getRubricObservationEntries(rubric).slice(0, 8)) {\n const provenance = observation.provenance.join(\", \");\n lines.push(`- ${observation.note}${provenance ? ` _(source: ${provenance})_` : \"\"}`);\n }\n lines.push(\"\");\n }\n }\n\n lines.push(\"## Action Outcome Signals\");\n if (outcomeSummary.length === 0) {\n lines.push(\"- (none yet)\");\n } else {\n for (const item of outcomeSummary.slice(0, 20)) {\n lines.push(\n `- ${item.action}: weight=${item.weightedScore} (applied=${item.counts.applied}, skipped=${item.counts.skipped}, failed=${item.counts.failed})`,\n );\n }\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n private async syncRubricArtifacts(snapshot: RubricSnapshot): Promise<void> {\n await this.replaceRubricDirectory(this.rubricsAgentsDir, snapshot.agents);\n await this.replaceRubricDirectory(this.rubricsWorkflowsDir, snapshot.workflows);\n }\n\n private async replaceRubricDirectory(dir: string, entries: RubricSnapshotEntry[]): Promise<void> {\n await mkdir(dir, { recursive: true });\n try {\n const names = await readdir(dir);\n await Promise.all(\n names.filter((name) => name.endsWith(\".md\")).map((name) => unlink(path.join(dir, name)).catch(() => undefined)),\n );\n } catch {\n // fail-open\n }\n\n const slugCollisions = new Map<string, number>();\n for (const entry of entries) {\n const slug = stableSlug(entry.subject);\n slugCollisions.set(slug, (slugCollisions.get(slug) ?? 0) + 1);\n }\n\n await Promise.all(entries.map(async (entry) => {\n const observationEntries = this.getRubricObservationEntries(entry);\n const body = [\n `# ${entry.kind === \"agent\" ? \"Agent\" : \"Workflow\"} Rubric — ${entry.subject}`,\n \"\",\n `Updated: ${entry.updatedAt}`,\n \"\",\n \"## Observations\",\n ...(observationEntries.length > 0\n ? observationEntries.map((item) => `- ${item.note}`)\n : [\"- (none yet)\"]),\n \"\",\n \"## Provenance\",\n ...(entry.provenance.length > 0 ? entry.provenance.map((item) => `- ${item}`) : [\"- (none yet)\"]),\n \"\",\n ].join(\"\\n\");\n const fileName = rubricArtifactFileName(entry, slugCollisions);\n await writeFile(path.join(dir, fileName), body, \"utf-8\");\n }));\n }\n\n private scoreRubricForQuery(entry: RubricSnapshotEntry, queryTokens: string[]): number {\n if (queryTokens.length === 0) return entry.observations.length;\n const haystack = [entry.subject, ...entry.observations, ...entry.tags].join(\" \").toLowerCase();\n let score = 0;\n for (const token of queryTokens) {\n if (haystack.includes(token)) score += 2;\n if (entry.subject.toLowerCase().includes(token)) score += 2;\n }\n if (score === 0) return 0;\n return score + Math.min(entry.observations.length, 3);\n }\n\n private normalizeRubricEntry(entry: RubricSnapshotEntry): RubricSnapshotEntry {\n const normalizedEntries = this.getRubricObservationEntries(entry);\n return {\n ...entry,\n observations: normalizedEntries.map((item) => item.note),\n provenance: [...new Set(normalizedEntries.flatMap((item) => item.provenance))],\n observationEntries: normalizedEntries,\n };\n }\n\n private getRubricObservationEntries(entry: RubricSnapshotEntry): Array<{ note: string; provenance: string[] }> {\n if (Array.isArray(entry.observationEntries) && entry.observationEntries.length > 0) {\n return entry.observationEntries.map((item) => ({\n note: item.note,\n provenance: [...new Set(item.provenance)].sort(),\n }));\n }\n\n return entry.observations.map((note, index) => ({\n note,\n provenance: entry.provenance[index] ? [entry.provenance[index]] : (entry.provenance[0] ? [entry.provenance[0]] : []),\n }));\n }\n\n private isSyntheticOutcomeRubricObservation(note: string): boolean {\n return note.trimStart().startsWith(\"Outcome weight=\");\n }\n\n private addRubricObservation(entry: RubricSnapshotEntry, note: string, ...provenance: string[]): void {\n const normalized = this.normalizeRubricEntry(entry);\n const existing = normalized.observationEntries?.find((item) => item.note === note);\n if (existing) {\n existing.provenance = [...new Set([...existing.provenance, ...provenance])].sort();\n } else {\n normalized.observationEntries?.push({\n note,\n provenance: [...new Set(provenance)].sort(),\n });\n }\n entry.observationEntries = normalized.observationEntries;\n entry.observations = normalized.observationEntries?.map((item) => item.note) ?? [];\n entry.provenance = [...new Set((normalized.observationEntries ?? []).flatMap((item) => item.provenance))];\n }\n\n private async readOptionalIdentityAnchorForAudit(): Promise<string | null> {\n try {\n return await this.storage.readIdentityAnchor();\n } catch {\n return null;\n }\n }\n\n private async readOptionalImprovementLoopsForAudit(): Promise<string | null> {\n try {\n return await this.storage.readIdentityImprovementLoops();\n } catch {\n return null;\n }\n }\n\n private async readContinuityIncidentsForAudit(\n limit: number,\n state: \"open\" | \"closed\",\n ): Promise<ContinuityIncidentRecord[]> {\n try {\n return await this.storage.readContinuityIncidents(limit, state);\n } catch {\n return [];\n }\n }\n\n private async readOptionalIdentityAuditForReference(\n period: \"weekly\" | \"monthly\",\n key: string,\n ): Promise<string | null> {\n try {\n return await this.storage.readIdentityAudit(period, key);\n } catch {\n return null;\n }\n }\n\n private async readContinuityAuditReferences(weekId: string): Promise<{\n weekId: string;\n monthId: string;\n weeklyPath: string | null;\n monthlyPath: string | null;\n }> {\n const monthId = monthIdFromIsoWeek(weekId);\n const weeklyPath = path.join(this.identityAuditWeeklyDir, `${weekId}.md`);\n const monthlyPath = path.join(this.identityAuditMonthlyDir, `${monthId}.md`);\n const [weeklyAudit, monthlyAudit] = await Promise.all([\n this.readOptionalIdentityAuditForReference(\"weekly\", weekId),\n this.readOptionalIdentityAuditForReference(\"monthly\", monthId),\n ]);\n const weeklyExists = (weeklyAudit ?? \"\").trim().length > 0;\n const monthlyExists = (monthlyAudit ?? \"\").trim().length > 0;\n return {\n weekId,\n monthId,\n weeklyPath: weeklyExists ? weeklyPath : null,\n monthlyPath: monthlyExists ? monthlyPath : null,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,OAAO,UAAU,SAAS,QAAQ,iBAAiB;AAC5D,OAAO,UAAU;AAqKjB,IAAM,sBAAsB;AAC5B,IAAM,0BAA0B;AAEhC,SAAS,WAAW,OAAuB;AACzC,SAAO,MACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE,KAAK;AACrB;AAEA,SAAS,oBAAoB,MAAwB;AACnD,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AACvB,aAAW,SAAS,KACjB,YAAY,EACZ,QAAQ,iBAAiB,GAAG,EAC5B,MAAM,KAAK,EACX,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC,GAAG;AACrC,QAAI,KAAK,IAAI,KAAK,EAAG;AACrB,SAAK,IAAI,KAAK;AACd,QAAI,KAAK,KAAK;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,cAAc,QAAwB;AAC7C,QAAM,QAAQ,OAAO,MAAM,oBAAoB;AAC/C,MAAI,CAAC,MAAO,QAAO,OAAO;AAC1B,QAAM,OAAO,OAAO,MAAM,CAAC,CAAC;AAC5B,QAAM,OAAO,OAAO,MAAM,CAAC,CAAC;AAC5B,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,IAAI;AAC/E,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,OAAO,IAAI,KAAK,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC;AAC1C,QAAM,UAAU,KAAK,UAAU,KAAK;AACpC,QAAM,kBAAkB,IAAI,KAAK,IAAI;AACrC,kBAAgB,WAAW,KAAK,WAAW,KAAK,UAAU,EAAE;AAC5D,QAAM,kBAAkB,IAAI,KAAK,eAAe;AAChD,kBAAgB,WAAW,gBAAgB,WAAW,KAAM,OAAO,KAAK,CAAE;AAC1E,SAAO,KAAK,MAAM,gBAAgB,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,IAAK;AACzE;AAEA,SAAS,oBAAoB,OAA+B;AAC1D,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACjE,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAC9C,SAAO,OAAO,QAAQ,QAAQ,CAAC,CAAC;AAClC;AAEA,SAAS,cAAc,MAAsC;AAC3D,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC;AAClC,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,OAAO,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK;AAClG;AAEA,SAAS,wBAAwB,OAAgB,KAA8B;AAC7E,QAAM,YAAY,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IAAI,QAAQ;AACjF,QAAM,UAAU,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAE,SAAS,IAAI,MAAM;AACzE,SAAO,EAAE,OAAO,WAAW,KAAK,QAAQ;AAC1C;AAEA,SAAS,qBAAqB,SAAyB,MAAsC;AAC3F,SAAO;AAAA,IACL,OAAO,QAAQ,UAAU,OAAO,KAAK,QAAQ,KAAK,UAAU,OAAO,QAAQ,QAAQ,QAAQ,SAAS,KAAK,QAAQ,QAAQ,QAAQ,KAAK;AAAA,IACtI,KAAK,QAAQ,QAAQ,OAAO,KAAK,MAAM,KAAK,QAAQ,OAAO,QAAQ,MAAM,QAAQ,OAAO,KAAK,MAAM,QAAQ,MAAM,KAAK;AAAA,EACxH;AACF;AAEA,SAAS,gBACP,UACA,SACA,OACA,UACQ;AACR,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,WAAW,KAAK,IAAI;AAAA,IAC5B,WAAW,WAAW,QAAQ,IAAI;AAAA,IAClC,WAAW,OAAO,EAAE,MAAM,GAAG,EAAE;AAAA,EACjC,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,eAAe,MAA4B,SAAyB;AAC3E,SAAO,GAAG,IAAI,IAAI,WAAW,OAAO,CAAC;AACvC;AAEA,SAAS,2BACP,YACA,SACA,SACQ;AACR,QAAM,SAAS,WAAW,QAAQ,EAC/B,OAAO,GAAG,UAAU,KAAS,OAAO,KAAS,OAAO,EAAE,EACtD,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AACd,SAAO,GAAG,UAAU,IAAI,MAAM;AAChC;AAEA,SAAS,uBACP,OACA,gBACQ;AACR,QAAM,OAAO,WAAW,MAAM,OAAO;AACrC,OAAK,eAAe,IAAI,IAAI,KAAK,MAAM,EAAG,QAAO,GAAG,IAAI;AACxD,QAAM,SAAS,WAAW,QAAQ,EAAE,OAAO,GAAG,MAAM,IAAI,IAAI,MAAM,OAAO,EAAE,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AACrG,SAAO,GAAG,IAAI,IAAI,MAAM;AAC1B;AAEA,SAAS,wBAAwB,SAAoE;AACnG,QAAM,iBAAiB,QAAQ,QAAQ,GAAG;AAC1C,MAAI,kBAAkB,EAAG,QAAO,EAAE,OAAO,MAAM,UAAU,KAAK;AAC9D,QAAM,UAAU,QAAQ,MAAM,GAAG,cAAc,EAAE,KAAK;AACtD,SAAO;AAAA,IACL,OAAO,QAAQ,SAAS,IAAI,UAAU;AAAA,IACtC,UAAU;AAAA,EACZ;AACF;AAEA,SAAS,2BAA2B,SAIlC;AACA,MAAI,QAAQ,WAAW,gBAAgB,GAAG;AACxC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,IACZ;AAAA,EACF;AACA,QAAM,QAAQ,wBAAwB,OAAO;AAC7C,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,EAClB;AACF;AAEA,SAAS,6BAA6B,OAAuB;AAC3D,SAAO,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzC;AAEA,SAAS,kCAAkC,OAAuB;AAChE,SAAO,MAAM,QAAQ,YAAY,EAAE,EAAE,KAAK;AAC5C;AAEA,SAAS,0BAA0B,OAA8B;AAC/D,QAAM,aAAa,6BAA6B,KAAK;AACrD,QAAM,QAAQ,WAAW,MAAM,+CAA+C;AAC9E,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,YAAY,kCAAkC,6BAA6B,MAAM,CAAC,KAAK,EAAE,CAAC;AAChG,QAAM,UAAU,kCAAkC,6BAA6B,MAAM,CAAC,KAAK,EAAE,CAAC;AAC9F,MAAI,UAAU,WAAW,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC3D,SAAO,MAAM,SAAS,SAAS,OAAO;AACxC;AAEA,SAAS,iCAAiC,OAAuB;AAC/D,QAAM,eAAe,0BAA0B,KAAK;AACpD,MAAI,aAAc,QAAO;AACzB,QAAM,aAAa,6BAA6B,KAAK;AACrD,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,SAAO,SAAS,KAAK,UAAU,IAAI,aAAa,GAAG,UAAU;AAC/D;AAEA,SAAS,6BAA6B,OAAuB;AAC3D,SAAO,iCAAiC,KAAK,EAAE,YAAY;AAC7D;AAEA,SAAS,yBAAyB,SAAiB,OAA8B;AAC/E,MAAI,CAAC,MAAO,QAAO,6BAA6B,OAAO;AACvD,QAAM,SAAS,GAAG,KAAK;AACvB,MAAI,CAAC,QAAQ,WAAW,MAAM,EAAG,QAAO,6BAA6B,OAAO;AAC5E,QAAM,gBAAgB,QAAQ,MAAM,OAAO,MAAM,EAAE,KAAK;AACxD,SAAO,cAAc,SAAS,IAAI,6BAA6B,aAAa,IAAI,6BAA6B,OAAO;AACtH;AAEA,SAAS,4BAA4B,SAAuC;AAC1E,SAAO,0BAA0B,OAAO,IAAI,SAAS;AACvD;AAEA,SAAS,oBAAoB,OAAuB;AAClD,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,SAAO,OAAO,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC;AAChE;AASO,SAAS,gCACd,QACA,SAC0B;AAC1B,MAAI,YAAY,cAAc;AAC5B,UAAMA,SAAQ;AACd,WAAO;AAAA,MACL,OAAAA;AAAA,MACA,WAAWA,SAAQ;AAAA,MACnB,eAAe;AAAA,IACjB;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,6BAA6B,MAAM;AACxD,SAAO;AAAA,IACL;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,eAAe,OAAO,6BAA6B,OAAU;AAAA,EAC/D;AACF;AAEA,SAAS,UAAU,GAAiB;AAElC,QAAM,KAAK,IAAI,KAAK,KAAK,IAAI,EAAE,eAAe,GAAG,EAAE,YAAY,GAAG,EAAE,WAAW,CAAC,CAAC;AACjF,QAAM,MAAM,GAAG,UAAU,KAAK;AAC9B,KAAG,WAAW,GAAG,WAAW,IAAI,IAAI,GAAG;AACvC,QAAM,YAAY,IAAI,KAAK,KAAK,IAAI,GAAG,eAAe,GAAG,GAAG,CAAC,CAAC;AAC9D,QAAM,OAAO,KAAK,OAAQ,GAAG,QAAQ,IAAI,UAAU,QAAQ,KAAK,QAAY,KAAK,CAAC;AAClF,QAAM,OAAO,GAAG,eAAe;AAC/B,SAAO,GAAG,IAAI,KAAK,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC;AAClD;AAEA,SAAS,WAAW,GAAiB;AACnC,SAAO,GAAG,EAAE,eAAe,CAAC,IAAI,OAAO,EAAE,YAAY,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAC9E;AAEA,SAAS,mBAAmB,QAAwB;AAClD,QAAM,QAAQ,OAAO,MAAM,oBAAoB;AAC/C,MAAI,CAAC,MAAO,QAAO,WAAW,oBAAI,KAAK,CAAC;AACxC,QAAM,OAAO,OAAO,MAAM,CAAC,CAAC;AAC5B,QAAM,OAAO,OAAO,MAAM,CAAC,CAAC;AAC5B,QAAM,OAAO,IAAI,KAAK,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC;AAC1C,QAAM,UAAU,KAAK,UAAU,KAAK;AACpC,QAAM,mBAAmB,IAAI,KAAK,IAAI;AACtC,mBAAiB,WAAW,KAAK,WAAW,KAAK,UAAU,EAAE;AAC7D,QAAM,SAAS,IAAI,KAAK,gBAAgB;AACxC,SAAO,WAAW,iBAAiB,WAAW,KAAK,OAAO,KAAK,CAAC;AAChE,SAAO,WAAW,MAAM;AAC1B;AAEA,SAAS,qBAAqB,SAA+D;AAC3F,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,IAAI,KAAK,KAAK,KAAK;AAAA,IAC5B,KAAK;AACH,aAAO,KAAK,KAAK,KAAK,KAAK;AAAA,IAC7B,KAAK;AACH,aAAO,KAAK,KAAK,KAAK,KAAK;AAAA,IAC7B,KAAK;AACH,aAAO,MAAM,KAAK,KAAK,KAAK;AAAA,IAC9B;AACE,aAAO,KAAK,KAAK,KAAK,KAAK;AAAA,EAC/B;AACF;AAEO,IAAM,oBAAN,MAAwB;AAAA,EAa7B,YACmB,QACA,UAA0B,IAAI,eAAe,OAAO,SAAS,GAC9E;AAFiB;AACA;AAEjB,SAAK,YAAY,KAAK,KAAK,OAAO,WAAW,eAAe,QAAQ;AACpE,SAAK,aAAa,KAAK,KAAK,OAAO,WAAW,eAAe,SAAS;AACtE,SAAK,mBAAmB,KAAK,KAAK,KAAK,YAAY,YAAY;AAC/D,SAAK,mBAAmB,KAAK,KAAK,KAAK,YAAY,QAAQ;AAC3D,SAAK,sBAAsB,KAAK,KAAK,KAAK,YAAY,WAAW;AACjE,SAAK,cAAc,KAAK,KAAK,OAAO,WAAW,eAAe,YAAY;AAC1E,SAAK,eAAe,KAAK,KAAK,OAAO,WAAW,eAAe,eAAe;AAC9E,SAAK,oBAAoB,KAAK,KAAK,wBAAwB,MAAM,GAAG,YAAY,aAAa;AAC7F,SAAK,yBAAyB,KAAK,KAAK,OAAO,WAAW,YAAY,UAAU,QAAQ;AACxF,SAAK,0BAA0B,KAAK,KAAK,OAAO,WAAW,YAAY,UAAU,SAAS;AAC1F,SAAK,yBAAyB,KAAK,KAAK,OAAO,WAAW,SAAS,sBAAsB;AAAA,EAC3F;AAAA,EAdmB;AAAA,EACA;AAAA,EAdF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAmBjB,MAAM,aAA4B;AAChC,UAAM,MAAM,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC;AAC/C,UAAM,MAAM,KAAK,QAAQ,KAAK,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAChE,UAAM,MAAM,KAAK,QAAQ,KAAK,WAAW,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/D,UAAM,MAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAChD,UAAM,MAAM,KAAK,kBAAkB,EAAE,WAAW,KAAK,CAAC;AACtD,UAAM,MAAM,KAAK,qBAAqB,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3D;AAAA,EAEA,MAAM,iBAAiB,MAUpB;AACD,UAAM,KAAK,WAAW;AACtB,UAAM,SAAS,MAAM,UAAU,UAAU,oBAAI,KAAK,CAAC;AAEnD,UAAM,UAAU,MAAM,KAAK,2BAA2B,MAAM;AAC5D,UAAM,eAAe,MAAM,KAAK,wBAAwB,MAAM;AAC9D,UAAM,iBAAiB,KAAK,2BAA2B,YAAY;AACnE,UAAM,iBAAiB,KAAK,0BAA0B,YAAY;AAClE,UAAM,mBAAmB,MAAM,KAAK,aAAa;AACjD,UAAM,WAAW,KAAK,cAAc,SAAS,gBAAgB,QAAQ,kBAAkB,YAAY,CAAC,CAAC;AACrG,UAAM,UAAU,KAAK,oBAAoB,SAAS,cAAc;AAChE,QAAI,sBAAsB,KAAK,OAAO,6BAClC,KAAK,0BAA0B,gBAAgB,SAAS,UAAU,OAAO,IACzE,CAAC;AACL,QAAI,KAAK,OAAO,yBAAyB;AACvC,UAAI;AACF,cAAM,EAAE,iCAAiC,oCAAoC,IAAI,MAAM,OAAO,2BAA4B;AAC1H,cAAM,mBAAmB,MAAM,gCAAgC;AAAA,UAC7D,WAAW,KAAK,OAAO;AAAA,UACvB,0BAA0B,KAAK,OAAO;AAAA,UACtC,eAAe,KAAK,OAAO;AAAA,UAC3B,gBAAgB,KAAK,OAAO,gBAAgB,YAAa,KAAK,OAAO,kBAAkB,SAAa;AAAA,UACpG,YAAY,KAAK,OAAO,gBAAgB,YAAY,KAAK,OAAO,iBAAiB;AAAA,UACjF,cAAc,KAAK,OAAO;AAAA,UAC1B,cAAc,KAAK;AAAA,UACnB,QAAQ;AAAA,YACN,eAAe,KAAK,OAAO;AAAA,YAC3B,aAAa,KAAK,OAAO;AAAA,YACzB,kBAAkB,KAAK,OAAO;AAAA,UAChC;AAAA,QACF,CAAC;AACD,YAAI,iBAAiB,SAAS,GAAG;AAC/B,gCAAsB,CAAC,GAAG,qBAAqB,GAAG,gBAAgB;AAAA,QACpE;AAQA,YAAI;AACF,gBAAM,oCAAoC;AAAA,YACxC,QAAQ,KAAK;AAAA,YACb,WAAW,KAAK,OAAO;AAAA,UACzB,CAAC;AAAA,QACH,SAAS,kBAAkB;AACzB,cAAI;AAAA,YACF,yDACE,4BAA4B,QAAQ,iBAAiB,UAAU,OAAO,gBAAgB,CACxF;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,YAAI,KAAK,sEAAsE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,MACzI;AAAA,IACF;AAEA,QAAI,KAAK,OAAO,oBAAoB;AAClC,UAAI;AACF,cAAM,EAAE,4BAA4B,IAAI,MAAM,OAAO,kBAAmB;AACxE,cAAM,WAAW,MAAM,4BAA4B;AAAA,UACjD,WAAW,KAAK,OAAO;AAAA,UACvB,eAAe,KAAK,OAAO;AAAA,UAC3B,gBAAgB,KAAK,OAAO,gBAAgB,YAAa,KAAK,OAAO,kBAAkB,SAAa;AAAA,UACpG,YAAY,KAAK,OAAO,gBAAgB,YAAY,KAAK,OAAO,iBAAiB;AAAA,UACjF,cAAc,KAAK,OAAO;AAAA,QAC5B,CAAC;AACD,YAAI,MAAM,2CAA2C,SAAS,MAAM,sBAAsB;AAAA,MAC5F,SAAS,OAAO;AACd,YAAI,KAAK,0DAA0D,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,MAC7H;AAAA,IACF;AACA,UAAM,aAAa,KAAK,OAAO,yBAC3B,MAAM,KAAK,8BAA8B,MAAM,IAC/C,EAAE,SAAS,mBAAmB,MAAM,GAAG,YAAY,MAAM,aAAa,KAAK;AAG/E,UAAM,aAAa,KAAK,KAAK,KAAK,WAAW,GAAG,MAAM,KAAK;AAC3D,UAAM,KAAK,KAAK,mBAAmB,QAAQ,SAAS,SAAS,UAAU,SAAS,SAAS,YAAY,gBAAgB,mBAAmB;AACxI,UAAM,UAAU,YAAY,IAAI,OAAO;AAEvC,UAAM,iBAAiB,KAAK,KAAK,KAAK,WAAW,GAAG,MAAM,OAAO;AACjE,UAAM,iBAA4C;AAAA,MAChD,SAAS;AAAA,MACT,aAAa,SAAS;AAAA,MACtB;AAAA,MACA,UAAU;AAAA,QACR,OAAO,QAAQ;AAAA,QACf,YAAY;AAAA,UACV,UAAU,QAAQ,OAAO,CAAC,YAAY,QAAQ,MAAM,aAAa,UAAU,EAAE;AAAA,UAC7E,wBAAwB,QAAQ,OAAO,CAAC,YAAY,QAAQ,MAAM,aAAa,wBAAwB,EAAE;AAAA,UACzG,UAAU,QAAQ,OAAO,CAAC,YAAY,QAAQ,MAAM,aAAa,UAAU,EAAE;AAAA,QAC/E;AAAA,QACA,SAAS,QAAQ,IAAI,CAAC,aAAa;AAAA,UACjC,OAAO,QAAQ,MAAM;AAAA,UACrB,UAAU,QAAQ,MAAM,YAAY;AAAA,UACpC,UAAU,QAAQ,MAAM;AAAA,UACxB,QAAQ,QAAQ,MAAM;AAAA,UACtB,UAAU,QAAQ,MAAM,UAAU,KAAK,KAAK;AAAA,UAC5C,SAAS,QAAQ,MAAM,SAAS,KAAK,KAAK;AAAA,UAC1C,UAAU,QAAQ,MAAM,YAAY;AAAA,UACpC,YAAY,oBAAoB,QAAQ,MAAM,UAAU;AAAA,UACxD,MAAM,cAAc,QAAQ,MAAM,IAAI;AAAA,UACtC,YAAY,GAAG,KAAK,SAAS,QAAQ,UAAU,CAAC,KAAK,QAAQ,UAAU,IAAI,QAAQ,OAAO;AAAA,UAC1F,gBAAgB,wBAAwB,QAAQ,MAAM,qBAAqB,QAAQ,MAAM,iBAAiB;AAAA,QAC5G,EAAE;AAAA,MACJ;AAAA,MACA,UAAU;AAAA,QACR,OAAO,SAAS,SAAS;AAAA,QACzB,UAAU,SAAS;AAAA,QACnB,UAAU,SAAS;AAAA,MACrB;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,IACF;AACA,UAAM,UAAU,gBAAgB,KAAK,UAAU,gBAAgB,MAAM,CAAC,IAAI,MAAM,OAAO;AAGvF,UAAM,kBAAkB,KAAK,cAAc,gBAAgB,OAAO;AAClE,UAAM,UAAU,KAAK,aAAa,iBAAiB,OAAO;AAC1D,UAAM,UAAU,KAAK,kBAAkB,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI,MAAM,OAAO;AACvF,UAAM,KAAK,oBAAoB,OAAO;AAGtC,UAAM;AAAA,MACJ,KAAK;AAAA,MACL,KAAK,UAAU;AAAA,QACb,SAAS;AAAA,QACT,WAAW,SAAS;AAAA,QACpB,UAAU,SAAS;AAAA,QACnB,UAAU,SAAS;AAAA,MACrB,GAAG,MAAM,CAAC,IAAI;AAAA,MACd;AAAA,IACF;AAEA,QAAI;AAAA,MACF,6BAA6B,UAAU,eAAe,cAAc,YAAY,KAAK,WAAW,iBAAiB,KAAK,gBAAgB,aAAa,KAAK,YAAY;AAAA,IACtK;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,kBAAkB,KAAK;AAAA,MACvB,eAAe,SAAS,SAAS;AAAA,MACjC,yBAAyB,oBAAoB;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,MAKiB;AACtC,UAAM,SAAqC;AAAA,MACzC,SAAS,KAAK,OAAO,uBAAuB,QAAQ,KAAK,OAAO,+BAA+B;AAAA,MAC/F,QAAQ,KAAK,WAAW;AAAA,MACxB,QAAQ,KAAK;AAAA,MACb,UAAU,CAAC;AAAA,MACX,SAAS,CAAC;AAAA,IACZ;AACA,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK,QAAQ,aAAa,KAAK,aAAa,QAAQ,WAAW,CAAC;AAC9F,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,MAAM,KAAK,mBAAmB,KAAK,MAAM;AAC1D,QAAI,CAAC,UAAU;AACb,aAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK,QAAQ,aAAa,KAAK,aAAa,QAAQ,0BAA0B,CAAC;AAC7G,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,SAAS,oBAAoB,KAAK,CAAC,UAAU,MAAM,OAAO,KAAK,WAAW;AAC5F,QAAI,CAAC,WAAW;AACd,aAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK,QAAQ,aAAa,KAAK,aAAa,QAAQ,sBAAsB,CAAC;AACzG,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,iCAAiC,UAAU,OAAO;AAClE,UAAM,mBAAmB,sBAAsB,OAAO,EAAE;AACxD,UAAM,UAAU,KAAK,WAAW,IAAI,eAAe,KAAK,OAAO,SAAS;AACxE,UAAM,YAAY,MAAM,QAAQ,gBAAgB,GAAG;AAAA,MAAK,CAAC,WACvD,OAAO,YAAY,aAAa,UAAU,YAC1C,OAAO,YAAY,WAAW,cAC9B,OAAO,YAAY,WAAW,eAC9B,6BAA6B,OAAO,OAAO,MAAM,6BAA6B,gBAAgB;AAAA,IAChG;AACA,QAAI,UAAU;AACZ,aAAO,QAAQ,KAAK;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,aAAa,KAAK;AAAA,QAClB,QAAQ;AAAA,QACR,kBAAkB,SAAS,YAAY;AAAA,MACzC,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA,sBAAsB,UAAU,UAAU;AAAA,MAC1C,GAAI,UAAU,QAAQ,CAAC,SAAS,WAAW,UAAU,KAAK,CAAC,EAAE,IAAI,CAAC;AAAA,MAClE,GAAI,UAAU,WAAW,CAAC,YAAY,WAAW,UAAU,QAAQ,CAAC,EAAE,IAAI,CAAC;AAAA,IAC7E;AACA,UAAM,aAAa,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AACpC,UAAM,UAAU,CAAC,eAAe,KAAK,MAAM,IAAI,KAAK,WAAW,EAAE;AACjE,UAAM,aAAa,oBAAoB,UAAU,KAAK;AAEtD,QAAI,KAAK,WAAW,MAAM;AACxB,aAAO,SAAS,KAAK;AAAA,QACnB,IAAI,WAAW,KAAK,MAAM,IAAI,KAAK,WAAW;AAAA,QAC9C,aAAa,KAAK;AAAA,QAClB,UAAU,UAAU;AAAA,QACpB,SAAS;AAAA,QACT;AAAA,QACA,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,KAAK,MAAM,QAAQ,YAAY,UAAU,UAAU,kBAAkB;AAAA,MACzE,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AACD,WAAO,SAAS,KAAK;AAAA,MACnB;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,UAAU,UAAU;AAAA,MACpB,SAAS;AAAA,MACT;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,0BAA0B,MAG+C;AAC7E,UAAM,SAAS,MAAM,WAAW,YAAY,YAAY;AACxD,UAAM,MAAM,MAAM,KAAK,KAAK,MAAM,WAAW,WAAW,UAAU,oBAAI,KAAK,CAAC,IAAI,WAAW,oBAAI,KAAK,CAAC;AACrG,UAAM,UAAS,oBAAI,KAAK,GAAE,YAAY;AACtC,UAAM,CAAC,gBAAgB,qBAAqB,eAAe,iBAAiB,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MACxG,KAAK,mCAAmC;AAAA,MACxC,KAAK,qCAAqC;AAAA,MAC1C,KAAK,gCAAgC,KAAK,MAAM;AAAA,MAChD,KAAK,gCAAgC,KAAK,QAAQ;AAAA,MAClD,KAAK,aAAa;AAAA,IACpB,CAAC;AACD,UAAM,iBAAiB,kBAAkB,IAAI,KAAK,EAAE,SAAS;AAC7D,UAAM,mBAAmB,sBAAsB,gCAAgC,mBAAmB,IAAI,CAAC;AACvG,UAAM,cAAc,iBAAiB,OAAO,CAAC,SAAS,KAAK,WAAW,QAAQ;AAC9E,UAAM,mBAAmB,YAAY,OAAO,CAAC,SAAS;AACpD,YAAM,aAAa,KAAK,MAAM,KAAK,YAAY;AAC/C,UAAI,CAAC,OAAO,SAAS,UAAU,EAAG,QAAO;AACzC,aAAO,KAAK,IAAI,IAAI,aAAa,qBAAqB,KAAK,OAAO;AAAA,IACpE,CAAC;AACD,UAAM,sBAAgC,CAAC;AACvC,QAAI,CAAC,eAAe;AAClB,0BAAoB,KAAK,4EAA4E;AAAA,IACvG;AACA,QAAI,cAAc,SAAS,GAAG;AAC5B,0BAAoB;AAAA,QAClB,sBAAsB,cAAc,MAAM,4BAA4B,cAAc,WAAW,IAAI,KAAK,GAAG;AAAA,MAC7G;AAAA,IACF;AACA,QAAI,iBAAiB,WAAW,GAAG;AACjC,0BAAoB,KAAK,oFAAoF;AAAA,IAC/G,WAAW,iBAAiB,SAAS,GAAG;AACtC,0BAAoB;AAAA,QAClB,sCAAsC,iBAAiB,WAAW,IAAI,KAAK,GAAG,KAAK,iBAChF,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,SAAS,KAAK,EAAE,EACrB,KAAK,IAAI,CAAC;AAAA,MACf;AAAA,IACF;AACA,SAAK,UAAU,SAAS,UAAU,KAAK,GAAG;AACxC,0BAAoB,KAAK,6FAA6F;AAAA,IACxH;AACA,UAAM,aAAa,oBAAoB,CAAC,KAAK;AAE7C,UAAM,QAAkB;AAAA,MACtB,6BAAwB,MAAM,IAAI,GAAG;AAAA,MACrC;AAAA,MACA,cAAc,MAAM;AAAA,MACpB,UAAU,MAAM;AAAA,MAChB;AAAA,MACA;AAAA,MACA,8BAA8B,gBAAgB,QAAQ,IAAI;AAAA,MAC1D,gCAAgC,iBAAiB,MAAM;AAAA,MACvD,+BAA+B,YAAY,MAAM;AAAA,MACjD,yBAAyB,iBAAiB,MAAM;AAAA,MAChD,qBAAqB,cAAc,MAAM;AAAA,MACzC,uBAAuB,gBAAgB,MAAM;AAAA,MAC7C,mCAAmC,UAAU,SAAS,UAAU,CAAC;AAAA,MACjE;AAAA,MACA;AAAA,MACA,4BAA4B,gBAAgB,SAAS,iBAAiB;AAAA,MACtE,uBAAuB,cAAc,WAAW,IAAI,SAAS,iBAAiB;AAAA,MAC9E,gCAAgC,iBAAiB,SAAS,IAAI,SAAS,iBAAiB;AAAA,MACxF,iCAAiC,iBAAiB,WAAW,IAAI,SAAS,iBAAiB;AAAA,MAC3F;AAAA,MACA;AAAA,MACA,+CAA+C,cAAc,SAAS,IAAI,aAAa,eAAe;AAAA,MACtG,oCAAoC,iBAAiB,SAAS,IAAI,iBAAiB,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,IAAI,eAAe;AAAA,MAChI,mDACE,gBAAgB,KAAK,CAAC,OAAO,EAAE,kBAAkB,IAAI,KAAK,EAAE,SAAS,CAAC,IAAI,YAAY,cACxF;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA,GAAI,cAAc,SAAS,IAAI,cAAc,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU;AAAA,MAC/F;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,KAAK,QAAQ,mBAAmB,QAAQ,KAAK,MAAM,KAAK,IAAI,CAAC;AACtF,WAAO,EAAE,QAAQ,KAAK,WAAW;AAAA,EACnC;AAAA,EAEA,MAAM,eAA6C;AACjD,QAAI;AACF,YAAM,MAAM,MAAM,SAAS,KAAK,cAAc,OAAO;AACrD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,OAAO,QAAQ,EAAG,QAAO;AACvD,UAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAAG;AACnC,cAAM,YAAY,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,SAAS,IAChF,OAAO,aACP,oBAAI,KAAK,CAAC,GAAE,YAAY;AAC5B,eAAO,WAAW,OAAO,SAAS,IAAI,CAAC,YAAY;AACjD,gBAAM,WAAW,2BAA2B,OAAO;AACnD,iBAAO;AAAA,YACL,IAAI,gBAAgB,SAAS,UAAU,SAAS,SAAS,OAAO,SAAS,QAAQ;AAAA,YACjF;AAAA,YACA,UAAU,SAAS;AAAA,YACnB,QAAQ;AAAA,YACR,OAAO,SAAS;AAAA,YAChB,UAAU,SAAS;AAAA,YACnB,MAAM,CAAC;AAAA,YACP,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,YAAY,CAAC;AAAA,YACb,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,iBAAiB;AAAA,YACjB,YAAY,UAAU,IAAI,KAAK,SAAS,CAAC;AAAA,YACzC,gBAAgB,EAAE,OAAO,MAAM,KAAK,KAAK;AAAA,UAC3C;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,cAA8C;AAClD,QAAI;AACF,YAAM,MAAM,MAAM,SAAS,KAAK,kBAAkB,OAAO;AACzD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,OAAO,MAAM,KAAK,CAAC,MAAM,QAAQ,OAAO,SAAS,EAAG,QAAO;AACzF,aAAO,SAAS,OAAO,OAAO,IAAI,CAAC,UAAU,KAAK,qBAAqB,KAAK,CAAC;AAC7E,aAAO,YAAY,OAAO,UAAU,IAAI,CAAC,UAAU,KAAK,qBAAqB,KAAK,CAAC;AACnF,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,QAA2D;AAClF,QAAI;AACF,YAAM,MAAM,MAAM,SAAS,KAAK,KAAK,KAAK,WAAW,GAAG,MAAM,OAAO,GAAG,OAAO;AAC/E,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UACE,CAAC,UACD,OAAO,WAAW,UAClB,CAAC,MAAM,QAAQ,OAAO,mBAAmB,GACzC;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,OACA,MACwB;AACxB,UAAM,CAAC,UAAU,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC5C,KAAK,aAAa;AAAA,MAClB,KAAK,YAAY;AAAA,IACnB,CAAC;AACD,UAAM,cAAc,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,eAAe,EAAE,CAAC;AACnE,UAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,cAAc,CAAC,CAAC;AAChE,UAAM,cAAc,oBAAoB,KAAK;AAE7C,UAAM,kBAAkB,UAAU,YAAY,CAAC,GAC5C,OAAO,CAAC,UAAU,MAAM,WAAW,QAAQ,EAC3C;AAAA,MAAK,CAAC,GAAG,MACR,EAAE,kBAAkB,EAAE,mBACtB,EAAE,WAAW,cAAc,EAAE,UAAU,KACvC,EAAE,QAAQ,cAAc,EAAE,OAAO;AAAA,IACnC;AACF,UAAM,cAAc,eAAe,MAAM,GAAG,WAAW;AAEvD,UAAM,aAAa;AAAA,MACjB,GAAI,SAAS,aAAa,CAAC;AAAA,MAC3B,GAAI,SAAS,UAAU,CAAC;AAAA,IAC1B;AACA,UAAM,gBAAgB,WACnB,IAAI,CAAC,WAAW;AAAA,MACf;AAAA,MACA,OAAO,KAAK,oBAAoB,OAAO,WAAW;AAAA,IACpD,EAAE,EACD;AAAA,MAAK,CAAC,GAAG,MACR,EAAE,QAAQ,EAAE,SACZ,EAAE,MAAM,aAAa,SAAS,EAAE,MAAM,aAAa,UACnD,EAAE,MAAM,QAAQ,cAAc,EAAE,MAAM,OAAO;AAAA,IAC/C;AACF,UAAM,aAAa,cAChB,OAAO,CAAC,SAAS,KAAK,QAAQ,KAAK,YAAY,WAAW,CAAC,EAC3D,MAAM,GAAG,UAAU,EACnB,IAAI,CAAC,SAAS,KAAK,KAAK;AAE3B,QAAI,YAAY,WAAW,KAAK,WAAW,WAAW,EAAG,QAAO;AAEhE,UAAM,QAAkB;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AAEA,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,KAAK,iCAAiC;AAC5C,iBAAW,SAAS,aAAa;AAC/B,cAAM,QAAQ,MAAM,YAAY,MAAM,SAAS;AAC/C,cAAM,WAAW,CAAC,cAAc,MAAM,eAAe,EAAE;AACvD,YAAI,MAAO,UAAS,KAAK,SAAS,KAAK,EAAE;AACzC,cAAM,KAAK,KAAK,MAAM,OAAO,MAAM,SAAS,KAAK,IAAI,CAAC,IAAI;AAAA,MAC5D;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,KAAK,iBAAiB;AAC5B,iBAAW,UAAU,YAAY;AAC/B,cAAM,QAAQ,OAAO,aAAa,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACvD,cAAM,KAAK,KAAK,OAAO,IAAI,IAAI,OAAO,OAAO,KAAK,KAAK,EAAE;AAAA,MAC3D;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,yBAAyB,SAA8D;AACrF,WAAO,gCAAgC,KAAK,QAAQ,OAAO;AAAA,EAC7D;AAAA,EAEA,MAAc,2BAA2B,QAAwD;AAG/F,UAAM,MAAqC,CAAC;AAC5C,QAAI;AACF,YAAM,MAAM,MAAM,SAAS,KAAK,mBAAmB,OAAO;AAC1D,YAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,eAAS,MAAM,GAAG,MAAM,MAAM,QAAQ,OAAO,GAAG;AAC9C,cAAM,OAAO,MAAM,GAAG;AACtB,YAAI,CAAC,KAAK,KAAK,EAAG;AAClB,YAAI;AACF,gBAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,gBAAM,SAAS,0BAA0B,UAAU,GAAG;AACtD,cAAI,CAAC,OAAO,QAAS;AACrB,gBAAM,IAAI,IAAI,KAAK,OAAO,KAAK,IAAI;AACnC,cAAI,CAAC,OAAO,SAAS,EAAE,QAAQ,CAAC,EAAG;AACnC,cAAI,UAAU,CAAC,MAAM,OAAQ;AAC7B,gBAAM,aAAa,MAAM;AACzB,cAAI,KAAK;AAAA,YACP,OAAO,OAAO;AAAA,YACd;AAAA,YACA,YAAY,KAAK;AAAA,YACjB,SAAS,GAAG,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,IAAI,IAAI,UAAU,GAAG,QAAQ,qBAAqB,GAAG;AAAA,UACpG,CAAC;AAAA,QACH,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,2BAA2B,QAAuC;AACxE,UAAM,MAAgB,CAAC;AACvB,eAAW,SAAS,QAAQ;AAC1B,YAAM,SAAS,MAAM,YAAY,YAAY,MAAM,YAAY;AAC/D,UAAI,CAAC,UAAU,MAAM,mBAAmB,KAAM;AAC9C,YAAM,SAAS,MAAM,UAAU,MAAM,OAAO,KAAK,EAAE,SAAS,IACxD,MAAM,MAAM,OAAO,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,KACvC;AACJ,UAAI;AAAA,QACF,iBAAiB,MAAM,SAAS,KAAK,MAAM,MAAM,IAAI,MAAM,OAAO,GAAG,MAAM,iBAAiB,IAAI,MAAM,cAAc,KAAK,EAAE,GAAG,MAAM;AAAA,MACtI;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,wBAAwB,QAA8C;AAClF,UAAM,MAA2B,CAAC;AAClC,UAAM,OAAO,MAAM,KAAK,QAAQ,0BAA0B,OAAO,gBAAgB;AACjF,eAAW,OAAO,MAAM;AACtB,YAAM,QAAQ,IAAI;AAClB,YAAM,KAAK,IAAI,KAAK,MAAM,SAAS;AACnC,UAAI,CAAC,OAAO,SAAS,GAAG,QAAQ,CAAC,KAAK,UAAU,EAAE,MAAM,OAAQ;AAChE,UAAI,KAAK;AAAA,QACP,MAAM,IAAI;AAAA,QACV,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,gBAAgB,MAAM,mBAAmB,UAAU,MAAM,mBAAmB,UACxE,MAAM,iBACN;AAAA,QACJ,WAAW,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,SAAS,IAAI,MAAM,YAAY;AAAA,QACjG,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA,MAC5D,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,0BAA0B,QAAqD;AACrF,UAAM,WAAW,oBAAI,IAAsE;AAC3F,eAAW,SAAS,QAAQ;AAC1B,YAAM,MAAM,MAAM;AAClB,YAAM,MAAM,SAAS,IAAI,GAAG,KAAK;AAAA,QAC/B,QAAQ,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,EAAE;AAAA,QAC5C,YAAY,oBAAI,IAAY;AAAA,MAC9B;AACA,UAAI,MAAM,YAAY,UAAW,KAAI,OAAO,WAAW;AAAA,eAC9C,MAAM,YAAY,UAAW,KAAI,OAAO,WAAW;AAAA,UACvD,KAAI,OAAO,UAAU;AAC1B,UAAI,WAAW,IAAI,GAAG,KAAK,SAAS,KAAK,sBAAsB,CAAC,KAAK,MAAM,IAAI,EAAE;AACjF,eAAS,IAAI,KAAK,GAAG;AAAA,IACvB;AAEA,UAAM,MAA8B,CAAC;AACrC,eAAW,CAAC,QAAQ,IAAI,KAAK,SAAS,QAAQ,GAAG;AAC/C,YAAM,QAAQ,KAAK,OAAO,UAAU,KAAK,OAAO,UAAU,KAAK,OAAO;AACtE,UAAI,SAAS,EAAG;AAEhB,YAAM,gBAAgB,SAAU,KAAK,OAAO,UAAU,IAAM,KAAK,OAAO,UAAU,MAAQ,KAAK,OAAO,SAAS,OAAQ,OAAO,QAAQ,CAAC,CAAC;AACxI,UAAI,KAAK;AAAA,QACP;AAAA,QACA,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA,YAAY,CAAC,GAAG,KAAK,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC;AAAA,MACpD,CAAC;AAAA,IACH;AACA,QAAI,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC;AAC7G,WAAO;AAAA,EACT;AAAA,EAEQ,0BACN,SACA,UACA,SACsB;AACtB,UAAM,UAAU,oBAAI,IAAgC;AACpD,UAAM,SAAS,CAAC,cAAkC;AAChD,YAAM,MAAM,GAAG,UAAU,QAAQ,IAAI,6BAA6B,UAAU,OAAO,CAAC;AACpF,YAAM,WAAW,QAAQ,IAAI,GAAG;AAChC,UAAI,CAAC,UAAU;AACb,gBAAQ,IAAI,KAAK,SAAS;AAC1B;AAAA,MACF;AACA,YAAM,mBAAmB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,SAAS,YAAY,GAAG,UAAU,UAAU,CAAC,CAAC;AACvF,UAAI,UAAU,QAAQ,SAAS,OAAO;AACpC,gBAAQ,IAAI,KAAK;AAAA,UACf,GAAG;AAAA,UACH,YAAY;AAAA,QACd,CAAC;AACD;AAAA,MACF;AACA,eAAS,aAAa;AAAA,IACxB;AAEA,eAAW,QAAQ,SAAS;AAC1B,UAAI,KAAK,QAAQ,EAAG;AACpB,UAAI,KAAK,gBAAgB,IAAK;AAC9B,YAAM,UAAU;AAAA,QACd,UAAU,KAAK,MAAM,qEAAqE,KAAK,OAAO,OAAO,aAAa,KAAK,OAAO,OAAO,YAAY,KAAK,OAAO,MAAM;AAAA,MAC7K;AACA,aAAO;AAAA,QACL,IAAI,2BAA2B,kBAAkB,KAAK,QAAQ,OAAO;AAAA,QACrE,YAAY;AAAA,QACZ,SAAS,KAAK;AAAA,QACd,UAAU,4BAA4B,OAAO;AAAA,QAC7C;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,YAAY,KAAK;AAAA,QACjB,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,eAAW,SAAS,UAAU;AAC5B,UAAI,MAAM,WAAW,SAAU;AAC/B,UAAI,MAAM,kBAAkB,EAAG;AAC/B,YAAM,UAAU,iCAAiC,yBAAyB,MAAM,SAAS,MAAM,KAAK,CAAC;AACrG,UAAI,QAAQ,WAAW,EAAG;AAC1B,YAAM,aAAa,MAAM,cAAc;AACvC,YAAM,QAAQ,OAAO,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC,IAAI,OAAO,aAAa,IAAI,EAAE,QAAQ,CAAC,CAAC;AACpH,aAAO;AAAA,QACL,IAAI,2BAA2B,mBAAmB,MAAM,IAAI,OAAO;AAAA,QACnE,YAAY;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,UAAU,4BAA4B,OAAO;AAAA,QAC7C;AAAA,QACA;AAAA,QACA,WAAW,uCAAuC,MAAM,eAAe;AAAA,QACvE,SAAS;AAAA,QACT,YAAY,MAAM,WAAW,SAAS,IAAI,MAAM,aAAa,CAAC,iBAAiB,MAAM,EAAE,EAAE;AAAA,QACzF,OAAO,MAAM;AAAA,QACb,UAAU,MAAM;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,eAAW,UAAU,CAAC,GAAG,QAAQ,WAAW,GAAG,QAAQ,MAAM,GAAG;AAC9D,iBAAW,eAAe,KAAK,4BAA4B,MAAM,GAAG;AAClE,YAAI,KAAK,oCAAoC,YAAY,IAAI,EAAG;AAChE,cAAM,gBAAgB,YAAY,WAAW;AAC7C,YAAI,gBAAgB,EAAG;AACvB,cAAM,UAAU,iCAAiC,YAAY,IAAI;AACjE,YAAI,QAAQ,WAAW,EAAG;AAC1B,cAAM,QAAQ,OAAO,KAAK,IAAI,MAAM,MAAM,KAAK,IAAI,eAAe,CAAC,IAAI,IAAI,EAAE,QAAQ,CAAC,CAAC;AACvF,eAAO;AAAA,UACL,IAAI,2BAA2B,UAAU,GAAG,OAAO,EAAE,IAAI,YAAY,IAAI,IAAI,OAAO;AAAA,UACpF,YAAY;AAAA,UACZ,SAAS,GAAG,OAAO,IAAI,IAAI,OAAO,OAAO;AAAA,UACzC,UAAU,4BAA4B,OAAO;AAAA,UAC7C;AAAA,UACA;AAAA,UACA,WAAW,mCAAmC,aAAa;AAAA,UAC3D,SAAS;AAAA,UACT,YAAY,YAAY;AAAA,UACxB,OAAO,OAAO,SAAS,UAAU,OAAO,UAAU;AAAA,UAClD,UAAU,OAAO,SAAS,aAAa,OAAO,UAAU;AAAA,QAC1D,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,cAAc,EAAE,OAAO,CAAC,EACtE,MAAM,GAAG,EAAE;AAAA,EAChB;AAAA,EAEQ,cACN,SACA,iBAA2B,CAAC,GAC5B,QACA,mBAA2C,CAAC,GAC2C;AACvF,UAAM,WAAoC,CAAC;AAC3C,UAAM,oBAAoB,oBAAI,IAU3B;AAEH,eAAW,WAAW,SAAS;AAC7B,YAAM,IAAI,QAAQ;AAClB,YAAM,UAAU,EAAE,YAAY,EAAE,SAAS,KAAK,EAAE,SAAS,IACrD,GAAG,EAAE,KAAK,KAAK,EAAE,SAAS,KAAK,CAAC,KAChC,EAAE,aAAa,aACb,GAAG,EAAE,KAAK,KAAK,EAAE,OAAO,KAAK,CAAC,GAAG,MAAM,GAAG,GAAG,IAC7C;AACN,UAAI,CAAC,QAAS;AACd,YAAM,aAAa,CAAC,GAAG,KAAK,SAAS,QAAQ,UAAU,CAAC,KAAK,QAAQ,UAAU,IAAI,QAAQ,OAAO,EAAE;AACpG,eAAS,KAAK,EAAE,SAAS,WAAW,CAAC;AAErC,YAAM,WAAW,kBAAkB,IAAI,OAAO,KAAK;AAAA,QACjD,UAAU;AAAA,QACV,OAAO,EAAE;AAAA,QACT,UAAU,EAAE,YAAY;AAAA,QACxB,MAAM,oBAAI,IAAY;AAAA,QACtB,UAAU,EAAE,YAAY;AAAA,QACxB,YAAY,oBAAoB,EAAE,UAAU;AAAA,QAC5C,SAAS,EAAE,SAAS,KAAK,KAAK;AAAA,QAC9B,YAAY,CAAC;AAAA,QACb,gBAAgB,wBAAwB,EAAE,qBAAqB,EAAE,iBAAiB;AAAA,MACpF;AACA,iBAAW,OAAO,cAAc,EAAE,IAAI,EAAG,UAAS,KAAK,IAAI,GAAG;AAC9D,eAAS,WAAW,KAAK,EAAE,IAAI;AAC/B,UAAI,SAAS,aAAa,QAAQ,EAAE,SAAU,UAAS,WAAW,EAAE;AACpE,UAAI,SAAS,aAAa,QAAQ,EAAE,SAAU,UAAS,WAAW,EAAE;AACpE,UAAI,SAAS,eAAe,KAAM,UAAS,aAAa,oBAAoB,EAAE,UAAU;AACxF,UAAI,SAAS,YAAY,QAAQ,EAAE,QAAS,UAAS,UAAU,EAAE,QAAQ,KAAK;AAC9E,YAAM,qBAAqB,wBAAwB,EAAE,qBAAqB,EAAE,iBAAiB;AAC7F,eAAS,iBAAiB,qBAAqB,SAAS,gBAAgB,kBAAkB;AAC1F,wBAAkB,IAAI,SAAS,QAAQ;AAAA,IACzC;AAEA,eAAW,WAAW,gBAAgB;AACpC,eAAS,KAAK,EAAE,SAAS,YAAY,CAAC,GAAG,KAAK,SAAS,KAAK,sBAAsB,CAAC,IAAI,EAAE,CAAC;AAC1F,YAAM,WAAW,kBAAkB,IAAI,OAAO,KAAK;AAAA,QACjD,UAAU;AAAA,QACV,OAAO;AAAA,QACP,UAAU;AAAA,QACV,MAAM,oBAAI,IAAY;AAAA,QACtB,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,YAAY,CAAC;AAAA,QACb,gBAAgB,EAAE,OAAO,MAAM,KAAK,KAAK;AAAA,MAC3C;AACA,wBAAkB,IAAI,SAAS,QAAQ;AAAA,IACzC;AAEA,UAAM,YAAY,oBAAI,IAAyB;AAC/C,eAAW,QAAQ,UAAU;AAC3B,YAAM,WAAW,UAAU,IAAI,KAAK,OAAO,KAAK,oBAAI,IAAY;AAChE,iBAAW,cAAc,KAAK,WAAY,UAAS,IAAI,UAAU;AACjE,gBAAU,IAAI,KAAK,SAAS,QAAQ;AAAA,IACtC;AAEA,UAAM,UAAU,CAAC,GAAG,UAAU,QAAQ,CAAC,EACpC,IAAI,CAAC,CAAC,SAAS,UAAU,OAAO,EAAE,SAAS,YAAY,CAAC,GAAG,UAAU,EAAE,KAAK,EAAE,EAAE,EAChF,MAAM,GAAG,GAAG;AACf,UAAM,eAAe,IAAI,IAAI,iBAAiB,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;AAC/E,UAAM,oBAAoB,IAAI,IAAI,iBAAiB,IAAI,CAAC,UAAU,CAAC,MAAM,SAAS,KAAK,CAAC,CAAC;AACzF,UAAM,WAAmC,QAAQ,IAAI,CAAC,WAAW;AAC/D,YAAM,WAAW,kBAAkB,IAAI,OAAO,OAAO;AACrD,YAAM,KAAK;AAAA,QACT,UAAU,YAAY;AAAA,QACtB,OAAO;AAAA,QACP,UAAU,SAAS;AAAA,QACnB,UAAU,YAAY;AAAA,MACxB;AACA,YAAM,WAAW,aAAa,IAAI,EAAE,KAAK,kBAAkB,IAAI,OAAO,OAAO;AAC7E,YAAM,cAAc,UAAU,cAAc,CAAC,GAAG,OAAO,CAAC,UAAU,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC,EAAE,KAAK;AACtH,YAAM,cAAc,UAAU,eAAe,WAAW,CAAC,MAAK,oBAAI,KAAK,GAAE,YAAY;AACrF,YAAM,aAAa,WAAW,WAAW,SAAS,CAAC,KAAK,UAAU,cAAc;AAChF,aAAO;AAAA,QACL;AAAA,QACA,SAAS,OAAO;AAAA,QAChB,UAAU,UAAU,YAAY;AAAA,QAChC,QAAQ;AAAA,QACR,OAAO,UAAU,SAAS;AAAA,QAC1B,UAAU,UAAU,YAAY;AAAA,QAChC,MAAM,WAAW,CAAC,GAAG,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,QAC9C,UAAU,UAAU,YAAY;AAAA,QAChC,YAAY,UAAU,cAAc;AAAA,QACpC,SAAS,UAAU,WAAW;AAAA,QAC9B,YAAY,OAAO;AAAA,QACnB;AAAA,QACA;AAAA,QACA,iBAAiB,UAAU,eAAe,SAAS,SAAS,mBAAmB,UAAU,mBAAmB,KAAK;AAAA,QACjH,YAAY;AAAA,QACZ,gBAAgB,UAAU,kBAAkB,EAAE,OAAO,MAAM,KAAK,KAAK;AAAA,QACrE,WAAW;AAAA,MACb;AAAA,IACF,CAAC;AAED,UAAM,UAAU,IAAI,IAAI,SAAS,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AACzD,UAAM,eAAe,IAAI,IAAI,SAAS,IAAI,CAAC,UAAU,MAAM,OAAO,CAAC;AACnE,eAAW,YAAY,kBAAkB;AACvC,UAAI,QAAQ,IAAI,SAAS,EAAE,KAAK,aAAa,IAAI,SAAS,OAAO,EAAG;AACpE,YAAM,aAAa,cAAc,MAAM,IAAI,cAAc,SAAS,UAAU;AAC5E,eAAS,KAAK;AAAA,QACZ,GAAG;AAAA,QACH,QAAQ,cAAc,0BAA0B,YAAY,SAAS;AAAA,QACrE,WAAW,cAAc,0BACrB,SAAS,cAAa,oBAAI,KAAK,GAAE,YAAY,IAC7C,SAAS,aAAa;AAAA,MAC5B,CAAC;AAAA,IACH;AAEA,aAAS;AAAA,MAAK,CAAC,GAAG,MAChB,OAAO,EAAE,WAAW,QAAQ,IAAI,OAAO,EAAE,WAAW,QAAQ,KAC5D,EAAE,kBAAkB,EAAE,mBACtB,EAAE,WAAW,cAAc,EAAE,UAAU,KACvC,EAAE,QAAQ,cAAc,EAAE,OAAO;AAAA,IACnC;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,UAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,MACtC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBACN,QACA,SACA,UACA,gBACA,YACA,gBACA,qBACQ;AACR,UAAM,UAAU,oBAAI,IAA2C;AAC/D,eAAW,WAAW,SAAS;AAC7B,YAAM,OAAO,QAAQ,IAAI,QAAQ,MAAM,KAAK,KAAK,CAAC;AAClD,WAAK,KAAK,OAAO;AACjB,cAAQ,IAAI,QAAQ,MAAM,OAAO,IAAI;AAAA,IACvC;AAEA,UAAM,QAAkB;AAAA,MACtB,+BAA0B,MAAM;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,uBAAuB,QAAQ,MAAM;AAAA,MACrC,uBAAuB,SAAS,MAAM;AAAA,MACtC;AAAA,MACA;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,KAAK,UAAU;AAAA,IACvB,OAAO;AACL,iBAAW,CAAC,OAAO,IAAI,KAAK,MAAM,KAAK,QAAQ,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,GAAG;AAClG,cAAM,WAAW,KAAK,OAAO,CAAC,MAAM,EAAE,MAAM,aAAa,UAAU,EAAE;AACrE,cAAM,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,MAAM,aAAa,wBAAwB,EAAE;AAC9E,cAAM,WAAW,KAAK,OAAO,CAAC,MAAM,EAAE,MAAM,aAAa,UAAU,EAAE;AACrE,cAAM,KAAK,OAAO,KAAK,EAAE;AACzB,cAAM,KAAK,eAAe,QAAQ,EAAE;AACpC,cAAM,KAAK,6BAA6B,GAAG,EAAE;AAC7C,cAAM,KAAK,eAAe,QAAQ,EAAE;AACpC,cAAM,aAAa,KAChB,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,MAAM,GAAG,KAAK,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE,OAAO,EAAE;AAC5E,YAAI,WAAW,SAAS,GAAG;AACzB,gBAAM,KAAK,iBAAiB,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,QACrD;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AAEA,UAAM,KAAK,8BAA8B;AACzC,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,KAAK,cAAc;AAAA,IAC3B,OAAO;AACL,YAAM,YAAY,IAAI,IAAI,eAAe,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC9E,iBAAW,KAAK,SAAS,MAAM,GAAG,GAAG,GAAG;AACtC,cAAM,aAAa,UAAU,IAAI,CAAC,KAAK,CAAC;AACxC,YAAI,WAAW,SAAS,GAAG;AACzB,gBAAM,KAAK,KAAK,CAAC,cAAc,WAAW,KAAK,IAAI,CAAC,IAAI;AAAA,QAC1D,OAAO;AACL,gBAAM,KAAK,KAAK,CAAC,EAAE;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AAEb,UAAM,KAAK,sBAAsB;AACjC,QAAI,eAAe,WAAW,GAAG;AAC/B,YAAM,KAAK,2CAA2C;AAAA,IACxD,OAAO;AACL,iBAAW,QAAQ,eAAe,MAAM,GAAG,EAAE,GAAG;AAC9C,cAAM;AAAA,UACJ,KAAK,KAAK,MAAM,aAAa,KAAK,OAAO,OAAO,aAAa,KAAK,OAAO,OAAO,YAAY,KAAK,OAAO,MAAM,YAAY,KAAK,aAAa,cAAc,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA,QACtL;AAAA,MACF;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AAEb,QAAI,KAAK,OAAO,4BAA4B;AAC1C,YAAM,KAAK,oCAAoC;AAC/C,UAAI,oBAAoB,WAAW,GAAG;AACpC,cAAM,KAAK,gDAAgD;AAAA,MAC7D,OAAO;AACL,mBAAW,aAAa,qBAAqB;AAC3C,gBAAM,qBAAqB,UAAU,UACjC,eAAe,UAAU,QAAQ,OAAO,OAAO,UAAU,QAAQ,OAAO,OAAO,UAAU,QAAQ,MAAM,MACvG;AACJ,gBAAM;AAAA,YACJ,MAAM,UAAU,UAAU,KAAK,UAAU,OAAO,OAAO,UAAU,OAAO,cAAc,UAAU,QAAQ,WAAW,UAAU,KAAK,QAAQ,UAAU,EAAE,MAAM,UAAU,SAAS,GAAG,kBAAkB,cAAc,UAAU,WAAW,KAAK,IAAI,CAAC;AAAA,UACnP;AAAA,QACF;AAAA,MACF;AACA,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,kLAAkL;AAC7L,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,QAAI,KAAK,OAAO,wBAAwB;AACtC,YAAM,KAAK,sBAAsB;AACjC,UAAI,WAAW,YAAY;AACzB,cAAM,KAAK,aAAa,WAAW,UAAU,EAAE;AAAA,MACjD,OAAO;AACL,cAAM,KAAK,0BAA0B,MAAM,GAAG;AAAA,MAChD;AACA,UAAI,WAAW,aAAa;AAC1B,cAAM,KAAK,cAAc,WAAW,WAAW,EAAE;AAAA,MACnD,OAAO;AACL,cAAM,KAAK,2BAA2B,WAAW,OAAO,GAAG;AAAA,MAC7D;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,oBACN,SACA,gBACgB;AAChB,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,UAAM,UAAU,oBAAI,IAAiC;AACrD,UAAM,aAAa,oBAAI,IAAiC;AAExD,eAAW,WAAW,SAAS;AAC7B,YAAM,QAAS,QAAQ,MAAM,YAAY,QAAQ,MAAM,SAAS,KAAK,EAAE,SAAS,IAC5E,QAAQ,MAAM,WACd,QAAQ,MAAM,aAAa,aACzB,QAAQ,MAAM,SACd,IAAI,KAAK;AACf,UAAI,CAAC,KAAM;AACX,YAAM,aAAa,GAAG,KAAK,SAAS,QAAQ,UAAU,CAAC,KAAK,QAAQ,UAAU,IAAI,QAAQ,OAAO;AACjG,YAAM,aAAa,QAAQ,IAAI,QAAQ,MAAM,KAAK,KAAK;AAAA,QACrD,IAAI,eAAe,SAAS,QAAQ,MAAM,KAAK;AAAA,QAC/C,MAAM;AAAA,QACN,SAAS,QAAQ,MAAM;AAAA,QACvB,cAAc,CAAC;AAAA,QACf,MAAM,CAAC;AAAA,QACP,YAAY,CAAC;AAAA,QACb,oBAAoB,CAAC;AAAA,QACrB;AAAA,MACF;AACA,WAAK,qBAAqB,YAAY,MAAM,UAAU;AACtD,iBAAW,OAAO,cAAc,CAAC,GAAG,WAAW,MAAM,GAAG,cAAc,QAAQ,MAAM,IAAI,CAAC,CAAC;AAC1F,cAAQ,IAAI,QAAQ,MAAM,OAAO,UAAU;AAE3C,YAAM,WAAW,QAAQ,MAAM,UAAU,KAAK;AAC9C,UAAI,CAAC,SAAU;AACf,YAAM,gBAAgB,WAAW,IAAI,QAAQ,KAAK;AAAA,QAChD,IAAI,eAAe,YAAY,QAAQ;AAAA,QACvC,MAAM;AAAA,QACN,SAAS;AAAA,QACT,cAAc,CAAC;AAAA,QACf,MAAM,CAAC;AAAA,QACP,YAAY,CAAC;AAAA,QACb,oBAAoB,CAAC;AAAA,QACrB;AAAA,MACF;AACA,WAAK,qBAAqB,eAAe,MAAM,UAAU;AACzD,oBAAc,OAAO,cAAc,CAAC,GAAG,cAAc,MAAM,GAAG,cAAc,QAAQ,MAAM,IAAI,CAAC,CAAC;AAChG,iBAAW,IAAI,UAAU,aAAa;AAAA,IACxC;AAEA,eAAW,QAAQ,gBAAgB;AACjC,YAAM,gBAAgB,WAAW,IAAI,KAAK,MAAM,KAAK;AAAA,QACnD,IAAI,eAAe,YAAY,KAAK,MAAM;AAAA,QAC1C,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,QACd,cAAc,CAAC;AAAA,QACf,MAAM,CAAC;AAAA,QACP,YAAY,CAAC;AAAA,QACb,oBAAoB,CAAC;AAAA,QACrB;AAAA,MACF;AACA,WAAK;AAAA,QACH;AAAA,QACA,kBAAkB,KAAK,aAAa,aAAa,KAAK,OAAO,OAAO,aAAa,KAAK,OAAO,OAAO,YAAY,KAAK,OAAO,MAAM;AAAA,QAClI,GAAG,KAAK;AAAA,MACV;AACA,iBAAW,IAAI,KAAK,QAAQ,aAAa;AAAA,IAC3C;AAEA,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,cAAc,EAAE,OAAO,CAAC;AAAA,MAC/E,WAAW,CAAC,GAAG,WAAW,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,cAAc,EAAE,OAAO,CAAC;AAAA,IACvF;AAAA,EACF;AAAA,EAEQ,cAAc,gBAAwC,UAAkC;AAC9F,UAAM,QAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA,cAAc,SAAS,SAAS;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,KAAK,kBAAkB;AAC7B,QAAI,SAAS,OAAO,WAAW,GAAG;AAChC,YAAM,KAAK,cAAc;AAAA,IAC3B,OAAO;AACL,iBAAW,UAAU,SAAS,QAAQ;AACpC,cAAM,KAAK,OAAO,OAAO,OAAO,EAAE;AAClC,cAAM,eAAe,KAAK,4BAA4B,MAAM,EAAE,MAAM,GAAG,CAAC;AACxE,YAAI,aAAa,WAAW,GAAG;AAC7B,gBAAM,KAAK,+BAA+B;AAAA,QAC5C,OAAO;AACL,qBAAW,eAAe,cAAc;AACtC,kBAAM,aAAa,YAAY,WAAW,KAAK,IAAI;AACnD,kBAAM,KAAK,KAAK,YAAY,IAAI,GAAG,aAAa,cAAc,UAAU,OAAO,EAAE,EAAE;AAAA,UACrF;AAAA,QACF;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AAEA,UAAM,KAAK,qBAAqB;AAChC,QAAI,SAAS,UAAU,WAAW,GAAG;AACnC,YAAM,KAAK,cAAc;AAAA,IAC3B,OAAO;AACL,iBAAW,UAAU,SAAS,WAAW;AACvC,cAAM,KAAK,OAAO,OAAO,OAAO,EAAE;AAClC,mBAAW,eAAe,KAAK,4BAA4B,MAAM,EAAE,MAAM,GAAG,CAAC,GAAG;AAC9E,gBAAM,aAAa,YAAY,WAAW,KAAK,IAAI;AACnD,gBAAM,KAAK,KAAK,YAAY,IAAI,GAAG,aAAa,cAAc,UAAU,OAAO,EAAE,EAAE;AAAA,QACrF;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AAEA,UAAM,KAAK,2BAA2B;AACtC,QAAI,eAAe,WAAW,GAAG;AAC/B,YAAM,KAAK,cAAc;AAAA,IAC3B,OAAO;AACL,iBAAW,QAAQ,eAAe,MAAM,GAAG,EAAE,GAAG;AAC9C,cAAM;AAAA,UACJ,KAAK,KAAK,MAAM,YAAY,KAAK,aAAa,aAAa,KAAK,OAAO,OAAO,aAAa,KAAK,OAAO,OAAO,YAAY,KAAK,OAAO,MAAM;AAAA,QAC9I;AAAA,MACF;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AACb,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,MAAc,oBAAoB,UAAyC;AACzE,UAAM,KAAK,uBAAuB,KAAK,kBAAkB,SAAS,MAAM;AACxE,UAAM,KAAK,uBAAuB,KAAK,qBAAqB,SAAS,SAAS;AAAA,EAChF;AAAA,EAEA,MAAc,uBAAuB,KAAa,SAA+C;AAC/F,UAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAI;AACF,YAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,YAAM,QAAQ;AAAA,QACZ,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,EAAE,IAAI,CAAC,SAAS,OAAO,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE,MAAM,MAAM,MAAS,CAAC;AAAA,MAChH;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,iBAAiB,oBAAI,IAAoB;AAC/C,eAAW,SAAS,SAAS;AAC3B,YAAM,OAAO,WAAW,MAAM,OAAO;AACrC,qBAAe,IAAI,OAAO,eAAe,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,IAC9D;AAEA,UAAM,QAAQ,IAAI,QAAQ,IAAI,OAAO,UAAU;AAC7C,YAAM,qBAAqB,KAAK,4BAA4B,KAAK;AACjE,YAAM,OAAO;AAAA,QACX,KAAK,MAAM,SAAS,UAAU,UAAU,UAAU,kBAAa,MAAM,OAAO;AAAA,QAC5E;AAAA,QACA,YAAY,MAAM,SAAS;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,GAAI,mBAAmB,SAAS,IAC5B,mBAAmB,IAAI,CAAC,SAAS,KAAK,KAAK,IAAI,EAAE,IACjD,CAAC,cAAc;AAAA,QACnB;AAAA,QACA;AAAA,QACA,GAAI,MAAM,WAAW,SAAS,IAAI,MAAM,WAAW,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,IAAI,CAAC,cAAc;AAAA,QAC/F;AAAA,MACF,EAAE,KAAK,IAAI;AACX,YAAM,WAAW,uBAAuB,OAAO,cAAc;AAC7D,YAAM,UAAU,KAAK,KAAK,KAAK,QAAQ,GAAG,MAAM,OAAO;AAAA,IACzD,CAAC,CAAC;AAAA,EACJ;AAAA,EAEQ,oBAAoB,OAA4B,aAA+B;AACrF,QAAI,YAAY,WAAW,EAAG,QAAO,MAAM,aAAa;AACxD,UAAM,WAAW,CAAC,MAAM,SAAS,GAAG,MAAM,cAAc,GAAG,MAAM,IAAI,EAAE,KAAK,GAAG,EAAE,YAAY;AAC7F,QAAI,QAAQ;AACZ,eAAW,SAAS,aAAa;AAC/B,UAAI,SAAS,SAAS,KAAK,EAAG,UAAS;AACvC,UAAI,MAAM,QAAQ,YAAY,EAAE,SAAS,KAAK,EAAG,UAAS;AAAA,IAC5D;AACA,QAAI,UAAU,EAAG,QAAO;AACxB,WAAO,QAAQ,KAAK,IAAI,MAAM,aAAa,QAAQ,CAAC;AAAA,EACtD;AAAA,EAEQ,qBAAqB,OAAiD;AAC5E,UAAM,oBAAoB,KAAK,4BAA4B,KAAK;AAChE,WAAO;AAAA,MACL,GAAG;AAAA,MACH,cAAc,kBAAkB,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,MACvD,YAAY,CAAC,GAAG,IAAI,IAAI,kBAAkB,QAAQ,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC;AAAA,MAC7E,oBAAoB;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,4BAA4B,OAA2E;AAC7G,QAAI,MAAM,QAAQ,MAAM,kBAAkB,KAAK,MAAM,mBAAmB,SAAS,GAAG;AAClF,aAAO,MAAM,mBAAmB,IAAI,CAAC,UAAU;AAAA,QAC7C,MAAM,KAAK;AAAA,QACX,YAAY,CAAC,GAAG,IAAI,IAAI,KAAK,UAAU,CAAC,EAAE,KAAK;AAAA,MACjD,EAAE;AAAA,IACJ;AAEA,WAAO,MAAM,aAAa,IAAI,CAAC,MAAM,WAAW;AAAA,MAC9C;AAAA,MACA,YAAY,MAAM,WAAW,KAAK,IAAI,CAAC,MAAM,WAAW,KAAK,CAAC,IAAK,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC;AAAA,IACpH,EAAE;AAAA,EACJ;AAAA,EAEQ,oCAAoC,MAAuB;AACjE,WAAO,KAAK,UAAU,EAAE,WAAW,iBAAiB;AAAA,EACtD;AAAA,EAEQ,qBAAqB,OAA4B,SAAiB,YAA4B;AACpG,UAAM,aAAa,KAAK,qBAAqB,KAAK;AAClD,UAAM,WAAW,WAAW,oBAAoB,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI;AACjF,QAAI,UAAU;AACZ,eAAS,aAAa,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,SAAS,YAAY,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK;AAAA,IACnF,OAAO;AACL,iBAAW,oBAAoB,KAAK;AAAA,QAClC;AAAA,QACA,YAAY,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC,EAAE,KAAK;AAAA,MAC5C,CAAC;AAAA,IACH;AACA,UAAM,qBAAqB,WAAW;AACtC,UAAM,eAAe,WAAW,oBAAoB,IAAI,CAAC,SAAS,KAAK,IAAI,KAAK,CAAC;AACjF,UAAM,aAAa,CAAC,GAAG,IAAI,KAAK,WAAW,sBAAsB,CAAC,GAAG,QAAQ,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC;AAAA,EAC1G;AAAA,EAEA,MAAc,qCAA6D;AACzE,QAAI;AACF,aAAO,MAAM,KAAK,QAAQ,mBAAmB;AAAA,IAC/C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,uCAA+D;AAC3E,QAAI;AACF,aAAO,MAAM,KAAK,QAAQ,6BAA6B;AAAA,IACzD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,gCACZ,OACA,OACqC;AACrC,QAAI;AACF,aAAO,MAAM,KAAK,QAAQ,wBAAwB,OAAO,KAAK;AAAA,IAChE,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAc,sCACZ,QACA,KACwB;AACxB,QAAI;AACF,aAAO,MAAM,KAAK,QAAQ,kBAAkB,QAAQ,GAAG;AAAA,IACzD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,8BAA8B,QAKzC;AACD,UAAM,UAAU,mBAAmB,MAAM;AACzC,UAAM,aAAa,KAAK,KAAK,KAAK,wBAAwB,GAAG,MAAM,KAAK;AACxE,UAAM,cAAc,KAAK,KAAK,KAAK,yBAAyB,GAAG,OAAO,KAAK;AAC3E,UAAM,CAAC,aAAa,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,MACpD,KAAK,sCAAsC,UAAU,MAAM;AAAA,MAC3D,KAAK,sCAAsC,WAAW,OAAO;AAAA,IAC/D,CAAC;AACD,UAAM,gBAAgB,eAAe,IAAI,KAAK,EAAE,SAAS;AACzD,UAAM,iBAAiB,gBAAgB,IAAI,KAAK,EAAE,SAAS;AAC3D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAY,eAAe,aAAa;AAAA,MACxC,aAAa,gBAAgB,cAAc;AAAA,IAC7C;AAAA,EACF;AACF;","names":["limit"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  parseMessageParts
3
- } from "./chunk-XKIQZXUB.js";
3
+ } from "./chunk-CI7RKSRE.js";
4
4
  import {
5
5
  log
6
6
  } from "./chunk-2ODBA7MQ.js";
@@ -546,4 +546,4 @@ export {
546
546
  estimateTokens,
547
547
  LcmArchive
548
548
  };
549
- //# sourceMappingURL=chunk-4HP7HIE3.js.map
549
+ //# sourceMappingURL=chunk-HP5FMB6L.js.map
@@ -173,9 +173,10 @@ var SmartBuffer = class {
173
173
  const shouldPromote = surprise > this.config.bufferSurpriseThreshold;
174
174
  let triggered = false;
175
175
  if (shouldPromote) {
176
- const currentTurns = await this.getExtractionTurnsIfTurnSnapshotStillCurrent(
176
+ const currentTurns = await this.getExtractionTurnsIfBufferSnapshotStillCurrent(
177
177
  bufferKey,
178
- mutation.turnSnapshot
178
+ mutation.activeTurnsSnapshot,
179
+ mutation.retainedTurnsSnapshot
179
180
  );
180
181
  if (currentTurns) {
181
182
  log.debug(
@@ -218,7 +219,8 @@ var SmartBuffer = class {
218
219
  const entry = this.entryFor(bufferKey);
219
220
  const priorTurns = entry.turns.slice();
220
221
  entry.turns.push(turn);
221
- const turnSnapshot = copyBufferTurn(turn);
222
+ const activeTurnsSnapshot = entry.turns.map(copyBufferTurn);
223
+ const retainedTurnsSnapshot = (entry.retainedTurns ?? []).map(copyBufferTurn);
222
224
  if (bufferKey === "default") {
223
225
  this.state.turns = entry.turns;
224
226
  }
@@ -231,20 +233,19 @@ var SmartBuffer = class {
231
233
  decision,
232
234
  signalLevel: signal.level,
233
235
  priorTurns,
234
- turnSnapshot,
236
+ activeTurnsSnapshot,
237
+ retainedTurnsSnapshot,
235
238
  turnCountInWindow
236
239
  };
237
240
  }
238
- async getExtractionTurnsIfTurnSnapshotStillCurrent(bufferKey, turnSnapshot) {
241
+ async getExtractionTurnsIfBufferSnapshotStillCurrent(bufferKey, activeTurnsSnapshot, retainedTurnsSnapshot) {
239
242
  return this.enqueueMutation(async () => {
240
243
  await this.loadUnlocked();
241
244
  const entry = this.peekEntry(bufferKey);
242
245
  if (!entry) return null;
243
- const stillCurrent = entry.turns.some(
244
- (turn) => bufferTurnsEqual(turn, turnSnapshot)
245
- );
246
- if (!stillCurrent) return null;
247
246
  const retained = entry.retainedTurns ?? [];
247
+ const stillCurrent = bufferTurnArrayIsSuffixOfSnapshot(entry.turns, activeTurnsSnapshot) && bufferTurnArraysEqual(retained, retainedTurnsSnapshot);
248
+ if (!stillCurrent) return null;
248
249
  return [...retained, ...entry.turns];
249
250
  });
250
251
  }
@@ -538,6 +539,18 @@ function bufferTurnsEqual(left, right) {
538
539
  if (!left) return false;
539
540
  return left.role === right.role && left.content === right.content && left.timestamp === right.timestamp && left.sessionKey === right.sessionKey && left.logicalSessionKey === right.logicalSessionKey && left.providerThreadId === right.providerThreadId && left.turnFingerprint === right.turnFingerprint && left.persistProcessedFingerprint === right.persistProcessedFingerprint;
540
541
  }
542
+ function bufferTurnArraysEqual(left, right) {
543
+ return left.length === right.length && left.every((turn, index) => bufferTurnsEqual(turn, right[index]));
544
+ }
545
+ function bufferTurnArrayIsSuffixOfSnapshot(liveTurns, snapshot) {
546
+ if (liveTurns.length === 0 || liveTurns.length > snapshot.length) {
547
+ return false;
548
+ }
549
+ const offset = snapshot.length - liveTurns.length;
550
+ return liveTurns.every(
551
+ (turn, index) => bufferTurnsEqual(turn, snapshot[offset + index])
552
+ );
553
+ }
541
554
  function liveTurnsFromExtractionSnapshot(entry, extractedTurns) {
542
555
  const retainedTurns = entry.retainedTurns ?? [];
543
556
  if (retainedTurns.length > 0 && extractedTurns.length >= retainedTurns.length && retainedTurns.every(
@@ -593,4 +606,4 @@ function probeWithTimeout(inflight, timeoutMs) {
593
606
  export {
594
607
  SmartBuffer
595
608
  };
596
- //# sourceMappingURL=chunk-EVZFIAPG.js.map
609
+ //# sourceMappingURL=chunk-IBTZEBUD.js.map