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.
- package/README.md +75 -14
- package/package.json +3 -3
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-BIl-Z62M.js → AIOps-CrMhYNeH.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BgPi_Te6.js → ActionButton-DLY5blZ3.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CaNIzlAG.js → Analytics-C0NhKQB0.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-D9GSx2hl.js → AppLayout-DLyepgMq.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-Kq7kotzv.js → Artifacts-Depk01Sa.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-e1RTJLco.js → Audit-jKe6NQ3J.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BfyNT0BW.js → BackgroundAgents-CG4GKT9s.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BEAq7i6S.js → Backup-DYWCkzwM.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BHuP82DF.js → BaseInput-xm5vodmJ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BLPgCQsB.js → Chat-B20_PNd3.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-D4d-eh0F.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-DDJrOqEh.js → Checkbox-CfgwkV_r.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CxyKcM6S.js → Codegen-DbnoWI44.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BYFh9rE1.js → Col-CfzzhgGw.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D8JPppoh.js → Community-BU7mGM8p.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-B5VGSqZe.js → Compact-DpYim0an.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-C7KiFcUK.js → Compliance-BNJcO6ra.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-D-F2fgA_.js → Cowork-CecZ-pWj.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-B6TmPqRO.js → Cron-BG_C1fe3.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BeGcBXhk.js → Crosschain-BAeILQLL.js} +1 -1
- package/src/assets/web-panel/assets/{DID-9QklLcmQ.js → DID-CYqOEkXi.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DIadmsuS.js → Dashboard-BYU8wmL1.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-0I5gks3i.js → Dropdown-DYlJeTTa.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BdTAjT2q.js → EmailListRenderer-C0M6py3K.js} +1 -1
- package/src/assets/web-panel/assets/EvolutionSettings-_QnjPFZJ.js +1 -0
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DQUQWwUY.js → FamilyGuardDashboard-Du90iDch.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Drgi--Zn.js → Federation-DkFp_hzB.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BOf-9P8n.js → FormItemContext-BGgtGTfG.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CBBnIDaW.js → GenericCardRenderer-BIDsSCei.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BKimGd5P.js → Git--d3Te93J.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DoXCXppu.js → Governance-CZwD0vmO.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-DzOhGhOE.js → Inference-DiDcSFEW.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DawgmU58.js → KnowledgeGraph-Bi0hSfzg.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-Co3EJL2Y.js → Logs-C8NHSc0K.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-VUfiDRZN.js → MarkdownRenderer-DfDuADqF.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-BqpMHnMW.js → Marketplace-D6kD0bNf.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C7ZSokcR.js → McpTools-mTSamCr5.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-DuJrpeDx.js → Memory-YQBXfLjU.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CaM744NU.js → MobileBridge-D2awuupp.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-Bl7lZc_-.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-5oUB7lPh.js → Mtc-CBqjLK2Q.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-D9DNF6DB.js → MtcAudit-C4poRInZ.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-CfMpFQSr.js → Multisig-C_J0zXYZ.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CuhPZQ7q.js → NLProgramming-Ci43sWOU.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-NtSeMoyM.js → Notes-DN7A-GFZ.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CB4e7V83.js → NotificationSettings-D5jNm71V.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-C9UsPOG8.js +1 -0
- package/src/assets/web-panel/assets/{Organization-K_0bjm7y.js → Organization-BapYMJrP.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-D2vwxiPv.js → Overflow-BwxwjhFw.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-WQMHBu8q.js → P2P-TObXXOu3.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CTZVBMZZ.js → PdhVaultBrowser-UwJvMbFO.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DcLy9Nfp.js → Permissions-Damnxv-O.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-zc-cm-02.js → PersonalDataHub-d_7jlBb-.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-CCnI8peM.js → Pipeline-DA87VjLw.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DO1Xor8L.js → Privacy-DzO_UvWn.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CZqC-jyt.js → ProjectInit-CwqECDhs.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-DqJtyavX.js → ProjectSettings-CT5YdIl6.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-Dx14NAO3.js → Projects-D3KdZPCv.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DH13a6ro.js → Providers-BjBIS8kk.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-C9bwzVfA.js → QrScannerModal-mMFqiKkI.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Cbt-oIPf.js → QuickAsk-BwGi9ZU1.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BYIimGcY.js → Recommend-BY65SR5s.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C8OWTG1H.js → RemoteSession-BGsVH_XU.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DpUGT_jD.js → Reputation-DpPbxSgI.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DZ5Izi2A.js → Row-B5YBYoVz.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CAn94No1.js → RssFeed-DvM5jaoh.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BqNaxcgj.js → Search-6RX39EPO.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Ck6vFTWn.js → Security-Beal-7cM.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Y3RdvvDj.js → Services-D6rjVLe-.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-Cx9Iqcp7.js → Skeleton-Dur7R7vz.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-Oiqz7wLM.js → Skills-D1QkGwMk.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DaKJQADm.js → Sla-3ObrX8Es.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BWoOpPW4.js → SpeechSettings-DG_KAiH1.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CgFle8GX.js → SyncSettings-BaHq0SJ2.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-C1tQNvWx.js → Tasks-BDpAkBAB.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CvvycaWi.js → Templates-tYdoRd-c.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-D1FwaD12.js → Tenant-yGS5zIQ1.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-oorFjObO.js → Terminal-B3QbmVFa.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BjMs48Sj.js → TimelineRenderer-B_7Pr5dS.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BkRb95xG.js → Tokens-DPvpDa53.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-B94RYYAF.js → Trigger-DcSAD0GZ.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DnBVpOWt.js → Trust-BBzEq-uy.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DouHO6Up.js → UkeySign-Dssav7-5.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DDgRerWV.js → VideoEditing-CPOZf4yi.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CQN9Un7X.js → Wallet-BzBVRXEq.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-DyHl2G3J.js → WebAuthn-DdSGaCCh.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-BQlN77Ey.js → WorkflowEditor-CKjBFoSs.js} +1 -1
- package/src/assets/web-panel/assets/{chat-0jOqe7ZD.js → chat-B9aMGLg0.js} +1 -1
- package/src/assets/web-panel/assets/{colors-kp5TAaKx.js → colors-GFCMctSV.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DqF6Rml7.js → compact-item-BqSDFAYJ.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-lDyLBjy5.js → createContext-BwUm3Ffp.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-LxtRBsCm.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CkiF91kH.js → hasIn-DN1kMJOT.js} +1 -1
- package/src/assets/web-panel/assets/index-36hxBH-o.js +1 -0
- package/src/assets/web-panel/assets/{index-BvFFY-2V.js → index-7W1e9Vi4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DQGk8bV8.js → index-B4MfxM5W.js} +1 -1
- package/src/assets/web-panel/assets/{index-kenTha3h.js → index-B4dI_csl.js} +1 -1
- package/src/assets/web-panel/assets/{index-B6V9l2P-.js → index-B7Yu5wwV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bq2s5obn.js → index-B9Pe-EyB.js} +3 -3
- package/src/assets/web-panel/assets/{index-aHKeys8c.js → index-BBMW8bQO.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPwtIqRo.js → index-BCnbC2z7.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByggSxTQ.js → index-BDL2MwxN.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPcjLn2w.js → index-BHUxz4dy.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bu14YcwM.js → index-BL_0ndQc.js} +1 -1
- package/src/assets/web-panel/assets/{index-DrVVi5jX.js → index-BPGlcDvs.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzU_SfdF.js → index-BeycSy7n.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnI__Fwu.js → index-BpiR6uzH.js} +1 -1
- package/src/assets/web-panel/assets/{index-CI-H0ljO.js → index-BwssFWI1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DPHmcQWh.js → index-By9GbJhu.js} +1 -1
- package/src/assets/web-panel/assets/index-C0b78zWZ.js +1 -0
- package/src/assets/web-panel/assets/{index-DX40v3aL.js → index-CEMl-Qte.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRu6Pe98.js → index-CH2wK5dx.js} +1 -1
- package/src/assets/web-panel/assets/{index-8Hxbv1SG.js → index-CRikhGgx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgGNW2ep.js → index-Ci0zIpSX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUqE17wu.js → index-Cli0VREv.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAtpuJQ7.js → index-CmEHzOsw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DK47iA2d.js → index-Cwih67e8.js} +1 -1
- package/src/assets/web-panel/assets/{index-mkwJZMBT.js → index-D8jcp9Rj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSDM-VNz.js → index-DAK28GY8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNPCAYHk.js → index-DI90Wo_P.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLchRTsS.js → index-DO-IKERp.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKFL4DfP.js → index-DaFr7XB1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DduPk1RS.js → index-DbDhKroq.js} +1 -1
- package/src/assets/web-panel/assets/{index-X1l5-ive.js → index-DnJt9DaX.js} +1 -1
- package/src/assets/web-panel/assets/{index-INxX1TMz.js → index-DvvJWwT8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHnFhMOL.js → index-PJt1Zrx2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHVNtkrR.js → index-PKwZkQDC.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZU13W4o.js → index-THsr_UUJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-CS_-jC.js → index-bwb4cg_D.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSAeSPQe.js → index-rCTtYCGu.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnU8hi3c.js → index-tMF_deZb.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTA_B9gU.js → index-y7cfh9rP.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CYYQ0SI1.js → initDefaultProps-B6e5CZ5p.js} +1 -1
- package/src/assets/web-panel/assets/{motion--Tyo36te.js → motion-riMM1KfJ.js} +1 -1
- package/src/assets/web-panel/assets/{move-D2BjgQv7.js → move-C1NSDMjc.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-dyIu5RU_.js → mtc-parser-Bibuny9B.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CDEAhC5H.js → omit-Cmf6FoRn.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DLKDlIQs.js → pickAttrs-BSsYBUCY.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BveC8fe2.js → placementArrow-gSB7-GAS.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-51urgYrW.js → responsiveObserve-qaqttvKa.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CCHbhZg-.js → slide-RX2gxl3k.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-W4mtUXRP.js → statusUtils-DEJmkhqw.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-D4Drrz2a.js → styleChecker-CIWmJ78O.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BBCd4kCM.js → useFlexGapSupport-D-UPSQBE.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-4Khxvw5Y.js → useFs-9QFtqADc.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-7c72tleZ.js → usePersonalDataHub-DM6kyift.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DzZ7Y0LN.js → vnode-C-q6FNSJ.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-C5jhaET3.js → zoom-D4WJY2m8.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agent.js +19 -2
- package/src/commands/ask.js +13 -8
- package/src/commands/chat.js +8 -5
- package/src/commands/cowork.js +18 -9
- package/src/commands/eval.js +100 -45
- package/src/commands/evolution-deployment.js +58 -0
- package/src/commands/hub.js +13 -7
- package/src/commands/setup.js +31 -1
- package/src/constants.js +2 -2
- package/src/data/changelog.json +188 -762
- package/src/gateways/ws/personal-data-hub-protocol.js +12 -5
- package/src/lazy-dispatch.js +42 -6
- package/src/lib/agent-router.js +25 -23
- package/src/lib/chat-intent-service.js +3 -13
- package/src/lib/context-memory-kernel/provider-context.js +19 -3
- package/src/lib/cowork-adapter.js +9 -4
- package/src/lib/doctor-checkup.js +42 -0
- package/src/lib/eval/evidence.js +203 -0
- package/src/lib/eval/runner.js +16 -2
- package/src/lib/eval/trend.js +4 -3
- package/src/lib/evolution/evolution-deployment-config.js +217 -10
- package/src/lib/evolution/evolution-deployment-descriptor-revocations.js +131 -0
- package/src/lib/evolution/evolution-deployment-loader.js +23 -2
- package/src/lib/evolution/evolution-deployment-profile.js +281 -37
- package/src/lib/evolution/evolution-deployment-root-rotation.js +154 -0
- package/src/lib/evolution/evolution-file-identity.js +42 -0
- package/src/lib/evolution/evolution-ledger-file-manifest-head-store.js +242 -0
- package/src/lib/evolution/evolution-ledger-manifest-chain.js +74 -18
- package/src/lib/evolution/evolution-ledger-v2-manifest-backend.js +135 -20
- package/src/lib/evolution/evolution-ledger.js +353 -209
- package/src/lib/evolution/governed-hub-llm.js +18 -12
- package/src/lib/evolution/governed-hub-skill.js +4 -17
- package/src/lib/evolution/governed-model-turn.js +7 -8
- package/src/lib/llm-providers.js +1 -0
- package/src/lib/orchestrator.js +14 -8
- package/src/lib/personal-data-hub-wiring.js +7 -1
- package/src/lib/sub-agent-context.js +5 -1
- package/src/lib/task-model-selector.js +1 -1
- package/src/repl/agent-repl.js +1 -1
- package/src/repl/chat-repl.js +8 -4
- package/src/runtime/agent-core.js +36 -10
- package/src/runtime/headless-runner.js +16 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DWXPJh-J.js +0 -1
- package/src/assets/web-panel/assets/EvolutionSettings-C7_tq643.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-Bd78jDwm.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Bu8C6Qlj.js +0 -1
- package/src/assets/web-panel/assets/devWarning-IfrMTwCK.js +0 -1
- package/src/assets/web-panel/assets/index-C7nsIbMa.js +0 -1
- package/src/assets/web-panel/assets/index-DFXFLdKN.js +0 -1
package/src/commands/eval.js
CHANGED
|
@@ -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
|
-
"
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
|
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
|
}
|
package/src/commands/hub.js
CHANGED
|
@@ -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
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
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(
|
package/src/commands/setup.js
CHANGED
|
@@ -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(
|
|
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-
|
|
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-
|
|
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
|