chainlesschain 0.166.21 → 0.166.22
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 +1 -1
- package/src/assets/web-panel/assets/{AIOps-BjMnsUci.js → AIOps-oJ7USzMC.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DdYFP03A.js → ActionButton-BlgnZe_C.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bb8TuuK_.js → Analytics-D2rRbTLu.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-Kn3TIOtk.js → AppLayout-FwS3f0B2.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-4IxpqI_b.js → Artifacts-iF-_08Hi.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BOV2caqU.js → Audit-D24p0zQw.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-B86k-ay4.js → BackgroundAgents-Cg3mRVi9.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-C5_ie1e3.js → Backup-EOqht3H-.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-xpwg6QCW.js → BaseInput-9XWYq2hj.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CVZOcZau.js → Chat-Dq5yardA.js} +4 -4
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-D8fPYhUu.js → ChatBubbleRenderer-Ds3pA-ET.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-MKTq3zdP.js → Checkbox-CuyCBoBf.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-JUk3wzep.js → Codegen-DjWtYHNe.js} +1 -1
- package/src/assets/web-panel/assets/{Col-JPvTA0kC.js → Col-CrVr_iuG.js} +1 -1
- package/src/assets/web-panel/assets/{Community-Tqgl87NQ.js → Community-C6QxpfGc.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BuAFYBmN.js → Compact-B-v5r6Pa.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CXS9WIPZ.js → Compliance-zNiLiFgD.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Ds2bFHrr.js → Cowork-D9K7lMOu.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-C_dV_OeW.js → Cron-DAjO36z4.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BsO6tIRo.js → Crosschain-Bxqn0aqB.js} +1 -1
- package/src/assets/web-panel/assets/{DID-rNOFqBac.js → DID-DfRmLUe-.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-C2fcKKVY.js → Dashboard-Cz8KF3fr.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Y7Ndr0X_.js → Dropdown-C4oVfkP0.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DcP_uPmL.js → EmailListRenderer-ivyZKN8k.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Cwn3gDzk.js → FamilyGuardDashboard-DoxY1CPW.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-ClQuOsqb.js → Federation-C93gZxnb.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DfwtmlcK.js → FormItemContext-D_lEjYJE.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-zNZhtbC5.js → GenericCardRenderer-BNFN9YjN.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BZmdW-G5.js → Git-mUu2HcLI.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CqBk4lEn.js → Governance-CNuosrge.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-Dbmt3ZXk.js → Inference-DwY5pbCB.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-hMTH6qf3.js → KnowledgeGraph-aRUxhACD.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CkiYgiW2.js → Logs-DFfsWYy_.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BL1FElXg.js → MarkdownRenderer-DqTx7_u1.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CbB6wfin.js → Marketplace-COI-ciM-.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BSwiFtte.js → McpTools-BJJwaIpe.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-B03PeHrz.js → Memory-CDO6SGDZ.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CRGrnd-X.js → MobileBridge-BlZ5tFf4.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CE_5v2kO.js → MobileProjects-DuoxbgWz.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Dp11QVx1.js → Mtc-6ec9j70b.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-CYu-3JBu.js → MtcAudit-BuL7HkC7.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-CGyJ0Xl3.js → Multisig-CJxR85lk.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CoWi_ov1.js → NLProgramming-B71O1S4l.js} +1 -1
- package/src/assets/web-panel/assets/Notes-Bsw5zbpV.js +7 -0
- package/src/assets/web-panel/assets/{NotificationSettings-DX4I2b4W.js → NotificationSettings-BnAhXuK_.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-BJ0R5GGz.js +1 -0
- package/src/assets/web-panel/assets/{Organization-oopLO_tk.js → Organization-B7wwNxoP.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BFVvjMyf.js → Overflow-CfAGr0gM.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CBy5t-Tk.js → P2P-KhMg22Fz.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser--YWJNsu6.js → PdhVaultBrowser-NdAXI9ft.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-C2dZ8scb.js → Permissions-CIYjqyT7.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Bs3l7Hlx.js → PersonalDataHub-D2ht3P_R.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DEBWbZuD.js → Pipeline-i6flZW1m.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CjHBb6NU.js → Privacy-DE0lhYVc.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-D2WipUz5.js → ProjectInit-BL3YbyxS.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-B6WfnrGB.js → ProjectSettings-CEtdg7ni.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-FF_thRi6.js → Projects-CvtU5peJ.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CCv5M_Dv.js → Providers-DKt_Cg-j.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CGthxU54.js → QrScannerModal-DA61jNSx.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CnPmXPFb.js → QuickAsk-fS9ryUmq.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Df_tGEa9.js → Recommend-CR9dZU5Y.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-Z58N0Loe.js → RemoteSession-BV0BR2Dz.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-CZTBQ2Vt.js → Reputation-BIeGUvYD.js} +1 -1
- package/src/assets/web-panel/assets/{Row-CdK3YpCQ.js → Row-DHDT1aro.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CFMVT5sb.js → RssFeed-Cq6YKb1h.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DrF8RIvD.js → Search-DEF6vsy6.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Ddk2f2DM.js → Security-CHtYiKY9.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CCuK-VOo.js → Services-u16lvBJN.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DxCpHzeM.js → Skeleton-CGbizyDj.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-t2oTDgcv.js → Skills-BZMQcAa7.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Df63M9_R.js → Sla-Bm-CycVi.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-l7ox6KuX.js → SpeechSettings-BudpA5kr.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-COd_tgPp.js → SyncSettings-B8q1C1eC.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CzDCcrik.js → Tasks-SU1pBWc-.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-D-vfxTGA.js → Templates-CyOfJzmt.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BlpT_Gxc.js → Tenant-xqWSm2GP.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D5rq52Hg.js → Terminal-D1Ttgjsi.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DdoMndkK.js → TimelineRenderer-Da2lYs5D.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BhgBsI6g.js → Tokens-B34-SduO.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DwwzoikZ.js → Trigger-C8zyYm4R.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-HkTpzXFb.js → Trust-D1Pvqems.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-D9nk6Ehe.js → UkeySign-Do3VVnAy.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BKk0rfoy.js → VideoEditing-Dz7egVIA.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-IVWIU_Lq.js → Wallet-Dcuw-OxR.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-CFTCpfsG.js → WebAuthn-DPlw-QsB.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-Dnf4Obif.js → WorkflowEditor-h4OsnU5q.js} +1 -1
- package/src/assets/web-panel/assets/{chat-D2snERdj.js → chat-eO9wEwrW.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DKEjK1N1.js → colors-34lSmOXw.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BEDLwQdt.js → compact-item-CK4kEWJ4.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DA9iW1a0.js → createContext-E0A57xed.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-5l2xEcY9.js → hasIn-BD9ZMGAl.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7sKbM5s.js → index--N0u6kTG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DU2TXJu-.js → index-8qMA1DWQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CxEtQYdi.js → index-B0rkHxKK.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7_W_rYd.js → index-B_G_ElKO.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4QYBliR.js → index-BbX_Dted.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLoalqRX.js → index-Bjs90Eh9.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbkghqn_.js → index-BmNbU2Z6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgfImyZI.js → index-Brqc9Emx.js} +1 -1
- package/src/assets/web-panel/assets/{index-5pW4t1iD.js → index-BsGmo6v1.js} +1 -1
- package/src/assets/web-panel/assets/index-C907rPwd.js +1 -0
- package/src/assets/web-panel/assets/{index-CRPrHE7h.js → index-CT1_eRL-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvV03Ayk.js → index-CZBaqe3d.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7z4zB_a.js → index-CZkFMeWL.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmruhzFi.js → index-Ch175NUw.js} +1 -1
- package/src/assets/web-panel/assets/{index-e-e40id6.js → index-CsrKJJcX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGlotREA.js → index-CuSau5ya.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjWltbi_.js → index-Cx3Jn1r0.js} +1 -1
- package/src/assets/web-panel/assets/{index-fccZmC_h.js → index-Cz3unNfL.js} +1 -1
- package/src/assets/web-panel/assets/{index-NJieh3T1.js → index-D4bB_x_v.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkMKuqUs.js → index-DCn-ECvK.js} +1 -1
- package/src/assets/web-panel/assets/{index-BZ5lY2zx.js → index-DFLE2qO9.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_eCoZgW.js → index-DGRxt5wj.js} +1 -1
- package/src/assets/web-panel/assets/{index-7P1b8HZo.js → index-DONOUtlz.js} +1 -1
- package/src/assets/web-panel/assets/{index-yYEQXYaU.js → index-DP-UZAQN.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dbd7eEex.js → index-Da5fmOHB.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bqc8tdIF.js → index-DcE1BspQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXet1xol.js → index-DcbgVLOH.js} +1 -1
- package/src/assets/web-panel/assets/{index-BO9dQjpt.js → index-DeXNCyQJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CX1x4AFn.js → index-DiT_REby.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bq5P3piS.js → index-DpfisY1g.js} +1 -1
- package/src/assets/web-panel/assets/{index-Csfb-7hw.js → index-DrOalGut.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpqtbXdE.js → index-DrSAAuJj.js} +1 -1
- package/src/assets/web-panel/assets/{index-B00GeekA.js → index-DrsDA_md.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dg2a9owQ.js → index-DvKcroix.js} +1 -1
- package/src/assets/web-panel/assets/{index-fgYk0QXO.js → index-DzXjP44T.js} +1 -1
- package/src/assets/web-panel/assets/{index-Td8ZwyoC.js → index-MIg5Z8qe.js} +1 -1
- package/src/assets/web-panel/assets/{index-DqwPFbOb.js → index-o8pYehRq.js} +3 -3
- package/src/assets/web-panel/assets/index-wueRSK2d.js +1 -0
- package/src/assets/web-panel/assets/{index-CbTPvp2_.js → index-yAGBu2E0.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CPrcB1TC.js → initDefaultProps-DMTkAomF.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BQ7mWRh_.js → motion-Cnti1F5g.js} +1 -1
- package/src/assets/web-panel/assets/{move-CzOEq99p.js → move-CGxmHUga.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BlQI5jrw.js → mtc-parser-CuwwLoq7.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DlW4gxmv.js → omit-BpdlTkPM.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-BBYms5nP.js → pickAttrs-D7nWrThp.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-az2MPJ_7.js → placementArrow-Bhx0TV8F.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-D1-ibEol.js → responsiveObserve-CZ1KesZh.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DHGqa4GA.js → slide-CnldF8J6.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CYGDo6lD.js → statusUtils-CZfo_GOA.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Cl2EM9K6.js → styleChecker-B2QCcAv5.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DdYhzuv1.js → useFlexGapSupport-DzzjIS4J.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DWumPuBW.js → useFs-B_atg9M0.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DxAO-Aqi.js → usePersonalDataHub-DhZs3QYN.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CplsQf_N.js → vnode-DcePTYAm.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Cw5HXNSG.js → zoom-BYmlnjRk.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/serve.js +31 -0
- package/src/data/changelog.json +13 -0
- package/src/index.js +11 -3
- package/src/lazy-dispatch.js +9 -1
- package/src/lib/app-server/websocket-transport.js +21 -0
- package/src/lib/evolution/evolution-artifact-ports.js +9 -0
- package/src/lib/evolution/evolution-deployment-loader.js +208 -0
- package/src/lib/evolution/evolution-release-train-ledger-adapter.js +335 -0
- package/src/lib/evolution/evolution-release-train.js +538 -0
- package/src/lib/evolution/evolution-workbench-projection.js +20 -1
- package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +688 -0
- package/src/lib/evolution/governed-knowledge-artifact-lifecycle.js +364 -0
- 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-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 +317 -7
- package/src/lib/evolution/skill-writer-inventory-manifest.js +7 -6
- package/src/lib/evolution/statistical-progressive-canary.js +683 -0
- package/src/lib/evolution/wikiskill-benchmark.js +510 -0
- package/src/lib/session-host-lease.js +11 -16
- package/src/runtime/agent-core.js +61 -7
- package/src/runtime/headless-stream.js +3 -0
- 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/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
|
@@ -11,11 +11,16 @@ import {
|
|
|
11
11
|
} from "./evolution-ledger.js";
|
|
12
12
|
import {
|
|
13
13
|
GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA,
|
|
14
|
+
verifyGovernedKnowledgeArtifactBinding,
|
|
14
15
|
verifyGovernedKnowledgeEnvelopeIntegrity,
|
|
15
16
|
verifyGovernedKnowledgeRecord,
|
|
16
17
|
} from "./governed-knowledge-sync.js";
|
|
17
18
|
|
|
18
19
|
export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA =
|
|
20
|
+
"chainlesschain.governed-evolution-knowledge-ledger-record/v4";
|
|
21
|
+
export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA =
|
|
22
|
+
"chainlesschain.governed-evolution-knowledge-ledger-record/v3";
|
|
23
|
+
export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA =
|
|
19
24
|
"chainlesschain.governed-evolution-knowledge-ledger-record/v2";
|
|
20
25
|
export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_LEGACY_SCHEMA =
|
|
21
26
|
"chainlesschain.governed-evolution-knowledge-ledger-record/v1";
|
|
@@ -32,6 +37,7 @@ const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
|
|
|
32
37
|
const DISPOSITIONS = new Set(["conflict", "local", "remote"]);
|
|
33
38
|
const MAX_CONFLICT_PAGE = 256;
|
|
34
39
|
const RECORD_KEYS = new Set([
|
|
40
|
+
"artifactBinding",
|
|
35
41
|
"committedAt",
|
|
36
42
|
"authorizationReceiptDigest",
|
|
37
43
|
"conflictWithDigest",
|
|
@@ -45,8 +51,11 @@ const RECORD_KEYS = new Set([
|
|
|
45
51
|
"schema",
|
|
46
52
|
"tenantId",
|
|
47
53
|
]);
|
|
54
|
+
const V2_RECORD_KEYS = new Set(
|
|
55
|
+
[...RECORD_KEYS].filter((key) => key !== "artifactBinding"),
|
|
56
|
+
);
|
|
48
57
|
const LEGACY_RECORD_KEYS = new Set(
|
|
49
|
-
[...
|
|
58
|
+
[...V2_RECORD_KEYS].filter((key) => key !== "operationId"),
|
|
50
59
|
);
|
|
51
60
|
|
|
52
61
|
function canonical(value) {
|
|
@@ -132,9 +141,23 @@ function recordCore(value) {
|
|
|
132
141
|
authorizationReceiptDigest: value.authorizationReceiptDigest,
|
|
133
142
|
committedAt: value.committedAt,
|
|
134
143
|
};
|
|
135
|
-
if (
|
|
144
|
+
if (
|
|
145
|
+
[
|
|
146
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
|
|
147
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
|
|
148
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA,
|
|
149
|
+
].includes(value.schema)
|
|
150
|
+
) {
|
|
136
151
|
core.operationId = value.operationId;
|
|
137
152
|
}
|
|
153
|
+
if (
|
|
154
|
+
[
|
|
155
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
|
|
156
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
|
|
157
|
+
].includes(value.schema)
|
|
158
|
+
) {
|
|
159
|
+
core.artifactBinding = value.artifactBinding;
|
|
160
|
+
}
|
|
138
161
|
return core;
|
|
139
162
|
}
|
|
140
163
|
|
|
@@ -208,14 +231,24 @@ function validateEnvelope(value, knowledge, descriptor, disposition) {
|
|
|
208
231
|
function validateLedgerRecord(value, descriptor) {
|
|
209
232
|
const current =
|
|
210
233
|
value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA;
|
|
234
|
+
const version3 =
|
|
235
|
+
value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA;
|
|
236
|
+
const version2 =
|
|
237
|
+
value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA;
|
|
211
238
|
exact(
|
|
212
239
|
value,
|
|
213
|
-
current
|
|
240
|
+
current || version3
|
|
241
|
+
? RECORD_KEYS
|
|
242
|
+
: version2
|
|
243
|
+
? V2_RECORD_KEYS
|
|
244
|
+
: LEGACY_RECORD_KEYS,
|
|
214
245
|
"knowledge sync ledger record",
|
|
215
246
|
);
|
|
216
247
|
if (
|
|
217
248
|
![
|
|
218
249
|
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
|
|
250
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
|
|
251
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA,
|
|
219
252
|
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_LEGACY_SCHEMA,
|
|
220
253
|
].includes(value.schema) ||
|
|
221
254
|
value.tenantId !== descriptor.tenantId ||
|
|
@@ -231,10 +264,10 @@ function validateLedgerRecord(value, descriptor) {
|
|
|
231
264
|
corrupt("knowledge sync ledger record binding is invalid");
|
|
232
265
|
}
|
|
233
266
|
if (
|
|
234
|
-
(current &&
|
|
267
|
+
((current || version3 || version2) &&
|
|
235
268
|
value.operationId !== null &&
|
|
236
269
|
!SAFE_ID.test(value.operationId ?? "")) ||
|
|
237
|
-
(!current && Object.hasOwn(value, "operationId"))
|
|
270
|
+
(!current && !version3 && !version2 && Object.hasOwn(value, "operationId"))
|
|
238
271
|
) {
|
|
239
272
|
corrupt("knowledge sync operation binding is invalid");
|
|
240
273
|
}
|
|
@@ -246,6 +279,33 @@ function validateLedgerRecord(value, descriptor) {
|
|
|
246
279
|
if (value.conflictWithDigest !== conflictWithDigest) {
|
|
247
280
|
corrupt("knowledge sync conflict digest was substituted");
|
|
248
281
|
}
|
|
282
|
+
if (current || version3) {
|
|
283
|
+
if (current || value.disposition === "local") {
|
|
284
|
+
try {
|
|
285
|
+
const binding = verifyGovernedKnowledgeArtifactBinding(
|
|
286
|
+
value.artifactBinding,
|
|
287
|
+
{
|
|
288
|
+
tenantId: descriptor.tenantId,
|
|
289
|
+
knowledge: value.knowledge,
|
|
290
|
+
authorizationReceiptDigest: value.authorizationReceiptDigest,
|
|
291
|
+
},
|
|
292
|
+
);
|
|
293
|
+
if (
|
|
294
|
+
current &&
|
|
295
|
+
(binding.activate !== (value.disposition !== "conflict") ||
|
|
296
|
+
(value.disposition === "local"
|
|
297
|
+
? !["publish", "merge"].includes(binding.operation)
|
|
298
|
+
: binding.operation !== "receive"))
|
|
299
|
+
) {
|
|
300
|
+
corrupt("knowledge sync artifact activation binding is invalid");
|
|
301
|
+
}
|
|
302
|
+
} catch {
|
|
303
|
+
corrupt("knowledge sync artifact binding is invalid");
|
|
304
|
+
}
|
|
305
|
+
} else if (value.artifactBinding !== null) {
|
|
306
|
+
corrupt("remote knowledge sync cannot claim an artifact binding");
|
|
307
|
+
}
|
|
308
|
+
}
|
|
249
309
|
validateEnvelope(
|
|
250
310
|
value.envelope,
|
|
251
311
|
value.knowledge,
|
|
@@ -398,6 +458,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
|
|
|
398
458
|
disposition,
|
|
399
459
|
authorizationReceiptDigest,
|
|
400
460
|
operationId = null,
|
|
461
|
+
artifactBinding = null,
|
|
401
462
|
} = {}) => {
|
|
402
463
|
if (!DISPOSITIONS.has(disposition)) {
|
|
403
464
|
throw new TypeError("knowledge sync disposition is invalid");
|
|
@@ -451,6 +512,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
|
|
|
451
512
|
conflictWithDigest,
|
|
452
513
|
authorizationReceiptDigest,
|
|
453
514
|
operationId,
|
|
515
|
+
artifactBinding,
|
|
454
516
|
};
|
|
455
517
|
if (canonical(stableExisting) !== canonical(stableRequest)) {
|
|
456
518
|
corrupt("knowledge sync event identity resolved different content");
|
|
@@ -479,6 +541,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
|
|
|
479
541
|
conflictWithDigest,
|
|
480
542
|
authorizationReceiptDigest,
|
|
481
543
|
operationId,
|
|
544
|
+
artifactBinding: clone(artifactBinding),
|
|
482
545
|
committedAt,
|
|
483
546
|
};
|
|
484
547
|
const record = Object.freeze({
|
|
@@ -556,7 +619,11 @@ export class GovernedKnowledgeSyncLedgerAdapter {
|
|
|
556
619
|
)
|
|
557
620
|
).filter(
|
|
558
621
|
(record) =>
|
|
559
|
-
|
|
622
|
+
[
|
|
623
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
|
|
624
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
|
|
625
|
+
GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA,
|
|
626
|
+
].includes(record.schema) &&
|
|
560
627
|
record.disposition === "local" &&
|
|
561
628
|
record.operationId === normalizedId,
|
|
562
629
|
);
|
|
@@ -566,6 +633,24 @@ export class GovernedKnowledgeSyncLedgerAdapter {
|
|
|
566
633
|
return matches[0] ?? null;
|
|
567
634
|
};
|
|
568
635
|
|
|
636
|
+
getReception = async ({ envelopeDigest } = {}) => {
|
|
637
|
+
if (!DIGEST.test(envelopeDigest ?? "")) {
|
|
638
|
+
throw new TypeError("knowledge reception envelope digest is invalid");
|
|
639
|
+
}
|
|
640
|
+
const matches = (
|
|
641
|
+
await Promise.all(
|
|
642
|
+
this._events().map((event) => this._resolveEvent(event)),
|
|
643
|
+
)
|
|
644
|
+
).filter(
|
|
645
|
+
(record) =>
|
|
646
|
+
record.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA &&
|
|
647
|
+
["remote", "conflict"].includes(record.disposition) &&
|
|
648
|
+
record.envelopeDigest === envelopeDigest,
|
|
649
|
+
);
|
|
650
|
+
if (matches.length > 1) corrupt("knowledge reception is ambiguous");
|
|
651
|
+
return matches[0] ?? null;
|
|
652
|
+
};
|
|
653
|
+
|
|
569
654
|
listConflicts = async ({ cursor = 0, limit = 50 } = {}) => {
|
|
570
655
|
if (
|
|
571
656
|
!Number.isSafeInteger(cursor) ||
|
|
@@ -629,6 +714,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
|
|
|
629
714
|
send: capture(send, "send", "send"),
|
|
630
715
|
load: this.load,
|
|
631
716
|
loadPublication: this.getPublication,
|
|
717
|
+
loadReception: this.getReception,
|
|
632
718
|
commit: this.commit,
|
|
633
719
|
});
|
|
634
720
|
}
|
|
@@ -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,
|