dsh-connect-workbuddy 2.0.14 → 2.1.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 +67 -0
- package/README.en.md +2 -0
- package/README.md +2 -0
- package/icons/dsh-connect-workbuddy-128.png +0 -0
- package/icons/dsh-connect-workbuddy-64.png +0 -0
- package/lib/bin.js +1 -1
- package/lib/client.js +64 -16
- package/lib/{host-heartbeat-SQNmYRNj.js → host-heartbeat-CH6_J1Ee.js} +1 -1
- package/lib/index.d.ts +39 -3
- package/lib/index.js +49 -23
- package/package.json +26 -24
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,72 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.1.0 (2026-09-25)
|
|
4
|
+
|
|
5
|
+
### ⚠️ 版本基线:仅支持 DSH 0.1.7-rc.1 及以上
|
|
6
|
+
|
|
7
|
+
**自本版起,本插件只支持 DeepSeek Harness 0.1.7-rc.1 及以上的宿主**(`@deepseek-ai/dsh-*` peer 依赖的最低版本已从 `>=0.1.5-rc.1` 提高到 `>=0.1.7-rc.1`,旧版宿主将无法通过依赖解析安装本版)。
|
|
8
|
+
|
|
9
|
+
- **0.1.5 双线分支已移除**:宿主的 `installSection` 回落、客户端的 `settingsScope` 分支、`settings.plugin.item` 槽位注册已全部删除——`configure({auto}, owner)` 与 `configForms` 是唯一路径。
|
|
10
|
+
- 如果你仍在 0.1.5 宿主上,请停留在 **2.0.15**(最后一个支持 0.1.5 的 GA 版本;2.0.16 / 2.0.17 的缺陷修复已并入本版)。
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
#### provider 被宿主判定为「未配置」(DSH 0.1.7-rc.1)
|
|
15
|
+
|
|
16
|
+
0.1.7 把设置模型整体重建(`SettingsProvider` → `SettingsForms`)后,**命名空间不再由插件自选**:宿主 `describe()` 以 **`ns: entry.options.id`**(Loader 条目 id)为键,而宿主按**精确匹配**查表 —— `namespaces.get(entry.settingsNs)`。我们此前硬编码 `settingsNs: 'workbuddy'`,而实测条目 id 是 **`include:dsh-connect-workbuddy`**,于是查表落空、provider 读作「未配置」,**不报错、只是静默失效**。
|
|
17
|
+
|
|
18
|
+
- **修法**:新增 `settingsNamespaceOf(ctx)`,采用一线插件的权威范式
|
|
19
|
+
`const settingsNs = ctx.fiber.entry?.options.id ?? NS`(见 `dsh-llm-pi-ai`),并把全部 6 处用法改为解析值。`ctx.fiber.entry` 由 Loader 注入(非 Cordis 公共类型),因此保留探测 + 回落,并在无 Loader 条目时回落到声明常量。
|
|
20
|
+
- **常量移入 `src/status-paths.ts`**:浏览器侧也需要同一个回落值,而它不能 import Node-only 的宿主入口。该模块本就是 host↔client 的无 node 依赖桥梁。`src/index.ts` 继续导出,**公共 API 不变**。
|
|
21
|
+
- **回归测试**(`tests/settings-integration.spec.ts`,+4 例):采纳 Loader 条目 id、无条目/空 id/非字符串时回落、以及**目录实际宣告的就是解析值**(断言目录条目而非常量,否则恒过)。**变异验证**:忽略 entry id 恒用常量 → **1 例立即变红**。
|
|
22
|
+
|
|
23
|
+
#### 插件管理页 / 市场页的 logo 显示不对
|
|
24
|
+
|
|
25
|
+
0.1.7 的插件管理页从插件包的 `package.json` 的 `icon` 字段读图标(`dsh-client-ui-plugin-manager` 渲染 `row.meta?.icon`,plugin-manager 契约含 `icon: z.string().optional()`),我们没有声明该字段 → 宿主无图可用。
|
|
26
|
+
|
|
27
|
+
- **修法**(照同级 `dsh-ldvh` 的做法):新增 `icons/` 目录(64px + 128px 真实 PNG,其中 64px 与既有卡片内嵌 base64 逐字节一致——同族 LD logo),`package.json` 声明 `"icon": "icons/dsh-connect-workbuddy-128.png"`,并把 `icons` 加入 `files` 白名单随包分发。
|
|
28
|
+
- **验证**:`npm pack` 确认两个 PNG 进包(15 → 17 个文件);desktop profile 的 link 安装下,`node_modules/dsh-connect-workbuddy/package.json` 已含该字段。
|
|
29
|
+
|
|
30
|
+
### Compatibility(对运行中 0.1.7-rc.1 宿主实测,非推测)
|
|
31
|
+
|
|
32
|
+
- **可用接缝**:宿主已识别本插件 Config(`status: "schema"`、`limitations: []`);`authFile` / `accounts` / `regions` 的 `"x-cordis": {"volatile": true}` 齐备;客户端卡片在 `plugins.bundle.config` 与 `plugins.row.config` **均已注册且 active**;`settings.configure/describe/mutate` 三个方法签名逐字匹配;`loader/volatile-update` 事件仍在。
|
|
33
|
+
- **确认不受影响的破坏性变更**:`settings.plugin.item` 槽位删除(我们各自独立 try/catch,不牵连其他槽位)、`settingsScope` 客户端服务删除(改用 `configForms`)、**`dsh-client-ui-primitives` 图标命名族改名**(本插件不从该包取任何具名图标,折叠箭头早已改为纯 CSS)、`agent/session-start` 删除(未监听)、会话格式 V3→V4(不读写会话文件)。
|
|
34
|
+
- 核对明细见 `.dsh-npm-cache/compat-017-audit.md`。
|
|
35
|
+
- **测试基座改为手动 `apply(ctx, config)`**:`ctx.plugin(WorkBuddy, config)` 会让 Cordis 校验出 frozen 代理对象,测试无法再就地写入;改为直接调用 `apply()` 让 config 由测试与所选 settings 服务共享同一引用(模拟 0.1.7 Loader 的就地提交语义),`loader/volatile-update` 事件用正确的单参形式触发。
|
|
36
|
+
|
|
37
|
+
### Tests
|
|
38
|
+
|
|
39
|
+
- 349 → 348(删 2 例 0.1.5 形态用例:`installSection` 引用清理、0.1.5 回落;加 1 例 0.1.7 `configure` 唯一路径;命名空间 +4、其余不变)。
|
|
40
|
+
|
|
41
|
+
## 2.0.15 (2026-09-24)
|
|
42
|
+
|
|
43
|
+
### Bug Fixes
|
|
44
|
+
|
|
45
|
+
- **不能正确取消(或启用)国际版 / 国内版区域开关**(用户实报:「我发现现在不能正确取消国际或者国内版本」)。**写入其实一直是成功的**——用户机器上的 `settings.yaml` 已经写着 `regions.global.enabled: false`——失败的是**开关控件没能反映这个事实**,所以看起来像「点了没用」。
|
|
46
|
+
|
|
47
|
+
- **根因(两处,都在读取侧)**:
|
|
48
|
+
|
|
49
|
+
1. **开关读的是浏览器镜像,而写入落在 Host。** 2.0.14 把设置写入改为 **Host 端点优先**(那是唯一不会删掉兄弟区域的写入方),而**端点写入不会更新浏览器的 settings 镜像**——这一滞后在本仓库别处早已注明。开关的勾选态却是从镜像读的:
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
checked={regionEnabledOf(settingsScope?.getSnapshot().value, region)}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
于是 Host 已经提交了 `enabled: false`,复选框**仍显示为开**。这同时解释了为什么此前「读法」与「写入顺序」两轮修复都没有暴露它:**写入一直是对的,错的是回显**。
|
|
56
|
+
|
|
57
|
+
2. **切换后不重新读取 Host。** `toggleRegion()` 写完就结束,从不重新拉取状态,因此新值根本没有机会进入卡片。
|
|
58
|
+
|
|
59
|
+
- **修法**:
|
|
60
|
+
- 开关改为**以 Host 的值为准**——Host 在状态载荷里已经送回它按自身 config 判定的 `enabled`(`deps.regionEnabled`)。镜像降级为**兜底**:老版本 Host 没这个字段、或状态尚未加载时,仍按存储文档渲染,而不是靠猜。两边用的是**同一条 opt-out 规则**(只有显式 `false` 才算关闭),因此两个来源不可能互相矛盾——只可能其中一个**过期**。
|
|
61
|
+
- `toggleRegion()` 在写入后 **`await refreshUsage(item)`**,重新读取 Host;失败时**显式报错**,而不是让开关静静地不动。
|
|
62
|
+
- 面板打开时**两个区域都拉取**,而不是只拉当前标签页。两个开关**始终**渲染在标签栏上,只拉当前区域会让另一个开关一直停在镜像兜底上——正是本次要摆脱的那个过期来源。
|
|
63
|
+
|
|
64
|
+
- **回归测试**(`tests/volatile-scope.spec.ts`,9 → 13 例):断言 Host 已提交关闭而镜像仍说开时开关显示为**关**(反向同理)、Host 未应答时回落到镜像、以及兜底路径仍能容忍 `{get(): T}` 活引用(否则会退回「永远显示开」的老毛病)。**变异验证**:把读取改回「只看镜像」→ **2 例立即变红**。
|
|
65
|
+
|
|
66
|
+
### Tests
|
|
67
|
+
|
|
68
|
+
- 341 → 345(新增 4 例:区域开关以 Host 真值为准、镜像仅兜底)。
|
|
69
|
+
|
|
3
70
|
## 2.0.14 (2026-09-23)
|
|
4
71
|
|
|
5
72
|
### Bug Fixes
|
package/README.en.md
CHANGED
|
@@ -54,6 +54,8 @@ 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.
|
|
58
|
+
|
|
57
59
|
Prerequisite: the WorkBuddy desktop app is installed and signed in (the plugin reuses the app's sign-in state).
|
|
58
60
|
|
|
59
61
|
```sh
|
package/README.md
CHANGED
|
Binary file
|
|
Binary file
|
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-CH6_J1Ee.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
|
@@ -159,6 +159,20 @@ window.__ModuleLoader__.load({
|
|
|
159
159
|
for (const key of Object.keys(source)) out[key] = unwrapVolatileDeep(source[key]);
|
|
160
160
|
return out;
|
|
161
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* The plugin's DECLARED settings namespace — the fallback name, not the value
|
|
164
|
+
* the host necessarily serves.
|
|
165
|
+
*
|
|
166
|
+
* On 0.1.7 the settings service keys every form by the plugin's Loader entry id
|
|
167
|
+
* (`describe()` returns `ns: entry.options.id`), and the harness resolves a
|
|
168
|
+
* provider's namespace by EXACT match. The entry id is chosen by the profile
|
|
169
|
+
* patch, so a plugin cannot know it in advance — the live Desktop host mounts
|
|
170
|
+
* this one as `include:dsh-connect-workbuddy`.
|
|
171
|
+
*
|
|
172
|
+
* Lives here, not in the Host entry, because the browser half needs the same
|
|
173
|
+
* fallback and must not import Node-only host code.
|
|
174
|
+
*/
|
|
175
|
+
const WORKBUDDY_SETTINGS_NS = "workbuddy";
|
|
162
176
|
//#endregion
|
|
163
177
|
//#region src/client/account-selection.ts
|
|
164
178
|
/**
|
|
@@ -865,7 +879,7 @@ window.__ModuleLoader__.load({
|
|
|
865
879
|
(0, react.useEffect)(() => {
|
|
866
880
|
if (!open) return;
|
|
867
881
|
const controller = new AbortController();
|
|
868
|
-
refreshUsage(
|
|
882
|
+
for (const region of WORKBUDDY_REGIONS) refreshUsage(region, controller.signal);
|
|
869
883
|
return () => {
|
|
870
884
|
controller.abort();
|
|
871
885
|
};
|
|
@@ -937,19 +951,29 @@ window.__ModuleLoader__.load({
|
|
|
937
951
|
}
|
|
938
952
|
};
|
|
939
953
|
/**
|
|
940
|
-
* Whether one region's provider is switched on
|
|
941
|
-
* settings document the Host reads (`regionEnabledOf` mirrors the Host's
|
|
942
|
-
* `regionStateOf` opt-out rule: only an explicit `false` disables). Reading
|
|
943
|
-
* the stored value rather than echoing local state means a rejected write,
|
|
944
|
-
* another window's change, or a restart all converge on the truth.
|
|
954
|
+
* Whether one region's provider is switched on.
|
|
945
955
|
*
|
|
946
|
-
* The
|
|
947
|
-
*
|
|
948
|
-
*
|
|
949
|
-
*
|
|
950
|
-
*
|
|
956
|
+
* The HOST's answer wins, because on this deployment it is the only writer
|
|
957
|
+
* that lands: the switch goes through the plugin's Host save endpoint (that
|
|
958
|
+
* endpoint is the only writer that cannot drop the sibling region), and a
|
|
959
|
+
* write made there does NOT update the browser settings mirror. Reading the
|
|
960
|
+
* mirror therefore left the checkbox stuck ON after a successful disable —
|
|
961
|
+
* "不能正确取消国际版/国内版" — even though `enabled: false` was already in
|
|
962
|
+
* settings.yaml. The Host sends the committed value it derives from its own
|
|
963
|
+
* config (`status.enabled`, see `deps.regionEnabled`), so the card renders
|
|
964
|
+
* that.
|
|
965
|
+
*
|
|
966
|
+
* The mirror stays as the FALLBACK: a host that predates the field, or a
|
|
967
|
+
* status that has not loaded yet, still renders from the stored document
|
|
968
|
+
* rather than guessing. Both rules are the same opt-out rule (only an
|
|
969
|
+
* explicit `false` disables), so the two sources cannot disagree — only one
|
|
970
|
+
* of them can be stale.
|
|
951
971
|
*/
|
|
952
|
-
const regionOn = (item) =>
|
|
972
|
+
const regionOn = (item) => {
|
|
973
|
+
const fromHost = statusByRegion[item]?.enabled;
|
|
974
|
+
if (typeof fromHost === "boolean") return fromHost;
|
|
975
|
+
return regionEnabledOf(settingsScope?.getSnapshot().value, item);
|
|
976
|
+
};
|
|
953
977
|
const activeRegionOn = regionOn(activeRegion);
|
|
954
978
|
/**
|
|
955
979
|
* Switch one region's provider off or on. The write carries the region's
|
|
@@ -970,6 +994,9 @@ window.__ModuleLoader__.load({
|
|
|
970
994
|
try {
|
|
971
995
|
const slot = nextRegionEnabled(settingsScope.getSnapshot().value, item, enabled)[item];
|
|
972
996
|
await writeRegionEnabled(settingsScope, item, enabled, typeof slot === "object" && slot !== null ? slot : {});
|
|
997
|
+
await refreshUsage(item);
|
|
998
|
+
} catch (error) {
|
|
999
|
+
if (mounted.current) setAccountError(error instanceof Error ? error.message : t("row.requestFailed"));
|
|
973
1000
|
} finally {
|
|
974
1001
|
if (mounted.current) setTogglingRegion(void 0);
|
|
975
1002
|
}
|
|
@@ -1738,6 +1765,29 @@ window.__ModuleLoader__.load({
|
|
|
1738
1765
|
};
|
|
1739
1766
|
//#endregion
|
|
1740
1767
|
//#region src/client/index.tsx
|
|
1768
|
+
/**
|
|
1769
|
+
* Browser half: WorkBuddy credits and model management inside Plugin
|
|
1770
|
+
* configuration.
|
|
1771
|
+
*
|
|
1772
|
+
* 参考:dingminhua/dsh-connect-trae(MIT,Copyright (c) 2026 LaoDing)
|
|
1773
|
+
* — 浏览器插件的注册形态(`slots` / `locale` / `settingsScope` 三项注入、
|
|
1774
|
+
* `LocaleNamespaceMap` 的模块增强、`settings.plugin.item` 槽位与
|
|
1775
|
+
* `key` / `priority` 的 rc.7 写法、以及整个 apply 体包 try/catch
|
|
1776
|
+
* 以便槽位 API 变更时降级为 console.error 而不触发
|
|
1777
|
+
* "Failed to load plugins" 红色横幅)来自该项目,
|
|
1778
|
+
* 其亦注明沿用 corrinehu/dsh-workbuddy-connect 的同一模式。
|
|
1779
|
+
* 改动:无实质改动,仅改为本插件的命名空间与组件名。
|
|
1780
|
+
*
|
|
1781
|
+
* NOTE: the try/catch boundary of this function is mirrored (duplicated) in
|
|
1782
|
+
* `tests/client-fallback.spec.ts`, because the real client entry imports
|
|
1783
|
+
* browser-only DSH packages that cannot load in the Node test environment.
|
|
1784
|
+
* That test therefore does not import this function — it replicates its
|
|
1785
|
+
* shape. If you change the guarded body or the `console.error` message here,
|
|
1786
|
+
* update the mirrored `apply()` in that spec too, or the fallback test will
|
|
1787
|
+
* silently diverge from this real implementation.
|
|
1788
|
+
*
|
|
1789
|
+
* @module dsh-connect-workbuddy/client
|
|
1790
|
+
*/
|
|
1741
1791
|
/** Stable browser-plugin name. */
|
|
1742
1792
|
const name = "dsh-connect-workbuddy-client";
|
|
1743
1793
|
/**
|
|
@@ -1763,15 +1813,14 @@ window.__ModuleLoader__.load({
|
|
|
1763
1813
|
const softGet = (name) => ctx.get(name);
|
|
1764
1814
|
let settingsScope;
|
|
1765
1815
|
const forms = softGet("configForms");
|
|
1766
|
-
const legacy = softGet("settingsScope");
|
|
1767
1816
|
if (forms !== void 0) {
|
|
1768
|
-
let ns =
|
|
1817
|
+
let ns = WORKBUDDY_SETTINGS_NS;
|
|
1769
1818
|
try {
|
|
1770
1819
|
const served = (forms.describe().getSnapshot().view?.namespaces ?? []).find((entry) => entry.ns === "workbuddy" || /workbuddy/i.test(entry.ns));
|
|
1771
1820
|
if (served !== void 0) ns = served.ns;
|
|
1772
1821
|
} catch {}
|
|
1773
1822
|
settingsScope = forms.get(ns);
|
|
1774
|
-
}
|
|
1823
|
+
}
|
|
1775
1824
|
const registerCard = (slotName, key) => {
|
|
1776
1825
|
try {
|
|
1777
1826
|
ctx.slots.inject(slotName, () => ctx.slots.register({
|
|
@@ -1789,7 +1838,6 @@ window.__ModuleLoader__.load({
|
|
|
1789
1838
|
};
|
|
1790
1839
|
registerCard("plugins.bundle.config", "dsh-connect-workbuddy");
|
|
1791
1840
|
registerCard("plugins.row.config", "dsh-connect-workbuddy#dsh-connect-workbuddy");
|
|
1792
|
-
registerCard("settings.plugin.item", "workbuddy");
|
|
1793
1841
|
} catch (error) {
|
|
1794
1842
|
console.error("[dsh-connect-workbuddy] client card failed to load (host provider unaffected):", error);
|
|
1795
1843
|
}
|
|
@@ -2208,7 +2208,7 @@ var WorkBuddyCatalog = class {
|
|
|
2208
2208
|
//#endregion
|
|
2209
2209
|
//#region src/version.ts
|
|
2210
2210
|
/** The npm package version this build was produced from. */
|
|
2211
|
-
const WORKBUDDY_CONNECT_VERSION = "2.0
|
|
2211
|
+
const WORKBUDDY_CONNECT_VERSION = "2.1.0";
|
|
2212
2212
|
//#endregion
|
|
2213
2213
|
//#region src/host-heartbeat.ts
|
|
2214
2214
|
/**
|
package/lib/index.d.ts
CHANGED
|
@@ -1390,6 +1390,20 @@ type WorkBuddyWebUsage =
|
|
|
1390
1390
|
* value is never touched.
|
|
1391
1391
|
*/
|
|
1392
1392
|
declare function unwrapVolatileDeep<T>(value: T): T;
|
|
1393
|
+
/**
|
|
1394
|
+
* The plugin's DECLARED settings namespace — the fallback name, not the value
|
|
1395
|
+
* the host necessarily serves.
|
|
1396
|
+
*
|
|
1397
|
+
* On 0.1.7 the settings service keys every form by the plugin's Loader entry id
|
|
1398
|
+
* (`describe()` returns `ns: entry.options.id`), and the harness resolves a
|
|
1399
|
+
* provider's namespace by EXACT match. The entry id is chosen by the profile
|
|
1400
|
+
* patch, so a plugin cannot know it in advance — the live Desktop host mounts
|
|
1401
|
+
* this one as `include:dsh-connect-workbuddy`.
|
|
1402
|
+
*
|
|
1403
|
+
* Lives here, not in the Host entry, because the browser half needs the same
|
|
1404
|
+
* fallback and must not import Node-only host code.
|
|
1405
|
+
*/
|
|
1406
|
+
declare const WORKBUDDY_SETTINGS_NS: "workbuddy";
|
|
1393
1407
|
//#endregion
|
|
1394
1408
|
//#region src/web-status.d.ts
|
|
1395
1409
|
/** Constructor dependencies. */
|
|
@@ -1458,8 +1472,30 @@ declare function registerWorkBuddyStatusRoute(ctx: Context, deps: WorkBuddyStatu
|
|
|
1458
1472
|
declare const name = "dsh-connect-workbuddy";
|
|
1459
1473
|
/** The model registry required before the provider can register. */
|
|
1460
1474
|
declare const inject: string[];
|
|
1461
|
-
/**
|
|
1462
|
-
|
|
1475
|
+
/**
|
|
1476
|
+
* Settings namespace for the plugin configuration card.
|
|
1477
|
+
*
|
|
1478
|
+
* (历史注记:0.1.5 线上插件自选命名空间并经 `installSection` 注册;自
|
|
1479
|
+
* 2.1.0 起只支持 0.1.7 线,该路径已移除。) 0.1.7 的 settings 服务自行推导
|
|
1480
|
+
* 命名空间 —— `describe()` 返回 `ns: entry.options.id`,即 Loader 条目 id
|
|
1481
|
+
* —— 因此插件不再能自选。此常量仅作为「宿主不暴露条目 id」时的回落值;
|
|
1482
|
+
* 实际生效值来自 {@link settingsNamespaceOf}。
|
|
1483
|
+
*
|
|
1484
|
+
* 这个区分不是装饰性的。宿主按**精确匹配**查表
|
|
1485
|
+
* (模型设置页的 `namespaces.get(entry.settingsNs)`),所以宣告
|
|
1486
|
+
* `workbuddy` 而宿主实际服务 `include:dsh-connect-workbuddy` 时,provider
|
|
1487
|
+
* 会被判为「未配置」:配置入口与模型发现双双静默失效。
|
|
1488
|
+
*/
|
|
1489
|
+
/**
|
|
1490
|
+
* The namespace the HOST actually serves this plugin under.
|
|
1491
|
+
*
|
|
1492
|
+
* `ctx.fiber.entry` is added by the Loader, not by Cordis itself, so it is not
|
|
1493
|
+
* in Cordis's public types and is absent on hosts that mount a plugin without a
|
|
1494
|
+
* Loader entry (a test harness, or `ctx.plugin()` called directly). Hence the
|
|
1495
|
+
* probe plus the documented fallback, mirroring the first-party plugins:
|
|
1496
|
+
* `const settingsNs = ctx.fiber.entry?.options.id ?? NS`.
|
|
1497
|
+
*/
|
|
1498
|
+
declare function settingsNamespaceOf(ctx: unknown): SettingsNamespace;
|
|
1463
1499
|
/** One region's model directory and the user's selection within it. */
|
|
1464
1500
|
interface WorkBuddyRegionState {
|
|
1465
1501
|
/**
|
|
@@ -1624,4 +1660,4 @@ declare function legacyAttributionRegion(value: Config, accountsFor: (region: Wo
|
|
|
1624
1660
|
*/
|
|
1625
1661
|
declare function apply(ctx: Context, config: Config): void;
|
|
1626
1662
|
//#endregion
|
|
1627
|
-
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, toPersistedWorkBuddyModel, unwrapVolatileDeep, withWorkBuddyRegion, workBuddyDisplayName, workBuddyModelInput, workBuddyThinkingLevelMap, workBuddyWebStatus, workbuddyAccountId, workbuddyAppExecutableCandidates, workbuddyHostHeartbeatPath, workbuddyOwnAuthPath, writeHostHeartbeat };
|
|
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 };
|
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-CH6_J1Ee.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";
|
|
@@ -656,6 +656,20 @@ function unwrapVolatileDeep(value) {
|
|
|
656
656
|
for (const key of Object.keys(source)) out[key] = unwrapVolatileDeep(source[key]);
|
|
657
657
|
return out;
|
|
658
658
|
}
|
|
659
|
+
/**
|
|
660
|
+
* The plugin's DECLARED settings namespace — the fallback name, not the value
|
|
661
|
+
* the host necessarily serves.
|
|
662
|
+
*
|
|
663
|
+
* On 0.1.7 the settings service keys every form by the plugin's Loader entry id
|
|
664
|
+
* (`describe()` returns `ns: entry.options.id`), and the harness resolves a
|
|
665
|
+
* provider's namespace by EXACT match. The entry id is chosen by the profile
|
|
666
|
+
* patch, so a plugin cannot know it in advance — the live Desktop host mounts
|
|
667
|
+
* this one as `include:dsh-connect-workbuddy`.
|
|
668
|
+
*
|
|
669
|
+
* Lives here, not in the Host entry, because the browser half needs the same
|
|
670
|
+
* fallback and must not import Node-only host code.
|
|
671
|
+
*/
|
|
672
|
+
const WORKBUDDY_SETTINGS_NS = "workbuddy";
|
|
659
673
|
//#endregion
|
|
660
674
|
//#region src/web-status.ts
|
|
661
675
|
/** Redact token-like content before it crosses to the browser. */
|
|
@@ -997,8 +1011,33 @@ function registerWorkBuddyStatusRoute(ctx, deps) {
|
|
|
997
1011
|
const name = "dsh-connect-workbuddy";
|
|
998
1012
|
/** The model registry required before the provider can register. */
|
|
999
1013
|
const inject = ["llm", "settings"];
|
|
1000
|
-
/**
|
|
1001
|
-
|
|
1014
|
+
/**
|
|
1015
|
+
* Settings namespace for the plugin configuration card.
|
|
1016
|
+
*
|
|
1017
|
+
* (历史注记:0.1.5 线上插件自选命名空间并经 `installSection` 注册;自
|
|
1018
|
+
* 2.1.0 起只支持 0.1.7 线,该路径已移除。) 0.1.7 的 settings 服务自行推导
|
|
1019
|
+
* 命名空间 —— `describe()` 返回 `ns: entry.options.id`,即 Loader 条目 id
|
|
1020
|
+
* —— 因此插件不再能自选。此常量仅作为「宿主不暴露条目 id」时的回落值;
|
|
1021
|
+
* 实际生效值来自 {@link settingsNamespaceOf}。
|
|
1022
|
+
*
|
|
1023
|
+
* 这个区分不是装饰性的。宿主按**精确匹配**查表
|
|
1024
|
+
* (模型设置页的 `namespaces.get(entry.settingsNs)`),所以宣告
|
|
1025
|
+
* `workbuddy` 而宿主实际服务 `include:dsh-connect-workbuddy` 时,provider
|
|
1026
|
+
* 会被判为「未配置」:配置入口与模型发现双双静默失效。
|
|
1027
|
+
*/
|
|
1028
|
+
/**
|
|
1029
|
+
* The namespace the HOST actually serves this plugin under.
|
|
1030
|
+
*
|
|
1031
|
+
* `ctx.fiber.entry` is added by the Loader, not by Cordis itself, so it is not
|
|
1032
|
+
* in Cordis's public types and is absent on hosts that mount a plugin without a
|
|
1033
|
+
* Loader entry (a test harness, or `ctx.plugin()` called directly). Hence the
|
|
1034
|
+
* probe plus the documented fallback, mirroring the first-party plugins:
|
|
1035
|
+
* `const settingsNs = ctx.fiber.entry?.options.id ?? NS`.
|
|
1036
|
+
*/
|
|
1037
|
+
function settingsNamespaceOf(ctx) {
|
|
1038
|
+
const id = ctx?.fiber?.entry?.options?.id;
|
|
1039
|
+
return typeof id === "string" && id !== "" ? id : WORKBUDDY_SETTINGS_NS;
|
|
1040
|
+
}
|
|
1002
1041
|
const modelConfig = z.object({
|
|
1003
1042
|
id: z.string().required(),
|
|
1004
1043
|
name: z.string().required(),
|
|
@@ -1171,6 +1210,7 @@ async function legacyAttributionRegion(value, accountsFor) {
|
|
|
1171
1210
|
*/
|
|
1172
1211
|
function apply(ctx, config) {
|
|
1173
1212
|
const client = new WorkBuddyUpstreamClient();
|
|
1213
|
+
const settingsNs = settingsNamespaceOf(ctx);
|
|
1174
1214
|
const stacks = {};
|
|
1175
1215
|
for (const region of REGION_KEYS) {
|
|
1176
1216
|
const authFile = unwrapVolatile(config.authFile);
|
|
@@ -1288,7 +1328,7 @@ function apply(ctx, config) {
|
|
|
1288
1328
|
registration.cn.directory?.replace(REGION_KEYS.filter((region) => regionEnabled(value, region)).map((region) => ({
|
|
1289
1329
|
provider: WORKBUDDY_PROVIDERS[region],
|
|
1290
1330
|
displayName: WORKBUDDY_PROVIDER_DISPLAY_NAMES[region],
|
|
1291
|
-
settingsNs
|
|
1331
|
+
settingsNs,
|
|
1292
1332
|
settingsPath: [],
|
|
1293
1333
|
declared: false
|
|
1294
1334
|
})));
|
|
@@ -1309,21 +1349,7 @@ function apply(ctx, config) {
|
|
|
1309
1349
|
}));
|
|
1310
1350
|
ctx.inject(["settings"], (sctx) => {
|
|
1311
1351
|
const settings = sctx.settings;
|
|
1312
|
-
|
|
1313
|
-
settings.configure({ auto: true }, ctx.fiber);
|
|
1314
|
-
return;
|
|
1315
|
-
}
|
|
1316
|
-
if (typeof settings.installSection === "function") {
|
|
1317
|
-
const entry = unwrapVolatileDeep(config);
|
|
1318
|
-
settings.installSection(ctx, WORKBUDDY_SETTINGS_NS, Config, entry, {
|
|
1319
|
-
setSource(source) {
|
|
1320
|
-
current = source;
|
|
1321
|
-
},
|
|
1322
|
-
onChange() {
|
|
1323
|
-
applySelection(current());
|
|
1324
|
-
}
|
|
1325
|
-
});
|
|
1326
|
-
}
|
|
1352
|
+
ctx.effect(() => settings.configure({ auto: true }, ctx.fiber));
|
|
1327
1353
|
});
|
|
1328
1354
|
ctx.on("loader/volatile-update", () => {
|
|
1329
1355
|
applySelection(current());
|
|
@@ -1367,13 +1393,13 @@ function apply(ctx, config) {
|
|
|
1367
1393
|
releaseDirectory = registration.cn.directory = ctx.llm.registerConfigurableProviders([{
|
|
1368
1394
|
provider: WORKBUDDY_PROVIDER,
|
|
1369
1395
|
displayName: WORKBUDDY_PROVIDER_DISPLAY_NAMES.cn,
|
|
1370
|
-
settingsNs
|
|
1396
|
+
settingsNs,
|
|
1371
1397
|
settingsPath: [],
|
|
1372
1398
|
declared: false
|
|
1373
1399
|
}, {
|
|
1374
1400
|
provider: WORKBUDDY_GLOBAL_PROVIDER,
|
|
1375
1401
|
displayName: WORKBUDDY_PROVIDER_DISPLAY_NAMES.global,
|
|
1376
|
-
settingsNs
|
|
1402
|
+
settingsNs,
|
|
1377
1403
|
settingsPath: [],
|
|
1378
1404
|
declared: false
|
|
1379
1405
|
}]);
|
|
@@ -1396,7 +1422,7 @@ function apply(ctx, config) {
|
|
|
1396
1422
|
releaseDirectory?.();
|
|
1397
1423
|
}
|
|
1398
1424
|
syncRegionRegistration(current());
|
|
1399
|
-
ctx.llm.registerModelDiscovery(
|
|
1425
|
+
ctx.llm.registerModelDiscovery(settingsNs, async (request, signal) => {
|
|
1400
1426
|
const region = regionOfProvider(request.provider ?? "");
|
|
1401
1427
|
if (region === void 0) return [];
|
|
1402
1428
|
if (!regionEnabled(current(), region)) return [];
|
|
@@ -1437,4 +1463,4 @@ function apply(ctx, config) {
|
|
|
1437
1463
|
});
|
|
1438
1464
|
}
|
|
1439
1465
|
//#endregion
|
|
1440
|
-
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, toPersistedWorkBuddyModel, unwrapVolatileDeep, withWorkBuddyRegion, workBuddyDisplayName, workBuddyModelInput, workBuddyThinkingLevelMap, workBuddyWebStatus, workbuddyAccountId, workbuddyAppExecutableCandidates, workbuddyHostHeartbeatPath, workbuddyOwnAuthPath, writeHostHeartbeat };
|
|
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 };
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "dsh-connect-workbuddy",
|
|
3
3
|
"displayName": "DSH Connect WorkBuddy",
|
|
4
4
|
"description": "Connect locally signed-in WorkBuddy models to DeepSeek Harness with a read-only credits overview and model management.",
|
|
5
|
-
"version": "2.0
|
|
5
|
+
"version": "2.1.0",
|
|
6
6
|
"author": "dingminhua",
|
|
7
7
|
"copyright": "Copyright (c) 2026 LaoDing",
|
|
8
8
|
"license": "MIT",
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"bin": {
|
|
24
24
|
"dsh-connect-workbuddy": "lib/bin.js"
|
|
25
25
|
},
|
|
26
|
+
"icon": "icons/dsh-connect-workbuddy-128.png",
|
|
26
27
|
"exports": {
|
|
27
28
|
".": {
|
|
28
29
|
"types": "./lib/index.d.ts",
|
|
@@ -37,6 +38,7 @@
|
|
|
37
38
|
},
|
|
38
39
|
"files": [
|
|
39
40
|
"lib",
|
|
41
|
+
"icons",
|
|
40
42
|
"docs/assets",
|
|
41
43
|
"screenshots.json",
|
|
42
44
|
"cordis.patch.yml",
|
|
@@ -78,36 +80,36 @@
|
|
|
78
80
|
},
|
|
79
81
|
"peerDependencies": {
|
|
80
82
|
"@deepseek-ai/cordis": ">=4.0.1-rc.1 <5.0.0 || >=4.0.2 <5.0.0",
|
|
81
|
-
"@deepseek-ai/dsh-atomic-write": ">=0.1.
|
|
82
|
-
"@deepseek-ai/dsh-attachment": ">=0.1.
|
|
83
|
-
"@deepseek-ai/dsh-home-paths": ">=0.1.
|
|
84
|
-
"@deepseek-ai/dsh-host-webserver": ">=0.1.
|
|
85
|
-
"@deepseek-ai/dsh-llm": ">=0.1.
|
|
86
|
-
"@deepseek-ai/dsh-llm-pi-ai": ">=0.1.
|
|
87
|
-
"@deepseek-ai/dsh-settings": ">=0.1.
|
|
88
|
-
"@deepseek-ai/dsh-client-ui-primitives": ">=0.1.
|
|
89
|
-
"@deepseek-ai/dsh-client-ui-renderer": ">=0.1.
|
|
90
|
-
"@deepseek-ai/dsh-client-ui-settings": ">=0.1.
|
|
83
|
+
"@deepseek-ai/dsh-atomic-write": ">=0.1.7-rc.1 <0.2.0",
|
|
84
|
+
"@deepseek-ai/dsh-attachment": ">=0.1.7-rc.1 <0.2.0",
|
|
85
|
+
"@deepseek-ai/dsh-home-paths": ">=0.1.7-rc.1 <0.2.0",
|
|
86
|
+
"@deepseek-ai/dsh-host-webserver": ">=0.1.7-rc.1 <0.2.0",
|
|
87
|
+
"@deepseek-ai/dsh-llm": ">=0.1.7-rc.1 <0.2.0",
|
|
88
|
+
"@deepseek-ai/dsh-llm-pi-ai": ">=0.1.7-rc.1 <0.2.0",
|
|
89
|
+
"@deepseek-ai/dsh-settings": ">=0.1.7-rc.1 <0.2.0",
|
|
90
|
+
"@deepseek-ai/dsh-client-ui-primitives": ">=0.1.7-rc.1 <0.2.0",
|
|
91
|
+
"@deepseek-ai/dsh-client-ui-renderer": ">=0.1.7-rc.1 <0.2.0",
|
|
92
|
+
"@deepseek-ai/dsh-client-ui-settings": ">=0.1.7-rc.1 <0.2.0",
|
|
91
93
|
"@deepseek-ai/schemastery": ">=3.18.1-rc.1 <4.0.0 || >=3.18.2 <4.0.0",
|
|
92
94
|
"@earendil-works/pi-ai": ">=0.85.0 <0.86.0",
|
|
93
95
|
"react": "^18.2.0"
|
|
94
96
|
},
|
|
95
97
|
"devDependencies": {
|
|
96
98
|
"@deepseek-ai/cordis": ">=4.0.1 <5.0.0 || >=4.0.2 <5.0.0",
|
|
97
|
-
"@deepseek-ai/dsh-atomic-write": ">=0.1.
|
|
98
|
-
"@deepseek-ai/dsh-attachment": ">=0.1.
|
|
99
|
-
"@deepseek-ai/dsh-home-paths": ">=0.1.
|
|
100
|
-
"@deepseek-ai/dsh-host-webserver": ">=0.1.
|
|
101
|
-
"@deepseek-ai/dsh-llm": ">=0.1.
|
|
102
|
-
"@deepseek-ai/dsh-llm-pi-ai": ">=0.1.
|
|
103
|
-
"@deepseek-ai/dsh-settings": ">=0.1.
|
|
104
|
-
"@deepseek-ai/dsh-client-locale": ">=0.1.
|
|
99
|
+
"@deepseek-ai/dsh-atomic-write": ">=0.1.7-rc.1 <0.2.0",
|
|
100
|
+
"@deepseek-ai/dsh-attachment": ">=0.1.7-rc.1 <0.2.0",
|
|
101
|
+
"@deepseek-ai/dsh-home-paths": ">=0.1.7-rc.1 <0.2.0",
|
|
102
|
+
"@deepseek-ai/dsh-host-webserver": ">=0.1.7-rc.1 <0.2.0",
|
|
103
|
+
"@deepseek-ai/dsh-llm": ">=0.1.7-rc.1 <0.2.0",
|
|
104
|
+
"@deepseek-ai/dsh-llm-pi-ai": ">=0.1.7-rc.1 <0.2.0",
|
|
105
|
+
"@deepseek-ai/dsh-settings": ">=0.1.7-rc.1 <0.2.0",
|
|
106
|
+
"@deepseek-ai/dsh-client-locale": ">=0.1.7-rc.1 <0.2.0",
|
|
105
107
|
"@deepseek-ai/dsh-client-runtime": ">=0.1.1-rc.1 <0.2.0",
|
|
106
|
-
"@deepseek-ai/dsh-client-ui-primitives": ">=0.1.
|
|
107
|
-
"@deepseek-ai/dsh-client-ui-renderer": ">=0.1.
|
|
108
|
-
"@deepseek-ai/dsh-client-ui-settings": ">=0.1.
|
|
109
|
-
"@deepseek-ai/dsh-client-ui-settings-plugins": ">=0.1.
|
|
110
|
-
"@deepseek-ai/dsh-client-ui-slots": ">=0.1.
|
|
108
|
+
"@deepseek-ai/dsh-client-ui-primitives": ">=0.1.7-rc.1 <0.2.0",
|
|
109
|
+
"@deepseek-ai/dsh-client-ui-renderer": ">=0.1.7-rc.1 <0.2.0",
|
|
110
|
+
"@deepseek-ai/dsh-client-ui-settings": ">=0.1.7-rc.1 <0.2.0",
|
|
111
|
+
"@deepseek-ai/dsh-client-ui-settings-plugins": ">=0.1.7-rc.1 <0.2.0",
|
|
112
|
+
"@deepseek-ai/dsh-client-ui-slots": ">=0.1.7-rc.1 <0.2.0",
|
|
111
113
|
"@deepseek-ai/schemastery": ">=3.18.1 <4.0.0 || >=3.18.2 <4.0.0",
|
|
112
114
|
"@earendil-works/pi-ai": ">=0.85.0 <0.86.0",
|
|
113
115
|
"react": "^18.3.1",
|