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
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
} from "./governed-knowledge-merge-publisher-authority.js";
|
|
9
9
|
import { isGovernedKnowledgeSync } from "./governed-knowledge-sync.js";
|
|
10
10
|
import { isGovernedKnowledgePublicationReader } from "./governed-knowledge-sync-ledger-adapter.js";
|
|
11
|
+
import { isEvolvableArtifactTransitionReader } from "./evolvable-artifact-ledger-adapter.js";
|
|
11
12
|
|
|
12
13
|
export const GOVERNED_KNOWLEDGE_SYNC_MERGE_VERIFICATION_SCHEMA =
|
|
13
14
|
"chainlesschain.governed-knowledge-sync-merge-verification/v1";
|
|
@@ -121,6 +122,7 @@ function verifyStoredPublication(record, request, envelope = null) {
|
|
|
121
122
|
|
|
122
123
|
export function createGovernedKnowledgeSyncMergePublisherAuthority({
|
|
123
124
|
sync,
|
|
125
|
+
verifierArtifactTransitionReader,
|
|
124
126
|
providerPublicationReader,
|
|
125
127
|
verifierPublicationReader,
|
|
126
128
|
providerDescriptor,
|
|
@@ -142,9 +144,22 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
|
|
|
142
144
|
}
|
|
143
145
|
const tenantId = sync.tenantId;
|
|
144
146
|
const deviceId = sync.deviceId;
|
|
147
|
+
if (
|
|
148
|
+
!isEvolvableArtifactTransitionReader(verifierArtifactTransitionReader) ||
|
|
149
|
+
verifierArtifactTransitionReader.tenantId !== tenantId
|
|
150
|
+
) {
|
|
151
|
+
throw new TypeError(
|
|
152
|
+
"an independent tenant-bound artifact transition reader is required",
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
const readArtifactTransition = capture(
|
|
156
|
+
verifierArtifactTransitionReader,
|
|
157
|
+
"readTransition",
|
|
158
|
+
"verifierArtifactTransitionReader",
|
|
159
|
+
);
|
|
145
160
|
const providerIdentity = descriptor(providerDescriptor, "provider");
|
|
146
161
|
const verifierIdentity = descriptor(verifierDescriptor, "verifier");
|
|
147
|
-
const publish = capture(sync, "
|
|
162
|
+
const publish = capture(sync, "publishWithArtifactEvidence", "sync");
|
|
148
163
|
const readProviderPublication = bindReader(
|
|
149
164
|
providerPublicationReader,
|
|
150
165
|
tenantId,
|
|
@@ -158,10 +173,14 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
|
|
|
158
173
|
"verifierPublicationReader",
|
|
159
174
|
);
|
|
160
175
|
const provider = Object.freeze({
|
|
161
|
-
async publish(request) {
|
|
162
|
-
const
|
|
176
|
+
async publish(request, plan) {
|
|
177
|
+
const published = await publish(request.mergedKnowledge, {
|
|
163
178
|
operationId: request.operationId,
|
|
179
|
+
artifactOperation: "merge",
|
|
180
|
+
artifactEvidenceDigest: plan.humanReceiptDigest,
|
|
181
|
+
artifactHumanReviewed: true,
|
|
164
182
|
});
|
|
183
|
+
const { envelope, artifact } = published;
|
|
165
184
|
const stored = verifyStoredPublication(
|
|
166
185
|
await readProviderPublication({ operationId: request.operationId }),
|
|
167
186
|
request,
|
|
@@ -184,6 +203,12 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
|
|
|
184
203
|
knowledgeId: request.knowledgeId,
|
|
185
204
|
mergedContentDigest: request.mergedContentDigest,
|
|
186
205
|
envelopeDigest: stored.envelopeDigest,
|
|
206
|
+
artifactCandidateDigest: artifact.artifactCandidateDigest,
|
|
207
|
+
artifactDigest: artifact.artifactDigest,
|
|
208
|
+
artifactReleaseId: artifact.artifactReleaseId,
|
|
209
|
+
artifactTransitionOperationId: artifact.artifactTransitionOperationId,
|
|
210
|
+
artifactTransitionReceiptDigest:
|
|
211
|
+
artifact.artifactTransitionReceiptDigest,
|
|
187
212
|
providerAuthorityId: providerIdentity.authorityId,
|
|
188
213
|
providerRevision: providerIdentity.revision,
|
|
189
214
|
providerHandlerArtifactDigest: providerIdentity.handlerArtifactDigest,
|
|
@@ -204,13 +229,30 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
|
|
|
204
229
|
await readVerifierPublication({ operationId: request.operationId }),
|
|
205
230
|
request,
|
|
206
231
|
);
|
|
232
|
+
const transition = await readArtifactTransition({
|
|
233
|
+
operationId: result.artifactTransitionOperationId,
|
|
234
|
+
});
|
|
207
235
|
if (
|
|
208
236
|
result.envelopeDigest !== stored.envelopeDigest ||
|
|
209
237
|
Date.parse(result.publishedAt) < Date.parse(stored.committedAt) ||
|
|
210
238
|
canonical(result.attestation) !==
|
|
211
239
|
canonical(stored.envelope.signature) ||
|
|
212
240
|
result.resultDigest !==
|
|
213
|
-
digestGovernedKnowledgeMergePublishResult(result)
|
|
241
|
+
digestGovernedKnowledgeMergePublishResult(result) ||
|
|
242
|
+
transition?.request?.previousArtifactDigest !==
|
|
243
|
+
result.artifactCandidateDigest ||
|
|
244
|
+
transition.request.nextArtifactDigest !== result.artifactDigest ||
|
|
245
|
+
transition.artifact.artifactDigest !== result.artifactDigest ||
|
|
246
|
+
transition.artifact.activeReleaseId !== result.artifactReleaseId ||
|
|
247
|
+
transition.artifact.contentDigest !== request.mergedContentDigest ||
|
|
248
|
+
transition.artifact.runtimeManifest.operation !== "merge" ||
|
|
249
|
+
transition.artifact.runtimeManifest.operationId !==
|
|
250
|
+
request.operationId ||
|
|
251
|
+
transition.receipt.operationId !==
|
|
252
|
+
result.artifactTransitionOperationId ||
|
|
253
|
+
transition.receipt.receiptDigest !==
|
|
254
|
+
result.artifactTransitionReceiptDigest ||
|
|
255
|
+
transition.receipt.durable !== true
|
|
214
256
|
) {
|
|
215
257
|
throw new Error("merge publication result differs from durable state");
|
|
216
258
|
}
|
|
@@ -224,6 +266,12 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
|
|
|
224
266
|
resultDigest: result.resultDigest,
|
|
225
267
|
envelopeDigest: stored.envelopeDigest,
|
|
226
268
|
publicationRecordDigest: stored.recordDigest,
|
|
269
|
+
artifactCandidateDigest: result.artifactCandidateDigest,
|
|
270
|
+
artifactDigest: result.artifactDigest,
|
|
271
|
+
artifactReleaseId: result.artifactReleaseId,
|
|
272
|
+
artifactTransitionOperationId: result.artifactTransitionOperationId,
|
|
273
|
+
artifactTransitionReceiptDigest:
|
|
274
|
+
result.artifactTransitionReceiptDigest,
|
|
227
275
|
verifierAuthorityId: verifierIdentity.authorityId,
|
|
228
276
|
verifierRevision: verifierIdentity.revision,
|
|
229
277
|
verifierHandlerArtifactDigest: verifierIdentity.handlerArtifactDigest,
|
|
@@ -239,6 +287,11 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
|
|
|
239
287
|
planDigest: request.planDigest,
|
|
240
288
|
resultDigest: result.resultDigest,
|
|
241
289
|
envelopeDigest: stored.envelopeDigest,
|
|
290
|
+
artifactCandidateDigest: result.artifactCandidateDigest,
|
|
291
|
+
artifactDigest: result.artifactDigest,
|
|
292
|
+
artifactReleaseId: result.artifactReleaseId,
|
|
293
|
+
artifactTransitionOperationId: result.artifactTransitionOperationId,
|
|
294
|
+
artifactTransitionReceiptDigest: result.artifactTransitionReceiptDigest,
|
|
242
295
|
providerAuthorityId: providerIdentity.authorityId,
|
|
243
296
|
providerRevision: providerIdentity.revision,
|
|
244
297
|
verifierAuthorityId: verifierIdentity.authorityId,
|
|
@@ -2,18 +2,25 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { types as utilTypes } from "node:util";
|
|
3
3
|
|
|
4
4
|
import { isGovernedKnowledgeDependencyExecutor } from "./governed-knowledge-dependency-ledger-executor.js";
|
|
5
|
+
import { isGovernedKnowledgeArtifactLifecycle } from "./governed-knowledge-artifact-lifecycle.js";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
GOVERNED_KNOWLEDGE_SCOPE,
|
|
9
|
+
verifyGovernedKnowledgeRecord,
|
|
10
|
+
normalizeGovernedKnowledgeVectorClock as vectorClock,
|
|
11
|
+
} from "./governed-knowledge-record.js";
|
|
12
|
+
export {
|
|
13
|
+
GOVERNED_KNOWLEDGE_SYNC_SCHEMA,
|
|
14
|
+
GOVERNED_KNOWLEDGE_SCOPE,
|
|
15
|
+
verifyGovernedKnowledgeRecord,
|
|
16
|
+
} from "./governed-knowledge-record.js";
|
|
5
17
|
|
|
6
|
-
export const GOVERNED_KNOWLEDGE_SYNC_SCHEMA =
|
|
7
|
-
"chainlesschain.governed-evolution-knowledge-sync/v1";
|
|
8
18
|
export const GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA =
|
|
9
19
|
"chainlesschain.governed-evolution-knowledge-envelope/v1";
|
|
10
|
-
export const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
ORG: "org",
|
|
15
|
-
});
|
|
16
|
-
|
|
20
|
+
export const GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA =
|
|
21
|
+
"chainlesschain.governed-knowledge-artifact-binding/v2";
|
|
22
|
+
export const GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_LEGACY_SCHEMA =
|
|
23
|
+
"chainlesschain.governed-knowledge-artifact-binding/v1";
|
|
17
24
|
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
18
25
|
const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
|
|
19
26
|
const SCOPES = new Set(Object.values(GOVERNED_KNOWLEDGE_SCOPE));
|
|
@@ -37,6 +44,20 @@ const ENVELOPE_KEYS = new Set([
|
|
|
37
44
|
"tenantId",
|
|
38
45
|
"vectorClock",
|
|
39
46
|
]);
|
|
47
|
+
const ARTIFACT_BINDING_KEYS = new Set([
|
|
48
|
+
"activate",
|
|
49
|
+
"authorizationReceiptDigest",
|
|
50
|
+
"baseline",
|
|
51
|
+
"evidenceDigest",
|
|
52
|
+
"humanReviewed",
|
|
53
|
+
"issuedAt",
|
|
54
|
+
"operationId",
|
|
55
|
+
"operation",
|
|
56
|
+
"schema",
|
|
57
|
+
]);
|
|
58
|
+
const LEGACY_ARTIFACT_BINDING_KEYS = new Set(
|
|
59
|
+
[...ARTIFACT_BINDING_KEYS].filter((key) => key !== "activate"),
|
|
60
|
+
);
|
|
40
61
|
|
|
41
62
|
function canonical(value) {
|
|
42
63
|
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
@@ -78,6 +99,11 @@ function record(value, label) {
|
|
|
78
99
|
![Object.prototype, null].includes(Object.getPrototypeOf(value))
|
|
79
100
|
)
|
|
80
101
|
throw new TypeError(`${label} must be a plain object`);
|
|
102
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
103
|
+
const property = Object.getOwnPropertyDescriptor(value, key);
|
|
104
|
+
if (typeof key !== "string" || !Object.hasOwn(property, "value"))
|
|
105
|
+
throw new TypeError(`${label} must contain only data properties`);
|
|
106
|
+
}
|
|
81
107
|
return value;
|
|
82
108
|
}
|
|
83
109
|
|
|
@@ -87,12 +113,6 @@ function id(value, label) {
|
|
|
87
113
|
return value;
|
|
88
114
|
}
|
|
89
115
|
|
|
90
|
-
function digest(value, label) {
|
|
91
|
-
if (typeof value !== "string" || !DIGEST.test(value))
|
|
92
|
-
throw new TypeError(`${label} must be sha256-bound`);
|
|
93
|
-
return value;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
116
|
function capture(owner, method) {
|
|
97
117
|
if (
|
|
98
118
|
!owner ||
|
|
@@ -104,23 +124,6 @@ function capture(owner, method) {
|
|
|
104
124
|
return (...args) => Reflect.apply(owner[method], owner, args);
|
|
105
125
|
}
|
|
106
126
|
|
|
107
|
-
function vectorClock(value) {
|
|
108
|
-
record(value, "vectorClock");
|
|
109
|
-
const entries = Object.entries(value);
|
|
110
|
-
if (entries.length < 1 || entries.length > 64)
|
|
111
|
-
throw new TypeError("vectorClock is empty or unbounded");
|
|
112
|
-
const result = {};
|
|
113
|
-
for (const [deviceId, revision] of entries.sort(([a], [b]) =>
|
|
114
|
-
a.localeCompare(b),
|
|
115
|
-
)) {
|
|
116
|
-
id(deviceId, "vectorClock device");
|
|
117
|
-
if (!Number.isSafeInteger(revision) || revision < 0)
|
|
118
|
-
throw new TypeError("vectorClock revision is invalid");
|
|
119
|
-
result[deviceId] = revision;
|
|
120
|
-
}
|
|
121
|
-
return result;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
127
|
function relation(left, right) {
|
|
125
128
|
const devices = new Set([...Object.keys(left), ...Object.keys(right)]);
|
|
126
129
|
let before = false;
|
|
@@ -137,73 +140,59 @@ function relation(left, right) {
|
|
|
137
140
|
return "equal";
|
|
138
141
|
}
|
|
139
142
|
|
|
140
|
-
function normalizeDependencies(value, action) {
|
|
141
|
-
if (!Array.isArray(value) || value.length > 256)
|
|
142
|
-
throw new TypeError("dependency dispositions are unbounded");
|
|
143
|
-
const seen = new Set();
|
|
144
|
-
return value.map((entry) => {
|
|
145
|
-
record(entry, "dependency disposition");
|
|
146
|
-
const normalized = {
|
|
147
|
-
kind: id(entry.kind, "dependency kind"),
|
|
148
|
-
digest: digest(entry.digest, "dependency digest"),
|
|
149
|
-
disposition: id(entry.disposition, "dependency disposition"),
|
|
150
|
-
};
|
|
151
|
-
const key = `${normalized.kind}:${normalized.digest}`;
|
|
152
|
-
if (seen.has(key)) throw new TypeError("duplicate dependency disposition");
|
|
153
|
-
seen.add(key);
|
|
154
|
-
if (
|
|
155
|
-
["tombstone", "revoke"].includes(action) &&
|
|
156
|
-
![
|
|
157
|
-
"tombstone",
|
|
158
|
-
"quarantine",
|
|
159
|
-
"reject-candidate",
|
|
160
|
-
"rollback-active",
|
|
161
|
-
].includes(normalized.disposition)
|
|
162
|
-
)
|
|
163
|
-
throw new TypeError("revocation dependency disposition is unsafe");
|
|
164
|
-
return normalized;
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
|
|
168
143
|
function normalizeRecord(input, descriptor, { executionRecord = false } = {}) {
|
|
169
|
-
|
|
170
|
-
const action = ACTIONS.has(input.action) ? input.action : null;
|
|
171
|
-
const scope = SCOPES.has(input.scope) ? input.scope : null;
|
|
172
|
-
if (!action || !scope || input.tenantId !== descriptor.tenantId)
|
|
173
|
-
throw new TypeError("knowledge record boundary is invalid");
|
|
174
|
-
const dependencies = normalizeDependencies(input.dependencies || [], action);
|
|
175
|
-
if (
|
|
176
|
-
["team", "org"].includes(scope) &&
|
|
177
|
-
!DIGEST.test(input.approvalReceiptDigest || "")
|
|
178
|
-
)
|
|
179
|
-
throw new TypeError("shared knowledge requires approval");
|
|
180
|
-
if (
|
|
181
|
-
["tombstone", "revoke"].includes(action) &&
|
|
182
|
-
(!DIGEST.test(input.revocationReceiptDigest || "") ||
|
|
183
|
-
dependencies.length < 1)
|
|
184
|
-
)
|
|
185
|
-
throw new TypeError(
|
|
186
|
-
"revocation must bind its receipt and dependency graph",
|
|
187
|
-
);
|
|
188
|
-
const normalized = freeze({
|
|
189
|
-
schema: GOVERNED_KNOWLEDGE_SYNC_SCHEMA,
|
|
144
|
+
const normalized = verifyGovernedKnowledgeRecord(input, {
|
|
190
145
|
tenantId: descriptor.tenantId,
|
|
191
|
-
knowledgeId: id(input.knowledgeId, "knowledgeId"),
|
|
192
|
-
scope,
|
|
193
|
-
scopeId: id(input.scopeId, "scopeId"),
|
|
194
|
-
action,
|
|
195
|
-
contentDigest: digest(input.contentDigest, "contentDigest"),
|
|
196
|
-
vectorClock: vectorClock(input.vectorClock),
|
|
197
|
-
approvalReceiptDigest: input.approvalReceiptDigest || null,
|
|
198
|
-
revocationReceiptDigest: input.revocationReceiptDigest || null,
|
|
199
|
-
dependencies,
|
|
200
146
|
});
|
|
201
147
|
if (executionRecord) EXECUTION_RECORDS.add(normalized);
|
|
202
148
|
return normalized;
|
|
203
149
|
}
|
|
204
150
|
|
|
205
|
-
export function
|
|
206
|
-
|
|
151
|
+
export function verifyGovernedKnowledgeArtifactBinding(
|
|
152
|
+
input,
|
|
153
|
+
{ tenantId, knowledge, authorizationReceiptDigest } = {},
|
|
154
|
+
) {
|
|
155
|
+
record(input, "knowledge artifact binding");
|
|
156
|
+
const expectedTenantId = id(tenantId, "tenantId");
|
|
157
|
+
const normalizedKnowledge = verifyGovernedKnowledgeRecord(knowledge, {
|
|
158
|
+
tenantId: expectedTenantId,
|
|
159
|
+
});
|
|
160
|
+
const keys = Reflect.ownKeys(input);
|
|
161
|
+
const current = input.schema === GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA;
|
|
162
|
+
const legacy =
|
|
163
|
+
input.schema === GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_LEGACY_SCHEMA;
|
|
164
|
+
const expectedKeys = current
|
|
165
|
+
? ARTIFACT_BINDING_KEYS
|
|
166
|
+
: LEGACY_ARTIFACT_BINDING_KEYS;
|
|
167
|
+
const baseline =
|
|
168
|
+
input.baseline === null
|
|
169
|
+
? null
|
|
170
|
+
: verifyGovernedKnowledgeRecord(input.baseline, {
|
|
171
|
+
tenantId: expectedTenantId,
|
|
172
|
+
});
|
|
173
|
+
if (
|
|
174
|
+
(!current && !legacy) ||
|
|
175
|
+
keys.length !== expectedKeys.size ||
|
|
176
|
+
keys.some((key) => typeof key !== "string" || !expectedKeys.has(key)) ||
|
|
177
|
+
!ID.test(input.operationId ?? "") ||
|
|
178
|
+
!(
|
|
179
|
+
current ? ["publish", "merge", "receive"] : ["publish", "merge"]
|
|
180
|
+
).includes(input.operation) ||
|
|
181
|
+
(current && typeof input.activate !== "boolean") ||
|
|
182
|
+
!Number.isFinite(Date.parse(input.issuedAt)) ||
|
|
183
|
+
input.authorizationReceiptDigest !== authorizationReceiptDigest ||
|
|
184
|
+
!DIGEST.test(input.authorizationReceiptDigest ?? "") ||
|
|
185
|
+
!DIGEST.test(input.evidenceDigest ?? "") ||
|
|
186
|
+
typeof input.humanReviewed !== "boolean" ||
|
|
187
|
+
(baseline !== null &&
|
|
188
|
+
(baseline.knowledgeId !== normalizedKnowledge.knowledgeId ||
|
|
189
|
+
baseline.scope !== normalizedKnowledge.scope ||
|
|
190
|
+
baseline.scopeId !== normalizedKnowledge.scopeId)) ||
|
|
191
|
+
canonical(baseline) !== canonical(input.baseline)
|
|
192
|
+
) {
|
|
193
|
+
throw new Error("knowledge artifact binding is invalid");
|
|
194
|
+
}
|
|
195
|
+
return freeze(clone(input));
|
|
207
196
|
}
|
|
208
197
|
|
|
209
198
|
export function isGovernedKnowledgeExecutionRecord(value) {
|
|
@@ -250,7 +239,14 @@ export function verifyGovernedKnowledgeEnvelopeIntegrity(
|
|
|
250
239
|
}
|
|
251
240
|
|
|
252
241
|
export class GovernedKnowledgeSync {
|
|
253
|
-
constructor({
|
|
242
|
+
constructor({
|
|
243
|
+
tenantId,
|
|
244
|
+
deviceId,
|
|
245
|
+
ports,
|
|
246
|
+
dependencyExecutor = null,
|
|
247
|
+
artifactLifecycle,
|
|
248
|
+
clock = () => Date.now(),
|
|
249
|
+
} = {}) {
|
|
254
250
|
this.tenantId = id(tenantId, "tenantId");
|
|
255
251
|
this.deviceId = id(deviceId, "deviceId");
|
|
256
252
|
this._authorize = capture(ports, "authorize");
|
|
@@ -265,6 +261,16 @@ export class GovernedKnowledgeSync {
|
|
|
265
261
|
ports?.loadPublication === undefined
|
|
266
262
|
? null
|
|
267
263
|
: capture(ports, "loadPublication");
|
|
264
|
+
this._loadReception = capture(ports, "loadReception");
|
|
265
|
+
if (!isGovernedKnowledgeArtifactLifecycle(artifactLifecycle)) {
|
|
266
|
+
throw new TypeError(
|
|
267
|
+
"a branded governed Knowledge artifact lifecycle is required",
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
this._prepareArtifact = capture(artifactLifecycle, "prepare");
|
|
271
|
+
this._commitArtifact = capture(artifactLifecycle, "commit");
|
|
272
|
+
if (typeof clock !== "function") throw new TypeError("clock is required");
|
|
273
|
+
this._clock = clock;
|
|
268
274
|
if (
|
|
269
275
|
dependencyExecutor !== null &&
|
|
270
276
|
!isGovernedKnowledgeDependencyExecutor(dependencyExecutor)
|
|
@@ -279,7 +285,20 @@ export class GovernedKnowledgeSync {
|
|
|
279
285
|
SYNCHRONIZERS.add(this);
|
|
280
286
|
}
|
|
281
287
|
|
|
282
|
-
async publish(input,
|
|
288
|
+
async publish(input, options = {}) {
|
|
289
|
+
const result = await this.publishWithArtifactEvidence(input, options);
|
|
290
|
+
return result.envelope;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
async publishWithArtifactEvidence(
|
|
294
|
+
input,
|
|
295
|
+
{
|
|
296
|
+
operationId = null,
|
|
297
|
+
artifactOperation = "publish",
|
|
298
|
+
artifactEvidenceDigest = null,
|
|
299
|
+
artifactHumanReviewed = false,
|
|
300
|
+
} = {},
|
|
301
|
+
) {
|
|
283
302
|
const knowledge = normalizeRecord(input, this, { executionRecord: true });
|
|
284
303
|
if (knowledge.scope === "personal")
|
|
285
304
|
throw new Error("personal knowledge cannot enter a shared sync channel");
|
|
@@ -301,6 +320,32 @@ export class GovernedKnowledgeSync {
|
|
|
301
320
|
throw new Error("publish operationId resolved different knowledge");
|
|
302
321
|
}
|
|
303
322
|
verifyGovernedKnowledgeEnvelopeIntegrity(existing.envelope, this);
|
|
323
|
+
const binding = verifyGovernedKnowledgeArtifactBinding(
|
|
324
|
+
existing.artifactBinding,
|
|
325
|
+
{
|
|
326
|
+
tenantId: this.tenantId,
|
|
327
|
+
knowledge,
|
|
328
|
+
authorizationReceiptDigest: existing.authorizationReceiptDigest,
|
|
329
|
+
},
|
|
330
|
+
);
|
|
331
|
+
if (
|
|
332
|
+
artifactOperation !== binding.operation ||
|
|
333
|
+
(artifactEvidenceDigest !== null &&
|
|
334
|
+
artifactEvidenceDigest !== binding.evidenceDigest) ||
|
|
335
|
+
artifactHumanReviewed !== binding.humanReviewed
|
|
336
|
+
) {
|
|
337
|
+
throw new Error("publish artifact recovery binding differs");
|
|
338
|
+
}
|
|
339
|
+
const prepared = await this._prepareArtifact({
|
|
340
|
+
knowledge,
|
|
341
|
+
currentKnowledge: binding.baseline,
|
|
342
|
+
operation: binding.operation,
|
|
343
|
+
operationId: binding.operationId,
|
|
344
|
+
authorizationReceiptDigest: binding.authorizationReceiptDigest,
|
|
345
|
+
evidenceDigest: binding.evidenceDigest,
|
|
346
|
+
issuedAt: binding.issuedAt,
|
|
347
|
+
humanReviewed: binding.humanReviewed,
|
|
348
|
+
});
|
|
304
349
|
const sent = await this._send({ envelope: existing.envelope });
|
|
305
350
|
if (
|
|
306
351
|
sent?.durable !== true ||
|
|
@@ -308,10 +353,51 @@ export class GovernedKnowledgeSync {
|
|
|
308
353
|
) {
|
|
309
354
|
throw new Error("sync transport did not durably accept the envelope");
|
|
310
355
|
}
|
|
311
|
-
|
|
356
|
+
const artifact = await this._commitArtifact(prepared);
|
|
357
|
+
return freeze({
|
|
358
|
+
envelope: clone(existing.envelope),
|
|
359
|
+
artifact: clone(artifact),
|
|
360
|
+
recovered: true,
|
|
361
|
+
});
|
|
312
362
|
}
|
|
313
363
|
}
|
|
314
364
|
const admission = await this._admit("publish", knowledge);
|
|
365
|
+
const current = await this._load({ knowledgeId: knowledge.knowledgeId });
|
|
366
|
+
const effectiveOperationId =
|
|
367
|
+
operationId ??
|
|
368
|
+
`knowledge-publish:${hash(
|
|
369
|
+
"chainlesschain.governed-knowledge-publish-operation/v1",
|
|
370
|
+
{ tenantId: this.tenantId, deviceId: this.deviceId, knowledge },
|
|
371
|
+
).slice(7)}`;
|
|
372
|
+
const milliseconds = Number(this._clock());
|
|
373
|
+
if (!Number.isFinite(milliseconds))
|
|
374
|
+
throw new TypeError("knowledge sync clock is invalid");
|
|
375
|
+
const binding = freeze({
|
|
376
|
+
schema: GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA,
|
|
377
|
+
activate: true,
|
|
378
|
+
operationId: effectiveOperationId,
|
|
379
|
+
operation: artifactOperation,
|
|
380
|
+
issuedAt: new Date(milliseconds).toISOString(),
|
|
381
|
+
authorizationReceiptDigest: admission.receiptDigest,
|
|
382
|
+
evidenceDigest: artifactEvidenceDigest ?? admission.receiptDigest,
|
|
383
|
+
humanReviewed: artifactHumanReviewed,
|
|
384
|
+
baseline: current === null ? null : clone(current),
|
|
385
|
+
});
|
|
386
|
+
verifyGovernedKnowledgeArtifactBinding(binding, {
|
|
387
|
+
tenantId: this.tenantId,
|
|
388
|
+
knowledge,
|
|
389
|
+
authorizationReceiptDigest: admission.receiptDigest,
|
|
390
|
+
});
|
|
391
|
+
const prepared = await this._prepareArtifact({
|
|
392
|
+
knowledge,
|
|
393
|
+
currentKnowledge: binding.baseline,
|
|
394
|
+
operation: binding.operation,
|
|
395
|
+
operationId: binding.operationId,
|
|
396
|
+
authorizationReceiptDigest: binding.authorizationReceiptDigest,
|
|
397
|
+
evidenceDigest: binding.evidenceDigest,
|
|
398
|
+
issuedAt: binding.issuedAt,
|
|
399
|
+
humanReviewed: binding.humanReviewed,
|
|
400
|
+
});
|
|
315
401
|
await this._applyRevocationDependencies(knowledge);
|
|
316
402
|
const plaintext = Buffer.from(canonical(knowledge), "utf8");
|
|
317
403
|
const encrypted = await this._encrypt({ knowledge, plaintext });
|
|
@@ -344,11 +430,19 @@ export class GovernedKnowledgeSync {
|
|
|
344
430
|
envelopeDigest,
|
|
345
431
|
signature: clone(signature),
|
|
346
432
|
});
|
|
347
|
-
await this._persist(
|
|
433
|
+
await this._persist(
|
|
434
|
+
knowledge,
|
|
435
|
+
envelope,
|
|
436
|
+
"local",
|
|
437
|
+
admission,
|
|
438
|
+
operationId,
|
|
439
|
+
binding,
|
|
440
|
+
);
|
|
348
441
|
const sent = await this._send({ envelope });
|
|
349
442
|
if (sent?.durable !== true || sent.envelopeDigest !== envelopeDigest)
|
|
350
443
|
throw new Error("sync transport did not durably accept the envelope");
|
|
351
|
-
|
|
444
|
+
const artifact = await this._commitArtifact(prepared);
|
|
445
|
+
return freeze({ envelope, artifact: clone(artifact), recovered: false });
|
|
352
446
|
}
|
|
353
447
|
|
|
354
448
|
async receive(envelope) {
|
|
@@ -390,6 +484,60 @@ export class GovernedKnowledgeSync {
|
|
|
390
484
|
)
|
|
391
485
|
throw new Error("knowledge envelope substituted its governed record");
|
|
392
486
|
const admission = await this._admit("receive", knowledge);
|
|
487
|
+
const existing = await this._loadReception({
|
|
488
|
+
envelopeDigest: envelope.envelopeDigest,
|
|
489
|
+
});
|
|
490
|
+
if (existing) {
|
|
491
|
+
const comparable = { ...existing.knowledge };
|
|
492
|
+
delete comparable.conflictWithDigest;
|
|
493
|
+
if (
|
|
494
|
+
!["remote", "conflict"].includes(existing.disposition) ||
|
|
495
|
+
existing.envelopeDigest !== envelope.envelopeDigest ||
|
|
496
|
+
canonical(comparable) !== canonical(knowledge)
|
|
497
|
+
) {
|
|
498
|
+
throw new Error("receive envelope resolved different knowledge");
|
|
499
|
+
}
|
|
500
|
+
const binding = verifyGovernedKnowledgeArtifactBinding(
|
|
501
|
+
existing.artifactBinding,
|
|
502
|
+
{
|
|
503
|
+
tenantId: this.tenantId,
|
|
504
|
+
knowledge,
|
|
505
|
+
authorizationReceiptDigest: existing.authorizationReceiptDigest,
|
|
506
|
+
},
|
|
507
|
+
);
|
|
508
|
+
if (
|
|
509
|
+
binding.operation !== "receive" ||
|
|
510
|
+
binding.activate !== (existing.disposition === "remote")
|
|
511
|
+
) {
|
|
512
|
+
throw new Error("receive artifact recovery binding differs");
|
|
513
|
+
}
|
|
514
|
+
const prepared = await this._prepareArtifact({
|
|
515
|
+
knowledge,
|
|
516
|
+
currentKnowledge: binding.baseline,
|
|
517
|
+
operation: binding.operation,
|
|
518
|
+
operationId: binding.operationId,
|
|
519
|
+
authorizationReceiptDigest: binding.authorizationReceiptDigest,
|
|
520
|
+
evidenceDigest: binding.evidenceDigest,
|
|
521
|
+
issuedAt: binding.issuedAt,
|
|
522
|
+
activate: binding.activate,
|
|
523
|
+
humanReviewed: binding.humanReviewed,
|
|
524
|
+
});
|
|
525
|
+
const artifact = await this._commitArtifact(prepared);
|
|
526
|
+
return existing.disposition === "conflict"
|
|
527
|
+
? freeze({
|
|
528
|
+
applied: false,
|
|
529
|
+
reason: "conflict",
|
|
530
|
+
requiresHumanMerge: true,
|
|
531
|
+
recovered: true,
|
|
532
|
+
artifact: clone(artifact),
|
|
533
|
+
})
|
|
534
|
+
: freeze({
|
|
535
|
+
applied: true,
|
|
536
|
+
action: knowledge.action,
|
|
537
|
+
recovered: true,
|
|
538
|
+
artifact: clone(artifact),
|
|
539
|
+
});
|
|
540
|
+
}
|
|
393
541
|
const current = await this._load({ knowledgeId: knowledge.knowledgeId });
|
|
394
542
|
if (current) {
|
|
395
543
|
const order = relation(current.vectorClock, knowledge.vectorClock);
|
|
@@ -400,22 +548,105 @@ export class GovernedKnowledgeSync {
|
|
|
400
548
|
return freeze({ applied: false, reason: "replay" });
|
|
401
549
|
}
|
|
402
550
|
if (order === "concurrent") {
|
|
551
|
+
const binding = this._receiveArtifactBinding({
|
|
552
|
+
knowledge,
|
|
553
|
+
current,
|
|
554
|
+
admission,
|
|
555
|
+
envelope,
|
|
556
|
+
activate: false,
|
|
557
|
+
});
|
|
558
|
+
const prepared = await this._prepareArtifact({
|
|
559
|
+
knowledge,
|
|
560
|
+
currentKnowledge: binding.baseline,
|
|
561
|
+
operation: binding.operation,
|
|
562
|
+
operationId: binding.operationId,
|
|
563
|
+
authorizationReceiptDigest: binding.authorizationReceiptDigest,
|
|
564
|
+
evidenceDigest: binding.evidenceDigest,
|
|
565
|
+
issuedAt: binding.issuedAt,
|
|
566
|
+
activate: binding.activate,
|
|
567
|
+
humanReviewed: binding.humanReviewed,
|
|
568
|
+
});
|
|
403
569
|
await this._persist(
|
|
404
570
|
{ ...knowledge, conflictWithDigest: current.contentDigest },
|
|
405
571
|
envelope,
|
|
406
572
|
"conflict",
|
|
407
573
|
admission,
|
|
574
|
+
null,
|
|
575
|
+
binding,
|
|
408
576
|
);
|
|
577
|
+
const artifact = await this._commitArtifact(prepared);
|
|
409
578
|
return freeze({
|
|
410
579
|
applied: false,
|
|
411
580
|
reason: "conflict",
|
|
412
581
|
requiresHumanMerge: true,
|
|
582
|
+
recovered: false,
|
|
583
|
+
artifact: clone(artifact),
|
|
413
584
|
});
|
|
414
585
|
}
|
|
415
586
|
}
|
|
587
|
+
const binding = this._receiveArtifactBinding({
|
|
588
|
+
knowledge,
|
|
589
|
+
current,
|
|
590
|
+
admission,
|
|
591
|
+
envelope,
|
|
592
|
+
activate: true,
|
|
593
|
+
});
|
|
594
|
+
const prepared = await this._prepareArtifact({
|
|
595
|
+
knowledge,
|
|
596
|
+
currentKnowledge: binding.baseline,
|
|
597
|
+
operation: binding.operation,
|
|
598
|
+
operationId: binding.operationId,
|
|
599
|
+
authorizationReceiptDigest: binding.authorizationReceiptDigest,
|
|
600
|
+
evidenceDigest: binding.evidenceDigest,
|
|
601
|
+
issuedAt: binding.issuedAt,
|
|
602
|
+
activate: binding.activate,
|
|
603
|
+
humanReviewed: binding.humanReviewed,
|
|
604
|
+
});
|
|
416
605
|
await this._applyRevocationDependencies(knowledge);
|
|
417
|
-
await this._persist(
|
|
418
|
-
|
|
606
|
+
await this._persist(
|
|
607
|
+
knowledge,
|
|
608
|
+
envelope,
|
|
609
|
+
"remote",
|
|
610
|
+
admission,
|
|
611
|
+
null,
|
|
612
|
+
binding,
|
|
613
|
+
);
|
|
614
|
+
const artifact = await this._commitArtifact(prepared);
|
|
615
|
+
return freeze({
|
|
616
|
+
applied: true,
|
|
617
|
+
action: knowledge.action,
|
|
618
|
+
recovered: false,
|
|
619
|
+
artifact: clone(artifact),
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
_receiveArtifactBinding({
|
|
624
|
+
knowledge,
|
|
625
|
+
current,
|
|
626
|
+
admission,
|
|
627
|
+
envelope,
|
|
628
|
+
activate,
|
|
629
|
+
}) {
|
|
630
|
+
const milliseconds = Number(this._clock());
|
|
631
|
+
if (!Number.isFinite(milliseconds))
|
|
632
|
+
throw new TypeError("knowledge sync clock is invalid");
|
|
633
|
+
const binding = freeze({
|
|
634
|
+
schema: GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA,
|
|
635
|
+
activate,
|
|
636
|
+
operationId: `knowledge-receive:${envelope.envelopeDigest.slice(7)}`,
|
|
637
|
+
operation: "receive",
|
|
638
|
+
issuedAt: new Date(milliseconds).toISOString(),
|
|
639
|
+
authorizationReceiptDigest: admission.receiptDigest,
|
|
640
|
+
evidenceDigest: envelope.envelopeDigest,
|
|
641
|
+
humanReviewed: false,
|
|
642
|
+
baseline: current === null ? null : clone(current),
|
|
643
|
+
});
|
|
644
|
+
verifyGovernedKnowledgeArtifactBinding(binding, {
|
|
645
|
+
tenantId: this.tenantId,
|
|
646
|
+
knowledge,
|
|
647
|
+
authorizationReceiptDigest: admission.receiptDigest,
|
|
648
|
+
});
|
|
649
|
+
return binding;
|
|
419
650
|
}
|
|
420
651
|
|
|
421
652
|
async _admit(operation, knowledge) {
|
|
@@ -439,6 +670,7 @@ export class GovernedKnowledgeSync {
|
|
|
439
670
|
disposition,
|
|
440
671
|
admission,
|
|
441
672
|
operationId = null,
|
|
673
|
+
artifactBinding = null,
|
|
442
674
|
) {
|
|
443
675
|
const result = await this._commit({
|
|
444
676
|
knowledge,
|
|
@@ -447,6 +679,7 @@ export class GovernedKnowledgeSync {
|
|
|
447
679
|
disposition,
|
|
448
680
|
authorizationReceiptDigest: admission.receiptDigest,
|
|
449
681
|
operationId,
|
|
682
|
+
artifactBinding,
|
|
450
683
|
});
|
|
451
684
|
if (
|
|
452
685
|
result?.authenticated !== true ||
|