chainlesschain 0.166.21 → 0.166.24
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 +67 -9
- package/package.json +4 -3
- package/src/assets/web-panel/assets/{AIOps-BjMnsUci.js → AIOps-DR-MWcZc.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DdYFP03A.js → ActionButton-DT8B7sEb.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bb8TuuK_.js → Analytics-asjh3dQJ.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-Kn3TIOtk.js → AppLayout-DivQ491i.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-4IxpqI_b.js → Artifacts-DPH2uUmy.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BOV2caqU.js → Audit-Bp2nLyc-.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-B86k-ay4.js → BackgroundAgents-CHS28khl.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-C5_ie1e3.js → Backup-CKeaFSfz.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-xpwg6QCW.js → BaseInput-CxwM9BAH.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CVZOcZau.js → Chat-DYLDwaCv.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-D8fPYhUu.js → ChatBubbleRenderer-DdBJDBP0.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-MKTq3zdP.js → Checkbox-uYTWOB8j.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-JUk3wzep.js → Codegen-CvYa_dwT.js} +1 -1
- package/src/assets/web-panel/assets/{Col-JPvTA0kC.js → Col-CanMAX4m.js} +1 -1
- package/src/assets/web-panel/assets/{Community-Tqgl87NQ.js → Community-B4WaDtHw.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BuAFYBmN.js → Compact-K93Uof_3.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CXS9WIPZ.js → Compliance-CKeDLgUW.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Ds2bFHrr.js → Cowork-P93grAeB.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-C_dV_OeW.js → Cron-BSHnMtDn.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BsO6tIRo.js → Crosschain-epAOpUVJ.js} +1 -1
- package/src/assets/web-panel/assets/{DID-rNOFqBac.js → DID-ByjXfP7t.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C2fcKKVY.js → Dashboard-QztTU8tb.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Y7Ndr0X_.js → Dropdown-DhUc9yhN.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DcP_uPmL.js → EmailListRenderer-C2sLhJJN.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Cwn3gDzk.js → FamilyGuardDashboard-CdfbWNDn.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-ClQuOsqb.js → Federation-CcF_R7NW.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DfwtmlcK.js → FormItemContext-Cm_X2IBk.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-zNZhtbC5.js → GenericCardRenderer-DUi4NWlb.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BZmdW-G5.js → Git-4Sq5FjBt.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CqBk4lEn.js → Governance-Dx2_v4V6.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Dbmt3ZXk.js → Inference-7Vr1xekR.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-hMTH6qf3.js → KnowledgeGraph-Cnd2XOzf.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CkiYgiW2.js → Logs-B66QPVf-.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BL1FElXg.js → MarkdownRenderer-PLsEvhly.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CbB6wfin.js → Marketplace-BMIK9BmC.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BSwiFtte.js → McpTools-BDbyp3J_.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-B03PeHrz.js → Memory-CJdzfZGi.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CRGrnd-X.js → MobileBridge-C2TH5Y3-.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CE_5v2kO.js → MobileProjects-D1dYXkvV.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Dp11QVx1.js → Mtc-B-4A1I1j.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-CYu-3JBu.js → MtcAudit-Bgcc9UOl.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CGyJ0Xl3.js → Multisig-DqOe-etP.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CoWi_ov1.js → NLProgramming-7VnhzE_6.js} +1 -1
- package/src/assets/web-panel/assets/Notes-BxawpeUQ.js +7 -0
- package/src/assets/web-panel/assets/{NotificationSettings-DX4I2b4W.js → NotificationSettings-Cr08G2aE.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Ce8bEGlK.js +1 -0
- package/src/assets/web-panel/assets/{Organization-oopLO_tk.js → Organization-BC7lveGv.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BFVvjMyf.js → Overflow-CakOW-G0.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CBy5t-Tk.js → P2P-Cf8CaOBZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser--YWJNsu6.js → PdhVaultBrowser-Dc7b98W9.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-C2dZ8scb.js → Permissions-DGJyMEfS.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Bs3l7Hlx.js → PersonalDataHub-DNIwSdwu.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-DEBWbZuD.js → Pipeline-5B1S12wa.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CjHBb6NU.js → Privacy-CMB6Ke5t.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-D2WipUz5.js → ProjectInit-D5PqTFiT.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-B6WfnrGB.js → ProjectSettings-CbKNdSjV.js} +2 -2
- package/src/assets/web-panel/assets/Projects-ccXaHzYL.js +1 -0
- package/src/assets/web-panel/assets/{Providers-CCv5M_Dv.js → Providers-CJF5_-Gs.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CGthxU54.js → QrScannerModal-CT6iEAdi.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CnPmXPFb.js → QuickAsk-Ci0h9mJ_.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Df_tGEa9.js → Recommend-Da5mobZu.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Z58N0Loe.js → RemoteSession-BaCY8eey.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CZTBQ2Vt.js → Reputation-CaITfTsI.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CdK3YpCQ.js → Row-DtUDamyP.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CFMVT5sb.js → RssFeed-DX27gFpg.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DrF8RIvD.js → Search-DFL69osN.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Ddk2f2DM.js → Security-BqGeoWv-.js} +3 -3
- package/src/assets/web-panel/assets/{Services-CCuK-VOo.js → Services-3z1WnEAc.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DxCpHzeM.js → Skeleton-C_OJQQ9Z.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-t2oTDgcv.js → Skills-BY7aT6Mo.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Df63M9_R.js → Sla-BZv7DSaD.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-6lJKLhCn.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-COd_tgPp.js → SyncSettings-B6D7STlI.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CzDCcrik.js → Tasks-Co_FCZAO.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-D-vfxTGA.js → Templates-CnY-9fgz.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BlpT_Gxc.js → Tenant-B71yXfZ8.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D5rq52Hg.js → Terminal-Dd_P7awo.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DdoMndkK.js → TimelineRenderer-CvIEMyli.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BhgBsI6g.js → Tokens-DknFBGOi.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DwwzoikZ.js → Trigger-D_4nJONB.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-HkTpzXFb.js → Trust-BNl21fa7.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-D9nk6Ehe.js → UkeySign-CFrCI7uK.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BKk0rfoy.js → VideoEditing-BVfY6JLg.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-IVWIU_Lq.js → Wallet-Cj9CAK0J.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CFTCpfsG.js → WebAuthn-DcqZlzA3.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Dnf4Obif.js → WorkflowEditor-Dfr_dMld.js} +1 -1
- package/src/assets/web-panel/assets/{chat-D2snERdj.js → chat-Yv6UF0AD.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DKEjK1N1.js → colors-CDW_-1fs.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BEDLwQdt.js → compact-item-BYOQvd-6.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DA9iW1a0.js → createContext-BCGO0BiP.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-H-kXSuf-.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-5l2xEcY9.js → hasIn-DY-70cfQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7_W_rYd.js → index-366wfQBU.js} +1 -1
- package/src/assets/web-panel/assets/index-B0o4MeNK.js +1 -0
- package/src/assets/web-panel/assets/{index-CxEtQYdi.js → index-B9ZogJJM.js} +1 -1
- package/src/assets/web-panel/assets/{index-B00GeekA.js → index-B9m5QAMg.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7sKbM5s.js → index-BBs2mv5M.js} +1 -1
- package/src/assets/web-panel/assets/{index-CX1x4AFn.js → index-BFv1hzF6.js} +1 -1
- package/src/assets/web-panel/assets/index-BVafOL_I.js +1 -0
- package/src/assets/web-panel/assets/{index-DU2TXJu-.js → index-BXlEx4UH.js} +1 -1
- package/src/assets/web-panel/assets/{index-e-e40id6.js → index-BayRTE5w.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXet1xol.js → index-Bb9nyts1.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7z4zB_a.js → index-Bf_Va0S-.js} +1 -1
- package/src/assets/web-panel/assets/{index-fccZmC_h.js → index-Br3wQLVY.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bqc8tdIF.js → index-BvK4fjkk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO9dQjpt.js → index-C40UdtlS.js} +1 -1
- package/src/assets/web-panel/assets/{index-Csfb-7hw.js → index-C4UJA2ju.js} +1 -1
- package/src/assets/web-panel/assets/{index-Td8ZwyoC.js → index-CB_Iw73G.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZ5lY2zx.js → index-CCwWp3mT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpqtbXdE.js → index-CFa2fPCk.js} +1 -1
- package/src/assets/web-panel/assets/{index-NJieh3T1.js → index-CIyHxV4u.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbkghqn_.js → index-CUP-A2_h.js} +1 -1
- package/src/assets/web-panel/assets/{index-DqwPFbOb.js → index-CUo27q9J.js} +3 -3
- package/src/assets/web-panel/assets/{index-B4QYBliR.js → index-CaT8trvf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgfImyZI.js → index-CnZNbcux.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbd7eEex.js → index-Cy2NE6AO.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbTPvp2_.js → index-CzeEEazr.js} +1 -1
- package/src/assets/web-panel/assets/{index-5pW4t1iD.js → index-D--TEyDj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dg2a9owQ.js → index-DCtsjhhT.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_eCoZgW.js → index-DLOf7BSz.js} +1 -1
- package/src/assets/web-panel/assets/{index-7P1b8HZo.js → index-DM5c4pc-.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRPrHE7h.js → index-DRFC2Qt0.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bq5P3piS.js → index-DT_qVaaV.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjWltbi_.js → index-DUDoRk9r.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkMKuqUs.js → index-Dg-AQYDf.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLoalqRX.js → index-DuIPq5MX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGlotREA.js → index-NYVBUAVN.js} +1 -1
- package/src/assets/web-panel/assets/{index-yYEQXYaU.js → index-NaCESahy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmruhzFi.js → index-RjIMPG0u.js} +1 -1
- package/src/assets/web-panel/assets/{index-fgYk0QXO.js → index-Y9akzgFO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvV03Ayk.js → index-hZ0Eyrrw.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CPrcB1TC.js → initDefaultProps-CG99CcR4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BQ7mWRh_.js → motion-Z7MH0_0G.js} +1 -1
- package/src/assets/web-panel/assets/{move-CzOEq99p.js → move-BX67lOdq.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BlQI5jrw.js → mtc-parser-CmAbG1fE.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DlW4gxmv.js → omit-DiU5tI1_.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BBYms5nP.js → pickAttrs-BGfvLrYL.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-az2MPJ_7.js → placementArrow-CggLEgaJ.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-D1-ibEol.js → responsiveObserve-t3nlghPZ.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DHGqa4GA.js → slide-BkV4dL9s.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CYGDo6lD.js → statusUtils-qec1PUoC.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Cl2EM9K6.js → styleChecker-ChjX6T8D.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DdYhzuv1.js → useFlexGapSupport-B1jLoZcM.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DWumPuBW.js → useFs-C3X53s4E.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DxAO-Aqi.js → usePersonalDataHub-DOvbbnkZ.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CplsQf_N.js → vnode-Ie0TEVFT.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Cw5HXNSG.js → zoom-CRUMVS8l.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/agent.js +18 -1
- package/src/commands/evolution-benchmark.js +72 -0
- package/src/commands/evolution.js +2 -0
- package/src/commands/governed-skill-marketplace.js +142 -0
- package/src/commands/marketplace.js +4 -1
- package/src/commands/serve.js +41 -0
- package/src/commands/skill.js +3 -0
- package/src/data/changelog.json +39 -0
- package/src/gateways/ws/ws-agent-handler.js +59 -2
- package/src/gateways/ws/ws-server.js +2 -0
- package/src/harness/golden-transcript.js +1 -0
- package/src/harness/prompt-compressor.js +51 -5
- package/src/harness/provider-backed-compaction.js +28 -1
- package/src/harness/remote-session-registry.js +15 -3
- package/src/index.js +30 -4
- package/src/lazy-dispatch.js +15 -1
- package/src/lib/advisor-runtime.js +55 -2
- package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
- package/src/lib/app-server/graph-runtime.js +32 -0
- package/src/lib/app-server/server.js +45 -1
- package/src/lib/app-server/websocket-transport.js +23 -0
- package/src/lib/autonomous-agent.js +63 -13
- package/src/lib/cowork/ab-comparator-cli.js +4 -3
- package/src/lib/cowork/debate-review-cli.js +4 -3
- package/src/lib/cowork/decision-kb-cli.js +5 -0
- package/src/lib/cowork-adapter.js +38 -16
- package/src/lib/evolution/agent-evolution-ingress.js +95 -15
- package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
- package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
- package/src/lib/evolution/agent-model-projection.js +217 -0
- package/src/lib/evolution/bounded-descriptor-read.js +29 -0
- package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
- package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
- package/src/lib/evolution/evidence-backed-wiki-maintainer.js +10 -1
- package/src/lib/evolution/evidence-json-text.js +236 -0
- package/src/lib/evolution/evolution-artifact-ports.js +202 -21
- package/src/lib/evolution/evolution-deployment-loader.js +369 -0
- package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
- package/src/lib/evolution/evolution-eval-gate.js +14 -1
- package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
- package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
- package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
- package/src/lib/evolution/evolution-evidence-projector.js +240 -37
- package/src/lib/evolution/evolution-file-witness.js +153 -30
- package/src/lib/evolution/evolution-ledger-ports.js +1027 -66
- package/src/lib/evolution/evolution-ledger.js +66 -2
- package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
- package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
- package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
- package/src/lib/evolution/evolution-release-train-ledger-adapter.js +335 -0
- package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
- package/src/lib/evolution/evolution-release-train.js +586 -0
- package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
- package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
- package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
- package/src/lib/evolution/evolution-workbench-projection.js +152 -25
- package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
- package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
- package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
- package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
- package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
- package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
- package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
- package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +736 -0
- package/src/lib/evolution/governed-knowledge-artifact-lifecycle.js +364 -0
- package/src/lib/evolution/governed-knowledge-candidate-rejection.js +343 -0
- package/src/lib/evolution/governed-knowledge-dependency-authority.js +227 -44
- package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +95 -83
- package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +29 -2
- package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +31 -3
- package/src/lib/evolution/governed-knowledge-record.js +148 -0
- package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
- package/src/lib/evolution/governed-knowledge-skill-rollback.js +475 -0
- package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +92 -6
- package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +57 -4
- package/src/lib/evolution/governed-knowledge-sync.js +332 -99
- package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +462 -0
- package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
- package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
- package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
- package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
- package/src/lib/evolution/governed-skill-marketplace.js +288 -5
- package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
- package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
- package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
- package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
- package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
- package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
- package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
- package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
- package/src/lib/evolution/governed-wiki-pruning.js +322 -143
- package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
- package/src/lib/evolution/knowledge-wiki-source-admission.js +124 -0
- package/src/lib/evolution/knowledge-wiki-source-provenance.js +359 -0
- package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
- package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
- package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
- package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
- package/src/lib/evolution/skill-candidate-registry.js +22 -0
- package/src/lib/evolution/skill-promotion-controller.js +25 -0
- package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
- package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
- package/src/lib/evolution/skill-release-registry.js +25 -4
- package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
- package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
- package/src/lib/evolution/skill-revocation-propagation.js +467 -0
- package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
- package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
- package/src/lib/evolution/skill-writer-inventory-manifest.js +15 -12
- package/src/lib/evolution/statistical-progressive-canary.js +845 -0
- package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
- package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
- package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
- package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
- package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +760 -100
- package/src/lib/evolution/wiki-revision-protocol.js +120 -0
- package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
- package/src/lib/evolution/wiki-target-tombstone-revision.js +101 -0
- package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
- package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
- package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
- package/src/lib/evolution/wikiskill-benchmark.js +574 -0
- package/src/lib/goal-assess.js +17 -10
- package/src/lib/interactive-planner.js +9 -1
- package/src/lib/iteration-budget.js +16 -2
- package/src/lib/micro-compact.js +4 -1
- package/src/lib/model-failure-policy.js +21 -0
- package/src/lib/process-execution-broker/index.js +1 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +33 -15
- package/src/lib/read-file-page.js +191 -0
- package/src/lib/runnable-provider.js +2 -1
- package/src/lib/session-host-lease.js +11 -16
- package/src/lib/skill-retrieval-router.js +22 -1
- package/src/repl/agent-repl.js +127 -33
- package/src/runtime/agent-core.js +224 -80
- package/src/runtime/agent-runtime.js +43 -0
- package/src/runtime/coding-agent-contract-shared.cjs +7 -1
- package/src/runtime/fallback-model.js +143 -62
- package/src/runtime/headless-runner.js +54 -10
- package/src/runtime/headless-stream.js +53 -6
- package/src/runtime/runtime-factory.js +41 -2
- package/src/assets/web-panel/assets/Notes-CgU9DDo9.js +0 -7
- package/src/assets/web-panel/assets/OrderTableRenderer-CwHc15Zs.js +0 -1
- package/src/assets/web-panel/assets/Projects-FF_thRi6.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-l7ox6KuX.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DyhgpXPf.js +0 -1
- package/src/assets/web-panel/assets/index-Ck1jhFE0.js +0 -1
- package/src/assets/web-panel/assets/index-c8jJEHVs.js +0 -1
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
export const WIKISKILL_BENCHMARK_PLAN_SCHEMA =
|
|
4
|
+
"chainlesschain.wikiskill-benchmark-plan/v2";
|
|
5
|
+
export const WIKISKILL_BENCHMARK_REPORT_SCHEMA =
|
|
6
|
+
"chainlesschain.wikiskill-benchmark-report/v1";
|
|
7
|
+
export const WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA =
|
|
8
|
+
"chainlesschain.wikiskill-benchmark-envelope/v1";
|
|
9
|
+
|
|
10
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
11
|
+
const COMMIT = /^[a-f0-9]{40}$/u;
|
|
12
|
+
const FAILURE_CLASSES = new Set([
|
|
13
|
+
"none",
|
|
14
|
+
"model",
|
|
15
|
+
"tool",
|
|
16
|
+
"provider",
|
|
17
|
+
"sandbox",
|
|
18
|
+
"permission",
|
|
19
|
+
"infrastructure",
|
|
20
|
+
"grader",
|
|
21
|
+
"unknown",
|
|
22
|
+
]);
|
|
23
|
+
|
|
24
|
+
function canonical(value) {
|
|
25
|
+
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
26
|
+
if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
|
|
27
|
+
return `{${Object.keys(value)
|
|
28
|
+
.sort()
|
|
29
|
+
.map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
|
|
30
|
+
.join(",")}}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function digest(domain, value) {
|
|
34
|
+
return `sha256:${createHash("sha256")
|
|
35
|
+
.update(domain)
|
|
36
|
+
.update("\0")
|
|
37
|
+
.update(canonical(value))
|
|
38
|
+
.digest("hex")}`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function exactKeys(value, keys, name) {
|
|
42
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
43
|
+
throw new TypeError(`${name} must be an object`);
|
|
44
|
+
const actual = Object.keys(value).sort();
|
|
45
|
+
const expected = [...keys].sort();
|
|
46
|
+
if (canonical(actual) !== canonical(expected))
|
|
47
|
+
throw new TypeError(`${name} has unexpected or missing fields`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function string(value, name) {
|
|
51
|
+
if (typeof value !== "string" || value.trim() === "")
|
|
52
|
+
throw new TypeError(`${name} must be a non-empty string`);
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function sha(value, name) {
|
|
57
|
+
if (!DIGEST.test(value ?? ""))
|
|
58
|
+
throw new TypeError(`${name} must be a sha256 digest`);
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function finite(value, name, { min = 0, max = Number.MAX_VALUE } = {}) {
|
|
63
|
+
const number = Number(value);
|
|
64
|
+
if (!Number.isFinite(number) || number < min || number > max)
|
|
65
|
+
throw new TypeError(`${name} is outside its allowed range`);
|
|
66
|
+
return number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function normalizeDatasets(datasets) {
|
|
70
|
+
if (!Array.isArray(datasets) || datasets.length !== 5)
|
|
71
|
+
throw new TypeError("datasets must contain exactly five entries");
|
|
72
|
+
const ids = new Set();
|
|
73
|
+
return datasets.map((dataset, index) => {
|
|
74
|
+
exactKeys(
|
|
75
|
+
dataset,
|
|
76
|
+
["id", "version", "digest", "splitIds"],
|
|
77
|
+
`dataset ${index}`,
|
|
78
|
+
);
|
|
79
|
+
const id = string(dataset.id, `dataset ${index} id`);
|
|
80
|
+
if (ids.has(id)) throw new TypeError(`duplicate dataset id: ${id}`);
|
|
81
|
+
ids.add(id);
|
|
82
|
+
if (!Array.isArray(dataset.splitIds) || dataset.splitIds.length === 0)
|
|
83
|
+
throw new TypeError(`dataset ${id} must contain splitIds`);
|
|
84
|
+
const splitIds = dataset.splitIds.map((item, splitIndex) =>
|
|
85
|
+
string(item, `dataset ${id} split ${splitIndex}`),
|
|
86
|
+
);
|
|
87
|
+
if (new Set(splitIds).size !== splitIds.length)
|
|
88
|
+
throw new TypeError(`dataset ${id} contains duplicate splitIds`);
|
|
89
|
+
return Object.freeze({
|
|
90
|
+
id,
|
|
91
|
+
version: string(dataset.version, `dataset ${id} version`),
|
|
92
|
+
digest: sha(dataset.digest, `dataset ${id} digest`),
|
|
93
|
+
splitIds: Object.freeze(splitIds),
|
|
94
|
+
splitDigest: digest(WIKISKILL_BENCHMARK_PLAN_SCHEMA, splitIds),
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function createWikiSkillBenchmarkPlan(input = {}) {
|
|
100
|
+
exactKeys(
|
|
101
|
+
input,
|
|
102
|
+
[
|
|
103
|
+
"gitCommit",
|
|
104
|
+
"runnerDigest",
|
|
105
|
+
"executionManifestDigest",
|
|
106
|
+
"model",
|
|
107
|
+
"inference",
|
|
108
|
+
"environment",
|
|
109
|
+
"datasets",
|
|
110
|
+
"toolDigest",
|
|
111
|
+
"apiDigest",
|
|
112
|
+
"promptDigest",
|
|
113
|
+
"skillDigest",
|
|
114
|
+
"wikiDigest",
|
|
115
|
+
"seedSchedule",
|
|
116
|
+
"bootstrapSamples",
|
|
117
|
+
],
|
|
118
|
+
"benchmark plan",
|
|
119
|
+
);
|
|
120
|
+
exactKeys(input.model, ["checkpoint", "digest"], "model");
|
|
121
|
+
exactKeys(
|
|
122
|
+
input.environment,
|
|
123
|
+
["containerDigest", "vllmVersion", "hardware"],
|
|
124
|
+
"environment",
|
|
125
|
+
);
|
|
126
|
+
if (
|
|
127
|
+
!input.inference ||
|
|
128
|
+
typeof input.inference !== "object" ||
|
|
129
|
+
Array.isArray(input.inference)
|
|
130
|
+
)
|
|
131
|
+
throw new TypeError("inference must be an object");
|
|
132
|
+
if (!Array.isArray(input.seedSchedule) || input.seedSchedule.length < 3)
|
|
133
|
+
throw new TypeError(
|
|
134
|
+
"seedSchedule must contain at least three independent runs",
|
|
135
|
+
);
|
|
136
|
+
const seedSchedule = input.seedSchedule.map((seed, index) => {
|
|
137
|
+
if (!Number.isSafeInteger(seed) || seed < 0)
|
|
138
|
+
throw new TypeError(
|
|
139
|
+
`seedSchedule ${index} must be a non-negative safe integer`,
|
|
140
|
+
);
|
|
141
|
+
return seed;
|
|
142
|
+
});
|
|
143
|
+
if (new Set(seedSchedule).size !== seedSchedule.length)
|
|
144
|
+
throw new TypeError("seedSchedule must not contain duplicates");
|
|
145
|
+
if (input.bootstrapSamples !== 1_000)
|
|
146
|
+
throw new TypeError("bootstrapSamples must equal 1000");
|
|
147
|
+
const gitCommit = string(input.gitCommit, "gitCommit");
|
|
148
|
+
if (!COMMIT.test(gitCommit))
|
|
149
|
+
throw new TypeError("gitCommit must be a full commit SHA");
|
|
150
|
+
const core = {
|
|
151
|
+
schema: WIKISKILL_BENCHMARK_PLAN_SCHEMA,
|
|
152
|
+
gitCommit,
|
|
153
|
+
runnerDigest: sha(input.runnerDigest, "runnerDigest"),
|
|
154
|
+
executionManifestDigest: sha(
|
|
155
|
+
input.executionManifestDigest,
|
|
156
|
+
"executionManifestDigest",
|
|
157
|
+
),
|
|
158
|
+
model: Object.freeze({
|
|
159
|
+
checkpoint: string(input.model.checkpoint, "model checkpoint"),
|
|
160
|
+
digest: sha(input.model.digest, "model digest"),
|
|
161
|
+
}),
|
|
162
|
+
inference: Object.freeze(JSON.parse(canonical(input.inference))),
|
|
163
|
+
environment: Object.freeze({
|
|
164
|
+
containerDigest: sha(
|
|
165
|
+
input.environment.containerDigest,
|
|
166
|
+
"container digest",
|
|
167
|
+
),
|
|
168
|
+
vllmVersion: string(input.environment.vllmVersion, "vLLM version"),
|
|
169
|
+
hardware: string(input.environment.hardware, "hardware"),
|
|
170
|
+
}),
|
|
171
|
+
datasets: Object.freeze(normalizeDatasets(input.datasets)),
|
|
172
|
+
toolDigest: sha(input.toolDigest, "toolDigest"),
|
|
173
|
+
apiDigest: sha(input.apiDigest, "apiDigest"),
|
|
174
|
+
promptDigest: sha(input.promptDigest, "promptDigest"),
|
|
175
|
+
skillDigest: sha(input.skillDigest, "skillDigest"),
|
|
176
|
+
wikiDigest: sha(input.wikiDigest, "wikiDigest"),
|
|
177
|
+
seedSchedule: Object.freeze(seedSchedule),
|
|
178
|
+
bootstrapSamples: 1_000,
|
|
179
|
+
};
|
|
180
|
+
return Object.freeze({
|
|
181
|
+
...core,
|
|
182
|
+
planDigest: digest(WIKISKILL_BENCHMARK_PLAN_SCHEMA, core),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export function verifyWikiSkillBenchmarkPlan(plan) {
|
|
187
|
+
exactKeys(
|
|
188
|
+
plan,
|
|
189
|
+
[
|
|
190
|
+
"schema",
|
|
191
|
+
"gitCommit",
|
|
192
|
+
"runnerDigest",
|
|
193
|
+
"executionManifestDigest",
|
|
194
|
+
"model",
|
|
195
|
+
"inference",
|
|
196
|
+
"environment",
|
|
197
|
+
"datasets",
|
|
198
|
+
"toolDigest",
|
|
199
|
+
"apiDigest",
|
|
200
|
+
"promptDigest",
|
|
201
|
+
"skillDigest",
|
|
202
|
+
"wikiDigest",
|
|
203
|
+
"seedSchedule",
|
|
204
|
+
"bootstrapSamples",
|
|
205
|
+
"planDigest",
|
|
206
|
+
],
|
|
207
|
+
"benchmark plan",
|
|
208
|
+
);
|
|
209
|
+
if (plan.schema !== WIKISKILL_BENCHMARK_PLAN_SCHEMA)
|
|
210
|
+
throw new TypeError("benchmark plan schema is invalid");
|
|
211
|
+
const recreated = createWikiSkillBenchmarkPlan({
|
|
212
|
+
gitCommit: plan.gitCommit,
|
|
213
|
+
runnerDigest: plan.runnerDigest,
|
|
214
|
+
executionManifestDigest: plan.executionManifestDigest,
|
|
215
|
+
model: plan.model,
|
|
216
|
+
inference: plan.inference,
|
|
217
|
+
environment: plan.environment,
|
|
218
|
+
datasets: plan.datasets.map(({ id, version, digest: value, splitIds }) => ({
|
|
219
|
+
id,
|
|
220
|
+
version,
|
|
221
|
+
digest: value,
|
|
222
|
+
splitIds,
|
|
223
|
+
})),
|
|
224
|
+
toolDigest: plan.toolDigest,
|
|
225
|
+
apiDigest: plan.apiDigest,
|
|
226
|
+
promptDigest: plan.promptDigest,
|
|
227
|
+
skillDigest: plan.skillDigest,
|
|
228
|
+
wikiDigest: plan.wikiDigest,
|
|
229
|
+
seedSchedule: plan.seedSchedule,
|
|
230
|
+
bootstrapSamples: plan.bootstrapSamples,
|
|
231
|
+
});
|
|
232
|
+
if (canonical(recreated) !== canonical(plan))
|
|
233
|
+
throw new Error("benchmark plan digest mismatch");
|
|
234
|
+
return recreated;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function normalizeArm(arm, name) {
|
|
238
|
+
exactKeys(
|
|
239
|
+
arm,
|
|
240
|
+
[
|
|
241
|
+
"score",
|
|
242
|
+
"traceDigest",
|
|
243
|
+
"graderReceiptDigest",
|
|
244
|
+
"failureClass",
|
|
245
|
+
"tokens",
|
|
246
|
+
"cost",
|
|
247
|
+
"latencyMs",
|
|
248
|
+
],
|
|
249
|
+
name,
|
|
250
|
+
);
|
|
251
|
+
if (!FAILURE_CLASSES.has(arm.failureClass))
|
|
252
|
+
throw new TypeError(`${name} failureClass is invalid`);
|
|
253
|
+
return Object.freeze({
|
|
254
|
+
score: finite(arm.score, `${name} score`, { max: 1 }),
|
|
255
|
+
traceDigest: sha(arm.traceDigest, `${name} traceDigest`),
|
|
256
|
+
graderReceiptDigest: sha(
|
|
257
|
+
arm.graderReceiptDigest,
|
|
258
|
+
`${name} graderReceiptDigest`,
|
|
259
|
+
),
|
|
260
|
+
failureClass: arm.failureClass,
|
|
261
|
+
tokens: finite(arm.tokens, `${name} tokens`),
|
|
262
|
+
cost: finite(arm.cost, `${name} cost`),
|
|
263
|
+
latencyMs: finite(arm.latencyMs, `${name} latencyMs`),
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function percentile(sorted, probability) {
|
|
268
|
+
if (sorted.length === 1) return sorted[0];
|
|
269
|
+
const position = (sorted.length - 1) * probability;
|
|
270
|
+
const lower = Math.floor(position);
|
|
271
|
+
const upper = Math.ceil(position);
|
|
272
|
+
const weight = position - lower;
|
|
273
|
+
return sorted[lower] * (1 - weight) + sorted[upper] * weight;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function prngFromDigest(value) {
|
|
277
|
+
let state = Number.parseInt(value.slice(7, 15), 16) || 0x9e3779b9;
|
|
278
|
+
return () => {
|
|
279
|
+
state ^= state << 13;
|
|
280
|
+
state ^= state >>> 17;
|
|
281
|
+
state ^= state << 5;
|
|
282
|
+
return (state >>> 0) / 0x1_0000_0000;
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function mean(values) {
|
|
287
|
+
return values.reduce((sum, value) => sum + value, 0) / values.length;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export function buildWikiSkillBenchmarkReport({ plan, runs } = {}) {
|
|
291
|
+
try {
|
|
292
|
+
plan = verifyWikiSkillBenchmarkPlan(plan);
|
|
293
|
+
} catch (cause) {
|
|
294
|
+
if (cause?.message === "benchmark plan digest mismatch") throw cause;
|
|
295
|
+
throw new TypeError("a canonical benchmark plan is required", { cause });
|
|
296
|
+
}
|
|
297
|
+
if (!Array.isArray(runs) || runs.length !== plan.seedSchedule.length)
|
|
298
|
+
throw new TypeError("runs must exactly cover the seed schedule");
|
|
299
|
+
const expectedCases = new Map(
|
|
300
|
+
plan.datasets.flatMap((dataset) =>
|
|
301
|
+
dataset.splitIds.map((splitId) => [`${dataset.id}\0${splitId}`, dataset]),
|
|
302
|
+
),
|
|
303
|
+
);
|
|
304
|
+
const seenSeeds = new Set();
|
|
305
|
+
const normalizedRuns = runs.map((run, runIndex) => {
|
|
306
|
+
exactKeys(run, ["runId", "seed", "cases"], `run ${runIndex}`);
|
|
307
|
+
if (!plan.seedSchedule.includes(run.seed) || seenSeeds.has(run.seed))
|
|
308
|
+
throw new TypeError(`run ${runIndex} seed is absent or duplicated`);
|
|
309
|
+
seenSeeds.add(run.seed);
|
|
310
|
+
if (!Array.isArray(run.cases) || run.cases.length !== expectedCases.size)
|
|
311
|
+
throw new TypeError(`run ${runIndex} does not cover every split`);
|
|
312
|
+
const seenCases = new Set();
|
|
313
|
+
const cases = run.cases.map((item, caseIndex) => {
|
|
314
|
+
exactKeys(
|
|
315
|
+
item,
|
|
316
|
+
["datasetId", "splitId", "baseline", "skill"],
|
|
317
|
+
`run ${runIndex} case ${caseIndex}`,
|
|
318
|
+
);
|
|
319
|
+
const key = `${item.datasetId}\0${item.splitId}`;
|
|
320
|
+
if (!expectedCases.has(key) || seenCases.has(key))
|
|
321
|
+
throw new TypeError(`run ${runIndex} has an absent or duplicate split`);
|
|
322
|
+
seenCases.add(key);
|
|
323
|
+
return Object.freeze({
|
|
324
|
+
datasetId: item.datasetId,
|
|
325
|
+
splitId: item.splitId,
|
|
326
|
+
baseline: normalizeArm(item.baseline, `run ${runIndex} baseline`),
|
|
327
|
+
skill: normalizeArm(item.skill, `run ${runIndex} skill`),
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
cases.sort((left, right) =>
|
|
331
|
+
`${left.datasetId}\0${left.splitId}`.localeCompare(
|
|
332
|
+
`${right.datasetId}\0${right.splitId}`,
|
|
333
|
+
),
|
|
334
|
+
);
|
|
335
|
+
return Object.freeze({
|
|
336
|
+
runId: string(run.runId, `run ${runIndex} runId`),
|
|
337
|
+
seed: run.seed,
|
|
338
|
+
cases: Object.freeze(cases),
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
normalizedRuns.sort(
|
|
342
|
+
(left, right) =>
|
|
343
|
+
plan.seedSchedule.indexOf(left.seed) -
|
|
344
|
+
plan.seedSchedule.indexOf(right.seed),
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
const perDataset = plan.datasets.map((dataset) => {
|
|
348
|
+
const observations = normalizedRuns.flatMap((run) =>
|
|
349
|
+
run.cases.filter((item) => item.datasetId === dataset.id),
|
|
350
|
+
);
|
|
351
|
+
const baseline = mean(observations.map((item) => item.baseline.score));
|
|
352
|
+
const skill = mean(observations.map((item) => item.skill.score));
|
|
353
|
+
return Object.freeze({
|
|
354
|
+
datasetId: dataset.id,
|
|
355
|
+
count: observations.length,
|
|
356
|
+
baseline,
|
|
357
|
+
skill,
|
|
358
|
+
delta: skill - baseline,
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
const equalWeightBaseline = mean(perDataset.map((item) => item.baseline));
|
|
362
|
+
const equalWeightSkill = mean(perDataset.map((item) => item.skill));
|
|
363
|
+
const deltas = normalizedRuns.flatMap((run) =>
|
|
364
|
+
run.cases.map((item) => item.skill.score - item.baseline.score),
|
|
365
|
+
);
|
|
366
|
+
const random = prngFromDigest(plan.planDigest);
|
|
367
|
+
const bootstrap = Array.from({ length: plan.bootstrapSamples }, () => {
|
|
368
|
+
const sample = Array.from(
|
|
369
|
+
{ length: deltas.length },
|
|
370
|
+
() => deltas[Math.floor(random() * deltas.length)],
|
|
371
|
+
);
|
|
372
|
+
return mean(sample);
|
|
373
|
+
}).sort((left, right) => left - right);
|
|
374
|
+
const measurements = normalizedRuns.flatMap((run) =>
|
|
375
|
+
run.cases.flatMap((item) => [item.baseline, item.skill]),
|
|
376
|
+
);
|
|
377
|
+
const core = {
|
|
378
|
+
schema: WIKISKILL_BENCHMARK_REPORT_SCHEMA,
|
|
379
|
+
planDigest: plan.planDigest,
|
|
380
|
+
gitCommit: plan.gitCommit,
|
|
381
|
+
runnerDigest: plan.runnerDigest,
|
|
382
|
+
datasetDigests: Object.freeze(
|
|
383
|
+
plan.datasets.map(({ id, digest: datasetDigest, splitDigest }) => ({
|
|
384
|
+
id,
|
|
385
|
+
digest: datasetDigest,
|
|
386
|
+
splitDigest,
|
|
387
|
+
})),
|
|
388
|
+
),
|
|
389
|
+
runCount: normalizedRuns.length,
|
|
390
|
+
pairedObservationCount: deltas.length,
|
|
391
|
+
perDataset: Object.freeze(perDataset),
|
|
392
|
+
metrics: Object.freeze({
|
|
393
|
+
equalWeightBaseline,
|
|
394
|
+
equalWeightSkill,
|
|
395
|
+
delta: equalWeightSkill - equalWeightBaseline,
|
|
396
|
+
pairedBootstrap95Ci: Object.freeze([
|
|
397
|
+
percentile(bootstrap, 0.025),
|
|
398
|
+
percentile(bootstrap, 0.975),
|
|
399
|
+
]),
|
|
400
|
+
bootstrapSamples: plan.bootstrapSamples,
|
|
401
|
+
tokens: measurements.reduce((sum, item) => sum + item.tokens, 0),
|
|
402
|
+
cost: measurements.reduce((sum, item) => sum + item.cost, 0),
|
|
403
|
+
latencyMs: Object.freeze({
|
|
404
|
+
p50: percentile(
|
|
405
|
+
measurements.map((item) => item.latencyMs).sort((a, b) => a - b),
|
|
406
|
+
0.5,
|
|
407
|
+
),
|
|
408
|
+
p95: percentile(
|
|
409
|
+
measurements.map((item) => item.latencyMs).sort((a, b) => a - b),
|
|
410
|
+
0.95,
|
|
411
|
+
),
|
|
412
|
+
p99: percentile(
|
|
413
|
+
measurements.map((item) => item.latencyMs).sort((a, b) => a - b),
|
|
414
|
+
0.99,
|
|
415
|
+
),
|
|
416
|
+
}),
|
|
417
|
+
}),
|
|
418
|
+
failureCounts: Object.freeze(
|
|
419
|
+
[...FAILURE_CLASSES].reduce((result, classification) => {
|
|
420
|
+
result[classification] = measurements.filter(
|
|
421
|
+
(item) => item.failureClass === classification,
|
|
422
|
+
).length;
|
|
423
|
+
return result;
|
|
424
|
+
}, {}),
|
|
425
|
+
),
|
|
426
|
+
runs: Object.freeze(normalizedRuns),
|
|
427
|
+
};
|
|
428
|
+
return Object.freeze({
|
|
429
|
+
...core,
|
|
430
|
+
reportDigest: digest(WIKISKILL_BENCHMARK_REPORT_SCHEMA, core),
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
export function verifyWikiSkillBenchmarkReport({ plan, report } = {}) {
|
|
435
|
+
const verifiedPlan = verifyWikiSkillBenchmarkPlan(plan);
|
|
436
|
+
if (!report || report.schema !== WIKISKILL_BENCHMARK_REPORT_SCHEMA)
|
|
437
|
+
throw new TypeError("a canonical benchmark report is required");
|
|
438
|
+
const recreated = buildWikiSkillBenchmarkReport({
|
|
439
|
+
plan: verifiedPlan,
|
|
440
|
+
runs: report.runs,
|
|
441
|
+
});
|
|
442
|
+
if (canonical(recreated) !== canonical(report))
|
|
443
|
+
throw new Error("benchmark report digest mismatch");
|
|
444
|
+
return recreated;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
export async function executeWikiSkillBenchmarkProtocolFixture({
|
|
448
|
+
plan,
|
|
449
|
+
runner,
|
|
450
|
+
} = {}) {
|
|
451
|
+
if (
|
|
452
|
+
!plan ||
|
|
453
|
+
plan.schema !== WIKISKILL_BENCHMARK_PLAN_SCHEMA ||
|
|
454
|
+
!DIGEST.test(plan.planDigest ?? "")
|
|
455
|
+
)
|
|
456
|
+
throw new TypeError("a canonical benchmark plan is required");
|
|
457
|
+
if (typeof runner !== "function")
|
|
458
|
+
throw new TypeError("benchmark runner is required");
|
|
459
|
+
const runs = [];
|
|
460
|
+
for (const seed of plan.seedSchedule) {
|
|
461
|
+
const cases = [];
|
|
462
|
+
for (const dataset of plan.datasets) {
|
|
463
|
+
for (const splitId of dataset.splitIds) {
|
|
464
|
+
const common = Object.freeze({
|
|
465
|
+
planDigest: plan.planDigest,
|
|
466
|
+
seed,
|
|
467
|
+
dataset: Object.freeze({
|
|
468
|
+
id: dataset.id,
|
|
469
|
+
version: dataset.version,
|
|
470
|
+
digest: dataset.digest,
|
|
471
|
+
splitId,
|
|
472
|
+
splitDigest: dataset.splitDigest,
|
|
473
|
+
}),
|
|
474
|
+
model: plan.model,
|
|
475
|
+
inference: plan.inference,
|
|
476
|
+
environment: plan.environment,
|
|
477
|
+
toolDigest: plan.toolDigest,
|
|
478
|
+
apiDigest: plan.apiDigest,
|
|
479
|
+
promptDigest: plan.promptDigest,
|
|
480
|
+
runnerDigest: plan.runnerDigest,
|
|
481
|
+
});
|
|
482
|
+
const baseline = await runner(
|
|
483
|
+
Object.freeze({
|
|
484
|
+
...common,
|
|
485
|
+
arm: "no-skill",
|
|
486
|
+
skillDigest: null,
|
|
487
|
+
wikiDigest: null,
|
|
488
|
+
}),
|
|
489
|
+
);
|
|
490
|
+
const skill = await runner(
|
|
491
|
+
Object.freeze({
|
|
492
|
+
...common,
|
|
493
|
+
arm: "skill",
|
|
494
|
+
skillDigest: plan.skillDigest,
|
|
495
|
+
wikiDigest: plan.wikiDigest,
|
|
496
|
+
}),
|
|
497
|
+
);
|
|
498
|
+
cases.push({
|
|
499
|
+
datasetId: dataset.id,
|
|
500
|
+
splitId,
|
|
501
|
+
baseline,
|
|
502
|
+
skill,
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
runs.push({
|
|
507
|
+
runId: digest(WIKISKILL_BENCHMARK_REPORT_SCHEMA, {
|
|
508
|
+
planDigest: plan.planDigest,
|
|
509
|
+
seed,
|
|
510
|
+
}),
|
|
511
|
+
seed,
|
|
512
|
+
cases,
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
return buildWikiSkillBenchmarkReport({ plan, runs });
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
export async function signWikiSkillBenchmarkReport({ report, attestor } = {}) {
|
|
519
|
+
if (
|
|
520
|
+
!report ||
|
|
521
|
+
report.schema !== WIKISKILL_BENCHMARK_REPORT_SCHEMA ||
|
|
522
|
+
!DIGEST.test(report.reportDigest ?? "")
|
|
523
|
+
)
|
|
524
|
+
throw new TypeError("a canonical benchmark report is required");
|
|
525
|
+
if (typeof attestor !== "function")
|
|
526
|
+
throw new TypeError("attestor is required");
|
|
527
|
+
const attestation = await attestor(report.reportDigest);
|
|
528
|
+
if (!attestation || typeof attestation !== "object")
|
|
529
|
+
throw new Error("benchmark attestor returned no attestation");
|
|
530
|
+
return Object.freeze({
|
|
531
|
+
schema: WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA,
|
|
532
|
+
report,
|
|
533
|
+
attestation: Object.freeze({ ...attestation }),
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
export async function projectWikiSkillBenchmarkClaim({
|
|
538
|
+
envelope,
|
|
539
|
+
verifyAttestation,
|
|
540
|
+
} = {}) {
|
|
541
|
+
const hold = Object.freeze({
|
|
542
|
+
provenance: "external-paper-only",
|
|
543
|
+
status: "HOLD",
|
|
544
|
+
reportDigest: null,
|
|
545
|
+
metrics: null,
|
|
546
|
+
});
|
|
547
|
+
if (!envelope) return hold;
|
|
548
|
+
if (
|
|
549
|
+
envelope.schema !== WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA ||
|
|
550
|
+
typeof verifyAttestation !== "function"
|
|
551
|
+
)
|
|
552
|
+
throw new TypeError("signed benchmark envelope and verifier are required");
|
|
553
|
+
const { report } = envelope;
|
|
554
|
+
if (!report || report.schema !== WIKISKILL_BENCHMARK_REPORT_SCHEMA)
|
|
555
|
+
throw new Error("benchmark report is invalid");
|
|
556
|
+
const core = Object.fromEntries(
|
|
557
|
+
Object.entries(report).filter(([key]) => key !== "reportDigest"),
|
|
558
|
+
);
|
|
559
|
+
if (digest(WIKISKILL_BENCHMARK_REPORT_SCHEMA, core) !== report.reportDigest)
|
|
560
|
+
throw new Error("benchmark report digest mismatch");
|
|
561
|
+
if (
|
|
562
|
+
!(await verifyAttestation({
|
|
563
|
+
digest: report.reportDigest,
|
|
564
|
+
attestation: envelope.attestation,
|
|
565
|
+
}))
|
|
566
|
+
)
|
|
567
|
+
throw new Error("benchmark report attestation rejected");
|
|
568
|
+
return Object.freeze({
|
|
569
|
+
provenance: "chainlesschain-measured",
|
|
570
|
+
status: "VERIFIED",
|
|
571
|
+
reportDigest: report.reportDigest,
|
|
572
|
+
metrics: report.metrics,
|
|
573
|
+
});
|
|
574
|
+
}
|
package/src/lib/goal-assess.js
CHANGED
|
@@ -62,15 +62,17 @@ export function buildAssessPrompt(goal, transcript = {}) {
|
|
|
62
62
|
`RUN RESULT:\n${finalText || "(no final text)"}`,
|
|
63
63
|
"",
|
|
64
64
|
"Reply with ONLY a JSON object (no prose, no code fence) of this shape:",
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
"
|
|
65
|
+
JSON.stringify({
|
|
66
|
+
advanced: false,
|
|
67
|
+
progress: null,
|
|
68
|
+
keyResults: [{ id: "<kr-id>", current: null, done: false }],
|
|
69
|
+
note: "<one short sentence summarizing what changed>",
|
|
70
|
+
concerns: [],
|
|
71
|
+
}),
|
|
72
|
+
"Set advanced to true only if this run moved the goal forward; otherwise false.",
|
|
73
|
+
"Set progress to an estimated number from 0 to 100, or null to leave it unchanged.",
|
|
74
|
+
"Each keyResults entry uses a real key-result id, a numeric current value or null, and a boolean done. Omit keyResults if there are no updates.",
|
|
75
|
+
"Include short strings in concerns for blocking or at-risk items; omit concerns if there are none.",
|
|
74
76
|
].join("\n");
|
|
75
77
|
}
|
|
76
78
|
|
|
@@ -218,7 +220,12 @@ export async function assessGoalProgress({
|
|
|
218
220
|
let reply;
|
|
219
221
|
try {
|
|
220
222
|
reply = await chat(prompt);
|
|
221
|
-
} catch {
|
|
223
|
+
} catch (error) {
|
|
224
|
+
if (
|
|
225
|
+
error?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED" ||
|
|
226
|
+
error?.runtimeLedgerPersistence === true
|
|
227
|
+
)
|
|
228
|
+
throw error;
|
|
222
229
|
return { assessment: null, goal };
|
|
223
230
|
}
|
|
224
231
|
const assessment = parseAssessment(reply);
|
|
@@ -96,6 +96,11 @@ export class CLIInteractivePlanner extends EventEmitter {
|
|
|
96
96
|
};
|
|
97
97
|
} catch (err) {
|
|
98
98
|
session.status = PlanSessionStatus.FAILED;
|
|
99
|
+
if (
|
|
100
|
+
err?.runtimeLedgerPersistence === true ||
|
|
101
|
+
err?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED"
|
|
102
|
+
)
|
|
103
|
+
throw err;
|
|
99
104
|
return {
|
|
100
105
|
sessionId,
|
|
101
106
|
status: session.status,
|
|
@@ -345,7 +350,10 @@ Keep plans concise (3-8 steps). Use appropriate tools for each step.`;
|
|
|
345
350
|
{ role: "user", content: prompt },
|
|
346
351
|
]);
|
|
347
352
|
|
|
348
|
-
const content =
|
|
353
|
+
const content =
|
|
354
|
+
typeof response === "string"
|
|
355
|
+
? response
|
|
356
|
+
: response?.message?.content || response?.content || "";
|
|
349
357
|
const jsonText = firstBalancedJson(content, "{");
|
|
350
358
|
if (!jsonText) {
|
|
351
359
|
throw new Error("Failed to parse plan from LLM response");
|
|
@@ -45,13 +45,24 @@ export class IterationBudget {
|
|
|
45
45
|
* Resolve the budget limit from config/env/default.
|
|
46
46
|
* Priority: CC_ITERATION_BUDGET env > default
|
|
47
47
|
*/
|
|
48
|
-
static resolveLimit() {
|
|
48
|
+
static resolveLimit(fallback = DEFAULT_BUDGET) {
|
|
49
49
|
const env = process.env.CC_ITERATION_BUDGET;
|
|
50
50
|
if (env) {
|
|
51
51
|
const parsed = parseInt(env, 10);
|
|
52
52
|
if (!isNaN(parsed) && parsed > 0) return parsed;
|
|
53
53
|
}
|
|
54
|
-
return
|
|
54
|
+
return fallback;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Interactive work can continue until completion; explicit caps still win. */
|
|
58
|
+
static forRun({ maxTurns, continuous = false } = {}) {
|
|
59
|
+
return new IterationBudget({
|
|
60
|
+
limit: Number.isFinite(maxTurns)
|
|
61
|
+
? maxTurns === 0
|
|
62
|
+
? Infinity
|
|
63
|
+
: Math.max(1, Math.floor(maxTurns))
|
|
64
|
+
: IterationBudget.resolveLimit(continuous ? Infinity : DEFAULT_BUDGET),
|
|
65
|
+
});
|
|
55
66
|
}
|
|
56
67
|
|
|
57
68
|
/** Total iteration limit. */
|
|
@@ -141,6 +152,9 @@ export class IterationBudget {
|
|
|
141
152
|
* @returns {string}
|
|
142
153
|
*/
|
|
143
154
|
toSummary() {
|
|
155
|
+
if (!Number.isFinite(this._limit)) {
|
|
156
|
+
return `Iteration budget: ${this._consumed} iterations used (no turn limit).`;
|
|
157
|
+
}
|
|
144
158
|
const pct = Math.round(this.percentage() * 100);
|
|
145
159
|
return (
|
|
146
160
|
`Iteration budget: ${this._consumed}/${this._limit} (${pct}%). ` +
|
package/src/lib/micro-compact.js
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* Pure → unit-testable.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import { compactReadFileResult } from "./read-file-page.js";
|
|
13
|
+
|
|
12
14
|
const DEFAULT_KEEP_RECENT = 6; // last N messages kept verbatim
|
|
13
15
|
const DEFAULT_MAX_TOOL_CHARS = 400; // trim older tool results longer than this
|
|
14
16
|
|
|
@@ -44,7 +46,8 @@ export function microCompact(messages, opts = {}) {
|
|
|
44
46
|
? fullMarker
|
|
45
47
|
: "…[trimmed]".slice(0, maxChars);
|
|
46
48
|
const head = content.slice(0, Math.max(0, maxChars - marker.length));
|
|
47
|
-
const compactedContent =
|
|
49
|
+
const compactedContent =
|
|
50
|
+
compactReadFileResult(content, maxChars) || `${head}${marker}`;
|
|
48
51
|
trimmed += 1;
|
|
49
52
|
saved += content.length - compactedContent.length;
|
|
50
53
|
return {
|