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,462 @@
1
+ import { types } from "node:util";
2
+ import { captureWikiRevisionReader } from "./wiki-maintainer-ledger-adapter.js";
3
+ import { captureSkillReleaseOperationReader } from "./evolution-ledger-ports.js";
4
+ import { governedKnowledgeSourceRef } from "./governed-knowledge-skill-rollback.js";
5
+ import { deriveWikiTargetTombstoneRevision } from "./wiki-target-tombstone-revision.js";
6
+ import {
7
+ createGovernedKnowledgeDependencyAuthority,
8
+ GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
9
+ digestGovernedKnowledgeDependencyResult,
10
+ } from "./governed-knowledge-dependency-authority.js";
11
+ import {
12
+ capturePruningData as captureData,
13
+ pruningCanonical as canonical,
14
+ pruningDigest as digest,
15
+ } from "./governed-wiki-pruning-journal.js";
16
+
17
+ const SCHEMA = "chainlesschain.knowledge-wiki-tombstone/v1";
18
+ const HEAD_KEYS = [
19
+ "epoch",
20
+ "ledgerId",
21
+ "identityDigest",
22
+ "sequence",
23
+ "headDigest",
24
+ ];
25
+ const RULES = Object.freeze({
26
+ schema: SCHEMA,
27
+ batchSize: 128,
28
+ source: "exact-Knowledge-URI-and-content-digest",
29
+ effect: "target-only-tombstone",
30
+ unrelatedFacts: "preserve-verbatim",
31
+ minCorroboratingSources: 2,
32
+ decayHalfLifeDays: 30,
33
+ staleConfidenceFloor: 0.2,
34
+ });
35
+ const RULES_DIGEST = digest(SCHEMA, RULES);
36
+ const MULTIHOP_SCHEMA = "chainlesschain.knowledge-wiki-tombstone/v2";
37
+ const MULTIHOP_RULES_DIGEST = digest(MULTIHOP_SCHEMA, {
38
+ ...RULES,
39
+ schema: MULTIHOP_SCHEMA,
40
+ source: "authenticated-pinned-Wiki-exact-Knowledge-ancestry",
41
+ });
42
+ function fail(message) {
43
+ throw new Error(`Knowledge Wiki tombstone: ${message}`);
44
+ }
45
+ const same = (left, right) => canonical(left) === canonical(right);
46
+ function matchHead(checkpoint, head) {
47
+ return HEAD_KEYS.every((key) => checkpoint[key] === head[key]);
48
+ }
49
+ function bind(wikiAdapter, transactionLedger, tenantId) {
50
+ const wiki = captureWikiRevisionReader(wikiAdapter);
51
+ if (wiki.descriptor.tenantId !== tenantId)
52
+ throw new TypeError("Knowledge Wiki tenant differs");
53
+ const operations = captureSkillReleaseOperationReader(transactionLedger);
54
+ if (!operations.matchesWikiAdapter(wikiAdapter))
55
+ throw new TypeError(
56
+ "Wiki disposition requires the same genuine ledger, not matching caller-supplied head metadata",
57
+ );
58
+ return Object.freeze({ wiki, operations });
59
+ }
60
+ function partsFor(source, request, provenance) {
61
+ const sourceRef = governedKnowledgeSourceRef(request);
62
+ const refs = new Set(
63
+ Object.values(source.state.evidence)
64
+ .filter(
65
+ (entry) =>
66
+ (entry.ref === sourceRef || entry.artifactRef === sourceRef) &&
67
+ entry.sourceDigest === request.contentDigest,
68
+ )
69
+ .map((entry) => entry.ref),
70
+ );
71
+ const directIds = Object.values(source.state.patterns)
72
+ .filter((pattern) => {
73
+ const evidence = [
74
+ ...pattern.positiveEvidence,
75
+ ...pattern.negativeEvidence,
76
+ ];
77
+ if (evidence.some((ref) => !source.state.evidence[ref]))
78
+ fail("pattern has unresolved source evidence");
79
+ return evidence.some((ref) => refs.has(ref));
80
+ })
81
+ .map((pattern) => pattern.patternId)
82
+ .sort();
83
+ const targetIds = provenance.affectedPatternIds;
84
+ const operations = targetIds.map((patternId) => ({
85
+ type: "tombstone",
86
+ patternId,
87
+ reason: "governed-knowledge-revocation",
88
+ }));
89
+ if (!operations.length)
90
+ fail("Wiki source does not identify the revoked Knowledge");
91
+ // Existing direct-only preparations retain their exact v1 batch identity and
92
+ // deterministic revision bytes. Newly discovered ancestry gets a distinct
93
+ // v2 contract, pinned to the original revision rather than today's head.
94
+ const sourceProofDigest = same(directIds, targetIds)
95
+ ? null
96
+ : digest(`${MULTIHOP_SCHEMA}/source`, {
97
+ revisionId: provenance.revisionId,
98
+ stateDigest: provenance.stateDigest,
99
+ checkpoint: provenance.checkpoint,
100
+ affectedPatternIds: targetIds,
101
+ });
102
+ const count = Math.ceil(operations.length / RULES.batchSize);
103
+ if (count > 128)
104
+ fail("Wiki disposition exceeds the authenticated history bound");
105
+ return Array.from({ length: count }, (_, index) => {
106
+ const batch = operations.slice(
107
+ index * RULES.batchSize,
108
+ (index + 1) * RULES.batchSize,
109
+ );
110
+ return {
111
+ operations: batch,
112
+ ...(sourceProofDigest ? { sourceProofDigest } : {}),
113
+ requestDigest: digest(
114
+ `${sourceProofDigest ? MULTIHOP_SCHEMA : SCHEMA}/batch`,
115
+ {
116
+ requestDigest: request.requestDigest,
117
+ index,
118
+ count,
119
+ operations: batch,
120
+ ...(sourceProofDigest ? { sourceProofDigest } : {}),
121
+ },
122
+ ),
123
+ };
124
+ });
125
+ }
126
+ function derive(reader, source, part, fence) {
127
+ return deriveWikiTargetTombstoneRevision({
128
+ source,
129
+ operations: part.operations,
130
+ requestDigest: part.requestDigest,
131
+ effectiveAt: fence.evidence.timestamp,
132
+ descriptor: {
133
+ tenantId: reader.wiki.descriptor.tenantId,
134
+ evolutionRunId: reader.wiki.descriptor.evolutionRunId,
135
+ maintainerModel: part.sourceProofDigest
136
+ ? "deterministic:knowledge-wiki-tombstone/v2"
137
+ : "deterministic:knowledge-wiki-tombstone/v1",
138
+ rulesDigest: part.sourceProofDigest
139
+ ? MULTIHOP_RULES_DIGEST
140
+ : RULES_DIGEST,
141
+ minCorroboratingSources: RULES.minCorroboratingSources,
142
+ decayHalfLifeDays: RULES.decayHalfLifeDays,
143
+ staleConfidenceFloor: RULES.staleConfidenceFloor,
144
+ },
145
+ });
146
+ }
147
+ async function prove(reader, request, context, original) {
148
+ if (
149
+ request.dependency.kind !== "wiki" ||
150
+ request.dependency.disposition !== "tombstone"
151
+ )
152
+ fail("only an exact wiki / tombstone dependency is supported");
153
+ const admission = reader.operations.resolveKnowledgeRevocation({
154
+ tenantId: request.tenantId,
155
+ operationDigest: request.operationDigest,
156
+ context,
157
+ });
158
+ const fence = admission.fence;
159
+ if (!fence || fence.record.deviceId !== request.deviceId)
160
+ fail("missing exact prepared revocation");
161
+ const knowledge = fence.record.knowledge;
162
+ for (const key of [
163
+ "tenantId",
164
+ "knowledgeId",
165
+ "action",
166
+ "contentDigest",
167
+ "revocationReceiptDigest",
168
+ ])
169
+ if (knowledge[key] !== request[key])
170
+ fail("prepared Knowledge binding differs");
171
+ if (!knowledge.dependencies.some((entry) => same(entry, request.dependency)))
172
+ fail("Wiki dependency is not in the prepared operation");
173
+ // The dependency digest binds the original complete Wiki STATE, not just a
174
+ // pattern ID, caller-selected evidence subset or latest mutable Wiki label.
175
+ if (
176
+ !matchHead(context.checkpoint, original.ledgerHead) ||
177
+ original.checkpoint.sequence >= fence.sequence
178
+ )
179
+ fail("Wiki source must precede preparation on this same current ledger");
180
+ const provenance = reader.wiki.readKnowledgeProvenance({
181
+ tenantId: request.tenantId,
182
+ revisionId: original.revisionId,
183
+ knowledgeId: request.knowledgeId,
184
+ contentDigest: request.contentDigest,
185
+ });
186
+ if (
187
+ provenance.stateDigest !== original.stateDigest ||
188
+ !same(provenance.checkpoint, original.checkpoint) ||
189
+ !matchHead(context.checkpoint, provenance.ledgerHead)
190
+ )
191
+ fail("Wiki ancestry does not bind the original state and current ledger");
192
+ const parts = partsFor(original, request, provenance);
193
+ const history = reader.wiki.resolveHistory({
194
+ tenantId: request.tenantId,
195
+ stateDigest: request.dependency.digest,
196
+ allowedMaintenanceRequestDigests: parts.map((part) => part.requestDigest),
197
+ });
198
+ if (
199
+ !matchHead(context.checkpoint, history.ledgerHead) ||
200
+ history.successors.length > parts.length
201
+ )
202
+ fail("Wiki disposition history differs from its current authorization");
203
+ let source = history.source;
204
+ for (const [index, entry] of history.successors.entries()) {
205
+ if (entry.predecessorHead.sequence < fence.sequence)
206
+ fail("Wiki effect predates its prepared Knowledge authorization");
207
+ const expected = await derive(reader, source, parts[index], fence);
208
+ if (!same(expected, entry.revision))
209
+ fail("Wiki successor does not match the exact target-only tombstones");
210
+ source = {
211
+ trusted: true,
212
+ state: expected.state,
213
+ stateDigest: expected.stateDigest,
214
+ };
215
+ }
216
+ if (
217
+ !same(source, history.current) ||
218
+ !same(reader.operations.currentContext(), context)
219
+ )
220
+ fail("Wiki or ledger changed during effect verification");
221
+ return Object.freeze({
222
+ fence,
223
+ parts,
224
+ history,
225
+ current: source,
226
+ complete: history.successors.length === parts.length,
227
+ checkpoint: context.checkpoint,
228
+ });
229
+ }
230
+
231
+ export function createGovernedKnowledgeWikiTombstoneAuthority({
232
+ tenantId,
233
+ deviceId,
234
+ wikiLedgerAdapter,
235
+ transactionLedger,
236
+ verifierWikiLedgerAdapter,
237
+ verifierTransactionLedger,
238
+ providerDescriptor,
239
+ verifierDescriptor,
240
+ additionalWikiTargets = [],
241
+ } = {}) {
242
+ if (
243
+ wikiLedgerAdapter === verifierWikiLedgerAdapter ||
244
+ transactionLedger === verifierTransactionLedger
245
+ )
246
+ throw new TypeError(
247
+ "Wiki disposition requires independent genuine readers",
248
+ );
249
+ if (
250
+ types.isProxy(additionalWikiTargets) ||
251
+ !Array.isArray(additionalWikiTargets) ||
252
+ Object.getPrototypeOf(additionalWikiTargets) !== Array.prototype ||
253
+ additionalWikiTargets.length > 63 ||
254
+ Reflect.ownKeys(additionalWikiTargets).length !==
255
+ additionalWikiTargets.length + 1
256
+ )
257
+ throw new TypeError(
258
+ "Wiki disposition targets must be a bounded dense array",
259
+ );
260
+ const targets = [{ wikiLedgerAdapter, verifierWikiLedgerAdapter }];
261
+ for (let index = 0; index < additionalWikiTargets.length; index += 1) {
262
+ const property = Object.getOwnPropertyDescriptor(
263
+ additionalWikiTargets,
264
+ String(index),
265
+ );
266
+ const target = property?.value;
267
+ if (
268
+ !target ||
269
+ types.isProxy(target) ||
270
+ ![Object.prototype, null].includes(Object.getPrototypeOf(target)) ||
271
+ Reflect.ownKeys(target).length !== 2
272
+ )
273
+ throw new TypeError(
274
+ "Wiki disposition target must contain two fixed readers",
275
+ );
276
+ const left = Object.getOwnPropertyDescriptor(target, "wikiLedgerAdapter");
277
+ const right = Object.getOwnPropertyDescriptor(
278
+ target,
279
+ "verifierWikiLedgerAdapter",
280
+ );
281
+ if (!left || !right || !("value" in left) || !("value" in right))
282
+ throw new TypeError("Wiki disposition target must not use accessors");
283
+ targets.push({
284
+ wikiLedgerAdapter: left.value,
285
+ verifierWikiLedgerAdapter: right.value,
286
+ });
287
+ }
288
+ const runs = new Set();
289
+ const bindings = targets.map((target) => {
290
+ if (target.wikiLedgerAdapter === target.verifierWikiLedgerAdapter)
291
+ throw new TypeError(
292
+ "Wiki disposition requires independent genuine readers",
293
+ );
294
+ const provider = bind(
295
+ target.wikiLedgerAdapter,
296
+ transactionLedger,
297
+ tenantId,
298
+ );
299
+ const verifier = bind(
300
+ target.verifierWikiLedgerAdapter,
301
+ verifierTransactionLedger,
302
+ tenantId,
303
+ );
304
+ if (!same(provider.wiki.descriptor, verifier.wiki.descriptor))
305
+ throw new TypeError("Wiki disposition reader scopes differ");
306
+ const run = provider.wiki.descriptor.evolutionRunId;
307
+ if (runs.has(run))
308
+ throw new TypeError(
309
+ "Wiki disposition runs must be unique, not duplicate",
310
+ );
311
+ runs.add(run);
312
+ return Object.freeze({
313
+ provider,
314
+ verifier,
315
+ commit: target.wikiLedgerAdapter.commitRevision,
316
+ });
317
+ });
318
+ const { provider, verifier } = bindings[0];
319
+ const left = provider.operations.currentContext().checkpoint;
320
+ const right = verifier.operations.currentContext().checkpoint;
321
+ if (
322
+ ["epoch", "ledgerId", "identityDigest"].some(
323
+ (key) => left[key] !== right[key],
324
+ )
325
+ )
326
+ throw new TypeError("Wiki disposition readers belong to different ledgers");
327
+ const providerIdentity = captureData(providerDescriptor);
328
+ const verifierIdentity = captureData(verifierDescriptor);
329
+ async function proofPair(request) {
330
+ const context = provider.operations.currentContext();
331
+ if (!same(context, verifier.operations.currentContext()))
332
+ fail("independent ledger heads differ");
333
+ let selected = null;
334
+ for (const binding of bindings) {
335
+ const query = {
336
+ tenantId: request.tenantId,
337
+ stateDigest: request.dependency.digest,
338
+ };
339
+ const original = binding.provider.wiki.findStateRevision(query);
340
+ const independentOriginal =
341
+ binding.verifier.wiki.findStateRevision(query);
342
+ if (!same(original, independentOriginal))
343
+ fail("independent Wiki target lookup differs");
344
+ if (original) {
345
+ if (selected)
346
+ fail("Wiki target resolves to more than one configured run");
347
+ selected = { binding, original, independentOriginal };
348
+ }
349
+ }
350
+ if (!selected)
351
+ fail("Wiki target is absent from the configured authenticated runs");
352
+ const primary = await prove(
353
+ selected.binding.provider,
354
+ request,
355
+ context,
356
+ selected.original,
357
+ );
358
+ const independent = await prove(
359
+ selected.binding.verifier,
360
+ request,
361
+ context,
362
+ selected.independentOriginal,
363
+ );
364
+ if (!same(primary, independent))
365
+ fail("independent Wiki effect proof differs");
366
+ return { proof: primary, binding: selected.binding };
367
+ }
368
+ function resultFor(request, proof) {
369
+ const core = {
370
+ schema: GOVERNED_KNOWLEDGE_DEPENDENCY_RESULT_SCHEMA,
371
+ tenantId,
372
+ deviceId,
373
+ operationId: request.operationId,
374
+ requestDigest: request.requestDigest,
375
+ knowledgeId: request.knowledgeId,
376
+ revocationReceiptDigest: request.revocationReceiptDigest,
377
+ dependencyKind: request.dependency.kind,
378
+ dependencyDigest: request.dependency.digest,
379
+ dependencyDisposition: request.dependency.disposition,
380
+ authorityId: providerIdentity.authorityId,
381
+ authorityRevision: providerIdentity.revision,
382
+ handlerArtifactDigest: providerIdentity.handlerArtifactDigest,
383
+ applied: true,
384
+ durable: true,
385
+ idempotent: true,
386
+ appliedAt: proof.fence.evidence.timestamp,
387
+ };
388
+ const { algorithm, keyId, value } = proof.fence.evidence.signature;
389
+ return captureData({
390
+ ...core,
391
+ resultDigest: digestGovernedKnowledgeDependencyResult(core),
392
+ attestation: { algorithm, keyId, value },
393
+ });
394
+ }
395
+ return createGovernedKnowledgeDependencyAuthority({
396
+ tenantId,
397
+ deviceId,
398
+ providerDescriptor: providerIdentity,
399
+ verifierDescriptor: verifierIdentity,
400
+ provider: Object.freeze({
401
+ async apply(request) {
402
+ let { proof, binding } = await proofPair(request);
403
+ while (!proof.complete) {
404
+ const done = proof.history.successors.length;
405
+ const revision = await derive(
406
+ binding.provider,
407
+ proof.current,
408
+ proof.parts[done],
409
+ proof.fence,
410
+ );
411
+ let commitError = null;
412
+ try {
413
+ binding.commit({
414
+ expectedStateDigest: proof.current.stateDigest,
415
+ expectedLedgerHead: proof.checkpoint,
416
+ revision,
417
+ });
418
+ } catch (error) {
419
+ commitError = error;
420
+ }
421
+ // Lost acknowledgements are resolved from independently replayed
422
+ // actual history, never from a provider's success flag.
423
+ const next = (await proofPair(request)).proof;
424
+ if (next.history.successors.length !== done + 1) {
425
+ if (commitError) throw commitError;
426
+ fail("Wiki commit did not durably advance the authorized sequence");
427
+ }
428
+ proof = next;
429
+ }
430
+ return resultFor(request, proof);
431
+ },
432
+ }),
433
+ verifier: Object.freeze({
434
+ async verify({ request, result }) {
435
+ const { proof } = await proofPair(request);
436
+ if (!proof.complete || !same(result, resultFor(request, proof)))
437
+ fail(
438
+ "Wiki disposition is not completely and independently confirmed",
439
+ );
440
+ return captureData({
441
+ authenticated: true,
442
+ durable: true,
443
+ tenantId,
444
+ deviceId,
445
+ operationId: request.operationId,
446
+ requestDigest: request.requestDigest,
447
+ resultDigest: result.resultDigest,
448
+ providerAuthorityId: providerIdentity.authorityId,
449
+ providerRevision: providerIdentity.revision,
450
+ verifierAuthorityId: verifierIdentity.authorityId,
451
+ verifierRevision: verifierIdentity.revision,
452
+ verificationReceiptDigest: digest(`${SCHEMA}/verification`, {
453
+ requestDigest: request.requestDigest,
454
+ resultDigest: result.resultDigest,
455
+ proof,
456
+ verifierIdentity,
457
+ }),
458
+ });
459
+ },
460
+ }),
461
+ });
462
+ }
@@ -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
+ }