chainlesschain 0.166.21 → 0.166.24

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 (301) hide show
  1. package/README.md +67 -9
  2. package/package.json +4 -3
  3. package/src/assets/web-panel/assets/{AIOps-BjMnsUci.js → AIOps-DR-MWcZc.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DdYFP03A.js → ActionButton-DT8B7sEb.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-Bb8TuuK_.js → Analytics-asjh3dQJ.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-Kn3TIOtk.js → AppLayout-DivQ491i.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-4IxpqI_b.js → Artifacts-DPH2uUmy.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-BOV2caqU.js → Audit-Bp2nLyc-.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-B86k-ay4.js → BackgroundAgents-CHS28khl.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-C5_ie1e3.js → Backup-CKeaFSfz.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-xpwg6QCW.js → BaseInput-CxwM9BAH.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-CVZOcZau.js → Chat-DYLDwaCv.js} +4 -4
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-D8fPYhUu.js → ChatBubbleRenderer-DdBJDBP0.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-MKTq3zdP.js → Checkbox-uYTWOB8j.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-JUk3wzep.js → Codegen-CvYa_dwT.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-JPvTA0kC.js → Col-CanMAX4m.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-Tqgl87NQ.js → Community-B4WaDtHw.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BuAFYBmN.js → Compact-K93Uof_3.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-CXS9WIPZ.js → Compliance-CKeDLgUW.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-Ds2bFHrr.js → Cowork-P93grAeB.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-C_dV_OeW.js → Cron-BSHnMtDn.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-BsO6tIRo.js → Crosschain-epAOpUVJ.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-rNOFqBac.js → DID-ByjXfP7t.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C2fcKKVY.js → Dashboard-QztTU8tb.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-Y7Ndr0X_.js → Dropdown-DhUc9yhN.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DcP_uPmL.js → EmailListRenderer-C2sLhJJN.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Cwn3gDzk.js → FamilyGuardDashboard-CdfbWNDn.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-ClQuOsqb.js → Federation-CcF_R7NW.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-DfwtmlcK.js → FormItemContext-Cm_X2IBk.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-zNZhtbC5.js → GenericCardRenderer-DUi4NWlb.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-BZmdW-G5.js → Git-4Sq5FjBt.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CqBk4lEn.js → Governance-Dx2_v4V6.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-Dbmt3ZXk.js → Inference-7Vr1xekR.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-hMTH6qf3.js → KnowledgeGraph-Cnd2XOzf.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-CkiYgiW2.js → Logs-B66QPVf-.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-BL1FElXg.js → MarkdownRenderer-PLsEvhly.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-CbB6wfin.js → Marketplace-BMIK9BmC.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BSwiFtte.js → McpTools-BDbyp3J_.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-B03PeHrz.js → Memory-CJdzfZGi.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-CRGrnd-X.js → MobileBridge-C2TH5Y3-.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-CE_5v2kO.js → MobileProjects-D1dYXkvV.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-Dp11QVx1.js → Mtc-B-4A1I1j.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-CYu-3JBu.js → MtcAudit-Bgcc9UOl.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-CGyJ0Xl3.js → Multisig-DqOe-etP.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-CoWi_ov1.js → NLProgramming-7VnhzE_6.js} +1 -1
  46. package/src/assets/web-panel/assets/Notes-BxawpeUQ.js +7 -0
  47. package/src/assets/web-panel/assets/{NotificationSettings-DX4I2b4W.js → NotificationSettings-Cr08G2aE.js} +1 -1
  48. package/src/assets/web-panel/assets/OrderTableRenderer-Ce8bEGlK.js +1 -0
  49. package/src/assets/web-panel/assets/{Organization-oopLO_tk.js → Organization-BC7lveGv.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-BFVvjMyf.js → Overflow-CakOW-G0.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-CBy5t-Tk.js → P2P-Cf8CaOBZ.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser--YWJNsu6.js → PdhVaultBrowser-Dc7b98W9.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-C2dZ8scb.js → Permissions-DGJyMEfS.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Bs3l7Hlx.js → PersonalDataHub-DNIwSdwu.js} +6 -6
  55. package/src/assets/web-panel/assets/{Pipeline-DEBWbZuD.js → Pipeline-5B1S12wa.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-CjHBb6NU.js → Privacy-CMB6Ke5t.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-D2WipUz5.js → ProjectInit-D5PqTFiT.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-B6WfnrGB.js → ProjectSettings-CbKNdSjV.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-ccXaHzYL.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-CCv5M_Dv.js → Providers-CJF5_-Gs.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-CGthxU54.js → QrScannerModal-CT6iEAdi.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-CnPmXPFb.js → QuickAsk-Ci0h9mJ_.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-Df_tGEa9.js → Recommend-Da5mobZu.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-Z58N0Loe.js → RemoteSession-BaCY8eey.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-CZTBQ2Vt.js → Reputation-CaITfTsI.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-CdK3YpCQ.js → Row-DtUDamyP.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-CFMVT5sb.js → RssFeed-DX27gFpg.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DrF8RIvD.js → Search-DFL69osN.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-Ddk2f2DM.js → Security-BqGeoWv-.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-CCuK-VOo.js → Services-3z1WnEAc.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-DxCpHzeM.js → Skeleton-C_OJQQ9Z.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-t2oTDgcv.js → Skills-BY7aT6Mo.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Df63M9_R.js → Sla-BZv7DSaD.js} +1 -1
  74. package/src/assets/web-panel/assets/SpeechSettings-6lJKLhCn.js +1 -0
  75. package/src/assets/web-panel/assets/{SyncSettings-COd_tgPp.js → SyncSettings-B6D7STlI.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-CzDCcrik.js → Tasks-Co_FCZAO.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-D-vfxTGA.js → Templates-CnY-9fgz.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-BlpT_Gxc.js → Tenant-B71yXfZ8.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-D5rq52Hg.js → Terminal-Dd_P7awo.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-DdoMndkK.js → TimelineRenderer-CvIEMyli.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BhgBsI6g.js → Tokens-DknFBGOi.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-DwwzoikZ.js → Trigger-D_4nJONB.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-HkTpzXFb.js → Trust-BNl21fa7.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-D9nk6Ehe.js → UkeySign-CFrCI7uK.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-BKk0rfoy.js → VideoEditing-BVfY6JLg.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-IVWIU_Lq.js → Wallet-Cj9CAK0J.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-CFTCpfsG.js → WebAuthn-DcqZlzA3.js} +4 -4
  88. package/src/assets/web-panel/assets/{WorkflowEditor-Dnf4Obif.js → WorkflowEditor-Dfr_dMld.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-D2snERdj.js → chat-Yv6UF0AD.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DKEjK1N1.js → colors-CDW_-1fs.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BEDLwQdt.js → compact-item-BYOQvd-6.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-DA9iW1a0.js → createContext-BCGO0BiP.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-H-kXSuf-.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-5l2xEcY9.js → hasIn-DY-70cfQ.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-B7_W_rYd.js → index-366wfQBU.js} +1 -1
  96. package/src/assets/web-panel/assets/index-B0o4MeNK.js +1 -0
  97. package/src/assets/web-panel/assets/{index-CxEtQYdi.js → index-B9ZogJJM.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B00GeekA.js → index-B9m5QAMg.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-C7sKbM5s.js → index-BBs2mv5M.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CX1x4AFn.js → index-BFv1hzF6.js} +1 -1
  101. package/src/assets/web-panel/assets/index-BVafOL_I.js +1 -0
  102. package/src/assets/web-panel/assets/{index-DU2TXJu-.js → index-BXlEx4UH.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-e-e40id6.js → index-BayRTE5w.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DXet1xol.js → index-Bb9nyts1.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-D7z4zB_a.js → index-Bf_Va0S-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-fccZmC_h.js → index-Br3wQLVY.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Bqc8tdIF.js → index-BvK4fjkk.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BO9dQjpt.js → index-C40UdtlS.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Csfb-7hw.js → index-C4UJA2ju.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Td8ZwyoC.js → index-CB_Iw73G.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BZ5lY2zx.js → index-CCwWp3mT.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DpqtbXdE.js → index-CFa2fPCk.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-NJieh3T1.js → index-CIyHxV4u.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Dbkghqn_.js → index-CUP-A2_h.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DqwPFbOb.js → index-CUo27q9J.js} +3 -3
  116. package/src/assets/web-panel/assets/{index-B4QYBliR.js → index-CaT8trvf.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BgfImyZI.js → index-CnZNbcux.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dbd7eEex.js → index-Cy2NE6AO.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CbTPvp2_.js → index-CzeEEazr.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-5pW4t1iD.js → index-D--TEyDj.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Dg2a9owQ.js → index-DCtsjhhT.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B_eCoZgW.js → index-DLOf7BSz.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-7P1b8HZo.js → index-DM5c4pc-.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CRPrHE7h.js → index-DRFC2Qt0.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Bq5P3piS.js → index-DT_qVaaV.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CjWltbi_.js → index-DUDoRk9r.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CkMKuqUs.js → index-Dg-AQYDf.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DLoalqRX.js → index-DuIPq5MX.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CGlotREA.js → index-NYVBUAVN.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-yYEQXYaU.js → index-NaCESahy.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CmruhzFi.js → index-RjIMPG0u.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-fgYk0QXO.js → index-Y9akzgFO.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DvV03Ayk.js → index-hZ0Eyrrw.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-CPrcB1TC.js → initDefaultProps-CG99CcR4.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BQ7mWRh_.js → motion-Z7MH0_0G.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-CzOEq99p.js → move-BX67lOdq.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-BlQI5jrw.js → mtc-parser-CmAbG1fE.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-DlW4gxmv.js → omit-DiU5tI1_.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-BBYms5nP.js → pickAttrs-BGfvLrYL.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-az2MPJ_7.js → placementArrow-CggLEgaJ.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-D1-ibEol.js → responsiveObserve-t3nlghPZ.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-DHGqa4GA.js → slide-BkV4dL9s.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-CYGDo6lD.js → statusUtils-qec1PUoC.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-Cl2EM9K6.js → styleChecker-ChjX6T8D.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DdYhzuv1.js → useFlexGapSupport-B1jLoZcM.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-DWumPuBW.js → useFs-C3X53s4E.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-DxAO-Aqi.js → usePersonalDataHub-DOvbbnkZ.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-CplsQf_N.js → vnode-Ie0TEVFT.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-Cw5HXNSG.js → zoom-CRUMVS8l.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +3 -3
  152. package/src/commands/agent.js +18 -1
  153. package/src/commands/evolution-benchmark.js +72 -0
  154. package/src/commands/evolution.js +2 -0
  155. package/src/commands/governed-skill-marketplace.js +142 -0
  156. package/src/commands/marketplace.js +4 -1
  157. package/src/commands/serve.js +41 -0
  158. package/src/commands/skill.js +3 -0
  159. package/src/data/changelog.json +39 -0
  160. package/src/gateways/ws/ws-agent-handler.js +59 -2
  161. package/src/gateways/ws/ws-server.js +2 -0
  162. package/src/harness/golden-transcript.js +1 -0
  163. package/src/harness/prompt-compressor.js +51 -5
  164. package/src/harness/provider-backed-compaction.js +28 -1
  165. package/src/harness/remote-session-registry.js +15 -3
  166. package/src/index.js +30 -4
  167. package/src/lazy-dispatch.js +15 -1
  168. package/src/lib/advisor-runtime.js +55 -2
  169. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  170. package/src/lib/app-server/graph-runtime.js +32 -0
  171. package/src/lib/app-server/server.js +45 -1
  172. package/src/lib/app-server/websocket-transport.js +23 -0
  173. package/src/lib/autonomous-agent.js +63 -13
  174. package/src/lib/cowork/ab-comparator-cli.js +4 -3
  175. package/src/lib/cowork/debate-review-cli.js +4 -3
  176. package/src/lib/cowork/decision-kb-cli.js +5 -0
  177. package/src/lib/cowork-adapter.js +38 -16
  178. package/src/lib/evolution/agent-evolution-ingress.js +95 -15
  179. package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
  180. package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
  181. package/src/lib/evolution/agent-model-projection.js +217 -0
  182. package/src/lib/evolution/bounded-descriptor-read.js +29 -0
  183. package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
  184. package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
  185. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +10 -1
  186. package/src/lib/evolution/evidence-json-text.js +236 -0
  187. package/src/lib/evolution/evolution-artifact-ports.js +202 -21
  188. package/src/lib/evolution/evolution-deployment-loader.js +369 -0
  189. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
  190. package/src/lib/evolution/evolution-eval-gate.js +14 -1
  191. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
  192. package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
  193. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
  194. package/src/lib/evolution/evolution-evidence-projector.js +240 -37
  195. package/src/lib/evolution/evolution-file-witness.js +153 -30
  196. package/src/lib/evolution/evolution-ledger-ports.js +1027 -66
  197. package/src/lib/evolution/evolution-ledger.js +66 -2
  198. package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
  199. package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
  200. package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
  201. package/src/lib/evolution/evolution-release-train-ledger-adapter.js +335 -0
  202. package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
  203. package/src/lib/evolution/evolution-release-train.js +586 -0
  204. package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
  205. package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
  206. package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
  207. package/src/lib/evolution/evolution-workbench-projection.js +152 -25
  208. package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
  209. package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
  210. package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
  211. package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
  212. package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
  213. package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
  214. package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
  215. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +736 -0
  216. package/src/lib/evolution/governed-knowledge-artifact-lifecycle.js +364 -0
  217. package/src/lib/evolution/governed-knowledge-candidate-rejection.js +343 -0
  218. package/src/lib/evolution/governed-knowledge-dependency-authority.js +227 -44
  219. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +95 -83
  220. package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +29 -2
  221. package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +31 -3
  222. package/src/lib/evolution/governed-knowledge-record.js +148 -0
  223. package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
  224. package/src/lib/evolution/governed-knowledge-skill-rollback.js +475 -0
  225. package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +92 -6
  226. package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +57 -4
  227. package/src/lib/evolution/governed-knowledge-sync.js +332 -99
  228. package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +462 -0
  229. package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
  230. package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
  231. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
  232. package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
  233. package/src/lib/evolution/governed-skill-marketplace.js +288 -5
  234. package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
  235. package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
  236. package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
  237. package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
  238. package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
  239. package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
  240. package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
  241. package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
  242. package/src/lib/evolution/governed-wiki-pruning.js +322 -143
  243. package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
  244. package/src/lib/evolution/knowledge-wiki-source-admission.js +124 -0
  245. package/src/lib/evolution/knowledge-wiki-source-provenance.js +359 -0
  246. package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
  247. package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
  248. package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
  249. package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
  250. package/src/lib/evolution/skill-candidate-registry.js +22 -0
  251. package/src/lib/evolution/skill-promotion-controller.js +25 -0
  252. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
  253. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
  254. package/src/lib/evolution/skill-release-registry.js +25 -4
  255. package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
  256. package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
  257. package/src/lib/evolution/skill-revocation-propagation.js +467 -0
  258. package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
  259. package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
  260. package/src/lib/evolution/skill-writer-inventory-manifest.js +15 -12
  261. package/src/lib/evolution/statistical-progressive-canary.js +845 -0
  262. package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
  263. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
  264. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
  265. package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
  266. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +760 -100
  267. package/src/lib/evolution/wiki-revision-protocol.js +120 -0
  268. package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
  269. package/src/lib/evolution/wiki-target-tombstone-revision.js +101 -0
  270. package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
  271. package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
  272. package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
  273. package/src/lib/evolution/wikiskill-benchmark.js +574 -0
  274. package/src/lib/goal-assess.js +17 -10
  275. package/src/lib/interactive-planner.js +9 -1
  276. package/src/lib/iteration-budget.js +16 -2
  277. package/src/lib/micro-compact.js +4 -1
  278. package/src/lib/model-failure-policy.js +21 -0
  279. package/src/lib/process-execution-broker/index.js +1 -0
  280. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  281. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  282. package/src/lib/process-execution-broker/windows-sandbox.cs +33 -15
  283. package/src/lib/read-file-page.js +191 -0
  284. package/src/lib/runnable-provider.js +2 -1
  285. package/src/lib/session-host-lease.js +11 -16
  286. package/src/lib/skill-retrieval-router.js +22 -1
  287. package/src/repl/agent-repl.js +127 -33
  288. package/src/runtime/agent-core.js +224 -80
  289. package/src/runtime/agent-runtime.js +43 -0
  290. package/src/runtime/coding-agent-contract-shared.cjs +7 -1
  291. package/src/runtime/fallback-model.js +143 -62
  292. package/src/runtime/headless-runner.js +54 -10
  293. package/src/runtime/headless-stream.js +53 -6
  294. package/src/runtime/runtime-factory.js +41 -2
  295. package/src/assets/web-panel/assets/Notes-CgU9DDo9.js +0 -7
  296. package/src/assets/web-panel/assets/OrderTableRenderer-CwHc15Zs.js +0 -1
  297. package/src/assets/web-panel/assets/Projects-FF_thRi6.js +0 -1
  298. package/src/assets/web-panel/assets/SpeechSettings-l7ox6KuX.js +0 -1
  299. package/src/assets/web-panel/assets/devWarning-DyhgpXPf.js +0 -1
  300. package/src/assets/web-panel/assets/index-Ck1jhFE0.js +0 -1
  301. package/src/assets/web-panel/assets/index-c8jJEHVs.js +0 -1
@@ -0,0 +1,330 @@
1
+ import { createHash } from "node:crypto";
2
+ import { isAbsolute } from "node:path";
3
+ import { types as utilTypes } from "node:util";
4
+ import {
5
+ SkillCandidateRegistry,
6
+ SKILL_CANDIDATE_MAX_ARTIFACT_BYTES,
7
+ verifySkillCandidateDraft,
8
+ } from "./skill-candidate-registry.js";
9
+
10
+ export const GOVERNED_SKILL_MARKETPLACE_CANDIDATE_BINDING_SCHEMA =
11
+ "chainlesschain.governed-skill-marketplace-candidate-binding/v1";
12
+ const INSTALLERS = new WeakSet();
13
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
14
+ const BINDING_DIGESTS = [
15
+ "manifestDigest",
16
+ "packageDigest",
17
+ "adaptedOutputDigest",
18
+ "candidateId",
19
+ "contentDigest",
20
+ "dependencyLockDigest",
21
+ "runtimeManifestDigest",
22
+ "targetMatrixRoot",
23
+ "sbomDigest",
24
+ "permissionManifestDigest",
25
+ "bindingDigest",
26
+ ];
27
+ const BINDING_KEYS = new Set([
28
+ "schema",
29
+ "tenantId",
30
+ "skillName",
31
+ ...BINDING_DIGESTS,
32
+ ]);
33
+
34
+ function canonical(value) {
35
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
36
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
37
+ return `{${Object.keys(value)
38
+ .sort()
39
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
40
+ .join(",")}}`;
41
+ }
42
+
43
+ function hash(bytes) {
44
+ return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
45
+ }
46
+
47
+ function bindingDigest(core) {
48
+ return hash(
49
+ `${GOVERNED_SKILL_MARKETPLACE_CANDIDATE_BINDING_SCHEMA}\0${canonical(core)}`,
50
+ );
51
+ }
52
+
53
+ export function serializeGovernedSkillMarketplaceCandidatePackage(candidate) {
54
+ return Buffer.from(
55
+ `${canonical(verifySkillCandidateDraft(candidate))}\n`,
56
+ "utf8",
57
+ );
58
+ }
59
+
60
+ export function digestGovernedSkillMarketplaceCandidatePermissions(candidate) {
61
+ const verified = verifySkillCandidateDraft(candidate);
62
+ return hash(
63
+ `chainlesschain.governed-skill-marketplace-permissions/v1\0${canonical({
64
+ tenantId: verified.tenantId,
65
+ skillName: verified.skillName,
66
+ requestedCapabilities: verified.requestedCapabilities,
67
+ })}`,
68
+ );
69
+ }
70
+
71
+ export function verifyGovernedSkillMarketplaceCandidateBinding(
72
+ value,
73
+ expected,
74
+ ) {
75
+ if (
76
+ !value ||
77
+ utilTypes.isProxy(value) ||
78
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value))
79
+ )
80
+ throw new TypeError("marketplace candidate binding is invalid");
81
+ const keys = Reflect.ownKeys(value);
82
+ if (
83
+ keys.length !== BINDING_KEYS.size ||
84
+ keys.some((key) => !BINDING_KEYS.has(key))
85
+ )
86
+ throw new TypeError("marketplace candidate binding has invalid fields");
87
+ for (const key of keys) {
88
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
89
+ if (
90
+ !descriptor ||
91
+ !Object.hasOwn(descriptor, "value") ||
92
+ !descriptor.enumerable
93
+ )
94
+ throw new TypeError(
95
+ "marketplace candidate binding must contain data fields",
96
+ );
97
+ }
98
+ const { bindingDigest: supplied, ...core } = value;
99
+ if (
100
+ value.schema !== GOVERNED_SKILL_MARKETPLACE_CANDIDATE_BINDING_SCHEMA ||
101
+ BINDING_DIGESTS.some(
102
+ (key) => typeof value[key] !== "string" || !DIGEST.test(value[key]),
103
+ ) ||
104
+ supplied !== bindingDigest(core) ||
105
+ [
106
+ "tenantId",
107
+ "skillName",
108
+ "manifestDigest",
109
+ "packageDigest",
110
+ "adaptedOutputDigest",
111
+ ].some((key) => value[key] !== expected[key])
112
+ )
113
+ throw new Error("marketplace candidate binding does not match its state");
114
+ return Object.freeze({ ...value });
115
+ }
116
+
117
+ function bytes(value, expectedDigest, name) {
118
+ if (
119
+ utilTypes.isProxy(value) ||
120
+ !Buffer.isBuffer(value) ||
121
+ value.length === 0 ||
122
+ value.length > SKILL_CANDIDATE_MAX_ARTIFACT_BYTES
123
+ )
124
+ throw new TypeError(`marketplace ${name} must be bounded bytes`);
125
+ const snapshot = Buffer.from(value);
126
+ if (hash(snapshot) !== expectedDigest)
127
+ throw new Error(`marketplace ${name} digest mismatch`);
128
+ return snapshot;
129
+ }
130
+
131
+ function parsePackage(value) {
132
+ let candidate;
133
+ try {
134
+ candidate = verifySkillCandidateDraft(
135
+ JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(value)),
136
+ );
137
+ } catch (cause) {
138
+ throw new Error(
139
+ "marketplace package is not a verified Candidate v2 artifact",
140
+ { cause },
141
+ );
142
+ }
143
+ if (
144
+ !serializeGovernedSkillMarketplaceCandidatePackage(candidate).equals(value)
145
+ )
146
+ throw new Error("marketplace candidate package is not canonical");
147
+ return candidate;
148
+ }
149
+
150
+ function matchManifest(candidate, manifest) {
151
+ if (
152
+ candidate.tenantId !== manifest.tenantId ||
153
+ candidate.skillName !== manifest.skillName ||
154
+ candidate.dependencyLockDigest !== manifest.dependencyLockDigest ||
155
+ candidate.targetMatrixRoot !== manifest.targetMatrixDigest ||
156
+ digestGovernedSkillMarketplaceCandidatePermissions(candidate) !==
157
+ manifest.permissionManifestDigest ||
158
+ candidate.sourceEvidenceRefs.some(
159
+ ({ digest }) => !manifest.lineage.includes(digest),
160
+ )
161
+ )
162
+ throw new Error(
163
+ "marketplace candidate provenance, execution or permissions differ from the signed manifest",
164
+ );
165
+ }
166
+
167
+ function candidateInput(candidate) {
168
+ return Object.fromEntries(
169
+ [
170
+ "tenantId",
171
+ "skillName",
172
+ "content",
173
+ "dependencyLock",
174
+ "runtimeManifest",
175
+ "targetMatrix",
176
+ "sourceEvidenceRefs",
177
+ "derivationMode",
178
+ "wikiRevision",
179
+ "proposerModel",
180
+ "parentDigest",
181
+ "requestedCapabilities",
182
+ ].map((key) => [key, candidate[key]]),
183
+ );
184
+ }
185
+
186
+ export function isGovernedSkillMarketplaceCandidateInstaller(value) {
187
+ return INSTALLERS.has(value);
188
+ }
189
+
190
+ /** Owns an actual candidate-only registry; never accepts a caller-supplied write acknowledgement. */
191
+ export function createGovernedSkillMarketplaceCandidateInstaller({
192
+ tenantId,
193
+ registryOptions,
194
+ artifacts,
195
+ } = {}) {
196
+ const resolve = artifacts?.resolve;
197
+ if (typeof resolve !== "function")
198
+ throw new TypeError("marketplace artifact resolver is required");
199
+ if (
200
+ !registryOptions ||
201
+ typeof registryOptions.rootDir !== "string" ||
202
+ !isAbsolute(registryOptions.rootDir) ||
203
+ (registryOptions.tenantId !== undefined &&
204
+ registryOptions.tenantId !== tenantId)
205
+ )
206
+ throw new TypeError(
207
+ "marketplace candidate registry requires an explicit same-tenant root",
208
+ );
209
+ const authority = registryOptions.targetMatrixAdmissionAuthority;
210
+ if (!authority || typeof authority.resolve !== "function")
211
+ throw new TypeError(
212
+ "marketplace candidate admission authority is required",
213
+ );
214
+ const admissionResolve = authority.resolve;
215
+ const options = Object.freeze({
216
+ ...registryOptions,
217
+ tenantId,
218
+ targetMatrixAdmissionAuthority: Object.freeze({
219
+ ...authority,
220
+ resolve: (...args) => Reflect.apply(admissionResolve, authority, args),
221
+ }),
222
+ });
223
+ // Opening the registry validates every stored artifact. Defer that operation
224
+ // so a fresh CLI process can still revoke a corrupted candidate using Ledger
225
+ // authority alone. Materialize/read never fall back to an unverified store.
226
+ let registry = null;
227
+ const open = () => (registry ??= new SkillCandidateRegistry(options));
228
+ const read = (candidateId) => open().read(candidateId);
229
+ const create = (input) => open().create(input);
230
+ const verifyStored = (binding) => {
231
+ const candidate = read(binding.candidateId);
232
+ if (
233
+ candidate.tenantId !== tenantId ||
234
+ candidate.skillName !== binding.skillName ||
235
+ [
236
+ "contentDigest",
237
+ "dependencyLockDigest",
238
+ "runtimeManifestDigest",
239
+ "targetMatrixRoot",
240
+ ].some((key) => candidate[key] !== binding[key]) ||
241
+ hash(serializeGovernedSkillMarketplaceCandidatePackage(candidate)) !==
242
+ binding.adaptedOutputDigest ||
243
+ digestGovernedSkillMarketplaceCandidatePermissions(candidate) !==
244
+ binding.permissionManifestDigest
245
+ )
246
+ throw new Error(
247
+ "marketplace stored candidate does not match its durable binding",
248
+ );
249
+ return binding;
250
+ };
251
+ const installer = Object.freeze({
252
+ tenantId,
253
+ async materialize(inspected) {
254
+ const { manifest, adapted, target } = inspected;
255
+ if (manifest.tenantId !== tenantId)
256
+ throw new Error("marketplace candidate tenant mismatch");
257
+ const request = Object.freeze({
258
+ tenantId,
259
+ skillName: manifest.skillName,
260
+ version: manifest.version,
261
+ packageDigest: manifest.packageDigest,
262
+ adaptedOutputDigest: adapted.outputDigest,
263
+ sbomDigest: manifest.sbomDigest,
264
+ });
265
+ const resolved = await Reflect.apply(resolve, artifacts, [request]);
266
+ const sourceBytes = bytes(
267
+ resolved?.packageBytes,
268
+ request.packageDigest,
269
+ "source package",
270
+ );
271
+ const adaptedBytes = bytes(
272
+ resolved?.adaptedBytes,
273
+ request.adaptedOutputDigest,
274
+ "adapted package",
275
+ );
276
+ bytes(resolved?.sbomBytes, request.sbomDigest, "SBOM");
277
+ const source = parsePackage(sourceBytes);
278
+ const candidate = parsePackage(adaptedBytes);
279
+ matchManifest(source, manifest);
280
+ matchManifest(candidate, manifest);
281
+ const runtime = candidate.runtimeManifest.runtimes.find(
282
+ ({ runtimeId }) => runtimeId === target.tool,
283
+ );
284
+ if (
285
+ !candidate.targetRuntimes.includes(target.tool) ||
286
+ runtime?.descriptor.platform !== target.os ||
287
+ runtime.descriptor.runtime !== target.runtime
288
+ )
289
+ throw new Error(
290
+ "marketplace adapted candidate runtime does not match the evaluated target",
291
+ );
292
+ const core = {
293
+ schema: GOVERNED_SKILL_MARKETPLACE_CANDIDATE_BINDING_SCHEMA,
294
+ tenantId,
295
+ skillName: manifest.skillName,
296
+ manifestDigest: manifest.manifestDigest,
297
+ ...request,
298
+ candidateId: candidate.candidateId,
299
+ contentDigest: candidate.contentDigest,
300
+ dependencyLockDigest: candidate.dependencyLockDigest,
301
+ runtimeManifestDigest: candidate.runtimeManifestDigest,
302
+ targetMatrixRoot: candidate.targetMatrixRoot,
303
+ permissionManifestDigest: manifest.permissionManifestDigest,
304
+ };
305
+ delete core.version;
306
+ const binding = Object.freeze({
307
+ ...core,
308
+ bindingDigest: bindingDigest(core),
309
+ });
310
+ const result = create(candidateInput(candidate));
311
+ if (result.candidate.candidateId !== candidate.candidateId)
312
+ throw new Error(
313
+ "marketplace candidate registry returned a different candidate",
314
+ );
315
+ return verifyStored(binding);
316
+ },
317
+ verify(state) {
318
+ if (state?.tenantId !== tenantId)
319
+ throw new Error("marketplace candidate tenant mismatch");
320
+ return verifyStored(
321
+ verifyGovernedSkillMarketplaceCandidateBinding(
322
+ state.candidateBinding,
323
+ state,
324
+ ),
325
+ );
326
+ },
327
+ });
328
+ INSTALLERS.add(installer);
329
+ return installer;
330
+ }
@@ -0,0 +1,308 @@
1
+ import { types as utilTypes } from "node:util";
2
+ import { GovernedSkillMarketplace } from "./governed-skill-marketplace.js";
3
+ import { isGovernedSkillMarketplaceLedgerAdapter } from "./governed-skill-marketplace-ledger-adapter.js";
4
+ import { isGovernedSkillMarketplaceCandidateInstaller } from "./governed-skill-marketplace-candidate.js";
5
+
6
+ const HOSTS = new WeakSet();
7
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
8
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
9
+ const TARGET_KEYS = ["model", "os", "runtime", "tool"];
10
+ export const GOVERNED_SKILL_MARKETPLACE_PUBLIC_BADGE_SCHEMA =
11
+ "chainlesschain.governed-skill-marketplace-public-badge/v1";
12
+
13
+ function id(value, name) {
14
+ if (typeof value !== "string" || !ID.test(value))
15
+ throw new TypeError(`${name} is invalid`);
16
+ return value;
17
+ }
18
+
19
+ function digest(value, name) {
20
+ if (typeof value !== "string" || !DIGEST.test(value))
21
+ throw new TypeError(`${name} is invalid`);
22
+ return value;
23
+ }
24
+
25
+ function capture(owner, name) {
26
+ const callable = owner?.[name];
27
+ if (typeof callable !== "function")
28
+ throw new TypeError(`marketplace ${name} port is required`);
29
+ return (...args) => Reflect.apply(callable, owner, args);
30
+ }
31
+
32
+ function targetSnapshot(value) {
33
+ if (
34
+ !value ||
35
+ utilTypes.isProxy(value) ||
36
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value)) ||
37
+ JSON.stringify(Reflect.ownKeys(value).sort()) !==
38
+ JSON.stringify(TARGET_KEYS)
39
+ )
40
+ throw new TypeError("marketplace deployment target is invalid");
41
+ const result = {};
42
+ for (const key of TARGET_KEYS) {
43
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
44
+ if (!descriptor || !Object.hasOwn(descriptor, "value"))
45
+ throw new TypeError(
46
+ "marketplace deployment target must contain data fields",
47
+ );
48
+ result[key] = id(descriptor.value, `target ${key}`);
49
+ }
50
+ return Object.freeze(result);
51
+ }
52
+
53
+ export function isGovernedSkillMarketplaceCliHost(value) {
54
+ return HOSTS.has(value);
55
+ }
56
+
57
+ /** Deployment-owned catalog, verification and transition ports. No local fallback. */
58
+ export function createGovernedSkillMarketplaceCliHost({
59
+ tenantId,
60
+ target: inputTarget,
61
+ ledgerAdapter,
62
+ candidateInstaller,
63
+ catalog,
64
+ ports,
65
+ } = {}) {
66
+ id(tenantId, "tenantId");
67
+ if (
68
+ !isGovernedSkillMarketplaceLedgerAdapter(ledgerAdapter) ||
69
+ ledgerAdapter.descriptor.tenantId !== tenantId
70
+ )
71
+ throw new TypeError(
72
+ "a same-tenant branded marketplace ledger adapter is required",
73
+ );
74
+ const target = targetSnapshot(inputTarget);
75
+ if (
76
+ !isGovernedSkillMarketplaceCandidateInstaller(candidateInstaller) ||
77
+ candidateInstaller.tenantId !== tenantId
78
+ )
79
+ throw new TypeError(
80
+ "a same-tenant branded marketplace candidate installer is required",
81
+ );
82
+ const resolve = capture(catalog, "resolve");
83
+ const load = ledgerAdapter.load;
84
+ const listSkillNames = ledgerAdapter.listSkillNames;
85
+ const isManifestRevoked = ledgerAdapter.isManifestRevoked;
86
+ const marketplace = new GovernedSkillMarketplace({
87
+ tenantId,
88
+ ports: {
89
+ verifySignature: capture(ports, "verifySignature"),
90
+ adapt: capture(ports, "adapt"),
91
+ transition: capture(ports, "transition"),
92
+ verifyPilot: capture(ports, "verifyPilot"),
93
+ verifyRevocation: capture(ports, "verifyRevocation"),
94
+ load,
95
+ commit: ledgerAdapter.commit,
96
+ },
97
+ });
98
+
99
+ const stateFor = async (skillName, verifyCandidate = true) => {
100
+ id(skillName, "skillName");
101
+ const state = await load({ skillName });
102
+ if (state && TARGET_KEYS.some((key) => state.target[key] !== target[key]))
103
+ throw new Error("marketplace state belongs to another deployment target");
104
+ if (verifyCandidate && state?.candidateBinding && !state.revoked)
105
+ candidateInstaller.verify(state);
106
+ return state;
107
+ };
108
+ const resolveManifest = async (skillName, version) => {
109
+ id(skillName, "skillName");
110
+ if (version !== null) id(version, "version");
111
+ const manifest = await resolve(
112
+ Object.freeze({ tenantId, skillName, version }),
113
+ );
114
+ if (
115
+ manifest?.tenantId !== tenantId ||
116
+ manifest.skillName !== skillName ||
117
+ (version !== null && manifest.version !== version)
118
+ )
119
+ throw new Error(
120
+ "marketplace catalog returned a different Skill or version",
121
+ );
122
+ return manifest;
123
+ };
124
+ const exactState = async (
125
+ skillName,
126
+ expectedStateDigest,
127
+ verifyCandidate = true,
128
+ ) => {
129
+ digest(expectedStateDigest, "expectedStateDigest");
130
+ const state = await stateFor(skillName, verifyCandidate);
131
+ if (!state || state.stateDigest !== expectedStateDigest)
132
+ throw new Error("marketplace state baseline changed");
133
+ return state;
134
+ };
135
+
136
+ const host = Object.freeze({
137
+ tenantId,
138
+ target,
139
+ async list({ offset = 0, limit = 100 } = {}) {
140
+ if (
141
+ !Number.isSafeInteger(offset) ||
142
+ offset < 0 ||
143
+ !Number.isSafeInteger(limit) ||
144
+ limit < 1 ||
145
+ limit > 500
146
+ )
147
+ throw new TypeError("marketplace list bounds are invalid");
148
+ const names = listSkillNames();
149
+ const items = [];
150
+ for (const skillName of names.slice(offset, offset + limit))
151
+ items.push(await stateFor(skillName));
152
+ return Object.freeze({
153
+ items: Object.freeze(items),
154
+ total: names.length,
155
+ offset,
156
+ limit,
157
+ });
158
+ },
159
+ async inspect({ skillName, version = null } = {}) {
160
+ const manifest = await resolveManifest(skillName, version);
161
+ const inspected = await marketplace.inspect(manifest, target);
162
+ return Object.freeze({
163
+ skillName,
164
+ version: inspected.manifest.version,
165
+ manifestDigest: inspected.manifest.manifestDigest,
166
+ packageDigest: inspected.manifest.packageDigest,
167
+ sourceModel: inspected.manifest.sourceModel,
168
+ target,
169
+ evalBadgeDigest: inspected.manifest.evalBadgeDigest,
170
+ evalReceiptDigest: inspected.cell.evalReceiptDigest,
171
+ qualityScore: inspected.cell.qualityScore,
172
+ sampleCount: inspected.cell.sampleCount,
173
+ adaptedOutputDigest: inspected.adapted.outputDigest,
174
+ state: await stateFor(skillName),
175
+ });
176
+ },
177
+ async preparePublicBadge({ skillName, version, manifestDigest } = {}) {
178
+ id(version, "exact public badge version");
179
+ digest(manifestDigest, "manifestDigest");
180
+ const manifest = await resolveManifest(skillName, version);
181
+ if (manifest.manifestDigest !== manifestDigest)
182
+ throw new Error("public badge manifest changed");
183
+ // Adaptation/evaluation happens only during explicit publication, never
184
+ // in response to anonymous HTTP traffic. The server expires this snapshot.
185
+ const inspected = await marketplace.inspect(manifest, target);
186
+ const projection = Object.freeze({
187
+ schema: GOVERNED_SKILL_MARKETPLACE_PUBLIC_BADGE_SCHEMA,
188
+ skillName,
189
+ version,
190
+ manifestDigest,
191
+ sourceModel: inspected.manifest.sourceModel,
192
+ sourceCommitDigest: inspected.manifest.sourceCommitDigest,
193
+ packageDigest: inspected.manifest.packageDigest,
194
+ sbomDigest: inspected.manifest.sbomDigest,
195
+ dependencyLockDigest: inspected.manifest.dependencyLockDigest,
196
+ permissionManifestDigest: inspected.manifest.permissionManifestDigest,
197
+ targetMatrixDigest: inspected.manifest.targetMatrixDigest,
198
+ evalBadgeDigest: inspected.manifest.evalBadgeDigest,
199
+ evalReceiptDigest: inspected.cell.evalReceiptDigest,
200
+ qualityScore: inspected.cell.qualityScore,
201
+ sampleCount: inspected.cell.sampleCount,
202
+ adaptedOutputDigest: inspected.adapted.outputDigest,
203
+ target,
204
+ });
205
+ return Object.freeze({
206
+ read: async () => {
207
+ const current = await resolveManifest(skillName, version);
208
+ if (current.manifestDigest !== manifestDigest)
209
+ throw new Error("public badge manifest changed");
210
+ await marketplace.verifyListing(current, target);
211
+ const revoked = await isManifestRevoked({
212
+ skillName,
213
+ manifestDigest,
214
+ });
215
+ return Object.freeze({ ...projection, revoked });
216
+ },
217
+ });
218
+ },
219
+ state: ({ skillName } = {}) => stateFor(skillName),
220
+ async install({
221
+ skillName,
222
+ version = null,
223
+ manifestDigest,
224
+ expectedStateDigest = null,
225
+ } = {}) {
226
+ digest(manifestDigest, "manifestDigest");
227
+ if (expectedStateDigest !== null)
228
+ digest(expectedStateDigest, "expectedStateDigest");
229
+ const manifest = await resolveManifest(skillName, version);
230
+ if (manifest.manifestDigest !== manifestDigest)
231
+ throw new Error("marketplace catalog manifest changed; inspect again");
232
+ const inspected = await marketplace.inspect(manifest, target);
233
+ if (await isManifestRevoked({ skillName, manifestDigest }))
234
+ throw new Error(
235
+ "marketplace manifest was revoked and cannot be staged again",
236
+ );
237
+ const isReplay = (state) =>
238
+ state?.candidateBinding !== undefined &&
239
+ state?.stage === "candidate" &&
240
+ state.revoked === false &&
241
+ state.manifestDigest === manifestDigest &&
242
+ state.adaptedOutputDigest === inspected.adapted.outputDigest &&
243
+ state.previousStateDigest === expectedStateDigest;
244
+ const result = (state, recovered) => {
245
+ candidateInstaller.verify(state);
246
+ return Object.freeze({
247
+ status: "candidate-staged",
248
+ activated: false,
249
+ materialized: true,
250
+ recovered,
251
+ state,
252
+ });
253
+ };
254
+ const current = await stateFor(skillName);
255
+ if (isReplay(current)) return result(current, true);
256
+ if (
257
+ current?.manifestDigest === manifestDigest &&
258
+ (current.candidateBinding ||
259
+ current.stage !== "candidate" ||
260
+ current.revoked)
261
+ )
262
+ throw new Error(
263
+ "marketplace manifest is already staged, advanced or revoked",
264
+ );
265
+ if ((current?.stateDigest ?? null) !== expectedStateDigest)
266
+ throw new Error("marketplace install baseline changed");
267
+ const candidateBinding = await candidateInstaller.materialize(inspected);
268
+ try {
269
+ return result(
270
+ await marketplace.stage({
271
+ manifest,
272
+ target,
273
+ expectedStateDigest,
274
+ candidateBinding,
275
+ }),
276
+ false,
277
+ );
278
+ } catch (error) {
279
+ // A durable append may have succeeded before its acknowledgement was lost.
280
+ const recovered = await stateFor(skillName);
281
+ if (isReplay(recovered)) return result(recovered, true);
282
+ throw error;
283
+ }
284
+ },
285
+ async rollout({ skillName, expectedStateDigest, receiptRef } = {}) {
286
+ id(receiptRef, "Pilot receipt reference");
287
+ const current = await exactState(skillName, expectedStateDigest);
288
+ candidateInstaller.verify(current);
289
+ return marketplace.advance({
290
+ skillName,
291
+ expectedStateDigest,
292
+ pilotReceipt: receiptRef,
293
+ });
294
+ },
295
+ async revoke({ skillName, expectedStateDigest, receiptRef } = {}) {
296
+ id(receiptRef, "revocation receipt reference");
297
+ // A missing/corrupt candidate must block rollout, not emergency rollback.
298
+ await exactState(skillName, expectedStateDigest, false);
299
+ return marketplace.revoke({
300
+ skillName,
301
+ expectedStateDigest,
302
+ revocationReceipt: receiptRef,
303
+ });
304
+ },
305
+ });
306
+ HOSTS.add(host);
307
+ return host;
308
+ }