dsh-zen-remote 1.1.7 → 1.1.10
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/AGENTS.md +20 -0
- package/README.md +10 -2
- package/docs/interface.md +5 -2
- package/dsh-push.mjs +18 -4
- package/lib/client.js +467 -31
- package/lib/types/client/MobileHome.d.ts +3 -1
- package/lib/types/client/MobileHome.d.ts.map +1 -1
- package/lib/types/client/effects/workbench-ref-close.d.ts +29 -0
- package/lib/types/client/effects/workbench-ref-close.d.ts.map +1 -0
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/styles/compat.css.d.ts +1 -1
- package/lib/types/client/styles/compat.css.d.ts.map +1 -1
- package/lib/types/client/styles/composer.css.d.ts +1 -1
- package/lib/types/client/styles/composer.css.d.ts.map +1 -1
- package/lib/types/client/styles/home.css.d.ts +1 -1
- package/lib/types/client/styles/home.css.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/client/MobileHome.tsx +183 -23
- package/src/client/effects/workbench-ref-close.ts +69 -0
- package/src/client/index.tsx +7 -0
- package/src/client/styles/compat.css.ts +138 -0
- package/src/client/styles/composer.css.ts +63 -28
- package/src/client/styles/home.css.ts +64 -0
package/AGENTS.md
CHANGED
|
@@ -57,3 +57,23 @@ pnpm test # 网关 node:test 用例 + 三个界面自检脚本 + 文档版
|
|
|
57
57
|
- **`lib/` 是产物,不手改**:改 `src/` → `pnpm build` → 提交 `lib/`。
|
|
58
58
|
- **桌面必须 no-op**:≥1024px 逐像素与未安装时一致。
|
|
59
59
|
是从真机事故里攒出来的,改相关代码前先读。
|
|
60
|
+
- **要藏宿主刚渲染出来的东西,别用 `requestAnimationFrame`**:React 在该帧的
|
|
61
|
+
rAF 阶段之后才提交 DOM,所以从 mutation 里排的 rAF 落在**下一帧**——中间那
|
|
62
|
+
一帧已经画到屏幕上,用户就看见闪。两个月内三次「晚一帧」的 bug(2026-08-18
|
|
63
|
+
回复要等回合结束才出现、08-22 工具调用行先显后折、08-25 issue #3 流式抖动)
|
|
64
|
+
都是这个根子。两条出路:能用选择器表达的交给样式表(`turn-fold.css.ts` 的
|
|
65
|
+
`BORN_FOLDED`,读宿主自己的 `data-chat-flow-kind` / `data-variant`,React
|
|
66
|
+
插入节点的同一次提交里就带着,第一帧就是隐藏的);表达不了的放进
|
|
67
|
+
MutationObserver 回调里同步做(`turn-fold.ts` 的 `markWholeRows`)——回调是
|
|
68
|
+
微任务,跑在这一帧渲染更新之前,两个方向都不会晚。rAF 只留给能容忍晚一帧的
|
|
69
|
+
活(全量重扫、插 chip、改文案)。
|
|
70
|
+
- **别用 `:has()` 写死宿主的 DOM 层数**:包裹层数不等于组件源码看上去的层数
|
|
71
|
+
——槽位会额外套一层(真实是 `flowItem > seat > AssistantMarkdown root >
|
|
72
|
+
body > 块`,比组件自身结构多一层)。深度猜错的选择器**静默失效**:测试全绿、
|
|
73
|
+
控制台干净,只有拿真界面量才看得出来。需要结构判断就用 JS 遍历
|
|
74
|
+
(`foldsWholeRow` 那种沿父节点上溯的写法),不假设层数。
|
|
75
|
+
- **改了界面就去真界面上量**:`turn-fold` 这类规则用自建的静态页面验证会给出
|
|
76
|
+
假阳性(合成 DOM 猜不对宿主的包裹层)。打开 `127.0.0.1:3080` 读现有会话的
|
|
77
|
+
`getComputedStyle` 即可,**不要为了验证去建会话或发消息**(耗真实 token,见
|
|
78
|
+
工作区 AGENTS.md 的硬约束)。注意浏览器标签在后台时 rAF 不触发,chip 会是 0
|
|
79
|
+
个——那是观测假象,不是回归,截图把窗口唤到前台再看。
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
<p align="center">
|
|
5
5
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-0B7285?style=flat-square" alt="MIT"></a>
|
|
6
|
-
<img src="https://img.shields.io/badge/release-v1.1.
|
|
6
|
+
<img src="https://img.shields.io/badge/release-v1.1.10-5B4CF0?style=flat-square" alt="v1.1.10">
|
|
7
7
|
<img src="https://img.shields.io/badge/DSH-Web%20Profile-5B4CF0?style=flat-square" alt="DSH Web Profile">
|
|
8
8
|
</p>
|
|
9
9
|
|
|
@@ -39,7 +39,7 @@ dsh plugin add dsh-zen-remote
|
|
|
39
39
|
```jsonc
|
|
40
40
|
{
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"dsh-zen-remote": "^1.1.
|
|
42
|
+
"dsh-zen-remote": "^1.1.10" // 本地开发换成 "link:/path/to/dsh-zen-remote"
|
|
43
43
|
},
|
|
44
44
|
"dsh": { "profile": { "bundles": [
|
|
45
45
|
"@deepseek-ai/dsh-base",
|
|
@@ -188,6 +188,7 @@ open http://127.0.0.1:3088/lan-gate/admin
|
|
|
188
188
|
| `DSH_PUSH_DEBOUNCE_MS` | `15000` | 两条自动推送的最小间隔;等授权/等回答的通知不受压制 |
|
|
189
189
|
| `DSH_PUSH_SUMMARY` | 关 | 设 `1` 让通知带上本回合的最终回复(只取正文,不含思考过程;截 120 字)和提问原文 |
|
|
190
190
|
| `DSH_PUSH_TOOL` | 开 | 设 `0` 关掉模型可调用的 `push_notify` 工具 |
|
|
191
|
+
| `DSH_PUSH_APPROVAL_GRACE_MS` | `5000` | 「等授权」推送前的等待窗口。装了会自动答复审批的插件时(如 dsh-auto-approve),要等它答完再决定推不推——答完了就不推。判定器比这个慢就还是会推,那时把它调大 |
|
|
191
192
|
|
|
192
193
|
上传大小上限(默认 20MB)在插件行的 `config.maxUploadBytes` 里改。
|
|
193
194
|
|
|
@@ -234,6 +235,13 @@ open http://127.0.0.1:3088/lan-gate/admin
|
|
|
234
235
|
这两类不看会话层级——子代理自己卡在授权上,照样喊你,因为等的还是你。也**不受
|
|
235
236
|
`DSH_PUSH_DEBOUNCE_MS` 压制**:「有操作等你点头」是最不能被吞掉的一条。
|
|
236
237
|
|
|
238
|
+
**有机器答复者时的时机**:审批事件的顺序是「先记 asked → 问答复者 → 记 decided」,
|
|
239
|
+
所以推送并不是一见到 asked 就发,而是等 `DSH_PUSH_APPROVAL_GRACE_MS`(默认 5 秒)
|
|
240
|
+
——这段时间内被答复掉的就不推。这个窗口原来是 1.5 秒,按「答复者都在同一个 tick
|
|
241
|
+
内结算」设计的;那对同步答复者成立,但对模型答复者不成立(实测平均 2.4 秒),
|
|
242
|
+
结果是自动通过的请求照样推了一条「等你授权」,通知到了、框却从来没出现。
|
|
243
|
+
换了更慢的判定模型就把这个值调大。
|
|
244
|
+
|
|
237
245
|
策略自动放行的授权不会打扰你:请求发起后先等 1.5 秒,配对的「已决定」到了就取消,
|
|
238
246
|
只有真正悬着没人管的才推。
|
|
239
247
|
|
package/docs/interface.md
CHANGED
|
@@ -119,6 +119,9 @@ composer 最左的回形针打开的是**手机本地**的文件选择器(iOS
|
|
|
119
119
|
|
|
120
120
|
**修复**
|
|
121
121
|
|
|
122
|
+
- 适配 dsh-vision-router(2.0.1):composer 识图开关在手机端压成 28px 圆形
|
|
123
|
+
图标钮(眼睛为 CSS mask 图标,aria-label / aria-pressed 照旧),不再把
|
|
124
|
+
模型名挤出 composer 行;桌面端保持插件原样(见兼容插件清单)。
|
|
122
125
|
- 适配 DSH `0.1.1`:活动 chip 点击失效(点了退回信息卡)。三处上游变化同时命中
|
|
123
126
|
旧方案——子代理入口从 `header.actions` 槽移进新的 `header.lineage` 槽(面包屑
|
|
124
127
|
内);其根节点 class 变成 `"ZKlsPq_root "`(**带尾随空格**,`[class$="_root"]`
|
|
@@ -239,13 +242,13 @@ composer 最左的回形针打开的是**手机本地**的文件选择器(iOS
|
|
|
239
242
|
|
|
240
243
|
## 兼容插件
|
|
241
244
|
|
|
242
|
-
- [dsh-better-sidebar](https://github.com/omdsh-dev/DSH-better-sidebar)(
|
|
245
|
+
- [dsh-better-sidebar](https://github.com/omdsh-dev/DSH-better-sidebar)(移动端全宽抽屉,本插件在会话页头部给它留入口位;手机上文件树里点 @ 引用后代点开关自动收起面板——面板全屏盖住会话页,草稿变化看不见,收起本身就是点击反馈)——本机实测 **0.15.0**
|
|
243
246
|
- [@nanmicoder/dsh-agent-teams](https://github.com/NanmiCoder/dsh-agent-teams)(AgentTeams 活动浮层:手机端挪到会话头部下方、避开安全区,会话列表页隐藏;子代理会话头部保留可点的父会话面包屑用于切回)——本机实测 **0.1.9**
|
|
244
247
|
- [@ychris12138/dsh-usage-stats](https://github.com/Ychris12138/dsh-usage-stats)(用量与余额,主屏 chips 行可直接打开;旧包名 `dsh-usage-stats` 已废弃,两个名字同时留在 profile 里会因重复的 `usage-stats` 行让 DSH 起不来)——本机实测 **0.2.9**
|
|
245
248
|
- [@opendsh/dsh-plugin-scheduled-tasks](https://github.com/Ceelog/dsh-plugins)(定时任务,主屏 chips 行自动收割入口)——本机实测 **0.2.3**
|
|
246
249
|
- dsh-at-file(@文件引用;它和本插件的附件 chip 读的是同一份草稿 token,手机端会为一个上传文件同时画出缩略图和文件名两条,故隐藏它 `.dsh-uploads/` 下那几行,其余 @ 引用不动;桌面端不隐藏——那边本插件的 chip 是关掉的,它是唯一的呈现)——本机实测 **0.6.7**
|
|
247
250
|
- [@ace-zone/dsh-market](https://www.npmjs.com/package/@ace-zone/dsh-market)(插件市场;它的弹窗顶栏在手机上放不下,关闭的 × 被挤出面板外,故隐藏标语/版本号/官网链接三个装饰位并让标题省略号收缩,语言切换和 × 保留;认插件自己渲染的 `.dshm-ver[title="@ace-zone/dsh-market"]` 版本片,同名的其他"市场"插件不会被误伤)——本机实测 **0.1.66**
|
|
248
|
-
- [dsh-vision-
|
|
251
|
+
- [dsh-vision-router](https://github.com/ysr666/dsh-vision-router)(视觉桥,composer 行内的识图开关胶囊;手机端压成 28px 圆形图标钮——原胶囊 👁+文字+激活 ✓ 约 90px 定宽,而手机 composer 行不换行、模型座位是唯一可收缩项,会被它挤没;三条文字 span 全部隐藏,改由 CSS mask 画一只 currentColor 眼睛,开合状态仍走插件自己的品牌描边/着色与 `aria-pressed`,可访问名走按钮自带的 aria-label)——本机实测 **2.0.1**
|
|
249
252
|
- [dsh-web-ui 全家桶](https://www.npmjs.com/package/@linxin666/dsh-web-ui-all)(文件树 / 预览 / 任务看板 / SSH / 宠物 / 会话统计 / 远程配对 / 设置)——沿用上游兼容规则,本次未扩展
|
|
250
253
|
|
|
251
254
|
## 安装
|
package/dsh-push.mjs
CHANGED
|
@@ -61,10 +61,24 @@ const PUSH_TOOL_ENABLED = process.env.DSH_PUSH_TOOL !== undefined ? process.env.
|
|
|
61
61
|
const ASK_USER_TOOL = 'ask_user_question'
|
|
62
62
|
|
|
63
63
|
// @deepseek-ai/dsh-user-approval appends `approval/asked` before consulting
|
|
64
|
-
// the answerer chain and `approval/decided` after
|
|
65
|
-
// hook-answered request settles in the same tick, so only an ask still
|
|
64
|
+
// the answerer chain and `approval/decided` after — so only an ask still
|
|
66
65
|
// undecided after this grace period is actually waiting on a human.
|
|
67
|
-
|
|
66
|
+
//
|
|
67
|
+
// The window used to be 1500ms on the assumption that "a policy-resolved or
|
|
68
|
+
// hook-answered request settles in the same tick". That held while every
|
|
69
|
+
// answerer was synchronous. A model-backed answerer (dsh-auto-approve and
|
|
70
|
+
// anything like it) takes seconds: measured 2.4s average, 3.4s worst on a
|
|
71
|
+
// small model, and more on a slower one. At 1500ms the timer won the race and
|
|
72
|
+
// pushed "waiting for your approval" for requests that were auto-approved a
|
|
73
|
+
// second later — the notification arrived, the prompt never did.
|
|
74
|
+
//
|
|
75
|
+
// 5000ms covers a machine answerer with margin while still reaching a phone
|
|
76
|
+
// promptly when a human really is needed. Raise it if your answerer is slower
|
|
77
|
+
// than that; the cost of a longer window is only that genuine prompts notify
|
|
78
|
+
// later.
|
|
79
|
+
const APPROVAL_PENDING_MS = Number(
|
|
80
|
+
process.env.DSH_PUSH_APPROVAL_GRACE_MS ?? FILE.pushApprovalGraceMs ?? 5000
|
|
81
|
+
)
|
|
68
82
|
|
|
69
83
|
// Low-level sender shared by every leg: POSTs to the gateway's local
|
|
70
84
|
// /pwa/push/send, which does the actual VAPID + aes128gcm encrypted delivery
|
|
@@ -415,7 +429,7 @@ export function apply(ctx) {
|
|
|
415
429
|
console.warn(`[dsh-zen-remote-push] cannot listen on "session/event": ${String(e && e.message || e)}`)
|
|
416
430
|
}
|
|
417
431
|
|
|
418
|
-
console.log(`[dsh-zen-remote-push] approval/question notifications on; turn-end (${EVENTS.join(', ')}) ${TURN_END_ENABLED ? 'on' : 'off — set DSH_PUSH_TURN_END=1 to enable'}`)
|
|
432
|
+
console.log(`[dsh-zen-remote-push] approval/question notifications on (approval grace ${APPROVAL_PENDING_MS}ms); turn-end (${EVENTS.join(', ')}) ${TURN_END_ENABLED ? 'on' : 'off — set DSH_PUSH_TURN_END=1 to enable'}`)
|
|
419
433
|
|
|
420
434
|
registerPushTool(ctx, gate)
|
|
421
435
|
}
|