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
|
@@ -981,17 +981,19 @@ export const SKILL_WRITER_INVENTORY = Object.freeze({
|
|
|
981
981
|
},
|
|
982
982
|
}),
|
|
983
983
|
scopeExclusion({
|
|
984
|
-
id: "desktop-marketplace-
|
|
984
|
+
id: "desktop-marketplace-governed-host-delegation",
|
|
985
985
|
surface: "desktop",
|
|
986
|
-
reasonCode:
|
|
986
|
+
reasonCode:
|
|
987
|
+
"branded-governed-host-delegation-without-direct-skill-byte-write",
|
|
987
988
|
evidence: {
|
|
988
989
|
file: "desktop-app-vue/src/main/marketplace/skill-marketplace-client.js",
|
|
989
990
|
symbol: "SkillMarketplaceClient.installSkill/uninstallSkill",
|
|
990
991
|
evidence: [
|
|
991
|
-
"
|
|
992
|
-
"
|
|
993
|
-
"
|
|
994
|
-
|
|
992
|
+
"!isDesktopGovernedSkillMarketplaceHost(governedHost)",
|
|
993
|
+
"async installSkill(skillId, options = {})",
|
|
994
|
+
"const result = await host.install({",
|
|
995
|
+
"async uninstallSkill(skillId, options = {})",
|
|
996
|
+
"const state = await host.revoke({ skillName: skillId, ...options });",
|
|
995
997
|
],
|
|
996
998
|
},
|
|
997
999
|
}),
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
|
|
3
3
|
export const PROGRESSIVE_CANARY_PLAN_SCHEMA =
|
|
4
|
-
"chainlesschain.progressive-canary-plan/
|
|
4
|
+
"chainlesschain.progressive-canary-plan/v2";
|
|
5
5
|
export const PROGRESSIVE_CANARY_ASSIGNMENT_SCHEMA =
|
|
6
|
-
"chainlesschain.progressive-canary-assignment/
|
|
6
|
+
"chainlesschain.progressive-canary-assignment/v2";
|
|
7
7
|
export const PROGRESSIVE_CANARY_GATE_REPORT_SCHEMA =
|
|
8
|
-
"chainlesschain.progressive-canary-gate-report/
|
|
8
|
+
"chainlesschain.progressive-canary-gate-report/v2";
|
|
9
|
+
export const PROGRESSIVE_CANARY_GATE_RECEIPT_SCHEMA =
|
|
10
|
+
"chainlesschain.progressive-canary-gate-receipt/v1";
|
|
9
11
|
|
|
10
12
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
11
13
|
const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
|
|
12
14
|
const RISK_TIERS = new Set(["low", "medium", "high"]);
|
|
13
15
|
const AUTHORITIES = new WeakSet();
|
|
16
|
+
const GATE_AUTHORITIES = new WeakSet();
|
|
14
17
|
|
|
15
18
|
function canonical(value) {
|
|
16
19
|
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
@@ -70,6 +73,10 @@ function verifyPlan(plan) {
|
|
|
70
73
|
return plan;
|
|
71
74
|
}
|
|
72
75
|
|
|
76
|
+
export function verifyProgressiveCanaryPlan(plan) {
|
|
77
|
+
return verifyPlan(plan);
|
|
78
|
+
}
|
|
79
|
+
|
|
73
80
|
function normalizeSteps(steps) {
|
|
74
81
|
if (!Array.isArray(steps) || steps.length < 3 || steps.length > 16)
|
|
75
82
|
throw new TypeError("progressive Canary plan requires 3..16 steps");
|
|
@@ -160,6 +167,7 @@ export function createProgressiveCanaryPlan(input = {}) {
|
|
|
160
167
|
"riskTier",
|
|
161
168
|
"assignmentSaltDigest",
|
|
162
169
|
"assignmentAuthority",
|
|
170
|
+
"gateAuthority",
|
|
163
171
|
"steps",
|
|
164
172
|
"thresholds",
|
|
165
173
|
],
|
|
@@ -172,6 +180,11 @@ export function createProgressiveCanaryPlan(input = {}) {
|
|
|
172
180
|
["id", "revision", "handlerDigest"],
|
|
173
181
|
"assignmentAuthority",
|
|
174
182
|
);
|
|
183
|
+
exact(
|
|
184
|
+
input.gateAuthority,
|
|
185
|
+
["id", "revision", "handlerDigest"],
|
|
186
|
+
"gateAuthority",
|
|
187
|
+
);
|
|
175
188
|
exact(
|
|
176
189
|
input.thresholds,
|
|
177
190
|
[
|
|
@@ -211,6 +224,20 @@ export function createProgressiveCanaryPlan(input = {}) {
|
|
|
211
224
|
"assignmentAuthority.handlerDigest",
|
|
212
225
|
),
|
|
213
226
|
}),
|
|
227
|
+
gateAuthority: Object.freeze({
|
|
228
|
+
id: id(input.gateAuthority.id, "gateAuthority.id"),
|
|
229
|
+
revision: integer(
|
|
230
|
+
input.gateAuthority.revision,
|
|
231
|
+
"gateAuthority.revision",
|
|
232
|
+
{
|
|
233
|
+
min: 1,
|
|
234
|
+
},
|
|
235
|
+
),
|
|
236
|
+
handlerDigest: sha(
|
|
237
|
+
input.gateAuthority.handlerDigest,
|
|
238
|
+
"gateAuthority.handlerDigest",
|
|
239
|
+
),
|
|
240
|
+
}),
|
|
214
241
|
steps: normalizeSteps(input.steps),
|
|
215
242
|
thresholds: Object.freeze({
|
|
216
243
|
confidence: finite(input.thresholds.confidence, "confidence", {
|
|
@@ -337,6 +364,9 @@ export function createProgressiveCanaryAssignmentAuthority({
|
|
|
337
364
|
}
|
|
338
365
|
|
|
339
366
|
const authority = Object.freeze({
|
|
367
|
+
planDigest: plan.planDigest,
|
|
368
|
+
tenantId: plan.tenantId,
|
|
369
|
+
pilotId: plan.pilotId,
|
|
340
370
|
async assign({ stepId, subjectDigest: subjectDigestInput } = {}) {
|
|
341
371
|
const step = plan.steps.find(({ id: value }) => value === stepId);
|
|
342
372
|
if (!step) throw new TypeError("Canary assignment step is invalid");
|
|
@@ -423,6 +453,138 @@ function verifyGateReport(report, plan) {
|
|
|
423
453
|
return report;
|
|
424
454
|
}
|
|
425
455
|
|
|
456
|
+
export function createProgressiveCanaryGateAuthority({
|
|
457
|
+
plan: planInput,
|
|
458
|
+
assignmentAuthority,
|
|
459
|
+
attestor,
|
|
460
|
+
verifier,
|
|
461
|
+
now = Date.now,
|
|
462
|
+
} = {}) {
|
|
463
|
+
const plan = verifyPlan(planInput);
|
|
464
|
+
if (!AUTHORITIES.has(assignmentAuthority))
|
|
465
|
+
throw new TypeError("a branded Canary assignment authority is required");
|
|
466
|
+
if (
|
|
467
|
+
assignmentAuthority.planDigest !== plan.planDigest ||
|
|
468
|
+
assignmentAuthority.tenantId !== plan.tenantId ||
|
|
469
|
+
assignmentAuthority.pilotId !== plan.pilotId
|
|
470
|
+
)
|
|
471
|
+
throw new TypeError("Canary assignment authority belongs to another plan");
|
|
472
|
+
if (typeof attestor !== "function" || typeof verifier !== "function")
|
|
473
|
+
throw new TypeError("Canary gate attestor and verifier are required");
|
|
474
|
+
if (typeof now !== "function")
|
|
475
|
+
throw new TypeError("Canary gate authority clock is required");
|
|
476
|
+
|
|
477
|
+
async function verifyReceipt(receipt, { stepId } = {}) {
|
|
478
|
+
exact(
|
|
479
|
+
receipt,
|
|
480
|
+
[
|
|
481
|
+
"schema",
|
|
482
|
+
"planDigest",
|
|
483
|
+
"tenantId",
|
|
484
|
+
"pilotId",
|
|
485
|
+
"stepId",
|
|
486
|
+
"report",
|
|
487
|
+
"reportDigest",
|
|
488
|
+
"authorityId",
|
|
489
|
+
"authorityRevision",
|
|
490
|
+
"handlerDigest",
|
|
491
|
+
"issuedAt",
|
|
492
|
+
"expiresAt",
|
|
493
|
+
"signature",
|
|
494
|
+
"receiptDigest",
|
|
495
|
+
],
|
|
496
|
+
"Canary gate receipt",
|
|
497
|
+
);
|
|
498
|
+
const report = verifyGateReport(receipt.report, plan);
|
|
499
|
+
if (
|
|
500
|
+
receipt.schema !== PROGRESSIVE_CANARY_GATE_RECEIPT_SCHEMA ||
|
|
501
|
+
receipt.planDigest !== plan.planDigest ||
|
|
502
|
+
receipt.tenantId !== plan.tenantId ||
|
|
503
|
+
receipt.pilotId !== plan.pilotId ||
|
|
504
|
+
receipt.stepId !== stepId ||
|
|
505
|
+
report.stepId !== stepId ||
|
|
506
|
+
receipt.reportDigest !== report.reportDigest ||
|
|
507
|
+
receipt.authorityId !== plan.gateAuthority.id ||
|
|
508
|
+
receipt.authorityRevision !== plan.gateAuthority.revision ||
|
|
509
|
+
receipt.handlerDigest !== plan.gateAuthority.handlerDigest ||
|
|
510
|
+
typeof receipt.issuedAt !== "string" ||
|
|
511
|
+
typeof receipt.expiresAt !== "string" ||
|
|
512
|
+
!Number.isFinite(Date.parse(receipt.issuedAt)) ||
|
|
513
|
+
!Number.isFinite(Date.parse(receipt.expiresAt)) ||
|
|
514
|
+
Date.parse(receipt.issuedAt) > Number(now()) ||
|
|
515
|
+
Date.parse(receipt.expiresAt) < Number(now()) ||
|
|
516
|
+
typeof receipt.signature !== "string" ||
|
|
517
|
+
receipt.signature.length < 32 ||
|
|
518
|
+
!DIGEST.test(receipt.receiptDigest ?? "")
|
|
519
|
+
)
|
|
520
|
+
throw new Error("Canary gate receipt binding is invalid or expired");
|
|
521
|
+
const core = structuredClone(receipt);
|
|
522
|
+
delete core.receiptDigest;
|
|
523
|
+
if (
|
|
524
|
+
hash(PROGRESSIVE_CANARY_GATE_RECEIPT_SCHEMA, core) !==
|
|
525
|
+
receipt.receiptDigest
|
|
526
|
+
)
|
|
527
|
+
throw new Error("Canary gate receipt digest mismatch");
|
|
528
|
+
const payload = structuredClone(core);
|
|
529
|
+
delete payload.signature;
|
|
530
|
+
if (!(await verifier({ payload, signature: receipt.signature })))
|
|
531
|
+
throw new Error("Canary gate receipt signature rejected");
|
|
532
|
+
return Object.freeze(structuredClone(receipt));
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
const authority = Object.freeze({
|
|
536
|
+
planDigest: plan.planDigest,
|
|
537
|
+
tenantId: plan.tenantId,
|
|
538
|
+
pilotId: plan.pilotId,
|
|
539
|
+
async evaluate(input = {}) {
|
|
540
|
+
const report = await evaluateProgressiveCanaryGate({
|
|
541
|
+
...input,
|
|
542
|
+
plan,
|
|
543
|
+
assignmentAuthority,
|
|
544
|
+
});
|
|
545
|
+
const payload = {
|
|
546
|
+
schema: PROGRESSIVE_CANARY_GATE_RECEIPT_SCHEMA,
|
|
547
|
+
planDigest: plan.planDigest,
|
|
548
|
+
tenantId: plan.tenantId,
|
|
549
|
+
pilotId: plan.pilotId,
|
|
550
|
+
stepId: report.stepId,
|
|
551
|
+
report,
|
|
552
|
+
reportDigest: report.reportDigest,
|
|
553
|
+
authorityId: plan.gateAuthority.id,
|
|
554
|
+
authorityRevision: plan.gateAuthority.revision,
|
|
555
|
+
handlerDigest: plan.gateAuthority.handlerDigest,
|
|
556
|
+
};
|
|
557
|
+
const attestation = await attestor(
|
|
558
|
+
Object.freeze(structuredClone(payload)),
|
|
559
|
+
);
|
|
560
|
+
exact(
|
|
561
|
+
attestation,
|
|
562
|
+
["issuedAt", "expiresAt", "signature"],
|
|
563
|
+
"gate attestation",
|
|
564
|
+
);
|
|
565
|
+
const core = { ...payload, ...attestation };
|
|
566
|
+
return verifyReceipt(
|
|
567
|
+
Object.freeze({
|
|
568
|
+
...core,
|
|
569
|
+
receiptDigest: hash(PROGRESSIVE_CANARY_GATE_RECEIPT_SCHEMA, core),
|
|
570
|
+
}),
|
|
571
|
+
{ stepId: report.stepId },
|
|
572
|
+
);
|
|
573
|
+
},
|
|
574
|
+
verify: verifyReceipt,
|
|
575
|
+
});
|
|
576
|
+
GATE_AUTHORITIES.add(authority);
|
|
577
|
+
return authority;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
export function isProgressiveCanaryGateAuthority(value) {
|
|
581
|
+
return GATE_AUTHORITIES.has(value);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
export function isProgressiveCanaryAssignmentAuthority(value) {
|
|
585
|
+
return AUTHORITIES.has(value);
|
|
586
|
+
}
|
|
587
|
+
|
|
426
588
|
export async function evaluateProgressiveCanaryGate({
|
|
427
589
|
plan: planInput,
|
|
428
590
|
stepId,
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import structuredMemory from "@chainlesschain/session-core/structured-evolution-memory";
|
|
2
|
+
import { types as utilTypes } from "node:util";
|
|
2
3
|
import { StructuredMemoryLedgerAdapter } from "./structured-memory-ledger-adapter.js";
|
|
3
4
|
import { StructuredMemoryAuthorityLedgerAdapter } from "./structured-memory-authority-ledger-adapter.js";
|
|
4
5
|
import { captureStructuredMemoryPromotionReceiptWriter } from "./structured-memory-promotion-receipt-writer.js";
|
|
5
6
|
import { captureStructuredMemoryPolicyReceiptWriter } from "./structured-memory-policy-receipt-writer.js";
|
|
6
7
|
import { createStructuredMemorySemanticReviewPipeline } from "./structured-memory-semantic-review-pipeline.js";
|
|
7
8
|
import { createSkillEvaluatedPromotionControlPlane } from "./skill-promotion-controller.js";
|
|
9
|
+
import { SKILL_REVOCATION_DEPENDENCY_RESULT_SCHEMA } from "./skill-revocation-propagation.js";
|
|
8
10
|
|
|
9
11
|
const { captureStructuredMemoryAuthority } = structuredMemory;
|
|
10
12
|
|
|
@@ -12,6 +14,51 @@ export const STRUCTURED_MEMORY_AGENT_CONTROL_PLANE_SCHEMA =
|
|
|
12
14
|
"chainlesschain.structured-memory-agent-control-plane/v1";
|
|
13
15
|
|
|
14
16
|
const CONTROL_PLANES = new WeakSet();
|
|
17
|
+
const REVOCATION_REQUEST_KEYS = new Set([
|
|
18
|
+
"schema",
|
|
19
|
+
"tenantId",
|
|
20
|
+
"streamId",
|
|
21
|
+
"operationId",
|
|
22
|
+
"transitionDigest",
|
|
23
|
+
"candidateId",
|
|
24
|
+
"skillName",
|
|
25
|
+
"occurredAt",
|
|
26
|
+
"sourceReceiptDigest",
|
|
27
|
+
"resolutionDigest",
|
|
28
|
+
"dependency",
|
|
29
|
+
"requestDigest",
|
|
30
|
+
]);
|
|
31
|
+
const REVOCATION_DEPENDENCY_KEYS = new Set([
|
|
32
|
+
"kind",
|
|
33
|
+
"ref",
|
|
34
|
+
"digest",
|
|
35
|
+
"disposition",
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
function exactDataRecord(value, keys, label) {
|
|
39
|
+
if (
|
|
40
|
+
!value ||
|
|
41
|
+
typeof value !== "object" ||
|
|
42
|
+
Array.isArray(value) ||
|
|
43
|
+
utilTypes.isProxy(value) ||
|
|
44
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(value))
|
|
45
|
+
) {
|
|
46
|
+
throw new TypeError(`${label} must be a plain record`);
|
|
47
|
+
}
|
|
48
|
+
const own = Reflect.ownKeys(value);
|
|
49
|
+
if (
|
|
50
|
+
own.length !== keys.size ||
|
|
51
|
+
own.some((key) => typeof key !== "string" || !keys.has(key))
|
|
52
|
+
) {
|
|
53
|
+
throw new TypeError(`${label} has an invalid shape`);
|
|
54
|
+
}
|
|
55
|
+
for (const key of own) {
|
|
56
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
57
|
+
if (!descriptor || !("value" in descriptor) || !descriptor.enumerable) {
|
|
58
|
+
throw new TypeError(`${label}.${String(key)} is not a data field`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
15
62
|
|
|
16
63
|
function sameStorage(left, right) {
|
|
17
64
|
return (
|
|
@@ -143,6 +190,78 @@ export function createStructuredMemoryAgentControlPlane({
|
|
|
143
190
|
projection: memory.projection(),
|
|
144
191
|
});
|
|
145
192
|
};
|
|
193
|
+
const quarantineMemory = async (input) => {
|
|
194
|
+
exactDataRecord(
|
|
195
|
+
input,
|
|
196
|
+
REVOCATION_REQUEST_KEYS,
|
|
197
|
+
"Memory revocation request",
|
|
198
|
+
);
|
|
199
|
+
exactDataRecord(
|
|
200
|
+
input.dependency,
|
|
201
|
+
REVOCATION_DEPENDENCY_KEYS,
|
|
202
|
+
"Memory revocation dependency",
|
|
203
|
+
);
|
|
204
|
+
const request = structuredClone(input);
|
|
205
|
+
const projection = memory.projection();
|
|
206
|
+
const active = projection.memories[request?.dependency?.ref];
|
|
207
|
+
const quarantined = projection.quarantines?.[request?.dependency?.ref];
|
|
208
|
+
const subject =
|
|
209
|
+
active ??
|
|
210
|
+
(quarantined
|
|
211
|
+
? {
|
|
212
|
+
...quarantined,
|
|
213
|
+
memoryId: request.dependency.ref,
|
|
214
|
+
status: "active",
|
|
215
|
+
}
|
|
216
|
+
: null);
|
|
217
|
+
if (!subject) {
|
|
218
|
+
throw new Error("procedural Memory dependency is missing");
|
|
219
|
+
}
|
|
220
|
+
const authorityReceipt = await promotion.retainRevocation(request, subject);
|
|
221
|
+
if (quarantined) {
|
|
222
|
+
if (
|
|
223
|
+
quarantined.metadata?.revocationPropagationRequestDigest !==
|
|
224
|
+
request.requestDigest ||
|
|
225
|
+
quarantined.receipts?.revocation !== authorityReceipt.receiptDigest
|
|
226
|
+
) {
|
|
227
|
+
throw new Error("quarantined Memory conflicts with the rollback");
|
|
228
|
+
}
|
|
229
|
+
} else {
|
|
230
|
+
await memory.append({
|
|
231
|
+
eventId: `revocation-${request.requestDigest.slice("sha256:".length)}`,
|
|
232
|
+
memoryId: subject.memoryId,
|
|
233
|
+
layer: "procedural",
|
|
234
|
+
action: "quarantine",
|
|
235
|
+
authority: promotionActor,
|
|
236
|
+
automatic: true,
|
|
237
|
+
contentDigest: subject.contentDigest,
|
|
238
|
+
artifactRef: subject.artifactRef,
|
|
239
|
+
evidenceRefs: authorityReceipt.evidenceRefs,
|
|
240
|
+
supersedes: [],
|
|
241
|
+
receiptRefs: { revocation: authorityReceipt.receiptDigest },
|
|
242
|
+
timestamp: request.occurredAt,
|
|
243
|
+
metadata: {
|
|
244
|
+
revocationPropagationRequestDigest: request.requestDigest,
|
|
245
|
+
transitionDigest: request.transitionDigest,
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
return Object.freeze({
|
|
250
|
+
schema: SKILL_REVOCATION_DEPENDENCY_RESULT_SCHEMA,
|
|
251
|
+
authenticated: true,
|
|
252
|
+
durable: true,
|
|
253
|
+
applied: true,
|
|
254
|
+
idempotent: true,
|
|
255
|
+
tenantId,
|
|
256
|
+
operationId: request.operationId,
|
|
257
|
+
requestDigest: request.requestDigest,
|
|
258
|
+
dependencyKind: request.dependency.kind,
|
|
259
|
+
dependencyRef: request.dependency.ref,
|
|
260
|
+
dependencyDigest: request.dependency.digest,
|
|
261
|
+
disposition: request.dependency.disposition,
|
|
262
|
+
receiptDigest: memory.projection().projectionDigest,
|
|
263
|
+
});
|
|
264
|
+
};
|
|
146
265
|
const controlPlane = Object.freeze({
|
|
147
266
|
schema: STRUCTURED_MEMORY_AGENT_CONTROL_PLANE_SCHEMA,
|
|
148
267
|
tenantId,
|
|
@@ -152,6 +271,7 @@ export function createStructuredMemoryAgentControlPlane({
|
|
|
152
271
|
promotionReceiptWriter: promotion,
|
|
153
272
|
policyReceiptWriter: policy,
|
|
154
273
|
reconcilePromotionMemories: Object.freeze(reconcilePromotionMemories),
|
|
274
|
+
quarantineMemory: Object.freeze(quarantineMemory),
|
|
155
275
|
createEvaluatedPromotionControlPlane(options = {}) {
|
|
156
276
|
if (
|
|
157
277
|
!options ||
|
|
@@ -258,7 +258,11 @@ export class StructuredMemoryAuthorityLedgerAdapter {
|
|
|
258
258
|
}
|
|
259
259
|
|
|
260
260
|
async listReceipts(kind) {
|
|
261
|
-
if (
|
|
261
|
+
if (
|
|
262
|
+
!["critic", "evaluator", "promotion", "revocation", "policy"].includes(
|
|
263
|
+
kind,
|
|
264
|
+
)
|
|
265
|
+
) {
|
|
262
266
|
throw new TypeError(
|
|
263
267
|
"a structured memory authority receipt kind is required",
|
|
264
268
|
);
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { types as utilTypes } from "node:util";
|
|
2
3
|
import structuredMemory from "@chainlesschain/session-core/structured-evolution-memory";
|
|
3
4
|
import { buildSkillEvaluatedPromotionReceiptEnvelope } from "./skill-evaluated-promotion.js";
|
|
4
5
|
import { digestSkillMutationReceiptEnvelope } from "./skill-mutation-authority.js";
|
|
5
6
|
import { SKILL_TARGET_MATRIX_EVAL_RECEIPT_SCHEMA } from "./skill-target-matrix-eval.js";
|
|
7
|
+
import {
|
|
8
|
+
SKILL_REVOCATION_DEPENDENCY_REQUEST_SCHEMA,
|
|
9
|
+
digestSkillRevocationDependencyRequest,
|
|
10
|
+
} from "./skill-revocation-propagation.js";
|
|
6
11
|
|
|
7
12
|
const { createStructuredMemoryAuthorityReceipt } = structuredMemory;
|
|
8
13
|
const SKILL_RELEASE_RECEIPT_SCHEMA =
|
|
@@ -12,6 +17,26 @@ const SKILL_PROMOTION_REVIEW_ENVELOPE_SCHEMA =
|
|
|
12
17
|
const RELEASE_RECEIPT_DOMAIN = `${SKILL_RELEASE_RECEIPT_SCHEMA}\0`;
|
|
13
18
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
14
19
|
const WRITERS = new WeakSet();
|
|
20
|
+
const REVOCATION_REQUEST_KEYS = new Set([
|
|
21
|
+
"schema",
|
|
22
|
+
"tenantId",
|
|
23
|
+
"streamId",
|
|
24
|
+
"operationId",
|
|
25
|
+
"transitionDigest",
|
|
26
|
+
"candidateId",
|
|
27
|
+
"skillName",
|
|
28
|
+
"occurredAt",
|
|
29
|
+
"sourceReceiptDigest",
|
|
30
|
+
"resolutionDigest",
|
|
31
|
+
"dependency",
|
|
32
|
+
"requestDigest",
|
|
33
|
+
]);
|
|
34
|
+
const REVOCATION_DEPENDENCY_KEYS = new Set([
|
|
35
|
+
"kind",
|
|
36
|
+
"ref",
|
|
37
|
+
"digest",
|
|
38
|
+
"disposition",
|
|
39
|
+
]);
|
|
15
40
|
|
|
16
41
|
function canonical(value) {
|
|
17
42
|
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
@@ -40,6 +65,31 @@ function requiredDigest(value, name) {
|
|
|
40
65
|
return value;
|
|
41
66
|
}
|
|
42
67
|
|
|
68
|
+
function exact(value, keys, label) {
|
|
69
|
+
if (
|
|
70
|
+
!value ||
|
|
71
|
+
typeof value !== "object" ||
|
|
72
|
+
Array.isArray(value) ||
|
|
73
|
+
utilTypes.isProxy(value) ||
|
|
74
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(value))
|
|
75
|
+
) {
|
|
76
|
+
throw new TypeError(`${label} must be a plain record`);
|
|
77
|
+
}
|
|
78
|
+
const own = Reflect.ownKeys(value);
|
|
79
|
+
if (
|
|
80
|
+
own.length !== keys.size ||
|
|
81
|
+
own.some((key) => typeof key !== "string" || !keys.has(key))
|
|
82
|
+
) {
|
|
83
|
+
throw new TypeError(`${label} has an invalid shape`);
|
|
84
|
+
}
|
|
85
|
+
for (const key of own) {
|
|
86
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
87
|
+
if (!descriptor || !("value" in descriptor) || !descriptor.enumerable) {
|
|
88
|
+
throw new TypeError(`${label}.${String(key)} is not a data field`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
43
93
|
function capture(owner, name) {
|
|
44
94
|
if (typeof owner?.[name] !== "function") {
|
|
45
95
|
throw new TypeError(`${name} port is required`);
|
|
@@ -143,6 +193,45 @@ function verifyPromotion(result, matrixBinding, reviewBinding, tenantId) {
|
|
|
143
193
|
return { release, receipt, evidenceRefs: [...new Set(evidenceRefs)].sort() };
|
|
144
194
|
}
|
|
145
195
|
|
|
196
|
+
function verifyRevocation(request, memory, tenantId) {
|
|
197
|
+
exact(request, REVOCATION_REQUEST_KEYS, "Memory revocation request");
|
|
198
|
+
exact(
|
|
199
|
+
request.dependency,
|
|
200
|
+
REVOCATION_DEPENDENCY_KEYS,
|
|
201
|
+
"Memory revocation dependency",
|
|
202
|
+
);
|
|
203
|
+
if (
|
|
204
|
+
request?.schema !== SKILL_REVOCATION_DEPENDENCY_REQUEST_SCHEMA ||
|
|
205
|
+
request.tenantId !== tenantId ||
|
|
206
|
+
request.dependency?.kind !== "memory" ||
|
|
207
|
+
request.dependency.disposition !== "quarantine" ||
|
|
208
|
+
request.dependency.ref !== memory?.memoryId ||
|
|
209
|
+
request.dependency.digest !== memory?.contentDigest ||
|
|
210
|
+
request.requestDigest !== digestSkillRevocationDependencyRequest(request) ||
|
|
211
|
+
memory.layer !== "procedural" ||
|
|
212
|
+
!DIGEST.test(request.transitionDigest ?? "") ||
|
|
213
|
+
!DIGEST.test(request.sourceReceiptDigest ?? "") ||
|
|
214
|
+
!DIGEST.test(request.resolutionDigest ?? "") ||
|
|
215
|
+
!Number.isFinite(Date.parse(request.occurredAt ?? "")) ||
|
|
216
|
+
new Date(request.occurredAt).toISOString() !== request.occurredAt ||
|
|
217
|
+
typeof memory.artifactRef !== "string" ||
|
|
218
|
+
!Array.isArray(memory.evidenceRefs)
|
|
219
|
+
) {
|
|
220
|
+
throw new Error("Memory revocation request is not exactly bound");
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
evidenceRefs: [
|
|
224
|
+
...new Set([
|
|
225
|
+
...memory.evidenceRefs,
|
|
226
|
+
request.transitionDigest,
|
|
227
|
+
request.sourceReceiptDigest,
|
|
228
|
+
request.resolutionDigest,
|
|
229
|
+
request.requestDigest,
|
|
230
|
+
]),
|
|
231
|
+
].sort(),
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
|
|
146
235
|
export function createStructuredMemoryPromotionReceiptWriter({
|
|
147
236
|
descriptor: input,
|
|
148
237
|
authorityStore,
|
|
@@ -201,6 +290,42 @@ export function createStructuredMemoryPromotionReceiptWriter({
|
|
|
201
290
|
}
|
|
202
291
|
return signed;
|
|
203
292
|
},
|
|
293
|
+
async retainRevocation(request, memory) {
|
|
294
|
+
const verified = verifyRevocation(request, memory, descriptor.tenantId);
|
|
295
|
+
const receipt = createStructuredMemoryAuthorityReceipt({
|
|
296
|
+
tenantId: descriptor.tenantId,
|
|
297
|
+
kind: "revocation",
|
|
298
|
+
decision: "accepted",
|
|
299
|
+
memoryId: memory.memoryId,
|
|
300
|
+
layer: "procedural",
|
|
301
|
+
action: "quarantine",
|
|
302
|
+
contentDigest: memory.contentDigest,
|
|
303
|
+
artifactRef: memory.artifactRef,
|
|
304
|
+
evidenceRefs: verified.evidenceRefs,
|
|
305
|
+
issuerId: descriptor.issuerId,
|
|
306
|
+
issuerRevision: descriptor.issuerRevision,
|
|
307
|
+
issuerHandlerDigest: descriptor.issuerHandlerDigest,
|
|
308
|
+
issuedAt: request.occurredAt,
|
|
309
|
+
});
|
|
310
|
+
const attestation = await attest({
|
|
311
|
+
purpose: "structured-memory-revocation-receipt",
|
|
312
|
+
payloadDigest: receipt.receiptDigest,
|
|
313
|
+
receipt,
|
|
314
|
+
propagationRequestDigest: request.requestDigest,
|
|
315
|
+
});
|
|
316
|
+
if (attestation === null || attestation === undefined) {
|
|
317
|
+
throw new Error("revocation receipt attestor returned no attestation");
|
|
318
|
+
}
|
|
319
|
+
const signed = Object.freeze({ ...receipt, attestation });
|
|
320
|
+
const retained = await retainReceipt(signed);
|
|
321
|
+
if (
|
|
322
|
+
retained?.persisted !== true ||
|
|
323
|
+
retained.receiptDigest !== receipt.receiptDigest
|
|
324
|
+
) {
|
|
325
|
+
throw new Error("revocation receipt was not durably acknowledged");
|
|
326
|
+
}
|
|
327
|
+
return signed;
|
|
328
|
+
},
|
|
204
329
|
});
|
|
205
330
|
WRITERS.add(writer);
|
|
206
331
|
return writer;
|
|
@@ -215,6 +340,7 @@ export function captureStructuredMemoryPromotionReceiptWriter(value) {
|
|
|
215
340
|
const captured = Object.freeze({
|
|
216
341
|
descriptor: value.descriptor,
|
|
217
342
|
retainPromotion: capture(value, "retainPromotion"),
|
|
343
|
+
retainRevocation: capture(value, "retainRevocation"),
|
|
218
344
|
});
|
|
219
345
|
WRITERS.add(captured);
|
|
220
346
|
return captured;
|