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
|
@@ -2,11 +2,16 @@ 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";
|
|
5
6
|
|
|
6
7
|
export const GOVERNED_KNOWLEDGE_SYNC_SCHEMA =
|
|
7
8
|
"chainlesschain.governed-evolution-knowledge-sync/v1";
|
|
8
9
|
export const GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA =
|
|
9
10
|
"chainlesschain.governed-evolution-knowledge-envelope/v1";
|
|
11
|
+
export const GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA =
|
|
12
|
+
"chainlesschain.governed-knowledge-artifact-binding/v2";
|
|
13
|
+
export const GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_LEGACY_SCHEMA =
|
|
14
|
+
"chainlesschain.governed-knowledge-artifact-binding/v1";
|
|
10
15
|
export const GOVERNED_KNOWLEDGE_SCOPE = Object.freeze({
|
|
11
16
|
PERSONAL: "personal",
|
|
12
17
|
PROJECT: "project",
|
|
@@ -37,6 +42,20 @@ const ENVELOPE_KEYS = new Set([
|
|
|
37
42
|
"tenantId",
|
|
38
43
|
"vectorClock",
|
|
39
44
|
]);
|
|
45
|
+
const ARTIFACT_BINDING_KEYS = new Set([
|
|
46
|
+
"activate",
|
|
47
|
+
"authorizationReceiptDigest",
|
|
48
|
+
"baseline",
|
|
49
|
+
"evidenceDigest",
|
|
50
|
+
"humanReviewed",
|
|
51
|
+
"issuedAt",
|
|
52
|
+
"operationId",
|
|
53
|
+
"operation",
|
|
54
|
+
"schema",
|
|
55
|
+
]);
|
|
56
|
+
const LEGACY_ARTIFACT_BINDING_KEYS = new Set(
|
|
57
|
+
[...ARTIFACT_BINDING_KEYS].filter((key) => key !== "activate"),
|
|
58
|
+
);
|
|
40
59
|
|
|
41
60
|
function canonical(value) {
|
|
42
61
|
if (value === null || typeof value !== "object") return JSON.stringify(value);
|
|
@@ -206,6 +225,53 @@ export function verifyGovernedKnowledgeRecord(input, { tenantId } = {}) {
|
|
|
206
225
|
return normalizeRecord(input, { tenantId: id(tenantId, "tenantId") });
|
|
207
226
|
}
|
|
208
227
|
|
|
228
|
+
export function verifyGovernedKnowledgeArtifactBinding(
|
|
229
|
+
input,
|
|
230
|
+
{ tenantId, knowledge, authorizationReceiptDigest } = {},
|
|
231
|
+
) {
|
|
232
|
+
record(input, "knowledge artifact binding");
|
|
233
|
+
const expectedTenantId = id(tenantId, "tenantId");
|
|
234
|
+
const normalizedKnowledge = verifyGovernedKnowledgeRecord(knowledge, {
|
|
235
|
+
tenantId: expectedTenantId,
|
|
236
|
+
});
|
|
237
|
+
const keys = Reflect.ownKeys(input);
|
|
238
|
+
const current = input.schema === GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA;
|
|
239
|
+
const legacy =
|
|
240
|
+
input.schema === GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_LEGACY_SCHEMA;
|
|
241
|
+
const expectedKeys = current
|
|
242
|
+
? ARTIFACT_BINDING_KEYS
|
|
243
|
+
: LEGACY_ARTIFACT_BINDING_KEYS;
|
|
244
|
+
const baseline =
|
|
245
|
+
input.baseline === null
|
|
246
|
+
? null
|
|
247
|
+
: verifyGovernedKnowledgeRecord(input.baseline, {
|
|
248
|
+
tenantId: expectedTenantId,
|
|
249
|
+
});
|
|
250
|
+
if (
|
|
251
|
+
(!current && !legacy) ||
|
|
252
|
+
keys.length !== expectedKeys.size ||
|
|
253
|
+
keys.some((key) => typeof key !== "string" || !expectedKeys.has(key)) ||
|
|
254
|
+
!ID.test(input.operationId ?? "") ||
|
|
255
|
+
!(
|
|
256
|
+
current ? ["publish", "merge", "receive"] : ["publish", "merge"]
|
|
257
|
+
).includes(input.operation) ||
|
|
258
|
+
(current && typeof input.activate !== "boolean") ||
|
|
259
|
+
!Number.isFinite(Date.parse(input.issuedAt)) ||
|
|
260
|
+
input.authorizationReceiptDigest !== authorizationReceiptDigest ||
|
|
261
|
+
!DIGEST.test(input.authorizationReceiptDigest ?? "") ||
|
|
262
|
+
!DIGEST.test(input.evidenceDigest ?? "") ||
|
|
263
|
+
typeof input.humanReviewed !== "boolean" ||
|
|
264
|
+
(baseline !== null &&
|
|
265
|
+
(baseline.knowledgeId !== normalizedKnowledge.knowledgeId ||
|
|
266
|
+
baseline.scope !== normalizedKnowledge.scope ||
|
|
267
|
+
baseline.scopeId !== normalizedKnowledge.scopeId)) ||
|
|
268
|
+
canonical(baseline) !== canonical(input.baseline)
|
|
269
|
+
) {
|
|
270
|
+
throw new Error("knowledge artifact binding is invalid");
|
|
271
|
+
}
|
|
272
|
+
return freeze(clone(input));
|
|
273
|
+
}
|
|
274
|
+
|
|
209
275
|
export function isGovernedKnowledgeExecutionRecord(value) {
|
|
210
276
|
return EXECUTION_RECORDS.has(value);
|
|
211
277
|
}
|
|
@@ -250,7 +316,14 @@ export function verifyGovernedKnowledgeEnvelopeIntegrity(
|
|
|
250
316
|
}
|
|
251
317
|
|
|
252
318
|
export class GovernedKnowledgeSync {
|
|
253
|
-
constructor({
|
|
319
|
+
constructor({
|
|
320
|
+
tenantId,
|
|
321
|
+
deviceId,
|
|
322
|
+
ports,
|
|
323
|
+
dependencyExecutor = null,
|
|
324
|
+
artifactLifecycle,
|
|
325
|
+
clock = () => Date.now(),
|
|
326
|
+
} = {}) {
|
|
254
327
|
this.tenantId = id(tenantId, "tenantId");
|
|
255
328
|
this.deviceId = id(deviceId, "deviceId");
|
|
256
329
|
this._authorize = capture(ports, "authorize");
|
|
@@ -265,6 +338,16 @@ export class GovernedKnowledgeSync {
|
|
|
265
338
|
ports?.loadPublication === undefined
|
|
266
339
|
? null
|
|
267
340
|
: capture(ports, "loadPublication");
|
|
341
|
+
this._loadReception = capture(ports, "loadReception");
|
|
342
|
+
if (!isGovernedKnowledgeArtifactLifecycle(artifactLifecycle)) {
|
|
343
|
+
throw new TypeError(
|
|
344
|
+
"a branded governed Knowledge artifact lifecycle is required",
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
this._prepareArtifact = capture(artifactLifecycle, "prepare");
|
|
348
|
+
this._commitArtifact = capture(artifactLifecycle, "commit");
|
|
349
|
+
if (typeof clock !== "function") throw new TypeError("clock is required");
|
|
350
|
+
this._clock = clock;
|
|
268
351
|
if (
|
|
269
352
|
dependencyExecutor !== null &&
|
|
270
353
|
!isGovernedKnowledgeDependencyExecutor(dependencyExecutor)
|
|
@@ -279,7 +362,20 @@ export class GovernedKnowledgeSync {
|
|
|
279
362
|
SYNCHRONIZERS.add(this);
|
|
280
363
|
}
|
|
281
364
|
|
|
282
|
-
async publish(input,
|
|
365
|
+
async publish(input, options = {}) {
|
|
366
|
+
const result = await this.publishWithArtifactEvidence(input, options);
|
|
367
|
+
return result.envelope;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
async publishWithArtifactEvidence(
|
|
371
|
+
input,
|
|
372
|
+
{
|
|
373
|
+
operationId = null,
|
|
374
|
+
artifactOperation = "publish",
|
|
375
|
+
artifactEvidenceDigest = null,
|
|
376
|
+
artifactHumanReviewed = false,
|
|
377
|
+
} = {},
|
|
378
|
+
) {
|
|
283
379
|
const knowledge = normalizeRecord(input, this, { executionRecord: true });
|
|
284
380
|
if (knowledge.scope === "personal")
|
|
285
381
|
throw new Error("personal knowledge cannot enter a shared sync channel");
|
|
@@ -301,6 +397,32 @@ export class GovernedKnowledgeSync {
|
|
|
301
397
|
throw new Error("publish operationId resolved different knowledge");
|
|
302
398
|
}
|
|
303
399
|
verifyGovernedKnowledgeEnvelopeIntegrity(existing.envelope, this);
|
|
400
|
+
const binding = verifyGovernedKnowledgeArtifactBinding(
|
|
401
|
+
existing.artifactBinding,
|
|
402
|
+
{
|
|
403
|
+
tenantId: this.tenantId,
|
|
404
|
+
knowledge,
|
|
405
|
+
authorizationReceiptDigest: existing.authorizationReceiptDigest,
|
|
406
|
+
},
|
|
407
|
+
);
|
|
408
|
+
if (
|
|
409
|
+
artifactOperation !== binding.operation ||
|
|
410
|
+
(artifactEvidenceDigest !== null &&
|
|
411
|
+
artifactEvidenceDigest !== binding.evidenceDigest) ||
|
|
412
|
+
artifactHumanReviewed !== binding.humanReviewed
|
|
413
|
+
) {
|
|
414
|
+
throw new Error("publish artifact recovery binding differs");
|
|
415
|
+
}
|
|
416
|
+
const prepared = await this._prepareArtifact({
|
|
417
|
+
knowledge,
|
|
418
|
+
currentKnowledge: binding.baseline,
|
|
419
|
+
operation: binding.operation,
|
|
420
|
+
operationId: binding.operationId,
|
|
421
|
+
authorizationReceiptDigest: binding.authorizationReceiptDigest,
|
|
422
|
+
evidenceDigest: binding.evidenceDigest,
|
|
423
|
+
issuedAt: binding.issuedAt,
|
|
424
|
+
humanReviewed: binding.humanReviewed,
|
|
425
|
+
});
|
|
304
426
|
const sent = await this._send({ envelope: existing.envelope });
|
|
305
427
|
if (
|
|
306
428
|
sent?.durable !== true ||
|
|
@@ -308,10 +430,51 @@ export class GovernedKnowledgeSync {
|
|
|
308
430
|
) {
|
|
309
431
|
throw new Error("sync transport did not durably accept the envelope");
|
|
310
432
|
}
|
|
311
|
-
|
|
433
|
+
const artifact = await this._commitArtifact(prepared);
|
|
434
|
+
return freeze({
|
|
435
|
+
envelope: clone(existing.envelope),
|
|
436
|
+
artifact: clone(artifact),
|
|
437
|
+
recovered: true,
|
|
438
|
+
});
|
|
312
439
|
}
|
|
313
440
|
}
|
|
314
441
|
const admission = await this._admit("publish", knowledge);
|
|
442
|
+
const current = await this._load({ knowledgeId: knowledge.knowledgeId });
|
|
443
|
+
const effectiveOperationId =
|
|
444
|
+
operationId ??
|
|
445
|
+
`knowledge-publish:${hash(
|
|
446
|
+
"chainlesschain.governed-knowledge-publish-operation/v1",
|
|
447
|
+
{ tenantId: this.tenantId, deviceId: this.deviceId, knowledge },
|
|
448
|
+
).slice(7)}`;
|
|
449
|
+
const milliseconds = Number(this._clock());
|
|
450
|
+
if (!Number.isFinite(milliseconds))
|
|
451
|
+
throw new TypeError("knowledge sync clock is invalid");
|
|
452
|
+
const binding = freeze({
|
|
453
|
+
schema: GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA,
|
|
454
|
+
activate: true,
|
|
455
|
+
operationId: effectiveOperationId,
|
|
456
|
+
operation: artifactOperation,
|
|
457
|
+
issuedAt: new Date(milliseconds).toISOString(),
|
|
458
|
+
authorizationReceiptDigest: admission.receiptDigest,
|
|
459
|
+
evidenceDigest: artifactEvidenceDigest ?? admission.receiptDigest,
|
|
460
|
+
humanReviewed: artifactHumanReviewed,
|
|
461
|
+
baseline: current === null ? null : clone(current),
|
|
462
|
+
});
|
|
463
|
+
verifyGovernedKnowledgeArtifactBinding(binding, {
|
|
464
|
+
tenantId: this.tenantId,
|
|
465
|
+
knowledge,
|
|
466
|
+
authorizationReceiptDigest: admission.receiptDigest,
|
|
467
|
+
});
|
|
468
|
+
const prepared = await this._prepareArtifact({
|
|
469
|
+
knowledge,
|
|
470
|
+
currentKnowledge: binding.baseline,
|
|
471
|
+
operation: binding.operation,
|
|
472
|
+
operationId: binding.operationId,
|
|
473
|
+
authorizationReceiptDigest: binding.authorizationReceiptDigest,
|
|
474
|
+
evidenceDigest: binding.evidenceDigest,
|
|
475
|
+
issuedAt: binding.issuedAt,
|
|
476
|
+
humanReviewed: binding.humanReviewed,
|
|
477
|
+
});
|
|
315
478
|
await this._applyRevocationDependencies(knowledge);
|
|
316
479
|
const plaintext = Buffer.from(canonical(knowledge), "utf8");
|
|
317
480
|
const encrypted = await this._encrypt({ knowledge, plaintext });
|
|
@@ -344,11 +507,19 @@ export class GovernedKnowledgeSync {
|
|
|
344
507
|
envelopeDigest,
|
|
345
508
|
signature: clone(signature),
|
|
346
509
|
});
|
|
347
|
-
await this._persist(
|
|
510
|
+
await this._persist(
|
|
511
|
+
knowledge,
|
|
512
|
+
envelope,
|
|
513
|
+
"local",
|
|
514
|
+
admission,
|
|
515
|
+
operationId,
|
|
516
|
+
binding,
|
|
517
|
+
);
|
|
348
518
|
const sent = await this._send({ envelope });
|
|
349
519
|
if (sent?.durable !== true || sent.envelopeDigest !== envelopeDigest)
|
|
350
520
|
throw new Error("sync transport did not durably accept the envelope");
|
|
351
|
-
|
|
521
|
+
const artifact = await this._commitArtifact(prepared);
|
|
522
|
+
return freeze({ envelope, artifact: clone(artifact), recovered: false });
|
|
352
523
|
}
|
|
353
524
|
|
|
354
525
|
async receive(envelope) {
|
|
@@ -390,6 +561,60 @@ export class GovernedKnowledgeSync {
|
|
|
390
561
|
)
|
|
391
562
|
throw new Error("knowledge envelope substituted its governed record");
|
|
392
563
|
const admission = await this._admit("receive", knowledge);
|
|
564
|
+
const existing = await this._loadReception({
|
|
565
|
+
envelopeDigest: envelope.envelopeDigest,
|
|
566
|
+
});
|
|
567
|
+
if (existing) {
|
|
568
|
+
const comparable = { ...existing.knowledge };
|
|
569
|
+
delete comparable.conflictWithDigest;
|
|
570
|
+
if (
|
|
571
|
+
!["remote", "conflict"].includes(existing.disposition) ||
|
|
572
|
+
existing.envelopeDigest !== envelope.envelopeDigest ||
|
|
573
|
+
canonical(comparable) !== canonical(knowledge)
|
|
574
|
+
) {
|
|
575
|
+
throw new Error("receive envelope resolved different knowledge");
|
|
576
|
+
}
|
|
577
|
+
const binding = verifyGovernedKnowledgeArtifactBinding(
|
|
578
|
+
existing.artifactBinding,
|
|
579
|
+
{
|
|
580
|
+
tenantId: this.tenantId,
|
|
581
|
+
knowledge,
|
|
582
|
+
authorizationReceiptDigest: existing.authorizationReceiptDigest,
|
|
583
|
+
},
|
|
584
|
+
);
|
|
585
|
+
if (
|
|
586
|
+
binding.operation !== "receive" ||
|
|
587
|
+
binding.activate !== (existing.disposition === "remote")
|
|
588
|
+
) {
|
|
589
|
+
throw new Error("receive artifact recovery binding differs");
|
|
590
|
+
}
|
|
591
|
+
const prepared = await this._prepareArtifact({
|
|
592
|
+
knowledge,
|
|
593
|
+
currentKnowledge: binding.baseline,
|
|
594
|
+
operation: binding.operation,
|
|
595
|
+
operationId: binding.operationId,
|
|
596
|
+
authorizationReceiptDigest: binding.authorizationReceiptDigest,
|
|
597
|
+
evidenceDigest: binding.evidenceDigest,
|
|
598
|
+
issuedAt: binding.issuedAt,
|
|
599
|
+
activate: binding.activate,
|
|
600
|
+
humanReviewed: binding.humanReviewed,
|
|
601
|
+
});
|
|
602
|
+
const artifact = await this._commitArtifact(prepared);
|
|
603
|
+
return existing.disposition === "conflict"
|
|
604
|
+
? freeze({
|
|
605
|
+
applied: false,
|
|
606
|
+
reason: "conflict",
|
|
607
|
+
requiresHumanMerge: true,
|
|
608
|
+
recovered: true,
|
|
609
|
+
artifact: clone(artifact),
|
|
610
|
+
})
|
|
611
|
+
: freeze({
|
|
612
|
+
applied: true,
|
|
613
|
+
action: knowledge.action,
|
|
614
|
+
recovered: true,
|
|
615
|
+
artifact: clone(artifact),
|
|
616
|
+
});
|
|
617
|
+
}
|
|
393
618
|
const current = await this._load({ knowledgeId: knowledge.knowledgeId });
|
|
394
619
|
if (current) {
|
|
395
620
|
const order = relation(current.vectorClock, knowledge.vectorClock);
|
|
@@ -400,22 +625,105 @@ export class GovernedKnowledgeSync {
|
|
|
400
625
|
return freeze({ applied: false, reason: "replay" });
|
|
401
626
|
}
|
|
402
627
|
if (order === "concurrent") {
|
|
628
|
+
const binding = this._receiveArtifactBinding({
|
|
629
|
+
knowledge,
|
|
630
|
+
current,
|
|
631
|
+
admission,
|
|
632
|
+
envelope,
|
|
633
|
+
activate: false,
|
|
634
|
+
});
|
|
635
|
+
const prepared = await this._prepareArtifact({
|
|
636
|
+
knowledge,
|
|
637
|
+
currentKnowledge: binding.baseline,
|
|
638
|
+
operation: binding.operation,
|
|
639
|
+
operationId: binding.operationId,
|
|
640
|
+
authorizationReceiptDigest: binding.authorizationReceiptDigest,
|
|
641
|
+
evidenceDigest: binding.evidenceDigest,
|
|
642
|
+
issuedAt: binding.issuedAt,
|
|
643
|
+
activate: binding.activate,
|
|
644
|
+
humanReviewed: binding.humanReviewed,
|
|
645
|
+
});
|
|
403
646
|
await this._persist(
|
|
404
647
|
{ ...knowledge, conflictWithDigest: current.contentDigest },
|
|
405
648
|
envelope,
|
|
406
649
|
"conflict",
|
|
407
650
|
admission,
|
|
651
|
+
null,
|
|
652
|
+
binding,
|
|
408
653
|
);
|
|
654
|
+
const artifact = await this._commitArtifact(prepared);
|
|
409
655
|
return freeze({
|
|
410
656
|
applied: false,
|
|
411
657
|
reason: "conflict",
|
|
412
658
|
requiresHumanMerge: true,
|
|
659
|
+
recovered: false,
|
|
660
|
+
artifact: clone(artifact),
|
|
413
661
|
});
|
|
414
662
|
}
|
|
415
663
|
}
|
|
664
|
+
const binding = this._receiveArtifactBinding({
|
|
665
|
+
knowledge,
|
|
666
|
+
current,
|
|
667
|
+
admission,
|
|
668
|
+
envelope,
|
|
669
|
+
activate: true,
|
|
670
|
+
});
|
|
671
|
+
const prepared = await this._prepareArtifact({
|
|
672
|
+
knowledge,
|
|
673
|
+
currentKnowledge: binding.baseline,
|
|
674
|
+
operation: binding.operation,
|
|
675
|
+
operationId: binding.operationId,
|
|
676
|
+
authorizationReceiptDigest: binding.authorizationReceiptDigest,
|
|
677
|
+
evidenceDigest: binding.evidenceDigest,
|
|
678
|
+
issuedAt: binding.issuedAt,
|
|
679
|
+
activate: binding.activate,
|
|
680
|
+
humanReviewed: binding.humanReviewed,
|
|
681
|
+
});
|
|
416
682
|
await this._applyRevocationDependencies(knowledge);
|
|
417
|
-
await this._persist(
|
|
418
|
-
|
|
683
|
+
await this._persist(
|
|
684
|
+
knowledge,
|
|
685
|
+
envelope,
|
|
686
|
+
"remote",
|
|
687
|
+
admission,
|
|
688
|
+
null,
|
|
689
|
+
binding,
|
|
690
|
+
);
|
|
691
|
+
const artifact = await this._commitArtifact(prepared);
|
|
692
|
+
return freeze({
|
|
693
|
+
applied: true,
|
|
694
|
+
action: knowledge.action,
|
|
695
|
+
recovered: false,
|
|
696
|
+
artifact: clone(artifact),
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
_receiveArtifactBinding({
|
|
701
|
+
knowledge,
|
|
702
|
+
current,
|
|
703
|
+
admission,
|
|
704
|
+
envelope,
|
|
705
|
+
activate,
|
|
706
|
+
}) {
|
|
707
|
+
const milliseconds = Number(this._clock());
|
|
708
|
+
if (!Number.isFinite(milliseconds))
|
|
709
|
+
throw new TypeError("knowledge sync clock is invalid");
|
|
710
|
+
const binding = freeze({
|
|
711
|
+
schema: GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA,
|
|
712
|
+
activate,
|
|
713
|
+
operationId: `knowledge-receive:${envelope.envelopeDigest.slice(7)}`,
|
|
714
|
+
operation: "receive",
|
|
715
|
+
issuedAt: new Date(milliseconds).toISOString(),
|
|
716
|
+
authorizationReceiptDigest: admission.receiptDigest,
|
|
717
|
+
evidenceDigest: envelope.envelopeDigest,
|
|
718
|
+
humanReviewed: false,
|
|
719
|
+
baseline: current === null ? null : clone(current),
|
|
720
|
+
});
|
|
721
|
+
verifyGovernedKnowledgeArtifactBinding(binding, {
|
|
722
|
+
tenantId: this.tenantId,
|
|
723
|
+
knowledge,
|
|
724
|
+
authorizationReceiptDigest: admission.receiptDigest,
|
|
725
|
+
});
|
|
726
|
+
return binding;
|
|
419
727
|
}
|
|
420
728
|
|
|
421
729
|
async _admit(operation, knowledge) {
|
|
@@ -439,6 +747,7 @@ export class GovernedKnowledgeSync {
|
|
|
439
747
|
disposition,
|
|
440
748
|
admission,
|
|
441
749
|
operationId = null,
|
|
750
|
+
artifactBinding = null,
|
|
442
751
|
) {
|
|
443
752
|
const result = await this._commit({
|
|
444
753
|
knowledge,
|
|
@@ -447,6 +756,7 @@ export class GovernedKnowledgeSync {
|
|
|
447
756
|
disposition,
|
|
448
757
|
authorizationReceiptDigest: admission.receiptDigest,
|
|
449
758
|
operationId,
|
|
759
|
+
artifactBinding,
|
|
450
760
|
});
|
|
451
761
|
if (
|
|
452
762
|
result?.authenticated !== true ||
|
|
@@ -705,8 +705,8 @@ export const SKILL_WRITER_INVENTORY = Object.freeze({
|
|
|
705
705
|
file: "desktop-app-vue/src/main/ai-engine/cowork/skills/skill-sync-manager.js",
|
|
706
706
|
symbol: "SkillSyncManager.importSkill",
|
|
707
707
|
evidence: [
|
|
708
|
-
"await this.
|
|
709
|
-
"
|
|
708
|
+
"const staged = await this.artifactCandidateGate.stageCandidate(",
|
|
709
|
+
"persistenceReceipt: staged.receipt",
|
|
710
710
|
'action: "candidate-staged"',
|
|
711
711
|
"activeMutation: false",
|
|
712
712
|
],
|
|
@@ -716,9 +716,9 @@ export const SKILL_WRITER_INVENTORY = Object.freeze({
|
|
|
716
716
|
id: "desktop-plugin-install",
|
|
717
717
|
surface: "desktop",
|
|
718
718
|
triggerClass: "manual",
|
|
719
|
-
targetAuthority: "
|
|
720
|
-
mutationType: "
|
|
721
|
-
discoverySymbol:
|
|
719
|
+
targetAuthority: "candidate-only",
|
|
720
|
+
mutationType: "inactive-plugin-tree",
|
|
721
|
+
discoverySymbol: null,
|
|
722
722
|
entrypoint: {
|
|
723
723
|
file: "desktop-app-vue/src/main/marketplace/plugin-installer.js",
|
|
724
724
|
symbol: "PluginInstaller.installPlugin",
|
|
@@ -730,7 +730,8 @@ export const SKILL_WRITER_INVENTORY = Object.freeze({
|
|
|
730
730
|
evidence: [
|
|
731
731
|
"await this.extractPlugin(downloadPath, pluginDir)",
|
|
732
732
|
'path.join(pluginDir, "SKILL.md")',
|
|
733
|
-
"
|
|
733
|
+
"Marketplace SKILL.md files are not active at install time",
|
|
734
|
+
"governed promotion is required",
|
|
734
735
|
],
|
|
735
736
|
},
|
|
736
737
|
}),
|