chainlesschain 0.166.22 → 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/package.json +4 -3
- package/src/assets/web-panel/assets/{AIOps-oJ7USzMC.js → AIOps-DR-MWcZc.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BlgnZe_C.js → ActionButton-DT8B7sEb.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D2rRbTLu.js → Analytics-asjh3dQJ.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-FwS3f0B2.js → AppLayout-DivQ491i.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-iF-_08Hi.js → Artifacts-DPH2uUmy.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-D24p0zQw.js → Audit-Bp2nLyc-.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-Cg3mRVi9.js → BackgroundAgents-CHS28khl.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-EOqht3H-.js → Backup-CKeaFSfz.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-9XWYq2hj.js → BaseInput-CxwM9BAH.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Dq5yardA.js → Chat-DYLDwaCv.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Ds3pA-ET.js → ChatBubbleRenderer-DdBJDBP0.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-CuyCBoBf.js → Checkbox-uYTWOB8j.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DjWtYHNe.js → Codegen-CvYa_dwT.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CrVr_iuG.js → Col-CanMAX4m.js} +1 -1
- package/src/assets/web-panel/assets/{Community-C6QxpfGc.js → Community-B4WaDtHw.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B-v5r6Pa.js → Compact-K93Uof_3.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-zNiLiFgD.js → Compliance-CKeDLgUW.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-D9K7lMOu.js → Cowork-P93grAeB.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DAjO36z4.js → Cron-BSHnMtDn.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Bxqn0aqB.js → Crosschain-epAOpUVJ.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DfRmLUe-.js → DID-ByjXfP7t.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Cz8KF3fr.js → Dashboard-QztTU8tb.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-C4oVfkP0.js → Dropdown-DhUc9yhN.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-ivyZKN8k.js → EmailListRenderer-C2sLhJJN.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DoxY1CPW.js → FamilyGuardDashboard-CdfbWNDn.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-C93gZxnb.js → Federation-CcF_R7NW.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-D_lEjYJE.js → FormItemContext-Cm_X2IBk.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BNFN9YjN.js → GenericCardRenderer-DUi4NWlb.js} +1 -1
- package/src/assets/web-panel/assets/{Git-mUu2HcLI.js → Git-4Sq5FjBt.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CNuosrge.js → Governance-Dx2_v4V6.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DwY5pbCB.js → Inference-7Vr1xekR.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-aRUxhACD.js → KnowledgeGraph-Cnd2XOzf.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DFfsWYy_.js → Logs-B66QPVf-.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-DqTx7_u1.js → MarkdownRenderer-PLsEvhly.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-COI-ciM-.js → Marketplace-BMIK9BmC.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BJJwaIpe.js → McpTools-BDbyp3J_.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CDO6SGDZ.js → Memory-CJdzfZGi.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BlZ5tFf4.js → MobileBridge-C2TH5Y3-.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DuoxbgWz.js → MobileProjects-D1dYXkvV.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-6ec9j70b.js → Mtc-B-4A1I1j.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-BuL7HkC7.js → MtcAudit-Bgcc9UOl.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CJxR85lk.js → Multisig-DqOe-etP.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-B71O1S4l.js → NLProgramming-7VnhzE_6.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Bsw5zbpV.js → Notes-BxawpeUQ.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BnAhXuK_.js → NotificationSettings-Cr08G2aE.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BJ0R5GGz.js → OrderTableRenderer-Ce8bEGlK.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B7wwNxoP.js → Organization-BC7lveGv.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CfAGr0gM.js → Overflow-CakOW-G0.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-KhMg22Fz.js → P2P-Cf8CaOBZ.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-NdAXI9ft.js → PdhVaultBrowser-Dc7b98W9.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CIYjqyT7.js → Permissions-DGJyMEfS.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-D2ht3P_R.js → PersonalDataHub-DNIwSdwu.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-i6flZW1m.js → Pipeline-5B1S12wa.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DE0lhYVc.js → Privacy-CMB6Ke5t.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BL3YbyxS.js → ProjectInit-D5PqTFiT.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CEtdg7ni.js → ProjectSettings-CbKNdSjV.js} +2 -2
- package/src/assets/web-panel/assets/Projects-ccXaHzYL.js +1 -0
- package/src/assets/web-panel/assets/{Providers-DKt_Cg-j.js → Providers-CJF5_-Gs.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-DA61jNSx.js → QrScannerModal-CT6iEAdi.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-fS9ryUmq.js → QuickAsk-Ci0h9mJ_.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CR9dZU5Y.js → Recommend-Da5mobZu.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BV0BR2Dz.js → RemoteSession-BaCY8eey.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BIeGUvYD.js → Reputation-CaITfTsI.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DHDT1aro.js → Row-DtUDamyP.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Cq6YKb1h.js → RssFeed-DX27gFpg.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DEF6vsy6.js → Search-DFL69osN.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CHtYiKY9.js → Security-BqGeoWv-.js} +4 -4
- package/src/assets/web-panel/assets/{Services-u16lvBJN.js → Services-3z1WnEAc.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CGbizyDj.js → Skeleton-C_OJQQ9Z.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BZMQcAa7.js → Skills-BY7aT6Mo.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Bm-CycVi.js → Sla-BZv7DSaD.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-6lJKLhCn.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-B8q1C1eC.js → SyncSettings-B6D7STlI.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-SU1pBWc-.js → Tasks-Co_FCZAO.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CyOfJzmt.js → Templates-CnY-9fgz.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-xqWSm2GP.js → Tenant-B71yXfZ8.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D1Ttgjsi.js → Terminal-Dd_P7awo.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Da2lYs5D.js → TimelineRenderer-CvIEMyli.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-B34-SduO.js → Tokens-DknFBGOi.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C8zyYm4R.js → Trigger-D_4nJONB.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D1Pvqems.js → Trust-BNl21fa7.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Do3VVnAy.js → UkeySign-CFrCI7uK.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Dz7egVIA.js → VideoEditing-BVfY6JLg.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Dcuw-OxR.js → Wallet-Cj9CAK0J.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-DPlw-QsB.js → WebAuthn-DcqZlzA3.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-h4OsnU5q.js → WorkflowEditor-Dfr_dMld.js} +1 -1
- package/src/assets/web-panel/assets/{chat-eO9wEwrW.js → chat-Yv6UF0AD.js} +1 -1
- package/src/assets/web-panel/assets/{colors-34lSmOXw.js → colors-CDW_-1fs.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CK4kEWJ4.js → compact-item-BYOQvd-6.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-E0A57xed.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-BD9ZMGAl.js → hasIn-DY-70cfQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_G_ElKO.js → index-366wfQBU.js} +1 -1
- package/src/assets/web-panel/assets/index-B0o4MeNK.js +1 -0
- package/src/assets/web-panel/assets/{index-B0rkHxKK.js → index-B9ZogJJM.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrsDA_md.js → index-B9m5QAMg.js} +1 -1
- package/src/assets/web-panel/assets/{index--N0u6kTG.js → index-BBs2mv5M.js} +1 -1
- package/src/assets/web-panel/assets/{index-DiT_REby.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-8qMA1DWQ.js → index-BXlEx4UH.js} +1 -1
- package/src/assets/web-panel/assets/{index-CsrKJJcX.js → index-BayRTE5w.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcbgVLOH.js → index-Bb9nyts1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZkFMeWL.js → index-Bf_Va0S-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cz3unNfL.js → index-Br3wQLVY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcE1BspQ.js → index-BvK4fjkk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeXNCyQJ.js → index-C40UdtlS.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrOalGut.js → index-C4UJA2ju.js} +1 -1
- package/src/assets/web-panel/assets/{index-MIg5Z8qe.js → index-CB_Iw73G.js} +1 -1
- package/src/assets/web-panel/assets/{index-DFLE2qO9.js → index-CCwWp3mT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrSAAuJj.js → index-CFa2fPCk.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4bB_x_v.js → index-CIyHxV4u.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmNbU2Z6.js → index-CUP-A2_h.js} +1 -1
- package/src/assets/web-panel/assets/{index-o8pYehRq.js → index-CUo27q9J.js} +3 -3
- package/src/assets/web-panel/assets/{index-BbX_Dted.js → index-CaT8trvf.js} +1 -1
- package/src/assets/web-panel/assets/{index-Brqc9Emx.js → index-CnZNbcux.js} +1 -1
- package/src/assets/web-panel/assets/{index-Da5fmOHB.js → index-Cy2NE6AO.js} +1 -1
- package/src/assets/web-panel/assets/{index-yAGBu2E0.js → index-CzeEEazr.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsGmo6v1.js → index-D--TEyDj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvKcroix.js → index-DCtsjhhT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGRxt5wj.js → index-DLOf7BSz.js} +1 -1
- package/src/assets/web-panel/assets/{index-DONOUtlz.js → index-DM5c4pc-.js} +1 -1
- package/src/assets/web-panel/assets/{index-CT1_eRL-.js → index-DRFC2Qt0.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpfisY1g.js → index-DT_qVaaV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx3Jn1r0.js → index-DUDoRk9r.js} +1 -1
- package/src/assets/web-panel/assets/{index-DCn-ECvK.js → index-Dg-AQYDf.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bjs90Eh9.js → index-DuIPq5MX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CuSau5ya.js → index-NYVBUAVN.js} +1 -1
- package/src/assets/web-panel/assets/{index-DP-UZAQN.js → index-NaCESahy.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ch175NUw.js → index-RjIMPG0u.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzXjP44T.js → index-Y9akzgFO.js} +1 -1
- package/src/assets/web-panel/assets/{index-CZBaqe3d.js → index-hZ0Eyrrw.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DMTkAomF.js → initDefaultProps-CG99CcR4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Cnti1F5g.js → motion-Z7MH0_0G.js} +1 -1
- package/src/assets/web-panel/assets/{move-CGxmHUga.js → move-BX67lOdq.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CuwwLoq7.js → mtc-parser-CmAbG1fE.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BpdlTkPM.js → omit-DiU5tI1_.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-D7nWrThp.js → pickAttrs-BGfvLrYL.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Bhx0TV8F.js → placementArrow-CggLEgaJ.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CZ1KesZh.js → responsiveObserve-t3nlghPZ.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CnldF8J6.js → slide-BkV4dL9s.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CZfo_GOA.js → statusUtils-qec1PUoC.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-B2QCcAv5.js → styleChecker-ChjX6T8D.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DzzjIS4J.js → useFlexGapSupport-B1jLoZcM.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-B_atg9M0.js → useFs-C3X53s4E.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DhZs3QYN.js → usePersonalDataHub-DOvbbnkZ.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DcePTYAm.js → vnode-Ie0TEVFT.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BYmlnjRk.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 +10 -0
- package/src/commands/skill.js +3 -0
- package/src/data/changelog.json +26 -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 +20 -2
- package/src/lazy-dispatch.js +6 -0
- 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 +2 -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 +193 -21
- package/src/lib/evolution/evolution-deployment-loader.js +163 -2
- 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-stage-output-ledger-adapter.js +333 -0
- package/src/lib/evolution/evolution-release-train.js +54 -6
- 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 +134 -26
- 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 +48 -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-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.js +17 -94
- 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 +8 -6
- package/src/lib/evolution/statistical-progressive-canary.js +165 -3
- 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 +80 -16
- 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/skill-retrieval-router.js +22 -1
- package/src/repl/agent-repl.js +127 -33
- package/src/runtime/agent-core.js +163 -73
- 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 +50 -6
- package/src/runtime/runtime-factory.js +41 -2
- package/src/assets/web-panel/assets/Projects-CvtU5peJ.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-BudpA5kr.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +0 -1
- package/src/assets/web-panel/assets/index-C907rPwd.js +0 -1
- package/src/assets/web-panel/assets/index-wueRSK2d.js +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
|
|
3
3
|
export const WIKISKILL_BENCHMARK_PLAN_SCHEMA =
|
|
4
|
-
"chainlesschain.wikiskill-benchmark-plan/
|
|
4
|
+
"chainlesschain.wikiskill-benchmark-plan/v2";
|
|
5
5
|
export const WIKISKILL_BENCHMARK_REPORT_SCHEMA =
|
|
6
6
|
"chainlesschain.wikiskill-benchmark-report/v1";
|
|
7
7
|
export const WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA =
|
|
@@ -102,6 +102,7 @@ export function createWikiSkillBenchmarkPlan(input = {}) {
|
|
|
102
102
|
[
|
|
103
103
|
"gitCommit",
|
|
104
104
|
"runnerDigest",
|
|
105
|
+
"executionManifestDigest",
|
|
105
106
|
"model",
|
|
106
107
|
"inference",
|
|
107
108
|
"environment",
|
|
@@ -150,6 +151,10 @@ export function createWikiSkillBenchmarkPlan(input = {}) {
|
|
|
150
151
|
schema: WIKISKILL_BENCHMARK_PLAN_SCHEMA,
|
|
151
152
|
gitCommit,
|
|
152
153
|
runnerDigest: sha(input.runnerDigest, "runnerDigest"),
|
|
154
|
+
executionManifestDigest: sha(
|
|
155
|
+
input.executionManifestDigest,
|
|
156
|
+
"executionManifestDigest",
|
|
157
|
+
),
|
|
153
158
|
model: Object.freeze({
|
|
154
159
|
checkpoint: string(input.model.checkpoint, "model checkpoint"),
|
|
155
160
|
digest: sha(input.model.digest, "model digest"),
|
|
@@ -178,6 +183,57 @@ export function createWikiSkillBenchmarkPlan(input = {}) {
|
|
|
178
183
|
});
|
|
179
184
|
}
|
|
180
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
|
+
|
|
181
237
|
function normalizeArm(arm, name) {
|
|
182
238
|
exactKeys(
|
|
183
239
|
arm,
|
|
@@ -232,20 +288,12 @@ function mean(values) {
|
|
|
232
288
|
}
|
|
233
289
|
|
|
234
290
|
export function buildWikiSkillBenchmarkReport({ plan, runs } = {}) {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
const expectedPlanDigest = digest(
|
|
242
|
-
WIKISKILL_BENCHMARK_PLAN_SCHEMA,
|
|
243
|
-
Object.fromEntries(
|
|
244
|
-
Object.entries(plan).filter(([key]) => key !== "planDigest"),
|
|
245
|
-
),
|
|
246
|
-
);
|
|
247
|
-
if (expectedPlanDigest !== plan.planDigest)
|
|
248
|
-
throw new Error("benchmark plan digest mismatch");
|
|
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
|
+
}
|
|
249
297
|
if (!Array.isArray(runs) || runs.length !== plan.seedSchedule.length)
|
|
250
298
|
throw new TypeError("runs must exactly cover the seed schedule");
|
|
251
299
|
const expectedCases = new Map(
|
|
@@ -383,7 +431,23 @@ export function buildWikiSkillBenchmarkReport({ plan, runs } = {}) {
|
|
|
383
431
|
});
|
|
384
432
|
}
|
|
385
433
|
|
|
386
|
-
export
|
|
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
|
+
} = {}) {
|
|
387
451
|
if (
|
|
388
452
|
!plan ||
|
|
389
453
|
plan.schema !== WIKISKILL_BENCHMARK_PLAN_SCHEMA ||
|
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 {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { isAbortError } from "./abort-utils.js";
|
|
2
|
+
|
|
3
|
+
// Admission failures are not provider outages, even when their causes contain
|
|
4
|
+
// HTTP status codes or retryable/authentication words.
|
|
5
|
+
export function isTerminalModelFailure(error) {
|
|
6
|
+
const visited = new Set();
|
|
7
|
+
for (let current = error; current; current = current.cause) {
|
|
8
|
+
if (visited.has(current) || visited.size >= 32) return true;
|
|
9
|
+
visited.add(current);
|
|
10
|
+
if (
|
|
11
|
+
current.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED" ||
|
|
12
|
+
current.runtimeLedgerPersistence === true ||
|
|
13
|
+
current.workflowEffectOutcomeUnknown === true ||
|
|
14
|
+
/^(?:CC|ERR)_SESSION_BUDGET_/u.test(current.code || "") ||
|
|
15
|
+
isAbortError(current)
|
|
16
|
+
) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
@@ -3992,6 +3992,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
3992
3992
|
"post_spawn_failed",
|
|
3993
3993
|
`Post-spawn sandbox setup failed: ${error.message}`,
|
|
3994
3994
|
);
|
|
3995
|
+
failure.cause = error;
|
|
3995
3996
|
failure.processTerminationRequested = true;
|
|
3996
3997
|
throw failure;
|
|
3997
3998
|
}
|
|
Binary file
|
|
Binary file
|
|
@@ -3172,6 +3172,37 @@ namespace ChainlessChain.WindowsSandbox
|
|
|
3172
3172
|
return 0;
|
|
3173
3173
|
}
|
|
3174
3174
|
|
|
3175
|
+
public static void PublishTargetIdentity(string identityPath, string identity)
|
|
3176
|
+
{
|
|
3177
|
+
// Never expose a newly created empty identity file to the broker.
|
|
3178
|
+
// Its full metadata/content check remains strict: publish only after
|
|
3179
|
+
// the writer has flushed and closed, using a same-directory move
|
|
3180
|
+
// that refuses to overwrite an existing identity (including errors
|
|
3181
|
+
// reported after a successful launch).
|
|
3182
|
+
string pendingPath = identityPath + ".pending-" + Guid.NewGuid().ToString("N");
|
|
3183
|
+
bool ownsPending = false;
|
|
3184
|
+
try
|
|
3185
|
+
{
|
|
3186
|
+
byte[] bytes = new UTF8Encoding(false).GetBytes(identity);
|
|
3187
|
+
using (FileStream stream = new FileStream(
|
|
3188
|
+
pendingPath,
|
|
3189
|
+
FileMode.CreateNew,
|
|
3190
|
+
FileAccess.Write,
|
|
3191
|
+
FileShare.None))
|
|
3192
|
+
{
|
|
3193
|
+
ownsPending = true;
|
|
3194
|
+
stream.Write(bytes, 0, bytes.Length);
|
|
3195
|
+
stream.Flush(true);
|
|
3196
|
+
}
|
|
3197
|
+
File.Move(pendingPath, identityPath);
|
|
3198
|
+
ownsPending = false;
|
|
3199
|
+
}
|
|
3200
|
+
finally
|
|
3201
|
+
{
|
|
3202
|
+
if (ownsPending) File.Delete(pendingPath);
|
|
3203
|
+
}
|
|
3204
|
+
}
|
|
3205
|
+
|
|
3175
3206
|
public static int Run(
|
|
3176
3207
|
string application,
|
|
3177
3208
|
string[] arguments,
|
|
@@ -3632,17 +3663,7 @@ namespace ChainlessChain.WindowsSandbox
|
|
|
3632
3663
|
attestedAppContainerSid,
|
|
3633
3664
|
"capabilityCount",
|
|
3634
3665
|
useAppContainer ? 0 : -1);
|
|
3635
|
-
|
|
3636
|
-
identityPath,
|
|
3637
|
-
FileMode.CreateNew,
|
|
3638
|
-
FileAccess.Write,
|
|
3639
|
-
FileShare.Read))
|
|
3640
|
-
using (StreamWriter writer = new StreamWriter(
|
|
3641
|
-
stream,
|
|
3642
|
-
new UTF8Encoding(false)))
|
|
3643
|
-
{
|
|
3644
|
-
writer.Write(identity);
|
|
3645
|
-
}
|
|
3666
|
+
PublishTargetIdentity(identityPath, identity);
|
|
3646
3667
|
}
|
|
3647
3668
|
|
|
3648
3669
|
UInt32 targetWait = WaitForSingleObject(
|
|
@@ -4153,10 +4174,7 @@ namespace ChainlessChain.WindowsSandbox
|
|
|
4153
4174
|
System.Diagnostics.Process
|
|
4154
4175
|
.GetCurrentProcess()
|
|
4155
4176
|
.Id);
|
|
4156
|
-
|
|
4157
|
-
spec.identityPath,
|
|
4158
|
-
failure,
|
|
4159
|
-
new UTF8Encoding(false));
|
|
4177
|
+
Native.PublishTargetIdentity(spec.identityPath, failure);
|
|
4160
4178
|
}
|
|
4161
4179
|
catch
|
|
4162
4180
|
{
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/** Build a bounded read result with a cursor describing what was actually read. */
|
|
2
|
+
export function buildReadFilePage(
|
|
3
|
+
rendered,
|
|
4
|
+
args,
|
|
5
|
+
{ filePath, fileVersion, maxChars },
|
|
6
|
+
) {
|
|
7
|
+
const positive = (value) => {
|
|
8
|
+
const n = typeof value === "number" ? value : parseInt(value, 10);
|
|
9
|
+
return Number.isSafeInteger(n) && n > 0 ? n : null;
|
|
10
|
+
};
|
|
11
|
+
const offset = positive(args.offset);
|
|
12
|
+
const limit = positive(args.limit);
|
|
13
|
+
const column = positive(args.column) || 1;
|
|
14
|
+
const lines = rendered.split("\n");
|
|
15
|
+
const start = offset ? offset - 1 : 0;
|
|
16
|
+
const end = Math.min(limit ? start + limit : lines.length, lines.length);
|
|
17
|
+
const selected = lines.slice(start, end);
|
|
18
|
+
const skipped = Math.min(column - 1, selected[0]?.length || 0);
|
|
19
|
+
if (selected.length) selected[0] = selected[0].slice(skipped);
|
|
20
|
+
const requested = selected.join("\n");
|
|
21
|
+
|
|
22
|
+
// Budget the JSON-escaped content, not raw characters: newlines, quotes and
|
|
23
|
+
// backslashes otherwise cause a SECOND truncation that loses the cursor.
|
|
24
|
+
const contentBudget = Math.max(0, maxChars - 1024);
|
|
25
|
+
let count = requested.length;
|
|
26
|
+
if (JSON.stringify(requested).length > contentBudget) {
|
|
27
|
+
let lo = 0;
|
|
28
|
+
let hi = count;
|
|
29
|
+
while (lo < hi) {
|
|
30
|
+
const mid = Math.ceil((lo + hi) / 2);
|
|
31
|
+
if (JSON.stringify(requested.slice(0, mid)).length <= contentBudget)
|
|
32
|
+
lo = mid;
|
|
33
|
+
else hi = mid - 1;
|
|
34
|
+
}
|
|
35
|
+
count = lo;
|
|
36
|
+
// Prefer whole lines. A single oversized line uses a column cursor so it
|
|
37
|
+
// can still be read to completion instead of repeating its first 50k.
|
|
38
|
+
const newline = requested.lastIndexOf("\n", count - 1);
|
|
39
|
+
if (newline >= 0) count = newline + 1;
|
|
40
|
+
else if (count > 0 && /[\uD800-\uDBFF]/.test(requested[count - 1])) count--;
|
|
41
|
+
}
|
|
42
|
+
if (requested.length && count === 0) {
|
|
43
|
+
return { error: "Tool output limit is too small to return a file page." };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const content = requested.slice(0, count);
|
|
47
|
+
const truncated = count < requested.length;
|
|
48
|
+
const newlines = (content.match(/\n/g) || []).length;
|
|
49
|
+
const endsAtLine = content.endsWith("\n");
|
|
50
|
+
const endLine = content.length
|
|
51
|
+
? start + newlines + (endsAtLine ? 0 : 1)
|
|
52
|
+
: Math.min(start + 1, lines.length);
|
|
53
|
+
const nextOffset = truncated ? start + newlines + 1 : end + 1;
|
|
54
|
+
const nextColumn = truncated && !endsAtLine ? skipped + count + 1 : 1;
|
|
55
|
+
const hasMore = truncated || end < lines.length;
|
|
56
|
+
return {
|
|
57
|
+
path: filePath,
|
|
58
|
+
...(fileVersion ? { fileVersion } : {}),
|
|
59
|
+
...(offset || limit || column > 1 || truncated
|
|
60
|
+
? {
|
|
61
|
+
range: {
|
|
62
|
+
startLine: Math.min(start + 1, lines.length),
|
|
63
|
+
endLine: truncated ? endLine : end,
|
|
64
|
+
totalLines: lines.length,
|
|
65
|
+
},
|
|
66
|
+
}
|
|
67
|
+
: {}),
|
|
68
|
+
...(hasMore
|
|
69
|
+
? {
|
|
70
|
+
nextRead: {
|
|
71
|
+
path: args.path,
|
|
72
|
+
offset: nextOffset,
|
|
73
|
+
limit: limit || 2000,
|
|
74
|
+
...(nextColumn > 1 ? { column: nextColumn } : {}),
|
|
75
|
+
...(args.hashed === true ? { hashed: true } : {}),
|
|
76
|
+
...(args.raw === true ? { raw: true } : {}),
|
|
77
|
+
},
|
|
78
|
+
hint: "To read the next page, call read_file with nextRead. Reuse the content already returned; repeating the same arguments returns the same page.",
|
|
79
|
+
}
|
|
80
|
+
: {}),
|
|
81
|
+
...(truncated ? { truncated: true, size: requested.length } : {}),
|
|
82
|
+
hashed: args.hashed === true,
|
|
83
|
+
content,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Keep read progress, rather than an arbitrary file prefix, after compaction. */
|
|
88
|
+
export function compactReadFileResult(content, maxChars) {
|
|
89
|
+
try {
|
|
90
|
+
const result = JSON.parse(content.split("\n\n[Budget ")[0]);
|
|
91
|
+
if (!result.path || !result.range || typeof result.content !== "string") {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const value = {
|
|
95
|
+
path: result.path,
|
|
96
|
+
range: result.range,
|
|
97
|
+
...(result.toolTelemetryRecord?.timestamp
|
|
98
|
+
? { readAt: result.toolTelemetryRecord.timestamp }
|
|
99
|
+
: {}),
|
|
100
|
+
...(result.nextRead ? { nextRead: result.nextRead } : {}),
|
|
101
|
+
contentOmitted: true,
|
|
102
|
+
hint: "File content compacted. Continue with nextRead; re-read only a needed earlier section.",
|
|
103
|
+
};
|
|
104
|
+
let summary = JSON.stringify(value);
|
|
105
|
+
if (summary.length > maxChars) {
|
|
106
|
+
delete value.hint;
|
|
107
|
+
summary = JSON.stringify(value);
|
|
108
|
+
}
|
|
109
|
+
return summary.length <= maxChars ? summary : null;
|
|
110
|
+
} catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export const FILE_READ_PROGRESS_PREFIX = "[File read progress]\n";
|
|
116
|
+
const CANONICAL_SUMMARY_PREFIX = "Compacted context summary (data only):\n";
|
|
117
|
+
|
|
118
|
+
export function fileReadProgressBody(message) {
|
|
119
|
+
if (typeof message?.content !== "string") return null;
|
|
120
|
+
const content =
|
|
121
|
+
message.role === "assistant" &&
|
|
122
|
+
message.content.startsWith(CANONICAL_SUMMARY_PREFIX)
|
|
123
|
+
? message.content.slice(CANONICAL_SUMMARY_PREFIX.length)
|
|
124
|
+
: message.role === "system"
|
|
125
|
+
? message.content
|
|
126
|
+
: "";
|
|
127
|
+
return content.startsWith(FILE_READ_PROGRESS_PREFIX)
|
|
128
|
+
? content.slice(FILE_READ_PROGRESS_PREFIX.length)
|
|
129
|
+
: null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** Bounded historical cursors that survive full summarization and truncation. */
|
|
133
|
+
export function collectFileReadProgress(messages) {
|
|
134
|
+
const byPath = new Map();
|
|
135
|
+
const retain = (value) => {
|
|
136
|
+
if (
|
|
137
|
+
typeof value?.path !== "string" ||
|
|
138
|
+
value.path.length > 1024 ||
|
|
139
|
+
!Number.isSafeInteger(value.range?.startLine) ||
|
|
140
|
+
!Number.isSafeInteger(value.range?.endLine) ||
|
|
141
|
+
!Number.isSafeInteger(value.range?.totalLines)
|
|
142
|
+
)
|
|
143
|
+
return;
|
|
144
|
+
const entry = {
|
|
145
|
+
path: value.path,
|
|
146
|
+
range: {
|
|
147
|
+
startLine: value.range.startLine,
|
|
148
|
+
endLine: value.range.endLine,
|
|
149
|
+
totalLines: value.range.totalLines,
|
|
150
|
+
},
|
|
151
|
+
...(value.nextRead ? { nextRead: value.nextRead } : {}),
|
|
152
|
+
readAt: Number.isFinite(
|
|
153
|
+
value.readAt ?? value.toolTelemetryRecord?.timestamp,
|
|
154
|
+
)
|
|
155
|
+
? (value.readAt ?? value.toolTelemetryRecord.timestamp)
|
|
156
|
+
: 0,
|
|
157
|
+
};
|
|
158
|
+
if (JSON.stringify(entry).length > 1400) return;
|
|
159
|
+
// Kernel summaries are placed at the first dropped parent's position.
|
|
160
|
+
// Older retained tool messages can therefore appear AFTER a newer cursor.
|
|
161
|
+
if ((byPath.get(value.path)?.readAt || 0) > entry.readAt) return;
|
|
162
|
+
byPath.delete(value.path);
|
|
163
|
+
byPath.set(value.path, entry);
|
|
164
|
+
if (byPath.size > 12) byPath.delete(byPath.keys().next().value);
|
|
165
|
+
};
|
|
166
|
+
for (const message of messages) {
|
|
167
|
+
if (typeof message?.content !== "string") continue;
|
|
168
|
+
try {
|
|
169
|
+
if (message.role === "tool") {
|
|
170
|
+
const value = JSON.parse(message.content.split("\n\n[Budget ")[0]);
|
|
171
|
+
if (
|
|
172
|
+
typeof value.content === "string" ||
|
|
173
|
+
value.contentOmitted ||
|
|
174
|
+
value.alreadyRead
|
|
175
|
+
)
|
|
176
|
+
retain(value);
|
|
177
|
+
} else if (fileReadProgressBody(message) !== null) {
|
|
178
|
+
const entries = JSON.parse(
|
|
179
|
+
fileReadProgressBody(message).split("\n")[0],
|
|
180
|
+
);
|
|
181
|
+
if (Array.isArray(entries)) entries.slice(-12).forEach(retain);
|
|
182
|
+
}
|
|
183
|
+
} catch {
|
|
184
|
+
/* non-file tool output */
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const entries = [...byPath.values()];
|
|
188
|
+
while (entries.length && JSON.stringify(entries).length > 6000)
|
|
189
|
+
entries.shift();
|
|
190
|
+
return entries;
|
|
191
|
+
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { BUILT_IN_PROVIDERS } from "./llm-providers.js";
|
|
17
17
|
import { selectModelForTask, TaskType } from "./task-model-selector.js";
|
|
18
|
+
import { isTerminalModelFailure } from "./model-failure-policy.js";
|
|
18
19
|
|
|
19
20
|
function nonEmpty(v) {
|
|
20
21
|
return typeof v === "string" && v.trim().length > 0;
|
|
@@ -22,7 +23,7 @@ function nonEmpty(v) {
|
|
|
22
23
|
|
|
23
24
|
/** Is this an authentication/authorization failure (missing/invalid/expired key)? */
|
|
24
25
|
export function isAuthError(err) {
|
|
25
|
-
if (!err) return false;
|
|
26
|
+
if (!err || isTerminalModelFailure(err)) return false;
|
|
26
27
|
const status =
|
|
27
28
|
typeof err.status === "number"
|
|
28
29
|
? err.status
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BM25Search } from "./bm25-search.js";
|
|
2
|
+
import { captureSkillRetrievalRevocationReader } from "./evolution/skill-retrieval-revocation-authority.js";
|
|
2
3
|
|
|
3
4
|
export const SKILL_RETRIEVAL_RESULT_SCHEMA =
|
|
4
5
|
"chainlesschain.skill-retrieval-result/v1";
|
|
@@ -82,6 +83,7 @@ export function routeSkillDescriptors({
|
|
|
82
83
|
target = null,
|
|
83
84
|
vectorScores = null,
|
|
84
85
|
outcomeMetrics = null,
|
|
86
|
+
revocationReader = null,
|
|
85
87
|
topK = 5,
|
|
86
88
|
ambiguityMargin = 0.02,
|
|
87
89
|
} = {}) {
|
|
@@ -104,6 +106,10 @@ export function routeSkillDescriptors({
|
|
|
104
106
|
const requiredTags = new Set(
|
|
105
107
|
tags.map((value) => String(value).toLowerCase()),
|
|
106
108
|
);
|
|
109
|
+
const revocations =
|
|
110
|
+
revocationReader === null
|
|
111
|
+
? null
|
|
112
|
+
: captureSkillRetrievalRevocationReader(revocationReader);
|
|
107
113
|
const rejected = [];
|
|
108
114
|
const admitted = [];
|
|
109
115
|
for (const skill of skills) {
|
|
@@ -116,6 +122,11 @@ export function routeSkillDescriptors({
|
|
|
116
122
|
const mismatch = compatible(skill, target);
|
|
117
123
|
const reasons = [];
|
|
118
124
|
if (!digest) reasons.push("missing-content-digest");
|
|
125
|
+
const revocation =
|
|
126
|
+
digest === null
|
|
127
|
+
? null
|
|
128
|
+
: revocations?.inspect({ skillName: skill.id, contentDigest: digest });
|
|
129
|
+
if (revocation?.invalidated) reasons.push("revoked-by-evolution");
|
|
119
130
|
if (namespace !== null && skill.source !== namespace)
|
|
120
131
|
reasons.push("namespace-mismatch");
|
|
121
132
|
if ([...requiredTags].some((value) => !skillTags.has(value)))
|
|
@@ -123,7 +134,17 @@ export function routeSkillDescriptors({
|
|
|
123
134
|
if (!containsPath(skill, targetPath)) reasons.push("path-mismatch");
|
|
124
135
|
reasons.push(...mismatch.reasons);
|
|
125
136
|
if (reasons.length > 0) {
|
|
126
|
-
rejected.push({
|
|
137
|
+
rejected.push({
|
|
138
|
+
id: skill.id,
|
|
139
|
+
digest,
|
|
140
|
+
reasons,
|
|
141
|
+
...(revocation?.invalidated
|
|
142
|
+
? {
|
|
143
|
+
revocationStateDigest: revocation.stateDigest,
|
|
144
|
+
revocationReceiptDigest: revocation.receiptDigest,
|
|
145
|
+
}
|
|
146
|
+
: {}),
|
|
147
|
+
});
|
|
127
148
|
continue;
|
|
128
149
|
}
|
|
129
150
|
admitted.push({ skill, digest });
|