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
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { types as utilTypes } from "node:util";
|
|
2
|
+
|
|
3
|
+
import evolvableArtifactProtocol from "@chainlesschain/session-core/evolvable-artifact";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
isEvolvableArtifactReleaseResolver,
|
|
7
|
+
isEvolvableArtifactTransitionReader,
|
|
8
|
+
} from "./evolvable-artifact-ledger-adapter.js";
|
|
9
|
+
import { verifyGovernedKnowledgeRecord } from "./governed-knowledge-sync.js";
|
|
10
|
+
|
|
11
|
+
const {
|
|
12
|
+
ARTIFACT_TYPE,
|
|
13
|
+
createEvolvableArtifactReceipt,
|
|
14
|
+
digestEvolvableArtifactValue,
|
|
15
|
+
isEvolvableArtifactCandidateGate,
|
|
16
|
+
isEvolvableArtifactReleaseGate,
|
|
17
|
+
} = evolvableArtifactProtocol;
|
|
18
|
+
|
|
19
|
+
export const GOVERNED_KNOWLEDGE_ARTIFACT_LIFECYCLE_SCHEMA =
|
|
20
|
+
"chainlesschain.governed-knowledge-artifact-lifecycle/v1";
|
|
21
|
+
|
|
22
|
+
const LIFECYCLES = new WeakSet();
|
|
23
|
+
const DIGEST = /^sha256:[a-f0-9]{64}$/u;
|
|
24
|
+
const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
|
|
25
|
+
const OPERATIONS = new Set(["publish", "receive", "merge"]);
|
|
26
|
+
|
|
27
|
+
function freeze(value) {
|
|
28
|
+
const result = structuredClone(value);
|
|
29
|
+
function visit(entry) {
|
|
30
|
+
if (entry && typeof entry === "object" && !Object.isFrozen(entry)) {
|
|
31
|
+
Object.freeze(entry);
|
|
32
|
+
for (const child of Object.values(entry)) visit(child);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
visit(result);
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function capture(owner, method, label) {
|
|
40
|
+
if (
|
|
41
|
+
!owner ||
|
|
42
|
+
typeof owner !== "object" ||
|
|
43
|
+
utilTypes.isProxy(owner) ||
|
|
44
|
+
typeof owner[method] !== "function"
|
|
45
|
+
)
|
|
46
|
+
throw new TypeError(`${label}.${method}() is required`);
|
|
47
|
+
return (...args) => Reflect.apply(owner[method], owner, args);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function manifest(body) {
|
|
51
|
+
return freeze({ ...body, digest: digestEvolvableArtifactValue(body) });
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function receipt(artifact, kind, issuedAt, operationDigest, claims) {
|
|
55
|
+
return createEvolvableArtifactReceipt({
|
|
56
|
+
kind,
|
|
57
|
+
tenantId: artifact.tenantId,
|
|
58
|
+
artifactId: artifact.artifactId,
|
|
59
|
+
candidateId: artifact.candidate.candidateId,
|
|
60
|
+
contentDigest: artifact.contentDigest,
|
|
61
|
+
dependencyLockDigest: artifact.dependencyLock.digest,
|
|
62
|
+
issuerId: `governed-knowledge-lifecycle:${kind}`,
|
|
63
|
+
issuerRevision: "v1",
|
|
64
|
+
issuedAt,
|
|
65
|
+
decision: "allow",
|
|
66
|
+
claims: { operationDigest, ...claims },
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function createGovernedKnowledgeArtifactLifecycle({
|
|
71
|
+
tenantId,
|
|
72
|
+
artifactCandidateGate,
|
|
73
|
+
artifactReleaseGate,
|
|
74
|
+
artifactReleaseResolver,
|
|
75
|
+
verifierArtifactTransitionReader,
|
|
76
|
+
} = {}) {
|
|
77
|
+
if (typeof tenantId !== "string" || tenantId.trim() === "")
|
|
78
|
+
throw new TypeError("tenantId is required");
|
|
79
|
+
if (
|
|
80
|
+
!isEvolvableArtifactCandidateGate(
|
|
81
|
+
artifactCandidateGate,
|
|
82
|
+
ARTIFACT_TYPE.KNOWLEDGE,
|
|
83
|
+
) ||
|
|
84
|
+
artifactCandidateGate.tenantId !== tenantId
|
|
85
|
+
)
|
|
86
|
+
throw new TypeError("a tenant-bound Knowledge candidate gate is required");
|
|
87
|
+
if (
|
|
88
|
+
!isEvolvableArtifactReleaseGate(
|
|
89
|
+
artifactReleaseGate,
|
|
90
|
+
ARTIFACT_TYPE.KNOWLEDGE,
|
|
91
|
+
) ||
|
|
92
|
+
artifactReleaseGate.tenantId !== tenantId ||
|
|
93
|
+
artifactReleaseGate.authorityScope !== artifactCandidateGate.authorityScope
|
|
94
|
+
)
|
|
95
|
+
throw new TypeError("a same-authority Knowledge release gate is required");
|
|
96
|
+
if (
|
|
97
|
+
!isEvolvableArtifactReleaseResolver(artifactReleaseResolver) ||
|
|
98
|
+
artifactReleaseResolver.tenantId !== tenantId
|
|
99
|
+
)
|
|
100
|
+
throw new TypeError("a tenant-bound artifact release resolver is required");
|
|
101
|
+
if (
|
|
102
|
+
!isEvolvableArtifactTransitionReader(verifierArtifactTransitionReader) ||
|
|
103
|
+
verifierArtifactTransitionReader.tenantId !== tenantId ||
|
|
104
|
+
verifierArtifactTransitionReader.readerScope ===
|
|
105
|
+
artifactReleaseGate.transitionReaderScope
|
|
106
|
+
)
|
|
107
|
+
throw new TypeError(
|
|
108
|
+
"an independent artifact transition reader is required",
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
const stageCandidate = capture(
|
|
112
|
+
artifactCandidateGate,
|
|
113
|
+
"stageCandidate",
|
|
114
|
+
"artifactCandidateGate",
|
|
115
|
+
);
|
|
116
|
+
const preparePromotion = capture(
|
|
117
|
+
artifactReleaseGate,
|
|
118
|
+
"preparePromotion",
|
|
119
|
+
"artifactReleaseGate",
|
|
120
|
+
);
|
|
121
|
+
const commitPromotion = capture(
|
|
122
|
+
artifactReleaseGate,
|
|
123
|
+
"commitPreparedPromotion",
|
|
124
|
+
"artifactReleaseGate",
|
|
125
|
+
);
|
|
126
|
+
const resolveDependency = capture(
|
|
127
|
+
artifactReleaseResolver,
|
|
128
|
+
"resolveDependency",
|
|
129
|
+
"artifactReleaseResolver",
|
|
130
|
+
);
|
|
131
|
+
const readTransition = capture(
|
|
132
|
+
verifierArtifactTransitionReader,
|
|
133
|
+
"readTransition",
|
|
134
|
+
"verifierArtifactTransitionReader",
|
|
135
|
+
);
|
|
136
|
+
const preparedHandles = new WeakSet();
|
|
137
|
+
|
|
138
|
+
async function resolveOne(dependency) {
|
|
139
|
+
const resolved = await resolveDependency({ tenantId, ...dependency });
|
|
140
|
+
if (
|
|
141
|
+
resolved?.authenticated !== true ||
|
|
142
|
+
resolved.durable !== true ||
|
|
143
|
+
resolved.tenantId !== tenantId ||
|
|
144
|
+
resolved.sourceKind !== dependency.kind ||
|
|
145
|
+
resolved.sourceDigest !== dependency.digest ||
|
|
146
|
+
resolved.sourceDisposition !== dependency.disposition ||
|
|
147
|
+
!DIGEST.test(resolved.artifactDigest ?? "")
|
|
148
|
+
)
|
|
149
|
+
throw new Error("Knowledge artifact dependency resolution is invalid");
|
|
150
|
+
return {
|
|
151
|
+
artifactId: resolved.artifactId,
|
|
152
|
+
type: resolved.type,
|
|
153
|
+
releaseId: resolved.releaseId,
|
|
154
|
+
contentDigest: resolved.contentDigest,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async function resolveBaseline(currentKnowledge) {
|
|
159
|
+
if (currentKnowledge === null) return null;
|
|
160
|
+
const resolved = await resolveOne({
|
|
161
|
+
kind: "active-knowledge",
|
|
162
|
+
digest: currentKnowledge.contentDigest,
|
|
163
|
+
disposition: "baseline",
|
|
164
|
+
});
|
|
165
|
+
if (resolved.artifactId !== currentKnowledge.knowledgeId)
|
|
166
|
+
throw new Error("Knowledge typed baseline resolved another artifact");
|
|
167
|
+
return resolved;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const lifecycle = Object.freeze({
|
|
171
|
+
schema: GOVERNED_KNOWLEDGE_ARTIFACT_LIFECYCLE_SCHEMA,
|
|
172
|
+
tenantId,
|
|
173
|
+
async prepare({
|
|
174
|
+
knowledge: knowledgeInput,
|
|
175
|
+
currentKnowledge: currentInput = null,
|
|
176
|
+
operation,
|
|
177
|
+
operationId,
|
|
178
|
+
authorizationReceiptDigest,
|
|
179
|
+
evidenceDigest = null,
|
|
180
|
+
issuedAt,
|
|
181
|
+
activate = true,
|
|
182
|
+
humanReviewed = false,
|
|
183
|
+
} = {}) {
|
|
184
|
+
if (!OPERATIONS.has(operation))
|
|
185
|
+
throw new TypeError("Knowledge lifecycle operation is invalid");
|
|
186
|
+
if (!ID.test(operationId ?? ""))
|
|
187
|
+
throw new TypeError("Knowledge lifecycle operationId is required");
|
|
188
|
+
if (!DIGEST.test(authorizationReceiptDigest ?? ""))
|
|
189
|
+
throw new TypeError("authorizationReceiptDigest is invalid");
|
|
190
|
+
if (!Number.isFinite(Date.parse(issuedAt)))
|
|
191
|
+
throw new TypeError("Knowledge lifecycle issuedAt is invalid");
|
|
192
|
+
const boundEvidenceDigest = evidenceDigest ?? authorizationReceiptDigest;
|
|
193
|
+
if (
|
|
194
|
+
!DIGEST.test(boundEvidenceDigest) ||
|
|
195
|
+
typeof humanReviewed !== "boolean"
|
|
196
|
+
)
|
|
197
|
+
throw new TypeError("Knowledge lifecycle evidence is invalid");
|
|
198
|
+
const knowledge = verifyGovernedKnowledgeRecord(knowledgeInput, {
|
|
199
|
+
tenantId,
|
|
200
|
+
});
|
|
201
|
+
const currentKnowledge =
|
|
202
|
+
currentInput === null
|
|
203
|
+
? null
|
|
204
|
+
: verifyGovernedKnowledgeRecord(currentInput, { tenantId });
|
|
205
|
+
if (
|
|
206
|
+
currentKnowledge !== null &&
|
|
207
|
+
(currentKnowledge.knowledgeId !== knowledge.knowledgeId ||
|
|
208
|
+
currentKnowledge.scope !== knowledge.scope ||
|
|
209
|
+
currentKnowledge.scopeId !== knowledge.scopeId)
|
|
210
|
+
)
|
|
211
|
+
throw new Error("Knowledge lifecycle baseline boundary changed");
|
|
212
|
+
const baseline = await resolveBaseline(currentKnowledge);
|
|
213
|
+
const dependencies = [];
|
|
214
|
+
if (knowledge.action === "upsert") {
|
|
215
|
+
for (const dependency of knowledge.dependencies)
|
|
216
|
+
dependencies.push(await resolveOne(dependency));
|
|
217
|
+
}
|
|
218
|
+
dependencies.sort((left, right) =>
|
|
219
|
+
left.artifactId.localeCompare(right.artifactId),
|
|
220
|
+
);
|
|
221
|
+
const dependencyLock = {
|
|
222
|
+
dependencies,
|
|
223
|
+
digest: digestEvolvableArtifactValue({ dependencies }),
|
|
224
|
+
};
|
|
225
|
+
const operationCore = {
|
|
226
|
+
tenantId,
|
|
227
|
+
operation,
|
|
228
|
+
operationId,
|
|
229
|
+
knowledgeId: knowledge.knowledgeId,
|
|
230
|
+
contentDigest: knowledge.contentDigest,
|
|
231
|
+
currentContentDigest: currentKnowledge?.contentDigest ?? null,
|
|
232
|
+
authorizationReceiptDigest,
|
|
233
|
+
evidenceDigest: boundEvidenceDigest,
|
|
234
|
+
humanReviewed,
|
|
235
|
+
};
|
|
236
|
+
const operationDigest = digestEvolvableArtifactValue(operationCore);
|
|
237
|
+
const staged = await stageCandidate({
|
|
238
|
+
tenantId,
|
|
239
|
+
artifactId: knowledge.knowledgeId,
|
|
240
|
+
type: ARTIFACT_TYPE.KNOWLEDGE,
|
|
241
|
+
contentDigest: knowledge.contentDigest,
|
|
242
|
+
parent:
|
|
243
|
+
baseline === null
|
|
244
|
+
? null
|
|
245
|
+
: {
|
|
246
|
+
artifactId: baseline.artifactId,
|
|
247
|
+
releaseId: baseline.releaseId,
|
|
248
|
+
contentDigest: baseline.contentDigest,
|
|
249
|
+
},
|
|
250
|
+
lineage: [
|
|
251
|
+
...(currentKnowledge ? [currentKnowledge.contentDigest] : []),
|
|
252
|
+
knowledge.contentDigest,
|
|
253
|
+
],
|
|
254
|
+
dependencyLock,
|
|
255
|
+
runtimeManifest: manifest({
|
|
256
|
+
executable: false,
|
|
257
|
+
operation,
|
|
258
|
+
operationId,
|
|
259
|
+
operationDigest,
|
|
260
|
+
action: knowledge.action,
|
|
261
|
+
scope: knowledge.scope,
|
|
262
|
+
scopeId: knowledge.scopeId,
|
|
263
|
+
vectorClock: knowledge.vectorClock,
|
|
264
|
+
dependencyDispositionDigest: digestEvolvableArtifactValue(
|
|
265
|
+
knowledge.dependencies,
|
|
266
|
+
),
|
|
267
|
+
}),
|
|
268
|
+
permissionManifest: manifest({
|
|
269
|
+
authorizationReceiptDigest,
|
|
270
|
+
approvalReceiptDigest: knowledge.approvalReceiptDigest,
|
|
271
|
+
revocationReceiptDigest: knowledge.revocationReceiptDigest,
|
|
272
|
+
capabilities: [`knowledge:${knowledge.scope}:${operation}`],
|
|
273
|
+
}),
|
|
274
|
+
candidateId: `knowledge-candidate:${operationDigest.slice(7)}`,
|
|
275
|
+
activeReleaseId: baseline?.releaseId ?? null,
|
|
276
|
+
lastKnownGoodReleaseId: null,
|
|
277
|
+
});
|
|
278
|
+
const promotion = activate
|
|
279
|
+
? preparePromotion({
|
|
280
|
+
artifact: staged.artifact,
|
|
281
|
+
candidatePersistenceReceipt: staged.receipt,
|
|
282
|
+
evaluationReceipt: receipt(
|
|
283
|
+
staged.artifact,
|
|
284
|
+
"eval",
|
|
285
|
+
issuedAt,
|
|
286
|
+
operationDigest,
|
|
287
|
+
{ authorizationReceiptDigest },
|
|
288
|
+
),
|
|
289
|
+
reviewReceipt: receipt(
|
|
290
|
+
staged.artifact,
|
|
291
|
+
"review",
|
|
292
|
+
issuedAt,
|
|
293
|
+
operationDigest,
|
|
294
|
+
{
|
|
295
|
+
approvalReceiptDigest: knowledge.approvalReceiptDigest,
|
|
296
|
+
automated: !humanReviewed,
|
|
297
|
+
evidenceDigest: boundEvidenceDigest,
|
|
298
|
+
},
|
|
299
|
+
),
|
|
300
|
+
promotionReceipt: receipt(
|
|
301
|
+
staged.artifact,
|
|
302
|
+
"promotion",
|
|
303
|
+
issuedAt,
|
|
304
|
+
operationDigest,
|
|
305
|
+
{ operationId },
|
|
306
|
+
),
|
|
307
|
+
releaseId: `knowledge-release:${operationDigest.slice(7)}`,
|
|
308
|
+
})
|
|
309
|
+
: null;
|
|
310
|
+
const prepared = Object.freeze({
|
|
311
|
+
operationDigest,
|
|
312
|
+
operation,
|
|
313
|
+
operationId,
|
|
314
|
+
candidate: staged,
|
|
315
|
+
promotion,
|
|
316
|
+
activate,
|
|
317
|
+
});
|
|
318
|
+
preparedHandles.add(prepared);
|
|
319
|
+
return prepared;
|
|
320
|
+
},
|
|
321
|
+
async commit(prepared) {
|
|
322
|
+
if (!preparedHandles.has(prepared))
|
|
323
|
+
throw new TypeError(
|
|
324
|
+
"a prepared Knowledge lifecycle handle is required",
|
|
325
|
+
);
|
|
326
|
+
if (!prepared.activate)
|
|
327
|
+
return freeze({
|
|
328
|
+
candidateOnly: true,
|
|
329
|
+
artifactCandidateDigest: prepared.candidate.artifact.artifactDigest,
|
|
330
|
+
operationDigest: prepared.operationDigest,
|
|
331
|
+
});
|
|
332
|
+
const committed = await commitPromotion(prepared.promotion);
|
|
333
|
+
const readback = await readTransition({
|
|
334
|
+
operationId: committed.receipt.operationId,
|
|
335
|
+
});
|
|
336
|
+
if (
|
|
337
|
+
readback?.request?.previousArtifactDigest !==
|
|
338
|
+
prepared.candidate.artifact.artifactDigest ||
|
|
339
|
+
readback.request.nextArtifactDigest !==
|
|
340
|
+
committed.artifact.artifactDigest ||
|
|
341
|
+
readback.artifact.artifactDigest !==
|
|
342
|
+
committed.artifact.artifactDigest ||
|
|
343
|
+
readback.receipt.receiptDigest !== committed.receipt.receiptDigest ||
|
|
344
|
+
readback.receipt.durable !== true
|
|
345
|
+
)
|
|
346
|
+
throw new Error("Knowledge artifact transition readback is invalid");
|
|
347
|
+
return freeze({
|
|
348
|
+
candidateOnly: false,
|
|
349
|
+
operationDigest: prepared.operationDigest,
|
|
350
|
+
artifactCandidateDigest: prepared.candidate.artifact.artifactDigest,
|
|
351
|
+
artifactDigest: committed.artifact.artifactDigest,
|
|
352
|
+
artifactReleaseId: committed.artifact.activeReleaseId,
|
|
353
|
+
artifactTransitionOperationId: committed.receipt.operationId,
|
|
354
|
+
artifactTransitionReceiptDigest: committed.receipt.receiptDigest,
|
|
355
|
+
});
|
|
356
|
+
},
|
|
357
|
+
});
|
|
358
|
+
LIFECYCLES.add(lifecycle);
|
|
359
|
+
return lifecycle;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export function isGovernedKnowledgeArtifactLifecycle(value) {
|
|
363
|
+
return LIFECYCLES.has(value);
|
|
364
|
+
}
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
} from "./governed-knowledge-conflict-merge.js";
|
|
16
16
|
import {
|
|
17
17
|
GOVERNED_KNOWLEDGE_MERGE_PUBLISH_REQUEST_SCHEMA,
|
|
18
|
+
GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_LEGACY_SCHEMA,
|
|
18
19
|
GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_SCHEMA,
|
|
19
20
|
digestGovernedKnowledgeMergePublishResult,
|
|
20
21
|
isGovernedKnowledgeMergePublisherAuthority,
|
|
@@ -55,6 +56,11 @@ const SETTLED_KEYS = new Set([
|
|
|
55
56
|
]);
|
|
56
57
|
const PUBLISH_EVIDENCE_KEYS = new Set([
|
|
57
58
|
"attestation",
|
|
59
|
+
"artifactCandidateDigest",
|
|
60
|
+
"artifactDigest",
|
|
61
|
+
"artifactReleaseId",
|
|
62
|
+
"artifactTransitionOperationId",
|
|
63
|
+
"artifactTransitionReceiptDigest",
|
|
58
64
|
"deviceId",
|
|
59
65
|
"durable",
|
|
60
66
|
"envelopeDigest",
|
|
@@ -73,6 +79,9 @@ const PUBLISH_EVIDENCE_KEYS = new Set([
|
|
|
73
79
|
"tenantId",
|
|
74
80
|
"verificationReceiptDigest",
|
|
75
81
|
]);
|
|
82
|
+
const LEGACY_PUBLISH_EVIDENCE_KEYS = new Set(
|
|
83
|
+
[...PUBLISH_EVIDENCE_KEYS].filter((key) => !key.startsWith("artifact")),
|
|
84
|
+
);
|
|
76
85
|
|
|
77
86
|
function canonical(value) {
|
|
78
87
|
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
@@ -181,7 +190,13 @@ function settledCore(value) {
|
|
|
181
190
|
}
|
|
182
191
|
|
|
183
192
|
function validatePublishEvidence(value, plan, descriptorValue) {
|
|
184
|
-
|
|
193
|
+
const legacy =
|
|
194
|
+
value?.schema === GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_LEGACY_SCHEMA;
|
|
195
|
+
exact(
|
|
196
|
+
value,
|
|
197
|
+
legacy ? LEGACY_PUBLISH_EVIDENCE_KEYS : PUBLISH_EVIDENCE_KEYS,
|
|
198
|
+
"merge publish evidence",
|
|
199
|
+
);
|
|
185
200
|
const requestCore = {
|
|
186
201
|
schema: GOVERNED_KNOWLEDGE_MERGE_PUBLISH_REQUEST_SCHEMA,
|
|
187
202
|
tenantId: plan.tenantId,
|
|
@@ -193,7 +208,10 @@ function validatePublishEvidence(value, plan, descriptorValue) {
|
|
|
193
208
|
mergedKnowledge: plan.mergedKnowledge,
|
|
194
209
|
};
|
|
195
210
|
if (
|
|
196
|
-
|
|
211
|
+
![
|
|
212
|
+
GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_SCHEMA,
|
|
213
|
+
GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_LEGACY_SCHEMA,
|
|
214
|
+
].includes(value.schema) ||
|
|
197
215
|
value.tenantId !== descriptorValue.tenantId ||
|
|
198
216
|
value.deviceId !== descriptorValue.deviceId ||
|
|
199
217
|
value.operationId !== `knowledge-merge:${plan.planDigest.slice(7)}` ||
|
|
@@ -207,6 +225,15 @@ function validatePublishEvidence(value, plan, descriptorValue) {
|
|
|
207
225
|
!DIGEST.test(value.envelopeDigest ?? "") ||
|
|
208
226
|
!DIGEST.test(value.resultDigest ?? "") ||
|
|
209
227
|
!DIGEST.test(value.verificationReceiptDigest ?? "") ||
|
|
228
|
+
(!legacy &&
|
|
229
|
+
(!DIGEST.test(value.artifactCandidateDigest ?? "") ||
|
|
230
|
+
!DIGEST.test(value.artifactDigest ?? "") ||
|
|
231
|
+
!ID.test(value.artifactReleaseId ?? "") ||
|
|
232
|
+
!ID.test(value.artifactTransitionOperationId ?? "") ||
|
|
233
|
+
!value.artifactTransitionOperationId.startsWith(
|
|
234
|
+
"artifact-transition:",
|
|
235
|
+
) ||
|
|
236
|
+
!DIGEST.test(value.artifactTransitionReceiptDigest ?? ""))) ||
|
|
210
237
|
value.resultDigest !== digestGovernedKnowledgeMergePublishResult(value)
|
|
211
238
|
) {
|
|
212
239
|
corrupt("merge publish evidence is not exactly bound");
|
|
@@ -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 ||
|