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,475 @@
|
|
|
1
|
+
import { types } from "node:util";
|
|
2
|
+
import { captureSkillReleaseRegistryReader } from "./skill-release-registry.js";
|
|
3
|
+
import { captureSkillReleaseOperationReader } from "./evolution-ledger-ports.js";
|
|
4
|
+
import { captureSkillRollbackProvider } from "./skill-promotion-controller.js";
|
|
5
|
+
import { captureWikiRevisionReader } from "./wiki-maintainer-ledger-adapter.js";
|
|
6
|
+
import {
|
|
7
|
+
verifySkillMutationRequest,
|
|
8
|
+
digestSkillMutationTransitionSubject,
|
|
9
|
+
} from "./skill-mutation-authority.js";
|
|
10
|
+
import {
|
|
11
|
+
createGovernedKnowledgeDependencyAuthority,
|
|
12
|
+
GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
|
|
13
|
+
digestGovernedKnowledgeDependencyResult,
|
|
14
|
+
} from "./governed-knowledge-dependency-authority.js";
|
|
15
|
+
// Reuse the bounded plain-data snapshot/hash, not pruning plans or permissions.
|
|
16
|
+
import {
|
|
17
|
+
capturePruningData as captureData,
|
|
18
|
+
pruningDigest as digest,
|
|
19
|
+
pruningCanonical as canonical,
|
|
20
|
+
} from "./governed-wiki-pruning-journal.js";
|
|
21
|
+
|
|
22
|
+
const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
|
|
23
|
+
const VERIFICATION_SCHEMA =
|
|
24
|
+
"chainlesschain.knowledge-skill-rollback-verification/v1";
|
|
25
|
+
|
|
26
|
+
function fail(message) {
|
|
27
|
+
throw new Error(`knowledge Skill rollback: ${message}`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function governedKnowledgeSourceRef({ tenantId, knowledgeId }) {
|
|
31
|
+
if (
|
|
32
|
+
typeof tenantId !== "string" ||
|
|
33
|
+
!ID.test(tenantId) ||
|
|
34
|
+
typeof knowledgeId !== "string" ||
|
|
35
|
+
!ID.test(knowledgeId)
|
|
36
|
+
)
|
|
37
|
+
throw new TypeError("knowledge source identity is invalid");
|
|
38
|
+
return `knowledge://${encodeURIComponent(tenantId)}/${encodeURIComponent(knowledgeId)}`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function bindReader(registry, transactionLedger, tenantId, wikiAdapter) {
|
|
42
|
+
const reader = captureSkillReleaseRegistryReader(registry);
|
|
43
|
+
if (
|
|
44
|
+
reader.tenantId !== tenantId ||
|
|
45
|
+
!reader.matchesTransactionLedger(transactionLedger)
|
|
46
|
+
)
|
|
47
|
+
throw new TypeError(
|
|
48
|
+
"knowledge rollback registry/ledger tenant binding differs",
|
|
49
|
+
);
|
|
50
|
+
const wiki =
|
|
51
|
+
wikiAdapter == null ? null : captureWikiRevisionReader(wikiAdapter);
|
|
52
|
+
if (
|
|
53
|
+
wiki &&
|
|
54
|
+
(wiki.descriptor.tenantId !== tenantId ||
|
|
55
|
+
!captureSkillReleaseOperationReader(transactionLedger).matchesWikiAdapter(
|
|
56
|
+
wikiAdapter,
|
|
57
|
+
))
|
|
58
|
+
)
|
|
59
|
+
throw new TypeError("Knowledge Wiki lineage tenant differs");
|
|
60
|
+
return Object.freeze({
|
|
61
|
+
registry: reader,
|
|
62
|
+
operations: captureSkillReleaseOperationReader(transactionLedger),
|
|
63
|
+
wiki,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function wikiLineage(reader, request, release) {
|
|
68
|
+
if (release.candidate.derivationMode !== "wiki") return null;
|
|
69
|
+
if (!reader.wiki)
|
|
70
|
+
fail("Wiki-derived release requires an authenticated Wiki reader");
|
|
71
|
+
const revision = reader.wiki.readKnowledgeProvenance({
|
|
72
|
+
tenantId: request.tenantId,
|
|
73
|
+
revisionId: release.candidate.wikiRevision,
|
|
74
|
+
knowledgeId: request.knowledgeId,
|
|
75
|
+
contentDigest: request.contentDigest,
|
|
76
|
+
});
|
|
77
|
+
const context = reader.operations.currentContext();
|
|
78
|
+
if (
|
|
79
|
+
["epoch", "ledgerId", "identityDigest"].some(
|
|
80
|
+
(key) => revision.checkpoint[key] !== context.checkpoint[key],
|
|
81
|
+
)
|
|
82
|
+
)
|
|
83
|
+
fail("Wiki provenance belongs to another release ledger");
|
|
84
|
+
const origin = reader.operations.resolveReleaseOrigin({
|
|
85
|
+
tenantId: request.tenantId,
|
|
86
|
+
skillName: release.skillName,
|
|
87
|
+
releaseDigest: release.releaseDigest,
|
|
88
|
+
context,
|
|
89
|
+
}).result;
|
|
90
|
+
if (
|
|
91
|
+
!origin ||
|
|
92
|
+
origin.projection.status !== "committed" ||
|
|
93
|
+
origin.intent.mutationRequest.requestDigest !==
|
|
94
|
+
release.mutationRequestDigest ||
|
|
95
|
+
revision.checkpoint.sequence >= origin.preparationCheckpoint.sequence
|
|
96
|
+
)
|
|
97
|
+
fail("Wiki provenance must precede the original release preparation");
|
|
98
|
+
return captureData({
|
|
99
|
+
wikiRevision: revision.revisionId,
|
|
100
|
+
stateDigest: revision.stateDigest,
|
|
101
|
+
checkpoint: revision.checkpoint,
|
|
102
|
+
releaseOriginTransactionId: origin.intent.transactionId,
|
|
103
|
+
releaseOriginReceiptDigest: origin.projection.receiptDigest,
|
|
104
|
+
affectedPatternIds: revision.affectedPatternIds,
|
|
105
|
+
unsafePatternIds: revision.unsafePatternIds,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function sameLedger(provider, verifier) {
|
|
110
|
+
const left = provider.operations.currentContext().checkpoint;
|
|
111
|
+
const right = verifier.operations.currentContext().checkpoint;
|
|
112
|
+
if (
|
|
113
|
+
["epoch", "ledgerId", "identityDigest"].some(
|
|
114
|
+
(key) => left[key] !== right[key],
|
|
115
|
+
)
|
|
116
|
+
)
|
|
117
|
+
fail("independent readers do not authenticate the same ledger");
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function releasesFor(reader, request) {
|
|
121
|
+
if (
|
|
122
|
+
request.dependency.kind !== "active-skill" ||
|
|
123
|
+
request.dependency.disposition !== "rollback-active"
|
|
124
|
+
)
|
|
125
|
+
fail("this provider requires an active-skill / rollback-active dependency");
|
|
126
|
+
// This effect accepts an immutable release identity, never an ambiguous content
|
|
127
|
+
// digest or a caller-supplied Skill name. Other dependency kinds need their own effect.
|
|
128
|
+
const from = reader.registry.readRelease(request.dependency.digest);
|
|
129
|
+
if (
|
|
130
|
+
!from ||
|
|
131
|
+
from.tenantId !== request.tenantId ||
|
|
132
|
+
from.releaseDigest !== request.dependency.digest
|
|
133
|
+
)
|
|
134
|
+
fail("dependent release is missing or substituted");
|
|
135
|
+
const sourceRef = governedKnowledgeSourceRef(request);
|
|
136
|
+
const wiki = wikiLineage(reader, request, from);
|
|
137
|
+
if (
|
|
138
|
+
!from.candidate.sourceEvidenceRefs.some(
|
|
139
|
+
(entry) =>
|
|
140
|
+
entry.ref === sourceRef && entry.digest === request.contentDigest,
|
|
141
|
+
) &&
|
|
142
|
+
!wiki?.affectedPatternIds.length
|
|
143
|
+
)
|
|
144
|
+
fail("dependent candidate has no exact Knowledge source lineage");
|
|
145
|
+
return { from, sourceRef, wiki };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function validateTarget(reader, request, from, target, sourceRef) {
|
|
149
|
+
if (
|
|
150
|
+
!target ||
|
|
151
|
+
target.tenantId !== request.tenantId ||
|
|
152
|
+
target.skillName !== from.skillName ||
|
|
153
|
+
target.releaseDigest === from.releaseDigest
|
|
154
|
+
)
|
|
155
|
+
fail("no distinct same-tenant last-known-good release");
|
|
156
|
+
if (
|
|
157
|
+
target.candidate.sourceEvidenceRefs.some(
|
|
158
|
+
(entry) =>
|
|
159
|
+
entry.ref === sourceRef || entry.digest === request.contentDigest,
|
|
160
|
+
)
|
|
161
|
+
)
|
|
162
|
+
fail("last-known-good still depends on revoked Knowledge");
|
|
163
|
+
const wiki = wikiLineage(reader, request, target);
|
|
164
|
+
if (wiki?.unsafePatternIds.length)
|
|
165
|
+
fail("last-known-good Wiki revision still depends on revoked Knowledge");
|
|
166
|
+
return wiki;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function resolve(reader, request, from) {
|
|
170
|
+
return reader.operations.resolveOperation({
|
|
171
|
+
tenantId: request.tenantId,
|
|
172
|
+
skillName: from.skillName,
|
|
173
|
+
operationId: request.operationId,
|
|
174
|
+
context: reader.operations.currentContext(),
|
|
175
|
+
}).result;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function committedProof(reader, request) {
|
|
179
|
+
const { from, sourceRef, wiki } = releasesFor(reader, request);
|
|
180
|
+
const result = resolve(reader, request, from);
|
|
181
|
+
if (!result) return null;
|
|
182
|
+
const { intent, previous, projection, finalizationEvidence } = result;
|
|
183
|
+
if (projection.status !== "committed")
|
|
184
|
+
fail("release transaction is pending; reopen the registry to recover");
|
|
185
|
+
const target = reader.registry.readRelease(intent.targetReleaseDigest);
|
|
186
|
+
const targetWiki = validateTarget(reader, request, from, target, sourceRef);
|
|
187
|
+
if (
|
|
188
|
+
intent.operation !== "rollback" ||
|
|
189
|
+
intent.operationId !== request.operationId ||
|
|
190
|
+
intent.skillName !== from.skillName ||
|
|
191
|
+
previous.activeReleaseDigest !== from.releaseDigest ||
|
|
192
|
+
intent.targetReleaseDigest !== previous.lastKnownGoodReleaseDigest ||
|
|
193
|
+
intent.expectedParentDigest !== from.contentDigest ||
|
|
194
|
+
intent.dependencyLockDigest !== target.dependencyLockDigest
|
|
195
|
+
)
|
|
196
|
+
fail("transaction differs from the exact dependent release rollback");
|
|
197
|
+
const active = reader.registry.readActive(from.skillName);
|
|
198
|
+
if (
|
|
199
|
+
projection.current !== true ||
|
|
200
|
+
!active ||
|
|
201
|
+
active.release.releaseDigest !== target.releaseDigest ||
|
|
202
|
+
active.state.transactionId !== intent.transactionId ||
|
|
203
|
+
active.state.stateDigest !== projection.stateDigest
|
|
204
|
+
)
|
|
205
|
+
fail("rollback is no longer the current active release");
|
|
206
|
+
if (
|
|
207
|
+
!finalizationEvidence ||
|
|
208
|
+
finalizationEvidence.eventDigest !== projection.headDigest
|
|
209
|
+
)
|
|
210
|
+
fail("authenticated finalization evidence is missing");
|
|
211
|
+
return captureData({
|
|
212
|
+
fromReleaseDigest: from.releaseDigest,
|
|
213
|
+
targetReleaseDigest: target.releaseDigest,
|
|
214
|
+
transactionId: intent.transactionId,
|
|
215
|
+
stateDigest: projection.stateDigest,
|
|
216
|
+
releaseReceiptDigest: projection.receiptDigest,
|
|
217
|
+
authorityReceiptDigest: intent.authorityReceiptDigest,
|
|
218
|
+
intentDigest: intent.intentDigest,
|
|
219
|
+
epoch: projection.epoch,
|
|
220
|
+
ledgerId: projection.ledgerId,
|
|
221
|
+
sequence: projection.sequence,
|
|
222
|
+
finalizationEvidence,
|
|
223
|
+
...(wiki || targetWiki
|
|
224
|
+
? { wikiLineage: { from: wiki, target: targetWiki } }
|
|
225
|
+
: {}),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function authorizationData(value) {
|
|
230
|
+
if (!value || typeof value !== "object" || types.isProxy(value))
|
|
231
|
+
fail("rollback authorization must be own data");
|
|
232
|
+
const fields = Object.getOwnPropertyDescriptors(value);
|
|
233
|
+
if (
|
|
234
|
+
Reflect.ownKeys(fields).length !== 2 ||
|
|
235
|
+
!fields.request ||
|
|
236
|
+
!fields.capability ||
|
|
237
|
+
[fields.request, fields.capability].some(
|
|
238
|
+
(field) => !Object.hasOwn(field, "value") || !field.enumerable,
|
|
239
|
+
)
|
|
240
|
+
)
|
|
241
|
+
fail("rollback authorization requires exact own request/capability fields");
|
|
242
|
+
return {
|
|
243
|
+
request: verifySkillMutationRequest(fields.request.value),
|
|
244
|
+
capability: fields.capability.value,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Real active-release effect with direct or historically authenticated Wiki
|
|
249
|
+
// provenance. Candidate rejection and quarantine require separate effects.
|
|
250
|
+
export function createGovernedKnowledgeSkillRollbackAuthority({
|
|
251
|
+
tenantId,
|
|
252
|
+
deviceId,
|
|
253
|
+
releaseRegistry,
|
|
254
|
+
transactionLedger,
|
|
255
|
+
rollbackProvider,
|
|
256
|
+
authorizationProvider,
|
|
257
|
+
verifierReleaseRegistry,
|
|
258
|
+
verifierTransactionLedger,
|
|
259
|
+
wikiLedgerAdapter = null,
|
|
260
|
+
verifierWikiLedgerAdapter = null,
|
|
261
|
+
providerDescriptor,
|
|
262
|
+
verifierDescriptor,
|
|
263
|
+
} = {}) {
|
|
264
|
+
if (
|
|
265
|
+
releaseRegistry === verifierReleaseRegistry ||
|
|
266
|
+
transactionLedger === verifierTransactionLedger
|
|
267
|
+
)
|
|
268
|
+
throw new TypeError(
|
|
269
|
+
"knowledge rollback verifier must use independent readers",
|
|
270
|
+
);
|
|
271
|
+
if (
|
|
272
|
+
(wikiLedgerAdapter === null) !== (verifierWikiLedgerAdapter === null) ||
|
|
273
|
+
(wikiLedgerAdapter !== null &&
|
|
274
|
+
wikiLedgerAdapter === verifierWikiLedgerAdapter)
|
|
275
|
+
)
|
|
276
|
+
throw new TypeError("Wiki provenance requires independent paired readers");
|
|
277
|
+
const providerReader = bindReader(
|
|
278
|
+
releaseRegistry,
|
|
279
|
+
transactionLedger,
|
|
280
|
+
tenantId,
|
|
281
|
+
wikiLedgerAdapter,
|
|
282
|
+
);
|
|
283
|
+
const verifierReader = bindReader(
|
|
284
|
+
verifierReleaseRegistry,
|
|
285
|
+
verifierTransactionLedger,
|
|
286
|
+
tenantId,
|
|
287
|
+
verifierWikiLedgerAdapter,
|
|
288
|
+
);
|
|
289
|
+
if (
|
|
290
|
+
providerReader.wiki &&
|
|
291
|
+
canonical(providerReader.wiki.descriptor) !==
|
|
292
|
+
canonical(verifierReader.wiki.descriptor)
|
|
293
|
+
)
|
|
294
|
+
throw new TypeError("Wiki provenance reader scopes differ");
|
|
295
|
+
sameLedger(providerReader, verifierReader);
|
|
296
|
+
const rollback = captureSkillRollbackProvider(
|
|
297
|
+
rollbackProvider,
|
|
298
|
+
releaseRegistry,
|
|
299
|
+
);
|
|
300
|
+
if (rollback.tenantId !== tenantId)
|
|
301
|
+
throw new TypeError("rollback tenant differs");
|
|
302
|
+
if (
|
|
303
|
+
!authorizationProvider ||
|
|
304
|
+
typeof authorizationProvider !== "object" ||
|
|
305
|
+
types.isProxy(authorizationProvider)
|
|
306
|
+
)
|
|
307
|
+
throw new TypeError("a fixed rollback authorization provider is required");
|
|
308
|
+
const authorize = Object.getOwnPropertyDescriptor(
|
|
309
|
+
authorizationProvider,
|
|
310
|
+
"authorizeRollback",
|
|
311
|
+
)?.value;
|
|
312
|
+
if (typeof authorize !== "function" || types.isProxy(authorize))
|
|
313
|
+
throw new TypeError("a fixed rollback authorization provider is required");
|
|
314
|
+
const providerIdentity = captureData(providerDescriptor);
|
|
315
|
+
const verifierIdentity = captureData(verifierDescriptor);
|
|
316
|
+
|
|
317
|
+
async function apply(request) {
|
|
318
|
+
sameLedger(providerReader, verifierReader);
|
|
319
|
+
let proof = committedProof(providerReader, request);
|
|
320
|
+
if (!proof) {
|
|
321
|
+
const { from, sourceRef, wiki } = releasesFor(providerReader, request);
|
|
322
|
+
const active = providerReader.registry.readActive(from.skillName);
|
|
323
|
+
if (!active || active.release.releaseDigest !== from.releaseDigest)
|
|
324
|
+
fail("dependent release is not currently active");
|
|
325
|
+
const target = providerReader.registry.readRelease(
|
|
326
|
+
active.state.lastKnownGoodReleaseDigest,
|
|
327
|
+
);
|
|
328
|
+
const targetWiki = validateTarget(
|
|
329
|
+
providerReader,
|
|
330
|
+
request,
|
|
331
|
+
from,
|
|
332
|
+
target,
|
|
333
|
+
sourceRef,
|
|
334
|
+
);
|
|
335
|
+
// Independently preflight before asking for a destructive capability.
|
|
336
|
+
const independent = verifierReader.registry.readActive(from.skillName);
|
|
337
|
+
if (canonical(independent) !== canonical(active))
|
|
338
|
+
fail("independent active state differs");
|
|
339
|
+
const independentSource = releasesFor(verifierReader, request);
|
|
340
|
+
const independentTargetWiki = validateTarget(
|
|
341
|
+
verifierReader,
|
|
342
|
+
request,
|
|
343
|
+
independentSource.from,
|
|
344
|
+
verifierReader.registry.readRelease(
|
|
345
|
+
active.state.lastKnownGoodReleaseDigest,
|
|
346
|
+
),
|
|
347
|
+
sourceRef,
|
|
348
|
+
);
|
|
349
|
+
if (
|
|
350
|
+
canonical(wiki) !== canonical(independentSource.wiki) ||
|
|
351
|
+
canonical(targetWiki) !== canonical(independentTargetWiki)
|
|
352
|
+
)
|
|
353
|
+
fail("independent Wiki provenance differs");
|
|
354
|
+
const expected = captureData({
|
|
355
|
+
tenantId,
|
|
356
|
+
skillName: from.skillName,
|
|
357
|
+
operationId: request.operationId,
|
|
358
|
+
operation: "rollback",
|
|
359
|
+
targetScope: "active",
|
|
360
|
+
expectedTargetDigest: from.contentDigest,
|
|
361
|
+
expectedTargetRevision: active.state.revision,
|
|
362
|
+
targetReleaseDigest: target.releaseDigest,
|
|
363
|
+
transitionSubjectDigest: digestSkillMutationTransitionSubject({
|
|
364
|
+
tenantId,
|
|
365
|
+
skillName: from.skillName,
|
|
366
|
+
operation: "rollback",
|
|
367
|
+
candidateId: null,
|
|
368
|
+
rollbackTargetReleaseDigest: target.releaseDigest,
|
|
369
|
+
dependencyLockDigest: target.dependencyLockDigest,
|
|
370
|
+
expectedActiveContentDigest: from.contentDigest,
|
|
371
|
+
expectedActiveRevision: active.state.revision,
|
|
372
|
+
}),
|
|
373
|
+
});
|
|
374
|
+
const authorization = authorizationData(
|
|
375
|
+
await Reflect.apply(authorize, authorizationProvider, [expected]),
|
|
376
|
+
);
|
|
377
|
+
for (const key of [
|
|
378
|
+
"tenantId",
|
|
379
|
+
"skillName",
|
|
380
|
+
"operationId",
|
|
381
|
+
"operation",
|
|
382
|
+
"targetScope",
|
|
383
|
+
"expectedTargetDigest",
|
|
384
|
+
"expectedTargetRevision",
|
|
385
|
+
"transitionSubjectDigest",
|
|
386
|
+
])
|
|
387
|
+
if (authorization.request[key] !== expected[key])
|
|
388
|
+
fail("authority authorized a different transition");
|
|
389
|
+
sameLedger(providerReader, verifierReader);
|
|
390
|
+
if (
|
|
391
|
+
committedProof(providerReader, request) !== null ||
|
|
392
|
+
canonical(providerReader.registry.readActive(from.skillName)) !==
|
|
393
|
+
canonical(active)
|
|
394
|
+
)
|
|
395
|
+
fail("release changed while authorization was pending");
|
|
396
|
+
await rollback.rollback({
|
|
397
|
+
authorization,
|
|
398
|
+
targetReleaseDigest: target.releaseDigest,
|
|
399
|
+
});
|
|
400
|
+
proof = committedProof(providerReader, request);
|
|
401
|
+
if (!proof) fail("rollback was not durably read back");
|
|
402
|
+
}
|
|
403
|
+
const core = {
|
|
404
|
+
schema: GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
|
|
405
|
+
tenantId,
|
|
406
|
+
deviceId,
|
|
407
|
+
operationId: request.operationId,
|
|
408
|
+
requestDigest: request.requestDigest,
|
|
409
|
+
knowledgeId: request.knowledgeId,
|
|
410
|
+
revocationReceiptDigest: request.revocationReceiptDigest,
|
|
411
|
+
dependencyKind: request.dependency.kind,
|
|
412
|
+
dependencyDigest: request.dependency.digest,
|
|
413
|
+
dependencyDisposition: request.dependency.disposition,
|
|
414
|
+
authorityId: providerIdentity.authorityId,
|
|
415
|
+
authorityRevision: providerIdentity.revision,
|
|
416
|
+
handlerArtifactDigest: providerIdentity.handlerArtifactDigest,
|
|
417
|
+
applied: true,
|
|
418
|
+
durable: true,
|
|
419
|
+
idempotent: true,
|
|
420
|
+
appliedAt: proof.finalizationEvidence.timestamp,
|
|
421
|
+
};
|
|
422
|
+
const { algorithm, keyId, value } = proof.finalizationEvidence.signature;
|
|
423
|
+
return captureData({
|
|
424
|
+
...core,
|
|
425
|
+
resultDigest: digestGovernedKnowledgeDependencyResult(core),
|
|
426
|
+
attestation: { algorithm, keyId, value },
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
return createGovernedKnowledgeDependencyAuthority({
|
|
431
|
+
tenantId,
|
|
432
|
+
deviceId,
|
|
433
|
+
providerDescriptor: providerIdentity,
|
|
434
|
+
verifierDescriptor: verifierIdentity,
|
|
435
|
+
provider: Object.freeze({ apply }),
|
|
436
|
+
verifier: Object.freeze({
|
|
437
|
+
async verify({ request, result }) {
|
|
438
|
+
sameLedger(providerReader, verifierReader);
|
|
439
|
+
const proof = committedProof(verifierReader, request);
|
|
440
|
+
const providerProof = committedProof(providerReader, request);
|
|
441
|
+
if (!proof || canonical(proof) !== canonical(providerProof))
|
|
442
|
+
fail("independent durable rollback proof differs");
|
|
443
|
+
const { algorithm, keyId, value } =
|
|
444
|
+
proof.finalizationEvidence.signature;
|
|
445
|
+
if (
|
|
446
|
+
result.appliedAt !== proof.finalizationEvidence.timestamp ||
|
|
447
|
+
canonical(result.attestation) !==
|
|
448
|
+
canonical({ algorithm, keyId, value })
|
|
449
|
+
)
|
|
450
|
+
fail("result differs from authenticated finalization");
|
|
451
|
+
return captureData({
|
|
452
|
+
authenticated: true,
|
|
453
|
+
durable: true,
|
|
454
|
+
tenantId,
|
|
455
|
+
deviceId,
|
|
456
|
+
operationId: request.operationId,
|
|
457
|
+
requestDigest: request.requestDigest,
|
|
458
|
+
resultDigest: result.resultDigest,
|
|
459
|
+
providerAuthorityId: providerIdentity.authorityId,
|
|
460
|
+
providerRevision: providerIdentity.revision,
|
|
461
|
+
verifierAuthorityId: verifierIdentity.authorityId,
|
|
462
|
+
verifierRevision: verifierIdentity.revision,
|
|
463
|
+
verificationReceiptDigest: digest(VERIFICATION_SCHEMA, {
|
|
464
|
+
tenantId,
|
|
465
|
+
deviceId,
|
|
466
|
+
requestDigest: request.requestDigest,
|
|
467
|
+
resultDigest: result.resultDigest,
|
|
468
|
+
proof,
|
|
469
|
+
verifierIdentity,
|
|
470
|
+
}),
|
|
471
|
+
});
|
|
472
|
+
},
|
|
473
|
+
}),
|
|
474
|
+
});
|
|
475
|
+
}
|
|
@@ -11,11 +11,16 @@ import {
|
|
|
11
11
|
} from "./evolution-ledger.js";
|
|
12
12
|
import {
|
|
13
13
|
GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA,
|
|
14
|
+
verifyGovernedKnowledgeArtifactBinding,
|
|
14
15
|
verifyGovernedKnowledgeEnvelopeIntegrity,
|
|
15
16
|
verifyGovernedKnowledgeRecord,
|
|
16
17
|
} from "./governed-knowledge-sync.js";
|
|
17
18
|
|
|
18
19
|
export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA =
|
|
20
|
+
"chainlesschain.governed-evolution-knowledge-ledger-record/v4";
|
|
21
|
+
export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA =
|
|
22
|
+
"chainlesschain.governed-evolution-knowledge-ledger-record/v3";
|
|
23
|
+
export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA =
|
|
19
24
|
"chainlesschain.governed-evolution-knowledge-ledger-record/v2";
|
|
20
25
|
export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_LEGACY_SCHEMA =
|
|
21
26
|
"chainlesschain.governed-evolution-knowledge-ledger-record/v1";
|
|
@@ -32,6 +37,7 @@ const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
|
|
|
32
37
|
const DISPOSITIONS = new Set(["conflict", "local", "remote"]);
|
|
33
38
|
const MAX_CONFLICT_PAGE = 256;
|
|
34
39
|
const RECORD_KEYS = new Set([
|
|
40
|
+
"artifactBinding",
|
|
35
41
|
"committedAt",
|
|
36
42
|
"authorizationReceiptDigest",
|
|
37
43
|
"conflictWithDigest",
|
|
@@ -45,8 +51,11 @@ const RECORD_KEYS = new Set([
|
|
|
45
51
|
"schema",
|
|
46
52
|
"tenantId",
|
|
47
53
|
]);
|
|
54
|
+
const V2_RECORD_KEYS = new Set(
|
|
55
|
+
[...RECORD_KEYS].filter((key) => key !== "artifactBinding"),
|
|
56
|
+
);
|
|
48
57
|
const LEGACY_RECORD_KEYS = new Set(
|
|
49
|
-
[...
|
|
58
|
+
[...V2_RECORD_KEYS].filter((key) => key !== "operationId"),
|
|
50
59
|
);
|
|
51
60
|
|
|
52
61
|
function canonical(value) {
|
|
@@ -132,9 +141,23 @@ function recordCore(value) {
|
|
|
132
141
|
authorizationReceiptDigest: value.authorizationReceiptDigest,
|
|
133
142
|
committedAt: value.committedAt,
|
|
134
143
|
};
|
|
135
|
-
if (
|
|
144
|
+
if (
|
|
145
|
+
[
|
|
146
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
|
|
147
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
|
|
148
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA,
|
|
149
|
+
].includes(value.schema)
|
|
150
|
+
) {
|
|
136
151
|
core.operationId = value.operationId;
|
|
137
152
|
}
|
|
153
|
+
if (
|
|
154
|
+
[
|
|
155
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
|
|
156
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
|
|
157
|
+
].includes(value.schema)
|
|
158
|
+
) {
|
|
159
|
+
core.artifactBinding = value.artifactBinding;
|
|
160
|
+
}
|
|
138
161
|
return core;
|
|
139
162
|
}
|
|
140
163
|
|
|
@@ -208,14 +231,24 @@ function validateEnvelope(value, knowledge, descriptor, disposition) {
|
|
|
208
231
|
function validateLedgerRecord(value, descriptor) {
|
|
209
232
|
const current =
|
|
210
233
|
value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA;
|
|
234
|
+
const version3 =
|
|
235
|
+
value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA;
|
|
236
|
+
const version2 =
|
|
237
|
+
value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA;
|
|
211
238
|
exact(
|
|
212
239
|
value,
|
|
213
|
-
current
|
|
240
|
+
current || version3
|
|
241
|
+
? RECORD_KEYS
|
|
242
|
+
: version2
|
|
243
|
+
? V2_RECORD_KEYS
|
|
244
|
+
: LEGACY_RECORD_KEYS,
|
|
214
245
|
"knowledge sync ledger record",
|
|
215
246
|
);
|
|
216
247
|
if (
|
|
217
248
|
![
|
|
218
249
|
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
|
|
250
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
|
|
251
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA,
|
|
219
252
|
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_LEGACY_SCHEMA,
|
|
220
253
|
].includes(value.schema) ||
|
|
221
254
|
value.tenantId !== descriptor.tenantId ||
|
|
@@ -231,10 +264,10 @@ function validateLedgerRecord(value, descriptor) {
|
|
|
231
264
|
corrupt("knowledge sync ledger record binding is invalid");
|
|
232
265
|
}
|
|
233
266
|
if (
|
|
234
|
-
(current &&
|
|
267
|
+
((current || version3 || version2) &&
|
|
235
268
|
value.operationId !== null &&
|
|
236
269
|
!SAFE_ID.test(value.operationId ?? "")) ||
|
|
237
|
-
(!current && Object.hasOwn(value, "operationId"))
|
|
270
|
+
(!current && !version3 && !version2 && Object.hasOwn(value, "operationId"))
|
|
238
271
|
) {
|
|
239
272
|
corrupt("knowledge sync operation binding is invalid");
|
|
240
273
|
}
|
|
@@ -246,6 +279,33 @@ function validateLedgerRecord(value, descriptor) {
|
|
|
246
279
|
if (value.conflictWithDigest !== conflictWithDigest) {
|
|
247
280
|
corrupt("knowledge sync conflict digest was substituted");
|
|
248
281
|
}
|
|
282
|
+
if (current || version3) {
|
|
283
|
+
if (current || value.disposition === "local") {
|
|
284
|
+
try {
|
|
285
|
+
const binding = verifyGovernedKnowledgeArtifactBinding(
|
|
286
|
+
value.artifactBinding,
|
|
287
|
+
{
|
|
288
|
+
tenantId: descriptor.tenantId,
|
|
289
|
+
knowledge: value.knowledge,
|
|
290
|
+
authorizationReceiptDigest: value.authorizationReceiptDigest,
|
|
291
|
+
},
|
|
292
|
+
);
|
|
293
|
+
if (
|
|
294
|
+
current &&
|
|
295
|
+
(binding.activate !== (value.disposition !== "conflict") ||
|
|
296
|
+
(value.disposition === "local"
|
|
297
|
+
? !["publish", "merge"].includes(binding.operation)
|
|
298
|
+
: binding.operation !== "receive"))
|
|
299
|
+
) {
|
|
300
|
+
corrupt("knowledge sync artifact activation binding is invalid");
|
|
301
|
+
}
|
|
302
|
+
} catch {
|
|
303
|
+
corrupt("knowledge sync artifact binding is invalid");
|
|
304
|
+
}
|
|
305
|
+
} else if (value.artifactBinding !== null) {
|
|
306
|
+
corrupt("remote knowledge sync cannot claim an artifact binding");
|
|
307
|
+
}
|
|
308
|
+
}
|
|
249
309
|
validateEnvelope(
|
|
250
310
|
value.envelope,
|
|
251
311
|
value.knowledge,
|
|
@@ -398,6 +458,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
|
|
|
398
458
|
disposition,
|
|
399
459
|
authorizationReceiptDigest,
|
|
400
460
|
operationId = null,
|
|
461
|
+
artifactBinding = null,
|
|
401
462
|
} = {}) => {
|
|
402
463
|
if (!DISPOSITIONS.has(disposition)) {
|
|
403
464
|
throw new TypeError("knowledge sync disposition is invalid");
|
|
@@ -451,6 +512,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
|
|
|
451
512
|
conflictWithDigest,
|
|
452
513
|
authorizationReceiptDigest,
|
|
453
514
|
operationId,
|
|
515
|
+
artifactBinding,
|
|
454
516
|
};
|
|
455
517
|
if (canonical(stableExisting) !== canonical(stableRequest)) {
|
|
456
518
|
corrupt("knowledge sync event identity resolved different content");
|
|
@@ -479,6 +541,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
|
|
|
479
541
|
conflictWithDigest,
|
|
480
542
|
authorizationReceiptDigest,
|
|
481
543
|
operationId,
|
|
544
|
+
artifactBinding: clone(artifactBinding),
|
|
482
545
|
committedAt,
|
|
483
546
|
};
|
|
484
547
|
const record = Object.freeze({
|
|
@@ -556,7 +619,11 @@ export class GovernedKnowledgeSyncLedgerAdapter {
|
|
|
556
619
|
)
|
|
557
620
|
).filter(
|
|
558
621
|
(record) =>
|
|
559
|
-
|
|
622
|
+
[
|
|
623
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
|
|
624
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
|
|
625
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA,
|
|
626
|
+
].includes(record.schema) &&
|
|
560
627
|
record.disposition === "local" &&
|
|
561
628
|
record.operationId === normalizedId,
|
|
562
629
|
);
|
|
@@ -566,6 +633,24 @@ export class GovernedKnowledgeSyncLedgerAdapter {
|
|
|
566
633
|
return matches[0] ?? null;
|
|
567
634
|
};
|
|
568
635
|
|
|
636
|
+
getReception = async ({ envelopeDigest } = {}) => {
|
|
637
|
+
if (!DIGEST.test(envelopeDigest ?? "")) {
|
|
638
|
+
throw new TypeError("knowledge reception envelope digest is invalid");
|
|
639
|
+
}
|
|
640
|
+
const matches = (
|
|
641
|
+
await Promise.all(
|
|
642
|
+
this._events().map((event) => this._resolveEvent(event)),
|
|
643
|
+
)
|
|
644
|
+
).filter(
|
|
645
|
+
(record) =>
|
|
646
|
+
record.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA &&
|
|
647
|
+
["remote", "conflict"].includes(record.disposition) &&
|
|
648
|
+
record.envelopeDigest === envelopeDigest,
|
|
649
|
+
);
|
|
650
|
+
if (matches.length > 1) corrupt("knowledge reception is ambiguous");
|
|
651
|
+
return matches[0] ?? null;
|
|
652
|
+
};
|
|
653
|
+
|
|
569
654
|
listConflicts = async ({ cursor = 0, limit = 50 } = {}) => {
|
|
570
655
|
if (
|
|
571
656
|
!Number.isSafeInteger(cursor) ||
|
|
@@ -629,6 +714,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
|
|
|
629
714
|
send: capture(send, "send", "send"),
|
|
630
715
|
load: this.load,
|
|
631
716
|
loadPublication: this.getPublication,
|
|
717
|
+
loadReception: this.getReception,
|
|
632
718
|
commit: this.commit,
|
|
633
719
|
});
|
|
634
720
|
}
|