chainlesschain 0.166.87 → 0.166.88
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 +26 -15
- package/package.json +1 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DdQjhXg9.js → AIOps-QzeGep9J.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CuwA3hPA.js → ActionButton-Dfc5bx7S.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DTVXJSAC.js → Analytics-tn-_ZG2E.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-j06JBfEQ.js → AppLayout-Deg3WAK8.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BFAK8LEW.js → Artifacts-KU05t0a6.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BiGxRpOf.js → Audit-CkSZf54T.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-B6uHaPkZ.js → BackgroundAgents-i7ivfXF0.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BNAesB8q.js → Backup-QcVUKtf0.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BOuetfCd.js → BaseInput-B3h5ZJ0g.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-cVzo3m_D.js → Chat-D7AVz0xi.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DZ2Ys-CI.js → ChatBubbleRenderer-B0-euPW7.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BaCTS-H8.js → Checkbox-H0p0TMlD.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CBE8NiYh.js → Codegen-B6HOmAY3.js} +1 -1
- package/src/assets/web-panel/assets/{Col-C9wLiUTN.js → Col-n_64Fog2.js} +1 -1
- package/src/assets/web-panel/assets/{Community-jdClBSIp.js → Community-CX0JGgj0.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BIjauIlM.js → Compact-C4JWUZlx.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CZ-AoaNj.js → Compliance-DKyTZakB.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BbTKtDS4.js → Cowork-C0joBMci.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-ImKdtwNi.js → Cron-D6VkYpxK.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-B54GSHf5.js → Crosschain-7b6Uu8jc.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BQt5WUzs.js → DID-C8YPKqzY.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard--gNOffif.js → Dashboard-DJsOiEry.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-342A5YJw.js → Dropdown-CyStFY-4.js} +1 -1
- package/src/assets/web-panel/assets/EmailListRenderer-COrIx2Rg.js +1 -0
- package/src/assets/web-panel/assets/{EvolutionSettings-CyZPoTio.js → EvolutionSettings-DpxORusH.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-B1MCkFEu.js → FamilyGuardDashboard-5BYZdMG0.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DZWoERUy.js → Federation-s1kS0ekU.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Onmb0mp3.js → FormItemContext-CmgoH9HV.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-u1qhNNc7.js → GenericCardRenderer-DSRWrvcL.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BEowR1C5.js → Git-Cz3EgnS1.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BiYd3AAg.js → Governance-De4atTe7.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CsC4Vjh5.js → Inference-DoitBBxJ.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BXA7ikPM.js → KnowledgeGraph-CIdmJ1pH.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C9WoplQm.js → Logs-Coa_qNhU.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-DecEsXsy.js → MarkdownRenderer-CeT_RocE.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-CCoJBfRL.js → Marketplace-C6kbAQoM.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CzaOWBoA.js → McpTools-C2TZn8D-.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-BPwh7u1-.js → Memory-DYdEKDuB.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Bk47v6z2.js → MobileBridge-pKLeVviZ.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-D4bWcHA_.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-ExVyAGlW.js → Mtc-IEoVRV29.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-Rrw10csE.js → MtcAudit-Cov-yYTY.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-8TxxwxZZ.js → Multisig--Jr7OCmp.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CNckjtnY.js → NLProgramming-D2gXnYAA.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-C4j6cZTu.js → Notes-hk8pMyve.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CchU8rWd.js → NotificationSettings-D26Nc7MU.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-DmzHMEOa.js +1 -0
- package/src/assets/web-panel/assets/{Organization-F0Je7EdZ.js → Organization-Cn-o6mHT.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-B2k-JA3u.js → Overflow-DP6xpDak.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-yui9Xxe6.js → P2P-C9WAjG-I.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-DxZb0Ux8.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-CSFL0uvh.js → Permissions-BFBN4-IL.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BrMcd-vr.js → PersonalDataHub-BEDvoAiz.js} +6 -6
- package/src/assets/web-panel/assets/{Pipeline-fzrliaVP.js → Pipeline-Co2Ze_rR.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BrkUjJ_g.js → Privacy-BOTn1EId.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CF_QCsW9.js → ProjectInit-CObyrZYm.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Duwrd8aC.js → ProjectSettings-DVTN31rd.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-B0dLVXzU.js → Projects-DQSEaVjE.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-Db8iS1xQ.js → Providers-BRIKWIdQ.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CHbNzEQs.js → QrScannerModal-3nxaEXxN.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CIESMfeR.js → QuickAsk-iwZJEE9z.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BTMbCMtR.js → Recommend-D2_EEbvc.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DavyK6J-.js → RemoteSession-S4w2mUfq.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-BFKtMelA.js → Reputation-CstUvfTC.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BI9AZUvw.js → Row-DEGHFpxz.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-1nwXt8NY.js → RssFeed-DGdZtJQl.js} +2 -2
- package/src/assets/web-panel/assets/{Search-Ck8PDYbk.js → Search-DhfXi99U.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BgDqpCbq.js → Security-BbzISrgX.js} +4 -4
- package/src/assets/web-panel/assets/{Services-DF8anXm4.js → Services-CFjP2sQ3.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CoHyY4ZX.js → Skeleton-CFn5wbvm.js} +1 -1
- package/src/assets/web-panel/assets/Skills-fVbT8RcW.js +1 -0
- package/src/assets/web-panel/assets/{Sla-XuOawvQY.js → Sla-D6OtC0MT.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DFJ7nAiu.js → SpeechSettings-D0kteBjU.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-B2xYj-Pi.js → SyncSettings-BGEWCtPh.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-B1xZUG4D.js +1 -0
- package/src/assets/web-panel/assets/{Templates-BXFmKh7W.js → Templates-COlorjqb.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CRg2AXbd.js → Tenant-yLkwfuo3.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DQgxnuep.js → Terminal-CAmkq1wf.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BrPQhQVc.js → TimelineRenderer-CcKYq1Ue.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-RByy4USy.js → Tokens-9hIqn_LE.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-pE3y8u73.js → Trigger-Dsdkb74C.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DhID9C33.js → Trust-DC4GuE3C.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CPxEPNBH.js → UkeySign-CSlh00wf.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-ZD8DUxeQ.js → VideoEditing-QEWLo3QY.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Br9JREEd.js → Wallet-BkPNQgmg.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Cn-YacJg.js → WebAuthn-7---jCBl.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BTu0oqMp.js → WorkflowEditor-Dq6Yiu8E.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CEjws_QF.js → chat-CTYIMpWD.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Bv2RNebW.js → colors-C8JtYlDN.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-gSc3EofP.js → compact-item-spXpnsNC.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-kyFDaqWC.js → createContext-D04ewPuL.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-3-s4adfp.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BuMWcjhx.js → hasIn-DZblOKXx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYcPWVN9.js → index-749P1pkM.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3m3EXbL.js → index-B-cKXztT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbkyTMj-.js → index-B57W1RB6.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCS5j4SQ.js → index-B7RA974g.js} +1 -1
- package/src/assets/web-panel/assets/{index-U-ytt84A.js → index-BKfR2eSQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C56Drzol.js → index-BLv-KSGc.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYKSuD02.js → index-BOuUUW2U.js} +3 -3
- package/src/assets/web-panel/assets/{index-CMS3Mk93.js → index-BSO33_O2.js} +1 -1
- package/src/assets/web-panel/assets/{index-nLemnBZ2.js → index-B_65aY6c.js} +1 -1
- package/src/assets/web-panel/assets/{index-sJ1F5Txa.js → index-BjMY3Y_L.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUOCcXou.js → index-Bm0z1M6s.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNt2X-aK.js → index-Bw-3CtK2.js} +1 -1
- package/src/assets/web-panel/assets/{index-OjZUHz5z.js → index-CE3TYhl0.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cj4RA7oA.js → index-CHtwoTKX.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bg5jis0q.js → index-CLkua5sJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-q65c1kp8.js → index-COvZnoIg.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cm8K8Evn.js → index-CZmBlh5P.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSSIJ-rv.js → index-Cfk4o9eI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CvSuM_CB.js → index-Cgztj1JO.js} +1 -1
- package/src/assets/web-panel/assets/{index-jmMAqBAm.js → index-Cz0gkRz_.js} +1 -1
- package/src/assets/web-panel/assets/{index-DR561Sqc.js → index-DHOV24VR.js} +1 -1
- package/src/assets/web-panel/assets/{index-NQ0c4hJ1.js → index-DLUHbPl3.js} +1 -1
- package/src/assets/web-panel/assets/{index-EpxWlmip.js → index-DSoyEHi2.js} +1 -1
- package/src/assets/web-panel/assets/{index-CF3TjDNz.js → index-D_Md0Jhp.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkfvP2dN.js → index-Dcd-qZ68.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRa4R7vv.js → index-DcjouIsi.js} +1 -1
- package/src/assets/web-panel/assets/{index--nrQmk8X.js → index-DdC0OsNh.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-LPpwe9.js → index-DruABY-g.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dej4AGOz.js → index-Dssnz_1x.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7Jo20JB.js → index-DtSzmzFF.js} +1 -1
- package/src/assets/web-panel/assets/{index-42PTBO7a.js → index-DwIEfKo7.js} +1 -1
- package/src/assets/web-panel/assets/{index-Czo_hw97.js → index-EM4_wLPi.js} +1 -1
- package/src/assets/web-panel/assets/{index-DbVUA5l3.js → index-IFEbaISP.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9U9SjcT.js → index-KIoJ2eCK.js} +1 -1
- package/src/assets/web-panel/assets/{index-_0bfDTDu.js → index-Mxj-qi1G.js} +1 -1
- package/src/assets/web-panel/assets/index-ZMf_BGlO.js +1 -0
- package/src/assets/web-panel/assets/index-jvp8bJBF.js +1 -0
- package/src/assets/web-panel/assets/{index-GpvWtvw3.js → index-rU6_An6N.js} +1 -1
- package/src/assets/web-panel/assets/{index-xfS_WO9b.js → index-rVEqWa0_.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-B-wqiSu7.js → initDefaultProps-Dl0wiMxn.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BK4_B4MD.js → motion-BFmZYrGO.js} +1 -1
- package/src/assets/web-panel/assets/{move-BU2TgDDO.js → move-Cjs64yWq.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DA3E4_EX.js → mtc-parser-NeQsnBuP.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CaHz1e_q.js → omit-4Rs-rfs9.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-NXZ19amf.js → pickAttrs-CUhx2rDY.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BCXI9AHO.js → placementArrow-DbIM_OB2.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DdlZ9tLk.js → responsiveObserve-B_TGx9AN.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DCZm_Vc4.js → slide-C46cEP5t.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CuEULKQr.js → statusUtils-DqeksICX.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Bo_UXG8x.js → styleChecker-2rrypo5u.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-B9PaTcFH.js → useFlexGapSupport-RRe1Edsg.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DwSTGdVR.js → useFs-CB0oxU1U.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-FswSxnDC.js → usePersonalDataHub-B98WdlUE.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-EUztvYTj.js → vnode-CY8AoD95.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-D41MAgV-.js → zoom-BnT-0MbP.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/eval.js +3 -54
- package/src/data/changelog.json +13 -0
- package/src/lib/eval/stream-terminal.js +51 -0
- package/src/lib/eval/verify01-execution.js +7 -1
- package/src/lib/eval/verify01-host-evidence.js +604 -0
- package/src/assets/web-panel/assets/EmailListRenderer-CtIZ3ZHd.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-D-CY--Sb.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-ZJBoyJ16.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-CegM7hT6.js +0 -7
- package/src/assets/web-panel/assets/Skills-dOaD4Ztl.js +0 -1
- package/src/assets/web-panel/assets/Tasks-D_SzNTLi.js +0 -1
- package/src/assets/web-panel/assets/devWarning-Dcc8pILJ.js +0 -1
- package/src/assets/web-panel/assets/index-05NB95_V.js +0 -1
- package/src/assets/web-panel/assets/index-Cb6q8wlI.js +0 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Parse raw agent NDJSON. A declaration of success is never terminal evidence. */
|
|
2
|
+
export function verifyAgentTerminal(output) {
|
|
3
|
+
try {
|
|
4
|
+
const events = output
|
|
5
|
+
.split(/\r?\n/u)
|
|
6
|
+
.filter((line) => line.trim())
|
|
7
|
+
.map((line) => JSON.parse(line));
|
|
8
|
+
const results = events.filter((event) => event?.type === "result");
|
|
9
|
+
const terminal = results[0];
|
|
10
|
+
const usage = terminal?.usage;
|
|
11
|
+
const normalizedUsage =
|
|
12
|
+
usage &&
|
|
13
|
+
[
|
|
14
|
+
usage.input_tokens,
|
|
15
|
+
usage.output_tokens,
|
|
16
|
+
usage.cache_read_input_tokens,
|
|
17
|
+
usage.cache_creation_input_tokens,
|
|
18
|
+
].every((value) => Number.isSafeInteger(value) && value >= 0)
|
|
19
|
+
? {
|
|
20
|
+
inputTokens: usage.input_tokens,
|
|
21
|
+
outputTokens: usage.output_tokens,
|
|
22
|
+
cacheReadInputTokens: usage.cache_read_input_tokens,
|
|
23
|
+
cacheCreationInputTokens: usage.cache_creation_input_tokens,
|
|
24
|
+
}
|
|
25
|
+
: null;
|
|
26
|
+
return {
|
|
27
|
+
terminalVerified:
|
|
28
|
+
results.length === 1 &&
|
|
29
|
+
events.at(-1) === terminal &&
|
|
30
|
+
terminal.subtype === "success" &&
|
|
31
|
+
terminal.is_error === false &&
|
|
32
|
+
!events.some((event) => event?.type === "error"),
|
|
33
|
+
observedFallback: events.some((event) =>
|
|
34
|
+
["provider_fallback", "model_fallback"].includes(event?.subtype),
|
|
35
|
+
),
|
|
36
|
+
usage: normalizedUsage,
|
|
37
|
+
totalCostUsd:
|
|
38
|
+
Number.isFinite(terminal?.total_cost_usd) &&
|
|
39
|
+
terminal.total_cost_usd >= 0
|
|
40
|
+
? terminal.total_cost_usd
|
|
41
|
+
: null,
|
|
42
|
+
};
|
|
43
|
+
} catch {
|
|
44
|
+
return {
|
|
45
|
+
terminalVerified: false,
|
|
46
|
+
observedFallback: null,
|
|
47
|
+
usage: null,
|
|
48
|
+
totalCostUsd: null,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -328,7 +328,13 @@ function reviewedProcess(bytes, directory, reviewRoot, kind, timeout) {
|
|
|
328
328
|
// operator code; their digest is not an independent-review attestation.
|
|
329
329
|
const result = executionBroker.spawnSync(
|
|
330
330
|
process.execPath,
|
|
331
|
-
[
|
|
331
|
+
[
|
|
332
|
+
"--input-type=module",
|
|
333
|
+
"--eval",
|
|
334
|
+
bytes.toString("utf8"),
|
|
335
|
+
directory,
|
|
336
|
+
String(Date.now() + timeout),
|
|
337
|
+
],
|
|
332
338
|
{
|
|
333
339
|
cwd: reviewRoot,
|
|
334
340
|
encoding: "utf8",
|
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createEvalHistoryRecord,
|
|
3
|
+
evalDigest,
|
|
4
|
+
EVAL_EXECUTION_PROTOCOL,
|
|
5
|
+
} from "./evidence.js";
|
|
6
|
+
import { outcomeDigest } from "./outcomes.js";
|
|
7
|
+
import { verifyAgentTerminal } from "./stream-terminal.js";
|
|
8
|
+
import {
|
|
9
|
+
relativeFile,
|
|
10
|
+
requireValue,
|
|
11
|
+
validateVerify01Review,
|
|
12
|
+
validateVerify01Collection,
|
|
13
|
+
} from "./verify01-contracts.js";
|
|
14
|
+
|
|
15
|
+
const HOST_SCHEMA = "chainlesschain.verify01-host-capture/v1";
|
|
16
|
+
const RECORD_SCHEMA = "chainlesschain.ide-protocol-record/v1";
|
|
17
|
+
const STAGES = ["install", "configure", "authenticate", "tool", "artifact"];
|
|
18
|
+
const epoch = (value) => Date.parse(value);
|
|
19
|
+
const count = (value) => Number.isSafeInteger(value) && value >= 0;
|
|
20
|
+
|
|
21
|
+
function artifact(descriptor, readArtifact) {
|
|
22
|
+
relativeFile(descriptor?.path);
|
|
23
|
+
const bytes = readArtifact(descriptor.path);
|
|
24
|
+
requireValue(
|
|
25
|
+
Buffer.isBuffer(bytes) &&
|
|
26
|
+
bytes.length <= 16 * 1024 * 1024 &&
|
|
27
|
+
evalDigest(bytes) === descriptor.digest,
|
|
28
|
+
"host artifact digest mismatch or size limit exceeded",
|
|
29
|
+
);
|
|
30
|
+
return bytes;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** One freshly started IDE session per task. Sequence gaps, interleaved user
|
|
34
|
+
* turns, stale receipts and undrained exits remain unverified, never replayed.
|
|
35
|
+
*/
|
|
36
|
+
export function inspectIdeProtocol(records, { prompt, comparison } = {}) {
|
|
37
|
+
requireValue(
|
|
38
|
+
Array.isArray(records) && records.length >= 4,
|
|
39
|
+
"IDE protocol capture is incomplete",
|
|
40
|
+
);
|
|
41
|
+
const generation = records[0]?.generation;
|
|
42
|
+
let previousTime = -Infinity;
|
|
43
|
+
for (const [index, record] of records.entries()) {
|
|
44
|
+
const at = epoch(record?.at);
|
|
45
|
+
requireValue(
|
|
46
|
+
record?.schema === RECORD_SCHEMA &&
|
|
47
|
+
typeof generation === "string" &&
|
|
48
|
+
generation.length > 0 &&
|
|
49
|
+
record.generation === generation &&
|
|
50
|
+
record.sequence === index + 1 &&
|
|
51
|
+
Number.isFinite(at) &&
|
|
52
|
+
at >= previousTime &&
|
|
53
|
+
["input", "output", "exit"].includes(record.direction) &&
|
|
54
|
+
record.event &&
|
|
55
|
+
typeof record.event === "object",
|
|
56
|
+
"IDE protocol generation, sequence or timestamp is inconsistent",
|
|
57
|
+
);
|
|
58
|
+
previousTime = at;
|
|
59
|
+
}
|
|
60
|
+
const exits = records.filter((record) => record.direction === "exit");
|
|
61
|
+
requireValue(
|
|
62
|
+
exits.length === 1 &&
|
|
63
|
+
records.at(-1) === exits[0] &&
|
|
64
|
+
exits[0].event.stdoutDrained === true &&
|
|
65
|
+
Number.isInteger(exits[0].event.code),
|
|
66
|
+
"IDE capture lacks a drained process exit",
|
|
67
|
+
);
|
|
68
|
+
const inputs = records.filter((record) => record.direction === "input");
|
|
69
|
+
// Control or second-turn input makes correlation ambiguous because older
|
|
70
|
+
// result envelopes do not echo client_message_id. Use a fresh session.
|
|
71
|
+
requireValue(
|
|
72
|
+
inputs.length === 1 &&
|
|
73
|
+
inputs[0].event.type === "user" &&
|
|
74
|
+
inputs[0].event.text === prompt &&
|
|
75
|
+
typeof inputs[0].event.client_message_id === "string" &&
|
|
76
|
+
inputs[0].event.client_message_id.length > 0,
|
|
77
|
+
"IDE sample requires exactly its frozen user prompt and client identity",
|
|
78
|
+
);
|
|
79
|
+
requireValue(
|
|
80
|
+
inputs[0].event.llm == null &&
|
|
81
|
+
inputs[0].event.worklog_session_id == null &&
|
|
82
|
+
(inputs[0].event.images === undefined ||
|
|
83
|
+
(Array.isArray(inputs[0].event.images) &&
|
|
84
|
+
inputs[0].event.images.length === 0)),
|
|
85
|
+
"frozen IDE sample cannot add per-turn model overrides, historical context or attachments",
|
|
86
|
+
);
|
|
87
|
+
const outputs = records.filter((record) => record.direction === "output");
|
|
88
|
+
const initializations = outputs.filter(
|
|
89
|
+
(record) =>
|
|
90
|
+
record.event.type === "system" && record.event.subtype === "init",
|
|
91
|
+
);
|
|
92
|
+
requireValue(
|
|
93
|
+
initializations.length === 1,
|
|
94
|
+
"IDE sample requires one actual initialization",
|
|
95
|
+
);
|
|
96
|
+
const init = initializations[0];
|
|
97
|
+
requireValue(
|
|
98
|
+
init.sequence < inputs[0].sequence &&
|
|
99
|
+
init.event.model === comparison.model &&
|
|
100
|
+
init.event.provider === comparison.provider &&
|
|
101
|
+
init.event.permission_mode === comparison.permissionMode &&
|
|
102
|
+
typeof init.event.session_id === "string" &&
|
|
103
|
+
init.event.session_id.length > 0,
|
|
104
|
+
"actual IDE initialization differs from the frozen provider/model/mode",
|
|
105
|
+
);
|
|
106
|
+
const sessionId = init.event.session_id;
|
|
107
|
+
requireValue(
|
|
108
|
+
outputs.every(
|
|
109
|
+
(record) =>
|
|
110
|
+
!record.event.session_id || record.event.session_id === sessionId,
|
|
111
|
+
),
|
|
112
|
+
"IDE capture contains a foreign session",
|
|
113
|
+
);
|
|
114
|
+
const accepted = outputs.filter(
|
|
115
|
+
(record) =>
|
|
116
|
+
record.event.type === "system" &&
|
|
117
|
+
record.event.subtype === "input_accepted",
|
|
118
|
+
);
|
|
119
|
+
requireValue(
|
|
120
|
+
init.event.input_receipts?.version === 1 &&
|
|
121
|
+
accepted.length === 1 &&
|
|
122
|
+
accepted[0].sequence > inputs[0].sequence &&
|
|
123
|
+
accepted[0].event.client_message_id ===
|
|
124
|
+
inputs[0].event.client_message_id &&
|
|
125
|
+
accepted[0].event.receipt?.duplicate === false &&
|
|
126
|
+
accepted[0].event.receipt?.sessionId === sessionId &&
|
|
127
|
+
accepted[0].event.receipt?.clientMessageId ===
|
|
128
|
+
inputs[0].event.client_message_id &&
|
|
129
|
+
/^[a-f0-9]{64}$/u.test(accepted[0].event.receipt?.eventHash || "") &&
|
|
130
|
+
accepted[0].event.receipt?.inputDigest ===
|
|
131
|
+
evalDigest(
|
|
132
|
+
Buffer.from(
|
|
133
|
+
JSON.stringify({
|
|
134
|
+
text: prompt,
|
|
135
|
+
images: [],
|
|
136
|
+
llm: null,
|
|
137
|
+
worklogSessionId: null,
|
|
138
|
+
}),
|
|
139
|
+
),
|
|
140
|
+
).slice(7),
|
|
141
|
+
"IDE input acceptance is missing, stale or duplicated",
|
|
142
|
+
);
|
|
143
|
+
const resultRecords = outputs.filter(
|
|
144
|
+
(record) => record.event.type === "result",
|
|
145
|
+
);
|
|
146
|
+
requireValue(
|
|
147
|
+
resultRecords.length === 1 &&
|
|
148
|
+
resultRecords[0].sequence > accepted[0].sequence &&
|
|
149
|
+
resultRecords[0].event.session_id === sessionId,
|
|
150
|
+
"IDE terminal is missing or ambiguous",
|
|
151
|
+
);
|
|
152
|
+
const parsed = verifyAgentTerminal(
|
|
153
|
+
outputs.map((record) => JSON.stringify(record.event)).join("\n"),
|
|
154
|
+
);
|
|
155
|
+
const terminal = resultRecords[0].event;
|
|
156
|
+
// A complete explicit failure is an observation. It never becomes success.
|
|
157
|
+
const knownFailure =
|
|
158
|
+
outputs.at(-1) === resultRecords[0] &&
|
|
159
|
+
terminal.is_error === true &&
|
|
160
|
+
typeof terminal.subtype === "string" &&
|
|
161
|
+
terminal.subtype.length > 0 &&
|
|
162
|
+
terminal.subtype !== "success";
|
|
163
|
+
const exit = exits[0].event;
|
|
164
|
+
const succeeded =
|
|
165
|
+
parsed.terminalVerified &&
|
|
166
|
+
exit.code === 0 &&
|
|
167
|
+
(exit.signal ?? null) === null;
|
|
168
|
+
return {
|
|
169
|
+
...parsed,
|
|
170
|
+
generation,
|
|
171
|
+
sessionId,
|
|
172
|
+
result:
|
|
173
|
+
knownFailure && typeof terminal.error === "string"
|
|
174
|
+
? terminal.error
|
|
175
|
+
: terminal.result,
|
|
176
|
+
terminalFailure: knownFailure,
|
|
177
|
+
startedAt: records[0].at,
|
|
178
|
+
inputAt: inputs[0].at,
|
|
179
|
+
terminalAt: resultRecords[0].at,
|
|
180
|
+
finishedAt: exits[0].at,
|
|
181
|
+
elapsedMs: epoch(exits[0].at) - epoch(records[0].at),
|
|
182
|
+
executionSucceeded: succeeded,
|
|
183
|
+
executionEvidence: {
|
|
184
|
+
protocol: EVAL_EXECUTION_PROTOCOL,
|
|
185
|
+
exitCode: exit.code,
|
|
186
|
+
signal: exit.signal ?? null,
|
|
187
|
+
terminalVerified: parsed.terminalVerified || knownFailure,
|
|
188
|
+
observedFallback: parsed.observedFallback,
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function capturedDiff(changes, allowed, declaredChangedFiles) {
|
|
194
|
+
requireValue(Array.isArray(changes), "captured full diff must be an array");
|
|
195
|
+
const paths = new Set();
|
|
196
|
+
for (const change of changes) {
|
|
197
|
+
const file = relativeFile(change?.path);
|
|
198
|
+
requireValue(
|
|
199
|
+
!paths.has(file) && allowed.includes(file),
|
|
200
|
+
"full diff has a duplicate or unreviewed path",
|
|
201
|
+
);
|
|
202
|
+
paths.add(file);
|
|
203
|
+
requireValue(
|
|
204
|
+
change.before || change.after,
|
|
205
|
+
"full diff cannot contain an empty change",
|
|
206
|
+
);
|
|
207
|
+
for (const side of [change.before, change.after]) {
|
|
208
|
+
if (side === null) continue;
|
|
209
|
+
requireValue(
|
|
210
|
+
side?.type === "file" &&
|
|
211
|
+
side.dependency === false &&
|
|
212
|
+
count(side.mode) &&
|
|
213
|
+
side.mode <= 0o777 &&
|
|
214
|
+
count(side.bytes) &&
|
|
215
|
+
typeof side.bytesBase64 === "string",
|
|
216
|
+
"full diff is incomplete or contains a link/dependency",
|
|
217
|
+
);
|
|
218
|
+
const bytes = Buffer.from(side.bytesBase64, "base64");
|
|
219
|
+
requireValue(
|
|
220
|
+
bytes.toString("base64") === side.bytesBase64 &&
|
|
221
|
+
bytes.length === side.bytes &&
|
|
222
|
+
evalDigest(bytes) === side.digest,
|
|
223
|
+
"captured diff body, byte length or digest differs",
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
requireValue(
|
|
227
|
+
change.before?.digest !== change.after?.digest ||
|
|
228
|
+
change.before?.mode !== change.after?.mode,
|
|
229
|
+
"full diff falsely declares an unchanged file",
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
requireValue(
|
|
233
|
+
paths.size === declaredChangedFiles.length &&
|
|
234
|
+
declaredChangedFiles.every((file) => paths.has(file)),
|
|
235
|
+
"full diff differs from the declared changed-file inventory",
|
|
236
|
+
);
|
|
237
|
+
return changes;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function validateUi(actions, protocol, sampleId, observedAt, elapsedMs) {
|
|
241
|
+
const required = [
|
|
242
|
+
"submit",
|
|
243
|
+
"background-tab",
|
|
244
|
+
"return-tab",
|
|
245
|
+
"final-result",
|
|
246
|
+
"reload",
|
|
247
|
+
"restored-result",
|
|
248
|
+
];
|
|
249
|
+
requireValue(
|
|
250
|
+
Array.isArray(actions) &&
|
|
251
|
+
(protocol.terminalFailure
|
|
252
|
+
? actions.length > 0 && actions.length <= required.length
|
|
253
|
+
: actions.length === required.length),
|
|
254
|
+
"actual IDE tab/reload journey is incomplete",
|
|
255
|
+
);
|
|
256
|
+
// Submission may be what starts a cold session, before its first init event.
|
|
257
|
+
let previous = epoch(observedAt) - elapsedMs;
|
|
258
|
+
for (const [index, action] of actions.entries()) {
|
|
259
|
+
const at = epoch(action.at);
|
|
260
|
+
requireValue(
|
|
261
|
+
action.action === required[index] &&
|
|
262
|
+
action.sampleId === sampleId &&
|
|
263
|
+
action.sessionId === protocol.sessionId &&
|
|
264
|
+
Number.isFinite(at) &&
|
|
265
|
+
at >= previous &&
|
|
266
|
+
at <= epoch(observedAt),
|
|
267
|
+
"IDE UI action order, session or time differs",
|
|
268
|
+
);
|
|
269
|
+
previous = at;
|
|
270
|
+
if (action.action === "submit")
|
|
271
|
+
requireValue(
|
|
272
|
+
at <= epoch(protocol.inputAt),
|
|
273
|
+
"UI submission follows the protocol input",
|
|
274
|
+
);
|
|
275
|
+
if (["final-result", "restored-result"].includes(action.action))
|
|
276
|
+
requireValue(
|
|
277
|
+
at >= epoch(protocol.terminalAt) &&
|
|
278
|
+
typeof protocol.result === "string" &&
|
|
279
|
+
action.resultDigest === evalDigest(Buffer.from(protocol.result)),
|
|
280
|
+
"IDE visible/restored result differs from the actual terminal",
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/** Import existing captured artifacts into the established Eval/outcome schema.
|
|
286
|
+
* Byte bindings and raw terminals are checked, but local declarations cannot
|
|
287
|
+
* attest a marketplace install, machine identity, provider account or billing.
|
|
288
|
+
*/
|
|
289
|
+
export function importVerify01HostCapture(
|
|
290
|
+
bundle,
|
|
291
|
+
preparation,
|
|
292
|
+
{
|
|
293
|
+
manifest,
|
|
294
|
+
expectedManifestDigest,
|
|
295
|
+
readArtifact,
|
|
296
|
+
sourceCommit,
|
|
297
|
+
now = Date.now(),
|
|
298
|
+
},
|
|
299
|
+
) {
|
|
300
|
+
const { samples, tasks, reviewed } = validateVerify01Review(
|
|
301
|
+
bundle,
|
|
302
|
+
preparation,
|
|
303
|
+
);
|
|
304
|
+
requireValue(
|
|
305
|
+
manifest?.schema === HOST_SCHEMA &&
|
|
306
|
+
outcomeDigest(manifest) === expectedManifestDigest,
|
|
307
|
+
"externally pinned host capture digest mismatch",
|
|
308
|
+
);
|
|
309
|
+
const sample = samples.get(manifest.sampleId);
|
|
310
|
+
requireValue(
|
|
311
|
+
sample &&
|
|
312
|
+
manifest.planDigest === bundle.expectedPlanDigest &&
|
|
313
|
+
manifest.reviewDigest === preparation.expectedReviewDigest &&
|
|
314
|
+
manifest.projectCommit === bundle.catalog.projectCommit &&
|
|
315
|
+
manifest.sourceCommit === sourceCommit,
|
|
316
|
+
"host capture frozen/source/review identity differs",
|
|
317
|
+
);
|
|
318
|
+
const target = bundle.bindings.matrix.find((entry) =>
|
|
319
|
+
sample.stratum.startsWith(`${entry.id}-`),
|
|
320
|
+
);
|
|
321
|
+
requireValue(
|
|
322
|
+
target &&
|
|
323
|
+
manifest.entry === target.entry &&
|
|
324
|
+
manifest.platform === target.platform &&
|
|
325
|
+
manifest.arch === target.arch &&
|
|
326
|
+
manifest.node === target.node &&
|
|
327
|
+
manifest.host === target.host &&
|
|
328
|
+
manifest.os === target.os,
|
|
329
|
+
"actual host/runtime declaration differs from frozen matrix; CLI cannot impersonate an IDE",
|
|
330
|
+
);
|
|
331
|
+
requireValue(
|
|
332
|
+
sample.kind === "first-run" ||
|
|
333
|
+
["vscode", "jetbrains"].includes(manifest.entry),
|
|
334
|
+
"ordinary CLI tasks use the frozen CLI executor",
|
|
335
|
+
);
|
|
336
|
+
requireValue(
|
|
337
|
+
count(manifest.retries) &&
|
|
338
|
+
manifest.retries <= 1 &&
|
|
339
|
+
count(manifest.manualRepairs),
|
|
340
|
+
"invalid retry or repair count",
|
|
341
|
+
);
|
|
342
|
+
const comparison = bundle.bindings.comparisons[sample.stratum];
|
|
343
|
+
const task = tasks.get(sample.taskId);
|
|
344
|
+
const observation = {
|
|
345
|
+
sampleId: sample.id,
|
|
346
|
+
runId: null,
|
|
347
|
+
observedAt: manifest.observedAt,
|
|
348
|
+
cost: null,
|
|
349
|
+
elapsedMs: manifest.elapsedMs,
|
|
350
|
+
retries: manifest.retries,
|
|
351
|
+
manualRepairs: manifest.manualRepairs,
|
|
352
|
+
failureCause: manifest.failureCause ?? "unknown",
|
|
353
|
+
};
|
|
354
|
+
const receiptDigests = [];
|
|
355
|
+
if (sample.kind === "first-run") {
|
|
356
|
+
requireValue(
|
|
357
|
+
typeof manifest.firstRun?.cleanEnvironment === "boolean",
|
|
358
|
+
"fresh profile evidence declaration is required",
|
|
359
|
+
);
|
|
360
|
+
observation.firstRun = {
|
|
361
|
+
cleanEnvironment: manifest.firstRun.cleanEnvironment,
|
|
362
|
+
stages: {},
|
|
363
|
+
};
|
|
364
|
+
let stopped = false;
|
|
365
|
+
for (const stage of STAGES) {
|
|
366
|
+
const entry = manifest.firstRun.stages?.[stage];
|
|
367
|
+
requireValue(
|
|
368
|
+
typeof entry?.passed === "boolean" &&
|
|
369
|
+
(!stopped || entry.passed === false),
|
|
370
|
+
"first-install stages cannot succeed after a failed prerequisite",
|
|
371
|
+
);
|
|
372
|
+
const bytes = artifact(entry.receipt, readArtifact);
|
|
373
|
+
requireValue(
|
|
374
|
+
bytes.length > 0,
|
|
375
|
+
"first-install stage receipt cannot be empty",
|
|
376
|
+
);
|
|
377
|
+
observation.firstRun.stages[stage] = {
|
|
378
|
+
passed: entry.passed,
|
|
379
|
+
receipt: entry.receipt.digest,
|
|
380
|
+
};
|
|
381
|
+
receiptDigests.push(entry.receipt.digest);
|
|
382
|
+
stopped ||= !entry.passed;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
const earlyStop =
|
|
386
|
+
sample.kind === "first-run" &&
|
|
387
|
+
observation.firstRun.stages.tool.passed === false;
|
|
388
|
+
let run = null;
|
|
389
|
+
if (earlyStop) {
|
|
390
|
+
requireValue(
|
|
391
|
+
!manifest.protocol &&
|
|
392
|
+
!manifest.stream &&
|
|
393
|
+
!manifest.check &&
|
|
394
|
+
!manifest.ui &&
|
|
395
|
+
!manifest.exit &&
|
|
396
|
+
!manifest.diff &&
|
|
397
|
+
!manifest.invocation,
|
|
398
|
+
"first-install early stop cannot claim a task terminal or artifact check",
|
|
399
|
+
);
|
|
400
|
+
requireValue(
|
|
401
|
+
manifest.cost === null ||
|
|
402
|
+
(Number.isFinite(manifest.cost) && manifest.cost >= 0),
|
|
403
|
+
"invalid early-stop cost declaration",
|
|
404
|
+
);
|
|
405
|
+
observation.cost = manifest.cost;
|
|
406
|
+
} else {
|
|
407
|
+
requireValue(
|
|
408
|
+
typeof manifest.runId === "string" && manifest.runId.trim().length > 0,
|
|
409
|
+
"completed host capture requires its actual run identity",
|
|
410
|
+
);
|
|
411
|
+
let protocol;
|
|
412
|
+
if (manifest.entry === "cli") {
|
|
413
|
+
const raw = artifact(manifest.stream, readArtifact).toString("utf8");
|
|
414
|
+
const parsed = verifyAgentTerminal(raw);
|
|
415
|
+
const exit = JSON.parse(
|
|
416
|
+
artifact(manifest.exit, readArtifact).toString("utf8"),
|
|
417
|
+
);
|
|
418
|
+
requireValue(
|
|
419
|
+
Number.isInteger(exit.code) &&
|
|
420
|
+
(exit.signal === null || typeof exit.signal === "string"),
|
|
421
|
+
"invalid CLI exit capture",
|
|
422
|
+
);
|
|
423
|
+
const invocation = JSON.parse(
|
|
424
|
+
artifact(manifest.invocation, readArtifact).toString("utf8"),
|
|
425
|
+
);
|
|
426
|
+
requireValue(
|
|
427
|
+
invocation.taskId === task.id &&
|
|
428
|
+
invocation.prompt === task.prompt &&
|
|
429
|
+
invocation.provider === comparison.provider &&
|
|
430
|
+
invocation.model === comparison.model &&
|
|
431
|
+
invocation.permissionMode === comparison.permissionMode &&
|
|
432
|
+
invocation.projectCommit === bundle.catalog.projectCommit &&
|
|
433
|
+
invocation.sourceCommit === sourceCommit &&
|
|
434
|
+
Number.isFinite(epoch(invocation.startedAt)) &&
|
|
435
|
+
Number.isFinite(epoch(exit.finishedAt)) &&
|
|
436
|
+
epoch(exit.finishedAt) >= epoch(invocation.startedAt),
|
|
437
|
+
"CLI first-run invocation differs from the frozen task or runtime identity",
|
|
438
|
+
);
|
|
439
|
+
// CLI first-run capture still needs the actual init identity.
|
|
440
|
+
const events = raw
|
|
441
|
+
.split(/\r?\n/u)
|
|
442
|
+
.filter((line) => line.trim())
|
|
443
|
+
.map((line) => JSON.parse(line));
|
|
444
|
+
const inits = events.filter(
|
|
445
|
+
(event) => event.type === "system" && event.subtype === "init",
|
|
446
|
+
);
|
|
447
|
+
const init = inits[0];
|
|
448
|
+
requireValue(
|
|
449
|
+
inits.length === 1 &&
|
|
450
|
+
typeof init.session_id === "string" &&
|
|
451
|
+
init.session_id.length > 0 &&
|
|
452
|
+
init?.provider === comparison.provider &&
|
|
453
|
+
init?.model === comparison.model &&
|
|
454
|
+
init?.permission_mode === comparison.permissionMode &&
|
|
455
|
+
events.every(
|
|
456
|
+
(event) =>
|
|
457
|
+
!event.session_id || event.session_id === init.session_id,
|
|
458
|
+
),
|
|
459
|
+
"CLI first-run initialized a different model, mode or session",
|
|
460
|
+
);
|
|
461
|
+
const terminals = events.filter((event) => event.type === "result");
|
|
462
|
+
const terminal = terminals[0];
|
|
463
|
+
const knownFailure =
|
|
464
|
+
terminals.length === 1 &&
|
|
465
|
+
events.at(-1) === terminal &&
|
|
466
|
+
terminal.is_error === true &&
|
|
467
|
+
typeof terminal.subtype === "string" &&
|
|
468
|
+
terminal.subtype.length > 0 &&
|
|
469
|
+
terminal.subtype !== "success";
|
|
470
|
+
protocol = {
|
|
471
|
+
...parsed,
|
|
472
|
+
executionSucceeded:
|
|
473
|
+
parsed.terminalVerified && exit.code === 0 && exit.signal === null,
|
|
474
|
+
executionEvidence: {
|
|
475
|
+
protocol: EVAL_EXECUTION_PROTOCOL,
|
|
476
|
+
exitCode: exit.code,
|
|
477
|
+
signal: exit.signal,
|
|
478
|
+
terminalVerified: parsed.terminalVerified || knownFailure,
|
|
479
|
+
observedFallback: parsed.observedFallback,
|
|
480
|
+
},
|
|
481
|
+
startedAt: invocation.startedAt,
|
|
482
|
+
elapsedMs: epoch(exit.finishedAt) - epoch(invocation.startedAt),
|
|
483
|
+
};
|
|
484
|
+
} else {
|
|
485
|
+
protocol = inspectIdeProtocol(
|
|
486
|
+
JSON.parse(artifact(manifest.protocol, readArtifact).toString("utf8")),
|
|
487
|
+
{
|
|
488
|
+
prompt: task.prompt,
|
|
489
|
+
comparison,
|
|
490
|
+
},
|
|
491
|
+
);
|
|
492
|
+
validateUi(
|
|
493
|
+
JSON.parse(artifact(manifest.ui, readArtifact).toString("utf8")),
|
|
494
|
+
protocol,
|
|
495
|
+
sample.id,
|
|
496
|
+
manifest.observedAt,
|
|
497
|
+
manifest.elapsedMs,
|
|
498
|
+
);
|
|
499
|
+
}
|
|
500
|
+
const check = JSON.parse(
|
|
501
|
+
artifact(manifest.check, readArtifact).toString("utf8"),
|
|
502
|
+
);
|
|
503
|
+
requireValue(
|
|
504
|
+
check.taskId === task.id &&
|
|
505
|
+
check.reviewDigest === preparation.expectedReviewDigest &&
|
|
506
|
+
typeof check.pass === "boolean" &&
|
|
507
|
+
Array.isArray(check.changedFiles) &&
|
|
508
|
+
Array.isArray(check.unrelatedChanges) &&
|
|
509
|
+
check.unrelatedChanges.length === 0 &&
|
|
510
|
+
check.changedFiles.every((file) =>
|
|
511
|
+
reviewed
|
|
512
|
+
.get(task.id)
|
|
513
|
+
.allowedChangedPaths.includes(relativeFile(file)),
|
|
514
|
+
),
|
|
515
|
+
"independent artifact check is unbound or contains unreviewed edits",
|
|
516
|
+
);
|
|
517
|
+
requireValue(
|
|
518
|
+
!check.pass ||
|
|
519
|
+
task.expectedFiles.every((file) => check.changedFiles.includes(file)),
|
|
520
|
+
"independent check omits required deliverables",
|
|
521
|
+
);
|
|
522
|
+
requireValue(
|
|
523
|
+
check.process?.sourceDigest === reviewed.get(task.id).check.digest &&
|
|
524
|
+
check.process.exitCode === 0 &&
|
|
525
|
+
check.process.signal === null &&
|
|
526
|
+
check.process.error === null,
|
|
527
|
+
"independent artifact check lacks its pinned process receipt",
|
|
528
|
+
);
|
|
529
|
+
const verdict = JSON.parse(check.process.stdout);
|
|
530
|
+
requireValue(
|
|
531
|
+
verdict.pass === check.pass && typeof verdict.detail === "string",
|
|
532
|
+
"check verdict differs from raw process output",
|
|
533
|
+
);
|
|
534
|
+
capturedDiff(
|
|
535
|
+
JSON.parse(artifact(manifest.diff, readArtifact).toString("utf8")),
|
|
536
|
+
reviewed.get(task.id).allowedChangedPaths,
|
|
537
|
+
check.changedFiles,
|
|
538
|
+
);
|
|
539
|
+
requireValue(
|
|
540
|
+
manifest.elapsedMs >= protocol.elapsedMs &&
|
|
541
|
+
epoch(manifest.observedAt) >=
|
|
542
|
+
epoch(protocol.startedAt) + protocol.elapsedMs,
|
|
543
|
+
"host observation precedes protocol completion",
|
|
544
|
+
);
|
|
545
|
+
const result = {
|
|
546
|
+
id: task.id,
|
|
547
|
+
artifactCheckPassed: check.pass,
|
|
548
|
+
executionSucceeded: protocol.executionSucceeded,
|
|
549
|
+
agentOk: protocol.executionSucceeded,
|
|
550
|
+
pass: check.pass && protocol.executionSucceeded,
|
|
551
|
+
error: protocol.executionSucceeded
|
|
552
|
+
? null
|
|
553
|
+
: "captured agent execution did not succeed",
|
|
554
|
+
detail: String(
|
|
555
|
+
check.detail || "Captured independent artifact acceptance",
|
|
556
|
+
),
|
|
557
|
+
ms: protocol.elapsedMs,
|
|
558
|
+
usage: protocol.usage,
|
|
559
|
+
totalCostUsd: protocol.totalCostUsd,
|
|
560
|
+
executionEvidence: protocol.executionEvidence,
|
|
561
|
+
changedFiles: check.changedFiles,
|
|
562
|
+
unrelatedChanges: check.unrelatedChanges,
|
|
563
|
+
};
|
|
564
|
+
run = createEvalHistoryRecord(
|
|
565
|
+
{
|
|
566
|
+
results: [result],
|
|
567
|
+
passed: result.pass ? 1 : 0,
|
|
568
|
+
failed: result.pass ? 0 : 1,
|
|
569
|
+
total: 1,
|
|
570
|
+
passRate: result.pass ? 1 : 0,
|
|
571
|
+
unrelatedChangeRate: 0,
|
|
572
|
+
},
|
|
573
|
+
{
|
|
574
|
+
comparison,
|
|
575
|
+
runId: manifest.runId,
|
|
576
|
+
ranAt: protocol.startedAt,
|
|
577
|
+
label: sourceCommit,
|
|
578
|
+
},
|
|
579
|
+
);
|
|
580
|
+
observation.runId = run.runId;
|
|
581
|
+
observation.cost = protocol.totalCostUsd;
|
|
582
|
+
}
|
|
583
|
+
const history = { runs: run ? [run] : [], issues: [] };
|
|
584
|
+
const observations = [observation];
|
|
585
|
+
const report = validateVerify01Collection(bundle, preparation, {
|
|
586
|
+
sampleIds: [sample.id],
|
|
587
|
+
history,
|
|
588
|
+
observations,
|
|
589
|
+
sourceCommit,
|
|
590
|
+
now,
|
|
591
|
+
});
|
|
592
|
+
return {
|
|
593
|
+
scope: "verify01-existing-host-evidence-import",
|
|
594
|
+
productionAttested: false,
|
|
595
|
+
identityVerified: false,
|
|
596
|
+
installationVerified: false,
|
|
597
|
+
billingVerified: false,
|
|
598
|
+
captureDigest: expectedManifestDigest,
|
|
599
|
+
stageReceiptDigests: receiptDigests,
|
|
600
|
+
history,
|
|
601
|
+
observations,
|
|
602
|
+
report,
|
|
603
|
+
};
|
|
604
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as C,P as c,J as f,U as r,c as h,_ as k,R as n,V as l,K as d,Q as u,S as g,b as t}from"./vendor-Bn1JzzAn.js";import{_ as w}from"./index-DYKSuD02.js";import{aH as j}from"./icons-DG5UD-6K.js";const E={__name:"EmailListRenderer",props:{event:{type:Object,required:!0}},setup(_,{expose:m}){m();const a=_,e=t(()=>a.event.content||{}),i=t(()=>a.event.extra||{}),p=t(()=>e.value.from||e.value.sender||e.value.fromName||a.event.actor||"(未知发件人)"),s=t(()=>e.value.subject||e.value.title||"(无主题)"),y=t(()=>e.value.snippet||e.value.preview||e.value.body?.slice(0,100)||null),b=t(()=>Array.isArray(e.value.attachments)?e.value.attachments.length:typeof e.value.attachmentCount=="number"?e.value.attachmentCount:0),x=t(()=>i.value.category||e.value.category),S=t(()=>e.value.unread===!0),T=t(()=>{if(!a.event.occurredAt)return"";const o=new Date(a.event.occurredAt);return`${o.getFullYear()}-${String(o.getMonth()+1).padStart(2,"0")}-${String(o.getDate()).padStart(2,"0")} ${String(o.getHours()).padStart(2,"0")}:${String(o.getMinutes()).padStart(2,"0")}`}),v={props:a,c:e,e:i,fromText:p,subjectText:s,snippetText:y,attachmentCount:b,category:x,isUnread:S,formattedTime:T,computed:t,get MailOutlined(){return j}};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}},M={class:"email-row"},N={class:"left"},O={class:"body"},R={class:"head"},V={class:"from"},A={class:"time"},B={class:"subject"},D={key:0,class:"snippet"},L={class:"meta"};function U(_,m,a,e,i,p){const s=C("a-tag");return c(),f("div",M,[r("div",N,[h(e.MailOutlined,{class:k(["icon",{unread:e.isUnread}])},null,8,["class"])]),r("div",O,[r("div",R,[r("span",V,n(e.fromText),1),r("span",A,n(e.formattedTime),1)]),r("div",B,n(e.subjectText),1),e.snippetText?(c(),f("div",D,n(e.snippetText),1)):l("v-if",!0),r("div",L,[h(s,{color:"blue",class:"src"},{default:d(()=>[u(n(a.event.source.adapter),1)]),_:1}),e.attachmentCount>0?(c(),g(s,{key:0,color:"orange"},{default:d(()=>[u(" 📎 "+n(e.attachmentCount),1)]),_:1})):l("v-if",!0),e.category?(c(),g(s,{key:1},{default:d(()=>[u(n(e.category),1)]),_:1})):l("v-if",!0)])])])}const P=w(E,[["render",U],["__scopeId","data-v-e4ddf632"],["__file","/tmp/cc-web-panel-oQwzER/repo/packages/web-panel/src/components/pdh/renderers/EmailListRenderer.vue"]]);export{P as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as n,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as b}from"./vendor-Bn1JzzAn.js";import{_ as v,b as m}from"./index-DYKSuD02.js";import{a8 as y,M}from"./icons-DG5UD-6K.js";const B={__name:"MobileProjects",setup(p,{expose:i}){i();const c=u(),{t:e}=m();function a(){c.push("/projects")}function _(){c.push("/mobile-bridge")}const s={router:c,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return m},get MobileOutlined(){return M},get FolderOutlined(){return y}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},x={class:"mobile-projects-placeholder"},O={class:"title"},w={class:"subtitle"},k={class:"explainer"};function T(p,i,c,e,a,_){const s=n("a-alert"),d=n("a-button"),f=n("a-space"),P=n("a-empty"),j=n("a-card");return h(),g("div",x,[l(j,null,{default:r(()=>[l(P,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",w,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",k,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),b(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),b(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const N=v(B,[["render",T],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-oQwzER/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{N as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{I as h,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as o}from"./vendor-Bn1JzzAn.js";import{_ as S}from"./index-DYKSuD02.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const a=p,e=o(()=>a.event.content||{}),d=o(()=>a.event.extra||{}),m=o(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=o(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=o(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=o(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=o(()=>e.value.status||e.value.state),w=o(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),b=o(()=>{if(!a.event.occurredAt)return"";const t=new Date(a.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:a,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:w,formattedTime:b,computed:o};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},R={class:"row"},V={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},E={class:"val mono"},F={key:1,class:"row"};function M(p,r,a,e,d,m){const c=h("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(a.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(a.event.subtype),1)]),_:1})]),s("div",R,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",V,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",E,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",F,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const H=S(k,[["render",M],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-oQwzER/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{H as default};
|