# AI agent手机监控
**Repository Path**: hades00/mobile_monitor
## Basic Information
- **Project Name**: AI agent手机监控
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2026-04-29
- **Last Updated**: 2026-05-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Mobile Monitor
> 把桌面 AI Agent 的"思考与工具调用"实时投到你手机上,并在高危操作前远程审批。
**Mobile Monitor** 是一套 **桌面端 ↔ 移动端** 的实时监控与控制系统:桌面端运行基于 OpenCode SDK 的 AI Agent,移动端通过 WebSocket 订阅推理事件流,看 Agent 在做什么、给它发指令、远程批准它请求的高危工具权限。
```
┌──────────────────┐ LAN / Relay ┌──────────────────┐
│ Desktop (Host) │ ◀──────────────▶ │ Mobile (Client) │
│ OpenCode Agent │ thinking / tool │ Flutter App │
│ + Auth + WS Hub │ permission_req │ Riverpod + WS │
└──────────────────┘ └──────────────────┘
```
---
## 核心能力
- **实时事件流**:thinking / message / tool_call / session 状态,端到端 P95 延迟 LAN < 50ms、中继 < 200ms
- **远程权限审批**:Agent 调用高危工具时,手机弹出操作栏,选择 仅一次 / 本次会话 / 永久
- **远程发起任务**:移动端发 prompt 与快捷命令(`/plan` `/build` `/init` `/revert`)
- **断线 resume**:基于 seq 的环形缓冲,弱网切网后无丢消息
- **零信任配对**:7 位配对码 + 桌面端二次确认,30 天 RefreshToken 旋转,单设备可一键吊销
- **隐私优先**:中继不解密业务报文;事件默认本机存储;30 天可配置保留期
---
## 5 分钟快速上手
### 1. 启动后端
```bash
cd backend
npm install
npm run dev # http://localhost:7443
open http://localhost:7443/docs # Swagger UI
```
**环境变量(常用)**
| 变量 | 说明 |
| ---- | ---- |
| `OPENCODE_MODE` | `mock`(默认,可跑通事件流+权限)或 `real` + 适配模块 |
| `OPENCODE_MODULE` | 动态 `import()` 的适配包路径,导出 `createOpencodeRealHandler` |
| `NETWORK_MODE` | `lan` / `relay` / `both`;非 `lan` 且配置 `RELAY_URL`+`RELAY_TOKEN` 时桌面会反向连 relay |
| `RELAY_URL` | 如 `ws://VPS:8787`(与 relay 服务同端口) |
| `RELAY_TOKEN` | 与 relay 进程 `RELAY_TOKEN` 相同 |
| `RELAY_DEVICE_ID` | 配对后设备的 UUID;不填则取库中首个 active 设备 |
| `JWT_SECRET` | 生产务必固定,否则重启后 token 全部失效 |
### 2. 生成配对码
```bash
curl -X POST http://localhost:7443/api/admin/pair-code
# => { "pair_code": "1234567", "expires_in": 120 }
```
### 3. 启动移动端
```bash
cd mobile
flutter pub get
flutter run --dart-define=API_BASE_URL=http://10.0.2.2:7443/api
# 或 mock 模式(无需后端):
flutter run --dart-define=USE_MOCK=true
```
输入服务器地址 + 配对码,桌面端确认"允许接入" → 进入监控页。
> 完整流程图与最小验证脚本:[`docs/guides/user-quickstart.md`](./docs/guides/user-quickstart.md)
---
## 系统架构
```mermaid
flowchart LR
subgraph Desktop["Desktop (Host)"]
SDK[OpenCode SDK
Agent]
WS[WS Hub
:7443 TLS]
Auth[Auth + Pair]
DB[(SQLite
WAL)]
SDK --> WS
Auth --> DB
WS --> DB
end
subgraph Cloud["Relay (Optional)"]
Relay[WSS Relay
不解密报文]
Redis[(Redis Pub/Sub)]
Relay --> Redis
end
subgraph Mobile["Mobile (Client)"]
App[Flutter App
Riverpod + go_router]
RT[RealtimeClient
seq + resume]
App --> RT
end
Desktop -- "WSS LAN (mDNS)" --> Mobile
Desktop -. "WSS fallback" .-> Relay
Mobile -. "WSS fallback" .-> Relay
```
**网络选路**:默认 LAN 直连(mDNS 发现),不可达自动回退中继;视频流在 v1.2 接入 WebRTC P2P。
**协议**:单连 WS 上承载控制信令 + 事件流,单调 seq + 累积 ACK + 环形缓冲实现 resume。
详细设计:[`docs/architecture/`](./docs/architecture/)
---
## 仓库结构
```
mobile_monitor/
├── backend/ 桌面端后端:Fastify + WS + SQLite
│ ├── src/{routes,ws,store,plugins}
│ ├── migrations/ 生产 schema (001_init.sql)
│ └── test/ smoke test
├── mobile/ Flutter 应用
│ └── lib/
│ ├── core/ config/network/websocket/router/storage
│ ├── features/ auth, control, monitor, sessions, settings
│ ├── shared/ 通用组件 + 主题
│ └── mock/ USE_MOCK=true 时启用
├── tests/mock-server/ 桩 server(弱网/断线场景)
└── docs/ 全部文档
```
---
## 文档地图
| 你是…… | 推荐入口 |
| ------ | -------- |
| 第一次用 | [快速上手](./docs/guides/user-quickstart.md) → [完整使用手册](./docs/guides/user-manual.md) |
| 要部署到外网 / HTTPS | [部署指南](./docs/guides/deployment.md) |
| 后端 / 移动端开发者 | [开发环境搭建](./docs/guides/dev-setup.md) → [贡献指南](./docs/guides/contributing.md) |
| 想看协议 / 架构 | [系统架构总览](./docs/architecture/overview.md) → [WS 协议](./docs/architecture/05-websocket-protocol.md) → [认证设计](./docs/architecture/16-auth-design.md) |
| 后端集成 | [OpenAPI 3.1](./docs/api/openapi.yaml) · Swagger UI `/docs` |
| 出问题了 | [开发者排查](./docs/guides/troubleshooting.md) · [使用故障排查](./docs/troubleshooting.md) |
完整文档索引见 [`docs/README.md`](./docs/README.md)。
---
## 技术栈
| 端 | 选型 |
| -- | ---- |
| 后端 | Node.js 20 LTS · Fastify 4 · `@fastify/jwt` · `@fastify/websocket` · SQLite 3.45(WAL/FTS5/JSON1) |
| 移动端 | Flutter 3.22 · Dart 3.4 · Riverpod 2.5 · go_router 14 · dio 5 · web_socket_channel 3 · Hive · flutter_secure_storage |
| 中继(可选) | 见 [`relay/`](./relay/) · Node `ws` 透传 + `GET /health`(Redis 为后续横向扩展) |
| 测试 | node:test + Testcontainers · flutter_test + mocktail · integration_test + Patrol |
选型依据见 [`docs/mobile-tech-stack-decision.md`](./docs/mobile-tech-stack-decision.md)。
---
## 项目状态
当前版本 **v0.1.0-draft**。详见 [`CHANGELOG.md`](./CHANGELOG.md)。
| 模块 | 状态 |
| ---- | ---- |
| 设计文档(认证 / 网络 / WS 协议 / 持久化) | ✅ |
| OpenAPI 3.1 + SQL migration | ✅ |
| RESTful API(pair / auth / sessions / commands) | ✅ |
| WebSocket 实时通道 + OpenCode mock 桥 | ✅ 桌面侧 |
| OpenCode 真实 SDK | 🔧 设置 `OPENCODE_MODE=real` 与 `OPENCODE_MODULE` 适配器 |
| 移动端:技术栈 + 共享组件 + Mock | ✅ |
| 移动端:配对 / 监控 / 控制 / 会话列表 / 设置 页面 | 🚧 部分完成 |
| 自动化测试 / 性能稳定性测试 | 🚧 准备中 |
| 中继服务(MVP 透传) | ✅ [`relay/`](./relay/) |
| WebRTC P2P 视频流 | ⏳ v1.2 |
---
## 贡献
欢迎提 PR!请先读 [`docs/guides/contributing.md`](./docs/guides/contributing.md)(详细版本)了解:
- 分支与 Conventional Commits 规范
- PR 模板与 Code Review 标准
- 协议 / Schema 变更的同步要求
安全漏洞请勿在公开 Issue 提交,发邮件至 `security@example.com`。
---
## License
MIT — 详见 [`LICENSE`](./LICENSE)。