dsh-panel-control 0.3.16 → 0.7.1

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/README.md CHANGED
@@ -31,6 +31,23 @@
31
31
 
32
32
  ## 安装
33
33
 
34
+ ### 从 npm 安装(推荐)
35
+
36
+ ```bash
37
+ cd C:/Users/<you>/.dsh/profiles/desktop
38
+ npm install dsh-panel-control@0.7.1
39
+ ```
40
+
41
+ 然后把包名加进同一个文件里的 `dsh.profile.bundles`(`C:/Users/<you>/.dsh/profiles/desktop/package.json`):
42
+
43
+ ```jsonc
44
+ "dsh": { "profile": { "bundles": [ ..., "dsh-panel-control" ] } }
45
+ ```
46
+
47
+ `npm install` 会把包和包里的 `client.js` / `cordis.patch.yml` 一起放进 profile 的 `node_modules`,不需要再建目录链接。
48
+
49
+ ### 本地开发(link: 指向工作副本)
50
+
34
51
  ```bash
35
52
  # 1. 放进全局 profile(本地开发用 link:)
36
53
  # C:/Users/<you>/.dsh/profiles/desktop/package.json
@@ -78,22 +95,15 @@ python -m http.server 8787 --bind 127.0.0.1 # 在仓库根目录
78
95
 
79
96
  另外两处防呆:刷新提示只在**这次页面自己发起的刷新**之后 10 分钟内、且缺的还是同一批 id 时才追加「关一次再打开」;提示条右侧有一个 ✕,点掉后对同一批 id 不再出现(只作用于当前页面)。
80
97
 
81
- ### 插件自己把自己救回来
82
-
83
- 等用户去点刷新不够可靠:桌面端没有绑定 `Ctrl+R`,一些版本的刷新按钮也会被其它插件按住。所以 Host 半启动 12 秒后如果还没等到 Client 半的上报,就做一次**恢复推动**(recovery nudge):
84
-
85
- 1. 翻转 `client.js` 末尾的换行(有就删、没有就加,字节级可逆,文件不会越长越大);
86
- 2. 这个包的文件被加载器盯着,一次内容变化就足以让它在**已经打开的页面里**热加载这个插件;
87
- 3. 面板随即出现,`host.log` 留一行 `recovery nudge: rewrote client.js …`,Client 半也不会再为「缺的其实是我自己」弹提示条。
98
+ ### 关于"救自己"这一段:已删除
88
99
 
89
- 代价只有一条:`client.js` 最后一个字节会在两次启动之间来回变,`git status` 偶尔会看到一次无意义的尾随换行改动。不想让它碰文件就设 `DPC_NUDGE=off`,此时 Host 只记一行日志、不写盘。
100
+ 早前版本做过一次 `recovery nudge`:Host 半等不到客户端上报就翻转 `client.js` 的末尾换行,逼加载器把插件热加载进已打开的页面。它在 0.4.0 里被**整段删掉**了,原因有三条,都很实在:
90
101
 
91
- 本插件为此做了两件事:
102
+ - 热加载会重跑整个插件的注册流程,邻居插件只要注册不是幂等的(`dsh-workspace-control` 就不是)就会抛 `already has an entry` 并丢掉自己的入口——修自己一次,打坏别人一次;
103
+ - 它让行为变得依赖时钟("等 12 秒看看"),而这既不是用户要的,也无法解释为什么别的插件不需要等;
104
+ - 真正的毛病在安装方式与版本号上(见下一节与 [0.4.0 那一节](#040不再有任何等一会儿的机制)),改那两处才是根治。
92
105
 
93
- - Host 半每次挂载路由后起一个 20 秒的看门狗;如果这段时间里客户端半一次都没有上报 `boot`,就往 `~/.dsh/panel-control/host.log` 写一行明确的结论(`client half did not report within 20s: ...`),不再让日志沉默。
94
- - 建议同时保留 **dsh-unlag**(就是桌面端那个刷新按钮的插件):它会把「按旧版本号要脚本」的请求答成当前版本的内容,页面就不会因为版本号对不上而少插件;真的缺插件时它也会在界面上说一句。
95
-
96
- 排查顺序:`~/.dsh/panel-control/host.log` 看 Host 有没有挂上路由 → `client.log` 看有没有 `boot` → 两条都有但侧栏没入口,就按一次刷新按钮。
106
+ 现在 Host 半在挂载的同一瞬间只做三件事:装路由、记一行插件图结论、自检一次"我这个包的脚本取得到吗"。没有定时器,没有重试,也不会写自己的文件。
97
107
 
98
108
  ## 提示条只该出现一次(0.3.12)
99
109
 
@@ -109,6 +119,14 @@ python -m http.server 8787 --bind 127.0.0.1 # 在仓库根目录
109
119
  - 文案改成「刷新后仍然缺:重启 DSH 才会应用新的插件清单」——这才是真正有效的动作。
110
120
  - 缺口修复后自动清除记忆,下次真出现新缺口还会提示。
111
121
 
122
+ ## 0.4.0:不再有任何"等一会儿"的机制
123
+
124
+ 前面几版为了对付"启动后入口不见了",加过看门狗、自愈改写、延时判断。这些都是**事后补偿**,代价是行为不可预测(改写自己的脚本会让加载器热替换,顺手把邻居插件的重复注册打挂)。0.4.0 把它们全部删掉了:
125
+
126
+ - 没有定时器、没有自查重试、不会改写任何文件。Host 半只做三件事:装路由、读一次插件图并记一行结论、做一次"我这个包的脚本取得到吗"的自检(都是**启动瞬间**完成的同步调用)。
127
+ - Client 半和别的插件一样:`dsh.client.immediately = true`,页面启动时随清单一起加载,立刻把入口挂到侧栏。
128
+ - 安装方式也建议和别的插件一致:用 **npm 安装**(`npm i dsh-panel-control`),而不是 `link:` 本地目录。`link:` 指向的是一个我随时在改的开发目录,任何一次编辑都会让页面手里的版本号作废;装成包之后文件是静止的,不存在这个窗口。
129
+
112
130
  ## 为什么重启后偶尔看不到入口(0.3.16)
113
131
 
114
132
  DSH 给每个插件的脚本算一个**版本号**,来源是文件的 `mtime / ctime / 大小`,注册表只认它自己在组装那一刻读到的那个版本。页面拿到的是**启动时那份清单**,只要 `client.js` 在清单发出去之后被重写过(编辑器保存、`git` 换行归一化、或者早先那个"自愈"改写),页面手里的版本号就成了作废的号,请求回 404,而页面**不会报错**——入口就这么没了。
@@ -116,7 +134,7 @@ DSH 给每个插件的脚本算一个**版本号**,来源是文件的 `mtime /
116
134
  0.3.16 的处理:
117
135
 
118
136
  - Host 半只对本插件包装注册表的资源查询:页面若拿旧版本号来要,先用**本进程发过的同一版本字节**回答(缓存最近 5 个版本),再退到"用当前版本回答",其余请求原样放行,卸载时撤掉包装。别家插件的行为一点不改。
119
- - 早先的"自愈"(改写 `client.js` 强制热加载)**默认关闭**:它会重跑所有插件的注册,邻居不幂等就会丢入口——`dsh-workspace-control` 就是这么被弄掉的。需要时用 `DPC_NUDGE=on` 显式打开。
137
+ - 早先的"自愈"(改写 `client.js` 强制热加载)在 0.4.0 里已**整段删除**:它会重跑所有插件的注册,邻居不幂等就会丢入口——`dsh-workspace-control` 就是这么被弄掉的。
120
138
  - `host.log` 每次 apply 打两行结论:`graph: lists|does not list <包名>` 和 `graph: own bundle at rev … answers 200|404`,一次就能分清是"没进清单"还是"清单有但取不到"。
121
139
 
122
140
  ## 代码审查后的加固(0.3.11)
@@ -191,4 +209,24 @@ npm run smoke -- <文件> # 跑别的副本,用来复现回归
191
209
  - 分组是"建议":模型只提出组名与归属,你可以在每行右侧的下拉里改成别的组,或直接改组名。
192
210
  - 宿主若改动 `panelList` 的 class 命名或行结构,需要同步更新选择器;已做多级回退,但仍是 DOM 适配层。
193
211
  - 隐藏/分组只影响本机这份侧栏渲染,不改动任何插件自身配置。
194
- - 插件销毁时移除注入的 `style` 节点、observer 与轮询定时器;布局存在 `~/.dsh/panel-control/prefs.json`,重装或重启后接着用(想清空就在面板里点「恢复默认」,或直接删掉这个文件)。
212
+ - 插件销毁时移除注入的 `style` 节点、observer 与轮询定时器;布局存在 `~/.dsh/panel-control/prefs.json`,重装或重启后接着用(想清空就在面板里点「恢复默认」,或直接删掉这个文件)。
213
+
214
+ ## 侧栏导航溢出兜底(0.7.0,对应讨论 #12083)
215
+
216
+ 官方 `dsh-client-ui-sidebar` 把导航列表设成 `flex:none`、把下方的会话/工作区设成
217
+ `flex:1;overflow:hidden`。导航项一多,列表按内容高度吃满,下面的区域被压成 0 高且没有可滚动的容器
218
+ ([讨论 #12083](https://github.com/deepseek-ai/deepseek-harness/discussions/12083))。本插件不改官方包,
219
+ 只在页面上给两个节点加上自己的属性钩子,再用一段 CSS 兜底:
220
+
221
+ | 钩子 | 写在哪 | 作用 |
222
+ | --- | --- | --- |
223
+ | `data-dpc-list` | 导航列表(`[class*="panelList"]`) | `flex:0 1 auto`、`min-height:0`、`overflow-y:auto`、`max-height:max(120px,var(--dpc-panellist-max,45vh))` |
224
+ | `data-dpc-unbounded` | 同上(上限设为「不限」时) | 取消 `max-height`,仍保留滚动 |
225
+ | `data-dpc-region` | 列表父容器里的 `[class*="regionArea"]` | `flex:1 1 auto;min-height:min(120px,18vh)`,保证永远留得下会话区 |
226
+
227
+ 设置页新增「侧栏布局」卡片:高度兜底开关、高度上限(35/45/55/不限)、分组折叠开关、全部收起/展开。
228
+ 关掉兜底后两个属性都会被移除,侧栏回到官方原本的样子;`destroy()` 也会清理它们,不会留在一个别人的 DOM 上。
229
+
230
+ 分组标题同时是折叠按钮:`role="button"`、`tabindex="0"`、`aria-expanded`,点一下或按 Enter/空格收起该组,
231
+ 标题和数量仍保留(否则折叠后就找不到回来的入口)。折叠状态存在 `prefs.collapsed`,和排序、隐藏一样跟着
232
+ 设置文件走。窄侧栏(<64px)不渲染标题,也不应用折叠。