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,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
|
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A lease is cooperative authority for production hosts, not a same-UID
|
|
5
5
|
* sandbox. Every process sharing CHAINLESSCHAIN_HOME observes the same strict
|
|
6
|
-
* state file. A monotonically increasing fencing token prevents
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* state file. A monotonically increasing fencing token prevents a crashed host
|
|
7
|
+
* from publishing through guarded session-store write paths after a successor
|
|
8
|
+
* takes over. A separate monotonic revocation epoch lets an operator fence a
|
|
9
|
+
* still-live host; every guarded transition re-reads it. An exact local owner
|
|
10
|
+
* may renew after its TTL when the event loop was blocked: no successor can
|
|
11
|
+
* have been admitted while that owner PID remained live, and any revocation or
|
|
12
|
+
* takeover still changes the durable authority tuple and fences the old host.
|
|
10
13
|
*/
|
|
11
14
|
|
|
12
15
|
import fs from "node:fs";
|
|
@@ -440,9 +443,9 @@ export class SessionHostLeaseAuthority {
|
|
|
440
443
|
const incumbent = snapshot.active;
|
|
441
444
|
// Never take authority from a process that the OS still reports as
|
|
442
445
|
// alive, even after its heartbeat TTL. It may be blocked inside an
|
|
443
|
-
// external side effect and resume later.
|
|
444
|
-
//
|
|
445
|
-
//
|
|
446
|
+
// external side effect and resume later. The exact local owner may
|
|
447
|
+
// renew late; takeover additionally requires proven process death so
|
|
448
|
+
// two executors cannot overlap.
|
|
446
449
|
if (incumbent && this._isProcessAlive(incumbent.ownerPid)) {
|
|
447
450
|
throw leaseError(
|
|
448
451
|
SESSION_HOST_LEASE_HELD_CODE,
|
|
@@ -522,13 +525,6 @@ export class SessionHostLeaseAuthority {
|
|
|
522
525
|
);
|
|
523
526
|
}
|
|
524
527
|
const now = Math.trunc(this._now());
|
|
525
|
-
if (snapshot.active.expiresAtMs <= now) {
|
|
526
|
-
throw leaseError(
|
|
527
|
-
SESSION_HOST_LEASE_FENCED_CODE,
|
|
528
|
-
`Session host lease expired for ${id}`,
|
|
529
|
-
{ sessionId: id, fencingToken: record.active.fencingToken },
|
|
530
|
-
);
|
|
531
|
-
}
|
|
532
528
|
const next = {
|
|
533
529
|
...snapshot.active,
|
|
534
530
|
renewedAtMs: now,
|
|
@@ -898,8 +894,7 @@ export class SessionHostLeaseAuthority {
|
|
|
898
894
|
record &&
|
|
899
895
|
(record.released ||
|
|
900
896
|
record.active.revocationEpoch !== snapshot.revocationEpoch ||
|
|
901
|
-
!sameLease(snapshot.active, record.active)
|
|
902
|
-
snapshot.active.expiresAtMs <= now)
|
|
897
|
+
!sameLease(snapshot.active, record.active))
|
|
903
898
|
) {
|
|
904
899
|
const error = leaseError(
|
|
905
900
|
SESSION_HOST_LEASE_FENCED_CODE,
|
|
@@ -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 });
|