chainlesschain 0.166.16 → 0.166.18

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 (223) hide show
  1. package/README.md +17 -10
  2. package/completions/_cc +1 -1
  3. package/completions/cc.bash +1 -1
  4. package/completions/cc.fish +1 -1
  5. package/completions/cc.ps1 +1 -1
  6. package/package.json +2 -2
  7. package/src/assets/web-panel/assets/{AIOps-CTxa2Wbq.js → AIOps-CQSBl3hY.js} +1 -1
  8. package/src/assets/web-panel/assets/{ActionButton-DHrQyYhy.js → ActionButton-IQt-vRLt.js} +1 -1
  9. package/src/assets/web-panel/assets/{Analytics-DQiUqcNl.js → Analytics-DkHC8O7k.js} +3 -3
  10. package/src/assets/web-panel/assets/{AppLayout-_Iz4r6wt.js → AppLayout-CSti2P2T.js} +5 -5
  11. package/src/assets/web-panel/assets/{Artifacts-BNs63YHo.js → Artifacts-C57hxn3v.js} +1 -1
  12. package/src/assets/web-panel/assets/{Audit-BgHIqRLn.js → Audit-DByLntcf.js} +1 -1
  13. package/src/assets/web-panel/assets/{BackgroundAgents-DUQ5axBB.js → BackgroundAgents-D1Bd2EOa.js} +1 -1
  14. package/src/assets/web-panel/assets/{Backup-CJ51E9Vw.js → Backup-VstHzHng.js} +1 -1
  15. package/src/assets/web-panel/assets/{BaseInput-o-5toA_R.js → BaseInput-CLhdexIf.js} +1 -1
  16. package/src/assets/web-panel/assets/{Chat-Cu7a-x1L.js → Chat-BefC_JZS.js} +6 -6
  17. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BUyYkAXr.js → ChatBubbleRenderer-DbXMvgmn.js} +1 -1
  18. package/src/assets/web-panel/assets/{Checkbox-DwdmZ71L.js → Checkbox-CEY982vx.js} +1 -1
  19. package/src/assets/web-panel/assets/{Codegen-BrH2eYiP.js → Codegen-Dcm_DTvJ.js} +1 -1
  20. package/src/assets/web-panel/assets/{Col-BVJQEP2j.js → Col-C8SSu4KA.js} +1 -1
  21. package/src/assets/web-panel/assets/{Community-FGO3vZPq.js → Community-BVV9vwRR.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compact-DYGAFVnT.js → Compact-B7c5Vo18.js} +1 -1
  23. package/src/assets/web-panel/assets/{Compliance-CRvc8Bdt.js → Compliance-Tq9jSZ5a.js} +1 -1
  24. package/src/assets/web-panel/assets/{Cowork-D6Ah2m7A.js → Cowork-BJUjT09Q.js} +3 -3
  25. package/src/assets/web-panel/assets/{Cron-AXbU2ifR.js → Cron-CjV9PEaS.js} +2 -2
  26. package/src/assets/web-panel/assets/{Crosschain-C5DXgEFd.js → Crosschain-Dl7ReL8F.js} +1 -1
  27. package/src/assets/web-panel/assets/{DID-Bxh9QV9v.js → DID-CG8PjWmM.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dashboard-B-ZHEta-.js → Dashboard-CDBM6wmF.js} +2 -2
  29. package/src/assets/web-panel/assets/{Dropdown-66Ik1jqa.js → Dropdown-8_55bXTD.js} +1 -1
  30. package/src/assets/web-panel/assets/{EmailListRenderer-CCWk1BIM.js → EmailListRenderer-D3qOU1Cm.js} +1 -1
  31. package/src/assets/web-panel/assets/{FamilyGuardDashboard--9faIULK.js → FamilyGuardDashboard-Bv5oWMZF.js} +1 -1
  32. package/src/assets/web-panel/assets/{Federation-CejW9CgX.js → Federation-hpZ1xkKd.js} +1 -1
  33. package/src/assets/web-panel/assets/{FormItemContext-acHgcXki.js → FormItemContext-BN7GT191.js} +1 -1
  34. package/src/assets/web-panel/assets/{GenericCardRenderer-D2ghd_K4.js → GenericCardRenderer-PCRhfA7M.js} +1 -1
  35. package/src/assets/web-panel/assets/{Git-BOe1YJrV.js → Git-CIlP2vy7.js} +2 -2
  36. package/src/assets/web-panel/assets/{Governance-BjgzJsof.js → Governance-81lgm7YL.js} +1 -1
  37. package/src/assets/web-panel/assets/{Inference-CXCD5rnP.js → Inference-Cs24xMOV.js} +1 -1
  38. package/src/assets/web-panel/assets/{KnowledgeGraph-CHA8QgJT.js → KnowledgeGraph-CrJLVCZo.js} +1 -1
  39. package/src/assets/web-panel/assets/{Logs-DORPMcL6.js → Logs-DLyO8RKT.js} +2 -2
  40. package/src/assets/web-panel/assets/{MarkdownRenderer-CPPHz01z.js → MarkdownRenderer-DBOqijrP.js} +1 -1
  41. package/src/assets/web-panel/assets/{Marketplace-BCFlo1Yx.js → Marketplace-Dz7AbQZc.js} +1 -1
  42. package/src/assets/web-panel/assets/{McpTools-Dl_uZAKh.js → McpTools-BM0aFiWv.js} +3 -3
  43. package/src/assets/web-panel/assets/{Memory-DupHamwz.js → Memory-C9SJzENX.js} +2 -2
  44. package/src/assets/web-panel/assets/{MobileBridge-BRSMPJxW.js → MobileBridge-BO2HnNRk.js} +1 -1
  45. package/src/assets/web-panel/assets/{MobileProjects-BHpuzsDl.js → MobileProjects-CK_jMz0l.js} +1 -1
  46. package/src/assets/web-panel/assets/{Mtc-Ch0jOQfZ.js → Mtc-CfhrJsdO.js} +2 -2
  47. package/src/assets/web-panel/assets/{MtcAudit-qzwQrDi7.js → MtcAudit-BE2ELxgI.js} +4 -4
  48. package/src/assets/web-panel/assets/{Multisig-B5wHzUcm.js → Multisig-CgR_E3Jd.js} +3 -3
  49. package/src/assets/web-panel/assets/{NLProgramming-Hy9uAiA0.js → NLProgramming-Cw9445_K.js} +1 -1
  50. package/src/assets/web-panel/assets/{Notes-DkuchMC7.js → Notes-DZimkTrb.js} +3 -3
  51. package/src/assets/web-panel/assets/{NotificationSettings-CYZhD7Pi.js → NotificationSettings-DxHVh4uT.js} +1 -1
  52. package/src/assets/web-panel/assets/{OrderTableRenderer-DKOoqajt.js → OrderTableRenderer-Iy-pnX56.js} +1 -1
  53. package/src/assets/web-panel/assets/{Organization-D9AXn6j8.js → Organization-pPXJtWo4.js} +4 -4
  54. package/src/assets/web-panel/assets/{Overflow-Bg15J6hX.js → Overflow-YamdTJwA.js} +1 -1
  55. package/src/assets/web-panel/assets/{P2P--B54HoQn.js → P2P-BvqP53x7.js} +2 -2
  56. package/src/assets/web-panel/assets/{PdhVaultBrowser-Cz9Kk2Nb.js → PdhVaultBrowser-Blz1Xn2n.js} +3 -3
  57. package/src/assets/web-panel/assets/{Permissions-DHx38eS1.js → Permissions-CgFRQqFJ.js} +4 -4
  58. package/src/assets/web-panel/assets/{PersonalDataHub-Dw8i2hAs.js → PersonalDataHub-CFeo3-6O.js} +4 -4
  59. package/src/assets/web-panel/assets/{Pipeline-B2o6Ur2G.js → Pipeline-BkaRojEK.js} +1 -1
  60. package/src/assets/web-panel/assets/{Privacy-8g-h2fnu.js → Privacy-BNZEx2Qp.js} +1 -1
  61. package/src/assets/web-panel/assets/{ProjectInit-DuVTcINx.js → ProjectInit-HUBOgEEK.js} +2 -2
  62. package/src/assets/web-panel/assets/{ProjectSettings-C8njvdZX.js → ProjectSettings-CFMmhROS.js} +2 -2
  63. package/src/assets/web-panel/assets/Projects-Dc517BXp.js +1 -0
  64. package/src/assets/web-panel/assets/{Providers-wFqgod_W.js → Providers-DTLf8bgj.js} +1 -1
  65. package/src/assets/web-panel/assets/{QrScannerModal-9NCXrpmA.js → QrScannerModal-BBNjPszk.js} +1 -1
  66. package/src/assets/web-panel/assets/{QuickAsk-WUTNvFkY.js → QuickAsk-DCsHvk3G.js} +1 -1
  67. package/src/assets/web-panel/assets/{Recommend-xT4nYmju.js → Recommend-Dpr5YSop.js} +1 -1
  68. package/src/assets/web-panel/assets/{RemoteSession-fak1PBGC.js → RemoteSession-DmKnvqGg.js} +2 -2
  69. package/src/assets/web-panel/assets/{Reputation-D1AkQvD-.js → Reputation-CSRfuurX.js} +1 -1
  70. package/src/assets/web-panel/assets/{Row-DVfm6xGt.js → Row-CDj3pQ_w.js} +1 -1
  71. package/src/assets/web-panel/assets/{RssFeed-BDunoLSE.js → RssFeed-DI0a_kNq.js} +2 -2
  72. package/src/assets/web-panel/assets/{Search-OPycRoU3.js → Search-jAy7B2nU.js} +1 -1
  73. package/src/assets/web-panel/assets/{Security-C8-Fm3Dt.js → Security-CkHTqYhc.js} +4 -4
  74. package/src/assets/web-panel/assets/{Services-qM_sMpMl.js → Services-CP-0Nzga.js} +2 -2
  75. package/src/assets/web-panel/assets/{Skeleton-D3HBJjVF.js → Skeleton-BkF5-p3n.js} +1 -1
  76. package/src/assets/web-panel/assets/{Skills-jr67X-tP.js → Skills-BDu-utDE.js} +1 -1
  77. package/src/assets/web-panel/assets/{Sla-CS3ggyCg.js → Sla-CQvq_2Qb.js} +1 -1
  78. package/src/assets/web-panel/assets/{SpeechSettings-CTOCYxOi.js → SpeechSettings-T7Ap512g.js} +1 -1
  79. package/src/assets/web-panel/assets/{SyncSettings-D3s3cLT5.js → SyncSettings-Bt-PLvot.js} +2 -2
  80. package/src/assets/web-panel/assets/{Tasks-CdfoJ25m.js → Tasks-yLEcCogg.js} +1 -1
  81. package/src/assets/web-panel/assets/{Templates-Drb4AI8X.js → Templates-ByN3fmbr.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tenant-DzwR3Qkz.js → Tenant-DBI7hITH.js} +1 -1
  83. package/src/assets/web-panel/assets/{Terminal-D-ESq7xp.js → Terminal-B77_DlGX.js} +2 -2
  84. package/src/assets/web-panel/assets/{TimelineRenderer-BK-AUuws.js → TimelineRenderer-CsLTB_QO.js} +1 -1
  85. package/src/assets/web-panel/assets/{Tokens-xGTouuNp.js → Tokens-BV2N6cR8.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trigger-BvZj-v2H.js → Trigger-CjXWGH3p.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trust-BLC9CGmc.js → Trust-uqXIq3WC.js} +1 -1
  88. package/src/assets/web-panel/assets/{UkeySign-BSuCXpmE.js → UkeySign-D-6qu4vY.js} +1 -1
  89. package/src/assets/web-panel/assets/{VideoEditing-DT3A-_Ql.js → VideoEditing-CxGmx_2e.js} +1 -1
  90. package/src/assets/web-panel/assets/{Wallet-c1OXao85.js → Wallet-DSq7WlAg.js} +4 -4
  91. package/src/assets/web-panel/assets/{WebAuthn-CuA-F7KJ.js → WebAuthn-CDBiD57O.js} +2 -2
  92. package/src/assets/web-panel/assets/{WorkflowEditor-MANZrf82.js → WorkflowEditor-Z8f63TSb.js} +1 -1
  93. package/src/assets/web-panel/assets/{chat-D4Y4Ey0O.js → chat-B-UZFBjy.js} +1 -1
  94. package/src/assets/web-panel/assets/{colors-DDH06hKO.js → colors-CFk7K-7Q.js} +1 -1
  95. package/src/assets/web-panel/assets/{compact-item-Cym756Xj.js → compact-item-X0IVMvgi.js} +1 -1
  96. package/src/assets/web-panel/assets/{createContext-By4Nb1k-.js → createContext-DWg4j2n6.js} +1 -1
  97. package/src/assets/web-panel/assets/devWarning-B2IW1J_J.js +1 -0
  98. package/src/assets/web-panel/assets/{hasIn-Ch7OY258.js → hasIn-CkVCwNNF.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-D9le0-dc.js → index-5OcZHdzc.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CykROEJA.js → index-B273IY-E.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DjwgJ5Jd.js → index-B3-B3FWD.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CjNUTBwe.js → index-BB4KHHcv.js} +1 -1
  103. package/src/assets/web-panel/assets/index-BCp2ir-1.js +1 -0
  104. package/src/assets/web-panel/assets/{index-BFydNU6a.js → index-BG-GaZri.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-mL3nOcH6.js → index-BPBia4b-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-XGeQMvWK.js → index-BipwEbTA.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-D5sADPGY.js → index-BoskgPt9.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CV8qXTvb.js → index-Btqk6zWb.js} +1 -1
  109. package/src/assets/web-panel/assets/index-Bw4iuzRD.js +1 -0
  110. package/src/assets/web-panel/assets/{index-CJPks33Y.js → index-BzXjYUmd.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BBBUn5v7.js → index-C1ZAOJRW.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DiewptTL.js → index-CCLwoATF.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-OU8DZ9BL.js → index-CDfSD07S.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DvnywwUj.js → index-CLlP1E4X.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CT-3FYwd.js → index-CMCEXBRh.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-tZ5BUdad.js → index-CN8HZlLH.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DNlxihs8.js → index-CNKFsBlz.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CF3Lhyns.js → index-CUBkvFPH.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CV1UC4zo.js → index-Ca0mij1n.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DAkk1M7x.js → index-CbIAWbma.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DNEJzc0r.js → index-CbihMThv.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-q-s04OKn.js → index-CvOa-IFV.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BZB9q-Lp.js → index-Cvwu_rA_.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-oBsfUbyH.js → index-D-EJNxgR.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-ZY2Qs_Sn.js → index-D8uEL8Uw.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DtGValNi.js → index-D92g4l3n.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CpudmDhf.js → index-DCqpl_E_.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Bo20BfdS.js → index-DLSBks8h.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CUSUzaB8.js → index-Db_5xhrU.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CZn6dmZe.js → index-DcDggpWR.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CGsvEbbq.js → index-DeWKPQGs.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-jx7kr6mB.js → index-DhVHoqGL.js} +3 -3
  133. package/src/assets/web-panel/assets/{index-BIrRX-ra.js → index-DyWlOuak.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-6CpOV3Pn.js → index-LU54bChK.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-6-2eYBXr.js → index-OjnAwUJo.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-B51otVoZ.js → index-P83LDnCz.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-ArMrnx0v.js → index-_-9k3Tna.js} +1 -1
  138. package/src/assets/web-panel/assets/{initDefaultProps-DGcX9iPP.js → initDefaultProps-CFNgY8lJ.js} +1 -1
  139. package/src/assets/web-panel/assets/{motion-2SeL1D8A.js → motion-D-5RrDzn.js} +1 -1
  140. package/src/assets/web-panel/assets/{move-3cYbQCpS.js → move-DN-L0Bd-.js} +1 -1
  141. package/src/assets/web-panel/assets/{mtc-parser-IDdxfw0z.js → mtc-parser-6mgLSeCK.js} +1 -1
  142. package/src/assets/web-panel/assets/{omit-BNswdKO6.js → omit-ClWW8eTP.js} +1 -1
  143. package/src/assets/web-panel/assets/{pickAttrs-BwCnem2I.js → pickAttrs-Vystq3R8.js} +1 -1
  144. package/src/assets/web-panel/assets/{placementArrow-B9PtZ5rq.js → placementArrow-D0H9hK4W.js} +1 -1
  145. package/src/assets/web-panel/assets/{responsiveObserve-CPB6iSzV.js → responsiveObserve-B3iNRU-a.js} +1 -1
  146. package/src/assets/web-panel/assets/{slide-DZgyblZa.js → slide-CiMXe6am.js} +1 -1
  147. package/src/assets/web-panel/assets/{statusUtils-D82IBdsx.js → statusUtils-CGDZJ1uT.js} +1 -1
  148. package/src/assets/web-panel/assets/{styleChecker-qSHtosM-.js → styleChecker-D2zA6NkY.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFlexGapSupport-CmWO7h0I.js → useFlexGapSupport-C1sYU6QE.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFs-yLrs_ub4.js → useFs-BzUHSjg2.js} +1 -1
  151. package/src/assets/web-panel/assets/{usePersonalDataHub-CJ1VW6rh.js → usePersonalDataHub-CxB5yZCq.js} +1 -1
  152. package/src/assets/web-panel/assets/{vnode-CzY_moQ4.js → vnode-BfUfMwtc.js} +1 -1
  153. package/src/assets/web-panel/assets/{zoom-DAa7rEY5.js → zoom-CFYmj1TO.js} +1 -1
  154. package/src/assets/web-panel/index.html +1 -1
  155. package/src/command-help-index.json +2 -2
  156. package/src/command-manifest.json +2 -2
  157. package/src/commands/agent.js +80 -2
  158. package/src/commands/evolution.js +61 -42
  159. package/src/commands/learning.js +24 -8
  160. package/src/commands/serve.js +11 -2
  161. package/src/data/changelog.json +13 -0
  162. package/src/gateways/ws/session-protocol.js +1 -0
  163. package/src/gateways/ws/ws-agent-handler.js +70 -2
  164. package/src/gateways/ws/ws-server.js +8 -0
  165. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  166. package/src/lib/app-server/graph-runtime.js +115 -8
  167. package/src/lib/app-server/server.js +21 -2
  168. package/src/lib/app-server/websocket-transport.js +2 -0
  169. package/src/lib/evolution/agent-evolution-ingress.js +300 -0
  170. package/src/lib/evolution/agent-evolution-runtime-composition-brand.js +22 -0
  171. package/src/lib/evolution/agent-evolution-runtime-composition.js +369 -0
  172. package/src/lib/evolution/bounded-skill-improvement-pilot.js +498 -0
  173. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +752 -0
  174. package/src/lib/evolution/evolution-artifact-ports.js +48 -0
  175. package/src/lib/evolution/evolution-eval-gate.js +11 -4
  176. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +499 -0
  177. package/src/lib/evolution/evolution-evidence-projector.js +61 -1
  178. package/src/lib/evolution/evolution-file-witness.js +601 -0
  179. package/src/lib/evolution/evolution-ledger-file-backend.js +176 -0
  180. package/src/lib/evolution/evolution-ledger-ports.js +353 -16
  181. package/src/lib/evolution/evolution-ledger.js +1355 -54
  182. package/src/lib/evolution/evolution-run-ledger-adapter.js +409 -0
  183. package/src/lib/evolution/evolution-run-runtime-adapter.js +5 -0
  184. package/src/lib/evolution/evolution-run-wiki-maintenance-source.js +300 -0
  185. package/src/lib/evolution/scheduled-batch-wiki-maintenance-source.js +368 -0
  186. package/src/lib/evolution/skill-candidate-registry.js +649 -0
  187. package/src/lib/evolution/skill-evaluated-promotion-durability.js +899 -0
  188. package/src/lib/evolution/skill-evaluated-promotion.js +481 -0
  189. package/src/lib/evolution/skill-promotion-controller.js +220 -37
  190. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +451 -0
  191. package/src/lib/evolution/skill-promotion-review.js +793 -0
  192. package/src/lib/evolution/skill-registry-transition-capability.js +55 -0
  193. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +1280 -0
  194. package/src/lib/evolution/skill-registry-transition-source.js +372 -0
  195. package/src/lib/evolution/skill-release-registry.js +2191 -11
  196. package/src/lib/evolution/skill-target-matrix-eval.js +133 -10
  197. package/src/lib/evolution/structured-memory-agent-control-plane.js +222 -0
  198. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +351 -0
  199. package/src/lib/evolution/structured-memory-ledger-adapter.js +220 -0
  200. package/src/lib/evolution/structured-memory-policy-receipt-writer.js +164 -0
  201. package/src/lib/evolution/structured-memory-post-compact-hook.js +87 -0
  202. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +221 -0
  203. package/src/lib/evolution/structured-memory-semantic-review-pipeline.js +313 -0
  204. package/src/lib/evolution/wiki-informed-skill-proposer.js +343 -0
  205. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +200 -0
  206. package/src/lib/evolution/wiki-maintenance-trigger-ledger-adapter.js +687 -0
  207. package/src/lib/evolution-system.js +65 -30
  208. package/src/lib/graph-kernel/evolution-run-runtime-adapter.js +5 -0
  209. package/src/lib/hooks-v2-runtime.js +20 -0
  210. package/src/lib/mcp-lifecycle-authority.js +21 -2
  211. package/src/lib/remote-approval-bridge.js +24 -0
  212. package/src/lib/scheduler-kernel/store.js +62 -14
  213. package/src/repl/agent-repl.js +45 -0
  214. package/src/runtime/agent-core.js +68 -0
  215. package/src/runtime/agent-runtime.js +114 -1
  216. package/src/runtime/headless-runner.js +19 -0
  217. package/src/runtime/headless-stream.js +43 -0
  218. package/src/runtime/runtime-factory.js +19 -1
  219. package/src/assets/web-panel/assets/Projects-Ca9BAfu7.js +0 -1
  220. package/src/assets/web-panel/assets/devWarning-KO3pAGeO.js +0 -1
  221. package/src/assets/web-panel/assets/index-Bh4Rgkg2.js +0 -1
  222. package/src/assets/web-panel/assets/index-Dox_coTY.js +0 -1
  223. package/src/lib/learning/learning-hooks.js +0 -123
@@ -1,10 +1,10 @@
1
1
  /**
2
- * Self-Evolving System commands
3
- * chainlesschain evolution assess|learn|diagnose|repair|predict|growth|stats|export
2
+ * Evolution metrics and governance-record commands
3
+ * chainlesschain evolution assess|record-model-metrics|diagnose|repair|predict|growth|stats|export
4
4
  */
5
5
 
6
6
  import chalk from "chalk";
7
- import { intArg, floatArg } from "../lib/cli-arg.js";
7
+ import { intArg } from "../lib/cli-arg.js";
8
8
  import { numericOption } from "../lib/cli-numeric.js";
9
9
  import ora from "ora";
10
10
  import { logger } from "../lib/logger.js";
@@ -12,7 +12,7 @@ import { parseJsonOption } from "../lib/parse-json-option.js";
12
12
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
13
13
  import {
14
14
  assessCapability,
15
- trainIncremental,
15
+ recordIncrementalModelMetrics,
16
16
  selfDiagnose,
17
17
  selfRepair,
18
18
  predictBehavior,
@@ -26,10 +26,9 @@ import {
26
26
  REPAIR_STRATEGY,
27
27
  GROWTH_MILESTONE,
28
28
  assessCapabilityV2,
29
- getCapabilityV2,
30
29
  listCapabilitiesV2,
31
- trainIncrementalV2,
32
- listTrainingLogV2,
30
+ recordTrainingMetricsV2,
31
+ listTrainingMetricRecordsV2,
33
32
  selfDiagnoseV2,
34
33
  getDiagnosisV2,
35
34
  listDiagnosesV2,
@@ -45,7 +44,9 @@ import {
45
44
  export function registerEvolutionCommand(program) {
46
45
  const evolution = program
47
46
  .command("evolution")
48
- .description("Self-evolving AI system — capabilities, learning, diagnosis");
47
+ .description(
48
+ "Evolution metrics and governance records — not model training or active Skill promotion",
49
+ );
49
50
 
50
51
  // evolution assess <name> <score>
51
52
  evolution
@@ -95,12 +96,12 @@ export function registerEvolutionCommand(program) {
95
96
  }
96
97
  });
97
98
 
98
- // evolution learn <model-id>
99
+ // evolution record-model-metrics <model-id>
99
100
  evolution
100
- .command("learn")
101
- .description("Train a model with incremental data")
102
- .argument("<model-id>", "Model ID to train")
103
- .option("--data <json>", "Training data as JSON array")
101
+ .command("record-model-metrics")
102
+ .description("Record a synthetic model metric estimate (no training)")
103
+ .argument("<model-id>", "Model record ID")
104
+ .option("--data <json>", "Observed data as JSON array")
104
105
  .option(
105
106
  "--type <type>",
106
107
  "Model type (classification|regression)",
@@ -115,30 +116,33 @@ export function registerEvolutionCommand(program) {
115
116
  process.exit(1);
116
117
  }
117
118
  const db = ctx.db.getDatabase();
118
- const spinner = ora(`Training model: ${modelId}...`).start();
119
+ const spinner = ora(`Recording model metrics: ${modelId}...`).start();
119
120
 
120
121
  let data = [{ sample: true }];
121
122
  if (options.data) {
122
123
  try {
123
124
  data = JSON.parse(options.data);
124
- } catch (_err) {
125
+ } catch {
125
126
  // Use data string as single data point
126
127
  data = [options.data];
127
128
  }
128
129
  }
129
130
 
130
- const result = trainIncremental(db, modelId, data, {
131
+ const result = recordIncrementalModelMetrics(db, modelId, data, {
131
132
  type: options.type,
132
133
  });
133
- spinner.succeed("Model trained");
134
+ spinner.succeed("Model metrics recorded");
134
135
 
135
136
  if (options.json) {
136
137
  console.log(JSON.stringify(result, null, 2));
137
138
  } else {
138
139
  logger.log(chalk.bold(`Model: ${result.name}`));
139
140
  logger.log(` Type: ${result.type}`);
140
- logger.log(` Accuracy: ${chalk.cyan(result.accuracy.toFixed(4))}`);
141
+ logger.log(
142
+ ` Formula Estimate: ${chalk.cyan(result.accuracy.toFixed(4))}`,
143
+ );
141
144
  logger.log(` Data Points: ${result.dataPoints}`);
145
+ logger.log(` Training Performed: ${result.performedTraining}`);
142
146
  }
143
147
 
144
148
  await shutdown();
@@ -151,7 +155,7 @@ export function registerEvolutionCommand(program) {
151
155
  // evolution diagnose
152
156
  evolution
153
157
  .command("diagnose")
154
- .description("Run self-diagnosis on the system")
158
+ .description("Diagnose recorded evolution metrics")
155
159
  .option("--json", "Output as JSON")
156
160
  .action(async (options) => {
157
161
  try {
@@ -207,7 +211,7 @@ export function registerEvolutionCommand(program) {
207
211
  // evolution repair <issue>
208
212
  evolution
209
213
  .command("repair")
210
- .description("Self-repair a diagnosed issue")
214
+ .description("Apply a maintenance strategy to a recorded diagnosis")
211
215
  .argument("<issue>", "Issue type (high-memory|stale-cache|degraded-model)")
212
216
  .option("--json", "Output as JSON")
213
217
  .action(async (issue, options) => {
@@ -387,7 +391,7 @@ export function registerEvolutionCommand(program) {
387
391
  // evolution export <model-id>
388
392
  evolution
389
393
  .command("export")
390
- .description("Export a model for portability")
394
+ .description("Export a model metric record for portability")
391
395
  .argument("<model-id>", "Model ID to export")
392
396
  .option("--json", "Output as JSON")
393
397
  .action(async (modelId, options) => {
@@ -510,32 +514,42 @@ export function registerEvolutionCommand(program) {
510
514
  });
511
515
 
512
516
  evolution
513
- .command("train-v2")
514
- .description("Record V2 incremental training run")
517
+ .command("record-training-metrics-v2")
518
+ .description("Record caller-supplied loss metrics (no training)")
515
519
  .requiredOption(
516
520
  "-s, --strategy <s>",
517
521
  "replay|elastic-weight|knowledge-distill",
518
522
  )
519
523
  .requiredOption("--data-size <n>", "Data size")
520
- .requiredOption("--loss-before <n>", "Loss before training")
521
- .requiredOption("--loss-after <n>", "Loss after training")
524
+ .requiredOption("--loss-before <n>", "Caller-reported loss before")
525
+ .requiredOption("--loss-after <n>", "Caller-reported loss after")
522
526
  .option("--duration-ms <n>", "Duration in ms", "0")
523
527
  .option("--json", "Output as JSON")
524
528
  .action((options) => {
525
529
  try {
526
- const r = trainIncrementalV2({
530
+ const r = recordTrainingMetricsV2({
527
531
  strategy: options.strategy,
528
- dataSize: numericOption(options.dataSize, { name: "--data-size", min: 0 }),
529
- lossBefore: numericOption(options.lossBefore, { name: "--loss-before" }),
532
+ dataSize: numericOption(options.dataSize, {
533
+ name: "--data-size",
534
+ min: 0,
535
+ }),
536
+ lossBefore: numericOption(options.lossBefore, {
537
+ name: "--loss-before",
538
+ }),
530
539
  lossAfter: numericOption(options.lossAfter, { name: "--loss-after" }),
531
- durationMs: numericOption(options.durationMs, { name: "--duration-ms", min: 0, fallback: 0 }),
540
+ durationMs: numericOption(options.durationMs, {
541
+ name: "--duration-ms",
542
+ min: 0,
543
+ fallback: 0,
544
+ }),
532
545
  });
533
546
  if (options.json) console.log(JSON.stringify(r, null, 2));
534
547
  else {
535
- logger.log(chalk.bold(`Training ${r.id}`));
548
+ logger.log(chalk.bold(`Metric Record ${r.id}`));
536
549
  logger.log(` Strategy: ${r.strategy}`);
537
550
  logger.log(` KnowledgeRetention ${r.knowledgeRetention.toFixed(4)}`);
538
- logger.log(` Status: ${r.status}`);
551
+ logger.log(` Assessment: ${r.retentionAssessment}`);
552
+ logger.log(` Training Performed: ${r.performedTraining}`);
539
553
  }
540
554
  } catch (err) {
541
555
  logger.error(`Failed: ${err.message}`);
@@ -544,20 +558,23 @@ export function registerEvolutionCommand(program) {
544
558
  });
545
559
 
546
560
  evolution
547
- .command("training-log-v2")
548
- .description("List V2 training runs")
561
+ .command("training-metrics-v2")
562
+ .description("List V2 training metric records")
549
563
  .option("-s, --strategy <s>", "Filter by strategy")
550
564
  .option("-l, --limit <n>", "Limit")
551
565
  .option("--json", "Output as JSON")
552
566
  .action((options) => {
553
567
  const limit = options.limit ? parseInt(options.limit, 10) : undefined;
554
- const list = listTrainingLogV2({ strategy: options.strategy, limit });
568
+ const list = listTrainingMetricRecordsV2({
569
+ strategy: options.strategy,
570
+ limit,
571
+ });
555
572
  if (options.json) console.log(JSON.stringify(list, null, 2));
556
573
  else {
557
- if (list.length === 0) logger.log("(no training log)");
574
+ if (list.length === 0) logger.log("(no metric records)");
558
575
  for (const t of list) {
559
576
  logger.log(
560
- `${new Date(t.createdAt).toISOString()} ${t.strategy.padEnd(20)} retention=${t.knowledgeRetention.toFixed(3)} status=${t.status}`,
577
+ `${new Date(t.createdAt).toISOString()} ${t.strategy.padEnd(20)} retention=${t.knowledgeRetention.toFixed(3)} assessment=${t.retentionAssessment}`,
561
578
  );
562
579
  }
563
580
  }
@@ -565,7 +582,7 @@ export function registerEvolutionCommand(program) {
565
582
 
566
583
  evolution
567
584
  .command("diagnose-v2")
568
- .description("Run V2 self-diagnosis")
585
+ .description("Diagnose recorded V2 evolution metrics")
569
586
  .option("--scope <s>", "Scope", "system")
570
587
  .option("--depth <d>", "Depth", "shallow")
571
588
  .option("--json", "Output as JSON")
@@ -623,7 +640,7 @@ export function registerEvolutionCommand(program) {
623
640
 
624
641
  evolution
625
642
  .command("repair-v2")
626
- .description("Apply V2 self-repair to a diagnosis")
643
+ .description("Record a V2 maintenance strategy for a diagnosis")
627
644
  .argument("<diagnosis-id>", "Diagnosis ID")
628
645
  .requiredOption(
629
646
  "-s, --strategy <s>",
@@ -647,7 +664,7 @@ export function registerEvolutionCommand(program) {
647
664
 
648
665
  evolution
649
666
  .command("predict-v2")
650
- .description("V2 behavior prediction")
667
+ .description("Project behavior from recorded V2 metrics")
651
668
  .option("--horizon-ms <n>", "Time horizon in ms")
652
669
  .option("--json", "Output as JSON")
653
670
  .action((options) => {
@@ -705,8 +722,10 @@ export function registerEvolutionCommand(program) {
705
722
  .option("--json", "Output as JSON")
706
723
  .action((options) => {
707
724
  const period = {};
708
- if (options.from) period.fromMs = numericOption(options.from, { name: "--from", min: 0 });
709
- if (options.to) period.toMs = numericOption(options.to, { name: "--to", min: 0 });
725
+ if (options.from)
726
+ period.fromMs = numericOption(options.from, { name: "--from", min: 0 });
727
+ if (options.to)
728
+ period.toMs = numericOption(options.to, { name: "--to", min: 0 });
710
729
  const list = getGrowthLogV2({
711
730
  milestoneType: options.type,
712
731
  period: Object.keys(period).length ? period : undefined,
@@ -772,7 +791,7 @@ export function registerEvolutionCommand(program) {
772
791
  else {
773
792
  logger.log(chalk.bold("Evolution Stats V2"));
774
793
  logger.log(` Capabilities: ${s.capabilityCount}`);
775
- logger.log(` TrainingRuns: ${s.trainingRuns}`);
794
+ logger.log(` TrainingMetricRecords: ${s.trainingMetricRecords}`);
776
795
  logger.log(
777
796
  ` Diagnoses: ${s.diagnoses.total} (${Object.entries(
778
797
  s.diagnoses.bySeverity,
@@ -62,7 +62,7 @@ export function registerLearningCommand(program) {
62
62
  const learning = program
63
63
  .command("learning")
64
64
  .description(
65
- "Autonomous learning loop — trajectories, reflection, skill synthesis",
65
+ "Learning records — trajectories, reflection, and governed candidate attempts",
66
66
  );
67
67
 
68
68
  // learning stats
@@ -162,7 +162,9 @@ export function registerLearningCommand(program) {
162
162
  // learning export — §8.3 cross-device backup: full dump of learning_trajectories
163
163
  learning
164
164
  .command("export")
165
- .description("Export all learning trajectories as JSON (module 101 §8.3 backup)")
165
+ .description(
166
+ "Export all learning trajectories as JSON (module 101 §8.3 backup)",
167
+ )
166
168
  .option("--output <file>", "Write JSON array to file (default: stdout)")
167
169
  .option("--json", "Output JSON ({ok,count} with --output; array otherwise)")
168
170
  .action(async (options) => {
@@ -172,15 +174,24 @@ export function registerLearningCommand(program) {
172
174
  logger.error("Database not available");
173
175
  process.exit(1);
174
176
  }
175
- const { exportTrajectories } = await import("../lib/learning/learning-tables.js");
177
+ const { exportTrajectories } =
178
+ await import("../lib/learning/learning-tables.js");
176
179
  const rows = exportTrajectories(ctx.db.getDatabase());
177
180
  if (options.output) {
178
181
  const fs = await import("fs");
179
182
  fs.writeFileSync(options.output, JSON.stringify(rows), "utf-8");
180
183
  if (options.json) {
181
- console.log(JSON.stringify({ ok: true, count: rows.length, output: options.output }));
184
+ console.log(
185
+ JSON.stringify({
186
+ ok: true,
187
+ count: rows.length,
188
+ output: options.output,
189
+ }),
190
+ );
182
191
  } else {
183
- logger.log(`exported ${rows.length} trajectories → ${options.output}`);
192
+ logger.log(
193
+ `exported ${rows.length} trajectories → ${options.output}`,
194
+ );
184
195
  }
185
196
  } else {
186
197
  console.log(JSON.stringify(rows));
@@ -195,7 +206,9 @@ export function registerLearningCommand(program) {
195
206
  // learning import — §8.3 restore: idempotent upsert by id from a JSON-array file
196
207
  learning
197
208
  .command("import")
198
- .description("Import learning trajectories from a JSON array file (idempotent upsert by id; §8.3)")
209
+ .description(
210
+ "Import learning trajectories from a JSON array file (idempotent upsert by id; §8.3)",
211
+ )
199
212
  .requiredOption("--input <file>", "JSON array of trajectories to import")
200
213
  .option("--json", "Output JSON result")
201
214
  .action(async (options) => {
@@ -210,7 +223,8 @@ export function registerLearningCommand(program) {
210
223
  logger.error("Database not available");
211
224
  process.exit(1);
212
225
  }
213
- const { importTrajectories } = await import("../lib/learning/learning-tables.js");
226
+ const { importTrajectories } =
227
+ await import("../lib/learning/learning-tables.js");
214
228
  const result = importTrajectories(ctx.db.getDatabase(), rows);
215
229
  if (options.json) {
216
230
  console.log(JSON.stringify(result));
@@ -302,7 +316,9 @@ export function registerLearningCommand(program) {
302
316
  // learning synthesize
303
317
  learning
304
318
  .command("synthesize")
305
- .description("Synthesize new skills from eligible trajectories")
319
+ .description(
320
+ "Attempt a governed Skill candidate from eligible trajectories",
321
+ )
306
322
  .option("--json", "Output as JSON")
307
323
  .action(async (options) => {
308
324
  try {
@@ -7,7 +7,9 @@ import { logger } from "../lib/logger.js";
7
7
  import { createAgentRuntimeFactory } from "../runtime/runtime-factory.js";
8
8
  import path from "node:path";
9
9
 
10
- export function registerServeCommand(program) {
10
+ export function registerServeCommand(program, dependencies = {}) {
11
+ const evolutionCompositionFactory =
12
+ dependencies.evolutionCompositionFactory ?? null;
11
13
  const serve = program
12
14
  .command("serve")
13
15
  .description("Start WebSocket server for remote CLI access")
@@ -126,6 +128,7 @@ export function registerServeCommand(program) {
126
128
  maxConnections: parseInt(opts.maxConnections, 10),
127
129
  store,
128
130
  kernelFactory: () => new CliAgentKernelAdapter({ cwd }),
131
+ evolutionCompositionFactory,
129
132
  maxQueuedRequests,
130
133
  });
131
134
  const info = await host.start();
@@ -155,6 +158,7 @@ export function registerServeCommand(program) {
155
158
  await runStdioAppServer({
156
159
  store,
157
160
  kernel: new CliAgentKernelAdapter({ cwd }),
161
+ evolutionCompositionFactory,
158
162
  maxQueuedRequests,
159
163
  });
160
164
  } finally {
@@ -162,7 +166,12 @@ export function registerServeCommand(program) {
162
166
  }
163
167
  return;
164
168
  }
165
- const runtime = createAgentRuntimeFactory().createServerRuntime({
169
+ const runtime = createAgentRuntimeFactory({
170
+ deps:
171
+ evolutionCompositionFactory === null
172
+ ? {}
173
+ : { evolutionCompositionFactory },
174
+ }).createServerRuntime({
166
175
  port: parseInt(opts.port, 10),
167
176
  host: opts.host,
168
177
  token: opts.token,
@@ -1,6 +1,19 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.166.18",
7
+ "cliVersions": ["0.3.9", "0.166.17", "0.166.18"],
8
+ "date": "2026-09-03",
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Added - cc CLI 0.166.18 and Session Core 0.3.9: governed Skill evolution",
13
+ "body": "> `chainlesschain` **0.166.17 -> 0.166.18** and\n> `@chainlesschain/session-core` **0.3.8 -> 0.3.9** (release candidate,\n> 2026-09-03).\n\n- **Evaluated promotion**: Skill candidates must carry target-matrix evidence,\n current-revision bindings, durable promotion receipts, and revocation-aware\n attestations before an active revision can change.\n- **Crash-safe lifecycle**: tenant-scoped candidate and release registries,\n lease/CAS promotion, last-known-good tracking, and rollback keep concurrent\n or interrupted mutations fail closed.\n- **Bounded improvement pilot**: the CLI can propose constrained Skill\n improvements and wiki-informed candidates without directly rewriting or\n activating installed Skills.\n- **Cross-runtime evidence**: CLI, Desktop, and Graph adapters share the new\n Session Core `EvolutionRun` and Skill-invocation receipt contracts, keeping\n evidence identity consistent across runtimes.\n- **Deterministic async hooks**: tool execution now skips `async:true`\n `PostToolUse` hooks when no supervisor/dispatcher is available, preventing a\n hidden background command and a Windows timing race.\n- **Release boundary**: publication requires this exact candidate commit to\n pass every configured Linux, Windows, and macOS job in `CLI CI` and\n `CLI Strict Sandbox`; a local test result or an older green run is not\n release authorization."
14
+ }
15
+ ]
16
+ },
4
17
  {
5
18
  "productVersion": null,
6
19
  "cliVersion": "0.166.16",
@@ -647,6 +647,7 @@ async function ensureSessionHandler(
647
647
  db: server.sessionManager.db,
648
648
  sessionHostLease,
649
649
  sessionBudgetRoot,
650
+ evolutionCompositionFactory: server.evolutionCompositionFactory,
650
651
  });
651
652
  sessionHostLease = null;
652
653
  sessionBudgetRoot = null;
@@ -11,7 +11,7 @@
11
11
  * adapter.
12
12
  */
13
13
 
14
- import { randomUUID } from "node:crypto";
14
+ import { createHash, randomUUID } from "node:crypto";
15
15
  import { agentLoop, formatToolArgs } from "../../runtime/agent-core.js";
16
16
  import { classifyToolSideEffect } from "../../lib/side-effect-ledger.js";
17
17
  import { DiffReviewFollowUpTracker } from "../../lib/diff-review-follow-up.js";
@@ -81,6 +81,7 @@ import {
81
81
  rejectSessionBudgetUsageUnknown,
82
82
  } from "../../lib/session-budget-usage.js";
83
83
  import { HostResourceBudget } from "../../lib/host-resource-budget.js";
84
+ import { captureAgentEvolutionRuntimeComposition } from "../../lib/evolution/agent-evolution-runtime-composition-brand.js";
84
85
 
85
86
  const CANONICAL_WS_TURN_QUEUES = new Map();
86
87
  const CANONICAL_WS_CLAIM_CAS_ATTEMPTS = 4;
@@ -176,6 +177,7 @@ export class WSAgentHandler {
176
177
  sessionHostLease = null,
177
178
  sessionBudgetRoot = null,
178
179
  hostResourceBudget = null,
180
+ evolutionCompositionFactory = null,
179
181
  }) {
180
182
  this.session = session;
181
183
  this.interaction = interaction;
@@ -243,6 +245,13 @@ export class WSAgentHandler {
243
245
  this._mcpRecoveryRevision = null;
244
246
  this._mcpRecoveryClient = null;
245
247
  this._agentLoop = runAgentLoop || agentLoop;
248
+ if (
249
+ evolutionCompositionFactory !== null &&
250
+ typeof evolutionCompositionFactory !== "function"
251
+ ) {
252
+ throw new TypeError("evolutionCompositionFactory must be a function");
253
+ }
254
+ this._evolutionCompositionFactory = evolutionCompositionFactory;
246
255
  this._compactionLlmQuery = compactionLlmQuery || null;
247
256
  this._compactionSettlementBlock = null;
248
257
  this._compactionChatFn =
@@ -297,6 +306,46 @@ export class WSAgentHandler {
297
306
  : Object.freeze(hostSystemPrefix);
298
307
  }
299
308
 
309
+ async _prepareEvolutionTurn(requestId) {
310
+ if (!this._evolutionCompositionFactory) return null;
311
+ const sessionId = String(this.session.id);
312
+ const stableRequestId =
313
+ typeof requestId === "string" && requestId.trim()
314
+ ? requestId.trim()
315
+ : randomUUID();
316
+ const runId = `ws-run-${createHash("sha256")
317
+ .update(`${sessionId}\0${stableRequestId}`, "utf8")
318
+ .digest("hex")}`;
319
+ try {
320
+ const composition = captureAgentEvolutionRuntimeComposition(
321
+ await this._evolutionCompositionFactory(
322
+ Object.freeze({
323
+ mode: "legacy-websocket",
324
+ runId,
325
+ sessionId,
326
+ requestId: stableRequestId,
327
+ cwd: this.session.projectRoot,
328
+ }),
329
+ ),
330
+ );
331
+ if (composition.runId !== runId) {
332
+ throw new TypeError(
333
+ "Agent evolution composition belongs to another WebSocket turn",
334
+ );
335
+ }
336
+ await composition.evolutionIngress.start();
337
+ return composition;
338
+ } catch (cause) {
339
+ if (cause?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED") throw cause;
340
+ const error = new Error(
341
+ `WebSocket evolution ingress failed: ${cause?.message || String(cause)}`,
342
+ { cause },
343
+ );
344
+ error.code = "CC_AGENT_EVOLUTION_INGRESS_FAILED";
345
+ throw error;
346
+ }
347
+ }
348
+
300
349
  attachInteraction(interaction) {
301
350
  if (!interaction || interaction === this.interaction) return false;
302
351
  const previous = this.interaction;
@@ -1277,6 +1326,7 @@ export class WSAgentHandler {
1277
1326
  let runRecorded = false;
1278
1327
  let canonicalTurn = null;
1279
1328
  let strictUsageTelemetry = false;
1329
+ let evolutionComposition = null;
1280
1330
 
1281
1331
  try {
1282
1332
  const { session } = this;
@@ -1335,7 +1385,19 @@ export class WSAgentHandler {
1335
1385
  });
1336
1386
  return;
1337
1387
  }
1338
- } else {
1388
+ }
1389
+ if (this._evolutionCompositionFactory !== null) {
1390
+ evolutionComposition = await this._prepareEvolutionTurn(requestId);
1391
+ }
1392
+ if (evolutionComposition !== null) {
1393
+ await evolutionComposition.evolutionIngress.ingestUserPrompt({
1394
+ content: userMessage,
1395
+ sessionId: session.id,
1396
+ requestId: requestId || null,
1397
+ source: "legacy-websocket",
1398
+ });
1399
+ }
1400
+ if (session.canonicalJsonlSession !== true) {
1339
1401
  session.messages.push({ role: "user", content: userMessage });
1340
1402
  }
1341
1403
  this._recordSessionState("run.started", {
@@ -1520,6 +1582,9 @@ export class WSAgentHandler {
1520
1582
  session.messages,
1521
1583
  loopOptions,
1522
1584
  )) {
1585
+ if (evolutionComposition !== null) {
1586
+ await evolutionComposition.evolutionIngress.ingestAgentEvent(event);
1587
+ }
1523
1588
  switch (event.type) {
1524
1589
  case "slot-filling":
1525
1590
  this.interaction.emit("slot-filling", {
@@ -1710,6 +1775,9 @@ export class WSAgentHandler {
1710
1775
  break;
1711
1776
 
1712
1777
  case "response-complete":
1778
+ if (evolutionComposition !== null) {
1779
+ await evolutionComposition.evolutionIngress.complete();
1780
+ }
1713
1781
  if (session.canonicalJsonlSession === true) {
1714
1782
  const settled = this._settleCanonicalSuccess(
1715
1783
  canonicalTurn,
@@ -322,6 +322,14 @@ export class ChainlessChainWSServer extends EventEmitter {
322
322
  LEGACY_WS_FLOW_DEFAULTS.maxCommandOutputBytes,
323
323
  );
324
324
  this._spawnProcess = options.spawn || _deps.spawn;
325
+ if (
326
+ options.evolutionCompositionFactory != null &&
327
+ typeof options.evolutionCompositionFactory !== "function"
328
+ ) {
329
+ throw new TypeError("evolutionCompositionFactory must be a function");
330
+ }
331
+ this.evolutionCompositionFactory =
332
+ options.evolutionCompositionFactory || null;
325
333
 
326
334
  /** Optional Phase-5 envelope bus for fan-out to hosted HTTP SSE. */
327
335
  this.envelopeBus = options.envelopeBus || null;
@@ -196,6 +196,10 @@ export class CliAgentKernelAdapter {
196
196
  interactiveApprovals: true,
197
197
  includePartialMessages: true,
198
198
  ephemeral: false,
199
+ evolutionIngress:
200
+ turnOptions.evolutionIngress ??
201
+ this.sessionOptions.evolutionIngress ??
202
+ null,
199
203
  },
200
204
  {
201
205
  ...this.dependencies,