Repository navigation
Releases: zlZayn/dsh-workbuddy-bridge
Release list
v0.3.1
卡片排版统一,另修三处真机工具缺陷。
卡片
- 四个块统一成同一个模子:最多两行 —— 第一行是「主值 + 右端至多一个控件」,第二行是副说明。
几何取自宿主自己的字段行(fields.module.css的.field=.head一行 +.hint一行,输入框在.head里)。 - 一行只有一档字号:灰字与取值同号,只差颜色与字重。上一版从宿主抄了 12px 灰 / 13px 值两档,
而字号不同的两段文字必然对不齐(flex 的align-items对齐盒子,盒高不同既不共基线也不共中心)。 - 卡片只有一个「刷新」,在展开区顶部它自己的一行,做完整刷新(重读状态文档 并且让宿主重抓目录)。
原先两个按钮都读作「刷新」却做不同的事,且都不去上游 / 一个去上游。 - 账号行显示
已登录 <账号>:昵称拿不到时用账号 id —— 它是 per-account 状态(隐藏的模型、检测记录)
真正键在的那个身份。状态文档新增uid字段。 - 积分页两个读数合成一个、放右侧:
剩余 2,767 / 10,000(27.7%)。 - 修一个会自相矛盾的缺陷:折叠头与展开区各自推导「账号这一行说什么」,登出时折叠头写「未登录」、
展开后写「已登录」,旁边状态灯却是正确地不亮。
工具链(这三处都是「发版前确认」挖出来的)
WorkBuddyCredentialStore的默认密钥提供器原先的 discovery 是'none',
任何没自己传keyProvider的调用方都读不到加密凭据。宿主与 CLI 各自在调用点绕开了它,
scripts/live-e2e.mjs没有,于是在任何平台都跑不了。规则现在只剩 store 一处。scripts/live-e2e.mjs不再写死auto模型(已下架),改为从上游实际目录里挑最便宜的一个。scripts/client-identity-live-matrix.mjs改为跨平台取凭据(原先写死 macOS 路径、且用明文解析器读
加密的 CN 文件);本机未登录的产品按SKIP记,不再要求两个产品都在。scripts/issue-48-forced-fallback-e2e.mjs修掉两处已失效的模块路径,并加平台前提断言
(非 macOS 打SKIP而不是崩成模块错误);不再把解析出的凭据写进~/.dsh/,
改用临时目录、跑完即删。
发版前确认(本机 Windows 实跑,输出即记录)
- 版本线一致:
package.json= 构建产物内置版本 =WORKBUDDY_BRIDGE_VERSION,先 build 再 test 全绿。 - 全量检查:两半 typecheck、
vitest、eslint、prettier --check、check:release全过。 - 文档同步:两份门面同改;链接校验 0 错误 0 警告;换行 0 不一致。
- 真机脚本:
live-e2e.mjs→E2E OK,真实回复、usage 有上报、余额读到。client-identity-live-matrix.mjs→ CN 五个 case 全 PASS(cn-chat/cn-toola+b /cn-probe/baseline-cn);
国际版四个 caseSKIP(本机未登录该产品)。issue-48-forced-fallback-e2e.mjs→SKIP(它驱动真 macOS 发现链,本机是 win32)。
未声称 macOS 自动发现已验证 —— 那条链本机跑不了,判据见 docs/PUBLISHING.md 第 5 条。
身份矩阵也不是「全过」:国际版那四个 case 是跳过,不是通过。
回滚
git revert 对应提交;lib/ 是同名覆盖,回滚即换回旧产物。卡片排版那一版可用 v0.3.0。
v0.3.0
本版要点
| 改动 | 类型 | 使用者可见 |
|---|---|---|
| 推理档位灯泡改判「能否切档位」 | 行为变更 | ✅ |
| 每条消息的消耗积分 + 选择器旁剩余积分(#3) | 新能力 | ✅ |
| 剩余积分改成「币图标 + 数字」读数 | 界面 | ✅ |
修 types 路径 —— 0.3.0 是第一个类型可用的版本 |
缺陷 | ✅ 对 TS 使用者 |
修 non-validating 被显示成「尚未检测」 |
缺陷 | ✅ |
| 修首帧崩溃导致控件整个不渲染 | 缺陷 | ✅ |
| 启动空窗:provider 先于 catalog 揭示(#2) | 缺陷 | ✅ |
本地装法改 link: |
开发体验 | ❌ |
| devDeps 跟到宿主 0.2.0 线 | 依赖 | ❌ |
推理档位:灯泡语义重构
灯泡 = 这个模型能不能切思考档位,不再是「探测过没有」。
- 判据收敛到一处:
src/probe/efforts.ts的resolveEfforts(),模型选择器与 composer 灯泡同源(此前两处各写一份,本可以漂移)。 - 上游已声明档位的模型照常显示灯泡、但禁用检测 —— 声明已经是答案,再探测只会花积分学已知答案。
non-validating(上游对任何值都回 200)保持可检测,因为该结论描述当天上游,不是模型的固有能力。
为什么改
旧判据是「能不能探测 / 探测过没有」,后果是档位直接可用的那些模型反而没有灯泡 —— 最好用的模型看起来最像坏的。
状态文档的 probe 因此从「候选 + 结果」两张表合并成一个 models 列表:两列各自回答一半,谁也不回答用户唯一要问的那个问题。
积分:新增可见性
- 每条回复下方显示这次消耗了多少(#3)。
- 模型选择器旁常驻剩余积分。
- 两者都只在用 WorkBuddy 模型时出现;观测不到就整块不渲染,绝不显示 0。
读数形态
从「剩余 3398」改成 [币图标][3398]:
- 28px 的行高里,一句说明文字会与它标注的数字抢同一眼的注意力,图标已经说明这是什么。完整句子移到
title。 - 币图标是自绘的 —— 宿主 188 个图标里没有币/额度/钱包/货币形状(对着实装包逐个查过)。
- 细线、不是填充:灯泡虽然是一条填充路径,看起来却是细线轮廓,旁边放实心图形就像两套图标混排。
- 比圆柱扁:构造借的是宿主
database的写法,椭圆短轴决定它读作「一摞币」还是「数据库」;ry=1.25像币,ry=1.6像数据库加两道线。
修掉的缺陷
types 指向不存在的路径 —— 0.1.0 起就有
package.json 声明类型入口在 lib/types/index.d.ts,而构建从未产出该目录(实际是根 lib/index.d.ts)。
| 版本 | types 字段 |
实际可用 |
|---|---|---|
| 0.1.0 | lib/types/index.d.ts |
❌ |
| 0.2.0 | lib/types/index.d.ts |
❌ |
| 0.3.0 | ./lib/index.d.ts |
✅ |
后果是静默的:TypeScript 解析不到就落成 untyped module,不报错。所以 0.3.0 是第一个类型可用的版本。
exports["./client"] 的 types 子字段一并删掉 —— client bundle 是 dts: false,指向虚空只会延续同一个假承诺。
新增守卫:断言每个类型入口同时满足「磁盘上存在」与「被 files 覆盖(会进 tarball)」。第二个条件是必要的 —— 只在磁盘上存在、没被 files 覆盖,发布后照样缺。
non-validating 被显示成「尚未检测」
面板把自己刚给出的结论说成「还没查过」,直接印在结论上方 —— 等于告诉用户一个刚花积分问过的问题仍然开着。
现在三态分明:已声明 / 已探明 / 尚未检测。
首帧崩溃导致控件整个不渲染
宿主 store 的初值是 null,而代码判的是 === undefined → 首帧解引用 null.provider 抛错 → 宿主槽的错误边界会闩锁,控件在这次挂载的整个生命周期内都不再出现。表现是「灯泡有时候就是不见了」。
顺带补齐了该控件此前为零的渲染测试 —— 上面两个缺陷因此长期无人拦截。
启动空窗:provider 先于 catalog 揭示(#2)
注册与揭示的顺序是反的:adapter 先注册(读到的 catalog 还是隐藏的,于是建出 0 个模型),首次凭据扫描随后在 fire-and-forget 里才揭示分组。两者之间 listProviders() 已经点名 provider,而 resolveModelInfo 对它的每个模型都答 UNKNOWN_MODEL。
picker 里看不出来(空分组会被宿主丢弃),但一个已经选中该模型的会话——恢复的历史会话、或 agent-default-model——首条消息就失败。
改为三相启动,顺序是契约:
读凭据并采纳身份 → 注册 provider → 抓目录
第二相必须晚于第一相:注册时 catalog 已有内容,provider 一出现就带着模型。两个变体各自并行,互不等待;读失败或未登录时照常以隐藏态注册并交给轮询(即原来的降级路径)。
其他
本地装法改 link:
此前 profile 里是真实目录副本:改源码 → build 不生效,得手动拷 lib/ 再重启;而且拷贝是两半体,只拷一半就版本错位(新客户端读 probe.models、旧宿主半只给 candidates,控件整个不渲染)。
现改为 link: 四步(依赖指向本仓 + 摘除 bundle 条目 + 补手动 insert + symlink)。之后 build 完只需重启 dsh。
devDeps 跟到宿主 0.2.0 线
21 个宿主线包升到 0.2.0-rc.2。engines.dsh 保持 >=0.1.7-rc.2 不动 —— 两条线都实测编译通过:
| 宿主线 | pi-ai | tsc |
|---|---|---|
| 0.1.7 | 0.87.1 | 0 错误 |
| 0.1.7 | 0.85.1 | 0 错误 |
| 0.2.0 | 0.87.1 | 0 错误 |
升级过程带出一个真问题:dsh-llm-pi-ai 把传递依赖 @earendil-works/pi-ai 从 ^0.85.1 抬到 ^0.87.1,本仓写死 0.85.1 导致 pnpm 装出两份同名包、类型互不兼容。已改为 ^0.87.1(与宿主同源的范围语义)。
验证
- 两半 tsc 0 错误、518 tests 通过(11 条平台专属 skip)
- eslint / prettier
--check干净 - 链接校验 0 errors / 0 warnings、换行校验 0 inconsistent
- CI 三平台(ubuntu / windows / macos)全绿
What's Changed
- feat: 每条消息的消耗积分 + 模型选择器旁的剩余积分 by @cslkkl in #3
- fix: provider 注册前先采纳账号,关掉
UNKNOWN_MODEL空窗(#2) - feat: 灯泡改判「能否切档位」;补控件渲染测试并修首帧崩溃
- fix: 灯泡不再随换模型闪烁,且换模型不再重读 status
- fix(package):
types指向真实产物,并加守卫防再漂
New Contributors
Full Changelog: v0.2.0...v0.3.0
v0.2.0
Full Changelog: https://github.com/zlZayn/dsh-workbuddy-bridge/commits/v0.2.0