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
|
@@ -5,8 +5,10 @@ import { verifyGovernedKnowledgeMergePlan } from "./governed-knowledge-conflict-
|
|
|
5
5
|
|
|
6
6
|
export const GOVERNED_KNOWLEDGE_MERGE_PUBLISH_REQUEST_SCHEMA =
|
|
7
7
|
"chainlesschain.governed-knowledge-merge-publish-request/v1";
|
|
8
|
-
export const
|
|
8
|
+
export const GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_LEGACY_SCHEMA =
|
|
9
9
|
"chainlesschain.governed-knowledge-merge-publish-result/v1";
|
|
10
|
+
export const GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_SCHEMA =
|
|
11
|
+
"chainlesschain.governed-knowledge-merge-publish-result/v2";
|
|
10
12
|
|
|
11
13
|
const AUTHORITIES = new WeakSet();
|
|
12
14
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
@@ -20,6 +22,11 @@ const DESCRIPTOR_KEYS = new Set([
|
|
|
20
22
|
]);
|
|
21
23
|
const RESULT_KEYS = new Set([
|
|
22
24
|
"attestation",
|
|
25
|
+
"artifactCandidateDigest",
|
|
26
|
+
"artifactDigest",
|
|
27
|
+
"artifactReleaseId",
|
|
28
|
+
"artifactTransitionOperationId",
|
|
29
|
+
"artifactTransitionReceiptDigest",
|
|
23
30
|
"deviceId",
|
|
24
31
|
"durable",
|
|
25
32
|
"envelopeDigest",
|
|
@@ -166,6 +173,12 @@ function validateResult(input, request, providerDescriptor, now) {
|
|
|
166
173
|
providerDescriptor.handlerArtifactDigest ||
|
|
167
174
|
result.durable !== true ||
|
|
168
175
|
result.idempotent !== true ||
|
|
176
|
+
!DIGEST.test(result.artifactCandidateDigest ?? "") ||
|
|
177
|
+
!DIGEST.test(result.artifactDigest ?? "") ||
|
|
178
|
+
!ID.test(result.artifactReleaseId ?? "") ||
|
|
179
|
+
!ID.test(result.artifactTransitionOperationId ?? "") ||
|
|
180
|
+
!result.artifactTransitionOperationId.startsWith("artifact-transition:") ||
|
|
181
|
+
!DIGEST.test(result.artifactTransitionReceiptDigest ?? "") ||
|
|
169
182
|
!DIGEST.test(result.envelopeDigest ?? "") ||
|
|
170
183
|
!DIGEST.test(result.resultDigest ?? "") ||
|
|
171
184
|
result.resultDigest !==
|
|
@@ -194,7 +207,15 @@ export function digestGovernedKnowledgeMergePublishResult(value) {
|
|
|
194
207
|
delete core.resultDigest;
|
|
195
208
|
delete core.attestation;
|
|
196
209
|
delete core.verificationReceiptDigest;
|
|
197
|
-
|
|
210
|
+
if (
|
|
211
|
+
![
|
|
212
|
+
GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_SCHEMA,
|
|
213
|
+
GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_LEGACY_SCHEMA,
|
|
214
|
+
].includes(value.schema)
|
|
215
|
+
) {
|
|
216
|
+
throw new TypeError("merge publish result schema is invalid");
|
|
217
|
+
}
|
|
218
|
+
return hash(value.schema, core);
|
|
198
219
|
}
|
|
199
220
|
|
|
200
221
|
export function createGovernedKnowledgeMergePublisherAuthority({
|
|
@@ -236,7 +257,7 @@ export function createGovernedKnowledgeMergePublisherAuthority({
|
|
|
236
257
|
throw new TypeError("merge publisher authority clock is invalid");
|
|
237
258
|
}
|
|
238
259
|
const result = validateResult(
|
|
239
|
-
await publish(request),
|
|
260
|
+
await publish(request, plan),
|
|
240
261
|
request,
|
|
241
262
|
providerDescriptor,
|
|
242
263
|
currentTime,
|
|
@@ -257,6 +278,13 @@ export function createGovernedKnowledgeMergePublisherAuthority({
|
|
|
257
278
|
verified.planDigest !== plan.planDigest ||
|
|
258
279
|
verified.resultDigest !== result.resultDigest ||
|
|
259
280
|
verified.envelopeDigest !== result.envelopeDigest ||
|
|
281
|
+
verified.artifactCandidateDigest !== result.artifactCandidateDigest ||
|
|
282
|
+
verified.artifactDigest !== result.artifactDigest ||
|
|
283
|
+
verified.artifactReleaseId !== result.artifactReleaseId ||
|
|
284
|
+
verified.artifactTransitionOperationId !==
|
|
285
|
+
result.artifactTransitionOperationId ||
|
|
286
|
+
verified.artifactTransitionReceiptDigest !==
|
|
287
|
+
result.artifactTransitionReceiptDigest ||
|
|
260
288
|
verified.providerAuthorityId !== providerDescriptor.authorityId ||
|
|
261
289
|
verified.providerRevision !== providerDescriptor.revision ||
|
|
262
290
|
verified.verifierAuthorityId !== verifierDescriptor.authorityId ||
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { types as utilTypes } from "node:util";
|
|
2
|
+
|
|
3
|
+
// Pure wire-record validation shared by synchronization and mandatory Ledger
|
|
4
|
+
// admission. This module cannot mint execution brands or access persistence.
|
|
5
|
+
export const GOVERNED_KNOWLEDGE_SYNC_SCHEMA =
|
|
6
|
+
"chainlesschain.governed-evolution-knowledge-sync/v1";
|
|
7
|
+
export const GOVERNED_KNOWLEDGE_SCOPE = Object.freeze({
|
|
8
|
+
PERSONAL: "personal",
|
|
9
|
+
PROJECT: "project",
|
|
10
|
+
TEAM: "team",
|
|
11
|
+
ORG: "org",
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
15
|
+
const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
|
|
16
|
+
const SCOPES = new Set(Object.values(GOVERNED_KNOWLEDGE_SCOPE));
|
|
17
|
+
const ACTIONS = new Set(["upsert", "tombstone", "revoke"]);
|
|
18
|
+
// A durable receipt for a different kind of effect is not a revocation.
|
|
19
|
+
// In particular, tombstoning metadata must never count as stopping an active Skill.
|
|
20
|
+
const REVOCATION_DISPOSITIONS = new Map([
|
|
21
|
+
["wiki", new Set(["tombstone", "quarantine"])],
|
|
22
|
+
["candidate", new Set(["reject-candidate", "quarantine"])],
|
|
23
|
+
["active-skill", new Set(["rollback-active", "quarantine"])],
|
|
24
|
+
]);
|
|
25
|
+
function freeze(value) {
|
|
26
|
+
if (value && typeof value === "object" && !Object.isFrozen(value)) {
|
|
27
|
+
Object.freeze(value);
|
|
28
|
+
for (const child of Object.values(value)) freeze(child);
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function record(value, label) {
|
|
34
|
+
if (
|
|
35
|
+
!value ||
|
|
36
|
+
typeof value !== "object" ||
|
|
37
|
+
Array.isArray(value) ||
|
|
38
|
+
utilTypes.isProxy(value) ||
|
|
39
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(value))
|
|
40
|
+
)
|
|
41
|
+
throw new TypeError(`${label} must be a plain object`);
|
|
42
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
43
|
+
const property = Object.getOwnPropertyDescriptor(value, key);
|
|
44
|
+
if (typeof key !== "string" || !Object.hasOwn(property, "value"))
|
|
45
|
+
throw new TypeError(`${label} must contain only data properties`);
|
|
46
|
+
}
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function id(value, label) {
|
|
51
|
+
if (typeof value !== "string" || !ID.test(value))
|
|
52
|
+
throw new TypeError(`${label} is invalid`);
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function digest(value, label) {
|
|
57
|
+
if (typeof value !== "string" || !DIGEST.test(value))
|
|
58
|
+
throw new TypeError(`${label} must be sha256-bound`);
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function vectorClock(value) {
|
|
63
|
+
record(value, "vectorClock");
|
|
64
|
+
const entries = Object.entries(value);
|
|
65
|
+
if (entries.length < 1 || entries.length > 64)
|
|
66
|
+
throw new TypeError("vectorClock is empty or unbounded");
|
|
67
|
+
const result = {};
|
|
68
|
+
for (const [deviceId, revision] of entries.sort(([a], [b]) =>
|
|
69
|
+
a.localeCompare(b),
|
|
70
|
+
)) {
|
|
71
|
+
id(deviceId, "vectorClock device");
|
|
72
|
+
if (!Number.isSafeInteger(revision) || revision < 0)
|
|
73
|
+
throw new TypeError("vectorClock revision is invalid");
|
|
74
|
+
result[deviceId] = revision;
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function normalizeDependencies(value, action) {
|
|
80
|
+
if (!Array.isArray(value) || utilTypes.isProxy(value) || value.length > 256)
|
|
81
|
+
throw new TypeError("dependency dispositions are unbounded");
|
|
82
|
+
const seen = new Set();
|
|
83
|
+
const result = [];
|
|
84
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
85
|
+
const property = Object.getOwnPropertyDescriptor(value, String(index));
|
|
86
|
+
if (!property || !Object.hasOwn(property, "value"))
|
|
87
|
+
throw new TypeError("dependency dispositions must be dense data");
|
|
88
|
+
const entry = property.value;
|
|
89
|
+
record(entry, "dependency disposition");
|
|
90
|
+
const normalized = {
|
|
91
|
+
kind: id(entry.kind, "dependency kind"),
|
|
92
|
+
digest: digest(entry.digest, "dependency digest"),
|
|
93
|
+
disposition: id(entry.disposition, "dependency disposition"),
|
|
94
|
+
};
|
|
95
|
+
const key = `${normalized.kind}:${normalized.digest}`;
|
|
96
|
+
if (seen.has(key)) throw new TypeError("duplicate dependency disposition");
|
|
97
|
+
seen.add(key);
|
|
98
|
+
if (
|
|
99
|
+
["tombstone", "revoke"].includes(action) &&
|
|
100
|
+
!REVOCATION_DISPOSITIONS.get(normalized.kind)?.has(normalized.disposition)
|
|
101
|
+
)
|
|
102
|
+
throw new TypeError("revocation dependency disposition is unsafe");
|
|
103
|
+
result.push(normalized);
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function normalizeRecord(input, descriptor) {
|
|
109
|
+
record(input, "knowledge record");
|
|
110
|
+
const action = ACTIONS.has(input.action) ? input.action : null;
|
|
111
|
+
const scope = SCOPES.has(input.scope) ? input.scope : null;
|
|
112
|
+
if (!action || !scope || input.tenantId !== descriptor.tenantId)
|
|
113
|
+
throw new TypeError("knowledge record boundary is invalid");
|
|
114
|
+
const dependencies = normalizeDependencies(input.dependencies || [], action);
|
|
115
|
+
if (
|
|
116
|
+
["team", "org"].includes(scope) &&
|
|
117
|
+
!DIGEST.test(input.approvalReceiptDigest || "")
|
|
118
|
+
)
|
|
119
|
+
throw new TypeError("shared knowledge requires approval");
|
|
120
|
+
if (
|
|
121
|
+
["tombstone", "revoke"].includes(action) &&
|
|
122
|
+
(!DIGEST.test(input.revocationReceiptDigest || "") ||
|
|
123
|
+
dependencies.length < 1)
|
|
124
|
+
)
|
|
125
|
+
throw new TypeError(
|
|
126
|
+
"revocation must bind its receipt and dependency graph",
|
|
127
|
+
);
|
|
128
|
+
const normalized = freeze({
|
|
129
|
+
schema: GOVERNED_KNOWLEDGE_SYNC_SCHEMA,
|
|
130
|
+
tenantId: descriptor.tenantId,
|
|
131
|
+
knowledgeId: id(input.knowledgeId, "knowledgeId"),
|
|
132
|
+
scope,
|
|
133
|
+
scopeId: id(input.scopeId, "scopeId"),
|
|
134
|
+
action,
|
|
135
|
+
contentDigest: digest(input.contentDigest, "contentDigest"),
|
|
136
|
+
vectorClock: vectorClock(input.vectorClock),
|
|
137
|
+
approvalReceiptDigest: input.approvalReceiptDigest || null,
|
|
138
|
+
revocationReceiptDigest: input.revocationReceiptDigest || null,
|
|
139
|
+
dependencies,
|
|
140
|
+
});
|
|
141
|
+
return normalized;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export function verifyGovernedKnowledgeRecord(input, { tenantId } = {}) {
|
|
145
|
+
return normalizeRecord(input, { tenantId: id(tenantId, "tenantId") });
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export { vectorClock as normalizeGovernedKnowledgeVectorClock };
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { types as utilTypes } from "node:util";
|
|
3
|
+
import { verifyGovernedKnowledgeRecord } from "./governed-knowledge-record.js";
|
|
4
|
+
|
|
5
|
+
// Immutable prepared-record protocol only; no executor, writer, or authority brand.
|
|
6
|
+
export const GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA =
|
|
7
|
+
"chainlesschain.governed-knowledge-dependencies-prepared/v1";
|
|
8
|
+
export const GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_EVENT_TYPE =
|
|
9
|
+
"knowledge.revocation-dependencies.prepared";
|
|
10
|
+
export const GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT_CODE =
|
|
11
|
+
"CC_GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT";
|
|
12
|
+
|
|
13
|
+
const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
|
|
14
|
+
const PREPARED_KEYS = new Set([
|
|
15
|
+
"deviceId",
|
|
16
|
+
"knowledge",
|
|
17
|
+
"operationDigest",
|
|
18
|
+
"preparedAt",
|
|
19
|
+
"recordDigest",
|
|
20
|
+
"schema",
|
|
21
|
+
"tenantId",
|
|
22
|
+
]);
|
|
23
|
+
function canonical(value) {
|
|
24
|
+
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
25
|
+
if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
|
|
26
|
+
return `{${Object.keys(value)
|
|
27
|
+
.sort()
|
|
28
|
+
.map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
|
|
29
|
+
.join(",")}}`;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function hash(domain, value) {
|
|
33
|
+
return `sha256:${createHash("sha256")
|
|
34
|
+
.update(domain)
|
|
35
|
+
.update("\0")
|
|
36
|
+
.update(canonical(value))
|
|
37
|
+
.digest("hex")}`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function clone(value) {
|
|
41
|
+
return structuredClone(value);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function freeze(value) {
|
|
45
|
+
if (value && typeof value === "object" && !Object.isFrozen(value)) {
|
|
46
|
+
Object.freeze(value);
|
|
47
|
+
for (const child of Object.values(value)) freeze(child);
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function corrupt(message) {
|
|
53
|
+
const error = new Error(message);
|
|
54
|
+
error.code = GOVERNED_KNOWLEDGE_DEPENDENCY_LEDGER_CORRUPT_CODE;
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function exact(value, keys, label) {
|
|
59
|
+
if (
|
|
60
|
+
!value ||
|
|
61
|
+
typeof value !== "object" ||
|
|
62
|
+
Array.isArray(value) ||
|
|
63
|
+
utilTypes.isProxy(value) ||
|
|
64
|
+
![Object.prototype, null].includes(Object.getPrototypeOf(value))
|
|
65
|
+
) {
|
|
66
|
+
corrupt(`${label} is not a plain object`);
|
|
67
|
+
}
|
|
68
|
+
const actual = Reflect.ownKeys(value);
|
|
69
|
+
if (
|
|
70
|
+
actual.length !== keys.size ||
|
|
71
|
+
actual.some((key) => typeof key !== "string" || !keys.has(key))
|
|
72
|
+
) {
|
|
73
|
+
corrupt(`${label} has an invalid shape`);
|
|
74
|
+
}
|
|
75
|
+
return value;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function identifier(value, label) {
|
|
79
|
+
if (typeof value !== "string" || !ID.test(value)) {
|
|
80
|
+
throw new TypeError(`${label} is invalid`);
|
|
81
|
+
}
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function digestGovernedKnowledgeDependencyOperation({
|
|
86
|
+
tenantId,
|
|
87
|
+
deviceId,
|
|
88
|
+
knowledge,
|
|
89
|
+
}) {
|
|
90
|
+
return hash(GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA, {
|
|
91
|
+
tenantId,
|
|
92
|
+
deviceId,
|
|
93
|
+
knowledge,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function preparedCore(value) {
|
|
98
|
+
return {
|
|
99
|
+
schema: value.schema,
|
|
100
|
+
tenantId: value.tenantId,
|
|
101
|
+
deviceId: value.deviceId,
|
|
102
|
+
operationDigest: value.operationDigest,
|
|
103
|
+
knowledge: value.knowledge,
|
|
104
|
+
preparedAt: value.preparedAt,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function verifyGovernedKnowledgeDependencyPrepared(
|
|
109
|
+
value,
|
|
110
|
+
descriptorValue,
|
|
111
|
+
) {
|
|
112
|
+
exact(value, PREPARED_KEYS, "dependency prepared record");
|
|
113
|
+
identifier(value.deviceId, "dependency prepared deviceId");
|
|
114
|
+
const knowledge = verifyGovernedKnowledgeRecord(value.knowledge, {
|
|
115
|
+
tenantId: descriptorValue.tenantId,
|
|
116
|
+
});
|
|
117
|
+
const operationDigest = digestGovernedKnowledgeDependencyOperation({
|
|
118
|
+
tenantId: descriptorValue.tenantId,
|
|
119
|
+
deviceId: descriptorValue.deviceId,
|
|
120
|
+
knowledge,
|
|
121
|
+
});
|
|
122
|
+
if (
|
|
123
|
+
value.schema !== GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA ||
|
|
124
|
+
value.tenantId !== descriptorValue.tenantId ||
|
|
125
|
+
value.deviceId !== descriptorValue.deviceId ||
|
|
126
|
+
!["tombstone", "revoke"].includes(knowledge.action) ||
|
|
127
|
+
value.operationDigest !== operationDigest ||
|
|
128
|
+
!Number.isFinite(Date.parse(value.preparedAt)) ||
|
|
129
|
+
value.recordDigest !==
|
|
130
|
+
hash(GOVERNED_KNOWLEDGE_DEPENDENCY_PREPARED_SCHEMA, preparedCore(value))
|
|
131
|
+
) {
|
|
132
|
+
corrupt("dependency prepared record is invalid");
|
|
133
|
+
}
|
|
134
|
+
return freeze(clone(value));
|
|
135
|
+
}
|