From 051d00c5ecaf82853a0439d1f600698bc1d65df9 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 16 Jul 2026 09:46:42 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=85=BC=E5=AE=B9=E8=AF=84=E5=88=86?= =?UTF-8?q?=E6=B8=90=E8=BF=9B=E6=8A=AB=E9=9C=B2=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/account-score-service.ts | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/account-score-service.ts b/src/account-score-service.ts index 0434717..71e94c7 100644 --- a/src/account-score-service.ts +++ b/src/account-score-service.ts @@ -1,4 +1,4 @@ -import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs"; +import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; import type { AppConfig } from "./config"; @@ -79,14 +79,14 @@ export class AccountScoreService { this.snapshot = { ...this.snapshot, status: "refreshing", refreshStartedAt: startedAt.toISOString(), error: null }; try { const overview = await this.invoke(["--all-groups"]); - const groups = records(nested(overview, "data", "runtime", "allGroups", "groups")); + const groups = records(nested(overview, "data", "parsed", "allGroups", "groups")); const details = await pooled(groups, 2, async (group) => { const id = String(group.groupId ?? ""); if (!id) return { group, accounts: [] as Array> }; const payload = await this.invoke(["--group", id]); return { group, - accounts: records(nested(payload, "data", "runtime", "errors", "nativeOps", "accountQuality", "accounts")), + accounts: records(nested(payload, "data", "parsed", "errors", "nativeOps", "accountQuality", "accounts")), }; }); const refreshedAt = new Date(); @@ -149,9 +149,20 @@ export class AccountScoreService { ]).finally(() => clearTimeout(timeout)); if (timedOut) throw new Error(`评分 CLI 在 ${this.config.monitor.cli.timeoutMs}ms 后超时`); if (exitCode !== 0) throw new Error(`评分 CLI 退出码 ${exitCode}: ${stderr.trim().slice(-600)}`); - const payload = record(JSON.parse(stdout)); + let payload = record(JSON.parse(stdout)); if (!payload || payload.ok !== true) throw new Error("评分 CLI 返回无效结果"); - if (nested(payload, "data", "outputTruncated")) throw new Error("评分 CLI 输出被截断"); + if (nested(payload, "data", "outputTruncated")) { + const dumpPath = nested(payload, "data", "dump", "path"); + if (typeof dumpPath !== "string" || !dumpPath.startsWith("/tmp/unidesk-cli-output/")) { + throw new Error("评分 CLI 渐进披露结果缺少受保护 dump"); + } + try { + payload = record(JSON.parse(readFileSync(dumpPath, "utf8"))); + } finally { + try { unlinkSync(dumpPath); } catch { /* The CLI may clean up its own temporary output. */ } + } + if (!payload || payload.ok !== true) throw new Error("评分 CLI dump 返回无效结果"); + } return payload; }