@dsh-workbench/core 0.2.5 → 0.2.7

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.
Files changed (38) hide show
  1. package/README.md +13 -9
  2. package/bin/dsh-workbench +12 -43
  3. package/client.js +914 -350
  4. package/dist/client/client.body.js +914 -350
  5. package/dist/client/index.js +915 -351
  6. package/dist/host/index.js +1314 -667
  7. package/dist/types/app/client.d.ts +216 -6
  8. package/dist/types/app/layouts/config-sync/ConfigSyncSection.d.ts +5 -0
  9. package/dist/types/app/layouts/rightbar/__tests__/market-order.test.d.ts +1 -0
  10. package/dist/types/app/layouts/rightbar/__tests__/market-running-display.test.d.ts +1 -0
  11. package/dist/types/app/layouts/rightbar/__tests__/market-workbench-act.test.d.ts +1 -0
  12. package/dist/types/app/layouts/rightbar/market-act.d.ts +2 -1
  13. package/dist/types/app/layouts/rightbar/market-rows.d.ts +3 -0
  14. package/dist/types/app/layouts/rightbar/market-settle-hold.d.ts +13 -0
  15. package/dist/types/app/layouts/rightbar/market-settle.d.ts +22 -0
  16. package/dist/types/app/layouts/rightbar/market-transient-state.d.ts +22 -0
  17. package/dist/types/app/layouts/rightbar/market-view-text.d.ts +26 -1
  18. package/dist/types/app/layouts/sidebar/workspace-groups.d.ts +4 -1
  19. package/dist/types/modules/panels/__tests__/market-tools-harness.d.ts +3 -0
  20. package/dist/types/modules/panels/model/market-workbench-update.d.ts +19 -0
  21. package/dist/types/modules/panels/model/market.d.ts +4 -0
  22. package/dist/types/modules/sessions/index.d.ts +1 -1
  23. package/dist/types/modules/sessions/model/session-node.d.ts +1 -0
  24. package/dist/types/shared/api/bundle-install.d.ts +1 -0
  25. package/dist/types/shared/api/config-sync.d.ts +35 -0
  26. package/dist/types/shared/api/config-sync.test.d.ts +1 -0
  27. package/dist/types/shared/api/host/__tests__/config-sync.test.d.ts +1 -0
  28. package/dist/types/shared/api/host/__tests__/post-channels.test.d.ts +1 -0
  29. package/dist/types/shared/api/host/__tests__/self-update.test.d.ts +1 -0
  30. package/dist/types/shared/api/host/bundle-manager.d.ts +1 -0
  31. package/dist/types/shared/api/host/bundle-routes.d.ts +1 -1
  32. package/dist/types/shared/api/host/config-sync.d.ts +46 -0
  33. package/dist/types/shared/api/host/post-channels.d.ts +18 -0
  34. package/dist/types/shared/api/host/self-update.d.ts +45 -0
  35. package/docs/HANDOFF.md +19 -14
  36. package/docs/OPERATIONS.md +40 -8
  37. package/package.json +4 -4
  38. package/scripts/seed-profile.sh +21 -85
package/README.md CHANGED
@@ -25,7 +25,7 @@ dsh web (:3080) dsh workbench (:3081)
25
25
  | --- | --- | --- |
26
26
  | `dsh` | 本体。本包在 `0.1.7-rc.2` 上验过 | `npm i -g @deepseek-ai/dsh` |
27
27
  | `node` + `pnpm` | dsh 的 `plugin` 子命令是**转发给 pnpm** 的;没有 pnpm 会直接报 `dsh: pnpm was not found` | 各自装 |
28
- | 跑过一次 `dsh web` | `setup` 拿 `~/.dsh/profiles/web` 当模板(bundle 清单 + 设置快照 + patch 点名的依赖)。没有它会**明确报错**,不会静默建出半个 profile | `dsh web`,起来就行,然后 Ctrl-C |
28
+ | 跑过一次 `dsh web` | `setup` 拿 `~/.dsh/profiles/web` 当模板(**bundle 清单**:这台机器上装了哪些 bundle),也是「配置同步」的默认来源。没有它会**明确报错**,不会静默建出半个 profile | `dsh web`,起来就行,然后 Ctrl-C |
29
29
 
30
30
  然后两条命令:
31
31
 
@@ -71,10 +71,11 @@ npx @dsh-workbench/core # ② 起工作台,默认 :3081
71
71
  | --- | --- |
72
72
  | 起工作台 | `npx @dsh-workbench/core` |
73
73
  | 换端口 | `WORKBENCH_PORT=3091 npx @dsh-workbench/core` |
74
- | 升级 | 重跑一次 `npx --yes @dsh-workbench/core@latest setup`(幂等),再重启工作台进程 |
74
+ | 升级 | 重跑一次 `npx --yes @dsh-workbench/core@latest setup`(幂等),刷新一次页面即可(`dsh-hmr` 会重组;它报 `restartReason` 时才重启进程) |
75
75
  | 重建 profile | `mv ~/.dsh/profiles/workbench ~/.dsh/profiles/workbench.bak`,再跑一次 `setup` |
76
76
  | 彻底不用了 | 删 `~/.dsh/profiles/workbench` 与 `~/.dsh/workbench` 两个目录(都不影响 `dsh web`) |
77
- | 改设置 | 只有工作台要的(面板显示哪些模块、会话隔离)在 `:3081` 的 Settings 里改 |
77
+ | 改设置 | 在 `:3081` 的 Settings 里改(模型供应商 / 搜索源 / MCP 也是这里) |
78
+ | 从 `dsh web` 搬设置过来 | 设置 → 「配置同步」→ 选来源 → 勾行 → 同步(即生效) |
78
79
 
79
80
  ## 和 `dsh web` 的关系
80
81
 
@@ -83,10 +84,11 @@ npx @dsh-workbench/core # ② 起工作台,默认 :3081
83
84
  - **另一个 profile、另一个端口、另一个进程**:`workbench` profile 在 `~/.dsh/profiles/workbench`;
84
85
  会话 / 存储 / 附件 / 模块配置全走 `~/.dsh/workbench/**`,与 web **数据分家**。只有一样有意共享:
85
86
  API 凭据(`~/.dsh/.credentials.yaml`,一机一把 key)。
86
- - **两边都要的设置只在 `dsh web` 里配一次**(模型供应商 / API key / 搜索源 / MCP):工作台启动时
87
- 把 web 的 profile patch 叠在自己上面(`--patch`,**单向、实时**)。被 web 管的行在工作台的
88
- Settings 页里会显示 `overridden by a home patch or command-line overlay` —— 那是**提示**,不是故障。
89
- 反向不成立:工作台里配的不会流回 web。
87
+ - **设置是工作台自己那份**:模型供应商 / 搜索源 / MCP 都在 `:3081` 的 Settings 里配,
88
+ 落在 `profiles/workbench/cordis.patch.yml` —— 那是它唯一的一份设置文档,每一行都改得动。
89
+ 想用 `dsh web` 那边已经配好的行:`:3081` → `Meta+,` → 「配置同步」→ 选来源 → 勾行 → 同步 →
90
+ **即生效**(只搬显式配过的行;同 id 内容不同默认不覆盖)。web 后来改的不会自动过来,
91
+ 再打开这一页拉一次即可。见 [ADR-0044](../../docs/adr/0044-config-sync-replaces-the-web-patch-overlay.md)。
90
92
  - ⚠️ **别在 Settings → 插件里把 `@dsh-workbench/core` 关掉**:关掉 = 它那份 bundle patch 整份不再应用
91
93
  (包括里面的"禁用出厂左栏"),界面会**退化成原版 dsh web**(左栏回来、右侧面板消失)。
92
94
  **数据一个都不丢**;把开关拨回来就恢复 —— 进不去设置页就按 `Meta+,`。别当成故障去重建 profile。
@@ -101,6 +103,8 @@ npx @dsh-workbench/core # ② 起工作台,默认 :3081
101
103
  | 打开面板 / 按刷新要等 5–8 秒 | 正常:opencli 每次调用有**固定约 5 秒**开销(起浏览器会话)。**没有缓存**,数据一律实时 |
102
104
  | 体检那屏说「检测浏览器通道 · 没连上」,可面板照样能用 | 本机全局 opencli 与隔离运行时版本不一致,daemon 被顶成对方那版;下一条浏览器命令会自动把它重启回来,体检复检后改回「已连接」 |
103
105
  | 一切正常,但左栏是出厂样子、右边没有面板 | 工作台插件在 Settings 里被关了(见上一条 ⚠️) |
106
+ | 模型列表里只有出厂的几个、没有自己配的供应商 | 新装的 profile 不带设置(ADR-0044):设置 → 「配置同步」→ 选来源 → 勾 `llm-` 那几行 → 同步(即生效)|
107
+ | 「配置同步」里某一行说 `@x 还没装` | 那一行点名的包不在这个 profile 的 `node_modules` 里:`dsh plugin --profile workbench add @x`(或在模块市场装),(装完 dsh 会自行重组;它报 `restartReason` 时才重启)|
104
108
 
105
109
  排障全表在仓库的 [`docs/OPERATIONS.md`](https://github.com/code-farmer-i/dsh-workbench/blob/main/packages/workbench/docs/OPERATIONS.md);
106
110
  把工作台装到别人机器上的前置清单见 [`docs/HANDOFF.md`](https://github.com/code-farmer-i/dsh-workbench/blob/main/packages/workbench/docs/HANDOFF.md)。
@@ -112,7 +116,7 @@ git clone git@github.com:code-farmer-i/dsh-workbench.git
112
116
  cd dsh-workbench/packages/workbench
113
117
  pnpm install
114
118
  pnpm run dev # 监听 src/**(重建产物)+ 起工作台 :3081;改完不用重启、不用刷新页面
115
- pnpm run check # 门禁:类型 / 覆盖率 / 架构 / 运行时边界 / 接线自检
119
+ pnpm run check # 门禁:整仓那一套(类型 / lint / 覆盖率 / 架构 / 文档 / 运行时边界 / 接线 / 模块判据)
116
120
  ./bin/dsh-workbench # 只想起工作台、不需要监听改动时用它
117
121
  ```
118
122
 
@@ -120,7 +124,7 @@ pnpm run check # 门禁:类型 / 覆盖率 / 架构 / 运行时边界 / 接
120
124
  `:3081` 已经有实例在跑时就只监听、不重复起第二个。改界面时开着它就够了:
121
125
  浏览器半侧重建 `client.js` 后由 dsh 的 HMR 热换插件(不刷新页面),宿主半侧按模块路径热重载。
122
126
 
123
- 只有两种情况要重启进程:改 `cordis.patch.yml`(组合层)与 `package.json` 的 bundle 清单。
127
+ `cordis.patch.yml` 与 `package.json` 的 bundle 清单也**不用重启**(`dsh-hmr` 变了就重组);要重启的是改 `vite.config.ts`。
124
128
 
125
129
  结构与边界(两个运行时、槽位接线、模块包的门禁)见仓库的
126
130
  [`docs/ARCHITECTURE.md`](https://github.com/code-farmer-i/dsh-workbench/blob/main/docs/ARCHITECTURE.md) ·
package/bin/dsh-workbench CHANGED
@@ -69,6 +69,8 @@ run_setup() {
69
69
  else
70
70
  SPEC="$PKG@^$(pkg_version)"
71
71
  echo "→ 从内网源装 ${SPEC}(源在 package.json 的 publishConfig.registry)"
72
+ echo " 这一份启动器是装在哪就是哪一代:换 profile / 重建 profile 之前,先"
73
+ echo " npm i -g ${PKG}@latest。已经在跑的那个 profile 升级走市场里工作台那一行的「更新」。"
72
74
  fi
73
75
 
74
76
  dsh plugin --profile "$PROFILE" add "$SPEC"
@@ -138,51 +140,18 @@ else
138
140
  export DSH_WORKBENCH_ROOT="$REPO_DIR"
139
141
  fi
140
142
 
141
- # ── 把 web 的设置**叠加**上来(web → 工作台,单向、实时)────────────────────
143
+ # ── 设置从哪来:工作台自己的 profile patch(不再叠 web 那一份)──────────────
142
144
  #
143
- # 为什么叠而不是复制:`seed-profile.sh` 是把 web 的设置**快照一份**过来,之后两边各自
144
- # 演进 —— 于是"在 web 里加了个模型供应商,工作台却少一个"这种漂移迟早发生(实测撞过)。
145
- # 叠加则是**同一个来源**:供应商 / 搜索源 / MCP 这类机器级设置只在 `dsh web` 里配一次。
145
+ # 以前每次启动都用 `--patch` 把 `profiles/web/cordis.patch.yml` 叠成**最高层**。
146
+ # 代价是那一层盖住的行在 :3081 的 Settings 里**改不动**:dsh 的 config-editor 写文件
147
+ # **之前**会拿组合后的值跟你写的值对,不等就抛
148
+ # `overridden by a home patch or command-line overlay` —— 文件根本没写。
149
+ # 症状就是"模型供应商这类设置只能去 :3080 改,工作台这边看着能点、点了没用"。
146
150
  #
147
- # 为什么是这一层(`--patch`)而不是机器公共层 `$DSH_HOME/cordis.patch.yml`:
148
- # 公共层对所有 profile 生效且**没有 UI 写入路径**(配置编辑器只写当前 profile 的 patch)
149
- # —— 把设置放进去等于要求用户手编。而 `--patch` 叠的是 web 的 profile patch,
150
- # 用户在 web 的 Settings 页里配的就是它,配完即生效。
151
- #
152
- # 副作用(刻意的):被这一层覆盖的行,在工作台的 Settings 页里会显示
153
- # `overridden by a home patch or command-line overlay` —— 那正是"这行由 web 管"的提示。
154
- # 反向不成立:工作台里配的只落在自己的 profile patch(差异层),web 看不到。
155
- # ⚠️ 叠之前先剥掉「每个界面自己的偏好」那一类。
156
- #
157
- # `--patch` 是最高层,被它覆盖的行在工作台的 Settings 页里会显示
158
- # "overridden by a home patch or command-line overlay"、**改了也会跳回去**。
159
- # 供应商 / 搜索源 / MCP 那类机器级设置这样管是对的;但 `ui-theme.preference`
160
- # 是**每个界面自己的**偏好(有人要 web 深色、工作台浅色),叠上来等于把工作台的
161
- # 主题锁成 web 的 —— 实测就是"切到浅色自动跳回深色"。
162
- #
163
- # 剥的方式:按顶层列表项过滤,命中 id 的那一项整块不要(缩进到下一个 `- ` 为止)。
164
- WEB_PATCH="$DSH_HOME/profiles/web/cordis.patch.yml"
165
- WORKBENCH_PATCH_STRIP="${DSH_WORKBENCH_PATCH_STRIP:-ui-theme}"
151
+ # 现在改成:**工作台自己的 patch 是唯一真相**。想要 web 的哪几行,去
152
+ # 设置 → 「配置同步」里勾(它读源 profile 的 cordis.patch.yml,按行搬运,
153
+ # 见 .scratch/config-sync/spec.md 与 ADR-0044)。启动器只负责把工作台起起来。
166
154
  PATCH_ARGS=()
167
- WEB_PATCH_LAYER="$WEB_PATCH"
168
- if [ -f "$WEB_PATCH" ]; then
169
- if [ -n "$WORKBENCH_PATCH_STRIP" ]; then
170
- WEB_PATCH_LAYER="$(mktemp -t dsh-workbench-web-patch)"
171
- trap 'rm -f "$WEB_PATCH_LAYER"' EXIT INT TERM
172
- awk -v strip="$WORKBENCH_PATCH_STRIP" '
173
- /^- / {
174
- id = $0
175
- sub(/^- id:[[:space:]]*/, "", id)
176
- sub(/[[:space:]]*$/, "", id)
177
- skip = (id == strip)
178
- }
179
- !skip { print }
180
- ' "$WEB_PATCH" > "$WEB_PATCH_LAYER"
181
- fi
182
- PATCH_ARGS=(--patch "$WEB_PATCH_LAYER")
183
- else
184
- echo "dsh-workbench: 提醒 —— 找不到 ${WEB_PATCH},这次不叠加 web 的设置(供应商等可能不全)。" >&2
185
- fi
186
155
 
187
156
  # ── 声明工作台运行时的**可写根**(执行缝的沙箱只放行 process.cwd())──────────
188
157
  #
@@ -195,7 +164,7 @@ fi
195
164
  #
196
165
  # 为什么是 `--patch` 叠加而不是改 profile 的 cordis.patch.yml:profile 可能是旧的
197
166
  # (交接出去的机器尤其如此),没人会回头重跑 seed;叠加层每次启动都生效。
198
- # ⚠️ 必须排在 web 的 patch **之后**:工作台的可写根要赢。
167
+ # ⚠️ 必须排在 profile 自己那一层**之后**:工作台的可写根要赢。
199
168
  SANDBOX_PATCH="$REPO_DIR/profile/sandbox.patch.yml"
200
169
  if [ -f "$SANDBOX_PATCH" ]; then
201
170
  PATCH_ARGS+=(--patch "$SANDBOX_PATCH")