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.
- package/README.md +17 -10
- package/completions/_cc +1 -1
- package/completions/cc.bash +1 -1
- package/completions/cc.fish +1 -1
- package/completions/cc.ps1 +1 -1
- package/package.json +2 -2
- package/src/assets/web-panel/assets/{AIOps-CTxa2Wbq.js → AIOps-CQSBl3hY.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DHrQyYhy.js → ActionButton-IQt-vRLt.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DQiUqcNl.js → Analytics-DkHC8O7k.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-_Iz4r6wt.js → AppLayout-CSti2P2T.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BNs63YHo.js → Artifacts-C57hxn3v.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BgHIqRLn.js → Audit-DByLntcf.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DUQ5axBB.js → BackgroundAgents-D1Bd2EOa.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CJ51E9Vw.js → Backup-VstHzHng.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-o-5toA_R.js → BaseInput-CLhdexIf.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Cu7a-x1L.js → Chat-BefC_JZS.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-BUyYkAXr.js → ChatBubbleRenderer-DbXMvgmn.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DwdmZ71L.js → Checkbox-CEY982vx.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BrH2eYiP.js → Codegen-Dcm_DTvJ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BVJQEP2j.js → Col-C8SSu4KA.js} +1 -1
- package/src/assets/web-panel/assets/{Community-FGO3vZPq.js → Community-BVV9vwRR.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DYGAFVnT.js → Compact-B7c5Vo18.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CRvc8Bdt.js → Compliance-Tq9jSZ5a.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-D6Ah2m7A.js → Cowork-BJUjT09Q.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-AXbU2ifR.js → Cron-CjV9PEaS.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-C5DXgEFd.js → Crosschain-Dl7ReL8F.js} +1 -1
- package/src/assets/web-panel/assets/{DID-Bxh9QV9v.js → DID-CG8PjWmM.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-B-ZHEta-.js → Dashboard-CDBM6wmF.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-66Ik1jqa.js → Dropdown-8_55bXTD.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CCWk1BIM.js → EmailListRenderer-D3qOU1Cm.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard--9faIULK.js → FamilyGuardDashboard-Bv5oWMZF.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-CejW9CgX.js → Federation-hpZ1xkKd.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-acHgcXki.js → FormItemContext-BN7GT191.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D2ghd_K4.js → GenericCardRenderer-PCRhfA7M.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BOe1YJrV.js → Git-CIlP2vy7.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BjgzJsof.js → Governance-81lgm7YL.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CXCD5rnP.js → Inference-Cs24xMOV.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CHA8QgJT.js → KnowledgeGraph-CrJLVCZo.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DORPMcL6.js → Logs-DLyO8RKT.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-CPPHz01z.js → MarkdownRenderer-DBOqijrP.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-BCFlo1Yx.js → Marketplace-Dz7AbQZc.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Dl_uZAKh.js → McpTools-BM0aFiWv.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DupHamwz.js → Memory-C9SJzENX.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BRSMPJxW.js → MobileBridge-BO2HnNRk.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-BHpuzsDl.js → MobileProjects-CK_jMz0l.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Ch0jOQfZ.js → Mtc-CfhrJsdO.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-qzwQrDi7.js → MtcAudit-BE2ELxgI.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-B5wHzUcm.js → Multisig-CgR_E3Jd.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Hy9uAiA0.js → NLProgramming-Cw9445_K.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DkuchMC7.js → Notes-DZimkTrb.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CYZhD7Pi.js → NotificationSettings-DxHVh4uT.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DKOoqajt.js → OrderTableRenderer-Iy-pnX56.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-D9AXn6j8.js → Organization-pPXJtWo4.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Bg15J6hX.js → Overflow-YamdTJwA.js} +1 -1
- package/src/assets/web-panel/assets/{P2P--B54HoQn.js → P2P-BvqP53x7.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Cz9Kk2Nb.js → PdhVaultBrowser-Blz1Xn2n.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DHx38eS1.js → Permissions-CgFRQqFJ.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dw8i2hAs.js → PersonalDataHub-CFeo3-6O.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-B2o6Ur2G.js → Pipeline-BkaRojEK.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-8g-h2fnu.js → Privacy-BNZEx2Qp.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DuVTcINx.js → ProjectInit-HUBOgEEK.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C8njvdZX.js → ProjectSettings-CFMmhROS.js} +2 -2
- package/src/assets/web-panel/assets/Projects-Dc517BXp.js +1 -0
- package/src/assets/web-panel/assets/{Providers-wFqgod_W.js → Providers-DTLf8bgj.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-9NCXrpmA.js → QrScannerModal-BBNjPszk.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-WUTNvFkY.js → QuickAsk-DCsHvk3G.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-xT4nYmju.js → Recommend-Dpr5YSop.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-fak1PBGC.js → RemoteSession-DmKnvqGg.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-D1AkQvD-.js → Reputation-CSRfuurX.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DVfm6xGt.js → Row-CDj3pQ_w.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BDunoLSE.js → RssFeed-DI0a_kNq.js} +2 -2
- package/src/assets/web-panel/assets/{Search-OPycRoU3.js → Search-jAy7B2nU.js} +1 -1
- package/src/assets/web-panel/assets/{Security-C8-Fm3Dt.js → Security-CkHTqYhc.js} +4 -4
- package/src/assets/web-panel/assets/{Services-qM_sMpMl.js → Services-CP-0Nzga.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-D3HBJjVF.js → Skeleton-BkF5-p3n.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-jr67X-tP.js → Skills-BDu-utDE.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CS3ggyCg.js → Sla-CQvq_2Qb.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CTOCYxOi.js → SpeechSettings-T7Ap512g.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-D3s3cLT5.js → SyncSettings-Bt-PLvot.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CdfoJ25m.js → Tasks-yLEcCogg.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-Drb4AI8X.js → Templates-ByN3fmbr.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DzwR3Qkz.js → Tenant-DBI7hITH.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D-ESq7xp.js → Terminal-B77_DlGX.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BK-AUuws.js → TimelineRenderer-CsLTB_QO.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-xGTouuNp.js → Tokens-BV2N6cR8.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BvZj-v2H.js → Trigger-CjXWGH3p.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BLC9CGmc.js → Trust-uqXIq3WC.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-BSuCXpmE.js → UkeySign-D-6qu4vY.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DT3A-_Ql.js → VideoEditing-CxGmx_2e.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-c1OXao85.js → Wallet-DSq7WlAg.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CuA-F7KJ.js → WebAuthn-CDBiD57O.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-MANZrf82.js → WorkflowEditor-Z8f63TSb.js} +1 -1
- package/src/assets/web-panel/assets/{chat-D4Y4Ey0O.js → chat-B-UZFBjy.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DDH06hKO.js → colors-CFk7K-7Q.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Cym756Xj.js → compact-item-X0IVMvgi.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-By4Nb1k-.js → createContext-DWg4j2n6.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-B2IW1J_J.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Ch7OY258.js → hasIn-CkVCwNNF.js} +1 -1
- package/src/assets/web-panel/assets/{index-D9le0-dc.js → index-5OcZHdzc.js} +1 -1
- package/src/assets/web-panel/assets/{index-CykROEJA.js → index-B273IY-E.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjwgJ5Jd.js → index-B3-B3FWD.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjNUTBwe.js → index-BB4KHHcv.js} +1 -1
- package/src/assets/web-panel/assets/index-BCp2ir-1.js +1 -0
- package/src/assets/web-panel/assets/{index-BFydNU6a.js → index-BG-GaZri.js} +1 -1
- package/src/assets/web-panel/assets/{index-mL3nOcH6.js → index-BPBia4b-.js} +1 -1
- package/src/assets/web-panel/assets/{index-XGeQMvWK.js → index-BipwEbTA.js} +1 -1
- package/src/assets/web-panel/assets/{index-D5sADPGY.js → index-BoskgPt9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CV8qXTvb.js → index-Btqk6zWb.js} +1 -1
- package/src/assets/web-panel/assets/index-Bw4iuzRD.js +1 -0
- package/src/assets/web-panel/assets/{index-CJPks33Y.js → index-BzXjYUmd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBBUn5v7.js → index-C1ZAOJRW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DiewptTL.js → index-CCLwoATF.js} +1 -1
- package/src/assets/web-panel/assets/{index-OU8DZ9BL.js → index-CDfSD07S.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvnywwUj.js → index-CLlP1E4X.js} +1 -1
- package/src/assets/web-panel/assets/{index-CT-3FYwd.js → index-CMCEXBRh.js} +1 -1
- package/src/assets/web-panel/assets/{index-tZ5BUdad.js → index-CN8HZlLH.js} +1 -1
- package/src/assets/web-panel/assets/{index-DNlxihs8.js → index-CNKFsBlz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CF3Lhyns.js → index-CUBkvFPH.js} +1 -1
- package/src/assets/web-panel/assets/{index-CV1UC4zo.js → index-Ca0mij1n.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAkk1M7x.js → index-CbIAWbma.js} +1 -1
- package/src/assets/web-panel/assets/{index-DNEJzc0r.js → index-CbihMThv.js} +1 -1
- package/src/assets/web-panel/assets/{index-q-s04OKn.js → index-CvOa-IFV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZB9q-Lp.js → index-Cvwu_rA_.js} +1 -1
- package/src/assets/web-panel/assets/{index-oBsfUbyH.js → index-D-EJNxgR.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZY2Qs_Sn.js → index-D8uEL8Uw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtGValNi.js → index-D92g4l3n.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpudmDhf.js → index-DCqpl_E_.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bo20BfdS.js → index-DLSBks8h.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUSUzaB8.js → index-Db_5xhrU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZn6dmZe.js → index-DcDggpWR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGsvEbbq.js → index-DeWKPQGs.js} +1 -1
- package/src/assets/web-panel/assets/{index-jx7kr6mB.js → index-DhVHoqGL.js} +3 -3
- package/src/assets/web-panel/assets/{index-BIrRX-ra.js → index-DyWlOuak.js} +1 -1
- package/src/assets/web-panel/assets/{index-6CpOV3Pn.js → index-LU54bChK.js} +1 -1
- package/src/assets/web-panel/assets/{index-6-2eYBXr.js → index-OjnAwUJo.js} +1 -1
- package/src/assets/web-panel/assets/{index-B51otVoZ.js → index-P83LDnCz.js} +1 -1
- package/src/assets/web-panel/assets/{index-ArMrnx0v.js → index-_-9k3Tna.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DGcX9iPP.js → initDefaultProps-CFNgY8lJ.js} +1 -1
- package/src/assets/web-panel/assets/{motion-2SeL1D8A.js → motion-D-5RrDzn.js} +1 -1
- package/src/assets/web-panel/assets/{move-3cYbQCpS.js → move-DN-L0Bd-.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-IDdxfw0z.js → mtc-parser-6mgLSeCK.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BNswdKO6.js → omit-ClWW8eTP.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BwCnem2I.js → pickAttrs-Vystq3R8.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-B9PtZ5rq.js → placementArrow-D0H9hK4W.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CPB6iSzV.js → responsiveObserve-B3iNRU-a.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DZgyblZa.js → slide-CiMXe6am.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-D82IBdsx.js → statusUtils-CGDZJ1uT.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-qSHtosM-.js → styleChecker-D2zA6NkY.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CmWO7h0I.js → useFlexGapSupport-C1sYU6QE.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-yLrs_ub4.js → useFs-BzUHSjg2.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CJ1VW6rh.js → usePersonalDataHub-CxB5yZCq.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CzY_moQ4.js → vnode-BfUfMwtc.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DAa7rEY5.js → zoom-CFYmj1TO.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/command-manifest.json +2 -2
- package/src/commands/agent.js +80 -2
- package/src/commands/evolution.js +61 -42
- package/src/commands/learning.js +24 -8
- package/src/commands/serve.js +11 -2
- package/src/data/changelog.json +13 -0
- package/src/gateways/ws/session-protocol.js +1 -0
- package/src/gateways/ws/ws-agent-handler.js +70 -2
- package/src/gateways/ws/ws-server.js +8 -0
- package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
- package/src/lib/app-server/graph-runtime.js +115 -8
- package/src/lib/app-server/server.js +21 -2
- package/src/lib/app-server/websocket-transport.js +2 -0
- package/src/lib/evolution/agent-evolution-ingress.js +300 -0
- package/src/lib/evolution/agent-evolution-runtime-composition-brand.js +22 -0
- package/src/lib/evolution/agent-evolution-runtime-composition.js +369 -0
- package/src/lib/evolution/bounded-skill-improvement-pilot.js +498 -0
- package/src/lib/evolution/evidence-backed-wiki-maintainer.js +752 -0
- package/src/lib/evolution/evolution-artifact-ports.js +48 -0
- package/src/lib/evolution/evolution-eval-gate.js +11 -4
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +499 -0
- package/src/lib/evolution/evolution-evidence-projector.js +61 -1
- package/src/lib/evolution/evolution-file-witness.js +601 -0
- package/src/lib/evolution/evolution-ledger-file-backend.js +176 -0
- package/src/lib/evolution/evolution-ledger-ports.js +353 -16
- package/src/lib/evolution/evolution-ledger.js +1355 -54
- package/src/lib/evolution/evolution-run-ledger-adapter.js +409 -0
- package/src/lib/evolution/evolution-run-runtime-adapter.js +5 -0
- package/src/lib/evolution/evolution-run-wiki-maintenance-source.js +300 -0
- package/src/lib/evolution/scheduled-batch-wiki-maintenance-source.js +368 -0
- package/src/lib/evolution/skill-candidate-registry.js +649 -0
- package/src/lib/evolution/skill-evaluated-promotion-durability.js +899 -0
- package/src/lib/evolution/skill-evaluated-promotion.js +481 -0
- package/src/lib/evolution/skill-promotion-controller.js +220 -37
- package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +451 -0
- package/src/lib/evolution/skill-promotion-review.js +793 -0
- package/src/lib/evolution/skill-registry-transition-capability.js +55 -0
- package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +1280 -0
- package/src/lib/evolution/skill-registry-transition-source.js +372 -0
- package/src/lib/evolution/skill-release-registry.js +2191 -11
- package/src/lib/evolution/skill-target-matrix-eval.js +133 -10
- package/src/lib/evolution/structured-memory-agent-control-plane.js +222 -0
- package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +351 -0
- package/src/lib/evolution/structured-memory-ledger-adapter.js +220 -0
- package/src/lib/evolution/structured-memory-policy-receipt-writer.js +164 -0
- package/src/lib/evolution/structured-memory-post-compact-hook.js +87 -0
- package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +221 -0
- package/src/lib/evolution/structured-memory-semantic-review-pipeline.js +313 -0
- package/src/lib/evolution/wiki-informed-skill-proposer.js +343 -0
- package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +200 -0
- package/src/lib/evolution/wiki-maintenance-trigger-ledger-adapter.js +687 -0
- package/src/lib/evolution-system.js +65 -30
- package/src/lib/graph-kernel/evolution-run-runtime-adapter.js +5 -0
- package/src/lib/hooks-v2-runtime.js +20 -0
- package/src/lib/mcp-lifecycle-authority.js +21 -2
- package/src/lib/remote-approval-bridge.js +24 -0
- package/src/lib/scheduler-kernel/store.js +62 -14
- package/src/repl/agent-repl.js +45 -0
- package/src/runtime/agent-core.js +68 -0
- package/src/runtime/agent-runtime.js +114 -1
- package/src/runtime/headless-runner.js +19 -0
- package/src/runtime/headless-stream.js +43 -0
- package/src/runtime/runtime-factory.js +19 -1
- package/src/assets/web-panel/assets/Projects-Ca9BAfu7.js +0 -1
- package/src/assets/web-panel/assets/devWarning-KO3pAGeO.js +0 -1
- package/src/assets/web-panel/assets/index-Bh4Rgkg2.js +0 -1
- package/src/assets/web-panel/assets/index-Dox_coTY.js +0 -1
- package/src/lib/learning/learning-hooks.js +0 -123
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* chainlesschain evolution assess|
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
32
|
-
|
|
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(
|
|
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
|
|
99
|
+
// evolution record-model-metrics <model-id>
|
|
99
100
|
evolution
|
|
100
|
-
.command("
|
|
101
|
-
.description("
|
|
102
|
-
.argument("<model-id>", "Model ID
|
|
103
|
-
.option("--data <json>", "
|
|
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(`
|
|
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
|
|
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 =
|
|
131
|
+
const result = recordIncrementalModelMetrics(db, modelId, data, {
|
|
131
132
|
type: options.type,
|
|
132
133
|
});
|
|
133
|
-
spinner.succeed("Model
|
|
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(
|
|
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("
|
|
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("
|
|
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("
|
|
514
|
-
.description("Record
|
|
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>", "
|
|
521
|
-
.requiredOption("--loss-after <n>", "
|
|
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 =
|
|
530
|
+
const r = recordTrainingMetricsV2({
|
|
527
531
|
strategy: options.strategy,
|
|
528
|
-
dataSize: numericOption(options.dataSize, {
|
|
529
|
-
|
|
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, {
|
|
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(`
|
|
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(`
|
|
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-
|
|
548
|
-
.description("List V2 training
|
|
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 =
|
|
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
|
|
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)}
|
|
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("
|
|
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("
|
|
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("
|
|
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)
|
|
709
|
-
|
|
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(`
|
|
794
|
+
logger.log(` TrainingMetricRecords: ${s.trainingMetricRecords}`);
|
|
776
795
|
logger.log(
|
|
777
796
|
` Diagnoses: ${s.diagnoses.total} (${Object.entries(
|
|
778
797
|
s.diagnoses.bySeverity,
|
package/src/commands/learning.js
CHANGED
|
@@ -62,7 +62,7 @@ export function registerLearningCommand(program) {
|
|
|
62
62
|
const learning = program
|
|
63
63
|
.command("learning")
|
|
64
64
|
.description(
|
|
65
|
-
"
|
|
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(
|
|
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 } =
|
|
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(
|
|
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(
|
|
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(
|
|
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 } =
|
|
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(
|
|
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 {
|
package/src/commands/serve.js
CHANGED
|
@@ -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(
|
|
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,
|
package/src/data/changelog.json
CHANGED
|
@@ -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",
|
|
@@ -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
|
-
}
|
|
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,
|