dsh-composer-ux 0.14.0 → 0.15.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 CHANGED
@@ -2,6 +2,78 @@
2
2
 
3
3
  本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
4
4
 
5
+ ## [0.15.0] — 2026-09-30(重启体验:全屏重启页 + 自动重连 + 侧边栏入口)
6
+
7
+ 起因(用户原话):**「重启功能参考这个插件,看看这个插件是怎么重启的 https://github.com/Noah0509/dsh-quick-restart」**
8
+ (问清后确认:学它的**重启期间体验**,宿主半不动 —— 我们那半更稳:等端口真的空出来而不是等 pid,
9
+ Windows 的隐藏控制台、TIME_WAIT、起不来要把诊断写进日志这些坑都修过。)
10
+
11
+ ### 1. 全屏重启页(不再需要你自己刷页面)
12
+
13
+ 确认重启后就地盖一张独立全屏层(直接挂在 `document.body` 上 —— 重启期间任何 React 重渲染都冲不掉它):
14
+
15
+ - **阶段机**:`stopping`(等旧进程下线)→ `starting`(等新 boot 号回来)→ `up`。
16
+ 判据是**我们宿主的 boot 号变了**,不是"能连上"(旧进程还在时也连得上);
17
+ - **极快的重启也能判完成**:整个下线窗口可能没被探到,那就凭"号变了"直接过 —— 不死等"先下线",
18
+ 否则服务其实已经起来、屏幕却永远在转;
19
+ - **进度条按上一次的实际耗时自适应**(localStorage 记着),超了显示"比预期慢";
20
+ - **卡住时有出路**:一直在线且号不变、或超时 ⇒ 摆出**日志路径**(可一键复制)+ 「重新加载页面」;
21
+ - **刷新/多标签有兜底**:进入时往 localStorage 写标记,误刷新或重开页面都能接上。
22
+
23
+ ### 2. 自动重连:恢复后带 `?restarted=1` 自动刷新,并提示「重启完成(用时 N 秒)」
24
+
25
+ 这一屏是**整页替换**,不提示的话用户只看到"页面闪了一下"、不知道成没成 —— 所以加载后说一句。
26
+
27
+ ### 3. 侧边栏脚注多一枚重启入口(设置页那枚保留)
28
+
29
+ 挂在 DSH 真实的 `sidebar.footer.action` 槽(契约照 `cordis_inspect` 查到的:list 槽、注册要 `id`、
30
+ 组件收 `wide`):宽栏显示「重启」文字 + 图标,窄栏(56px 轨道)只留图标;两步就地确认
31
+ (第一次点变「确认重启?」)—— 与设置页那枚、以及「丢弃」按钮同一套做法,不弹模态框。
32
+
33
+ ### 4. 诚实说明
34
+
35
+ 宿主半**一个字节没动**。另外这一屏第一次真正被验证,就是你下一次真的重启:如果卡在某个阶段,
36
+ 屏幕上会直接把日志路径摆出来。
37
+
38
+ ## 验证
39
+
40
+ - `npm test`:**2342 passed / 0 failed**(**23 个套件**;新增 `test/restart-screen.mjs` 48 条)。
41
+ - 变异测试:**158/158 全部被咬住**(新增 FD 不认"极快重启" / FE 没有"卡住"这一步 / FF 自动刷新不带参数)。
42
+ - 新套件用**假 document** 真跑一遍重启屏:盖层、文案、标记落盘、轮询、自动刷新、卡住时摆日志路径。
43
+ - `typecheck` 0 错误。
44
+
45
+ ## 升级说明
46
+
47
+ - 装完**需要重启 DSH** 才能看到(客户端半新增了入口与整屏)。
48
+ - 旧入口(设置页抬头那枚)照旧可用;宿主半还是上一版(读不到 boot 号)时会退回老办法。
49
+ ## [0.14.1] — 2026-09-30(模型下拉能选了 + 面板内容能滚了)
50
+
51
+ 起因(用户原话):**「跟这个一样 点开指定模型之后可以选择」**「**我点完优化模型之后,看不到下边呀,给他安个滑动条**」。
52
+
53
+ ### 1. 「模型」那一行换成真下拉(按 provider 分组、长了自己滚)
54
+
55
+ 以前是「跟随会话 / 指定」两个按钮 + 一个要你自己写 `provider/model` 的输入框 —— 得记住路由名。
56
+ 现在点开就是清单:第一项 **跟随会话模型**(并显示会话当前用的那条),下面按 provider 分组列出
57
+ 可用模型(组标题吸顶),选中即写回设置。清单长得装不下时**自己滚**(限高 260px),
58
+ 不会把卡片顶出面板。最后一项留了「手动输入 provider/model…」,清单读不到时不至于没路走。
59
+
60
+ 清单从哪来:新增只读路由 `GET /composer-ux/models`(客户端拿不到 `llm` 服务,只有宿主知道
61
+ `listProviders()` + `listModels()`)。三条纪律:**单个 provider 读不到只让那一组空着并写出原因**
62
+ (一个坏端点不该废掉整个下拉)· 60 秒缓存(下拉打开很频繁,`?fresh=1` 绕过,界面上就是「重试」)·
63
+ 永不抛(坏掉也要给客户端一句能显示的话)。
64
+
65
+ ### 2. 面板内容区能滚了(「看不到下边」的那条)
66
+
67
+ `quickSectionBody` 以前是 `overflow: hidden` —— 卡片(七行 + 详情 + 提示词框)比面板还高时,
68
+ 下面的内容就被面板底部裁掉、够不到。现在纵轴给滑动条(`overflow-y: auto` + `overscroll-behavior: contain`),
69
+ 横轴仍不滚。
70
+
71
+ ## 验证
72
+
73
+ - `npm test`:**2293 passed / 0 failed**(22 个套件)。新增 §5m:分组、单点失败隔离、缓存与 `?fresh=1`、非 GET 405。
74
+ - 变异测试:**155/155 全部被咬住**(新增 FB「一个坏端点废掉整个下拉」、FC「面板内容区又不可滚」)。
75
+ - 测试抓到一个真 bug 并修掉:`catch (error)` 遮蔽了外层那个 `let error` ⇒ 单个 provider 的失败原因永远写不进去。
76
+ - `typecheck` 0 错误。
5
77
  ## [0.14.0] — 2026-09-30(照 dsh-prompt-optimizer 移植:优化选项卡片 + 它的提示词与本体)
6
78
 
7
79
  起因(用户原话):**「https://github.com/WestFox-AwA/dsh-prompt-optimizer 全面模仿他的 UI 和 UI 中的所有功能,效果是与快捷指令部分 ui 拼接在一起,也模仿他的内部提示词」**。
package/README.md CHANGED
@@ -506,7 +506,7 @@ Windows 上 DSH 给模型的终端工具是 **PowerShell**(工具名 `pwsh`)
506
506
  | 工具循环的消息形状 / 轮次封顶 / 异常必须降级 | 同上第 6 节(假 llm 驱动整条循环,逐条检查 `role:'tool'` 与 `toolCallId`) |
507
507
  | 工具路径:默认关、开了才派、**查完吐散文必须回落**、拿不到工作目录就不派 | `test/quick-commands.mjs` 5g 节(13 条,真路由 + 假 llm) |
508
508
  | 工具读到的内容不进台账 | 同 5g 节:断言台账里只有工具名与次数、没有读到的文件内容 |
509
- | 变异守卫真的会咬人,且**必须是指定的那条测试变红** | `npm run test:mutations`:**153 条全部咬住**(判据是 `red.some(line => line.includes(item.expect))`,不是"有红就行") |
509
+ | 变异守卫真的会咬人,且**必须是指定的那条测试变红** | `npm run test:mutations`:**158 条全部咬住**(判据是 `red.some(line => line.includes(item.expect))`,不是"有红就行") |
510
510
  | 发布门禁三条判据 | `npm run gates` 全过;`check:tag` 实测 `v0.12.0` 的 tag 名与所指提交里的版本一致 |
511
511
  | 三平台 CI | GitHub Actions:ubuntu / windows / macos × Node 20(`npm ci → typecheck → build → test → check:pack → check:docs`) |
512
512
 
@@ -608,6 +608,7 @@ dsh-composer-ux/
608
608
  │ ├── stats-line.mjs # 统计行:小数语义(与官方源码逐例对)/ 文本与 aria-label 变换 / 开关
609
609
  │ ├── stats-dom.mjs # 统计行:假 DOM 钉住定位、改写范围与"不碰样式"
610
610
  │ ├── pricing.mjs # 金额:与出处实现(MIT)原文逐样本对拍 + 有意差异 + 历史档与节假日
611
+ │ ├── restart-screen.mjs # 重启屏:阶段机 / 进度自适应 / 标记兜底 / 假 DOM 跑一遍(0.15.0)
611
612
  │ ├── usage-fold.mjs # 金额:按 route 归因的折叠规则(差分 / 归属 / 脏数据 / 价格档 / clear())
612
613
  │ ├── price-sync.mjs # 金额:价目同步的消毒与四条失败路径(抓不到绝不覆盖本地价)
613
614
  │ ├── official-pricing.mjs # 金额:官方价格页解析(真页面夹具,45 条)
@@ -639,9 +640,9 @@ node build.mjs # 产出 lib/index.js + lib/client.js
639
640
  # ⚠️ 宿主半会**内联** schemastery / cosmokit:
640
641
  # 优先用 DSH 检出里的 vendor 副本,检出不在时退到 node_modules
641
642
  # 里同版本的 npm 包(两者逐字节相同)——CI 上走的就是退路
642
- npm test # 22 个套件;当前 2282 passed, 0 failed(2026-09-29 实测;CI 三平台同样全绿)
643
+ npm test # 23 个套件;当前 2342 passed, 0 failed(2026-09-29 实测;CI 三平台同样全绿)
643
644
  # 走 scripts/run-tests.mjs:顺带把"多少套件/多少条"记进 test/.last-run.json
644
- npm run test:mutations # 手动跑:变异测试,证明那套护栏真的在咬人(153 条,须单独跑)
645
+ npm run test:mutations # 手动跑:变异测试,证明那套护栏真的在咬人(158 条,须单独跑)
645
646
  # 同样记录结果,供下面的文档门禁核对
646
647
  npm run gates # 发版门禁三条一起跑:tag 指向 / 包内容 / 文档数字
647
648
  npm run check:tag # ① tag 名里的版本 == 该 tag 所指提交里的 package.json 版本