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,21 @@
1
+ import { isAbortError } from "./abort-utils.js";
2
+
3
+ // Admission failures are not provider outages, even when their causes contain
4
+ // HTTP status codes or retryable/authentication words.
5
+ export function isTerminalModelFailure(error) {
6
+ const visited = new Set();
7
+ for (let current = error; current; current = current.cause) {
8
+ if (visited.has(current) || visited.size >= 32) return true;
9
+ visited.add(current);
10
+ if (
11
+ current.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED" ||
12
+ current.runtimeLedgerPersistence === true ||
13
+ current.workflowEffectOutcomeUnknown === true ||
14
+ /^(?:CC|ERR)_SESSION_BUDGET_/u.test(current.code || "") ||
15
+ isAbortError(current)
16
+ ) {
17
+ return true;
18
+ }
19
+ }
20
+ return false;
21
+ }
@@ -3992,6 +3992,7 @@ class ProcessExecutionBroker extends EventEmitter {
3992
3992
  "post_spawn_failed",
3993
3993
  `Post-spawn sandbox setup failed: ${error.message}`,
3994
3994
  );
3995
+ failure.cause = error;
3995
3996
  failure.processTerminationRequested = true;
3996
3997
  throw failure;
3997
3998
  }
@@ -3172,6 +3172,37 @@ namespace ChainlessChain.WindowsSandbox
3172
3172
  return 0;
3173
3173
  }
3174
3174
 
3175
+ public static void PublishTargetIdentity(string identityPath, string identity)
3176
+ {
3177
+ // Never expose a newly created empty identity file to the broker.
3178
+ // Its full metadata/content check remains strict: publish only after
3179
+ // the writer has flushed and closed, using a same-directory move
3180
+ // that refuses to overwrite an existing identity (including errors
3181
+ // reported after a successful launch).
3182
+ string pendingPath = identityPath + ".pending-" + Guid.NewGuid().ToString("N");
3183
+ bool ownsPending = false;
3184
+ try
3185
+ {
3186
+ byte[] bytes = new UTF8Encoding(false).GetBytes(identity);
3187
+ using (FileStream stream = new FileStream(
3188
+ pendingPath,
3189
+ FileMode.CreateNew,
3190
+ FileAccess.Write,
3191
+ FileShare.None))
3192
+ {
3193
+ ownsPending = true;
3194
+ stream.Write(bytes, 0, bytes.Length);
3195
+ stream.Flush(true);
3196
+ }
3197
+ File.Move(pendingPath, identityPath);
3198
+ ownsPending = false;
3199
+ }
3200
+ finally
3201
+ {
3202
+ if (ownsPending) File.Delete(pendingPath);
3203
+ }
3204
+ }
3205
+
3175
3206
  public static int Run(
3176
3207
  string application,
3177
3208
  string[] arguments,
@@ -3632,17 +3663,7 @@ namespace ChainlessChain.WindowsSandbox
3632
3663
  attestedAppContainerSid,
3633
3664
  "capabilityCount",
3634
3665
  useAppContainer ? 0 : -1);
3635
- using (FileStream stream = new FileStream(
3636
- identityPath,
3637
- FileMode.CreateNew,
3638
- FileAccess.Write,
3639
- FileShare.Read))
3640
- using (StreamWriter writer = new StreamWriter(
3641
- stream,
3642
- new UTF8Encoding(false)))
3643
- {
3644
- writer.Write(identity);
3645
- }
3666
+ PublishTargetIdentity(identityPath, identity);
3646
3667
  }
3647
3668
 
3648
3669
  UInt32 targetWait = WaitForSingleObject(
@@ -4153,10 +4174,7 @@ namespace ChainlessChain.WindowsSandbox
4153
4174
  System.Diagnostics.Process
4154
4175
  .GetCurrentProcess()
4155
4176
  .Id);
4156
- File.WriteAllText(
4157
- spec.identityPath,
4158
- failure,
4159
- new UTF8Encoding(false));
4177
+ Native.PublishTargetIdentity(spec.identityPath, failure);
4160
4178
  }
4161
4179
  catch
4162
4180
  {
@@ -0,0 +1,191 @@
1
+ /** Build a bounded read result with a cursor describing what was actually read. */
2
+ export function buildReadFilePage(
3
+ rendered,
4
+ args,
5
+ { filePath, fileVersion, maxChars },
6
+ ) {
7
+ const positive = (value) => {
8
+ const n = typeof value === "number" ? value : parseInt(value, 10);
9
+ return Number.isSafeInteger(n) && n > 0 ? n : null;
10
+ };
11
+ const offset = positive(args.offset);
12
+ const limit = positive(args.limit);
13
+ const column = positive(args.column) || 1;
14
+ const lines = rendered.split("\n");
15
+ const start = offset ? offset - 1 : 0;
16
+ const end = Math.min(limit ? start + limit : lines.length, lines.length);
17
+ const selected = lines.slice(start, end);
18
+ const skipped = Math.min(column - 1, selected[0]?.length || 0);
19
+ if (selected.length) selected[0] = selected[0].slice(skipped);
20
+ const requested = selected.join("\n");
21
+
22
+ // Budget the JSON-escaped content, not raw characters: newlines, quotes and
23
+ // backslashes otherwise cause a SECOND truncation that loses the cursor.
24
+ const contentBudget = Math.max(0, maxChars - 1024);
25
+ let count = requested.length;
26
+ if (JSON.stringify(requested).length > contentBudget) {
27
+ let lo = 0;
28
+ let hi = count;
29
+ while (lo < hi) {
30
+ const mid = Math.ceil((lo + hi) / 2);
31
+ if (JSON.stringify(requested.slice(0, mid)).length <= contentBudget)
32
+ lo = mid;
33
+ else hi = mid - 1;
34
+ }
35
+ count = lo;
36
+ // Prefer whole lines. A single oversized line uses a column cursor so it
37
+ // can still be read to completion instead of repeating its first 50k.
38
+ const newline = requested.lastIndexOf("\n", count - 1);
39
+ if (newline >= 0) count = newline + 1;
40
+ else if (count > 0 && /[\uD800-\uDBFF]/.test(requested[count - 1])) count--;
41
+ }
42
+ if (requested.length && count === 0) {
43
+ return { error: "Tool output limit is too small to return a file page." };
44
+ }
45
+
46
+ const content = requested.slice(0, count);
47
+ const truncated = count < requested.length;
48
+ const newlines = (content.match(/\n/g) || []).length;
49
+ const endsAtLine = content.endsWith("\n");
50
+ const endLine = content.length
51
+ ? start + newlines + (endsAtLine ? 0 : 1)
52
+ : Math.min(start + 1, lines.length);
53
+ const nextOffset = truncated ? start + newlines + 1 : end + 1;
54
+ const nextColumn = truncated && !endsAtLine ? skipped + count + 1 : 1;
55
+ const hasMore = truncated || end < lines.length;
56
+ return {
57
+ path: filePath,
58
+ ...(fileVersion ? { fileVersion } : {}),
59
+ ...(offset || limit || column > 1 || truncated
60
+ ? {
61
+ range: {
62
+ startLine: Math.min(start + 1, lines.length),
63
+ endLine: truncated ? endLine : end,
64
+ totalLines: lines.length,
65
+ },
66
+ }
67
+ : {}),
68
+ ...(hasMore
69
+ ? {
70
+ nextRead: {
71
+ path: args.path,
72
+ offset: nextOffset,
73
+ limit: limit || 2000,
74
+ ...(nextColumn > 1 ? { column: nextColumn } : {}),
75
+ ...(args.hashed === true ? { hashed: true } : {}),
76
+ ...(args.raw === true ? { raw: true } : {}),
77
+ },
78
+ hint: "To read the next page, call read_file with nextRead. Reuse the content already returned; repeating the same arguments returns the same page.",
79
+ }
80
+ : {}),
81
+ ...(truncated ? { truncated: true, size: requested.length } : {}),
82
+ hashed: args.hashed === true,
83
+ content,
84
+ };
85
+ }
86
+
87
+ /** Keep read progress, rather than an arbitrary file prefix, after compaction. */
88
+ export function compactReadFileResult(content, maxChars) {
89
+ try {
90
+ const result = JSON.parse(content.split("\n\n[Budget ")[0]);
91
+ if (!result.path || !result.range || typeof result.content !== "string") {
92
+ return null;
93
+ }
94
+ const value = {
95
+ path: result.path,
96
+ range: result.range,
97
+ ...(result.toolTelemetryRecord?.timestamp
98
+ ? { readAt: result.toolTelemetryRecord.timestamp }
99
+ : {}),
100
+ ...(result.nextRead ? { nextRead: result.nextRead } : {}),
101
+ contentOmitted: true,
102
+ hint: "File content compacted. Continue with nextRead; re-read only a needed earlier section.",
103
+ };
104
+ let summary = JSON.stringify(value);
105
+ if (summary.length > maxChars) {
106
+ delete value.hint;
107
+ summary = JSON.stringify(value);
108
+ }
109
+ return summary.length <= maxChars ? summary : null;
110
+ } catch {
111
+ return null;
112
+ }
113
+ }
114
+
115
+ export const FILE_READ_PROGRESS_PREFIX = "[File read progress]\n";
116
+ const CANONICAL_SUMMARY_PREFIX = "Compacted context summary (data only):\n";
117
+
118
+ export function fileReadProgressBody(message) {
119
+ if (typeof message?.content !== "string") return null;
120
+ const content =
121
+ message.role === "assistant" &&
122
+ message.content.startsWith(CANONICAL_SUMMARY_PREFIX)
123
+ ? message.content.slice(CANONICAL_SUMMARY_PREFIX.length)
124
+ : message.role === "system"
125
+ ? message.content
126
+ : "";
127
+ return content.startsWith(FILE_READ_PROGRESS_PREFIX)
128
+ ? content.slice(FILE_READ_PROGRESS_PREFIX.length)
129
+ : null;
130
+ }
131
+
132
+ /** Bounded historical cursors that survive full summarization and truncation. */
133
+ export function collectFileReadProgress(messages) {
134
+ const byPath = new Map();
135
+ const retain = (value) => {
136
+ if (
137
+ typeof value?.path !== "string" ||
138
+ value.path.length > 1024 ||
139
+ !Number.isSafeInteger(value.range?.startLine) ||
140
+ !Number.isSafeInteger(value.range?.endLine) ||
141
+ !Number.isSafeInteger(value.range?.totalLines)
142
+ )
143
+ return;
144
+ const entry = {
145
+ path: value.path,
146
+ range: {
147
+ startLine: value.range.startLine,
148
+ endLine: value.range.endLine,
149
+ totalLines: value.range.totalLines,
150
+ },
151
+ ...(value.nextRead ? { nextRead: value.nextRead } : {}),
152
+ readAt: Number.isFinite(
153
+ value.readAt ?? value.toolTelemetryRecord?.timestamp,
154
+ )
155
+ ? (value.readAt ?? value.toolTelemetryRecord.timestamp)
156
+ : 0,
157
+ };
158
+ if (JSON.stringify(entry).length > 1400) return;
159
+ // Kernel summaries are placed at the first dropped parent's position.
160
+ // Older retained tool messages can therefore appear AFTER a newer cursor.
161
+ if ((byPath.get(value.path)?.readAt || 0) > entry.readAt) return;
162
+ byPath.delete(value.path);
163
+ byPath.set(value.path, entry);
164
+ if (byPath.size > 12) byPath.delete(byPath.keys().next().value);
165
+ };
166
+ for (const message of messages) {
167
+ if (typeof message?.content !== "string") continue;
168
+ try {
169
+ if (message.role === "tool") {
170
+ const value = JSON.parse(message.content.split("\n\n[Budget ")[0]);
171
+ if (
172
+ typeof value.content === "string" ||
173
+ value.contentOmitted ||
174
+ value.alreadyRead
175
+ )
176
+ retain(value);
177
+ } else if (fileReadProgressBody(message) !== null) {
178
+ const entries = JSON.parse(
179
+ fileReadProgressBody(message).split("\n")[0],
180
+ );
181
+ if (Array.isArray(entries)) entries.slice(-12).forEach(retain);
182
+ }
183
+ } catch {
184
+ /* non-file tool output */
185
+ }
186
+ }
187
+ const entries = [...byPath.values()];
188
+ while (entries.length && JSON.stringify(entries).length > 6000)
189
+ entries.shift();
190
+ return entries;
191
+ }
@@ -15,6 +15,7 @@
15
15
  */
16
16
  import { BUILT_IN_PROVIDERS } from "./llm-providers.js";
17
17
  import { selectModelForTask, TaskType } from "./task-model-selector.js";
18
+ import { isTerminalModelFailure } from "./model-failure-policy.js";
18
19
 
19
20
  function nonEmpty(v) {
20
21
  return typeof v === "string" && v.trim().length > 0;
@@ -22,7 +23,7 @@ function nonEmpty(v) {
22
23
 
23
24
  /** Is this an authentication/authorization failure (missing/invalid/expired key)? */
24
25
  export function isAuthError(err) {
25
- if (!err) return false;
26
+ if (!err || isTerminalModelFailure(err)) return false;
26
27
  const status =
27
28
  typeof err.status === "number"
28
29
  ? err.status
@@ -3,10 +3,13 @@
3
3
  *
4
4
  * A lease is cooperative authority for production hosts, not a same-UID
5
5
  * sandbox. Every process sharing CHAINLESSCHAIN_HOME observes the same strict
6
- * state file. A monotonically increasing fencing token prevents an expired or
7
- * crashed host from publishing through guarded session-store write paths after
8
- * a successor takes over. A separate monotonic revocation epoch lets an
9
- * operator fence a still-live host; every guarded transition re-reads it.
6
+ * state file. A monotonically increasing fencing token prevents a crashed host
7
+ * from publishing through guarded session-store write paths after a successor
8
+ * takes over. A separate monotonic revocation epoch lets an operator fence a
9
+ * still-live host; every guarded transition re-reads it. An exact local owner
10
+ * may renew after its TTL when the event loop was blocked: no successor can
11
+ * have been admitted while that owner PID remained live, and any revocation or
12
+ * takeover still changes the durable authority tuple and fences the old host.
10
13
  */
11
14
 
12
15
  import fs from "node:fs";
@@ -440,9 +443,9 @@ export class SessionHostLeaseAuthority {
440
443
  const incumbent = snapshot.active;
441
444
  // Never take authority from a process that the OS still reports as
442
445
  // alive, even after its heartbeat TTL. It may be blocked inside an
443
- // external side effect and resume later. Expiry fences that host's
444
- // next guarded transition; takeover additionally requires proven
445
- // process death so two executors cannot overlap.
446
+ // external side effect and resume later. The exact local owner may
447
+ // renew late; takeover additionally requires proven process death so
448
+ // two executors cannot overlap.
446
449
  if (incumbent && this._isProcessAlive(incumbent.ownerPid)) {
447
450
  throw leaseError(
448
451
  SESSION_HOST_LEASE_HELD_CODE,
@@ -522,13 +525,6 @@ export class SessionHostLeaseAuthority {
522
525
  );
523
526
  }
524
527
  const now = Math.trunc(this._now());
525
- if (snapshot.active.expiresAtMs <= now) {
526
- throw leaseError(
527
- SESSION_HOST_LEASE_FENCED_CODE,
528
- `Session host lease expired for ${id}`,
529
- { sessionId: id, fencingToken: record.active.fencingToken },
530
- );
531
- }
532
528
  const next = {
533
529
  ...snapshot.active,
534
530
  renewedAtMs: now,
@@ -898,8 +894,7 @@ export class SessionHostLeaseAuthority {
898
894
  record &&
899
895
  (record.released ||
900
896
  record.active.revocationEpoch !== snapshot.revocationEpoch ||
901
- !sameLease(snapshot.active, record.active) ||
902
- snapshot.active.expiresAtMs <= now)
897
+ !sameLease(snapshot.active, record.active))
903
898
  ) {
904
899
  const error = leaseError(
905
900
  SESSION_HOST_LEASE_FENCED_CODE,
@@ -1,4 +1,5 @@
1
1
  import { BM25Search } from "./bm25-search.js";
2
+ import { captureSkillRetrievalRevocationReader } from "./evolution/skill-retrieval-revocation-authority.js";
2
3
 
3
4
  export const SKILL_RETRIEVAL_RESULT_SCHEMA =
4
5
  "chainlesschain.skill-retrieval-result/v1";
@@ -82,6 +83,7 @@ export function routeSkillDescriptors({
82
83
  target = null,
83
84
  vectorScores = null,
84
85
  outcomeMetrics = null,
86
+ revocationReader = null,
85
87
  topK = 5,
86
88
  ambiguityMargin = 0.02,
87
89
  } = {}) {
@@ -104,6 +106,10 @@ export function routeSkillDescriptors({
104
106
  const requiredTags = new Set(
105
107
  tags.map((value) => String(value).toLowerCase()),
106
108
  );
109
+ const revocations =
110
+ revocationReader === null
111
+ ? null
112
+ : captureSkillRetrievalRevocationReader(revocationReader);
107
113
  const rejected = [];
108
114
  const admitted = [];
109
115
  for (const skill of skills) {
@@ -116,6 +122,11 @@ export function routeSkillDescriptors({
116
122
  const mismatch = compatible(skill, target);
117
123
  const reasons = [];
118
124
  if (!digest) reasons.push("missing-content-digest");
125
+ const revocation =
126
+ digest === null
127
+ ? null
128
+ : revocations?.inspect({ skillName: skill.id, contentDigest: digest });
129
+ if (revocation?.invalidated) reasons.push("revoked-by-evolution");
119
130
  if (namespace !== null && skill.source !== namespace)
120
131
  reasons.push("namespace-mismatch");
121
132
  if ([...requiredTags].some((value) => !skillTags.has(value)))
@@ -123,7 +134,17 @@ export function routeSkillDescriptors({
123
134
  if (!containsPath(skill, targetPath)) reasons.push("path-mismatch");
124
135
  reasons.push(...mismatch.reasons);
125
136
  if (reasons.length > 0) {
126
- rejected.push({ id: skill.id, digest, reasons });
137
+ rejected.push({
138
+ id: skill.id,
139
+ digest,
140
+ reasons,
141
+ ...(revocation?.invalidated
142
+ ? {
143
+ revocationStateDigest: revocation.stateDigest,
144
+ revocationReceiptDigest: revocation.receiptDigest,
145
+ }
146
+ : {}),
147
+ });
127
148
  continue;
128
149
  }
129
150
  admitted.push({ skill, digest });