pi2web 0.2.0 → 0.2.1

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.
@@ -1,256 +0,0 @@
1
- # Remote Pi Android App 功能说明
2
-
3
- > 本文描述当前仓库中 `android/` 原生客户端已经实现的功能、交互方式、数据安全设计、协议依赖和已知边界。
4
-
5
- ## 1. 定位和架构
6
-
7
- Android App 是 Remote Pi Server 的原生客户端,不在手机上运行 Agent,也不直接访问开发主机文件系统。Agent、模型调用、工具执行和 Pi session 都运行并保存在 Remote Pi Server 所在机器。
8
-
9
- ```text
10
- Android App
11
- ├── HTTP/JSON:认证、Workspace、文件、Agent、Session 和设置
12
- ├── WebSocket:流式事件、断线恢复和任务完成监听
13
- └── Android Notification:Agent 完成提醒
14
- │
15
- ▼
16
- Remote Pi Server → Pi SDK → LLM / 本地工具 / Session 文件
17
- ```
18
-
19
- 最低系统版本为 Android 8.0(API 26)。Debug 构建允许 HTTP,Release 构建只接受 HTTPS,WebSocket 由 OkHttp 自动升级为 WS/WSS。
20
-
21
- ## 2. Server 管理和认证
22
-
23
- - 可以保存多个 Remote Pi Server。
24
- - Server 配置包括显示名称、Base URL 和 Access Token。
25
- - 登录时调用认证接口并读取 `/api/v1/system/status`。
26
- - App 只接受 protocol version 1,不兼容时显示明确错误。
27
- - 支持编辑、删除和切换 Server。
28
- - Android 13 及以上首次启动会请求通知权限。
29
-
30
- Access Token 不保存在普通 Profile 中。App 使用 Android Keystore 中不可导出的 AES 密钥,以 AES-GCM 加密 Token 后保存到独立 SharedPreferences;该文件排除于 Android Backup。Token 不写入 URL 和应用日志。
31
-
32
- ## 3. Workspace 和文件浏览
33
-
34
- 主页可以:
35
-
36
- - 添加 Workspace,填写 Remote 主机上的名称和绝对路径。
37
- - 查看 Workspace 列表和根路径。
38
- - 进入任意 Workspace 浏览目录。
39
- - 返回上级目录。
40
- - 分页读取文本文件,避免一次载入大文件。
41
- - 对二进制文件显示不可预览提示。
42
- - 从 Workspace 根目录或当前浏览目录创建 Agent。
43
-
44
- 所有路径安全校验由 Server 执行,包括路径穿越和符号链接逃逸检查。
45
-
46
- ## 4. Agent 管理
47
-
48
- 主页显示当前 Server 上的 Agent:
49
-
50
- - Session 有名称时优先显示名称,否则显示 Agent ID。
51
- - 显示 Agent ID、运行状态和 cwd。
52
- - 支持创建、打开和停止 Agent。
53
- - 创建时可选择 Workspace、cwd、新 Session 或已有 Session。
54
- - 多 Workspace 场景会先显示 Workspace 选择器。
55
-
56
- Agent 状态包括 idle、streaming、error 和 stopped 等。
57
-
58
- ## 5. Session 功能
59
-
60
- 当前支持:
61
-
62
- - 创建新 Session。
63
- - 列出并恢复 cwd 对应的历史 Session。
64
- - 给 Session 命名。
65
- - 随时修改 Session 名称。
66
- - Session 名称持久化到 Pi session,并显示在对话标题和 Agent 列表。
67
- - 查看 Session tree 条目。
68
- - Navigate 到指定 tree entry。
69
- - Fork / Revert。
70
- - Compact。
71
-
72
- ### Revert 行为
73
-
74
- 对话页工具栏的 Undo 按钮对应 Pi CLI 双击 Escape 在 `doubleEscapeAction=fork` 时打开的用户消息选择器:
75
-
76
- 1. App 显示当前 Session 中的历史用户消息,最近消息在前。
77
- 2. 选择一条消息后,Server 从该用户消息之前的父节点创建新 Session。
78
- 3. 原 Session 不被修改。
79
- 4. 新 Agent 打开 fork 后的 Session。
80
- 5. 被选择的用户消息自动放回输入框,用户可以修改后重新发送。
81
-
82
- 这与普通 tree navigation 不同:Revert 会创建新的 Session 分支,不覆盖原历史。
83
-
84
- ## 6. 对话和实时事件
85
-
86
- 进入 Agent 后,App 先通过 HTTP 加载历史消息和 Session 状态,再通过 WebSocket 订阅实时事件。
87
-
88
- 支持显示:
89
-
90
- - 用户消息。
91
- - Assistant 文本增量。
92
- - Thinking 增量。
93
- - Tool execution start/end。
94
- - Tool 参数和完成状态。
95
- - Retry 和系统状态。
96
- - Extension notify/status/widget/title。
97
-
98
- 支持发送:
99
-
100
- - prompt。
101
- - steer。
102
- - follow-up。
103
- - abort。
104
-
105
- 长时间 prompt 使用不设置 read timeout 的独立 OkHttp Client,避免 Agent 正常运行超过 30 秒时出现错误弹窗。普通 API 仍保留网络超时。
106
-
107
- ### 折叠卡片
108
-
109
- 对话中的每个消息或事件块默认折叠:
110
-
111
- - Tool 折叠后显示工具/操作名称。
112
- - Thinking 折叠后显示 `Thinking`。
113
- - 系统事件显示标题或第一行。
114
- - 用户和 Assistant 消息显示前 60 个字符。
115
- - 点击卡片可展开完整内容,再次点击折叠。
116
- - 展开状态通过 Compose saveable state 保留,屏幕旋转时不会立即丢失。
117
-
118
- ## 7. `@` 文件和目录引用
119
-
120
- 在输入框输入 `@` 会在输入框上方打开路径选择器:
121
-
122
- - 初始位置是 Agent cwd。
123
- - 显示当前目录中的文件和子目录。
124
- - 点击目录进入目录。
125
- - 可以引用当前目录或子目录。
126
- - 点击文件直接插入引用。
127
- - 可以返回上级目录,最高到 Workspace 根目录。
128
- - 可以随时取消。
129
- - cwd 内目标生成相对路径。
130
- - cwd 外但 Workspace 内目标生成绝对路径。
131
- - 含空格的路径自动加双引号。
132
-
133
- 例如:
134
-
135
- ```text
136
- @src/Main.kt
137
- @"docs/design notes.md"
138
- @/repo/shared/config.json
139
- ```
140
-
141
- ## 8. WebSocket 恢复
142
-
143
- 每个 Agent 事件包含 eventId、递增 sequence 和 Unix 秒级 timestamp。
144
-
145
- 客户端会:
146
-
147
- - 持久化每个 Agent 的最后 sequence。
148
- - 丢弃重复 sequence。
149
- - 检测 sequence gap。
150
- - 按 1、2、4、8、15、30 秒指数退避重连。
151
- - 缓存仍存在时请求增量 replay。
152
- - 缓存不足时接收 `agent_snapshot`,恢复完整 state/messages。
153
- - snapshot 不可用时重新请求 HTTP messages。
154
-
155
- 切换 Agent 会关闭旧对话订阅,避免不同 Agent 的事件混入。
156
-
157
- ## 9. 完成通知
158
-
159
- App 为当前连接的 Server 维护一个独立、多 Agent WebSocket 连接。即使用户正在查看另一个 Agent,也会订阅该 Server 上所有已知 Agent 的完成事件。
160
-
161
- 当 Agent 发出 `agent_end` 并转为空闲状态时:
162
-
163
- - Android 创建“Agent 完成”系统通知。
164
- - 通知标题使用 Session 标识。
165
- - Server 事件携带 Unix 秒级时间戳。
166
- - Android 使用设备当前时区转换成本地时间。
167
- - 通知同时显示本地时间和原始 Unix 时间戳。
168
- - 通知 `when` 使用事件真实发生时间,而不是手机收到通知的时间。
169
- - 每个 Agent 保存独立通知 sequence,重连时补收事件并避免重复通知。
170
- - 首次订阅使用 `fromNow`,不会把缓存中的旧完成事件全部重新通知。
171
-
172
- 示例:
173
-
174
- ```text
175
- Session 已转为空闲状态
176
- 本地时间:2026-07-18 22:20:00 CST
177
- Unix 时间戳:1784370000
178
- ```
179
-
180
- 当前通知依赖 App 进程中的 WebSocket。App 退到后台后,系统通常仍可在一段时间内保持连接;如果进程被系统彻底终止,则无法保证实时通知。需要进程被杀后仍可靠送达时,应按计划增加 Server 设备注册接口和 FCM/UnifiedPush,而不是依赖永久后台 WebSocket。
181
-
182
- ## 10. Extension UI
183
-
184
- Pi Extension UI 请求可映射为 Compose 组件:
185
-
186
- - select:选择对话框。
187
- - confirm:确认对话框。
188
- - input:单行输入。
189
- - editor:多行输入。
190
- - notify:对话系统事件。
191
- - setStatus:页面状态。
192
- - setWidget:对话顶部 Widget。
193
- - setTitle:页面标题。
194
- - extension response:把用户结果返回 Server。
195
-
196
- 自定义 TUI Component 无法直接在 Android 渲染,Server 会返回不支持错误。
197
-
198
- ## 11. Model 和 Thinking
199
-
200
- Agent 控制对话框支持:
201
-
202
- - 查询当前模型。
203
- - 查看当前 Provider 可用模型。
204
- - 切换模型。
205
- - 查询当前 thinking level。
206
- - 查看模型支持的 thinking levels。
207
- - 修改 thinking level。
208
-
209
- 模型凭据仍由 Server 复用 Pi CLI 配置,Android 不存储 Provider API Key。
210
-
211
- ## 12. 本地数据
212
-
213
- 当前本地持久化内容:
214
-
215
- - Server Profile 非敏感信息。
216
- - Keystore 加密后的 Token。
217
- - 当前选择的 Server。
218
- - 对话 WebSocket sequence cursor。
219
- - 通知 WebSocket sequence cursor。
220
-
221
- 完整消息和 Session 不复制到 Android 数据库;Server/Pi session 文件是唯一事实来源。
222
-
223
- ## 13. 测试和构建
224
-
225
- Server:
226
-
227
- ```bash
228
- npm run check
229
- npm test
230
- ```
231
-
232
- Android:
233
-
234
- ```bash
235
- cd android
236
- ./gradlew testDebugUnitTest assembleDebug assembleRelease
237
- ```
238
-
239
- 测试覆盖认证和协议解析、Workspace、安全路径、Agent 生命周期、Session 命名、fork/revert 管理、事件 sequence、snapshot、fromNow、Unix 时间转换、`@` 路径计算、折叠标题、长任务超时策略及 HTTP 错误映射。
240
-
241
- 构建产物:
242
-
243
- ```text
244
- android/app/build/outputs/apk/debug/app-debug.apk
245
- android/app/build/outputs/apk/release/app-release-unsigned.apk
246
- ```
247
-
248
- ## 14. 当前边界
249
-
250
- - 单机、单用户和单 Access Token。
251
- - Release 默认要求 HTTPS/WSS。
252
- - 文件 API 只读;Agent 本身仍可通过 Pi 工具修改文件。
253
- - 没有内置终端模拟器。
254
- - 没有 FCM,因此进程被系统杀死后不保证通知。
255
- - 没有多用户 RBAC。
256
- - 没有把 Pi 自定义 TUI Component 自动转换成 Compose 的通用方案。