Initialize LineUp app server

This commit is contained in:
2026-08-07 13:36:56 +08:00
commit d6f6a92bab
24 changed files with 2184 additions and 0 deletions
+333
View File
@@ -0,0 +1,333 @@
# LineUp App Server — 项目设计文档
> 版本:0.1(提案)
> 日期:2026-07-30
> 状态:待确认
> 目标:精简的蓝牙应用服务端,帮助用户与远端 Agent 服务建立连接,实现互相通信
---
## 1. 项目定位
### 1.1 与唐僧叨叨的关系
唐僧叨叨是一个完整的 IM 业务系统(用户/群组/文件/朋友圈/工作台/推送...),模块众多、功能庞大。LineUp App Server 不是唐僧叨叨的副本,而是:
```
唐僧叨叨:消费级 IM 全栈(群聊、朋友圈、文件、搜索...)
LineUp App Server:只做两件事 ——
① 用户认证身份 → 接入通讯网络
② 消息路由 → 连接用户与 Agent
```
**所以我们不是在唐僧叨叨上改,而是从它那里取经:**
- 复用它的 WuKongIM 集成模式(怎么调用 API、怎么写 Webhook
- 复用它的 HTTP 路由注册方式(gin 框架 + module 自注册)
- 复用它的 Webhook 消息处理逻辑(msg.notify、msg.offline 等事件)
- 丢弃所有跟业务无关的模块(群聊、文件、推送、朋友圈...)
### 1.2 LineUp App Server 的定义
> LineUp App Server 是一个轻量级的**通讯网关**。
> 它的唯一职责是:让一个通过蓝牙/WiFi 连接的移动客户端,能够接入 WuKongIM 3.0 通讯网络,并与远端的 Agent 服务进行消息交换。
**它不是什么:**
- 不是社交平台(不处理好友、朋友圈、群聊)
- 不是文件存储(不处理文件上传/下载)
- 不是推送网关(不处理 APNS/HMS/Mi Push
- 不是管理后台(不处理统计、审核、工作台)
- 不是机器人平台(不处理自定义机器人接入)
---
## 2. 核心概念
### 2.1 三种参与者
```
┌──────────┐ ┌─────────────────┐ ┌──────────┐
│ 用户 Client │ ◄─► │ LineUp App Server │ ◄─► │ Agent 服务 │
│ (手机 App) │ │ (通讯网关) │ │ (远端 LLM) │
└──────────┘ └────────┬────────┘ └──────────┘
┌──────▼──────┐
│ WuKongIM 3.0 │
│ (消息管道) │
└──────────────┘
```
- **用户 Client**:运行在手机上的 App,通过蓝牙/WiFi 与 App Server 通信
- **Agent 服务**:远端的 AI Agent(如 Hermes),有自己的 WuKongIM 客户端连接
- **WuKongIM 3.0**:消息传输管道,负责可靠投递
- **LineUp App Server**:通讯网关,负责身份认证 + 消息路由
### 2.2 消息流转模型
```
用户发送消息 "帮我查天气"
① Client → App Server
用户 App 通过 HTTP/WS 发送消息到 App Server
② App Server → WuKongIM
App Server 调用 WuKongIM API 将消息投递到 Agent 所在的频道
③ WuKongIM → Agent Service
WuKongIM 将消息推送到 Agent 的 WebSocket 连接
④ Agent Service 处理
Agent 处理请求(可能调用外部工具)
⑤ Agent Service → WuKongIM
Agent 回复消息,发送到 WuKongIM
⑥ WuKongIM → App Server (Webhook)
WuKongIM 通过 Webhook 通知 App Server 有新消息
⑦ App Server → Client
App Server 将消息推送给用户 Client
```
---
## 3. 通信协议分层
```
┌─────────────────────────────────────────┐
│ LineUp 自定义消息协议 │ ← 业务层
│ (text, choice, progress, canvas...) │
├─────────────────────────────────────────┤
│ 唐僧叨叨消息模型 │ ← 适配层
│ (Message, Channel, Conversation) │
├──────────────────┬──────────────────────┤
│ WKProto WebSocket│ HTTP API + Webhook │ ← WuKongIM 3.0
│ (双向实时, 15200) │ (管理面, 15001) │
│ │ (通知面, callback) │
└──────────────────┴──────────────────────┘
```
**WuKongIM 3.0 的三层能力:**
| 层 | 协议 | 端口 | 方向 | 用途 |
|---|---|---|---|---|
| **数据面** | WKProto WebSocket / TCP | 15200 / 15100 | **双向全双工** | 客户端收发消息 |
| **管理面** | HTTP REST API | 15001 | App Server → WK | 用户/频道/消息管理 |
| **通知面** | HTTP Webhook | Callback | WK → App Server | 事件通知(新消息/离线/在线) |
> 客户端直连 WuKongIM 的 WebSocket (15200),所有实时消息都在这个管道里跑。
> App Server 只做两件事: ① 通过 HTTP API 做管理; ② 通过 Webhook 接收事件推送给 Client。
---
## 4. 架构设计
### 4.1 服务端口
```
LineUp App Server:
- HTTP API: :8090 (客户端 REST API)
- WebSocket: :8090/ws (客户端实时推送)
- Webhook: :8090/v1/webhook (接收 WuKongIM 回调)
WuKongIM 3.0: (已部署)
- API: :15001 (管理 API: /route, /channel, /message/send...)
- TCP: :15100 (WKProto TCP)
- WebSocket: :15200 (WKProto WebSocket)
- Manager: :15301 (管理后台)
```
### 4.2 模块划分
```
lineup-app-server/
├── main.go # 入口:加载配置 → 注册模块 → 启动 HTTP
├── go.mod / go.sum
├── configs/
│ └── lineup.yaml # 配置:WuKongIM 地址、Token、端口
├── internal/
│ ├── app.go # App 生命周期:Init → Start → Stop
│ ├── config.go # 配置结构体
│ └── db.go # 数据库(轻量,仅存储用户/Token)
└── modules/
├── user/ # 用户模块:登录/注册/Token管理
│ ├── module.go # → 模块自注册
│ ├── api.go # → REST: POST /login, POST /register
│ ├── db.go # → 用户数据存储
│ └── service.go # → 业务逻辑
├── channel/ # 频道模块:创建Agent对话频道
│ ├── module.go
│ ├── api.go # → REST: POST /channels, GET /channels
│ └── service.go # → 调用 WuKongIM Channel API
├── message/ # 消息模块:收发消息
│ ├── module.go
│ ├── api.go # → REST: POST /messages, GET /messages/sync
│ └── service.go # → 调用 WuKongIM Message API
├── webhook/ # Webhook模块:接收WuKongIM回调
│ ├── module.go
│ ├── handler.go # → HTTP: POST /v1/webhook
│ └── event.go # → 事件分发:msg.notify → 推送Client
└── client/ # 客户端连接模块(蓝牙/WS网关)
├── module.go
├── ws.go # → WebSocket: /ws (向Client实时推送)
└── push.go # → 消息推送:把WuKongIM消息推给客户端
```
**只有 6 个模块(vs 唐僧叨叨的 15 个),代码量预计减少 70%+。**
### 4.3 数据库设计(最简方案)
选项 A(推荐起步): **不使用关系数据库,用文件/内存存储**
```go
// 用户注册本质上就是向WuKongIM申请一个token
// agent的对话频道和消息都存储在WuKongIM内部
// App Server 本身不需要持久化存储
```
选项 B(如果需要持久化): **SQLite / PebbleDB**
```sql
-- 极简表设计
CREATE TABLE users (
uid TEXT PRIMARY KEY, -- 用户ID(与WuKongIM一致)
token TEXT, -- WuKongIM Token
name TEXT, -- 显示名称
created INTEGER -- 创建时间
);
```
---
## 5. 核心通讯流程
### 5.1 用户上线流程
```
Step 1: Client 通过 HTTP POST /login
→ App Server 验证用户凭证
→ App Server 调用 WuKongIM API 获取 Route 信息
→ 返回 {token, route} 给 Client
Step 2: Client 使用 token 和 route 直连 WuKongIM WebSocket
→ WuKongIM WebSocket: ws://host:15200?token=xxx
→ 这一步完全绕开 App ServerClient 自己跟 WuKongIM 通信
Step 3: Client 同时连接 App Server WebSocket
→ ws://app-server:8090/ws?token=xxx
→ 用于接收实时推送(Webhook 转发过来的消息)
```
**关键设计决策:客户端直连 WuKongIMApp Server 只作为 Webhook 中转。**
### 5.2 发送消息流程
```
Client → WuKongIM WebSocket (直连)
→ 消息直接写入 WuKongIM,不经过 App Server
→ App Server 通过 Webhook 收到通知后,可以通过 WebSocket 推送给对端
```
### 5.3 Agent 连接方式
```
Agent Service 有两种接入方式:
方式 A(推荐):直接作为 WuKongIM 客户端
- Agent 用 Go/Python SDK 连接 WuKongIM
- 收发消息走 WuKongIM 原生协议
- App Server 完全透明,只做 Webhook 中转
方式 B:通过 App Server API
- Agent 注册为 App Server 的"特殊用户"
- 消息通过 App Server 的 HTTP API 中转
- 适合 Agent 无法直连 WuKongIM 的场景
```
---
## 6. WuKongIM 3.0 集成清单
### 6.1 调用的 WuKongIM API
| API | 用途 | 代码位置 |
|---|---|---|
| `POST /user/token` | 生成用户 Token | `modules/user/service.go` |
| `GET /route?uid=` | 获取连接地址 | `modules/user/service.go` |
| `POST /channel` | 创建 Agent 对话频道 | `modules/channel/service.go` |
| `POST /channel/messagesync` | 同步频道消息 | `modules/message/service.go` |
| `POST /message/send` | 发送消息(App Server 代发) | `modules/message/service.go` |
### 6.2 接收的 Webhook 事件
| 事件 | 含义 | 处理方式 |
|---|---|---|
| `msg.notify` | 新消息通知 | 推送给对应的 Client WebSocket |
| `msg.offline` | 离线消息 | 推送给刚上线的 Client |
| `user.onlinestatus` | 用户在线状态变化 | 更新 Agent 在线状态 |
### 6.3 v3 兼容性对照(已有验证结论)
| 功能 | 状态 | 备注 |
|---|---|---|
| Token 生成 | ✅ | API 兼容 |
| Route 查询 | ✅ | 格式兼容(uid参数在v3被忽略但不影响) |
| Channel 管理 | ✅ | API 兼容 |
| Message Send | ✅ | API 兼容 |
| Message Sync | ✅ | v3 使用 `channel/messagesync` |
| Webhook 事件名 | ✅ | msg.notify/msg.offline/user.onlinestatus 完全一致 |
| Webhook HTTP | ✅ | v3 原生 HTTP Webhook(不需要改 gRPC 适配) |
| Message Search | ❌ 不需要 | 精简版不做消息搜索 |
| 文件上传 | ❌ 不需要 | 精简版不做文件服务 |
---
## 7. 实施计划
### Phase 1: 最小骨架(1-2 天)
```
目标:Go 项目编译通过,HTTP 服务启动,能连接 WuKongIM 3.0
□ 创建 go.mod,引入唐僧叨叨的 server/config 和 wkhttp
□ 实现 main.go:加载配置 + 启动 gin HTTP 服务
□ 实现 user 模块:POST /login(调 WuKongIM /user/token
□ 实现 webhook 模块:POST /v1/webhook(接收并打印事件日志)
□ 手工测试:curl /login → 拿到 token → 用 token 连 WuKongIM
```
### Phase 2: 消息通路(2-3 天)
```
目标:用户和 Agent 能通过 App Server + WuKongIM 互相发消息
□ 实现 channel 模块:创建/查询频道
□ 实现 message 模块:发送消息、同步消息
□ 实现 client WebSocket:向 Client 实时推送消息
□ 端到端测试:用户发消息 → Agent 收到 → Agent 回复 → 用户收到
```
### Phase 3: 蓝牙/本地通信适配(2-3 天)
```
目标:手机 App 通过本地网络连接 App Server
□ 实现蓝牙发现 / 局域网发现协议
□ App Server 暴露本地 HTTP 服务(mDNS 广播)
□ 安全认证:设备配对 Token
```
### Phase 4: 稳定与优化(1-2 天)
```
□ 连接断开重连
□ 消息确认与去重
□ 监控与日志
□ 性能调优
```
---
## 8. 参考资料
- WuKongIM 3.0 源码:`wukongim/`
- WuKongIM 3.0 本地环境:`infra/wukongim-v3/`
- 兼容性验证:`项目状态记录.md` §六-§八
- LineUp App 层架构方案:`设计/02.正式方案/lineup-app-layer-architecture.md`
---
*本文档为项目设计提案,待确认后进入 Phase 1 实现。*