dsh-mobile-web 0.1.3 → 0.1.4

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
@@ -1,65 +1,138 @@
1
- # dsh-mobile · 掌上 dsh
1
+ <div align="center">
2
2
 
3
- **把 dsh 的会话搬到手机上**:一个 dsh 插件,在宿主上起一个手机端 Web 界面 + `/m/api` RPC 通道,手机浏览器打开就能配对、浏览工作区/会话、实时聊天、审批与提问、切换模型、收发图片,并可安装为 PWA。
3
+ <img src="https://raw.githubusercontent.com/2333someone/dsh-mobile/main/assets/icon-512.png" width="104" alt="dsh-mobile" />
4
4
 
5
- English summary: a mobile web surface for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) — pairing by code, workspace/session browsing, streaming chat (SSE), approvals, model switching, images, PWA. Host half lives in `index.js`; the phone UI is built from the vendored dsh-palm v1.6.0 fork under `mobile-src/`.
5
+ # 掌上 dsh · dsh-mobile
6
6
 
7
- ![手机端配对页](docs/pairing.png)
7
+ **把 DeepSeek Harness 的会话装进手机浏览器。**
8
+ 配对即用:流式对话、工具过程、审批与提问、文件上传、模型切换,全部随身。
8
9
 
9
- ## 能力
10
+ [![npm](https://img.shields.io/npm/v/dsh-mobile-web?color=6D6AFF&label=npm&logo=npm)](https://www.npmjs.com/package/dsh-mobile-web)
11
+ [![dsh](https://img.shields.io/badge/dsh-%E2%89%A5%200.2.0--rc.1-6D6AFF)](https://github.com/deepseek-ai/deepseek-harness)
12
+ [![node](https://img.shields.io/badge/node-%E2%89%A5%2020-339933?logo=node.js&logoColor=white)](package.json)
13
+ [![license](https://img.shields.io/badge/license-MIT%20%2B%20Apache--2.0-blue)](LICENSE)
10
14
 
11
- - **6 位码 / 配对链接**:桌面 dsh 设置页「掌上 dsh」出码,手机 `/m/` 输码,服务端下发 HttpOnly 设备 cookie(设备可在桌面端撤销)。
15
+ [快速开始](#快速开始) · [特色](#特色) · [截图](#截图) · [配置](#配置) · [架构](#架构)
16
+
17
+ </div>
18
+
19
+ ---
20
+
21
+ <table>
22
+ <tr>
23
+ <td width="33%" align="center"><img src="https://raw.githubusercontent.com/2333someone/dsh-mobile/main/docs/screenshots/03-chat.png" alt="聊天" /><br /><b>实时流式对话</b><br /><sub>思考过程、工具调用、Markdown 一屏到底</sub></td>
24
+ <td width="33%" align="center"><img src="https://raw.githubusercontent.com/2333someone/dsh-mobile/main/docs/screenshots/02-sessions.png" alt="会话" /><br /><b>会话一览</b><br /><sub>按天分组、轮次统计、运行中高亮</sub></td>
25
+ <td width="33%" align="center"><img src="https://raw.githubusercontent.com/2333someone/dsh-mobile/main/docs/screenshots/06-settings.png" alt="设置" /><br /><sub><b>本机 / 同步桌面 / 桌面端</b><br />每一行都标明改动落在哪一层</sub></td>
26
+ </tr>
27
+ </table>
28
+
29
+ ## 特色
30
+
31
+ <table>
32
+ <tr>
33
+ <td width="50%" valign="top">
34
+
35
+ **🎛 和桌面同一份上下文**
36
+ 手机上看到的就是桌面那个会话:同一串消息、同一份工具输出、同一个模型。接着聊,不用复制粘贴。
37
+
38
+ **🧠 过程是可见的**
39
+ 思考折叠卡、工具调用卡、子任务卡、轮次尾卡都会出现在消息流里,可展开看细节;跑完显示「已完成 · 用时 N 秒」。
40
+
41
+ **📎 附件真的能用**
42
+ 发图、发文件(`.docx`/`.xlsx`/`.pptx`/`.zip`/`.txt` 都行);已上传文件以胶囊显示在待发送区,发送时把工作区路径交给模型,直接就能读。
43
+
44
+ </td>
45
+ <td width="50%" valign="top">
46
+
47
+ **✅ 审批与提问**
48
+ 宿主弹出的审批、`ask_user_question` 都能在手机上应答;错过也没关系,重进会话会自动补发卡片。
49
+
50
+ **📱 PWA 常驻**
51
+ 添加到主屏幕,像 App 一样打开;带离线条、更新检查与浏览器通知。
52
+
53
+ **🔌 零改造接入**
54
+ 不改 dsh 本体、不改桌面 UI。宿主半是一个普通插件,手机 UI 是打包好的静态资源。
55
+
56
+ </td>
57
+ </tr>
58
+ </table>
59
+
60
+ <table>
61
+ <tr>
62
+ <td width="33%" align="center"><img src="https://raw.githubusercontent.com/2333someone/dsh-mobile/main/docs/screenshots/01-workspaces.png" alt="工作区" /><br /><sub><b>工作区</b> · 固定 / 最近 / 运行中</sub></td>
63
+ <td width="33%" align="center"><img src="https://raw.githubusercontent.com/2333someone/dsh-mobile/main/docs/screenshots/04-attachments.png" alt="附件" /><br /><sub><b>待发送附件</b> · 图片与文件</sub></td>
64
+ <td width="33%" align="center"><img src="https://raw.githubusercontent.com/2333someone/dsh-mobile/main/docs/screenshots/05-markdown.png" alt="长文" /><br /><sub><b>长文正文</b> · 流式输出</sub></td>
65
+ </tr>
66
+ </table>
67
+
68
+ ## 快速开始
69
+
70
+ **1. 装插件**(二选一)
71
+
72
+ ```bash
73
+ # 按名字从 npm 装
74
+ dsh plugin add dsh-mobile-web
75
+
76
+ # 或者本地开发装:把仓库根目录作为 bundle
77
+ dsh plugin add /path/to/dsh-mobile
78
+ ```
79
+
80
+ **2. 桌面 dsh:设置 → 掌上 dsh,出二维码**
81
+
82
+ **3. 手机浏览器打开**
83
+
84
+ ```
85
+ http://<主机IP>:19387/m/ # 局域网直连
86
+ https://your-host.example.com:45632/m/ # 公网(HTTPS 反代)
87
+ ```
88
+
89
+ 手机扫桌面那张二维码即可自动配对(面板里同时给了「复制链接」,不方便扫码时把链接发到手机粘贴也行)。
90
+ 配对后设备 cookie 长期有效,桌面端可随时撤销设备。
91
+
92
+ > 公网访问请务必套 HTTPS 反代,不要把 `19387` 明文端口直接暴露到公网。详见 [SECURITY.md](SECURITY.md)。
93
+
94
+ ## 能力一览
95
+
96
+ - **扫码配对**:桌面设置面板出二维码,手机扫一下就完成配对;扫不了码时可复制面板里的配对链接粘贴。服务端下发 HttpOnly 设备 cookie,可在桌面端随时撤销设备。
12
97
  - **完整手机聊天界面**:会话列表、流式回复(SSE `/m/api/events.mux`)、推理块、工具卡、Markdown/代码块、消息队列、引用、重新生成、搜索。
13
- - **工作区与会话**:浏览 / 新建 / 重命名 / 归档;运行中会话徽标;「最近访问 / 固定 / 运行中」快捷入口。
98
+ - **工作区与会话**:浏览 / 新建 / 重命名 / 归档;运行中徽标;「最近访问 / 固定 / 运行中」快捷入口;会话清理(归档 / 本地隐藏 / 彻底删除 / 回收站)。
14
99
  - **审批与提问**:`mobile.pending` / `mobile.respond`;进入会话自动补发待处理卡片,工作区与会话行有橙条提示。
15
- - **模型**:查看模型目录、切换会话模型与思考强度;默认模型与第三方 provider 在桌面端配置。
16
- - **附件与图片**:相册/拍照上传、聊天图片限高、点击全屏预览;只读截图路由 `/m/shot/<file>` 便于手机直接看主机截图。
17
- - **命令面板**:`/` 面板合并宿主命令、本机动作(文件/模型)与宿主技能目录,中文标题与说明;选中即插入输入框,由宿主的命令通道执行。
100
+ - **附件**:相册/拍照、文件上传(24 MB 上限,落到会话工作区 `.dsh-uploads/`);文件卡片可预览文本、下载原文。
101
+ - **模型与权限**:查看模型目录、切换会话模型与思考强度;权限预设从工具栏盾牌切换。
102
+ - **命令面板**:`/` 面板合并宿主命令、本机动作与技能目录,中文标题与说明;选中即插入输入框,由宿主命令通道执行。
18
103
  - **通知**:浏览器通知 + 推送渠道(WxPusher / Server酱 / Bark / Telegram / PushPlus)+ 可选 Web Push。
19
104
  - **语音转写**:可配置 OpenAI 兼容的转写服务(按序回退)。
20
- - **设置**:外观/对话等本机项 + 主机配置只读/可写项,逐项标注「本机 / 同步桌面 / 桌面端」。
105
+ - **设置**:外观 / 对话等本机项 + 主机配置只读/可写项,逐项标注「本机 / 同步桌面 / 桌面端」。
21
106
  - **PWA**:可添加到主屏幕,离线壳与更新检查。
22
107
 
23
108
  ## 前置条件
24
109
 
25
- - dsh **>= 0.2.0-rc.1**(见 `package.json` 的 `dsh.engines.dsh`)
26
- - **Node.js >= 20**(插件宿主与 `mobile-src` 构建)
110
+ - dsh **≥ 0.2.0-rc.1**(见 `package.json` 的 `dsh.engines.dsh`)
111
+ - **Node.js ≥ 20**(插件宿主与 `mobile-src` 构建)
27
112
  - 手机端浏览器:Chrome / 夸克等 Chromium 内核;HTTPS 环境下 Web Push、剪贴板等能力才可用
28
113
 
29
- ## 安装
114
+ ## 配置
30
115
 
31
- 在桌面 dsh 的插件管理器里把本目录作为本地 bundle 安装(`plugin_manager install_bundle` 指向本仓库根目录或打包出的 `.tgz`),或把本仓库放进 profile 的插件目录后手动加一条 patch:
116
+ 在 profile 的 `cordis.patch.yml` 里加一条:
32
117
 
33
118
  ```yaml
34
119
  - insert:
35
120
  - id: dsh-mobile
36
- name: 'dsh-mobile'
121
+ name: 'dsh-mobile-web'
37
122
  config:
38
123
  enabled: true
39
124
  mobilePort: 19387
40
125
  mobileHost: '0.0.0.0'
41
- pairCode: '' # 留空 = 随机 6 位码(5 分钟过期);固定码则永不过期
126
+ pairCode: '' # 留空 = 随机 6 位码(5 分钟过期)
42
127
  publicBaseUrl: 'https://your-host.example.com:45632' # 仅用于展示,可留空
43
128
  ```
44
129
 
45
- 安装后刷新一次 dsh 页面以加载客户端设置段。
46
-
47
- ## 快速开始
48
-
49
- 1. 桌面 dsh:**设置 → 掌上 dsh → 生成配对码**。
50
- 2. 手机:打开 `http://<主机IP>:19387/m/`(或公网 `https://your-host.example.com:45632/m/`),输入配对码。
51
- 3. 配对后即可进入工作区/会话;聊天页输入框上方工具行有 `+`、模型、命令(`/`)、权限、审批、子代理等入口。
52
-
53
- 公网访问:本插件监听 `0.0.0.0:<mobilePort>`,前面套一层 HTTPS 反代即可(示例:`https://your-host.example.com:45632` → `192.168.1.10:19387`)。反代必须用 HTTPS,且不要把 19387 的明文端口直接暴露到公网。
54
-
55
- ## 配置
56
-
57
130
  | 字段 | 默认 | 说明 |
58
131
  |---|---|---|
59
132
  | `enabled` | `true` | 关闭后不挂载任何路由 |
60
133
  | `mobilePort` | `19387` | 手机监听端口(独立于 GUI 的动态端口) |
61
134
  | `mobileHost` | `0.0.0.0` | 监听地址;只在本机用可改 `127.0.0.1` |
62
- | `pairCode` | 示例配 `''`(随机 6 位、5 分钟过期) | 留空 = 随机码;填固定值则该码**永不过期**(代码内回退值 `123456` 仅供开发,公开部署不要用固定码) |
135
+ | `pairCode` | `''`(随机 6 位、5 分钟过期) | 留空 = 随机码;填固定值则该码**永不过期**(代码内回退值 `123456` 仅供开发,公开部署不要用固定码) |
63
136
  | `publicBaseUrl` | 空 | 设置面板展示的公网地址,仅展示用途,**留空也不影响运行** |
64
137
  | `devicesFile` | `~/.dsh/dsh-mobile-devices.json` | 已配对设备与 token 的存储位置 |
65
138
  | `pushConfigFile` | `~/.dsh/dsh-mobile-push.json` | 推送渠道配置 |
@@ -69,17 +142,17 @@ English summary: a mobile web surface for [DeepSeek Harness](https://github.com/
69
142
 
70
143
  ```
71
144
  手机浏览器 / PWA
72
- │ GET /m/ (HTML + 31 段注入脚本 + theme.css)
73
- │ POST /m/api/<method> (63 个 RPC:session/workspace/pair/mobile/…)
74
- │ GET /m/api/events.mux (SSE)
75
- ▼
145
+ │ GET /m/ (HTML + 注入脚本 + theme.css)
146
+ │ POST /m/api/<method> (63 个 RPC:session/workspace/pair/mobile/…)
147
+ │ GET /m/api/events.mux (SSE)
148
+ ▼
76
149
  index.js(宿主半)
77
- ├─ 双 HTTP 面:GUI webServer(回环,设置面板)+ 0.0.0.0:<port>(手机/局域网/公网)
78
- ├─ 配对与设备 cookie、审批/提问应答、通知、用量、插件/自动化页数据、命令与技能目录
79
- └─ 注入脚本(31 段):在不改 bundle 的前提下补齐工具栏、命令面板、设置范围标签、图片预览等
80
- ▼
81
- assets/mobile.bundle.js ←由 mobile-src/ 构建(dsh-palm v1.6.0 fork,见 mobile-src/UPSTREAM.md)
82
- assets/theme.css ←本仓库自己的样式(实时读盘,改完刷新生效)
150
+ ├─ 双 HTTP 面:GUI webServer(回环,设置面板)+ 0.0.0.0:<port>(手机/局域网/公网)
151
+ ├─ 配对与设备 cookie、审批/提问应答、通知、用量、插件/自动化页数据、命令与技能目录
152
+ └─ 注入脚本:在不改 bundle 的前提下补齐工具栏、命令面板、设置范围标签、图片预览等
153
+ ▼
154
+ assets/mobile.bundle.js ← 由 mobile-src/ 构建(dsh-palm v1.6.0 fork,见 mobile-src/UPSTREAM.md)
155
+ assets/theme.css ← 本仓库自己的样式(实时读盘,改完刷新生效)
83
156
  ```
84
157
 
85
158
  手机 UI 复用 [dsh-palm](https://github.com/Eternalloveone/dsh-palm) v1.6.0 的 React bundle(源码已 vendor 到 `mobile-src/`,Apache-2.0);宿主侧 RPC 由本插件按 dsh 原生服务重新实现,而不是沿用 dsh-palm 的 host。
@@ -90,7 +163,7 @@ assets/theme.css ←本仓库自己的样式(实时读盘,改完刷
90
163
  # 1) 构建手机 bundle(源码在 mobile-src/,产物写到 assets/)
91
164
  cd mobile-src
92
165
  npm ci
93
- node build.mjs # 或 npm run build;实测 npm ci ~1.2s、构建 65–80ms,产物 sha256 可复现
166
+ npm run build # 实测 npm ci ~1.2s、构建 65–80ms,产物 sha256 可复现
94
167
 
95
168
  # 2) 检查宿主半语法
96
169
  node --check index.js
@@ -100,15 +173,15 @@ curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:19387/m/
100
173
  ```
101
174
 
102
175
  - `assets/theme.css` 每次请求实时读盘:改完刷新手机页面即生效,无需重启 dsh。
103
- - `index.js` 由 dsh 进程加载,保存后不会自动重载;开发时可临时在 profile 的 `cordis.patch.yml` 末尾加一行注释触发 reconcile(随后还原),或重启 dsh。
176
+ - `index.js` / `src/host/**` 由 dsh 进程加载,保存后不会自动重载;开发时可临时在 profile 的 `cordis.patch.yml` 末尾加一行注释触发 reconcile(随后还原),或重启 dsh。
104
177
 
105
178
  **改动归属(避免误归因)**
106
179
 
107
180
  - `mobile-src/` 相对 dsh-palm v1.6.0 只改了两处,已回源到源码并记录在 [`mobile-src/UPSTREAM.md`](mobile-src/UPSTREAM.md):
108
181
  1. 设置 → 外观新增「发送模式」行(读写宿主 `window.__dmSendMode`);
109
182
  2. 用量卡片的「账户余额」文案改为「充值余额」。
110
- - 「关于 / 反馈」文案、网页搜索 artwork 等属于 `index.js` 的 **DOM 补丁**(注入脚本),不是 bundle 源码改动。
111
- - 其它手机端增强(命令面板、图片预览、设置范围标签、插件/自动化页等)全部在 `index.js` / `assets/theme.css` 中实现,未改 bundle 逻辑。
183
+ - 「关于 / 反馈」文案、网页搜索 artwork 等属于 `src/host/**` 的 DOM 补丁(注入脚本),不是 bundle 源码改动。
184
+ - 其它手机端增强(命令面板、图片预览、设置范围标签、插件/自动化页等)全部在 `src/host/**` / `assets/theme.css` 中实现。
112
185
 
113
186
  ## 已知限制
114
187
 
@@ -134,21 +207,14 @@ curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:19387/m/
134
207
 
135
208
  ## 致谢
136
209
 
137
- 这个项目站在别人肩膀上,特别感谢:
210
+ 这个项目站在别人肩膀上:
138
211
 
139
- - **[dsh-palm](https://github.com/Eternalloveone/dsh-palm)**(© Eternalloveone,Apache-2.0)——
140
- 手机端 UI 直接来自它的 v1.6.0:React 界面、消息渲染、输入框、代码块、设置页等。
141
- 我们把它 vendor 到 `mobile-src/` 后做了本地修改(清单见
142
- [`mobile-src/UPSTREAM.md`](mobile-src/UPSTREAM.md)),并按 Apache-2.0 保留版权与许可声明。
143
- - **[dsh-remote-web-ui](https://github.com/zhu1090093659/dsh-web)**(`@linxin666/dsh-remote-web-ui`,
144
- © zhu1090093659,Apache-2.0)——dsh-palm 的移动端同样源自它,归因链见 [NOTICE](NOTICE)。
145
- - **[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)**(Apache-2.0)——
146
- 宿主平台与 `@deepseek-ai/dsh-*` 服务;本插件的宿主侧 RPC 按 dsh 原生服务重新实现。
212
+ - **[dsh-palm](https://github.com/Eternalloveone/dsh-palm)**(© Eternalloveone,Apache-2.0)—— 手机端 UI 直接来自它的 v1.6.0;我们 vendor 到 `mobile-src/` 后做了本地修改(清单见 [`mobile-src/UPSTREAM.md`](mobile-src/UPSTREAM.md))。
213
+ - **[dsh-remote-web-ui](https://github.com/zhu1090093659/dsh-web)**(`@linxin666/dsh-remote-web-ui`,© zhu1090093659,Apache-2.0)—— dsh-palm 的移动端同样源自它,归因链见 [NOTICE](NOTICE)。
214
+ - **[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)**(Apache-2.0)—— 宿主平台与 `@deepseek-ai/dsh-*` 服务。
147
215
 
148
- 如果你是从本仓库再分叉:请保留 [NOTICE](NOTICE)、[LICENSE-APACHE](LICENSE-APACHE) 与
149
- [`mobile-src/UPSTREAM.md`](mobile-src/UPSTREAM.md),这是 Apache-2.0 对派生作品的要求
150
- (保留版权声明、附带许可证副本、标注修改过的文件)。
216
+ 如果你是从本仓库再分叉:请保留 [NOTICE](NOTICE)、[LICENSE-APACHE](LICENSE-APACHE) 与 [`mobile-src/UPSTREAM.md`](mobile-src/UPSTREAM.md),这是 Apache-2.0 对派生作品的要求(保留版权声明、附带许可证副本、标注修改过的文件)。
151
217
 
152
218
  ## 安全
153
219
 
154
- 公开部署前请阅读 [SECURITY.md](SECURITY.md):必须 HTTPS 反代、设备 cookie 等同登录态、`/m/shot/` 匿名可读、默认配对码务必修改。
220
+ 公开部署前请阅读 [SECURITY.md](SECURITY.md):必须 HTTPS 反代、设备 cookie 等同登录态、`/m/shot/` 匿名可读、固定配对码(如果你的配置里设了)务必改掉。
Binary file
Binary file
Binary file
package/assets/icon.svg CHANGED
@@ -1,13 +1,5 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
2
- <defs>
3
- <linearGradient id="dshm-bg" x1="0" y1="0" x2="1" y2="1">
4
- <stop offset="0" stop-color="#4D6BFE"/>
5
- <stop offset="1" stop-color="#7B9BFF"/>
6
- </linearGradient>
7
- </defs>
8
- <rect width="64" height="64" rx="15" fill="url(#dshm-bg)"/>
9
- <!-- DeepSeek-style spark, the shared brand mark -->
10
- <path d="M32 12 L36 28 L52 32 L36 36 L32 52 L28 36 L12 32 L28 28 Z" fill="#ffffff"/>
11
- <!-- phone handset hint: a small rounded screen notch under the spark -->
12
- <rect x="23" y="40" width="18" height="4" rx="2" fill="#ffffff" opacity="0.85"/>
2
+ <rect width="64" height="64" rx="14.25" fill="#ffffff"/>
3
+ <rect x="0.1" y="0.1" width="63.8" height="63.8" rx="14.2" fill="none" stroke="#000000" stroke-opacity="0.06" stroke-width="0.2"/>
4
+ <image x="8.969" y="15.031" width="46.062" height="33.938" href="data:image/png;base64,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"/>
13
5
  </svg>
@@ -944,7 +944,7 @@ ${u}`:P,q=dN(R+k,Nt);Po(e.sessionId,q).then(()=>{H(!1),_(""),Bo(e.sessionId),Kn(
944
944
  try { history.replaceState(null, '', location.pathname + location.search); } catch (e) {}
945
945
  }
946
946
  })();
947
- <\/script>`;function Hv(e){if(typeof window>"u")return;let t=window.__dmOpenHostPage;typeof t=="function"&&t(e)}var Ut=$(oe(),1),zv=20,z7="0 0 24 24",r6=1.5,B7=17.5,i6=B7*24/zv,o6={gear:23.5,pagePlugins:22.5,pageAutomations:19.5};function s6({children:e}){return(0,Ut.jsx)("svg",{width:zv,height:zv,viewBox:z7,fill:"none",stroke:"currentColor",strokeWidth:r6,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",children:e})}function l6({scale:e,children:t}){return(0,Ut.jsx)("g",{transform:`translate(12 12) scale(${e}) translate(-12 -12)`,children:t})}function d6(e){return r6/e}function U7(){let e=i6/o6.gear;return(0,Ut.jsx)(s6,{children:(0,Ut.jsx)(l6,{scale:e,children:(0,Ut.jsxs)("g",{strokeWidth:d6(e),children:[(0,Ut.jsx)("circle",{cx:"12",cy:"12",r:"3"}),(0,Ut.jsx)("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z"})]})})})}function a6({name:e}){let t=Jf(e),n=24/t.size,a=i6/o6[e];return(0,Ut.jsx)(s6,{children:(0,Ut.jsx)(l6,{scale:a,children:(0,Ut.jsx)("g",{transform:`scale(${n})`,strokeWidth:d6(a*n),children:(0,Ut.jsx)("g",{dangerouslySetInnerHTML:{__html:t.inner}})})})})}function c6({onOpenSettings:e}){return(0,Ut.jsxs)("div",{className:"dm-header-action-group",children:[(0,Ut.jsx)("button",{type:"button",className:"mobile-iconbtn","aria-label":"设置",title:"设置",onClick:()=>{e?.()},children:(0,Ut.jsx)(U7,{})}),(0,Ut.jsx)("button",{type:"button",className:"mobile-iconbtn","aria-label":"插件",title:"插件",onClick:()=>{Hv("plugins")},children:(0,Ut.jsx)(a6,{name:"pagePlugins"})}),(0,Ut.jsx)("button",{type:"button",className:"mobile-iconbtn","aria-label":"自动化",title:"自动化",onClick:()=>{Hv("automations")},children:(0,Ut.jsx)(a6,{name:"pageAutomations"})})]})}var M=$(oe(),1),u6,b6="dsh.palm.pinnedWorkspaces",Uv="dsh.palm.recentWorkspaces",f6="dsh.palm.recentWorkspace",p6="dsh.palm.welcomeSeen",j7=5,V7=3;function F7(){try{let e=localStorage.getItem(b6),t=e===null?[]:JSON.parse(e);return Array.isArray(t)?t.filter(n=>typeof n=="string"):[]}catch{return[]}}function G7(e){try{localStorage.setItem(b6,JSON.stringify(e))}catch{}}function Lp(e){let t=[];for(let n of e)if(!t.includes(n)&&(t.push(n),t.length>=j7))break;return t}function K7(){try{let e=localStorage.getItem(Uv);if(e!==null){let t=JSON.parse(e);if(Array.isArray(t))return Lp(t.filter(n=>typeof n=="string"))}}catch{}try{let e=localStorage.getItem(f6);if(e!==null&&e!==""){let t=Lp([e]);return localStorage.setItem(Uv,JSON.stringify(t)),localStorage.removeItem(f6),t}}catch{}return[]}function v6(e){let t=Lp(e);try{localStorage.setItem(Uv,JSON.stringify(t))}catch{}}function Y7(e,t){let n=Lp([t,...e.filter(a=>a!==t)]);return v6(n),n}function m6(e,t){let n=e.filter(a=>a!==t);return v6(n),n}var y6="dsh.palm.workspaceKinds";function X7(){try{let e=localStorage.getItem(y6),t=e===null?{}:JSON.parse(e);if(t===null||typeof t!="object"||Array.isArray(t))return{};let n={};for(let[a,r]of Object.entries(t))(r==="code"||r==="test")&&(n[a]=r);return n}catch{return{}}}var x6="dsh.palm.workspaceCategories",w6="dsh.palm.workspaceCategoryMap";function Q7(){try{let e=localStorage.getItem(x6),t=e===null?[]:JSON.parse(e);return Array.isArray(t)?t.filter(n=>n!==null&&typeof n=="object"&&typeof n.id=="string"&&typeof n.name=="string"&&n.name.trim()!=="").map(n=>({id:n.id,name:n.name.trim()})):[]}catch{return[]}}function _p(e){try{localStorage.setItem(x6,JSON.stringify(e))}catch{}}function W7(){try{let e=localStorage.getItem(w6),t=e===null?{}:JSON.parse(e);if(t===null||typeof t!="object"||Array.isArray(t))return{};let n={};for(let[a,r]of Object.entries(t))typeof r=="string"&&(n[a]=r);return n}catch{return{}}}function Bv(e){try{localStorage.setItem(w6,JSON.stringify(e))}catch{}}function $7(e,t,n){let a=n===void 0?void 0:n[e.workspaceId];return a==="code"||a==="test"?a:t.slice(0,V7).includes(e.workspaceId)?"active":/\b(test|tests|testing|spec|specs|benchmark|e2e)\b/i.test(e.path.replace(/[\\/]+/g," "))||/\b(test|tests|testing|spec|specs|benchmark|e2e)\b/i.test(e.title)?"test":(e.sessionIds??[]).length===0?"plain":"code"}var h6={active:"活跃项目",code:"代码项目",test:"测试项目",plain:"其他"},Z7={active:"ws-icon-active",code:"ws-icon-code",test:"ws-icon-test",plain:"ws-icon-plain"},g6=[{kind:"active",placeholder:null},{kind:"code",placeholder:"暂无代码项目"},{kind:"test",placeholder:"暂无测试项目"},{kind:"plain",placeholder:null}];function J7({onCancel:e,onPick:t,initialCategory:n}){let[a,r]=(0,ie.useState)(void 0),[i,o]=(0,ie.useState)(void 0),[s,l]=(0,ie.useState)(!1),[d,c]=(0,ie.useState)(void 0),[v,m]=(0,ie.useState)(0),[g,w]=(0,ie.useState)(!1),[x,C]=(0,ie.useState)(!1),[h,f]=(0,ie.useState)(void 0),[b,y]=(0,ie.useState)([]),[N,P]=(0,ie.useState)(!1);(0,ie.useEffect)(()=>{let E=!0;return TS().then(H=>{E&&y(H.roots)},()=>{}),()=>{E=!1}},[]),(0,ie.useEffect)(()=>{let E=!1;return o(void 0),r(void 0),kS(d).then(H=>{E||r(H)},H=>{E||o(he(H))}),()=>{E=!0}},[d,v]);let _=async E=>{if(!(a===void 0||x)){C(!0),f(void 0);try{let H=await NS(a.path,E);w(!1),c(H.path)}catch(H){f(he(H))}finally{C(!1)}}},L=async()=>{if(!(a===void 0||s)){l(!0),o(void 0);try{let E=await SS(a.path);t(E.workspace,n)}catch(E){l(!1),o(he(E))}}};return(0,M.jsxs)("div",{className:"mobile dir-browser",children:[(0,M.jsxs)("header",{className:"mobile-header",children:[(0,M.jsx)("div",{className:"mobile-headerSlot",children:(0,M.jsx)("button",{type:"button",className:"mobile-headerAction",onClick:e,children:"返回"})}),(0,M.jsx)("h1",{className:"mobile-title",children:"选择目录"}),(0,M.jsx)("div",{className:"mobile-headerSlot mobile-headerSlot-right"})]}),b.length>0&&(0,M.jsxs)("div",{className:"dir-drives",role:"toolbar","aria-label":"盘符",children:[b.map(E=>{let H=a!==void 0&&a.path.toUpperCase().startsWith(E.path.toUpperCase());return(0,M.jsx)("button",{type:"button",className:"dir-drive"+(H?" dir-drive-on":""),onClick:()=>{c(E.path)},children:E.name},E.path)}),(0,M.jsx)("button",{type:"button",className:"dir-drive dir-drive-jump",onClick:()=>{P(!0)},children:"跳转…"})]}),a!==void 0&&(0,M.jsx)("div",{className:"dir-crumbs",children:a.crumbs.map((E,H)=>(0,M.jsxs)("span",{children:[(0,M.jsx)("button",{type:"button",className:"dir-crumb",onClick:()=>c(E.path),children:E.name||"/"}),H<a.crumbs.length-1&&(0,M.jsx)("span",{className:"dir-crumb-separator",children:"/"})]},E.path))}),i!==void 0?(0,M.jsxs)("div",{className:"mobile-empty",children:[(0,M.jsx)("p",{className:"mobile-error",children:i}),(0,M.jsx)("button",{type:"button",className:"mobile-button",onClick:()=>m(E=>E+1),children:"重试"})]}):a===void 0?(0,M.jsx)("div",{className:"mobile-empty",children:(0,M.jsx)("p",{className:"mobile-muted",children:"加载中…"})}):(0,M.jsx)("ul",{className:"mobile-list",children:a.entries.length===0?(0,M.jsx)("div",{className:"mobile-empty dir-empty",children:(0,M.jsx)("p",{className:"mobile-muted",children:"空目录"})}):a.entries.map(E=>(0,M.jsx)("li",{children:(0,M.jsxs)("button",{type:"button",className:`mobile-row dir-entry ${E.hidden?"dir-entry-hidden":""}`,onClick:()=>c(E.path),children:[(0,M.jsx)("span",{className:"mobile-rowMain",children:(0,M.jsx)("span",{className:"mobile-rowTitle",children:E.name})}),(0,M.jsx)("span",{className:"mobile-chevron","aria-hidden":!0,children:"›"})]})},E.path))}),(0,M.jsxs)("div",{className:"dir-select",children:[h!==void 0&&(0,M.jsx)("p",{className:"mobile-error",role:"alert",children:h}),(0,M.jsx)("button",{type:"button",className:"mobile-button mobile-button-muted",disabled:a===void 0||s||x,onClick:()=>{f(void 0),w(!0)},children:"新建文件夹"}),(0,M.jsx)("button",{type:"button",className:"mobile-button",disabled:a===void 0||s,onClick:()=>{L()},children:s?"创建中…":"选择此目录"})]}),N&&a!==void 0&&(0,M.jsx)(ar,{title:"跳转到目录",initial:a.path,confirmLabel:"跳转",onCancel:()=>{P(!1)},onConfirm:E=>{P(!1);let H=E.trim();H!==""&&c(H)}}),g&&a!==void 0&&(0,M.jsx)(ar,{title:"新建文件夹",initial:"",confirmLabel:x?"创建中…":"创建",busy:x,onCancel:()=>{w(!1)},onConfirm:E=>{_(E)}})]})}function eO({target:e,pinned:t,onClose:n,onPinnedChange:a,onRename:r,onDelete:i,onPurge:o,onMoveCategory:s}){let{workspace:l}=e,d=[{key:"pin",label:t?"取消固定":"固定到顶部",run:()=>{a()}},{key:"rename",label:"重命名",run:()=>{r(l)}},{key:"move",label:"移动到分类…",run:()=>{s()}},{key:"delete",label:"移除工作区(保留文件)",danger:!0,run:()=>{i(l)}},{key:"purge",label:"清理工作区…",danger:!0,run:()=>{o(l)}}];return(0,M.jsx)(tt,{title:l.title,onClose:n,children:(0,M.jsx)("div",{role:"menu","aria-label":`工作区操作:${l.title}`,children:d.map(c=>(0,M.jsx)("button",{type:"button",role:"menuitem",className:"sheet-option",onClick:()=>{n(),c.run()},children:(0,M.jsx)("span",{className:"sheet-option-copy",children:(0,M.jsx)("span",{className:"sheet-option-title",style:c.danger?{color:"var(--danger)"}:void 0,children:c.label})})},c.key))})})}function tO(){return(0,M.jsx)("div",{"aria-hidden":"true",role:"presentation",children:[0,1,2].map(e=>(0,M.jsxs)("div",{className:"skel-row",children:[(0,M.jsx)("div",{className:"skel skel-icon"}),(0,M.jsxs)("div",{className:"skel-lines",children:[(0,M.jsx)("div",{className:"skel skel-line-title"}),(0,M.jsx)("div",{className:"skel skel-line-sub"})]})]},e))})}function k6({initialWorkspaceId:e,onPick:t,onOpenSettings:n,onLocateSession:a,onOpenDirect:r,initialSearch:i,onSearchSnapshot:o,onSearchApplied:s,onOpenRunOverview:l,runOverviewLive:d}){let[c,v]=(0,ie.useState)(()=>u6),[m,g]=(0,ie.useState)(void 0),[w,x]=(0,ie.useState)(0),[C,h]=(0,ie.useState)(!1),[f,b]=(0,ie.useState)(void 0),[y,N]=(0,ie.useState)(()=>X7()),[P,_]=(0,ie.useState)(()=>Q7()),[L,E]=(0,ie.useState)(()=>W7()),[H,ne]=(0,ie.useState)(!1),[be,Ne]=(0,ie.useState)(void 0),[xe,Ee]=(0,ie.useState)(void 0),[Ue,nt]=(0,ie.useState)(void 0),[ke,ot]=(0,ie.useState)(!1),[Ae,Ve]=(0,ie.useState)(""),st=(0,ie.useRef)(!1);(0,ie.useEffect)(()=>{st.current||i!==void 0&&i.open&&(st.current=!0,ot(!0),Ve(i.term),s?.())},[i,s]),(0,ie.useEffect)(()=>{o?.(ke,Ae)},[ke,Ae,o]);let[Ge,bt]=(0,ie.useState)([]),[Fn,Et]=(0,ie.useState)(!1),[ka,Ot]=(0,ie.useState)(!1),[gt,Z]=(0,ie.useState)(!1),[te,pe]=(0,ie.useState)(!1),[Le,at]=(0,ie.useState)(!1),[_e,yn]=(0,ie.useState)(()=>F7()),[ea,an]=(0,ie.useState)(()=>K7()),On=(0,ie.useCallback)(O=>$7(O,ea,y),[ea,y]);(0,ie.useEffect)(()=>{if(P.length>0)return;let O=Object.entries(y);if(O.length===0)return;let U=[],re={};for(let[T,X]of O){let J=X==="test"?"测试项目":"代码项目",Y=U.find(me=>me.name===J);Y===void 0&&(Y={id:`cat-${Date.now()}-${U.length}`,name:J},U.push(Y)),re[T]=Y.id}_(U),E(re),_p(U),Bv(re);try{localStorage.removeItem(y6)}catch{}N({})},[]);let Yt=(0,ie.useCallback)((O,U)=>{E(re=>{let T={...re};return U===void 0?delete T[O]:T[O]=U,Bv(T),T})},[]),ta=(0,ie.useCallback)(O=>{let U=O.trim();U!==""&&_(re=>{let T=[...re,{id:`cat-${Date.now()}-${re.length}`,name:U}];return _p(T),T})},[]),lt=(0,ie.useCallback)((O,U)=>{let re=U.trim();re!==""&&(_(T=>{let X=T.map(J=>J.id===O?{...J,name:re}:J);return _p(X),X}),Ee(void 0))},[]),rn=(0,ie.useCallback)(O=>{_(U=>{let re=U.filter(T=>T.id!==O);return _p(re),re}),E(U=>{let re={...U};for(let[T,X]of Object.entries(re))X===O&&delete re[T];return Bv(re),re}),Ne(void 0)},[]),[It,St]=(0,ie.useState)(void 0),[na,Gn]=(0,ie.useState)(void 0),[In,aa]=(0,ie.useState)(void 0),[Xt,Qt]=(0,ie.useState)(void 0),[Sa,xn]=(0,ie.useState)(!1),Lt=(0,ie.useRef)(void 0),[vt,Wt]=(0,ie.useState)(()=>{try{return localStorage.getItem(p6)==="1"}catch{return!1}}),Na=()=>{Wt(!0);try{localStorage.setItem(p6,"1")}catch{}};(0,ie.useEffect)(()=>{let O=Ae.trim();if(O===""){bt([]),Ot(!1),Et(!1),Z(!1),pe(!1);return}Et(!0),Ot(!1),pe(!1);let U=!1,re=setTimeout(()=>{If(O).then(T=>{U||(bt(T.items),Z(T.hasMore),pe(T.partial===!0),Ot(!0),Et(!1))},()=>{U||(bt([]),Ot(!0),Et(!1))})},250);return()=>{U=!0,clearTimeout(re)}},[Ae]);let _n=(O,U)=>{if(O.kind==="message"&&O.seq!==void 0){Nt(O,O.seq,U,O.messageId,O.partId);return}_f(O.sessionId,U).then(re=>{let T=re.items[0];Nt(O,T?.seq,U,T?.messageId,T?.partId)},()=>{Nt(O,void 0,U)})},wn=O=>{if(O.workspaceId!==void 0){let re=(c??[]).find(T=>T.workspaceId===O.workspaceId);return{workspaceId:O.workspaceId,title:re?.title??O.workspaceTitle}}let U=(c??[]).find(re=>(re.sessionIds??[]).map(String).includes(O.sessionId));return U===void 0?{}:{workspaceId:U.workspaceId,title:U.title}},Nt=(O,U,re,T,X)=>{let J=wn(O);if(J.workspaceId!==void 0&&a!==void 0){let me=T??O.messageId,se=X??O.partId;a(O.sessionId,J.workspaceId,U,re,...[me,se].some(A=>A!==void 0)?[me,se]:[]);return}if(J.workspaceId===void 0){if(r!==void 0){let me=T??O.messageId,se=X??O.partId;r(O,U,re,...[me,se].some(A=>A!==void 0)?[me,se]:[]);return}W("未找到该会话所属的工作区");return}let Y=new URL(window.location.href);Y.searchParams.set("workspace",J.workspaceId),Y.searchParams.set("session",O.sessionId),U!==void 0&&Y.searchParams.set("seq",String(U)),window.location.href=`${Y.pathname}${Y.search}`};(0,ie.useEffect)(()=>{let O=!1;return Od().then(U=>{if(O)return;let re=e===void 0?void 0:U.find(T=>T.workspaceId===e);if(re!==void 0){t(re);return}u6=U,v(U)},U=>{O||g(he(U))}),()=>{O=!0}},[e,t,w]);let Kn=(0,ie.useCallback)(O=>{an(U=>Y7(U,O.workspaceId)),t(O)},[t]),kn=(0,ie.useCallback)(()=>{let O=ea[0],U=O===void 0?void 0:c?.find(re=>re.workspaceId===O);if(U===void 0){W("还没有访问记录");return}Kn(U)},[c,ea,Kn]),on=(0,ie.useCallback)(()=>{Lt.current!==void 0&&(clearTimeout(Lt.current),Lt.current=void 0)},[]);(0,ie.useEffect)(()=>()=>{on()},[on]);let Sn=(0,ie.useRef)(void 0),sr=O=>({onTouchStart:()=>{on(),Sn.current=void 0,Lt.current=window.setTimeout(()=>{Lt.current=void 0,Sn.current=O.workspaceId,St({workspace:O})},500)},onTouchMove:on,onTouchEnd:on,onClick:U=>{if(Sn.current===O.workspaceId){Sn.current=void 0,U.preventDefault();return}Kn(O)},onContextMenu:U=>{U.preventDefault(),St({workspace:O})}}),Pr=(0,ie.useCallback)(O=>{let U=_e.includes(O.workspaceId),re=U?_e.filter(T=>T!==O.workspaceId):[..._e,O.workspaceId];yn(re),G7(re),W(U?"已取消固定":"已固定")},[_e]),ra=(0,ie.useCallback)(async(O,U)=>{xn(!0);try{let{workspace:re}=await CS(O.workspaceId,U);v(T=>T?.map(X=>X.workspaceId===re.workspaceId?re:X)??T),Gn(void 0),W("已重命名")}catch(re){W(he(re))}finally{xn(!1)}},[]),Ta=(0,ie.useCallback)(async O=>{xn(!0);try{await ES(O.workspaceId),v(U=>U?.filter(re=>re.workspaceId!==O.workspaceId)??U),an(U=>m6(U,O.workspaceId)),aa(void 0),W("已删除工作区(目录与会话保留)")}catch(U){W(he(U))}finally{xn(!1)}},[]);if(C)return(0,M.jsx)(J7,{initialCategory:f,onCancel:()=>{h(!1),b(void 0)},onPick:(O,U)=>{U!==void 0&&Yt(O.workspaceId,U),Kn(O)}});let Dt=Ae.trim().toLowerCase(),$e=(c??[]).filter(O=>Dt===""||O.title.toLowerCase().includes(Dt)).filter(O=>!Le||_e.includes(O.workspaceId)),sn=XN((c??[]).map(O=>O.path)),lr=[...$e].sort((O,U)=>{let re=_e.includes(O.workspaceId)?0:1,T=_e.includes(U.workspaceId)?0:1;return re-T}),Ln=new Map(ea.map((O,U)=>[O,U])),Tt=g6.map(({kind:O})=>({kind:O,rows:O==="active"?lr.filter(U=>On(U)===O).sort((U,re)=>{let T=_e.includes(U.workspaceId)?0:1,X=_e.includes(re.workspaceId)?0:1;return T!==X?T-X:(Ln.get(U.workspaceId)??1/0)-(Ln.get(re.workspaceId)??1/0)}):lr.filter(U=>On(U)===O)})).filter(O=>O.rows.length>0),qr=g6.filter(({kind:O,placeholder:U})=>U!==null&&!lr.some(re=>On(re)===O)),Ca=_e.length,ro=O=>P.some(U=>L[O.workspaceId]===U.id),ui=P.map(O=>({key:O.id,title:O.name,categoryId:O.id,rows:lr.filter(U=>L[U.workspaceId]===O.id),placeholder:"还没有工作区"})),ln=(P.length===0?Tt.map(O=>({key:O.kind,title:h6[O.kind],categoryId:void 0,rows:O.rows,placeholder:null})):[...ui,{key:"__none__",title:"未分类",categoryId:void 0,rows:lr.filter(O=>!ro(O)),placeholder:null}]).filter(O=>O.rows.length>0||O.placeholder!==null),Ea=(()=>{if(m!==void 0)return(0,M.jsxs)("div",{className:"mobile-empty",children:[(0,M.jsx)("div",{className:"empty-icon",children:(0,M.jsx)(np,{})}),(0,M.jsx)("p",{className:"empty-title",children:"加载失败"}),(0,M.jsx)("p",{className:"empty-desc",children:m}),(0,M.jsx)("button",{type:"button",className:"mobile-button",onClick:()=>{g(void 0),v(void 0),x(O=>O+1)},children:"重试"})]});if(c===void 0)return(0,M.jsx)(tO,{});if($e.length===0){if(Le&&Ca===0)return(0,M.jsxs)("div",{className:"mobile-empty",children:[(0,M.jsx)("div",{className:"empty-icon",children:(0,M.jsx)(ep,{})}),(0,M.jsx)("p",{className:"empty-title",children:"还没有固定的工作区"}),(0,M.jsx)("p",{className:"empty-desc",children:"长按工作区卡片即可固定,固定后会置顶显示"})]});if(Dt!==""){if(Fn)return(0,M.jsxs)("div",{className:"mobile-empty",children:[(0,M.jsx)("div",{className:"empty-icon",children:(0,M.jsx)(oi,{})}),(0,M.jsx)("p",{className:"empty-title",children:"正在搜索全部会话…"})]});if(ka&&Ge.length===0)return(0,M.jsxs)("div",{className:"mobile-empty",children:[(0,M.jsx)("div",{className:"empty-icon",children:(0,M.jsx)(oi,{})}),(0,M.jsx)("p",{className:"empty-title",children:"没有匹配的工作区或会话"}),(0,M.jsxs)("p",{className:"empty-desc",children:["工作区按名称匹配,会话按名称与可见正文匹配",te&&(0,M.jsx)(M.Fragment,{children:";更早的会话未在本次扫描范围内"})]})]})}else return(0,M.jsxs)("div",{className:"mobile-empty",children:[(0,M.jsx)("div",{className:"empty-icon",children:(0,M.jsx)(kN,{})}),(0,M.jsx)("p",{className:"empty-title",children:"暂无工作区"}),(0,M.jsx)("p",{className:"empty-desc",children:"新建一个工作区,把项目目录挂进来就能开始会话"})]})}return(0,M.jsxs)("ul",{className:"mobile-list",children:[ln.map(O=>(0,M.jsxs)("li",{style:{listStyle:"none"},children:[O.categoryId!==void 0?(0,M.jsxs)("div",{className:"mobile-groupTitle dm-cat-head",children:[(0,M.jsx)("span",{className:"dm-cat-name",onContextMenu:U=>{U.preventDefault(),Ne(O.categoryId)},children:O.title}),(0,M.jsxs)("span",{className:"dm-cat-actions",children:[(0,M.jsx)("button",{type:"button",className:"dm-cat-btn","aria-label":`在「${O.title}」新建工作区`,onClick:()=>{b(O.categoryId),h(!0)},children:(0,M.jsx)(cl,{})}),(0,M.jsx)("button",{type:"button",className:"dm-cat-btn","aria-label":"分类操作",onClick:()=>Ne(O.categoryId),children:"⋯"})]})]}):(0,M.jsx)("div",{className:"mobile-groupTitle",children:O.title}),O.rows.length===0&&O.placeholder!==null&&(0,M.jsxs)("div",{className:"mobile-empty-group",children:[(0,M.jsx)("span",{children:O.placeholder}),(0,M.jsx)("button",{type:"button",className:"mobile-empty-groupBtn",onClick:()=>{b(O.categoryId),h(!0)},children:"新建"})]}),O.rows.map(U=>{let re=On(U),T=_e.includes(U.workspaceId),X=(U.sessionIds??[]).length;return(0,M.jsxs)("button",{type:"button",className:`mobile-row${re==="active"?" mobile-row-active":""}`,...sr(U),children:[(0,M.jsx)("span",{className:`ws-icon ${Z7[re]}`,children:(0,M.jsx)("span",{"aria-hidden":!0,children:(0,M.jsx)(tp,{})})}),(0,M.jsxs)("span",{className:"card-main",children:[(0,M.jsxs)("span",{className:"card-title",children:[(0,M.jsx)("span",{className:"card-titleText",children:U.title}),T&&(0,M.jsx)("span",{className:"ws-pin","aria-label":"已固定",children:(0,M.jsx)(ep,{})})]}),(0,M.jsx)("span",{className:"card-subtitle",children:QN(U.path,sn)})]}),(0,M.jsxs)("span",{className:"card-action",children:[X>0&&(0,M.jsxs)("span",{className:"card-badge",children:[X," 会话"]}),(0,M.jsx)("span",{className:"mobile-chevron","aria-hidden":!0,children:"›"})]})]},U.workspaceId)})]},O.key)),P.length===0&&!Le&&Dt===""&&qr.map(({kind:O,placeholder:U})=>(0,M.jsxs)("li",{style:{listStyle:"none"},children:[(0,M.jsx)("div",{className:"mobile-groupTitle",children:h6[O]}),(0,M.jsxs)("div",{className:"mobile-empty-group",children:[(0,M.jsx)("span",{children:U}),(0,M.jsx)("button",{type:"button",className:"mobile-empty-groupBtn",onClick:()=>{b(void 0),h(!0)},children:"创建"})]})]},`empty-${O}`)),Dt!==""&&Fn&&(0,M.jsx)("li",{style:{listStyle:"none"},children:(0,M.jsx)("p",{className:"mobile-muted mobile-pad",role:"status",children:"正在搜索全部会话…"})}),Dt!==""&&!Fn&&Ge.length>0&&(0,M.jsxs)("li",{style:{listStyle:"none"},children:[(0,M.jsx)("div",{className:"mobile-groupTitle",children:"会话"}),Ge.map(O=>{let U=wn(O),re=(O.title??O.snippet.trim().slice(0,24))||"匹配会话";return(0,M.jsx)("li",{style:{listStyle:"none"},children:(0,M.jsxs)("button",{type:"button",className:"mobile-row",onClick:()=>{_n(O,Dt)},children:[(0,M.jsx)("span",{className:"card-icon",children:(0,M.jsx)("span",{className:"sess-check","aria-hidden":!0,children:(0,M.jsx)(En,{})})}),(0,M.jsxs)("span",{className:"card-main",children:[(0,M.jsxs)("span",{className:"sess-titleline",children:[(0,M.jsx)("span",{className:"sess-title",children:re}),(0,M.jsx)("span",{className:"sess-sep","aria-hidden":!0,children:"·"}),(0,M.jsx)("span",{className:"sess-time",children:U.title??"未分组"})]}),(0,M.jsx)("span",{className:"card-desc",children:O.snippet})]}),(0,M.jsx)("span",{className:"card-action",children:(0,M.jsx)("span",{className:"mobile-chevron","aria-hidden":!0,children:"›"})})]})},`${O.kind}:${O.sessionId}`)}),gt&&(0,M.jsx)("li",{style:{listStyle:"none"},children:(0,M.jsx)("p",{className:"search-hitsNote mobile-pad",children:"结果较多,仅显示前若干条——请细化关键词"})}),!gt&&te&&(0,M.jsx)("li",{style:{listStyle:"none"},children:(0,M.jsx)("p",{className:"search-hitsNote mobile-pad",children:"已扫描最近的会话,更早的会话可能未覆盖"})})]}),!Le&&Dt===""&&(0,M.jsxs)("li",{style:{listStyle:"none"},children:[(0,M.jsxs)("button",{type:"button",className:"mobile-createCard",onClick:()=>{b(void 0),h(!0)},children:[(0,M.jsx)(cl,{}),"新建工作区"]}),(0,M.jsxs)("button",{type:"button",className:"mobile-createCard mobile-createCategory",onClick:()=>ne(!0),children:[(0,M.jsx)(cl,{}),"新建分类"]})]})]})})();return(0,M.jsxs)("div",{className:"mobile",children:[(0,M.jsxs)("header",{className:`mobile-header${ke?"":" dm-header-actions"}`,children:[(0,M.jsx)("div",{className:"mobile-headerSlot",children:ke?(0,M.jsx)("button",{type:"button",className:"mobile-back","aria-label":"返回",onClick:()=>{ot(!1),Ve("")},children:"‹"}):(0,M.jsx)(c6,{onOpenSettings:n})}),ke?(0,M.jsx)("div",{className:"mobile-headerSearch",children:(0,M.jsx)("input",{type:"search",className:"mobile-headerSearchInput",placeholder:"搜索工作区或会话…","aria-label":"搜索工作区和会话",autoFocus:!0,value:Ae,onChange:O=>{Ve(O.target.value)}})}):(0,M.jsx)("h1",{className:"mobile-title",children:"工作区"}),(0,M.jsx)("div",{className:"mobile-headerSlot mobile-headerSlot-right",children:ke?(0,M.jsx)("button",{type:"button",className:"mobile-iconbtn","aria-label":"取消搜索",onClick:()=>{ot(!1),Ve("")},children:(0,M.jsx)(Ji,{})}):(0,M.jsx)("button",{type:"button",className:"mobile-iconbtn","aria-label":"搜索工作区和会话",onClick:()=>{ot(!0)},children:(0,M.jsx)(oi,{})})})]}),(0,M.jsxs)("div",{className:"mobile-quickbar",role:"toolbar","aria-label":"快捷操作",children:[(0,M.jsxs)("button",{type:"button",className:`mobile-quickchip${Le?" mobile-quickchip-on":""}`,"aria-pressed":Le,onClick:()=>{at(O=>!O)},children:[(0,M.jsx)(ep,{}),"固定",Ca>0?` ${Ca}`:""]}),(0,M.jsxs)("button",{type:"button",className:"mobile-quickchip",onClick:kn,children:[(0,M.jsx)(wN,{}),"最近访问"]}),l!==void 0&&(0,M.jsxs)("button",{type:"button",className:"mobile-quickchip"+(d!==void 0&&d>0?" mobile-quickchip-live":""),"aria-label":d!==void 0&&d>0?`运行中 ${d} 个会话`:"运行中",onClick:l,children:[(0,M.jsx)("span",{className:d!==void 0&&d>0?"quick-live-dot":"quick-live-dot quick-live-dot-off","aria-hidden":!0}),"运行中",d!==void 0&&d>0&&(0,M.jsx)("span",{className:"quick-live-count",children:d})]})]}),!vt&&(0,M.jsxs)("div",{className:"mobile-welcome",role:"note",children:[(0,M.jsxs)("div",{className:"mobile-welcomeCopy",children:[(0,M.jsx)("p",{className:"mobile-welcomeTitle",children:"配对成功 🎉 三步上手"}),(0,M.jsxs)("p",{className:"mobile-welcomeDesc",children:["① 点一个工作区开始对话",(0,M.jsx)("br",{}),"② 左上角 设置 → 通知:配好任务完成提醒",(0,M.jsx)("br",{}),"③ 设置 → 用量:随时查看余额与配额"]})]}),(0,M.jsx)("button",{type:"button",className:"mobile-welcomeClose",onClick:Na,children:"知道了"})]}),Ea,It!==void 0&&(0,M.jsx)(eO,{target:It,pinned:_e.includes(It.workspace.workspaceId),onClose:()=>{St(void 0)},onPinnedChange:()=>{Pr(It.workspace)},onRename:O=>{St(void 0),Gn(O)},onDelete:O=>{St(void 0),aa(O)},onPurge:O=>{St(void 0),Qt(O)},onMoveCategory:()=>{let O=It?.workspace;St(void 0),O!==void 0&&nt(O)}}),H&&(0,M.jsx)(ar,{title:"新建分类",initial:"",confirmLabel:"创建",onCancel:()=>{ne(!1)},onConfirm:O=>{ne(!1),ta(O)}}),be!==void 0&&(0,M.jsx)(tt,{title:P.find(O=>O.id===be)?.name??"分类",onClose:()=>{Ne(void 0)},children:(0,M.jsxs)("div",{role:"menu","aria-label":"分类操作",children:[(0,M.jsx)("button",{type:"button",role:"menuitem",className:"sheet-option",onClick:()=>{let O=P.find(U=>U.id===be);Ne(void 0),O!==void 0&&Ee(O)},children:(0,M.jsx)("span",{className:"sheet-option-copy",children:(0,M.jsx)("span",{className:"sheet-option-title",children:"重命名分类"})})}),(0,M.jsx)("button",{type:"button",role:"menuitem",className:"sheet-option",onClick:()=>{be!==void 0&&rn(be)},children:(0,M.jsx)("span",{className:"sheet-option-copy",children:(0,M.jsx)("span",{className:"sheet-option-title",style:{color:"var(--danger)"},children:"删除分类(工作区回到未分类)"})})})]})}),xe!==void 0&&(0,M.jsx)(ar,{title:"重命名分类",initial:xe.name,confirmLabel:"保存",onCancel:()=>{Ee(void 0)},onConfirm:O=>{lt(xe.id,O)}}),Ue!==void 0&&(0,M.jsx)(tt,{title:"移动到分类",onClose:()=>{nt(void 0)},children:(0,M.jsxs)("div",{role:"menu","aria-label":"移动到分类",children:[P.map(O=>(0,M.jsx)("button",{type:"button",role:"menuitem",className:"sheet-option",onClick:()=>{Yt(Ue.workspaceId,O.id),nt(void 0),W(`已移动到「${O.name}」`)},children:(0,M.jsx)("span",{className:"sheet-option-copy",children:(0,M.jsx)("span",{className:"sheet-option-title",children:O.name})})},O.id)),(0,M.jsx)("button",{type:"button",role:"menuitem",className:"sheet-option",onClick:()=>{Yt(Ue.workspaceId,void 0),nt(void 0),W("已移出分类")},children:(0,M.jsx)("span",{className:"sheet-option-copy",children:(0,M.jsx)("span",{className:"sheet-option-title",style:{color:"var(--text-tertiary)"},children:"未分类"})})}),P.length===0&&(0,M.jsx)("p",{className:"settings-note",children:"还没有分类,先点「新建分类」。"})]})}),na!==void 0&&(0,M.jsx)(ar,{title:"重命名工作区",initial:na.title,confirmLabel:"保存",busy:Sa,onCancel:()=>{Gn(void 0)},onConfirm:O=>{ra(na,O)}}),In!==void 0&&(0,M.jsx)(si,{title:"删除工作区",body:(0,M.jsxs)(M.Fragment,{children:["确定删除「",In.title,"」吗?目录、文件与会话记录都会保留,仅移除这里的工作区入口。"]}),confirmLabel:"删除",tone:"danger",busy:Sa,onCancel:()=>{aa(void 0)},onConfirm:()=>{Ta(In)}}),Xt!==void 0&&(0,M.jsx)(E4,{workspace:{workspaceId:Xt.workspaceId,title:Xt.title,path:Xt.path,sessionCount:(Xt.sessionIds??[]).length},onClose:()=>{Qt(void 0)},onDone:()=>{v(O=>O?.filter(U=>U.workspaceId!==Xt.workspaceId)??O),an(O=>m6(O,Xt.workspaceId)),Qt(void 0)}})]})}var vc=$(Xe(),1);var S6=/^\d{6}$/;function N6(e){let t=e.trim();if(t!==""){if(S6.test(t))return{code:t};try{let n=new URL(t),a=n.searchParams.get("pair");if(a===null||a==="")return;let r=n.searchParams.get("workspace");return{token:a,...r!==null&&r!==""?{workspaceId:r}:{}}}catch{return{token:t}}}}function jv(e){return e===void 0?"/m/":"/m/?workspace="+encodeURIComponent(e)}async function Vv(e,t=fetch){let n=new AbortController,a=setTimeout(()=>{n.abort()},15e3);try{let r=await t("/api/pair/accept",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(S6.test(e)?{code:e}:{token:e}),signal:n.signal});return r.ok?{ok:!0}:r.status===404?{ok:!1,message:"配对链接无效或已过期。"}:r.status===409?{ok:!1,message:"设备数已满:请先在桌面端「设备管理」移除一个设备后重试。"}:{ok:!1,message:"此设备无法使用该配对链接。"}}catch{return{ok:!1,message:"无法连接到配对服务。"}}finally{clearTimeout(a)}}async function T6(e,t=fetch){let n;try{n=new URL(e)}catch{return{kind:"none"}}let a=n.searchParams.get("pair"),r=n.searchParams.get("code");if((a===null||a==="")&&(r===null||r===""))return{kind:"none"};let i=n.searchParams.get("workspace"),o=jv(i===null||i===""?void 0:i),l=await Vv(r!==null&&r!==""?r:a??"",t);return l.ok?{kind:"accepted",path:o}:{kind:"failed",path:o,message:l.message}}var Ga=$(oe(),1);function C6(e){try{return new URL(e).origin}catch{return}}function E6({initialError:e,onPaired:t,navigate:n}){let[a,r]=(0,vc.useState)(window.location.origin),[i,o]=(0,vc.useState)(""),[s,l]=(0,vc.useState)(e),[d,c]=(0,vc.useState)(!1),v=n??(g=>{window.location.href=g}),m=async g=>{g.preventDefault();let w=N6(i);if(w===void 0){l("请输入有效的配对链接或配对码。");return}let x=C6(i.trim());if(x!==void 0&&x!==window.location.origin){v(i.trim());return}let C=C6(a.trim())??window.location.origin;if(C!==window.location.origin){let f=w.code!==void 0?w.code:w.token??"";v(`${C}/m/?${w.code!==void 0?"code":"pair"}=${encodeURIComponent(f)}`);return}c(!0),l(void 0);let h=await Vv(w.code??w.token??"");if(c(!1),!h.ok){l(h.message);return}t(jv(w.workspaceId))};return(0,Ga.jsx)("main",{className:"mobile mobile-pair","aria-labelledby":"mobile-pair-title",children:(0,Ga.jsxs)("form",{className:"mobile-pairCard",onSubmit:g=>{m(g)},children:[(0,Ga.jsx)("h1",{id:"mobile-pair-title",className:"mobile-title",children:"设备配对"}),(0,Ga.jsx)("p",{className:"mobile-muted",children:"粘贴桌面端复制的配对链接,或输入桌面端显示的 6 位配对码。"}),(0,Ga.jsx)("label",{className:"mobile-pairLabel",htmlFor:"mobile-pair-server",children:"服务器地址"}),(0,Ga.jsx)("input",{id:"mobile-pair-server",className:"mobile-pairInput",value:a,onChange:g=>{r(g.target.value)},autoComplete:"off",autoCapitalize:"off",spellCheck:!1,inputMode:"url"}),(0,Ga.jsx)("label",{className:"mobile-pairLabel",htmlFor:"mobile-pair-link",children:"配对链接或配对码"}),(0,Ga.jsx)("input",{id:"mobile-pair-link",className:"mobile-pairInput",value:i,onChange:g=>{o(g.target.value)},autoComplete:"off",autoCapitalize:"off",spellCheck:!1}),s===void 0?null:(0,Ga.jsx)("p",{className:"mobile-error",role:"alert",children:s}),(0,Ga.jsx)("button",{className:"mobile-new mobile-pairSubmit",type:"submit",disabled:d,children:d?"正在配对":"配对"})]})})}var jt=$(oe(),1),Dp={workspaceId:"standalone",path:"",title:"未分组",sessionIds:[],createdAt:"",updatedAt:""};function nO(e){let t=new URLSearchParams(e).get("workspace");return t===null||t===""?void 0:t}function aO(e){let t=new URLSearchParams(e).get("session");return t===null||t===""?void 0:t}function rO(e){let t=new URLSearchParams(e).get("seq");if(t===null||t==="")return;let n=Number(t);return Number.isFinite(n)&&n>=0?n:void 0}function Iv(e){let t=e.projections?.values,n=t?.title,a=typeof n=="string"&&n!==""?n:e.cwd!==void 0?e.cwd.split("/").filter(Boolean).at(-1)??e.cwd:"新会话",r=t?.preview,i=t?.sessionStats,o=typeof i=="object"&&i!==null?i.turns:void 0;return{sessionId:e.sessionId,title:a,...typeof r=="string"&&r!==""?{preview:r}:{},...typeof o=="number"&&o>0?{turns:o}:{},...e.cwd!==void 0?{cwd:e.cwd}:{},updatedAt:e.updatedAt,running:e.running,blank:e.blank}}function zT(e){let t=new Date(e),n=`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`,a=new Date;if(t.toDateString()===a.toDateString())return n;let r=new Date(a);return r.setDate(a.getDate()-1),t.toDateString()===r.toDateString()?`昨天 ${n}`:`${String(t.getMonth()+1)}月${String(t.getDate())}日 ${n}`}function D4(e){let t=new Date(e),n=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0"),r=`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`,i=t.getFullYear();return i===new Date().getFullYear()?`${n}-${a} ${r}`:`${i}-${n}-${a} ${r}`}var M6={workspaces:0,"run-overview":1,sessions:1,settings:2,chat:2};function iO(){if(typeof navigator>"u")return"device";let e=typeof navigator.userAgent=="string"?navigator.userAgent:"";return/android/i.test(e)?"android":/ipad|iphone|ipod/i.test(e)?"ios":"device"}function oO(e){return e instanceof ya&&e.message==="HTTP 403"}function sO(e){return oO(e)?"unpaired":"unavailable"}function A6({initialPairError:e}){let[t,n]=(0,Se.useState)("checking");return(0,Se.useEffect)(()=>(l2(),o2(),WS(),aN({send:r=>{cS({kind:r.kind,message:r.message,...r.source===void 0?{}:{source:r.source},...r.frames===void 0?{}:{frames:r.frames},count:r.count,clientAt:r.at},iO())}})),[]),(0,Se.useEffect)(()=>{let a=!0;return Of().then(()=>{a&&n("paired")},r=>{a&&n(sO(r))}),()=>{a=!1}},[]),(0,Se.useEffect)(()=>{t==="unpaired"&&(Vb(),Gb())},[t]),t==="checking"?(0,jt.jsxs)("main",{className:"mobile mobile-empty",role:"status",children:[(0,jt.jsx)("span",{className:"boot-dot","aria-hidden":!0}),(0,jt.jsx)("p",{className:"mobile-muted",children:"正在连接..."})]}):t==="unpaired"?(0,jt.jsx)(E6,{initialError:e,onPaired:a=>{Vb(),Gb(),window.location.replace(a)}}):t==="unavailable"?(0,jt.jsxs)("main",{className:"mobile mobile-empty",children:[(0,jt.jsx)("p",{className:"mobile-error",role:"alert",children:"无法连接到运行中的 DSH host。"}),(0,jt.jsx)("button",{className:"mobile-new",type:"button",onClick:()=>{window.location.reload()},children:"重试"})]}):(0,jt.jsx)(cO,{onUnpaired:()=>n("unpaired")})}var lO=260,dO=3e4;function cO({onUnpaired:e}){let t=Gf(),[n,a]=(0,Se.useState)({current:{route:{kind:"workspaces"},forward:!0},leaving:void 0}),r=n.current.route,i=n.current.forward,o=(0,Se.useRef)(void 0),[s,l]=(0,Se.useState)(()=>nO(window.location.search)),[d,c]=(0,Se.useState)(()=>aO(window.location.search)),[v,m]=(0,Se.useState)(()=>rO(window.location.search)),g=(0,Se.useRef)(v),w=(0,Se.useRef)(void 0),x=(0,Se.useRef)(void 0),C=(0,Se.useRef)(void 0),h=(0,Se.useRef)({open:!1,term:""}),f=(0,Se.useRef)({open:!1,term:""}),[b,y]=(0,Se.useState)(void 0),N=(0,Se.useRef)({workspaceId:"",open:!1,term:""}),[P,_]=(0,Se.useState)(void 0),L=(0,Se.useRef)(!1),[E,H]=(0,Se.useState)(0),ne=(0,Se.useRef)(void 0),be=(0,Se.useRef)(()=>{}),Ne=(0,Se.useRef)(new Set),xe=(0,Se.useCallback)(()=>{let Z=ne.current;if(Z===void 0){H(Ne.current.size);return}let te=new Set(Z.runningSessionsSnapshot());for(let pe of Z.jobsSnapshot())pe.jobs.some(Le=>Le.status==="running"||Le.status==="stopping")&&te.add(pe.sessionId);for(let pe of Ne.current)te.add(pe);H(te.size)},[]),Ee=!0,Ue=!1;(0,Se.useEffect)(()=>()=>{o.current!==void 0&&clearTimeout(o.current)},[]);let nt=(0,Se.useCallback)(()=>{o.current!==void 0&&clearTimeout(o.current),o.current=window.setTimeout(()=>{a(Z=>({current:Z.current,leaving:void 0}))},lO)},[]),ke=(0,Se.useCallback)(Z=>{a(te=>{let pe=M6[Z.kind]>=M6[te.current.route.kind];return{current:{route:Z,forward:pe},leaving:te.current}}),nt()},[nt]);(0,Se.useEffect)(()=>{let Z=new jf(void 0,{onUnpaired:e});ne.current=Z,Z.start();let te=Z.onFrame(pe=>{if(pe.type==="session/jobs"||pe.type==="session/subscribed"){xe();return}if(pe.type==="session/event"){let Le=pe.event.type;(Le==="turn/start"||Le==="turn/end")&&xe()}});return xe(),()=>{te(),Z.stop()}},[e,xe]),(0,Se.useEffect)(()=>{if(r.kind!=="workspaces"||!t)return;let Z=!1,te,pe=()=>{uS().then(({sessionIds:Le})=>{Z||(Ne.current=new Set(Le),xe())},()=>{})};return pe(),te=setInterval(pe,3e4),()=>{Z=!0,te!==void 0&&clearInterval(te)}},[r.kind,xe,t]),(0,Se.useEffect)(()=>(t||Yd(),()=>{M2()}),[t]),(0,Se.useEffect)(()=>{ne.current?.observe(r.kind==="chat"?r.session.sessionId:void 0)},[r]),(0,Se.useEffect)(()=>{let Z=r.kind==="chat"?r.session.sessionId:void 0,te=()=>{pb(Z).catch(()=>{})};if(be.current=te,!t){pb(void 0).catch(()=>{});return}if(te(),Z===void 0)return;let pe=setInterval(te,dO);return()=>{clearInterval(pe)}},[r,t]),(0,Se.useEffect)(()=>{let Z=()=>{let te=ne.current;if(typeof document>"u"||document.visibilityState!=="visible"){te?.pause();return}te?.resync(),be.current()};return document.addEventListener("visibilitychange",Z),()=>{document.removeEventListener("visibilitychange",Z)}},[]),(0,Se.useEffect)(()=>{let Z=!1;return Af().then(te=>{if(Z)return;let pe=(te.namespaces??[]).find(at=>at.ns==="ui-theme")?.value,Le=typeof pe=="object"&&pe!==null?pe.preference:void 0;(Le==="light"||Le==="dark"||Le==="system")&&Yf(Le)},()=>{}),()=>{Z=!0}},[]);let ot=Z=>{let te=N.current;_(te.workspaceId===Z&&te.open?{open:!0,term:te.term}:void 0)},Ae=(0,Se.useCallback)(()=>{L.current?y({...f.current}):r.kind==="chat"&&r.workspace.workspaceId!==Dp.workspaceId&&ot(r.workspace.workspaceId),a(Z=>{let te=Z.current.route;return te.kind==="chat"?L.current?(L.current=!1,{current:{route:{kind:"workspaces"},forward:!1},leaving:Z.current}):te.fromRunOverview===!0?{current:{route:{kind:"run-overview"},forward:!1},leaving:Z.current}:te.workspace.workspaceId===Dp.workspaceId?{current:{route:{kind:"workspaces"},forward:!1},leaving:Z.current}:{current:{route:{kind:"sessions",workspace:te.workspace},forward:!1},leaving:Z.current}:te.kind==="run-overview"?{current:{route:{kind:"workspaces"},forward:!1},leaving:Z.current}:te.kind==="settings"?{current:{route:{kind:"workspaces"},forward:!1},leaving:Z.current}:te.kind==="sessions"?{current:{route:{kind:"workspaces"},forward:!1},leaving:Z.current}:Z}),nt()},[r,nt]),Ve=(0,Se.useCallback)((Z,te,pe,Le,at,_e)=>{ke({kind:"chat",session:Z,workspace:te,...pe!==void 0?{focusSeq:pe}:{},...at!==void 0?{focusMessageId:at}:{},..._e!==void 0?{focusPartId:_e}:{},...Le!==void 0?{focusQuery:Le}:{}}),c(void 0),m(void 0),pe!==void 0&&(g.current=void 0),Le!==void 0&&(w.current=void 0),at!==void 0&&(x.current=void 0),_e!==void 0&&(C.current=void 0)},[ke]),st=(0,Se.useCallback)(Z=>{if(s!==void 0||d!==void 0){let te=new URL(window.location.href);te.searchParams.delete("workspace"),te.searchParams.delete("session"),te.searchParams.delete("seq"),window.history.replaceState(null,"",`${te.pathname}${te.search}${te.hash}`),l(void 0)}ke({kind:"sessions",workspace:Z})},[s,d,ke]),Ge=(0,Se.useCallback)((Z,te,pe,Le,at,_e)=>{L.current=!0,f.current={...h.current},l(te),c(Z),m(pe),g.current=pe,w.current=Le,x.current=at,C.current=_e,ke({kind:"workspaces"})},[ke]),bt=(0,Se.useCallback)((Z,te,pe,Le,at)=>{L.current=!0,f.current={...h.current};let _e={sessionId:Z.sessionId,title:Z.title??"匹配会话",...Z.snippet!==void 0&&Z.snippet!==""?{preview:Z.snippet}:{},updatedAt:0,running:!1,blank:!1};ke({kind:"chat",session:_e,workspace:Dp,...te!==void 0?{focusSeq:te}:{},...Le!==void 0?{focusMessageId:Le}:{},...at!==void 0?{focusPartId:at}:{},...pe!==void 0?{focusQuery:pe}:{}})},[ke]),Fn=(0,Se.useCallback)(Z=>{let te={sessionId:Z.sessionId,title:Z.title??"会话",updatedAt:0,running:!1,blank:!1};ke({kind:"chat",session:te,workspace:Dp,fromRunOverview:!0})},[ke]),Et=r.kind==="chat"?`chat:${r.session.sessionId}`:r.kind==="sessions"?`sessions:${r.workspace.workspaceId}`:r.kind,ka=n.leaving!==void 0?n.leaving.route.kind==="chat"?`chat:${n.leaving.route.session.sessionId}`:n.leaving.route.kind==="sessions"?`sessions:${n.leaving.route.workspace.workspaceId}`:n.leaving.route.kind:"",Ot=i?"fwd":"back",gt=Z=>Z.kind==="workspaces"?(0,jt.jsx)(k6,{initialWorkspaceId:s,initialSearch:b,onPick:st,onOpenSettings:()=>{ke({kind:"settings"})},onLocateSession:Ge,onOpenDirect:bt,onOpenRunOverview:()=>{ke({kind:"run-overview"})},runOverviewLive:E,onSearchSnapshot:(te,pe)=>{h.current={open:te,term:pe}},onSearchApplied:()=>{y(void 0)}}):Z.kind==="run-overview"?(0,jt.jsx)(p4,{mux:ne.current,onBack:Ae,onOpenSession:Fn}):Z.kind==="sessions"?(0,jt.jsx)(L4,{workspace:Z.workspace,mux:ne.current,initialSessionId:d,initialSearch:P,onBack:Ae,onPick:te=>{Ve(te,Z.workspace,g.current,w.current,x.current,C.current)},onLocateSession:Ge,onPickSeq:(te,pe,Le,at,_e)=>{Ve(te,Z.workspace,pe,Le,at,_e)},onSearchSnapshot:(te,pe)=>{N.current={workspaceId:Z.workspace.workspaceId,open:te,term:pe}},onSearchApplied:()=>{_(void 0)}}):Z.kind==="settings"?(0,jt.jsx)(t6,{onBack:Ae}):(0,jt.jsx)(d4,{session:Z.session,initialFocusSeq:Z.focusSeq,initialFocusMessageId:Z.focusMessageId,initialFocusPartId:Z.focusPartId,initialFocusQuery:Z.focusQuery,mux:ne.current,onBack:Ae,showToolCalls:Ee,showSystemMessages:Ue});return(0,jt.jsxs)("div",{className:"mobile",children:[(0,jt.jsxs)("div",{className:"page-stage",children:[n.leaving!==void 0&&(0,jt.jsx)("div",{className:`page page-exit-${Ot}`,"aria-hidden":"true",children:gt(n.leaving.route)},ka),(0,jt.jsx)("div",{className:`page page-enter-${Ot}`,children:gt(r)},Et)]}),(0,jt.jsx)(sN,{})]})}function he(e){return e instanceof Do?e.error.message:e instanceof ya||e instanceof Error?e.message:String(e)}function rr(e){return/^HTTP 403/.test(e)?"宿主端插件可能仍在运行旧版本:请重启 dsh web 后再试。":void 0}function uO(e,t){let n=e.events.map(o=>({...o.event,...o.view!==void 0?{view:o.view}:{}})),a=new ri(Xi(n)),r=DS(n),i=US(n);return{rows:a.snapshot(),maxSeq:a.lastSeq,hasMore:e.hasMore,...r===void 0?{}:{todo:r},...t&&i!==void 0?{turnStartAt:i}:{},...e.projections===void 0?{}:{projections:e.projections}}}async function dc(e,t,n){let a=t===void 0,r;try{let i=await pS(e,t,void 0,n);r={rows:i.rows,maxSeq:i.maxSeq,hasMore:i.hasMore,...i.todo===void 0?{}:{todo:i.todo},...i.projections===void 0?{}:{projections:i.projections},...a&&i.turnStartAt!==void 0?{turnStartAt:i.turnStartAt}:{}}}catch{r=uO(await ai(e,t,void 0,n),a)}return a&&nN(e,r),r}var I6=$(Xe(),1);var ao=$(oe(),1),Pp=class e extends I6.Component{state={reason:null};static getDerivedStateFromError(t){return{reason:e.readable(t)}}static readable(t){let a=(O6(t)&&t.message!==""?t.message:String(t??"unknown error")).replace(/\s+/g," ").trim();return a.length<=240?a:`${a.slice(0,239)}…`}componentDidCatch(t,n){qd({kind:"error",message:this.state.reason??"unknown error",stack:O6(t)?t.stack:void 0})}retry=()=>{this.setState({reason:null})};reload=()=>{typeof window<"u"&&window.location.reload()};render(){let t=this.state.reason;return t===null?this.props.children:(0,ao.jsxs)("main",{className:"mobile mobile-empty mobile-errorpage",role:"alert",children:[(0,ao.jsx)("h1",{className:"errorpage-title",children:"页面出错了"}),(0,ao.jsx)("p",{className:"errorpage-reason",children:t}),(0,ao.jsxs)("div",{className:"errorpage-actions",children:[(0,ao.jsx)("button",{type:"button",className:"mobile-button",onClick:this.retry,children:"重试"}),(0,ao.jsx)("button",{type:"button",className:"mobile-button-muted",onClick:this.reload,children:"重新加载"})]})]})}};function O6(e){return e instanceof Error}var Gv={"bg-page":"#f4f5fb","bg-surface":"#ffffff","bg-elevated":"#eef0f8","bg-input":"#ffffff","dialog-bg":"#ffffff","toast-bg":"#16162a","toast-text":"#ffffff","text-primary":"#16162a","text-secondary":"#4b4b63","text-tertiary":"#6f6f8a","text-quaternary":"#9a9ab0","text-muted":"#b8b8c8","border-default":"#e4e5ef","border-subtle":"#edeef5","border-focus":"#6d5efc",accent:"#6d5efc","accent-contrast":"#ffffff","accent-soft":"rgba(109, 94, 252, 0.12)","accent-glow":"rgba(109, 94, 252, 0.28)",positive:"#22c55e",warning:"#f59e0b",danger:"#ef4444","danger-soft":"rgba(239, 68, 68, 0.1)","card-bg":"#ffffff","card-border":"rgba(24, 24, 40, 0.045)","card-shadow":"0 6px 20px rgba(76, 84, 150, 0.1), 0 1px 2px rgba(76, 84, 150, 0.06)","shadow-lg":"0 18px 44px rgba(24, 24, 40, 0.18)",fill:"rgba(24, 24, 40, 0.04)","fill-strong":"rgba(24, 24, 40, 0.075)","code-bg":"#e8ecf2","code-text":"#3a3f52","code-border":"#d0d7de","code-head-bg":"#dfe4ec","code-head-border":"#d0d7de","tok-keyword":"#a626a4","tok-string":"#50a14f","tok-comment":"#a0a1a7","tok-number":"#986801","tok-type":"#e45649","tok-func":"#4078f2","tok-prop":"#986801","diff-add":"#22c55e","diff-del":"#ef4444","diff-add-bg":"rgba(34, 197, 94, 0.12)","diff-del-bg":"rgba(239, 68, 68, 0.12)","diff-add-word":"rgba(34, 197, 94, 0.22)","diff-del-word":"rgba(239, 68, 68, 0.22)",backdrop:"rgba(15, 18, 34, 0.45)","header-bg":"rgba(244, 245, 251, 0.84)","glass-bg":"rgba(255, 255, 255, 0.72)","glass-border":"rgba(24, 24, 40, 0.06)","bg-glow":"radial-gradient(680px 260px at 78% -8%, rgba(109, 94, 252, 0.12), transparent 62%), radial-gradient(520px 220px at -8% 2%, rgba(236, 72, 153, 0.075), transparent 58%)"},_6={"bg-page":"#0b0b12","bg-surface":"#16161f","bg-elevated":"#1d1d29","bg-input":"#16161f","dialog-bg":"#1c1c28","toast-bg":"#2a2a3a","toast-text":"#f0f0f5","text-primary":"#f0f0f5","text-secondary":"#a5a5ba","text-tertiary":"#70708a","text-quaternary":"#5a5a72","text-muted":"#40405a","border-default":"#26263a","border-subtle":"#1e1e2c","border-focus":"#4b3fd6",accent:"#6d5efc","accent-contrast":"#ffffff","accent-soft":"rgba(109, 94, 252, 0.16)","accent-glow":"rgba(109, 94, 252, 0.34)",positive:"#4ade80",warning:"#fbbf24",danger:"#f87171","danger-soft":"rgba(248, 113, 113, 0.14)","card-bg":"#16161f","card-border":"rgba(255, 255, 255, 0.05)","card-shadow":"0 8px 26px rgba(0, 0, 0, 0.45)","shadow-lg":"0 22px 56px rgba(0, 0, 0, 0.6)",fill:"rgba(255, 255, 255, 0.05)","fill-strong":"rgba(255, 255, 255, 0.085)","code-bg":"#161b22","code-text":"#b8bad0","code-border":"#30363d","code-head-bg":"#1c2128","code-head-border":"#30363d","tok-keyword":"#c678dd","tok-string":"#98c379","tok-comment":"#5c6370","tok-number":"#d19a66","tok-type":"#e5c07b","tok-func":"#61afef","tok-prop":"#d19a66","diff-add":"#4ade80","diff-del":"#f87171","diff-add-bg":"rgba(74, 222, 128, 0.1)","diff-del-bg":"rgba(248, 113, 113, 0.1)","diff-add-word":"rgba(74, 222, 128, 0.25)","diff-del-word":"rgba(248, 113, 113, 0.25)",backdrop:"rgba(0, 0, 0, 0.6)","header-bg":"rgba(11, 11, 18, 0.82)","glass-bg":"rgba(22, 22, 31, 0.66)","glass-border":"rgba(255, 255, 255, 0.07)","bg-glow":"radial-gradient(680px 260px at 78% -8%, rgba(109, 94, 252, 0.16), transparent 62%), radial-gradient(520px 220px at -8% 2%, rgba(236, 72, 153, 0.07), transparent 58%)"},pl={chip:12,card:18,sheet:28,menu:16,capsule:999,full:9999},Xo={1:4,2:8,3:12,4:16,5:20,6:24,8:32},yc={xs:11,sm:12,md:13,base:15,lg:17},gP={card:Gv["card-shadow"],float:Gv["shadow-lg"]},L6={blur:16,saturate:1.4},D6={card:72,tool:34},fO="-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'PingFang SC', 'Noto Sans SC', 'Segoe UI', sans-serif",pO="'SF Mono', 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace";function Fv(e){return Object.entries(e).map(([t,n])=>` --${t}: ${n};`).join(`
947
+ <\/script>`;function Hv(e){if(typeof window>"u")return;let t=window.__dmOpenHostPage;typeof t=="function"&&t(e)}var Ut=$(oe(),1),zv=20,z7="0 0 24 24",r6=1.5,B7=17.5,i6=B7*24/zv,o6={gear:23.5,pagePlugins:22.5,pageAutomations:19.5};function s6({children:e}){return(0,Ut.jsx)("svg",{width:zv,height:zv,viewBox:z7,fill:"none",stroke:"currentColor",strokeWidth:r6,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",children:e})}function l6({scale:e,children:t}){return(0,Ut.jsx)("g",{transform:`translate(12 12) scale(${e}) translate(-12 -12)`,children:t})}function d6(e){return r6/e}function U7(){let e=i6/o6.gear;return(0,Ut.jsx)(s6,{children:(0,Ut.jsx)(l6,{scale:e,children:(0,Ut.jsxs)("g",{strokeWidth:d6(e),children:[(0,Ut.jsx)("circle",{cx:"12",cy:"12",r:"3"}),(0,Ut.jsx)("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z"})]})})})}function a6({name:e}){let t=Jf(e),n=24/t.size,a=i6/o6[e];return(0,Ut.jsx)(s6,{children:(0,Ut.jsx)(l6,{scale:a,children:(0,Ut.jsx)("g",{transform:`scale(${n})`,strokeWidth:d6(a*n),children:(0,Ut.jsx)("g",{dangerouslySetInnerHTML:{__html:t.inner}})})})})}function c6({onOpenSettings:e}){return(0,Ut.jsxs)("div",{className:"dm-header-action-group",children:[(0,Ut.jsx)("button",{type:"button",className:"mobile-iconbtn","aria-label":"设置",title:"设置",onClick:()=>{e?.()},children:(0,Ut.jsx)(U7,{})}),(0,Ut.jsx)("button",{type:"button",className:"mobile-iconbtn","aria-label":"插件",title:"插件",onClick:()=>{Hv("plugins")},children:(0,Ut.jsx)(a6,{name:"pagePlugins"})}),(0,Ut.jsx)("button",{type:"button",className:"mobile-iconbtn","aria-label":"自动化",title:"自动化",onClick:()=>{Hv("automations")},children:(0,Ut.jsx)(a6,{name:"pageAutomations"})})]})}var M=$(oe(),1),u6,b6="dsh.palm.pinnedWorkspaces",Uv="dsh.palm.recentWorkspaces",f6="dsh.palm.recentWorkspace",p6="dsh.palm.welcomeSeen",j7=5,V7=3;function F7(){try{let e=localStorage.getItem(b6),t=e===null?[]:JSON.parse(e);return Array.isArray(t)?t.filter(n=>typeof n=="string"):[]}catch{return[]}}function G7(e){try{localStorage.setItem(b6,JSON.stringify(e))}catch{}}function Lp(e){let t=[];for(let n of e)if(!t.includes(n)&&(t.push(n),t.length>=j7))break;return t}function K7(){try{let e=localStorage.getItem(Uv);if(e!==null){let t=JSON.parse(e);if(Array.isArray(t))return Lp(t.filter(n=>typeof n=="string"))}}catch{}try{let e=localStorage.getItem(f6);if(e!==null&&e!==""){let t=Lp([e]);return localStorage.setItem(Uv,JSON.stringify(t)),localStorage.removeItem(f6),t}}catch{}return[]}function v6(e){let t=Lp(e);try{localStorage.setItem(Uv,JSON.stringify(t))}catch{}}function Y7(e,t){let n=Lp([t,...e.filter(a=>a!==t)]);return v6(n),n}function m6(e,t){let n=e.filter(a=>a!==t);return v6(n),n}var y6="dsh.palm.workspaceKinds";function X7(){try{let e=localStorage.getItem(y6),t=e===null?{}:JSON.parse(e);if(t===null||typeof t!="object"||Array.isArray(t))return{};let n={};for(let[a,r]of Object.entries(t))(r==="code"||r==="test")&&(n[a]=r);return n}catch{return{}}}var x6="dsh.palm.workspaceCategories",w6="dsh.palm.workspaceCategoryMap";function Q7(){try{let e=localStorage.getItem(x6),t=e===null?[]:JSON.parse(e);return Array.isArray(t)?t.filter(n=>n!==null&&typeof n=="object"&&typeof n.id=="string"&&typeof n.name=="string"&&n.name.trim()!=="").map(n=>({id:n.id,name:n.name.trim()})):[]}catch{return[]}}function _p(e){try{localStorage.setItem(x6,JSON.stringify(e))}catch{}}function W7(){try{let e=localStorage.getItem(w6),t=e===null?{}:JSON.parse(e);if(t===null||typeof t!="object"||Array.isArray(t))return{};let n={};for(let[a,r]of Object.entries(t))typeof r=="string"&&(n[a]=r);return n}catch{return{}}}function Bv(e){try{localStorage.setItem(w6,JSON.stringify(e))}catch{}}function $7(e,t,n){let a=n===void 0?void 0:n[e.workspaceId];return a==="code"||a==="test"?a:t.slice(0,V7).includes(e.workspaceId)?"active":/\b(test|tests|testing|spec|specs|benchmark|e2e)\b/i.test(e.path.replace(/[\\/]+/g," "))||/\b(test|tests|testing|spec|specs|benchmark|e2e)\b/i.test(e.title)?"test":(e.sessionIds??[]).length===0?"plain":"code"}var h6={active:"活跃项目",code:"代码项目",test:"测试项目",plain:"其他"},Z7={active:"ws-icon-active",code:"ws-icon-code",test:"ws-icon-test",plain:"ws-icon-plain"},g6=[{kind:"active",placeholder:null},{kind:"code",placeholder:"暂无代码项目"},{kind:"test",placeholder:"暂无测试项目"},{kind:"plain",placeholder:null}];function J7({onCancel:e,onPick:t,initialCategory:n}){let[a,r]=(0,ie.useState)(void 0),[i,o]=(0,ie.useState)(void 0),[s,l]=(0,ie.useState)(!1),[d,c]=(0,ie.useState)(void 0),[v,m]=(0,ie.useState)(0),[g,w]=(0,ie.useState)(!1),[x,C]=(0,ie.useState)(!1),[h,f]=(0,ie.useState)(void 0),[b,y]=(0,ie.useState)([]),[N,P]=(0,ie.useState)(!1);(0,ie.useEffect)(()=>{let E=!0;return TS().then(H=>{E&&y(H.roots)},()=>{}),()=>{E=!1}},[]),(0,ie.useEffect)(()=>{let E=!1;return o(void 0),r(void 0),kS(d).then(H=>{E||r(H)},H=>{E||o(he(H))}),()=>{E=!0}},[d,v]);let _=async E=>{if(!(a===void 0||x)){C(!0),f(void 0);try{let H=await NS(a.path,E);w(!1),c(H.path)}catch(H){f(he(H))}finally{C(!1)}}},L=async()=>{if(!(a===void 0||s)){l(!0),o(void 0);try{let E=await SS(a.path);t(E.workspace,n)}catch(E){l(!1),o(he(E))}}};return(0,M.jsxs)("div",{className:"mobile dir-browser",children:[(0,M.jsxs)("header",{className:"mobile-header",children:[(0,M.jsx)("div",{className:"mobile-headerSlot",children:(0,M.jsx)("button",{type:"button",className:"mobile-headerAction",onClick:e,children:"返回"})}),(0,M.jsx)("h1",{className:"mobile-title",children:"选择目录"}),(0,M.jsx)("div",{className:"mobile-headerSlot mobile-headerSlot-right"})]}),b.length>0&&(0,M.jsxs)("div",{className:"dir-drives",role:"toolbar","aria-label":"盘符",children:[b.map(E=>{let H=a!==void 0&&a.path.toUpperCase().startsWith(E.path.toUpperCase());return(0,M.jsx)("button",{type:"button",className:"dir-drive"+(H?" dir-drive-on":""),onClick:()=>{c(E.path)},children:E.name},E.path)}),(0,M.jsx)("button",{type:"button",className:"dir-drive dir-drive-jump",onClick:()=>{P(!0)},children:"跳转…"})]}),a!==void 0&&(0,M.jsx)("div",{className:"dir-crumbs",children:a.crumbs.map((E,H)=>(0,M.jsxs)("span",{children:[(0,M.jsx)("button",{type:"button",className:"dir-crumb",onClick:()=>c(E.path),children:E.name||"/"}),H<a.crumbs.length-1&&(0,M.jsx)("span",{className:"dir-crumb-separator",children:"/"})]},E.path))}),i!==void 0?(0,M.jsxs)("div",{className:"mobile-empty",children:[(0,M.jsx)("p",{className:"mobile-error",children:i}),(0,M.jsx)("button",{type:"button",className:"mobile-button",onClick:()=>m(E=>E+1),children:"重试"})]}):a===void 0?(0,M.jsx)("div",{className:"mobile-empty",children:(0,M.jsx)("p",{className:"mobile-muted",children:"加载中…"})}):(0,M.jsx)("ul",{className:"mobile-list",children:a.entries.length===0?(0,M.jsx)("div",{className:"mobile-empty dir-empty",children:(0,M.jsx)("p",{className:"mobile-muted",children:"空目录"})}):a.entries.map(E=>(0,M.jsx)("li",{children:(0,M.jsxs)("button",{type:"button",className:`mobile-row dir-entry ${E.hidden?"dir-entry-hidden":""}`,onClick:()=>c(E.path),children:[(0,M.jsx)("span",{className:"mobile-rowMain",children:(0,M.jsx)("span",{className:"mobile-rowTitle",children:E.name})}),(0,M.jsx)("span",{className:"mobile-chevron","aria-hidden":!0,children:"›"})]})},E.path))}),(0,M.jsxs)("div",{className:"dir-select",children:[h!==void 0&&(0,M.jsx)("p",{className:"mobile-error",role:"alert",children:h}),(0,M.jsx)("button",{type:"button",className:"mobile-button mobile-button-muted",disabled:a===void 0||s||x,onClick:()=>{f(void 0),w(!0)},children:"新建文件夹"}),(0,M.jsx)("button",{type:"button",className:"mobile-button",disabled:a===void 0||s,onClick:()=>{L()},children:s?"创建中…":"选择此目录"})]}),N&&a!==void 0&&(0,M.jsx)(ar,{title:"跳转到目录",initial:a.path,confirmLabel:"跳转",onCancel:()=>{P(!1)},onConfirm:E=>{P(!1);let H=E.trim();H!==""&&c(H)}}),g&&a!==void 0&&(0,M.jsx)(ar,{title:"新建文件夹",initial:"",confirmLabel:x?"创建中…":"创建",busy:x,onCancel:()=>{w(!1)},onConfirm:E=>{_(E)}})]})}function eO({target:e,pinned:t,onClose:n,onPinnedChange:a,onRename:r,onDelete:i,onPurge:o,onMoveCategory:s}){let{workspace:l}=e,d=[{key:"pin",label:t?"取消固定":"固定到顶部",run:()=>{a()}},{key:"rename",label:"重命名",run:()=>{r(l)}},{key:"move",label:"移动到分类…",run:()=>{s()}},{key:"delete",label:"移除工作区(保留文件)",danger:!0,run:()=>{i(l)}},{key:"purge",label:"清理工作区…",danger:!0,run:()=>{o(l)}}];return(0,M.jsx)(tt,{title:l.title,onClose:n,children:(0,M.jsx)("div",{role:"menu","aria-label":`工作区操作:${l.title}`,children:d.map(c=>(0,M.jsx)("button",{type:"button",role:"menuitem",className:"sheet-option",onClick:()=>{n(),c.run()},children:(0,M.jsx)("span",{className:"sheet-option-copy",children:(0,M.jsx)("span",{className:"sheet-option-title",style:c.danger?{color:"var(--danger)"}:void 0,children:c.label})})},c.key))})})}function tO(){return(0,M.jsx)("div",{"aria-hidden":"true",role:"presentation",children:[0,1,2].map(e=>(0,M.jsxs)("div",{className:"skel-row",children:[(0,M.jsx)("div",{className:"skel skel-icon"}),(0,M.jsxs)("div",{className:"skel-lines",children:[(0,M.jsx)("div",{className:"skel skel-line-title"}),(0,M.jsx)("div",{className:"skel skel-line-sub"})]})]},e))})}function k6({initialWorkspaceId:e,onPick:t,onOpenSettings:n,onLocateSession:a,onOpenDirect:r,initialSearch:i,onSearchSnapshot:o,onSearchApplied:s,onOpenRunOverview:l,runOverviewLive:d}){let[c,v]=(0,ie.useState)(()=>u6),[m,g]=(0,ie.useState)(void 0),[w,x]=(0,ie.useState)(0),[C,h]=(0,ie.useState)(!1),[f,b]=(0,ie.useState)(void 0),[y,N]=(0,ie.useState)(()=>X7()),[P,_]=(0,ie.useState)(()=>Q7()),[L,E]=(0,ie.useState)(()=>W7()),[H,ne]=(0,ie.useState)(!1),[be,Ne]=(0,ie.useState)(void 0),[xe,Ee]=(0,ie.useState)(void 0),[Ue,nt]=(0,ie.useState)(void 0),[ke,ot]=(0,ie.useState)(!1),[Ae,Ve]=(0,ie.useState)(""),st=(0,ie.useRef)(!1);(0,ie.useEffect)(()=>{st.current||i!==void 0&&i.open&&(st.current=!0,ot(!0),Ve(i.term),s?.())},[i,s]),(0,ie.useEffect)(()=>{o?.(ke,Ae)},[ke,Ae,o]);let[Ge,bt]=(0,ie.useState)([]),[Fn,Et]=(0,ie.useState)(!1),[ka,Ot]=(0,ie.useState)(!1),[gt,Z]=(0,ie.useState)(!1),[te,pe]=(0,ie.useState)(!1),[Le,at]=(0,ie.useState)(!1),[_e,yn]=(0,ie.useState)(()=>F7()),[ea,an]=(0,ie.useState)(()=>K7()),On=(0,ie.useCallback)(O=>$7(O,ea,y),[ea,y]);(0,ie.useEffect)(()=>{if(P.length>0)return;let O=Object.entries(y);if(O.length===0)return;let U=[],re={};for(let[T,X]of O){let J=X==="test"?"测试项目":"代码项目",Y=U.find(me=>me.name===J);Y===void 0&&(Y={id:`cat-${Date.now()}-${U.length}`,name:J},U.push(Y)),re[T]=Y.id}_(U),E(re),_p(U),Bv(re);try{localStorage.removeItem(y6)}catch{}N({})},[]);let Yt=(0,ie.useCallback)((O,U)=>{E(re=>{let T={...re};return U===void 0?delete T[O]:T[O]=U,Bv(T),T})},[]),ta=(0,ie.useCallback)(O=>{let U=O.trim();U!==""&&_(re=>{let T=[...re,{id:`cat-${Date.now()}-${re.length}`,name:U}];return _p(T),T})},[]),lt=(0,ie.useCallback)((O,U)=>{let re=U.trim();re!==""&&(_(T=>{let X=T.map(J=>J.id===O?{...J,name:re}:J);return _p(X),X}),Ee(void 0))},[]),rn=(0,ie.useCallback)(O=>{_(U=>{let re=U.filter(T=>T.id!==O);return _p(re),re}),E(U=>{let re={...U};for(let[T,X]of Object.entries(re))X===O&&delete re[T];return Bv(re),re}),Ne(void 0)},[]),[It,St]=(0,ie.useState)(void 0),[na,Gn]=(0,ie.useState)(void 0),[In,aa]=(0,ie.useState)(void 0),[Xt,Qt]=(0,ie.useState)(void 0),[Sa,xn]=(0,ie.useState)(!1),Lt=(0,ie.useRef)(void 0),[vt,Wt]=(0,ie.useState)(()=>{try{return localStorage.getItem(p6)==="1"}catch{return!1}}),Na=()=>{Wt(!0);try{localStorage.setItem(p6,"1")}catch{}};(0,ie.useEffect)(()=>{let O=Ae.trim();if(O===""){bt([]),Ot(!1),Et(!1),Z(!1),pe(!1);return}Et(!0),Ot(!1),pe(!1);let U=!1,re=setTimeout(()=>{If(O).then(T=>{U||(bt(T.items),Z(T.hasMore),pe(T.partial===!0),Ot(!0),Et(!1))},()=>{U||(bt([]),Ot(!0),Et(!1))})},250);return()=>{U=!0,clearTimeout(re)}},[Ae]);let _n=(O,U)=>{if(O.kind==="message"&&O.seq!==void 0){Nt(O,O.seq,U,O.messageId,O.partId);return}_f(O.sessionId,U).then(re=>{let T=re.items[0];Nt(O,T?.seq,U,T?.messageId,T?.partId)},()=>{Nt(O,void 0,U)})},wn=O=>{if(O.workspaceId!==void 0){let re=(c??[]).find(T=>T.workspaceId===O.workspaceId);return{workspaceId:O.workspaceId,title:re?.title??O.workspaceTitle}}let U=(c??[]).find(re=>(re.sessionIds??[]).map(String).includes(O.sessionId));return U===void 0?{}:{workspaceId:U.workspaceId,title:U.title}},Nt=(O,U,re,T,X)=>{let J=wn(O);if(J.workspaceId!==void 0&&a!==void 0){let me=T??O.messageId,se=X??O.partId;a(O.sessionId,J.workspaceId,U,re,...[me,se].some(A=>A!==void 0)?[me,se]:[]);return}if(J.workspaceId===void 0){if(r!==void 0){let me=T??O.messageId,se=X??O.partId;r(O,U,re,...[me,se].some(A=>A!==void 0)?[me,se]:[]);return}W("未找到该会话所属的工作区");return}let Y=new URL(window.location.href);Y.searchParams.set("workspace",J.workspaceId),Y.searchParams.set("session",O.sessionId),U!==void 0&&Y.searchParams.set("seq",String(U)),window.location.href=`${Y.pathname}${Y.search}`};(0,ie.useEffect)(()=>{let O=!1;return Od().then(U=>{if(O)return;let re=e===void 0?void 0:U.find(T=>T.workspaceId===e);if(re!==void 0){t(re);return}u6=U,v(U)},U=>{O||g(he(U))}),()=>{O=!0}},[e,t,w]);let Kn=(0,ie.useCallback)(O=>{an(U=>Y7(U,O.workspaceId)),t(O)},[t]),kn=(0,ie.useCallback)(()=>{let O=ea[0],U=O===void 0?void 0:c?.find(re=>re.workspaceId===O);if(U===void 0){W("还没有访问记录");return}Kn(U)},[c,ea,Kn]),on=(0,ie.useCallback)(()=>{Lt.current!==void 0&&(clearTimeout(Lt.current),Lt.current=void 0)},[]);(0,ie.useEffect)(()=>()=>{on()},[on]);let Sn=(0,ie.useRef)(void 0),sr=O=>({onTouchStart:()=>{on(),Sn.current=void 0,Lt.current=window.setTimeout(()=>{Lt.current=void 0,Sn.current=O.workspaceId,St({workspace:O})},500)},onTouchMove:on,onTouchEnd:on,onClick:U=>{if(Sn.current===O.workspaceId){Sn.current=void 0,U.preventDefault();return}Kn(O)},onContextMenu:U=>{U.preventDefault(),St({workspace:O})}}),Pr=(0,ie.useCallback)(O=>{let U=_e.includes(O.workspaceId),re=U?_e.filter(T=>T!==O.workspaceId):[..._e,O.workspaceId];yn(re),G7(re),W(U?"已取消固定":"已固定")},[_e]),ra=(0,ie.useCallback)(async(O,U)=>{xn(!0);try{let{workspace:re}=await CS(O.workspaceId,U);v(T=>T?.map(X=>X.workspaceId===re.workspaceId?re:X)??T),Gn(void 0),W("已重命名")}catch(re){W(he(re))}finally{xn(!1)}},[]),Ta=(0,ie.useCallback)(async O=>{xn(!0);try{await ES(O.workspaceId),v(U=>U?.filter(re=>re.workspaceId!==O.workspaceId)??U),an(U=>m6(U,O.workspaceId)),aa(void 0),W("已删除工作区(目录与会话保留)")}catch(U){W(he(U))}finally{xn(!1)}},[]);if(C)return(0,M.jsx)(J7,{initialCategory:f,onCancel:()=>{h(!1),b(void 0)},onPick:(O,U)=>{U!==void 0&&Yt(O.workspaceId,U),Kn(O)}});let Dt=Ae.trim().toLowerCase(),$e=(c??[]).filter(O=>Dt===""||O.title.toLowerCase().includes(Dt)).filter(O=>!Le||_e.includes(O.workspaceId)),sn=XN((c??[]).map(O=>O.path)),lr=[...$e].sort((O,U)=>{let re=_e.includes(O.workspaceId)?0:1,T=_e.includes(U.workspaceId)?0:1;return re-T}),Ln=new Map(ea.map((O,U)=>[O,U])),Tt=g6.map(({kind:O})=>({kind:O,rows:O==="active"?lr.filter(U=>On(U)===O).sort((U,re)=>{let T=_e.includes(U.workspaceId)?0:1,X=_e.includes(re.workspaceId)?0:1;return T!==X?T-X:(Ln.get(U.workspaceId)??1/0)-(Ln.get(re.workspaceId)??1/0)}):lr.filter(U=>On(U)===O)})).filter(O=>O.rows.length>0),qr=g6.filter(({kind:O,placeholder:U})=>U!==null&&!lr.some(re=>On(re)===O)),Ca=_e.length,ro=O=>P.some(U=>L[O.workspaceId]===U.id),ui=P.map(O=>({key:O.id,title:O.name,categoryId:O.id,rows:lr.filter(U=>L[U.workspaceId]===O.id),placeholder:"还没有工作区"})),ln=(P.length===0?Tt.map(O=>({key:O.kind,title:h6[O.kind],categoryId:void 0,rows:O.rows,placeholder:null})):[...ui,{key:"__none__",title:"未分类",categoryId:void 0,rows:lr.filter(O=>!ro(O)),placeholder:null}]).filter(O=>O.rows.length>0||O.placeholder!==null),Ea=(()=>{if(m!==void 0)return(0,M.jsxs)("div",{className:"mobile-empty",children:[(0,M.jsx)("div",{className:"empty-icon",children:(0,M.jsx)(np,{})}),(0,M.jsx)("p",{className:"empty-title",children:"加载失败"}),(0,M.jsx)("p",{className:"empty-desc",children:m}),(0,M.jsx)("button",{type:"button",className:"mobile-button",onClick:()=>{g(void 0),v(void 0),x(O=>O+1)},children:"重试"})]});if(c===void 0)return(0,M.jsx)(tO,{});if($e.length===0){if(Le&&Ca===0)return(0,M.jsxs)("div",{className:"mobile-empty",children:[(0,M.jsx)("div",{className:"empty-icon",children:(0,M.jsx)(ep,{})}),(0,M.jsx)("p",{className:"empty-title",children:"还没有固定的工作区"}),(0,M.jsx)("p",{className:"empty-desc",children:"长按工作区卡片即可固定,固定后会置顶显示"})]});if(Dt!==""){if(Fn)return(0,M.jsxs)("div",{className:"mobile-empty",children:[(0,M.jsx)("div",{className:"empty-icon",children:(0,M.jsx)(oi,{})}),(0,M.jsx)("p",{className:"empty-title",children:"正在搜索全部会话…"})]});if(ka&&Ge.length===0)return(0,M.jsxs)("div",{className:"mobile-empty",children:[(0,M.jsx)("div",{className:"empty-icon",children:(0,M.jsx)(oi,{})}),(0,M.jsx)("p",{className:"empty-title",children:"没有匹配的工作区或会话"}),(0,M.jsxs)("p",{className:"empty-desc",children:["工作区按名称匹配,会话按名称与可见正文匹配",te&&(0,M.jsx)(M.Fragment,{children:";更早的会话未在本次扫描范围内"})]})]})}else return(0,M.jsxs)("div",{className:"mobile-empty",children:[(0,M.jsx)("div",{className:"empty-icon",children:(0,M.jsx)(kN,{})}),(0,M.jsx)("p",{className:"empty-title",children:"暂无工作区"}),(0,M.jsx)("p",{className:"empty-desc",children:"新建一个工作区,把项目目录挂进来就能开始会话"})]})}return(0,M.jsxs)("ul",{className:"mobile-list",children:[ln.map(O=>(0,M.jsxs)("li",{style:{listStyle:"none"},children:[O.categoryId!==void 0?(0,M.jsxs)("div",{className:"mobile-groupTitle dm-cat-head",children:[(0,M.jsx)("span",{className:"dm-cat-name",onContextMenu:U=>{U.preventDefault(),Ne(O.categoryId)},children:O.title}),(0,M.jsxs)("span",{className:"dm-cat-actions",children:[(0,M.jsx)("button",{type:"button",className:"dm-cat-btn","aria-label":`在「${O.title}」新建工作区`,onClick:()=>{b(O.categoryId),h(!0)},children:(0,M.jsx)(cl,{})}),(0,M.jsx)("button",{type:"button",className:"dm-cat-btn","aria-label":"分类操作",onClick:()=>Ne(O.categoryId),children:"⋯"})]})]}):(0,M.jsx)("div",{className:"mobile-groupTitle",children:O.title}),O.rows.length===0&&O.placeholder!==null&&(0,M.jsxs)("div",{className:"mobile-empty-group",children:[(0,M.jsx)("span",{children:O.placeholder}),(0,M.jsx)("button",{type:"button",className:"mobile-empty-groupBtn",onClick:()=>{b(O.categoryId),h(!0)},children:"新建"})]}),O.rows.map(U=>{let re=On(U),T=_e.includes(U.workspaceId),X=(U.sessionIds??[]).length;return(0,M.jsxs)("button",{type:"button",className:`mobile-row${re==="active"?" mobile-row-active":""}`,...sr(U),children:[(0,M.jsx)("span",{className:`ws-icon ${Z7[re]}`,children:(0,M.jsx)("span",{"aria-hidden":!0,children:(0,M.jsx)(tp,{})})}),(0,M.jsxs)("span",{className:"card-main",children:[(0,M.jsxs)("span",{className:"card-title",children:[(0,M.jsx)("span",{className:"card-titleText",children:U.title}),T&&(0,M.jsx)("span",{className:"ws-pin","aria-label":"已固定",children:(0,M.jsx)(ep,{})})]}),(0,M.jsx)("span",{className:"card-subtitle",children:QN(U.path,sn)})]}),(0,M.jsxs)("span",{className:"card-action",children:[X>0&&(0,M.jsxs)("span",{className:"card-badge",children:[X," 会话"]}),(0,M.jsx)("span",{className:"mobile-chevron","aria-hidden":!0,children:"›"})]})]},U.workspaceId)})]},O.key)),P.length===0&&!Le&&Dt===""&&qr.map(({kind:O,placeholder:U})=>(0,M.jsxs)("li",{style:{listStyle:"none"},children:[(0,M.jsx)("div",{className:"mobile-groupTitle",children:h6[O]}),(0,M.jsxs)("div",{className:"mobile-empty-group",children:[(0,M.jsx)("span",{children:U}),(0,M.jsx)("button",{type:"button",className:"mobile-empty-groupBtn",onClick:()=>{b(void 0),h(!0)},children:"创建"})]})]},`empty-${O}`)),Dt!==""&&Fn&&(0,M.jsx)("li",{style:{listStyle:"none"},children:(0,M.jsx)("p",{className:"mobile-muted mobile-pad",role:"status",children:"正在搜索全部会话…"})}),Dt!==""&&!Fn&&Ge.length>0&&(0,M.jsxs)("li",{style:{listStyle:"none"},children:[(0,M.jsx)("div",{className:"mobile-groupTitle",children:"会话"}),Ge.map(O=>{let U=wn(O),re=(O.title??O.snippet.trim().slice(0,24))||"匹配会话";return(0,M.jsx)("li",{style:{listStyle:"none"},children:(0,M.jsxs)("button",{type:"button",className:"mobile-row",onClick:()=>{_n(O,Dt)},children:[(0,M.jsx)("span",{className:"card-icon",children:(0,M.jsx)("span",{className:"sess-check","aria-hidden":!0,children:(0,M.jsx)(En,{})})}),(0,M.jsxs)("span",{className:"card-main",children:[(0,M.jsxs)("span",{className:"sess-titleline",children:[(0,M.jsx)("span",{className:"sess-title",children:re}),(0,M.jsx)("span",{className:"sess-sep","aria-hidden":!0,children:"·"}),(0,M.jsx)("span",{className:"sess-time",children:U.title??"未分组"})]}),(0,M.jsx)("span",{className:"card-desc",children:O.snippet})]}),(0,M.jsx)("span",{className:"card-action",children:(0,M.jsx)("span",{className:"mobile-chevron","aria-hidden":!0,children:"›"})})]})},`${O.kind}:${O.sessionId}`)}),gt&&(0,M.jsx)("li",{style:{listStyle:"none"},children:(0,M.jsx)("p",{className:"search-hitsNote mobile-pad",children:"结果较多,仅显示前若干条——请细化关键词"})}),!gt&&te&&(0,M.jsx)("li",{style:{listStyle:"none"},children:(0,M.jsx)("p",{className:"search-hitsNote mobile-pad",children:"已扫描最近的会话,更早的会话可能未覆盖"})})]}),!Le&&Dt===""&&(0,M.jsxs)("li",{style:{listStyle:"none"},children:[(0,M.jsxs)("button",{type:"button",className:"mobile-createCard",onClick:()=>{b(void 0),h(!0)},children:[(0,M.jsx)(cl,{}),"新建工作区"]}),(0,M.jsxs)("button",{type:"button",className:"mobile-createCard mobile-createCategory",onClick:()=>ne(!0),children:[(0,M.jsx)(cl,{}),"新建分类"]})]})]})})();return(0,M.jsxs)("div",{className:"mobile",children:[(0,M.jsxs)("header",{className:`mobile-header${ke?"":" dm-header-actions"}`,children:[(0,M.jsx)("div",{className:"mobile-headerSlot",children:ke?(0,M.jsx)("button",{type:"button",className:"mobile-back","aria-label":"返回",onClick:()=>{ot(!1),Ve("")},children:"‹"}):(0,M.jsx)(c6,{onOpenSettings:n})}),ke?(0,M.jsx)("div",{className:"mobile-headerSearch",children:(0,M.jsx)("input",{type:"search",className:"mobile-headerSearchInput",placeholder:"搜索工作区或会话…","aria-label":"搜索工作区和会话",autoFocus:!0,value:Ae,onChange:O=>{Ve(O.target.value)}})}):(0,M.jsx)("h1",{className:"mobile-title",children:"工作区"}),(0,M.jsx)("div",{className:"mobile-headerSlot mobile-headerSlot-right",children:ke?(0,M.jsx)("button",{type:"button",className:"mobile-iconbtn","aria-label":"取消搜索",onClick:()=>{ot(!1),Ve("")},children:(0,M.jsx)(Ji,{})}):(0,M.jsx)("button",{type:"button",className:"mobile-iconbtn","aria-label":"搜索工作区和会话",onClick:()=>{ot(!0)},children:(0,M.jsx)(oi,{})})})]}),(0,M.jsxs)("div",{className:"mobile-quickbar",role:"toolbar","aria-label":"快捷操作",children:[(0,M.jsxs)("button",{type:"button",className:`mobile-quickchip${Le?" mobile-quickchip-on":""}`,"aria-pressed":Le,onClick:()=>{at(O=>!O)},children:[(0,M.jsx)(ep,{}),"固定",Ca>0?` ${Ca}`:""]}),(0,M.jsxs)("button",{type:"button",className:"mobile-quickchip",onClick:kn,children:[(0,M.jsx)(wN,{}),"最近访问"]}),l!==void 0&&(0,M.jsxs)("button",{type:"button",className:"mobile-quickchip"+(d!==void 0&&d>0?" mobile-quickchip-live":""),"aria-label":d!==void 0&&d>0?`运行中 ${d} 个会话`:"运行中",onClick:l,children:[(0,M.jsx)("span",{className:d!==void 0&&d>0?"quick-live-dot":"quick-live-dot quick-live-dot-off","aria-hidden":!0}),"运行中",d!==void 0&&d>0&&(0,M.jsx)("span",{className:"quick-live-count",children:d})]})]}),!vt&&(0,M.jsxs)("div",{className:"mobile-welcome",role:"note",children:[(0,M.jsxs)("div",{className:"mobile-welcomeCopy",children:[(0,M.jsx)("p",{className:"mobile-welcomeTitle",children:"配对成功 🎉 三步上手"}),(0,M.jsxs)("p",{className:"mobile-welcomeDesc",children:["① 点一个工作区开始对话",(0,M.jsx)("br",{}),"② 左上角 设置 → 通知:配好任务完成提醒",(0,M.jsx)("br",{}),"③ 设置 → 用量:随时查看余额与配额"]})]}),(0,M.jsx)("button",{type:"button",className:"mobile-welcomeClose",onClick:Na,children:"知道了"})]}),Ea,It!==void 0&&(0,M.jsx)(eO,{target:It,pinned:_e.includes(It.workspace.workspaceId),onClose:()=>{St(void 0)},onPinnedChange:()=>{Pr(It.workspace)},onRename:O=>{St(void 0),Gn(O)},onDelete:O=>{St(void 0),aa(O)},onPurge:O=>{St(void 0),Qt(O)},onMoveCategory:()=>{let O=It?.workspace;St(void 0),O!==void 0&&nt(O)}}),H&&(0,M.jsx)(ar,{title:"新建分类",initial:"",confirmLabel:"创建",onCancel:()=>{ne(!1)},onConfirm:O=>{ne(!1),ta(O)}}),be!==void 0&&(0,M.jsx)(tt,{title:P.find(O=>O.id===be)?.name??"分类",onClose:()=>{Ne(void 0)},children:(0,M.jsxs)("div",{role:"menu","aria-label":"分类操作",children:[(0,M.jsx)("button",{type:"button",role:"menuitem",className:"sheet-option",onClick:()=>{let O=P.find(U=>U.id===be);Ne(void 0),O!==void 0&&Ee(O)},children:(0,M.jsx)("span",{className:"sheet-option-copy",children:(0,M.jsx)("span",{className:"sheet-option-title",children:"重命名分类"})})}),(0,M.jsx)("button",{type:"button",role:"menuitem",className:"sheet-option",onClick:()=>{be!==void 0&&rn(be)},children:(0,M.jsx)("span",{className:"sheet-option-copy",children:(0,M.jsx)("span",{className:"sheet-option-title",style:{color:"var(--danger)"},children:"删除分类(工作区回到未分类)"})})})]})}),xe!==void 0&&(0,M.jsx)(ar,{title:"重命名分类",initial:xe.name,confirmLabel:"保存",onCancel:()=>{Ee(void 0)},onConfirm:O=>{lt(xe.id,O)}}),Ue!==void 0&&(0,M.jsx)(tt,{title:"移动到分类",onClose:()=>{nt(void 0)},children:(0,M.jsxs)("div",{role:"menu","aria-label":"移动到分类",children:[P.map(O=>(0,M.jsx)("button",{type:"button",role:"menuitem",className:"sheet-option",onClick:()=>{Yt(Ue.workspaceId,O.id),nt(void 0),W(`已移动到「${O.name}」`)},children:(0,M.jsx)("span",{className:"sheet-option-copy",children:(0,M.jsx)("span",{className:"sheet-option-title",children:O.name})})},O.id)),(0,M.jsx)("button",{type:"button",role:"menuitem",className:"sheet-option",onClick:()=>{Yt(Ue.workspaceId,void 0),nt(void 0),W("已移出分类")},children:(0,M.jsx)("span",{className:"sheet-option-copy",children:(0,M.jsx)("span",{className:"sheet-option-title",style:{color:"var(--text-tertiary)"},children:"未分类"})})}),P.length===0&&(0,M.jsx)("p",{className:"settings-note",children:"还没有分类,先点「新建分类」。"})]})}),na!==void 0&&(0,M.jsx)(ar,{title:"重命名工作区",initial:na.title,confirmLabel:"保存",busy:Sa,onCancel:()=>{Gn(void 0)},onConfirm:O=>{ra(na,O)}}),In!==void 0&&(0,M.jsx)(si,{title:"删除工作区",body:(0,M.jsxs)(M.Fragment,{children:["确定删除「",In.title,"」吗?目录、文件与会话记录都会保留,仅移除这里的工作区入口。"]}),confirmLabel:"删除",tone:"danger",busy:Sa,onCancel:()=>{aa(void 0)},onConfirm:()=>{Ta(In)}}),Xt!==void 0&&(0,M.jsx)(E4,{workspace:{workspaceId:Xt.workspaceId,title:Xt.title,path:Xt.path,sessionCount:(Xt.sessionIds??[]).length},onClose:()=>{Qt(void 0)},onDone:()=>{v(O=>O?.filter(U=>U.workspaceId!==Xt.workspaceId)??O),an(O=>m6(O,Xt.workspaceId)),Qt(void 0)}})]})}var vc=$(Xe(),1);var S6=/^\d{6}$/;function N6(e){let t=e.trim();if(t!==""){if(S6.test(t))return{code:t};try{let n=new URL(t),a=n.searchParams.get("pair");if(a===null||a==="")return;let r=n.searchParams.get("workspace");return{token:a,...r!==null&&r!==""?{workspaceId:r}:{}}}catch{return{token:t}}}}function jv(e){return e===void 0?"/m/":"/m/?workspace="+encodeURIComponent(e)}async function Vv(e,t=fetch){let n=new AbortController,a=setTimeout(()=>{n.abort()},15e3);try{let r=await t("/api/pair/accept",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(S6.test(e)?{code:e}:{token:e}),signal:n.signal});return r.ok?{ok:!0}:r.status===404?{ok:!1,message:"配对链接无效或已过期。"}:r.status===409?{ok:!1,message:"设备数已满:请先在桌面端「设备管理」移除一个设备后重试。"}:{ok:!1,message:"此设备无法使用该配对链接。"}}catch{return{ok:!1,message:"无法连接到配对服务。"}}finally{clearTimeout(a)}}async function T6(e,t=fetch){let n;try{n=new URL(e)}catch{return{kind:"none"}}let a=n.searchParams.get("pair"),r=n.searchParams.get("code");if((a===null||a==="")&&(r===null||r===""))return{kind:"none"};let i=n.searchParams.get("workspace"),o=jv(i===null||i===""?void 0:i),l=await Vv(r!==null&&r!==""?r:a??"",t);return l.ok?{kind:"accepted",path:o}:{kind:"failed",path:o,message:l.message}}var Ga=$(oe(),1);function C6(e){try{return new URL(e).origin}catch{return}}function E6({initialError:e,onPaired:t,navigate:n}){let[a,r]=(0,vc.useState)(window.location.origin),[i,o]=(0,vc.useState)(""),[s,l]=(0,vc.useState)(e),[d,c]=(0,vc.useState)(!1),v=n??(g=>{window.location.href=g}),m=async g=>{g.preventDefault();let w=N6(i);if(w===void 0){l("请输入有效的配对链接或配对码。");return}let x=C6(i.trim());if(x!==void 0&&x!==window.location.origin){v(i.trim());return}let C=C6(a.trim())??window.location.origin;if(C!==window.location.origin){let f=w.code!==void 0?w.code:w.token??"";v(`${C}/m/?${w.code!==void 0?"code":"pair"}=${encodeURIComponent(f)}`);return}c(!0),l(void 0);let h=await Vv(w.code??w.token??"");if(c(!1),!h.ok){l(h.message);return}t(jv(w.workspaceId))};return(0,Ga.jsx)("main",{className:"mobile mobile-pair","aria-labelledby":"mobile-pair-title",children:(0,Ga.jsxs)("form",{className:"mobile-pairCard",onSubmit:g=>{m(g)},children:[(0,Ga.jsx)("h1",{id:"mobile-pair-title",className:"mobile-title",children:"设备配对"}),(0,Ga.jsx)("p",{className:"mobile-muted",children:"扫描桌面端「设置 → 掌上 dsh」里的二维码即可自动配对;不方便扫码时,把面板里的配对链接复制到下面也可以。"}),(0,Ga.jsx)("label",{className:"mobile-pairLabel",htmlFor:"mobile-pair-server",children:"服务器地址"}),(0,Ga.jsx)("input",{id:"mobile-pair-server",className:"mobile-pairInput",value:a,onChange:g=>{r(g.target.value)},autoComplete:"off",autoCapitalize:"off",spellCheck:!1,inputMode:"url"}),(0,Ga.jsx)("label",{className:"mobile-pairLabel",htmlFor:"mobile-pair-link",children:"配对链接或配对码"}),(0,Ga.jsx)("input",{id:"mobile-pair-link",className:"mobile-pairInput",value:i,onChange:g=>{o(g.target.value)},autoComplete:"off",autoCapitalize:"off",spellCheck:!1}),s===void 0?null:(0,Ga.jsx)("p",{className:"mobile-error",role:"alert",children:s}),(0,Ga.jsx)("button",{className:"mobile-new mobile-pairSubmit",type:"submit",disabled:d,children:d?"正在配对":"配对"})]})})}var jt=$(oe(),1),Dp={workspaceId:"standalone",path:"",title:"未分组",sessionIds:[],createdAt:"",updatedAt:""};function nO(e){let t=new URLSearchParams(e).get("workspace");return t===null||t===""?void 0:t}function aO(e){let t=new URLSearchParams(e).get("session");return t===null||t===""?void 0:t}function rO(e){let t=new URLSearchParams(e).get("seq");if(t===null||t==="")return;let n=Number(t);return Number.isFinite(n)&&n>=0?n:void 0}function Iv(e){let t=e.projections?.values,n=t?.title,a=typeof n=="string"&&n!==""?n:e.cwd!==void 0?e.cwd.split("/").filter(Boolean).at(-1)??e.cwd:"新会话",r=t?.preview,i=t?.sessionStats,o=typeof i=="object"&&i!==null?i.turns:void 0;return{sessionId:e.sessionId,title:a,...typeof r=="string"&&r!==""?{preview:r}:{},...typeof o=="number"&&o>0?{turns:o}:{},...e.cwd!==void 0?{cwd:e.cwd}:{},updatedAt:e.updatedAt,running:e.running,blank:e.blank}}function zT(e){let t=new Date(e),n=`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`,a=new Date;if(t.toDateString()===a.toDateString())return n;let r=new Date(a);return r.setDate(a.getDate()-1),t.toDateString()===r.toDateString()?`昨天 ${n}`:`${String(t.getMonth()+1)}月${String(t.getDate())}日 ${n}`}function D4(e){let t=new Date(e),n=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0"),r=`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`,i=t.getFullYear();return i===new Date().getFullYear()?`${n}-${a} ${r}`:`${i}-${n}-${a} ${r}`}var M6={workspaces:0,"run-overview":1,sessions:1,settings:2,chat:2};function iO(){if(typeof navigator>"u")return"device";let e=typeof navigator.userAgent=="string"?navigator.userAgent:"";return/android/i.test(e)?"android":/ipad|iphone|ipod/i.test(e)?"ios":"device"}function oO(e){return e instanceof ya&&e.message==="HTTP 403"}function sO(e){return oO(e)?"unpaired":"unavailable"}function A6({initialPairError:e}){let[t,n]=(0,Se.useState)("checking");return(0,Se.useEffect)(()=>(l2(),o2(),WS(),aN({send:r=>{cS({kind:r.kind,message:r.message,...r.source===void 0?{}:{source:r.source},...r.frames===void 0?{}:{frames:r.frames},count:r.count,clientAt:r.at},iO())}})),[]),(0,Se.useEffect)(()=>{let a=!0;return Of().then(()=>{a&&n("paired")},r=>{a&&n(sO(r))}),()=>{a=!1}},[]),(0,Se.useEffect)(()=>{t==="unpaired"&&(Vb(),Gb())},[t]),t==="checking"?(0,jt.jsxs)("main",{className:"mobile mobile-empty",role:"status",children:[(0,jt.jsx)("span",{className:"boot-dot","aria-hidden":!0}),(0,jt.jsx)("p",{className:"mobile-muted",children:"正在连接..."})]}):t==="unpaired"?(0,jt.jsx)(E6,{initialError:e,onPaired:a=>{Vb(),Gb(),window.location.replace(a)}}):t==="unavailable"?(0,jt.jsxs)("main",{className:"mobile mobile-empty",children:[(0,jt.jsx)("p",{className:"mobile-error",role:"alert",children:"无法连接到运行中的 DSH host。"}),(0,jt.jsx)("button",{className:"mobile-new",type:"button",onClick:()=>{window.location.reload()},children:"重试"})]}):(0,jt.jsx)(cO,{onUnpaired:()=>n("unpaired")})}var lO=260,dO=3e4;function cO({onUnpaired:e}){let t=Gf(),[n,a]=(0,Se.useState)({current:{route:{kind:"workspaces"},forward:!0},leaving:void 0}),r=n.current.route,i=n.current.forward,o=(0,Se.useRef)(void 0),[s,l]=(0,Se.useState)(()=>nO(window.location.search)),[d,c]=(0,Se.useState)(()=>aO(window.location.search)),[v,m]=(0,Se.useState)(()=>rO(window.location.search)),g=(0,Se.useRef)(v),w=(0,Se.useRef)(void 0),x=(0,Se.useRef)(void 0),C=(0,Se.useRef)(void 0),h=(0,Se.useRef)({open:!1,term:""}),f=(0,Se.useRef)({open:!1,term:""}),[b,y]=(0,Se.useState)(void 0),N=(0,Se.useRef)({workspaceId:"",open:!1,term:""}),[P,_]=(0,Se.useState)(void 0),L=(0,Se.useRef)(!1),[E,H]=(0,Se.useState)(0),ne=(0,Se.useRef)(void 0),be=(0,Se.useRef)(()=>{}),Ne=(0,Se.useRef)(new Set),xe=(0,Se.useCallback)(()=>{let Z=ne.current;if(Z===void 0){H(Ne.current.size);return}let te=new Set(Z.runningSessionsSnapshot());for(let pe of Z.jobsSnapshot())pe.jobs.some(Le=>Le.status==="running"||Le.status==="stopping")&&te.add(pe.sessionId);for(let pe of Ne.current)te.add(pe);H(te.size)},[]),Ee=!0,Ue=!1;(0,Se.useEffect)(()=>()=>{o.current!==void 0&&clearTimeout(o.current)},[]);let nt=(0,Se.useCallback)(()=>{o.current!==void 0&&clearTimeout(o.current),o.current=window.setTimeout(()=>{a(Z=>({current:Z.current,leaving:void 0}))},lO)},[]),ke=(0,Se.useCallback)(Z=>{a(te=>{let pe=M6[Z.kind]>=M6[te.current.route.kind];return{current:{route:Z,forward:pe},leaving:te.current}}),nt()},[nt]);(0,Se.useEffect)(()=>{let Z=new jf(void 0,{onUnpaired:e});ne.current=Z,Z.start();let te=Z.onFrame(pe=>{if(pe.type==="session/jobs"||pe.type==="session/subscribed"){xe();return}if(pe.type==="session/event"){let Le=pe.event.type;(Le==="turn/start"||Le==="turn/end")&&xe()}});return xe(),()=>{te(),Z.stop()}},[e,xe]),(0,Se.useEffect)(()=>{if(r.kind!=="workspaces"||!t)return;let Z=!1,te,pe=()=>{uS().then(({sessionIds:Le})=>{Z||(Ne.current=new Set(Le),xe())},()=>{})};return pe(),te=setInterval(pe,3e4),()=>{Z=!0,te!==void 0&&clearInterval(te)}},[r.kind,xe,t]),(0,Se.useEffect)(()=>(t||Yd(),()=>{M2()}),[t]),(0,Se.useEffect)(()=>{ne.current?.observe(r.kind==="chat"?r.session.sessionId:void 0)},[r]),(0,Se.useEffect)(()=>{let Z=r.kind==="chat"?r.session.sessionId:void 0,te=()=>{pb(Z).catch(()=>{})};if(be.current=te,!t){pb(void 0).catch(()=>{});return}if(te(),Z===void 0)return;let pe=setInterval(te,dO);return()=>{clearInterval(pe)}},[r,t]),(0,Se.useEffect)(()=>{let Z=()=>{let te=ne.current;if(typeof document>"u"||document.visibilityState!=="visible"){te?.pause();return}te?.resync(),be.current()};return document.addEventListener("visibilitychange",Z),()=>{document.removeEventListener("visibilitychange",Z)}},[]),(0,Se.useEffect)(()=>{let Z=!1;return Af().then(te=>{if(Z)return;let pe=(te.namespaces??[]).find(at=>at.ns==="ui-theme")?.value,Le=typeof pe=="object"&&pe!==null?pe.preference:void 0;(Le==="light"||Le==="dark"||Le==="system")&&Yf(Le)},()=>{}),()=>{Z=!0}},[]);let ot=Z=>{let te=N.current;_(te.workspaceId===Z&&te.open?{open:!0,term:te.term}:void 0)},Ae=(0,Se.useCallback)(()=>{L.current?y({...f.current}):r.kind==="chat"&&r.workspace.workspaceId!==Dp.workspaceId&&ot(r.workspace.workspaceId),a(Z=>{let te=Z.current.route;return te.kind==="chat"?L.current?(L.current=!1,{current:{route:{kind:"workspaces"},forward:!1},leaving:Z.current}):te.fromRunOverview===!0?{current:{route:{kind:"run-overview"},forward:!1},leaving:Z.current}:te.workspace.workspaceId===Dp.workspaceId?{current:{route:{kind:"workspaces"},forward:!1},leaving:Z.current}:{current:{route:{kind:"sessions",workspace:te.workspace},forward:!1},leaving:Z.current}:te.kind==="run-overview"?{current:{route:{kind:"workspaces"},forward:!1},leaving:Z.current}:te.kind==="settings"?{current:{route:{kind:"workspaces"},forward:!1},leaving:Z.current}:te.kind==="sessions"?{current:{route:{kind:"workspaces"},forward:!1},leaving:Z.current}:Z}),nt()},[r,nt]),Ve=(0,Se.useCallback)((Z,te,pe,Le,at,_e)=>{ke({kind:"chat",session:Z,workspace:te,...pe!==void 0?{focusSeq:pe}:{},...at!==void 0?{focusMessageId:at}:{},..._e!==void 0?{focusPartId:_e}:{},...Le!==void 0?{focusQuery:Le}:{}}),c(void 0),m(void 0),pe!==void 0&&(g.current=void 0),Le!==void 0&&(w.current=void 0),at!==void 0&&(x.current=void 0),_e!==void 0&&(C.current=void 0)},[ke]),st=(0,Se.useCallback)(Z=>{if(s!==void 0||d!==void 0){let te=new URL(window.location.href);te.searchParams.delete("workspace"),te.searchParams.delete("session"),te.searchParams.delete("seq"),window.history.replaceState(null,"",`${te.pathname}${te.search}${te.hash}`),l(void 0)}ke({kind:"sessions",workspace:Z})},[s,d,ke]),Ge=(0,Se.useCallback)((Z,te,pe,Le,at,_e)=>{L.current=!0,f.current={...h.current},l(te),c(Z),m(pe),g.current=pe,w.current=Le,x.current=at,C.current=_e,ke({kind:"workspaces"})},[ke]),bt=(0,Se.useCallback)((Z,te,pe,Le,at)=>{L.current=!0,f.current={...h.current};let _e={sessionId:Z.sessionId,title:Z.title??"匹配会话",...Z.snippet!==void 0&&Z.snippet!==""?{preview:Z.snippet}:{},updatedAt:0,running:!1,blank:!1};ke({kind:"chat",session:_e,workspace:Dp,...te!==void 0?{focusSeq:te}:{},...Le!==void 0?{focusMessageId:Le}:{},...at!==void 0?{focusPartId:at}:{},...pe!==void 0?{focusQuery:pe}:{}})},[ke]),Fn=(0,Se.useCallback)(Z=>{let te={sessionId:Z.sessionId,title:Z.title??"会话",updatedAt:0,running:!1,blank:!1};ke({kind:"chat",session:te,workspace:Dp,fromRunOverview:!0})},[ke]),Et=r.kind==="chat"?`chat:${r.session.sessionId}`:r.kind==="sessions"?`sessions:${r.workspace.workspaceId}`:r.kind,ka=n.leaving!==void 0?n.leaving.route.kind==="chat"?`chat:${n.leaving.route.session.sessionId}`:n.leaving.route.kind==="sessions"?`sessions:${n.leaving.route.workspace.workspaceId}`:n.leaving.route.kind:"",Ot=i?"fwd":"back",gt=Z=>Z.kind==="workspaces"?(0,jt.jsx)(k6,{initialWorkspaceId:s,initialSearch:b,onPick:st,onOpenSettings:()=>{ke({kind:"settings"})},onLocateSession:Ge,onOpenDirect:bt,onOpenRunOverview:()=>{ke({kind:"run-overview"})},runOverviewLive:E,onSearchSnapshot:(te,pe)=>{h.current={open:te,term:pe}},onSearchApplied:()=>{y(void 0)}}):Z.kind==="run-overview"?(0,jt.jsx)(p4,{mux:ne.current,onBack:Ae,onOpenSession:Fn}):Z.kind==="sessions"?(0,jt.jsx)(L4,{workspace:Z.workspace,mux:ne.current,initialSessionId:d,initialSearch:P,onBack:Ae,onPick:te=>{Ve(te,Z.workspace,g.current,w.current,x.current,C.current)},onLocateSession:Ge,onPickSeq:(te,pe,Le,at,_e)=>{Ve(te,Z.workspace,pe,Le,at,_e)},onSearchSnapshot:(te,pe)=>{N.current={workspaceId:Z.workspace.workspaceId,open:te,term:pe}},onSearchApplied:()=>{_(void 0)}}):Z.kind==="settings"?(0,jt.jsx)(t6,{onBack:Ae}):(0,jt.jsx)(d4,{session:Z.session,initialFocusSeq:Z.focusSeq,initialFocusMessageId:Z.focusMessageId,initialFocusPartId:Z.focusPartId,initialFocusQuery:Z.focusQuery,mux:ne.current,onBack:Ae,showToolCalls:Ee,showSystemMessages:Ue});return(0,jt.jsxs)("div",{className:"mobile",children:[(0,jt.jsxs)("div",{className:"page-stage",children:[n.leaving!==void 0&&(0,jt.jsx)("div",{className:`page page-exit-${Ot}`,"aria-hidden":"true",children:gt(n.leaving.route)},ka),(0,jt.jsx)("div",{className:`page page-enter-${Ot}`,children:gt(r)},Et)]}),(0,jt.jsx)(sN,{})]})}function he(e){return e instanceof Do?e.error.message:e instanceof ya||e instanceof Error?e.message:String(e)}function rr(e){return/^HTTP 403/.test(e)?"宿主端插件可能仍在运行旧版本:请重启 dsh web 后再试。":void 0}function uO(e,t){let n=e.events.map(o=>({...o.event,...o.view!==void 0?{view:o.view}:{}})),a=new ri(Xi(n)),r=DS(n),i=US(n);return{rows:a.snapshot(),maxSeq:a.lastSeq,hasMore:e.hasMore,...r===void 0?{}:{todo:r},...t&&i!==void 0?{turnStartAt:i}:{},...e.projections===void 0?{}:{projections:e.projections}}}async function dc(e,t,n){let a=t===void 0,r;try{let i=await pS(e,t,void 0,n);r={rows:i.rows,maxSeq:i.maxSeq,hasMore:i.hasMore,...i.todo===void 0?{}:{todo:i.todo},...i.projections===void 0?{}:{projections:i.projections},...a&&i.turnStartAt!==void 0?{turnStartAt:i.turnStartAt}:{}}}catch{r=uO(await ai(e,t,void 0,n),a)}return a&&nN(e,r),r}var I6=$(Xe(),1);var ao=$(oe(),1),Pp=class e extends I6.Component{state={reason:null};static getDerivedStateFromError(t){return{reason:e.readable(t)}}static readable(t){let a=(O6(t)&&t.message!==""?t.message:String(t??"unknown error")).replace(/\s+/g," ").trim();return a.length<=240?a:`${a.slice(0,239)}…`}componentDidCatch(t,n){qd({kind:"error",message:this.state.reason??"unknown error",stack:O6(t)?t.stack:void 0})}retry=()=>{this.setState({reason:null})};reload=()=>{typeof window<"u"&&window.location.reload()};render(){let t=this.state.reason;return t===null?this.props.children:(0,ao.jsxs)("main",{className:"mobile mobile-empty mobile-errorpage",role:"alert",children:[(0,ao.jsx)("h1",{className:"errorpage-title",children:"页面出错了"}),(0,ao.jsx)("p",{className:"errorpage-reason",children:t}),(0,ao.jsxs)("div",{className:"errorpage-actions",children:[(0,ao.jsx)("button",{type:"button",className:"mobile-button",onClick:this.retry,children:"重试"}),(0,ao.jsx)("button",{type:"button",className:"mobile-button-muted",onClick:this.reload,children:"重新加载"})]})]})}};function O6(e){return e instanceof Error}var Gv={"bg-page":"#f4f5fb","bg-surface":"#ffffff","bg-elevated":"#eef0f8","bg-input":"#ffffff","dialog-bg":"#ffffff","toast-bg":"#16162a","toast-text":"#ffffff","text-primary":"#16162a","text-secondary":"#4b4b63","text-tertiary":"#6f6f8a","text-quaternary":"#9a9ab0","text-muted":"#b8b8c8","border-default":"#e4e5ef","border-subtle":"#edeef5","border-focus":"#6d5efc",accent:"#6d5efc","accent-contrast":"#ffffff","accent-soft":"rgba(109, 94, 252, 0.12)","accent-glow":"rgba(109, 94, 252, 0.28)",positive:"#22c55e",warning:"#f59e0b",danger:"#ef4444","danger-soft":"rgba(239, 68, 68, 0.1)","card-bg":"#ffffff","card-border":"rgba(24, 24, 40, 0.045)","card-shadow":"0 6px 20px rgba(76, 84, 150, 0.1), 0 1px 2px rgba(76, 84, 150, 0.06)","shadow-lg":"0 18px 44px rgba(24, 24, 40, 0.18)",fill:"rgba(24, 24, 40, 0.04)","fill-strong":"rgba(24, 24, 40, 0.075)","code-bg":"#e8ecf2","code-text":"#3a3f52","code-border":"#d0d7de","code-head-bg":"#dfe4ec","code-head-border":"#d0d7de","tok-keyword":"#a626a4","tok-string":"#50a14f","tok-comment":"#a0a1a7","tok-number":"#986801","tok-type":"#e45649","tok-func":"#4078f2","tok-prop":"#986801","diff-add":"#22c55e","diff-del":"#ef4444","diff-add-bg":"rgba(34, 197, 94, 0.12)","diff-del-bg":"rgba(239, 68, 68, 0.12)","diff-add-word":"rgba(34, 197, 94, 0.22)","diff-del-word":"rgba(239, 68, 68, 0.22)",backdrop:"rgba(15, 18, 34, 0.45)","header-bg":"rgba(244, 245, 251, 0.84)","glass-bg":"rgba(255, 255, 255, 0.72)","glass-border":"rgba(24, 24, 40, 0.06)","bg-glow":"radial-gradient(680px 260px at 78% -8%, rgba(109, 94, 252, 0.12), transparent 62%), radial-gradient(520px 220px at -8% 2%, rgba(236, 72, 153, 0.075), transparent 58%)"},_6={"bg-page":"#0b0b12","bg-surface":"#16161f","bg-elevated":"#1d1d29","bg-input":"#16161f","dialog-bg":"#1c1c28","toast-bg":"#2a2a3a","toast-text":"#f0f0f5","text-primary":"#f0f0f5","text-secondary":"#a5a5ba","text-tertiary":"#70708a","text-quaternary":"#5a5a72","text-muted":"#40405a","border-default":"#26263a","border-subtle":"#1e1e2c","border-focus":"#4b3fd6",accent:"#6d5efc","accent-contrast":"#ffffff","accent-soft":"rgba(109, 94, 252, 0.16)","accent-glow":"rgba(109, 94, 252, 0.34)",positive:"#4ade80",warning:"#fbbf24",danger:"#f87171","danger-soft":"rgba(248, 113, 113, 0.14)","card-bg":"#16161f","card-border":"rgba(255, 255, 255, 0.05)","card-shadow":"0 8px 26px rgba(0, 0, 0, 0.45)","shadow-lg":"0 22px 56px rgba(0, 0, 0, 0.6)",fill:"rgba(255, 255, 255, 0.05)","fill-strong":"rgba(255, 255, 255, 0.085)","code-bg":"#161b22","code-text":"#b8bad0","code-border":"#30363d","code-head-bg":"#1c2128","code-head-border":"#30363d","tok-keyword":"#c678dd","tok-string":"#98c379","tok-comment":"#5c6370","tok-number":"#d19a66","tok-type":"#e5c07b","tok-func":"#61afef","tok-prop":"#d19a66","diff-add":"#4ade80","diff-del":"#f87171","diff-add-bg":"rgba(74, 222, 128, 0.1)","diff-del-bg":"rgba(248, 113, 113, 0.1)","diff-add-word":"rgba(74, 222, 128, 0.25)","diff-del-word":"rgba(248, 113, 113, 0.25)",backdrop:"rgba(0, 0, 0, 0.6)","header-bg":"rgba(11, 11, 18, 0.82)","glass-bg":"rgba(22, 22, 31, 0.66)","glass-border":"rgba(255, 255, 255, 0.07)","bg-glow":"radial-gradient(680px 260px at 78% -8%, rgba(109, 94, 252, 0.16), transparent 62%), radial-gradient(520px 220px at -8% 2%, rgba(236, 72, 153, 0.07), transparent 58%)"},pl={chip:12,card:18,sheet:28,menu:16,capsule:999,full:9999},Xo={1:4,2:8,3:12,4:16,5:20,6:24,8:32},yc={xs:11,sm:12,md:13,base:15,lg:17},gP={card:Gv["card-shadow"],float:Gv["shadow-lg"]},L6={blur:16,saturate:1.4},D6={card:72,tool:34},fO="-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'PingFang SC', 'Noto Sans SC', 'Segoe UI', sans-serif",pO="'SF Mono', 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace";function Fv(e){return Object.entries(e).map(([t,n])=>` --${t}: ${n};`).join(`
948
948
  `)}var mO=` --font-sans: ${fO};
949
949
  --font-mono: ${pO};
950
950
  --radius-chip: ${pl.chip}px;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-mobile-web",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "掌上 dsh —— DSH 的手机端完整聊天界面:6 位码配对、设备信任、工作区/会话/聊天、SSE 实时流,可经局域网或公网反代访问。",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -76,5 +76,6 @@
76
76
  },
77
77
  "scripts": {
78
78
  "smoke": "node test/smoke.mjs"
79
- }
79
+ },
80
+ "icon": "./assets/icon.svg"
80
81
  }