chainlesschain 0.166.22 → 0.166.25

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 (298) hide show
  1. package/README.md +46 -3
  2. package/package.json +4 -3
  3. package/src/assets/web-panel/assets/{AIOps-oJ7USzMC.js → AIOps-RaxL_QQD.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BlgnZe_C.js → ActionButton-DD3ieFO-.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D2rRbTLu.js → Analytics-CATDJukS.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-FwS3f0B2.js → AppLayout-BHGsnRDS.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-iF-_08Hi.js → Artifacts-BL6NunjN.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-D24p0zQw.js → Audit-D0nEWfbA.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-Cg3mRVi9.js → BackgroundAgents-BAP1MUol.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-EOqht3H-.js → Backup-R4y2OeSi.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-9XWYq2hj.js → BaseInput-ByQZ2z6S.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-Dq5yardA.js → Chat-32uV--xF.js} +4 -4
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-t1enanwz.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-CuyCBoBf.js → Checkbox-D1CB-7bq.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-DjWtYHNe.js → Codegen-BPx3dQ2q.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CrVr_iuG.js → Col-DkPTQ2Gl.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-C6QxpfGc.js → Community-ZriaxRlr.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-B-v5r6Pa.js → Compact-C_qJ0P7F.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-zNiLiFgD.js → Compliance-Bgoy-saS.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-D9K7lMOu.js → Cowork-B5i9y6XK.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-DAjO36z4.js → Cron-D7vBJ5-J.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-Bxqn0aqB.js → Crosschain-D4kvoGI_.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-DfRmLUe-.js → DID-BLOeBd-r.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-Cz8KF3fr.js → Dashboard-mecJaonC.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-C4oVfkP0.js → Dropdown-GPKwaFer.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-ivyZKN8k.js → EmailListRenderer-BML9m7Dd.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DoxY1CPW.js → FamilyGuardDashboard-DN5bAtJC.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-C93gZxnb.js → Federation-DmD6Gecd.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-D_lEjYJE.js → FormItemContext-6wwplN_K.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-BNFN9YjN.js → GenericCardRenderer-DUhpLkDL.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-mUu2HcLI.js → Git-eJfyXkwf.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CNuosrge.js → Governance-swAUW59x.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-DwY5pbCB.js → Inference-CbdwJPDJ.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-aRUxhACD.js → KnowledgeGraph-UuYpg1nm.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-DFfsWYy_.js → Logs-CS0G057y.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-BxIIB4k3.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-COI-ciM-.js → Marketplace-CZRjuvvI.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BJJwaIpe.js → McpTools-BOJ9A_Rf.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-CDO6SGDZ.js → Memory-BnkrR-Ok.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-BlZ5tFf4.js → MobileBridge-Do4mPi13.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-DuoxbgWz.js → MobileProjects-2JxWa6-p.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-6ec9j70b.js → Mtc-CS_mnpGd.js} +2 -2
  43. package/src/assets/web-panel/assets/{MtcAudit-BuL7HkC7.js → MtcAudit-DZ4J_351.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-CJxR85lk.js → Multisig-Jh74zKXu.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-B71O1S4l.js → NLProgramming-_4n2BfnS.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-Bsw5zbpV.js → Notes-CtENcKHv.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-BnAhXuK_.js → NotificationSettings-dgDCvpK9.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-BJ0R5GGz.js → OrderTableRenderer-D5VxCrmG.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-B7wwNxoP.js → Organization-CpIF8Xkd.js} +2 -2
  50. package/src/assets/web-panel/assets/{Overflow-CfAGr0gM.js → Overflow-aHnBZaez.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-KhMg22Fz.js → P2P-8ppzog2V.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-NdAXI9ft.js → PdhVaultBrowser-D3p1BXkp.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-CIYjqyT7.js → Permissions-D7vflD5q.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-D2ht3P_R.js → PersonalDataHub-D2hY-Ek2.js} +4 -4
  55. package/src/assets/web-panel/assets/{Pipeline-i6flZW1m.js → Pipeline-qK2VqhJC.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-DE0lhYVc.js → Privacy-DHJr4uu0.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-BL3YbyxS.js → ProjectInit-DMBS6trm.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-CEtdg7ni.js → ProjectSettings-D3Ng74BT.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-CvtU5peJ.js → Projects-BfJFZiIW.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-DKt_Cg-j.js → Providers-DlNA95G0.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-DA61jNSx.js → QrScannerModal-CMOIYxIm.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-fS9ryUmq.js → QuickAsk-D6MyGp5I.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-CR9dZU5Y.js → Recommend-W6WcShtf.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-BV0BR2Dz.js → RemoteSession-Dm_MjlV_.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-BIeGUvYD.js → Reputation-Ctvij6eX.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DHDT1aro.js → Row-DivbeDE-.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-Cq6YKb1h.js → RssFeed-D4famoAw.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DEF6vsy6.js → Search-6gOAh3zG.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-CHtYiKY9.js → Security-DApb9kK8.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-u16lvBJN.js → Services-B8OomyE2.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-CGbizyDj.js → Skeleton-BTJ2g2E3.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-BZMQcAa7.js → Skills-NIRr4DD1.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Bm-CycVi.js → Sla-BQHP_6px.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-BudpA5kr.js → SpeechSettings-BVQTDSVS.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-B8q1C1eC.js → SyncSettings-BOD4Mar6.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-SU1pBWc-.js → Tasks-Ciu7H2-y.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-CyOfJzmt.js → Templates-CtlwavRU.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-xqWSm2GP.js → Tenant-QLWYJdL6.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-D1Ttgjsi.js → Terminal-B3q10mjm.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-Da2lYs5D.js → TimelineRenderer-CqltBA_8.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-B34-SduO.js → Tokens-CJOKrj4y.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-C8zyYm4R.js → Trigger-CPMGgfdM.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-D1Pvqems.js → Trust-DiJms7Bl.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-Do3VVnAy.js → UkeySign-rakR8eel.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-Dz7egVIA.js → VideoEditing-DAWZUM5o.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-Dcuw-OxR.js → Wallet-DqUPnl7K.js} +3 -3
  87. package/src/assets/web-panel/assets/{WebAuthn-DPlw-QsB.js → WebAuthn-BnVUwvMm.js} +3 -3
  88. package/src/assets/web-panel/assets/{WorkflowEditor-h4OsnU5q.js → WorkflowEditor-B1CAwxgs.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-eO9wEwrW.js → chat-k2-0Jzfy.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-34lSmOXw.js → colors-BAu8xBmW.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-CK4kEWJ4.js → compact-item-DMlqcdfI.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-E0A57xed.js → createContext-BU9kfiSw.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-DuGrUMAS.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-BD9ZMGAl.js → hasIn-2vacgdcl.js} +1 -1
  95. package/src/assets/web-panel/assets/{index--N0u6kTG.js → index-B-C-Ruft.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DzXjP44T.js → index-B7wDjYUd.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CZBaqe3d.js → index-BMq0frKK.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DrOalGut.js → index-BUX4W-2v.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CT1_eRL-.js → index-BZz2eB33.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DrsDA_md.js → index-BblNQlaA.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DP-UZAQN.js → index-BdfKoqsK.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DiT_REby.js → index-Bf8YofPE.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Cx3Jn1r0.js → index-Bn8tARil.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-B0rkHxKK.js → index-Bpe2CJd-.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-B_G_ElKO.js → index-BxctzdYQ.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-MIg5Z8qe.js → index-C24NoPpy.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BmNbU2Z6.js → index-C5C4kSi8.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BsGmo6v1.js → index-C6ICn9Y6.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CsrKJJcX.js → index-C8ldqZi6.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BbX_Dted.js → index-C9WsM29I.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Ch175NUw.js → index-CONPVaxw.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DONOUtlz.js → index-CPyYXKFB.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DFLE2qO9.js → index-CSvSf9px.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-o8pYehRq.js → index-CXmpR6N3.js} +3 -3
  115. package/src/assets/web-panel/assets/{index-Cz3unNfL.js → index-Chybe7Ge.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-yAGBu2E0.js → index-CyXmP3PW.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CuSau5ya.js → index-DCusBOqR.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DcE1BspQ.js → index-DH01oIaj.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DrSAAuJj.js → index-DHg3LMNP.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CZkFMeWL.js → index-DWLTSIka.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DvKcroix.js → index-DaUGdvtU.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Bjs90Eh9.js → index-DcA-tEQd.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DGRxt5wj.js → index-DfWvcu4p.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DCn-ECvK.js → index-DmZNnZz7.js} +1 -1
  125. package/src/assets/web-panel/assets/index-DvFfMAux.js +1 -0
  126. package/src/assets/web-panel/assets/{index-8qMA1DWQ.js → index-JsyGqKmD.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-D4bB_x_v.js → index-TtrpHmYx.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Brqc9Emx.js → index-Ygh0wmKz.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Da5fmOHB.js → index-dIYqw3f0.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DpfisY1g.js → index-hDHHJYno.js} +1 -1
  131. package/src/assets/web-panel/assets/index-n6p-1A77.js +1 -0
  132. package/src/assets/web-panel/assets/{index-DeXNCyQJ.js → index-oElehY4F.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DcbgVLOH.js → index-z4_YwZDW.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-DMTkAomF.js → initDefaultProps-B9OXWu2e.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-Cnti1F5g.js → motion-IQ47MCDQ.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-CGxmHUga.js → move-CLCU4kjV.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-CuwwLoq7.js → mtc-parser-CXnVlSPq.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-BpdlTkPM.js → omit-BJjLXB0f.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-D7nWrThp.js → pickAttrs-BHdtvdy6.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-Bhx0TV8F.js → placementArrow-oq8X_Bwc.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-CZ1KesZh.js → responsiveObserve-DTD02LAO.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-CnldF8J6.js → slide-DbEeq8to.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-CZfo_GOA.js → statusUtils-Do2fy1CJ.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-B2QCcAv5.js → styleChecker-CFWD63T-.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DzzjIS4J.js → useFlexGapSupport-BeozAWOo.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-B_atg9M0.js → useFs-0-rIgnBL.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-DhZs3QYN.js → usePersonalDataHub-CeiNoI31.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-DcePTYAm.js → vnode-Dj0ReRNg.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-BYmlnjRk.js → zoom-DD7MC4Dy.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-knowledge.js +40 -1
  155. package/src/commands/evolution.js +2 -0
  156. package/src/commands/governed-skill-marketplace.js +142 -0
  157. package/src/commands/marketplace.js +4 -1
  158. package/src/commands/serve.js +21 -0
  159. package/src/commands/skill.js +3 -0
  160. package/src/data/changelog.json +39 -0
  161. package/src/gateways/ws/ws-agent-handler.js +59 -2
  162. package/src/gateways/ws/ws-server.js +2 -0
  163. package/src/generated/cc-agent-protocol.schema.json +3 -1
  164. package/src/harness/golden-transcript.js +1 -0
  165. package/src/harness/prompt-compressor.js +51 -5
  166. package/src/harness/provider-backed-compaction.js +28 -1
  167. package/src/harness/remote-session-registry.js +15 -3
  168. package/src/index.js +20 -2
  169. package/src/lazy-dispatch.js +6 -0
  170. package/src/lib/advisor-runtime.js +55 -2
  171. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  172. package/src/lib/app-server/graph-runtime.js +32 -0
  173. package/src/lib/app-server/server.js +94 -1
  174. package/src/lib/app-server/websocket-transport.js +15 -0
  175. package/src/lib/autonomous-agent.js +63 -13
  176. package/src/lib/cowork/ab-comparator-cli.js +4 -3
  177. package/src/lib/cowork/debate-review-cli.js +4 -3
  178. package/src/lib/cowork/decision-kb-cli.js +5 -0
  179. package/src/lib/cowork-adapter.js +38 -16
  180. package/src/lib/evolution/agent-evolution-ingress.js +95 -15
  181. package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
  182. package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
  183. package/src/lib/evolution/agent-model-projection.js +437 -0
  184. package/src/lib/evolution/bounded-descriptor-read.js +29 -0
  185. package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
  186. package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
  187. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +32 -10
  188. package/src/lib/evolution/evidence-json-text.js +236 -0
  189. package/src/lib/evolution/evolution-artifact-ports.js +196 -21
  190. package/src/lib/evolution/evolution-deployment-loader.js +240 -2
  191. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
  192. package/src/lib/evolution/evolution-eval-gate.js +14 -1
  193. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
  194. package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
  195. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
  196. package/src/lib/evolution/evolution-evidence-projector.js +271 -37
  197. package/src/lib/evolution/evolution-file-witness.js +153 -30
  198. package/src/lib/evolution/evolution-ledger-ports.js +1219 -66
  199. package/src/lib/evolution/evolution-ledger.js +66 -2
  200. package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
  201. package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
  202. package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
  203. package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
  204. package/src/lib/evolution/evolution-release-train.js +54 -6
  205. package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
  206. package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
  207. package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
  208. package/src/lib/evolution/evolution-workbench-projection.js +134 -26
  209. package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
  210. package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
  211. package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
  212. package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
  213. package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
  214. package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
  215. package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
  216. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +48 -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-inventory.js +392 -0
  220. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +217 -82
  221. package/src/lib/evolution/governed-knowledge-quarantine-release.js +1013 -0
  222. package/src/lib/evolution/governed-knowledge-record.js +148 -0
  223. package/src/lib/evolution/governed-knowledge-revocation-host.js +59 -0
  224. package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
  225. package/src/lib/evolution/governed-knowledge-skill-rollback.js +510 -0
  226. package/src/lib/evolution/governed-knowledge-sync.js +181 -95
  227. package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +516 -0
  228. package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
  229. package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
  230. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
  231. package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
  232. package/src/lib/evolution/governed-skill-marketplace.js +288 -5
  233. package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
  234. package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
  235. package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
  236. package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
  237. package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
  238. package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
  239. package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
  240. package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
  241. package/src/lib/evolution/governed-wiki-pruning.js +322 -143
  242. package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
  243. package/src/lib/evolution/knowledge-wiki-source-admission.js +283 -0
  244. package/src/lib/evolution/knowledge-wiki-source-provenance.js +360 -0
  245. package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
  246. package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
  247. package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
  248. package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
  249. package/src/lib/evolution/skill-candidate-registry.js +43 -3
  250. package/src/lib/evolution/skill-promotion-controller.js +25 -0
  251. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
  252. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
  253. package/src/lib/evolution/skill-release-registry.js +168 -4
  254. package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
  255. package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
  256. package/src/lib/evolution/skill-revocation-propagation.js +467 -0
  257. package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
  258. package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
  259. package/src/lib/evolution/skill-writer-inventory-manifest.js +8 -6
  260. package/src/lib/evolution/statistical-progressive-canary.js +165 -3
  261. package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
  262. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
  263. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
  264. package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
  265. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +822 -101
  266. package/src/lib/evolution/wiki-revision-protocol.js +120 -0
  267. package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
  268. package/src/lib/evolution/wiki-target-tombstone-revision.js +109 -0
  269. package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
  270. package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
  271. package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
  272. package/src/lib/evolution/wikiskill-benchmark.js +80 -16
  273. package/src/lib/goal-assess.js +17 -10
  274. package/src/lib/interactive-planner.js +9 -1
  275. package/src/lib/iteration-budget.js +16 -2
  276. package/src/lib/micro-compact.js +4 -1
  277. package/src/lib/model-failure-policy.js +21 -0
  278. package/src/lib/process-execution-broker/index.js +1 -0
  279. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  280. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  281. package/src/lib/process-execution-broker/windows-sandbox.cs +33 -15
  282. package/src/lib/read-file-loop-guard.js +113 -0
  283. package/src/lib/read-file-page.js +191 -0
  284. package/src/lib/runnable-provider.js +2 -1
  285. package/src/lib/skill-retrieval-router.js +22 -1
  286. package/src/repl/agent-repl.js +133 -34
  287. package/src/runtime/agent-core.js +196 -74
  288. package/src/runtime/agent-runtime.js +43 -0
  289. package/src/runtime/coding-agent-contract-shared.cjs +7 -1
  290. package/src/runtime/fallback-model.js +143 -62
  291. package/src/runtime/headless-runner.js +54 -10
  292. package/src/runtime/headless-stream.js +50 -6
  293. package/src/runtime/runtime-factory.js +41 -2
  294. package/src/assets/web-panel/assets/ChatBubbleRenderer-Ds3pA-ET.js +0 -1
  295. package/src/assets/web-panel/assets/MarkdownRenderer-DqTx7_u1.js +0 -1
  296. package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +0 -1
  297. package/src/assets/web-panel/assets/index-C907rPwd.js +0 -1
  298. package/src/assets/web-panel/assets/index-wueRSK2d.js +0 -1
@@ -0,0 +1,208 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { isIP } from "node:net";
4
+ import { isGovernedSkillMarketplaceCliHost } from "./governed-skill-marketplace-cli-host.js";
5
+
6
+ const STYLE = `:root{color-scheme:light dark;font-family:system-ui,sans-serif;background:#f4f6fa;color:#152238}body{margin:0;padding:32px 16px}main{max-width:880px;margin:auto;background:#fff;padding:28px;border:1px solid #dde3ec;border-radius:16px}h1{margin:8px 0}.eyebrow{letter-spacing:.08em;color:#50627b}.status{display:inline-block;padding:6px 12px;border-radius:20px;background:#e8f5ec;color:#21623b}.revoked{background:#fdebec;color:#952a35}.score{font-size:32px;font-weight:650}.muted{color:#50627b}.notice{padding:14px;background:#f1f4fa;border-radius:8px}dl{display:grid;grid-template-columns:180px minmax(0,1fr);gap:12px;margin:24px 0}dt{font-weight:600}dd{margin:0;overflow-wrap:anywhere}code{font-size:.85em}a{color:#225caa}footer{margin-top:24px;font-size:.9em}@media(max-width:560px){main{padding:18px}dl{grid-template-columns:1fr;gap:6px}dd{margin-bottom:12px}}@media(prefers-color-scheme:dark){:root{background:#101722;color:#e1e8f2}main{background:#172231;border-color:#344154}.muted,.eyebrow{color:#afbed2}.notice{background:#233147}a{color:#96bfff}}`;
7
+ const CSP = `default-src 'none'; style-src 'sha256-${createHash("sha256").update(STYLE).digest("base64")}'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'`;
8
+
9
+ function escapeHtml(value) {
10
+ return String(value ?? "").replace(
11
+ /[&<>"']/g,
12
+ (character) =>
13
+ ({
14
+ "&": "&amp;",
15
+ "<": "&lt;",
16
+ ">": "&gt;",
17
+ '"': "&quot;",
18
+ "'": "&#39;",
19
+ })[character],
20
+ );
21
+ }
22
+
23
+ export function renderGovernedSkillMarketplaceBadge(badge) {
24
+ const rows = [
25
+ [
26
+ "目标模型 / OS / 工具 / runtime",
27
+ [
28
+ badge.target.model,
29
+ badge.target.os,
30
+ badge.target.tool,
31
+ badge.target.runtime,
32
+ ].join(" / "),
33
+ ],
34
+ ["来源模型", badge.sourceModel],
35
+ ["签名目录摘要", badge.manifestDigest],
36
+ ["目标评测凭证", badge.evalReceiptDigest],
37
+ ["Eval badge 摘要", badge.evalBadgeDigest],
38
+ ["来源 commit 摘要", badge.sourceCommitDigest],
39
+ [
40
+ "原始包 / 适配包",
41
+ `${badge.packageDigest} / ${badge.adaptedOutputDigest}`,
42
+ ],
43
+ ["SBOM 摘要", badge.sbomDigest],
44
+ ["依赖锁摘要", badge.dependencyLockDigest],
45
+ ["权限清单摘要", badge.permissionManifestDigest],
46
+ ["兼容矩阵摘要", badge.targetMatrixDigest],
47
+ ["发布时核验", badge.verifiedAt],
48
+ ["快照有效至", badge.expiresAt],
49
+ ["本次状态检查", badge.checkedAt],
50
+ ];
51
+ const status = badge.revoked ? "已撤销 · 不可用于安装" : "已核验的评测快照";
52
+ return `<!doctype html>
53
+ <html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${escapeHtml(badge.skillName)} · Skill 评测凭证</title><style>${STYLE}</style></head>
54
+ <body><main><p class="eyebrow">CHAINLESSCHAIN · EVAL BADGE</p><h1>${escapeHtml(badge.skillName)} <small>@ ${escapeHtml(badge.version)}</small></h1>
55
+ <p class="status${badge.revoked ? " revoked" : ""}">${status}</p><p><span class="score">${escapeHtml((badge.qualityScore * 100).toFixed(1))}%</span> 目标评分 · ${escapeHtml(badge.sampleCount)} 个样本</p>
56
+ <p class="notice">此页展示发布时的目标评测与适配核验结果。目录签名和已记录撤销在每次访问时重新检查;其他 authority 的后续撤销不由此快照证明。页面不代表已安装、已启用或新的运行授权。</p>
57
+ <dl>${rows.map(([label, value]) => `<dt>${escapeHtml(label)}</dt><dd><code>${escapeHtml(value)}</code></dd>`).join("\n")}</dl>
58
+ <p><a href="/badge.json">查看公开 JSON 投影</a></p><footer class="muted">仅公开必要元数据与证据摘要,不公开租户、候选内容、签名原文或私有回执。独立复核和复现需要发布者另行提供原始签名证据及可公开的评测材料。</footer></main></body></html>`;
59
+ }
60
+
61
+ function integer(value, label, min, max) {
62
+ if (!Number.isSafeInteger(value) || value < min || value > max)
63
+ throw new TypeError(`${label} is out of range`);
64
+ }
65
+
66
+ /** Publish one explicitly selected immutable listing; no browse or mutation API. */
67
+ export async function startGovernedSkillMarketplaceBadgeServer({
68
+ marketplaceHost,
69
+ skillName,
70
+ version,
71
+ manifestDigest,
72
+ listen = "127.0.0.1",
73
+ port = 8321,
74
+ snapshotTtlMs = 600_000,
75
+ requestTimeoutMs = 5_000,
76
+ maxConcurrentRequests = 4,
77
+ now = Date.now,
78
+ } = {}) {
79
+ if (!isGovernedSkillMarketplaceCliHost(marketplaceHost))
80
+ throw new TypeError("public badges require a branded marketplace host");
81
+ if (!isIP(listen))
82
+ throw new TypeError("badge listen address must be an IP literal");
83
+ integer(port, "badge port", 0, 65535);
84
+ integer(snapshotTtlMs, "badge snapshot TTL", 1_000, 3_600_000);
85
+ integer(requestTimeoutMs, "badge request timeout", 10, 30_000);
86
+ integer(maxConcurrentRequests, "badge concurrency", 1, 16);
87
+ if (typeof now !== "function") throw new TypeError("badge clock is required");
88
+ const timestamp = () => {
89
+ const value = now();
90
+ if (
91
+ !Number.isSafeInteger(value) ||
92
+ value < 0 ||
93
+ value > 8_640_000_000_000_000 - snapshotTtlMs
94
+ )
95
+ throw new Error("badge clock is invalid");
96
+ return value;
97
+ };
98
+ const reader = await marketplaceHost.preparePublicBadge({
99
+ skillName,
100
+ version,
101
+ manifestDigest,
102
+ });
103
+ await reader.read();
104
+ const verifiedAt = timestamp();
105
+ const expiresAt = verifiedAt + snapshotTtlMs;
106
+ let inFlight = 0;
107
+ const server = createServer({ maxHeaderSize: 8192 }, (request, response) => {
108
+ response.setHeader("Cache-Control", "no-store, max-age=0");
109
+ response.setHeader("Content-Security-Policy", CSP);
110
+ response.setHeader("X-Content-Type-Options", "nosniff");
111
+ response.setHeader("X-Frame-Options", "DENY");
112
+ response.setHeader("Referrer-Policy", "no-referrer");
113
+ const finish = (status, body, type = "text/plain; charset=utf-8") => {
114
+ if (response.writableEnded || response.destroyed) return;
115
+ response.statusCode = status;
116
+ response.setHeader("Content-Type", type);
117
+ response.end(request.method === "HEAD" ? undefined : body);
118
+ };
119
+ if (!["GET", "HEAD"].includes(request.method)) {
120
+ response.setHeader("Allow", "GET, HEAD");
121
+ response.setHeader("Connection", "close");
122
+ finish(405, "Read-only badge endpoint.");
123
+ return;
124
+ }
125
+ if (
126
+ request.headers["transfer-encoding"] ||
127
+ (request.headers["content-length"] &&
128
+ request.headers["content-length"] !== "0")
129
+ ) {
130
+ response.setHeader("Connection", "close");
131
+ finish(400, "Request bodies are not accepted.");
132
+ return;
133
+ }
134
+ if (request.url !== "/" && request.url !== "/badge.json") {
135
+ finish(404, "Badge endpoint not found.");
136
+ return;
137
+ }
138
+ if (inFlight >= maxConcurrentRequests) {
139
+ response.setHeader("Retry-After", "5");
140
+ finish(429, "Badge verification is busy.");
141
+ return;
142
+ }
143
+ inFlight += 1;
144
+ const timer = setTimeout(
145
+ () => finish(503, "Badge verification is unavailable."),
146
+ requestTimeoutMs,
147
+ );
148
+ Promise.resolve()
149
+ .then(async () => {
150
+ const before = timestamp();
151
+ if (before < verifiedAt || before >= expiresAt)
152
+ throw new Error("snapshot expired");
153
+ const current = await reader.read();
154
+ const checkedAt = timestamp();
155
+ if (checkedAt < before || checkedAt >= expiresAt)
156
+ throw new Error("snapshot expired");
157
+ const badge = {
158
+ ...current,
159
+ verifiedAt: new Date(verifiedAt).toISOString(),
160
+ expiresAt: new Date(expiresAt).toISOString(),
161
+ checkedAt: new Date(checkedAt).toISOString(),
162
+ };
163
+ if (request.url === "/badge.json")
164
+ finish(
165
+ 200,
166
+ `${JSON.stringify(badge, null, 2)}\n`,
167
+ "application/json; charset=utf-8",
168
+ );
169
+ else
170
+ finish(
171
+ 200,
172
+ renderGovernedSkillMarketplaceBadge(badge),
173
+ "text/html; charset=utf-8",
174
+ );
175
+ })
176
+ .catch(() => finish(503, "Badge verification is unavailable."))
177
+ .finally(() => {
178
+ clearTimeout(timer);
179
+ // A timed-out underlying verifier retains its slot until it settles.
180
+ inFlight -= 1;
181
+ });
182
+ });
183
+ server.maxConnections = 32;
184
+ server.maxRequestsPerSocket = 16;
185
+ server.headersTimeout = 5_000;
186
+ server.requestTimeout = 5_000;
187
+ server.keepAliveTimeout = 1_000;
188
+ await new Promise((resolve, reject) => {
189
+ server.once("error", reject);
190
+ server.listen(port, listen, () => {
191
+ server.removeListener("error", reject);
192
+ resolve();
193
+ });
194
+ });
195
+ const address = server.address();
196
+ const hostname =
197
+ isIP(address.address) === 6 ? `[${address.address}]` : address.address;
198
+ let closing;
199
+ return Object.freeze({
200
+ server,
201
+ url: `http://${hostname}:${address.port}/`,
202
+ close: () =>
203
+ (closing ??= new Promise((resolve, reject) => {
204
+ server.close((error) => (error ? reject(error) : resolve()));
205
+ server.closeAllConnections();
206
+ })),
207
+ });
208
+ }
@@ -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
+ }