dsh-in-hand 1.7.5 → 1.7.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.
- package/README.md +79 -0
- package/lib/page.html +940 -64
- package/lib/sw.js +3 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -227,6 +227,45 @@ PDF / ZIP / MP4)。这是**按内容识别**,不是"按内容放行" ——
|
|
|
227
227
|
进行中 / 完成 / 失败三态。这是"看得懂进度"最关键的一处。
|
|
228
228
|
- **逐字输出只改一个节点**。整页重建会让长会话每来一个字都重排一次。
|
|
229
229
|
|
|
230
|
+
### 对话排版与子代理二级页(v1.7.6)
|
|
231
|
+
|
|
232
|
+
手机只有 360–390px 宽,对话里最容易坏的是三样东西:表格、长代码、长 URL。v1.7.6
|
|
233
|
+
把表格渲染成真表格并放进可横滑的 `.tablewrap`,代码块自己横滑,长 token 在分隔符后
|
|
234
|
+
断行;页面级 `scrollWidth` 在 390 和 360 下都等于视口宽。助手正文、流式回复和工具卡
|
|
235
|
+
统一 100% 宽、左对齐;用户消息仍靠右。
|
|
236
|
+
|
|
237
|
+
子代理不再混在主对话里:工具条出现「子代理 N」,点进去是独立列表,再点开只读快照;
|
|
238
|
+
返回回到原来的根会话。没有子代理时入口不出现。
|
|
239
|
+
|
|
240
|
+
| 改前(表格是竖线文本) | 改后(真表格 / 可横滑代码) |
|
|
241
|
+
| --- | --- |
|
|
242
|
+
|  |  |
|
|
243
|
+
|
|
244
|
+
暗色与子代理列表:
|
|
245
|
+
|
|
246
|
+

|
|
247
|
+
|
|
248
|
+

|
|
249
|
+
|
|
250
|
+
截图是 `docs/demo.html` 的真实渲染(Chrome headless + CDP,DPR2),子代理列表用演示数据;
|
|
251
|
+
流式截图里的文字是注入的 mock。回归自检:`npm run check` 里的
|
|
252
|
+
`scripts/check-mobile.mjs` 会在 390 / 360 两个宽度下跑 `window.twSelfCheck()`、切会话
|
|
253
|
+
残留断言与左基线断言。
|
|
254
|
+
|
|
255
|
+
### v1.7.7:坏图不再留空框、图标不再依赖字体
|
|
256
|
+
|
|
257
|
+
图片加载失败(宿主文件路由只服务 `~/.dsh/attachments` / `~/.dsh/outbox`,外面的路径
|
|
258
|
+
是 403;外域 URL 也可能不可达)时,v1.7.6 会铺一张 63px 的整宽 ERR 卡片,视觉上仍是一块
|
|
259
|
+
把正文截断的占位框。v1.7.7 换成 36px 单行提示条,并且页面级保证 DOM 里**不留破图 `img`**:
|
|
260
|
+
|
|
261
|
+
| 改前(63px ERR 占位卡) | 改后(36px 提示条,可点开原图) |
|
|
262
|
+
| --- | --- |
|
|
263
|
+
|  |  |
|
|
264
|
+
|
|
265
|
+
会话抽屉里「子代理 N」入口的图标改成内联 SVG(不再用字符,真机上曾出现「廿」这种回退字形):
|
|
266
|
+
|
|
267
|
+

|
|
268
|
+
|
|
230
269
|
### 页面为什么不做整页重建
|
|
231
270
|
|
|
232
271
|
页面每 3 秒轮询一次,但**数据没变就完全不碰 DOM**,只刷新右上角时间戳。首版是
|
|
@@ -330,6 +369,42 @@ dsh plugin --profile web add <你的绝对路径>/dsh-in-hand
|
|
|
330
369
|
(由 profile 的 `node_modules` 解析),而 profile 自带补丁里若写路径,必须是绝对路径
|
|
331
370
|
(相对路径是相对该补丁文件解析的,跨盘会失败)。
|
|
332
371
|
|
|
372
|
+
## DSH Web 端口固定为 3080(部署前提)
|
|
373
|
+
|
|
374
|
+
中继的上游默认就是 `http://127.0.0.1:3080`(`server.mjs` 里的 `RELAY_UPSTREAM`),
|
|
375
|
+
所以 **DSH 的 Web 端口必须是 3080**,否则 `/taskwatch/data` 只会回 502,手机页显示
|
|
376
|
+
「对话功能不可用」。桌面版默认不是这样:端口由 `app.asar` 决定,而那里把 `--port 0`
|
|
377
|
+
写死了(OS 每次启动随机挑一个空闲端口),并且 **没有** `DSH_PORT` / `DSH_WEB_PORT`
|
|
378
|
+
这类环境变量入口、配置文件里也没有端口字段 —— 环境变量与 CLI 参数这条路在桌面版上
|
|
379
|
+
都是堵死的。
|
|
380
|
+
|
|
381
|
+
唯一「不改安装目录、升级不丢」的入口,是用户补丁层覆盖 web-app 自带的 `webserver` 行:
|
|
382
|
+
|
|
383
|
+
```yaml
|
|
384
|
+
# ~/.dsh/profiles/desktop/cordis.patch.yml
|
|
385
|
+
- id: webserver
|
|
386
|
+
name: "@deepseek-ai/dsh-host-webserver"
|
|
387
|
+
config:
|
|
388
|
+
host: "127.0.0.1"
|
|
389
|
+
port: 3080 # 原来是 !!js ctx.webStartup.port ?? 3080,桌面版传进来的是 0
|
|
390
|
+
tls: !!js ctx.webStartup.tls
|
|
391
|
+
compression: gzip
|
|
392
|
+
compressionLevel: 1
|
|
393
|
+
compressionThresholdBytes: 1024
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
三个要点:
|
|
397
|
+
|
|
398
|
+
- 补丁层是**整段替换** `config`,不是深合并。少写一个字段(上面那四个除 `port` 和
|
|
399
|
+
`host` 之外的字段)等于把它删掉,所以必须原样写回。
|
|
400
|
+
- 这个 profile 的补丁文件是 **live** 生效的:保存后 DSH 立刻在新端口重新监听,
|
|
401
|
+
已经打开的窗口会断线 —— 重开一次客户端即可,会话不丢。
|
|
402
|
+
- **改端口时三处必须一起改**:上面这行 `port`、`~/.dsh/autostart/services-watchdog.ps1`
|
|
403
|
+
里给中继设的 `RELAY_UPSTREAM`、以及本文档这一节。中继的 `UPSTREAM` 是启动时读取的
|
|
404
|
+
模块常量,改环境变量不会热生效,必须重启一次中继。
|
|
405
|
+
- 3080 若被别的程序占着,桌面版会 bind 失败、Web 界面起不来;先 `curl http://127.0.0.1:3080/`
|
|
406
|
+
看是谁在应答。
|
|
407
|
+
|
|
333
408
|
## 在外网 / 手机上访问(需要你自己叠一层)
|
|
334
409
|
|
|
335
410
|
**本插件自己不做鉴权,只监听回环。** 它提供的是「可被安全转发的只读源」,转发这一层
|
|
@@ -549,6 +624,10 @@ nonce = crypto.randomBytes(16) # base64url 后 22 个字符
|
|
|
549
624
|
| 中继回的 502,响应头带 `x-taskwatch-hop: relay` | 中继 → DSH 上游 | 中继自己发的:隧道是通的,但上游 DSH 不可达(回环端口没在监听,或插件没挂载) |
|
|
550
625
|
| 手机上**反复**看到 502 | 手机的 service worker | v1.6.0 之前的 SW 会把那次 502 存成外壳,之后离线导航一直吃它,而服务端早已恢复 —— v1.6.0 起只缓存 2xx,并把 `CACHE` 升到 v13 清掉已存的 502 |
|
|
551
626
|
|
|
627
|
+
> 2026-10-21 起 DSH 的 Web 端口固定在 3080(见「DSH Web 端口固定为 3080」一节)。
|
|
628
|
+
> 中继那种 502 基本只剩两种情况:DSH 没在 3080 上(客户端没开,或 3080 被别的程序占用
|
|
629
|
+
> 导致 bind 失败),或者中继进程还拿着旧端口的上游(`UPSTREAM` 启动时读取,必须重启中继)。
|
|
630
|
+
|
|
552
631
|
## 安全边界
|
|
553
632
|
|
|
554
633
|
- **写入口等于一台终端**。一旦放行 `/taskwatch/chat/send`,能打开这个页面的人就能在
|