dsh-connect-workbuddy 2.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +94 -0
- package/README.en.md +15 -2
- package/README.md +15 -2
- package/lib/bin.js +1 -1
- package/lib/client.js +72 -5
- package/lib/{host-heartbeat-BotcgEag.js → host-heartbeat-CFd55wJG.js} +3 -1
- package/lib/index.d.ts +83 -4
- package/lib/index.js +52 -2
- package/package.json +24 -25
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,99 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.2.0 (2026-09-29)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
#### 图片输入:刷新时按**厂商核验表**覆盖勾选
|
|
8
|
+
|
|
9
|
+
此前图片支持完全由用户手动勾选(默认全关),**上游声明支持的模型也要用户自己一个个找出来勾上**。现在改为:点「从 WorkBuddy 刷新」时,卡片按**厂商核验表**覆盖图片勾选,保存后写入 `imageModelIds`;用户仍可随时手动纠正,只有下一次刷新才会再次覆盖。
|
|
10
|
+
|
|
11
|
+
**关键区分:上游的 `supportsImages` 不是「模型能不能看图」。** 它是**平台侧**的图片输入声明。2026-09-29 用插件自身的凭据路径只读实测(不消耗积分):
|
|
12
|
+
|
|
13
|
+
| 网关 | CLI 模型 | `supportsImages=true` | `=false` | 缺失 |
|
|
14
|
+
|---|---|---|---|---|
|
|
15
|
+
| CN `copilot.tencent.com` | 16 | 15 | 1(仅 `glm-5.1`) | 0 |
|
|
16
|
+
| 国际 `www.workbuddy.ai` | 23 | **23(全部)** | 0 | 0 |
|
|
17
|
+
|
|
18
|
+
拿它当能力答案,就会把纯文本模型也标成能看图。**这个错误本项目犯过一次,姊妹项目 `workbuddy-manager` 也犯过并已修正**——其 CHANGELOG 1.0.70 原文:「此前直接把腾讯的『平台支持图片』开关当成模型的原生能力,于是 GLM-5.3 这类纯文本模型也被标成多模态。现在按厂商文档逐条核对(记录来源与核验日期)……**未核实的新型号显示『待核实』而不猜**」。本版采用同一口径。
|
|
19
|
+
|
|
20
|
+
- **核验表** `NATIVE_MODALITY_BY_MODEL_ID`(新增 `src/native-modality.ts`):13 条,全部核验于 2026-09-25,取自 `workbuddy-manager` 的 `server/services/native_modalities.json`。`glm-5.3` / `glm-5.2` / `glm-5.1` / `hy3` / `hy4-preview` / `deepseek-v4-pro` = `text`;`glm-5.3-flash` / `glm-5v-turbo` / `deepseek-v4.1-flash` / `minimax-m3` / `kimi-k2.6` / `kimi-k2.7` / `kimi-k3-1` = `multimodal`。逐条来源见 `docs/DESIGN.md` 的「图片输入」。
|
|
21
|
+
- **刷新判定** `imageDefaultFor`:只有核验为 `multimodal` 才预勾选。`text` 不勾;`unknown`(含 `auto` 路由器与所有未收录的新模型)**也不勾**——「不猜」正是这张表存在的理由,上游声明不参与判定。平台显式 `false` 保留一票否决。
|
|
22
|
+
- **不做前缀/族匹配**:`glm-5.3` 是 `text` 而 `glm-5.3-flash` 是 `multimodal`,前缀规则必然错一个;`hy3` 是 `text` 而 `hy3-x` 无来源,不能用族关系传递结论。表按**精确 id** 匹配。
|
|
23
|
+
- **分工**:`supportsImages`(平台声明,仍解析并随 `lastCatalog` 持久化)= 展示用;`native_modality`(厂商核验)= 刷新默认值;`multimodal`(运行时生效值)= **只来自保存的 `imageModelIds`**(`src/index.ts` 的 `withImageSelection` 盖章)。解析器从不设置 `multimodal`——刷新目录不会越过用户保存去改运行时,勾选仍是「刷新 = 草稿、保存 = 生效」。
|
|
24
|
+
- **本机实测影响面**:CN 16 个里 **7 个**会预勾选;被排除的纯文本有 `glm-5.3`、`glm-5.2`、`hy3`、`hy4-preview`、`deepseek-v4-pro`(上游对前五个全报 `true`)。国际 23 个里只有 **3 个**有厂商来源,其余 17 个(`gpt-5.x`、`gemini-3.5-flash`、`grok-4.7`、自建别名 `default-model`/`fast-model` 等)都是 `unknown`,默认不勾——这是「不猜」的代价,也是它的意义。
|
|
25
|
+
- **卡片 tooltip**:勾选框按三种情形给出说明(已核验多模态 / 文档为纯文本 / 未核实),否则一排勾选中间夹着两个空框会显得像 bug。
|
|
26
|
+
- **改动面**:`src/upstream.ts` 解析 `supportsImages`(平台声明,仅展示);`src/native-modality.ts`(新)承载核验表与判定;`src/status-paths.ts` / `src/web-status.ts` 透传给卡片;`src/client/WorkBuddyCard.tsx` 的 `refreshModels` 用它覆盖 `imageIds`。**Host 侧运行时逻辑零改动**。
|
|
27
|
+
- **维护负担**:核验表是**快照而非实时同步**,且与 `workbuddy-manager` 仓库各存一份,两边更新需手动同步。新增 id 必须附厂商来源与核验日期。
|
|
28
|
+
- **边界**:静态 fallback 目录不参与判定,新装用户首次刷新并保存后即获得默认勾选;已保存过目录的老用户,勾选状态在下次刷新前保持不变。
|
|
29
|
+
|
|
30
|
+
### Tests
|
|
31
|
+
|
|
32
|
+
- `tests/native-modality.spec.ts`(新增):锁定核验表为唯一判据——`text` 不勾(即便平台报 `true`)、`multimodal` 勾、`unknown`/`router` 不勾、精确 id 匹配(`glm-5.3` vs `glm-5.3-flash`、`hy3` vs `hy3-x` 不得互相传递)、平台显式 `false` 保留否决、表条目数固定为 13 以防 id 悄悄漂入。
|
|
33
|
+
- `tests/upstream.spec.ts`:新增「解析平台声明」一例(true / false / 否决 / 缺失即未知四态),并保留原「解析器不推断 `multimodal`」一例。
|
|
34
|
+
- `tests/web-status.spec.ts`:新增刷新路由一例,确认 `models/refresh` 逐模型带回 `supportsImages`、未声明的条目不带该字段。
|
|
35
|
+
- `tests/persisted-model.spec.ts`:新增一例,确认 `supportsImages` 随 `lastCatalog` 持久化、而 `multimodal` 仍被按 KEY 剥离(严格 JSON codec 兼容)。
|
|
36
|
+
|
|
37
|
+
## 2.1.2 (2026-09-29)
|
|
38
|
+
|
|
39
|
+
### ⚠️ 兼容性修复:peer 上界 `<0.2.0` 会在 0.2.0 落地时把整个组合包静默判死
|
|
40
|
+
|
|
41
|
+
本版**无功能改动**,只修一处**声明**——但这是一处会在下一个 DSH 版本落地那一刻生效、且**用户侧完全无提示**的缺陷。
|
|
42
|
+
|
|
43
|
+
#### 缺陷
|
|
44
|
+
|
|
45
|
+
10 条 `dsh-*` peer 此前写作 `>=0.1.7-rc.1 <0.2.0`。这个上界在写下的当时是对的,但它有一个**只在下一个版本线落地时才显形**的形状:
|
|
46
|
+
|
|
47
|
+
- `0.2.0-rc.1 < 0.2.0` 成立 → 整条 0.2.0 **预发布**线被放行(所以 0.2.0-rc.1 上一切正常)
|
|
48
|
+
- `0.2.0 < 0.2.0` 不成立 → 正式版一发布,**10 条 peer 全部失败**
|
|
49
|
+
|
|
50
|
+
DSH 的随包门禁 `evaluatePluginCompatibility`(`packages/boot/app-boot/src/plugin-compatibility.ts`)逐条判定这 10 条;**只要一条不满足,整个组合包就被 `loadProfileDirectory` 跳过**,只写进 `skippedBundles` 并由 `reportSkippedBundles` 打到 stderr。它不是崩溃,是**静默消失**:provider 不注册、卡片不出现、模型列表清空,页面上没有任何报错。
|
|
51
|
+
|
|
52
|
+
- **取证方式**:把 0.2.0-rc.1 tag 里的 `plugin-compatibility.ts` **原样取出**,喂进本插件真实的 `package.json`。`0.2.0` / `0.2.1` / `0.3.0-rc.1` 全部 `DENIED(10/10 peers fail)`,而 `0.2.0-rc.1` / `0.2.0-rc.2` 通过——即「预发布能用、正式版不能用」的悬崖。
|
|
53
|
+
- **这条路径并非假想**:同机实测,profile 里 `dsh-rewind-plugin`(`^0.1.7-rc.2`)、`dsh-free-search`(`^0.1.7-rc.1`)、`dsh-better-reasoning-effort`、`@changfenhuang/dsh-genui` 四个组合包**已经**因同样的原因没有出现在实时组合里——`listConfigs` 共 203 条,其中无一条来自它们;同 profile 内 peer 全通过的包则全部在场。
|
|
54
|
+
|
|
55
|
+
#### 修法:上界改为 `<0.3.0-0`
|
|
56
|
+
|
|
57
|
+
**为什么带 `-0`**:DSH 至今 **23 个 tag 全部是预发布**(`-alpha.N` / `-rc.N`),从未发过 GA。因此:
|
|
58
|
+
|
|
59
|
+
- `<0.3.0` 只挡 `0.3.0` GA——而 GA 永远不来——上界**永不生效**,同时静默放行 `0.3.0-alpha.1` / `0.3.0-rc.1` 整条从未验证过的线。**这正是今天这个缺陷的形状:看起来是围栏,实际不挡任何东西。**
|
|
60
|
+
- `<0.3.0-0` 显式挡掉 `0.3.0-0`(含)以上的一切预发布与 GA,围栏真的会响。
|
|
61
|
+
|
|
62
|
+
`-0` 是 semver 里「该版本线的最小可能预发布」,所以 `<0.3.0-0` 意为「0.3.0 线一个都不放」。同作者同架构的 `dsh-connect-trae` 2.3.0 对同一处缺陷的处置与此一致。
|
|
63
|
+
|
|
64
|
+
| 宿主 | 改前 | 改后 |
|
|
65
|
+
| --- | --- | --- |
|
|
66
|
+
| `0.1.7-rc.1` / `0.1.7-rc.2` | admitted | admitted(**不回归**) |
|
|
67
|
+
| `0.2.0-rc.1` / `0.2.0-rc.9` / **`0.2.0`** / `0.2.1` / `0.2.99` | rc 通过、**GA 被拒** | admitted |
|
|
68
|
+
| `0.3.0-0` / `0.3.0-alpha.1` / `0.3.0-rc.1` / `0.3.0` | — | **DENIED**(下一线仍未验证,符合原意) |
|
|
69
|
+
|
|
70
|
+
`0.1.7-alpha.1/alpha.2` 改前改后都是 DENIED(`>=0.1.7-rc.1` 下界所限),属既有行为,不是本次引入的回归。
|
|
71
|
+
|
|
72
|
+
#### 顺带移除一处过期声明:`@deepseek-ai/dsh-client-runtime`
|
|
73
|
+
|
|
74
|
+
该包停在 `0.1.1-rc.2`、不在任何受支持主机的捆绑集内,且 **源码零引用**(`src/` 里只有两处注释提到它;构建产物 `lib/client.js` 的 `require` 只有 `react` / `react/jsx-runtime`)。它此前作为「旧主机行的类型来源」被保留,但那条线已随 2.1.0 移除。现连同 **devDependency、pnpm override、tsdown 的 `neverBundle` external** 一并删除——保留一个零引用的 override 只会让清单与 lockfile 继续声称一份并不存在的依赖。
|
|
75
|
+
|
|
76
|
+
#### Tests
|
|
77
|
+
|
|
78
|
+
新增 `tests/dsh-line.spec.ts`(11 例):守卫上下界口径、**上界真的挡得住**、下界不放松、两个客户端包不掉队、过期 devDependency 不回流,外加两条把口径写进发布清单与两份 README 的 POLICY 守卫。
|
|
79
|
+
|
|
80
|
+
- **关键设计**:边界断言**对声明本身求值**,而不是对测试里另写一遍的字面量求值——否则清单与断言各自漂移也能全绿,那正是本套件要防的「看起来是围栏、实际不挡」缺陷换了一层。为此自带一个小而完整的 semver 序比较(本仓库无 `semver` 依赖),并附一条**比较器自检**用例:它错了,整套守卫就是装饰品。
|
|
81
|
+
- **变异验证**(7 处,逐一实测变红):改回 `<0.2.0` → 3 例红;`<0.3.0-0` 改成 `<0.3.0` → 3 例红;下界抬到 `>=0.2.0-rc.1` → 3 例红;**只让 10 条 peer 里的一条漂移** → 4 例红;把 `dsh-client-runtime` 塞回 devDependencies → 2 例红;删掉 `RELEASING.md` 的宿主范围核对 → 1 例红;删掉 README 的范围表 → 1 例红。对照组(未变异)11 例全绿。
|
|
82
|
+
- **比较器可信度**:自写的 semver 序比较与真实 `semver@7.8.5` 做过差分测试,576 组配对全部一致(该差分用例为一次性核对,未随包分发)。
|
|
83
|
+
|
|
84
|
+
#### Docs
|
|
85
|
+
|
|
86
|
+
- `README.md` / `README.en.md`:「版本要求」一节补上**当前验证窗口**(`0.1.7-rc.1` ~ `0.2.x`)与新增的「受支持的宿主范围」表(含 0.3.0 线被明确拒绝),并就地说明 `<0.3.0-0` 与 `<0.3.0` 的区别。两语一致。
|
|
87
|
+
- README 里指向 `tests/` 的引用写成代码体而非 Markdown 链接:`tests/` 不在 npm `files` 白名单内,写成链接在 npm 上会是死链——与 2.1.1 处理 `docs/WINDOWS.md` 时同一考量。
|
|
88
|
+
|
|
89
|
+
#### 复核结论:对 0.2.0-rc.1 零代码改动
|
|
90
|
+
|
|
91
|
+
除上述声明外,**代码一行未改**。逐包核对 0.2.0-rc.1 tag,本插件触碰的 12 个内核包其 `src/` 树与 0.1.7-rc.2 **逐字节相同**(`git rev-parse <tag>:<path>/src` 树哈希相等):
|
|
92
|
+
|
|
93
|
+
`dsh-llm`、`dsh-llm-pi-ai`、`dsh-settings`、`dsh-host-webserver`、`dsh-atomic-write`、`dsh-home-paths`、`dsh-attachment`、`dsh-client-ui-settings`、`dsh-client-ui-slots`、`dsh-client-ui-renderer`、`dsh-client-ui-settings-plugins`、`dsh-client-locale` —— 仅 `package.json` 的 `version` 字段由 `0.1.7-rc.2` 变为 `0.2.0-rc.1`。
|
|
94
|
+
|
|
95
|
+
运行时契约同步核对:`plugins.bundle.config` / `plugins.row.config` 两个槽位仍在且分发点未变(`renderSlot(..., { entryKey })` 三行未改动);客户端 `configForms` 服务与 `PluginConfigViewProps` 契约未变;主题令牌只增未减(插件使用的 `--dsw-alias-state-error-primary` / `-warn-primary` 均在)。实机状态:0.2.0-rc.1 宿主上 `/plugins/dsh-connect-workbuddy/usage` 返回 **200** 真实数据,两个槽位均由 `dsh-connect-workbuddy-client` 占用且 `active: true`,宿主 Config 条目 `include:dsh-connect-workbuddy` 状态为 `schema`。
|
|
96
|
+
|
|
3
97
|
## 2.1.1 (2026-09-26)
|
|
4
98
|
|
|
5
99
|
### Features
|
package/README.en.md
CHANGED
|
@@ -24,7 +24,7 @@ A [DeepSeek Harness (DSH)](https://github.com/deepseek-ai/deepseek-harness) bund
|
|
|
24
24
|
- **Dual parallel providers (CN + international)** — the CN side registers as the `workbuddy` provider (`GLM-5.3`, `DeepSeek-V4-Pro`, `Kimi-K3`, `MiniMax-M3`, `Hy3`, etc.), the international side as `workbuddy-global` (`GPT-5.6`, `Gemini-3.5-Flash`, `GLM-5.3`, `Kimi-K3`, etc.). **A region's models appear in the DSH model picker when that region has an account**: with accounts on both sides, both rosters are selectable at once, and different sessions can each pick a side without interfering. **A region with no local sign-in lists no models** — it cannot serve a single request, so listing them would offer nothing but failures. Sign in once for that region and its models come back on "detect accounts again" or after a restart; the provider itself stays registered either way, because its settings card and account picker are how you sign in. Model names carry the upstream credit multiplier (e.g. `GLM-5.3 · x0.79`), matching WorkBuddy's own model menu.
|
|
25
25
|
- **Tabbed settings card** — the card's top carries a "Domestic / Global" tab bar; each tab holds its own account picker, credits overview, and model management. Account, directory, selection, and unsaved drafts are fully isolated per tab — switching accounts or refreshing models on one tab never touches the other side's runtime catalog or sessions.
|
|
26
26
|
- **Switch either provider off on its own** — each tab carries an on/off checkbox (both checked by default). Unchecking one **withdraws that provider from DSH's model picker entirely** (it is not merely a hidden tab): its adapter route and its "Settings → Models" directory entry are both pulled, and startup no longer sends pointless requests for it. Account, credits, directory, and selection are all kept, and re-checking restores everything. The typical use is "I have no use for the international side" — switch it off and keep the picker clean. Note: a session that had already selected a model from the switched-off provider will report `NO_ADAPTER` on its next call; the card states this plainly on the switched-off tab instead of failing silently.
|
|
27
|
-
- **Model management** — refresh the full catalog from upstream and enable or disable each model individually; refresh is a draft operation that only takes effect on save. Upstream also reports credit multiplier, context/output limits, and reasoning efforts; image input is
|
|
27
|
+
- **Model management** — refresh the full catalog from upstream and enable or disable each model individually; refresh is a draft operation that only takes effect on save. Upstream also reports credit multiplier, context/output limits, and reasoning efforts; **image input is decided by a vendor-verified table**: a refresh pre-checks only models the vendor's own documentation calls natively multimodal, leaves documented text-only models unchecked, and treats anything without a vendor source as unverified and unchecked rather than guessing. Upstream's `supportsImages` is a *platform* declaration, not the model's capability, so it does not drive that decision at all. You can still tick any box by hand, and your selection is kept locally.
|
|
28
28
|
- **Local account switching** — discovers the multiple sign-in credentials WorkBuddy's desktop app leaves behind and lets you switch per region. Tokens are never written to DSH settings.
|
|
29
29
|
- **Actionable advice when a credential is refused** — when the upstream rejects the selected account's token, the plugin actually **probes** the other local sign-ins: if one still answers, it tells you to switch to it (with a one-click switch) instead of vaguely asking you to sign in again — re-authenticating fixes nothing while you are pinned to a revoked backup. Only when there is genuinely no other local account does it ask you to sign in again.
|
|
30
30
|
- **Read-only credits overview** — remaining credit aggregated per package, plus each model's credit multiplier. Queries consume no credits.
|
|
@@ -54,7 +54,20 @@ Credentials are read (read-only) from the WorkBuddy desktop app's own auth file.
|
|
|
54
54
|
|
|
55
55
|
## Install
|
|
56
56
|
|
|
57
|
-
> ⚠️ **Version requirement: DSH 0.1.7-rc.1 or newer.** Since v2.1.0 this plugin only supports hosts on DSH 0.1.7-rc.1 and above (older hosts cannot resolve the dependencies to install this version); hosts on 0.1.5 and earlier should stay on v2.0.15.
|
|
57
|
+
> ⚠️ **Version requirement: DSH 0.1.7-rc.1 or newer (current window: `0.1.7-rc.1` – `0.2.x`).** Since v2.1.0 this plugin only supports hosts on DSH 0.1.7-rc.1 and above (older hosts cannot resolve the dependencies to install this version); hosts on 0.1.5 and earlier should stay on v2.0.15. Since v2.1.2 the upper bound is **`<0.3.0-0`**: the **whole 0.2.0 line, GA included, is verified**; the 0.3.0 line is explicitly refused. See [Supported host range](#supported-host-range) below.
|
|
58
|
+
|
|
59
|
+
### Supported host range
|
|
60
|
+
|
|
61
|
+
DSH's shipped gate (`evaluatePluginCompatibility` in `packages/boot/app-boot/src/plugin-compatibility.ts`) checks every declared `dsh-*` peer range; **one unsatisfied peer skips the entire bundle** (it lands in `skippedBundles` and is only printed to stderr) — no provider is registered, no card appears, the model list goes empty, and the page shows no error at all.
|
|
62
|
+
|
|
63
|
+
| Host version | Verdict |
|
|
64
|
+
| --- | --- |
|
|
65
|
+
| `0.1.7-rc.1` – `0.1.7-rc.2` | ✅ supported |
|
|
66
|
+
| `0.2.0-rc.1` – `0.2.x` (`0.2.0` GA included) | ✅ supported (verified from 2.1.2) |
|
|
67
|
+
| `0.3.0-0` and above | ❌ explicitly refused (that line is unverified) |
|
|
68
|
+
| `0.1.6` and earlier | ❌ explicitly refused (0.1.5 users should stay on v2.0.15) |
|
|
69
|
+
|
|
70
|
+
> The upper bound is written `<0.3.0-0`, not `<0.3.0`: **every DSH tag to date is a prerelease** (`-alpha.N` / `-rc.N`), so `<0.3.0` alone would admit the entire unverified `0.3.0-alpha.1` / `0.3.0-rc.1` line, leaving the guardrail inert — exactly the defect shape 2.1.2 fixes. `tests/dsh-line.spec.ts` guards this contract.
|
|
58
71
|
|
|
59
72
|
> 🪟 **Platform support: Windows, macOS, and Linux are supported side by side.** **Windows is a first-class target**, not an afterthought: CI runs the full suite on `windows-latest`, and four areas carry Windows-specific branches with their own tests — credential paths, process heartbeat, desktop-app executable lookup, and settings writes. **When fixing a defect that only reproduces on Windows, the Windows reporter's field evidence and an encryption vector captured from a real Windows install are what the fix is judged against** (see the 2.0.6 / 2.0.11 / 2.0.12 sections of [CHANGELOG](CHANGELOG.md)). See the [Platform support](#platform-support) section for the per-platform differences and known limitations.
|
|
60
73
|
|
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
- **双供应商并行接入(国内版 + 国际版)** —— 国内版注册为 `workbuddy` provider(`GLM-5.3`、`DeepSeek-V4-Pro`、`Kimi-K3`、`MiniMax-M3`、`Hy3` 等),国际版注册为 `workbuddy-global` provider(`GPT-5.6`、`Gemini-3.5-Flash`、`GLM-5.3`、`Kimi-K3` 等)。**有账号的区域其模型会出现在 DSH 模型选择器里**:两边都有账号时两组同时可选,不同会话可以各选一边,互不干扰。**本机没有账号的区域不列出任何模型**(该区域一个请求也发不出去,列出来只会点到就失败);只要在该区域登录一次,「重新检测账号」或重启后模型就会自动出现——provider 本身始终注册着,因为它的设置卡片与账号选择器正是登录的入口。模型名内嵌上游积分倍率(如 `GLM-5.3 · x0.79`),与 WorkBuddy 自身模型菜单一致。
|
|
31
31
|
- **插件卡片 tab 切换** —— 设置卡片顶部为「国内版 / 国际版」两个 tab,各含独立的账号选择、积分概览与模型管理;每个 tab 的账号、目录、勾选与未保存草稿完全隔离——在一个 tab 里切账号或刷新模型,不会触碰另一边的运行时目录与会话。
|
|
32
32
|
- **可单独关闭任一版本供应商** —— 每个 tab 右侧有一个勾选框(默认都勾选)。**取消勾选即把该供应商从 DSH 模型选择器里彻底撤掉**(不是只藏起 tab):它的路由与「设置 → 模型」页的目录条目一并摘除,启动时也不再为它发无用请求。账号、积分、目录与勾选**全部保留**,重新勾选即完整恢复。典型用法是「我根本用不到国际版」——关掉它,让选择器干净。注意:若某会话此前选中的正是被关闭供应商的模型,该会话再调用会报 `NO_ADAPTER`,卡片会在关闭态的 tab 上明确提示这一点,不会静默失败。
|
|
33
|
-
- **模型管理** ——
|
|
33
|
+
- **模型管理** —— 从上游刷新完整模型目录,逐项勾选启用或禁用;刷新是草稿操作,点保存才生效。上游同时给出积分倍率、上下文/输出上限与推理档位;**图片输入按厂商核验表判定**:刷新时只有厂商文档明确写为原生多模态的模型才自动勾选,文档写明纯文本的不勾,**没有厂商资料的一律按「未核实」不猜**(上游的 `supportsImages` 是平台侧声明,不等于模型能看图,不参与判定)。用户仍可随时手动勾选,勾选状态保存在本地。
|
|
34
34
|
- **本机账号切换** —— 自动发现 WorkBuddy 桌面端留下的多个登录凭据,可按区域切换账号;Token 不写入 DSH 设置。
|
|
35
35
|
- **凭据失效时给出可执行的建议** —— 上游拒绝当前账号的 token 时,插件会**实际探测**本机其他账号:若有账号仍然可用,就直接告诉你「切换到它即可」(并附一键切换),而不是笼统地让你重新登录——被钉在一个作废的旧备份上时,重新登录并不能解决问题。只有本机确实没有别的账号可切换时,才会提示重新登录。
|
|
36
36
|
- **只读积分概览** —— 按套餐聚合展示剩余积分,并列出每个模型的积分倍率。查询不消耗积分。
|
|
@@ -60,7 +60,20 @@ DSH PiAiAdapter(每个 provider 一套)
|
|
|
60
60
|
|
|
61
61
|
## 安装
|
|
62
62
|
|
|
63
|
-
> ⚠️ **版本要求:DSH 0.1.7-rc.1
|
|
63
|
+
> ⚠️ **版本要求:DSH 0.1.7-rc.1 及以上(当前窗口:`0.1.7-rc.1` ~ `0.2.x`)。** 自 v2.1.0 起本插件只支持 DSH 0.1.7-rc.1 及以上的宿主(旧版宿主无法通过依赖解析安装本版);0.1.5 及更早的宿主请停留在 v2.0.15。自 v2.1.2 起上界放宽为 **`<0.3.0-0`**——**0.2.0 全线(含正式版)已实测支持**,0.3.0 线则被明确拒绝。详见下方[受支持的宿主范围](#受支持的宿主范围)。
|
|
64
|
+
|
|
65
|
+
### 受支持的宿主范围
|
|
66
|
+
|
|
67
|
+
DSH 的随包门禁(`packages/boot/app-boot/src/plugin-compatibility.ts` 的 `evaluatePluginCompatibility`)会逐条核对本插件声明的 `dsh-*` peer 范围;**只要有一条不满足,整个组合包会被跳过**(进入 `skippedBundles`,仅打印到 stderr)——provider 不注册、卡片不出现、模型列表清空,而页面上没有任何报错。
|
|
68
|
+
|
|
69
|
+
| 宿主版本 | 判定 |
|
|
70
|
+
| --- | --- |
|
|
71
|
+
| `0.1.7-rc.1` ~ `0.1.7-rc.2` | ✅ 支持 |
|
|
72
|
+
| `0.2.0-rc.1` ~ `0.2.x`(含 `0.2.0` 正式版) | ✅ 支持(2.1.2 起实测) |
|
|
73
|
+
| `0.3.0-0` 及以上 | ❌ 明确拒绝(该线尚未验证) |
|
|
74
|
+
| `0.1.6` 及更早 | ❌ 明确拒绝(0.1.5 线请停留在 v2.0.15) |
|
|
75
|
+
|
|
76
|
+
> 上界写作 `<0.3.0-0` 而非 `<0.3.0`:DSH 至今**全部 tag 都是预发布**(`-alpha.N` / `-rc.N`),只写 `<0.3.0` 会放行整条 `0.3.0-alpha.1` / `0.3.0-rc.1` 这条从未验证过的线,围栏形同虚设——这正是 2.1.2 修掉的缺陷形状。该口径由 `tests/dsh-line.spec.ts` 守卫。
|
|
64
77
|
|
|
65
78
|
> 🪟 **平台支持:Windows、macOS、Linux 三者并列支持。** **Windows 是一等目标平台**,不是「顺带能跑」:CI 在 `windows-latest` 上跑完整套件,凭据路径、进程心跳、App 可执行文件定位、设置写入四处都有 Windows 专属分支与测试,并且**修复只对 Windows 生效的缺陷时,以 Windows 用户回报的现场与真机取证的加密向量为准**(见 [CHANGELOG](CHANGELOG.md) 的 2.0.6 / 2.0.11 / 2.0.12 各节)。见下方[平台支持](#平台支持)一节了解各平台的具体差异与已知限制。
|
|
66
79
|
|
package/lib/bin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { O as workbuddyOwnAuthPath, T as legacyWorkbuddyOwnAuthPath, W as findWorkbuddyAppExecutable, _ as WorkBuddyCredentialStore, a as readHostHeartbeat, b as defaultDesktopAuthCandidates, c as WORKBUDDY_CONNECT_VERSION, g as WORKBUDDY_AUTH_FILE_ENV, j as WorkBuddyUpstreamClient, l as FALLBACK_WORKBUDDY_MODELS, o as workbuddyHostHeartbeatPath, r as isHeartbeatProcessAlive, u as FALLBACK_WORKBUDDY_MODELS_GLOBAL, x as defaultDesktopAuthDirs, z as WORKBUDDY_APP_EXECUTABLE_ENV } from "./host-heartbeat-
|
|
2
|
+
import { O as workbuddyOwnAuthPath, T as legacyWorkbuddyOwnAuthPath, W as findWorkbuddyAppExecutable, _ as WorkBuddyCredentialStore, a as readHostHeartbeat, b as defaultDesktopAuthCandidates, c as WORKBUDDY_CONNECT_VERSION, g as WORKBUDDY_AUTH_FILE_ENV, j as WorkBuddyUpstreamClient, l as FALLBACK_WORKBUDDY_MODELS, o as workbuddyHostHeartbeatPath, r as isHeartbeatProcessAlive, u as FALLBACK_WORKBUDDY_MODELS_GLOBAL, x as defaultDesktopAuthDirs, z as WORKBUDDY_APP_EXECUTABLE_ENV } from "./host-heartbeat-CFd55wJG.js";
|
|
3
3
|
import { realpathSync } from "node:fs";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
//#region src/bin.ts
|
package/lib/client.js
CHANGED
|
@@ -401,6 +401,55 @@ window.__ModuleLoader__.load({
|
|
|
401
401
|
});
|
|
402
402
|
}
|
|
403
403
|
//#endregion
|
|
404
|
+
//#region src/native-modality.ts
|
|
405
|
+
/**
|
|
406
|
+
* Reviewed vendor classifications, keyed by EXACT model id (never a prefix).
|
|
407
|
+
* Ids absent from this record are `unknown` — see {@link nativeModalityOf}.
|
|
408
|
+
*/
|
|
409
|
+
const NATIVE_MODALITY_BY_MODEL_ID = {
|
|
410
|
+
"deepseek-v4-pro": "text",
|
|
411
|
+
"glm-5.1": "text",
|
|
412
|
+
"glm-5.2": "text",
|
|
413
|
+
"glm-5.3": "text",
|
|
414
|
+
"hy3": "text",
|
|
415
|
+
"hy4-preview": "text",
|
|
416
|
+
"deepseek-v4.1-flash": "multimodal",
|
|
417
|
+
"glm-5.3-flash": "multimodal",
|
|
418
|
+
"glm-5v-turbo": "multimodal",
|
|
419
|
+
"kimi-k2.6": "multimodal",
|
|
420
|
+
"kimi-k2.7": "multimodal",
|
|
421
|
+
"kimi-k3-1": "multimodal",
|
|
422
|
+
"minimax-m3": "multimodal"
|
|
423
|
+
};
|
|
424
|
+
/** The `auto` entry is a router that picks a model, not a model itself. */
|
|
425
|
+
const ROUTER_MODEL_ID = "auto";
|
|
426
|
+
/**
|
|
427
|
+
* Native modality of one model id. Exact match only: a new model never
|
|
428
|
+
* inherits a classification from its family, its display name, or the
|
|
429
|
+
* platform's image flag.
|
|
430
|
+
*/
|
|
431
|
+
function nativeModalityOf(modelId) {
|
|
432
|
+
if (modelId === ROUTER_MODEL_ID) return "router";
|
|
433
|
+
return NATIVE_MODALITY_BY_MODEL_ID[modelId] ?? "unknown";
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Whether a model refresh should PRE-CHECK this model's image box.
|
|
437
|
+
*
|
|
438
|
+
* Only a documented `multimodal` is pre-checked. `text` is documented as
|
|
439
|
+
* unable to read images, and `unknown` is deliberately left unchecked rather
|
|
440
|
+
* than guessed — the whole reason this table exists is that the platform flag
|
|
441
|
+
* guessed wrong. A platform `supportsImages: false` still vetoes, so a
|
|
442
|
+
* documented-multimodal id can never be pre-checked against the platform's
|
|
443
|
+
* explicit "no".
|
|
444
|
+
*
|
|
445
|
+
* The user can always tick a box by hand; this decides a DEFAULT only, and the
|
|
446
|
+
* effective runtime flag remains the saved `imageModelIds`.
|
|
447
|
+
*/
|
|
448
|
+
function imageDefaultFor(info) {
|
|
449
|
+
if (info.supportsImages === false) return false;
|
|
450
|
+
return NATIVE_MODALITY_BY_MODEL_ID[info.id] === "multimodal";
|
|
451
|
+
}
|
|
452
|
+
//#endregion
|
|
404
453
|
//#region src/client/icon.ts
|
|
405
454
|
/**
|
|
406
455
|
* Plugin icon (LD brand logo, 64px) shared across the LaoDing plugin family.
|
|
@@ -699,6 +748,20 @@ window.__ModuleLoader__.load({
|
|
|
699
748
|
*/
|
|
700
749
|
const POLL_INTERVAL_MS = 6e4;
|
|
701
750
|
const WORKBUDDY_GITHUB_URL = "https://github.com/dingminhua/dsh-connect-workbuddy";
|
|
751
|
+
/**
|
|
752
|
+
* Tooltip for one model's image checkbox. The box is pre-checked only for
|
|
753
|
+
* models the vendored vendor table documents as natively multimodal, so the
|
|
754
|
+
* two other outcomes need to say WHY they are off — otherwise a documented
|
|
755
|
+
* text-only model and an unverified one look identically broken next to their
|
|
756
|
+
* checked siblings.
|
|
757
|
+
*/
|
|
758
|
+
function imageCheckboxHint(model, t) {
|
|
759
|
+
switch (nativeModalityOf(model.id)) {
|
|
760
|
+
case "multimodal": return t("row.modelImage");
|
|
761
|
+
case "text": return t("row.modelImageText");
|
|
762
|
+
default: return t("row.modelImageUnverified");
|
|
763
|
+
}
|
|
764
|
+
}
|
|
702
765
|
/** Inject or refresh the shared card CSS for the current client bundle. */
|
|
703
766
|
if (typeof document !== "undefined") {
|
|
704
767
|
const cssId = "dsh-connect-workbuddy/client.css";
|
|
@@ -1042,7 +1105,7 @@ window.__ModuleLoader__.load({
|
|
|
1042
1105
|
const fresh = body.models;
|
|
1043
1106
|
const freshIds = new Set(fresh.map((model) => model.id));
|
|
1044
1107
|
const stillEnabled = [...activeEnabledIds].filter((id) => freshIds.has(id));
|
|
1045
|
-
const
|
|
1108
|
+
const upstreamImages = fresh.filter((model) => imageDefaultFor(model)).map((model) => model.id);
|
|
1046
1109
|
const stillBudgets = {};
|
|
1047
1110
|
for (const id of freshIds) {
|
|
1048
1111
|
const budget = activeContextBudgets[id];
|
|
@@ -1053,7 +1116,7 @@ window.__ModuleLoader__.load({
|
|
|
1053
1116
|
[activeRegion]: {
|
|
1054
1117
|
models: fresh,
|
|
1055
1118
|
enabledIds: new Set(stillEnabled),
|
|
1056
|
-
imageIds: new Set(
|
|
1119
|
+
imageIds: new Set(upstreamImages),
|
|
1057
1120
|
contextBudgets: stillBudgets
|
|
1058
1121
|
}
|
|
1059
1122
|
}));
|
|
@@ -1500,7 +1563,7 @@ window.__ModuleLoader__.load({
|
|
|
1500
1563
|
}),
|
|
1501
1564
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
|
|
1502
1565
|
className: "dsm-workbuddy-model-image",
|
|
1503
|
-
title: t
|
|
1566
|
+
title: imageCheckboxHint(model, t),
|
|
1504
1567
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
1505
1568
|
type: "checkbox",
|
|
1506
1569
|
checked: activeImageIds.has(model.id),
|
|
@@ -1688,7 +1751,9 @@ window.__ModuleLoader__.load({
|
|
|
1688
1751
|
"row.modelOutput": "Output {output}",
|
|
1689
1752
|
"row.modelRate": "{rate}x credits",
|
|
1690
1753
|
"row.modelMultimodal": "Multimodal",
|
|
1691
|
-
"row.modelImage": "Image",
|
|
1754
|
+
"row.modelImage": "Image (vendor-documented multimodal)",
|
|
1755
|
+
"row.modelImageText": "Image input: the vendor documents this model as text-only, so a refresh leaves it unchecked. Tick it yourself only if you know it reads images.",
|
|
1756
|
+
"row.modelImageUnverified": "Image input unverified: no vendor source confirms this model reads images, so a refresh leaves it unchecked rather than guessing. Tick it yourself if you have verified it works.",
|
|
1692
1757
|
"row.modelReasoning": "Reasoning: {efforts}",
|
|
1693
1758
|
"row.modelUnknown": "Unknown",
|
|
1694
1759
|
"row.modelCapabilityPending": "Only capabilities advertised by WorkBuddy are shown.",
|
|
@@ -1763,7 +1828,9 @@ window.__ModuleLoader__.load({
|
|
|
1763
1828
|
"row.modelOutput": "最大输出 {output}",
|
|
1764
1829
|
"row.modelRate": "积分 {rate}x",
|
|
1765
1830
|
"row.modelMultimodal": "多模态",
|
|
1766
|
-
"row.modelImage": "
|
|
1831
|
+
"row.modelImage": "图片(厂商文档标明原生多模态)",
|
|
1832
|
+
"row.modelImageText": "图片输入:厂商文档标明该模型仅支持文本,因此刷新时不会自动勾选。只有你确认它能读图,才建议手动勾上。",
|
|
1833
|
+
"row.modelImageUnverified": "图片输入未核实:没有厂商资料确认该模型能读图,刷新时按「不猜」处理,不会自动勾选。如果你验证过确实可用,可以手动勾上。",
|
|
1767
1834
|
"row.modelReasoning": "推理强度:{efforts}",
|
|
1768
1835
|
"row.modelUnknown": "未知",
|
|
1769
1836
|
"row.modelCapabilityPending": "仅展示 WorkBuddy 接口明确公布的模型能力。",
|
|
@@ -747,12 +747,14 @@ function parseUpstreamModel(value) {
|
|
|
747
747
|
const creditMultiplier = parseCreditMultiplier(raw["credits"]);
|
|
748
748
|
const reasoning = parseReasoning(raw["reasoning"]);
|
|
749
749
|
const supportsToolCall = typeof raw["supportsToolCall"] === "boolean" ? raw["supportsToolCall"] : void 0;
|
|
750
|
+
const supportsImages = raw["disabledMultimodal"] === true ? false : typeof raw["supportsImages"] === "boolean" ? raw["supportsImages"] : void 0;
|
|
750
751
|
return {
|
|
751
752
|
id,
|
|
752
753
|
name,
|
|
753
754
|
contextWindow: input,
|
|
754
755
|
maxTokens: output,
|
|
755
756
|
...creditMultiplier === void 0 ? {} : { creditMultiplier },
|
|
757
|
+
...supportsImages === void 0 ? {} : { supportsImages },
|
|
756
758
|
...reasoning === void 0 ? {} : { reasoning },
|
|
757
759
|
...descriptionZh === void 0 ? {} : { descriptionZh },
|
|
758
760
|
...descriptionEn === void 0 ? {} : { descriptionEn },
|
|
@@ -2208,7 +2210,7 @@ var WorkBuddyCatalog = class {
|
|
|
2208
2210
|
//#endregion
|
|
2209
2211
|
//#region src/version.ts
|
|
2210
2212
|
/** The npm package version this build was produced from. */
|
|
2211
|
-
const WORKBUDDY_CONNECT_VERSION = "2.
|
|
2213
|
+
const WORKBUDDY_CONNECT_VERSION = "2.2.0";
|
|
2212
2214
|
//#endregion
|
|
2213
2215
|
//#region src/host-heartbeat.ts
|
|
2214
2216
|
/**
|
package/lib/index.d.ts
CHANGED
|
@@ -430,9 +430,23 @@ interface WorkBuddyUpstreamModel {
|
|
|
430
430
|
/** Credit multiplier parsed from the upstream `credits` string. */
|
|
431
431
|
creditMultiplier?: number;
|
|
432
432
|
/**
|
|
433
|
-
*
|
|
434
|
-
*
|
|
435
|
-
*
|
|
433
|
+
* Upstream's OWN image-input default, parsed from `supportsImages` with
|
|
434
|
+
* `disabledMultimodal: true` as a veto. This is only a PRE-FILL for the
|
|
435
|
+
* card's image checkboxes on "Refresh from WorkBuddy" (the refreshed draft
|
|
436
|
+
* overwrites the saved image selection with the models advertising this):
|
|
437
|
+
* it is not itself the runtime capability.
|
|
438
|
+
*
|
|
439
|
+
* The effective flag stays {@link multimodal}, stamped at runtime from the
|
|
440
|
+
* user's saved `imageModelIds` — so a user can still uncheck an upstream-
|
|
441
|
+
* advertised model, and the checked state only changes on an explicit
|
|
442
|
+
* refresh/save.
|
|
443
|
+
*/
|
|
444
|
+
supportsImages?: boolean;
|
|
445
|
+
/**
|
|
446
|
+
* Effective image-input support at runtime, decided by the saved
|
|
447
|
+
* `imageModelIds` (which a model refresh pre-fills from {@link supportsImages}
|
|
448
|
+
* but the user can edit before saving). Never inferred directly by the
|
|
449
|
+
* catalog parser — see `withImageSelection` in `index.ts`.
|
|
436
450
|
*/
|
|
437
451
|
multimodal?: boolean;
|
|
438
452
|
reasoning?: WorkBuddyReasoning;
|
|
@@ -794,6 +808,63 @@ declare function workBuddyThinkingLevelMap(info: WorkBuddyModelInfo): WorkBuddyT
|
|
|
794
808
|
*/
|
|
795
809
|
declare function createWorkBuddyAdapter(options: WorkBuddyAdapterOptions): WorkBuddyAdapter;
|
|
796
810
|
//#endregion
|
|
811
|
+
//#region src/native-modality.d.ts
|
|
812
|
+
/**
|
|
813
|
+
* Model-native multimodality, vendored from vendor documentation.
|
|
814
|
+
*
|
|
815
|
+
* The upstream catalog's `supportsImages` is the PLATFORM's image-input
|
|
816
|
+
* declaration, not the model's native capability: on live data it is `true`
|
|
817
|
+
* for 15/16 CN and 23/23 international models, including text-only ones. Using
|
|
818
|
+
* it as the capability answer is a mistake this project already made once (see
|
|
819
|
+
* `docs/DESIGN.md` 「图片输入」), and the sibling `workbuddy-manager` project hit
|
|
820
|
+
* the same defect and fixed it the same way — a reviewed table keyed by exact
|
|
821
|
+
* model id, with a source and a review date per entry.
|
|
822
|
+
*
|
|
823
|
+
* This snapshot is copied from that project's
|
|
824
|
+
* `server/services/native_modalities.json` (all entries reviewed 2026-09-25).
|
|
825
|
+
* The provenance — per-id source URL and evidence — is kept in
|
|
826
|
+
* `docs/DESIGN.md` rather than here, because the build ships this module's
|
|
827
|
+
* comments verbatim into the browser bundle. Keep the two in sync when either
|
|
828
|
+
* side is updated; this is a maintained snapshot, NOT a live read.
|
|
829
|
+
*
|
|
830
|
+
* Only two states are vendored because only two are ever confirmed: an id is
|
|
831
|
+
* either documented `multimodal` or documented `text`. Everything else —
|
|
832
|
+
* including brand-new models — is `unknown` and MUST stay unclassified rather
|
|
833
|
+
* than inheriting a neighbour's answer or the platform flag.
|
|
834
|
+
*
|
|
835
|
+
* @module dsh-connect-workbuddy/native-modality
|
|
836
|
+
*/
|
|
837
|
+
/** Documented native input modality for one exact model id. */
|
|
838
|
+
type WorkBuddyNativeModality = 'text' | 'multimodal' | 'router' | 'unknown';
|
|
839
|
+
/**
|
|
840
|
+
* Reviewed vendor classifications, keyed by EXACT model id (never a prefix).
|
|
841
|
+
* Ids absent from this record are `unknown` — see {@link nativeModalityOf}.
|
|
842
|
+
*/
|
|
843
|
+
declare const NATIVE_MODALITY_BY_MODEL_ID: Readonly<Record<string, 'text' | 'multimodal'>>;
|
|
844
|
+
/**
|
|
845
|
+
* Native modality of one model id. Exact match only: a new model never
|
|
846
|
+
* inherits a classification from its family, its display name, or the
|
|
847
|
+
* platform's image flag.
|
|
848
|
+
*/
|
|
849
|
+
declare function nativeModalityOf(modelId: string): WorkBuddyNativeModality;
|
|
850
|
+
/**
|
|
851
|
+
* Whether a model refresh should PRE-CHECK this model's image box.
|
|
852
|
+
*
|
|
853
|
+
* Only a documented `multimodal` is pre-checked. `text` is documented as
|
|
854
|
+
* unable to read images, and `unknown` is deliberately left unchecked rather
|
|
855
|
+
* than guessed — the whole reason this table exists is that the platform flag
|
|
856
|
+
* guessed wrong. A platform `supportsImages: false` still vetoes, so a
|
|
857
|
+
* documented-multimodal id can never be pre-checked against the platform's
|
|
858
|
+
* explicit "no".
|
|
859
|
+
*
|
|
860
|
+
* The user can always tick a box by hand; this decides a DEFAULT only, and the
|
|
861
|
+
* effective runtime flag remains the saved `imageModelIds`.
|
|
862
|
+
*/
|
|
863
|
+
declare function imageDefaultFor(info: {
|
|
864
|
+
id: string;
|
|
865
|
+
supportsImages?: boolean;
|
|
866
|
+
}): boolean;
|
|
867
|
+
//#endregion
|
|
797
868
|
//#region src/at-rest.d.ts
|
|
798
869
|
/**
|
|
799
870
|
* WorkBuddy desktop "at-rest" credential decryption.
|
|
@@ -1217,6 +1288,14 @@ interface WorkBuddyWebModel {
|
|
|
1217
1288
|
nativeContextWindow: number;
|
|
1218
1289
|
maxTokens: number;
|
|
1219
1290
|
creditMultiplier?: number;
|
|
1291
|
+
/**
|
|
1292
|
+
* Upstream's own image-input default from the latest refresh. Used ONLY to
|
|
1293
|
+
* pre-fill the image checkboxes when "Refresh from WorkBuddy" overwrites the
|
|
1294
|
+
* draft; it is not the effective capability. Persisted inside `lastCatalog`
|
|
1295
|
+
* (it rides along in the saved entries) but never read as the runtime flag —
|
|
1296
|
+
* that stays `imageModelIds` → stamped `multimodal`.
|
|
1297
|
+
*/
|
|
1298
|
+
supportsImages?: boolean;
|
|
1220
1299
|
multimodal?: boolean;
|
|
1221
1300
|
reasoning?: {
|
|
1222
1301
|
supportedEfforts?: readonly string[];
|
|
@@ -1660,4 +1739,4 @@ declare function legacyAttributionRegion(value: Config, accountsFor: (region: Wo
|
|
|
1660
1739
|
*/
|
|
1661
1740
|
declare function apply(ctx: Context, config: Config): void;
|
|
1662
1741
|
//#endregion
|
|
1663
|
-
export { CREDENTIAL_REJECTED_CODE, Config, ENCRYPTED_CREDENTIAL_CODE, FALLBACK_WORKBUDDY_MODELS, FALLBACK_WORKBUDDY_MODELS_GLOBAL, type UpstreamErrorKind, WORKBUDDY_ACCOUNTS_REFRESH_PATH, WORKBUDDY_APP_EXECUTABLE_ENV, WORKBUDDY_AUTH_FILENAME, WORKBUDDY_AUTH_FILE_ENV, WORKBUDDY_CHECKIN_PATH, WORKBUDDY_CONNECT_VERSION, WORKBUDDY_GLOBAL_PROVIDER, WORKBUDDY_HOST_HEARTBEAT_FILENAME, WORKBUDDY_MODELS_REFRESH_PATH, WORKBUDDY_PROVIDER, WORKBUDDY_PROVIDERS, WORKBUDDY_PROVIDER_DISPLAY_NAMES, WORKBUDDY_REGIONS, WORKBUDDY_REGION_PARAM, WORKBUDDY_SETTINGS_NS, WORKBUDDY_STREAM_IDLE_TIMEOUT_MS, WORKBUDDY_USAGE_PATH, type WorkBuddyAccountChoice, type WorkBuddyAdapter, type WorkBuddyAuthStatus, type WorkBuddyCandidateFailure, WorkBuddyCatalog, type WorkBuddyChatResult, type WorkBuddyCredential, type WorkBuddyCredentialRecovery, WorkBuddyCredentialRejectedError, WorkBuddyCredentialStore, type WorkBuddyCreditPackage, type WorkBuddyCredits, WorkBuddyEncryptedCredentialError, type WorkBuddyEncryptedField, type WorkBuddyHostHeartbeat, type WorkBuddyModelInfo, type WorkBuddyProbeStore, type WorkBuddyReasoning, type WorkBuddyRecoveryCandidate, type WorkBuddyRefreshOutcome, WorkBuddyRegionState, type WorkBuddyShim, type WorkBuddyStatusRouteOptions, type WorkBuddyStoreOptions, WorkBuddyUpstreamClient, type WorkBuddyUpstreamModel, type WorkBuddyUsabilityProbeOptions, apply, asVolatile, authFileName, classifyUpstreamError, clearAtRestKeyCache, clearHostHeartbeat, createAccountUsabilityProbe, createWorkBuddyAdapter, createWorkBuddyShim, defaultDesktopAuthCandidates, defaultDesktopAuthDirs, defaultDesktopAuthPath, deriveAtRestKey, deriveAtRestKeyId, deriveCatalog, fallbackModelsFor, fetchAtRestKeyPayload, findWorkbuddyAppExecutable, hasEncryptedCredentialFields, inject, isCredentialRejectedError, isEncryptedCredentialError, isEncryptedFieldWrapper, isHeartbeatProcessAlive, isWorkbuddyBundle, legacyAttributionRegion, legacyWorkbuddyOwnAuthPath, macosBundleExecutable, macosNestedAppBundles, name, nextRegionEnabled, nextRegionSlots, openEncryptedField, parseCreditMultiplier, parseReasoning, parseUpstreamModel, parseWorkBuddyAuth, prepareChatBody, processStartTimeMs, readAtRestKey, readHostHeartbeat, regionCleared, regionEnabled, regionEnabledOf, regionOf, regionOfProvider, regionOfStatusUrl, regionStateOf, registerWorkBuddyStatusRoute, resolveCredentialRecovery, selectAccountFor, settingsNamespaceOf, toPersistedWorkBuddyModel, unwrapVolatileDeep, withWorkBuddyRegion, workBuddyDisplayName, workBuddyModelInput, workBuddyThinkingLevelMap, workBuddyWebStatus, workbuddyAccountId, workbuddyAppExecutableCandidates, workbuddyHostHeartbeatPath, workbuddyOwnAuthPath, writeHostHeartbeat };
|
|
1742
|
+
export { CREDENTIAL_REJECTED_CODE, Config, ENCRYPTED_CREDENTIAL_CODE, FALLBACK_WORKBUDDY_MODELS, FALLBACK_WORKBUDDY_MODELS_GLOBAL, NATIVE_MODALITY_BY_MODEL_ID, type UpstreamErrorKind, WORKBUDDY_ACCOUNTS_REFRESH_PATH, WORKBUDDY_APP_EXECUTABLE_ENV, WORKBUDDY_AUTH_FILENAME, WORKBUDDY_AUTH_FILE_ENV, WORKBUDDY_CHECKIN_PATH, WORKBUDDY_CONNECT_VERSION, WORKBUDDY_GLOBAL_PROVIDER, WORKBUDDY_HOST_HEARTBEAT_FILENAME, WORKBUDDY_MODELS_REFRESH_PATH, WORKBUDDY_PROVIDER, WORKBUDDY_PROVIDERS, WORKBUDDY_PROVIDER_DISPLAY_NAMES, WORKBUDDY_REGIONS, WORKBUDDY_REGION_PARAM, WORKBUDDY_SETTINGS_NS, WORKBUDDY_STREAM_IDLE_TIMEOUT_MS, WORKBUDDY_USAGE_PATH, type WorkBuddyAccountChoice, type WorkBuddyAdapter, type WorkBuddyAuthStatus, type WorkBuddyCandidateFailure, WorkBuddyCatalog, type WorkBuddyChatResult, type WorkBuddyCredential, type WorkBuddyCredentialRecovery, WorkBuddyCredentialRejectedError, WorkBuddyCredentialStore, type WorkBuddyCreditPackage, type WorkBuddyCredits, WorkBuddyEncryptedCredentialError, type WorkBuddyEncryptedField, type WorkBuddyHostHeartbeat, type WorkBuddyModelInfo, type WorkBuddyNativeModality, type WorkBuddyProbeStore, type WorkBuddyReasoning, type WorkBuddyRecoveryCandidate, type WorkBuddyRefreshOutcome, WorkBuddyRegionState, type WorkBuddyShim, type WorkBuddyStatusRouteOptions, type WorkBuddyStoreOptions, WorkBuddyUpstreamClient, type WorkBuddyUpstreamModel, type WorkBuddyUsabilityProbeOptions, apply, asVolatile, authFileName, classifyUpstreamError, clearAtRestKeyCache, clearHostHeartbeat, createAccountUsabilityProbe, createWorkBuddyAdapter, createWorkBuddyShim, defaultDesktopAuthCandidates, defaultDesktopAuthDirs, defaultDesktopAuthPath, deriveAtRestKey, deriveAtRestKeyId, deriveCatalog, fallbackModelsFor, fetchAtRestKeyPayload, findWorkbuddyAppExecutable, hasEncryptedCredentialFields, imageDefaultFor, inject, isCredentialRejectedError, isEncryptedCredentialError, isEncryptedFieldWrapper, isHeartbeatProcessAlive, isWorkbuddyBundle, legacyAttributionRegion, legacyWorkbuddyOwnAuthPath, macosBundleExecutable, macosNestedAppBundles, name, nativeModalityOf, nextRegionEnabled, nextRegionSlots, openEncryptedField, parseCreditMultiplier, parseReasoning, parseUpstreamModel, parseWorkBuddyAuth, prepareChatBody, processStartTimeMs, readAtRestKey, readHostHeartbeat, regionCleared, regionEnabled, regionEnabledOf, regionOf, regionOfProvider, regionOfStatusUrl, regionStateOf, registerWorkBuddyStatusRoute, resolveCredentialRecovery, selectAccountFor, settingsNamespaceOf, toPersistedWorkBuddyModel, unwrapVolatileDeep, withWorkBuddyRegion, workBuddyDisplayName, workBuddyModelInput, workBuddyThinkingLevelMap, workBuddyWebStatus, workbuddyAccountId, workbuddyAppExecutableCandidates, workbuddyHostHeartbeatPath, workbuddyOwnAuthPath, writeHostHeartbeat };
|
package/lib/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as WorkBuddyCredentialRejectedError, B as clearAtRestKeyCache, C as hasEncryptedCredentialFields, D as workbuddyAccountId, E as parseWorkBuddyAuth, F as parseReasoning, G as isEncryptedFieldWrapper, H as deriveAtRestKeyId, I as parseUpstreamModel, J as macosNestedAppBundles, K as isWorkbuddyBundle, L as prepareChatBody, M as classifyUpstreamError, N as isCredentialRejectedError, O as workbuddyOwnAuthPath, P as parseCreditMultiplier, R as regionOf, S as defaultDesktopAuthPath, T as legacyWorkbuddyOwnAuthPath, U as fetchAtRestKeyPayload, V as deriveAtRestKey, W as findWorkbuddyAppExecutable, X as readAtRestKey, Y as openEncryptedField, Z as workbuddyAppExecutableCandidates, _ as WorkBuddyCredentialStore, a as readHostHeartbeat, b as defaultDesktopAuthCandidates, c as WORKBUDDY_CONNECT_VERSION, d as WorkBuddyCatalog, f as deriveCatalog, g as WORKBUDDY_AUTH_FILE_ENV, h as WORKBUDDY_AUTH_FILENAME, i as processStartTimeMs, j as WorkBuddyUpstreamClient, k as CREDENTIAL_REJECTED_CODE, l as FALLBACK_WORKBUDDY_MODELS, m as ENCRYPTED_CREDENTIAL_CODE, n as clearHostHeartbeat, o as workbuddyHostHeartbeatPath, p as fallbackModelsFor, q as macosBundleExecutable, r as isHeartbeatProcessAlive, s as writeHostHeartbeat, t as WORKBUDDY_HOST_HEARTBEAT_FILENAME, u as FALLBACK_WORKBUDDY_MODELS_GLOBAL, v as WorkBuddyEncryptedCredentialError, w as isEncryptedCredentialError, x as defaultDesktopAuthDirs, y as authFileName, z as WORKBUDDY_APP_EXECUTABLE_ENV } from "./host-heartbeat-
|
|
1
|
+
import { A as WorkBuddyCredentialRejectedError, B as clearAtRestKeyCache, C as hasEncryptedCredentialFields, D as workbuddyAccountId, E as parseWorkBuddyAuth, F as parseReasoning, G as isEncryptedFieldWrapper, H as deriveAtRestKeyId, I as parseUpstreamModel, J as macosNestedAppBundles, K as isWorkbuddyBundle, L as prepareChatBody, M as classifyUpstreamError, N as isCredentialRejectedError, O as workbuddyOwnAuthPath, P as parseCreditMultiplier, R as regionOf, S as defaultDesktopAuthPath, T as legacyWorkbuddyOwnAuthPath, U as fetchAtRestKeyPayload, V as deriveAtRestKey, W as findWorkbuddyAppExecutable, X as readAtRestKey, Y as openEncryptedField, Z as workbuddyAppExecutableCandidates, _ as WorkBuddyCredentialStore, a as readHostHeartbeat, b as defaultDesktopAuthCandidates, c as WORKBUDDY_CONNECT_VERSION, d as WorkBuddyCatalog, f as deriveCatalog, g as WORKBUDDY_AUTH_FILE_ENV, h as WORKBUDDY_AUTH_FILENAME, i as processStartTimeMs, j as WorkBuddyUpstreamClient, k as CREDENTIAL_REJECTED_CODE, l as FALLBACK_WORKBUDDY_MODELS, m as ENCRYPTED_CREDENTIAL_CODE, n as clearHostHeartbeat, o as workbuddyHostHeartbeatPath, p as fallbackModelsFor, q as macosBundleExecutable, r as isHeartbeatProcessAlive, s as writeHostHeartbeat, t as WORKBUDDY_HOST_HEARTBEAT_FILENAME, u as FALLBACK_WORKBUDDY_MODELS_GLOBAL, v as WorkBuddyEncryptedCredentialError, w as isEncryptedCredentialError, x as defaultDesktopAuthDirs, y as authFileName, z as WORKBUDDY_APP_EXECUTABLE_ENV } from "./host-heartbeat-CFd55wJG.js";
|
|
2
2
|
import z from "@deepseek-ai/schemastery";
|
|
3
3
|
import { randomBytes, timingSafeEqual } from "node:crypto";
|
|
4
4
|
import { createProvider } from "@earendil-works/pi-ai";
|
|
@@ -720,6 +720,7 @@ function toWebModel(model, budgets) {
|
|
|
720
720
|
nativeContextWindow: model.contextWindow,
|
|
721
721
|
maxTokens: model.maxTokens,
|
|
722
722
|
...model.creditMultiplier === void 0 ? {} : { creditMultiplier: model.creditMultiplier },
|
|
723
|
+
...model.supportsImages === void 0 ? {} : { supportsImages: model.supportsImages },
|
|
723
724
|
...model.multimodal === void 0 ? {} : { multimodal: model.multimodal },
|
|
724
725
|
...model.reasoning === void 0 ? {} : { reasoning: {
|
|
725
726
|
...model.reasoning.supportedEfforts === void 0 ? {} : { supportedEfforts: [...model.reasoning.supportedEfforts] },
|
|
@@ -1006,6 +1007,55 @@ function registerWorkBuddyStatusRoute(ctx, deps) {
|
|
|
1006
1007
|
}, "dsh-connect-workbuddy: Web status route");
|
|
1007
1008
|
}
|
|
1008
1009
|
//#endregion
|
|
1010
|
+
//#region src/native-modality.ts
|
|
1011
|
+
/**
|
|
1012
|
+
* Reviewed vendor classifications, keyed by EXACT model id (never a prefix).
|
|
1013
|
+
* Ids absent from this record are `unknown` — see {@link nativeModalityOf}.
|
|
1014
|
+
*/
|
|
1015
|
+
const NATIVE_MODALITY_BY_MODEL_ID = {
|
|
1016
|
+
"deepseek-v4-pro": "text",
|
|
1017
|
+
"glm-5.1": "text",
|
|
1018
|
+
"glm-5.2": "text",
|
|
1019
|
+
"glm-5.3": "text",
|
|
1020
|
+
"hy3": "text",
|
|
1021
|
+
"hy4-preview": "text",
|
|
1022
|
+
"deepseek-v4.1-flash": "multimodal",
|
|
1023
|
+
"glm-5.3-flash": "multimodal",
|
|
1024
|
+
"glm-5v-turbo": "multimodal",
|
|
1025
|
+
"kimi-k2.6": "multimodal",
|
|
1026
|
+
"kimi-k2.7": "multimodal",
|
|
1027
|
+
"kimi-k3-1": "multimodal",
|
|
1028
|
+
"minimax-m3": "multimodal"
|
|
1029
|
+
};
|
|
1030
|
+
/** The `auto` entry is a router that picks a model, not a model itself. */
|
|
1031
|
+
const ROUTER_MODEL_ID = "auto";
|
|
1032
|
+
/**
|
|
1033
|
+
* Native modality of one model id. Exact match only: a new model never
|
|
1034
|
+
* inherits a classification from its family, its display name, or the
|
|
1035
|
+
* platform's image flag.
|
|
1036
|
+
*/
|
|
1037
|
+
function nativeModalityOf(modelId) {
|
|
1038
|
+
if (modelId === ROUTER_MODEL_ID) return "router";
|
|
1039
|
+
return NATIVE_MODALITY_BY_MODEL_ID[modelId] ?? "unknown";
|
|
1040
|
+
}
|
|
1041
|
+
/**
|
|
1042
|
+
* Whether a model refresh should PRE-CHECK this model's image box.
|
|
1043
|
+
*
|
|
1044
|
+
* Only a documented `multimodal` is pre-checked. `text` is documented as
|
|
1045
|
+
* unable to read images, and `unknown` is deliberately left unchecked rather
|
|
1046
|
+
* than guessed — the whole reason this table exists is that the platform flag
|
|
1047
|
+
* guessed wrong. A platform `supportsImages: false` still vetoes, so a
|
|
1048
|
+
* documented-multimodal id can never be pre-checked against the platform's
|
|
1049
|
+
* explicit "no".
|
|
1050
|
+
*
|
|
1051
|
+
* The user can always tick a box by hand; this decides a DEFAULT only, and the
|
|
1052
|
+
* effective runtime flag remains the saved `imageModelIds`.
|
|
1053
|
+
*/
|
|
1054
|
+
function imageDefaultFor(info) {
|
|
1055
|
+
if (info.supportsImages === false) return false;
|
|
1056
|
+
return NATIVE_MODALITY_BY_MODEL_ID[info.id] === "multimodal";
|
|
1057
|
+
}
|
|
1058
|
+
//#endregion
|
|
1009
1059
|
//#region src/index.ts
|
|
1010
1060
|
/** Stable Cordis plugin name. */
|
|
1011
1061
|
const name = "dsh-connect-workbuddy";
|
|
@@ -1463,4 +1513,4 @@ function apply(ctx, config) {
|
|
|
1463
1513
|
});
|
|
1464
1514
|
}
|
|
1465
1515
|
//#endregion
|
|
1466
|
-
export { CREDENTIAL_REJECTED_CODE, Config, ENCRYPTED_CREDENTIAL_CODE, FALLBACK_WORKBUDDY_MODELS, FALLBACK_WORKBUDDY_MODELS_GLOBAL, WORKBUDDY_ACCOUNTS_REFRESH_PATH, WORKBUDDY_APP_EXECUTABLE_ENV, WORKBUDDY_AUTH_FILENAME, WORKBUDDY_AUTH_FILE_ENV, WORKBUDDY_CHECKIN_PATH, WORKBUDDY_CONNECT_VERSION, WORKBUDDY_GLOBAL_PROVIDER, WORKBUDDY_HOST_HEARTBEAT_FILENAME, WORKBUDDY_MODELS_REFRESH_PATH, WORKBUDDY_PROVIDER, WORKBUDDY_PROVIDERS, WORKBUDDY_PROVIDER_DISPLAY_NAMES, WORKBUDDY_REGIONS, WORKBUDDY_REGION_PARAM, WORKBUDDY_SETTINGS_NS, WORKBUDDY_STREAM_IDLE_TIMEOUT_MS, WORKBUDDY_USAGE_PATH, WorkBuddyCatalog, WorkBuddyCredentialRejectedError, WorkBuddyCredentialStore, WorkBuddyEncryptedCredentialError, WorkBuddyUpstreamClient, apply, asVolatile, authFileName, classifyUpstreamError, clearAtRestKeyCache, clearHostHeartbeat, createAccountUsabilityProbe, createWorkBuddyAdapter, createWorkBuddyShim, defaultDesktopAuthCandidates, defaultDesktopAuthDirs, defaultDesktopAuthPath, deriveAtRestKey, deriveAtRestKeyId, deriveCatalog, fallbackModelsFor, fetchAtRestKeyPayload, findWorkbuddyAppExecutable, hasEncryptedCredentialFields, inject, isCredentialRejectedError, isEncryptedCredentialError, isEncryptedFieldWrapper, isHeartbeatProcessAlive, isWorkbuddyBundle, legacyAttributionRegion, legacyWorkbuddyOwnAuthPath, macosBundleExecutable, macosNestedAppBundles, name, nextRegionEnabled, nextRegionSlots, openEncryptedField, parseCreditMultiplier, parseReasoning, parseUpstreamModel, parseWorkBuddyAuth, prepareChatBody, processStartTimeMs, readAtRestKey, readHostHeartbeat, regionCleared, regionEnabled, regionEnabledOf, regionOf, regionOfProvider, regionOfStatusUrl, regionStateOf, registerWorkBuddyStatusRoute, resolveCredentialRecovery, selectAccountFor, settingsNamespaceOf, toPersistedWorkBuddyModel, unwrapVolatileDeep, withWorkBuddyRegion, workBuddyDisplayName, workBuddyModelInput, workBuddyThinkingLevelMap, workBuddyWebStatus, workbuddyAccountId, workbuddyAppExecutableCandidates, workbuddyHostHeartbeatPath, workbuddyOwnAuthPath, writeHostHeartbeat };
|
|
1516
|
+
export { CREDENTIAL_REJECTED_CODE, Config, ENCRYPTED_CREDENTIAL_CODE, FALLBACK_WORKBUDDY_MODELS, FALLBACK_WORKBUDDY_MODELS_GLOBAL, NATIVE_MODALITY_BY_MODEL_ID, WORKBUDDY_ACCOUNTS_REFRESH_PATH, WORKBUDDY_APP_EXECUTABLE_ENV, WORKBUDDY_AUTH_FILENAME, WORKBUDDY_AUTH_FILE_ENV, WORKBUDDY_CHECKIN_PATH, WORKBUDDY_CONNECT_VERSION, WORKBUDDY_GLOBAL_PROVIDER, WORKBUDDY_HOST_HEARTBEAT_FILENAME, WORKBUDDY_MODELS_REFRESH_PATH, WORKBUDDY_PROVIDER, WORKBUDDY_PROVIDERS, WORKBUDDY_PROVIDER_DISPLAY_NAMES, WORKBUDDY_REGIONS, WORKBUDDY_REGION_PARAM, WORKBUDDY_SETTINGS_NS, WORKBUDDY_STREAM_IDLE_TIMEOUT_MS, WORKBUDDY_USAGE_PATH, WorkBuddyCatalog, WorkBuddyCredentialRejectedError, WorkBuddyCredentialStore, WorkBuddyEncryptedCredentialError, WorkBuddyUpstreamClient, apply, asVolatile, authFileName, classifyUpstreamError, clearAtRestKeyCache, clearHostHeartbeat, createAccountUsabilityProbe, createWorkBuddyAdapter, createWorkBuddyShim, defaultDesktopAuthCandidates, defaultDesktopAuthDirs, defaultDesktopAuthPath, deriveAtRestKey, deriveAtRestKeyId, deriveCatalog, fallbackModelsFor, fetchAtRestKeyPayload, findWorkbuddyAppExecutable, hasEncryptedCredentialFields, imageDefaultFor, inject, isCredentialRejectedError, isEncryptedCredentialError, isEncryptedFieldWrapper, isHeartbeatProcessAlive, isWorkbuddyBundle, legacyAttributionRegion, legacyWorkbuddyOwnAuthPath, macosBundleExecutable, macosNestedAppBundles, name, nativeModalityOf, nextRegionEnabled, nextRegionSlots, openEncryptedField, parseCreditMultiplier, parseReasoning, parseUpstreamModel, parseWorkBuddyAuth, prepareChatBody, processStartTimeMs, readAtRestKey, readHostHeartbeat, regionCleared, regionEnabled, regionEnabledOf, regionOf, regionOfProvider, regionOfStatusUrl, regionStateOf, registerWorkBuddyStatusRoute, resolveCredentialRecovery, selectAccountFor, settingsNamespaceOf, toPersistedWorkBuddyModel, unwrapVolatileDeep, withWorkBuddyRegion, workBuddyDisplayName, workBuddyModelInput, workBuddyThinkingLevelMap, workBuddyWebStatus, workbuddyAccountId, workbuddyAppExecutableCandidates, workbuddyHostHeartbeatPath, workbuddyOwnAuthPath, writeHostHeartbeat };
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "dsh-connect-workbuddy",
|
|
3
3
|
"displayName": "DSH Connect WorkBuddy",
|
|
4
4
|
"description": "把本机登录的 WorkBuddy 模型接入 DeepSeek Harness,并提供只读的积分概览与模型管理。",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.2.0",
|
|
6
6
|
"author": "dingminhua",
|
|
7
7
|
"copyright": "Copyright (c) 2026 LaoDing",
|
|
8
8
|
"license": "MIT",
|
|
@@ -80,36 +80,35 @@
|
|
|
80
80
|
},
|
|
81
81
|
"peerDependencies": {
|
|
82
82
|
"@deepseek-ai/cordis": ">=4.0.1-rc.1 <5.0.0 || >=4.0.2 <5.0.0",
|
|
83
|
-
"@deepseek-ai/dsh-atomic-write": ">=0.1.7-rc.1 <0.
|
|
84
|
-
"@deepseek-ai/dsh-attachment": ">=0.1.7-rc.1 <0.
|
|
85
|
-
"@deepseek-ai/dsh-home-paths": ">=0.1.7-rc.1 <0.
|
|
86
|
-
"@deepseek-ai/dsh-host-webserver": ">=0.1.7-rc.1 <0.
|
|
87
|
-
"@deepseek-ai/dsh-llm": ">=0.1.7-rc.1 <0.
|
|
88
|
-
"@deepseek-ai/dsh-llm-pi-ai": ">=0.1.7-rc.1 <0.
|
|
89
|
-
"@deepseek-ai/dsh-settings": ">=0.1.7-rc.1 <0.
|
|
90
|
-
"@deepseek-ai/dsh-client-ui-primitives": ">=0.1.7-rc.1 <0.
|
|
91
|
-
"@deepseek-ai/dsh-client-ui-renderer": ">=0.1.7-rc.1 <0.
|
|
92
|
-
"@deepseek-ai/dsh-client-ui-settings": ">=0.1.7-rc.1 <0.
|
|
83
|
+
"@deepseek-ai/dsh-atomic-write": ">=0.1.7-rc.1 <0.3.0-0",
|
|
84
|
+
"@deepseek-ai/dsh-attachment": ">=0.1.7-rc.1 <0.3.0-0",
|
|
85
|
+
"@deepseek-ai/dsh-home-paths": ">=0.1.7-rc.1 <0.3.0-0",
|
|
86
|
+
"@deepseek-ai/dsh-host-webserver": ">=0.1.7-rc.1 <0.3.0-0",
|
|
87
|
+
"@deepseek-ai/dsh-llm": ">=0.1.7-rc.1 <0.3.0-0",
|
|
88
|
+
"@deepseek-ai/dsh-llm-pi-ai": ">=0.1.7-rc.1 <0.3.0-0",
|
|
89
|
+
"@deepseek-ai/dsh-settings": ">=0.1.7-rc.1 <0.3.0-0",
|
|
90
|
+
"@deepseek-ai/dsh-client-ui-primitives": ">=0.1.7-rc.1 <0.3.0-0",
|
|
91
|
+
"@deepseek-ai/dsh-client-ui-renderer": ">=0.1.7-rc.1 <0.3.0-0",
|
|
92
|
+
"@deepseek-ai/dsh-client-ui-settings": ">=0.1.7-rc.1 <0.3.0-0",
|
|
93
93
|
"@deepseek-ai/schemastery": ">=3.18.1-rc.1 <4.0.0 || >=3.18.2 <4.0.0",
|
|
94
94
|
"@earendil-works/pi-ai": ">=0.85.0 <0.86.0",
|
|
95
95
|
"react": "^18.2.0"
|
|
96
96
|
},
|
|
97
97
|
"devDependencies": {
|
|
98
98
|
"@deepseek-ai/cordis": ">=4.0.1 <5.0.0 || >=4.0.2 <5.0.0",
|
|
99
|
-
"@deepseek-ai/dsh-atomic-write": ">=0.1.7-rc.1 <0.
|
|
100
|
-
"@deepseek-ai/dsh-attachment": ">=0.1.7-rc.1 <0.
|
|
101
|
-
"@deepseek-ai/dsh-home-paths": ">=0.1.7-rc.1 <0.
|
|
102
|
-
"@deepseek-ai/dsh-host-webserver": ">=0.1.7-rc.1 <0.
|
|
103
|
-
"@deepseek-ai/dsh-llm": ">=0.1.7-rc.1 <0.
|
|
104
|
-
"@deepseek-ai/dsh-llm-pi-ai": ">=0.1.7-rc.1 <0.
|
|
105
|
-
"@deepseek-ai/dsh-settings": ">=0.1.7-rc.1 <0.
|
|
106
|
-
"@deepseek-ai/dsh-client-locale": ">=0.1.7-rc.1 <0.
|
|
107
|
-
"@deepseek-ai/dsh-client-
|
|
108
|
-
"@deepseek-ai/dsh-client-ui-
|
|
109
|
-
"@deepseek-ai/dsh-client-ui-
|
|
110
|
-
"@deepseek-ai/dsh-client-ui-settings": ">=0.1.7-rc.1 <0.
|
|
111
|
-
"@deepseek-ai/dsh-client-ui-
|
|
112
|
-
"@deepseek-ai/dsh-client-ui-slots": ">=0.1.7-rc.1 <0.2.0",
|
|
99
|
+
"@deepseek-ai/dsh-atomic-write": ">=0.1.7-rc.1 <0.3.0-0",
|
|
100
|
+
"@deepseek-ai/dsh-attachment": ">=0.1.7-rc.1 <0.3.0-0",
|
|
101
|
+
"@deepseek-ai/dsh-home-paths": ">=0.1.7-rc.1 <0.3.0-0",
|
|
102
|
+
"@deepseek-ai/dsh-host-webserver": ">=0.1.7-rc.1 <0.3.0-0",
|
|
103
|
+
"@deepseek-ai/dsh-llm": ">=0.1.7-rc.1 <0.3.0-0",
|
|
104
|
+
"@deepseek-ai/dsh-llm-pi-ai": ">=0.1.7-rc.1 <0.3.0-0",
|
|
105
|
+
"@deepseek-ai/dsh-settings": ">=0.1.7-rc.1 <0.3.0-0",
|
|
106
|
+
"@deepseek-ai/dsh-client-locale": ">=0.1.7-rc.1 <0.3.0-0",
|
|
107
|
+
"@deepseek-ai/dsh-client-ui-primitives": ">=0.1.7-rc.1 <0.3.0-0",
|
|
108
|
+
"@deepseek-ai/dsh-client-ui-renderer": ">=0.1.7-rc.1 <0.3.0-0",
|
|
109
|
+
"@deepseek-ai/dsh-client-ui-settings": ">=0.1.7-rc.1 <0.3.0-0",
|
|
110
|
+
"@deepseek-ai/dsh-client-ui-settings-plugins": ">=0.1.7-rc.1 <0.3.0-0",
|
|
111
|
+
"@deepseek-ai/dsh-client-ui-slots": ">=0.1.7-rc.1 <0.3.0-0",
|
|
113
112
|
"@deepseek-ai/schemastery": ">=3.18.1 <4.0.0 || >=3.18.2 <4.0.0",
|
|
114
113
|
"@earendil-works/pi-ai": ">=0.85.0 <0.86.0",
|
|
115
114
|
"react": "^18.3.1",
|