Skip to content

Releases: zlZayn/dsh-workbuddy-bridge

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 03 Oct 06:44

卡片排版统一,另修三处真机工具缺陷。

卡片

  • 四个块统一成同一个模子:最多两行 —— 第一行是「主值 + 右端至多一个控件」,第二行是副说明。
    几何取自宿主自己的字段行(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-tool a+b / cn-probe / baseline-cn);
      国际版四个 case SKIP(本机未登录该产品)。
    • issue-48-forced-fallback-e2e.mjs → SKIP(它驱动真 macOS 发现链,本机是 win32)。

未声称 macOS 自动发现已验证 —— 那条链本机跑不了,判据见 docs/PUBLISHING.md 第 5 条。
身份矩阵也不是「全过」:国际版那四个 case 是跳过,不是通过。

回滚

git revert 对应提交;lib/ 是同名覆盖,回滚即换回旧产物。卡片排版那一版可用 v0.3.0。

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 02 Oct 13:31

本版要点

改动 类型 使用者可见
推理档位灯泡改判「能否切档位」 行为变更 ✅
每条消息的消耗积分 + 选择器旁剩余积分(#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

  • @cslkkl made their first contribution in #3

Full Changelog: v0.2.0...v0.3.0

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 26 Sep 15:55