chainlesschain 0.166.18 → 0.166.21
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/package.json +2 -2
- package/src/assets/web-panel/assets/{AIOps-CQSBl3hY.js → AIOps-BjMnsUci.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-IQt-vRLt.js → ActionButton-DdYFP03A.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DkHC8O7k.js → Analytics-Bb8TuuK_.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CSti2P2T.js → AppLayout-Kn3TIOtk.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-C57hxn3v.js → Artifacts-4IxpqI_b.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-DByLntcf.js → Audit-BOV2caqU.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-D1Bd2EOa.js → BackgroundAgents-B86k-ay4.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-VstHzHng.js → Backup-C5_ie1e3.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CLhdexIf.js → BaseInput-xpwg6QCW.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BefC_JZS.js → Chat-CVZOcZau.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DbXMvgmn.js → ChatBubbleRenderer-D8fPYhUu.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CEY982vx.js → Checkbox-MKTq3zdP.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-Dcm_DTvJ.js → Codegen-JUk3wzep.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C8SSu4KA.js → Col-JPvTA0kC.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BVV9vwRR.js → Community-Tqgl87NQ.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B7c5Vo18.js → Compact-BuAFYBmN.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Tq9jSZ5a.js → Compliance-CXS9WIPZ.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BJUjT09Q.js → Cowork-Ds2bFHrr.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CjV9PEaS.js → Cron-C_dV_OeW.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Dl7ReL8F.js → Crosschain-BsO6tIRo.js} +1 -1
- package/src/assets/web-panel/assets/{DID-CG8PjWmM.js → DID-rNOFqBac.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CDBM6wmF.js → Dashboard-C2fcKKVY.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-8_55bXTD.js → Dropdown-Y7Ndr0X_.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-D3qOU1Cm.js → EmailListRenderer-DcP_uPmL.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Bv5oWMZF.js → FamilyGuardDashboard-Cwn3gDzk.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-hpZ1xkKd.js → Federation-ClQuOsqb.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BN7GT191.js → FormItemContext-DfwtmlcK.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-PCRhfA7M.js → GenericCardRenderer-zNZhtbC5.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CIlP2vy7.js → Git-BZmdW-G5.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-81lgm7YL.js → Governance-CqBk4lEn.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Cs24xMOV.js → Inference-Dbmt3ZXk.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CrJLVCZo.js → KnowledgeGraph-hMTH6qf3.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DLyO8RKT.js → Logs-CkiYgiW2.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-DBOqijrP.js → MarkdownRenderer-BL1FElXg.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-Dz7AbQZc.js → Marketplace-CbB6wfin.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BM0aFiWv.js → McpTools-BSwiFtte.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-C9SJzENX.js → Memory-B03PeHrz.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BO2HnNRk.js → MobileBridge-CRGrnd-X.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CK_jMz0l.js → MobileProjects-CE_5v2kO.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CfhrJsdO.js → Mtc-Dp11QVx1.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BE2ELxgI.js → MtcAudit-CYu-3JBu.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CgR_E3Jd.js → Multisig-CGyJ0Xl3.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Cw9445_K.js → NLProgramming-CoWi_ov1.js} +1 -1
- package/src/assets/web-panel/assets/Notes-CgU9DDo9.js +7 -0
- package/src/assets/web-panel/assets/{NotificationSettings-DxHVh4uT.js → NotificationSettings-DX4I2b4W.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-CwHc15Zs.js +1 -0
- package/src/assets/web-panel/assets/{Organization-pPXJtWo4.js → Organization-oopLO_tk.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-YamdTJwA.js → Overflow-BFVvjMyf.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BvqP53x7.js → P2P-CBy5t-Tk.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Blz1Xn2n.js → PdhVaultBrowser--YWJNsu6.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CgFRQqFJ.js → Permissions-C2dZ8scb.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CFeo3-6O.js → PersonalDataHub-Bs3l7Hlx.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-BkaRojEK.js → Pipeline-DEBWbZuD.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BNZEx2Qp.js → Privacy-CjHBb6NU.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-HUBOgEEK.js → ProjectInit-D2WipUz5.js} +2 -2
- package/src/assets/web-panel/assets/ProjectSettings-B6WfnrGB.js +2 -0
- package/src/assets/web-panel/assets/{Projects-Dc517BXp.js → Projects-FF_thRi6.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DTLf8bgj.js → Providers-CCv5M_Dv.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BBNjPszk.js → QrScannerModal-CGthxU54.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DCsHvk3G.js → QuickAsk-CnPmXPFb.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Dpr5YSop.js → Recommend-Df_tGEa9.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DmKnvqGg.js → RemoteSession-Z58N0Loe.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CSRfuurX.js → Reputation-CZTBQ2Vt.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CDj3pQ_w.js → Row-CdK3YpCQ.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DI0a_kNq.js → RssFeed-CFMVT5sb.js} +3 -3
- package/src/assets/web-panel/assets/{Search-jAy7B2nU.js → Search-DrF8RIvD.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CkHTqYhc.js → Security-Ddk2f2DM.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CP-0Nzga.js → Services-CCuK-VOo.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BkF5-p3n.js → Skeleton-DxCpHzeM.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BDu-utDE.js → Skills-t2oTDgcv.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CQvq_2Qb.js → Sla-Df63M9_R.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-T7Ap512g.js → SpeechSettings-l7ox6KuX.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Bt-PLvot.js → SyncSettings-COd_tgPp.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-yLEcCogg.js → Tasks-CzDCcrik.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-ByN3fmbr.js → Templates-D-vfxTGA.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DBI7hITH.js → Tenant-BlpT_Gxc.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-B77_DlGX.js → Terminal-D5rq52Hg.js} +2 -2
- package/src/assets/web-panel/assets/TimelineRenderer-DdoMndkK.js +1 -0
- package/src/assets/web-panel/assets/{Tokens-BV2N6cR8.js → Tokens-BhgBsI6g.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-CjXWGH3p.js → Trigger-DwwzoikZ.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-uqXIq3WC.js → Trust-HkTpzXFb.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-D-6qu4vY.js → UkeySign-D9nk6Ehe.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-CxGmx_2e.js → VideoEditing-BKk0rfoy.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DSq7WlAg.js → Wallet-IVWIU_Lq.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CDBiD57O.js → WebAuthn-CFTCpfsG.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Z8f63TSb.js → WorkflowEditor-Dnf4Obif.js} +1 -1
- package/src/assets/web-panel/assets/{chat-B-UZFBjy.js → chat-D2snERdj.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CFk7K-7Q.js → colors-DKEjK1N1.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-X0IVMvgi.js → compact-item-BEDLwQdt.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DWg4j2n6.js → createContext-DA9iW1a0.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DyhgpXPf.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CkVCwNNF.js → hasIn-5l2xEcY9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BipwEbTA.js → index-5pW4t1iD.js} +1 -1
- package/src/assets/web-panel/assets/{index-5OcZHdzc.js → index-7P1b8HZo.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cvwu_rA_.js → index-B00GeekA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbIAWbma.js → index-B4QYBliR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNKFsBlz.js → index-B7_W_rYd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoskgPt9.js → index-BO9dQjpt.js} +1 -1
- package/src/assets/web-panel/assets/{index-CvOa-IFV.js → index-BZ5lY2zx.js} +1 -1
- package/src/assets/web-panel/assets/{index-_-9k3Tna.js → index-B_eCoZgW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbihMThv.js → index-BgfImyZI.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLSBks8h.js → index-Bq5P3piS.js} +1 -1
- package/src/assets/web-panel/assets/{index-LU54bChK.js → index-Bqc8tdIF.js} +1 -1
- package/src/assets/web-panel/assets/{index-Btqk6zWb.js → index-C7sKbM5s.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8uEL8Uw.js → index-CGlotREA.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLlP1E4X.js → index-CRPrHE7h.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeWKPQGs.js → index-CX1x4AFn.js} +1 -1
- package/src/assets/web-panel/assets/{index-Db_5xhrU.js → index-CbTPvp2_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CDfSD07S.js → index-CjWltbi_.js} +1 -1
- package/src/assets/web-panel/assets/index-Ck1jhFE0.js +1 -0
- package/src/assets/web-panel/assets/{index-BPBia4b-.js → index-CkMKuqUs.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1ZAOJRW.js → index-CmruhzFi.js} +1 -1
- package/src/assets/web-panel/assets/{index-P83LDnCz.js → index-Csfb-7hw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcDggpWR.js → index-CxEtQYdi.js} +1 -1
- package/src/assets/web-panel/assets/{index-OjnAwUJo.js → index-D7z4zB_a.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-EJNxgR.js → index-DLoalqRX.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3-B3FWD.js → index-DU2TXJu-.js} +1 -1
- package/src/assets/web-panel/assets/{index-D92g4l3n.js → index-DXet1xol.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ca0mij1n.js → index-Dbd7eEex.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCqpl_E_.js → index-Dbkghqn_.js} +1 -1
- package/src/assets/web-panel/assets/{index-DyWlOuak.js → index-Dg2a9owQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUBkvFPH.js → index-DpqtbXdE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DhVHoqGL.js → index-DqwPFbOb.js} +3 -3
- package/src/assets/web-panel/assets/{index-BG-GaZri.js → index-DvV03Ayk.js} +1 -1
- package/src/assets/web-panel/assets/{index-CMCEXBRh.js → index-NJieh3T1.js} +1 -1
- package/src/assets/web-panel/assets/{index-B273IY-E.js → index-Td8ZwyoC.js} +1 -1
- package/src/assets/web-panel/assets/index-c8jJEHVs.js +1 -0
- package/src/assets/web-panel/assets/{index-BzXjYUmd.js → index-e-e40id6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCLwoATF.js → index-fccZmC_h.js} +1 -1
- package/src/assets/web-panel/assets/{index-CN8HZlLH.js → index-fgYk0QXO.js} +1 -1
- package/src/assets/web-panel/assets/{index-BB4KHHcv.js → index-yYEQXYaU.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CFNgY8lJ.js → initDefaultProps-CPrcB1TC.js} +1 -1
- package/src/assets/web-panel/assets/{motion-D-5RrDzn.js → motion-BQ7mWRh_.js} +1 -1
- package/src/assets/web-panel/assets/{move-DN-L0Bd-.js → move-CzOEq99p.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-6mgLSeCK.js → mtc-parser-BlQI5jrw.js} +1 -1
- package/src/assets/web-panel/assets/{omit-ClWW8eTP.js → omit-DlW4gxmv.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-Vystq3R8.js → pickAttrs-BBYms5nP.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-D0H9hK4W.js → placementArrow-az2MPJ_7.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B3iNRU-a.js → responsiveObserve-D1-ibEol.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CiMXe6am.js → slide-DHGqa4GA.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CGDZJ1uT.js → statusUtils-CYGDo6lD.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-D2zA6NkY.js → styleChecker-Cl2EM9K6.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C1sYU6QE.js → useFlexGapSupport-DdYhzuv1.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BzUHSjg2.js → useFs-DWumPuBW.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CxB5yZCq.js → usePersonalDataHub-DxAO-Aqi.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BfUfMwtc.js → vnode-CplsQf_N.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-CFYmj1TO.js → zoom-Cw5HXNSG.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/commands/agent.js +19 -1
- package/src/commands/evolution-knowledge.js +54 -0
- package/src/commands/evolution-workbench.js +83 -0
- package/src/commands/evolution.js +6 -1
- package/src/commands/serve.js +16 -0
- package/src/commands/skill.js +158 -16
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/session-protocol.js +2 -0
- package/src/gateways/ws/ws-agent-handler.js +124 -69
- package/src/gateways/ws/ws-server.js +19 -0
- package/src/generated/cc-agent-protocol.schema.json +7 -1
- package/src/harness/jsonl-session-store.js +25 -1
- package/src/index.js +1 -1
- package/src/lib/app-server/cli-agent-kernel-adapter.js +8 -0
- package/src/lib/app-server/graph-runtime.js +40 -1
- package/src/lib/app-server/server.js +181 -3
- package/src/lib/app-server/websocket-transport.js +2 -0
- package/src/lib/evolution/agent-evolution-runtime-composition-brand.js +17 -0
- package/src/lib/evolution/agent-evolution-runtime-composition.js +165 -1
- package/src/lib/evolution/controlled-skill-production-pilot.js +912 -0
- package/src/lib/evolution/evolution-artifact-ports.js +21 -0
- package/src/lib/evolution/evolution-raw-crypto-shred.js +185 -0
- package/src/lib/evolution/evolution-workbench-batch-executor.js +195 -0
- package/src/lib/evolution/evolution-workbench-cli-host.js +169 -0
- package/src/lib/evolution/evolution-workbench-metrics-ledger-adapter.js +648 -0
- package/src/lib/evolution/evolution-workbench-metrics.js +943 -0
- package/src/lib/evolution/evolution-workbench-projection.js +734 -0
- package/src/lib/evolution/evolution-workbench-version-control.js +272 -0
- package/src/lib/evolution/governed-knowledge-conflict-merge.js +352 -0
- package/src/lib/evolution/governed-knowledge-dependency-authority.js +273 -0
- package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +646 -0
- package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +644 -0
- package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +282 -0
- package/src/lib/evolution/governed-knowledge-node-crypto-authority.js +348 -0
- package/src/lib/evolution/governed-knowledge-rbac-approval-authority.js +621 -0
- package/src/lib/evolution/governed-knowledge-review-host.js +249 -0
- package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +643 -0
- package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +259 -0
- package/src/lib/evolution/governed-knowledge-sync.js +485 -0
- package/src/lib/evolution/governed-knowledge-trust-ledger.js +707 -0
- package/src/lib/evolution/governed-skill-marketplace.js +430 -0
- package/src/lib/evolution/governed-wiki-pruning.js +435 -0
- package/src/lib/evolution/skill-outcome-index-authority.js +268 -0
- package/src/lib/evolution/skill-outcome-source-catalog-authority.js +237 -0
- package/src/lib/public-ide-capability-manifest.js +4 -0
- package/src/lib/skill-outcome-authority.js +43 -0
- package/src/lib/skill-outcome-transcript-authority.js +252 -0
- package/src/lib/skill-retrieval-router-benchmark.js +135 -0
- package/src/lib/skill-retrieval-router.js +235 -0
- package/src/lib/skill-vector-authority.js +325 -0
- package/src/lib/skill-vector-process-authority.js +386 -0
- package/src/repl/agent-repl.js +7 -1
- package/src/runtime/agent-core.js +72 -6
- package/src/runtime/agent-runtime.js +42 -0
- package/src/runtime/headless-runner.js +32 -0
- package/src/runtime/headless-stream.js +36 -1
- package/src/runtime/runtime-factory.js +62 -4
- package/src/assets/web-panel/assets/Notes-DZimkTrb.js +0 -7
- package/src/assets/web-panel/assets/OrderTableRenderer-Iy-pnX56.js +0 -1
- package/src/assets/web-panel/assets/ProjectSettings-CFMmhROS.js +0 -2
- package/src/assets/web-panel/assets/TimelineRenderer-CsLTB_QO.js +0 -1
- package/src/assets/web-panel/assets/devWarning-B2IW1J_J.js +0 -1
- package/src/assets/web-panel/assets/index-BCp2ir-1.js +0 -1
- package/src/assets/web-panel/assets/index-Bw4iuzRD.js +0 -1
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { types as utilTypes } from "node:util";
|
|
5
|
+
|
|
6
|
+
import { executionBroker } from "./process-execution-broker/index.js";
|
|
7
|
+
import { createSkillVectorAuthority } from "./skill-vector-authority.js";
|
|
8
|
+
|
|
9
|
+
export const SKILL_VECTOR_PROCESS_REQUEST_SCHEMA =
|
|
10
|
+
"chainlesschain.skill-vector-process-request/v1";
|
|
11
|
+
|
|
12
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
13
|
+
const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
|
|
14
|
+
const WORKER_KEYS = new Set([
|
|
15
|
+
"arguments",
|
|
16
|
+
"cwd",
|
|
17
|
+
"entryDigest",
|
|
18
|
+
"entryPath",
|
|
19
|
+
"environment",
|
|
20
|
+
"executableDigest",
|
|
21
|
+
"executablePath",
|
|
22
|
+
"identity",
|
|
23
|
+
]);
|
|
24
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
25
|
+
const DEFAULT_MAX_INPUT_BYTES = 12 * 1024 * 1024;
|
|
26
|
+
const DEFAULT_MAX_OUTPUT_BYTES = 4 * 1024 * 1024;
|
|
27
|
+
const MAX_STDERR_BYTES = 64 * 1024;
|
|
28
|
+
const MAX_EXECUTABLE_BYTES = 512 * 1024 * 1024;
|
|
29
|
+
const MAX_ENTRY_BYTES = 16 * 1024 * 1024;
|
|
30
|
+
const PROCESS_DEPS = Object.freeze({
|
|
31
|
+
spawn: (...args) => executionBroker.spawn(...args),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
function plainRecord(value, label, allowedKeys = null) {
|
|
35
|
+
if (
|
|
36
|
+
!value ||
|
|
37
|
+
typeof value !== "object" ||
|
|
38
|
+
Array.isArray(value) ||
|
|
39
|
+
utilTypes.isProxy(value) ||
|
|
40
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(value)) ||
|
|
41
|
+
(allowedKeys &&
|
|
42
|
+
Reflect.ownKeys(value).some(
|
|
43
|
+
(key) => typeof key !== "string" || !allowedKeys.has(key),
|
|
44
|
+
))
|
|
45
|
+
) {
|
|
46
|
+
throw new TypeError(`${label} is invalid`);
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function identifier(value, label) {
|
|
52
|
+
if (typeof value !== "string" || !SAFE_ID.test(value)) {
|
|
53
|
+
throw new TypeError(`${label} is invalid`);
|
|
54
|
+
}
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function pinnedDigest(value, label) {
|
|
59
|
+
if (typeof value !== "string" || !DIGEST.test(value)) {
|
|
60
|
+
throw new TypeError(`${label} must be sha256-bound`);
|
|
61
|
+
}
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function absolutePath(value, label) {
|
|
66
|
+
if (
|
|
67
|
+
typeof value !== "string" ||
|
|
68
|
+
value.includes("\0") ||
|
|
69
|
+
!path.isAbsolute(value) ||
|
|
70
|
+
path.normalize(value) !== value
|
|
71
|
+
) {
|
|
72
|
+
throw new TypeError(`${label} must be a normalized absolute path`);
|
|
73
|
+
}
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function boundedInteger(value, fallback, label, maximum) {
|
|
78
|
+
const normalized = value === undefined ? fallback : value;
|
|
79
|
+
if (
|
|
80
|
+
!Number.isSafeInteger(normalized) ||
|
|
81
|
+
normalized < 1 ||
|
|
82
|
+
normalized > maximum
|
|
83
|
+
) {
|
|
84
|
+
throw new TypeError(`${label} is invalid or unbounded`);
|
|
85
|
+
}
|
|
86
|
+
return normalized;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function normalizeArguments(value, label) {
|
|
90
|
+
if (value === undefined) return Object.freeze([]);
|
|
91
|
+
if (!Array.isArray(value) || utilTypes.isProxy(value) || value.length > 64) {
|
|
92
|
+
throw new TypeError(`${label} is invalid or unbounded`);
|
|
93
|
+
}
|
|
94
|
+
let bytes = 0;
|
|
95
|
+
const result = value.map((argument, index) => {
|
|
96
|
+
if (
|
|
97
|
+
typeof argument !== "string" ||
|
|
98
|
+
argument.includes("\0") ||
|
|
99
|
+
Buffer.byteLength(argument, "utf8") > 4096
|
|
100
|
+
) {
|
|
101
|
+
throw new TypeError(`${label}[${index}] is invalid or unbounded`);
|
|
102
|
+
}
|
|
103
|
+
bytes += Buffer.byteLength(argument, "utf8");
|
|
104
|
+
return argument;
|
|
105
|
+
});
|
|
106
|
+
if (bytes > 32 * 1024) {
|
|
107
|
+
throw new TypeError(`${label} is invalid or unbounded`);
|
|
108
|
+
}
|
|
109
|
+
return Object.freeze(result);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function normalizeEnvironment(value, label) {
|
|
113
|
+
if (value === undefined) return Object.freeze({});
|
|
114
|
+
plainRecord(value, label);
|
|
115
|
+
const entries = Object.entries(value);
|
|
116
|
+
if (entries.length > 64) {
|
|
117
|
+
throw new TypeError(`${label} is invalid or unbounded`);
|
|
118
|
+
}
|
|
119
|
+
let bytes = 0;
|
|
120
|
+
const result = Object.create(null);
|
|
121
|
+
const normalizedKeys = new Set();
|
|
122
|
+
for (const [key, entry] of entries.sort(([left], [right]) =>
|
|
123
|
+
left.localeCompare(right),
|
|
124
|
+
)) {
|
|
125
|
+
const normalizedKey =
|
|
126
|
+
process.platform === "win32" ? key.toLowerCase() : key;
|
|
127
|
+
if (
|
|
128
|
+
!/^[A-Za-z_][A-Za-z0-9_]{0,127}$/u.test(key) ||
|
|
129
|
+
normalizedKeys.has(normalizedKey) ||
|
|
130
|
+
typeof entry !== "string" ||
|
|
131
|
+
entry.includes("\0") ||
|
|
132
|
+
Buffer.byteLength(entry, "utf8") > 16 * 1024
|
|
133
|
+
) {
|
|
134
|
+
throw new TypeError(`${label}.${key} is invalid or unbounded`);
|
|
135
|
+
}
|
|
136
|
+
bytes += Buffer.byteLength(key, "utf8") + Buffer.byteLength(entry, "utf8");
|
|
137
|
+
normalizedKeys.add(normalizedKey);
|
|
138
|
+
result[key] = entry;
|
|
139
|
+
}
|
|
140
|
+
if (bytes > 32 * 1024) {
|
|
141
|
+
throw new TypeError(`${label} is invalid or unbounded`);
|
|
142
|
+
}
|
|
143
|
+
return Object.freeze(result);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function normalizeWorker(value, label) {
|
|
147
|
+
plainRecord(value, label, WORKER_KEYS);
|
|
148
|
+
return Object.freeze({
|
|
149
|
+
identity: identifier(value.identity, `${label}.identity`),
|
|
150
|
+
executablePath: absolutePath(
|
|
151
|
+
value.executablePath,
|
|
152
|
+
`${label}.executablePath`,
|
|
153
|
+
),
|
|
154
|
+
executableDigest: pinnedDigest(
|
|
155
|
+
value.executableDigest,
|
|
156
|
+
`${label}.executableDigest`,
|
|
157
|
+
),
|
|
158
|
+
entryPath: absolutePath(value.entryPath, `${label}.entryPath`),
|
|
159
|
+
entryDigest: pinnedDigest(value.entryDigest, `${label}.entryDigest`),
|
|
160
|
+
arguments: normalizeArguments(value.arguments, `${label}.arguments`),
|
|
161
|
+
cwd: absolutePath(value.cwd, `${label}.cwd`),
|
|
162
|
+
environment: normalizeEnvironment(
|
|
163
|
+
value.environment,
|
|
164
|
+
`${label}.environment`,
|
|
165
|
+
),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function fileDigest(filePath) {
|
|
170
|
+
return `sha256:${createHash("sha256").update(fs.readFileSync(filePath)).digest("hex")}`;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function samePath(left, right) {
|
|
174
|
+
return process.platform === "win32"
|
|
175
|
+
? left.toLowerCase() === right.toLowerCase()
|
|
176
|
+
: left === right;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function assertPinnedFile(filePath, expectedDigest, label, maximumBytes) {
|
|
180
|
+
const stat = fs.lstatSync(filePath);
|
|
181
|
+
if (
|
|
182
|
+
!stat.isFile() ||
|
|
183
|
+
stat.isSymbolicLink() ||
|
|
184
|
+
stat.size < 1 ||
|
|
185
|
+
stat.size > maximumBytes
|
|
186
|
+
) {
|
|
187
|
+
throw new Error(`${label} is not a regular pinned file`);
|
|
188
|
+
}
|
|
189
|
+
const realPath = fs.realpathSync.native(filePath);
|
|
190
|
+
if (!samePath(realPath, filePath)) {
|
|
191
|
+
throw new Error(`${label} does not resolve to its pinned path`);
|
|
192
|
+
}
|
|
193
|
+
if (fileDigest(filePath) !== expectedDigest) {
|
|
194
|
+
throw new Error(`${label} digest changed`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function assertWorkerIdentity(worker, label) {
|
|
199
|
+
assertPinnedFile(
|
|
200
|
+
worker.executablePath,
|
|
201
|
+
worker.executableDigest,
|
|
202
|
+
`${label} executable`,
|
|
203
|
+
MAX_EXECUTABLE_BYTES,
|
|
204
|
+
);
|
|
205
|
+
assertPinnedFile(
|
|
206
|
+
worker.entryPath,
|
|
207
|
+
worker.entryDigest,
|
|
208
|
+
`${label} entry`,
|
|
209
|
+
MAX_ENTRY_BYTES,
|
|
210
|
+
);
|
|
211
|
+
const cwd = fs.realpathSync.native(worker.cwd);
|
|
212
|
+
if (!samePath(cwd, worker.cwd) || !fs.statSync(cwd).isDirectory()) {
|
|
213
|
+
throw new Error(`${label} cwd does not resolve to its pinned directory`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function processFailure(code) {
|
|
218
|
+
const error = new Error(`Skill vector process failed closed (${code})`);
|
|
219
|
+
error.code = code;
|
|
220
|
+
return error;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
async function invokeWorker(
|
|
224
|
+
worker,
|
|
225
|
+
role,
|
|
226
|
+
payload,
|
|
227
|
+
{ timeoutMs, maxInputBytes, maxOutputBytes },
|
|
228
|
+
) {
|
|
229
|
+
assertWorkerIdentity(worker, role);
|
|
230
|
+
const input = Buffer.from(
|
|
231
|
+
`${JSON.stringify({
|
|
232
|
+
schema: SKILL_VECTOR_PROCESS_REQUEST_SCHEMA,
|
|
233
|
+
role,
|
|
234
|
+
payload,
|
|
235
|
+
})}\n`,
|
|
236
|
+
"utf8",
|
|
237
|
+
);
|
|
238
|
+
if (input.length > maxInputBytes) {
|
|
239
|
+
throw processFailure("CC_SKILL_VECTOR_PROCESS_INPUT_LIMIT");
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const output = await new Promise((resolve, reject) => {
|
|
243
|
+
let settled = false;
|
|
244
|
+
let pendingFailure = null;
|
|
245
|
+
let timer = null;
|
|
246
|
+
let stdoutBytes = 0;
|
|
247
|
+
let stderrBytes = 0;
|
|
248
|
+
const stdout = [];
|
|
249
|
+
const child = PROCESS_DEPS.spawn(
|
|
250
|
+
worker.executablePath,
|
|
251
|
+
[worker.entryPath, ...worker.arguments],
|
|
252
|
+
{
|
|
253
|
+
cwd: worker.cwd,
|
|
254
|
+
env: { ...worker.environment },
|
|
255
|
+
shell: false,
|
|
256
|
+
windowsHide: true,
|
|
257
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
258
|
+
origin: "skill-vector-process-authority",
|
|
259
|
+
scope: "evolution",
|
|
260
|
+
policy: "allow",
|
|
261
|
+
auditRedactArgIndexes: worker.arguments.map((_, index) => index + 1),
|
|
262
|
+
},
|
|
263
|
+
);
|
|
264
|
+
const terminate = (error) => {
|
|
265
|
+
if (settled || pendingFailure) return;
|
|
266
|
+
pendingFailure = error;
|
|
267
|
+
if (child.exitCode === null) child.kill("SIGKILL");
|
|
268
|
+
};
|
|
269
|
+
timer = setTimeout(() => {
|
|
270
|
+
terminate(processFailure("CC_SKILL_VECTOR_PROCESS_TIMEOUT"));
|
|
271
|
+
}, timeoutMs);
|
|
272
|
+
timer.unref?.();
|
|
273
|
+
child.once("error", () => {
|
|
274
|
+
terminate(processFailure("CC_SKILL_VECTOR_PROCESS_SPAWN_FAILED"));
|
|
275
|
+
});
|
|
276
|
+
child.stdout.on("data", (chunk) => {
|
|
277
|
+
if (pendingFailure) return;
|
|
278
|
+
stdoutBytes += chunk.length;
|
|
279
|
+
if (stdoutBytes > maxOutputBytes) {
|
|
280
|
+
terminate(processFailure("CC_SKILL_VECTOR_PROCESS_OUTPUT_LIMIT"));
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
stdout.push(chunk);
|
|
284
|
+
});
|
|
285
|
+
child.stderr.on("data", (chunk) => {
|
|
286
|
+
if (pendingFailure) return;
|
|
287
|
+
stderrBytes += chunk.length;
|
|
288
|
+
if (stderrBytes > MAX_STDERR_BYTES) {
|
|
289
|
+
terminate(processFailure("CC_SKILL_VECTOR_PROCESS_STDERR_LIMIT"));
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
child.once("close", (code, signal) => {
|
|
293
|
+
if (settled) return;
|
|
294
|
+
settled = true;
|
|
295
|
+
clearTimeout(timer);
|
|
296
|
+
if (pendingFailure) {
|
|
297
|
+
reject(pendingFailure);
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
if (code !== 0 || signal !== null) {
|
|
301
|
+
reject(processFailure("CC_SKILL_VECTOR_PROCESS_EXITED"));
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
resolve(Buffer.concat(stdout).toString("utf8"));
|
|
305
|
+
});
|
|
306
|
+
child.stdin.once("error", () => {
|
|
307
|
+
terminate(processFailure("CC_SKILL_VECTOR_PROCESS_STDIN_FAILED"));
|
|
308
|
+
});
|
|
309
|
+
child.stdin.end(input);
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
assertWorkerIdentity(worker, role);
|
|
313
|
+
const text = output.trim();
|
|
314
|
+
if (text === "" || Buffer.byteLength(text, "utf8") > maxOutputBytes) {
|
|
315
|
+
throw processFailure("CC_SKILL_VECTOR_PROCESS_EMPTY_OUTPUT");
|
|
316
|
+
}
|
|
317
|
+
try {
|
|
318
|
+
const parsed = JSON.parse(text);
|
|
319
|
+
plainRecord(parsed, `${role} process result`);
|
|
320
|
+
return parsed;
|
|
321
|
+
} catch (error) {
|
|
322
|
+
if (error?.code?.startsWith?.("CC_SKILL_VECTOR_")) throw error;
|
|
323
|
+
throw processFailure("CC_SKILL_VECTOR_PROCESS_INVALID_JSON");
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Creates the existing branded vector authority over two independently pinned
|
|
329
|
+
* JSON worker processes. The host supplies all executable and entry digests;
|
|
330
|
+
* no PATH lookup, shell, inherited environment, local key or permissive
|
|
331
|
+
* verifier fallback is used.
|
|
332
|
+
*/
|
|
333
|
+
export function createSkillVectorProcessAuthority({
|
|
334
|
+
tenantId,
|
|
335
|
+
provider: providerInput,
|
|
336
|
+
verifier: verifierInput,
|
|
337
|
+
timeoutMs: timeoutInput,
|
|
338
|
+
maxInputBytes: maxInputInput,
|
|
339
|
+
maxOutputBytes: maxOutputInput,
|
|
340
|
+
} = {}) {
|
|
341
|
+
const provider = normalizeWorker(providerInput, "provider");
|
|
342
|
+
const verifier = normalizeWorker(verifierInput, "verifier");
|
|
343
|
+
if (
|
|
344
|
+
provider.identity === verifier.identity ||
|
|
345
|
+
provider.entryDigest === verifier.entryDigest
|
|
346
|
+
) {
|
|
347
|
+
throw new TypeError(
|
|
348
|
+
"Skill vector provider and verifier must be independent",
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
const limits = Object.freeze({
|
|
352
|
+
timeoutMs: boundedInteger(
|
|
353
|
+
timeoutInput,
|
|
354
|
+
DEFAULT_TIMEOUT_MS,
|
|
355
|
+
"timeoutMs",
|
|
356
|
+
60_000,
|
|
357
|
+
),
|
|
358
|
+
maxInputBytes: boundedInteger(
|
|
359
|
+
maxInputInput,
|
|
360
|
+
DEFAULT_MAX_INPUT_BYTES,
|
|
361
|
+
"maxInputBytes",
|
|
362
|
+
16 * 1024 * 1024,
|
|
363
|
+
),
|
|
364
|
+
maxOutputBytes: boundedInteger(
|
|
365
|
+
maxOutputInput,
|
|
366
|
+
DEFAULT_MAX_OUTPUT_BYTES,
|
|
367
|
+
"maxOutputBytes",
|
|
368
|
+
8 * 1024 * 1024,
|
|
369
|
+
),
|
|
370
|
+
});
|
|
371
|
+
assertWorkerIdentity(provider, "provider");
|
|
372
|
+
assertWorkerIdentity(verifier, "verifier");
|
|
373
|
+
return createSkillVectorAuthority({
|
|
374
|
+
tenantId,
|
|
375
|
+
provider: Object.freeze({
|
|
376
|
+
score: Object.freeze((request) =>
|
|
377
|
+
invokeWorker(provider, "provider", request, limits),
|
|
378
|
+
),
|
|
379
|
+
}),
|
|
380
|
+
verifier: Object.freeze({
|
|
381
|
+
verify: Object.freeze((request) =>
|
|
382
|
+
invokeWorker(verifier, "verifier", request, limits),
|
|
383
|
+
),
|
|
384
|
+
}),
|
|
385
|
+
});
|
|
386
|
+
}
|
package/src/repl/agent-repl.js
CHANGED
|
@@ -739,6 +739,7 @@ export async function agentLoop(messages, options) {
|
|
|
739
739
|
tool: event?.tool || started?.tool || "?",
|
|
740
740
|
isError: Boolean(event?.error || event?.result?.error),
|
|
741
741
|
skill: event?.attribution?.skill,
|
|
742
|
+
invocationReceipt: event?.result?.invocationReceipt,
|
|
742
743
|
durationMs: started
|
|
743
744
|
? Math.max(
|
|
744
745
|
0,
|
|
@@ -918,9 +919,13 @@ export async function agentLoop(messages, options) {
|
|
|
918
919
|
: undefined,
|
|
919
920
|
...extractPluginUsageAttribution(event.result),
|
|
920
921
|
durationMs,
|
|
922
|
+
invocationReceipt: event.result?.invocationReceipt,
|
|
921
923
|
});
|
|
922
924
|
} catch (_e) {
|
|
923
|
-
if (
|
|
925
|
+
if (
|
|
926
|
+
event.result?.invocationReceipt ||
|
|
927
|
+
options.persistUsageTelemetry === true
|
|
928
|
+
) {
|
|
924
929
|
throw markRuntimeLedgerPersistenceError(_e);
|
|
925
930
|
}
|
|
926
931
|
// Legacy non-JSONL persistence remains best-effort.
|
|
@@ -9638,6 +9643,7 @@ async function startAgentReplInWorkspaceOwned(
|
|
|
9638
9643
|
sessionId,
|
|
9639
9644
|
persistUsageTelemetry: useJsonl,
|
|
9640
9645
|
skillLoader: _replSkillLoader,
|
|
9646
|
+
skillOutcomeIndex: options.skillOutcomeIndex,
|
|
9641
9647
|
cwd: process.cwd(),
|
|
9642
9648
|
additionalDirectories,
|
|
9643
9649
|
sandbox: _sandbox,
|
|
@@ -45,6 +45,12 @@ import {
|
|
|
45
45
|
} from "../lib/lsp/workspace-roots.js";
|
|
46
46
|
import { getPlanModeManager } from "../lib/plan-mode.js";
|
|
47
47
|
import { CLISkillLoader } from "../lib/skill-loader.js";
|
|
48
|
+
import { routeSkillDescriptors } from "../lib/skill-retrieval-router.js";
|
|
49
|
+
import { resolveSkillOutcomeAuthority } from "../lib/skill-outcome-authority.js";
|
|
50
|
+
import {
|
|
51
|
+
captureSkillVectorAuthority,
|
|
52
|
+
unavailableSkillVectorEvidence,
|
|
53
|
+
} from "../lib/skill-vector-authority.js";
|
|
48
54
|
import {
|
|
49
55
|
admitSkillPrompt,
|
|
50
56
|
debitSkillPromptBudget,
|
|
@@ -3549,6 +3555,8 @@ export async function executeTool(name, args, context = {}) {
|
|
|
3549
3555
|
skillLoader,
|
|
3550
3556
|
// Subagent skill capability INTERSECT — forwarded to run_skill/list_skills.
|
|
3551
3557
|
skillAllowlist: context.skillAllowlist ?? null,
|
|
3558
|
+
skillOutcomeIndex: context.skillOutcomeIndex,
|
|
3559
|
+
skillVectorAuthority: context.skillVectorAuthority,
|
|
3552
3560
|
cwd,
|
|
3553
3561
|
parentMessages: context.parentMessages,
|
|
3554
3562
|
interaction: context.interaction,
|
|
@@ -5091,6 +5099,8 @@ async function executeToolInner(
|
|
|
5091
5099
|
{
|
|
5092
5100
|
skillLoader,
|
|
5093
5101
|
skillAllowlist = null,
|
|
5102
|
+
skillOutcomeIndex,
|
|
5103
|
+
skillVectorAuthority,
|
|
5094
5104
|
cwd,
|
|
5095
5105
|
parentMessages,
|
|
5096
5106
|
interaction,
|
|
@@ -8201,14 +8211,38 @@ async function executeToolInner(
|
|
|
8201
8211
|
(s) => s.category.toLowerCase() === args.category.toLowerCase(),
|
|
8202
8212
|
);
|
|
8203
8213
|
}
|
|
8214
|
+
let routing = null;
|
|
8215
|
+
let outcomeAuthority = null;
|
|
8216
|
+
let vector = null;
|
|
8204
8217
|
if (args.query) {
|
|
8205
|
-
|
|
8206
|
-
|
|
8207
|
-
|
|
8208
|
-
|
|
8209
|
-
|
|
8210
|
-
|
|
8218
|
+
outcomeAuthority = resolveSkillOutcomeAuthority(
|
|
8219
|
+
skillOutcomeIndex === undefined ? {} : { index: skillOutcomeIndex },
|
|
8220
|
+
);
|
|
8221
|
+
const vectorAuthority =
|
|
8222
|
+
skillVectorAuthority == null
|
|
8223
|
+
? null
|
|
8224
|
+
: captureSkillVectorAuthority(skillVectorAuthority);
|
|
8225
|
+
vector =
|
|
8226
|
+
vectorAuthority === null
|
|
8227
|
+
? null
|
|
8228
|
+
: await vectorAuthority.score({ query: args.query, skills });
|
|
8229
|
+
routing = routeSkillDescriptors({
|
|
8230
|
+
skills,
|
|
8231
|
+
query: args.query,
|
|
8232
|
+
target: { os: process.platform },
|
|
8233
|
+
vectorScores: vector?.scores ?? null,
|
|
8234
|
+
outcomeMetrics: outcomeAuthority.metrics,
|
|
8235
|
+
topK: Math.min(64, Math.max(1, skills.length)),
|
|
8236
|
+
});
|
|
8237
|
+
const byDigest = new Map(
|
|
8238
|
+
skills.map((skill) => [
|
|
8239
|
+
skill.executionIdentity?.contentDigest,
|
|
8240
|
+
skill,
|
|
8241
|
+
]),
|
|
8211
8242
|
);
|
|
8243
|
+
skills = routing.candidates
|
|
8244
|
+
.map(({ digest }) => byDigest.get(digest))
|
|
8245
|
+
.filter(Boolean);
|
|
8212
8246
|
}
|
|
8213
8247
|
skillLoader.recordDescriptorUse?.(skills, {
|
|
8214
8248
|
sessionId,
|
|
@@ -8217,12 +8251,42 @@ async function executeToolInner(
|
|
|
8217
8251
|
});
|
|
8218
8252
|
return attachDescriptor({
|
|
8219
8253
|
count: skills.length,
|
|
8254
|
+
...(routing
|
|
8255
|
+
? {
|
|
8256
|
+
routing: {
|
|
8257
|
+
schema: routing.schema,
|
|
8258
|
+
selectedDigest: routing.selected?.digest || null,
|
|
8259
|
+
conflicts: routing.conflicts,
|
|
8260
|
+
rejectedCount: routing.rejected.length,
|
|
8261
|
+
vectorAvailable: routing.vectorAvailable,
|
|
8262
|
+
vectorAuthority:
|
|
8263
|
+
vector?.evidence ?? unavailableSkillVectorEvidence(),
|
|
8264
|
+
outcomeAuthority: outcomeAuthority.evidence,
|
|
8265
|
+
},
|
|
8266
|
+
}
|
|
8267
|
+
: {}),
|
|
8220
8268
|
skills: skills.map((s) => ({
|
|
8221
8269
|
id: s.id,
|
|
8222
8270
|
category: s.category,
|
|
8223
8271
|
source: s.source,
|
|
8224
8272
|
hasHandler: s.hasHandler,
|
|
8225
8273
|
description: (s.description || "").substring(0, 80),
|
|
8274
|
+
...(routing
|
|
8275
|
+
? (() => {
|
|
8276
|
+
const candidate = routing.candidates.find(
|
|
8277
|
+
({ digest }) => digest === s.executionIdentity?.contentDigest,
|
|
8278
|
+
);
|
|
8279
|
+
return candidate
|
|
8280
|
+
? {
|
|
8281
|
+
digest: candidate.digest,
|
|
8282
|
+
version: candidate.version,
|
|
8283
|
+
contextCostTokens: candidate.contextCostTokens,
|
|
8284
|
+
routeScore: candidate.score,
|
|
8285
|
+
routeReason: candidate.reason,
|
|
8286
|
+
}
|
|
8287
|
+
: {};
|
|
8288
|
+
})()
|
|
8289
|
+
: {}),
|
|
8226
8290
|
})),
|
|
8227
8291
|
});
|
|
8228
8292
|
}
|
|
@@ -13160,6 +13224,8 @@ export async function* agentLoop(messages, options) {
|
|
|
13160
13224
|
const toolContext = {
|
|
13161
13225
|
hookDb: hermeticExecution ? null : options.hookDb || null,
|
|
13162
13226
|
skillLoader: options.skillLoader || _defaultSkillLoader,
|
|
13227
|
+
skillOutcomeIndex: options.skillOutcomeIndex,
|
|
13228
|
+
skillVectorAuthority: options.skillVectorAuthority,
|
|
13163
13229
|
// Hook-envelope tracing (P2 unified event bus): every settings-hook payload
|
|
13164
13230
|
// fired during this run carries trace_id = this run's id; a spawned child
|
|
13165
13231
|
// loop carries parent_id = the spawning run's id (threaded by
|
|
@@ -34,6 +34,8 @@ import { registerHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.
|
|
|
34
34
|
import { captureStructuredMemoryPolicyReceiptWriter } from "../lib/evolution/structured-memory-policy-receipt-writer.js";
|
|
35
35
|
import { captureStructuredMemoryAgentControlPlane } from "../lib/evolution/structured-memory-agent-control-plane.js";
|
|
36
36
|
import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
|
|
37
|
+
import { captureAgentSkillOutcomeIndex } from "../lib/evolution/agent-evolution-runtime-composition-brand.js";
|
|
38
|
+
import { captureSkillVectorAuthority } from "../lib/skill-vector-authority.js";
|
|
37
39
|
|
|
38
40
|
const {
|
|
39
41
|
DEFAULT_ALLOWED_MCP_SERVER_NAMES,
|
|
@@ -69,6 +71,34 @@ export class AgentRuntime {
|
|
|
69
71
|
deps.evolutionIngress == null
|
|
70
72
|
? null
|
|
71
73
|
: captureAgentEvolutionIngress(deps.evolutionIngress);
|
|
74
|
+
this.skillOutcomeIndex =
|
|
75
|
+
deps.skillOutcomeIndex == null
|
|
76
|
+
? null
|
|
77
|
+
: captureAgentSkillOutcomeIndex(deps.skillOutcomeIndex);
|
|
78
|
+
this.skillVectorAuthority =
|
|
79
|
+
deps.skillVectorAuthority == null
|
|
80
|
+
? null
|
|
81
|
+
: captureSkillVectorAuthority(deps.skillVectorAuthority);
|
|
82
|
+
if (
|
|
83
|
+
this.evolutionIngress !== null &&
|
|
84
|
+
this.skillOutcomeIndex !== null &&
|
|
85
|
+
this.evolutionIngress.tenantId !== this.skillOutcomeIndex.tenantId
|
|
86
|
+
) {
|
|
87
|
+
throw new Error(
|
|
88
|
+
"Agent evolution ingress and Skill outcome index must share one tenant",
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
const retrievalTenant =
|
|
92
|
+
this.evolutionIngress?.tenantId ??
|
|
93
|
+
this.skillOutcomeIndex?.tenantId ??
|
|
94
|
+
null;
|
|
95
|
+
if (
|
|
96
|
+
retrievalTenant !== null &&
|
|
97
|
+
this.skillVectorAuthority !== null &&
|
|
98
|
+
retrievalTenant !== this.skillVectorAuthority.tenantId
|
|
99
|
+
) {
|
|
100
|
+
throw new Error("Agent retrieval authorities must share one tenant");
|
|
101
|
+
}
|
|
72
102
|
this.structuredMemoryControlPlane =
|
|
73
103
|
deps.structuredMemoryControlPlane == null
|
|
74
104
|
? null
|
|
@@ -297,6 +327,12 @@ export class AgentRuntime {
|
|
|
297
327
|
...(this.evolutionIngress === null
|
|
298
328
|
? {}
|
|
299
329
|
: { evolutionIngress: this.evolutionIngress }),
|
|
330
|
+
...(this.skillOutcomeIndex === null
|
|
331
|
+
? {}
|
|
332
|
+
: { skillOutcomeIndex: this.skillOutcomeIndex }),
|
|
333
|
+
...(this.skillVectorAuthority === null
|
|
334
|
+
? {}
|
|
335
|
+
: { skillVectorAuthority: this.skillVectorAuthority }),
|
|
300
336
|
});
|
|
301
337
|
if (this.evolutionIngress !== null) {
|
|
302
338
|
await this.evolutionIngress.complete();
|
|
@@ -468,6 +504,12 @@ export class AgentRuntime {
|
|
|
468
504
|
remoteSessionPeerId,
|
|
469
505
|
envelopeBus,
|
|
470
506
|
evolutionCompositionFactory: this.deps.evolutionCompositionFactory,
|
|
507
|
+
...(this.skillOutcomeIndex === null
|
|
508
|
+
? {}
|
|
509
|
+
: { skillOutcomeIndex: this.skillOutcomeIndex }),
|
|
510
|
+
...(this.skillVectorAuthority === null
|
|
511
|
+
? {}
|
|
512
|
+
: { skillVectorAuthority: this.skillVectorAuthority }),
|
|
471
513
|
});
|
|
472
514
|
|
|
473
515
|
server.on("connection", ({ clientId, ip }) => {
|
|
@@ -121,6 +121,8 @@ import { createBackgroundPhaseReporter } from "../lib/background-phase-reporter.
|
|
|
121
121
|
import { createBackgroundInteractionClient } from "../lib/background-interaction-resolver.js";
|
|
122
122
|
import { withQuietStdout } from "./quiet-stdout.js";
|
|
123
123
|
import { captureAgentEvolutionIngress } from "../lib/evolution/agent-evolution-ingress.js";
|
|
124
|
+
import { captureAgentSkillOutcomeIndex } from "../lib/evolution/agent-evolution-runtime-composition-brand.js";
|
|
125
|
+
import { captureSkillVectorAuthority } from "../lib/skill-vector-authority.js";
|
|
124
126
|
import { CostBudget } from "../lib/cost-budget.js";
|
|
125
127
|
import { estimateTokens } from "../harness/prompt-compressor.js";
|
|
126
128
|
import {
|
|
@@ -659,6 +661,32 @@ async function runAgentHeadlessInWorkspace(
|
|
|
659
661
|
options.evolutionIngress == null
|
|
660
662
|
? null
|
|
661
663
|
: captureAgentEvolutionIngress(options.evolutionIngress);
|
|
664
|
+
const skillOutcomeIndex =
|
|
665
|
+
options.skillOutcomeIndex == null
|
|
666
|
+
? null
|
|
667
|
+
: captureAgentSkillOutcomeIndex(options.skillOutcomeIndex);
|
|
668
|
+
const skillVectorAuthority =
|
|
669
|
+
options.skillVectorAuthority == null
|
|
670
|
+
? null
|
|
671
|
+
: captureSkillVectorAuthority(options.skillVectorAuthority);
|
|
672
|
+
if (
|
|
673
|
+
evolutionIngress !== null &&
|
|
674
|
+
skillOutcomeIndex !== null &&
|
|
675
|
+
evolutionIngress.tenantId !== skillOutcomeIndex.tenantId
|
|
676
|
+
) {
|
|
677
|
+
throw new TypeError(
|
|
678
|
+
"Agent evolution ingress and Skill outcome index must share one tenant",
|
|
679
|
+
);
|
|
680
|
+
}
|
|
681
|
+
const retrievalTenant =
|
|
682
|
+
evolutionIngress?.tenantId ?? skillOutcomeIndex?.tenantId ?? null;
|
|
683
|
+
if (
|
|
684
|
+
retrievalTenant !== null &&
|
|
685
|
+
skillVectorAuthority !== null &&
|
|
686
|
+
retrievalTenant !== skillVectorAuthority.tenantId
|
|
687
|
+
) {
|
|
688
|
+
throw new TypeError("Agent retrieval authorities must share one tenant");
|
|
689
|
+
}
|
|
662
690
|
const prompt = (options.prompt || "").trim();
|
|
663
691
|
if (!prompt) {
|
|
664
692
|
throw new Error(
|
|
@@ -2449,6 +2477,8 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2449
2477
|
apiKey,
|
|
2450
2478
|
cwd,
|
|
2451
2479
|
skillLoader: _runtimeSkillLoader,
|
|
2480
|
+
...(skillOutcomeIndex === null ? {} : { skillOutcomeIndex }),
|
|
2481
|
+
...(skillVectorAuthority === null ? {} : { skillVectorAuthority }),
|
|
2452
2482
|
additionalDirectories,
|
|
2453
2483
|
sandbox: options.sandbox || null,
|
|
2454
2484
|
sessionId,
|
|
@@ -2605,6 +2635,7 @@ async function runAgentHeadlessInWorkspace(
|
|
|
2605
2635
|
tool: event?.tool || started?.tool || "?",
|
|
2606
2636
|
isError: Boolean(event?.error || event?.result?.error),
|
|
2607
2637
|
skill: event?.attribution?.skill,
|
|
2638
|
+
invocationReceipt: event?.result?.invocationReceipt,
|
|
2608
2639
|
durationMs: started
|
|
2609
2640
|
? Math.max(
|
|
2610
2641
|
0,
|
|
@@ -3211,6 +3242,7 @@ async function runAgentHeadlessInWorkspace(
|
|
|
3211
3242
|
plugin: settledCall.plugin || undefined,
|
|
3212
3243
|
pluginVersion: settledCall.pluginVersion || undefined,
|
|
3213
3244
|
durationMs: settledCall.durationMs,
|
|
3245
|
+
invocationReceipt: event.result?.invocationReceipt,
|
|
3214
3246
|
}),
|
|
3215
3247
|
);
|
|
3216
3248
|
}
|