chainlesschain 0.166.43 → 0.166.45

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 (202) hide show
  1. package/README.md +75 -14
  2. package/package.json +3 -3
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-BIl-Z62M.js → AIOps-CrMhYNeH.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-BgPi_Te6.js → ActionButton-DLY5blZ3.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-CaNIzlAG.js → Analytics-C0NhKQB0.js} +2 -2
  7. package/src/assets/web-panel/assets/{AppLayout-D9GSx2hl.js → AppLayout-DLyepgMq.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-Kq7kotzv.js → Artifacts-Depk01Sa.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-e1RTJLco.js → Audit-jKe6NQ3J.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BfyNT0BW.js → BackgroundAgents-CG4GKT9s.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-BEAq7i6S.js → Backup-DYWCkzwM.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-BHuP82DF.js → BaseInput-xm5vodmJ.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-BLPgCQsB.js → Chat-B20_PNd3.js} +5 -5
  14. package/src/assets/web-panel/assets/ChatBubbleRenderer-D4d-eh0F.js +1 -0
  15. package/src/assets/web-panel/assets/{Checkbox-DDJrOqEh.js → Checkbox-CfgwkV_r.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-CxyKcM6S.js → Codegen-DbnoWI44.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-BYFh9rE1.js → Col-CfzzhgGw.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-D8JPppoh.js → Community-BU7mGM8p.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-B5VGSqZe.js → Compact-DpYim0an.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-C7KiFcUK.js → Compliance-BNJcO6ra.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-D-F2fgA_.js → Cowork-CecZ-pWj.js} +2 -2
  22. package/src/assets/web-panel/assets/{Cron-B6TmPqRO.js → Cron-BG_C1fe3.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-BeGcBXhk.js → Crosschain-BAeILQLL.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-9QklLcmQ.js → DID-CYqOEkXi.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-DIadmsuS.js → Dashboard-BYU8wmL1.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-0I5gks3i.js → Dropdown-DYlJeTTa.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-BdTAjT2q.js → EmailListRenderer-C0M6py3K.js} +1 -1
  28. package/src/assets/web-panel/assets/EvolutionSettings-_QnjPFZJ.js +1 -0
  29. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DQUQWwUY.js → FamilyGuardDashboard-Du90iDch.js} +1 -1
  30. package/src/assets/web-panel/assets/{Federation-Drgi--Zn.js → Federation-DkFp_hzB.js} +1 -1
  31. package/src/assets/web-panel/assets/{FormItemContext-BOf-9P8n.js → FormItemContext-BGgtGTfG.js} +1 -1
  32. package/src/assets/web-panel/assets/{GenericCardRenderer-CBBnIDaW.js → GenericCardRenderer-BIDsSCei.js} +1 -1
  33. package/src/assets/web-panel/assets/{Git-BKimGd5P.js → Git--d3Te93J.js} +2 -2
  34. package/src/assets/web-panel/assets/{Governance-DoXCXppu.js → Governance-CZwD0vmO.js} +1 -1
  35. package/src/assets/web-panel/assets/{Inference-DzOhGhOE.js → Inference-DiDcSFEW.js} +1 -1
  36. package/src/assets/web-panel/assets/{KnowledgeGraph-DawgmU58.js → KnowledgeGraph-Bi0hSfzg.js} +1 -1
  37. package/src/assets/web-panel/assets/{Logs-Co3EJL2Y.js → Logs-C8NHSc0K.js} +2 -2
  38. package/src/assets/web-panel/assets/{MarkdownRenderer-VUfiDRZN.js → MarkdownRenderer-DfDuADqF.js} +1 -1
  39. package/src/assets/web-panel/assets/{Marketplace-BqpMHnMW.js → Marketplace-D6kD0bNf.js} +1 -1
  40. package/src/assets/web-panel/assets/{McpTools-C7ZSokcR.js → McpTools-mTSamCr5.js} +2 -2
  41. package/src/assets/web-panel/assets/{Memory-DuJrpeDx.js → Memory-YQBXfLjU.js} +2 -2
  42. package/src/assets/web-panel/assets/{MobileBridge-CaM744NU.js → MobileBridge-D2awuupp.js} +1 -1
  43. package/src/assets/web-panel/assets/MobileProjects-Bl7lZc_-.js +1 -0
  44. package/src/assets/web-panel/assets/{Mtc-5oUB7lPh.js → Mtc-CBqjLK2Q.js} +5 -5
  45. package/src/assets/web-panel/assets/{MtcAudit-D9DNF6DB.js → MtcAudit-C4poRInZ.js} +2 -2
  46. package/src/assets/web-panel/assets/{Multisig-CfMpFQSr.js → Multisig-C_J0zXYZ.js} +3 -3
  47. package/src/assets/web-panel/assets/{NLProgramming-CuhPZQ7q.js → NLProgramming-Ci43sWOU.js} +1 -1
  48. package/src/assets/web-panel/assets/{Notes-NtSeMoyM.js → Notes-DN7A-GFZ.js} +3 -3
  49. package/src/assets/web-panel/assets/{NotificationSettings-CB4e7V83.js → NotificationSettings-D5jNm71V.js} +1 -1
  50. package/src/assets/web-panel/assets/OrderTableRenderer-C9UsPOG8.js +1 -0
  51. package/src/assets/web-panel/assets/{Organization-K_0bjm7y.js → Organization-BapYMJrP.js} +2 -2
  52. package/src/assets/web-panel/assets/{Overflow-D2vwxiPv.js → Overflow-BwxwjhFw.js} +1 -1
  53. package/src/assets/web-panel/assets/{P2P-WQMHBu8q.js → P2P-TObXXOu3.js} +2 -2
  54. package/src/assets/web-panel/assets/{PdhVaultBrowser-CTZVBMZZ.js → PdhVaultBrowser-UwJvMbFO.js} +3 -3
  55. package/src/assets/web-panel/assets/{Permissions-DcLy9Nfp.js → Permissions-Damnxv-O.js} +4 -4
  56. package/src/assets/web-panel/assets/{PersonalDataHub-zc-cm-02.js → PersonalDataHub-d_7jlBb-.js} +4 -4
  57. package/src/assets/web-panel/assets/{Pipeline-CCnI8peM.js → Pipeline-DA87VjLw.js} +1 -1
  58. package/src/assets/web-panel/assets/{Privacy-DO1Xor8L.js → Privacy-DzO_UvWn.js} +1 -1
  59. package/src/assets/web-panel/assets/{ProjectInit-CZqC-jyt.js → ProjectInit-CwqECDhs.js} +2 -2
  60. package/src/assets/web-panel/assets/{ProjectSettings-DqJtyavX.js → ProjectSettings-CT5YdIl6.js} +2 -2
  61. package/src/assets/web-panel/assets/{Projects-Dx14NAO3.js → Projects-D3KdZPCv.js} +1 -1
  62. package/src/assets/web-panel/assets/{Providers-DH13a6ro.js → Providers-BjBIS8kk.js} +1 -1
  63. package/src/assets/web-panel/assets/{QrScannerModal-C9bwzVfA.js → QrScannerModal-mMFqiKkI.js} +1 -1
  64. package/src/assets/web-panel/assets/{QuickAsk-Cbt-oIPf.js → QuickAsk-BwGi9ZU1.js} +1 -1
  65. package/src/assets/web-panel/assets/{Recommend-BYIimGcY.js → Recommend-BY65SR5s.js} +1 -1
  66. package/src/assets/web-panel/assets/{RemoteSession-C8OWTG1H.js → RemoteSession-BGsVH_XU.js} +2 -2
  67. package/src/assets/web-panel/assets/{Reputation-DpUGT_jD.js → Reputation-DpPbxSgI.js} +1 -1
  68. package/src/assets/web-panel/assets/{Row-DZ5Izi2A.js → Row-B5YBYoVz.js} +1 -1
  69. package/src/assets/web-panel/assets/{RssFeed-CAn94No1.js → RssFeed-DvM5jaoh.js} +3 -3
  70. package/src/assets/web-panel/assets/{Search-BqNaxcgj.js → Search-6RX39EPO.js} +1 -1
  71. package/src/assets/web-panel/assets/{Security-Ck6vFTWn.js → Security-Beal-7cM.js} +4 -4
  72. package/src/assets/web-panel/assets/{Services-Y3RdvvDj.js → Services-D6rjVLe-.js} +2 -2
  73. package/src/assets/web-panel/assets/{Skeleton-Cx9Iqcp7.js → Skeleton-Dur7R7vz.js} +1 -1
  74. package/src/assets/web-panel/assets/{Skills-Oiqz7wLM.js → Skills-D1QkGwMk.js} +1 -1
  75. package/src/assets/web-panel/assets/{Sla-DaKJQADm.js → Sla-3ObrX8Es.js} +1 -1
  76. package/src/assets/web-panel/assets/{SpeechSettings-BWoOpPW4.js → SpeechSettings-DG_KAiH1.js} +1 -1
  77. package/src/assets/web-panel/assets/{SyncSettings-CgFle8GX.js → SyncSettings-BaHq0SJ2.js} +2 -2
  78. package/src/assets/web-panel/assets/{Tasks-C1tQNvWx.js → Tasks-BDpAkBAB.js} +1 -1
  79. package/src/assets/web-panel/assets/{Templates-CvvycaWi.js → Templates-tYdoRd-c.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tenant-D1FwaD12.js → Tenant-yGS5zIQ1.js} +1 -1
  81. package/src/assets/web-panel/assets/{Terminal-oorFjObO.js → Terminal-B3QbmVFa.js} +2 -2
  82. package/src/assets/web-panel/assets/{TimelineRenderer-BjMs48Sj.js → TimelineRenderer-B_7Pr5dS.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tokens-BkRb95xG.js → Tokens-DPvpDa53.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trigger-B94RYYAF.js → Trigger-DcSAD0GZ.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trust-DnBVpOWt.js → Trust-BBzEq-uy.js} +1 -1
  86. package/src/assets/web-panel/assets/{UkeySign-DouHO6Up.js → UkeySign-Dssav7-5.js} +1 -1
  87. package/src/assets/web-panel/assets/{VideoEditing-DDgRerWV.js → VideoEditing-CPOZf4yi.js} +1 -1
  88. package/src/assets/web-panel/assets/{Wallet-CQN9Un7X.js → Wallet-BzBVRXEq.js} +3 -3
  89. package/src/assets/web-panel/assets/{WebAuthn-DyHl2G3J.js → WebAuthn-DdSGaCCh.js} +2 -2
  90. package/src/assets/web-panel/assets/{WorkflowEditor-BQlN77Ey.js → WorkflowEditor-CKjBFoSs.js} +1 -1
  91. package/src/assets/web-panel/assets/{chat-0jOqe7ZD.js → chat-B9aMGLg0.js} +1 -1
  92. package/src/assets/web-panel/assets/{colors-kp5TAaKx.js → colors-GFCMctSV.js} +1 -1
  93. package/src/assets/web-panel/assets/{compact-item-DqF6Rml7.js → compact-item-BqSDFAYJ.js} +1 -1
  94. package/src/assets/web-panel/assets/{createContext-lDyLBjy5.js → createContext-BwUm3Ffp.js} +1 -1
  95. package/src/assets/web-panel/assets/devWarning-LxtRBsCm.js +1 -0
  96. package/src/assets/web-panel/assets/{hasIn-CkiF91kH.js → hasIn-DN1kMJOT.js} +1 -1
  97. package/src/assets/web-panel/assets/index-36hxBH-o.js +1 -0
  98. package/src/assets/web-panel/assets/{index-BvFFY-2V.js → index-7W1e9Vi4.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DQGk8bV8.js → index-B4MfxM5W.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-kenTha3h.js → index-B4dI_csl.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-B6V9l2P-.js → index-B7Yu5wwV.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Bq2s5obn.js → index-B9Pe-EyB.js} +3 -3
  103. package/src/assets/web-panel/assets/{index-aHKeys8c.js → index-BBMW8bQO.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BPwtIqRo.js → index-BCnbC2z7.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-ByggSxTQ.js → index-BDL2MwxN.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BPcjLn2w.js → index-BHUxz4dy.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Bu14YcwM.js → index-BL_0ndQc.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DrVVi5jX.js → index-BPGlcDvs.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DzU_SfdF.js → index-BeycSy7n.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DnI__Fwu.js → index-BpiR6uzH.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CI-H0ljO.js → index-BwssFWI1.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DPHmcQWh.js → index-By9GbJhu.js} +1 -1
  113. package/src/assets/web-panel/assets/index-C0b78zWZ.js +1 -0
  114. package/src/assets/web-panel/assets/{index-DX40v3aL.js → index-CEMl-Qte.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BRu6Pe98.js → index-CH2wK5dx.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-8Hxbv1SG.js → index-CRikhGgx.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DgGNW2ep.js → index-Ci0zIpSX.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BUqE17wu.js → index-Cli0VREv.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BAtpuJQ7.js → index-CmEHzOsw.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DK47iA2d.js → index-Cwih67e8.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-mkwJZMBT.js → index-D8jcp9Rj.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DSDM-VNz.js → index-DAK28GY8.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CNPCAYHk.js → index-DI90Wo_P.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CLchRTsS.js → index-DO-IKERp.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BKFL4DfP.js → index-DaFr7XB1.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DduPk1RS.js → index-DbDhKroq.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-X1l5-ive.js → index-DnJt9DaX.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-INxX1TMz.js → index-DvvJWwT8.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DHnFhMOL.js → index-PJt1Zrx2.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DHVNtkrR.js → index-PKwZkQDC.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DZU13W4o.js → index-THsr_UUJ.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-C-CS_-jC.js → index-bwb4cg_D.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BSAeSPQe.js → index-rCTtYCGu.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BnU8hi3c.js → index-tMF_deZb.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-DTA_B9gU.js → index-y7cfh9rP.js} +1 -1
  136. package/src/assets/web-panel/assets/{initDefaultProps-CYYQ0SI1.js → initDefaultProps-B6e5CZ5p.js} +1 -1
  137. package/src/assets/web-panel/assets/{motion--Tyo36te.js → motion-riMM1KfJ.js} +1 -1
  138. package/src/assets/web-panel/assets/{move-D2BjgQv7.js → move-C1NSDMjc.js} +1 -1
  139. package/src/assets/web-panel/assets/{mtc-parser-dyIu5RU_.js → mtc-parser-Bibuny9B.js} +1 -1
  140. package/src/assets/web-panel/assets/{omit-CDEAhC5H.js → omit-Cmf6FoRn.js} +1 -1
  141. package/src/assets/web-panel/assets/{pickAttrs-DLKDlIQs.js → pickAttrs-BSsYBUCY.js} +1 -1
  142. package/src/assets/web-panel/assets/{placementArrow-BveC8fe2.js → placementArrow-gSB7-GAS.js} +1 -1
  143. package/src/assets/web-panel/assets/{responsiveObserve-51urgYrW.js → responsiveObserve-qaqttvKa.js} +1 -1
  144. package/src/assets/web-panel/assets/{slide-CCHbhZg-.js → slide-RX2gxl3k.js} +1 -1
  145. package/src/assets/web-panel/assets/{statusUtils-W4mtUXRP.js → statusUtils-DEJmkhqw.js} +1 -1
  146. package/src/assets/web-panel/assets/{styleChecker-D4Drrz2a.js → styleChecker-CIWmJ78O.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFlexGapSupport-BBCd4kCM.js → useFlexGapSupport-D-UPSQBE.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFs-4Khxvw5Y.js → useFs-9QFtqADc.js} +1 -1
  149. package/src/assets/web-panel/assets/{usePersonalDataHub-7c72tleZ.js → usePersonalDataHub-DM6kyift.js} +1 -1
  150. package/src/assets/web-panel/assets/{vnode-DzZ7Y0LN.js → vnode-C-q6FNSJ.js} +1 -1
  151. package/src/assets/web-panel/assets/{zoom-C5jhaET3.js → zoom-D4WJY2m8.js} +1 -1
  152. package/src/assets/web-panel/index.html +1 -1
  153. package/src/command-help-index.json +1 -1
  154. package/src/commands/agent.js +19 -2
  155. package/src/commands/ask.js +13 -8
  156. package/src/commands/chat.js +8 -5
  157. package/src/commands/cowork.js +18 -9
  158. package/src/commands/eval.js +100 -45
  159. package/src/commands/evolution-deployment.js +58 -0
  160. package/src/commands/hub.js +13 -7
  161. package/src/commands/setup.js +31 -1
  162. package/src/constants.js +2 -2
  163. package/src/data/changelog.json +188 -762
  164. package/src/gateways/ws/personal-data-hub-protocol.js +12 -5
  165. package/src/lazy-dispatch.js +42 -6
  166. package/src/lib/agent-router.js +25 -23
  167. package/src/lib/chat-intent-service.js +3 -13
  168. package/src/lib/context-memory-kernel/provider-context.js +19 -3
  169. package/src/lib/cowork-adapter.js +9 -4
  170. package/src/lib/doctor-checkup.js +42 -0
  171. package/src/lib/eval/evidence.js +203 -0
  172. package/src/lib/eval/runner.js +16 -2
  173. package/src/lib/eval/trend.js +4 -3
  174. package/src/lib/evolution/evolution-deployment-config.js +217 -10
  175. package/src/lib/evolution/evolution-deployment-descriptor-revocations.js +131 -0
  176. package/src/lib/evolution/evolution-deployment-loader.js +23 -2
  177. package/src/lib/evolution/evolution-deployment-profile.js +281 -37
  178. package/src/lib/evolution/evolution-deployment-root-rotation.js +154 -0
  179. package/src/lib/evolution/evolution-file-identity.js +42 -0
  180. package/src/lib/evolution/evolution-ledger-file-manifest-head-store.js +242 -0
  181. package/src/lib/evolution/evolution-ledger-manifest-chain.js +74 -18
  182. package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +135 -20
  183. package/src/lib/evolution/evolution-ledger.js +353 -209
  184. package/src/lib/evolution/governed-hub-llm.js +18 -12
  185. package/src/lib/evolution/governed-hub-skill.js +4 -17
  186. package/src/lib/evolution/governed-model-turn.js +7 -8
  187. package/src/lib/llm-providers.js +1 -0
  188. package/src/lib/orchestrator.js +14 -8
  189. package/src/lib/personal-data-hub-wiring.js +7 -1
  190. package/src/lib/sub-agent-context.js +5 -1
  191. package/src/lib/task-model-selector.js +1 -1
  192. package/src/repl/agent-repl.js +1 -1
  193. package/src/repl/chat-repl.js +8 -4
  194. package/src/runtime/agent-core.js +36 -10
  195. package/src/runtime/headless-runner.js +16 -0
  196. package/src/assets/web-panel/assets/ChatBubbleRenderer-DWXPJh-J.js +0 -1
  197. package/src/assets/web-panel/assets/EvolutionSettings-C7_tq643.js +0 -1
  198. package/src/assets/web-panel/assets/MobileProjects-Bd78jDwm.js +0 -1
  199. package/src/assets/web-panel/assets/OrderTableRenderer-Bu8C6Qlj.js +0 -1
  200. package/src/assets/web-panel/assets/devWarning-IfrMTwCK.js +0 -1
  201. package/src/assets/web-panel/assets/index-C7nsIbMa.js +0 -1
  202. package/src/assets/web-panel/assets/index-DFXFLdKN.js +0 -1
@@ -19,12 +19,23 @@ import {
19
19
  formatTelemetry,
20
20
  } from "../lib/telemetry/span-recorder.js";
21
21
  import { computeTrend, formatTrend } from "../lib/eval/trend.js";
22
+ import {
23
+ createEvalComparison,
24
+ createEvalHistoryRecord,
25
+ evalDigest,
26
+ evaluateStrictEvalGate,
27
+ EVAL_EXECUTION_PROTOCOL,
28
+ readComparisonContext,
29
+ readEvalHistory,
30
+ } from "../lib/eval/evidence.js";
22
31
 
23
32
  export const _deps = {
24
33
  platform: process.platform,
25
34
  kill: process.kill.bind(process),
26
35
  spawn: executionBroker.spawn.bind(executionBroker),
27
36
  spawnSync: executionBroker.spawnSync.bind(executionBroker),
37
+ runEvalSuite,
38
+ getSuite,
28
39
  };
29
40
 
30
41
  /** Append a run summary as one JSONL line to the history file. */
@@ -32,26 +43,21 @@ function appendHistory(file, record) {
32
43
  fs.appendFileSync(file, JSON.stringify(record) + "\n", "utf8");
33
44
  }
34
45
 
35
- /** Read a JSONL eval-history file into an array of run records (skips bad lines). */
36
- function readHistory(file) {
37
- if (!fs.existsSync(file)) return [];
38
- const out = [];
39
- for (const line of fs.readFileSync(file, "utf8").split(/\r?\n/)) {
40
- const t = line.trim();
41
- if (!t) continue;
42
- try {
43
- out.push(JSON.parse(t));
44
- } catch {
45
- /* skip a corrupt history line rather than abort the report */
46
- }
47
- }
48
- return out;
49
- }
50
-
51
46
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
52
47
  // This file is src/commands/eval.js → the CLI entry is bin/chainlesschain.js.
53
48
  const BIN = path.resolve(__dirname, "..", "..", "bin", "chainlesschain.js");
54
49
 
50
+ function verifyAgentTerminal(output) {
51
+ try {
52
+ const events = output.split(/\r?\n/u).filter((line) => line.trim()).map((line) => JSON.parse(line));
53
+ const results = events.filter((event) => event?.type === "result");
54
+ const terminal = results[0];
55
+ return results.length === 1 && events.at(-1) === terminal &&
56
+ terminal.subtype === "success" && terminal.is_error !== true &&
57
+ !events.some((event) => event?.type === "error");
58
+ } catch { return false; }
59
+ }
60
+
55
61
  /**
56
62
  * Kill an agent child AND its tool grandchildren. A bare child.kill("SIGTERM")
57
63
  * only reaches the direct child (and on Windows TerminateProcess never reaches
@@ -111,7 +117,7 @@ function makeHeadlessRunAgent(opts = {}) {
111
117
  "--permission-mode",
112
118
  "acceptEdits",
113
119
  "--output-format",
114
- "text",
120
+ "stream-json",
115
121
  ];
116
122
  if (opts.model) args.push("--model", opts.model);
117
123
  if (opts.provider) args.push("--provider", opts.provider);
@@ -136,7 +142,15 @@ function makeHeadlessRunAgent(opts = {}) {
136
142
  if (settled) return;
137
143
  settled = true;
138
144
  clearTimeout(graceTimer);
139
- resolve(result);
145
+ resolve({
146
+ ...result,
147
+ executionEvidence: {
148
+ protocol: EVAL_EXECUTION_PROTOCOL,
149
+ exitCode: result.exitCode ?? null,
150
+ signal: result.signal ?? null,
151
+ terminalVerified: result.terminalVerified === true,
152
+ },
153
+ });
140
154
  };
141
155
  const timer = setTimeout(() => {
142
156
  // Kill the WHOLE tree, then settle on `close` — resolving immediately
@@ -162,17 +176,27 @@ function makeHeadlessRunAgent(opts = {}) {
162
176
  clearTimeout(timer);
163
177
  done({ ok: false, output: out, error: e.message });
164
178
  });
165
- child.on("close", (code) => {
179
+ child.on("close", (code, signal) => {
166
180
  clearTimeout(timer);
167
181
  if (timedOut) {
168
182
  done({
169
183
  ok: false,
170
184
  output: out,
185
+ exitCode: code,
186
+ signal: signal || null,
171
187
  error: `timed out after ${timeoutMs || 120000}ms`,
172
188
  });
173
189
  return;
174
190
  }
175
- done({ ok: code === 0, output: out, error: code === 0 ? null : err });
191
+ const terminalVerified = !opts._argv && verifyAgentTerminal(out);
192
+ const ok = code === 0 && !signal && (opts._argv || terminalVerified);
193
+ done({
194
+ ok: Boolean(ok), output: out, exitCode: code, signal: signal || null,
195
+ terminalVerified,
196
+ error: ok ? null : code === 0 && !signal
197
+ ? "agent stream lacks a valid success terminal"
198
+ : err || `agent process exited with ${signal || code}`,
199
+ });
176
200
  });
177
201
  });
178
202
  };
@@ -211,14 +235,22 @@ export function registerEvalCommand(program, { logger } = {}) {
211
235
  )
212
236
  .option(
213
237
  "--trend",
214
- "Report the pass-rate trend from --history instead of running (CI gate)",
238
+ "Report the diagnostic pass-rate trend from --history instead of running",
215
239
  )
240
+ .option("--strict", "With --trend: require complete, comparable recent evidence; legacy history cannot pass")
241
+ .option("--max-age-hours <hours>", "With --strict: maximum age of both compared runs", "168")
242
+ .option("--comparison-context <file>", "Bind explicit provider/model to operator-declared modelRevision and environment/permission/inference digests (not production attestation)")
216
243
  .option(
217
244
  "--regression-threshold <pct>",
218
245
  "With --trend: pass-rate drop (in points) that fails the gate on its own",
219
246
  "0",
220
247
  )
221
248
  .action(async (options) => {
249
+ if (options.strict && !options.trend) {
250
+ (log.error || console.error)("--strict requires --trend --history <file>");
251
+ process.exitCode = 1;
252
+ return;
253
+ }
222
254
  // Trend mode: don't run the suite — read the recorded history and report
223
255
  // the pass-rate trend + per-task regressions. This is the release-pipeline
224
256
  // consumer (the runs themselves need a real model; the report is pure).
@@ -228,19 +260,50 @@ export function registerEvalCommand(program, { logger } = {}) {
228
260
  process.exitCode = 1;
229
261
  return;
230
262
  }
231
- const runs = readHistory(options.history);
232
- const threshold =
233
- Math.max(0, Number(options.regressionThreshold) || 0) / 100;
234
- const trend = computeTrend(runs, { regressionThreshold: threshold });
263
+ let history;
264
+ try { history = readEvalHistory(options.history); }
265
+ catch {
266
+ history = { runs: [], issues: [{ code: "history_unreadable" }] };
267
+ }
268
+ const threshold = Number(options.regressionThreshold) / 100;
269
+ if (options.strict) {
270
+ const gate = evaluateStrictEvalGate(history, {
271
+ maxAgeMs: Number(options.maxAgeHours) * 60 * 60 * 1000,
272
+ regressionThreshold: threshold,
273
+ });
274
+ if (options.json) console.log(JSON.stringify(gate, null, 2));
275
+ else (log.log || console.log)(
276
+ `Eval comparison: ${gate.status}\n` +
277
+ ` Scope: local configuration comparison; operator declarations are not production attestation.\n` +
278
+ (gate.reasons.length ? ` ${gate.reasons.join(", ")}` : " Comparable executions and candidate checks passed."),
279
+ );
280
+ if (!gate.passed) process.exitCode = 1;
281
+ return;
282
+ }
283
+ const trend = computeTrend(history.runs, { regressionThreshold: Math.max(0, threshold || 0) });
284
+ if (history.issues.length) trend.historyIssues = history.issues;
235
285
  if (options.json) console.log(JSON.stringify(trend, null, 2));
236
- else (log.log || console.log)(formatTrend(trend));
286
+ else {
287
+ (log.log || console.log)(formatTrend(trend));
288
+ if (history.issues.length) (log.error || console.error)("History contains invalid or unreadable records; this diagnostic is not release evidence.");
289
+ }
237
290
  if (trend.regressed) process.exitCode = 1;
238
291
  return;
239
292
  }
240
293
 
241
294
  let tasks;
295
+ let comparison;
242
296
  try {
243
- tasks = getSuite(options.suite);
297
+ tasks = _deps.getSuite(options.suite);
298
+ comparison = createEvalComparison({
299
+ suite: options.suite,
300
+ corpusDigest: evalDigest(fs.readFileSync(new URL("../lib/eval/tasks.js", import.meta.url))),
301
+ provider: options.provider,
302
+ model: options.model,
303
+ context: options.comparisonContext
304
+ ? readComparisonContext(options.comparisonContext, { provider: options.provider, model: options.model })
305
+ : null,
306
+ });
244
307
  } catch (err) {
245
308
  log.error ? log.error(err.message) : console.error(err.message);
246
309
  process.exitCode = 1;
@@ -256,7 +319,7 @@ export function registerEvalCommand(program, { logger } = {}) {
256
319
  // OTel-shaped telemetry for the run (per-task span + failure class).
257
320
  const recorder = new TelemetryRecorder({ serviceName: "cc-eval" });
258
321
 
259
- const summary = await runEvalSuite(tasks, {
322
+ const summary = await _deps.runEvalSuite(tasks, {
260
323
  runAgent,
261
324
  recorder,
262
325
  keepWorkspaces: options.keep === true,
@@ -272,6 +335,11 @@ export function registerEvalCommand(program, { logger } = {}) {
272
335
  : ""),
273
336
  ),
274
337
  });
338
+ const record = createEvalHistoryRecord(summary, {
339
+ comparison,
340
+ dryRun: options.dryRun === true,
341
+ label: options.label || null,
342
+ });
275
343
 
276
344
  if (options.otlp) {
277
345
  try {
@@ -296,28 +364,15 @@ export function registerEvalCommand(program, { logger } = {}) {
296
364
  // pass/fail + a timestamp/label — so `cc eval --trend` can chart it).
297
365
  if (options.history) {
298
366
  try {
299
- appendHistory(options.history, {
300
- ranAt: new Date().toISOString(),
301
- label: options.label || null,
302
- // Tagged so --trend can exclude it: a dry-run is always 0% and
303
- // would otherwise report every passing task as a regression.
304
- ...(options.dryRun ? { dryRun: true } : {}),
305
- passed: summary.passed,
306
- total: summary.total,
307
- passRate: summary.passRate,
308
- unrelatedChangeRate: summary.unrelatedChangeRate,
309
- results: (summary.results || []).map((r) => ({
310
- id: r.id,
311
- pass: r.pass,
312
- })),
313
- });
367
+ appendHistory(options.history, record);
314
368
  } catch (e) {
315
369
  (log.error || console.error)(` history write failed: ${e.message}`);
370
+ process.exitCode = 1;
316
371
  }
317
372
  }
318
373
 
319
374
  if (options.json) {
320
- console.log(JSON.stringify(summary, null, 2));
375
+ console.log(JSON.stringify({ ...summary, ...record }, null, 2));
321
376
  } else {
322
377
  // Per-task lines already streamed via onResult; print the summary +
323
378
  // the telemetry metrics (durations / failure classification).
@@ -336,7 +391,7 @@ export function registerEvalCommand(program, { logger } = {}) {
336
391
  }
337
392
  }
338
393
  // Non-zero exit when not every task passed — usable as a CI gate.
339
- if (summary.passed < summary.total) process.exitCode = 1;
394
+ if (summary.total === 0 || summary.passed < summary.total) process.exitCode = 1;
340
395
  });
341
396
  return program;
342
397
  }
@@ -3,6 +3,7 @@ import { logger } from "../lib/logger.js";
3
3
  import {
4
4
  configureEvolutionDeployment,
5
5
  getEvolutionDeploymentStatus,
6
+ revokeEvolutionDeploymentDescriptorRevisions,
6
7
  setEvolutionDeploymentEnabled,
7
8
  } from "../lib/evolution/evolution-deployment-config.js";
8
9
 
@@ -21,8 +22,24 @@ function printStatus(status) {
21
22
  logger.log(` Descriptor: ${status.descriptorPath}`);
22
23
  if (status.trustRootPath)
23
24
  logger.log(` Trust root: ${status.trustRootPath}`);
25
+ if (status.activeTrustRootDigest)
26
+ logger.log(` Active root: ${status.activeTrustRootDigest}`);
27
+ if (status.revisionFloor)
28
+ logger.log(` Revision floor: ${status.revisionFloor}`);
24
29
  if (status.commands?.length)
25
30
  logger.log(` Commands: ${status.commands.join(", ")}`);
31
+ if (status.readiness) {
32
+ for (const command of ["ask", "agent"]) {
33
+ const admission = status.readiness[command];
34
+ if (admission)
35
+ logger.log(
36
+ ` ${command} admission: ${admission.state} — ${admission.detail}`,
37
+ );
38
+ }
39
+ logger.log(
40
+ " Runtime: not checked (host composition and model execution)",
41
+ );
42
+ }
26
43
  if (status.error) logger.log(chalk.red(` Error: ${status.error}`));
27
44
  }
28
45
 
@@ -38,6 +55,16 @@ function fail(error, json) {
38
55
  process.exitCode = 1;
39
56
  }
40
57
 
58
+ /** Standalone configuration route: never assemble the configured host. */
59
+ export function registerEvolutionDeploymentCommand(program) {
60
+ const evolution = program
61
+ .command("evolution")
62
+ .description(
63
+ "Evolution metrics and governance records — not model training or active Skill promotion",
64
+ );
65
+ registerEvolutionDeploymentCommands(evolution);
66
+ }
67
+
41
68
  export function registerEvolutionDeploymentCommands(parent) {
42
69
  const deployment = parent
43
70
  .command("deployment")
@@ -60,6 +87,14 @@ export function registerEvolutionDeploymentCommands(parent) {
60
87
  .description("Verify, save, and enable a signed deployment")
61
88
  .requiredOption("--descriptor <path>", "Absolute signed descriptor path")
62
89
  .requiredOption("--trust-root <path>", "Absolute Ed25519 public key path")
90
+ .option(
91
+ "--root-rotation <path>",
92
+ "Certificate signed by the current root when changing trust roots",
93
+ )
94
+ .option(
95
+ "--descriptor-revocations <path>",
96
+ "Signed descriptor-revocation record for this trust root",
97
+ )
63
98
  .option("--disabled", "Save without enabling")
64
99
  .option("--json", "Output as JSON")
65
100
  .action(async (options) => {
@@ -68,6 +103,8 @@ export function registerEvolutionDeploymentCommands(parent) {
68
103
  await configureEvolutionDeployment({
69
104
  descriptorPath: options.descriptor,
70
105
  trustRootPath: options.trustRoot,
106
+ rootRotationPath: options.rootRotation || null,
107
+ revocationPath: options.descriptorRevocations || null,
71
108
  enabled: options.disabled !== true,
72
109
  }),
73
110
  options.json,
@@ -92,4 +129,25 @@ export function registerEvolutionDeploymentCommands(parent) {
92
129
  }
93
130
  });
94
131
  }
132
+
133
+ deployment
134
+ .command("revoke")
135
+ .description("Record signed descriptor revocations and disable the profile")
136
+ .requiredOption(
137
+ "--descriptor-revocations <path>",
138
+ "Signed descriptor-revocation record for the active trust root",
139
+ )
140
+ .option("--json", "Output as JSON")
141
+ .action(async (options) => {
142
+ try {
143
+ output(
144
+ await revokeEvolutionDeploymentDescriptorRevisions({
145
+ revocationPath: options.descriptorRevocations,
146
+ }),
147
+ options.json,
148
+ );
149
+ } catch (error) {
150
+ fail(error, options.json);
151
+ }
152
+ });
95
153
  }
@@ -3448,13 +3448,19 @@ function _defaultKnownVendors() {
3448
3448
 
3449
3449
  export function registerHubCommand(program, dependencies = {}) {
3450
3450
  const factory = readEvolutionCompositionFactory(dependencies);
3451
- const invocationOptions = (options) =>
3452
- factory === null
3453
- ? options
3454
- : {
3455
- ...options,
3456
- _getHub: () => getGovernedAnalysisHub(factory),
3457
- };
3451
+ const invocationOptions = (options) => {
3452
+ if (factory === null) {
3453
+ const error = new Error(
3454
+ "Hub model egress requires an authenticated evolution composition factory",
3455
+ );
3456
+ error.code = "CC_AGENT_EVOLUTION_INGRESS_FAILED";
3457
+ throw error;
3458
+ }
3459
+ return {
3460
+ ...options,
3461
+ _getHub: () => getGovernedAnalysisHub(factory),
3462
+ };
3463
+ };
3458
3464
  const hub = program
3459
3465
  .command("hub")
3460
3466
  .description(
@@ -26,6 +26,10 @@ import {
26
26
  askPassword,
27
27
  } from "../lib/prompts.js";
28
28
  import logger from "../lib/logger.js";
29
+ import {
30
+ assessEvolutionDeploymentReadiness,
31
+ getEvolutionDeploymentStatus,
32
+ } from "../lib/evolution/evolution-deployment-config.js";
29
33
 
30
34
  export function registerSetupCommand(program) {
31
35
  program
@@ -180,6 +184,24 @@ async function runSetup(options) {
180
184
  }
181
185
  logger.success("Configuration saved");
182
186
 
187
+ // Saving a provider setting does not itself authorize a content-bearing
188
+ // request. Check command-specific deployment admission without executing the
189
+ // host module; a successful preflight is not a model execution probe.
190
+ const modelReadiness = assessEvolutionDeploymentReadiness(
191
+ await getEvolutionDeploymentStatus(),
192
+ );
193
+ if (modelReadiness.ready) {
194
+ logger.success("Signed deployment admits ask and agent");
195
+ logger.info(
196
+ "Runtime composition and model execution will be checked when you run a task.",
197
+ );
198
+ } else {
199
+ logger.warn(
200
+ `Model deployment prerequisites not met: ${modelReadiness.detail}`,
201
+ );
202
+ logger.info(`To enable it: ${modelReadiness.remediation}`);
203
+ }
204
+
183
205
  // Step 8: Docker services
184
206
  if (!options.skipServices && dockerOk && composeOk) {
185
207
  logger.newline();
@@ -207,7 +229,15 @@ async function runSetup(options) {
207
229
 
208
230
  // Done
209
231
  logger.newline();
210
- logger.log(chalk.bold.green(" Setup complete!\n"));
232
+ logger.log(
233
+ modelReadiness.ready
234
+ ? chalk.bold.green(
235
+ " Setup saved; deployment prerequisites checked (model execution not tested).\n",
236
+ )
237
+ : chalk.bold.yellow(
238
+ " Setup saved; ask/agent deployment prerequisites remain incomplete.\n",
239
+ ),
240
+ );
211
241
  logger.log(" Next steps:");
212
242
  logger.log(
213
243
  ` ${chalk.cyan("chainlesschain start")} Launch the desktop app`,
package/src/constants.js CHANGED
@@ -30,7 +30,7 @@ export const LLM_PROVIDERS = {
30
30
  volcengine: {
31
31
  name: "Volcengine (火山引擎/豆包)",
32
32
  defaultBaseUrl: "https://ark.cn-beijing.volces.com/api/v3",
33
- defaultModel: "deepseek-v4-flash-260425",
33
+ defaultModel: "deepseek-v4-flash-ga-260731",
34
34
  requiresApiKey: true,
35
35
  },
36
36
  openai: {
@@ -144,7 +144,7 @@ export const DEFAULT_CONFIG = {
144
144
  provider: "volcengine",
145
145
  apiKey: null,
146
146
  baseUrl: "https://ark.cn-beijing.volces.com/api/v3",
147
- model: "deepseek-v4-flash-260425",
147
+ model: "deepseek-v4-flash-ga-260731",
148
148
  // When true, `cc ask` (provider=ollama only) overrides baseUrl to point at
149
149
  // the Android LocalLlmServer (127.0.0.1:18484). User opt-in toggle:
150
150
  // cc config set llm.preferAndroidLocal true