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.
Files changed (178) hide show
  1. package/README.md +67 -9
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-BjMnsUci.js → AIOps-oJ7USzMC.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DdYFP03A.js → ActionButton-BlgnZe_C.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-Bb8TuuK_.js → Analytics-D2rRbTLu.js} +2 -2
  6. package/src/assets/web-panel/assets/{AppLayout-Kn3TIOtk.js → AppLayout-FwS3f0B2.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-4IxpqI_b.js → Artifacts-iF-_08Hi.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-BOV2caqU.js → Audit-D24p0zQw.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-B86k-ay4.js → BackgroundAgents-Cg3mRVi9.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-C5_ie1e3.js → Backup-EOqht3H-.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-xpwg6QCW.js → BaseInput-9XWYq2hj.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-CVZOcZau.js → Chat-Dq5yardA.js} +4 -4
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-D8fPYhUu.js → ChatBubbleRenderer-Ds3pA-ET.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-MKTq3zdP.js → Checkbox-CuyCBoBf.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-JUk3wzep.js → Codegen-DjWtYHNe.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-JPvTA0kC.js → Col-CrVr_iuG.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-Tqgl87NQ.js → Community-C6QxpfGc.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BuAFYBmN.js → Compact-B-v5r6Pa.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-CXS9WIPZ.js → Compliance-zNiLiFgD.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-Ds2bFHrr.js → Cowork-D9K7lMOu.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-C_dV_OeW.js → Cron-DAjO36z4.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-BsO6tIRo.js → Crosschain-Bxqn0aqB.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-rNOFqBac.js → DID-DfRmLUe-.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C2fcKKVY.js → Dashboard-Cz8KF3fr.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-Y7Ndr0X_.js → Dropdown-C4oVfkP0.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DcP_uPmL.js → EmailListRenderer-ivyZKN8k.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Cwn3gDzk.js → FamilyGuardDashboard-DoxY1CPW.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-ClQuOsqb.js → Federation-C93gZxnb.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-DfwtmlcK.js → FormItemContext-D_lEjYJE.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-zNZhtbC5.js → GenericCardRenderer-BNFN9YjN.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-BZmdW-G5.js → Git-mUu2HcLI.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CqBk4lEn.js → Governance-CNuosrge.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-Dbmt3ZXk.js → Inference-DwY5pbCB.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-hMTH6qf3.js → KnowledgeGraph-aRUxhACD.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-CkiYgiW2.js → Logs-DFfsWYy_.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-BL1FElXg.js → MarkdownRenderer-DqTx7_u1.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-CbB6wfin.js → Marketplace-COI-ciM-.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BSwiFtte.js → McpTools-BJJwaIpe.js} +2 -2
  39. package/src/assets/web-panel/assets/{Memory-B03PeHrz.js → Memory-CDO6SGDZ.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-CRGrnd-X.js → MobileBridge-BlZ5tFf4.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-CE_5v2kO.js → MobileProjects-DuoxbgWz.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-Dp11QVx1.js → Mtc-6ec9j70b.js} +2 -2
  43. package/src/assets/web-panel/assets/{MtcAudit-CYu-3JBu.js → MtcAudit-BuL7HkC7.js} +2 -2
  44. package/src/assets/web-panel/assets/{Multisig-CGyJ0Xl3.js → Multisig-CJxR85lk.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-CoWi_ov1.js → NLProgramming-B71O1S4l.js} +1 -1
  46. package/src/assets/web-panel/assets/Notes-Bsw5zbpV.js +7 -0
  47. package/src/assets/web-panel/assets/{NotificationSettings-DX4I2b4W.js → NotificationSettings-BnAhXuK_.js} +1 -1
  48. package/src/assets/web-panel/assets/OrderTableRenderer-BJ0R5GGz.js +1 -0
  49. package/src/assets/web-panel/assets/{Organization-oopLO_tk.js → Organization-B7wwNxoP.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-BFVvjMyf.js → Overflow-CfAGr0gM.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-CBy5t-Tk.js → P2P-KhMg22Fz.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser--YWJNsu6.js → PdhVaultBrowser-NdAXI9ft.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-C2dZ8scb.js → Permissions-CIYjqyT7.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Bs3l7Hlx.js → PersonalDataHub-D2ht3P_R.js} +4 -4
  55. package/src/assets/web-panel/assets/{Pipeline-DEBWbZuD.js → Pipeline-i6flZW1m.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-CjHBb6NU.js → Privacy-DE0lhYVc.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-D2WipUz5.js → ProjectInit-BL3YbyxS.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-B6WfnrGB.js → ProjectSettings-CEtdg7ni.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-FF_thRi6.js → Projects-CvtU5peJ.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-CCv5M_Dv.js → Providers-DKt_Cg-j.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-CGthxU54.js → QrScannerModal-DA61jNSx.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-CnPmXPFb.js → QuickAsk-fS9ryUmq.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-Df_tGEa9.js → Recommend-CR9dZU5Y.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-Z58N0Loe.js → RemoteSession-BV0BR2Dz.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-CZTBQ2Vt.js → Reputation-BIeGUvYD.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-CdK3YpCQ.js → Row-DHDT1aro.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-CFMVT5sb.js → RssFeed-Cq6YKb1h.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DrF8RIvD.js → Search-DEF6vsy6.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-Ddk2f2DM.js → Security-CHtYiKY9.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-CCuK-VOo.js → Services-u16lvBJN.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-DxCpHzeM.js → Skeleton-CGbizyDj.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-t2oTDgcv.js → Skills-BZMQcAa7.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Df63M9_R.js → Sla-Bm-CycVi.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-l7ox6KuX.js → SpeechSettings-BudpA5kr.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-COd_tgPp.js → SyncSettings-B8q1C1eC.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-CzDCcrik.js → Tasks-SU1pBWc-.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-D-vfxTGA.js → Templates-CyOfJzmt.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-BlpT_Gxc.js → Tenant-xqWSm2GP.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-D5rq52Hg.js → Terminal-D1Ttgjsi.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-DdoMndkK.js → TimelineRenderer-Da2lYs5D.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BhgBsI6g.js → Tokens-B34-SduO.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-DwwzoikZ.js → Trigger-C8zyYm4R.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-HkTpzXFb.js → Trust-D1Pvqems.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-D9nk6Ehe.js → UkeySign-Do3VVnAy.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-BKk0rfoy.js → VideoEditing-Dz7egVIA.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-IVWIU_Lq.js → Wallet-Dcuw-OxR.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-CFTCpfsG.js → WebAuthn-DPlw-QsB.js} +4 -4
  88. package/src/assets/web-panel/assets/{WorkflowEditor-Dnf4Obif.js → WorkflowEditor-h4OsnU5q.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-D2snERdj.js → chat-eO9wEwrW.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DKEjK1N1.js → colors-34lSmOXw.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BEDLwQdt.js → compact-item-CK4kEWJ4.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-DA9iW1a0.js → createContext-E0A57xed.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-5l2xEcY9.js → hasIn-BD9ZMGAl.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-C7sKbM5s.js → index--N0u6kTG.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DU2TXJu-.js → index-8qMA1DWQ.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CxEtQYdi.js → index-B0rkHxKK.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B7_W_rYd.js → index-B_G_ElKO.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-B4QYBliR.js → index-BbX_Dted.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DLoalqRX.js → index-Bjs90Eh9.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-Dbkghqn_.js → index-BmNbU2Z6.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BgfImyZI.js → index-Brqc9Emx.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-5pW4t1iD.js → index-BsGmo6v1.js} +1 -1
  104. package/src/assets/web-panel/assets/index-C907rPwd.js +1 -0
  105. package/src/assets/web-panel/assets/{index-CRPrHE7h.js → index-CT1_eRL-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DvV03Ayk.js → index-CZBaqe3d.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-D7z4zB_a.js → index-CZkFMeWL.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CmruhzFi.js → index-Ch175NUw.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-e-e40id6.js → index-CsrKJJcX.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CGlotREA.js → index-CuSau5ya.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CjWltbi_.js → index-Cx3Jn1r0.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-fccZmC_h.js → index-Cz3unNfL.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-NJieh3T1.js → index-D4bB_x_v.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CkMKuqUs.js → index-DCn-ECvK.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BZ5lY2zx.js → index-DFLE2qO9.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B_eCoZgW.js → index-DGRxt5wj.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-7P1b8HZo.js → index-DONOUtlz.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-yYEQXYaU.js → index-DP-UZAQN.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Dbd7eEex.js → index-Da5fmOHB.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Bqc8tdIF.js → index-DcE1BspQ.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DXet1xol.js → index-DcbgVLOH.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BO9dQjpt.js → index-DeXNCyQJ.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CX1x4AFn.js → index-DiT_REby.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Bq5P3piS.js → index-DpfisY1g.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Csfb-7hw.js → index-DrOalGut.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DpqtbXdE.js → index-DrSAAuJj.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-B00GeekA.js → index-DrsDA_md.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Dg2a9owQ.js → index-DvKcroix.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-fgYk0QXO.js → index-DzXjP44T.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Td8ZwyoC.js → index-MIg5Z8qe.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DqwPFbOb.js → index-o8pYehRq.js} +3 -3
  132. package/src/assets/web-panel/assets/index-wueRSK2d.js +1 -0
  133. package/src/assets/web-panel/assets/{index-CbTPvp2_.js → index-yAGBu2E0.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-CPrcB1TC.js → initDefaultProps-DMTkAomF.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BQ7mWRh_.js → motion-Cnti1F5g.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-CzOEq99p.js → move-CGxmHUga.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-BlQI5jrw.js → mtc-parser-CuwwLoq7.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-DlW4gxmv.js → omit-BpdlTkPM.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-BBYms5nP.js → pickAttrs-D7nWrThp.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-az2MPJ_7.js → placementArrow-Bhx0TV8F.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-D1-ibEol.js → responsiveObserve-CZ1KesZh.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-DHGqa4GA.js → slide-CnldF8J6.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-CYGDo6lD.js → statusUtils-CZfo_GOA.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-Cl2EM9K6.js → styleChecker-B2QCcAv5.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DdYhzuv1.js → useFlexGapSupport-DzzjIS4J.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-DWumPuBW.js → useFs-B_atg9M0.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-DxAO-Aqi.js → usePersonalDataHub-DhZs3QYN.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-CplsQf_N.js → vnode-DcePTYAm.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-Cw5HXNSG.js → zoom-BYmlnjRk.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/commands/serve.js +31 -0
  152. package/src/data/changelog.json +13 -0
  153. package/src/index.js +11 -3
  154. package/src/lazy-dispatch.js +9 -1
  155. package/src/lib/app-server/websocket-transport.js +21 -0
  156. package/src/lib/evolution/evolution-artifact-ports.js +9 -0
  157. package/src/lib/evolution/evolution-deployment-loader.js +208 -0
  158. package/src/lib/evolution/evolution-release-train-ledger-adapter.js +335 -0
  159. package/src/lib/evolution/evolution-release-train.js +538 -0
  160. package/src/lib/evolution/evolution-workbench-projection.js +20 -1
  161. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +688 -0
  162. package/src/lib/evolution/governed-knowledge-artifact-lifecycle.js +364 -0
  163. package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +29 -2
  164. package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +31 -3
  165. package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +92 -6
  166. package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +57 -4
  167. package/src/lib/evolution/governed-knowledge-sync.js +317 -7
  168. package/src/lib/evolution/skill-writer-inventory-manifest.js +7 -6
  169. package/src/lib/evolution/statistical-progressive-canary.js +683 -0
  170. package/src/lib/evolution/wikiskill-benchmark.js +510 -0
  171. package/src/lib/session-host-lease.js +11 -16
  172. package/src/runtime/agent-core.js +61 -7
  173. package/src/runtime/headless-stream.js +3 -0
  174. package/src/assets/web-panel/assets/Notes-CgU9DDo9.js +0 -7
  175. package/src/assets/web-panel/assets/OrderTableRenderer-CwHc15Zs.js +0 -1
  176. package/src/assets/web-panel/assets/devWarning-DyhgpXPf.js +0 -1
  177. package/src/assets/web-panel/assets/index-Ck1jhFE0.js +0 -1
  178. 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
- exact(value, PUBLISH_EVIDENCE_KEYS, "merge publish evidence");
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
- value.schema !== GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_SCHEMA ||
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 GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_SCHEMA =
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
- return hash(GOVERNED_KNOWLEDGE_MERGE_PUBLISH_RESULT_SCHEMA, core);
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 ||