{"_id":"@bit-ark/dsh-balance","_rev":"5-1a330db7877876a5187ecd4450290403","name":"@bit-ark/dsh-balance","dist-tags":{"latest":"0.4.8"},"versions":{"0.1.0":{"name":"@bit-ark/dsh-balance","version":"0.1.0","_id":"@bit-ark/dsh-balance@0.1.0","maintainers":[{"name":"duan-liang","email":"git@duanliang.com.cn"}],"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"platform":"web"}},"dist":{"shasum":"113ff02064e0c5763e16e64ca0b820bfb0a2859d","tarball":"https://registry.npmjs.org/@bit-ark/dsh-balance/-/dsh-balance-0.1.0.tgz","fileCount":7,"integrity":"sha512-CsYejmhy3rCq2GGlowV6Oq9MAJBZ2aclQHjxhohNqjoL2+7JE+/CEVThhZZwz1NVGTTfIOIe2bDOcFg9aiTPmA==","signatures":[{"sig":"MEYCIQC19WDxSNYWMoj4jr43UKTuxIAi9mx0LchHdGAsz1IXZgIhAL9gaXwpObL6KCg4iwkJPuxrtT7PveLAICTeFxEIvZgK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":162700},"main":"lib/index.js","type":"module","exports":{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"15b5d933965db746722b4e11838fb7a54b1ece9b","scripts":{"test":"node test/usage-fold.test.mjs","build":"node build.mjs"},"_npmUser":{"name":"duan-liang","email":"git@duanliang.com.cn"},"_npmVersion":"12.0.2","description":"Adds a 设置 (Settings) section showing the DeepSeek account balance (official /user/balance API) and a per-day token-consumption bar chart aggregated from local persisted session logs.","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dsh-balance_0.1.0_1787031872521_0.452709155934663","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@bit-ark/dsh-balance","version":"0.4.5","_id":"@bit-ark/dsh-balance@0.4.5","maintainers":[{"name":"duan-liang","email":"git@duanliang.com.cn"}],"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"platform":"web"}},"dist":{"shasum":"1478ec9cd6386c14423b8af51f9c8f06d47b8f15","tarball":"https://registry.npmjs.org/@bit-ark/dsh-balance/-/dsh-balance-0.4.5.tgz","fileCount":7,"integrity":"sha512-ukiwEvJFR+JnFLCFNelLA1EFp8jbYLD57wSU4g9T6tr547AuvU9qWQT4NEetNgLnHBEc0tOQgVqf1SaciRzSlw==","signatures":[{"sig":"MEYCIQDmRDhZwh31vOPocoT8fG4+b38CyRXwmFkeU40WMc2//wIhANrYwQynVgoFNUXKCMZy58xK9b0TGm4LxAC8tcyZMe5q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183447},"main":"lib/index.js","type":"module","exports":{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"ff7bb821e646d58150e9067dea2949b7af2885a6","scripts":{"test":"node test/usage-fold.test.mjs && node test/platform.test.mjs","build":"node build.mjs"},"_npmUser":{"name":"duan-liang","email":"git@duanliang.com.cn"},"_npmVersion":"12.0.2","description":"Adds a 设置 (Settings) section showing the DeepSeek account balance (official /user/balance API) and a per-day token-consumption bar chart aggregated from local persisted session logs.","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dsh-balance_0.4.5_1787390706888_0.7837915751483775","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@bit-ark/dsh-balance","version":"0.4.6","_id":"@bit-ark/dsh-balance@0.4.6","maintainers":[{"name":"duan-liang","email":"git@duanliang.com.cn"}],"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"platform":"web"}},"dist":{"shasum":"881382963c70a523c95ee357f219499a05503c94","tarball":"https://registry.npmjs.org/@bit-ark/dsh-balance/-/dsh-balance-0.4.6.tgz","fileCount":7,"integrity":"sha512-yzK4//fdejuruCPGtWlyv9bDfsh3FZnCOevfNTSfenrbl0FARMDAwqlk1a47UIbAIW8NyEbKp1V75YXv60kejQ==","signatures":[{"sig":"MEQCIF1R5bzlBpnqDfYtDRXRswDkmdk4/bvYTx8tc1G2uA7UAiAbY3u4ptSnQ2GCM/nmr9tuStb9UnzTA/1dcyDFYlHbzQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188917},"main":"lib/index.js","type":"module","exports":{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"c6f9953b3952c6d8a92dcf8d45d42b14e7ecd5cd","scripts":{"test":"node test/usage-fold.test.mjs && node test/platform.test.mjs","build":"node build.mjs"},"_npmUser":{"name":"duan-liang","email":"git@duanliang.com.cn"},"_npmVersion":"12.0.2","description":"Adds a 设置 (Settings) section showing the DeepSeek account balance (official /user/balance API) and a per-day token-consumption bar chart aggregated from local persisted session logs.","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dsh-balance_0.4.6_1787406621643_0.5940661390475679","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"@bit-ark/dsh-balance","version":"0.4.7","_id":"@bit-ark/dsh-balance@0.4.7","maintainers":[{"name":"duan-liang","email":"git@duanliang.com.cn"}],"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"platform":"web"}},"dist":{"shasum":"0986087ed64d52eb6492a2a6ba2648dd00eb1ea5","tarball":"https://registry.npmjs.org/@bit-ark/dsh-balance/-/dsh-balance-0.4.7.tgz","fileCount":7,"integrity":"sha512-zfM3YVjaJN+aMMuw8bVmh0cAjiLTQ8RNAo6BIC9P6YK01STaiWEKwDF/dC4pPROVh7wYiL12h9v4y5/IzjDbrw==","signatures":[{"sig":"MEUCIQDX6MfPbiqNxYGJydPRsUkj0FdcHQ7kTeXAMBfYOtNLtAIgbc3q6SGMOdpGmbd3xYVXbnoqH8vRN6wFgA7b549+Org=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208830},"main":"lib/index.js","type":"module","exports":{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"5d19bca21b3873a968f8676c483b6c0e27761a90","scripts":{"test":"node test/usage-fold.test.mjs && node test/platform.test.mjs","build":"node build.mjs"},"_npmUser":{"name":"duan-liang","email":"git@duanliang.com.cn"},"_npmVersion":"12.0.2","description":"Adds a 设置 (Settings) section showing the DeepSeek account balance (official /user/balance API) and a per-day token-consumption bar chart aggregated from local persisted session logs.","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0"},"_npmOperationalInternal":{"tmp":"tmp/dsh-balance_0.4.7_1787407604904_0.40588366774867923","host":"s3://npm-registry-packages-npm-production"}},"0.4.8":{"_id":"@bit-ark/dsh-balance@0.4.8","dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"platform":"web"}},"dist":{"shasum":"f835bd6134f65d7a9446883a730f242cbe87766c","tarball":"https://registry.npmjs.org/@bit-ark/dsh-balance/-/dsh-balance-0.4.8.tgz","fileCount":7,"integrity":"sha512-RnbzqXghMAuc5rR3N9cFNz12fDZErs1xJW7DnbY7Dlj5+S9kGbAa3FlCYKwviyGSwdNHbYdUzRdiGwZxxgX4QQ==","signatures":[{"sig":"MEUCIHCaTCzi7EKLo3QnQWnkYWgIz210UmFIsrZj5nNyCM56AiEAnUZdYaUQR5Cgvsep9QeeT67NjyiGl2MHyS9eEPlsM70=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCHA7w6RDvgSUCFVL7DmC9UWDVxY0J9S1LdOCK8mgBZygIhANshQ/i4uSevkguu3fuwXNsXIqTi0KthwtAFePo2zovY"}],"unpackedSize":208851},"main":"lib/index.js","name":"@bit-ark/dsh-balance","type":"module","exports":{".":"./lib/index.js","./client":"./lib/client.js","./package.json":"./package.json"},"gitHead":"87d43b8210e74260e860e666bf5535eddf285a6d","scripts":{"test":"node test/usage-fold.test.mjs && node test/platform.test.mjs","build":"node build.mjs"},"version":"0.4.8","_npmUser":{"name":"duan-liang","email":"developer@duanliang.com.cn"},"_npmVersion":"12.0.2","description":"Adds a 设置 (Settings) section showing the DeepSeek account balance (official /user/balance API) and a per-day token-consumption bar chart aggregated from local persisted session logs.","directories":{},"maintainers":[{"name":"duan-liang","email":"developer@duanliang.com.cn"}],"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-balance_0.4.8_1787894165885_0.5375237738799326"}}},"time":{"created":"2026-08-18T05:44:32.418Z","modified":"2026-08-28T05:16:06.173Z","0.1.0":"2026-08-18T05:44:32.676Z","0.4.5":"2026-08-22T09:25:07.241Z","0.4.6":"2026-08-22T13:50:21.779Z","0.4.7":"2026-08-22T14:06:45.085Z","0.4.8":"2026-08-28T05:16:05.969Z"},"description":"Adds a 设置 (Settings) section showing the DeepSeek account balance (official /user/balance API) and a per-day token-consumption bar chart aggregated from local persisted session logs.","maintainers":[{"name":"duan-liang","email":"developer@duanliang.com.cn"}],"readme":"# dsh-balance\n\n为 DeepSeek Harness Web GUI 的侧边栏 footer 增加「DeepSeek 账户」小部件\n（`sidebar.footer.action` 官方插槽的一个 list 条目 = 设置按钮上方的常驻动作位）：\n一个横向进度条，刻意保持精简、不渲染任何文本：\n\n- **进度条 = 今日总余额 vs 今日消费（官方账单）**：整条代表今日总余额（余额接口\n  的当前总额），其中的「消费部分」= 今日消费金额（**官方平台账单**，\n  `/dsh-balance/online`，非本机估算）占总余额的比例；未消费部分为中性底色。\n- **消费部分颜色标识当前时段**：低谷时段 = 成功绿\n  （`--dsw-alias-state-success-primary`），高峰时段 = 警示琥珀\n  （`--dsw-alias-state-warn-primary`）。峰谷判定按**北京时间**（与宿主\n  `DEFAULT_PEAK_HOURS` 一致：每日**北京时间** 09:00–12:00、14:00–18:00 为高峰，\n  小时 ∈ {9..11, 14..17}，其余为低谷；**2026-08-23 起周末（周六、周日）全天不再\n  区分峰谷、统一按低谷价**；峰谷按北京时间计时、全球统一适用；每分钟 tick 一次，\n  峰谷边界到点自动变色。官方 usage 接口只按「缓存命中/未命中/输出」\n  归类的每日合计、**不提供高峰/低谷拆分**，故消费段为当前时段单色（不再有本地\n  估算的双色段）；「高峰 ×2 / 低谷约五折」的说明放在 title 里。\n- **title 悬停说明**：因空间有限不显示文本，悬停 title 给出简要说明——今日总余额\n  （充值 + 赠送拆分）、今日消费（官方账单金额）、当前时段（高峰 ×2 / 低谷约五折）、\n  余额不足警告（`is_available: false` 时）。\n\n**今日消费为什么用官方平台接口**：DeepSeek 没有面向 API key 的用量查询接口\n（api.deepseek.com 上所有候选路由实测 404），精确的每日消费只在官网控制台背后的\n私有接口里（`platform.deepseek.com/api/v0/usage/*`），需要浏览器登录会话的\n`userToken`（localStorage 里的值，非 API key）。配置方式见下「平台 Token」。\n\n数据来自本插件宿主路由 `GET /dsh-balance/balance`（官方余额）与\n`GET /dsh-balance/online`（平台私有用量接口的今日消费）。拉取时机：挂载 /\n窗口 focus（10s 节流）/ 每 5 分钟兜底刷新。**未配置或失效的 userToken 时，\n进度条会原地变成 token 输入框**：粘贴 userToken 点「保存」即写入\n`~/.dsh/.credentials.yaml`（harness credentials 机制，与官方设置页存 API key\n同链路，无需改配置、无需重启），保存后立即验证并恢复进度条；网络异常等\n非凭证错误仍走「进度条只剩余额中性底色 + title 提示」。余额数字本身始终是\n官方准确的。原「设置 → DeepSeek 账户」整页（余额卡 + Token 消耗图 + Top\nAPI Key）随迁移移除；宿主 `/usage` 端点保留（只读 API，供其他消费方使用），\n客户端页面不再引用。\n\n## 结构\n\n```\nsrc/index.ts          宿主半：GET /dsh-balance/balance | /usage | /online（只读）\nsrc/platform.ts       平台私有用量客户端：北京归日 + usage/cost 解析（可独立测试）\nsrc/usage-fold.ts     纯函数：usage 折叠 / 按天分桶（可独立测试）\nsrc/client/index.tsx  客户端半：sidebar.footer.action 注册（id: dsh-balance, order: 10）\nbuild.mjs             esbuild 构建（lib/index.js + lib/client.js 工厂包装）\ncordis.patch.yml      自带组合层：插入 dsh-balance 行\ntest/usage-fold.test.mjs  纯折叠逻辑断言\ntest/platform.test.mjs    平台用量解析断言\n```\n\n## 宿主半端点\n\n- `GET /dsh-balance/balance`\n  key 解析顺序：`ctx.credentials.resolve(apiKeyEnv)`（与 Models 页写入的同一凭据，\n  默认引用 `DEEPSEEK_API_KEY`）→ 进程环境变量回退。余额查询固定走官方\n  `https://api.deepseek.com`（即使聊天经代理转发），可用行配置覆盖。业务失败\n  返回 `200 + { ok:false, code }`，code ∈ `missing-key | auth-failed | upstream |\n  network`；key 本身绝不回显。\n- `GET /dsh-balance/usage?days=N&refresh=1`\n  `sessionPersistence.list()/load()` 全量扫描会话日志（zstd 解码在后端内部），\n  每个 `(turn, step)` 取最后一个 usage 样本（message 终值替换 chunk 早期值，\n  与 harness 自带 token-meter 语义一致），fork/子代理跳过 `seedLength` 继承前缀\n  避免双算。聚合分三趟但同一样本集内存常驻（O(n) 遍历）：分桶 + 全量费用 +\n  按 key 聚合；全量历史总计在折叠时增量累加，窗口合计由日桶直接求和。\n  结果内存缓存 5 分钟（`cacheTtlMs`），`refresh=1` 强制重算，在途计算按\n  `(days, refresh)` 键控去重；days 上限 90，并发 4，单会话读取失败计数跳过。\n  响应含 `todayCost`（**今日消费峰谷拆分**，元：`{ peak, offPeak, total, priced }`——\n  高峰时段的样本按 ×2 计；2026-08-23 起周末全天按低谷价，priced = 今日是否有\n  可计价样本），供其他消费方使用；\n  另含 `topKeys`（按 API key 分组的全量消耗 Top 5）：\n  usage 样本经最近的 `request/header` 归属到 provider 路由，再经 `keyNameByProvider`\n  映射成凭据引用名（同名 key 的多个 provider 合并）。每项（key / 模型 / 日桶 /\n  合计）还带**估算费用** `cost`：按模型单价表 × token 数折算，落在高峰时段（默认\n  北京时间 09:00–12:00、14:00–18:00 为高峰）的请求 ×2（即空闲价为高峰一半）；\n  未配置价格的模型为 `null`（不计费，显示 —）。\n- `GET /dsh-balance/online`\n  **官方平台账单的今日消费**（侧边栏小部件用的就是这个，替代本机估算）。\n  优先调 `https://platform.deepseek.com/api/v0/usage/by_api_key/cost?start=&end=&tz=28800`\n  （按 API key 维度，返回小时桶时间序列，数据最实时），失败时回退到月度查询\n  `https://platform.deepseek.com/api/v0/usage/cost?month=&year=`（按天汇总）。\n  两种格式均由解析器自动识别处理。`tz=28800` 为北京时区偏移（8h × 3600s），\n  确保平台按北京时间归日。\n  返回 `{ ok, todayCost, currency, fetchedAt }`。\n  业务失败以 `200 + { ok:false, code }` 返回，code ∈\n  `missing-token | platform-auth | upstream | network`；\n  `missing-token` = 未配置 userToken，`platform-auth` = token 失效/过期\n  （40002/40003）。结果内存缓存 5 分钟；凭证失效类错误不缓存（更新 token 后\n  立即生效）。token 只在请求头使用，绝不回显 / 记日志。\n\n## 平台 Token（userToken）\n\nDeepSeek 没有面向 API key 的用量接口，精确消费只能调平台私有接口，需要浏览器\n登录会话的 `userToken`（**非 API key**）。获取方式：\n\n1. 浏览器打开 https://platform.deepseek.com 并登录；\n2. F12 → Application → Local Storage → `https://platform.deepseek.com` → 找到\n   `userToken` → 复制其值；\n3. 配置给插件（任选其一，优先级从高到低）：\n   - 行配置 `platformToken`（见下）；\n   - `~/.dsh/.credentials.yaml` 里加 `DEEPSEEK_PLATFORM_TOKEN: <token>`（与\n     `DEEPSEEK_API_KEY` 同机制）；\n   - 环境变量 `DEEPSEEK_PLATFORM_TOKEN`。\n4. 重启 `pnpm dsh web` 生效。\n\n**更省事的方式**：无需改配置文件——token 未配置或过期时，侧边栏小部件会\n自动变成输入框，直接粘贴 userToken 点「保存」即可（保存到 credentials 文件，\n立即生效，无需重启；若 token 无效会提示「Token 无效或已过期」并保留输入框）。\n\n注意：userToken 是账号会话凭证，会过期；过期后小部件自动弹出输入框，重新\n登录复制粘贴即可（凭证失效错误不缓存，无需等 5 分钟缓存）。若当前 token 由\n环境变量提供（只读层），保存会提示改为在环境变量中更新。\n\n## 行配置（全部可选）\n\n```yaml\nconfig:\n  apiKeyEnv: DEEPSEEK_API_KEY        # 凭据引用（环境变量名）\n  balanceBaseURL: https://api.deepseek.com\n  usageDays: 14                      # 默认图表窗口（1..90）\n  cacheTtlMs: 300000                 # 消耗聚合缓存\n  costCurrency: CNY                  # 费用显示币种（CNY → ¥，USD → $）\n  # 平台会话 userToken（非 API key）——官方今日消费（/online）必需，\n  # 见上「平台 Token」；也可用 DEEPSEEK_PLATFORM_TOKEN 凭据/环境变量\n  # platformToken: <userToken>\n  # 高峰时段（北京时间小时 0..23），命中者按单价 ×2（空闲价为高峰一半）；\n  # 默认北京时间 09:00–12:00 与 14:00–18:00；\n  # 2026-08-23 起周末（周六、周日）全天不再区分峰谷、统一按低谷价\n  peakHours: [9, 10, 11, 14, 15, 16, 17]\n  # 模型单价（元 / 百万 tokens，空闲时段基准），合并覆盖内置默认价\n  # （deepseek-v4-flash: 命中 0.05 / 未命中 1.5 / 输出 4.5；\n  #   deepseek-v4-pro:  命中 0.15 / 未命中 4.5 / 输出 13.5）。\n  # 未配置价格的模型不计费；缓存写入按「未命中输入」价近似。\n  pricesPerM:\n    deepseek-v4-flash: { inputMiss: 1.5, inputHit: 0.05, output: 4.5 }\n    deepseek-v4-pro: { inputMiss: 4.5, inputHit: 0.15, output: 13.5 }\n    # 其他 provider 的模型（如 qwen3.8-max）按需补充：\n    # qwen3.8-max: { inputMiss: X, inputHit: X, output: X }\n  # provider 路由 → API key 名称（凭据引用）显式映射，覆盖自动探测。\n  # 缺省自动读取 llm-deepseek / llm-pi-ai 设置命名空间推导：\n  keyNameByProvider:\n    deepseek-official: DEEPSEEK_API_KEY\n    qwen-token-plan-cn: QWEN_TOKEN_PLAN_CN_API_KEY\n```\n\n## 构建\n\n```sh\npnpm install   # 首次（仅 esbuild）\npnpm build     # 修改 src/ 后重新构建 lib/\npnpm test      # 纯折叠逻辑断言（构建后运行）\n```\n\n## 安装（已完成则跳过）\n\n在 deepseek-harness checkout 目录执行（插件已发布到 npm，按名安装即可）：\n\n```sh\npnpm dsh plugin --profile web add @bit-ark/dsh-balance\n```\n\n该命令从 npm 拉取包并挂进 `~/.dsh/profiles/web`（依赖与 `dsh.profile.bundles`\n由 `dsh plugin` 自动维护），之后每次 `pnpm dsh web` 启动都会加载本插件。\n\n## 生效方式\n\n- **宿主半改动：重建后必须重启 `pnpm dsh web`**（路由在进程启动时注册）。\n- 客户端半改动：`pnpm build` 后刷新页面即可（重启更稳妥）。dev:web watcher\n  不覆盖树外插件，属预期行为。\n\n## 已知边界\n\n- 余额是平台账户级数据；消耗图是本机会话日志聚合——两者口径不同属预期\n  （平台未开放 API key 维度的消耗历史接口）。\n- 按 API key 的消耗归属基于会话日志中的 provider 路由（`request/header`），\n  日志从不记录 key 本身（安全设计）；provider → key 名映射来自 llm 设置\n  命名空间自动推导，映射不到的 provider 以其路由 id 展示。\n- 费用是**估算**：按内置/行配置单价 × token 折算，历史消耗按现价近似\n  （2026-08-17 前为旧统一计费，无法精确还原）；高峰时段按北京时间判定，\n  2026-08-23 起周末（周六、周日）全天按低谷价。\n  以 DeepSeek 官方账单为准。\n- 只统计已落盘事件：进行中会话尚未 flush 的尾部不计入；下次刷新/重算补齐。\n- 压缩（compaction）不影响统计：usage 挂在 `assistant/message` 事件上，\n  compaction 只替换 surface 节点，历史 usage 保留。\n- 插件全程只读：不写会话 / 设置 / 磁盘，不使用定时器，无持久化状态（仅内存缓存）。\n- 会话极多时首次统计（缓存未命中）会全量解压日志，可能需要几秒；页面有\n  「统计中…」状态与「缓存」标记。\n","readmeFilename":"README.md"}