Releases: fu827707013/dsh-codebuddy-cli
Release list
v0.3.0 — 粘贴 Token 添加账号(导入即显示积分)+ 兼容 DSH 0.1.7+ 托管表单
新增功能:粘贴 Token 添加账号
设置 → 插件 → DSH CodeBuddy CLI Connect → 账号管理 →「粘贴 Token 添加」。填入 refresh_token 即可加入一个 CodeBuddy 身份,无需扫码登录。
为什么必填 refresh_token、而 access_token 可选(实测上游行为):
access_token寿命固定(实测expiresIn= 55 天),且无法反向续期;refresh_token可独立恢复会话——刷新接口既不需要access_token,也不需要X-User-Id;- 因此只填
refresh_token即可完整添加一个账号;填access_token能省一次刷新。
uid 与昵称由 Token 中的 JWT 自动解析;「登录区域」可选国内(www.codebuddy.cn)/国际(www.workbuddy.ai),因为仅凭 refresh_token 导入时没有 JWT 可读取区域,而会话基址依赖该值。
验证顺序:先探活,再落库
- 本地解析 JWT 取
uid/ 昵称 / 有效期; - 用
refresh_token换取新令牌(证明账号可用); - 用新的
access_token拉取模型目录; - 全部通过后才写入账号存储。
任一步失败不写入任何内容——一个存在但无法鉴权的账号比没有账号更糟,因为切换器会把它列出来。失败原因就地显示,已粘贴内容保留便于修改。
两个由上游行为决定的正确性细节
- 落库的是上游轮换后的新令牌对,而非粘贴的旧值:实测刷新会轮换
refresh_token且旧值在服务端仍有效,存回旧值会留下一个本插件无法跟踪的长期有效凭证。 - 导入时顺带读取积分:此前新账号卡片的余额是空的,要等下一轮轮询才补上,看起来就像导入失败。现在积分在探活时一并读取并写入按账号的积分缓存,新卡片立刻显示余额与积分包。积分读取失败不影响导入本身(账号已确认可用,余额稍后补齐)。
兼容 DSH 0.1.7+ 新版设置 API(托管表单)
DSH 的 dsh-settings 设置接口经历过三代演进,旧写法在新宿主上会失效:
installSettingsSection(...)——@deepseek-ai/dsh-settings导出的模块级函数;settings.installSection(...)—— 同一个辅助函数被移到 settings provider 服务上(DSH 0.1.2+);- 托管表单(DSH 0.1.7+)—— 上述两个安装器都被移除,表单改由插件自身 Loader 入口的 Config schema 推导,插件只能通过
configure({ auto: false })选择不自动生成页面。
本次新增 src/settings-compat.ts 在运行时自动识别当前宿主属于哪一代,因此同一份构建产物在整个 peer 范围内(0.1.2-rc.1 ~ 0.1.7+)都能正常工作;在旧宿主上各分支都会降级回原有行为,不会抛错。同时补了 settings-compat 与 client-bundle-contract 两组测试,锁定设置命名空间解析与客户端 bundle 契约,避免后续改动再次破坏新版宿主上的设置页。
安全
粘贴 Token 的路由保留 loopback + loopback Origin + application/json 三重校验,且任何状态响应都不会回显令牌内容(JWT 被脱敏为 [redacted token])。
测试
新增 19 条导入路由用例(探活顺序、轮换令牌落库、各类拒绝路径、守卫拒绝、脱敏)、2 条积分相关用例,以及设置兼容与 bundle 契约共 187 行测试。用故意破坏源码的方式验证过它们确实有效力:不返回积分(1 条红)、让积分失败中止导入(1 条红)、绕过 loopback 守卫(4 条红)。
已知限制
- 粘贴 Token 不支持密码登录与企业 SSO(二者必须走浏览器交互)。
- 服务端若已把会话标记失效(返回
12153 Offline user session not found),access_token与refresh_token会同时失效,只能重新登录后再粘贴。 - Token 以明文存于本机
$DSH_HOME/.codebuddy-cli-accounts.json(权限600),请勿提交或分享给他人;使用他人 Token 会消耗对方额度。 - 上游每次刷新都会轮换
refresh_token且旧值仍有效,因此同一个 Token 不要被多个客户端同时使用,否则会互相作废。
v0.2.1 — Restore UTF-8 package description
Fix
The 0.2.0 version bump rewrote package.json's Chinese description as mojibake (e.g. 复用 → 澶嶇敤). The bump script read the file with Get-Content -Raw, which decodes UTF-8 as GBK on Windows, and then wrote the mis-decoded text back as UTF-8. The corrupted description shipped to both npmjs and GitHub Packages with 0.2.0.
- Restore the original description bytes — verified byte-identical to the
0.1.8blob viagit diff. - Scan every tracked file for mojibake markers;
package.jsonwas the only casualty. - Rebuild
lib/so the embedded version literal matches (host-heartbeatchunk hash moves todfEY9CR-).
This patch exists because a published npm version cannot be overwritten, so the correction has to ship as a new version.
Verification
pnpm run checkgreen: typecheck + 249 tests passed (1 skipped) + build.npm view dsh-codebuddy-cli descriptionreports the correct Chinese text after publish.
v0.2.0 — Multi-account, OAuth sign-in and credit statistics
Highlights
Multi-account management
- New Accounts tab: add several CodeBuddy accounts through OAuth QR-code / link sign-in (poll-based flow, no callback redirect).
- OAuth-added credentials live in
$DSH_HOME/.codebuddy-cli-accounts.json; each account keeps its own token, expiry and identity. - Listed accounts show which one is Current; switch or delete with one click. With no OAuth account the plugin still follows the CLI sign-in, so the original single-account behaviour is preserved.
- Per-account daily check-in with a checked-in badge.
Credit statistics
- New Credit statistics tab aggregating official request usage across accounts: remaining / today / 7-day / month summary, a daily stacked trend chart (hover a column for that day's per-model usage), a per-model breakdown, and a credit-package / request-usage detail panel.
- Each card carries its own account filter and range switch (30 days / today / 7 days / this month).
Cleanup
- The settings card body is now four tabs — Accounts, Available models, Credit statistics, Remaining credit.
- Dropped dead locale keys and realigned en/zh, removed an unused OAuth helper and its poll constants, and dropped an unused accounts-path export.
- README / README.en.md synced with the current UI.
Verification
pnpm run checkgreen: typecheck + 250 tests (248 passed, 1 skipped) + build.lib/rebuilt so the bundled version literal reads 0.2.0.
v0.1.8 · 修复模型无思考挡位问题
修复 DeepSeek-V4.1-Flash 没有思考挡位选项(而 GLM-5.3-Flash 有)的问题。
根因
CodeBuddy 上游目录里存在两种 reasoning 行形态:
① 声明集行(有 supportedEfforts)—— 例如 glm-5.3-flash:
"reasoning": { "supportedEfforts": ["low", "high", "max"],
"defaultEffort": "high", "canDisableThinking": true }② 旧式行(只有 effort + summary,没有集合)—— 例如 deepseek-v4.1-flash:
"reasoning": { "effort": "high", "summary": "auto" }插件原来把第二种形态当作"该模型不可选挡位",直接构造 reasoning: false,于是模型选择器里没有挡位按钮。
但这个判断是错的。 实测该端点对 deepseek-v4.1-flash 的响应:
| 传入值 | 结果 |
|---|---|
low / medium / high / xhigh / max |
全部 200 ✅ |
bogus(非法值) |
400 code 11150 the reasoning effort value is not supported by the current model |
两个模型接受的范围完全一致。官方 CLI 的行为也印证了这点:它只判断 supportsReasoning,然后套用全局 reasoningEffort 设置,其允许值就是这个固定阶梯,从不查询逐模型集合。
修复
- 声明集仍然权威:上游声明了就用声明的值
- 没有声明集时,回退到标准阶梯
low / medium / high / xhigh / max - 有意不含
minimal—— 它不在上游的 effort 词汇表内,尽管实测端点接受,但发送词汇表之外的档位属于越界 off(关闭思考)仍只在canDisableThinking === true时提供,旧式行都不满足
顺带修正了 catalog.ts 里的一处错误注释(它声称"已为这些行提供完整阶梯",而代码实际做的是相反的),注释与实现互相矛盾正是这个 bug 长期未被发现的原因。
修复后各模型提供的挡位
| 模型 | 来源 | 提供的挡位 |
|---|---|---|
| deepseek-v4.1-flash | 标准阶梯 | low, medium, high, xhigh, max |
| deepseek-v4-pro | 标准阶梯 | low, medium, high, xhigh, max |
| glm-5.3-flash | 声明集 | low, high, max, off |
| glm-5.3 | 声明集 | low, high, max, off |
| hy4-preview | 声明集 | high |
| hy3-x | 声明集 | low, high |
注意:本次修复同时让
auto/glm-5.1/glm-5.2/kimi-*/minimax-m3等旧式行也获得了挡位选项 —— 依据是与官方 CLI 行为保持一致;如你希望只对部分模型生效,请反馈。
验证
- 测试 190 通过 / 1 跳过(新增 8 条挡位策略回归测试)
- 对真实上游端点实测确认挡位接受范围
- 与本机已安装的 CodeBuddy CLI 二进制逻辑逐一比对
- 构建产物实测已包含该修复
升级与生效
dsh plugin --profile web add dsh-codebuddy-cli装好后重启 dsh web,模型选择器里 DeepSeek-V4.1-Flash 就会出现推理挡位选项。
v0.1.7 · 客户端标识头 + DSH 0.1.5 兼容
修复 issue #1 反馈的两个问题。
1. 后台看不到客户端标识
CodeBuddy 后台判定"客户端"不读 User-Agent,只认官方 CLI 发送的这一组头:
X-IDE-Type / X-IDE-Name / X-IDE-Version / X-Product-Version
本插件此前只发了 User-Agent,且版本号写死为 2.63.2(实际 CLI 已是 2.148.0),因此后台把请求记为无客户端。
现在按官方 CLI 的语义发送该头族(X-IDE-Type/X-IDE-Name 为 cli),版本号改为从本机已安装的 @tencent-ai/codebuddy-code 动态解析,不再写死。解析失败时省略版本头而非编造版本号。
2. DSH 0.1.5 下报 Cannot read properties of undefined (reading 'get')
DSH 0.1.5 给 llm-pi-ai 的路由 profile 新增了必填字段 modelErrors,并在每次模型查询时执行 profile.modelErrors.get(model)。插件按旧 schema 构造 profile 时该字段缺失,于是抛出上述 TypeError,在模型选择器里显示为「CodeBuddy CLI 加载失败」。
现在 profile 改为两代字段的超集,一份构建同时服务两个宿主:
| 宿主 | 行为 |
|---|---|
| DSH 0.1.5+ | 使用 modelErrors |
| DSH 0.1.2 | 完全忽略该字段,行为不变 |
peerDependencies 已放宽为 >=0.1.2-rc.1 <0.2.0(pi-ai 为 >=0.84.2 <0.86.0)。
说明:该报错发生于模型选择器加载期(
listModels/resolveModelInfo),不影响已选中模型的流式对话,这也解释了"新会话里发消息正常"的现象。
验证
- 测试 182 通过 / 1 跳过(新增 19 条:客户端标识 13 条 + 双版本兼容 6 条)
tsc --noEmit与tsdown构建均通过- 构建产物实测同时携带
X-IDE-*头与modelErrors - 真实解析到本机 CLI 版本
2.148.0
升级方式
dsh plugin --profile web add dsh-codebuddy-cli安装后请重启 dsh web 并产生新的调用记录,再到后台确认"客户端"列(历史记录不会追溯)。
v0.1.6 · 每日签到
新增:每日签到
设置 → 插件 → DSH CodeBuddy CLI Connect 卡片「账号」行新增签到按钮(与刷新并排),一键调用 CodeBuddy 每日签到接口领取积分。
- 点击后结果即时显示:签到成功 / 今天已签到 / 失败原因
- 复用插件本地登录态(自动续期后调用),浏览器端不接触令牌
- 新增
POST /plugins/dsh-codebuddy-cli/check-in路由,与插件既有写接口同级的 loopback + Origin + JSON 门禁 - 仅中国大陆 CodeBuddy 账号支持;workbuddy.ai 全球账号返回不支持
- README 中英文说明同步更新
测试:163 通过 + 1 跳过(新增 10 个签到相关测试)。
v0.1.5 · 常驻积分条与多 Provider 显示
更新内容
- 对话内积分条始终显示,不再因当前模型不是 CodeBuddy、积分加载中、未登录或查询失败而隐藏。
- 显示当前选择的 provider 和模型名。
- CodeBuddy 模型在已知倍率时显示倍率;自定义
llm-pi-ai及其他 provider 不臆造倍率。 - 切换 provider 时停止 CodeBuddy 积分轮询并关闭积分明细面板。
验证
pnpm run check通过- 147 个测试通过,1 个既有测试跳过
- DSH Web GUI 已验证普通 provider 与 CodeBuddy 模型切换显示
v0.1.4 — README 补充卡片折叠布局说明
文档
- README(中/英)补充 0.1.3 已上线的插件卡片折叠布局说明:卡片正文分为「可选模型」「剩余积分」「模型优惠」三个可折叠分区,默认收起、摘要常显。
仅文档与版本号变更,无代码改动。
v0.1.3 — 可选模型配置项与卡片折叠布局
新增
- 可选模型配置项
enabledModels:设置卡片中勾选模型,控制模型选择器显示哪些模型;未勾选的模型只是不再被推荐,已选定它的会话和 agent 预设继续可用。空选择 = 提供全部模型。 - 插件卡片折叠布局:正文改为「账号(常开)→ 可选模型 → 剩余积分 → 模型优惠」三个可折叠分区,默认收起;分区标题右侧摘要常显(积分合计、启用数量、优惠数量),明细折进折叠区。
v0.1.2 — 对话框内积分条
新功能
- 对话内积分条:输入框正下方(统计条旁)常驻积分显示,如
积分 1,642 · x0.06——具体数字 + 当前模型倍率,点击弹出明细面板(合计、各套餐进度条、手动刷新) - 积分跟随回合结束自动刷新(running→空闲延迟 2s),60s 兜底轮询;非 CodeBuddy 模型会话自动隐藏
改进
- status 路由新增全量模型倍率映射(支持任意选中模型解析倍率)
- 积分查询 30s TTL 缓存,卡片与积分条共享一次上游调用