dsh-zen-remote 1.1.13 → 1.1.14
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 +3 -2
- package/README.zh-CN.md +3 -2
- package/docs/interface.md +46 -3
- package/lib/client.js +3421 -103
- package/lib/index.js +13 -0
- package/lib/index.js.map +1 -1
- package/lib/share-export.js +347 -0
- package/lib/share-export.js.map +1 -0
- package/lib/types/client/MobileAttachButton.d.ts +8 -1
- package/lib/types/client/MobileAttachButton.d.ts.map +1 -1
- package/lib/types/client/MobileAttachChips.d.ts.map +1 -1
- package/lib/types/client/MobileSessionHeader.d.ts +7 -8
- package/lib/types/client/MobileSessionHeader.d.ts.map +1 -1
- package/lib/types/client/MobileSessionInfo.d.ts.map +1 -1
- package/lib/types/client/effects/keyboard-avoid.d.ts.map +1 -1
- package/lib/types/client/effects/keyboard-guard.d.ts +16 -11
- package/lib/types/client/effects/keyboard-guard.d.ts.map +1 -1
- package/lib/types/client/host-attach.d.ts +38 -0
- package/lib/types/client/host-attach.d.ts.map +1 -0
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/locales.d.ts +23 -0
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/share/fetch-share.d.ts +77 -0
- package/lib/types/client/share/fetch-share.d.ts.map +1 -0
- package/lib/types/client/share/markdown.d.ts +97 -0
- package/lib/types/client/share/markdown.d.ts.map +1 -0
- package/lib/types/client/share/png-stitch.d.ts +96 -0
- package/lib/types/client/share/png-stitch.d.ts.map +1 -0
- package/lib/types/client/share/rasterize.d.ts +317 -0
- package/lib/types/client/share/rasterize.d.ts.map +1 -0
- package/lib/types/client/share/share-card.d.ts +93 -0
- package/lib/types/client/share/share-card.d.ts.map +1 -0
- package/lib/types/client/share/share-constants.d.ts +27 -0
- package/lib/types/client/share/share-constants.d.ts.map +1 -0
- package/lib/types/client/share/share-flow.d.ts +76 -0
- package/lib/types/client/share/share-flow.d.ts.map +1 -0
- package/lib/types/client/share/share-preview.d.ts +11 -0
- package/lib/types/client/share/share-preview.d.ts.map +1 -0
- package/lib/types/client/share/share-sheet.d.ts +17 -0
- package/lib/types/client/share/share-sheet.d.ts.map +1 -0
- package/lib/types/client/share/text-layout.d.ts +48 -0
- package/lib/types/client/share/text-layout.d.ts.map +1 -0
- package/lib/types/client/styles/header.css.d.ts +1 -1
- package/lib/types/client/styles/header.css.d.ts.map +1 -1
- package/lib/types/client/styles/layout.css.d.ts +1 -1
- package/lib/types/client/styles/layout.css.d.ts.map +1 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/share-export.d.ts +66 -0
- package/lib/types/share-export.d.ts.map +1 -0
- package/package.json +7 -2
- package/scripts/check-host-shadow.mjs +41 -9
- package/scripts/check-keyboard-avoid.mjs +4 -2
- package/scripts/check-share-image.mjs +970 -0
- package/scripts/check-upload-endpoint.mjs +10 -3
- package/src/client/MobileAttachButton.tsx +13 -0
- package/src/client/MobileAttachChips.tsx +8 -1
- package/src/client/MobileSessionHeader.tsx +90 -30
- package/src/client/MobileSessionInfo.tsx +234 -1
- package/src/client/effects/keyboard-avoid.ts +14 -7
- package/src/client/effects/keyboard-guard.ts +28 -18
- package/src/client/host-attach.ts +54 -0
- package/src/client/index.tsx +16 -0
- package/src/client/locales.ts +46 -0
- package/src/client/share/fetch-share.ts +161 -0
- package/src/client/share/markdown.ts +609 -0
- package/src/client/share/png-stitch.ts +281 -0
- package/src/client/share/rasterize.ts +1078 -0
- package/src/client/share/share-card.tsx +637 -0
- package/src/client/share/share-constants.ts +30 -0
- package/src/client/share/share-flow.ts +166 -0
- package/src/client/share/share-preview.tsx +337 -0
- package/src/client/share/share-sheet.tsx +222 -0
- package/src/client/share/text-layout.ts +147 -0
- package/src/client/styles/header.css.ts +30 -0
- package/src/client/styles/layout.css.ts +5 -2
- package/src/index.ts +13 -0
- package/src/share-export.ts +431 -0
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.14-5B4CF0?style=flat-square" alt="v1.1.14">
|
|
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
|
|
|
@@ -45,7 +45,7 @@ Edit `~/.dsh/profiles/web/package.json` by hand — one line under `dependencies
|
|
|
45
45
|
```jsonc
|
|
46
46
|
{
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"dsh-zen-remote": "^1.1.
|
|
48
|
+
"dsh-zen-remote": "^1.1.14" // for local development: "link:/path/to/dsh-zen-remote"
|
|
49
49
|
},
|
|
50
50
|
"dsh": { "profile": { "bundles": [
|
|
51
51
|
"@deepseek-ai/dsh-base",
|
|
@@ -268,6 +268,7 @@ The `push_notify` tool. The model should call it when you explicitly asked to be
|
|
|
268
268
|
- Reasoning and tool calls within one turn fold into a single "process · N steps" row by default
|
|
269
269
|
- Gestures: swipe right from the left edge to go back, swipe down to dismiss a bottom sheet. Android's system back gesture is taken over as "close the overlay → back to the list → leave the app", instead of quitting the PWA on the first press
|
|
270
270
|
- Local attachment upload from the phone: files land in the session's working directory under `.dsh-uploads/` and an `@` reference is appended to the composer — sending it is still your call
|
|
271
|
+
- Share image export from the session info card: the whole conversation or the last 3/5/10 turns (counted by real prompts) as ONE long PNG — slices are only an internal render budget and are streamed-stitched into a single file, past the length cap the tail is kept and the omission marked, wide code lines and tables are never cropped sideways, assistant prose renders as a markdown subset, and the file goes through the system share panel with multi-file download as the legacy-browser fallback
|
|
271
272
|
- A pairing code buys a long-lived device token; identity follows the token, not the IP, and can be revoked at any time
|
|
272
273
|
- The admin surface (generate a code / manage devices / trigger a push) only accepts direct local connections; anything through the proxy gets a 403
|
|
273
274
|
- A real PWA: manifest plus service worker, installable to the home screen, opens offline
|
package/README.zh-CN.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.14-5B4CF0?style=flat-square" alt="v1.1.14">
|
|
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
|
|
|
@@ -45,7 +45,7 @@ dsh plugin add dsh-zen-remote
|
|
|
45
45
|
```jsonc
|
|
46
46
|
{
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"dsh-zen-remote": "^1.1.
|
|
48
|
+
"dsh-zen-remote": "^1.1.14" // 本地开发换成 "link:/path/to/dsh-zen-remote"
|
|
49
49
|
},
|
|
50
50
|
"dsh": { "profile": { "bundles": [
|
|
51
51
|
"@deepseek-ai/dsh-base",
|
|
@@ -281,6 +281,7 @@ open http://127.0.0.1:3088/lan-gate/admin
|
|
|
281
281
|
- 同一回合的推理与工具调用默认折叠成一条「过程 · N 步」
|
|
282
282
|
- 手势:左边缘右滑返回、底部 sheet 下滑关闭;安卓系统返回手势接管为「先关弹层 → 退回列表 → 退出应用」,不再一按就退出 PWA
|
|
283
283
|
- 手机本地附件上传:落到会话工作目录 `.dsh-uploads/`,输入框追加 `@` 引用,发不发你说了算
|
|
284
|
+
- 分享图:信息卡一键把会话导出成一张 PNG 长图(全部对话或最近 3/5/10 轮,按真提问计轮),超长内容保尾去头并在首部标注、长代码行/宽表格不横向裁剪、助手正文按 markdown 渲染,走系统分享面板,老浏览器退化为多张下载
|
|
284
285
|
- 配对码换长期设备令牌,认令牌不认 IP,可随时吊销
|
|
285
286
|
- 管理面(生成配对码 / 管理设备 / 触发推送)只认本机直连,经反代一律 403
|
|
286
287
|
- 真 PWA:manifest + service worker,可装到主屏、可离线打开
|
package/docs/interface.md
CHANGED
|
@@ -34,7 +34,9 @@ v1.0.0(fork 自 [mexiaosqwq/dsh-web-mobile](https://github.com/mexiaosqwq/dsh-
|
|
|
34
34
|
|
|
35
35
|
### 会话页头部五件套
|
|
36
36
|
|
|
37
|
-
会话页头部只留五样东西:返回 · 会话名(+ 运行状态点)· 当前视图名(对话/轨迹,带双点指示)· 信息卡入口 ·
|
|
37
|
+
会话页头部只留五样东西:返回 · 会话名(+ 运行状态点)· 当前视图名(对话/轨迹,带双点指示)· 信息卡入口 · 侧栏入口。官方的 Chat/Trajectory 页签视觉隐藏但 DOM 还在,点信息卡里的分段控件相当于代点它。
|
|
38
|
+
|
|
39
|
+
侧栏入口按「现场有哪个侧栏」三态路由(2026-09-11,DSH 0.1.5 长出官方右侧栏之后定的规矩):装了 dsh-better-sidebar 就代点它自己的开关(原设计);没装而宿主有右侧栏(0.1.5+)就代点官方角位的展开钮 / 面板里的收起钮;两者都没有就不渲染。无论哪种,官方角位的 ExpandButton 与 better-sidebar 自己的按钮在手机端都隐藏——头部只有我们这一枚侧栏钮。探测全部锚在稳定 DOM 标记(`[data-dsh-better-sidebar]`、`[data-sidebar-right-panel]` 及两个开合控件的 `data-sidebar-right-*`),不看语言、不看类名散列。
|
|
38
40
|
|
|
39
41
|
### composer 重排
|
|
40
42
|
|
|
@@ -81,8 +83,20 @@ PWA,再进来就是冷启动。插件自己的边缘手势也触发不了—
|
|
|
81
83
|
|
|
82
84
|
composer 最左的回形针打开的是**手机本地**的文件选择器(iOS 上会弹相册/拍照/选取文件三选一)——官方那套文件选择器是在跑 DSH 的电脑上弹窗,手机远程用不了。图片和文件一视同仁:都上传到会话工作目录的 `.dsh-uploads/`,composer 上方出现可删除的预览 chip(图片缩略图、文件图标+文件名),并把 `@.dsh-uploads/文件名` 追加到输入框——发不发、什么时候发,由你按官方发送键决定,不会替你自动发出。
|
|
83
85
|
|
|
86
|
+
**宿主原生附件让位(2026-09-11)**:DSH 0.1.5 起官方工具行自带了一枚回形针(原生附件流,文件落 `~/.dsh/attachments`),手机上于是出现过两枚一样的回形针。现在 `host-attach.ts` 运行时探测官方工具行里自带的 `<input type="file">`(`_tools` 直接子元素、结构性选择器、不依赖语言):探测命中就整组不加载我们的附件 UI(按钮连隐藏 file input、chips 行都不渲染),输入区只留官方一枚;宿主没有(DSH ≤ 0.1.2)则一切照旧。首轮判定走 layout effect,首帧就不会闪出第二枚。
|
|
87
|
+
|
|
84
88
|
安全上的几句话:这个功能给插件的 host 半区新增了一条 HTTP 路由(`POST /_dsh/mobile-nav/upload`),只接受同源请求,文件名清洗后只取叶子名,写入路径校验不允许越出工作目录,单文件默认上限 20MB(可在 profile 里的插件行用 `maxUploadBytes` 调整)。远程访问时,这条路由和其它请求一样在 网关半边的配对墙之后。
|
|
85
89
|
|
|
90
|
+
### 分享图
|
|
91
|
+
|
|
92
|
+
信息卡操作行的第五枚按钮「分享图」把当前会话导出成可保存/转发的 PNG 长图(issue #7:手机上滚动截图拼长图太麻烦)。范围可选「全部对话」或「最近 3/5/10 轮」——后者在服务端裁剪,长会话只传尾部数据;轮次按**真提问**计数(复刻宿主 next-step 收件箱状态机:轮中的插话/授权回复留在轮内、不另起一轮),与 Chat 视图的肉眼轮次一致。
|
|
93
|
+
|
|
94
|
+
生成链路:host 侧新路由 `GET /_dsh/mobile-nav/share-export` 从**完整事件日志**折叠出人类视角的转写(append-origin 折叠:模型可见 surface 在替换落定后会抹掉用户已看过的内容,人类转写不能用;只留人类输入与助手正文,推理/工具调用不进图,图片附件 v1 以占位呈现)→ 手机端离屏渲染一张全内联样式的分享卡(头部条带标题/模型/日期/轮数,用户气泡与助手正文,品牌脚注;主题色读宿主 CSS 变量,深浅色自动跟随)→ 按像素预算分片栅格化后在客户端**流式拼接成一张 PNG 长图**(纯 JS 拼接器 + `CompressionStream`,逐片解码逐行写扫描线,任何时刻不整持整图像素)→ 系统分享面板单文件交付,浏览器不支持拼接时退化为多张分片下载。助手正文按 **markdown 子集**渲染(标题/粗斜体/行内代码/链接/删除线/列表/引用/表格/围栏代码块;自写解析器,未闭合标记回退字面量,不出星号乱码),用户消息保持纯文本。
|
|
95
|
+
|
|
96
|
+
分片与降级:每片物理像素 ≤ 12M(iOS canvas 面积上限 16.7M 留安全余量),像素比 2→1.5→1 按整卡总量逐级降级、拼接模式下全卡统一;仍超过 24 片则**保尾去头**——保留最后 24 片,首片标注「内容过长,已省略前 X 轮」(分享的对象是最近的对话,丢尾与语义相反)。宽内容(长代码行、宽表格)永不横向裁剪:任一片需要时整卡放宽到 ~780px 逻辑宽渲染(所有片同宽,扫描线才能首尾相接),再宽就整体几何缩放输出(图片查看器捏合缩放可复原可读性,完整性优先于字号)。
|
|
97
|
+
|
|
98
|
+
边界:空会话按钮置灰(未知统计时点击后由空数据兜底提示);回合流式中允许生成,语义是「当前进度快照」;组合里没有 sessionQuery 服务的宿主上路由不挂载,客户端显示「需要新版 DSH」。该路由只读、`no-store`,远程访问时在网关半边的配对墙之后。桌面 ≥1024px 无任何变化——信息卡本身就是手机端专属 UI。调试参数 `?mobile-nav-share-preview=1` 在页面顶部渲染分享卡(无会话时用内置 fixture)并可驱动完整导出管线下载 PNG。
|
|
99
|
+
|
|
86
100
|
### 设置页与用量面板打通
|
|
87
101
|
|
|
88
102
|
主屏右上角的设置图标就是官方设置弹窗的入口(近全宽 sheet 皮肤,沿用 v1.0.0 的适配);如果你装了 dsh-usage-stats,它的用量/余额入口会作为一个 chip 出现在主屏 chips 行里,点开即用,不用先钻进设置。
|
|
@@ -117,8 +131,30 @@ composer 最左的回形针打开的是**手机本地**的文件选择器(iOS
|
|
|
117
131
|
|
|
118
132
|
### 未发布
|
|
119
133
|
|
|
134
|
+
**新增**
|
|
135
|
+
|
|
136
|
+
- 分享图(issue #7):信息卡新增「分享图」操作,把会话导出成**一张**可保存/转发的 PNG
|
|
137
|
+
长图——全部对话或最近 3/5/10 轮(服务端裁剪、按真提问计轮,轮中插话不另起一轮);
|
|
138
|
+
分片只是渲染预算的中间产物,导出前流式拼接成单文件(不支持拼接的浏览器退化为多张
|
|
139
|
+
下载);超 24 片保尾去头并在首片标注省略数;长代码行/宽表格永不横向裁剪;助手正文
|
|
140
|
+
按 markdown 子集渲染。手机上滚动截图拼长图太麻烦,这是第一等诉求(见「分享图」一节)。
|
|
141
|
+
|
|
120
142
|
**修复**
|
|
121
143
|
|
|
144
|
+
- 适配 DSH `0.1.5`(0.1.2 → 0.1.5-rc.2 的一批回归,2026-09-11 真机报告、逐项实测):
|
|
145
|
+
- 官方工具行新增了原生附件回形针,手机端一度出现两枚——现在运行时探测宿主
|
|
146
|
+
自带的 `<input type="file">`,命中即整组让位(见「附件上传」一节),不命中
|
|
147
|
+
照旧加载;
|
|
148
|
+
- 官方右侧栏的 ExpandButton 落在**新的** `conversation.session.header.corner`
|
|
149
|
+
槽里,逃过了头部两条 blanket hide,顶到右上角——已隐藏(隐藏它的选择器
|
|
150
|
+
必须 ≥(0,3,1):老的 utilities 反隐藏规则在 0.1.5 下恰好命中这个 `:last-child`
|
|
151
|
+
角位,轻量级 hide 会被它的 `flex !important` 压掉,实测两次才定位),
|
|
152
|
+
头部侧栏钮改为三态路由(见「会话页头部五件套」);
|
|
153
|
+
- composer 从 `<textarea>` 换成 Lexical contenteditable(`[data-composer-input]`),
|
|
154
|
+
S9 键盘守卫与 S10 的聚焦探针只认 TEXTAREA、全体失明——点官方附件钮的
|
|
155
|
+
`keepFocus` 强制聚焦会直接弹键盘并把输入框顶上去,开 会话自动聚焦也复发。
|
|
156
|
+
两个 effect 的识别同步扩到 contenteditable,实测:附件钮的强制聚焦被糊掉、
|
|
157
|
+
用户直接点输入框的聚焦保留。
|
|
122
158
|
- composer 行里第三方插件的入口(`conversation.input.right`)在手机端整体移进模型弹层,
|
|
123
159
|
与「模型」「推理等级」并列成行——行是不换行的,模型名是唯一能让宽度的东西,
|
|
124
160
|
订阅插件的速度 chip(带文字约 70px)加上识图开关会把它挤没(2026-09-06 用户报)
|
|
@@ -136,6 +172,13 @@ composer 最左的回形针打开的是**手机本地**的文件选择器(iOS
|
|
|
136
172
|
选择器统一改为按 header 定位、按 ARIA(`aria-haspopup="tree"`)区分,不再依赖
|
|
137
173
|
槽名与根节点类名。
|
|
138
174
|
|
|
175
|
+
**内部**
|
|
176
|
+
|
|
177
|
+
- 测试从 133 增至 151:新增 share-export 路由集成测试(折叠全规则、range=last 切片、
|
|
178
|
+
next-step 收件箱编排、折叠阶段抛错的护栏)与 `check-share-image.mjs` 纯函数自检;
|
|
179
|
+
share-card 与 rasterize 改为共用 `src/client/share/share-constants.ts` 模板常量,
|
|
180
|
+
检查脚本对模板字面量的正则锁随之退役为对常量模块的直接断言。
|
|
181
|
+
|
|
139
182
|
### 1.1.0
|
|
140
183
|
|
|
141
184
|
**新增**
|
|
@@ -272,8 +315,8 @@ pnpm build # 产物 lib/ 与源码同步入库,改动源码后重新构建再
|
|
|
272
315
|
## 验证
|
|
273
316
|
|
|
274
317
|
- `pnpm verify` 类型检查、`pnpm test` 全量测试;`dsh --profile web --dump-config` 应出现插件层;
|
|
275
|
-
- 自检脚本:`node scripts/check-sunk-viewport.mjs`、`node scripts/check-attach-upload.mjs`、`node scripts/check-upload-endpoint.mjs`(需 Node ≥ 23.6);
|
|
276
|
-
- 移动端(390px):启动落会话列表、进出会话页转场、composer 权限/模型 sheet
|
|
318
|
+
- 自检脚本:`node scripts/check-sunk-viewport.mjs`、`node scripts/check-attach-upload.mjs`、`node scripts/check-upload-endpoint.mjs`、`node scripts/check-share-image.mjs`(需 Node ≥ 23.6);
|
|
319
|
+
- 移动端(390px):启动落会话列表、进出会话页转场、composer 权限/模型 sheet、信息卡统计与五个操作(导出/重命名/Fork/归档/分享图)、附件上传;
|
|
277
320
|
- 平板(768px):抽屉 + 限宽居中,与 v1.0.0 一致;
|
|
278
321
|
- 桌面端(≥1024px):与未安装时一致。
|
|
279
322
|
|