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,688 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ import evolvableArtifactProtocol from "@chainlesschain/session-core/evolvable-artifact";
4
+
5
+ import {
6
+ EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA,
7
+ isEvolutionLedgerArtifactResolver,
8
+ } from "./evolution-artifact-ports.js";
9
+ import {
10
+ EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA,
11
+ EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA,
12
+ } from "./evolution-ledger.js";
13
+
14
+ const {
15
+ EVOLVABLE_ARTIFACT_PERSISTENCE_RECEIPT_SCHEMA,
16
+ EVOLVABLE_ARTIFACT_ACTIVE_RELEASE_SCHEMA,
17
+ EVOLVABLE_ARTIFACT_TRANSITION_REQUEST_SCHEMA,
18
+ EVOLVABLE_ARTIFACT_TRANSITION_RECEIPT_SCHEMA,
19
+ createEvolvableArtifactActiveReleaseReader,
20
+ digestEvolvableArtifactValue,
21
+ isEvolvableArtifactActiveReleaseReader:
22
+ isProtocolEvolvableArtifactActiveReleaseReader,
23
+ verifyEvolvableArtifact,
24
+ } = evolvableArtifactProtocol;
25
+
26
+ export const EVOLVABLE_ARTIFACT_LEDGER_RECORD_SCHEMA =
27
+ "chainlesschain.evolvable-artifact-ledger-record/v2";
28
+ export const EVOLVABLE_ARTIFACT_LEDGER_RECORD_LEGACY_SCHEMA =
29
+ "chainlesschain.evolvable-artifact-ledger-record/v1";
30
+ export const EVOLVABLE_ARTIFACT_CANDIDATE_EVENT =
31
+ "evolvable-artifact.candidate.persisted";
32
+ export const EVOLVABLE_ARTIFACT_TRANSITION_EVENT =
33
+ "evolvable-artifact.transition.committed";
34
+
35
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
36
+ const TRANSITION_READERS = new WeakSet();
37
+ const RELEASE_RESOLVERS = new WeakSet();
38
+ const ARTIFACT_TYPES = new Set(["skill", "prompt", "hook", "knowledge"]);
39
+ const RECORD_KEYS = new Set([
40
+ "artifact",
41
+ "content",
42
+ "contentAvailable",
43
+ "kind",
44
+ "receipt",
45
+ "recordDigest",
46
+ "request",
47
+ "schema",
48
+ ]);
49
+ const LEGACY_RECORD_KEYS = new Set(
50
+ [...RECORD_KEYS].filter(
51
+ (key) => !["content", "contentAvailable"].includes(key),
52
+ ),
53
+ );
54
+ const DEPENDENCY_KIND_TYPES = new Map([
55
+ ["skill", "skill"],
56
+ ["active-skill", "skill"],
57
+ ["prompt", "prompt"],
58
+ ["active-prompt", "prompt"],
59
+ ["hook", "hook"],
60
+ ["active-hook", "hook"],
61
+ ["knowledge", "knowledge"],
62
+ ["active-knowledge", "knowledge"],
63
+ ]);
64
+
65
+ function canonical(value) {
66
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
67
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
68
+ return `{${Object.keys(value)
69
+ .sort()
70
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
71
+ .join(",")}}`;
72
+ }
73
+
74
+ function hash(schema, value) {
75
+ return `sha256:${createHash("sha256")
76
+ .update(schema)
77
+ .update("\0")
78
+ .update(canonical(value))
79
+ .digest("hex")}`;
80
+ }
81
+
82
+ function exactRecord(value) {
83
+ const keys =
84
+ value?.schema === EVOLVABLE_ARTIFACT_LEDGER_RECORD_SCHEMA
85
+ ? RECORD_KEYS
86
+ : LEGACY_RECORD_KEYS;
87
+ const ownKeys = Reflect.ownKeys(value ?? {});
88
+ if (
89
+ ![
90
+ EVOLVABLE_ARTIFACT_LEDGER_RECORD_SCHEMA,
91
+ EVOLVABLE_ARTIFACT_LEDGER_RECORD_LEGACY_SCHEMA,
92
+ ].includes(value?.schema) ||
93
+ ownKeys.length !== keys.size ||
94
+ ownKeys.some((key) => typeof key !== "string" || !keys.has(key))
95
+ )
96
+ throw new Error("artifact ledger record shape is invalid");
97
+ }
98
+
99
+ function text(value, name) {
100
+ if (typeof value !== "string" || value.trim() === "")
101
+ throw new TypeError(`${name} is required`);
102
+ return value;
103
+ }
104
+
105
+ function capture(owner, method, name) {
106
+ if (!owner || typeof owner[method] !== "function")
107
+ throw new TypeError(`${name}.${method}() is required`);
108
+ return (...args) => Reflect.apply(owner[method], owner, args);
109
+ }
110
+
111
+ function freeze(value) {
112
+ const result = structuredClone(value);
113
+ function visit(entry) {
114
+ if (entry && typeof entry === "object" && !Object.isFrozen(entry)) {
115
+ Object.freeze(entry);
116
+ for (const child of Object.values(entry)) visit(child);
117
+ }
118
+ }
119
+ visit(result);
120
+ return result;
121
+ }
122
+
123
+ function transitionReceipt(request, revision) {
124
+ const body = {
125
+ schema: EVOLVABLE_ARTIFACT_TRANSITION_RECEIPT_SCHEMA,
126
+ operationId: request.operationId,
127
+ requestDigest: request.requestDigest,
128
+ kind: request.kind,
129
+ tenantId: request.tenantId,
130
+ type: request.type,
131
+ artifactId: request.artifactId,
132
+ candidateId: request.candidateId,
133
+ releaseId: request.releaseId,
134
+ artifactDigest: request.nextArtifactDigest,
135
+ persisted: true,
136
+ durable: true,
137
+ revision,
138
+ };
139
+ return freeze({
140
+ ...body,
141
+ receiptDigest: digestEvolvableArtifactValue(body),
142
+ });
143
+ }
144
+
145
+ export class EvolvableArtifactLedgerAdapter {
146
+ constructor({
147
+ descriptor: input,
148
+ artifactPorts,
149
+ ledger,
150
+ ledgerArtifactResolver,
151
+ clock = () => new Date().toISOString(),
152
+ } = {}) {
153
+ this.descriptor = Object.freeze({
154
+ tenantId: text(input?.tenantId, "tenantId"),
155
+ artifactTenantId: text(input?.artifactTenantId, "artifactTenantId"),
156
+ streamId: text(input?.streamId, "streamId"),
157
+ audience: text(input?.audience, "audience"),
158
+ purpose: text(input?.purpose, "purpose"),
159
+ });
160
+ this.readerScope = Object.freeze({});
161
+ if (this.descriptor.purpose !== "evolution-ledger")
162
+ throw new TypeError("artifact adapter purpose must be evolution-ledger");
163
+ this._put = capture(artifactPorts, "putCanonical", "artifactPorts");
164
+ this._read = capture(ledger, "read", "ledger");
165
+ this._verifyLedger = capture(ledger, "verify", "ledger");
166
+ this._append = capture(ledger, "appendDomainEvent", "ledger");
167
+ if (!isEvolutionLedgerArtifactResolver(ledgerArtifactResolver))
168
+ throw new TypeError("a branded ledger artifact resolver is required");
169
+ this._resolveArtifact = ledgerArtifactResolver;
170
+ if (typeof clock !== "function") throw new TypeError("clock is required");
171
+ this._clock = clock;
172
+ }
173
+
174
+ _events(type) {
175
+ const events = this._read();
176
+ if (!Array.isArray(events)) throw new Error("artifact ledger read failed");
177
+ return events.filter(
178
+ (event) =>
179
+ event.schema === EVOLUTION_LEDGER_DOMAIN_EVENT_SCHEMA &&
180
+ event.type === type &&
181
+ event.tenantId === this.descriptor.tenantId &&
182
+ event.correlationId === this.descriptor.streamId,
183
+ );
184
+ }
185
+
186
+ _event(eventId, type) {
187
+ const matches = this._events(type).filter(
188
+ (event) => event.eventId === eventId,
189
+ );
190
+ if (matches.length > 1) throw new Error("artifact event is ambiguous");
191
+ return matches[0] ?? null;
192
+ }
193
+
194
+ _resolve(event, expectedType, expectedKind) {
195
+ const identity = this._verifyLedger();
196
+ const resolution = this._resolveArtifact({
197
+ epoch: identity.epoch,
198
+ ledgerId: identity.ledgerId,
199
+ ref: event.subjectRef,
200
+ tenantId: this.descriptor.artifactTenantId,
201
+ });
202
+ if (
203
+ resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
204
+ resolution.authenticated !== true ||
205
+ resolution.found !== true ||
206
+ resolution.ref !== event.subjectRef.ref ||
207
+ resolution.digest !== event.subjectRef.digest ||
208
+ !Buffer.isBuffer(resolution.bytes)
209
+ )
210
+ throw new Error("artifact ledger resolution is invalid");
211
+ let durable;
212
+ try {
213
+ durable = JSON.parse(resolution.bytes.toString("utf8"));
214
+ } catch {
215
+ throw new Error("artifact ledger record is not JSON");
216
+ }
217
+ if (
218
+ durable?.schema !== EVOLUTION_DURABLE_ARTIFACT_RECORD_SCHEMA ||
219
+ durable.tenantId !== this.descriptor.artifactTenantId ||
220
+ durable.audience !== this.descriptor.audience ||
221
+ durable.purpose !== this.descriptor.purpose ||
222
+ durable.retention !== "ledger" ||
223
+ durable.type !== expectedType ||
224
+ ![
225
+ EVOLVABLE_ARTIFACT_LEDGER_RECORD_SCHEMA,
226
+ EVOLVABLE_ARTIFACT_LEDGER_RECORD_LEGACY_SCHEMA,
227
+ ].includes(durable.value?.schema) ||
228
+ durable.value.kind !== expectedKind
229
+ )
230
+ throw new Error("artifact durable record binding is invalid");
231
+ exactRecord(durable.value);
232
+ const core = structuredClone(durable.value);
233
+ delete core.recordDigest;
234
+ if (durable.value.recordDigest !== hash(durable.value.schema, core))
235
+ throw new Error("artifact ledger record digest is invalid");
236
+ verifyEvolvableArtifact(durable.value.artifact);
237
+ if (durable.value.schema === EVOLVABLE_ARTIFACT_LEDGER_RECORD_SCHEMA) {
238
+ if (
239
+ typeof durable.value.contentAvailable !== "boolean" ||
240
+ (durable.value.contentAvailable
241
+ ? digestEvolvableArtifactValue(durable.value.content) !==
242
+ durable.value.artifact.contentDigest
243
+ : durable.value.content !== null) ||
244
+ (expectedKind === "transition" && durable.value.contentAvailable)
245
+ )
246
+ throw new Error("artifact ledger content binding is invalid");
247
+ }
248
+ return freeze(durable.value);
249
+ }
250
+
251
+ _publish(type, value) {
252
+ const published = this._put(type, value, {
253
+ audience: this.descriptor.audience,
254
+ purpose: this.descriptor.purpose,
255
+ retention: "ledger",
256
+ });
257
+ if (
258
+ !published?.ref ||
259
+ published.receipt?.persisted !== true ||
260
+ published.receipt?.readbackVerified !== true ||
261
+ published.receipt?.integrityVerified !== true ||
262
+ published.receipt?.retention !== "ledger"
263
+ )
264
+ throw new Error("artifact record was not persistently read back");
265
+ return published.ref;
266
+ }
267
+
268
+ _appendRecord({ eventId, type, reason, ref, sourceRefs = [] }) {
269
+ const head = this._verifyLedger();
270
+ const timestamp = this._clock();
271
+ if (
272
+ typeof timestamp !== "string" ||
273
+ !Number.isFinite(Date.parse(timestamp))
274
+ )
275
+ throw new Error("artifact ledger clock is invalid");
276
+ return this._append(
277
+ {
278
+ artifactTenantId: this.descriptor.artifactTenantId,
279
+ correlationId: this.descriptor.streamId,
280
+ decision: "committed",
281
+ eventId,
282
+ reason,
283
+ skillName: null,
284
+ sourceRefs,
285
+ subjectRef: ref,
286
+ tenantId: this.descriptor.tenantId,
287
+ timestamp,
288
+ type,
289
+ },
290
+ { expectedHeadDigest: head.headDigest, expectedSequence: head.sequence },
291
+ );
292
+ }
293
+
294
+ async persistCandidate(artifactInput, contentInput = undefined) {
295
+ const artifact = verifyEvolvableArtifact(artifactInput);
296
+ const contentAvailable = contentInput !== undefined;
297
+ const content = contentAvailable ? freeze(contentInput) : null;
298
+ if (
299
+ contentAvailable &&
300
+ digestEvolvableArtifactValue(content) !== artifact.contentDigest
301
+ )
302
+ throw new Error("candidate content does not match contentDigest");
303
+ if (artifact.tenantId !== this.descriptor.tenantId)
304
+ throw new Error("candidate crossed artifact adapter tenant");
305
+ const eventId = `artifact-candidate.${artifact.artifactDigest.slice(7)}`;
306
+ const existing = this._event(eventId, EVOLVABLE_ARTIFACT_CANDIDATE_EVENT);
307
+ if (existing) {
308
+ const stored = this._resolve(
309
+ existing,
310
+ "evolvable-artifact-candidate",
311
+ "candidate",
312
+ );
313
+ if (canonical(stored.artifact) !== canonical(artifact))
314
+ throw new Error("candidate operation resolved different artifact");
315
+ if (
316
+ contentAvailable &&
317
+ (stored.contentAvailable !== true ||
318
+ canonical(stored.content) !== canonical(content))
319
+ )
320
+ throw new Error("candidate content is unavailable or differs");
321
+ return stored.receipt;
322
+ }
323
+ const receipt = freeze({
324
+ schema: EVOLVABLE_ARTIFACT_PERSISTENCE_RECEIPT_SCHEMA,
325
+ tenantId: artifact.tenantId,
326
+ type: artifact.type,
327
+ artifactId: artifact.artifactId,
328
+ candidateId: artifact.candidate.candidateId,
329
+ contentDigest: artifact.contentDigest,
330
+ artifactDigest: artifact.artifactDigest,
331
+ status: "candidate",
332
+ persisted: true,
333
+ });
334
+ const core = {
335
+ schema: EVOLVABLE_ARTIFACT_LEDGER_RECORD_SCHEMA,
336
+ kind: "candidate",
337
+ artifact,
338
+ request: null,
339
+ receipt,
340
+ contentAvailable,
341
+ content,
342
+ };
343
+ const record = freeze({
344
+ ...core,
345
+ recordDigest: hash(EVOLVABLE_ARTIFACT_LEDGER_RECORD_SCHEMA, core),
346
+ });
347
+ const ref = this._publish("evolvable-artifact-candidate", record);
348
+ try {
349
+ this._appendRecord({
350
+ eventId,
351
+ type: EVOLVABLE_ARTIFACT_CANDIDATE_EVENT,
352
+ reason: `${artifact.type} candidate persisted`,
353
+ ref,
354
+ });
355
+ } catch (error) {
356
+ const recovered = this._event(
357
+ eventId,
358
+ EVOLVABLE_ARTIFACT_CANDIDATE_EVENT,
359
+ );
360
+ if (!recovered) throw error;
361
+ }
362
+ const stored = this._resolve(
363
+ this._event(eventId, EVOLVABLE_ARTIFACT_CANDIDATE_EVENT),
364
+ "evolvable-artifact-candidate",
365
+ "candidate",
366
+ );
367
+ if (canonical(stored.artifact) !== canonical(artifact))
368
+ throw new Error("candidate durable readback differs");
369
+ if (
370
+ stored.contentAvailable !== contentAvailable ||
371
+ canonical(stored.content) !== canonical(content)
372
+ )
373
+ throw new Error("candidate content durable readback differs");
374
+ return stored.receipt;
375
+ }
376
+
377
+ async commitTransition({ request, artifact: artifactInput }) {
378
+ const artifact = verifyEvolvableArtifact(artifactInput);
379
+ const requestCore = request && {
380
+ schema: request.schema,
381
+ kind: request.kind,
382
+ tenantId: request.tenantId,
383
+ type: request.type,
384
+ artifactId: request.artifactId,
385
+ candidateId: request.candidateId,
386
+ releaseId: request.releaseId,
387
+ previousArtifactDigest: request.previousArtifactDigest,
388
+ nextArtifactDigest: request.nextArtifactDigest,
389
+ };
390
+ if (
391
+ request?.schema !== EVOLVABLE_ARTIFACT_TRANSITION_REQUEST_SCHEMA ||
392
+ !["promote", "rollback"].includes(request.kind) ||
393
+ request?.tenantId !== this.descriptor.tenantId ||
394
+ artifact.tenantId !== this.descriptor.tenantId ||
395
+ request.type !== artifact.type ||
396
+ request.artifactId !== artifact.artifactId ||
397
+ request.candidateId !== artifact.candidate.candidateId ||
398
+ request.releaseId !== artifact.activeReleaseId ||
399
+ request.nextArtifactDigest !== artifact.artifactDigest ||
400
+ !DIGEST.test(request.requestDigest ?? "") ||
401
+ request.requestDigest !== digestEvolvableArtifactValue(requestCore) ||
402
+ request.operationId !==
403
+ `artifact-transition:${request.requestDigest.slice(7)}`
404
+ )
405
+ throw new Error("artifact transition request is invalid");
406
+ const eventId = `artifact-transition.${request.requestDigest.slice(7)}`;
407
+ const existing = this._event(eventId, EVOLVABLE_ARTIFACT_TRANSITION_EVENT);
408
+ if (existing) return this._readTransitionEvent(existing, request).receipt;
409
+ const sourceEvent = [
410
+ ...this._events(EVOLVABLE_ARTIFACT_CANDIDATE_EVENT).map((event) => ({
411
+ event,
412
+ record: this._resolve(
413
+ event,
414
+ "evolvable-artifact-candidate",
415
+ "candidate",
416
+ ),
417
+ })),
418
+ ...this._events(EVOLVABLE_ARTIFACT_TRANSITION_EVENT).map((event) => ({
419
+ event,
420
+ record: this._resolve(
421
+ event,
422
+ "evolvable-artifact-transition",
423
+ "transition",
424
+ ),
425
+ })),
426
+ ].find(
427
+ ({ record }) =>
428
+ record.artifact.artifactDigest === request.previousArtifactDigest,
429
+ )?.event;
430
+ if (!sourceEvent)
431
+ throw new Error("transition has no persisted artifact lineage");
432
+ const revision = this._verifyLedger().sequence + 1;
433
+ const receipt = transitionReceipt(request, revision);
434
+ const core = {
435
+ schema: EVOLVABLE_ARTIFACT_LEDGER_RECORD_SCHEMA,
436
+ kind: "transition",
437
+ artifact,
438
+ request,
439
+ receipt,
440
+ contentAvailable: false,
441
+ content: null,
442
+ };
443
+ const record = freeze({
444
+ ...core,
445
+ recordDigest: hash(EVOLVABLE_ARTIFACT_LEDGER_RECORD_SCHEMA, core),
446
+ });
447
+ const ref = this._publish("evolvable-artifact-transition", record);
448
+ try {
449
+ this._appendRecord({
450
+ eventId,
451
+ type: EVOLVABLE_ARTIFACT_TRANSITION_EVENT,
452
+ reason: `${artifact.type} ${request.kind} transition committed`,
453
+ ref,
454
+ sourceRefs: [sourceEvent.subjectRef],
455
+ });
456
+ } catch (error) {
457
+ const recovered = this._event(
458
+ eventId,
459
+ EVOLVABLE_ARTIFACT_TRANSITION_EVENT,
460
+ );
461
+ if (!recovered) throw error;
462
+ }
463
+ return this._readTransitionEvent(
464
+ this._event(eventId, EVOLVABLE_ARTIFACT_TRANSITION_EVENT),
465
+ request,
466
+ ).receipt;
467
+ }
468
+
469
+ _readTransitionEvent(event, expectedRequest = null) {
470
+ const stored = this._resolve(
471
+ event,
472
+ "evolvable-artifact-transition",
473
+ "transition",
474
+ );
475
+ if (
476
+ expectedRequest &&
477
+ canonical(stored.request) !== canonical(expectedRequest)
478
+ )
479
+ throw new Error("transition operation resolved different request");
480
+ return stored;
481
+ }
482
+
483
+ async readTransition({ operationId }) {
484
+ const prefix = "artifact-transition:";
485
+ if (typeof operationId !== "string" || !operationId.startsWith(prefix))
486
+ throw new TypeError("operationId is invalid");
487
+ const event = this._event(
488
+ `artifact-transition.${operationId.slice(prefix.length)}`,
489
+ EVOLVABLE_ARTIFACT_TRANSITION_EVENT,
490
+ );
491
+ if (!event) return null;
492
+ const stored = this._readTransitionEvent(event);
493
+ if (stored.request.operationId !== operationId)
494
+ throw new Error("transition operationId was substituted");
495
+ return freeze({
496
+ request: stored.request,
497
+ artifact: stored.artifact,
498
+ receipt: stored.receipt,
499
+ });
500
+ }
501
+
502
+ transitionReader() {
503
+ const readTransition = this.readTransition.bind(this);
504
+ const reader = Object.freeze({
505
+ tenantId: this.descriptor.tenantId,
506
+ readerScope: this.readerScope,
507
+ readTransition,
508
+ });
509
+ TRANSITION_READERS.add(reader);
510
+ return reader;
511
+ }
512
+
513
+ _activeArtifacts() {
514
+ const histories = new Map();
515
+ for (const event of this._events(EVOLVABLE_ARTIFACT_TRANSITION_EVENT)) {
516
+ const record = this._resolve(
517
+ event,
518
+ "evolvable-artifact-transition",
519
+ "transition",
520
+ );
521
+ const history = histories.get(record.artifact.artifactId) ?? [];
522
+ history.push({ event, artifact: record.artifact });
523
+ histories.set(record.artifact.artifactId, history);
524
+ }
525
+ const active = [];
526
+ for (const history of histories.values()) {
527
+ history.sort((left, right) => left.event.sequence - right.event.sequence);
528
+ const latest = history.at(-1).artifact;
529
+ if (latest.release?.status === "active") {
530
+ active.push(latest);
531
+ continue;
532
+ }
533
+ const target = [...history]
534
+ .reverse()
535
+ .map(({ artifact }) => artifact)
536
+ .find(
537
+ (artifact) =>
538
+ artifact.release?.status === "active" &&
539
+ artifact.activeReleaseId === latest.activeReleaseId,
540
+ );
541
+ if (target) active.push(target);
542
+ }
543
+ return active;
544
+ }
545
+
546
+ _activeReleaseRecord(artifact) {
547
+ const transitions = this._events(EVOLVABLE_ARTIFACT_TRANSITION_EVENT)
548
+ .map((event) =>
549
+ this._resolve(event, "evolvable-artifact-transition", "transition"),
550
+ )
551
+ .filter(
552
+ (record) => record.artifact.artifactDigest === artifact.artifactDigest,
553
+ );
554
+ if (transitions.length !== 1)
555
+ throw new Error("active artifact transition is ambiguous");
556
+ const candidateDigest = transitions[0].request.previousArtifactDigest;
557
+ const candidates = this._events(EVOLVABLE_ARTIFACT_CANDIDATE_EVENT)
558
+ .map((event) =>
559
+ this._resolve(event, "evolvable-artifact-candidate", "candidate"),
560
+ )
561
+ .filter((record) => record.artifact.artifactDigest === candidateDigest);
562
+ if (candidates.length !== 1)
563
+ throw new Error("active artifact candidate is ambiguous");
564
+ const candidate = candidates[0];
565
+ if (
566
+ candidate.artifact.artifactId !== artifact.artifactId ||
567
+ candidate.artifact.type !== artifact.type ||
568
+ candidate.artifact.contentDigest !== artifact.contentDigest ||
569
+ candidate.artifact.candidate.candidateId !==
570
+ artifact.candidate.candidateId
571
+ )
572
+ throw new Error("active artifact content lineage is invalid");
573
+ return freeze({
574
+ schema: EVOLVABLE_ARTIFACT_ACTIVE_RELEASE_SCHEMA,
575
+ authenticated: true,
576
+ durable: true,
577
+ tenantId: artifact.tenantId,
578
+ type: artifact.type,
579
+ artifactId: artifact.artifactId,
580
+ releaseId: artifact.activeReleaseId,
581
+ contentDigest: artifact.contentDigest,
582
+ artifactDigest: artifact.artifactDigest,
583
+ artifact,
584
+ contentAvailable: candidate.contentAvailable === true,
585
+ content: candidate.contentAvailable === true ? candidate.content : null,
586
+ });
587
+ }
588
+
589
+ activeReleaseReader(releaseGate) {
590
+ const adapter = this;
591
+ const provider = Object.freeze({
592
+ readerScope: this.readerScope,
593
+ async listActive({ type = null } = {}) {
594
+ if (type !== null && !ARTIFACT_TYPES.has(type))
595
+ throw new TypeError("active artifact type is invalid");
596
+ return freeze(
597
+ adapter
598
+ ._activeArtifacts()
599
+ .filter((artifact) => type === null || artifact.type === type)
600
+ .sort((left, right) =>
601
+ `${left.type}:${left.artifactId}`.localeCompare(
602
+ `${right.type}:${right.artifactId}`,
603
+ ),
604
+ )
605
+ .map((artifact) => adapter._activeReleaseRecord(artifact)),
606
+ );
607
+ },
608
+ async readActive({ type, artifactId } = {}) {
609
+ if (!ARTIFACT_TYPES.has(type))
610
+ throw new TypeError("active artifact type is invalid");
611
+ const normalizedArtifactId = text(artifactId, "artifactId");
612
+ const matches = adapter
613
+ ._activeArtifacts()
614
+ .filter(
615
+ (artifact) =>
616
+ artifact.type === type &&
617
+ artifact.artifactId === normalizedArtifactId,
618
+ );
619
+ if (matches.length > 1)
620
+ throw new Error("active artifact release is ambiguous");
621
+ return matches.length === 0
622
+ ? null
623
+ : adapter._activeReleaseRecord(matches[0]);
624
+ },
625
+ });
626
+ return createEvolvableArtifactActiveReleaseReader({
627
+ releaseGate,
628
+ provider,
629
+ });
630
+ }
631
+
632
+ releaseResolver() {
633
+ const tenantId = this.descriptor.tenantId;
634
+ const adapter = this;
635
+ const resolver = Object.freeze({
636
+ tenantId,
637
+ readerScope: this.readerScope,
638
+ async resolveDependency(input) {
639
+ if (
640
+ input?.tenantId !== tenantId ||
641
+ !DIGEST.test(input.digest ?? "") ||
642
+ typeof input.kind !== "string" ||
643
+ typeof input.disposition !== "string"
644
+ )
645
+ throw new TypeError("artifact dependency request is invalid");
646
+ const type = DEPENDENCY_KIND_TYPES.get(input.kind);
647
+ if (!type)
648
+ throw new Error("artifact dependency kind is not resolvable");
649
+ const matches = adapter
650
+ ._activeArtifacts()
651
+ .filter(
652
+ (artifact) =>
653
+ artifact.type === type && artifact.contentDigest === input.digest,
654
+ );
655
+ if (matches.length !== 1)
656
+ throw new Error("artifact dependency active release is ambiguous");
657
+ const artifact = matches[0];
658
+ return freeze({
659
+ authenticated: true,
660
+ durable: true,
661
+ tenantId,
662
+ sourceKind: input.kind,
663
+ sourceDigest: input.digest,
664
+ sourceDisposition: input.disposition,
665
+ artifactId: artifact.artifactId,
666
+ type: artifact.type,
667
+ releaseId: artifact.activeReleaseId,
668
+ contentDigest: artifact.contentDigest,
669
+ artifactDigest: artifact.artifactDigest,
670
+ });
671
+ },
672
+ });
673
+ RELEASE_RESOLVERS.add(resolver);
674
+ return resolver;
675
+ }
676
+ }
677
+
678
+ export function isEvolvableArtifactTransitionReader(value) {
679
+ return TRANSITION_READERS.has(value);
680
+ }
681
+
682
+ export function isEvolvableArtifactReleaseResolver(value) {
683
+ return RELEASE_RESOLVERS.has(value);
684
+ }
685
+
686
+ export function isEvolvableArtifactActiveReleaseReader(value) {
687
+ return isProtocolEvolvableArtifactActiveReleaseReader(value);
688
+ }