Skip to content

Releases: fu827707013/dsh-codebuddy-cli

v0.3.0 — 粘贴 Token 添加账号(导入即显示积分)+ 兼容 DSH 0.1.7+ 托管表单

Choose a tag to compare

@fu827707013 fu827707013 released this 25 Sep 17:27

新增功能:粘贴 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 可读取区域,而会话基址依赖该值。

验证顺序:先探活,再落库

  1. 本地解析 JWT 取 uid / 昵称 / 有效期;
  2. 用 refresh_token 换取新令牌(证明账号可用);
  3. 用新的 access_token 拉取模型目录;
  4. 全部通过后才写入账号存储。

任一步失败不写入任何内容——一个存在但无法鉴权的账号比没有账号更糟,因为切换器会把它列出来。失败原因就地显示,已粘贴内容保留便于修改。

两个由上游行为决定的正确性细节

  • 落库的是上游轮换后的新令牌对,而非粘贴的旧值:实测刷新会轮换 refresh_token 且旧值在服务端仍有效,存回旧值会留下一个本插件无法跟踪的长期有效凭证。
  • 导入时顺带读取积分:此前新账号卡片的余额是空的,要等下一轮轮询才补上,看起来就像导入失败。现在积分在探活时一并读取并写入按账号的积分缓存,新卡片立刻显示余额与积分包。积分读取失败不影响导入本身(账号已确认可用,余额稍后补齐)。

兼容 DSH 0.1.7+ 新版设置 API(托管表单)

DSH 的 dsh-settings 设置接口经历过三代演进,旧写法在新宿主上会失效:

  1. installSettingsSection(...) —— @deepseek-ai/dsh-settings 导出的模块级函数;
  2. settings.installSection(...) —— 同一个辅助函数被移到 settings provider 服务上(DSH 0.1.2+);
  3. 托管表单(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

Choose a tag to compare

@fu827707013 fu827707013 released this 12 Sep 08:38

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.8 blob via git diff.
  • Scan every tracked file for mojibake markers; package.json was the only casualty.
  • Rebuild lib/ so the embedded version literal matches (host-heartbeat chunk hash moves to dfEY9CR-).

This patch exists because a published npm version cannot be overwritten, so the correction has to ship as a new version.

Verification

  • pnpm run check green: typecheck + 249 tests passed (1 skipped) + build.
  • npm view dsh-codebuddy-cli description reports the correct Chinese text after publish.

v0.2.0 — Multi-account, OAuth sign-in and credit statistics

Choose a tag to compare

@fu827707013 fu827707013 released this 12 Sep 08:25

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 check green: typecheck + 250 tests (248 passed, 1 skipped) + build.
  • lib/ rebuilt so the bundled version literal reads 0.2.0.

v0.1.8 · 修复模型无思考挡位问题

Choose a tag to compare

@fu827707013 fu827707013 released this 10 Sep 10:06

修复 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 兼容

Choose a tag to compare

@fu827707013 fu827707013 released this 10 Sep 09:47

修复 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 · 每日签到

Choose a tag to compare

@fu827707013 fu827707013 released this 09 Sep 06:16

新增:每日签到

设置 → 插件 → 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 显示

Choose a tag to compare

@fu827707013 fu827707013 released this 06 Sep 11:58

更新内容

  • 对话内积分条始终显示,不再因当前模型不是 CodeBuddy、积分加载中、未登录或查询失败而隐藏。
  • 显示当前选择的 provider 和模型名。
  • CodeBuddy 模型在已知倍率时显示倍率;自定义 llm-pi-ai 及其他 provider 不臆造倍率。
  • 切换 provider 时停止 CodeBuddy 积分轮询并关闭积分明细面板。

验证

  • pnpm run check 通过
  • 147 个测试通过,1 个既有测试跳过
  • DSH Web GUI 已验证普通 provider 与 CodeBuddy 模型切换显示

v0.1.4 — README 补充卡片折叠布局说明

Choose a tag to compare

@fu827707013 fu827707013 released this 05 Sep 16:36

文档

  • README(中/英)补充 0.1.3 已上线的插件卡片折叠布局说明:卡片正文分为「可选模型」「剩余积分」「模型优惠」三个可折叠分区,默认收起、摘要常显。

仅文档与版本号变更,无代码改动。

v0.1.3 — 可选模型配置项与卡片折叠布局

Choose a tag to compare

@fu827707013 fu827707013 released this 05 Sep 16:29

新增

  • 可选模型配置项 enabledModels:设置卡片中勾选模型,控制模型选择器显示哪些模型;未勾选的模型只是不再被推荐,已选定它的会话和 agent 预设继续可用。空选择 = 提供全部模型。
  • 插件卡片折叠布局:正文改为「账号(常开)→ 可选模型 → 剩余积分 → 模型优惠」三个可折叠分区,默认收起;分区标题右侧摘要常显(积分合计、启用数量、优惠数量),明细折进折叠区。

v0.1.2 — 对话框内积分条

Choose a tag to compare

@fu827707013 fu827707013 released this 05 Sep 13:54

新功能

  • 对话内积分条:输入框正下方(统计条旁)常驻积分显示,如 积分 1,642 · x0.06——具体数字 + 当前模型倍率,点击弹出明细面板(合计、各套餐进度条、手动刷新)
  • 积分跟随回合结束自动刷新(running→空闲延迟 2s),60s 兜底轮询;非 CodeBuddy 模型会话自动隐藏

改进

  • status 路由新增全量模型倍率映射(支持任意选中模型解析倍率)
  • 积分查询 30s TTL 缓存,卡片与积分条共享一次上游调用