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
|
@@ -108,7 +108,7 @@ export function loadFromDb(db) {
|
|
|
108
108
|
} catch {
|
|
109
109
|
parameters = {};
|
|
110
110
|
}
|
|
111
|
-
// keyed by id (matches
|
|
111
|
+
// keyed by id (matches recordIncrementalModelMetrics modelId)
|
|
112
112
|
models.set(row.id, {
|
|
113
113
|
id: row.id,
|
|
114
114
|
name: row.name,
|
|
@@ -220,10 +220,19 @@ export function assessCapability(db, name, score, category = "general") {
|
|
|
220
220
|
}
|
|
221
221
|
|
|
222
222
|
/**
|
|
223
|
-
*
|
|
224
|
-
*
|
|
223
|
+
* Record a synthetic model metric projection.
|
|
224
|
+
*
|
|
225
|
+
* This does not load a model, execute a trainer, update weights, or evaluate
|
|
226
|
+
* predictions. The legacy `accuracy` column is retained for database
|
|
227
|
+
* compatibility and stores only this formula estimate:
|
|
228
|
+
* min(0.99, previousEstimate + 0.01 * log(1 + dataPoints)).
|
|
225
229
|
*/
|
|
226
|
-
export function
|
|
230
|
+
export function recordIncrementalModelMetrics(
|
|
231
|
+
db,
|
|
232
|
+
modelId,
|
|
233
|
+
newData,
|
|
234
|
+
options = {},
|
|
235
|
+
) {
|
|
227
236
|
ensureEvolutionTables(db);
|
|
228
237
|
loadFromDb(db);
|
|
229
238
|
|
|
@@ -261,11 +270,11 @@ export function trainIncremental(db, modelId, newData, options = {}) {
|
|
|
261
270
|
JSON.stringify(model.parameters),
|
|
262
271
|
);
|
|
263
272
|
|
|
264
|
-
//
|
|
273
|
+
// Record an observation, not evidence that training or evaluation occurred.
|
|
265
274
|
const logEntry = {
|
|
266
275
|
id: crypto.randomUUID(),
|
|
267
|
-
eventType: "model-
|
|
268
|
-
description: `
|
|
276
|
+
eventType: "model-metrics-recorded",
|
|
277
|
+
description: `Recorded formula metrics for ${modelId}: +${dataSize} data points, estimate=${model.accuracy.toFixed(4)}`,
|
|
269
278
|
capabilityId: null,
|
|
270
279
|
delta: dataSize,
|
|
271
280
|
timestamp: new Date().toISOString(),
|
|
@@ -284,7 +293,20 @@ export function trainIncremental(db, modelId, newData, options = {}) {
|
|
|
284
293
|
logEntry.timestamp,
|
|
285
294
|
);
|
|
286
295
|
|
|
287
|
-
return {
|
|
296
|
+
return {
|
|
297
|
+
...model,
|
|
298
|
+
metricKind: "synthetic-formula-estimate",
|
|
299
|
+
status: "metrics_recorded",
|
|
300
|
+
performedTraining: false,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* @deprecated Use recordIncrementalModelMetrics. This compatibility alias does
|
|
306
|
+
* not train a model and returns the same metrics-only record.
|
|
307
|
+
*/
|
|
308
|
+
export function trainIncremental(db, modelId, newData, options = {}) {
|
|
309
|
+
return recordIncrementalModelMetrics(db, modelId, newData, options);
|
|
288
310
|
}
|
|
289
311
|
|
|
290
312
|
/**
|
|
@@ -435,7 +457,7 @@ export function selfRepair(db, issue) {
|
|
|
435
457
|
break;
|
|
436
458
|
}
|
|
437
459
|
case "degraded-model": {
|
|
438
|
-
// Reset low
|
|
460
|
+
// Reset low formula estimates for fresh metric collection.
|
|
439
461
|
for (const [, model] of models) {
|
|
440
462
|
if (model.accuracy < 0.6) {
|
|
441
463
|
model.accuracy = 0.5;
|
|
@@ -446,7 +468,7 @@ export function selfRepair(db, issue) {
|
|
|
446
468
|
db.prepare(
|
|
447
469
|
`UPDATE evolution_models SET accuracy = ?, data_points = ?, updated_at = datetime('now') WHERE id = ?`,
|
|
448
470
|
).run(model.accuracy, model.dataPoints, model.id);
|
|
449
|
-
actions.push(`Reset
|
|
471
|
+
actions.push(`Reset metric record ${model.id} for reassessment`);
|
|
450
472
|
}
|
|
451
473
|
}
|
|
452
474
|
break;
|
|
@@ -486,6 +508,7 @@ export function selfRepair(db, issue) {
|
|
|
486
508
|
* Predict user behavior based on historical patterns.
|
|
487
509
|
*/
|
|
488
510
|
export function predictBehavior(db, userId, options = {}) {
|
|
511
|
+
void options;
|
|
489
512
|
ensureEvolutionTables(db);
|
|
490
513
|
loadFromDb(db);
|
|
491
514
|
|
|
@@ -641,7 +664,7 @@ const TRAIN_STRATEGY = Object.freeze({
|
|
|
641
664
|
});
|
|
642
665
|
|
|
643
666
|
const _v2CapabilitiesByDim = new Map(); // dimension → { id, dimension, score, previousScore, trend, sampleCount, assessedAt, metadata }
|
|
644
|
-
const
|
|
667
|
+
const _v2TrainingMetricRecords = []; // caller-supplied losses plus derived retention assessment
|
|
645
668
|
const _v2DiagnosisById = new Map(); // diagnosisId → { id, scope, severity, anomaliesDetected, rootCause, repairSuggestion, repairStatus, repairedAt, createdAt }
|
|
646
669
|
const _v2Milestones = []; // { id, type, description, capabilityId?, details, timestamp }
|
|
647
670
|
const _v2Config = {
|
|
@@ -721,7 +744,11 @@ export function listCapabilitiesV2() {
|
|
|
721
744
|
.sort((a, b) => a.dimension.localeCompare(b.dimension));
|
|
722
745
|
}
|
|
723
746
|
|
|
724
|
-
|
|
747
|
+
/**
|
|
748
|
+
* Record caller-supplied before/after loss metrics and derive a retention
|
|
749
|
+
* ratio. No training, model mutation, or independent evaluation occurs.
|
|
750
|
+
*/
|
|
751
|
+
export function recordTrainingMetricsV2({
|
|
725
752
|
strategy,
|
|
726
753
|
dataSize,
|
|
727
754
|
lossBefore,
|
|
@@ -750,31 +777,39 @@ export function trainIncrementalV2({
|
|
|
750
777
|
lossAfter,
|
|
751
778
|
knowledgeRetention,
|
|
752
779
|
durationMs,
|
|
753
|
-
|
|
780
|
+
retentionAssessment:
|
|
754
781
|
knowledgeRetention >= _v2Config.knowledgeRetentionThreshold
|
|
755
|
-
? "
|
|
782
|
+
? "threshold_met"
|
|
756
783
|
: "retention_low",
|
|
784
|
+
status: "metrics_recorded",
|
|
785
|
+
performedTraining: false,
|
|
757
786
|
createdAt: Date.now(),
|
|
758
787
|
};
|
|
759
|
-
|
|
760
|
-
if (entry.status === "completed" && lossAfter < lossBefore) {
|
|
761
|
-
recordMilestone({
|
|
762
|
-
type: GROWTH_MILESTONE.KNOWLEDGE_EXPANSION,
|
|
763
|
-
description: `${strategy} training reduced loss ${lossBefore}→${lossAfter}`,
|
|
764
|
-
details: { strategy, dataSize, knowledgeRetention },
|
|
765
|
-
});
|
|
766
|
-
}
|
|
788
|
+
_v2TrainingMetricRecords.push(entry);
|
|
767
789
|
return { ...entry };
|
|
768
790
|
}
|
|
769
791
|
|
|
770
|
-
|
|
771
|
-
|
|
792
|
+
/**
|
|
793
|
+
* @deprecated Use recordTrainingMetricsV2. This compatibility alias records
|
|
794
|
+
* metrics only and never reports training completion.
|
|
795
|
+
*/
|
|
796
|
+
export function trainIncrementalV2(options) {
|
|
797
|
+
return recordTrainingMetricsV2(options);
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
export function listTrainingMetricRecordsV2({ strategy, limit } = {}) {
|
|
801
|
+
let list = [..._v2TrainingMetricRecords];
|
|
772
802
|
if (strategy) list = list.filter((e) => e.strategy === strategy);
|
|
773
803
|
list.sort((a, b) => b.createdAt - a.createdAt);
|
|
774
804
|
if (Number.isFinite(limit) && limit > 0) list = list.slice(0, limit);
|
|
775
805
|
return list;
|
|
776
806
|
}
|
|
777
807
|
|
|
808
|
+
/** @deprecated Use listTrainingMetricRecordsV2. */
|
|
809
|
+
export function listTrainingLogV2({ strategy, limit } = {}) {
|
|
810
|
+
return listTrainingMetricRecordsV2({ strategy, limit });
|
|
811
|
+
}
|
|
812
|
+
|
|
778
813
|
export function selfDiagnoseV2({ scope = "system", depth = "shallow" } = {}) {
|
|
779
814
|
const anomalies = [];
|
|
780
815
|
let severity = DIAGNOSIS_SEVERITY.NORMAL;
|
|
@@ -793,9 +828,9 @@ export function selfDiagnoseV2({ scope = "system", depth = "shallow" } = {}) {
|
|
|
793
828
|
}
|
|
794
829
|
}
|
|
795
830
|
|
|
796
|
-
//
|
|
797
|
-
const
|
|
798
|
-
const lowRetention =
|
|
831
|
+
// Retention anomalies in caller-supplied metric records.
|
|
832
|
+
const recentMetricRecords = _v2TrainingMetricRecords.slice(-10);
|
|
833
|
+
const lowRetention = recentMetricRecords.filter(
|
|
799
834
|
(t) => t.knowledgeRetention < _v2Config.knowledgeRetentionThreshold,
|
|
800
835
|
);
|
|
801
836
|
if (lowRetention.length >= 3) {
|
|
@@ -814,7 +849,7 @@ export function selfDiagnoseV2({ scope = "system", depth = "shallow" } = {}) {
|
|
|
814
849
|
rootCause = `Capability ${top.dimension} dropped sharply`;
|
|
815
850
|
repairSuggestion = REPAIR_STRATEGY.PARAMETER_TUNE;
|
|
816
851
|
} else if (top.type === "catastrophic_forgetting") {
|
|
817
|
-
rootCause = "
|
|
852
|
+
rootCause = "Derived retention below threshold in recent metric records";
|
|
818
853
|
repairSuggestion = REPAIR_STRATEGY.MODEL_ROLLBACK;
|
|
819
854
|
}
|
|
820
855
|
}
|
|
@@ -1028,7 +1063,7 @@ export function getEvolutionStatsV2() {
|
|
|
1028
1063
|
}
|
|
1029
1064
|
return {
|
|
1030
1065
|
capabilityCount: _v2CapabilitiesByDim.size,
|
|
1031
|
-
|
|
1066
|
+
trainingMetricRecords: _v2TrainingMetricRecords.length,
|
|
1032
1067
|
diagnoses: { total: _v2DiagnosisById.size, bySeverity },
|
|
1033
1068
|
milestones: { total: _v2Milestones.length, byType: byMilestone },
|
|
1034
1069
|
};
|
|
@@ -1036,7 +1071,7 @@ export function getEvolutionStatsV2() {
|
|
|
1036
1071
|
|
|
1037
1072
|
export function _resetV2State() {
|
|
1038
1073
|
_v2CapabilitiesByDim.clear();
|
|
1039
|
-
|
|
1074
|
+
_v2TrainingMetricRecords.length = 0;
|
|
1040
1075
|
_v2DiagnosisById.clear();
|
|
1041
1076
|
_v2Milestones.length = 0;
|
|
1042
1077
|
_v2Config.enabled = true;
|
|
@@ -872,6 +872,26 @@ class HooksV2Runtime extends EventEmitter {
|
|
|
872
872
|
}
|
|
873
873
|
}
|
|
874
874
|
for (const hook of asyncHooks) {
|
|
875
|
+
if (
|
|
876
|
+
options.skipAsyncWithoutDispatcher === true &&
|
|
877
|
+
typeof options.asyncDispatcher !== "function"
|
|
878
|
+
) {
|
|
879
|
+
results.push({
|
|
880
|
+
execId: crypto.randomUUID(),
|
|
881
|
+
hookId: hook.id,
|
|
882
|
+
sourceHookId: hook.databaseHookId || hook.id,
|
|
883
|
+
hookName: hook.databaseHookName || hook.description || hook.id,
|
|
884
|
+
event: eventName,
|
|
885
|
+
type: hook.type,
|
|
886
|
+
priority: normalizeHookPriority(hook.priority),
|
|
887
|
+
executionMode: HOOK_EXECUTION_MODE.ASYNC,
|
|
888
|
+
status: "skipped",
|
|
889
|
+
decision: "continue",
|
|
890
|
+
deferred: false,
|
|
891
|
+
skipReason: "async_dispatcher_unavailable",
|
|
892
|
+
});
|
|
893
|
+
continue;
|
|
894
|
+
}
|
|
875
895
|
const queued = {
|
|
876
896
|
execId: crypto.randomUUID(),
|
|
877
897
|
hookId: hook.id,
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import crypto from "node:crypto";
|
|
13
|
+
import fs from "node:fs";
|
|
13
14
|
import path from "node:path";
|
|
14
15
|
import { getStatePath } from "./paths.js";
|
|
15
16
|
import {
|
|
@@ -454,8 +455,26 @@ export class McpLifecycleAuthority {
|
|
|
454
455
|
|
|
455
456
|
_read() {
|
|
456
457
|
if (!this.statePath) return validateStore(structuredClone(this._memory));
|
|
457
|
-
|
|
458
|
-
|
|
458
|
+
// A Windows replace can briefly make the destination path unobservable to
|
|
459
|
+
// an unlocked reader. Treating that ENOENT as an empty authority loses the
|
|
460
|
+
// server snapshot even though the replacement is about to become visible.
|
|
461
|
+
// Durable reads therefore share the exact strict lock used by mutations.
|
|
462
|
+
if (!fs.existsSync(path.dirname(this.statePath))) {
|
|
463
|
+
return validateStore({}, { missing: true });
|
|
464
|
+
}
|
|
465
|
+
return this._lock(
|
|
466
|
+
this.statePath,
|
|
467
|
+
() => {
|
|
468
|
+
const value = readSecurityStore(
|
|
469
|
+
this.statePath,
|
|
470
|
+
"MCP lifecycle authority",
|
|
471
|
+
);
|
|
472
|
+
return validateStore(value, {
|
|
473
|
+
missing: Object.keys(value).length === 0,
|
|
474
|
+
});
|
|
475
|
+
},
|
|
476
|
+
{ timeoutMs: 2000, staleMs: 30000, failIfUnavailable: true },
|
|
477
|
+
);
|
|
459
478
|
}
|
|
460
479
|
|
|
461
480
|
_mutate(mutator) {
|
|
@@ -53,6 +53,7 @@ import {
|
|
|
53
53
|
} from "./remote-control.js";
|
|
54
54
|
import { logger } from "./logger.js";
|
|
55
55
|
import { normalizeRemoteApprovalDecision } from "./remote-approval-decision.js";
|
|
56
|
+
import { captureStructuredMemoryPolicyReceiptWriter } from "./evolution/structured-memory-policy-receipt-writer.js";
|
|
56
57
|
|
|
57
58
|
const DEFAULT_DECISION_TIMEOUT_MS = 5 * 60 * 1000;
|
|
58
59
|
const REMOTE_LEASE_AUTHORIZATION_KIND =
|
|
@@ -102,6 +103,7 @@ export class RemoteApprovalBridge {
|
|
|
102
103
|
membershipHostAuthorityLockFile = null,
|
|
103
104
|
expectedCoordinatorPublicKeySha256 = null,
|
|
104
105
|
onSecurityError = null,
|
|
106
|
+
memoryPolicyReceiptWriter = null,
|
|
105
107
|
} = {}) {
|
|
106
108
|
if (!wsUrl) throw new Error("wsUrl is required");
|
|
107
109
|
if (!agentSessionId) throw new Error("agentSessionId is required");
|
|
@@ -122,6 +124,10 @@ export class RemoteApprovalBridge {
|
|
|
122
124
|
this._securityErrors = [];
|
|
123
125
|
this._onSecurityError =
|
|
124
126
|
typeof onSecurityError === "function" ? onSecurityError : null;
|
|
127
|
+
this._memoryPolicyReceiptWriter =
|
|
128
|
+
memoryPolicyReceiptWriter === null
|
|
129
|
+
? null
|
|
130
|
+
: captureStructuredMemoryPolicyReceiptWriter(memoryPolicyReceiptWriter);
|
|
125
131
|
this._membershipHostStore =
|
|
126
132
|
membershipHostStore === undefined
|
|
127
133
|
? () =>
|
|
@@ -1090,6 +1096,22 @@ export class RemoteApprovalBridge {
|
|
|
1090
1096
|
) {
|
|
1091
1097
|
throw new Error("Consumed Remote approval statement binding changed");
|
|
1092
1098
|
}
|
|
1099
|
+
if (this._memoryPolicyReceiptWriter !== null) {
|
|
1100
|
+
await this._memoryPolicyReceiptWriter.retainConsumedApproval({
|
|
1101
|
+
adopted,
|
|
1102
|
+
operation: {
|
|
1103
|
+
requestId: durableLease.requestId,
|
|
1104
|
+
fingerprint: durableLease.fingerprint,
|
|
1105
|
+
binding: durableLease.binding,
|
|
1106
|
+
toolName: descriptor.toolName,
|
|
1107
|
+
action: context.action ?? null,
|
|
1108
|
+
workspace: descriptor.workspace,
|
|
1109
|
+
session: descriptor.session,
|
|
1110
|
+
targetEnv: descriptor.targetEnv,
|
|
1111
|
+
policyVersion: descriptor.policyVersion,
|
|
1112
|
+
},
|
|
1113
|
+
});
|
|
1114
|
+
}
|
|
1093
1115
|
return true;
|
|
1094
1116
|
}
|
|
1095
1117
|
|
|
@@ -1310,6 +1332,7 @@ export async function startHeadlessRemoteApproval({
|
|
|
1310
1332
|
writeErr = () => {},
|
|
1311
1333
|
isText = false,
|
|
1312
1334
|
decisionTimeoutMs = undefined,
|
|
1335
|
+
memoryPolicyReceiptWriter = null,
|
|
1313
1336
|
deps = {},
|
|
1314
1337
|
} = {}) {
|
|
1315
1338
|
let effectiveConfig = config;
|
|
@@ -1374,6 +1397,7 @@ export async function startHeadlessRemoteApproval({
|
|
|
1374
1397
|
agentSessionId,
|
|
1375
1398
|
scopes: ["observe", "approve"],
|
|
1376
1399
|
decisionTimeoutMs,
|
|
1400
|
+
memoryPolicyReceiptWriter,
|
|
1377
1401
|
});
|
|
1378
1402
|
try {
|
|
1379
1403
|
await bridge.start();
|
|
@@ -37,6 +37,7 @@ const STORAGE_FAILURE_CODE_SET = new Set(STORAGE_FAILURE_CODES);
|
|
|
37
37
|
export const SCHEDULER_APPLICATION_ID = 0x4343534b; // "CCSK"
|
|
38
38
|
export const SCHEDULER_STORE_SCHEMA_VERSION = 6;
|
|
39
39
|
export const DEFAULT_BUSY_TIMEOUT_MS = 5_000;
|
|
40
|
+
const SQLITE_BUSY_TRANSACTION_ATTEMPTS = 3;
|
|
40
41
|
export const MAX_LEASE_MS = 24 * 60 * 60 * 1_000;
|
|
41
42
|
export const MIN_AUTHORITY_WINDOW_MS = 60_000;
|
|
42
43
|
export const MAX_AUTHORITY_WINDOW_MS = 31 * 24 * 60 * 60 * 1_000;
|
|
@@ -748,6 +749,26 @@ function findStorageFailureCode(error) {
|
|
|
748
749
|
return null;
|
|
749
750
|
}
|
|
750
751
|
|
|
752
|
+
function isSqliteBusy(error) {
|
|
753
|
+
const visited = new Set();
|
|
754
|
+
let current = error;
|
|
755
|
+
while (
|
|
756
|
+
current !== null &&
|
|
757
|
+
(typeof current === "object" || typeof current === "function") &&
|
|
758
|
+
!visited.has(current)
|
|
759
|
+
) {
|
|
760
|
+
visited.add(current);
|
|
761
|
+
if (
|
|
762
|
+
typeof current.code === "string" &&
|
|
763
|
+
current.code.trim().toUpperCase().startsWith("SQLITE_BUSY")
|
|
764
|
+
) {
|
|
765
|
+
return true;
|
|
766
|
+
}
|
|
767
|
+
current = current.cause;
|
|
768
|
+
}
|
|
769
|
+
return false;
|
|
770
|
+
}
|
|
771
|
+
|
|
751
772
|
function storageUnavailableError({ phase, storageCode, commitState }) {
|
|
752
773
|
return new SchedulerKernelError(
|
|
753
774
|
"SCHEDULER_STORAGE_UNAVAILABLE",
|
|
@@ -2316,20 +2337,7 @@ export class SchedulerStore {
|
|
|
2316
2337
|
this._assertOpen();
|
|
2317
2338
|
let bodyState = "not_started";
|
|
2318
2339
|
let bodyObservedTransaction = false;
|
|
2319
|
-
|
|
2320
|
-
const transaction = this.db.transaction((...args) => {
|
|
2321
|
-
bodyState = "running";
|
|
2322
|
-
try {
|
|
2323
|
-
bodyObservedTransaction = this.db.inTransaction === true;
|
|
2324
|
-
} catch {
|
|
2325
|
-
bodyObservedTransaction = false;
|
|
2326
|
-
}
|
|
2327
|
-
const result = callback(...args);
|
|
2328
|
-
bodyState = "returned";
|
|
2329
|
-
return result;
|
|
2330
|
-
});
|
|
2331
|
-
return transaction.immediate();
|
|
2332
|
-
} catch (cause) {
|
|
2340
|
+
const failWrite = (cause) => {
|
|
2333
2341
|
if (cause instanceof SchedulerKernelError) throw cause;
|
|
2334
2342
|
const storageCode = findStorageFailureCode(cause);
|
|
2335
2343
|
if (!storageCode) throw cause;
|
|
@@ -2353,7 +2361,47 @@ export class SchedulerStore {
|
|
|
2353
2361
|
? "not_committed"
|
|
2354
2362
|
: "unknown",
|
|
2355
2363
|
});
|
|
2364
|
+
};
|
|
2365
|
+
let transaction;
|
|
2366
|
+
try {
|
|
2367
|
+
transaction = this.db.transaction((...args) => {
|
|
2368
|
+
bodyState = "running";
|
|
2369
|
+
try {
|
|
2370
|
+
bodyObservedTransaction = this.db.inTransaction === true;
|
|
2371
|
+
} catch {
|
|
2372
|
+
bodyObservedTransaction = false;
|
|
2373
|
+
}
|
|
2374
|
+
const result = callback(...args);
|
|
2375
|
+
bodyState = "returned";
|
|
2376
|
+
return result;
|
|
2377
|
+
});
|
|
2378
|
+
} catch (cause) {
|
|
2379
|
+
return failWrite(cause);
|
|
2380
|
+
}
|
|
2381
|
+
for (
|
|
2382
|
+
let attempt = 1;
|
|
2383
|
+
attempt <= SQLITE_BUSY_TRANSACTION_ATTEMPTS;
|
|
2384
|
+
attempt += 1
|
|
2385
|
+
) {
|
|
2386
|
+
bodyState = "not_started";
|
|
2387
|
+
bodyObservedTransaction = false;
|
|
2388
|
+
try {
|
|
2389
|
+
return transaction.immediate();
|
|
2390
|
+
} catch (cause) {
|
|
2391
|
+
// BEGIN IMMEDIATE can lose a cross-process writer race even after the
|
|
2392
|
+
// native busy timeout. Retrying is safe only while the callback has
|
|
2393
|
+
// never started, so application writes and side effects cannot repeat.
|
|
2394
|
+
if (
|
|
2395
|
+
bodyState === "not_started" &&
|
|
2396
|
+
isSqliteBusy(cause) &&
|
|
2397
|
+
attempt < SQLITE_BUSY_TRANSACTION_ATTEMPTS
|
|
2398
|
+
) {
|
|
2399
|
+
continue;
|
|
2400
|
+
}
|
|
2401
|
+
return failWrite(cause);
|
|
2402
|
+
}
|
|
2356
2403
|
}
|
|
2404
|
+
throw new Error("unreachable Scheduler transaction retry state");
|
|
2357
2405
|
}
|
|
2358
2406
|
|
|
2359
2407
|
_appendEvent({
|
package/src/repl/agent-repl.js
CHANGED
|
@@ -171,6 +171,8 @@ import { resolveSlashMacro } from "./slash-macro.js";
|
|
|
171
171
|
import { expandMcpPrompt, renderMcpSurface } from "./mcp-prompt.js";
|
|
172
172
|
import { newCostStore, addUsage } from "./session-cost.js";
|
|
173
173
|
import { extractPluginUsageAttribution } from "../lib/plugin-usage-attribution.js";
|
|
174
|
+
import { captureStructuredMemoryAgentControlPlane } from "../lib/evolution/structured-memory-agent-control-plane.js";
|
|
175
|
+
import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
|
|
174
176
|
import { formatManagedCheckpointEvent } from "../lib/managed-checkpoint-render.js";
|
|
175
177
|
import { parseThinkCommand, parseEffortCommand } from "./think-command.js";
|
|
176
178
|
import {
|
|
@@ -610,6 +612,10 @@ async function executeTool(name, args, context = {}) {
|
|
|
610
612
|
* unit-testable via the `options._coreLoop` injection seam.
|
|
611
613
|
*/
|
|
612
614
|
export async function agentLoop(messages, options) {
|
|
615
|
+
const evolutionIngress =
|
|
616
|
+
options.evolutionIngress == null
|
|
617
|
+
? null
|
|
618
|
+
: captureAgentEvolutionIngress(options.evolutionIngress);
|
|
613
619
|
const writeOut =
|
|
614
620
|
options.writeOut || ((text) => process.stdout.write(String(text)));
|
|
615
621
|
const waitForOutput = options.waitForOutput;
|
|
@@ -637,6 +643,13 @@ export async function agentLoop(messages, options) {
|
|
|
637
643
|
collapseValidatedPlainReplTailInPlace(messages);
|
|
638
644
|
}
|
|
639
645
|
const usageEvents = [];
|
|
646
|
+
const currentUserMessage = messages.at(-1);
|
|
647
|
+
if (evolutionIngress !== null && currentUserMessage?.role === "user") {
|
|
648
|
+
await evolutionIngress.ingestUserPrompt({
|
|
649
|
+
content: currentUserMessage.content,
|
|
650
|
+
sessionId: options.sessionId || null,
|
|
651
|
+
});
|
|
652
|
+
}
|
|
640
653
|
// Visible cross-vendor fallback notice: a silent switch from the configured
|
|
641
654
|
// provider onto another vendor (or a baseUrl relabel) is surfaced as a yellow
|
|
642
655
|
// line, so "configured X but it ran Y" never happens quietly. Callers may
|
|
@@ -757,6 +770,9 @@ export async function agentLoop(messages, options) {
|
|
|
757
770
|
onToolCallSettlement,
|
|
758
771
|
onProviderFallback,
|
|
759
772
|
})) {
|
|
773
|
+
if (evolutionIngress !== null) {
|
|
774
|
+
await evolutionIngress.ingestAgentEvent(event);
|
|
775
|
+
}
|
|
760
776
|
// P1 explicit turn→checkpoint binding — the REPL as PRODUCER: fold every
|
|
761
777
|
// loop event into the live table (checkpoint / tool / policy / child
|
|
762
778
|
// agent), mirroring the headless runner's feed. Advisory: a feeder failure
|
|
@@ -2909,10 +2925,38 @@ export function resolveReplPermanentMemoryStorage(
|
|
|
2909
2925
|
|
|
2910
2926
|
/** Start the agentic REPL with non-overridable production bindings. */
|
|
2911
2927
|
export async function startAgentRepl(options = {}) {
|
|
2928
|
+
const evolutionIngress =
|
|
2929
|
+
options.evolutionIngress == null
|
|
2930
|
+
? null
|
|
2931
|
+
: captureAgentEvolutionIngress(options.evolutionIngress);
|
|
2932
|
+
const structuredMemoryControlPlane =
|
|
2933
|
+
options.structuredMemoryControlPlane == null
|
|
2934
|
+
? null
|
|
2935
|
+
: captureStructuredMemoryAgentControlPlane(
|
|
2936
|
+
options.structuredMemoryControlPlane,
|
|
2937
|
+
);
|
|
2938
|
+
if (
|
|
2939
|
+
structuredMemoryControlPlane !== null &&
|
|
2940
|
+
options.memoryPolicyReceiptWriter != null &&
|
|
2941
|
+
options.memoryPolicyReceiptWriter !==
|
|
2942
|
+
structuredMemoryControlPlane.policyReceiptWriter
|
|
2943
|
+
) {
|
|
2944
|
+
throw new Error(
|
|
2945
|
+
"Agent REPL received conflicting structured memory policy capabilities",
|
|
2946
|
+
);
|
|
2947
|
+
}
|
|
2912
2948
|
const sessionHostLeaseScope = { lease: null };
|
|
2913
2949
|
const sessionBudgetRootScope = { root: null };
|
|
2914
2950
|
const runtimeOptions = {
|
|
2915
2951
|
...options,
|
|
2952
|
+
...(evolutionIngress === null ? {} : { evolutionIngress }),
|
|
2953
|
+
...(structuredMemoryControlPlane === null
|
|
2954
|
+
? {}
|
|
2955
|
+
: {
|
|
2956
|
+
structuredMemoryControlPlane,
|
|
2957
|
+
memoryPolicyReceiptWriter:
|
|
2958
|
+
structuredMemoryControlPlane.policyReceiptWriter,
|
|
2959
|
+
}),
|
|
2916
2960
|
_sessionHostLeaseScope: sessionHostLeaseScope,
|
|
2917
2961
|
_sessionBudgetRootScope: sessionBudgetRootScope,
|
|
2918
2962
|
};
|
|
@@ -3949,6 +3993,7 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
3949
3993
|
isText: false, // the REPL prints its own pairing lines below
|
|
3950
3994
|
allowLan: options.remoteControlAllowLan === true,
|
|
3951
3995
|
env: process.env,
|
|
3996
|
+
memoryPolicyReceiptWriter: options.memoryPolicyReceiptWriter ?? null,
|
|
3952
3997
|
});
|
|
3953
3998
|
_remoteApproval = {
|
|
3954
3999
|
bridge: started.bridge,
|
|
@@ -19,7 +19,10 @@ import path from "path";
|
|
|
19
19
|
import broker from "../lib/process-execution-broker/index.js";
|
|
20
20
|
import os from "os";
|
|
21
21
|
import { createHash, randomUUID } from "node:crypto";
|
|
22
|
+
import skillInvocationReceipt from "@chainlesschain/session-core/skill-invocation-receipt";
|
|
22
23
|
import { isProxy } from "node:util/types";
|
|
24
|
+
|
|
25
|
+
const { startSkillInvocation, settleSkillInvocation } = skillInvocationReceipt;
|
|
23
26
|
import sharedCodingAgentPolicy from "./coding-agent-policy.cjs";
|
|
24
27
|
import sharedShellPolicy from "./coding-agent-shell-policy.cjs";
|
|
25
28
|
import sharedPermissionRules from "../lib/permission-rules.cjs";
|
|
@@ -3570,6 +3573,8 @@ export async function executeTool(name, args, context = {}) {
|
|
|
3570
3573
|
onProviderReceipt: context.onProviderReceipt || null,
|
|
3571
3574
|
onToolCallBoundary: context.onToolCallBoundary || null,
|
|
3572
3575
|
onToolCallSettlement: context.onToolCallSettlement || null,
|
|
3576
|
+
hookTraceId: context.hookTraceId || null,
|
|
3577
|
+
skillLifecycleMode: context.skillLifecycleMode || "active",
|
|
3573
3578
|
backgroundUsageFailureState: context.backgroundUsageFailureState || null,
|
|
3574
3579
|
planManager,
|
|
3575
3580
|
permissionRules: context.permissionRules || null,
|
|
@@ -3707,6 +3712,7 @@ export async function executeTool(name, args, context = {}) {
|
|
|
3707
3712
|
{ cwd, broker },
|
|
3708
3713
|
)
|
|
3709
3714
|
: null,
|
|
3715
|
+
skipAsyncWithoutDispatcher: true,
|
|
3710
3716
|
},
|
|
3711
3717
|
);
|
|
3712
3718
|
for (const hookResult of outcome.results || []) {
|
|
@@ -5151,6 +5157,7 @@ async function executeToolInner(
|
|
|
5151
5157
|
// Hook-envelope tracing: this run's trace id, threaded into child loops
|
|
5152
5158
|
// (spawn_sub_agent / isolated run_skill) as their parent_id.
|
|
5153
5159
|
hookTraceId = null,
|
|
5160
|
+
skillLifecycleMode = "active",
|
|
5154
5161
|
},
|
|
5155
5162
|
) {
|
|
5156
5163
|
const localToolDescriptor =
|
|
@@ -7866,6 +7873,63 @@ async function executeToolInner(
|
|
|
7866
7873
|
});
|
|
7867
7874
|
}
|
|
7868
7875
|
|
|
7876
|
+
const selectedSkillDigest =
|
|
7877
|
+
match.executionIdentity?.contentDigest ||
|
|
7878
|
+
`sha256:${createHash("sha256").update(admittedSkillBody).digest("hex")}`;
|
|
7879
|
+
const toolSetDigest = `sha256:${createHash("sha256")
|
|
7880
|
+
.update(
|
|
7881
|
+
JSON.stringify(
|
|
7882
|
+
[...(effectiveAllowedToolNames || [])].map(String).sort(),
|
|
7883
|
+
),
|
|
7884
|
+
)
|
|
7885
|
+
.digest("hex")}`;
|
|
7886
|
+
const policyDigest = `sha256:${createHash("sha256")
|
|
7887
|
+
.update(
|
|
7888
|
+
JSON.stringify({
|
|
7889
|
+
hasApprovalGate: Boolean(approvalGate),
|
|
7890
|
+
hasPermissionRules: Boolean(permissionRules),
|
|
7891
|
+
hasSandbox: Boolean(sandbox),
|
|
7892
|
+
hermeticExecution: hermeticExecution === true,
|
|
7893
|
+
}),
|
|
7894
|
+
)
|
|
7895
|
+
.digest("hex")}`;
|
|
7896
|
+
const invocationStartedAt = Date.now();
|
|
7897
|
+
const invocationStart = startSkillInvocation({
|
|
7898
|
+
attributionRequired: ["automatic-candidate", "canary"].includes(
|
|
7899
|
+
skillLifecycleMode,
|
|
7900
|
+
),
|
|
7901
|
+
evolutionRunId: workflowEffectId || sessionId,
|
|
7902
|
+
traceId: hookTraceId || sessionId,
|
|
7903
|
+
trajectorySegmentId: turnId || toolCallId,
|
|
7904
|
+
selectedSkillDigest,
|
|
7905
|
+
routerCandidates: [
|
|
7906
|
+
{
|
|
7907
|
+
digest: selectedSkillDigest,
|
|
7908
|
+
score: 1,
|
|
7909
|
+
reason: "explicit-run_skill",
|
|
7910
|
+
},
|
|
7911
|
+
],
|
|
7912
|
+
providerModelVersion:
|
|
7913
|
+
llmOptions?.provider && llmOptions?.model
|
|
7914
|
+
? `${llmOptions.provider}:${llmOptions.model}`
|
|
7915
|
+
: null,
|
|
7916
|
+
toolSetDigest,
|
|
7917
|
+
osSandboxPermissionPolicyDigest: policyDigest,
|
|
7918
|
+
taskCohort: "cli:run_skill",
|
|
7919
|
+
});
|
|
7920
|
+
const settleInvocation = (executionStatus, result = {}) =>
|
|
7921
|
+
settleSkillInvocation(invocationStart, {
|
|
7922
|
+
executionStatus,
|
|
7923
|
+
graderReceipts: result.graderReceipts || [],
|
|
7924
|
+
userCorrectionRef: result.userCorrectionRef || null,
|
|
7925
|
+
tokensInput:
|
|
7926
|
+
result.usage?.inputTokens || result.usage?.tokensInput || 0,
|
|
7927
|
+
tokensOutput:
|
|
7928
|
+
result.usage?.outputTokens || result.usage?.tokensOutput || 0,
|
|
7929
|
+
costUsd: result.usage?.costUsd || result.costUsd || 0,
|
|
7930
|
+
latencyMs: Date.now() - invocationStartedAt,
|
|
7931
|
+
});
|
|
7932
|
+
|
|
7869
7933
|
// Check if skill requests isolation (via SKILL.md frontmatter)
|
|
7870
7934
|
const skillIsolation = match.isolation === true;
|
|
7871
7935
|
if (skillIsolation) {
|
|
@@ -8066,6 +8130,7 @@ async function executeToolInner(
|
|
|
8066
8130
|
success: false,
|
|
8067
8131
|
isolated: true,
|
|
8068
8132
|
skill: args.skill_name,
|
|
8133
|
+
invocationReceipt: settleInvocation("failed", result),
|
|
8069
8134
|
code: result?.code || "CC_SKILL_ISOLATED_EXECUTION_FAILED",
|
|
8070
8135
|
error: `Isolated skill execution failed: ${failureDetail}`,
|
|
8071
8136
|
...(result?.summary ? { summary: result.summary } : {}),
|
|
@@ -8075,6 +8140,7 @@ async function executeToolInner(
|
|
|
8075
8140
|
success: true,
|
|
8076
8141
|
isolated: true,
|
|
8077
8142
|
skill: args.skill_name,
|
|
8143
|
+
invocationReceipt: settleInvocation("completed", result),
|
|
8078
8144
|
summary: result.summary,
|
|
8079
8145
|
toolsUsed: result.toolsUsed,
|
|
8080
8146
|
});
|
|
@@ -8096,6 +8162,7 @@ async function executeToolInner(
|
|
|
8096
8162
|
success: false,
|
|
8097
8163
|
isolated: true,
|
|
8098
8164
|
skill: args.skill_name,
|
|
8165
|
+
invocationReceipt: settleInvocation("failed"),
|
|
8099
8166
|
code: err?.code || "CC_SKILL_ISOLATED_EXECUTION_FAILED",
|
|
8100
8167
|
error: `Isolated skill execution failed: ${err.message}`,
|
|
8101
8168
|
});
|
|
@@ -8112,6 +8179,7 @@ async function executeToolInner(
|
|
|
8112
8179
|
return attachDescriptor({
|
|
8113
8180
|
error: `Skill "${args.skill_name}" cannot execute handler.js directly. Add isolation: true and use the controlled agent-tool path.`,
|
|
8114
8181
|
code: "CC_SKILL_DIRECT_HANDLER_BLOCKED",
|
|
8182
|
+
invocationReceipt: settleInvocation("blocked"),
|
|
8115
8183
|
policy: { decision: "blocked", via: "skill-execution-boundary" },
|
|
8116
8184
|
});
|
|
8117
8185
|
}
|