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
|
@@ -1,12 +1,31 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { types as utilTypes } from "node:util";
|
|
3
3
|
|
|
4
|
+
import { verifyGovernedKnowledgeRecord } from "./governed-knowledge-sync.js";
|
|
5
|
+
import {
|
|
6
|
+
digestGovernedKnowledgeDependencyOperation,
|
|
7
|
+
isGovernedKnowledgeDependencyExecutionRequest,
|
|
8
|
+
} from "./governed-knowledge-dependency-ledger-executor.js";
|
|
9
|
+
|
|
4
10
|
export const GOVERNED_KNOWLEDGE_DEPENDENCY_REQUEST_SCHEMA =
|
|
5
11
|
"chainlesschain.governed-knowledge-dependency-request/v1";
|
|
6
12
|
export const GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA =
|
|
7
13
|
"chainlesschain.governed-knowledge-dependency-result/v1";
|
|
8
14
|
|
|
9
15
|
const AUTHORITIES = new WeakSet();
|
|
16
|
+
// Only this module can dispatch a prepared router request into a leaf's full
|
|
17
|
+
// request/result verification pipeline. No public rebranding API is exposed.
|
|
18
|
+
const PREPARED_EXECUTIONS = new WeakMap();
|
|
19
|
+
const PREPARED_REVERIFIERS = new WeakMap();
|
|
20
|
+
|
|
21
|
+
// A read-only final check for the genuine executor. Reverification cannot call
|
|
22
|
+
// a provider again, mint a request, or bypass the original leaf verifier.
|
|
23
|
+
export function captureGovernedKnowledgeDependencyReverifier(authority) {
|
|
24
|
+
const verify = PREPARED_REVERIFIERS.get(authority);
|
|
25
|
+
if (!verify)
|
|
26
|
+
throw new TypeError("a genuine dependency authority is required");
|
|
27
|
+
return verify;
|
|
28
|
+
}
|
|
10
29
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
11
30
|
const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
|
|
12
31
|
const DESCRIPTOR_KEYS = new Set([
|
|
@@ -36,6 +55,14 @@ const RESULT_KEYS = new Set([
|
|
|
36
55
|
"tenantId",
|
|
37
56
|
]);
|
|
38
57
|
const ATTESTATION_KEYS = new Set(["algorithm", "keyId", "value"]);
|
|
58
|
+
const INPUT_KEYS = new Set([
|
|
59
|
+
"tenantId",
|
|
60
|
+
"deviceId",
|
|
61
|
+
"operationDigest",
|
|
62
|
+
"knowledge",
|
|
63
|
+
"dependency",
|
|
64
|
+
]);
|
|
65
|
+
const DEPENDENCY_KEYS = new Set(["kind", "digest", "disposition"]);
|
|
39
66
|
|
|
40
67
|
function canonical(value) {
|
|
41
68
|
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
@@ -83,6 +110,14 @@ function exact(value, keys, label) {
|
|
|
83
110
|
) {
|
|
84
111
|
throw new TypeError(`${label} has an invalid shape`);
|
|
85
112
|
}
|
|
113
|
+
if (
|
|
114
|
+
actual.some(
|
|
115
|
+
(key) =>
|
|
116
|
+
!Object.hasOwn(Object.getOwnPropertyDescriptor(value, key), "value"),
|
|
117
|
+
)
|
|
118
|
+
) {
|
|
119
|
+
throw new TypeError(`${label} must contain only data properties`);
|
|
120
|
+
}
|
|
86
121
|
return value;
|
|
87
122
|
}
|
|
88
123
|
|
|
@@ -94,15 +129,17 @@ function identifier(value, label) {
|
|
|
94
129
|
}
|
|
95
130
|
|
|
96
131
|
function capture(owner, method, label) {
|
|
132
|
+
if (!owner || typeof owner !== "object" || utilTypes.isProxy(owner)) {
|
|
133
|
+
throw new TypeError(`${label}.${method}() is required`);
|
|
134
|
+
}
|
|
135
|
+
const implementation = owner[method];
|
|
97
136
|
if (
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
utilTypes.isProxy(owner) ||
|
|
101
|
-
typeof owner[method] !== "function"
|
|
137
|
+
typeof implementation !== "function" ||
|
|
138
|
+
utilTypes.isProxy(implementation)
|
|
102
139
|
) {
|
|
103
|
-
throw new TypeError(`${label}.${method}()
|
|
140
|
+
throw new TypeError(`${label}.${method}() must be a non-proxy function`);
|
|
104
141
|
}
|
|
105
|
-
return (...args) => Reflect.apply(
|
|
142
|
+
return (...args) => Reflect.apply(implementation, owner, args);
|
|
106
143
|
}
|
|
107
144
|
|
|
108
145
|
function descriptor(input, label) {
|
|
@@ -219,55 +256,201 @@ export function createGovernedKnowledgeDependencyAuthority({
|
|
|
219
256
|
}
|
|
220
257
|
const apply = capture(provider, "apply", "provider");
|
|
221
258
|
const verify = capture(verifier, "verify", "verifier");
|
|
259
|
+
const executePrepared = async (input, revalidation = null) => {
|
|
260
|
+
exact(input, INPUT_KEYS, "dependency execution input");
|
|
261
|
+
if (
|
|
262
|
+
input?.tenantId !== tenantId ||
|
|
263
|
+
input.deviceId !== deviceId ||
|
|
264
|
+
!DIGEST.test(input.operationDigest ?? "")
|
|
265
|
+
) {
|
|
266
|
+
throw new Error("dependency request crossed its authority boundary");
|
|
267
|
+
}
|
|
268
|
+
// Normalize and snapshot before the first await, then bind both the entire
|
|
269
|
+
// operation and the selected edge. A plausible digest is not authorization
|
|
270
|
+
// to apply an unlisted dependency or to change its disposition.
|
|
271
|
+
const knowledge = verifyGovernedKnowledgeRecord(input.knowledge, {
|
|
272
|
+
tenantId,
|
|
273
|
+
});
|
|
274
|
+
const dependency = exact(input.dependency, DEPENDENCY_KEYS, "dependency");
|
|
275
|
+
const selected = knowledge.dependencies.find(
|
|
276
|
+
(entry) =>
|
|
277
|
+
entry.kind === dependency.kind &&
|
|
278
|
+
entry.digest === dependency.digest &&
|
|
279
|
+
entry.disposition === dependency.disposition,
|
|
280
|
+
);
|
|
281
|
+
if (
|
|
282
|
+
!["tombstone", "revoke"].includes(knowledge.action) ||
|
|
283
|
+
!selected ||
|
|
284
|
+
input.operationDigest !==
|
|
285
|
+
digestGovernedKnowledgeDependencyOperation({
|
|
286
|
+
tenantId,
|
|
287
|
+
deviceId,
|
|
288
|
+
knowledge,
|
|
289
|
+
})
|
|
290
|
+
) {
|
|
291
|
+
throw new Error(
|
|
292
|
+
"dependency request is not bound to its revocation operation",
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
const request = requestFor({
|
|
296
|
+
tenantId,
|
|
297
|
+
deviceId,
|
|
298
|
+
operationDigest: input.operationDigest,
|
|
299
|
+
knowledge,
|
|
300
|
+
dependency: selected,
|
|
301
|
+
});
|
|
302
|
+
let supplied;
|
|
303
|
+
if (revalidation !== null) {
|
|
304
|
+
exact(
|
|
305
|
+
revalidation.result,
|
|
306
|
+
new Set([...RESULT_KEYS, "verificationReceiptDigest"]),
|
|
307
|
+
"previously verified dependency result",
|
|
308
|
+
);
|
|
309
|
+
if (!DIGEST.test(revalidation.result.verificationReceiptDigest))
|
|
310
|
+
throw new TypeError("dependency verification receipt is invalid");
|
|
311
|
+
supplied = clone(revalidation.result);
|
|
312
|
+
delete supplied.verificationReceiptDigest;
|
|
313
|
+
}
|
|
314
|
+
const result = validateResult(
|
|
315
|
+
revalidation === null ? await apply(request) : supplied,
|
|
316
|
+
request,
|
|
317
|
+
providerDescriptor,
|
|
318
|
+
);
|
|
319
|
+
const verified = await verify({
|
|
320
|
+
request,
|
|
321
|
+
result,
|
|
322
|
+
providerDescriptor,
|
|
323
|
+
verifierDescriptor,
|
|
324
|
+
});
|
|
325
|
+
if (
|
|
326
|
+
verified?.authenticated !== true ||
|
|
327
|
+
verified.durable !== true ||
|
|
328
|
+
verified.tenantId !== tenantId ||
|
|
329
|
+
verified.deviceId !== deviceId ||
|
|
330
|
+
verified.operationId !== request.operationId ||
|
|
331
|
+
verified.requestDigest !== request.requestDigest ||
|
|
332
|
+
verified.resultDigest !== result.resultDigest ||
|
|
333
|
+
verified.providerAuthorityId !== providerDescriptor.authorityId ||
|
|
334
|
+
verified.providerRevision !== providerDescriptor.revision ||
|
|
335
|
+
verified.verifierAuthorityId !== verifierDescriptor.authorityId ||
|
|
336
|
+
verified.verifierRevision !== verifierDescriptor.revision ||
|
|
337
|
+
!DIGEST.test(verified.verificationReceiptDigest ?? "")
|
|
338
|
+
) {
|
|
339
|
+
throw new Error("dependency result was not independently verified");
|
|
340
|
+
}
|
|
341
|
+
return freeze({
|
|
342
|
+
...clone(result),
|
|
343
|
+
verificationReceiptDigest: verified.verificationReceiptDigest,
|
|
344
|
+
});
|
|
345
|
+
};
|
|
222
346
|
const authority = Object.freeze({
|
|
223
347
|
tenantId,
|
|
224
348
|
deviceId,
|
|
225
349
|
async apply(input) {
|
|
226
|
-
if (
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
) {
|
|
231
|
-
throw new Error("dependency request crossed its authority boundary");
|
|
350
|
+
if (!isGovernedKnowledgeDependencyExecutionRequest(input, authority)) {
|
|
351
|
+
throw new TypeError(
|
|
352
|
+
"dependency execution requires a prepared executor request",
|
|
353
|
+
);
|
|
232
354
|
}
|
|
233
|
-
|
|
234
|
-
const result = validateResult(
|
|
235
|
-
await apply(request),
|
|
236
|
-
request,
|
|
237
|
-
providerDescriptor,
|
|
238
|
-
);
|
|
239
|
-
const verified = await verify({
|
|
240
|
-
request,
|
|
241
|
-
result,
|
|
242
|
-
providerDescriptor,
|
|
243
|
-
verifierDescriptor,
|
|
244
|
-
});
|
|
245
|
-
if (
|
|
246
|
-
verified?.authenticated !== true ||
|
|
247
|
-
verified.durable !== true ||
|
|
248
|
-
verified.tenantId !== tenantId ||
|
|
249
|
-
verified.deviceId !== deviceId ||
|
|
250
|
-
verified.operationId !== request.operationId ||
|
|
251
|
-
verified.requestDigest !== request.requestDigest ||
|
|
252
|
-
verified.resultDigest !== result.resultDigest ||
|
|
253
|
-
verified.providerAuthorityId !== providerDescriptor.authorityId ||
|
|
254
|
-
verified.providerRevision !== providerDescriptor.revision ||
|
|
255
|
-
verified.verifierAuthorityId !== verifierDescriptor.authorityId ||
|
|
256
|
-
verified.verifierRevision !== verifierDescriptor.revision ||
|
|
257
|
-
!DIGEST.test(verified.verificationReceiptDigest ?? "")
|
|
258
|
-
) {
|
|
259
|
-
throw new Error("dependency result was not independently verified");
|
|
260
|
-
}
|
|
261
|
-
return freeze({
|
|
262
|
-
...clone(result),
|
|
263
|
-
verificationReceiptDigest: verified.verificationReceiptDigest,
|
|
264
|
-
});
|
|
355
|
+
return executePrepared(input);
|
|
265
356
|
},
|
|
266
357
|
});
|
|
267
358
|
AUTHORITIES.add(authority);
|
|
359
|
+
PREPARED_EXECUTIONS.set(authority, executePrepared);
|
|
360
|
+
PREPARED_REVERIFIERS.set(
|
|
361
|
+
authority,
|
|
362
|
+
Object.freeze((input, result) => {
|
|
363
|
+
if (!isGovernedKnowledgeDependencyExecutionRequest(input, authority))
|
|
364
|
+
throw new TypeError(
|
|
365
|
+
"dependency verification requires a prepared executor request",
|
|
366
|
+
);
|
|
367
|
+
return executePrepared(input, { result });
|
|
368
|
+
}),
|
|
369
|
+
);
|
|
268
370
|
return authority;
|
|
269
371
|
}
|
|
270
372
|
|
|
373
|
+
export function createGovernedKnowledgeDependencyRouter({
|
|
374
|
+
tenantId,
|
|
375
|
+
deviceId,
|
|
376
|
+
routes,
|
|
377
|
+
} = {}) {
|
|
378
|
+
identifier(tenantId, "router tenantId");
|
|
379
|
+
identifier(deviceId, "router deviceId");
|
|
380
|
+
if (
|
|
381
|
+
!routes ||
|
|
382
|
+
typeof routes !== "object" ||
|
|
383
|
+
utilTypes.isProxy(routes) ||
|
|
384
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(routes))
|
|
385
|
+
) {
|
|
386
|
+
throw new TypeError("dependency routes must be a plain object");
|
|
387
|
+
}
|
|
388
|
+
const keys = Reflect.ownKeys(routes);
|
|
389
|
+
exact(routes, new Set(keys), "dependency routes");
|
|
390
|
+
const allowed = new Set([
|
|
391
|
+
"wiki/tombstone",
|
|
392
|
+
"wiki/quarantine",
|
|
393
|
+
"candidate/reject-candidate",
|
|
394
|
+
"candidate/quarantine",
|
|
395
|
+
"active-skill/rollback-active",
|
|
396
|
+
"active-skill/quarantine",
|
|
397
|
+
]);
|
|
398
|
+
if (!keys.length || keys.some((key) => !allowed.has(key)))
|
|
399
|
+
throw new TypeError("dependency route is unsupported");
|
|
400
|
+
const handlers = new Map();
|
|
401
|
+
for (const key of keys) {
|
|
402
|
+
const authority = routes[key];
|
|
403
|
+
const execute = PREPARED_EXECUTIONS.get(authority);
|
|
404
|
+
if (
|
|
405
|
+
!execute ||
|
|
406
|
+
authority.tenantId !== tenantId ||
|
|
407
|
+
authority.deviceId !== deviceId
|
|
408
|
+
) {
|
|
409
|
+
throw new TypeError(
|
|
410
|
+
"dependency route requires a genuine same-boundary leaf authority",
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
handlers.set(key, execute);
|
|
414
|
+
}
|
|
415
|
+
const router = Object.freeze({
|
|
416
|
+
tenantId,
|
|
417
|
+
deviceId,
|
|
418
|
+
async apply(input) {
|
|
419
|
+
if (!isGovernedKnowledgeDependencyExecutionRequest(input, router))
|
|
420
|
+
throw new TypeError(
|
|
421
|
+
"dependency routing requires a prepared executor request",
|
|
422
|
+
);
|
|
423
|
+
exact(input, INPUT_KEYS, "dependency routing input");
|
|
424
|
+
exact(input.dependency, DEPENDENCY_KEYS, "dependency route selection");
|
|
425
|
+
const execute = handlers.get(
|
|
426
|
+
`${input.dependency.kind}/${input.dependency.disposition}`,
|
|
427
|
+
);
|
|
428
|
+
if (!execute)
|
|
429
|
+
throw new Error("no real authority for this dependency disposition");
|
|
430
|
+
return execute(input);
|
|
431
|
+
},
|
|
432
|
+
});
|
|
433
|
+
AUTHORITIES.add(router);
|
|
434
|
+
PREPARED_REVERIFIERS.set(
|
|
435
|
+
router,
|
|
436
|
+
Object.freeze((input, result) => {
|
|
437
|
+
if (!isGovernedKnowledgeDependencyExecutionRequest(input, router))
|
|
438
|
+
throw new TypeError(
|
|
439
|
+
"dependency verification requires a prepared router request",
|
|
440
|
+
);
|
|
441
|
+
exact(input, INPUT_KEYS, "dependency verification input");
|
|
442
|
+
exact(input.dependency, DEPENDENCY_KEYS, "dependency verification route");
|
|
443
|
+
const execute = handlers.get(
|
|
444
|
+
`${input.dependency.kind}/${input.dependency.disposition}`,
|
|
445
|
+
);
|
|
446
|
+
if (!execute)
|
|
447
|
+
throw new Error("no real authority for dependency verification");
|
|
448
|
+
return execute(input, { result });
|
|
449
|
+
}),
|
|
450
|
+
);
|
|
451
|
+
return router;
|
|
452
|
+
}
|
|
453
|
+
|
|
271
454
|
export function isGovernedKnowledgeDependencyAuthority(value) {
|
|
272
455
|
return AUTHORITIES.has(value);
|
|
273
456
|
}
|
|
@@ -14,36 +14,37 @@ import {
|
|
|
14
14
|
GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
|
|
15
15
|
digestGovernedKnowledgeDependencyResult,
|
|
16
16
|
isGovernedKnowledgeDependencyAuthority,
|
|
17
|
+
captureGovernedKnowledgeDependencyReverifier,
|
|
17
18
|
} from "./governed-knowledge-dependency-authority.js";
|
|
18
19
|
import {
|
|
19
20
|
isGovernedKnowledgeExecutionRecord,
|
|
20
21
|
verifyGovernedKnowledgeRecord,
|
|
21
22
|
} from "./governed-knowledge-sync.js";
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
import {
|
|
25
|
+
GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA,
|
|
26
|
+
GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE,
|
|
27
|
+
GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT_CODE,
|
|
28
|
+
digestGovernedKnowledgeDependencyOperation,
|
|
29
|
+
verifyGovernedKnowledgeDependencyPrepared,
|
|
30
|
+
} from "./governed-knowledge-revocation-record.js";
|
|
31
|
+
export {
|
|
32
|
+
GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA,
|
|
33
|
+
GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE,
|
|
34
|
+
GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT_CODE,
|
|
35
|
+
digestGovernedKnowledgeDependencyOperation,
|
|
36
|
+
verifyGovernedKnowledgeDependencyPrepared,
|
|
37
|
+
} from "./governed-knowledge-revocation-record.js";
|
|
38
|
+
|
|
25
39
|
export const GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_SCHEMA =
|
|
26
40
|
"chainlesschain.governed-knowledge-dependencies-settled/v1";
|
|
27
|
-
export const GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE =
|
|
28
|
-
"knowledge.revocation-dependencies.prepared";
|
|
29
41
|
export const GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_EVENT_TYPE =
|
|
30
42
|
"knowledge.revocation-dependencies.settled";
|
|
31
|
-
export const GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT_CODE =
|
|
32
|
-
"CC_GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT";
|
|
33
|
-
|
|
34
43
|
const EXECUTORS = new WeakSet();
|
|
44
|
+
const EXECUTION_REQUESTS = new WeakMap();
|
|
35
45
|
const ARTIFACT_TYPE = "governed-knowledge-dependency-operation";
|
|
36
46
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
37
47
|
const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
|
|
38
|
-
const PREPARED_KEYS = new Set([
|
|
39
|
-
"deviceId",
|
|
40
|
-
"knowledge",
|
|
41
|
-
"operationDigest",
|
|
42
|
-
"preparedAt",
|
|
43
|
-
"recordDigest",
|
|
44
|
-
"schema",
|
|
45
|
-
"tenantId",
|
|
46
|
-
]);
|
|
47
48
|
const SETTLED_KEYS = new Set([
|
|
48
49
|
"deviceId",
|
|
49
50
|
"operationDigest",
|
|
@@ -139,15 +140,26 @@ function identifier(value, label) {
|
|
|
139
140
|
}
|
|
140
141
|
|
|
141
142
|
function capture(owner, method, label) {
|
|
143
|
+
if (!owner || typeof owner !== "object" || utilTypes.isProxy(owner)) {
|
|
144
|
+
throw new TypeError(`${label}.${method}() is required`);
|
|
145
|
+
}
|
|
146
|
+
const implementation = owner[method];
|
|
142
147
|
if (
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
utilTypes.isProxy(owner) ||
|
|
146
|
-
typeof owner[method] !== "function"
|
|
148
|
+
typeof implementation !== "function" ||
|
|
149
|
+
utilTypes.isProxy(implementation)
|
|
147
150
|
) {
|
|
148
|
-
throw new TypeError(`${label}.${method}()
|
|
151
|
+
throw new TypeError(`${label}.${method}() must be a non-proxy function`);
|
|
149
152
|
}
|
|
150
|
-
return (...args) => Reflect.apply(
|
|
153
|
+
return (...args) => Reflect.apply(implementation, owner, args);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function isGovernedKnowledgeDependencyExecutionRequest(
|
|
157
|
+
value,
|
|
158
|
+
authority,
|
|
159
|
+
) {
|
|
160
|
+
return (
|
|
161
|
+
EXECUTION_REQUESTS.has(value) && EXECUTION_REQUESTS.get(value) === authority
|
|
162
|
+
);
|
|
151
163
|
}
|
|
152
164
|
|
|
153
165
|
function descriptor(input) {
|
|
@@ -161,29 +173,6 @@ function descriptor(input) {
|
|
|
161
173
|
});
|
|
162
174
|
}
|
|
163
175
|
|
|
164
|
-
export function digestGovernedKnowledgeDependencyOperation({
|
|
165
|
-
tenantId,
|
|
166
|
-
deviceId,
|
|
167
|
-
knowledge,
|
|
168
|
-
}) {
|
|
169
|
-
return hash(GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA, {
|
|
170
|
-
tenantId,
|
|
171
|
-
deviceId,
|
|
172
|
-
knowledge,
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
function preparedCore(value) {
|
|
177
|
-
return {
|
|
178
|
-
schema: value.schema,
|
|
179
|
-
tenantId: value.tenantId,
|
|
180
|
-
deviceId: value.deviceId,
|
|
181
|
-
operationDigest: value.operationDigest,
|
|
182
|
-
knowledge: value.knowledge,
|
|
183
|
-
preparedAt: value.preparedAt,
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
|
|
187
176
|
function settledCore(value) {
|
|
188
177
|
return {
|
|
189
178
|
schema: value.schema,
|
|
@@ -243,31 +232,6 @@ function validateResult(
|
|
|
243
232
|
return freeze(clone(value));
|
|
244
233
|
}
|
|
245
234
|
|
|
246
|
-
function validatePrepared(value, descriptorValue) {
|
|
247
|
-
exact(value, PREPARED_KEYS, "dependency prepared record");
|
|
248
|
-
const knowledge = verifyGovernedKnowledgeRecord(value.knowledge, {
|
|
249
|
-
tenantId: descriptorValue.tenantId,
|
|
250
|
-
});
|
|
251
|
-
const operationDigest = digestGovernedKnowledgeDependencyOperation({
|
|
252
|
-
tenantId: descriptorValue.tenantId,
|
|
253
|
-
deviceId: descriptorValue.deviceId,
|
|
254
|
-
knowledge,
|
|
255
|
-
});
|
|
256
|
-
if (
|
|
257
|
-
value.schema !== GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA ||
|
|
258
|
-
value.tenantId !== descriptorValue.tenantId ||
|
|
259
|
-
value.deviceId !== descriptorValue.deviceId ||
|
|
260
|
-
!["tombstone", "revoke"].includes(knowledge.action) ||
|
|
261
|
-
value.operationDigest !== operationDigest ||
|
|
262
|
-
!Number.isFinite(Date.parse(value.preparedAt)) ||
|
|
263
|
-
value.recordDigest !==
|
|
264
|
-
hash(GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA, preparedCore(value))
|
|
265
|
-
) {
|
|
266
|
-
corrupt("dependency prepared record is invalid");
|
|
267
|
-
}
|
|
268
|
-
return freeze(clone(value));
|
|
269
|
-
}
|
|
270
|
-
|
|
271
235
|
function validateSettled(value, prepared, descriptorValue) {
|
|
272
236
|
exact(value, SETTLED_KEYS, "dependency settled record");
|
|
273
237
|
const { knowledge, operationDigest } = prepared;
|
|
@@ -305,6 +269,9 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
|
|
|
305
269
|
dependencyAuthority,
|
|
306
270
|
now = Date.now,
|
|
307
271
|
} = {}) {
|
|
272
|
+
if (new.target !== GovernedKnowledgeDependencyLedgerExecutor) {
|
|
273
|
+
throw new TypeError("dependency executors cannot be subclassed");
|
|
274
|
+
}
|
|
308
275
|
this.descriptor = descriptor(descriptorInput);
|
|
309
276
|
this._put = capture(artifactPorts, "putCanonical", "artifactPorts");
|
|
310
277
|
this._read = capture(ledger, "read", "ledger");
|
|
@@ -331,6 +298,9 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
|
|
|
331
298
|
}
|
|
332
299
|
this._resolveArtifact = ledgerArtifactResolver;
|
|
333
300
|
this._apply = capture(dependencyAuthority, "apply", "dependencyAuthority");
|
|
301
|
+
this._reverify =
|
|
302
|
+
captureGovernedKnowledgeDependencyReverifier(dependencyAuthority);
|
|
303
|
+
this._dependencyAuthority = dependencyAuthority;
|
|
334
304
|
this._now = now;
|
|
335
305
|
Object.freeze(this);
|
|
336
306
|
EXECUTORS.add(this);
|
|
@@ -401,7 +371,10 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
|
|
|
401
371
|
GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE,
|
|
402
372
|
);
|
|
403
373
|
if (!event) return null;
|
|
404
|
-
const record =
|
|
374
|
+
const record = verifyGovernedKnowledgeDependencyPrepared(
|
|
375
|
+
this._resolve(event),
|
|
376
|
+
this.descriptor,
|
|
377
|
+
);
|
|
405
378
|
if (
|
|
406
379
|
record.operationDigest !== operationDigest ||
|
|
407
380
|
event.decision !== "prepared" ||
|
|
@@ -528,7 +501,7 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
|
|
|
528
501
|
return this._prepared(operationDigest);
|
|
529
502
|
}
|
|
530
503
|
|
|
531
|
-
async _settle(prepared, results) {
|
|
504
|
+
async _settle(prepared, results, verifiedHead) {
|
|
532
505
|
const existing = this._settled(prepared);
|
|
533
506
|
if (existing) return existing;
|
|
534
507
|
const settledAt = this._timestamp();
|
|
@@ -547,6 +520,13 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
|
|
|
547
520
|
const preparedEntry = this._prepared(prepared.operationDigest);
|
|
548
521
|
if (!preparedEntry) corrupt("cannot settle unprepared dependencies");
|
|
549
522
|
const head = this._verifyLedger();
|
|
523
|
+
if (
|
|
524
|
+
!verifiedHead ||
|
|
525
|
+
["epoch", "ledgerId", "identityDigest", "sequence", "headDigest"].some(
|
|
526
|
+
(key) => verifiedHead[key] !== head[key],
|
|
527
|
+
)
|
|
528
|
+
)
|
|
529
|
+
corrupt("dependency effects changed before settlement authorization");
|
|
550
530
|
const ref = this._publishArtifact(record);
|
|
551
531
|
const eventId = `${GOVERNED_KNOWLEDGE_DEPENDENCY_SETTLED_EVENT_TYPE}.${prepared.operationDigest.slice(7)}`;
|
|
552
532
|
try {
|
|
@@ -585,6 +565,9 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
|
|
|
585
565
|
}
|
|
586
566
|
|
|
587
567
|
async execute(knowledgeInput) {
|
|
568
|
+
if (!EXECUTORS.has(this)) {
|
|
569
|
+
throw new TypeError("dependency execution requires its branded executor");
|
|
570
|
+
}
|
|
588
571
|
const knowledge = verifyGovernedKnowledgeRecord(knowledgeInput, {
|
|
589
572
|
tenantId: this.descriptor.tenantId,
|
|
590
573
|
});
|
|
@@ -599,24 +582,51 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
|
|
|
599
582
|
const prepared = this._prepared(operationDigest);
|
|
600
583
|
const completed = prepared ? this._settled(prepared.record) : null;
|
|
601
584
|
if (completed) return this._result(completed.record, knowledge, true);
|
|
602
|
-
await this._prepare(
|
|
585
|
+
const durablePrepare = await this._prepare(
|
|
586
|
+
knowledgeInput,
|
|
587
|
+
knowledge,
|
|
588
|
+
operationDigest,
|
|
589
|
+
);
|
|
590
|
+
if (
|
|
591
|
+
!durablePrepare ||
|
|
592
|
+
durablePrepare.record.operationDigest !== operationDigest ||
|
|
593
|
+
canonical(durablePrepare.record.knowledge) !== canonical(knowledge)
|
|
594
|
+
) {
|
|
595
|
+
corrupt("dependency prepare was not durably read back");
|
|
596
|
+
}
|
|
603
597
|
const results = [];
|
|
598
|
+
const requests = [];
|
|
604
599
|
for (const dependency of knowledge.dependencies) {
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
);
|
|
600
|
+
const request = freeze({
|
|
601
|
+
tenantId: this.descriptor.tenantId,
|
|
602
|
+
deviceId: this.descriptor.deviceId,
|
|
603
|
+
operationDigest,
|
|
604
|
+
knowledge,
|
|
605
|
+
dependency,
|
|
606
|
+
});
|
|
607
|
+
EXECUTION_REQUESTS.set(request, this._dependencyAuthority);
|
|
608
|
+
requests.push(request);
|
|
609
|
+
results.push(await this._apply(request));
|
|
614
610
|
}
|
|
615
|
-
|
|
611
|
+
// All effects must still hold together at one authenticated head. Earlier
|
|
612
|
+
// per-effect checks may predate later dependencies or a concurrent writer.
|
|
613
|
+
// This path only rereads/verifies; it never repeats provider side effects.
|
|
614
|
+
const verifiedHead = this._verifyLedger();
|
|
615
|
+
const verifiedResults = [];
|
|
616
|
+
for (const [index, request] of requests.entries())
|
|
617
|
+
verifiedResults.push(await this._reverify(request, results[index]));
|
|
618
|
+
const settled = await this._settle(
|
|
619
|
+
{ operationDigest, knowledge },
|
|
620
|
+
verifiedResults,
|
|
621
|
+
verifiedHead,
|
|
622
|
+
);
|
|
616
623
|
return this._result(settled.record, knowledge, prepared !== null);
|
|
617
624
|
}
|
|
618
625
|
|
|
619
626
|
async resume({ operationDigest } = {}) {
|
|
627
|
+
if (!EXECUTORS.has(this)) {
|
|
628
|
+
throw new TypeError("dependency recovery requires its branded executor");
|
|
629
|
+
}
|
|
620
630
|
if (!DIGEST.test(operationDigest ?? "")) {
|
|
621
631
|
throw new TypeError("operationDigest is invalid");
|
|
622
632
|
}
|
|
@@ -641,6 +651,8 @@ export class GovernedKnowledgeDependencyLedgerExecutor {
|
|
|
641
651
|
}
|
|
642
652
|
}
|
|
643
653
|
|
|
654
|
+
Object.freeze(GovernedKnowledgeDependencyLedgerExecutor.prototype);
|
|
655
|
+
|
|
644
656
|
export function isGovernedKnowledgeDependencyExecutor(value) {
|
|
645
657
|
return EXECUTORS.has(value);
|
|
646
658
|
}
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
} from "./governed-knowledge-conflict-merge.js";
|
|
16
16
|
import {
|
|
17
17
|
GOVERNED_KNOWLEDGE_MERGE_PUBLISH_REQUEST_SCHEMA,
|
|
18
|
+
GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_LEGACY_SCHEMA,
|
|
18
19
|
GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_SCHEMA,
|
|
19
20
|
digestGovernedKnowledgeMergePublishResult,
|
|
20
21
|
isGovernedKnowledgeMergePublisherAuthority,
|
|
@@ -55,6 +56,11 @@ const SETTLED_KEYS = new Set([
|
|
|
55
56
|
]);
|
|
56
57
|
const PUBLISH_EVIDENCE_KEYS = new Set([
|
|
57
58
|
"attestation",
|
|
59
|
+
"artifactCandidateDigest",
|
|
60
|
+
"artifactDigest",
|
|
61
|
+
"artifactReleaseId",
|
|
62
|
+
"artifactTransitionOperationId",
|
|
63
|
+
"artifactTransitionReceiptDigest",
|
|
58
64
|
"deviceId",
|
|
59
65
|
"durable",
|
|
60
66
|
"envelopeDigest",
|
|
@@ -73,6 +79,9 @@ const PUBLISH_EVIDENCE_KEYS = new Set([
|
|
|
73
79
|
"tenantId",
|
|
74
80
|
"verificationReceiptDigest",
|
|
75
81
|
]);
|
|
82
|
+
const LEGACY_PUBLISH_EVIDENCE_KEYS = new Set(
|
|
83
|
+
[...PUBLISH_EVIDENCE_KEYS].filter((key) => !key.startsWith("artifact")),
|
|
84
|
+
);
|
|
76
85
|
|
|
77
86
|
function canonical(value) {
|
|
78
87
|
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
@@ -181,7 +190,13 @@ function settledCore(value) {
|
|
|
181
190
|
}
|
|
182
191
|
|
|
183
192
|
function validatePublishEvidence(value, plan, descriptorValue) {
|
|
184
|
-
|
|
193
|
+
const legacy =
|
|
194
|
+
value?.schema === GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_LEGACY_SCHEMA;
|
|
195
|
+
exact(
|
|
196
|
+
value,
|
|
197
|
+
legacy ? LEGACY_PUBLISH_EVIDENCE_KEYS : PUBLISH_EVIDENCE_KEYS,
|
|
198
|
+
"merge publish evidence",
|
|
199
|
+
);
|
|
185
200
|
const requestCore = {
|
|
186
201
|
schema: GOVERNED_KNOWLEDGE_MERGE_PUBLISH_REQUEST_SCHEMA,
|
|
187
202
|
tenantId: plan.tenantId,
|
|
@@ -193,7 +208,10 @@ function validatePublishEvidence(value, plan, descriptorValue) {
|
|
|
193
208
|
mergedKnowledge: plan.mergedKnowledge,
|
|
194
209
|
};
|
|
195
210
|
if (
|
|
196
|
-
|
|
211
|
+
![
|
|
212
|
+
GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_SCHEMA,
|
|
213
|
+
GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_LEGACY_SCHEMA,
|
|
214
|
+
].includes(value.schema) ||
|
|
197
215
|
value.tenantId !== descriptorValue.tenantId ||
|
|
198
216
|
value.deviceId !== descriptorValue.deviceId ||
|
|
199
217
|
value.operationId !== `knowledge-merge:${plan.planDigest.slice(7)}` ||
|
|
@@ -207,6 +225,15 @@ function validatePublishEvidence(value, plan, descriptorValue) {
|
|
|
207
225
|
!DIGEST.test(value.envelopeDigest ?? "") ||
|
|
208
226
|
!DIGEST.test(value.resultDigest ?? "") ||
|
|
209
227
|
!DIGEST.test(value.verificationReceiptDigest ?? "") ||
|
|
228
|
+
(!legacy &&
|
|
229
|
+
(!DIGEST.test(value.artifactCandidateDigest ?? "") ||
|
|
230
|
+
!DIGEST.test(value.artifactDigest ?? "") ||
|
|
231
|
+
!ID.test(value.artifactReleaseId ?? "") ||
|
|
232
|
+
!ID.test(value.artifactTransitionOperationId ?? "") ||
|
|
233
|
+
!value.artifactTransitionOperationId.startsWith(
|
|
234
|
+
"artifact-transition:",
|
|
235
|
+
) ||
|
|
236
|
+
!DIGEST.test(value.artifactTransitionReceiptDigest ?? ""))) ||
|
|
210
237
|
value.resultDigest !== digestGovernedKnowledgeMergePublishResult(value)
|
|
211
238
|
) {
|
|
212
239
|
corrupt("merge publish evidence is not exactly bound");
|