chainlesschain 0.166.22 → 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 (291) hide show
  1. package/package.json +4 -3
  2. package/src/assets/web-panel/assets/{AIOps-oJ7USzMC.js → AIOps-DR-MWcZc.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BlgnZe_C.js → ActionButton-DT8B7sEb.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-D2rRbTLu.js → Analytics-asjh3dQJ.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-FwS3f0B2.js → AppLayout-DivQ491i.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-iF-_08Hi.js → Artifacts-DPH2uUmy.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-D24p0zQw.js → Audit-Bp2nLyc-.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-Cg3mRVi9.js → BackgroundAgents-CHS28khl.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-EOqht3H-.js → Backup-CKeaFSfz.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-9XWYq2hj.js → BaseInput-CxwM9BAH.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-Dq5yardA.js → Chat-DYLDwaCv.js} +4 -4
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Ds3pA-ET.js → ChatBubbleRenderer-DdBJDBP0.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-CuyCBoBf.js → Checkbox-uYTWOB8j.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DjWtYHNe.js → Codegen-CvYa_dwT.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-CrVr_iuG.js → Col-CanMAX4m.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-C6QxpfGc.js → Community-B4WaDtHw.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-B-v5r6Pa.js → Compact-K93Uof_3.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-zNiLiFgD.js → Compliance-CKeDLgUW.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-D9K7lMOu.js → Cowork-P93grAeB.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-DAjO36z4.js → Cron-BSHnMtDn.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-Bxqn0aqB.js → Crosschain-epAOpUVJ.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-DfRmLUe-.js → DID-ByjXfP7t.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-Cz8KF3fr.js → Dashboard-QztTU8tb.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-C4oVfkP0.js → Dropdown-DhUc9yhN.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-ivyZKN8k.js → EmailListRenderer-C2sLhJJN.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DoxY1CPW.js → FamilyGuardDashboard-CdfbWNDn.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-C93gZxnb.js → Federation-CcF_R7NW.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-D_lEjYJE.js → FormItemContext-Cm_X2IBk.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-BNFN9YjN.js → GenericCardRenderer-DUi4NWlb.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-mUu2HcLI.js → Git-4Sq5FjBt.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CNuosrge.js → Governance-Dx2_v4V6.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-DwY5pbCB.js → Inference-7Vr1xekR.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-aRUxhACD.js → KnowledgeGraph-Cnd2XOzf.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-DFfsWYy_.js → Logs-B66QPVf-.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-DqTx7_u1.js → MarkdownRenderer-PLsEvhly.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-COI-ciM-.js → Marketplace-BMIK9BmC.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-BJJwaIpe.js → McpTools-BDbyp3J_.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-CDO6SGDZ.js → Memory-CJdzfZGi.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BlZ5tFf4.js → MobileBridge-C2TH5Y3-.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-DuoxbgWz.js → MobileProjects-D1dYXkvV.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-6ec9j70b.js → Mtc-B-4A1I1j.js} +4 -4
  42. package/src/assets/web-panel/assets/{MtcAudit-BuL7HkC7.js → MtcAudit-Bgcc9UOl.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-CJxR85lk.js → Multisig-DqOe-etP.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-B71O1S4l.js → NLProgramming-7VnhzE_6.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-Bsw5zbpV.js → Notes-BxawpeUQ.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-BnAhXuK_.js → NotificationSettings-Cr08G2aE.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-BJ0R5GGz.js → OrderTableRenderer-Ce8bEGlK.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-B7wwNxoP.js → Organization-BC7lveGv.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-CfAGr0gM.js → Overflow-CakOW-G0.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-KhMg22Fz.js → P2P-Cf8CaOBZ.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-NdAXI9ft.js → PdhVaultBrowser-Dc7b98W9.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-CIYjqyT7.js → Permissions-DGJyMEfS.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-D2ht3P_R.js → PersonalDataHub-DNIwSdwu.js} +6 -6
  54. package/src/assets/web-panel/assets/{Pipeline-i6flZW1m.js → Pipeline-5B1S12wa.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-DE0lhYVc.js → Privacy-CMB6Ke5t.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-BL3YbyxS.js → ProjectInit-D5PqTFiT.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-CEtdg7ni.js → ProjectSettings-CbKNdSjV.js} +2 -2
  58. package/src/assets/web-panel/assets/Projects-ccXaHzYL.js +1 -0
  59. package/src/assets/web-panel/assets/{Providers-DKt_Cg-j.js → Providers-CJF5_-Gs.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-DA61jNSx.js → QrScannerModal-CT6iEAdi.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-fS9ryUmq.js → QuickAsk-Ci0h9mJ_.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-CR9dZU5Y.js → Recommend-Da5mobZu.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-BV0BR2Dz.js → RemoteSession-BaCY8eey.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-BIeGUvYD.js → Reputation-CaITfTsI.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-DHDT1aro.js → Row-DtUDamyP.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-Cq6YKb1h.js → RssFeed-DX27gFpg.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-DEF6vsy6.js → Search-DFL69osN.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CHtYiKY9.js → Security-BqGeoWv-.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-u16lvBJN.js → Services-3z1WnEAc.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-CGbizyDj.js → Skeleton-C_OJQQ9Z.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-BZMQcAa7.js → Skills-BY7aT6Mo.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-Bm-CycVi.js → Sla-BZv7DSaD.js} +1 -1
  73. package/src/assets/web-panel/assets/SpeechSettings-6lJKLhCn.js +1 -0
  74. package/src/assets/web-panel/assets/{SyncSettings-B8q1C1eC.js → SyncSettings-B6D7STlI.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-SU1pBWc-.js → Tasks-Co_FCZAO.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-CyOfJzmt.js → Templates-CnY-9fgz.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-xqWSm2GP.js → Tenant-B71yXfZ8.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-D1Ttgjsi.js → Terminal-Dd_P7awo.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-Da2lYs5D.js → TimelineRenderer-CvIEMyli.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-B34-SduO.js → Tokens-DknFBGOi.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-C8zyYm4R.js → Trigger-D_4nJONB.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-D1Pvqems.js → Trust-BNl21fa7.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-Do3VVnAy.js → UkeySign-CFrCI7uK.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-Dz7egVIA.js → VideoEditing-BVfY6JLg.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-Dcuw-OxR.js → Wallet-Cj9CAK0J.js} +3 -3
  86. package/src/assets/web-panel/assets/{WebAuthn-DPlw-QsB.js → WebAuthn-DcqZlzA3.js} +3 -3
  87. package/src/assets/web-panel/assets/{WorkflowEditor-h4OsnU5q.js → WorkflowEditor-Dfr_dMld.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-eO9wEwrW.js → chat-Yv6UF0AD.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-34lSmOXw.js → colors-CDW_-1fs.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-CK4kEWJ4.js → compact-item-BYOQvd-6.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-E0A57xed.js → createContext-BCGO0BiP.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-H-kXSuf-.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-BD9ZMGAl.js → hasIn-DY-70cfQ.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-B_G_ElKO.js → index-366wfQBU.js} +1 -1
  95. package/src/assets/web-panel/assets/index-B0o4MeNK.js +1 -0
  96. package/src/assets/web-panel/assets/{index-B0rkHxKK.js → index-B9ZogJJM.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DrsDA_md.js → index-B9m5QAMg.js} +1 -1
  98. package/src/assets/web-panel/assets/{index--N0u6kTG.js → index-BBs2mv5M.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DiT_REby.js → index-BFv1hzF6.js} +1 -1
  100. package/src/assets/web-panel/assets/index-BVafOL_I.js +1 -0
  101. package/src/assets/web-panel/assets/{index-8qMA1DWQ.js → index-BXlEx4UH.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CsrKJJcX.js → index-BayRTE5w.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DcbgVLOH.js → index-Bb9nyts1.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CZkFMeWL.js → index-Bf_Va0S-.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Cz3unNfL.js → index-Br3wQLVY.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DcE1BspQ.js → index-BvK4fjkk.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DeXNCyQJ.js → index-C40UdtlS.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DrOalGut.js → index-C4UJA2ju.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-MIg5Z8qe.js → index-CB_Iw73G.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DFLE2qO9.js → index-CCwWp3mT.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DrSAAuJj.js → index-CFa2fPCk.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D4bB_x_v.js → index-CIyHxV4u.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BmNbU2Z6.js → index-CUP-A2_h.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-o8pYehRq.js → index-CUo27q9J.js} +3 -3
  115. package/src/assets/web-panel/assets/{index-BbX_Dted.js → index-CaT8trvf.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Brqc9Emx.js → index-CnZNbcux.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Da5fmOHB.js → index-Cy2NE6AO.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-yAGBu2E0.js → index-CzeEEazr.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BsGmo6v1.js → index-D--TEyDj.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DvKcroix.js → index-DCtsjhhT.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DGRxt5wj.js → index-DLOf7BSz.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DONOUtlz.js → index-DM5c4pc-.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CT1_eRL-.js → index-DRFC2Qt0.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DpfisY1g.js → index-DT_qVaaV.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Cx3Jn1r0.js → index-DUDoRk9r.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DCn-ECvK.js → index-Dg-AQYDf.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-Bjs90Eh9.js → index-DuIPq5MX.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CuSau5ya.js → index-NYVBUAVN.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DP-UZAQN.js → index-NaCESahy.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Ch175NUw.js → index-RjIMPG0u.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DzXjP44T.js → index-Y9akzgFO.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CZBaqe3d.js → index-hZ0Eyrrw.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-DMTkAomF.js → initDefaultProps-CG99CcR4.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-Cnti1F5g.js → motion-Z7MH0_0G.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-CGxmHUga.js → move-BX67lOdq.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-CuwwLoq7.js → mtc-parser-CmAbG1fE.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-BpdlTkPM.js → omit-DiU5tI1_.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-D7nWrThp.js → pickAttrs-BGfvLrYL.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-Bhx0TV8F.js → placementArrow-CggLEgaJ.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-CZ1KesZh.js → responsiveObserve-t3nlghPZ.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-CnldF8J6.js → slide-BkV4dL9s.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-CZfo_GOA.js → statusUtils-qec1PUoC.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-B2QCcAv5.js → styleChecker-ChjX6T8D.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-DzzjIS4J.js → useFlexGapSupport-B1jLoZcM.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-B_atg9M0.js → useFs-C3X53s4E.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-DhZs3QYN.js → usePersonalDataHub-DOvbbnkZ.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-DcePTYAm.js → vnode-Ie0TEVFT.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-BYmlnjRk.js → zoom-CRUMVS8l.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +3 -3
  151. package/src/commands/agent.js +18 -1
  152. package/src/commands/evolution-benchmark.js +72 -0
  153. package/src/commands/evolution.js +2 -0
  154. package/src/commands/governed-skill-marketplace.js +142 -0
  155. package/src/commands/marketplace.js +4 -1
  156. package/src/commands/serve.js +10 -0
  157. package/src/commands/skill.js +3 -0
  158. package/src/data/changelog.json +26 -0
  159. package/src/gateways/ws/ws-agent-handler.js +59 -2
  160. package/src/gateways/ws/ws-server.js +2 -0
  161. package/src/harness/golden-transcript.js +1 -0
  162. package/src/harness/prompt-compressor.js +51 -5
  163. package/src/harness/provider-backed-compaction.js +28 -1
  164. package/src/harness/remote-session-registry.js +15 -3
  165. package/src/index.js +20 -2
  166. package/src/lazy-dispatch.js +6 -0
  167. package/src/lib/advisor-runtime.js +55 -2
  168. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  169. package/src/lib/app-server/graph-runtime.js +32 -0
  170. package/src/lib/app-server/server.js +45 -1
  171. package/src/lib/app-server/websocket-transport.js +2 -0
  172. package/src/lib/autonomous-agent.js +63 -13
  173. package/src/lib/cowork/ab-comparator-cli.js +4 -3
  174. package/src/lib/cowork/debate-review-cli.js +4 -3
  175. package/src/lib/cowork/decision-kb-cli.js +5 -0
  176. package/src/lib/cowork-adapter.js +38 -16
  177. package/src/lib/evolution/agent-evolution-ingress.js +95 -15
  178. package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
  179. package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
  180. package/src/lib/evolution/agent-model-projection.js +217 -0
  181. package/src/lib/evolution/bounded-descriptor-read.js +29 -0
  182. package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
  183. package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
  184. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +10 -1
  185. package/src/lib/evolution/evidence-json-text.js +236 -0
  186. package/src/lib/evolution/evolution-artifact-ports.js +193 -21
  187. package/src/lib/evolution/evolution-deployment-loader.js +163 -2
  188. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
  189. package/src/lib/evolution/evolution-eval-gate.js +14 -1
  190. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
  191. package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
  192. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
  193. package/src/lib/evolution/evolution-evidence-projector.js +240 -37
  194. package/src/lib/evolution/evolution-file-witness.js +153 -30
  195. package/src/lib/evolution/evolution-ledger-ports.js +1027 -66
  196. package/src/lib/evolution/evolution-ledger.js +66 -2
  197. package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
  198. package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
  199. package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
  200. package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
  201. package/src/lib/evolution/evolution-release-train.js +54 -6
  202. package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
  203. package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
  204. package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
  205. package/src/lib/evolution/evolution-workbench-projection.js +134 -26
  206. package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
  207. package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
  208. package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
  209. package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
  210. package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
  211. package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
  212. package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
  213. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +48 -0
  214. package/src/lib/evolution/governed-knowledge-candidate-rejection.js +343 -0
  215. package/src/lib/evolution/governed-knowledge-dependency-authority.js +227 -44
  216. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +95 -83
  217. package/src/lib/evolution/governed-knowledge-record.js +148 -0
  218. package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
  219. package/src/lib/evolution/governed-knowledge-skill-rollback.js +475 -0
  220. package/src/lib/evolution/governed-knowledge-sync.js +17 -94
  221. package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +462 -0
  222. package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
  223. package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
  224. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
  225. package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
  226. package/src/lib/evolution/governed-skill-marketplace.js +288 -5
  227. package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
  228. package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
  229. package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
  230. package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
  231. package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
  232. package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
  233. package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
  234. package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
  235. package/src/lib/evolution/governed-wiki-pruning.js +322 -143
  236. package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
  237. package/src/lib/evolution/knowledge-wiki-source-admission.js +124 -0
  238. package/src/lib/evolution/knowledge-wiki-source-provenance.js +359 -0
  239. package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
  240. package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
  241. package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
  242. package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
  243. package/src/lib/evolution/skill-candidate-registry.js +22 -0
  244. package/src/lib/evolution/skill-promotion-controller.js +25 -0
  245. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
  246. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
  247. package/src/lib/evolution/skill-release-registry.js +25 -4
  248. package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
  249. package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
  250. package/src/lib/evolution/skill-revocation-propagation.js +467 -0
  251. package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
  252. package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
  253. package/src/lib/evolution/skill-writer-inventory-manifest.js +8 -6
  254. package/src/lib/evolution/statistical-progressive-canary.js +165 -3
  255. package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
  256. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
  257. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
  258. package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
  259. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +760 -100
  260. package/src/lib/evolution/wiki-revision-protocol.js +120 -0
  261. package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
  262. package/src/lib/evolution/wiki-target-tombstone-revision.js +101 -0
  263. package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
  264. package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
  265. package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
  266. package/src/lib/evolution/wikiskill-benchmark.js +80 -16
  267. package/src/lib/goal-assess.js +17 -10
  268. package/src/lib/interactive-planner.js +9 -1
  269. package/src/lib/iteration-budget.js +16 -2
  270. package/src/lib/micro-compact.js +4 -1
  271. package/src/lib/model-failure-policy.js +21 -0
  272. package/src/lib/process-execution-broker/index.js +1 -0
  273. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  274. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  275. package/src/lib/process-execution-broker/windows-sandbox.cs +33 -15
  276. package/src/lib/read-file-page.js +191 -0
  277. package/src/lib/runnable-provider.js +2 -1
  278. package/src/lib/skill-retrieval-router.js +22 -1
  279. package/src/repl/agent-repl.js +127 -33
  280. package/src/runtime/agent-core.js +163 -73
  281. package/src/runtime/agent-runtime.js +43 -0
  282. package/src/runtime/coding-agent-contract-shared.cjs +7 -1
  283. package/src/runtime/fallback-model.js +143 -62
  284. package/src/runtime/headless-runner.js +54 -10
  285. package/src/runtime/headless-stream.js +50 -6
  286. package/src/runtime/runtime-factory.js +41 -2
  287. package/src/assets/web-panel/assets/Projects-CvtU5peJ.js +0 -1
  288. package/src/assets/web-panel/assets/SpeechSettings-BudpA5kr.js +0 -1
  289. package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +0 -1
  290. package/src/assets/web-panel/assets/index-C907rPwd.js +0 -1
  291. package/src/assets/web-panel/assets/index-wueRSK2d.js +0 -1
@@ -1,7 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
 
3
3
  export const WIKISKILL_BENCHMARK_PLAN_SCHEMA =
4
- "chainlesschain.wikiskill-benchmark-plan/v1";
4
+ "chainlesschain.wikiskill-benchmark-plan/v2";
5
5
  export const WIKISKILL_BENCHMARK_REPORT_SCHEMA =
6
6
  "chainlesschain.wikiskill-benchmark-report/v1";
7
7
  export const WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA =
@@ -102,6 +102,7 @@ export function createWikiSkillBenchmarkPlan(input = {}) {
102
102
  [
103
103
  "gitCommit",
104
104
  "runnerDigest",
105
+ "executionManifestDigest",
105
106
  "model",
106
107
  "inference",
107
108
  "environment",
@@ -150,6 +151,10 @@ export function createWikiSkillBenchmarkPlan(input = {}) {
150
151
  schema: WIKISKILL_BENCHMARK_PLAN_SCHEMA,
151
152
  gitCommit,
152
153
  runnerDigest: sha(input.runnerDigest, "runnerDigest"),
154
+ executionManifestDigest: sha(
155
+ input.executionManifestDigest,
156
+ "executionManifestDigest",
157
+ ),
153
158
  model: Object.freeze({
154
159
  checkpoint: string(input.model.checkpoint, "model checkpoint"),
155
160
  digest: sha(input.model.digest, "model digest"),
@@ -178,6 +183,57 @@ export function createWikiSkillBenchmarkPlan(input = {}) {
178
183
  });
179
184
  }
180
185
 
186
+ export function verifyWikiSkillBenchmarkPlan(plan) {
187
+ exactKeys(
188
+ plan,
189
+ [
190
+ "schema",
191
+ "gitCommit",
192
+ "runnerDigest",
193
+ "executionManifestDigest",
194
+ "model",
195
+ "inference",
196
+ "environment",
197
+ "datasets",
198
+ "toolDigest",
199
+ "apiDigest",
200
+ "promptDigest",
201
+ "skillDigest",
202
+ "wikiDigest",
203
+ "seedSchedule",
204
+ "bootstrapSamples",
205
+ "planDigest",
206
+ ],
207
+ "benchmark plan",
208
+ );
209
+ if (plan.schema !== WIKISKILL_BENCHMARK_PLAN_SCHEMA)
210
+ throw new TypeError("benchmark plan schema is invalid");
211
+ const recreated = createWikiSkillBenchmarkPlan({
212
+ gitCommit: plan.gitCommit,
213
+ runnerDigest: plan.runnerDigest,
214
+ executionManifestDigest: plan.executionManifestDigest,
215
+ model: plan.model,
216
+ inference: plan.inference,
217
+ environment: plan.environment,
218
+ datasets: plan.datasets.map(({ id, version, digest: value, splitIds }) => ({
219
+ id,
220
+ version,
221
+ digest: value,
222
+ splitIds,
223
+ })),
224
+ toolDigest: plan.toolDigest,
225
+ apiDigest: plan.apiDigest,
226
+ promptDigest: plan.promptDigest,
227
+ skillDigest: plan.skillDigest,
228
+ wikiDigest: plan.wikiDigest,
229
+ seedSchedule: plan.seedSchedule,
230
+ bootstrapSamples: plan.bootstrapSamples,
231
+ });
232
+ if (canonical(recreated) !== canonical(plan))
233
+ throw new Error("benchmark plan digest mismatch");
234
+ return recreated;
235
+ }
236
+
181
237
  function normalizeArm(arm, name) {
182
238
  exactKeys(
183
239
  arm,
@@ -232,20 +288,12 @@ function mean(values) {
232
288
  }
233
289
 
234
290
  export function buildWikiSkillBenchmarkReport({ plan, runs } = {}) {
235
- if (
236
- !plan ||
237
- plan.schema !== WIKISKILL_BENCHMARK_PLAN_SCHEMA ||
238
- !DIGEST.test(plan.planDigest ?? "")
239
- )
240
- throw new TypeError("a canonical benchmark plan is required");
241
- const expectedPlanDigest = digest(
242
- WIKISKILL_BENCHMARK_PLAN_SCHEMA,
243
- Object.fromEntries(
244
- Object.entries(plan).filter(([key]) => key !== "planDigest"),
245
- ),
246
- );
247
- if (expectedPlanDigest !== plan.planDigest)
248
- throw new Error("benchmark plan digest mismatch");
291
+ try {
292
+ plan = verifyWikiSkillBenchmarkPlan(plan);
293
+ } catch (cause) {
294
+ if (cause?.message === "benchmark plan digest mismatch") throw cause;
295
+ throw new TypeError("a canonical benchmark plan is required", { cause });
296
+ }
249
297
  if (!Array.isArray(runs) || runs.length !== plan.seedSchedule.length)
250
298
  throw new TypeError("runs must exactly cover the seed schedule");
251
299
  const expectedCases = new Map(
@@ -383,7 +431,23 @@ export function buildWikiSkillBenchmarkReport({ plan, runs } = {}) {
383
431
  });
384
432
  }
385
433
 
386
- export async function executeWikiSkillBenchmark({ plan, runner } = {}) {
434
+ export function verifyWikiSkillBenchmarkReport({ plan, report } = {}) {
435
+ const verifiedPlan = verifyWikiSkillBenchmarkPlan(plan);
436
+ if (!report || report.schema !== WIKISKILL_BENCHMARK_REPORT_SCHEMA)
437
+ throw new TypeError("a canonical benchmark report is required");
438
+ const recreated = buildWikiSkillBenchmarkReport({
439
+ plan: verifiedPlan,
440
+ runs: report.runs,
441
+ });
442
+ if (canonical(recreated) !== canonical(report))
443
+ throw new Error("benchmark report digest mismatch");
444
+ return recreated;
445
+ }
446
+
447
+ export async function executeWikiSkillBenchmarkProtocolFixture({
448
+ plan,
449
+ runner,
450
+ } = {}) {
387
451
  if (
388
452
  !plan ||
389
453
  plan.schema !== WIKISKILL_BENCHMARK_PLAN_SCHEMA ||
@@ -62,15 +62,17 @@ export function buildAssessPrompt(goal, transcript = {}) {
62
62
  `RUN RESULT:\n${finalText || "(no final text)"}`,
63
63
  "",
64
64
  "Reply with ONLY a JSON object (no prose, no code fence) of this shape:",
65
- "{",
66
- ' "advanced": true|false, // did this run move the goal forward?',
67
- ' "progress": <0-100 or null>, // your estimate of new overall progress, or null to leave unchanged',
68
- ' "keyResults": [ // updates for specific key results (omit if none)',
69
- ' {"id": "<kr-id>", "current": <number or null>, "done": true|false}',
70
- " ],",
71
- ' "note": "<one short sentence summarizing what changed>",',
72
- ' "concerns": ["<short concern>", ...] // anything blocking/at-risk (omit if none)',
73
- "}",
65
+ JSON.stringify({
66
+ advanced: false,
67
+ progress: null,
68
+ keyResults: [{ id: "<kr-id>", current: null, done: false }],
69
+ note: "<one short sentence summarizing what changed>",
70
+ concerns: [],
71
+ }),
72
+ "Set advanced to true only if this run moved the goal forward; otherwise false.",
73
+ "Set progress to an estimated number from 0 to 100, or null to leave it unchanged.",
74
+ "Each keyResults entry uses a real key-result id, a numeric current value or null, and a boolean done. Omit keyResults if there are no updates.",
75
+ "Include short strings in concerns for blocking or at-risk items; omit concerns if there are none.",
74
76
  ].join("\n");
75
77
  }
76
78
 
@@ -218,7 +220,12 @@ export async function assessGoalProgress({
218
220
  let reply;
219
221
  try {
220
222
  reply = await chat(prompt);
221
- } catch {
223
+ } catch (error) {
224
+ if (
225
+ error?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED" ||
226
+ error?.runtimeLedgerPersistence === true
227
+ )
228
+ throw error;
222
229
  return { assessment: null, goal };
223
230
  }
224
231
  const assessment = parseAssessment(reply);
@@ -96,6 +96,11 @@ export class CLIInteractivePlanner extends EventEmitter {
96
96
  };
97
97
  } catch (err) {
98
98
  session.status = PlanSessionStatus.FAILED;
99
+ if (
100
+ err?.runtimeLedgerPersistence === true ||
101
+ err?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED"
102
+ )
103
+ throw err;
99
104
  return {
100
105
  sessionId,
101
106
  status: session.status,
@@ -345,7 +350,10 @@ Keep plans concise (3-8 steps). Use appropriate tools for each step.`;
345
350
  { role: "user", content: prompt },
346
351
  ]);
347
352
 
348
- const content = response?.message?.content || response?.content || "";
353
+ const content =
354
+ typeof response === "string"
355
+ ? response
356
+ : response?.message?.content || response?.content || "";
349
357
  const jsonText = firstBalancedJson(content, "{");
350
358
  if (!jsonText) {
351
359
  throw new Error("Failed to parse plan from LLM response");
@@ -45,13 +45,24 @@ export class IterationBudget {
45
45
  * Resolve the budget limit from config/env/default.
46
46
  * Priority: CC_ITERATION_BUDGET env > default
47
47
  */
48
- static resolveLimit() {
48
+ static resolveLimit(fallback = DEFAULT_BUDGET) {
49
49
  const env = process.env.CC_ITERATION_BUDGET;
50
50
  if (env) {
51
51
  const parsed = parseInt(env, 10);
52
52
  if (!isNaN(parsed) && parsed > 0) return parsed;
53
53
  }
54
- return DEFAULT_BUDGET;
54
+ return fallback;
55
+ }
56
+
57
+ /** Interactive work can continue until completion; explicit caps still win. */
58
+ static forRun({ maxTurns, continuous = false } = {}) {
59
+ return new IterationBudget({
60
+ limit: Number.isFinite(maxTurns)
61
+ ? maxTurns === 0
62
+ ? Infinity
63
+ : Math.max(1, Math.floor(maxTurns))
64
+ : IterationBudget.resolveLimit(continuous ? Infinity : DEFAULT_BUDGET),
65
+ });
55
66
  }
56
67
 
57
68
  /** Total iteration limit. */
@@ -141,6 +152,9 @@ export class IterationBudget {
141
152
  * @returns {string}
142
153
  */
143
154
  toSummary() {
155
+ if (!Number.isFinite(this._limit)) {
156
+ return `Iteration budget: ${this._consumed} iterations used (no turn limit).`;
157
+ }
144
158
  const pct = Math.round(this.percentage() * 100);
145
159
  return (
146
160
  `Iteration budget: ${this._consumed}/${this._limit} (${pct}%). ` +
@@ -9,6 +9,8 @@
9
9
  * Pure → unit-testable.
10
10
  */
11
11
 
12
+ import { compactReadFileResult } from "./read-file-page.js";
13
+
12
14
  const DEFAULT_KEEP_RECENT = 6; // last N messages kept verbatim
13
15
  const DEFAULT_MAX_TOOL_CHARS = 400; // trim older tool results longer than this
14
16
 
@@ -44,7 +46,8 @@ export function microCompact(messages, opts = {}) {
44
46
  ? fullMarker
45
47
  : "…[trimmed]".slice(0, maxChars);
46
48
  const head = content.slice(0, Math.max(0, maxChars - marker.length));
47
- const compactedContent = `${head}${marker}`;
49
+ const compactedContent =
50
+ compactReadFileResult(content, maxChars) || `${head}${marker}`;
48
51
  trimmed += 1;
49
52
  saved += content.length - compactedContent.length;
50
53
  return {
@@ -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
@@ -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 });