dsh-zen-remote 2.3.6 → 2.3.8

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.
Files changed (80) hide show
  1. package/AGENTS.md +15 -5
  2. package/CHANGELOG.md +83 -0
  3. package/README.md +2 -2
  4. package/README.zh-CN.md +2 -2
  5. package/docs/interface.md +10 -4
  6. package/docs/remote-access.en.md +6 -0
  7. package/docs/remote-access.md +6 -0
  8. package/lan-gate.mjs +7 -0
  9. package/lib/client-pairing.js +10 -0
  10. package/lib/client-pairing.js.map +1 -1
  11. package/lib/client-routes.js +183 -94
  12. package/lib/client-routes.js.map +1 -1
  13. package/lib/client.js +505 -78
  14. package/lib/debug-redact.js +253 -0
  15. package/lib/debug-redact.js.map +1 -0
  16. package/lib/debug-report.js +60 -0
  17. package/lib/debug-report.js.map +1 -0
  18. package/lib/fetch-route-intercept.js +23 -0
  19. package/lib/fetch-route-intercept.js.map +1 -1
  20. package/lib/index.js +293 -45
  21. package/lib/index.js.map +1 -1
  22. package/lib/log-ring.js +76 -0
  23. package/lib/log-ring.js.map +1 -0
  24. package/lib/merge-streams.js +55 -19
  25. package/lib/merge-streams.js.map +1 -1
  26. package/lib/relay-filter.js +4 -3
  27. package/lib/relay-filter.js.map +1 -1
  28. package/lib/relay-server.js +5 -3
  29. package/lib/relay-server.js.map +1 -1
  30. package/lib/types/client/effects/remote-drop.d.ts +20 -8
  31. package/lib/types/client/effects/remote-drop.d.ts.map +1 -1
  32. package/lib/types/client/locales.d.ts +8 -1
  33. package/lib/types/client/locales.d.ts.map +1 -1
  34. package/lib/types/client/settings/SettingsSection.d.ts.map +1 -1
  35. package/lib/types/client/styles/misc.css.d.ts +1 -1
  36. package/lib/types/client/styles/misc.css.d.ts.map +1 -1
  37. package/lib/types/client-data/remote-drop.d.ts +64 -0
  38. package/lib/types/client-data/remote-drop.d.ts.map +1 -1
  39. package/lib/types/client-data/settings-form.d.ts +3 -0
  40. package/lib/types/client-data/settings-form.d.ts.map +1 -1
  41. package/lib/types/client-pairing.d.ts +8 -0
  42. package/lib/types/client-pairing.d.ts.map +1 -1
  43. package/lib/types/client-routes.d.ts +23 -0
  44. package/lib/types/client-routes.d.ts.map +1 -1
  45. package/lib/types/debug-redact.d.ts +68 -0
  46. package/lib/types/debug-redact.d.ts.map +1 -0
  47. package/lib/types/debug-report.d.ts +58 -0
  48. package/lib/types/debug-report.d.ts.map +1 -0
  49. package/lib/types/fetch-route-intercept.d.ts +26 -0
  50. package/lib/types/fetch-route-intercept.d.ts.map +1 -1
  51. package/lib/types/index.d.ts +7 -1
  52. package/lib/types/index.d.ts.map +1 -1
  53. package/lib/types/log-ring.d.ts +57 -0
  54. package/lib/types/log-ring.d.ts.map +1 -0
  55. package/lib/types/merge-streams.d.ts +27 -0
  56. package/lib/types/merge-streams.d.ts.map +1 -1
  57. package/lib/types/relay-filter.d.ts +4 -3
  58. package/lib/types/relay-filter.d.ts.map +1 -1
  59. package/lib/types/relay-server.d.ts.map +1 -1
  60. package/package.json +6 -3
  61. package/pwa/app.css +13 -2
  62. package/scripts/check-debug-report.mjs +277 -0
  63. package/scripts/check-remote-drop.mjs +130 -0
  64. package/scripts/check-tablet-safe-area.mjs +49 -0
  65. package/src/client/effects/remote-drop.ts +271 -24
  66. package/src/client/locales.ts +20 -4
  67. package/src/client/settings/SettingsSection.tsx +120 -3
  68. package/src/client/styles/misc.css.ts +38 -0
  69. package/src/client-data/remote-drop.ts +103 -0
  70. package/src/client-data/settings-form.ts +3 -0
  71. package/src/client-pairing.ts +11 -0
  72. package/src/client-routes.ts +196 -90
  73. package/src/debug-redact.ts +290 -0
  74. package/src/debug-report.ts +93 -0
  75. package/src/fetch-route-intercept.ts +29 -0
  76. package/src/index.ts +282 -43
  77. package/src/log-ring.ts +101 -0
  78. package/src/merge-streams.ts +71 -16
  79. package/src/relay-filter.ts +4 -3
  80. package/src/relay-server.ts +5 -3
package/AGENTS.md CHANGED
@@ -16,7 +16,7 @@
16
16
  | `src/config.ts` | 配置模型:四层回退(env > 插件行 > `lan-gate.config.json` > 默认值)、loader 的 `Config` schema(全 volatile)、`resolveRole` |
17
17
  | `src/http.ts` | host 路由共用的 JSON 响应封装与同源 POST 门 |
18
18
  | `src/admin-routes.ts` | 设置页管理后端 `/_dsh/zen-remote/admin/*`:代调网关本机 API(配对 / 设备 / 测试推送)+ 共享开关 |
19
- | `src/client-routes.ts` | 子客户端路由 `/_dsh/zen-remote/client/*`:remote-status(两角色都挂,host 只应答这一条、其余 404)、配对代理、设置页诊断、plain-HTTP 转发 `client/http/*`(改动摘要 / diff) |
19
+ | `src/client-routes.ts` | 子客户端路由 `/_dsh/zen-remote/client/*`:remote-status(两角色都挂,host 只应答这一条、其余 404)、配对代理、设置页诊断、plain-HTTP 转发 `client/http/*`(改动摘要 / diff)、`debug-report`(脱敏诊断报告,via 墙先于分派,CU-3) |
20
20
  | `src/client-pairing.ts` | 子客户端配对纯逻辑:服务端地址归一化(http 仅限内网段)、claim/探针结果分类 |
21
21
  | `src/share-store.ts` | 共享会话表(`~/.dsh/zen-remote-shares.json`,持久化,重启恢复),中继访问控制的事实来源 |
22
22
  | `src/activity.ts` | 会话活动统计 + 闲置休眠扫描(`idleHours`,运行中/等待中不计时) |
@@ -37,6 +37,8 @@
37
37
  | `src/client-data/plugin-bridge.ts` | 设置页纯函数(PB-5):桥接状态 → 文案键、整机数据同意表的切换(只动一键);浏览器半边,不 import 主包 |
38
38
  | `src/fetch-route-intercept.ts` | 子客户端本机拦截的第二半:包装宿主连接服务 `fetchRoutes` 表的上传与导出两项——远程会话的非图片附件经 `relay/v1/upload` 流式转服务端(超限本地拒、失败回宿主自己的 200 失败信封)、虚拟 id 的导出后台 403(形态检测、懒装重试、卸载守卫) |
39
39
  | `src/virtual-id.ts` | `zr~<serverId>~<id>` 虚拟 id 算术(纯函数、零依赖;client-data 半边许可 import 它做 zr~ 判定,先例 remote-drop.ts / remote-status.ts) |
40
+ | `src/log-ring.ts` | 诊断导出用内存日志环(CU-1):上限 300 条、进程内不落盘;index.ts 两分支的 logWarn/logInfo 收口双写(ctx.logger + 环),生命周期事件(row apply/reload、网关 spawn/exit、relay online/offline、fetch-route 安装含 via)push 进环 |
41
+ | `src/debug-report.ts` + `src/debug-redact.ts` | 诊断报告装配与脱敏器(CU-2,纯逻辑零 DSH import):装配 getter 注入拼 `_meta/config/status/gateway/logs` 五板块、配置按字段名挑选(秘密构造性缺席);脱敏器 URL 走**哨兵摘出-还原**(userinfo→`<token>@`、host→地址类型、端口与 path 保留、query 长值单独 token 化)、家目录折叠先于 token 趟;`scripts/check-debug-report.mjs` 真值表钉住全部形态(含哨兵伪造) |
40
42
  | `src/merge-streams.ts` | 三条全局流/列表的本地 + 远程合并状态机(侧边栏远程分组) |
41
43
  | `src/fingerprint.ts` | DSH 接口指纹:规范化描述符 → 分组 JSON Schema 哈希,供握手比对 |
42
44
  | `src/restart-fields.ts` / `restart-watcher.ts` | 需重启字段的指纹监测,变化即重载插件行 |
@@ -83,10 +85,18 @@ tag 名与 `package.json` 版本一致性 → `pnpm publish`(npm Trusted Publi
83
85
  OIDC 无令牌,provenance 自动生成)→ **建 GitHub Release**。
84
86
 
85
87
  Release 那步刻意排在 npm 之后:它宣告的是「这个版本已经发出去了」,npm 失败就
86
- 不该留下一个指向不存在版本的发布页。发布说明用 `--generate-notes` 按上一个 tag
87
- 以来的提交自动生成,所以**提交信息就是 changelog**,不另外维护文件。这一步可重入
88
- (先 `gh release view` 查在不在,在就跳过),重跑失败的 workflow 不会因为
89
- Release 已存在而挂掉。
88
+ 不该留下一个指向不存在版本的发布页。正文来源见下方 CHANGELOG 段(该版本的那一
89
+ 段 + 自上一版本以来的全部提交);这一步可重入(先 `gh release view` 查在不在,
90
+ 在就跳过),重跑失败的 workflow 不会因为 Release 已存在而挂掉。checkout 带
91
+ `fetch-depth: 0`(提交列表要全历史)。
92
+
93
+ CHANGELOG(2026-11-02 起有 `CHANGELOG.md`):只记用户可感知的变化,未发布段落
94
+ 攒着待发内容;**发版前**把「未发布」标题改成该版本号 + 日期,随 `npm version
95
+ patch` 的 version commit 一起提交(脚本只同步 README 徽章,CHANGELOG 是手动步)。
96
+ 此前「提交信息就是 changelog、不另维护文件」的约定作废。GitHub Release 正文
97
+ **就是 CHANGELOG 里该版本的那一段**(workflow 用同一条 awk 提取,缺段会在 npm
98
+ 发布前被守卫挡下),其下自动附「自上一版本以来的全部提交」(git log 现算,
99
+ 不再用 `--generate-notes`——它无法与 --notes-file 共存,且正文来源要可预测)。
90
100
 
91
101
  需要人工配置的只有一处:npmjs.com 的包设置里登记可信发布者
92
102
  `KyoMio/dsh-zen-remote` + 文件名 `publish.yml`。GitHub Release 那步用的是
package/CHANGELOG.md ADDED
@@ -0,0 +1,83 @@
1
+ # 更新日志
2
+
3
+ 只记用户可感知的变化;每个 Release 的正文即本文件对应版本段,其下附逐提交
4
+ 完整列表,见
5
+ [GitHub Releases](https://github.com/KyoMio/dsh-zen-remote/releases)(tag 驱动自动生成)。
6
+ 界面半边的细节叙事另见 [`docs/interface.md`](docs/interface.md) 的「更新日志」一节。
7
+
8
+ ## 2.3.8(2026-11-03)
9
+
10
+ ### 兼容
11
+
12
+ - **DSH 0.2.2-alpha.3**:`session/control` 的实时 `projection` 帧改为按事件批量
13
+ (`seq` + `changes[{key, val}]`,取代逐键的 `key` / `value`)。子客户端合并远程
14
+ 控制流时两种形态都能读,并统一拆成「逐键字段 + 单条 `changes`」的双形态帧,
15
+ 本机 DSH 新旧版本都能直接应用(本机与服务端版本不一致时会话标题、模型选择等
16
+ 投影不再停更或打断控制流);服务端补发的投影帧同样改为双形态。
17
+ - 插件清单声明 `dsh.manifestVersion: 1` 与 `engines.dsh: ">=0.2.1-alpha.2 <0.3.0-0"`
18
+ (含预发布:覆盖 npm latest 0.2.1-rc.5 与 alpha 通道 0.2.2-alpha.3)。
19
+
20
+ ## 2.3.7(2026-11-02)
21
+
22
+ ### 新增
23
+
24
+ - **远程附件守卫扩展到回形针与粘贴**(issue #49):此前只有拖拽会把「带子客户端
25
+ 本机路径的非图片文件」从宿主的零拷贝捷径里拦下、改走字节上传,现在回形针选择器
26
+ 与编辑器粘贴同样命中;拖入 / 粘贴**文件夹**时整批拦下并提示;附带 fetch-route
27
+ 懒装重试与卸载守卫。
28
+ - **导出诊断信息**:插件设置区块底部一键下载 `zen-remote-debug-<role>-<时间戳>.json`
29
+ (版本与角色 / 配置形态 / 诊断聚合 / host 另含网关摘要 / 近 300 条插件事件),
30
+ 两层脱敏(配置按字段名挑选 + 统一脱敏器),可直接附到 GitHub issue;
31
+ 经网关打开时拒绝导出,报告只能在本机生成。
32
+
33
+ ### 修复
34
+
35
+ - **宽幅平板独立 PWA 顶部安全区**(≥1024px:iPad 横屏、12.9/13 吋 iPad 竖屏恰为
36
+ 1024、安卓平板):网关对所有非 desktop 设备注入 `viewport-fit=cover`,但安全区
37
+ 补偿止步于 1023px 断点,顶部控件被压进状态栏、难以点按。新增
38
+ `(min-width: 1024px) and (display-mode: standalone)` 双门控规则补齐上下两个安全区
39
+ (锚定官方 AppFrame,`border-box` + `--mnav-sat`/`--mnav-sab`);桌面浏览器与
40
+ 桌面 App 构造性 no-op,≥1024px 桌面逐像素不变的硬约束不受影响。
41
+ - **平板 PWA 整页可拖动弹回**:壳级 `overscroll-behavior` 此前只写在 body 且仅
42
+ 纵轴,视口级橡皮筋在 768px 以上仍然活着。现 html/body 双写、双向杀掉;
43
+ 内部滚动区不受影响,只是边缘滚动不再链到整页。
44
+
45
+ ## 2.3.6(2026-10-31)
46
+
47
+ - 插件桥:支持 json-body WebSocket 帧的会话 id 定位与改写(`/sidebar/ws/sidechat`)。
48
+ - 中继:观察 `agent/created` 的父会话,同步未通告的 sidechat / 子代理摘要。
49
+ - 手机端:turn-tail 的 24h 时钟不再折行;信息卡合并 turns / steps 计数并显示 tok/s 速度。
50
+
51
+ ## 2.3.5(2026-10-30)
52
+
53
+ - turn-fold:纯签名推理步不再留下空行(适配 DSH 0.2.1-rc.5)。
54
+ - 安全与维护:新增 SECURITY.md 与 Dependabot(`@deepseek-ai/*` 闭包手动管理)、
55
+ 测试以 `vm` 替代 `eval`;中继背压用例改为按余量驻留,修掉 CI 上的两连假失败。
56
+
57
+ ## 2.3.4(2026-10-28)
58
+
59
+ - 插件桥 v2 声明补全(PB-22 ~ PB-25):`deny` 路由对一切远程上下文统一 503 拒答;
60
+ `rewriteIds` 新增创建型 `{ fields }` 声明,深扫改写范围扩到「请求自带 ∪ 已知会话
61
+ 清单」;路径段 / json-body 定位路由进入协作校验链(逐命中共享校验、请求体体积
62
+ 上限、隧道升级前置校验)。
63
+
64
+ ## 2.3.3(2026-10-27)
65
+
66
+ - 适配 dsh-better-sidebar 0.28.2;接受 DSH 0.2.2-alpha peer 并钉该版本的会话指纹。
67
+
68
+ ## 2.3.2(2026-10-26)
69
+
70
+ - 发版重跑,无代码变化(仅版本号与 README 徽章)。
71
+
72
+ ## 2.3.1(2026-10-26)
73
+
74
+ - 配置向导:三步配置向导上线(README 安装 / 向导快速上手重排并配截图);Caddy
75
+ 预编译发行版与国内镜像自动探测、cloudflared / Caddy 的连接与停滞超时、模式切换
76
+ 停进程与状态清理;CI 每日预编译 Caddy + cloudflared 全平台产物并自动跟踪上游。
77
+ - 安全:网关在 `0.0.0.0` 上拒绝未反代的公网 IP 直连;Caddy / Tunnel 模式把 host
78
+ 重置回 `127.0.0.1`。
79
+ - Windows:修复 Caddy 裸二进制下载、Cloudflare Tunnel UUID CNAME 校验、向导保存
80
+ CF token 前先切回 host 角色、重命名回退,以及网关 spawn 时绕开 `node.cmd`
81
+ 批处理包装。
82
+
83
+ 更早版本(≤ 2.2.9)见 [GitHub Releases](https://github.com/KyoMio/dsh-zen-remote/releases)。
package/README.md CHANGED
@@ -66,7 +66,7 @@ dsh plugin --profile web add dsh-zen-remote
66
66
  // ~/.dsh/profiles/desktop/package.json
67
67
  {
68
68
  "dependencies": {
69
- "dsh-zen-remote": "^2.3.6" // for local development: "link:/path/to/dsh-zen-remote"
69
+ "dsh-zen-remote": "^2.3.8" // for local development: "link:/path/to/dsh-zen-remote"
70
70
  }
71
71
  }
72
72
  ```
@@ -209,7 +209,7 @@ Notifications fire only when **you are actually needed**, along two independent
209
209
  - Automatic LAN / Tailscale IPv4 discovery and local network probing, backed by the gateway's private-IP wall (`403 public-direct-forbidden`) against accidental public exposure
210
210
  - Dedicated **Manage Devices** modal and automatic sidebar cleanup on client unpair/revocation
211
211
  - **Cross-Desktop Remote Sessions (Client)**:
212
- - Full-featured remote sessions in the sidebar: history, streaming, approvals/questions, server model catalog, file tree, changes summary/diff, server-side terminal, windowed artifact downloads, server-side LibreOffice PDF preview, up to 500 MiB file uploads, and drag-and-drop file upload interception
212
+ - Full-featured remote sessions in the sidebar: history, streaming, approvals/questions, server model catalog, file tree, changes summary/diff, server-side terminal, windowed artifact downloads, server-side LibreOffice PDF preview, up to 500 MiB file uploads, and drag-and-drop file upload interception; in remote sessions, non-image files added via the paperclip picker or pasted are likewise converted to byte uploads instead of unreadable local-path references
213
213
  - **Plugin Bridge**:
214
214
  - Cooperative plugins and built-in adapters (such as `dsh-better-sidebar`) route their panel requests in remote sessions to the host machine (with explicit owner consent for whole-machine data). See [Plugin Bridge Guide](docs/plugin-bridge.md).
215
215
 
package/README.zh-CN.md CHANGED
@@ -66,7 +66,7 @@ dsh plugin --profile web add dsh-zen-remote
66
66
  // ~/.dsh/profiles/desktop/package.json
67
67
  {
68
68
  "dependencies": {
69
- "dsh-zen-remote": "^2.3.6" // 本地开发换成 "link:/path/to/dsh-zen-remote"
69
+ "dsh-zen-remote": "^2.3.8" // 本地开发换成 "link:/path/to/dsh-zen-remote"
70
70
  }
71
71
  }
72
72
  ```
@@ -210,7 +210,7 @@ cd ~/.dsh/profiles/desktop && pnpm install
210
210
  - 独立「已配对设备管理」弹窗,以及客户端解配/吊销时自动归档清理侧边栏残留会话
211
211
  - **跨桌面端远程会话(桌面客户端)**:
212
212
  - 侧边栏远程工作区分组,支持完整对话流、审批/提问抢答同步、服务端模型目录同步、文件树与改动 diff、服务端远程终端
213
- - 交付物分段流式下载到本机、服务端 LibreOffice 渲染 Office 文档 PDF 预览、最大 500 MiB 非图片大文件流式上传与拖拽文件自动转上传
213
+ - 交付物分段流式下载到本机、服务端 LibreOffice 渲染 Office 文档 PDF 预览、最大 500 MiB 非图片大文件流式上传与拖拽文件自动转上传;远程会话中回形针与粘贴的非图片文件同样自动转字节上传(不再留下读不到的本机路径引用)
214
214
  - **第三方插件桥(Plugin Bridge)**:
215
215
  - 协作插件登记桥接声明或通过内置适配器(如 `dsh-better-sidebar`),即可在子客户端的远程会话中直接读写主服务端的数据面板(整机数据需服务端主人在设置页逐插件授权)。详见 [插件桥文档](docs/plugin-bridge.md)。
216
216
 
package/docs/interface.md CHANGED
@@ -23,6 +23,8 @@ v1.0.0(fork 自 [mexiaosqwq/dsh-web-mobile](https://github.com/mexiaosqwq/dsh-
23
23
  - **经网关打开时只读**:手机或其它浏览器经网关打开设置页可以看,但生成配对码、改角色、吊销这些管理动作被拒绝(带 `x-zen-remote-via` 标记的请求一律拒绝 POST)——设备丢了也没法用它再配出新设备;
24
24
  - 角色判定读的是 configForms 行文档里的已保存角色;行文档答不上来时回退探测 `/_dsh/mobile-nav/client-config`(该路由两角色都注册,报的是合并后的生效角色)。
25
25
 
26
+ - **导出诊断信息(2.4,区块最底部,两角色都有)**:一键下载 `zen-remote-debug-<role>-<时间戳>.json`,可直接附到 GitHub issue——五个板块(`_meta` 版本与角色 / `config` 配置形态 / `status` 全部诊断聚合 / host 角色另含 `gateway` 网关摘要 / `logs` 近 300 条插件事件),浏览器端再并入附件入口守卫的分入口计数与当前会话信号。两层脱敏:配置**按字段名挑选**(deviceToken 等秘密构造性缺席),全部文本再过统一脱敏器(绝对路径只留叶子、家目录折叠为 `~`、URL 主机名降级为地址类型但端口保留、token 形态串打码、`zr~` id 截断);对话内容与附件在任何一层都不进报告。经网关打开时该路由被 via 墙拒绝——报告只能在本机导出(`GET /_dsh/zen-remote/client/debug-report`,CU-3)。
27
+
26
28
  - **插件桥(2.1)**:远程共享组之后多一个小节「插件桥」——主服务端区块里逐插件列出已登记的名字与版本:只含会话数据的标注「随会话共享转发」;含整机数据的给开关「允许转发整机数据」(缺省关),旁注「打开后,已配对的桌面应用端可在远程会话里读取该插件的整机数据」。开关走与其它字段同一条 staged 表单通道(提交整张 `pluginBridgeConsent` 表,只动该插件的键),保存后列表自动重拉(数据来自 `GET /_dsh/zen-remote/admin/plugin-bridge`,经网关打开时拒绝)。子客户端区块的诊断组里逐插件一行「名字 · 本机版本 · 状态」,状态文案:已桥接 / 服务端未安装 / 版本不同(服务端 x.y.z)/ 声明不一致 / 服务端主人未允许整机数据 / 中继离线 / 服务端 zen-remote 版本过旧;本机改道未启用时另加一行「本机改道未启用:<原因>」。文案与判定逻辑都是纯函数(`src/client-data/plugin-bridge.ts`)。
27
29
 
28
30
  ### 主服务端:共享部件
@@ -135,13 +137,15 @@ PWA,再进来就是冷启动。插件自己的边缘手势也触发不了—
135
137
 
136
138
  安全上的几句话:这条 HTTP 路由只接受同源请求,文件名清洗后只取叶子名,写入路径校验不允许越出工作目录,单文件默认上限 20MB(可在 profile 里的插件行用 `maxUploadBytes` 调整)。远程访问时,这条路由和其它请求一样在网关半边的配对墙之后。
137
139
 
138
- ### 远程会话拖拽附件(2.2.6)
140
+ ### 附件入口守卫(drop / 回形针 / 粘贴,2.2.6 起拖拽、2.4 起三入口)
141
+
142
+ 桌面端把文件从访达拖进会话输入区、或经回形针选择、或往编辑器里粘贴文件时,宿主有一条「同机零拷贝」捷径:Electron 的 `__DSH_HOST_PATHS__` 能读出文件的磁盘路径,`addFiles` 对**带路径的非图片**文件不传字节、直接插一条 `@本机绝对路径` 的引用。远程会话里这个路径是**子客户端机器**的路径,服务端的会话永远读不到,引用落地就是坏的(issue #49:拖拽之外,回形针与粘贴走的是同一条捷径)。浏览器半边在 document 上装了 **capture 阶段**的三个守卫(`src/client/effects/remote-drop.ts`,判定纯函数在 `src/client-data/remote-drop.ts`):`drop` 事件、composer 隐藏选择器的 `change`(结构特征判定:`input[type=file][multiple][hidden]` 且**无 accept 属性**——导入/恢复类选择器通常带 accept 或可见,不在此列)、编辑器 `paste`(仅当事件目标在 `[contenteditable="true"]` 内,设置页/搜索框不归它管)。当前会话是 `zr~` 虚拟 id 时,把文件重包装成不带磁盘路径的 `File`(`new File([f], …)`,Electron 对 JS 构造的 File 返回空路径),塞进新的 `DataTransfer` 后在 document 上重派发一个合成 drop 事件——宿主自己的 drop 管道(mask 清理、busy 拒绝、目录判定、addFiles 分支)原样接手,把它当普通浏览器拖拽走字节上传,下游由既有的 fetch-route 拦截经中继转服务端暂存。合成事件 `isTrusted === false`,拦截器自己不会再处理它,天然防自重入。
139
143
 
140
- 桌面端把文件从访达拖进会话输入区时,宿主有一条「同机零拷贝」捷径:Electron 的 `__DSH_HOST_PATHS__` 能读出拖入文件的磁盘路径,`addFiles` 于是不传字节、直接插一条 `@本机绝对路径` 的引用。远程会话里这个路径是**子客户端机器**的路径,服务端的会话永远读不到,引用落地就是坏的。2.2.6 起浏览器半边在 document 上装了一个 **capture 阶段**的 drop 拦截(`src/client/effects/remote-drop.ts`,判定纯函数在 `src/client-data/remote-drop.ts`):当前会话是 `zr~` 虚拟 id 时,把拖入的文件重包装成不带磁盘路径的 `File`(`new File([f], …)`,Electron 对 JS 构造的 File 返回空路径),塞进新的 `DataTransfer` 后在 document 上重派发一个合成 drop 事件——宿主自己的 drop 管道(mask 清理、busy 拒绝、目录判定、addFiles 分支)原样接手,把它当普通浏览器拖拽走字节上传,下游由既有的 fetch-route 拦截经中继转服务端暂存。合成事件 `isTrusted === false`,拦截器自己不会再处理它,天然防自重入。
144
+ 三重触发门,任一不满足就零干预(`passthrough`):`__DSH_HOST_PATHS__` 存在(手机 / 纯浏览器宿主本来就走上传,不装拦截)、当前会话是远程虚拟 id(当前会话读 `localStorage['dsh.sessions.current']`,事件发生时现场读;读不到按本机会话处理——误判方向安全:最坏把本机拖拽当成远程多传了字节,不会丢数据)、事件是受信的。**干预条件分入口**:拖拽沿用「有文件即拦」的 2.2.6 语义;回形针与粘贴只在批次里**至少一个文件带路径且非图片**(正是零拷贝坏分支)时才拦——无路径文件、纯图片、纯文本一律放行,不碰本来就能用的流程。拖入/粘贴**文件夹**时整批拦下(文件夹没法用单文件上传修),出一条 3 秒自动消失的提示(locale key `remoteDropFolderBlocked`);目录判定优先于改道,`webkitGetAsEntry` 不可用时视为无文件夹(与宿主同一默认)。回形针改道时还会清掉 `input.value`(否则同文件二次选择不触发 change)。重包装或 `DataTransfer.items.add` 抛错时放行原事件回归现状——宁坏勿丢。
141
145
 
142
- 三重触发门,任一不满足就零干预(`passthrough`):`__DSH_HOST_PATHS__` 存在(手机 / 纯浏览器宿主本来就走上传,不装拦截)、当前会话是远程虚拟 id(当前会话读 `localStorage['dsh.sessions.current']`,事件发生时现场读;读不到按本机会话处理——误判方向安全:最坏把本机拖拽当成远程多传了字节,不会丢数据)、事件是受信的。拖入**文件夹**时整批拦下(文件夹没法用单文件上传修),出一条 3 秒自动消失的提示(locale key `remoteDropFolderBlocked`)。`webkitGetAsEntry` 不可用时视为无文件夹(与宿主同一默认)。重包装或 `DataTransfer.items.add` 抛错时放行原事件回归现状——宁坏勿丢。
146
+ 误伤边界(无 accept 特征门的已知局限):第三方插件若也有「隐藏 + 多选 + 无 accept」的选择器,且恰逢远程会话为当前会话,其选中的带路径非图片文件会被改道进远程上传——最坏结果是文件进了远程会话(立即可见、可重来),不丢数据;特征门已把面收窄到最小。宿主改掉 InputBar 结构时症状是回形针/粘贴回到路径 chip 现状(拖拽不受影响),靠计数与真机验收兜底。
143
147
 
144
- 降级:`DragEvent` 不可用或 `DataTransfer` 不可构造时**整体不装**,行为与未安装本功能完全一致。诊断:设置页(子客户端角色)诊断区新增「远程拖拽守卫」一行,显示安装状态与拦截 / 重派发 / 拦下文件夹 / 放行 / 重包失败五个计数(`remoteDropDiagnostics()`,浏览器端计数,渲染时现读)。
148
+ 降级:`DragEvent` 不可用或 `DataTransfer` 不可构造时**整体不装**,行为与未安装本功能完全一致。诊断:设置页(子客户端角色)诊断区「附件入口守卫」一行,显示安装状态与拦截 / 重派发 / 拦下文件夹 / 放行 / 重包失败五个计数,以及按 drop / 回形针 / 粘贴 分入口的拦截与放行计数(`remoteDropDiagnostics()`,浏览器端计数,渲染时现读)。计数口径分入口:回形针与粘贴在本机会话不进计数(远程门先于计数);拖拽沿用 2.2.6 行为,本机拖拽仍记一次放行。
145
149
 
146
150
  ### 分享图
147
151
 
@@ -165,6 +169,8 @@ PWA,再进来就是冷启动。插件自己的边缘手势也触发不了—
165
169
 
166
170
  页面各表面的安全区留白统一收进两个可注入的 CSS 变量(`--mnav-sat`/`--mnav-sab`),平时读 `env(safe-area-inset-*)`,调试参数在时可以整体假冒——这是后面两层缓解的基础。
167
171
 
172
+ 这套补偿原本止步于 1023px 断点,但网关对一切非 desktop 设备都注入 `viewport-fit=cover`,于是**宽幅平板的独立 PWA(≥1024px:iPad 横屏、12.9/13 吋 iPad 竖屏恰好 1024、安卓平板)**会画进状态栏下方而无人买单——顶部控件被系统区压住、难以点按。现由 `misc.css.ts` 一条 `(min-width: 1024px) and (display-mode: standalone)` 双门控的规则补偿:锚点是官方 AppFrame(`[data-shell-overlay]` 的直接父层,与 `findFrame()` 同源),`border-box` + 上下两个变量。桌面浏览器(display-mode 不匹配)、桌面 App(整个样式表被 `dshDesktop` 门挡掉、也拿不到 cover)与一切 `env()` 为 0 的环境构造性 no-op,≥1024px 桌面逐像素不变的硬约束不受影响;规则由 `scripts/check-tablet-safe-area.mjs` 钉住。
173
+
168
174
  在这套变量之上,iOS 26.x 的 Safari/PWA 上出现了一个已知系统缺陷:独立(加到主屏)PWA 第一次弹出软键盘后,布局视口会永久性地比屏幕矮一截(`innerHeight`/`visualViewport.height`/`100dvh` 一起变小),直到整个 app 被彻底退出重开。这不是本插件的 bug,社区已有记录([参考文章](https://dev.to/cederhook/fixing-the-ios-standalone-pwa-keyboard-bug-that-shrinks-your-viewport-for-good-63d)),本插件只做了两层缓解,不是根治:
169
175
 
170
176
  1. **视口下沉检测**——检测到系统在底部裁掉一截可视区域时,把底部安全区补偿归零,避免在已经空白的系统条上再叠一层空白;
@@ -472,6 +472,12 @@ npm test # boots a mock upstream, runs the gateway/auth/push suites: proxy+inj
472
472
 
473
473
  ---
474
474
 
475
+ ## Troubleshooting: attach the debug report before screenshots
476
+
477
+ When filing a GitHub issue, first click **Export diagnostics** at the very bottom of the plugin settings page **on the machine that misbehaves** and attach the downloaded JSON. It carries versions, role, config shapes (no addresses, no tokens), every interception/redirect diagnostic counter, the upload-redirect probe (`installedVia` tells whether the fetch-route wrap came in via inject or the fallback), and the last ~300 plugin event log lines (event codes and id shapes only — never conversation content), all passed through two redaction layers (absolute paths keep only their leaf, URL hostnames degrade to an address class, token-shaped runs are masked). Exporting from both the server and the sub-client is ideal. Remote devices **cannot** fetch this report through the gateway (refused by the via wall) — it exports locally only.
478
+
479
+ ---
480
+
475
481
  ## Layout
476
482
 
477
483
  | Path | Role |
@@ -509,6 +509,12 @@ npm test # 起 mock 上游,跑 gateway/auth/push 三组测试:反代与注
509
509
 
510
510
  ---
511
511
 
512
+ ## 🩺 排障:先要诊断包,再要截图
513
+
514
+ 反馈问题(GitHub issue)时,先在**出问题那台机器**的插件设置页最底部点「导出诊断信息」,把下载的 JSON 直接附上——它包含版本、角色、配置形态(不含地址与令牌)、全部拦截/改道诊断计数、上传改道探针(`installedVia` 能看出 fetch-route 是经 inject 还是兜底装的)、近 300 条插件事件日志(只记事件码与 id 形态,不含对话内容),并经过两层脱敏(绝对路径只留叶子、URL 主机名降级为地址类型、token 形态串打码)。主服务端与子客户端各导一份效果最好。远程设备经网关**拿不到**这份报告(via 墙拒绝)——它只能在本机导出。
515
+
516
+ ---
517
+
512
518
  ## 🗂️ 项目结构
513
519
 
514
520
  | 路径 | 作用 |
package/lan-gate.mjs CHANGED
@@ -136,10 +136,17 @@ export function apply(ctx, config) {
136
136
  handle = null
137
137
  return
138
138
  }
139
+ // CU-1:spawn 成功回报(配置端口;网关遇端口被占会自行重试,最终端口
140
+ // 以 /lan-gate/status 为准)。可选回调,缺省或抛错都不影响子进程。
141
+ try { config?.gatewayEvent?.('spawn', { port: values.port }) } catch (e) { /* ignore */ }
139
142
  handle.done.then((outcome) => {
140
143
  console.log(`[dsh-zen-remote-gateway] gateway exited code=${outcome.exitCode} signal=${outcome.signal}`)
144
+ // CU-1:子进程生命周期回报给主入口的日志环(诊断导出用)。回调是可选
145
+ // 的(旧式独立加载没有它),且绝不能影响子进程自身的收尾。
146
+ try { config?.gatewayEvent?.('exit', { code: outcome.exitCode, signal: outcome.signal }) } catch (e) { /* ignore */ }
141
147
  }).catch((err) => {
142
148
  console.error(`[dsh-zen-remote-gateway] spawn failed: ${String(err && err.message || err)}`)
149
+ try { config?.gatewayEvent?.('exit', { error: String(err && err.message || err) }) } catch (e) { /* ignore */ }
143
150
  })
144
151
  if (timer) {
145
152
  // 子进程输出读两拍(T17b-fix):1.5s 的一拍是老习惯,但网关遇到端口
@@ -28,6 +28,16 @@ function isHttpAllowedHost(hostname) {
28
28
  return isAllowedIpv6(hostname);
29
29
  return isAllowedIpv4(hostname);
30
30
  }
31
+ /**
32
+ * Whether one hostname sits in a private/loopback network — the same verdict
33
+ * {@link isHttpAllowedHost} applies inside `normalizeServerUrl`, exported for
34
+ * the debug report's serverUrl shaper (CU-2): the one place outside the
35
+ * normalizer that needs the private-network fact, kept here so the address
36
+ * classes can never drift apart from what pairing actually accepts.
37
+ */
38
+ export function isPrivateNetworkHost(hostname) {
39
+ return isHttpAllowedHost(hostname);
40
+ }
31
41
  /** Dotted-quad check against the allowed ranges. The hostname comes from a
32
42
  * parsed URL, so it is already canonical (the WHATWG parser folds exotic
33
43
  * spellings like `010.0x0A.0.3` into plain decimal before we ever see it). */
@@ -1 +1 @@
1
- {"version":3,"file":"client-pairing.js","sourceRoot":"","sources":["../src/client-pairing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client-pairing.js","sourceRoot":"","sources":["../src/client-pairing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,8EAA8E;AAC9E,MAAM,CAAC,MAAM,UAAU,GAAG,8BAA8B,CAAA;AAExD;8EAC8E;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,6BAA6B,CAAA;AAU5D;;;gEAGgE;AAChE,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAA;IACxE,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC1D,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAA;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAA;AACpC,CAAC;AAED;;8EAE8E;AAC9E,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACpC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAA;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAC1B,IAAI,KAAK,GAAG,GAAG;YAAE,OAAO,KAAK,CAAA;QAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC;IACD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAyC,CAAA;IACxD,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA,CAAC,0BAA0B;IACjE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAA,CAAC,gBAAgB;IACjE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA,CAAC,iBAAiB;IACzD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA,CAAC,gBAAgB;IAClE,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;mEAEmE;AACnE,SAAS,aAAa,CAAC,SAAiB;IACtC,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACtG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAA;IACtD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC/B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACvB,OAAO,CAAC,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,CAAC,CAAA;AACrF,CAAC;AAED;;0EAE0E;AAC1E,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IACvC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAwB,EAAE;QACzD,IAAI,IAAI,KAAK,EAAE;YAAE,OAAO,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,SAAS,CAAA;YACrD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;QAChC,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9D,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACxC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC7C,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IAC3E,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,KAAK,CAAS,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACtE,IAAI,MAAW,CAAA;IACf,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACzC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACxG,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAClH,IAAI,MAAM,CAAC,QAAQ,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,KAAK,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC7F,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;IAC/C,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;AACzC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,MAAM,MAAM,GAAG,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAA+B,CAAC,CAAC,CAAC,EAAE,CAAA;IACrH,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/D,IAAI,SAAS,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACtC,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAA;IAChD,OAAO,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;AACnD,CAAC;AAqBD,6EAA6E;AAC7E,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,IAAa;IACjE,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAC9E,CAAC,CAAC,IAA+B;QACjC,CAAC,CAAC,EAAE,CAAA;IACN,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACpC,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;QAC1D,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK;YACL,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;SAClC,CAAA;IACH,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACxC,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAA;IAC9G,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;IAC1F,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC;YAClG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC;YAClC,CAAC,CAAC,CAAC,CAAA;QACL,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;IACpD,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;AAC1C,CAAC;AAYD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,MAAmB;IAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,aAAa,CAAA;IACjD,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YACjG,CAAC,CAAE,MAAM,CAAC,IAAgC;YAC1C,CAAC,CAAC,SAAS,CAAA;QACb,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YACrH,CAAC,CAAE,IAAI,CAAC,KAAiC;YACzC,CAAC,CAAC,SAAS,CAAA;QACb,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB;YAAE,OAAO,YAAY,CAAA;QACnF,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YACnG,CAAC,CAAE,MAAM,CAAC,IAAgC,CAAC,MAAM;YACjD,CAAC,CAAC,SAAS,CAAA;QACb,IAAI,MAAM,KAAK,YAAY;YAAE,OAAO,YAAY,CAAA;IAClD,CAAC;IACD,OAAO,WAAW,CAAA;AACpB,CAAC"}