第11课:完整实战串讲 —— 从零理解整个系统
本课目标
把前面10课的知识串起来,用一个完整的场景走一遍整个系统的运转过程。
场景:开了一天会,回来处理邮件
假设你开了一天会,收件箱堆了 30 封邮件。让我们看看这个系统怎么帮你。
阶段一:系统启动
你执行 bun run dev,以下事情依次发生:
1. Bun 服务器启动 (server/server.ts)
└─ 监听 http://localhost:3000
2. IMAP Manager 连接 Gmail (database/imap-manager.ts)
└─ 登录成功,进入 INBOX
3. Email Sync 初始同步 (database/email-sync.ts)
└─ 拉取最新 50 封邮件 → 解析 → 存入 SQLite
4. Listeners Manager 加载监听器 (ccsdk/listeners-manager.ts)
└─ 加载 finance-email-tracker ✅
└─ 加载 todo-extractor ✅
5. Actions Manager 加载操作模板 (ccsdk/actions-manager.ts)
└─ 加载 archive-old-newsletters ✅
└─ 加载 forward-bugs-to-engineering ✅
└─ 加载 add-expense / add-income ✅
6. UI State Manager 加载数据 (ccsdk/ui-state-manager.ts)
└─ 加载 financial-dashboard 数据
└─ 加载 task-board 数据
7. Component Manager 注册组件 (ccsdk/component-manager.ts)
└─ 注册 FinancialDashboard 组件
└─ 注册 TaskBoard 组件
8. WebSocket 服务就绪
└─ 等待浏览器连接
9. IMAP IDLE 模式开启
└─ 等待新邮件推送
阶段二:邮件同步 + 自动处理
在你打开浏览器之前,后台已经在干活了。
30 封新邮件中的每一封都会触发 Listener 检查:
邮件 1: "Weekly Newsletter from TechCrunch"
→ finance-email-tracker: "invoice"关键词? ❌ 跳过
→ todo-extractor: 来自 techcrunch.com? ❌ 不是工作邮件,跳过
邮件 2: "Invoice #789 from Slack - $25/month"
→ finance-email-tracker: "invoice"关键词? ✅
→ callAgent() → { is_financial: true, type: "subscription", amount: 25, vendor: "Slack" }
→ 更新 financial-dashboard ✅
→ 贴标签 "Finance" ✅
→ 通知: "💰 检测到订阅: $25 - Slack"
→ todo-extractor: 来自 slack.com? ❌ 跳过
邮件 3: "Action Required: Review Q4 Budget" from boss@company.com
→ finance-email-tracker: "budget"不在关键词里? ❌ 跳过
→ todo-extractor: 来自 company.com? ✅
→ callAgent() → { has_todos: true, todos: [
{ title: "审核Q4预算报告", priority: "high", deadline: "2026-03-01" }
]}
→ 更新 task-board ✅
→ 通知: "📋 从"Action Required..."中提取了1个待办"
... 依此类推处理剩余 27 封邮件 ...
你还没打开浏览器,系统已经帮你: - 识别了 4 封财务邮件,记录到看板 - 从 3 封工作邮件中提取了 5 个待办事项 - 给相关邮件贴了标签
阶段三:打开浏览器
你访问 http://localhost:3000:
1. React 应用加载
2. WebSocket 连接建立
3. 请求收件箱数据 → GET /api/emails/inbox → 显示 30 封邮件
4. 请求 UI State → GET /api/ui-state/financial-dashboard → 渲染看板
5. 请求监听器列表 → GET /api/listeners → 显示活跃监听器
你立刻看到: - 收件箱里 30 封邮件,部分已被自动贴了 "Finance" 标签 - 财务看板已经有 4 笔交易记录 - 任务看板有 5 个待办事项
阶段四:跟 AI 聊天处理邮件
对话1:快速了解情况
你: 帮我总结一下今天的邮件,有什么重要的?
AI: 今天共收到 30 封邮件,我来按重要性分类:
🔴 紧急(3封):
1. boss@company.com - "Action Required: Review Q4 Budget"
2. client@bigcorp.com - "Contract Renewal Deadline Tomorrow"
3. ops@company.com - "Production Alert: Server Disk 95% Full"
💰 财务(4封): Slack订阅、AWS账单、GitHub订阅、Notion账单
📋 已提取5个待办到任务看板
📨 其他: 15封订阅邮件、8封普通工作邮件
对话2:处理紧急邮件
你: 打开那封关于服务器磁盘的邮件
AI: [调用 email_read 工具]
来自: ops@company.com
主题: Production Alert: Server Disk 95% Full
内容: 生产服务器 prod-web-03 磁盘使用率达到 95%...
建议立即清理日志文件或扩容...
你: 把这个转发给工程团队
AI: 我已准备好转发内容,包含 AI 分析摘要。
[🔘 转发告警给工程团队] ← Action 按钮
你: [点击按钮]
→ forward-bugs-to-engineering handler 执行
→ callAgent() 分析告警内容,生成摘要
→ 发送转发邮件
→ "✅ 已转发给 engineering@company.com"
对话3:批量清理
你: 把那些过期的订阅邮件清理掉
AI: 我找到了 15 封超过 7 天的订阅/营销类邮件。
[🔘 归档 15 封过期订阅邮件]
你: [点击]
→ archive-old-newsletters handler 执行
→ 批量归档 15 封邮件
→ "✅ 已归档 15 封邮件"
→ 收件箱实时刷新(少了15封)
阶段五:实时处理新邮件
你正在聊天时,一封新邮件到达:
📧 新邮件: "Payment Received: $3,000 from BigCorp"
后台静默处理:
→ IMAP IDLE 检测到新邮件
→ Email Sync 拉取并存入数据库
→ Listener 触发:
→ finance-email-tracker: "payment" ✅
→ AI 分析: { type: "income", amount: 3000, vendor: "BigCorp" }
→ 更新 financial-dashboard
→ 贴标签 "Finance"
前端实时更新:
→ 收件箱多了一封新邮件
→ 财务看板多了一笔 +$3,000 收入
→ 弹出通知: "💰 检测到收入: $3,000 - BigCorp"
你在浏览器里实时看到这一切发生,不需要刷新页面。
数据流总图
graph TD
subgraph Browser["你的浏览器"]
B1["收件箱"]
B2["聊天"]
B3["财务看板<br>4笔+$3000"]
B4["任务看板<br>5个待办"]
end
subgraph Server["Bun 后端服务器"]
S1["Claude SDK<br>(AI 对话)"]
S2["Listeners<br>(自动处理)"]
S3["Actions<br>(一键操作)"]
S4["UI State Manager<br>(数据读写 + WebSocket 广播)"]
S5["SQLite 数据库<br>emails | recipients | attachments | ui_states"]
S6["IMAP Manager<br>(连接 Gmail, IDLE 实时监听)"]
S1 --> S4
S2 --> S4
S3 --> S4
S4 --> S5
S5 --> S6
end
Browser -->|"WebSocket 双向通道"| Server
S6 --> G["Gmail 服务器"]
关键设计模式回顾
学完11课,你应该理解这些设计模式:
| 模式 | 体现在哪 | 核心思想 |
|---|---|---|
| 递归 AI | Listener/Action 里的 callAgent() | 代码控制流程,AI 做判断 |
| 事件驱动 | Listener 监听邮件事件 | 有事才干活,没事不消耗 |
| 实时推送 | WebSocket 广播 | 数据变了立刻通知前端 |
| 关注点分离 | UI State / Component / Manager | 存储、逻辑、展示各管各的 |
| 热重载 | 文件监听 + 自动加载 | 改代码不用重启 |
| 渐进式过滤 | 先关键词后AI | 省钱:90%的邮件不需要调AI |
| 审计日志 | JSONL 日志 | AI 做了什么,都有记录 |