# Changelog 本文件按 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 维护,版本号遵循语义化版本。 ## [0.5.2] - 2026-09-11 ### Fixed - **适配 DSH 会话格式 V3 的版本化日志文件名**(dsh 0.1.5-rc.1 于 2026-09-11 00:52 在本机落地):会话日志自 v2 起由 `session.jsonl.zstd` 改为 `session.v.jsonl.zstd`,本插件此前把裸名硬编码在 `findSessionFile` / `listSessions` 两处 → 升级后**新建会话的成本与额度读数全部失源**(`listSessions` 静默少列、`findSessionFile` 返回 undefined)。现按「读目录、认两代命名、取最高版本」解析: - 新增 `sessionLogBaseName(generation)`(`0` → `session.jsonl`,`N>0` → `session.v.jsonl`)与 `pickSessionLogName(sessionDir, suffix)`(目录内匹配两代命名并偏好最高版本),两者均导出。 - `findSessionFile` / `listSessions` 改用上述解析;**每个会话目录仍只产出一条记录**,迁移后 v0 原件与 v3 新件并存时取 v3(同一会话不会重复计数)。 ### Notes - 迁移会话目录同时存在 `session.jsonl.zstd` 与 `session.v3.jsonl.zstd` 时,本插件统一读 **v3**(迁移后的权威记录),旧件仅在无 vN 件时回退。实机抽查该两代文件折叠结果一致(183 样本逐样本 0 差异)。 - `sessionLogBaseName(generation)` 是**对外的公共 helper**:生产路径(`findSessionFile` / `listSessions`)走目录扫描、由 `pickSessionLogName` 按正则识别两代命名,函数内不调用它;需要由「格式代」反推文件名(例如已从日志头读到版本号)的调用方可以直接用。K3 独立复检指出它与扫描用正则是同一映射的两处表达,**本版不做就地合并**(会改动已批准且已部署的产物),留待下一次升版顺手消除双份真相。 - 0.1.5 宿主在 Windows 上**不落 `session.lock` 文件**(走内核命名信号量),故目录解析不依赖锁文件。 - 验证:`node --test "test/*.test.mjs"` **73/73 PASS**(新增 3 项:命名两代映射、混合目录偏好最高版本、v3-only 会话可见性);真机只读抽查——`listSessions` 枚举 366 个会话(含 10 个 vN 版文件),本会话(v3-only)可读且 `costOfSession` 正常出价(0.44499368 CNY / deepseek-flash)。 ## [0.5.1] - 2026-09-10 ### Changed - **官方 Flash 家族重定价(2026-09-10 12:00 北京时间生效)**:内置 `OFFICIAL_CNY` 的 Flash 档改为新价——高峰 输入 ¥2.0 / 缓存读 ¥0.04 / 输出 ¥8.0,空闲 ¥1.0 / ¥0.02 / ¥4.0(每百万 token);`deepseek-v4-pro` 价未变(高峰 9.0 / 0.3 / 27.0)。 - **新增正名 `deepseek-flash`(DeepSeek-V4.1-Flash)**:官方以该 id 作为 V4.1 Flash 的规范模型名;两个退役 id(`deepseek-v4-flash`、`deepseek-v4-flash-vision-exp`)仍可调用,但由 V4.1 Flash 服务并按新 Flash 价计费——三个名字同步对齐新价。 ### Added - **内置价表按时间分档(`history`)**:条目可选带 `history: [{ before, peak, offPeak }]`,`before` 之前的样本按旧卡计价、之后按当前卡;新增 `effectiveRateEntry(entry, time)` 选档函数与 `FLASH_REPRICE_EFFECTIVE_MS` 常量。Flash 家族旧卡(2026-08-17:高峰 3.0 / 0.1 / 9.0)作为历史档保留,**历史会话金额不被新价重算**(沿用周末规则"保留历史规则"的既有原则)。 - 用户 `rates.json` schema 不变(version 1):`history` 是可选增字段;自定义平价/峰谷条目照旧生效,并优先于内置档。 ### Notes - 官方公告:`deepseek-v4-pro` 自 **2026-09-14 12:00 北京时间**起请求全部路由到 V4.1 Flash 并按 Flash 价计费。该切价**本轮未编码**(`lib/fold.js` 内已留注释),留待下一维护轮。 - 验证:`node --test "test/*.test.mjs"` 70/70 PASS、`maintenance.ps1 verify` 6 项 PASS、四个 `lib\*.js` 通过 `node --check`,另做本机真实会话日志抽查(新旧价对照,见 `CURRENT_STATE.md`)。 ## [0.5.0] - 2026-09-02 ### Removed - **移除「额度汇总」面板**(会话页头 `conversation.session.header.actions` 的「额度汇总」按钮 + 跨对话合计/按模型/按天三张表):实测在会话量大的机器上全量枚举 150+ 会话需约 27 秒且客户端无超时提示,用户判定该功能无用。host 端 `turnCost/summary` 端点与 `summaryCache`/`foldEntry` 同步删除;`lib/client.js` 的 `SummaryButton`/`SummaryTable`/`QuotaSection`、`summary.*`/`quota.*` 文案与面板样式一并移除。 ### Changed - **Kimi 徽章与读数条口径改为 7 天周额度 + 加油包余额**:每轮徽章与会话读数条显示「7 天还剩 N 次 · 余额 ¥X」(官方 loopback 实时读数);不再以 5h 滚动窗口为主读数(5h 窗口仍在 quota 响应中,UI 不再占用主位)。 - **Kimi loopback 服务自动拉起(K2)**:默认端口 `127.0.0.1:58627` 上服务未运行时,插件用 `~/.dsh/turn-cost-tools` 里固定版本的 kimi CLI 自动启动(`kimi web --no-open --port 58627`),只管理自己启动的实例、插件卸载时经官方 `/api/v1/shutdown` 关闭;直接启动 DSH(不经「启动 DSH(含额度)」启动器)也能读到 Kimi 额度。端口被他人占用时不触碰。 - **阿里 bl 默认认死固定路径**:`fetchAliyunQuota` 默认命令优先用 `~/.dsh/turn-cost-tools/node_modules/.bin/bl.cmd`(固定版本、不依赖系统 PATH),未安装时才回退 PATH 上的 `bl`;rates 文件 `quota` 块的 `command` 仍可覆盖。 ### Security - Kimi 服务自动拉起仅在本机 loopback 默认端口、且存在有效 `server.token` 时发生;凭证仍只在本机进程内使用,不打印、不复制、不写入报告或仓库。 ## [0.4.2] - 2026-08-25 ### Fixed - **纠正 0.4.0/0.4.1 的 Kimi 额度凭据判断**:模型 API Key 只负责模型调用,不能作为可靠的套餐额度凭据;Kimi 额度恢复为已经在单位机和家用机分别实测通过的 Kimi Code OAuth loopback 路线(`127.0.0.1:58627`)。 - 删除 host 对 DSH `.credentials.yaml` 的额度读取与远程 HTTPS Kimi quota 路径;`kimi-usages` 只接受 loopback `baseUrl`,内置默认显式固定为 `http://127.0.0.1:58627`。 - 日常启动器恢复 Kimi 服务生命周期管理:启动前检查 OAuth token、拒绝占用 58627 的非 Kimi 服务、验证 `/api/v1/meta` 身份,并只关闭本启动器创建的实例。 - 新增“配置额度登录”入口,顺序调用官方 `kimi login` 与 `bl auth login --console --console-site domestic`;不接收、复制或记录 API Key、AK/SK。 ### Security - 安装器仍不读取或修改 DSH `.credentials.yaml`;Kimi loopback bearer 只在启动器/插件进程内用于本机官方服务认证,不写入报告或仓库。 ## [0.4.1] - 2026-08-25 ### Fixed - Windows 候选包改用内容寻址 tgz 文件名,并在迁移时保留旧 tgz,避免 profile 的既有 `file:` 依赖在包目录切换期间断链。 - 修复同版本候选被 pnpm 复用旧 `node_modules` 的问题:正式修正版升为 0.4.1,遵守版本不可变原则,确保官方 Kimi API 默认链实际部署。 - 日常启动器不再强制启动/登录 Kimi loopback 服务;默认直接启动 DSH,只有显式配置 loopback 的用户自行管理该可选服务。 - 修复维护验收器把子进程正常日志误当退出码,以及 DSH shim 退出后未能停止真实 3080 监听进程的问题。 ## [0.4.0] - 2026-08-25 ### Changed - **Kimi 额度取数双路径**:`kimi-usages` 路由默认走官方 coding API `GET https://api.kimi.com/coding/v1/usages`(凭据从 `.credentials.yaml` 的 `KIMI_CODING_API_KEY` 内存解析,打开即用、无需本地服务);也可显式配 loopback `baseUrl` 走 Kimi Code 本地 OAuth 服务(`~/.kimi-code/server.token`)。错误码细分为 credential/api/server/output 四类(变更记录 #9) - **Kimi 徽章口径**:剩余次数直接显示官方读数,不再 ÷limit 换算百分比(5h used=53/remaining=47 直接显「还剩 47 次」,不显 47%);会话行与汇总面板同步次数口径(变更记录 #8) - **订阅路由内置**:`kimi-coding` / `qwen-token-plan-cn` 内置默认路由(`builtinQuotaRoutes`),不写 `quota` 块也会尝试读取;费率表 `quota` 块用于覆盖(`credentialRef`/`baseUrl`/`command`/`enabled:false` 关闭) - `quota.js` 从部署副本入库(`normalizeKimiUsages` / `normalizeKimiLocalUsage` / `normalizeAliyunBl` 三解析器);`test/quota.test.mjs` 新增 5 项,`test/fold.test.mjs` 新增双路径配置用例(31/31) - 阿里 Token Plan 仍走官方 `bl usage token-plan` CLI:配一次 `bl auth login --console` + `--open-api`(存 AK/SK)后 console token 自动续期,免手动登录 ### Fixed - 一键安装包 `Install.ps1` 启动即崩(cmd `\"` 转义 + PS 5.1 默认参数坑)——`安装.cmd` 传 `-PackageRoot "%~dp0."`,`Install.ps1` param 后补兜底(变更记录 #7) ### Added - 统一维护入口 `maintenance.ps1`(通用层来自 tool-library,vendor 快照随仓库提交、哈希防漂移):`verify` 确定性静态门禁(单测/合同/PS 语法+BOM/versions 相等/安装事务夹具)、`build`(确定性 ZIP + `-ReproducibilityCheck` 双构建整包哈希相等测试)、`acceptance` 实机验收链(安装→幂等重跑→启动→三路探测→退出→端口残留→回滚哈希核对→再安装,原始报告脱敏且不入库)、`doctor` 只读体检、`sync-versions`(bundled pnpm 重生成 lockfile)。 - `versions.json`:部署固定项唯一权威源;`installer/dsh-package.json`、`installer/tools-package.json` 为派生文件(合同测试断言全链相等);插件版本唯一权威仍在 `package.json`。 - 夹具端口注入:安装事务夹具不再依赖宿主 3080 状态,守卫本身成为被测对象;生产默认仍检查真实端口。 - `maintenance/diagnostic-table.md` 固定错误码诊断表与 `evidence/example-report.json` 示例报告(虚构数据)。 ## 0.4.0 候选阶段记录 - 2026-08-24 ### Added - Windows 一键部署 ZIP:事务备份、固定 DSH/Kimi/百炼 CLI、安装/启动/补齐 CLI/回滚/卸载入口,以及逐文件 SHA-256 内容清单。 - `kimi-coding` 与 `qwen-token-plan-cn` 内置额度路由;自定义路由可覆盖,`enabled: false` 可显式退出。 - Windows 临时 `DSH_HOME` 安装器夹具与 CI 门禁,覆盖幂等、永久载荷路径、篡改拒绝、失败回滚、凭据/settings 不变和卸载所有权。 ### Changed - 插件版本升至 0.4.0;安装器固定 DSH `0.1.1-rc.2`、Kimi Code `0.38.0`、百炼 CLI `1.17.0`,均使用 lockfile。 - Kimi 服务由专用启动器按需启动;仅关闭本启动器创建的实例,且官方 shutdown 请求使用 JSON content type/body。 ### Fixed - 避免 profile 依赖指向临时解压目录;安装前先把完整载荷原子固化到 `~/.dsh/turn-cost-installer-package`。 - 收紧同哈希幂等判断,防止回滚到旧插件后仅凭 bundle 名误判已安装。 - pnpm 11 使用 `allowBuilds` 明确批准 DSH 必需的五个构建依赖;PowerShell 5.1 脚本统一 UTF-8 BOM。 ## [0.3.0] - 2026-08-24 ### Added - **订阅额度窗口显示(门二 v2 五拍落地)**:新端点 `turnCost/quota`——Kimi 订阅路由经官方 Kimi Code loopback OAuth Server 读取 5 小时/7 天窗口与加油包余额;阿里 Token Plan 路由调官方 `bl usage token-plan --output json`(未运行/未登录/输出不认得均安静降级) - **按路由分流显示**:每轮徽章按该轮实际 provider 分流——官方按量(DeepSeek)显示 ¥ 金额;`kimi-coding` 显示「本轮 token · 5h 已用 X% · 剩余 Y%」;`qwen-token-plan-cn` 显示「本轮 token · 剩余 Y%」 - **模型名随对话显示**:会话读数条前缀模型名(读自对话日志,不跟当前 harness 预设) - 费率表新增可选 `quota` 顶层块(`quotaConfigOf` 解析,畸形/原型名键守卫);汇总面板新增「订阅额度窗口」区 ### Changed - `turnCost/query` 返回增 `provider` 与 `requests`(该轮实际 provider 路由与调用数),供 client 分流渲染 ### Fixed - host 端 `Config` 的 zod 语法误用(`z.string().optional()`)在 0.2.0 部署后拖崩 dsh web 启动——schemastery 无此方法,对象字段缺省即可选(变更记录 #4,0.2.0 本机热修,0.3.0 起含在正式码线) ## [0.2.0] - 2026-08-24 ### Added - **自定义费率表**:插件配置 `ratesPath` 指向本机 JSON(模型→四桶单价,可选峰谷双档、别名归一化、订阅制 0 价登记),叠加在内置官方 CNY 卡之上;文件缺失/损坏自动回退内置价 - **会话级读数条**:`conversation.composer.dock` 槽位(官方统计条同带)显示本会话累计金额/token/缓存命中率,token 口径与官方统计条逐桶一致 - **跨对话汇总面板**:会话页头「额度汇总」按钮打开面板,展示全部会话合计、按模型分组、按天分组(近 14 天),数据来自 host 端新端点 `turnCost/summary`(枚举全部会话日志,签名缓存增量重算) - host 端新端点 `turnCost/sessionTotals`(整会话聚合);fold.js 新增 `listSessions` / `readSessionEntry` / `sessionTitleOf` / `costOfSession` / `beijingDay` / `builtinRates` / `mergeRates` / `resolveRateEntry` - `rates.example.json` 费率表示例 ### Changed - `costOfStep` / `costOfTurn` 接受可选费率表参数;不传时行为与内置官方 CNY 卡逐字节一致(既有 11 项测试原样通过) ## [0.1.3] - 2026-08-24 ### Fixed - 补充 `deepseek-v4-flash-vision-exp` 视觉模型价目(官方确认与 V4 Flash 同价);此前该模型会话的每轮金额显示 0.00 ## [0.1.2] - 2026-08-23 ### Added - GitHub Actions CI:push / pull_request 触发,`actions/setup-node` + `node --test`,把计费核心回归卡在合入前(#4) ### Fixed - 按 DeepSeek 2026-08-23 新规,周六、周日全天使用空闲价;生效前的历史调用继续按旧时段计费 - 峰谷判断改为显式换算北京时间,不再依赖运行 dsh 的宿主机时区 ## [0.1.1] - 2026-08-17 ### Changed - 包元数据:author 统一为 Dong CHEN,补充 repository / homepage / bugs 字段 ## [0.1.0] - 2026-08-17 ### Added - 首个版本:在每条 AI 回复下方的操作行显示本轮预计费用(人民币,DeepSeek 官方峰谷价) - 按 (轮, 步) 折叠 provider 上报的真实 usage,持久日志与 live 事件合并,绝不重复计费 - 跨峰谷按每步实际时间分别计价;无官方 CNY 价的模型不计入金额(单独计数,不编造) - 历史会话同样显示;中英双语;完全本地零网络 ### 开发 - `docs/DEVELOPMENT.md` 开发与维护指南 - `test/fold.test.mjs` 计费核心纯函数单测