# Happy 核心实现分析报告

审计对象：<https://github.com/slopus/happy>  
本地版本：`21c6ced018e79149eb12385b0714306d48893c82`  
审计时间：2026-05-22

## 1. 项目定位

Happy 是 Claude Code 与 Codex 的移动端/Web 远程控制层。用户在本机通过 `happy claude` 或 `happy codex` 启动代理，离开电脑后可以从移动端或 Web 端查看进度、接收通知、处理权限请求，并在需要时切换控制权。

## 2. 核心组件

- `packages/happy-cli`：包装 Claude/Codex 等本机 CLI，负责启动、会话接入、本地/远程模式切换。
- `packages/happy-agent`：远程控制 CLI，提供登录、列出机器、列出会话、查看状态、spawn/resume 等能力。
- `packages/happy-server`：Fastify API + Socket.IO 实时同步服务，负责认证、会话、机器、消息、产物、附件和 RPC。
- `packages/happy-app`：Web + Mobile 客户端，展示会话流、机器状态和交互。
- `packages/happy-wire`：共享 wire schema，把消息、更新和 session protocol 统一为 Zod schema 与类型。

## 3. 核心链路

1. 本机 CLI/daemon 注册机器与会话。
2. 客户端通过公钥签名挑战完成认证，服务端签发 Bearer token。
3. HTTP API 负责会话、机器、附件、账户等持久数据读写。
4. Socket.IO `/v1/updates` 承载 user/session/machine 三类连接。
5. EventRouter 根据连接范围转发持久 update 与 ephemeral presence/usage/RPC 事件。
6. 会话内容按 flat event stream 表达：`text`、`service`、`tool-call-start`、`tool-call-end`、`file`、`turn-start`、`turn-end`、`start`、`stop`。
7. Postgres 保存主要状态，Redis 支撑多进程 Socket.IO stream adapter，S3/MinIO 保存上传资产。

## 4. 可复用设计点

- 共享 wire 包降低多客户端协议漂移。
- flat event stream 易于渲染、回放和调试。
- user/session/machine scoped socket 连接降低无关广播。
- persistent update 与 ephemeral event 分层，兼顾恢复和实时性。
- CLI 侧支持 machine RPC，使远程 spawn/resume 有清晰边界。
- 服务端认证使用签名挑战而非密码，适合设备型客户端。

## 5. 痛点

- 自托管依赖重：Postgres、Redis、S3、Node、多包构建和移动端生态同时存在。
- 部署门槛高：Kubernetes/外部 Secrets/S3 等生产配置对个人机器不友好。
- 运维视角分散：会话、机器、日志、任务、产物与部署状态不在同一观察面。
- 多代理协作过程不是一等对象：任务拆分、风险评审、验收证据需要人工维护。
- 完整 E2E 加密和移动通知链路提高安全性，但也让调试和二次开发更复杂。
- UI 对远程会话很强，但对项目制持续迭代、复盘、部署进度的表达仍可增强。
- 协议处于迁移期：unified session protocol 已有文档，但 legacy path 和多种 raw 格式仍需兼容。
- RPC 权限面大：`bash`、文件读写、ripgrep、difftastic 等远程能力必须绑定工作目录、授权 UX 和审计日志。
- Socket.IO RPC 跨副本依赖 Redis streams adapter，目标消失、重连恢复和超时处理增加运维复杂度。
- daemon 生命周期管理偏手写，升级、自重启和平台服务集成路径仍有测试成本。
- 前端消息 reducer 同时承担协议兼容、去重、权限、tool lifecycle 和 sidechain，维护压力较高。

## 6. 关键机制细化

- 连接模型：`user-scoped` 接收账户级更新，`session-scoped` 监听单会话，`machine-scoped` 由本机 daemon 上报机器状态。
- RPC 模型：server 通过 Socket.IO room 进行 `rpc:<userId>:<method>` 路由，payload 可由 session key 加密，server 不需要理解明文。
- 双控制面：daemon 既有本地 `127.0.0.1:<random>` HTTP 控制面，也有云端 Socket.IO RPC 控制面。
- 自托管路径：上游已有 `happy server` 思路，使用 PGlite 和同源 Web 配置注入，降低一部分生产依赖。
- 数据同步：seq 与 version/expectedVersion 结合，分别处理更新排序和乐观并发冲突。
- 安全边界：agent 真实执行仍在用户机器，server 更像身份、排序、fan-out、RPC 路由和对象存储层。

## 7. HappyX 实现取舍

HappyX 不试图在首轮完整复刻移动端、E2E 加密、CLI 劫持和所有存储后端，而是保留 Happy 的核心抽象：机器、会话、flat event stream、实时更新、产物、权限、报告。首轮以单机可部署为优先：

- Node 原生 HTTP 服务，减少依赖。
- SSE 实时事件，满足浏览器控制台和文档进度刷新。
- JSON 文件持久化，便于审计和备份。
- 控制台直接展示 MAGI 角色、任务状态、部署状态和验证证据。
- 文档站映射分析报告和任务进度，便于外部浏览。

## 8. 后续增强建议

- 引入真实 agent adapter，接入 Claude/Codex/Gemini 进程。
- 增加设备密钥、消息加密和本地 token vault。
- 增加 WebSocket RPC，用于远程权限审批和任务恢复。
- 将 JSON 存储升级为 SQLite，保留单机部署简洁性。
- 增加 Playwright 视觉回归和移动端截图门禁。
- 形成插件协议，让任务拆解、复盘、部署验证可以自动扩展。
