dsh-composer-ux 0.23.1 → 0.23.3

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 CHANGED
@@ -2,6 +2,56 @@
2
2
 
3
3
  本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
4
4
 
5
+ ## [0.23.3] — 2026-10-16(**停用**「工作区目录选择」:它会回滚工作区状态)
6
+
7
+ 用户 2026-10-16:「开启新会话,选择不了工作区」,并补了一句关键观察 ——
8
+ 「不需要点输入框,稍微等一会儿,它就自动返回去了」。
9
+
10
+ **真机现象**:在桌面应用里点「选择工作区目录」,选完某个目录后,输入框上方的芯片先正常变成
11
+ `Downloads`(工作区也确实建好了:`~/.dsh/storages/workspace.json` 里那一刻新增了 `D:\Downloads`),
12
+ **几秒后界面自己退回「选择一个工作区开始」**。把「工作区目录选择」这栏关掉(=不接管、回到官方
13
+ browse)就完全正常 —— 这是用户自己做的对照实验。
14
+
15
+ **根因定位到机制层**:这一栏的做法是在官方那两个目录流程槽位上,用 **-1 优先级**插进同一格,
16
+ 把官方占用者顶掉。逐行比对过:本插件那份占用者与官方 `ui-directory-picker-native` 的
17
+ `NativeDirectoryFlow` **逻辑等价**(都只弹一次框、只报一次结果、都用 ref/状态机防重入),
18
+ 差异只剩"与官方占用者**共存**"这件事本身 —— 而官方对每一格只注册一份,从不这样用。
19
+ 另外,官方 `-auto` 的判定是纯函数(`resolveDirectoryPickerBackend`):宿主绑**非回环**地址
20
+ (本机是 `192.168.124.13`)或开了远端信任时就选 `browse` —— 这正是当初做这层影子的理由,
21
+ 也是它会与官方占用者撞在一起的前提。
22
+
23
+ **处理**:在没弄清回滚来自哪一步之前,**停用**这层接管(宁可少一个便利功能,也不要一个会改坏
24
+ 工作区状态的功能):`src/client.tsx` 里接管被硬编码成 `flow.sync(false)`,不再按设置值安装影子
25
+ (恢复点写在注释里);设置页那张卡**不给开关**(不给一个"看起来能开、其实不生效"的控件),
26
+ 概览与正文如实写明停用原因与现象;`DIRECTORY_PICK_ENABLED_FIELD` 字段保留(schema 稳定、
27
+ 历史值不被当未知键)但不再驱动接管;测试第 9 / 15 节按新语义重写,变异锚点 HD 改成"停用后又接
28
+ 回去"。顺带:`check-anchors.mjs` 抓出 ID 锚点(版本号)还钉在 0.23.0,已同步到 0.23.3。
29
+
30
+ **没修的**:为什么共存会导致回滚(还没定位到具体那一步)。恢复前必须先解决它。
31
+
32
+ 验证:32 套件 2726 passed / 0 failed;变异 211 条全咬住、dirty 0;tsc / build / docs / pack 全绿。
33
+
34
+
35
+ ## [0.23.2] — 2026-10-16(适配 dsh 0.2.1-alpha.5:无需改代码,只做验证与版本对齐)
36
+
37
+ 用户 2026-10-16:「网页版 dsh 更新,并插件适配 dsh」(目标 `dsh-v0.2.1-alpha.5`)。
38
+
39
+ - **检出更新**:新分支 `upgrade-0.2.1-alpha.5`(保留 alpha.4 分支)。当时 `github.com:443` 连不上
40
+ (curl 28 / 连接重置),所以给检出加了一条 **SSH 远程**把 tag 取下来(HTTPS 断、SSH 与 codeload 通)。
41
+ `pnpm install` + 全量 `npm run build` —— **9 passed / 0 failed**(146s)。
42
+ - **适配结论:不需要改任何代码**。我依赖的接缝在 alpha.4→alpha.5 之间**只改了 package.json 的版本号**
43
+ (app-boot 的兼容闸门、package-manifest、webserver、tool-terminal、terminal-bundle、sandbox 三个包,
44
+ 共 9 个文件 +9/-9);形状核对 36 项对着 alpha.5 源码全部通过,而 `@deepseek-ai/dsh-tool-terminal@0.2.1-alpha.5`
45
+ 本来就落在声明范围内。alpha.5 里与终端有关的改动落在官方**客户端**的
46
+ `terminal-controller/client`(面板侧减少重复查询、失败终端不再反复重试),与本插件用的宿主侧接缝无关。
47
+ - **真机验证**(alpha.5 + 本机,profile `a5web`):启动日志干净、**0 行被禁用**、自检 10 行全对
48
+ (含「持久终端工具 — 已挂上;tool-terminal 0.2.1-alpha.5(要求 0.2.1-alpha.5,profile 里同版)」)、
49
+ 自启动默认关且值名按 profile(`dsh-composer-ux:autostart:a5web`)、运行期请求头覆盖已挂上。
50
+ - 这个版本**没有功能变化**:它是"已在 alpha.5 上验证 + 版本对齐"的补丁版。web 装它并把 tool-terminal
51
+ 钉到 0.2.1-alpha.5;桌面端仍跑 0.2.0-rc.2,装同一份插件、tool-terminal 保持 0.2.0-rc.2。
52
+
53
+
54
+
5
55
  ## [0.23.1] — 2026-10-16(修:「重启 DSH」的确认条离按钮太远)
6
56
 
7
57
  用户 2026-10-16 截图指出:「重启按钮与重启栏目离得太远」。
package/README.md CHANGED
@@ -720,7 +720,7 @@ node build.mjs # 产出 lib/index.js + lib/client.js
720
720
  # ⚠️ 宿主半会**内联** schemastery / cosmokit:
721
721
  # 优先用 DSH 检出里的 vendor 副本,检出不在时退到 node_modules
722
722
  # 里同版本的 npm 包(两者逐字节相同)——CI 上走的就是退路
723
- npm test # 32 个套件;当前 2732 passed, 0 failed(2026-10-09 实测;CI 三平台同样全绿)
723
+ npm test # 32 个套件;当前 2726 passed, 0 failed(2026-10-09 实测;CI 三平台同样全绿)
724
724
  # 走 scripts/run-tests.mjs:顺带把"多少套件/多少条"记进 test/.last-run.json
725
725
  npm run test:mutations # 手动跑:变异测试,证明那套护栏真的在咬人(211 条,须单独跑)
726
726
  # 同样记录结果,供下面的文档门禁核对
package/dsh-plugin.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "manifestVersion": "0.15",
4
4
  "id": "dsh-composer-ux.input-experience",
5
5
  "name": "dsh-composer-ux",
6
- "version": "0.23.1",
6
+ "version": "0.23.3",
7
7
  "license": "MIT",
8
8
  "facets": {
9
9
  "host": {
package/lib/client.js CHANGED
@@ -6258,30 +6258,19 @@ function NotifyCard({ settings, setField }) {
6258
6258
  }
6259
6259
  );
6260
6260
  }
6261
- function DirectoryPickCard({ settings, setField }) {
6262
- const on = settings.directoryPickEnabled;
6261
+ function DirectoryPickCard() {
6263
6262
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
6264
6263
  FoldCard,
6265
6264
  {
6266
6265
  name: "\u5DE5\u4F5C\u533A\u76EE\u5F55\u9009\u62E9",
6267
- summary: on ? "\u5F00\u542F\u4E2D \xB7 \u684C\u9762\u5E94\u7528\u91CC\u5F39\u7CFB\u7EDF\u6587\u4EF6\u5939\u6846\uFF08\u4EFB\u610F\u76D8\u7B26\u70B9\u9009\uFF09" : "\u7528\u5B98\u65B9\u5E94\u7528\u5185\u6D4F\u89C8\u5BF9\u8BDD\u6846",
6268
- toggle: { checked: on, onChange: (next) => {
6269
- setField(DIRECTORY_PICK_ENABLED_FIELD, next);
6270
- } },
6266
+ summary: "\u5DF2\u505C\u7528 \xB7 \u4E0E\u5B98\u65B9\u76EE\u5F55\u6D41\u7A0B\u5171\u5B58\u65F6\u4F1A\u56DE\u6EDA\u5DE5\u4F5C\u533A\u72B6\u6001\uFF08\u73B0\u5728\u7528\u5B98\u65B9\u5E94\u7528\u5185\u6D4F\u89C8\u5BF9\u8BDD\u6846\uFF09",
6271
6267
  children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: { margin: "10px 0", fontSize: 12, lineHeight: 1.6, opacity: 0.85 }, children: [
6272
- "\u6253\u5F00\u540E\uFF1A\u5728",
6273
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("strong", { children: "\u684C\u9762\u5E94\u7528" }),
6274
- "\u91CC\u70B9\u300C\u9009\u62E9\u5DE5\u4F5C\u533A\u76EE\u5F55\u300D\u76F4\u63A5\u5F39 Windows \u7CFB\u7EDF\u6587\u4EF6\u5939\u6846 \u2014\u2014 \u4EFB\u610F\u76D8\u7B26\u70B9\u8FDB\u53BB\u9009\uFF0C",
6275
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("strong", { children: "\u4E0D\u7528\u518D\u624B\u52A8\u8F93\u5165\u76D8\u7B26\u8DEF\u5F84" }),
6276
- "\uFF0C\u4E5F\u80FD\u5728\u91CC\u9762\u65B0\u5EFA\u6587\u4EF6\u5939\u3002",
6277
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("br", {}),
6278
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { style: { opacity: 0.75 }, children: "\u5B98\u65B9\u90A3\u4E2A\u5E94\u7528\u5185\u5BF9\u8BDD\u6846\u5728 Windows \u4E0A\u7956\u5148\u94FE\u6B62\u4E8E\u76D8\u7B26\u6839\uFF08\u5B83\u81EA\u5DF1\u7684 README \u5199\u7740\u300C\u4E0D\u679A\u4E3E\u76D8\u7B26\u6839 \u2014\u2014 \u8DE8\u76D8\u4F9D\u8D56\u6D4F\u89C8\u5668 UI \u7684\u8DEF\u5F84\u8F93\u5165\u5165\u53E3\u300D\uFF09\uFF0C\u6240\u4EE5\u6362\u76D8\u624D\u8981\u624B\u8F93\uFF1B\u8FD9\u4E00\u9879\u5C31\u662F\u628A\u5B83\u6362\u6210\u7CFB\u7EDF\u6846\u3002" }),
6268
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("strong", { children: "\u6682\u65F6\u505C\u7528" }),
6269
+ "\uFF1A\u6253\u5F00\u5B83\u65F6\uFF0C\u63D2\u4EF6\u4F1A\u63A5\u7BA1\u5B98\u65B9\u90A3\u4E24\u4E2A\u76EE\u5F55\u6D41\u7A0B\u69FD\u4F4D\uFF0C\u771F\u673A\u4E0A\u8868\u73B0\u4E3A",
6270
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("strong", { children: "\u9009\u5B8C\u5DE5\u4F5C\u533A\u51E0\u79D2\u540E\u53C8\u9000\u56DE\u300C\u9009\u62E9\u4E00\u4E2A\u5DE5\u4F5C\u533A\u5F00\u59CB\u300D" }),
6271
+ "\uFF08\u5DE5\u4F5C\u533A\u5176\u5B9E\u5DF2\u7ECF\u5EFA\u597D\uFF0C \u53EA\u662F\u754C\u9762\u72B6\u6001\u88AB\u9876\u56DE\u53BB\uFF09\u3002\u4E0D\u63A5\u7BA1\u5C31\u6B63\u5E38\uFF0C\u6240\u4EE5\u73B0\u5728\u9ED8\u8BA4\u4E0D\u63A5\u7BA1\u3002",
6279
6272
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("br", {}),
6280
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { style: { opacity: 0.75 }, children: [
6281
- "\u53EA\u5728\u684C\u9762\u5E94\u7528\u91CC\u751F\u6548\uFF08\u53EA\u6709\u90A3\u513F\u6709\u7CFB\u7EDF\u5BF9\u8BDD\u6846\u7684\u63A5\u5165\u53E3\uFF09\uFF1B\u624B\u673A / \u6D4F\u89C8\u5668\u91CC\u4ECD\u662F\u5B98\u65B9\u90A3\u4E2A\u5E94\u7528\u5185\u6D4F\u89C8 \u5BF9\u8BDD\u6846\uFF08\u5E26\u8DEF\u5F84\u8F93\u5165\uFF09\uFF0C\u8FDC\u7AEF\u4F53\u9A8C\u4E0D\u53D8\u3002\u5F00\u5173",
6282
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("strong", { children: "\u5373\u65F6\u751F\u6548" }),
6283
- "\uFF0C\u4E0D\u7528\u91CD\u542F\uFF1B\u5173\u6389\u5373\u56DE\u5230\u5B98\u65B9\u539F\u6837\u3002"
6284
- ] })
6273
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { style: { opacity: 0.75 }, children: "\u5B83\u672C\u6765\u8981\u89E3\u51B3\u7684\u95EE\u9898\u8FD8\u5728\uFF1A\u5B98\u65B9\u90A3\u4E2A\u5E94\u7528\u5185\u5BF9\u8BDD\u6846\u5728 Windows \u4E0A\u7956\u5148\u94FE\u6B62\u4E8E\u76D8\u7B26\u6839 \uFF08\u5B83\u81EA\u5DF1\u7684 README \u5199\u7740\u300C\u4E0D\u679A\u4E3E\u76D8\u7B26\u6839 \u2014\u2014 \u8DE8\u76D8\u4F9D\u8D56\u6D4F\u89C8\u5668 UI \u7684\u8DEF\u5F84\u8F93\u5165\u5165\u53E3\u300D\uFF09\uFF0C \u6240\u4EE5\u6362\u76D8\u8981\u624B\u8F93\uFF1B\u8FD9\u4E00\u9879\u5C31\u662F\u628A\u5B83\u6362\u6210\u7CFB\u7EDF\u6587\u4EF6\u5939\u6846\u3002\u7B49\u4FEE\u597D\u5171\u5B58\u90A3\u4E00\u6B65\u518D\u6062\u590D\u3002" })
6285
6274
  ] })
6286
6275
  }
6287
6276
  );
@@ -6419,7 +6408,7 @@ function SettingsSection({ useLive, useBook, useBookStatus, useWriteNotice, acti
6419
6408
  ] }),
6420
6409
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(RestartBanner, { restart }),
6421
6410
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(NotifyCard, { settings, setField: actions.setField }),
6422
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DirectoryPickCard, { settings, setField: actions.setField }),
6411
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DirectoryPickCard, {}),
6423
6412
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(FoldCard, { name: "\u81EA\u68C0", summary: "\u628A\u63D2\u4EF6\u5404\u5904\u72B6\u6001\u644A\u6210\u4E00\u5F20\u8868\uFF08\u5B57\u6BB5 / \u5F00\u5173 / \u7EC8\u7AEF / \u8BF7\u6C42\u5934 / \u901A\u77E5 / \u73AF\u5883\uFF09", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DoctorCard, {}) }),
6424
6413
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
6425
6414
  FoldCard,
@@ -9338,13 +9327,8 @@ function apply(ctx) {
9338
9327
  ctx.effect(() => installSettingsCardStyle(), "composer-ux: settings card style");
9339
9328
  ctx.effect(() => {
9340
9329
  const flow = createDirectoryFlowController({ slots, scope: globalThis, component: DirectoryFlowEntry });
9341
- const syncDirectoryFlow = () => {
9342
- flow.sync(live.getSnapshot().directoryPickEnabled === true);
9343
- };
9344
- syncDirectoryFlow();
9345
- const unsubscribe = live.subscribe(syncDirectoryFlow);
9330
+ flow.sync(false);
9346
9331
  return () => {
9347
- unsubscribe();
9348
9332
  flow.dispose();
9349
9333
  };
9350
9334
  }, "composer-ux: directory flow");