Browse Source

feat: AI 生成的项目文档

kotoyuuko 3 weeks ago
parent
commit
5c051ae134
45 changed files with 17811 additions and 0 deletions
  1. 338 0
      .qoder/repowiki/zh/content/Telegram 集成/Telegram 集成.md
  2. 328 0
      .qoder/repowiki/zh/content/Telegram 集成/grammY 框架配置.md
  3. 510 0
      .qoder/repowiki/zh/content/Telegram 集成/命令系统/交互式命令.md
  4. 504 0
      .qoder/repowiki/zh/content/Telegram 集成/命令系统/命令系统.md
  5. 303 0
      .qoder/repowiki/zh/content/Telegram 集成/命令系统/回调查询处理.md
  6. 296 0
      .qoder/repowiki/zh/content/Telegram 集成/命令系统/基础命令.md
  7. 376 0
      .qoder/repowiki/zh/content/Telegram 集成/命令系统/预约命令.md
  8. 286 0
      .qoder/repowiki/zh/content/Telegram 集成/回调查询处理.md
  9. 322 0
      .qoder/repowiki/zh/content/Telegram 集成/对话管理.md
  10. 332 0
      .qoder/repowiki/zh/content/快速开始.md
  11. 392 0
      .qoder/repowiki/zh/content/扩展开发/API 客户端集成.md
  12. 311 0
      .qoder/repowiki/zh/content/扩展开发/对话扩展.md
  13. 351 0
      .qoder/repowiki/zh/content/扩展开发/扩展开发.md
  14. 366 0
      .qoder/repowiki/zh/content/扩展开发/扩展最佳实践.md
  15. 427 0
      .qoder/repowiki/zh/content/扩展开发/插件系统使用.md
  16. 359 0
      .qoder/repowiki/zh/content/扩展开发/新命令开发.md
  17. 292 0
      .qoder/repowiki/zh/content/数据管理/KV 存储设计.md
  18. 406 0
      .qoder/repowiki/zh/content/数据管理/会话状态管理.md
  19. 349 0
      .qoder/repowiki/zh/content/数据管理/数据同步机制.md
  20. 555 0
      .qoder/repowiki/zh/content/数据管理/数据模型设计.md
  21. 401 0
      .qoder/repowiki/zh/content/数据管理/数据管理.md
  22. 414 0
      .qoder/repowiki/zh/content/架构设计/数据流设计.md
  23. 335 0
      .qoder/repowiki/zh/content/架构设计/整体架构.md
  24. 405 0
      .qoder/repowiki/zh/content/架构设计/架构设计.md
  25. 541 0
      .qoder/repowiki/zh/content/架构设计/组件设计.md
  26. 815 0
      .qoder/repowiki/zh/content/架构设计/部署架构.md
  27. 541 0
      .qoder/repowiki/zh/content/核心模块/API 客户端模块.md
  28. 501 0
      .qoder/repowiki/zh/content/核心模块/命令处理器系统/命令处理器系统.md
  29. 453 0
      .qoder/repowiki/zh/content/核心模块/命令处理器系统/命令路由机制.md
  30. 288 0
      .qoder/repowiki/zh/content/核心模块/命令处理器系统/对话状态管理.md
  31. 399 0
      .qoder/repowiki/zh/content/核心模块/命令处理器系统/核心命令处理器.md
  32. 432 0
      .qoder/repowiki/zh/content/核心模块/命令处理器系统/活动管理命令.md
  33. 361 0
      .qoder/repowiki/zh/content/核心模块/命令处理器系统/预约与取消命令.md
  34. 472 0
      .qoder/repowiki/zh/content/核心模块/核心模块.md
  35. 772 0
      .qoder/repowiki/zh/content/核心模块/活动管理系统.md
  36. 362 0
      .qoder/repowiki/zh/content/核心模块/用户认证系统.md
  37. 587 0
      .qoder/repowiki/zh/content/核心模块/预约管理系统.md
  38. 338 0
      .qoder/repowiki/zh/content/测试与调试.md
  39. 375 0
      .qoder/repowiki/zh/content/部署与运维/CI_CD 流水线.md
  40. 370 0
      .qoder/repowiki/zh/content/部署与运维/故障排除与维护.md
  41. 302 0
      .qoder/repowiki/zh/content/部署与运维/监控告警.md
  42. 329 0
      .qoder/repowiki/zh/content/部署与运维/部署与运维.md
  43. 289 0
      .qoder/repowiki/zh/content/部署与运维/部署配置.md
  44. 326 0
      .qoder/repowiki/zh/content/项目概述.md
  45. 0 0
      .qoder/repowiki/zh/meta/repowiki-metadata.json

+ 338 - 0
.qoder/repowiki/zh/content/Telegram 集成/Telegram 集成.md

@@ -0,0 +1,338 @@
+# Telegram 集成
+
+<cite>
+**本文引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [package.json](file://package.json)
+- [tsconfig.json](file://tsconfig.json)
+- [vitest.config.mts](file://vitest.config.mts)
+- [test/index.spec.ts](file://test/index.spec.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本项目为基于 Cloudflare Workers 的 Telegram Bot,采用 grammY 框架与 @grammyjs/conversations 插件实现对话式交互,结合 Cloudflare KV 存储完成用户会话与凭证持久化。Bot 提供命令系统(/start、/login、/events、/history、/logout)以及事件浏览、预约、取消等完整业务流程;通过计划任务实现新活动推送通知。
+
+## 项目结构
+- 入口与运行环境
+  - Worker 入口:src/index.ts,负责 Bot 初始化、命令菜单注册、Webhook 回调接入与定时任务调度。
+  - 配置:wrangler.jsonc 定义 Worker 名称、兼容日期、触发器、KV 绑定与变量。
+- 命令系统
+  - src/command/index.ts:安装 conversations 插件、注册命令与回调查询处理器。
+  - 各命令处理器位于 src/command/handlers/ 下,按功能模块划分。
+- 客户端
+  - src/client/cosmoe.ts:封装 Cosmoe API 客户端,统一认证、事件、预约、取消等接口。
+- 调度器
+  - src/scheduler/index.ts:基于 Cron 触发,向已注册用户推送新活动通知。
+- 测试与类型
+  - Vitest 配置与测试用例位于 test/ 与 vitest.config.mts。
+  - 类型声明位于 worker-configuration.d.ts(在 tsconfig 中引入)。
+
+```mermaid
+graph TB
+A["src/index.ts<br/>Worker 入口"] --> B["src/command/index.ts<br/>命令与对话注册"]
+B --> C["src/command/handlers/*.ts<br/>命令处理器"]
+C --> D["src/client/cosmoe.ts<br/>Cosmoe API 客户端"]
+A --> E["src/scheduler/index.ts<br/>计划任务"]
+F["wrangler.jsonc<br/>Worker 配置"] --> A
+G["package.json<br/>依赖与脚本"] --> A
+H["tsconfig.json<br/>TypeScript 配置"] --> A
+I["vitest.config.mts<br/>测试配置"] --> J["test/index.spec.ts<br/>单元/集成测试"]
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L1-L24)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L1-L24)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+
+## 核心组件
+- Bot 实例与 Webhook
+  - 在入口中创建带对话风味的 Bot 实例,解析 botInfo 并注册命令菜单,最后通过 webhookCallback 将请求交由 grammY 处理。
+- 对话管理器(Conversations)
+  - 使用 @grammyjs/conversations 与 @grammyjs/storage-cloudflare 的 KV 适配器,将对话状态持久化到 COSMOE_STORAGE。
+  - 在命令注册处安装 conversations 插件,并定义交互式登录对话“login”。
+- 命令系统
+  - 注册 /start、/login、/events、/history、/logout 等命令;对特定格式的消息(如 /event_{id}、/book_{event_id}_{slot_id}、/cancel_{booking_id})使用 hears 与 callbackQuery 进行路由。
+- API 客户端
+  - CosmoeClient 封装认证、事件列表、活动详情、预约、取消、历史等接口,支持设置/读取凭证与自动校验登录状态。
+- 计划任务
+  - 通过 Cron 每分钟触发一次,对比最新事件 ID,向已注册用户发送新活动通知。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+## 架构总览
+下图展示从 Telegram 请求到业务处理与外部 API 调用的整体流程。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant T as "Telegram"
+participant W as "Cloudflare Worker<br/>src/index.ts"
+participant C as "命令系统<br/>src/command/index.ts"
+participant H as "命令处理器<br/>handlers/*.ts"
+participant K as "KV 存储<br/>COSMOE_CREDENTIALS/COSMOE_STORAGE"
+participant API as "Cosmoe API<br/>src/client/cosmoe.ts"
+U->>T : 发送命令/消息/回调
+T->>W : HTTP 请求Webhook
+W->>C : 转发至 grammY Bot
+C->>H : 匹配命令/正则/回调
+H->>K : 读写用户凭证/会话状态
+H->>API : 调用认证/事件/预约/取消等接口
+API-->>H : 返回业务数据
+H-->>U : 发送消息/内联键盘/编辑消息
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 详细组件分析
+
+### Bot 初始化与 Webhook 接入
+- 创建带对话风味的 Bot 实例,注入 botInfo 与 token。
+- 注册命令菜单 setMyCommands,异常捕获避免部署失败。
+- 使用 webhookCallback("cloudflare-mod") 将请求交由 grammY 处理。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+
+### 对话管理器(Conversations)与 KV 存储
+- 使用 @grammyjs/storage-cloudflare 的 KvAdapter 作为对话存储后端。
+- 自定义 KV 读写删除适配器,JSON 序列化对话状态。
+- 安装 conversations 插件并注册交互式登录对话“login”。
+
+```mermaid
+flowchart TD
+Start(["进入对话"]) --> ReadKV["从 COSMOE_STORAGE 读取对话状态"]
+ReadKV --> State{"是否存在状态?"}
+State --> |否| Init["初始化状态"]
+State --> |是| Resume["恢复状态"]
+Init --> Run["执行对话步骤"]
+Resume --> Run
+Run --> Persist["写回 COSMOE_STORAGE"]
+Persist --> End(["结束对话"])
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+
+### 命令系统与路由
+- /start:欢迎语与可用命令提示。
+- /login:进入交互式登录对话,获取用户名/密码并调用 Cosmoe API 获取 token,存入 COSMOE_CREDENTIALS。
+- /events:获取最近活动列表,生成命令链接。
+- /event_{id}:显示活动详情与可预约时间段,含预约链接。
+- /book_{event_id}_{slot_id}:根据索引选择时间段,处理优惠券选择与最终预约。
+- /history:获取用户预约历史,含取消链接。
+- /cancel_{booking_id}:发起取消确认,回调 confirm_cancel_* 或 cancel_action。
+- /logout:删除用户凭证。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L59-L110)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L4-L6)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L34)
+
+### 内联键盘与回调查询
+- 事件详情页:当时间段有余量且活动处于活跃期,为每个时间段生成“预约”链接。
+- 优惠券选择:多优惠券时以内联键盘列出,回调格式 select_coupon_{event_id}_{slot_index}_{coupon_code|none}。
+- 取消确认:内联键盘“确认/取消”,回调格式 confirm_cancel_{booking_id} 或 cancel_action。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant H as "事件详情处理器"
+participant KB as "内联键盘"
+participant CB as "回调处理器"
+U->>H : 发送 /event_{id}
+H-->>U : 返回活动详情与可预约时间段
+U->>KB : 点击“预约”
+KB-->>CB : 回调 /book_{event_id}_{slot_index}
+CB-->>U : 显示优惠券选择或直接预约
+```
+
+图表来源
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L40-L45)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L76-L117)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L60-L78)
+
+章节来源
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L40-L45)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L76-L117)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L60-L78)
+
+### 文件上传/下载与媒体资源
+- 当前代码未实现文件上传/下载逻辑。
+- 活动详情包含封面图与图集 URL,可在消息中直接展示或引导用户查看。
+
+章节来源
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L50-L51)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L19-L50)
+
+### 错误处理与重试策略
+- 命令处理器普遍使用 try/catch 捕获异常并回复友好提示。
+- KV 读写与 API 调用均包含错误日志输出,便于定位问题。
+- 建议在关键路径增加指数退避重试与超时控制(当前未实现)。
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L70-L74)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L23-L26)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L103-L106)
+
+### 用户体验优化
+- Markdown 格式化消息,突出关键信息(活动名、时间、价格、状态)。
+- 控制消息长度(历史记录限制),避免超出 Telegram API 限制。
+- 取消操作提供二次确认,降低误操作风险。
+
+章节来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L94-L102)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L60-L78)
+
+### 计划任务与推送通知
+- Cron 每分钟触发一次,比较最新事件 ID,向所有已注册用户发送新活动通知。
+- 使用 bot.api.sendMessage 推送 Markdown 格式消息。
+
+```mermaid
+flowchart TD
+S["Cron 触发"] --> L["读取最新事件ID"]
+L --> Q["拉取全部活动"]
+Q --> N{"存在新活动?"}
+N --> |否| E["结束"]
+N --> |是| U["遍历已注册用户"]
+U --> M["发送通知消息"]
+M --> R["更新最新事件ID"]
+R --> E
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+## 依赖关系分析
+- grammY 与 @grammyjs/conversations:提供 Bot 核心能力与对话管理。
+- @grammyjs/storage-cloudflare:KV 存储适配器,用于对话状态持久化。
+- Cloudflare KV:COSMOE_CREDENTIALS 存放用户凭证,COSMOE_STORAGE 存放对话状态与最新事件 ID。
+- Cosmoe API:通过 CosmoeClient 统一访问认证、事件、预约、取消、历史等接口。
+
+```mermaid
+graph LR
+P["package.json 依赖"] --> G["grammy"]
+P --> C["@grammyjs/conversations"]
+P --> S["@grammyjs/storage-cloudflare"]
+G --> B["Bot 核心"]
+C --> V["对话插件"]
+S --> K["KV 适配器"]
+B --> H["命令/回调处理"]
+H --> X["CosmoeClient"]
+X --> A["Cosmoe API"]
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 性能考虑
+- KV 读写:对话状态与用户凭证频繁读写,建议在高并发场景下评估 KV 延迟与吞吐。
+- API 调用:事件列表与历史记录可能返回大量数据,注意分页与截断(当前已做截断)。
+- 消息长度:Markdown 消息超过阈值会被截断,确保用户体验一致。
+- 计划任务:每分钟触发一次,建议在大规模用户场景下优化遍历与发送逻辑。
+
+## 故障排查指南
+- Webhook 未生效
+  - 检查 Worker 是否正确暴露 fetch/scheduled 生命周期。
+  - 确认 Wrangler 配置与部署状态。
+- 命令无响应
+  - 查看 setMyCommands 是否成功执行(入口已捕获异常)。
+  - 检查命令路由是否匹配(/event_、/book_、/cancel_)。
+- 登录失败
+  - 确认 Cosmoe API 返回 code=200 且包含 user_id/token。
+  - 检查 KV 写入是否成功(COSMOE_CREDENTIALS)。
+- 预约/取消异常
+  - 检查回调数据格式与解析逻辑。
+  - 确认 CosmoeClient 已设置正确的凭证。
+- 计划任务未推送
+  - 检查 Cron 配置与 scheduled 生命周期。
+  - 确认 KV 中已存在用户键并可被枚举。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L24-L32)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L46-L74)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L160-L226)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L18-L88)
+
+## 结论
+本项目以 grammY 为核心,结合 @grammyjs/conversations 与 Cloudflare KV,构建了完整的 Telegram Bot 业务闭环:从命令交互、内联键盘、回调处理到外部 API 调用与计划任务推送。建议后续增强错误重试、超时控制与限流策略,以提升稳定性与用户体验。
+
+## 附录
+- 部署与开发
+  - 使用 Wrangler 部署与本地开发,脚本已在 package.json 中定义。
+  - Vitest 配置指向 wrangler.jsonc,便于集成测试。
+- 类型与配置
+  - tsconfig.json 启用严格模式与 isolatedModules,确保类型安全。
+  - worker-configuration.d.ts 由 tsconfig 引入,提供 Cloudflare Worker 类型支持。
+
+章节来源
+- [package.json](file://package.json#L5-L11)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [tsconfig.json](file://tsconfig.json#L34-L42)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)

+ 328 - 0
.qoder/repowiki/zh/content/Telegram 集成/grammY 框架配置.md

@@ -0,0 +1,328 @@
+# grammY 框架配置
+
+<cite>
+**本文档引用的文件**
+- [package.json](file://package.json)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [.dev.vars](file://.dev.vars)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向使用 grammY 框架在 Cloudflare Workers 上部署 Telegram 机器人的开发者,系统性阐述 Bot 实例初始化流程、环境变量配置、中间件与插件(尤其是 conversations 插件)的安装与配置、KV 存储适配器的使用以及版本化状态存储的实现思路。同时提供完整的框架初始化参考路径、错误处理与配置验证建议,以及 Cloudflare KV 的集成最佳实践。
+
+## 项目结构
+该项目采用按功能模块划分的组织方式:
+- 入口与运行时:src/index.ts 提供 fetch 和 scheduled 事件入口,负责 Bot 初始化与 Webhook 回调。
+- 命令与对话:src/command/index.ts 定义命令路由与 conversations 插件配置;具体命令处理器位于 src/command/handlers/。
+- 调度任务:src/scheduler/index.ts 处理定时任务,如新活动通知推送。
+- 配置与类型:wrangler.jsonc 定义 Workers 配置、KV 绑定与 vars;.dev.vars 提供本地开发环境变量;worker-configuration.d.ts 提供 KV 类型声明。
+
+```mermaid
+graph TB
+A["入口文件<br/>src/index.ts"] --> B["命令与对话注册<br/>src/command/index.ts"]
+A --> C["调度任务处理<br/>src/scheduler/index.ts"]
+B --> D["登录对话处理器<br/>src/command/handlers/login.ts"]
+A --> E["Cloudflare 配置<br/>wrangler.jsonc"]
+E --> F[".dev.vars 环境变量"]
+A --> G["类型声明<br/>worker-configuration.d.ts"]
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 核心组件
+- Bot 实例与上下文扩展
+  - 使用 ConversationFlavor 扩展 Context,以支持 conversations 插件。
+  - 通过 env.BOT_INFO 注入 botInfo,确保 API 行为符合预期。
+- 环境接口与绑定
+  - Env 接口统一声明 BOT_TOKEN、COSMOE_CREDENTIALS、COSMOE_STORAGE、BOT_INFO 等键。
+  - Wrangler 将 KVNamespace 绑定到环境变量名,便于运行时访问。
+- conversations 插件与 KV 存储
+  - 使用 @grammyjs/storage-cloudflare 的 KvAdapter 包装 KVNamespace。
+  - 自定义 storage 对象封装 read/write/delete,实现 JSON 序列化与异常捕获。
+- 调度任务与 KV 读写
+  - 在 scheduled 事件中,使用 COSMOE_STORAGE 记录最新活动 ID,使用 COSMOE_CREDENTIALS 列表获取已注册用户列表。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [src/command/index.ts](file://src/command/index.ts#L13-L18)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 架构总览
+下图展示从请求进入 Worker 到 Bot 初始化、命令注册、对话存储与调度任务的整体流程。
+
+```mermaid
+sequenceDiagram
+participant CF as "Cloudflare Workers"
+participant Entry as "入口函数<br/>src/index.ts"
+participant Bot as "Bot 实例"
+participant Cmd as "命令注册<br/>src/command/index.ts"
+participant KV as "KV 存储<br/>COSMOE_STORAGE/COSMOE_CREDENTIALS"
+CF->>Entry : "fetch 请求"
+Entry->>Bot : "构造 Bot 并注入 botInfo"
+Entry->>Cmd : "setupCommands(bot, env)"
+Cmd->>KV : "创建 KvAdapter 并包装 storage"
+Cmd->>Bot : "安装 conversations 插件"
+Entry->>CF : "webhookCallback 返回响应"
+CF->>Entry : "scheduled 触发"
+Entry->>Bot : "重新构造 Bot"
+Entry->>Cmd : "handleScheduledEvent(bot, env)"
+Cmd->>KV : "读取/更新最新活动 ID"
+Cmd->>Bot : "向已注册用户发送通知"
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L87)
+
+## 详细组件分析
+
+### Bot 初始化与环境配置
+- 初始化步骤
+  - 从环境读取 BOT_TOKEN 与 BOT_INFO,构造 Bot 实例。
+  - 注册命令菜单 setMyCommands,失败时记录错误日志。
+  - 使用 webhookCallback("cloudflare-mod") 将请求交由 grammY 处理。
+- 环境接口
+  - Env 明确声明 BOT_INFO、BOT_TOKEN、COSMOE_CREDENTIALS、COSMOE_STORAGE。
+  - 运行时由 Wrangler 将 KVNamespace 绑定到对应名称。
+- 配置验证建议
+  - 校验 BOT_TOKEN 是否存在且非空字符串。
+  - 校验 BOT_INFO 是否为合法 JSON 字符串并可解析。
+  - 在生产环境确保 KV 绑定已正确创建并分配。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [wrangler.jsonc](file://wrangler.jsonc#L18-L20)
+
+### conversations 插件配置与 KV 存储适配器
+- KV 适配器与存储对象
+  - 使用 KvAdapter(COSMOE_STORAGE) 创建适配器。
+  - 自定义 storage 对象包含 read/write/delete,内部对 KV 读写进行 JSON 序列化/反序列化,并捕获异常。
+- 版本化状态存储
+  - 代码中引入了 VersionedStateStorage 类型,但当前未直接使用该类型进行版本化存储。
+  - 可选实现思路:为 conversations.storage 提供 versioned 选项,结合 pinVersion 或自定义版本迁移逻辑,确保状态演进兼容性。
+- 错误处理
+  - 读写 KV 失败时记录错误并返回默认值或空状态,避免中断对话流程。
+
+```mermaid
+flowchart TD
+Start(["进入 conversations 配置"]) --> CreateAdapter["创建 KvAdapter(COSMOE_STORAGE)"]
+CreateAdapter --> BuildStorage["构建 storage 对象<br/>read/write/delete"]
+BuildStorage --> WrapJSON["读取时 JSON.parse<br/>写入时 JSON.stringify"]
+WrapJSON --> TryCatch["异常捕获与日志记录"]
+TryCatch --> InstallPlugin["bot.use(conversations({ storage }))"]
+InstallPlugin --> End(["完成配置"])
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L21-L52)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+
+### 环境接口定义与使用
+- 接口定义
+  - Env 在入口与命令模块中分别声明,确保类型一致性。
+- 运行时绑定
+  - wrangler.jsonc 中通过 kv_namespaces 将 KVNamespace 绑定到 COSMOE_CREDENTIALS 与 COSMOE_STORAGE。
+  - vars 中定义 BOT_INFO 作为字符串,供入口读取并解析。
+- 开发与部署差异
+  - .dev.vars 提供 BOT_TOKEN 本地开发变量。
+  - 生产环境应通过 Wrangler 的 secrets 或 vars 管理敏感配置。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [src/command/index.ts](file://src/command/index.ts#L13-L18)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [.dev.vars](file://.dev.vars#L1-L2)
+
+### 登录对话与凭证存储
+- 对话流程
+  - 通过 createConversation 定义 "login" 对话,等待用户输入用户名与密码。
+  - 调用 CosmoeClient 获取 token,并将用户凭证以 JSON 形式存入 COSMOE_CREDENTIALS。
+- KV 写入策略
+  - 使用 Telegram 用户 ID 作为键,避免跨用户凭证泄露。
+  - 写入时包含时间戳,便于后续清理或审计。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant Conv as "登录对话"
+participant API as "CosmoeClient"
+participant KV as "COSMOE_CREDENTIALS"
+U->>Conv : "触发 /login"
+Conv->>U : "提示输入用户名"
+U-->>Conv : "用户名"
+Conv->>U : "提示输入密码"
+U-->>Conv : "密码"
+Conv->>API : "getToken(username, password)"
+API-->>Conv : "返回 token"
+Conv->>KV : "put(telegramUserId, JSON)"
+Conv-->>U : "登录成功/失败消息"
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+### 调度任务与 KV 通知推送
+- 任务职责
+  - 从 CosmoeClient 获取所有活动,对比 COSMOE_STORAGE 中记录的最新活动 ID。
+  - 对新增活动,遍历 COSMOE_CREDENTIALS 中的用户键列表并向其发送通知。
+  - 更新 COSMOE_STORAGE 中的最新活动 ID。
+- KV 列表与读写
+  - 使用 KV.list() 获取所有已注册用户键集合。
+  - 使用 KV.get/put 进行轻量级状态持久化。
+
+```mermaid
+flowchart TD
+S(["scheduled 触发"]) --> InitBot["构造 Bot 实例"]
+InitBot --> LoadKV["读取 latestEventId"]
+LoadKV --> FetchEvents["调用 CosmoeClient.getEvents()"]
+FetchEvents --> Compare{"有新活动?"}
+Compare --> |否| End(["结束"])
+Compare --> |是| ListUsers["KV.list() 获取用户键"]
+ListUsers --> Notify["逐用户发送通知"]
+Notify --> Update["更新 latestEventId"]
+Update --> End
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L87)
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L87)
+
+## 依赖关系分析
+- 依赖概览
+  - grammY 核心库与 @grammyjs/conversations 提供 Bot 与对话能力。
+  - @grammyjs/storage-cloudflare 提供 KV 适配器。
+  - Wrangler 管理 Workers 配置、KV 绑定与部署。
+- 运行时耦合
+  - 入口文件与命令模块共享 Env 接口,确保类型一致。
+  - conversations 插件依赖 KV 存储,KV 由 Wrangler 绑定到环境变量。
+
+```mermaid
+graph LR
+Pkg["package.json 依赖"] --> G["grammY"]
+Pkg --> C["@grammyjs/conversations"]
+Pkg --> S["storage-cloudflare"]
+Entry["src/index.ts"] --> Cmd["src/command/index.ts"]
+Entry --> Sch["src/scheduler/index.ts"]
+Cmd --> KV["COSMOE_STORAGE/COSMOE_CREDENTIALS"]
+Sch --> KV
+Wrangler["wrangler.jsonc"] --> KV
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 性能考虑
+- KV 访问优化
+  - 合理使用 KV.list() 的分页参数(limit/prefix),避免一次性列出过多键。
+  - 对频繁读取的状态使用缓存策略(例如在内存中缓存近期用户状态),减少 KV 往返。
+- 序列化开销
+  - JSON.stringify/parse 在高频对话中可能成为瓶颈,建议仅在必要时进行序列化。
+- 并发与限流
+  - 发送通知时注意 Telegram API 的速率限制,必要时增加退避与重试机制。
+- 部署与兼容性
+  - 保持 compatibility_date 最新,确保运行时行为稳定。
+
+## 故障排除指南
+- 常见问题与定位
+  - BOT_TOKEN 缺失:检查 .dev.vars 与 Wrangler secrets/vars 设置是否正确。
+  - KV 绑定失败:确认 wrangler.jsonc 中 kv_namespaces 已配置且 ID 正确。
+  - conversations 读写异常:查看控制台日志中的错误堆栈,确认 KV 命名空间权限与键格式。
+  - 调度任务未执行:检查 triggers.crons 配置与 scheduled 事件入口。
+- 建议的日志与监控
+  - 在 conversations storage 的 read/write/delete 中统一记录错误日志。
+  - 对 KV.list() 结果进行长度与格式校验,防止异常数据导致循环。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L26-L48)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L27-L77)
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L17)
+
+## 结论
+本项目基于 grammY 在 Cloudflare Workers 上实现了完整的 Telegram 机器人服务:Bot 初始化、命令与对话管理、KV 存储适配与调度任务。通过明确的环境接口与 Wrangler 配置,系统具备良好的可维护性与可扩展性。建议在生产环境中进一步完善版本化状态存储、KV 访问优化与错误恢复策略,以提升稳定性与性能。
+
+## 附录
+
+### 环境变量与配置清单
+- 必需配置
+  - BOT_TOKEN:Telegram Bot 访问令牌
+  - BOT_INFO:Bot 信息 JSON 字符串(用于 botInfo 注入)
+  - COSMOE_CREDENTIALS:KVNamespace,用于存储用户凭证
+  - COSMOE_STORAGE:KVNamespace,用于存储会话状态与最新活动 ID
+- 开发配置
+  - .dev.vars:本地开发时提供 BOT_TOKEN
+
+章节来源
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [wrangler.jsonc](file://wrangler.jsonc#L18-L30)
+- [.dev.vars](file://.dev.vars#L1-L2)
+
+### 版本化状态存储实现建议
+- 当前状态
+  - 代码引入了 VersionedStateStorage 类型,但未启用版本化存储。
+- 实施步骤
+  - 为 conversations.storage 提供 versioned 选项,定义版本号与迁移函数。
+  - 使用 pinVersion 或自定义 versionify/unpack,确保状态演进兼容。
+  - 在 storage.read 中解包版本化数据,在 storage.write 中写入带版本的数据。
+- 注意事项
+  - 迁移逻辑需幂等,避免重复迁移造成数据错乱。
+  - 对旧版本状态进行降级处理,保证回滚能力。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L1-L20)
+
+### Cloudflare KV 集成最佳实践
+- 键设计
+  - 使用有意义的键前缀区分不同用途(如 user:{userId}、conv:{key})。
+- 数据结构
+  - 优先使用 JSON 文本存储复杂对象,便于读写与调试。
+- 错误处理
+  - 对 KV.get/put/delete 的异常进行分类处理(网络超时、权限不足、键不存在)。
+- 监控与告警
+  - 记录 KV 操作耗时与错误率,设置阈值告警。
+- 安全
+  - 避免在 KV 中存储明文敏感信息;如需存储,建议加密或最小化暴露面。

+ 510 - 0
.qoder/repowiki/zh/content/Telegram 集成/命令系统/交互式命令.md

@@ -0,0 +1,510 @@
+# 交互式命令
+
+<cite>
+**本文引用的文件**
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件聚焦于交互式命令的实现与设计,围绕以下命令展开:
+- /events:列出最近的摄影活动,并以“/event_{id}”链接引导查看详情
+- /event_{id}:展示活动详情、时间槽与预约入口
+- /history:展示用户的预约历史,并提供“/cancel_{booking_id}”取消入口
+- /book_{event_id}_{slot_index}:基于回调的优惠券选择与最终预约
+- /login、/logout:认证与凭证管理
+- /cancel_{booking_id} 及确认回调:取消流程的二次确认
+
+文档将深入解释动态参数(正则表达式匹配与参数解析)、命令与用户交互的设计模式(分页/菜单/状态保持),并提供开发模板与用户体验优化建议。
+
+## 项目结构
+该项目采用按功能模块划分的目录结构,命令注册集中在入口文件,各命令处理器位于独立文件中,底层通过客户端封装调用第三方 API。
+
+```mermaid
+graph TB
+subgraph "命令层"
+IDX["src/command/index.ts"]
+H1["handlers/events.ts"]
+H2["handlers/eventDetails.ts"]
+H3["handlers/history.ts"]
+H4["handlers/bookEvent.ts"]
+H5["handlers/login.ts"]
+H6["handlers/cancel.ts"]
+H7["handlers/logout.ts"]
+H8["handlers/start.ts"]
+end
+subgraph "客户端"
+C1["src/client/cosmoe.ts"]
+end
+IDX --> H1
+IDX --> H2
+IDX --> H3
+IDX --> H4
+IDX --> H5
+IDX --> H6
+IDX --> H7
+IDX --> H8
+H1 --> C1
+H2 --> C1
+H3 --> C1
+H4 --> C1
+H5 --> C1
+H6 --> C1
+H7 --> C1
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [package.json](file://package.json#L1-L24)
+
+## 核心组件
+- 命令注册与路由
+  - 在入口文件中安装对话插件与 KV 存储,注册命令与正则监听器,绑定回调处理器
+- 事件列表与详情
+  - 列表命令返回最近若干活动,详情命令解析动态路径并渲染时间槽与预约入口
+- 预约与优惠券
+  - 通过回调键盘展示多张可用优惠券,支持“无优惠券”选项
+- 历史与取消
+  - 历史命令读取用户凭证并拉取历史,提供取消入口;取消流程二次确认
+- 认证与登出
+  - 对话式登录,KV 存储凭证;登出删除凭证
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+
+## 架构总览
+整体采用“命令入口 + 处理器 + 客户端 + KV 存储”的分层架构。命令入口负责路由与上下文管理,处理器负责业务逻辑与用户交互,客户端封装 API 调用,KV 存储用于会话与凭证持久化。
+
+```mermaid
+graph TB
+U["用户"]
+B["Telegram Bot"]
+C["命令入口<br/>src/command/index.ts"]
+E["事件列表处理器<br/>events.ts"]
+D["事件详情处理器<br/>eventDetails.ts"]
+Y["历史处理器<br/>history.ts"]
+BK["预约处理器<br/>bookEvent.ts"]
+L["登录处理器<br/>login.ts"]
+X["取消处理器<br/>cancel.ts"]
+LOG["登出处理器<br/>logout.ts"]
+CL["Cosmoe 客户端<br/>src/client/cosmoe.ts"]
+KV["KV 存储<br/>COSMOE_STORAGE/COSMOE_CREDENTIALS"]
+U --> B
+B --> C
+C --> E
+C --> D
+C --> Y
+C --> BK
+C --> L
+C --> X
+C --> LOG
+E --> CL
+D --> CL
+Y --> CL
+BK --> CL
+L --> CL
+X --> CL
+LOG --> CL
+C --> KV
+L --> KV
+Y --> KV
+BK --> KV
+X --> KV
+LOG --> KV
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 详细组件分析
+
+### /events:最近活动列表
+- 功能要点
+  - 调用客户端获取活动列表,取最新若干条
+  - 将每条活动拼接为“/event_{id}”的可点击链接,便于跳转详情
+- 参数与路由
+  - 命令形式:/events
+  - 输出包含动态链接,用户点击后进入 /event_{id}
+- 错误处理
+  - 空数据时提示无活动;异常时提示网络错误
+- 用户体验
+  - 限制输出数量,避免过长消息
+  - 使用 Markdown 格式增强可读性
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H as "handleEventsCommand"
+participant CL as "CosmoeClient"
+U->>B : "/events"
+B->>H : 调用处理器
+H->>CL : 获取活动列表
+CL-->>H : 返回结果
+H->>U : 发送最近活动列表含 /event_{id} 链接
+```
+
+图表来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+
+章节来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+
+### /event_{id}:活动详情与预约入口
+- 动态参数解析
+  - 使用正则 /^\/event_(.+)$/ 提取 id
+- 业务逻辑
+  - 拉取活动详情,排序时间槽,判断是否可预约(剩余位数>0且活动未过期)
+  - 对每个可预约时间槽生成“/book_{event_id}_{slot_index}”的预约入口
+- 时间与状态
+  - 使用北京时间(UTC+8)比较活动日期与当前时间,决定是否激活预约入口
+- 错误处理
+  - 详情接口失败时提示错误;异常时统一兜底
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H as "handleEventDetails"
+participant CL as "CosmoeClient"
+U->>B : "/event_{id}"
+B->>H : 解析 id 并调用处理器
+H->>CL : 获取活动详情
+CL-->>H : 返回详情含时间槽
+H->>U : 发送活动详情与可预约入口
+```
+
+图表来源
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L199)
+
+章节来源
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+
+### /history:预约历史与取消入口
+- 动态参数解析
+  - 无需动态参数,直接读取上下文中的用户标识
+- 凭证与鉴权
+  - 从 KV 中读取用户凭证,设置到客户端;若未登录则提示先登录
+- 数据处理
+  - 拉取历史,按时间倒序取前若干条,格式化输出
+  - 对可取消的历史项生成“/cancel_{booking_id}”入口
+- 时间与状态
+  - 使用北京时间比较活动日期与当前时间,仅对未完成且未来日期的记录开放取消
+- 错误处理
+  - 无历史、鉴权失败、接口异常均给出明确提示
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H as "handleHistoryCommand"
+participant KV as "KV 存储"
+participant CL as "CosmoeClient"
+U->>B : "/history"
+B->>H : 调用处理器
+H->>KV : 读取用户凭证
+KV-->>H : 返回凭证
+H->>CL : 设置凭证并获取历史
+CL-->>H : 返回历史
+H->>U : 发送历史列表含可取消入口
+```
+
+图表来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L226-L239)
+
+章节来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+
+### /book_{event_id}_{slot_index}:预约与优惠券选择
+- 动态参数解析
+  - 使用正则 /^\/book_(\d+)_(\d+)$/ 提取 event_id 与 slot_index
+- 凭证校验
+  - 从 KV 读取用户凭证,设置到客户端;未登录则提示先登录
+- 时间槽校验
+  - 重新拉取活动详情,排序时间槽,校验索引有效性与剩余位数
+- 优惠券策略
+  - 若存在多张可用优惠券,弹出内联键盘供用户选择;支持“不使用优惠券”
+  - 若仅一张或无优惠券,则自动使用或不使用
+- 最终预约
+  - 调用客户端执行预约,返回最终价格、预约编号等信息
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H as "handleBookEvent"
+participant KV as "KV 存储"
+participant CL as "CosmoeClient"
+U->>B : "/book_{event_id}_{slot_index}"
+B->>H : 解析参数并调用处理器
+H->>KV : 读取用户凭证
+KV-->>H : 返回凭证
+H->>CL : 设置凭证并获取活动详情
+CL-->>H : 返回详情含时间槽
+alt 多张优惠券
+H->>U : 弹出优惠券选择键盘
+U->>B : 回调选择优惠券
+B->>H : 触发优惠券选择回调
+else 单张/无优惠券
+H->>CL : 执行预约
+CL-->>H : 返回预约结果
+end
+H->>U : 发送预约成功/失败信息
+```
+
+图表来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L270)
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+
+### /login:对话式登录与凭证存储
+- 交互模式
+  - 使用对话插件,分步询问用户名与密码,等待用户输入
+- 凭证管理
+  - 成功获取 token 后,将 user_id、token、时间戳写入 KV,键为 Telegram 用户 id
+- 错误处理
+  - 输入缺失、认证失败、KV 写入异常均有相应提示
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant C as "对话插件"
+participant H as "handleInteractiveLogin"
+participant CL as "CosmoeClient"
+participant KV as "KV 存储"
+U->>B : "/login"
+B->>C : 进入 login 对话
+C->>H : 触发对话处理器
+H->>U : 请求用户名
+U->>C : 输入用户名
+H->>U : 请求密码
+U->>C : 输入密码
+H->>CL : 获取 token
+CL-->>H : 返回 token
+alt 成功
+H->>KV : 写入凭证
+KV-->>H : 成功
+H->>U : 登录成功提示
+else 失败
+H->>U : 登录失败提示
+end
+```
+
+图表来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+### /cancel_{booking_id} 与确认回调:取消流程
+- 动态参数解析
+  - 使用正则 /^\/cancel_(\d+)$/ 提取 booking_id
+- 取消入口生成
+  - 在历史命令中对可取消的记录生成“/cancel_{booking_id}”入口
+- 二次确认
+  - 弹出“确认/取消”内联键盘;用户点击“确认”触发回调
+- 回调处理
+  - 解析回调动作,读取凭证,调用取消接口,更新消息文本反馈结果
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H1 as "handleCancelCommand"
+participant H2 as "handleCancelConfirmation"
+participant KV as "KV 存储"
+participant CL as "CosmoeClient"
+U->>B : "/cancel_{booking_id}"
+B->>H1 : 解析参数并调用处理器
+H1->>KV : 读取用户凭证
+KV-->>H1 : 返回凭证
+H1->>CL : 设置凭证并获取历史
+CL-->>H1 : 返回历史
+H1->>U : 发送取消确认键盘
+U->>B : 点击“确认”
+B->>H2 : 触发回调处理器
+H2->>KV : 读取用户凭证
+KV-->>H2 : 返回凭证
+H2->>CL : 取消预约
+CL-->>H2 : 返回结果
+H2->>U : 更新消息为成功/失败
+```
+
+图表来源
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+章节来源
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+
+### /logout:登出与凭证清理
+- 行为
+  - 读取 KV 中的用户凭证,存在则删除,不存在则提示先登录
+- 错误处理
+  - KV 读取/删除异常时统一提示
+
+章节来源
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+
+### /start:欢迎与命令指引
+- 行为
+  - 返回欢迎语与可用命令列表,便于新用户快速上手
+
+章节来源
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+
+## 依赖关系分析
+- 插件与存储
+  - 使用 @grammyjs/conversations 提供对话能力,@grammyjs/storage-cloudflare 提供 KV 存储适配
+  - 命令入口中自定义 KV 读写包装,确保 JSON 序列化/反序列化一致性
+- 客户端依赖
+  - 所有处理器依赖 CosmoeClient,后者封装 API 调用、鉴权与数据模型
+- 命令与回调
+  - 命令通过正则监听器接收动态参数;回调通过内联键盘触发,解析动作字符串
+
+```mermaid
+graph LR
+P["@grammyjs/conversations"] --> IDX["src/command/index.ts"]
+S["@grammyjs/storage-cloudflare"] --> IDX
+IDX --> H1["events.ts"]
+IDX --> H2["eventDetails.ts"]
+IDX --> H3["history.ts"]
+IDX --> H4["bookEvent.ts"]
+IDX --> H5["login.ts"]
+IDX --> H6["cancel.ts"]
+IDX --> H7["logout.ts"]
+H1 --> C["src/client/cosmoe.ts"]
+H2 --> C
+H3 --> C
+H4 --> C
+H5 --> C
+H6 --> C
+H7 --> C
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L1-L11)
+- [package.json](file://package.json#L18-L22)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L1-L11)
+- [package.json](file://package.json#L18-L22)
+
+## 性能考量
+- 消息长度控制
+  - 历史命令在发送前截断超长内容,避免 Telegram API 限制
+- 数据量限制
+  - 列表与历史默认只取最近若干条,降低渲染与传输成本
+- KV 访问
+  - 登录/取消/预约等关键流程均需 KV 读写,应关注并发与延迟;可考虑缓存短期会话状态
+- 网络请求
+  - 客户端封装统一的 fetch 调用,建议在高频场景下增加本地缓存与去抖策略
+
+章节来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L94-L98)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L9-L10)
+
+## 故障排查指南
+- 常见问题定位
+  - 动态参数解析失败:检查正则是否与用户输入一致(如 /event_123、/book_1_0)
+  - 未登录:KV 中无凭证或凭证失效,需先执行 /login
+  - 接口异常:客户端返回非 200 或数据结构变化,需查看具体错误消息
+  - KV 读写异常:检查命名空间权限与键名一致性
+- 日志与回退
+  - 处理器中对异常进行捕获并回复友好提示,便于用户自助排查
+- 建议
+  - 为关键流程添加重试与降级策略(如网络波动时的缓存读取)
+
+章节来源
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L23-L26)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L103-L106)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L117)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L80-L83)
+
+## 结论
+该交互式命令体系通过清晰的命令路由、正则参数解析与回调交互,实现了从活动浏览、详情查看、预约下单到历史管理与取消的完整闭环。结合 KV 存储与对话插件,既保证了状态保持,也提升了用户体验。后续可在消息分页、批量操作、错误重试等方面进一步优化。
+
+## 附录
+
+### 交互式命令开发模板
+- 命令注册
+  - 在命令入口中注册命令/正则监听器与回调
+  - 绑定环境变量(KV、Bot 信息等)
+- 处理器骨架
+  - 解析动态参数(正则/上下文)
+  - 校验登录状态与凭证有效性
+  - 调用客户端获取/提交数据
+  - 构造消息与内联键盘(必要时)
+  - 错误处理与用户提示
+- 回调处理
+  - 解析回调动作字符串
+  - 读取上下文与 KV
+  - 更新消息文本或编辑消息
+- 模板参考
+  - 参考现有处理器的结构与错误处理模式
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L12-L75)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+
+### 用户体验优化建议
+- 分页与滚动
+  - 当列表较长时,采用分页或“加载更多”按钮,减少单次消息长度
+- 状态保持
+  - 使用对话插件与 KV 存储保持上下文,避免重复输入
+- 反馈与通知
+  - 关键操作(登录、预约、取消)提供即时反馈与可追踪的 ID
+- 可访问性
+  - 文案简洁明确,提供“取消/返回”等兜底选项
+- 错误恢复
+  - 对网络异常与参数错误提供重试与引导,避免用户卡死

+ 504 - 0
.qoder/repowiki/zh/content/Telegram 集成/命令系统/命令系统.md

@@ -0,0 +1,504 @@
+# 命令系统
+
+<cite>
+**本文引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件系统性梳理该 Telegram 机器人的命令系统,覆盖命令路由机制(command() 与 hears())、正则表达式匹配、交互式对话(conversations)与回调查询处理、以及命令处理器的实现模式与错误处理策略。重点解释 /start、/login、/events、/history、/logout 等命令的处理流程,并给出命令注册最佳实践与性能优化建议。
+
+## 项目结构
+- 入口与运行时:Cloudflare Worker 环境下的入口文件负责初始化 Bot、设置命令菜单、挂载命令路由与调度任务。
+- 命令注册中心:集中定义所有命令与消息监听规则,统一管理对话与回调。
+- 命令处理器:按功能拆分到 handlers 目录,职责单一,便于测试与维护。
+- 客户端封装:对第三方 API 的统一封装,提供认证、事件列表、预约、历史等能力。
+- 调度模块:定时任务用于新活动通知推送。
+
+```mermaid
+graph TB
+A["入口: src/index.ts"] --> B["命令注册: src/command/index.ts"]
+B --> C["命令处理器: handlers/*"]
+C --> D["客户端: src/client/cosmoe.ts"]
+A --> E["调度: src/scheduler/index.ts"]
+A --> F["依赖: package.json"]
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [package.json](file://package.json#L1-L24)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [package.json](file://package.json#L1-L24)
+
+## 核心组件
+- Bot 初始化与 Webhook:入口文件创建 Bot 实例,设置命令菜单并通过 Cloudflare 的 webhook 回调处理请求;同时注册定时任务。
+- 命令注册与路由:
+  - 使用 bot.command() 注册标准命令(如 /start、/login、/events、/history、/logout)。
+  - 使用 bot.hears() 注册基于正则的消息监听(如 /event_{id}、/book_{event_id}_{slot_id}、/cancel_{booking_id})。
+  - 使用 bot.callbackQuery() 注册回调查询处理(如确认取消、优惠券选择)。
+- 对话系统:通过 @grammyjs/conversations 插件启用交互式对话,结合 KV 存储持久化会话状态。
+- 客户端封装:统一的 CosmoeClient 提供认证、事件、预约、历史、取消等 API 封装,支持错误码与数据结构校验。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 架构总览
+整体采用“入口初始化 + 命令注册中心 + 处理器 + 客户端 + 调度”的分层架构。命令注册中心集中管理路由与对话,处理器专注于业务逻辑,客户端抽象外部 API,调度模块负责定时任务。
+
+```mermaid
+graph TB
+subgraph "运行时"
+W["Worker 入口<br/>src/index.ts"]
+S["调度任务<br/>src/scheduler/index.ts"]
+end
+subgraph "命令系统"
+R["命令注册中心<br/>src/command/index.ts"]
+H1["start 处理器<br/>handlers/start.ts"]
+H2["login 处理器<br/>handlers/login.ts"]
+H3["events 处理器<br/>handlers/events.ts"]
+H4["eventDetails 处理器<br/>handlers/eventDetails.ts"]
+H5["bookEvent 处理器<br/>handlers/bookEvent.ts"]
+H6["history 处理器<br/>handlers/history.ts"]
+H7["cancel 处理器<br/>handlers/cancel.ts"]
+H8["logout 处理器<br/>handlers/logout.ts"]
+end
+subgraph "外部服务"
+C["Cosmoe API 客户端<br/>src/client/cosmoe.ts"]
+end
+W --> R
+R --> H1
+R --> H2
+R --> H3
+R --> H4
+R --> H5
+R --> H6
+R --> H7
+R --> H8
+H2 --> C
+H3 --> C
+H4 --> C
+H5 --> C
+H6 --> C
+H7 --> C
+H8 --> C
+W --> S
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 详细组件分析
+
+### 命令路由机制:command() 与 hears()
+- 标准命令路由
+  - /start:直接回复欢迎与可用命令列表。
+  - /login:进入交互式登录对话。
+  - /events:拉取最新活动列表,生成带链接的消息。
+  - /history:根据用户凭证拉取预约历史并格式化展示。
+  - /logout:删除用户凭证。
+- 正则消息监听
+  - /event_{id}:解析活动 ID,获取详情并列出时间段与预约链接。
+  - /book_{event_id}_{slot_index}:解析活动与时间段索引,检查配额与优惠券,发起预约。
+  - /cancel_{booking_id}:解析预约 ID,生成确认键盘。
+- 回调查询处理
+  - confirm_cancel_{id}:执行取消操作。
+  - select_coupon_{event_id}_{slot_index}_{coupon_code}:处理优惠券选择并继续预约流程。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L59-L109)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+
+### 正则表达式匹配与参数解析
+- /event_{id}:使用 /^\/event_(.+)$/ 匹配并提取活动 ID,随后调用事件详情接口。
+- /book_{event_id}_{slot_index}:使用 /^\/book_(\d+)_(\d+)$/ 捕获两个数字参数,分别对应活动 ID 与时间段索引。
+- /cancel_{booking_id}:使用 /^\/cancel_(\d+)$/ 捕获预约 ID。
+- 回调动作解析:使用字符串分割解析 select_coupon_{event_id}_{slot_index}_{coupon_code} 与 confirm_cancel_{id}。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L72-L97)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L10-L11)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L17-L20)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L17-L19)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L166-L175)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L89-L91)
+
+### 交互式对话与回调处理
+- 登录对话:通过 createConversation 创建交互式对话,逐步收集用户名与密码,调用 CosmoeClient 获取 token 并存入 KV。
+- 优惠券选择:当活动存在多个可用优惠券时,生成内联键盘供用户选择;回调解析后继续预约流程。
+- 取消确认:发送内联键盘,用户点击确认或取消,分别执行取消或提示已取消。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L76-L117)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L60-L78)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L131)
+
+### 命令处理函数标准化模板
+- 输入输出约定
+  - 输入:Context 或带 Context 的组合(如带 Conversation 的上下文)。
+  - 输出:Promise<void>,统一通过 ctx.reply()/editMessageText()/answerCallbackQuery() 进行响应。
+- 错误处理策略
+  - try/catch 包裹关键逻辑,捕获异常后向用户反馈通用错误信息。
+  - 对外部 API 调用进行结果码校验,区分成功与失败分支。
+  - 对 KV 读写进行异常捕获与日志记录。
+- 参数解析与校验
+  - 使用正则捕获组提取参数,对空值与越界情况进行保护。
+  - 对用户输入进行基本校验(如用户名、密码非空)。
+- Markdown 渲染与长度限制
+  - 对长文本进行长度截断,避免 Telegram API 限制。
+  - 合理使用 Markdown 格式提升可读性。
+
+章节来源
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+
+### 命令注册最佳实践
+- 集中式注册:将所有命令与监听规则集中在命令注册中心,便于维护与审计。
+- 分离关注点:命令注册只做路由与转发,具体业务逻辑放入独立处理器。
+- 统一环境注入:通过 Env 接口注入 KV 命名空间与 Bot 配置,保证处理器可测试性。
+- 回调与正则命名规范:为回调动作与正则表达式建立清晰的命名约定,便于解析与扩展。
+- 会话持久化:使用 KV Adapter 为对话提供持久化存储,确保多轮交互状态一致。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/index.ts](file://src/command/index.ts#L72-L109)
+
+### 关键命令处理流程
+
+#### /start 流程
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H as "start 处理器"
+U->>B : "/start"
+B->>H : 调用 handleStartCommand(ctx)
+H-->>U : 回复欢迎与可用命令列表
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L59-L61)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L4-L6)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L59-L61)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+
+#### /login 交互式登录流程
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant C as "conversations"
+participant L as "login 处理器"
+participant API as "CosmoeClient"
+U->>B : "/login"
+B->>C : 进入 "login" 会话
+C->>L : 传入 conversation, ctx, env
+L->>U : 请求用户名
+U-->>L : 发送用户名
+L->>U : 请求密码
+U-->>L : 发送密码
+L->>API : getToken(username, password)
+API-->>L : 返回 token
+L->>U : 登录成功并保存凭证
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L64-L67)
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L67)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L140)
+
+#### /events 列表与 /event_{id} 详情流程
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant E as "events 处理器"
+participant ED as "eventDetails 处理器"
+participant API as "CosmoeClient"
+U->>B : "/events"
+B->>E : 调用 handleEventsCommand(ctx)
+E->>API : getEvents()
+API-->>E : 返回事件列表
+E-->>U : 发送活动列表含 /event_{id} 链接
+U->>B : "/event_{id}"
+B->>ED : 调用 handleEventDetails(ctx)
+ED->>API : getEventDetail(id)
+API-->>ED : 返回活动详情
+ED-->>U : 发送活动详情与时间段及 /book_{event_id}_{slot_id} 链接
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L68-L75)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L26)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L60)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L199)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L68-L75)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L199)
+
+#### /book_{event_id}_{slot_index} 预约流程
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant BE as "bookEvent 处理器"
+participant API as "CosmoeClient"
+U->>B : "/book_{event_id}_{slot_index}"
+B->>BE : 调用 handleBookEvent(ctx, env)
+BE->>API : getEventDetail(event_id)
+API-->>BE : 返回活动详情与时间段
+BE->>BE : 校验 slotIndex 与剩余容量
+alt 多个优惠券
+BE-->>U : 展示优惠券选择键盘
+U->>B : 回调 select_coupon_{event_id}_{slot_index}_{coupon_code}
+B->>BE : 调用 handleCouponSelection(ctx, env, action)
+else 单个或无优惠券
+BE->>API : bookEvent({event_id, time_slot, coupon_code?})
+API-->>BE : 返回预约结果
+end
+BE-->>U : 成功/失败消息
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L77-L105)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L117)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L199)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L270)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L329-L343)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L77-L105)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L270)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L329-L343)
+
+#### /history 预约历史流程
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H as "history 处理器"
+participant API as "CosmoeClient"
+U->>B : "/history"
+B->>H : 调用 handleHistoryCommand(ctx, env)
+H->>H : 读取 KV 凭证并校验
+H->>API : getMyBookings()
+API-->>H : 返回预约历史
+H->>H : 格式化消息并添加取消链接
+H-->>U : 发送历史消息
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L82-L84)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L106)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L226-L239)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L82-L84)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L226-L239)
+
+#### /cancel_{booking_id} 取消流程
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant CA as "cancel 处理器"
+participant API as "CosmoeClient"
+U->>B : "/cancel_{booking_id}"
+B->>CA : 调用 handleCancelCommand(ctx, env)
+CA->>API : getMyBookings()
+API-->>CA : 返回预约列表
+CA-->>U : 发送确认键盘
+U->>B : 回调 confirm_cancel_{id}
+B->>CA : 调用 handleCancelConfirmation(ctx, env, action)
+CA->>API : cancelBooking(booking_id)
+API-->>CA : 返回取消结果
+CA-->>U : 成功/失败消息
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L86-L97)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L131)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L86-L97)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+#### /logout 登出流程
+```mermaid
+flowchart TD
+Start(["开始"]) --> GetUserID["获取用户ID"]
+GetUserID --> HasCreds{"KV中是否存在凭证?"}
+HasCreds --> |否| ReplyNotLoggedIn["提示先登录"]
+HasCreds --> |是| DeleteCreds["删除KV中的凭证"]
+DeleteCreds --> ReplySuccess["回复登出成功"]
+ReplyNotLoggedIn --> End(["结束"])
+ReplySuccess --> End
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L107-L109)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L33)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L107-L109)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+
+## 依赖关系分析
+- 运行时依赖:grammy、@grammyjs/conversations、@grammyjs/storage-cloudflare。
+- 入口与命令注册:入口文件负责初始化 Bot、设置命令菜单、挂载命令与调度。
+- 命令处理器:依赖 CosmoeClient 进行外部 API 调用,依赖 KV 命名空间进行凭证与会话存储。
+- 调度模块:依赖 Bot API 向已注册用户推送新活动通知。
+
+```mermaid
+graph LR
+P["package.json"] --> G["grammy"]
+P --> C["@grammyjs/conversations"]
+P --> K["@grammyjs/storage-cloudflare"]
+IDX["src/index.ts"] --> CMD["src/command/index.ts"]
+CMD --> HSTART["handlers/start.ts"]
+CMD --> HLOGIN["handlers/login.ts"]
+CMD --> HEVENTS["handlers/events.ts"]
+CMD --> HEVENTD["handlers/eventDetails.ts"]
+CMD --> HBOOK["handlers/bookEvent.ts"]
+CMD --> HHIST["handlers/history.ts"]
+CMD --> HCANCEL["handlers/cancel.ts"]
+CMD --> HLOGOUT["handlers/logout.ts"]
+HLOGIN --> CC["src/client/cosmoe.ts"]
+HEVENTS --> CC
+HEVENTD --> CC
+HBOOK --> CC
+HHIST --> CC
+HCANCEL --> CC
+HLOGOUT --> CC
+IDX --> SCH["src/scheduler/index.ts"]
+SCH --> CC
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/command/handlers/*.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+章节来源
+- [package.json](file://package.json#L1-L24)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+## 性能考量
+- KV 存储访问:对话与凭证均使用 KV,注意读写次数与延迟,建议:
+  - 对频繁读取的数据进行本地缓存(如会话状态),减少 KV 访问。
+  - 批量操作时合并请求,避免多次往返。
+- API 调用节流:对外部 API 的调用应进行幂等与去重,避免重复请求。
+- 消息长度控制:历史与详情消息可能较长,需在发送前截断,防止 Telegram API 限制导致失败。
+- 正则匹配优化:正则表达式尽量简单明确,避免回溯开销;必要时预编译正则对象。
+- 会话持久化:使用 KV Adapter 时,确保序列化/反序列化稳定,避免大对象频繁写入。
+
+## 故障排查指南
+- 登录失败
+  - 检查用户名与密码是否正确,确认 CosmoeClient.getToken 返回码。
+  - 检查 KV 写入是否成功,确认凭证字段完整。
+- 预约失败
+  - 检查活动 ID 与时间段索引是否有效,确认时间段剩余容量。
+  - 检查用户凭证是否过期或被删除。
+- 历史为空
+  - 确认用户已登录且凭证有效。
+  - 检查外部 API 返回码与数据结构。
+- 取消失败
+  - 确认预约 ID 存在且状态允许取消。
+  - 检查回调解析是否正确。
+- 回调无响应
+  - 确认回调查询已正确注册,answerCallbackQuery 是否被调用。
+- 调度通知未送达
+  - 检查 KV 中用户列表是否为空,确认消息发送返回值。
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L47-L74)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L137-L157)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L32-L44)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L117-L127)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L44-L68)
+
+## 结论
+该命令系统通过集中式路由与处理器分离的设计,实现了清晰的职责划分与良好的可维护性。借助 @grammyjs/conversations 与 KV 存储,系统支持交互式对话与状态持久化;通过正则表达式与回调查询,实现了灵活的消息与交互处理。建议在生产环境中进一步完善缓存策略、错误监控与日志追踪,以提升稳定性与可观测性。
+
+## 附录
+- 命令菜单设置:入口文件在启动时设置命令菜单,便于用户发现可用命令。
+- 定时任务:调度模块定期扫描新活动并向已注册用户推送通知。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L24-L32)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)

+ 303 - 0
.qoder/repowiki/zh/content/Telegram 集成/命令系统/回调查询处理.md

@@ -0,0 +1,303 @@
+# 回调查询处理
+
+<cite>
+**本文引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件系统化阐述 Telegram 机器人中“回调查询(Callback Query)”的处理机制,重点覆盖以下方面:
+- 确认取消与优惠券选择两类回调的触发、路由与处理流程
+- 正则表达式匹配模式的语义解析:confirm_cancel_\d+、cancel_action、select_coupon_\d+_\d+_\w+
+- 回调查询与对话系统(Conversations)的集成方式
+- 安全性考虑与最佳实践
+- 调试与监控方法
+
+## 项目结构
+该机器人采用模块化的命令注册与处理器组织方式,回调查询在命令入口集中注册,并通过正则表达式分发到具体处理器。关键文件如下:
+- 入口与 Webhook:src/index.ts
+- 命令与回调注册:src/command/index.ts
+- 预约与优惠券选择处理:src/command/handlers/bookEvent.ts
+- 取消预约与确认处理:src/command/handlers/cancel.ts
+- 第三方 API 客户端:src/client/cosmoe.ts
+
+```mermaid
+graph TB
+A["src/index.ts<br/>创建 Bot 并设置命令菜单"] --> B["src/command/index.ts<br/>注册命令与回调查询"]
+B --> C["src/command/handlers/cancel.ts<br/>取消命令与确认回调"]
+B --> D["src/command/handlers/bookEvent.ts<br/>预约与优惠券选择回调"]
+D --> E["src/client/cosmoe.ts<br/>Cosmoe API 客户端"]
+C --> E
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+## 核心组件
+- Bot 实例与 Webhook:入口文件创建 Bot 并启用 Cloudflare Worker 的 webhook 回调适配器,同时设置命令菜单。
+- 命令与回调注册:命令入口安装对话插件(Conversations),并注册各类命令与回调查询处理器。
+- 取消流程回调:针对 confirm_cancel_{booking_id} 与 cancel_action 的回调查询进行处理。
+- 优惠券选择回调:针对 select_coupon_{event_id}_{slot_index}_{coupon_code_or_none} 的回调查询进行处理。
+- API 客户端:封装对第三方服务的调用,包括获取活动详情、查询可用优惠券、取消预约等。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 架构总览
+回调查询处理的整体流程如下:
+- 用户点击内联键盘按钮触发回调查询
+- Bot 根据回调数据的前缀与格式匹配正则表达式
+- 将回调数据交由对应处理器执行业务逻辑
+- 使用 answerCallbackQuery 进行响应,避免 Telegram 显示“加载中”
+- 对于需要更新消息的场景,使用 editMessageText 更新确认提示或选择结果
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot(grammy)"
+participant R as "回调路由"
+participant H1 as "取消确认处理器"
+participant H2 as "优惠券选择处理器"
+participant API as "CosmoeClient"
+U->>B : 点击内联键盘按钮
+B->>R : 分发回调查询
+alt 匹配 confirm_cancel_\\d+ 或 cancel_action
+R->>H1 : 调用取消确认处理器
+H1->>API : 取消预约
+API-->>H1 : 返回结果
+H1-->>U : 编辑消息反馈
+else 匹配 select_coupon_\\d+_\\d+_\\w+
+R->>H2 : 调用优惠券选择处理器
+H2->>API : 获取活动详情/执行预约
+API-->>H2 : 返回结果
+H2-->>U : 编辑消息反馈
+end
+R->>B : 调用 answerCallbackQuery
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L105)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L86-L132)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L422)
+
+## 详细组件分析
+
+### 回调查询路由与匹配规则
+- 取消确认回调路由
+  - 正则:confirm_cancel_\\d+|cancel_action
+  - 触发条件:按钮数据以 confirm_cancel_{booking_id} 开头,或为 cancel_action
+  - 处理流程:解析 booking_id,校验用户凭证,调用取消接口,编辑消息反馈结果
+- 优惠券选择回调路由
+  - 正则:select_coupon_\\d+_\\d+_\\w+
+  - 触发条件:按钮数据以 select_coupon_{event_id}_{slot_index}_{coupon_code_or_none} 形式
+  - 处理流程:解析 event_id、slot_index、coupon_code,校验用户凭证,获取活动详情,执行预约,编辑消息反馈结果
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L105)
+
+### 确认取消回调逻辑
+- 触发来源:取消命令生成的内联键盘,包含“确认”和“取消”两个按钮
+- 数据格式:confirm_cancel_{booking_id}、cancel_action
+- 处理要点:
+  - 解析 action 字符串,区分 confirm_cancel 与 cancel_action
+  - 从 KV 中读取用户凭证,校验认证状态
+  - 调用取消接口,根据返回结果编辑消息提示
+  - 使用 answerCallbackQuery 清除加载态
+
+```mermaid
+flowchart TD
+Start(["收到回调查询"]) --> Parse["解析 action 字符串"]
+Parse --> Type{"类型判断"}
+Type --> |confirm_cancel_*| Validate["校验用户凭证"]
+Validate --> CancelAPI["调用取消接口"]
+CancelAPI --> Result{"返回码为 200?"}
+Result --> |是| EditSuccess["编辑消息:成功"]
+Result --> |否| EditFail["编辑消息:失败"]
+Type --> |cancel_action| EditCancel["编辑消息:已取消"]
+EditSuccess --> Done(["结束"])
+EditFail --> Done
+EditCancel --> Done
+```
+
+图表来源
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L86-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+章节来源
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+### 优惠券选择回调逻辑
+- 触发来源:预约流程中存在多个可用优惠券时,展示选择键盘
+- 数据格式:select_coupon_{event_id}_{slot_index}_{coupon_code_or_none}
+- 处理要点:
+  - 解析 action,提取 event_id、slot_index、coupon_code(none 表示不使用)
+  - 从 KV 中读取用户凭证,校验认证状态
+  - 获取活动详情与时间槽,校验索引有效性
+  - 编辑消息显示所选优惠券,随后执行预约并反馈结果
+  - 使用 answerCallbackQuery 清除加载态
+
+```mermaid
+flowchart TD
+Start(["收到回调查询"]) --> Parse["解析 action 字符串"]
+Parse --> Extract["提取 event_id/slot_index/coupon_code"]
+Extract --> Validate["校验用户凭证与活动详情"]
+Validate --> FetchSlots["获取并排序时间槽"]
+FetchSlots --> CheckIdx{"slot_index 有效?"}
+CheckIdx --> |否| EditErr["编辑消息:无效时间段"]
+CheckIdx --> |是| ShowSel["编辑消息:显示所选优惠券"]
+ShowSel --> Book["执行预约可带 coupon_code"]
+Book --> Result{"返回码为 200?"}
+Result --> |是| EditOk["编辑消息:成功并显示最终价格/编号"]
+Result --> |否| EditErr2["编辑消息:失败"]
+EditErr --> Done(["结束"])
+EditErr2 --> Done
+EditOk --> Done
+```
+
+图表来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L270)
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L270)
+
+### 回调查询与对话系统的集成
+- 对话插件安装:命令入口安装 conversations 插件,并使用 KV 存储对话状态
+- 登录对话:通过 createConversation 创建交互式登录对话,便于后续流程复用
+- 回调处理中的对话:回调处理器内部不直接进入对话,而是基于 KV 凭证与 API 客户端完成业务处理
+- 存储与恢复:对话状态通过 KVAdapter 读写,确保跨请求的状态一致性
+
+```mermaid
+graph LR
+Cfg["对话配置<br/>KVAdapter + conversations"] --> KV["COSMOE_STORAGE KV"]
+LoginConv["登录对话"] --> KV
+CancelHandler["取消处理器"] --> KV
+CouponHandler["优惠券处理器"] --> KV
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+
+### 正则表达式匹配模式解析
+- confirm_cancel_\\d+
+  - 含义:以 confirm_cancel_ 开头,后接一个或多个数字(表示预约 ID)
+  - 用途:用于取消确认的回调
+- cancel_action
+  - 含义:固定字符串,表示用户选择“取消”操作
+  - 用途:用于取消确认的回调
+- select_coupon_\\d+_\\d+_\\w+
+  - 含义:以 select_coupon_ 开头,后接事件 ID、下划线、时间段索引、下划线、优惠券代码或 none
+  - 用途:用于优惠券选择的回调
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L105)
+
+## 依赖关系分析
+- 模块耦合
+  - 回调路由集中在命令入口注册,处理器之间低耦合,职责清晰
+  - 处理器依赖 API 客户端,API 客户端依赖第三方服务
+- 外部依赖
+  - grammy:Telegram Bot SDK
+  - @grammyjs/conversations:对话插件
+  - @grammyjs/storage-cloudflare:KV 存储适配器
+- 关键依赖链
+  - 回调查询 -> 路由 -> 处理器 -> API 客户端 -> 第三方服务
+  - 对话状态 -> KV 存储 -> KV 命名空间
+
+```mermaid
+graph TB
+Q["回调查询"] --> M["回调路由"]
+M --> H1["取消处理器"]
+M --> H2["优惠券处理器"]
+H1 --> K["KV 凭证/COSMOE_CREDENTIALS"]
+H2 --> K
+H1 --> A["CosmoeClient"]
+H2 --> A
+A --> S["第三方服务"]
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L105)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 性能考量
+- 回调查询处理应尽量短小精悍,避免阻塞
+- 使用 answerCallbackQuery 快速响应,减少 Telegram 端“加载中”提示
+- 对外 API 调用建议异步并发控制,避免频繁请求导致超时
+- 对 KV 读写进行必要的缓存与去重,降低 KV 访问频率
+- 在高频场景下,可考虑对回调数据进行幂等设计,避免重复处理
+
+## 故障排查指南
+- 回调无响应
+  - 检查回调路由是否正确注册(正则匹配)
+  - 确认 answerCallbackQuery 是否被调用
+- 权限不足或凭证缺失
+  - 检查 KV 中是否存在用户凭证
+  - 确认凭证是否过期或被删除
+- 业务异常
+  - 查看处理器日志输出,定位具体步骤
+  - 核对第三方服务返回码与消息
+- 消息未更新
+  - 确认 editMessageText 的调用时机与目标消息 ID
+  - 检查内联键盘是否仍存在(按钮点击后可能失效)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L105)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L86-L132)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+
+## 结论
+本项目的回调查询处理通过明确的正则路由与清晰的处理器职责,实现了“确认取消”和“优惠券选择”的完整闭环。结合对话插件与 KV 存储,既保证了用户体验,也确保了状态管理的一致性。建议在生产环境中强化日志与监控,完善错误处理与重试策略,持续优化第三方服务调用的稳定性与性能。
+
+## 附录
+- 安全最佳实践
+  - 对回调数据进行严格的格式校验与长度限制
+  - 对关键操作(取消、支付)增加二次确认与权限校验
+  - 对 KV 读写进行访问控制与审计
+  - 对外 API 调用增加超时与重试策略
+- 调试与监控
+  - 在处理器中记录关键参数与返回值
+  - 使用日志平台聚合回调处理日志
+  - 对高频回调进行采样与告警阈值设置

+ 296 - 0
.qoder/repowiki/zh/content/Telegram 集成/命令系统/基础命令.md

@@ -0,0 +1,296 @@
+# 基础命令
+
+<cite>
+**本文引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能与可靠性考量](#性能与可靠性考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录:命令扩展与最佳实践](#附录命令扩展与最佳实践)
+
+## 简介
+本文件聚焦于基础命令的实现与使用,包括 /start、/login、/logout 的功能特性、参数处理、响应格式与错误处理机制,并解释命令注册方式与最佳实践。同时提供调用示例、常见使用场景以及扩展与自定义指导建议,帮助开发者快速理解与维护该机器人。
+
+## 项目结构
+- 入口与命令注册
+  - 入口文件负责初始化 Bot 并调用命令注册函数,设置命令菜单。
+  - 命令注册集中在一个模块中,统一挂载命令、对话与回调处理。
+- 命令处理器
+  - 每个命令对应一个处理器文件,职责单一,便于测试与扩展。
+- 客户端封装
+  - 对外服务(Cosmoe)接口通过客户端类统一封装,便于认证与数据交互。
+
+```mermaid
+graph TB
+A["入口<br/>src/index.ts"] --> B["命令注册<br/>src/command/index.ts"]
+B --> C["开始命令处理器<br/>src/command/handlers/start.ts"]
+B --> D["登录命令处理器<br/>src/command/handlers/login.ts"]
+B --> E["登出命令处理器<br/>src/command/handlers/logout.ts"]
+D --> F["Cosmoe 客户端<br/>src/client/cosmoe.ts"]
+E --> F
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+## 核心组件
+- 命令注册器
+  - 负责安装对话插件、创建对话、注册命令与消息监听、回调处理等。
+- 开始命令处理器
+  - 返回欢迎语与可用命令列表。
+- 登录命令处理器
+  - 基于对话进行交互式登录,调用外部 API 获取令牌并持久化到 KV。
+- 登出命令处理器
+  - 读取并删除用户凭证,清理本地状态。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+
+## 架构总览
+下图展示从请求进入至命令处理与外部服务交互的整体流程。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant W as "Webhook 入口<br/>src/index.ts"
+participant R as "命令注册器<br/>src/command/index.ts"
+participant H as "处理器<br/>start/login/logout"
+participant C as "Cosmoe 客户端<br/>src/client/cosmoe.ts"
+participant K as "KV 存储<br/>COSMOE_CREDENTIALS/COSMOE_STORAGE"
+U->>W : 发送命令或消息
+W->>R : 初始化并注册命令
+R->>R : 安装对话插件/创建对话
+U->>R : 触发 /start 或 /login 或 /logout
+alt /start
+R->>H : 调用 handleStartCommand
+H-->>U : 返回欢迎与命令列表
+else /login
+R->>H : 进入登录对话
+H->>C : 调用 getToken 获取令牌
+C-->>H : 返回认证结果
+H->>K : 写入用户凭证
+H-->>U : 返回登录结果
+else /logout
+R->>H : 调用 handleLogoutCommand
+H->>K : 删除用户凭证
+H-->>U : 返回登出结果
+end
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+
+## 详细组件分析
+
+### /start 命令
+- 功能特性
+  - 向用户发送欢迎信息与可用命令提示。
+- 参数处理
+  - 无命令参数;直接读取上下文并回复。
+- 响应格式
+  - 文本消息,包含欢迎语与命令列表。
+- 错误处理
+  - 处理器内未显式抛错;若网络异常由框架层兜底。
+- 使用场景
+  - 新用户首次进入、需要查看可用命令时。
+
+```mermaid
+flowchart TD
+S["收到 /start"] --> P["读取上下文"]
+P --> R["构造欢迎与命令列表文本"]
+R --> E["发送回复"]
+E --> X["结束"]
+```
+
+图表来源
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+
+章节来源
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+
+### /login 命令
+- 功能特性
+  - 通过交互式对话引导用户提供用户名与密码,调用外部 API 获取令牌并保存到 KV。
+- 参数处理
+  - 无命令参数;通过对话等待用户输入用户名与密码。
+- 响应格式
+  - 文本消息,反馈登录成功或失败原因。
+- 错误处理
+  - 输入缺失时中止并提示;外部 API 失败时返回错误信息;异常捕获后统一提示“稍后重试”。
+- 使用场景
+  - 需要访问受保护资源(如历史记录)前的认证步骤。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant R as "命令注册器"
+participant L as "登录对话处理器"
+participant C as "Cosmoe 客户端"
+participant K as "KV 存储"
+U->>R : 触发 /login
+R->>L : 进入对话
+L->>U : 提示输入用户名
+U-->>L : 回复用户名
+L->>U : 提示输入密码
+U-->>L : 回复密码
+L->>C : 调用 getToken
+C-->>L : 返回认证结果
+alt 成功
+L->>K : 写入凭证
+L-->>U : 登录成功
+else 失败
+L-->>U : 登录失败
+end
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L66)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L66)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+
+### /logout 命令
+- 功能特性
+  - 清除当前用户的凭证信息,完成登出。
+- 参数处理
+  - 无命令参数;根据上下文获取用户 ID。
+- 响应格式
+  - 文本消息,反馈登出成功或失败原因。
+- 错误处理
+  - 无法获取用户身份、KV 读取/删除异常时均给出明确提示。
+- 使用场景
+  - 用户主动登出或切换账号。
+
+```mermaid
+flowchart TD
+S["收到 /logout"] --> G["获取用户ID"]
+G --> V{"存在凭证?"}
+V --> |否| N["提示先登录"] --> X["结束"]
+V --> |是| D["删除凭证"]
+D --> OK["发送登出成功消息"] --> X
+```
+
+图表来源
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+
+章节来源
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+
+## 依赖关系分析
+- 运行时依赖
+  - grammy:Telegram Bot 框架。
+  - @grammyjs/conversations:对话能力。
+  - @grammyjs/storage-cloudflare:Cloudflare KV 存储适配器。
+- 项目内部依赖
+  - 命令注册器依赖各处理器;处理器依赖 Cosmoe 客户端;KV 作为凭证存储。
+
+```mermaid
+graph LR
+P["package.json"] --> G["grammy"]
+P --> C["@grammyjs/conversations"]
+P --> S["@grammyjs/storage-cloudflare"]
+IDX["src/command/index.ts"] --> HSTART["handlers/start.ts"]
+IDX --> HLOGIN["handlers/login.ts"]
+IDX --> HLOGOUT["handlers/logout.ts"]
+HLOGIN --> CC["client/cosmoe.ts"]
+HLOGOUT --> CC
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [src/command/index.ts](file://src/command/index.ts#L1-L11)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [src/command/index.ts](file://src/command/index.ts#L1-L11)
+
+## 性能与可靠性考量
+- 对话存储
+  - 使用 Cloudflare KV 作为对话状态存储,具备跨实例一致性与低延迟特性。
+- 异常处理
+  - 登录与登出处理器均包含 try/catch,避免崩溃并返回友好提示。
+- 命令菜单
+  - 在入口处一次性设置命令菜单,减少重复调用带来的开销。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/index.ts](file://src/index.ts#L23-L32)
+
+## 故障排查指南
+- /start 无响应
+  - 检查命令注册是否生效;确认入口已调用命令注册器。
+- /login 无法完成
+  - 确认外部 API 可达且凭据正确;检查 KV 写入权限;查看控制台日志定位异常。
+- /logout 无效
+  - 确认 KV 中是否存在该用户的凭证;检查删除操作是否成功。
+- 命令菜单未显示
+  - 检查入口设置命令菜单的调用是否执行;关注错误日志。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L23-L32)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L70-L73)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L30-L33)
+
+## 结论
+基础命令围绕“欢迎引导—认证—清理”的核心路径构建,采用清晰的职责分离与健壮的错误处理策略。通过对话与 KV 的结合,实现了良好的用户体验与可维护性。后续扩展可在现有注册器与客户端封装基础上,按需新增命令与对话。
+
+## 附录:命令扩展与最佳实践
+- 命令注册方式
+  - 在命令注册器中添加 bot.command 或 bot.hears,并绑定对应的处理器。
+  - 对话型命令通过 createConversation 注册并在命令中 enter 对话。
+- 参数与上下文
+  - 优先从上下文提取用户信息与消息内容;对空值进行显式校验与提示。
+- 响应格式
+  - 统一使用文本消息;必要时配合按钮或内联键盘以提升交互体验。
+- 错误处理
+  - 包裹关键流程在 try/catch 中;对 KV 读写、外部 API 调用分别处理异常。
+- 扩展建议
+  - 将通用逻辑抽象为工具函数(如 KV 访问、API 调用包装),降低重复代码。
+  - 为每个命令编写单元测试,覆盖正常与异常分支。
+  - 对敏感信息(如令牌)仅在内存中使用,持久化时确保键名唯一且有时间戳。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)

+ 376 - 0
.qoder/repowiki/zh/content/Telegram 集成/命令系统/预约命令.md

@@ -0,0 +1,376 @@
+# 预约命令
+
+<cite>
+**本文引用的文件**
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向“预约命令”的实现与使用,围绕以下命令展开:
+- 预约创建:/book_{event_id}_{slot_id}
+- 预约取消:/cancel_{booking_id}
+- 活动浏览:/events、/event_{id}
+- 历史查询:/history
+- 登录/登出:/login、/logout、/start
+
+文档将深入解释命令解析、用户认证、活动与时间槽选择、优惠券应用、取消确认流程、状态管理与并发控制策略,并提供错误处理与数据一致性保障方案,以及扩展开发指导。
+
+## 项目结构
+该机器人采用模块化命令分发与客户端封装:
+- 命令入口与路由:在命令入口中注册所有命令与回调查询,绑定环境变量(KV 存储)。
+- 命令处理器:每个命令对应一个处理器文件,负责解析输入、调用客户端 API、构建交互式键盘与消息。
+- 客户端封装:统一的 CosmoeClient 封装 API 请求、认证状态与数据模型。
+
+```mermaid
+graph TB
+subgraph "命令层"
+CMD_INDEX["命令入口<br/>src/command/index.ts"]
+H_BOOK["预约处理器<br/>src/command/handlers/bookEvent.ts"]
+H_CANCEL["取消处理器<br/>src/command/handlers/cancel.ts"]
+H_EVENTS["活动列表处理器<br/>src/command/handlers/events.ts"]
+H_EVENTD["活动详情处理器<br/>src/command/handlers/eventDetails.ts"]
+H_HISTORY["历史处理器<br/>src/command/handlers/history.ts"]
+H_LOGIN["登录处理器<br/>src/command/handlers/login.ts"]
+H_LOGOUT["登出处理器<br/>src/command/handlers/logout.ts"]
+H_START["开始处理器<br/>src/command/handlers/start.ts"]
+end
+subgraph "客户端层"
+C_CLIENT["CosmoeClient<br/>src/client/cosmoe.ts"]
+end
+CMD_INDEX --> H_BOOK
+CMD_INDEX --> H_CANCEL
+CMD_INDEX --> H_EVENTS
+CMD_INDEX --> H_EVENTD
+CMD_INDEX --> H_HISTORY
+CMD_INDEX --> H_LOGIN
+CMD_INDEX --> H_LOGOUT
+CMD_INDEX --> H_START
+H_BOOK --> C_CLIENT
+H_CANCEL --> C_CLIENT
+H_EVENTS --> C_CLIENT
+H_EVENTD --> C_CLIENT
+H_HISTORY --> C_CLIENT
+H_LOGIN --> C_CLIENT
+H_LOGOUT --> C_CLIENT
+H_START --> C_CLIENT
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+## 核心组件
+- 命令入口与路由:集中注册命令与回调查询,绑定 KV 存储用于会话与凭证持久化。
+- 预约处理器:解析 /book_{event_id}_{slot_id},校验用户登录状态,拉取活动详情与时间槽,支持优惠券选择与自动下单。
+- 取消处理器:解析 /cancel_{booking_id},展示确认键盘,二次确认后调用取消接口。
+- 客户端封装:统一的 CosmoeClient 提供认证、事件查询、预约、取消等能力,并维护认证状态。
+- 会话与存储:通过 KV 适配器为会话与对话状态提供持久化。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 架构总览
+命令到 API 的整体调用链如下:
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "命令入口<br/>src/command/index.ts"
+participant HB as "预约处理器<br/>src/command/handlers/bookEvent.ts"
+participant HC as "取消处理器<br/>src/command/handlers/cancel.ts"
+participant CC as "CosmoeClient<br/>src/client/cosmoe.ts"
+participant KV as "KV 存储"
+U->>B : 发送命令 /book_{event_id}_{slot_id}
+B->>HB : 路由到预约处理器
+HB->>KV : 读取用户凭证
+KV-->>HB : 返回凭证
+HB->>CC : 获取活动详情与时间槽
+CC-->>HB : 返回活动数据
+HB->>U : 展示优惠券选择键盘如适用
+U->>B : 回调选择优惠券
+B->>HB : 调用优惠券选择处理器
+HB->>CC : 下单含可选优惠券
+CC-->>HB : 返回下单结果
+HB-->>U : 成功/失败消息
+U->>B : 发送命令 /cancel_{booking_id}
+B->>HC : 路由到取消处理器
+HC->>CC : 查询我的预约
+CC-->>HC : 返回预约列表
+HC->>U : 展示取消确认键盘
+U->>B : 回调确认取消
+B->>HC : 调用取消确认处理器
+HC->>CC : 执行取消
+CC-->>HC : 返回取消结果
+HC-->>U : 成功/失败消息
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L77-L105)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L270)
+
+## 详细组件分析
+
+### 预约命令 /book_{event_id}_{slot_id}
+- 命令解析:使用正则匹配 /book_{event_id}_{slot_index},提取活动 ID 与时间槽索引。
+- 认证检查:从 KV 中读取用户凭证,若无则提示先登录。
+- 活动与时间槽:调用客户端获取活动详情,按 range 排序,校验索引有效性与剩余容量。
+- 优惠券应用:
+  - 若存在多个可用优惠券,生成内联键盘让用户选择;支持“不使用优惠券”选项。
+  - 若仅有一个优惠券,自动应用;若无优惠券,则直接下单。
+- 下单流程:构造下单请求(event_id、time_slot、可选 coupon_code),调用客户端下单接口,返回最终价格、预约编号等信息并反馈给用户。
+
+```mermaid
+flowchart TD
+Start(["进入 /book_{event_id}_{slot_id}"]) --> Parse["解析命令参数<br/>提取 event_id, slot_index"]
+Parse --> CheckAuth["从 KV 读取用户凭证"]
+CheckAuth --> HasAuth{"有凭证?"}
+HasAuth --> |否| PromptLogin["提示先登录"] --> End
+HasAuth --> |是| FetchEvent["获取活动详情与时间槽"]
+FetchEvent --> ValidateIndex{"索引有效且有余量?"}
+ValidateIndex --> |否| ShowError["提示错误并结束"] --> End
+ValidateIndex --> |是| CheckCoupons{"是否有可用优惠券?"}
+CheckCoupons --> |多张| ShowKeyboard["展示优惠券选择键盘"] --> End
+CheckCoupons --> |一张| AutoApply["自动应用唯一优惠券"]
+CheckCoupons --> |无| NoCoupon["不使用优惠券"]
+AutoApply --> PlaceOrder["调用下单接口"]
+NoCoupon --> PlaceOrder
+PlaceOrder --> OrderOK{"下单成功?"}
+OrderOK --> |是| ReplySuccess["回复成功消息含最终价格/编号/优惠码"] --> End
+OrderOK --> |否| ReplyFail["回复失败消息"] --> End
+```
+
+图表来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L17-L117)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L270)
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L270)
+
+### 取消命令 /cancel_{booking_id}
+- 命令解析:使用正则匹配 /cancel_{booking_id},提取预约 ID。
+- 认证检查:从 KV 读取凭证,确保已登录。
+- 预约确认:调用客户端获取我的预约,查找目标预约,不存在则提示。
+- 确认流程:生成“确认/取消”内联键盘,展示预约详情与风险提示。
+- 取消执行:用户确认后调用取消接口,返回结果并更新消息。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "命令入口"
+participant HC as "取消处理器"
+participant CC as "CosmoeClient"
+participant KV as "KV 存储"
+U->>B : 发送 /cancel_{booking_id}
+B->>HC : 路由到取消处理器
+HC->>KV : 读取用户凭证
+KV-->>HC : 返回凭证
+HC->>CC : 获取我的预约
+CC-->>HC : 返回预约列表
+HC->>U : 展示确认键盘
+U->>B : 回调 confirm_cancel 或 cancel_action
+alt 确认取消
+B->>HC : 调用取消确认处理器
+HC->>CC : 执行取消
+CC-->>HC : 返回取消结果
+HC-->>U : 更新为成功/失败消息
+else 取消
+HC-->>U : 更新为已取消
+end
+```
+
+图表来源
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L17-L84)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L226-L239)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+章节来源
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L226-L239)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+### 活动与时间槽展示
+- /events:列出最近的摄影活动,每个活动附带跳转到详情页的命令链接。
+- /event_{id}:获取活动详情,排序时间槽并显示剩余/容量;对可预约且当天或之前的时间槽,提供对应的 /book_{event_id}_{slot_index} 链接。
+
+章节来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L26)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L10-L60)
+
+### 历史与登录/登出
+- /history:获取用户预约历史,按时间倒序取最新若干条,对可取消的预约显示 /cancel_{booking_id} 链接。
+- /login:交互式登录,向 Cosmoe API 获取 token 并存入 KV。
+- /logout:删除 KV 中的用户凭证。
+- /start:欢迎信息与可用命令提示。
+
+章节来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L106)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L33)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L4-L5)
+
+## 依赖关系分析
+- 命令入口依赖各处理器与 KV 存储,负责命令与回调查询的路由。
+- 处理器依赖 CosmoeClient 进行 API 调用,并依赖 KV 存储进行凭证与会话持久化。
+- 客户端封装统一的 API 行为,包括认证状态检查与错误处理。
+
+```mermaid
+graph LR
+CMD_INDEX["src/command/index.ts"] --> H_BOOK["src/command/handlers/bookEvent.ts"]
+CMD_INDEX --> H_CANCEL["src/command/handlers/cancel.ts"]
+CMD_INDEX --> H_EVENTS["src/command/handlers/events.ts"]
+CMD_INDEX --> H_EVENTD["src/command/handlers/eventDetails.ts"]
+CMD_INDEX --> H_HISTORY["src/command/handlers/history.ts"]
+CMD_INDEX --> H_LOGIN["src/command/handlers/login.ts"]
+CMD_INDEX --> H_LOGOUT["src/command/handlers/logout.ts"]
+CMD_INDEX --> H_START["src/command/handlers/start.ts"]
+H_BOOK --> C_CLIENT["src/client/cosmoe.ts"]
+H_CANCEL --> C_CLIENT
+H_EVENTS --> C_CLIENT
+H_EVENTD --> C_CLIENT
+H_HISTORY --> C_CLIENT
+H_LOGIN --> C_CLIENT
+H_LOGOUT --> C_CLIENT
+H_START --> C_CLIENT
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 性能考虑
+- API 调用频率:活动列表、详情、预约历史、下单与取消均涉及网络请求,建议在处理器中避免重复请求,必要时缓存短期结果。
+- 消息长度限制:历史消息可能较长,已做截断处理,避免超出 Telegram API 限制。
+- KV 存储:凭证与会话存储在 KV 中,注意键空间命名与过期策略,避免无限增长。
+- 时间计算:活动日与当前时间比较使用北京时间偏移,确保本地化正确性。
+
+章节来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L94-L97)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L23-L35)
+
+## 故障排查指南
+- 命令未响应
+  - 检查命令是否被正确注册与路由(命令入口)。
+  - 确认回调查询正则匹配是否正确。
+- 无法登录
+  - 确认 /login 是否成功写入 KV,检查凭证格式与有效期。
+- 预约失败
+  - 检查时间槽剩余容量与索引合法性。
+  - 确认优惠券是否仍有效且适用于该活动。
+- 取消失败
+  - 确认预约是否存在且状态允许取消。
+  - 检查回调数据格式与解析逻辑。
+- 错误处理策略
+  - 所有处理器均包含 try/catch,出现异常时回复通用错误消息并记录日志。
+  - 客户端方法在未认证时抛出错误,需在调用前确保已设置凭证。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L77-L105)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L117)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L80-L83)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L207-L209)
+
+## 结论
+该预约系统通过清晰的命令分发与处理器职责划分,结合 KV 存储与客户端封装,实现了从活动浏览、时间槽选择、优惠券应用到预约与取消的完整闭环。系统具备良好的可扩展性与错误处理能力,适合在此基础上进一步增强并发控制、状态机与审计日志。
+
+## 附录
+
+### 命令一览与行为
+- /start:欢迎信息与可用命令提示。
+- /events:列出最近活动,附带 /event_{id} 链接。
+- /event_{id}:展示活动详情与时间槽,提供 /book_{event_id}_{slot_index} 链接。
+- /book_{event_id}_{slot_index}:预约创建,支持优惠券选择与自动下单。
+- /history:展示预约历史,对可取消项提供 /cancel_{booking_id} 链接。
+- /cancel_{booking_id}:取消预约,二次确认后执行。
+- /login:交互式登录,保存凭证至 KV。
+- /logout:删除 KV 中的用户凭证。
+
+章节来源
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L4-L5)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L26)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L10-L60)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L17-L117)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L106)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L17-L84)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L33)
+
+### 数据模型与 API 关键点
+- CosmoeClient 提供认证、事件、预约、取消等方法,内部维护 userId 与 token。
+- 预约请求包含 event_id、time_slot、可选 coupon_code。
+- 预约响应包含最终价格、预约编号等字段,便于回执展示。
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+### 并发控制与状态管理
+- 当前实现未显式引入分布式锁或队列,建议在关键路径(如下单)增加幂等键与重试策略,避免重复提交。
+- 使用 KV 存储会话与凭证,注意键冲突与并发读写的一致性问题。
+- 对于高并发场景,可在客户端层引入重试与退避策略,并在处理器中对同一用户的连续请求进行限流。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L21-L52)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L269)
+
+### 扩展开发指导
+- 新增命令:在命令入口注册新命令与回调查询,编写处理器文件并在入口中导入。
+- 新增 API:在 CosmoeClient 中新增方法,遵循现有认证与错误处理模式。
+- 优化体验:引入会话状态机管理多步流程,减少 KV 读写次数;对长消息进行分片发送。
+- 安全加固:对命令输入进行更严格的校验与白名单过滤;对敏感操作增加二次确认与审计日志。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [package.json](file://package.json#L18-L22)

+ 286 - 0
.qoder/repowiki/zh/content/Telegram 集成/回调查询处理.md

@@ -0,0 +1,286 @@
+# 回调查询处理
+
+<cite>
+**本文档引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+
+## 简介
+本文件系统性阐述 Telegram 机器人中回调查询(callbackQuery)的处理机制与最佳实践,覆盖以下主题:
+- callbackQuery() 方法的注册与使用
+- 不同类型回调查询的处理流程:取消确认、优惠券选择
+- answerCallbackQuery() 的使用时机与最佳实践
+- 回调查询数据格式设计规范与安全考虑
+- 完整的回调处理示例与用户体验优化技巧
+
+## 项目结构
+该项目基于 grammY 框架构建,采用模块化组织,回调查询处理集中在命令路由层,通过正则表达式匹配不同类型的回调数据,并分派到对应的处理器。
+
+```mermaid
+graph TB
+A["入口: src/index.ts<br/>创建 Bot 并设置命令菜单"] --> B["命令路由: src/command/index.ts<br/>注册回调查询处理器"]
+B --> C["取消确认处理器: src/command/handlers/cancel.ts"]
+B --> D["优惠券选择处理器: src/command/handlers/bookEvent.ts"]
+C --> E["API 客户端: src/client/cosmoe.ts"]
+D --> E
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+## 核心组件
+- 回调查询路由与分发:在命令路由中注册两类回调查询处理器,分别用于取消确认与优惠券选择。
+- 取消确认处理器:接收“确认取消”和“取消操作”的回调数据,执行取消逻辑并编辑消息。
+- 优惠券选择处理器:解析优惠券选择数据,支持多优惠券场景下的用户交互与自动下单。
+- API 客户端:封装与外部服务的交互,提供认证、事件详情、预约、取消等功能。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L105)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L86-L132)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 架构总览
+回调查询处理的整体流程如下:用户点击内联键盘按钮触发回调;grammY 路由根据正则匹配回调数据,调用对应处理器;处理器完成业务逻辑后,通常调用 answerCallbackQuery() 清除加载指示,最后编辑或回复消息以反馈结果。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant T as "Telegram 客户端"
+participant B as "Bot(grammY)"
+participant R as "回调路由(src/command/index.ts)"
+participant H1 as "取消处理器(src/command/handlers/cancel.ts)"
+participant H2 as "优惠券处理器(src/command/handlers/bookEvent.ts)"
+participant C as "API客户端(src/client/cosmoe.ts)"
+U->>T : 点击内联按钮
+T->>B : 发送 callback_query
+B->>R : 匹配回调数据
+alt 取消确认
+R->>H1 : 调用 handleCancelConfirmation(data)
+H1->>C : 执行取消操作
+C-->>H1 : 返回结果
+H1->>B : 编辑消息/回复
+H1->>B : ctx.answerCallbackQuery()
+else 优惠券选择
+R->>H2 : 调用 handleCouponSelection(data)
+H2->>C : 获取事件详情/下单
+C-->>H2 : 返回结果
+H2->>B : 编辑消息/回复
+H2->>B : ctx.answerCallbackQuery()
+end
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L105)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L86-L132)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 详细组件分析
+
+### 回调查询路由与匹配
+- 注册两个回调查询处理器,分别使用正则表达式匹配不同类型的回调数据:
+  - 取消确认:匹配“confirm_cancel_{id}”或“cancel_action”
+  - 优惠券选择:匹配“select_coupon_{event_id}_{slot_index}_{coupon_code}”
+- 在处理器内部,先校验回调数据存在性,再调用对应处理器函数,最后统一调用 answerCallbackQuery() 清除加载指示。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L105)
+
+### 取消确认回调处理
+- 数据格式:以“confirm_cancel_{bookingId}”或“cancel_action”形式传递。
+- 处理流程:
+  - 解析回调数据,区分确认与取消分支。
+  - 从 KV 存储读取用户凭证,校验登录状态。
+  - 调用 API 客户端取消预约,编辑消息反馈结果。
+- 用户体验:通过内联键盘提供“确认/取消”选项,避免误操作;取消后明确提示结果。
+
+```mermaid
+flowchart TD
+Start(["收到回调: confirm_cancel_* 或 cancel_action"]) --> Parse["解析回调数据"]
+Parse --> Branch{"分支判断"}
+Branch --> |confirm_cancel_*| LoadCreds["读取用户凭证"]
+Branch --> |cancel_action| EditCancel["编辑消息: 操作已取消"] --> End
+LoadCreds --> CheckAuth{"校验登录状态"}
+CheckAuth --> |未登录| EditUnauth["编辑消息: 提示先登录"] --> End
+CheckAuth --> |已登录| CancelAPI["调用取消接口"]
+CancelAPI --> Result{"取消成功?"}
+Result --> |是| EditSuccess["编辑消息: 成功取消"] --> End
+Result --> |否| EditFail["编辑消息: 取消失败"] --> End
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L97)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L86-L132)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L97)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L86-L132)
+
+### 优惠券选择回调处理
+- 数据格式:以“select_coupon_{event_id}_{slot_index}_{coupon_code}”传递,其中 coupon_code 可为具体码值或“none”表示不使用优惠券。
+- 处理流程:
+  - 解析回调数据,提取 event_id、slot_index、coupon_code。
+  - 从 KV 存储读取用户凭证,校验登录状态。
+  - 获取事件详情与时间槽,更新消息显示当前选择。
+  - 调用 API 客户端执行预约,编辑消息反馈结果。
+- 用户体验:当存在多个优惠券时,提供内联键盘供用户选择;若仅一个优惠券则自动应用;支持“不使用优惠券”。
+
+```mermaid
+flowchart TD
+Start(["收到回调: select_coupon_*"]) --> Parse["解析回调数据"]
+Parse --> LoadCreds["读取用户凭证"]
+LoadCreds --> CheckAuth{"校验登录状态"}
+CheckAuth --> |未登录| EditUnauth["编辑消息: 提示先登录"] --> End
+CheckAuth --> |已登录| FetchEvent["获取事件详情"]
+FetchEvent --> ValidateSlot{"校验时间段索引"}
+ValidateSlot --> |无效| EditInvalid["编辑消息: 时间段无效"] --> End
+ValidateSlot --> |有效| UpdateMsg["编辑消息: 显示当前选择"]
+UpdateMsg --> BookAPI["调用预约接口(可带优惠券)"]
+BookAPI --> Result{"预约成功?"}
+Result --> |是| EditSuccess["编辑消息: 成功预约"] --> End
+Result --> |否| EditFail["编辑消息: 预约失败"] --> End
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L99-L105)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L99-L105)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+
+### answerCallbackQuery 使用时机与最佳实践
+- 使用时机:在回调处理器完成业务逻辑后,调用 ctx.answerCallbackQuery() 清除 Telegram 的“加载中”指示,提升用户体验。
+- 最佳实践:
+  - 总是在回调处理器末尾调用,确保无论成功或失败都清理指示。
+  - 对于可能耗时的操作,建议先调用 answerCallbackQuery() 再执行后台任务,避免超时。
+  - 对于无副作用的纯展示型回调,可直接回答并返回。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L95-L96)
+- [src/command/index.ts](file://src/command/index.ts#L103-L104)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L221-L221)
+
+### 回调查询数据格式设计规范
+- 统一前缀:使用语义化的前缀区分不同功能域,如“confirm_cancel_”、“select_coupon_”。
+- 参数顺序:按“领域_标识_索引_键值”的顺序排列,便于解析与扩展。
+- 特殊值:使用“none”表示“不使用”,避免空字符串带来的歧义。
+- 长度控制:回调数据长度受 Telegram 限制,应尽量精简参数数量与长度。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L97)
+- [src/command/index.ts](file://src/command/index.ts#L99-L105)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L61-L64)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L78-L93)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L166-L175)
+
+### 安全考虑
+- 凭证存储:用户凭证存储在 KV 中,键为 Telegram 用户 ID,值包含 user_id、token 和时间戳,便于快速读取与校验。
+- 认证检查:所有涉及外部 API 的回调处理器均需校验登录状态,未登录则拒绝操作。
+- 输入验证:对回调数据进行严格解析与校验,防止异常输入导致的错误。
+- 错误处理:捕获并记录异常,向用户返回友好提示,避免泄露内部错误细节。
+
+章节来源
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L21-L43)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L22-L35)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L132)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+
+### 完整回调处理示例
+- 取消确认示例路径:
+  - 路由注册:[回调路由](file://src/command/index.ts#L91-L97)
+  - 处理器实现:[取消确认处理器](file://src/command/handlers/cancel.ts#L86-L132)
+- 优惠券选择示例路径:
+  - 路由注册:[回调路由](file://src/command/index.ts#L99-L105)
+  - 处理器实现:[优惠券选择处理器](file://src/command/handlers/bookEvent.ts#L159-L226)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L105)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L86-L132)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+
+### 用户体验优化技巧
+- 即时反馈:在用户点击按钮后立即调用 answerCallbackQuery(),消除加载指示。
+- 明确提示:编辑消息时清晰展示当前选择与最终结果,减少用户困惑。
+- 降级策略:当存在多个优惠券时提供选择;仅一个时自动应用,减少用户操作步骤。
+- 错误友好:对网络异常、权限不足等情况给出明确提示与引导。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L95-L96)
+- [src/command/index.ts](file://src/command/index.ts#L103-L104)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L76-L106)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L213-L217)
+
+## 依赖关系分析
+- grammY 框架:提供 Bot、Context、callbackQuery 路由与 answerCallbackQuery 等能力。
+- @grammyjs/conversations:提供对话插件与 KV 存储适配器,支撑交互式登录等场景。
+- Cloudflare KV:作为凭证与会话存储后端,提供高可用的数据持久化。
+
+```mermaid
+graph TB
+P["package.json<br/>依赖声明"] --> G["grammy"]
+P --> C["@grammyjs/conversations"]
+P --> S["@grammyjs/storage-cloudflare"]
+R["命令路由: src/command/index.ts"] --> G
+R --> C
+R --> S
+H1["取消处理器: src/command/handlers/cancel.ts"] --> A["API客户端: src/client/cosmoe.ts"]
+H2["优惠券处理器: src/command/handlers/bookEvent.ts"] --> A
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [src/command/index.ts](file://src/command/index.ts#L1-L18)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L9)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L9)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [src/command/index.ts](file://src/command/index.ts#L1-L18)
+
+## 性能考量
+- 回调处理链路短:回调处理器直接调用 API 客户端,避免复杂中间层。
+- 异步 I/O:KV 读写与外部 API 调用均为异步,注意并发与超时控制。
+- 消息编辑:优先使用 editMessageText/editMessageReplyMarkup 更新消息,减少重复发送。
+- 缓存策略:对于频繁访问的事件详情,可在业务层引入缓存以降低 API 调用频率(当前实现未包含缓存层)。
+
+## 故障排查指南
+- 回调未触发:检查回调数据格式是否符合正则匹配规则。
+- 未清除加载指示:确认回调处理器末尾是否调用 answerCallbackQuery()。
+- 权限问题:检查 KV 中是否存在用户凭证,以及凭证是否有效。
+- 外部 API 失败:查看 API 客户端返回码与消息,定位具体错误原因。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L91-L105)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L86-L132)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 结论
+本项目通过清晰的回调查询路由与处理器分离,实现了可靠的取消确认与优惠券选择功能。遵循统一的数据格式规范与安全实践,结合即时反馈与友好提示,显著提升了用户体验。后续可在业务层引入缓存与更细粒度的错误处理,进一步增强稳定性与性能。

+ 322 - 0
.qoder/repowiki/zh/content/Telegram 集成/对话管理.md

@@ -0,0 +1,322 @@
+# 对话管理
+
+<cite>
+**本文引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件系统性阐述基于 grammY conversations 插件的对话管理系统设计与实现,重点覆盖以下方面:
+- createConversation 的使用与对话生命周期管理
+- KV 存储在对话状态持久化中的角色与实现(读取、写入、删除)
+- 版本化状态存储的设计理念与适用场景
+- 对话状态管理最佳实践(状态清理、超时处理、并发控制)
+- 完整对话实现示例与调试技巧
+
+该系统围绕 Cloudflare Worker 运行环境构建,通过 @grammyjs/conversations 与 @grammyjs/storage-cloudflare 实现对话状态的云端持久化与版本化管理。
+
+## 项目结构
+项目采用按功能模块划分的组织方式,核心入口负责初始化 Bot 并挂载命令;命令模块集中注册各类命令与对话;客户端模块封装外部 API 调用;调度模块负责定时任务。
+
+```mermaid
+graph TB
+A["src/index.ts<br/>Worker 入口"] --> B["src/command/index.ts<br/>命令与对话注册"]
+B --> C["src/command/handlers/*.ts<br/>命令处理器"]
+B --> D["src/client/cosmoe.ts<br/>Cosmoe API 客户端"]
+A --> E["src/scheduler/index.ts<br/>定时任务"]
+F["package.json<br/>依赖声明"] --> B
+F --> A
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [package.json](file://package.json#L1-L24)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [package.json](file://package.json#L1-L24)
+
+## 核心组件
+- Bot 与上下文增强
+  - 使用 ConversationFlavor 扩展 Context,为对话提供 enter、wait 等能力。
+  - 在 Worker 入口中以泛型参数注入 ConversationFlavor,确保类型安全。
+- conversations 插件与 KV 存储适配
+  - 通过 @grammyjs/storage-cloudflare 的 KvAdapter 将 KV 命名空间桥接到 conversations 的存储接口。
+  - 自定义 storage 对象实现 read/write/delete,统一 JSON 序列化/反序列化与异常处理。
+- createConversation 与对话生命周期
+  - 使用 createConversation 定义“登录”对话,内部通过 conversation.wait() 顺序等待用户输入,完成交互式认证。
+  - 通过 ctx.conversation.enter("login") 触发进入指定对话。
+- 外部 API 客户端
+  - CosmoeClient 提供认证、事件查询、预约、取消等完整 API 封装,支持设置凭据与鉴权检查。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 架构总览
+下图展示从用户触发到对话执行、状态持久化与外部服务调用的整体流程。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant W as "Worker 入口<br/>src/index.ts"
+participant B as "Bot<br/>grammy"
+participant C as "命令模块<br/>src/command/index.ts"
+participant CONV as "对话插件<br/>conversations"
+participant KV as "KV 存储<br/>COSMOE_STORAGE"
+participant API as "Cosmoe API 客户端<br/>src/client/cosmoe.ts"
+U->>W : "HTTP 请求webhook"
+W->>B : "初始化 Bot带 ConversationFlavor"
+W->>B : "返回 webhookCallback"
+U->>B : "/login"
+B->>C : "路由到命令处理器"
+C->>CONV : "enter('login')"
+CONV->>KV : "读取对话状态如存在"
+CONV-->>U : "提示输入用户名"
+U->>CONV : "回复用户名"
+CONV-->>U : "提示输入密码"
+U->>CONV : "回复密码"
+CONV->>API : "getToken(username, password)"
+API-->>CONV : "返回 token"
+CONV->>KV : "write(会话状态)"
+CONV-->>U : "登录结果"
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L66)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L12-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+## 详细组件分析
+
+### KV 存储与对话状态持久化
+- 存储适配器
+  - 使用 KvAdapter 包装 COSMOE_STORAGE 命名空间,作为 conversations 的存储后端。
+- 读取(read)
+  - 从 KV 读取字符串值,若存在则 JSON 解析为对象,否则返回 undefined。
+  - 异常捕获并记录错误,保证对话插件不会因 KV 故障中断。
+- 写入(write)
+  - 将状态对象 JSON 序列化后写入 KV。
+  - 异常捕获并记录错误,避免影响对话流程。
+- 删除(delete)
+  - 清理 KV 中的对话键,用于状态清理或会话结束。
+- 版本化状态存储
+  - 代码中导入了 VersionedStateStorage 类型,但当前未直接使用其版本化能力。
+  - 设计理念:通过版本字段区分不同状态结构,便于在状态演进时保持向后兼容与迁移策略。
+  - 适用场景:当对话状态结构需要迭代升级时,可利用版本字段进行条件迁移或降级处理。
+
+```mermaid
+flowchart TD
+Start(["进入 KV 存储函数"]) --> Op{"操作类型?"}
+Op --> |读取| Read["kvAdapter.read(key)"]
+Read --> Parse{"是否解析成功?"}
+Parse --> |是| ReturnVal["返回 JSON 对象"]
+Parse --> |否| ReturnUndef["返回 undefined"]
+Op --> |写入| Write["JSON.stringify(value)<br/>kvAdapter.write(key, value)"]
+Write --> Done(["完成"])
+Op --> |删除| Delete["kvAdapter.delete(key)"]
+Delete --> Done
+ReturnVal --> Done
+ReturnUndef --> Done
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L24-L49)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/command/index.ts](file://src/command/index.ts#L24-L49)
+
+### createConversation 与对话生命周期
+- 定义与注册
+  - 使用 createConversation 定义“login”对话,传入对话处理器与名称。
+  - 在命令模块中通过 bot.use 注册该对话。
+- 生命周期管理
+  - 进入:bot.command("login") 调用 ctx.conversation.enter("login") 启动对话。
+  - 等待:对话处理器内多次调用 conversation.wait() 等待用户输入。
+  - 结束:对话自然结束或显式退出,状态根据 KV 存储策略进行持久化或清理。
+- 交互式登录对话示例
+  - 提示输入用户名与密码,调用 CosmoeClient.getToken 获取 token。
+  - 成功后将用户凭证写入 COSMOE_CREDENTIALS KV 命名空间,同时在对话中可继续持久化会话状态(如需)。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant CMD as "命令处理器<br/>/login"
+participant CONV as "对话实例"
+participant KV as "KV 存储"
+participant API as "CosmoeClient"
+CMD->>CONV : "enter('login')"
+CONV-->>U : "提示输入用户名"
+U->>CONV : "回复用户名"
+CONV-->>U : "提示输入密码"
+U->>CONV : "回复密码"
+CONV->>API : "getToken"
+API-->>CONV : "返回 token"
+CONV->>KV : "write(会话状态)"
+CONV-->>U : "登录成功/失败"
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L66)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L12-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L66)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L12-L75)
+
+### 版本化状态存储的设计理念与使用场景
+- 设计理念
+  - 通过版本字段标识状态结构版本,允许在不破坏现有会话的前提下演进状态格式。
+  - 可结合迁移逻辑实现平滑过渡,例如新版本读取旧版本数据并自动转换。
+- 当前实现
+  - 代码导入了 VersionedStateStorage 类型,但未在 conversations 配置中启用版本化存储。
+- 建议使用场景
+  - 当对话状态包含复杂嵌套结构或新增字段时,建议引入版本化以避免回滚风险。
+  - 在多版本并存期间,可通过版本号进行条件分支处理,逐步淘汰旧版本状态。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L2-L3)
+
+### 对话状态管理最佳实践
+- 状态清理
+  - 在对话结束或用户主动退出时调用 KV delete 清理对应键,避免无界增长。
+  - 对于长期未活跃的会话,可在进入对话前检查并清理过期键。
+- 超时处理
+  - 在对话处理器中增加超时判断(例如记录进入时间),超过阈值自动结束对话并清理状态。
+- 并发控制
+  - 每个用户的会话键应唯一(如以用户 ID 为键),避免跨用户状态串扰。
+  - 对 KV 写入操作进行幂等设计,防止重复写入导致状态不一致。
+- 错误隔离
+  - KV 读写均包裹 try/catch 并记录日志,确保对话主流程不受存储异常影响。
+- 状态一致性
+  - 对于关键业务(如预约、取消),在 KV 写入前后进行校验,必要时回滚或补偿。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L24-L49)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+
+### 完整对话实现示例与调试技巧
+- 示例一:登录对话(createConversation)
+  - 关键路径参考:[对话注册与进入](file://src/command/index.ts#L54-L66),[交互式登录处理器](file://src/command/handlers/login.ts#L12-L75)。
+  - 调试要点:
+    - 在 KV 读写处添加日志,确认键名与序列化格式。
+    - 在 getToken 失败时检查用户名/密码与网络连通性。
+- 示例二:预约流程(含优惠券选择与取消确认)
+  - 关键路径参考:[预约处理器](file://src/command/handlers/bookEvent.ts#L11-L118),[优惠券选择回调](file://src/command/handlers/bookEvent.ts#L159-L226),[取消与确认回调](file://src/command/handlers/cancel.ts#L11-L132)。
+  - 调试要点:
+    - 使用回调查询 data 字段验证解析逻辑。
+    - 对外 API 返回码与消息体差异较大,需分别处理成功与失败分支。
+- 示例三:历史记录与通知
+  - 关键路径参考:[历史记录处理器](file://src/command/handlers/history.ts#L4-L107),[定时通知任务](file://src/scheduler/index.ts#L12-L88)。
+  - 调试要点:
+    - 分页/排序逻辑需与 API 文档一致,注意日期格式与时区转换。
+    - 定时任务需关注 KV 列表与发送限制,避免触发速率限制。
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+## 依赖关系分析
+- grammY 生态
+  - @grammyjs/conversations:提供对话框架与状态持久化接口。
+  - @grammyjs/storage-cloudflare:提供 KV 适配器,将 KV 命名空间接入 conversations。
+  - grammy:Telegram Bot SDK,承载消息路由与回调处理。
+- 项目依赖
+  - 通过 package.json 明确声明上述依赖,确保运行时可用。
+
+```mermaid
+graph TB
+P["package.json"] --> G["@grammyjs/conversations"]
+P --> S["@grammyjs/storage-cloudflare"]
+P --> M["grammy"]
+G --> C1["src/command/index.ts<br/>conversations 配置"]
+S --> C1
+M --> C1
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+## 性能考量
+- KV 访问
+  - 读写 KV 为网络 IO,应尽量减少不必要的频繁写入;仅在状态发生实质性变化时写入。
+  - 批量操作时优先合并写入,避免多次往返。
+- 对话等待
+  - conversation.wait() 会阻塞当前会话,应合理设计对话步骤数量与等待时长,避免长时间占用资源。
+- API 调用
+  - 外部 API 调用可能成为瓶颈,建议在客户端层引入缓存与重试机制(如需)。
+- 定时任务
+  - 定时任务需考虑 KV 列表遍历成本,建议分批处理与限流。
+
+## 故障排查指南
+- KV 读写异常
+  - 现象:对话状态无法读取或保存。
+  - 排查:检查 KV 命名空间权限、键名拼写、JSON 序列化/反序列化格式。
+  - 参考路径:[KV 存储实现](file://src/command/index.ts#L24-L49)。
+- 对话未进入或提前结束
+  - 现象:/login 命令无效或对话未按预期等待。
+  - 排查:确认 bot.use(createConversation(...)) 是否正确注册,enter("login") 是否被调用。
+  - 参考路径:[对话注册与进入](file://src/command/index.ts#L54-L66)。
+- 外部 API 失败
+  - 现象:登录、预约、取消等操作返回错误。
+  - 排查:核对用户名/密码、token 有效性、API 参数与返回码。
+  - 参考路径:[CosmoeClient 方法](file://src/client/cosmoe.ts#L124-L140),[预约处理器](file://src/command/handlers/bookEvent.ts#L11-L118)。
+- 定时任务未生效
+  - 现象:新活动未推送通知。
+  - 排查:检查 latestEventId 更新逻辑、KV 列表遍历与发送限制。
+  - 参考路径:[定时任务](file://src/scheduler/index.ts#L12-L88)。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L24-L49)
+- [src/command/index.ts](file://src/command/index.ts#L54-L66)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+## 结论
+本系统通过 grammY conversations 与 Cloudflare KV 实现了可靠的对话状态持久化与版本化潜力,配合清晰的命令模块与外部 API 客户端,形成了完整的对话式交互闭环。建议在现有基础上进一步引入版本化状态存储、超时与并发控制策略,并完善错误恢复与监控告警,以提升稳定性与可维护性。
+
+## 附录
+- 快速定位
+  - Worker 入口与命令菜单:[入口文件](file://src/index.ts#L13-L35)
+  - 对话注册与 KV 存储:[命令模块](file://src/command/index.ts#L20-L66)
+  - 登录对话处理器:[登录处理器](file://src/command/handlers/login.ts#L12-L75)
+  - 预约与取消流程:[预约处理器](file://src/command/handlers/bookEvent.ts#L11-L118),[取消处理器](file://src/command/handlers/cancel.ts#L11-L132)
+  - 历史记录与定时任务:[历史记录](file://src/command/handlers/history.ts#L4-L107),[定时任务](file://src/scheduler/index.ts#L12-L88)
+  - 外部 API 客户端:[CosmoeClient](file://src/client/cosmoe.ts#L113-L503)

+ 332 - 0
.qoder/repowiki/zh/content/快速开始.md

@@ -0,0 +1,332 @@
+# 快速开始
+
+<cite>
+**本文引用的文件**
+- [package.json](file://package.json)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [tsconfig.json](file://tsconfig.json)
+- [.dev.vars](file://.dev.vars)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [vitest.config.mts](file://vitest.config.mts)
+- [test/env.d.ts](file://test/env.d.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能注意事项](#性能注意事项)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本指南面向首次接触 Cosmoe Bot 的开发者,帮助你在本地快速完成环境搭建与首次运行。你将学到:
+- 如何安装 Node.js 与 npm(含版本建议)
+- 如何安装与配置 Cloudflare Workers CLI(wrangler)
+- 如何获取并配置 Telegram Bot Token、Cosmoe 服务端 API 凭证等必要参数
+- 如何配置本地开发环境(.dev.vars、TypeScript 编译、Wrangler 配置)
+- 如何启动本地开发服务器并进行基础功能测试
+- 常见环境问题的解决方案与调试技巧
+
+## 项目结构
+Cosmoe Bot 是一个基于 Cloudflare Workers 的 Telegram 机器人,采用 TypeScript 开发,并通过 Wrangler 进行本地开发与部署。核心目录与文件如下:
+- 根目录包含包管理与构建配置:package.json、wrangler.jsonc、tsconfig.json、.dev.vars、vitest.config.mts、test/env.d.ts
+- 源码位于 src/ 下:
+  - 入口与调度:src/index.ts、src/scheduler/index.ts
+  - 命令系统:src/command/index.ts 及其 handlers 子目录
+  - 客户端:src/client/cosmoe.ts(封装对 Cosmoe 服务端 API 的调用)
+- 类型声明:worker-configuration.d.ts(由 wrangler 生成)
+
+```mermaid
+graph TB
+subgraph "根目录"
+Pkg["package.json"]
+Wrangler["wrangler.jsonc"]
+TSConf["tsconfig.json"]
+DevVars[".dev.vars"]
+Vitest["vitest.config.mts"]
+TestEnv["test/env.d.ts"]
+Types["worker-configuration.d.ts"]
+end
+subgraph "源码 src/"
+Entry["src/index.ts"]
+Cmd["src/command/index.ts"]
+Handlers["src/command/handlers/*.ts"]
+Scheduler["src/scheduler/index.ts"]
+Client["src/client/cosmoe.ts"]
+end
+Pkg --> Wrangler
+Wrangler --> Entry
+Entry --> Cmd
+Entry --> Scheduler
+Cmd --> Handlers
+Entry --> Client
+Types --> Entry
+```
+
+图表来源
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+章节来源
+- [package.json](file://package.json#L1-L24)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [.dev.vars](file://.dev.vars#L1-L2)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10849)
+
+## 核心组件
+- 入口与路由:src/index.ts 负责初始化 Bot、注册命令、设置菜单、处理 Webhook 回调,并在定时触发时调用调度逻辑。
+- 命令系统:src/command/index.ts 使用 grammY 与 @grammyjs/conversations 插件,结合 KV 存储实现对话式交互与状态持久化。
+- 调度器:src/scheduler/index.ts 周期性检查新活动并向已注册用户推送通知。
+- 客户端:src/client/cosmoe.ts 封装对 Cosmoe 服务端 API 的调用,包括认证、事件查询、预约、历史查询等。
+- 配置与类型:wrangler.jsonc 定义 Worker 名称、入口、兼容日期、KV 绑定、计划任务;tsconfig.json 控制编译选项;.dev.vars 提供本地开发密钥;worker-configuration.d.ts 由 wrangler 生成运行时类型。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [.dev.vars](file://.dev.vars#L1-L2)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10849)
+
+## 架构总览
+下图展示了本地开发与运行时的关键交互:本地通过 wrangler dev 启动 Worker,接收 Telegram Webhook 请求;Worker 初始化 grammY Bot 并注册命令;命令执行时可访问 KV 与 Cosmoe API;同时 Worker 在计划时间触发调度逻辑,向用户发送通知。
+
+```mermaid
+sequenceDiagram
+participant TG as "Telegram"
+participant CF as "Cloudflare Workers"
+participant Bot as "grammY Bot"
+participant Cmd as "命令系统"
+participant Sched as "调度器"
+participant KV as "KV 命名空间"
+participant API as "Cosmoe 服务端"
+TG->>CF : "Webhook 请求"
+CF->>Bot : "初始化 Bot 与命令"
+Bot->>Cmd : "分发命令/回调"
+Cmd->>KV : "读取/写入对话状态/凭证"
+Cmd->>API : "调用 Cosmoe API"
+API-->>Cmd : "返回结果"
+Cmd-->>TG : "回复消息"
+CF->>Sched : "定时触发"
+Sched->>API : "拉取活动列表"
+API-->>Sched : "返回活动"
+Sched->>KV : "读取/更新最新活动 ID"
+Sched-->>TG : "向已注册用户推送通知"
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 详细组件分析
+
+### 环境与工具准备
+- Node.js 与 npm
+  - 推荐使用当前 LTS 版本(如 20.x 或 22.x),确保 npm 与 Node.js 版本匹配。
+  - 安装完成后,验证版本:node --version、npm --version。
+- Cloudflare Workers CLI(wrangler)
+  - 全局安装:npm install -g wrangler
+  - 首次使用需登录:wrangler login
+  - 验证安装:wrangler --version
+
+章节来源
+- [package.json](file://package.json#L12-L17)
+
+### 获取与配置必要参数
+- Telegram Bot Token
+  - 通过 @BotFather 创建机器人并获取 Token。
+  - 将 Token 写入 .dev.vars 中的 BOT_TOKEN 字段。
+- Cosmoe 服务端 API 凭证
+  - 本仓库示例中未包含 Cosmoe API 密钥字段,通常可通过 KV 或环境变量注入。请根据实际部署需求在 wrangler.jsonc 的 vars 或 KV 中配置。
+- Cloudflare KV 命名空间
+  - 已在 wrangler.jsonc 中定义两个 KV 绑定:COSMOE_CREDENTIALS(存储用户凭证)、COSMOE_STORAGE(存储会话与状态)。
+  - 本地开发时,wrangler 会自动创建本地 KV;生产部署需在 Cloudflare 控制台创建并绑定。
+
+章节来源
+- [.dev.vars](file://.dev.vars#L1-L2)
+- [wrangler.jsonc](file://wrangler.jsonc#L18-L31)
+
+### 本地开发环境设置
+- 安装依赖
+  - 在项目根目录执行:npm install
+- 生成运行时类型
+  - 执行:wrangler types(生成 worker-configuration.d.ts)
+- 启动本地开发服务器
+  - 执行:npm run dev 或 wrangler dev
+  - 访问 http://localhost:8787 查看日志与调试输出
+- 配置 .dev.vars
+  - 确保 .dev.vars 包含 BOT_TOKEN 等本地密钥(若需要其他密钥,请按实际添加)
+- TypeScript 编译设置
+  - tsconfig.json 已启用严格模式、ES2024 目标、Bundler 模块解析等,满足 Workers 运行时要求
+- Wrangler 配置
+  - wrangler.jsonc 指定入口、兼容日期、计划任务、KV 绑定与运行观测开关
+
+章节来源
+- [package.json](file://package.json#L5-L11)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [.dev.vars](file://.dev.vars#L1-L2)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10849)
+
+### 首次运行示例
+- 启动本地开发服务器
+  - 在项目根目录执行:npm run dev
+  - 观察控制台输出,确认 Worker 启动成功
+- 设置 Telegram Webhook(可选)
+  - 若需使用 Webhook,可在部署后通过 Telegram Bot API 设置 webhook URL;本地开发默认使用 wrangler dev 提供的本地端点
+- 测试基本功能
+  - 在 Telegram 中向机器人发送 /start,应收到欢迎信息
+  - 发送 /login,进入交互式登录流程,输入用户名与密码
+  - 成功登录后,凭证将保存至 KV 命名空间
+  - 发送 /events 查看活动列表
+  - 发送 /history 查看预约历史
+- 调度功能验证
+  - 等待计划任务触发(默认每分钟一次),观察控制台日志与通知推送情况
+
+章节来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+### 关键流程图解
+
+#### 登录交互流程(命令驱动)
+```mermaid
+flowchart TD
+Start(["用户发送 /login"]) --> EnterConv["进入登录对话"]
+EnterConv --> AskUser["提示输入用户名"]
+AskUser --> WaitUser["等待用户输入"]
+WaitUser --> AskPass["提示输入密码"]
+AskPass --> WaitPass["等待用户输入"]
+WaitPass --> CallAPI["调用 Cosmoe API 获取 Token"]
+CallAPI --> CheckRes{"认证成功?"}
+CheckRes --> |是| SaveCreds["以 Telegram 用户 ID 为键保存凭证到 KV"]
+SaveCreds --> ReplyOK["回复登录成功"]
+CheckRes --> |否| ReplyFail["回复失败原因"]
+ReplyOK --> End(["结束"])
+ReplyFail --> End
+```
+
+图表来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+#### 调度通知流程
+```mermaid
+flowchart TD
+Cron(["定时触发"]) --> LoadLatest["读取最新活动 ID"]
+LoadLatest --> FetchEvents["调用 Cosmoe API 获取活动列表"]
+FetchEvents --> FilterNew{"过滤新活动"}
+FilterNew --> |有| ListUsers["遍历已注册用户"]
+FilterNew --> |无| End(["结束"])
+ListUsers --> SendMsg["向每个用户发送通知"]
+SendMsg --> UpdateID["更新最新活动 ID"]
+UpdateID --> End
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+## 依赖关系分析
+- 运行时依赖
+  - grammY:Telegram 机器人框架
+  - @grammyjs/conversations:对话式交互插件
+  - @grammyjs/storage-cloudflare:KV 存储适配器
+- 开发依赖
+  - wrangler:Cloudflare Workers CLI
+  - vitest 与 @cloudflare/vitest-pool-workers:Workers 环境下的单元测试
+  - typescript:类型支持与编译
+
+```mermaid
+graph LR
+Entry["src/index.ts"] --> Gram["grammY"]
+Entry --> Conv["@grammyjs/conversations"]
+Entry --> KVStore["@grammyjs/storage-cloudflare"]
+Entry --> Client["src/client/cosmoe.ts"]
+Entry --> Cmd["src/command/index.ts"]
+Cmd --> Handlers["src/command/handlers/*.ts"]
+Entry --> Sched["src/scheduler/index.ts"]
+Wrangler["wrangler.jsonc"] --> Entry
+Pkg["package.json"] --> Wrangler
+Pkg --> Types["worker-configuration.d.ts"]
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L12-L22)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10849)
+
+章节来源
+- [package.json](file://package.json#L12-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 性能注意事项
+- 使用 KV 存储对话状态与用户凭证,避免在内存中缓存大量数据
+- 调度任务按需触发,避免频繁拉取 Cosmoe API;可利用本地存储的最新活动 ID 做增量判断
+- 严格模式与 noEmit 配置有助于在本地尽早发现类型问题,减少运行时错误
+- 对外请求建议使用合理的超时与重试策略(可在客户端层扩展)
+
+## 故障排查指南
+- 本地无法启动
+  - 检查 Node.js 与 npm 版本是否满足要求
+  - 确认已安装 wrangler 并执行过 wrangler login
+  - 清理缓存后重新安装依赖:npm ci 或删除 node_modules 后 npm install
+- .dev.vars 未生效
+  - 确认 .dev.vars 位于项目根目录且包含正确的键值(如 BOT_TOKEN)
+  - 重启本地开发服务器使变更生效
+- KV 读写异常
+  - 确认 wrangler.jsonc 中 KV 绑定名称与代码一致(如 COSMOE_CREDENTIALS、COSMOE_STORAGE)
+  - 检查本地 KV 是否已创建,必要时删除临时目录后重启开发服务器
+- Telegram Webhook 无法接收消息
+  - 本地开发默认使用 wrangler dev 提供的端点;如需外部可访问,请参考官方文档配置自定义域名与证书
+- 调度任务未触发
+  - 检查 wrangler.jsonc 中 triggers.crons 配置是否正确
+  - 确认本地开发服务器正在运行,且控制台显示定时日志
+- 单元测试报错
+  - 确认 vitest.config.mts 正确指向 wrangler.jsonc
+  - 测试环境类型声明需与 Env 接口保持一致
+
+章节来源
+- [.dev.vars](file://.dev.vars#L1-L2)
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L31)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [test/env.d.ts](file://test/env.d.ts#L1-L4)
+
+## 结论
+通过以上步骤,你可以在本地快速搭建 Cosmoe Bot 的开发环境,并完成首次运行与基础功能测试。后续可根据业务需要扩展命令、完善调度逻辑与错误处理,并在 Cloudflare 上完成正式部署。
+
+## 附录
+
+### 常用命令清单
+- 安装依赖:npm install
+- 生成类型:wrangler types
+- 启动本地开发:npm run dev 或 wrangler dev
+- 运行测试:npm run test
+- 部署:npm run deploy 或 wrangler deploy
+
+章节来源
+- [package.json](file://package.json#L5-L11)

+ 392 - 0
.qoder/repowiki/zh/content/扩展开发/API 客户端集成.md

@@ -0,0 +1,392 @@
+# API 客户端集成
+
+<cite>
+**本文档引用的文件**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/index.ts](file://src/index.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [package.json](file://package.json)
+- [test/index.spec.ts](file://test/index.spec.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本指南面向需要在 Cosmoe Bot 中集成与扩展 API 客户端的开发者,系统讲解如何封装新的 API 端点调用(请求构建、响应处理、错误管理)、认证机制(token 管理、权限验证、安全考虑)、设计模式(可维护性与可测试性)、异步操作与超时控制、重试机制、数据模型定义与验证,以及实际扩展示例(新增服务端功能或第三方 API 集成)。
+
+## 项目结构
+该项目基于 Cloudflare Workers 与 GrammY 框架,采用分层组织:
+- 客户端层:封装对 Cosmoe 服务端 API 的调用,统一请求参数、响应格式与错误处理
+- 命令层:通过 Telegram Bot 命令与交互式会话触发业务流程
+- 调度层:定时任务轮询新活动并向已注册用户推送通知
+- 配置层:Wrangler 配置 KV 命名空间用于凭证与状态存储
+
+```mermaid
+graph TB
+subgraph "客户端层"
+C1["CosmoeClient<br/>封装 API 调用"]
+end
+subgraph "命令层"
+CMD["命令路由与会话"]
+H1["登录处理器"]
+H2["预约处理器"]
+H3["历史处理器"]
+end
+subgraph "调度层"
+SCH["定时任务处理器"]
+end
+subgraph "配置层"
+W["Wrangler 配置<br/>KV 命名空间"]
+end
+CMD --> C1
+H1 --> C1
+H2 --> C1
+H3 --> C1
+SCH --> C1
+C1 --> W
+```
+
+图表来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 核心组件
+- CosmoeClient:统一的 API 客户端,负责认证、事件查询、用户资料、预约、支付订单更新、取消与转约等操作
+- 命令路由与处理器:将 Telegram 命令映射到具体业务逻辑,并通过 CosmoeClient 执行
+- 定时任务:周期性拉取新活动并推送通知
+- KV 存储:凭证与状态持久化(COSMOE_CREDENTIALS、COSMOE_STORAGE)
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 架构总览
+下图展示了从 Telegram 命令到 API 调用再到 KV 存储的整体流程。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot 命令路由"
+participant H as "命令处理器"
+participant C as "CosmoeClient"
+participant S as "Cosmoe 服务端"
+participant K as "KV 存储"
+U->>B : 发送命令/回调
+B->>H : 分发到对应处理器
+H->>K : 读取用户凭证
+alt 凭证存在
+H->>C : 初始化并设置凭证
+H->>C : 调用 API 方法
+C->>S : 发起 HTTP 请求
+S-->>C : 返回 JSON 响应
+C-->>H : 解析并返回结果
+H-->>U : 发送回复
+else 凭证不存在
+H-->>U : 提示先登录
+end
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L59-L109)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L43-L69)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L37-L117)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 详细组件分析
+
+### CosmoeClient 组件分析
+CosmoeClient 是整个系统的 API 封装核心,提供以下能力:
+- 认证:获取 token 并缓存用户标识与 token
+- 查询:活动列表、活动详情、用户资料、预约历史
+- 业务:预约、修改密码、优惠券查询、支付订单更新、备注更新、取消、改签、转约
+- 安全:所有需要鉴权的方法均在调用前校验认证状态
+
+```mermaid
+classDiagram
+class CosmoeClient {
+-baseUrl : string
+-userId : number
+-token : string
++getToken(username, password) Promise~ApiResponse<TokenResponse>~
++setCredentials(userId, token) void
++getCredentials() {userId, token} | null
++isAuthenticated() boolean
++getEvents() Promise~ApiResponse<Event[]>~
++getEventDetail(eventId) Promise~ApiResponse<EventDetail>~
++getProfile() Promise~ApiResponse<ProfileData>~
++getMyBookings() Promise~ApiResponse<Booking[]>~
++bookEvent(req) Promise~ApiResponse<any>~
++changePassword(old, new) Promise~ApiResponse<any>~
++getUserProfile() Promise~ApiResponse<UserProfile>~
++getAvailableCoupons(eventId) Promise~ApiResponse<Coupon[]>~
++updatePaymentOrder(bookingId, orderId) Promise~ApiResponse<any>~
++updateBookingNote(bookingId, note) Promise~ApiResponse<any>~
++cancelBooking(bookingId) Promise~ApiResponse<any>~
++selfReschedule(bookingId, newSlot) Promise~ApiResponse<any>~
++selfTransfer(bookingId, recipient) Promise~ApiResponse<any>~
++register(key, username, email, password, identity) Promise~ApiResponse<{user_id, username}>~
+}
+```
+
+图表来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+### 登录流程与认证集成
+登录流程通过交互式会话完成,成功后将凭证写入 KV 命名空间,后续命令处理器读取并注入到 CosmoeClient。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant C as "对话处理器"
+participant CL as "CosmoeClient"
+participant S as "Cosmoe 服务端"
+participant K as "KV 命名空间"
+U->>C : 输入用户名/密码
+C->>CL : 创建实例并调用 getToken
+CL->>S : POST /CreatToken.php
+S-->>CL : 返回 {code, data : {user_id, token}}
+CL-->>C : 返回结果
+alt 成功
+C->>K : put(telegramUserId, {user_id, token, timestamp})
+C-->>U : 登录成功
+else 失败
+C-->>U : 登录失败
+end
+```
+
+图表来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+### 预约流程与优惠券选择
+预约流程包含活动详情获取、时间槽选择、优惠券查询与选择、最终提交预约。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "命令路由"
+participant H as "预约处理器"
+participant C as "CosmoeClient"
+participant S as "Cosmoe 服务端"
+participant K as "KV 命名空间"
+U->>B : /book_{eventId}_{slotIndex}
+B->>H : 触发 handleBookEvent
+H->>K : 读取凭证
+H->>C : setCredentials(...)
+H->>C : getEventDetail(eventId)
+C->>S : GET /api.php?action=get_event_detail
+S-->>C : 返回 EventDetail
+C-->>H : 返回详情
+alt 多个优惠券
+H-->>U : 展示优惠券选择键盘
+U->>B : 回调选择优惠券
+B->>H : 触发 handleCouponSelection
+else 单个或无优惠券
+H->>C : bookEvent({event_id, time_slot, coupon_code?})
+C->>S : POST /api.php
+S-->>C : 返回结果
+C-->>H : 返回结果
+H-->>U : 成功/失败提示
+end
+```
+
+图表来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L199)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L270)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L329-L343)
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+
+### 预约历史与取消
+历史查询与取消流程展示了认证检查、数据排序与条件生成。
+
+```mermaid
+flowchart TD
+Start(["进入历史命令"]) --> ReadKV["读取 KV 中用户凭证"]
+ReadKV --> HasCreds{"凭证是否存在?"}
+HasCreds --> |否| PromptLogin["提示先登录"] --> End
+HasCreds --> |是| InitClient["初始化 CosmoeClient 并 setCredentials"]
+InitClient --> GetBookings["getMyBookings()"]
+GetBookings --> ResultOK{"code == 200 且有数据?"}
+ResultOK --> |否| ShowError["显示获取失败"] --> End
+ResultOK --> |是| Sort["按日期降序排序并取最新若干条"]
+Sort --> BuildMsg["构建 Markdown 格式消息"]
+BuildMsg --> CancelLink{"满足取消条件?"}
+CancelLink --> |是| AddCancel["添加取消链接"]
+CancelLink --> |否| SkipCancel["跳过取消链接"]
+AddCancel --> Send["发送消息"]
+SkipCancel --> Send
+Send --> End(["结束"])
+```
+
+图表来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L226-L239)
+
+章节来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+
+### 定时任务与新活动通知
+定时任务每分钟执行一次,比较最新事件 ID 并向所有已注册用户推送新活动通知。
+
+```mermaid
+sequenceDiagram
+participant T as "定时器"
+participant SCH as "调度处理器"
+participant C as "CosmoeClient"
+participant S as "Cosmoe 服务端"
+participant K as "KV 命名空间"
+participant U as "Telegram 用户"
+T->>SCH : 触发 scheduled
+SCH->>C : getEvents()
+C->>S : GET /api.php?action=get_events
+S-->>C : 返回事件列表
+C-->>SCH : 返回事件列表
+SCH->>K : list() 获取所有已注册用户
+loop 对每个新事件
+SCH->>U : 发送通知消息
+end
+SCH->>K : 更新 latestEventId
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L17)
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 依赖关系分析
+- 运行时依赖:grammy、@grammyjs/conversations、@grammyjs/storage-cloudflare
+- Worker 配置:KV 命名空间绑定、定时触发器、环境变量
+- 测试:Vitest + Cloudflare Workers 测试工具链
+
+```mermaid
+graph LR
+P["package.json 依赖"] --> G["grammy"]
+P --> GC["grammy conversations"]
+P --> GS["grammy storage-cloudflare"]
+W["wrangler.jsonc"] --> KV1["COSMOE_CREDENTIALS"]
+W --> KV2["COSMOE_STORAGE"]
+W --> TRIG["定时触发器"]
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L30)
+
+章节来源
+- [package.json](file://package.json#L1-L24)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 性能考量
+- 请求合并与去抖:对于频繁查询的场景(如历史列表),可在客户端层增加本地缓存与去抖策略
+- 异步并发:命令处理器中避免不必要的串行等待,合理使用 Promise 并行
+- KV 读写:KV 写入为最终一致,建议在关键路径上做幂等与重试
+- 超时与重试:当前实现未显式设置超时与重试,建议在 fetch 层增加超时控制与指数退避重试
+- 数据量限制:历史消息长度超过平台限制时需截断或分页
+
+## 故障排除指南
+- 认证失败
+  - 检查 KV 中是否正确存储了凭证
+  - 确认 CosmoeClient 是否已 setCredentials
+  - 查看服务端返回的错误码与消息
+- 服务端响应异常
+  - 捕获网络错误与 JSON 解析异常
+  - 在处理器中对 code 字段进行严格判断
+- KV 读写异常
+  - 检查命名空间绑定与权限
+  - 对 JSON 解析失败进行容错处理
+- 定时任务失败
+  - 查看日志输出,确认事件列表与用户列表读取是否成功
+  - 注意消息发送失败时的回退策略
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L70-L74)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L118)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L103-L107)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L81-L84)
+
+## 结论
+本项目以 CosmoeClient 为核心,结合 GrammY 命令系统与 Cloudflare KV 实现了完整的聊天机器人 API 集成方案。通过清晰的职责分离与模块化设计,既保证了可维护性,也为后续扩展新的服务端功能或第三方 API 提供了良好基础。
+
+## 附录
+
+### 设计模式与最佳实践
+- 单一职责:每个 API 方法只负责一个业务动作
+- 统一错误处理:所有 API 方法返回统一的 ApiResponse 结构
+- 权限前置:所有需要鉴权的方法在调用前检查认证状态
+- 可测试性:将 KV 读写抽象为接口,便于单元测试替换
+- 可扩展性:新增 API 时遵循现有模式,保持一致的请求/响应结构
+
+### 数据模型与验证
+- 统一响应结构:包含 code、msg、data 字段
+- 关键实体:Event、EventDetail、UserInfo、UserProfile、Booking、Coupon 等
+- 参数校验:在客户端层对输入参数进行基本校验(如密码长度、时间槽索引范围)
+- 类型约束:使用 TypeScript 接口确保数据结构一致性
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L9-L112)
+
+### 扩展指南:新增 API 端点
+步骤概览:
+1. 在 CosmoeClient 中新增方法,定义请求参数与返回类型
+2. 在命令处理器中调用新方法并处理返回结果
+3. 如需持久化状态,使用 KV 命名空间进行读写
+4. 编写单元测试与集成测试,覆盖正常与异常分支
+
+```mermaid
+flowchart TD
+A["定义新 API 方法"] --> B["实现请求构建与响应解析"]
+B --> C["在处理器中调用新方法"]
+C --> D["处理返回结果与错误"]
+D --> E["必要时写入 KV"]
+E --> F["编写测试用例"]
+```
+
+[此图为概念性流程图,无需图表来源]
+
+### 超时与重试机制建议
+- 超时控制:在 fetch 层设置合理的超时时间(例如 10 秒)
+- 指数退避重试:对 5xx 或网络瞬时错误进行最多 3 次重试,间隔 1、2、4 秒
+- 幂等性:对可能重复提交的操作(如支付订单更新)确保幂等
+- 降级策略:在网络不可用时返回友好提示并记录日志
+
+[本节为通用指导,无需章节来源]

+ 311 - 0
.qoder/repowiki/zh/content/扩展开发/对话扩展.md

@@ -0,0 +1,311 @@
+# 对话扩展
+
+<cite>
+**本文引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本指南围绕使用 grammY conversations 插件构建复杂多步骤对话流程展开,结合项目现有实现,系统讲解:
+- 如何使用 createConversation 定义对话、管理对话状态与状态转换
+- 如何通过 KV 存储实现对话状态持久化
+- 如何在对话中处理用户输入、校验数据、管理会话生命周期
+- 自定义对话状态的设计原则与实现方法
+- 实战扩展示例:新增多步骤交互流程(如“预约事件”完整流程)与状态管理增强
+
+## 项目结构
+该项目采用按功能模块组织的目录结构,对话扩展集中在 command 子系统中,配合 Cloudflare Workers 的 KV 命名空间实现状态持久化与会话管理。
+
+```mermaid
+graph TB
+A["入口: src/index.ts"] --> B["命令注册: src/command/index.ts"]
+B --> C["对话: login.ts"]
+B --> D["命令处理器: events.ts / history.ts / cancel.ts / bookEvent.ts / start.ts"]
+D --> E["客户端: src/client/cosmoe.ts"]
+B --> F["KV 持久化: COSMOE_STORAGE / COSMOE_CREDENTIALS"]
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+## 核心组件
+- Bot 与上下文类型:Bot 使用带 ConversationFlavor 的上下文类型,确保具备 conversation 能力。
+- conversations 插件:安装插件并配置基于 Cloudflare KV 的存储适配器,实现对话状态持久化。
+- createConversation:定义命名对话(如 “login”),在其中实现多步交互与状态管理。
+- KV 命名空间:COSMOE_STORAGE 用于对话状态存储;COSMOE_CREDENTIALS 用于用户凭证存储。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [package.json](file://package.json#L18-L22)
+
+## 架构总览
+grammY conversations 在本项目中的工作流如下:
+- Bot 初始化时注入 ConversationFlavor 上下文类型
+- 安装 conversations 插件,并通过 KV 适配器实现读写删除
+- 使用 createConversation 注册命名对话,进入对话后可使用 conversation.wait() 等 API 获取用户输入
+- 对话状态持久化到 KV,会话生命周期由插件管理
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant P as "conversations 插件"
+participant S as "KV 存储(COSMOE_STORAGE)"
+participant H as "对话处理器(login.ts)"
+U->>B : "/login"
+B->>P : 进入命名对话 "login"
+P->>S : 读取对话状态(若存在)
+P->>H : 执行对话处理器
+H->>U : 发送提示(用户名/密码)
+U->>H : 回复用户名/密码
+H->>H : 校验/调用 API
+H->>S : 写入对话状态/凭证
+H-->>U : 返回结果
+P-->>B : 结束对话
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+## 详细组件分析
+
+### conversations 插件与 KV 存储配置
+- KV 适配器:使用 @grammyjs/storage-cloudflare 的 KvAdapter 包装 COSMOE_STORAGE
+- 自定义存储对象:封装 read/write/delete,统一 JSON 序列化/反序列化
+- 安装插件:bot.use(conversations({ storage: conversationStorage }))
+- 命名对话:bot.use(createConversation(handler, "login"))
+
+```mermaid
+flowchart TD
+Start(["初始化"]) --> KV["创建 KvAdapter(COSMOE_STORAGE)"]
+KV --> Storage["封装 KV 存储(read/write/delete)"]
+Storage --> Plugin["安装 conversations 插件"]
+Plugin --> Conv["注册命名对话: login"]
+Conv --> End(["完成"])
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+
+### createConversation 使用与对话状态管理
+- 入口:/login 命令触发 ctx.conversation.enter("login") 进入命名对话
+- 多步等待:在对话处理器内使用 conversation.wait() 等待用户输入
+- 状态转换:每次等待后根据输入分支推进到下一步
+- 数据持久化:KV 存储自动保存对话状态,重启/并发仍可恢复
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant C as "Conversation"
+participant H as "handleInteractiveLogin"
+U->>B : "/login"
+B->>C : enter("login")
+C->>H : 开始对话
+H->>U : 提示输入用户名
+U->>H : 回复用户名
+H->>U : 提示输入密码
+U->>H : 回复密码
+H->>H : 认证/存储凭证
+H-->>U : 返回结果
+C-->>B : 结束对话
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L63-L66)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L66)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+### 用户输入处理、校验与会话生命周期
+- 输入等待:conversation.wait() 阻塞直到收到消息
+- 输入校验:对用户名/密码等进行非空校验
+- 生命周期:对话结束自动清理;KV 存储负责持久化
+- 错误处理:捕获异常并返回友好提示
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L18-L74)
+
+### KV 存储与凭证管理
+- 凭证存储:登录成功后将 user_id/token 等写入 COSMOE_CREDENTIALS
+- 会话状态:对话状态通过 conversations 插件写入 COSMOE_STORAGE
+- 读取与解析:KV 读取后 JSON 解析,失败时返回 undefined 并记录错误
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L65)
+
+### 实战扩展示例:预约事件多步骤流程
+目标:在现有登录基础上,扩展一个“预约事件”的多步骤对话,包含以下步骤:
+- 选择活动
+- 展示时间槽
+- 选择时间段
+- 选择优惠券(可选)
+- 确认并下单
+
+实现要点:
+- 使用 createConversation 定义命名对话(如 “book-event”)
+- 在对话中分步等待用户输入/回调
+- 使用 KV 存储临时状态(如当前用户选择的活动 ID、时间段索引等)
+- 通过回调查询获取最终确认,再调用 CosmoeClient.bookEvent 完成下单
+
+```mermaid
+flowchart TD
+A["进入对话: book-event"] --> B["展示活动列表"]
+B --> C["等待用户选择活动"]
+C --> D["获取活动详情并排序时间槽"]
+D --> E["等待用户选择时间段"]
+E --> F{"是否有多张可用优惠券?"}
+F -- 是 --> G["展示优惠券选择键盘"]
+G --> H["等待用户选择优惠券"]
+H --> I["确认订单并调用 bookEvent"]
+F -- 否 --> I
+I --> J["返回下单结果"]
+J --> K["结束对话"]
+```
+
+图表来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+
+### 自定义对话状态设计原则与实现
+- 设计原则
+  - 状态最小化:仅保存必要字段,避免冗余
+  - 可恢复性:KV 中的状态应能从上下文重建
+  - 可扩展性:为未来步骤预留字段
+  - 安全性:敏感信息(如 token)不直接存入对话状态
+- 实现方法
+  - 在对话开始时初始化状态对象
+  - 每一步更新状态并写入 KV
+  - 在对话结束或异常时清理状态
+  - 使用版本化存储(如 VersionedStateStorage)以兼容未来变更
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+
+### 会话生命周期与错误处理
+- 生命周期
+  - 进入对话:ctx.conversation.enter(...)
+  - 等待输入:conversation.wait()
+  - 结束对话:自然结束或显式退出
+- 错误处理
+  - KV 读写异常:捕获并记录日志,返回友好提示
+  - 用户输入异常:校验失败时提示重试
+  - API 调用异常:捕获并提示稍后重试
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L70-L74)
+
+## 依赖关系分析
+- grammY 与 grammY conversations:提供对话框架与状态管理
+- @grammyjs/storage-cloudflare:KV 适配器,连接 Cloudflare KV
+- 业务模块:CosmoeClient 封装 API 调用,命令处理器负责业务逻辑
+
+```mermaid
+graph LR
+Pkg["package.json 依赖"] --> G["grammy"]
+Pkg --> GC["@grammyjs/conversations"]
+Pkg --> GS["@grammyjs/storage-cloudflare"]
+Cmd["命令注册: command/index.ts"] --> GC
+Cmd --> GS
+Login["对话: login.ts"] --> GC
+Client["客户端: cosmoe.ts"] --> Api["外部 API"]
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [src/command/index.ts](file://src/command/index.ts#L1-L11)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L270)
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [src/command/index.ts](file://src/command/index.ts#L1-L11)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L270)
+
+## 性能考量
+- KV 读写开销:频繁读写 KV 会增加延迟,建议合并状态更新、减少不必要的写入
+- 消息处理并发:Cloudflare Workers 的并发模型下,注意 KV 写入的幂等性与一致性
+- 会话超时:合理设置会话超时与清理策略,避免 KV 中残留无用状态
+- 缓存策略:对不常变的数据(如活动列表)可考虑本地缓存,降低 KV 压力
+
+## 故障排查指南
+- 对话无法进入
+  - 检查是否正确安装 conversations 插件与 KV 存储
+  - 确认 KV 命名空间权限与键名正确
+- 对话状态丢失
+  - 检查 KV 读写函数是否抛出异常
+  - 确认对话名称一致且未被覆盖
+- 用户输入无响应
+  - 检查 conversation.wait() 是否被正确调用
+  - 确认消息格式与过滤条件匹配
+- 凭证相关问题
+  - 检查 COSMOE_CREDENTIALS 写入是否成功
+  - 确认 token 有效期与 API 调用参数
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L65)
+
+## 结论
+本项目基于 grammY conversations 与 Cloudflare KV,实现了可靠的多步骤对话流程与状态持久化。通过规范的对话状态设计、输入校验与错误处理,可以平滑扩展更多复杂交互场景。建议在新增对话时遵循“状态最小化、可恢复、可扩展”的原则,并结合 KV 的特性优化性能与可靠性。
+
+## 附录
+- 命令菜单与路由
+  - /start:欢迎信息
+  - /login:进入登录对话
+  - /events:查看活动列表
+  - /event_{id}:查看活动详情
+  - /book_{event_id}_{slot_id}:发起预约
+  - /history:查看预约历史
+  - /cancel_{booking_id}:发起取消
+  - 回调:确认取消、选择优惠券
+
+章节来源
+- [src/index.ts](file://src/index.ts#L24-L32)
+- [src/command/index.ts](file://src/command/index.ts#L59-L109)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L26)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L106)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)

+ 351 - 0
.qoder/repowiki/zh/content/扩展开发/扩展开发.md

@@ -0,0 +1,351 @@
+# 扩展开发
+
+<cite>
+**本文引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [package.json](file://package.json)
+- [tsconfig.json](file://tsconfig.json)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本指南面向希望为 Cosmoe Bot 进行扩展开发的工程师,覆盖以下主题:
+- 如何新增命令处理器:从命令注册、参数解析到业务逻辑实现的完整流程
+- 对话状态管理的扩展方法:自定义对话状态、状态转换规则、数据持久化策略
+- 新增 API 客户端:端点封装、认证集成、统一错误处理
+- 插件系统的使用:基于 grammY 的插件架构扩展功能
+- 最佳实践与代码规范:确保新功能与现有系统兼容一致
+- 实际扩展示例与常见场景:快速上手与问题定位
+
+## 项目结构
+Cosmoe Bot 采用按职责分层的组织方式:
+- 入口与运行时:Cloudflare Worker 入口负责初始化 Bot、注册命令菜单、接入 Webhook 与定时任务
+- 命令层:集中注册命令与回调,协调对话与业务处理器
+- 业务处理器:每个命令对应一个处理器模块,负责参数解析与调用 API 客户端
+- API 客户端:对第三方 API 的统一封装,提供认证、错误处理与数据模型
+- 调度器:基于 Cloudflare Cron 的定时任务,用于推送新活动通知等
+
+```mermaid
+graph TB
+A["入口<br/>src/index.ts"] --> B["命令注册与对话<br/>src/command/index.ts"]
+B --> C["命令处理器<br/>src/command/handlers/*.ts"]
+C --> D["API 客户端<br/>src/client/cosmoe.ts"]
+A --> E["定时任务<br/>src/scheduler/index.ts"]
+A --> F["环境变量与类型<br/>worker-configuration.d.ts"]
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L200)
+
+## 核心组件
+- Bot 与上下文:通过 grammY 初始化 Bot,并注入对话风味(ConversationFlavor)以支持对话状态
+- 命令注册中心:集中安装 conversations 插件、KV 存储适配器,并注册各类命令与回调
+- API 客户端:封装第三方 API 的认证、端点与错误处理,统一返回结构
+- KV 持久化:使用 Cloudflare KV 作为对话状态与用户凭证的存储介质
+- 定时任务:基于 Cloudflare Cron 推送新活动通知
+
+章节来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+## 架构总览
+下图展示了从用户输入到 API 调用与 KV 存取的整体流程。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant W as "Worker 入口<br/>src/index.ts"
+participant B as "Bot/命令注册<br/>src/command/index.ts"
+participant H as "命令处理器<br/>handlers/*.ts"
+participant C as "API 客户端<br/>src/client/cosmoe.ts"
+participant K as "KV 存储<br/>COSMOE_STORAGE/COSMOE_CREDENTIALS"
+U->>W : "发送消息/回调"
+W->>B : "webhookCallback 分发"
+B->>H : "匹配命令/正则/回调键"
+H->>K : "读取/写入对话状态/凭证"
+H->>C : "调用 API 方法"
+C-->>H : "返回统一结构"
+H-->>U : "回复消息/内联键盘"
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 详细组件分析
+
+### 命令注册与路由
+- 安装对话插件与 KV 存储:通过 @grammyjs/storage-cloudflare 的 KvAdapter 将对话状态持久化至 KV
+- 注册命令与回调:
+  - 基础命令:/start、/events、/history、/login、/logout
+  - 正则路由:/event_{id}、/book_{event_id}_{slot_id}、/cancel_{booking_id}
+  - 回调查询:确认取消、优惠券选择等
+- 设置命令菜单:在入口中一次性设置 Bot 命令列表
+
+```mermaid
+flowchart TD
+A["setupCommands 启动"] --> B["安装 conversations 插件"]
+B --> C["注册命令与回调"]
+C --> D["/start /events /history /login /logout"]
+C --> E["正则路由:/event_*/book_*/cancel_*"]
+C --> F["回调查询:confirm_cancel_* / select_coupon_*"]
+A --> G["设置命令菜单"]
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/index.ts](file://src/index.ts#L24-L32)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/index.ts](file://src/index.ts#L13-L46)
+
+### 对话状态管理扩展
+- 自定义对话状态:通过 conversations 插件与 KV 存储,对话状态可跨多轮消息保存
+- 状态转换规则:在对话处理器内部使用 conversation.wait() 等 API 控制等待与流转
+- 数据持久化策略:KV 适配器负责序列化/反序列化,异常时记录日志并保持健壮性
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant CV as "对话处理器<br/>login.ts"
+participant K as "KV 存储"
+U->>B : "/login"
+B->>CV : "enter('login')"
+CV->>U : "提示输入用户名"
+U->>CV : "用户名"
+CV->>U : "提示输入密码"
+U->>CV : "密码"
+CV->>K : "写入凭证"
+CV-->>U : "登录结果"
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+### API 客户端集成指南
+- 端点封装:每个 API 方法封装为独立方法,统一参数与返回结构
+- 认证机制:支持显式设置凭证或通过登录流程自动获取并存入 KV
+- 错误处理:统一返回结构包含 code/msg/data;在客户端内部抛出语义化错误或返回错误码
+
+```mermaid
+classDiagram
+class CosmoeClient {
++getToken(username, password)
++setCredentials(userId, token)
++getCredentials()
++isAuthenticated()
++getEvents()
++getEventDetail(eventId)
++getProfile()
++getMyBookings()
++bookEvent(request)
++changePassword(...)
++getUserProfile()
++getAvailableCoupons(eventId)
++updatePaymentOrder(...)
++updateBookingNote(...)
++cancelBooking(bookingId)
++selfReschedule(...)
++selfTransfer(...)
++register(...)
+}
+```
+
+图表来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+### 新增命令处理器:从零到一
+- 步骤概览
+  1) 在命令注册处引入新处理器并注册命令/回调
+  2) 在处理器中解析参数(命令参数、正则捕获、回调数据)
+  3) 读取 KV 凭证或对话状态,调用 API 客户端
+  4) 组织消息内容,必要时构造内联键盘
+  5) 返回响应并处理异常
+- 参考实现路径
+  - 基础命令:/start、/events、/history、/login、/logout
+  - 参数解析:正则路由与回调键解析
+  - KV 读写:凭证与对话状态
+  - API 调用:统一在处理器中调用 CosmoeClient
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L59-L110)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+
+### 插件系统与扩展点
+- conversations 插件:用于多轮对话与状态持久化
+- @grammyjs/storage-cloudflare:KV 存储适配器
+- grammY 中间件与插件:可在入口或命令注册阶段安装更多插件
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L2-L52)
+- [package.json](file://package.json#L18-L22)
+
+### 定时任务与通知
+- 触发时机:Cloudflare Cron 定时触发
+- 逻辑要点:拉取最新事件、对比上次 ID、向已登录用户逐一推送通知
+- KV 使用:存储最新事件 ID 与用户凭证
+
+```mermaid
+sequenceDiagram
+participant S as "调度器<br/>src/scheduler/index.ts"
+participant C as "API 客户端"
+participant K as "KV 存储"
+participant T as "Telegram Bot"
+S->>C : "getEvents()"
+C-->>S : "事件列表"
+S->>K : "读取/更新 latestEventId"
+loop 遍历新事件
+S->>K : "列出已注册用户"
+S->>T : "sendMessage(用户, 新活动通知)"
+end
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 依赖关系分析
+- 运行时依赖:grammy、@grammyjs/conversations、@grammyjs/storage-cloudflare
+- 类型与环境:通过 wrangler 生成的类型声明与 Cloudflare Worker 环境对接
+
+```mermaid
+graph LR
+P["package.json 依赖"] --> G["grammy"]
+P --> GC["conversations"]
+P --> KS["@grammyjs/storage-cloudflare"]
+T["tsconfig.json 编译配置"] --> R["运行时类型/严格检查"]
+W["worker-configuration.d.ts"] --> E["Env 类型注入"]
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [tsconfig.json](file://tsconfig.json#L2-L46)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L200)
+
+章节来源
+- [package.json](file://package.json#L1-L24)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L200)
+
+## 性能考量
+- KV 读写:对话状态与凭证均走 KV,注意批量读取与序列化开销
+- API 调用:避免在高频路径重复请求,可结合缓存策略(如仅在需要时刷新)
+- 消息长度:输出内容需遵守 Telegram API 限制,必要时截断或分段发送
+- 并发控制:定时任务与 Webhook 并发执行,注意 KV 写入竞争与幂等设计
+
+## 故障排查指南
+- 常见错误与处理
+  - KV 读写异常:在对话存储适配器中已记录错误日志,检查命名空间权限与键名
+  - 认证失败:确认凭证是否过期或被清理,必要时引导用户重新登录
+  - API 返回非 200:在处理器中统一解析 msg 字段并反馈给用户
+  - 正则解析失败:检查命令格式与回调键拼接规则
+- 日志与可观测性
+  - 在命令处理器与 API 客户端中保留必要的错误日志
+  - 定时任务中对每个用户的推送结果进行验证与日志记录
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L103-L107)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+## 结论
+通过统一的命令注册中心、KV 持久化的对话状态、以及统一封装的 API 客户端,Cosmoe Bot 提供了清晰的扩展路径。新增命令时遵循“注册—解析—调用—回复—异常”的闭环流程,并在处理器中完成 KV 与 API 的交互,即可快速实现新功能并与现有系统保持一致。
+
+## 附录
+
+### 新增命令处理器最佳实践
+- 命令注册
+  - 在命令注册文件中引入处理器并注册命令/回调
+  - 为回调键与正则表达式定义稳定的格式,便于解析与维护
+- 参数解析
+  - 使用正则捕获关键字段,或在处理器中解析命令文本
+  - 对用户输入进行最小化校验,尽早失败
+- 业务逻辑
+  - 优先读取 KV 凭证或对话状态,再调用 API 客户端
+  - 统一处理 API 返回结构,提取 msg 作为用户可见错误提示
+- 消息与交互
+  - 必要时构造内联键盘,区分编辑消息与发送新消息
+  - 控制消息长度,避免超过平台限制
+- 异常处理
+  - 在处理器中捕获异常并记录日志,向用户返回友好提示
+  - 对于 KV 与网络异常,区分重试策略与降级方案
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L59-L110)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+
+### 对话状态扩展清单
+- 自定义对话:使用 createConversation 定义新对话,绑定环境变量
+- 状态读写:通过 conversations 插件与 KV 适配器实现状态持久化
+- 等待与恢复:在对话处理器中使用 wait/answerCallbackQuery 等 API 控制流程
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+
+### API 客户端扩展清单
+- 新增端点:在客户端类中新增方法,遵循统一的参数与返回结构
+- 认证集成:支持 setCredentials 或通过登录流程自动写入 KV
+- 错误处理:在客户端内部抛出语义化错误或返回错误码,由调用方统一处理
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+### 插件系统使用建议
+- conversations:用于多轮对话与状态持久化
+- @grammyjs/storage-cloudflare:KV 存储适配器
+- grammY 生态:根据需求引入中间件或插件,注意版本兼容与类型声明
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [src/command/index.ts](file://src/command/index.ts#L2-L52)

+ 366 - 0
.qoder/repowiki/zh/content/扩展开发/扩展最佳实践.md

@@ -0,0 +1,366 @@
+# 扩展最佳实践
+
+<cite>
+**本文档引用的文件**
+- [package.json](file://package.json)
+- [tsconfig.json](file://tsconfig.json)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [vitest.config.mts](file://vitest.config.mts)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [test/index.spec.ts](file://test/index.spec.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本指南面向在 Cosmoe Bot 项目上进行扩展开发的工程师,目标是帮助你在保持系统一致性与兼容性的前提下,快速、安全地添加新功能。内容涵盖代码规范与设计原则、错误处理策略、性能优化方法(缓存、异步与资源管理)、测试策略(单元与集成)、安全注意事项、可维护性设计以及调试与故障排除方法。
+
+## 项目结构
+该项目采用按职责分层的组织方式:
+- 入口与运行时:Cloudflare Workers 入口文件负责初始化 Bot、注册命令、设置 Webhook 与定时任务。
+- 命令模块:集中注册命令与对话式交互逻辑,通过 KV 存储会话状态。
+- 定时任务:基于 Cloudflare Cron 触发器执行后台任务(如新活动通知)。
+- 客户端封装:对第三方 API 的统一封装,提供认证、事件查询、预约等能力。
+- 测试:基于 Vitest 与 Cloudflare Workers 池的测试配置。
+
+```mermaid
+graph TB
+A["src/index.ts<br/>Worker 入口"] --> B["src/command/index.ts<br/>命令注册与对话"]
+A --> C["src/scheduler/index.ts<br/>定时任务"]
+B --> D["src/command/handlers/*.ts<br/>命令处理器"]
+D --> E["src/client/cosmoe.ts<br/>Cosmoe API 客户端"]
+C --> E
+F["wrangler.jsonc<br/>部署与触发器配置"] --> A
+G["vitest.config.mts<br/>测试配置"] --> H["test/index.spec.ts<br/>测试用例"]
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 核心组件
+- Worker 入口与环境接口:定义 KV 命名空间绑定与 Webhook 回调。
+- 命令系统:注册命令、回调查询、内联键盘交互;使用 @grammyjs/conversations 实现多轮对话。
+- 定时任务:周期性检查新活动并向已注册用户推送通知。
+- Cosmoe 客户端:封装认证、事件查询、预约、取消、转账、改签等 API 调用。
+- 配置与测试:TypeScript 编译配置、Wrangler 部署配置、Vitest 测试池配置。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [src/command/index.ts](file://src/command/index.ts#L13-L18)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L5-L10)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+
+## 架构总览
+系统由 Cloudflare Workers 承载,Bot 通过 Webhook 接收 Telegram 请求,命令处理器与定时任务分别处理即时交互与后台任务。KV 用于存储用户凭证与会话状态,第三方 API 提供业务数据。
+
+```mermaid
+graph TB
+subgraph "Cloudflare Workers"
+W["Worker 入口<br/>src/index.ts"]
+S["定时任务<br/>src/scheduler/index.ts"]
+CMD["命令系统<br/>src/command/index.ts"]
+end
+subgraph "Telegram"
+TG["Bot API"]
+end
+subgraph "外部服务"
+API["Cosmoe API<br/>src/client/cosmoe.ts"]
+end
+subgraph "存储"
+KV1["COSMOE_CREDENTIALS<br/>KV"]
+KV2["COSMOE_STORAGE<br/>KV"]
+end
+TG --> W
+W --> CMD
+W --> S
+CMD --> KV1
+CMD --> KV2
+S --> KV2
+CMD --> API
+S --> API
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 详细组件分析
+
+### 命令系统与对话
+- 设计要点
+  - 使用 @grammyjs/conversations 插件与 KV 适配器持久化会话状态,确保跨消息的上下文一致。
+  - 将命令与回调查询解耦,通过正则匹配与内联键盘实现灵活交互。
+  - 对外暴露统一的命令注册入口,便于扩展新命令。
+- 关键流程
+  - 登录对话:交互式收集用户名与密码,调用 Cosmoe API 获取 token 并写入 KV。
+  - 预约流程:解析命令参数,校验用户登录状态,查询活动详情与可用时段,支持优惠券选择与最终下单。
+  - 历史与取消:展示用户预约历史,生成可点击的取消链接,二次确认后调用取消接口。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant C as "命令系统"
+participant KV as "KV 存储"
+participant API as "Cosmoe API"
+U->>B : "/login"
+B->>C : 进入登录对话
+C->>U : 请求用户名
+U-->>C : 用户名
+C->>U : 请求密码
+U-->>C : 密码
+C->>API : 获取 token
+API-->>C : 返回 token
+C->>KV : 写入凭证
+C-->>U : 登录成功
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+
+### 定时任务与通知
+- 设计要点
+  - 基于 Cron 触发器定期执行,读取最新活动 ID 并与本地比较,过滤新增活动。
+  - 遍历已注册用户列表,向每个用户发送 Markdown 格式的活动通知。
+  - 成功发送后更新最新活动 ID,避免重复推送。
+- 错误处理
+  - 对 API 调用、KV 访问与消息发送分别进行 try-catch,保证单个用户失败不影响整体流程。
+
+```mermaid
+flowchart TD
+Start(["定时任务启动"]) --> Load["读取最新活动ID"]
+Load --> Fetch["拉取所有活动"]
+Fetch --> HasData{"有数据且数量>0?"}
+HasData --> |否| End(["结束"])
+HasData --> |是| Filter["筛选新增活动"]
+Filter --> Empty{"有新增?"}
+Empty --> |否| End
+Empty --> |是| ListUsers["列出已注册用户"]
+ListUsers --> Notify["逐用户发送通知"]
+Notify --> Update["更新最新活动ID"]
+Update --> End
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L17)
+
+### Cosmoe 客户端
+- 设计要点
+  - 统一封装认证、事件、预约、取消、改签、转账等接口,提供类型安全的数据模型。
+  - 在需要鉴权的方法中显式检查认证状态,避免无谓的网络请求。
+- 性能与健壮性
+  - 对返回值进行严格校验,失败时返回明确的错误信息。
+  - 对字符串与数值字段进行转换与容错处理,提升与第三方 API 的兼容性。
+
+```mermaid
+classDiagram
+class CosmoeClient {
++getToken(username, password)
++setCredentials(userId, token)
++getCredentials()
++isAuthenticated()
++getEvents()
++getEventDetail(eventId)
++getProfile()
++getMyBookings()
++bookEvent(request)
++changePassword(current, new)
++getUserProfile()
++getAvailableCoupons(eventId)
++updatePaymentOrder(bookingId, orderId)
++updateBookingNote(bookingId, note)
++cancelBooking(bookingId)
++selfReschedule(bookingId, newSlot)
++selfTransfer(bookingId, recipient)
++register(key, username, email, password, identity)
+}
+```
+
+图表来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+### 命令处理器示例:开始与事件
+- 开始命令:直接回复欢迎信息与可用命令列表。
+- 事件命令:调用客户端获取活动列表,拼接 Markdown 格式消息并发送。
+
+章节来源
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+
+## 依赖关系分析
+- 运行时依赖
+  - grammY:Telegram Bot 框架,提供命令、回调、内联键盘等能力。
+  - @grammyjs/conversations:多轮对话插件,配合 KV 适配器持久化。
+  - @grammyjs/storage-cloudflare:KV 存储适配器。
+- 开发依赖
+  - Vitest、@cloudflare/vitest-pool-workers:在 Workers 环境中运行测试。
+  - Wrangler:本地开发与部署工具。
+- 配置
+  - tsconfig.json:启用严格模式与 ES2024 目标。
+  - wrangler.jsonc:定义 Worker 名称、入口、触发器与 KV 绑定。
+
+```mermaid
+graph LR
+P["package.json"] --> G["grammy"]
+P --> C["@grammyjs/conversations"]
+P --> K["@grammyjs/storage-cloudflare"]
+V["vitest.config.mts"] --> WP["@cloudflare/vitest-pool-workers"]
+T["tsconfig.json"] --> TS["TypeScript 编译选项"]
+W["wrangler.jsonc"] --> TR["触发器/Cron"]
+W --> KV["KV 命名空间绑定"]
+```
+
+图表来源
+- [package.json](file://package.json#L12-L22)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+章节来源
+- [package.json](file://package.json#L1-L24)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+
+## 性能考虑
+- 缓存策略
+  - KV 存储会话状态与用户凭证,减少重复认证与对话初始化开销。
+  - 定时任务中以“最新活动 ID”作为简单缓存键,避免重复推送。
+- 异步与并发
+  - 对多个用户的推送采用串行循环,避免并发风暴;若需提升吞吐,可在 KV 与 API 限流允许范围内引入批量处理。
+- 资源管理
+  - 合理控制消息长度,避免超过 Telegram API 限制。
+  - 对数组截断与排序操作仅在必要时进行,避免不必要的计算。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L49)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L78)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L94-L97)
+
+## 故障排除指南
+- 常见问题与定位
+  - Webhook 设置失败:检查 Worker 入口是否正确返回 webhook 回调,确认环境变量与 Bot Token。
+  - 命令无响应:确认命令注册顺序与正则匹配是否正确,查看回调查询是否绑定到对应处理器。
+  - KV 读写异常:检查 KV 命名空间绑定与权限,确认键名格式与 JSON 序列化。
+  - 第三方 API 调用失败:查看返回码与消息,确认鉴权状态与参数格式。
+  - 定时任务未触发:检查 Cron 表达式与触发器配置。
+- 日志与可观测性
+  - 使用 console.error 输出错误堆栈与上下文信息,便于排查。
+  - 启用 Wrangler 可观测性,观察请求耗时与错误率。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L24-L32)
+- [src/command/index.ts](file://src/command/index.ts#L26-L47)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L81-L83)
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+
+## 结论
+通过模块化设计与严格的错误处理,本项目在 Cloudflare Workers 上实现了稳定、可扩展的 Telegram Bot。遵循本文的最佳实践,可以在不破坏现有功能的前提下,快速、安全地扩展新特性。
+
+## 附录
+
+### 代码规范与设计原则
+- 命名与结构
+  - 文件与目录采用语义化命名,命令处理器按功能拆分至独立文件。
+  - 类型与接口尽量靠近使用处声明,便于维护。
+- 错误处理
+  - 对外统一返回明确的错误信息;内部使用 try-catch 包裹异步调用。
+  - 对 KV 读写与 API 调用进行空值与类型检查。
+- 可维护性
+  - 将复杂逻辑拆分为小函数,保持单一职责。
+  - 对正则表达式与回调查询进行集中管理,避免散落的硬编码。
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L120-L157)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L67-L92)
+
+### 测试策略
+- 单元测试
+  - 针对纯函数与工具函数编写测试,模拟输入输出。
+- 集成测试
+  - 使用 Vitest 与 @cloudflare/vitest-pool-workers 在 Workers 环境中测试 Worker 入口与命令处理器。
+  - 通过 SELF.fetch 或自定义 Request/ExecutionContext 调用 worker.fetch 并断言响应。
+- 配置
+  - 测试池指向 wrangler.jsonc,确保与生产环境一致。
+
+章节来源
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+
+### 安全考虑
+- 输入验证
+  - 对用户输入进行长度、格式与范围校验,避免注入与越界。
+- 凭证管理
+  - 将用户凭证存储在 KV 中,避免明文日志与内存泄漏。
+  - 在客户端中显式检查认证状态,防止未授权访问。
+- 传输安全
+  - 使用 HTTPS 访问第三方 API,避免中间人攻击。
+- 最小权限
+  - 为 KV 与 API 分配最小必要的访问权限。
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L65)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L35-L39)
+
+### 调试技巧
+- 使用 Wrangler 开发服务器与日志输出定位问题。
+- 在关键路径添加 console.log 输出上下文信息(如用户 ID、事件 ID、回调数据)。
+- 对回调查询与内联键盘进行逐步验证,确保数据传递与解析正确。
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L18-L87)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L132)

+ 427 - 0
.qoder/repowiki/zh/content/扩展开发/插件系统使用.md

@@ -0,0 +1,427 @@
+# 插件系统使用
+
+<cite>
+**本文档引用的文件**
+- [package.json](file://package.json)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概览](#架构概览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+
+本项目展示了如何在 Cloudflare Workers 环境中使用 grammY 框架的插件系统,特别是 conversations 插件与 @grammyjs/storage-cloudflare 的集成。该系统实现了完整的摄影活动预约机器人功能,包括用户认证、活动浏览、时间槽选择、优惠券管理和定时通知等特性。
+
+项目采用模块化架构,通过插件机制扩展 Bot 功能,支持对话式交互和状态持久化存储。所有插件都经过精心设计以确保最佳性能和用户体验。
+
+## 项目结构
+
+项目采用清晰的分层架构,每个目录都有明确的职责分工:
+
+```mermaid
+graph TB
+subgraph "应用入口"
+A[src/index.ts] --> B[Cloudflare Worker 入口]
+A --> C[Webhook 处理]
+end
+subgraph "命令处理层"
+D[src/command/index.ts] --> E[插件安装]
+D --> F[命令路由]
+D --> G[对话管理]
+end
+subgraph "处理器模块"
+H[src/command/handlers/] --> I[登录处理器]
+H --> J[事件处理器]
+H --> K[预订处理器]
+H --> L[历史处理器]
+end
+subgraph "业务逻辑层"
+M[src/client/cosmoe.ts] --> N[Cosmoe API 客户端]
+M --> O[数据模型定义]
+end
+subgraph "调度服务"
+P[src/scheduler/index.ts] --> Q[定时任务]
+P --> R[新活动通知]
+end
+subgraph "配置文件"
+S[wrangler.jsonc] --> T[Cloudflare 配置]
+U[package.json] --> V[依赖管理]
+end
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L76)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L76)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 核心组件
+
+### grammY Bot 核心
+
+Bot 实例是整个系统的核心,负责处理 Telegram 消息和事件。项目中使用了泛型类型 `ConversationFlavor<Context>` 来增强上下文对象,使其支持对话功能。
+
+### conversations 插件
+
+conversations 插件提供了强大的对话式交互能力,允许开发者创建多步骤的交互流程。项目中将其与 Cloudflare KV 存储集成,实现状态持久化。
+
+### @grammyjs/storage-cloudflare 插件
+
+专门为 Cloudflare Workers 环境设计的存储适配器,提供了 KV 命名空间的读写接口,确保对话状态在分布式环境中的一致性和可靠性。
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [package.json](file://package.json#L18-L22)
+
+## 架构概览
+
+系统采用插件化的微架构设计,各个组件通过清晰的接口进行交互:
+
+```mermaid
+sequenceDiagram
+participant User as 用户
+participant Bot as grammY Bot
+participant Conv as conversations 插件
+participant Storage as Cloudflare KV
+participant API as Cosmoe API
+User->>Bot : 发送 /login 命令
+Bot->>Conv : 进入登录对话
+Conv->>Storage : 读取用户状态
+Conv->>User : 请求用户名
+User->>Conv : 输入用户名
+Conv->>User : 请求密码
+User->>Conv : 输入密码
+Conv->>API : 验证凭据
+API-->>Conv : 返回验证结果
+Conv->>Storage : 存储用户凭据
+Conv-->>User : 显示登录结果
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L54-L66)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+### 数据流架构
+
+```mermaid
+flowchart TD
+A[Telegram 消息] --> B[Bot 处理器]
+B --> C{消息类型判断}
+C --> |命令消息| D[命令处理器]
+C --> |文本消息| E[文本处理器]
+C --> |回调查询| F[回调处理器]
+D --> G[conversations 插件]
+E --> H[业务逻辑处理器]
+F --> I[状态更新处理器]
+G --> J[KV 存储适配器]
+H --> K[Cosmoe API 客户端]
+I --> J
+J --> L[Cloudflare KV]
+K --> M[Cosmoe 服务器]
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L59-L76)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+
+## 详细组件分析
+
+### conversations 插件集成
+
+#### 存储适配器配置
+
+项目实现了自定义的 KV 存储适配器,将 @grammyjs/storage-cloudflare 的功能封装为更易用的接口:
+
+```mermaid
+classDiagram
+class ConversationStorage {
++read(key : string) Promise~any~
++write(key : string, value : any) Promise~void~
++delete(key : string) Promise~void~
+}
+class KvAdapter {
++read(key : string) Promise~string|undefined~
++write(key : string, value : string) Promise~void~
++delete(key : string) Promise~void~
+}
+class ConversationFlavor {
++conversation Conversation
+}
+ConversationStorage --> KvAdapter : 使用
+ConversationFlavor --> ConversationStorage : 提供
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+
+#### 对话创建和管理
+
+项目创建了一个专门的登录对话,展示了如何使用 `createConversation` 函数:
+
+**章节来源**
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+### 命令处理器架构
+
+#### 事件管理系统
+
+事件处理模块展示了如何结合 conversations 插件和 API 调用来实现复杂的业务逻辑:
+
+```mermaid
+sequenceDiagram
+participant User as 用户
+participant Bot as Bot
+participant Handler as 事件处理器
+participant API as Cosmoe API
+participant KV as KV 存储
+User->>Bot : /events
+Bot->>Handler : handleEventsCommand
+Handler->>API : 获取活动列表
+API-->>Handler : 返回活动数据
+Handler->>Handler : 格式化消息
+Handler-->>User : 发送活动列表
+User->>Bot : /event_123
+Bot->>Handler : handleEventDetails
+Handler->>API : 获取活动详情
+API-->>Handler : 返回活动详情
+Handler->>Handler : 生成预订键盘
+Handler-->>User : 发送活动详情和预订选项
+```
+
+**图表来源**
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+
+**章节来源**
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+
+### 定时任务系统
+
+#### 新活动通知机制
+
+项目实现了基于 Cloudflare Cron 触发器的定时任务,用于向注册用户推送新活动通知:
+
+```mermaid
+flowchart TD
+A[Cron 触发器] --> B[定时任务执行]
+B --> C[获取最新活动ID]
+C --> D[调用 Cosmoe API]
+D --> E[过滤新活动]
+E --> F{有新活动?}
+F --> |否| G[结束任务]
+F --> |是| H[遍历注册用户]
+H --> I[发送通知消息]
+I --> J[更新最新活动ID]
+J --> G
+```
+
+**图表来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+**章节来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+### API 客户端设计
+
+#### Cosmoe API 客户端
+
+项目实现了完整的 Cosmoe API 客户端,封装了所有必要的业务操作:
+
+```mermaid
+classDiagram
+class CosmoeClient {
+-baseUrl : string
+-userId : number
+-token : string
++getToken(username, password) Promise~ApiResponse~
++getEvents() Promise~ApiResponse~
++getEventDetail(eventId) Promise~ApiResponse~
++getProfile() Promise~ApiResponse~
++getMyBookings() Promise~ApiResponse~
++bookEvent(request) Promise~ApiResponse~
++setCredentials(userId, token) void
++getCredentials() Object|null
++isAuthenticated() boolean
+}
+class ApiResponse {
++code : number
++msg : string
++data : any
+}
+class Event {
++id : string
++name : string
++description : string
++event_date : string
++slots : TimeSlot[]
+}
+CosmoeClient --> ApiResponse : 返回
+CosmoeClient --> Event : 处理
+```
+
+**图表来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+## 依赖关系分析
+
+### 核心依赖关系
+
+项目使用了以下关键依赖:
+
+```mermaid
+graph TB
+subgraph "运行时依赖"
+A[grammy ^1.39.3] --> B[核心框架]
+C[@grammyjs/conversations ^2.1.1] --> D[对话插件]
+E[@grammyjs/storage-cloudflare ^2.4.2] --> F[KV 存储适配器]
+end
+subgraph "开发依赖"
+G[typescript ^5.5.2] --> H[类型支持]
+I[vitest ~3.2.0] --> J[测试框架]
+K[wrangler ^4.59.2] --> L[Cloudflare CLI]
+end
+subgraph "项目特定"
+M[Cosmoe API 客户端] --> N[业务逻辑]
+O[Cloudflare KV] --> P[状态存储]
+end
+A --> C
+A --> E
+C --> E
+M --> N
+O --> P
+```
+
+**图表来源**
+- [package.json](file://package.json#L12-L22)
+
+### 版本兼容性
+
+项目确保了所有依赖的版本兼容性:
+- grammY: ^1.39.3
+- conversations: ^2.1.1 (与 grammY 兼容)
+- storage-cloudflare: ^2.4.2 (与 grammY 兼容)
+
+**章节来源**
+- [package.json](file://package.json#L1-L24)
+
+## 性能考虑
+
+### 存储优化策略
+
+1. **KV 存储访问优化**: 通过批量操作和缓存机制减少 KV 访问次数
+2. **API 调用限制**: 合理设置 API 调用频率,避免触发限流
+3. **内存使用控制**: 及时清理不再需要的数据结构
+
+### 并发处理
+
+项目采用异步处理模式,确保高并发场景下的稳定性:
+- 使用 Promise 和 async/await 处理异步操作
+- 避免阻塞主线程的操作
+- 合理使用 Cloudflare Workers 的并发特性
+
+### 错误处理策略
+
+```mermaid
+flowchart TD
+A[操作开始] --> B{检查输入参数}
+B --> |无效| C[返回错误响应]
+B --> |有效| D[执行主要逻辑]
+D --> E{操作成功?}
+E --> |是| F[返回成功响应]
+E --> |否| G{是否可恢复?}
+G --> |是| H[重试操作]
+G --> |否| I[记录错误并返回]
+H --> E
+```
+
+## 故障排除指南
+
+### 常见问题诊断
+
+#### conversations 插件问题
+
+1. **对话状态丢失**
+   - 检查 KV 存储连接配置
+   - 验证命名空间绑定正确性
+   - 确认存储权限设置
+
+2. **对话超时**
+   - 检查网络连接稳定性
+   - 验证 Cloudflare Workers 配置
+   - 监控 KV 存储延迟
+
+#### API 集成问题
+
+1. **认证失败**
+   - 验证用户名和密码格式
+   - 检查网络连接状态
+   - 确认 API 服务可用性
+
+2. **数据格式错误**
+   - 检查 API 响应格式变化
+   - 验证数据模型映射
+   - 更新客户端代码
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L69-L74)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L118)
+
+### 调试技巧
+
+1. **启用详细日志记录**
+   - 在关键操作点添加日志
+   - 监控 KV 存储访问
+   - 跟踪 API 调用状态
+
+2. **使用 Cloudflare Workers 开发工具**
+   - 利用 wrangler dev 进行本地调试
+   - 使用浏览器开发者工具监控网络请求
+   - 检查 Cloudflare Workers 日志
+
+## 结论
+
+本项目展示了如何在 Cloudflare Workers 环境中有效使用 grammY 框架的插件系统。通过 conversations 插件与 @grammyjs/storage-cloudflare 的完美集成,实现了功能完整、性能优异的聊天机器人解决方案。
+
+### 主要优势
+
+1. **模块化设计**: 清晰的分层架构便于维护和扩展
+2. **插件化架构**: 通过插件机制轻松扩展功能
+3. **云原生优化**: 充分利用 Cloudflare Workers 的特性
+4. **状态持久化**: 通过 KV 存储实现可靠的对话状态管理
+
+### 最佳实践总结
+
+1. **插件选择**: 优先选择与目标平台兼容的插件
+2. **存储策略**: 根据业务需求选择合适的存储方案
+3. **错误处理**: 实现完善的错误处理和恢复机制
+4. **性能优化**: 关注并发处理和资源使用效率
+5. **测试覆盖**: 确保关键路径都有相应的测试用例
+
+该系统为构建企业级聊天机器人提供了坚实的基础,可以作为其他项目的参考模板。

+ 359 - 0
.qoder/repowiki/zh/content/扩展开发/新命令开发.md

@@ -0,0 +1,359 @@
+# 新命令开发
+
+<cite>
+**本文档引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+10. [附录:新命令开发完整流程](#附录新命令开发完整流程)
+
+## 简介
+本指南面向希望为现有命令系统添加新命令的开发者,涵盖命令注册流程、参数解析方法、业务逻辑实现步骤、命令路由机制(command() 与 hears() 的使用场景与区别)、错误处理策略以及用户交互最佳实践。文档以项目现有实现为蓝本,提供可直接参考的扩展示例,帮助快速完成新命令的开发与集成。
+
+## 项目结构
+该项目基于 grammY 框架与 Cloudflare Workers 运行时,采用模块化组织方式:
+- 入口文件负责初始化 Bot 并设置命令菜单
+- 命令注册集中于命令模块,统一管理所有命令与回调
+- 命令处理器按功能拆分至 handlers 目录
+- 客户端封装对第三方 API 的调用
+
+```mermaid
+graph TB
+A["入口: src/index.ts"] --> B["命令注册: src/command/index.ts"]
+B --> C["命令处理器: src/command/handlers/*.ts"]
+C --> D["客户端: src/client/cosmoe.ts"]
+A --> E["Cloudflare 环境变量"]
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+## 核心组件
+- Bot 初始化与 Webhook 回调:入口文件创建 Bot 实例,配置命令菜单,并通过 Cloudflare Worker 的 webhookCallback 接收外部请求。
+- 命令注册中心:命令模块集中导入各处理器,使用 bot.command() 与 bot.hears() 注册命令与模式匹配事件,并安装对话插件支持多步交互。
+- 命令处理器:每个处理器负责单一职责,处理参数、调用客户端 API、构建响应消息并进行错误处理。
+- 客户端封装:CosmoeClient 提供认证、活动查询、预约、取消等 API 调用,统一返回格式与错误处理。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 架构总览
+下图展示了从用户触发命令到业务处理与响应的完整流程,以及命令路由机制的差异。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant W as "Cloudflare Webhook"
+participant B as "Bot 实例"
+participant R as "命令路由"
+participant H as "命令处理器"
+participant C as "CosmoeClient"
+participant API as "第三方 API"
+U->>W : "发送消息/命令"
+W->>B : "webhookCallback 分发"
+B->>R : "根据路由规则匹配"
+alt "命令路由 : bot.command()"
+R->>H : "调用对应处理器"
+else "模式路由 : bot.hears()"
+R->>H : "正则匹配后调用处理器"
+else "回调路由 : bot.callbackQuery()"
+R->>H : "回调数据解析后调用处理器"
+end
+H->>C : "调用客户端 API"
+C->>API : "HTTP 请求"
+API-->>C : "返回结果"
+C-->>H : "标准化结果"
+H-->>U : "发送响应消息"
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L14-L35)
+- [src/command/index.ts](file://src/command/index.ts#L59-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 详细组件分析
+
+### 命令注册与路由机制
+- bot.command("命令名", 处理器):用于标准命令触发,例如 /start、/login、/events、/history、/logout。
+- bot.hears(正则表达式, 处理器):用于模式匹配的消息触发,例如 /event_{id}、/book_{event_id}_{slot_id}、/cancel_{booking_id}。
+- bot.callbackQuery(正则表达式, 处理器):用于内联键盘回调,例如确认取消、选择优惠券等。
+
+```mermaid
+flowchart TD
+Start(["收到消息"]) --> Type{"消息类型"}
+Type --> |命令| Cmd["bot.command() 匹配"]
+Type --> |文本/正则| Hears["bot.hears() 匹配"]
+Type --> |回调| CB["bot.callbackQuery() 匹配"]
+Cmd --> Handler["调用对应处理器"]
+Hears --> Handler
+CB --> Handler
+Handler --> End(["发送响应"])
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L59-L110)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L59-L110)
+
+### 参数解析与业务逻辑实现步骤
+- 解析上下文参数:从 ctx.from、ctx.message、ctx.match、ctx.callbackQuery.data 等提取必要信息。
+- 数据校验:检查用户身份、登录状态、参数有效性、业务约束(如时间范围、库存)。
+- 调用客户端 API:通过 CosmoeClient 执行业务操作,统一处理返回码与错误信息。
+- 构建响应消息:使用 Markdown 或纯文本格式,注意长度限制与 Telegram API 限制。
+- 错误处理:捕获异常、记录日志、向用户反馈错误信息。
+
+章节来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L34)
+
+### 命令处理器示例分析
+
+#### 启动命令处理器
+- 功能:向用户展示可用命令列表。
+- 关键点:使用 ctx.reply 发送文本;适合简单无状态命令。
+
+章节来源
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L4-L6)
+
+#### 事件列表命令处理器
+- 功能:拉取最新活动并生成列表链接。
+- 关键点:调用 CosmoeClient.getEvents;限制数量;Markdown 格式化;错误兜底。
+
+章节来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+
+#### 事件详情与预约命令处理器
+- 功能:解析 /event_{id} 与 /book_{event_id}_{slot_id},展示时间槽并支持优惠券选择。
+- 关键点:正则匹配参数;KV 存储用户凭证;调用 getEventDetail 与 getAvailableCoupons;内联键盘与回调处理;Markdown 格式化;库存与时间判断。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant ED as "事件详情处理器"
+participant BE as "预约处理器"
+participant C as "CosmoeClient"
+participant API as "第三方 API"
+U->>B : "/event_123"
+B->>ED : "匹配 /event_{id}"
+ED->>C : "getEventDetail(id)"
+C->>API : "请求"
+API-->>C : "返回活动详情"
+C-->>ED : "返回数据"
+ED-->>U : "发送活动详情与可预约链接"
+U->>B : "/book_123_0"
+B->>BE : "匹配 /book_{event_id}_{slot_id}"
+BE->>C : "getEventDetail(eventId)"
+C-->>BE : "返回数据"
+BE->>BE : "检查库存与优惠券"
+alt "多个优惠券"
+BE-->>U : "显示优惠券选择键盘"
+U->>B : "回调 : select_coupon_123_0_xxx"
+B->>BE : "解析回调"
+BE->>C : "bookEvent(couponCode)"
+else "单个/无优惠券"
+BE->>C : "bookEvent()"
+end
+C-->>BE : "返回结果"
+BE-->>U : "发送预约结果"
+```
+
+图表来源
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L270)
+
+章节来源
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+
+#### 预约历史与取消命令处理器
+- 功能:读取用户凭证,查询预约历史,生成 Markdown 列表,并提供取消链接与确认回调。
+- 关键点:KV 读写凭证;认证校验;排序与截断;贝时拼接与比较;内联键盘确认;回调解析与状态更新。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant HC as "历史处理器"
+participant CC as "取消处理器"
+participant C as "CosmoeClient"
+participant API as "第三方 API"
+U->>B : "/history"
+B->>HC : "调用历史处理器"
+HC->>HC : "KV 读取凭证"
+HC->>C : "getMyBookings()"
+C-->>HC : "返回历史数据"
+HC-->>U : "发送历史列表(含取消链接)"
+U->>B : "/cancel_456"
+B->>CC : "匹配 /cancel_{booking_id}"
+CC->>C : "getMyBookings() 确认"
+CC-->>U : "发送确认键盘"
+U->>B : "回调 : confirm_cancel_456"
+B->>CC : "解析回调"
+CC->>C : "cancelBooking(456)"
+C-->>CC : "返回结果"
+CC-->>U : "编辑消息为取消结果"
+```
+
+图表来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L226-L422)
+
+章节来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+
+#### 登录与登出命令处理器
+- 功能:登录采用对话式多步交互,登出清理 KV 中的凭证。
+- 关键点:对话插件与 KV 适配器;凭证持久化;错误处理与提示。
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L34)
+
+### 客户端 API 封装
+CosmoeClient 统一封装了认证、活动、预约、取消、转账、改密等 API,提供一致的返回格式与错误处理,便于命令处理器复用。
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 依赖分析
+- grammY:核心框架,提供 Bot、Context、InlineKeyboard、callbackQuery 等能力。
+- @grammyjs/conversations:对话插件,支持多步交互与状态存储。
+- @grammyjs/storage-cloudflare:KV 存储适配器,用于会话状态持久化。
+- Cloudflare Workers:运行时环境,提供 KVNamespace、Webhook 回调等。
+
+```mermaid
+graph TB
+Pkg["package.json 依赖"] --> G["grammy"]
+Pkg --> Conv["@grammyjs/conversations"]
+Pkg --> KV["@grammyjs/storage-cloudflare"]
+G --> Bot["Bot/Context"]
+Conv --> Conversations["对话插件"]
+KV --> Storage["KV 适配器"]
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+
+章节来源
+- [package.json](file://package.json#L1-L24)
+
+## 性能考虑
+- 消息长度控制:历史与详情消息可能较长,需限制长度避免 Telegram API 限制。
+- KV 访问优化:尽量减少 KV 读写次数,合并请求或缓存必要数据。
+- 异步并发:合理使用异步调用,避免阻塞主线程。
+- 错误快速失败:在参数无效或状态不满足时尽早返回,减少无效请求。
+
+## 故障排除指南
+- 命令未生效:检查命令是否在入口文件中设置命令菜单,以及命令注册是否正确导入。
+- 参数解析失败:确认正则表达式与 ctx.match 是否匹配预期格式。
+- 凭证问题:检查 KV 中是否存在用户凭证,登录状态是否有效。
+- API 返回异常:查看客户端封装的错误处理与返回码,确保统一处理。
+- 回调无响应:确认回调查询与回调处理器的正则匹配一致,并正确调用 answerCallbackQuery。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L24-L32)
+- [src/command/index.ts](file://src/command/index.ts#L92-L105)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L13-L29)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L16-L117)
+
+## 结论
+通过统一的命令注册中心与清晰的处理器职责划分,项目实现了可扩展的命令系统。新增命令应遵循现有模式:在命令模块中注册路由,在 handlers 目录中实现处理器,利用 CosmoeClient 封装 API,严格进行参数校验与错误处理,并通过 Markdown 等格式提升用户体验。
+
+## 附录:新命令开发完整流程
+
+### 第一步:设计命令与参数
+- 明确命令名称与用途(如 /admin_stats)。
+- 设计参数格式与可选参数,决定使用 bot.command() 还是 bot.hears()。
+- 规划用户交互流程(是否需要内联键盘或对话)。
+
+### 第二步:创建处理器文件
+- 在 src/command/handlers 下新建处理器文件,导出异步处理函数。
+- 处理函数签名建议:handleXxxCommand(ctx, env?),其中 env 可选用于访问 KV 等资源。
+
+章节来源
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L4-L6)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+
+### 第三步:实现业务逻辑
+- 解析参数:从 ctx.from、ctx.message、ctx.match、ctx.callbackQuery.data 获取必要信息。
+- 校验输入:检查用户身份、登录状态、参数合法性。
+- 调用客户端:通过 CosmoeClient 执行业务操作。
+- 构建响应:使用 Markdown 或纯文本,注意长度限制与格式规范。
+
+章节来源
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L120-L157)
+
+### 第四步:注册命令路由
+- 在命令模块中导入新处理器。
+- 使用 bot.command() 或 bot.hears() 注册路由,必要时使用 bot.callbackQuery() 注册回调。
+- 如需对话交互,使用 conversations 插件与 createConversation 包裹处理器。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L55-L57)
+- [src/command/index.ts](file://src/command/index.ts#L64-L66)
+- [src/command/index.ts](file://src/command/index.ts#L72-L80)
+- [src/command/index.ts](file://src/command/index.ts#L92-L105)
+
+### 第五步:设置命令菜单
+- 在入口文件中调用 bot.api.setMyCommands 设置命令菜单,确保用户可见。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L24-L32)
+
+### 第六步:错误处理与测试
+- 添加 try-catch 捕获异常,记录日志并友好提示用户。
+- 编写单元测试覆盖正常与异常路径。
+- 在本地与生产环境中验证命令行为。
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L70-L74)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L103-L107)
+
+### 示例:添加一个“管理员统计”命令
+- 命令设计:/admin_stats,仅管理员可用,返回预约统计与用户活跃度。
+- 参数:可选日期范围(YYYY-MM-DD),默认最近7天。
+- 路由:使用 bot.command() 注册。
+- 处理器:解析参数、校验管理员权限、调用客户端统计接口、构建 Markdown 表格并发送。
+- 回调:如需分页或筛选,使用内联键盘与回调处理。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L59-L70)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L47-L92)

+ 292 - 0
.qoder/repowiki/zh/content/数据管理/KV 存储设计.md

@@ -0,0 +1,292 @@
+# KV 存储设计
+
+<cite>
+**本文档引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [.dev.vars](file://.dev.vars)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向 Cloudflare KV 存储在该项目中的设计与实现,重点围绕 KVAdapter 的配置与使用、COSMOE_STORAGE 命名空间的设置与环境变量配置、键值设计原则(会话数据、用户状态、临时数据)、数据序列化与反序列化策略(含错误处理与格式验证)、性能优化建议(数据大小限制、读写最佳实践)、存储容量规划、成本控制与监控指标进行系统性说明。内容基于仓库实际代码进行分析,确保可追溯与可落地。
+
+## 项目结构
+该项目为一个基于 Cloudflare Workers 的 Telegram Bot,采用 KV 存储分别承载两类数据:
+- 用户凭证存储:COSMOE_CREDENTIALS(KVNamespace)
+- 会话与临时状态存储:COSMOE_STORAGE(KVNamespace)
+
+KV 命名空间在 Wrangler 配置中定义,并通过环境绑定到 Worker 运行时;Bot 主入口负责初始化命令与调度任务,命令模块通过 KVAdapter 将会话状态持久化至 COSMOE_STORAGE;调度模块使用 COSMOE_STORAGE 记录最新事件 ID,并从 COSMOE_CREDENTIALS 获取已注册用户列表以推送新活动通知。
+
+```mermaid
+graph TB
+subgraph "Cloudflare Workers"
+SRC_INDEX["src/index.ts"]
+CMD_INDEX["src/command/index.ts"]
+SCHED_INDEX["src/scheduler/index.ts"]
+LOGIN_H["src/command/handlers/login.ts"]
+LOGOUT_H["src/command/handlers/logout.ts"]
+CLIENT["src/client/cosmoe.ts"]
+end
+WRANGLER["wrangler.jsonc"]
+DEV_VARS[".dev.vars"]
+KV1["COSMOE_CREDENTIALS<br/>KVNamespace"]
+KV2["COSMOE_STORAGE<br/>KVNamespace"]
+WRANGLER --> KV1
+WRANGLER --> KV2
+DEV_VARS --> SRC_INDEX
+SRC_INDEX --> CMD_INDEX
+SRC_INDEX --> SCHED_INDEX
+CMD_INDEX --> KV2
+CMD_INDEX --> KV1
+LOGIN_H --> KV1
+LOGOUT_H --> KV1
+SCHED_INDEX --> KV1
+SCHED_INDEX --> KV2
+CMD_INDEX --> CLIENT
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L34)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 核心组件
+- KVAdapter:用于将 grammY 的会话存储抽象映射到 Cloudflare KV,实现 read/write/delete 操作。
+- COSMOE_STORAGE:承载会话状态与临时数据(如“最新活动 ID”)。
+- COSMOE_CREDENTIALS:承载用户凭证(Telegram 用户 ID -> Cosmoe 凭证)。
+- 环境接口 Env:统一声明 BOT_TOKEN、BOT_INFO、COSMOE_CREDENTIALS、COSMOE_STORAGE。
+- Wrangler 配置:定义 KV 命名空间绑定与运行参数。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 架构总览
+KV 存储在该应用中的职责划分如下:
+- 会话状态:通过 KVAdapter 将 grammY 会话状态持久化到 COSMOE_STORAGE,支持 JSON 序列化与反序列化。
+- 用户凭证:登录成功后将 Cosmoe 用户 ID 与 token 写入 COSMOE_CREDENTIALS,按 Telegram 用户 ID 作为键。
+- 临时数据:调度任务使用 COSMOE_STORAGE 记录“最新活动 ID”,避免重复推送。
+- 用户列表:调度任务通过 COSMOE_CREDENTIALS.list() 获取所有已注册用户 ID,向其推送新活动。
+
+```mermaid
+sequenceDiagram
+participant User as "Telegram 用户"
+participant Bot as "Bot 实例"
+participant Cmd as "命令模块"
+participant KV as "COSMOE_STORAGE"
+participant Creds as "COSMOE_CREDENTIALS"
+participant API as "Cosmoe API 客户端"
+User->>Bot : "/login"
+Bot->>Cmd : 进入交互式登录对话
+Cmd->>API : 获取 token
+API-->>Cmd : 返回 token
+Cmd->>Creds : put(Telegram 用户ID, JSON 凭证)
+Cmd-->>User : 登录成功
+User->>Bot : 发送任意消息
+Bot->>Cmd : 读取会话状态
+Cmd->>KV : read(会话键)
+KV-->>Cmd : JSON 字符串
+Cmd->>Cmd : JSON.parse()
+Cmd-->>User : 回复基于会话状态
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L63)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+## 详细组件分析
+
+### KVAdapter 配置与使用
+- 在命令模块中创建 KVAdapter 并封装 read/write/delete,实现会话状态的持久化。
+- 读取时对 KV 返回的字符串进行 JSON.parse,异常时返回 undefined 并记录日志。
+- 写入时对对象进行 JSON.stringify,异常时记录错误但不中断流程。
+- 该适配器直接依赖 Worker 运行时提供的 KVNamespace 接口。
+
+```mermaid
+flowchart TD
+Start(["进入会话读取"]) --> KVRead["KVAdapter.read(key)"]
+KVRead --> HasValue{"KV 是否有值?"}
+HasValue --> |否| ReturnUndef["返回 undefined"]
+HasValue --> |是| Parse["JSON.parse(value)"]
+Parse --> ParseOK{"解析是否成功?"}
+ParseOK --> |否| LogErr["记录错误并返回 undefined"]
+ParseOK --> |是| ReturnParsed["返回解析结果"]
+ReturnUndef --> End(["结束"])
+LogErr --> End
+ReturnParsed --> End
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+
+### COSMOE_STORAGE 命名空间设置与环境变量
+- Wrangler 配置中定义 COSMOE_STORAGE 绑定到 KVNamespace,并提供唯一标识 ID。
+- 运行时通过环境接口 Env 暴露 COSMOE_STORAGE,供命令模块与调度模块使用。
+- .dev.vars 提供 BOT_TOKEN 等开发期变量,BOT_INFO 由 Wrangler vars 注入。
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [.dev.vars](file://.dev.vars#L1-L2)
+
+### 键值设计原则
+- 用户凭证键:以 Telegram 用户 ID 为键,值为包含 user_id、token、timestamp 的对象 JSON 字符串。
+- 会话数据键:grammY 会话键由框架生成,KVAdapter 负责读写;键名应具备唯一性且与会话上下文关联。
+- 临时数据键:例如“latestEventId”,用于调度任务去重与增量推送。
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L50-L63)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L27-L78)
+
+### 数据序列化与反序列化策略
+- 写入策略:将对象 JSON.stringify 后存入 KV,保证跨语言与跨平台兼容。
+- 读取策略:从 KV 读取字符串后 JSON.parse,若解析失败则记录错误并返回 undefined,避免影响后续流程。
+- 错误处理:捕获 KV 读写异常并记录日志,调用方根据返回值进行容错处理。
+- 格式验证:建议在写入前对对象结构进行校验(如必填字段、类型),并在读取后进行二次校验(如时间戳有效性)。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+
+### 使用场景与数据流向
+- 登录流程:用户输入凭据 -> 调用 Cosmoe API -> 成功后以 Telegram 用户 ID 为键写入凭证。
+- 会话流程:用户与 Bot 交互 -> grammY 通过 KVAdapter 读取/更新会话状态。
+- 调度流程:定时任务读取最新活动 ID -> 获取新活动 -> 遍历已注册用户 -> 推送消息 -> 更新最新活动 ID。
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L63)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L84)
+
+## 依赖关系分析
+- grammY 会话插件依赖 @grammyjs/storage-cloudflare 提供的 KVAdapter。
+- 项目依赖 @grammyjs/conversations、@grammyjs/storage-cloudflare、grammy。
+- KVNamespace 类型定义来自 worker-configuration.d.ts,包含 get/put/list/delete 等方法签名。
+
+```mermaid
+graph LR
+GRAMMY["@grammyjs/conversations"] --> ADAPTER["@grammyjs/storage-cloudflare"]
+ADAPTER --> KVNS["KVNamespace 接口"]
+APP["命令模块"] --> ADAPTER
+APP --> KVNS
+SCHED["调度模块"] --> KVNS
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1809-L1841)
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1809-L1841)
+
+## 性能考虑
+- 数据大小限制
+  - KV 单条记录上限为 25 MiB(文本/JSON),建议将大型对象拆分或压缩后存储。
+  - 对于会话状态,尽量保持精简,避免频繁写入大对象。
+- 读写最佳实践
+  - 批量读取:使用 KVNamespace.list(prefix) 获取键集合,再批量 get,减少网络往返。
+  - 缓存策略:对热点键设置合理的 cacheTtl,降低冷读延迟。
+  - 异步写入:将非关键路径的写入异步化,避免阻塞主流程。
+- 命名空间分离
+  - COSMOE_CREDENTIALS 与 COSMOE_STORAGE 分离,避免相互影响与锁竞争。
+- 调度任务优化
+  - 使用 list() 获取用户列表时注意分页游标(cursor),避免一次性拉取过多键。
+  - 对推送消息进行幂等处理,避免重复发送。
+
+[本节为通用性能建议,无需特定文件引用]
+
+## 故障排查指南
+- KV 读取失败
+  - 现象:会话状态为空或解析报错。
+  - 处理:检查 KVAdapter 的 read 流程,确认 JSON.parse 是否抛错;查看日志定位具体键。
+- KV 写入失败
+  - 现象:会话状态未持久化或出现异常。
+  - 处理:检查 KVAdapter 的 write 流程,确认 JSON.stringify 是否成功;查看日志定位异常。
+- 用户凭证缺失
+  - 现象:执行登出或需要凭证的操作时报错。
+  - 处理:确认登录流程是否成功写入;检查 Telegram 用户 ID 是否正确;必要时清理无效键。
+- 调度任务未推送
+  - 现象:新活动未通知用户。
+  - 处理:检查 COSMOE_STORAGE 中 latestEventId 是否更新;确认 COSMOE_CREDENTIALS.list() 是否返回用户键;逐个用户测试消息发送。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L34)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L84)
+
+## 结论
+本项目通过 KVAdapter 将 grammY 会话状态与 Cloudflare KV 无缝集成,结合 COSMOE_CREDENTIALS 与 COSMOE_STORAGE 的职责分离,实现了用户凭证、会话状态与临时数据的清晰分层。通过合理的键命名、JSON 序列化策略与错误处理机制,保障了功能可用性与可维护性。建议在生产环境中进一步完善数据结构校验、批量读写与缓存策略,以提升性能与稳定性。
+
+[本节为总结性内容,无需特定文件引用]
+
+## 附录
+
+### KV 命名空间与环境变量配置清单
+- Wrangler 配置
+  - COSMOE_CREDENTIALS:绑定名称与 KV ID
+  - COSMOE_STORAGE:绑定名称与 KV ID
+  - vars:BOT_INFO(Bot 元信息)
+- 开发环境变量
+  - BOT_TOKEN:Bot 访问令牌
+- 运行时环境接口
+  - Env:包含 BOT_TOKEN、BOT_INFO、COSMOE_CREDENTIALS、COSMOE_STORAGE
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L18-L30)
+- [.dev.vars](file://.dev.vars#L1-L2)
+- [src/index.ts](file://src/index.ts#L6-L11)
+
+### 关键流程时序图(调度任务)
+```mermaid
+sequenceDiagram
+participant Cron as "计划任务触发"
+participant Sched as "调度模块"
+participant KV as "COSMOE_STORAGE"
+participant Creds as "COSMOE_CREDENTIALS"
+participant API as "Cosmoe API"
+participant TG as "Telegram API"
+Cron->>Sched : 触发 scheduled
+Sched->>KV : get("latestEventId")
+Sched->>API : getEvents()
+API-->>Sched : 返回事件列表
+Sched->>Creds : list()
+Creds-->>Sched : 返回用户键集合
+loop 遍历新事件
+Sched->>TG : sendMessage(用户ID, 活动消息)
+TG-->>Sched : 发送结果
+end
+Sched->>KV : put("latestEventId", 最大新ID)
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)

+ 406 - 0
.qoder/repowiki/zh/content/数据管理/会话状态管理.md

@@ -0,0 +1,406 @@
+# 会话状态管理
+
+<cite>
+**本文引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向“会话状态管理”主题,围绕项目中基于 grammY conversations 的集成与配置展开,重点覆盖以下方面:
+- conversations 插件的安装与 KV 存储适配器的实现机制
+- 用户会话生命周期(创建、状态更新、超时与销毁)
+- 会话数据结构设计(用户上下文、对话状态、临时输入)
+- 并发控制与一致性保障(锁机制、竞态处理)
+- 调试技巧、性能监控与故障排查
+
+## 项目结构
+该项目采用按功能模块划分的组织方式,会话状态管理主要集中在命令入口与处理器层:
+- 入口与插件装配:在入口文件中初始化 Bot 并调用命令装配函数
+- 命令装配:注册 conversations 插件、KV 存储适配器、交互式对话与命令路由
+- 处理器:围绕登录、事件查询、预约、取消、历史等业务场景编写命令处理器
+- 客户端:封装外部 API 访问与认证状态管理
+
+```mermaid
+graph TB
+A["入口文件<br/>src/index.ts"] --> B["命令装配<br/>src/command/index.ts"]
+B --> C["对话与插件<br/>conversations/KVAdapter"]
+B --> D["命令处理器集合"]
+D --> D1["登录处理器<br/>src/command/handlers/login.ts"]
+D --> D2["事件列表处理器<br/>src/command/handlers/events.ts"]
+D --> D3["活动详情处理器<br/>src/command/handlers/eventDetails.ts"]
+D --> D4["预约处理器<br/>src/command/handlers/bookEvent.ts"]
+D --> D5["取消处理器<br/>src/command/handlers/cancel.ts"]
+D --> D6["历史处理器<br/>src/command/handlers/history.ts"]
+D --> D7["登出处理器<br/>src/command/handlers/logout.ts"]
+D --> E["客户端封装<br/>src/client/cosmoe.ts"]
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L76)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L274)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L76)
+
+## 核心组件
+- Bot 与插件装配
+  - 在入口文件中创建带会话风味的 Bot 实例,并在命令装配函数中安装 conversations 插件
+  - 插件通过 KV 适配器实现会话状态持久化,键空间为 COSMOE_STORAGE
+- KV 存储适配器
+  - 使用 @grammyjs/storage-cloudflare 的 KvAdapter 包装 KVNamespace
+  - 自定义读写删除接口,统一 JSON 序列化/反序列化
+- 交互式对话
+  - 定义名为 “login” 的交互式对话,使用 conversation.wait() 等待用户输入
+  - 对话结束后,状态由 KV 持久化保存
+- 命令处理器
+  - 各类命令处理器在需要时读取 KV 中的用户凭证(COSMOE_CREDENTIALS),并与外部服务交互
+  - 部分处理器在消息中携带参数,用于后续回调处理
+
+章节来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L76)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+## 架构总览
+下图展示了会话状态管理在系统中的位置与交互路径。
+
+```mermaid
+graph TB
+subgraph "运行环境"
+CF["Cloudflare Workers"]
+KV1["KV: COSMOE_CREDENTIALS"]
+KV2["KV: COSMOE_STORAGE"]
+end
+subgraph "应用层"
+Bot["Bot 实例<br/>ConversationFlavor"]
+Conv["conversations 插件"]
+KVAdp["KvAdapter"]
+Cmd["命令装配与路由"]
+Hdl["命令处理器"]
+API["CosmoeClient 封装"]
+end
+CF --> Bot
+Bot --> Conv
+Conv --> KVAdp
+KVAdp --> KV2
+Hdl --> KV1
+Hdl --> API
+Cmd --> Hdl
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L76)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 详细组件分析
+
+### conversations 插件与 KV 存储适配
+- 插件安装
+  - 在命令装配函数中安装 conversations 插件,并传入自定义 storage 对象
+- KV 存储实现
+  - 使用 KvAdapter 包装 COSMOE_STORAGE
+  - storage.read/write/delete 统一处理 JSON 字符串与对象的转换
+  - 异常捕获与日志输出,避免影响主流程
+- 交互式对话
+  - 通过 createConversation 定义对话,对话内使用 conversation.wait() 等待用户输入
+  - 进入对话后,会话状态在 KV 中持久化;退出后状态可被读取或删除
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant C as "conversations 插件"
+participant K as "KvAdapter(KV)"
+participant H as "登录处理器"
+U->>B : "/login"
+B->>C : "enter('login')"
+C->>K : "read(key)"
+K-->>C : "状态(若存在)"
+C->>H : "进入对话"
+H->>U : "提示输入用户名"
+U->>H : "发送用户名"
+H->>K : "write(key, 状态)"
+H->>U : "提示输入密码"
+U->>H : "发送密码"
+H->>K : "write(key, 最终状态)"
+H-->>U : "登录结果"
+C-->>B : "对话结束"
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L18-L74)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L76)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+### 用户会话生命周期管理
+- 创建
+  - 用户执行命令触发对话进入,插件根据 key 读取已有状态(若无则为空)
+- 状态更新
+  - 对话处理器在等待用户输入期间逐步更新状态对象,并在每次关键步骤后写回 KV
+- 超时与销毁
+  - 代码未显式设置超时参数;默认行为遵循 grammY conversations 的实现
+  - 可通过删除 KV 中对应 key 或调用插件提供的清理接口实现销毁(如需扩展)
+
+```mermaid
+flowchart TD
+S["开始: 用户触发命令"] --> E["进入对话: enter('...')"]
+E --> R["读取状态: KV.read(key)"]
+R --> W1["等待输入: conversation.wait()"]
+W1 --> U1["更新状态: 写入 KV"]
+U1 --> W2["等待输入: conversation.wait()"]
+W2 --> U2["更新状态: 写入 KV"]
+U2 --> F["完成: 返回结果"]
+F --> D{"是否需要销毁?"}
+D --> |是| DEL["删除状态: KV.delete(key)"]
+D --> |否| END["保持状态"]
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L18-L74)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L76)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+### 会话数据结构设计
+- 会话状态
+  - 由 KV 存储承载,键为会话标识;值为 JSON 对象
+  - 在交互式登录对话中,状态随用户输入逐步构建并写回
+- 用户上下文
+  - 通过 KV 命名空间 COSMOE_CREDENTIALS 存储用户的认证凭据(用户 ID、令牌、时间戳)
+  - 处理器在执行业务前读取并注入到客户端封装对象中
+- 临时输入数据
+  - 对话处理器使用 conversation.wait() 获取用户输入,作为临时状态参与流程推进
+  - 处理器在需要时将临时输入合并到会话状态或直接用于业务调用
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L76)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L65)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L32)
+
+### 并发控制与一致性保障
+- 锁机制
+  - 当前实现未显式引入分布式锁;会话状态通过 KV 的原子写入能力保证基本一致性
+- 竞态条件处理
+  - 对话处理器在关键节点(如写入 KV)前后进行条件判断与错误捕获
+  - 对于多步交互,建议在每一步写入后检查状态完整性
+- 数据一致性
+  - 会话状态与用户凭据分别存储于不同 KV 命名空间,降低耦合
+  - 对话结束后的状态读取与写入均包含异常处理,避免崩溃传播
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L69-L74)
+
+### 关键业务流程示例
+
+#### 登录流程(交互式对话)
+- 用户输入用户名与密码,对话逐步更新状态并写回 KV
+- 成功后将认证凭据写入 COSMOE_CREDENTIALS
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant C as "conversations"
+participant K as "KV(COSMOE_STORAGE)"
+participant KC as "KV(COSMOE_CREDENTIALS)"
+participant L as "登录处理器"
+U->>B : "/login"
+B->>C : "enter('login')"
+C->>K : "read(key)"
+K-->>C : "状态"
+C->>L : "进入对话"
+L->>U : "提示用户名"
+U->>L : "用户名"
+L->>K : "write(key, 状态)"
+L->>U : "提示密码"
+U->>L : "密码"
+L->>KC : "put(userId, 凭证)"
+L-->>U : "登录结果"
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L64-L66)
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L18-L74)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+#### 预约流程(带优惠券选择)
+- 处理器解析命令参数,读取用户凭据,调用客户端封装进行预约
+- 若存在多个优惠券,生成内联键盘供用户选择;选择后继续预约
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H as "预约处理器"
+participant K as "KV(COSMOE_CREDENTIALS)"
+participant C as "CosmoeClient"
+U->>B : "/book_{eventId}_{slotIndex}"
+B->>H : "handleBookEvent"
+H->>K : "get(userId)"
+K-->>H : "凭据"
+H->>C : "setCredentials"
+H->>C : "getEventDetail"
+alt 多个优惠券
+H-->>U : "内联键盘(选择优惠券)"
+U->>B : "callback : select_coupon_..."
+B->>H : "handleCouponSelection"
+H->>C : "getEventDetail"
+end
+H->>C : "bookEvent"
+C-->>H : "结果"
+H-->>U : "预约结果"
+```
+
+图表来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L160-L226)
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+
+#### 取消流程(确认回调)
+- 处理器生成确认键盘;用户点击确认后执行取消操作并返回结果
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H as "取消处理器"
+participant K as "KV(COSMOE_CREDENTIALS)"
+participant C as "CosmoeClient"
+U->>B : "/cancel_{id}"
+B->>H : "handleCancelCommand"
+H-->>U : "确认键盘"
+U->>B : "callback : confirm_cancel_{id}"
+B->>H : "handleCancelConfirmation"
+H->>K : "get(userId)"
+K-->>H : "凭据"
+H->>C : "setCredentials"
+H->>C : "cancelBooking"
+C-->>H : "结果"
+H-->>U : "取消结果"
+```
+
+图表来源
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L132)
+
+章节来源
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+
+## 依赖关系分析
+- grammY 生态
+  - @grammyjs/conversations 提供对话与状态管理能力
+  - @grammyjs/storage-cloudflare 提供 Cloudflare KV 适配
+- 运行时依赖
+  - Cloudflare Workers 运行时与 KV 命名空间绑定
+- 项目依赖
+  - 通过 package.json 指定版本,确保兼容性
+
+```mermaid
+graph LR
+P["package.json"] --> G["@grammyjs/conversations"]
+P --> S["@grammyjs/storage-cloudflare"]
+P --> M["grammy"]
+W["wrangler.jsonc"] --> N1["KV: COSMOE_CREDENTIALS"]
+W --> N2["KV: COSMOE_STORAGE"]
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 性能考量
+- KV 访问
+  - 读写 KV 会产生网络开销;建议在对话关键节点批量更新状态,减少频繁写入
+- JSON 序列化
+  - 存储与读取均进行 JSON 转换,避免存储过大的状态对象
+- 并发访问
+  - 在高并发场景下,建议对同一用户的会话 key 加入幂等写入策略或引入轻量级锁(如基于 KV 的原子操作)
+- 日志与可观测性
+  - 利用 Wrangler 的可观测性配置,结合错误捕获与告警,提升问题定位效率
+
+## 故障排查指南
+- 会话状态异常
+  - 检查 KV 命名空间绑定与权限
+  - 确认 storage.read/write/delete 的 JSON 解析与异常处理逻辑
+- 用户凭据缺失
+  - 登录后需正确写入 COSMOE_CREDENTIALS;读取前进行存在性校验
+- 外部 API 调用失败
+  - 检查客户端封装的认证状态与请求参数
+- 回调处理异常
+  - 确保回调动作解析正确,必要时增加日志输出以便追踪
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L65)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L160-L226)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L132)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 结论
+本项目通过 grammY conversations 与 Cloudflare KV 的组合,实现了可靠的会话状态管理:
+- 会话生命周期清晰,状态持久化可靠
+- 用户上下文与业务状态分离,便于维护
+- 在高并发场景下可通过 KV 原子写入与幂等策略进一步增强一致性
+- 建议在生产环境中完善超时与清理策略、增加可观测性与告警
+
+## 附录
+- 配置要点
+  - 在 wrangler.jsonc 中正确绑定 KV 命名空间
+  - 在入口与命令装配中初始化 Bot 与 conversations 插件
+- 扩展建议
+  - 引入会话超时与自动清理
+  - 对关键 KV 写入增加重试与幂等控制
+  - 为对话处理器增加单元测试与集成测试

+ 349 - 0
.qoder/repowiki/zh/content/数据管理/数据同步机制.md

@@ -0,0 +1,349 @@
+# 数据同步机制
+
+<cite>
+**本文引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 引言
+本文件系统性阐述 Cosmoe 服务端 API 的数据同步机制,覆盖以下方面:
+- 实时数据获取:通过定时任务与用户交互触发的 API 调用,实现事件与预约等数据的拉取与推送。
+- 增量更新:基于“最新事件 ID”的简单增量策略,仅推送新增活动。
+- 批量同步:在定时任务中遍历所有已注册用户并批量发送通知。
+- 冲突解决:通过 KV 存储的原子写入与幂等操作,避免重复推送与状态不一致。
+- 缓存策略:KV 的 TTL 与列表接口配合,实现轻量级缓存与失效;结合业务层的“最新事件 ID”实现增量。
+- 性能优化:并发控制(逐用户串行发送)、重试机制(外层调度器重试)、超时与错误恢复。
+- 监控与日志:Cloudflare Worker 观测性与控制台日志;异常回滚与修复建议。
+
+## 项目结构
+该项目为 Cloudflare Workers 应用,采用模块化组织:
+- 入口与调度:入口文件负责 Webhook 与计划任务;计划任务用于增量事件通知。
+- 客户端封装:统一的 Cosmoe API 客户端,封装认证、查询与变更操作。
+- 命令与会话:基于 grammY 的命令路由与 KV 会话存储。
+- KV 命名空间:分别存储用户凭证与应用状态(如最新事件 ID)。
+
+```mermaid
+graph TB
+A["入口: src/index.ts"] --> B["命令系统: src/command/index.ts"]
+A --> C["计划任务: src/scheduler/index.ts"]
+B --> D["客户端: src/client/cosmoe.ts"]
+C --> D
+B --> E["KV 会话存储<br/>COSMOE_STORAGE"]
+A --> F["KV 凭证存储<br/>COSMOE_CREDENTIALS"]
+C --> F
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L87)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 核心组件
+- CosmoeClient:封装认证、事件查询、个人资料、预约历史、优惠券、预约、改签、转让、取消等 API。
+- 命令系统:基于 grammY 的命令与回调处理,使用 KV 适配器持久化会话。
+- 计划任务:每分钟触发一次,对比“最新事件 ID”,向所有已注册用户推送新增活动。
+- KV 存储:COSMOE_CREDENTIALS 存放用户凭证;COSMOE_STORAGE 存放应用状态(如 latestEventId)。
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L87)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 架构总览
+下图展示从用户交互到服务端 API 的调用链路,以及计划任务的增量推送流程。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant Bot as "Telegram Bot"
+participant Cmd as "命令处理器"
+participant KV as "KV 存储"
+participant API as "Cosmoe API"
+participant Sch as "计划任务"
+U->>Bot : "/events" 或 "/event_<id>"
+Bot->>Cmd : 路由到对应处理器
+Cmd->>API : 查询事件/详情/历史
+API-->>Cmd : 返回数据
+Cmd-->>U : 发送消息
+U->>Bot : "/login" 进入会话
+Bot->>Cmd : 进入登录对话
+Cmd->>API : 获取令牌
+API-->>Cmd : 返回令牌
+Cmd->>KV : 写入凭证
+Sch->>API : 拉取全部事件
+API-->>Sch : 返回事件列表
+Sch->>KV : 读取 latestEventId
+Sch->>Sch : 过滤新增事件
+Sch->>Bot : 向所有已注册用户发送通知
+Bot-->>U : 推送新活动
+Sch->>KV : 更新 latestEventId
+```
+
+图表来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L26)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L60)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L106)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L87)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L321)
+
+## 详细组件分析
+
+### CosmoeClient 数据同步策略
+- 实时数据获取
+  - 事件列表与详情:通过 GET 请求获取,返回结构体包含事件元数据与时间槽。
+  - 个人资料与历史:需携带认证参数,返回用户统计与预约历史。
+- 增量更新
+  - 计划任务通过比较“最新事件 ID”实现增量推送;若无新增则不推送。
+- 批量同步
+  - 计划任务遍历 COSMOE_CREDENTIALS 中的所有键,向每个已注册用户发送通知。
+
+```mermaid
+flowchart TD
+Start(["开始"]) --> Pull["拉取全部事件"]
+Pull --> Compare["与 latestEventId 比较"]
+Compare --> HasNew{"有新增事件?"}
+HasNew --> |否| End(["结束"])
+HasNew --> |是| Iterate["遍历所有已注册用户"]
+Iterate --> Notify["逐个发送通知"]
+Notify --> Update["更新 latestEventId"]
+Update --> End
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L87)
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L87)
+
+### 认证与凭证管理
+- 登录流程:交互式会话收集用户名与密码,调用 getToken 获取 user_id 与 token,并写入 KV。
+- 凭证读取:后续命令在 KV 中读取凭证,设置到 CosmoeClient,再发起需要认证的 API 调用。
+- 幂等性:KV 写入按用户 ID 键覆盖,避免重复登录导致的数据不一致。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant Conv as "登录会话"
+participant API as "Cosmoe API"
+participant KV as "COSMOE_CREDENTIALS"
+U->>Conv : 输入用户名/密码
+Conv->>API : getToken
+API-->>Conv : 返回 user_id/token
+Conv->>KV : put(telegramUserId, 凭证JSON)
+Conv-->>U : 登录成功
+```
+
+图表来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+### 事件与预约流程
+- 事件列表:限制返回最近若干条,便于快速浏览。
+- 事件详情:排序时间槽,生成可预约链接;根据活动日期判断是否可预约。
+- 预约流程:支持优惠券选择与自动下单;失败时提示错误。
+- 取消流程:二次确认键盘,确认后调用取消接口。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant Bot as "Bot"
+participant Cmd as "命令处理器"
+participant API as "Cosmoe API"
+U->>Bot : "/event_<id>"
+Bot->>Cmd : 解析事件ID
+Cmd->>API : getEventDetail
+API-->>Cmd : 返回事件详情
+Cmd-->>U : 展示时间槽与预约链接
+U->>Bot : "/book_<event>_<slot>"
+Bot->>Cmd : 解析事件ID与槽位
+Cmd->>API : getAvailableCoupons
+API-->>Cmd : 返回可用优惠券
+Cmd->>API : bookEvent
+API-->>Cmd : 返回结果
+Cmd-->>U : 成功/失败消息
+```
+
+图表来源
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L60)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+
+章节来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+
+### 计划任务与增量推送
+- 触发频率:每分钟一次(cron 表达式)。
+- 增量逻辑:读取 COSMOE_STORAGE 中的 latestEventId,过滤大于该值的事件,逐用户推送。
+- 幂等与一致性:KV 写入保证 latestEventId 原子更新,避免重复推送。
+
+```mermaid
+flowchart TD
+Tick["计划任务触发"] --> Load["读取 latestEventId"]
+Load --> Fetch["获取全部事件"]
+Fetch --> Filter["筛选新增事件"]
+Filter --> Empty{"有新增?"}
+Empty --> |否| Done["结束"]
+Empty --> |是| ForEach["遍历已注册用户"]
+ForEach --> Send["发送通知"]
+Send --> Update["更新 latestEventId"]
+Update --> Done
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L87)
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L17)
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L17)
+
+### 冲突解决机制
+- 数据一致性检查
+  - 计划任务在推送前比较事件 ID 与存储值,仅推送新增项,避免重复。
+  - 登录成功后写入 KV,后续读取凭证进行认证,减少凭据丢失风险。
+- 冲突检测与解决
+  - KV 写入按用户键覆盖,天然具备幂等性,避免并发写入导致的覆盖问题。
+  - 事件推送采用“读-比对-写”的顺序,确保 latestEventId 单调递增。
+- 解决方案
+  - 若出现重复推送,可通过重置 latestEventId 或删除重复消息进行修复。
+  - 对于并发写入,建议在 KV 层面增加版本号或使用带条件的写入(如 CAS)以进一步增强一致性。
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L87)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L50-L65)
+
+### 缓存策略
+- 本地缓存
+  - 客户端未实现本地缓存;KV 作为应用状态与会话存储,承担轻量缓存职责。
+- 缓存失效
+  - 计划任务通过 latestEventId 控制失效窗口;用户侧未见显式 TTL 策略。
+- 缓存预热
+  - 无专门预热流程;可通过首次登录或访问事件详情触发数据拉取。
+- 缓存更新
+  - 计划任务更新 latestEventId;用户侧通过 KV 会话存储维持对话状态。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L87)
+
+### 性能优化方案
+- 并发控制
+  - 计划任务逐用户发送通知,避免并发风暴;可在用户维度引入队列或分批处理。
+- 重试机制
+  - 使用 Cloudflare Worker 的计划任务重试能力;对网络抖动导致的失败进行自动重试。
+- 超时与错误恢复
+  - API 调用应设置合理超时;对 5xx/网络错误进行指数退避重试;对 4xx 错误直接失败并记录。
+- 日志与可观测性
+  - 启用观测性开关;在关键路径输出日志(如推送成功/失败、KV 读写错误)。
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L59-L67)
+
+## 依赖关系分析
+- 组件耦合
+  - 命令处理器依赖 CosmoeClient 与 KV 存储;计划任务依赖 CosmoeClient 与 KV。
+  - KV 通过绑定名称暴露给运行时,命令系统与计划任务共享命名空间。
+- 外部依赖
+  - Cloudflare KV、grammY、@grammyjs/conversations、@grammyjs/storage-cloudflare。
+- 潜在循环依赖
+  - 当前结构清晰,无明显循环导入。
+
+```mermaid
+graph LR
+Cmd["命令系统"] --> Client["CosmoeClient"]
+Sch["计划任务"] --> Client
+Cmd --> KV["KV 存储"]
+Sch --> KV
+Client --> API["Cosmoe API"]
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L21)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L140)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1809-L1841)
+
+## 性能考虑
+- 网络调用
+  - 将认证与非认证接口分离,优先复用已认证实例;减少不必要的重复登录。
+- KV 访问
+  - 合理使用 KV 的 list/get/put;避免在热路径上进行大量小对象写入。
+- 速率限制
+  - Telegram API 对消息发送有限速,计划任务应避免在同一轮次内对同一用户多次发送。
+- 资源隔离
+  - 将 KV 与 API 调用置于独立的执行单元,降低相互影响。
+
+## 故障排查指南
+- 登录失败
+  - 检查 KV 写入是否成功;确认凭证 JSON 结构与字段类型。
+- 事件推送异常
+  - 查看 KV list 结果与发送响应;核对用户 ID 是否存在;关注控制台日志。
+- 预约失败
+  - 核对优惠券可用性与时间槽剩余容量;查看 API 返回码与消息。
+- 取消失败
+  - 确认用户凭证有效;检查预约状态是否允许取消。
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L67-L74)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L59-L67)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L137-L156)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L118-L124)
+
+## 结论
+Cosmoe 项目的同步机制以“KV + 计划任务 + 显式增量”为核心,实现了事件的准实时推送与用户侧的按需查询。通过 KV 的原子写入与命令系统的幂等设计,系统在无复杂分布式锁的情况下保持了基本的一致性。未来可在 KV 层引入更强的一致性保障(如 CAS)与更细粒度的缓存策略,以进一步提升可靠性与性能。
+
+## 附录
+- KV 接口要点
+  - 支持 get/put/list/delete;可设置 TTL 与元数据;适用于轻量级缓存与状态存储。
+- 配置要点
+  - 计划任务 cron:每分钟触发;观测性开启;KV 命名空间绑定。
+
+章节来源
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1809-L1841)
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L17)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)

+ 555 - 0
.qoder/repowiki/zh/content/数据管理/数据模型设计.md

@@ -0,0 +1,555 @@
+# 数据模型设计
+
+<cite>
+**本文档引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [项目结构](#项目结构)
+3. [核心数据实体](#核心数据实体)
+4. [架构概览](#架构概览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 引言
+
+本文件为 Cosmoe 摄影活动预约机器人项目的数据模型设计综合文档。该系统通过 Telegram 机器人与 Cosmoe API 进行交互,实现用户认证、活动查询、预约管理、优惠券使用等功能。本文档详细定义了核心数据实体(用户、活动、预约、优惠券)的结构、字段定义、关系以及数据验证规则,并提供了数据转换映射策略、版本管理与兼容性处理方案,以及数据安全考虑。
+
+## 项目结构
+
+该项目采用基于功能模块的组织方式,主要分为以下层次:
+- 入口层:负责初始化机器人、设置命令菜单、处理 Webhook 请求
+- 命令处理器层:处理各类用户命令(登录、查询活动、查看历史、预约等)
+- 客户端层:封装对 Cosmoe API 的调用,定义数据接口模型
+- 调度器层:定时任务,用于新活动通知
+- 存储层:使用 Cloudflare Workers KV 存储用户凭证和系统状态
+
+```mermaid
+graph TB
+subgraph "入口层"
+Index["src/index.ts<br/>机器人初始化与Webhook"]
+Scheduler["src/scheduler/index.ts<br/>定时任务调度"]
+end
+subgraph "命令处理器层"
+Login["src/command/handlers/login.ts<br/>登录处理"]
+Events["src/command/handlers/events.ts<br/>活动列表"]
+EventDetails["src/command/handlers/eventDetails.ts<br/>活动详情"]
+History["src/command/handlers/history.ts<br/>预约历史"]
+BookEvent["src/command/handlers/bookEvent.ts<br/>预约处理"]
+CommandIndex["src/command/index.ts<br/>命令注册与会话存储"]
+end
+subgraph "客户端层"
+CosmoeClient["src/client/cosmoe.ts<br/>Cosmoe API 客户端"]
+end
+subgraph "存储层"
+KV["Cloudflare KV<br/>COSMOE_CREDENTIALS/COSMOE_STORAGE"]
+end
+Index --> CommandIndex
+CommandIndex --> Login
+CommandIndex --> Events
+CommandIndex --> EventDetails
+CommandIndex --> History
+CommandIndex --> BookEvent
+Login --> CosmoeClient
+Events --> CosmoeClient
+EventDetails --> CosmoeClient
+History --> CosmoeClient
+BookEvent --> CosmoeClient
+CosmoeClient --> KV
+Scheduler --> CosmoeClient
+Scheduler --> KV
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L30-L76)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L30-L76)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 核心数据实体
+
+### 用户模型 (User)
+
+用户模型用于描述系统中的用户身份信息,支持认证与授权操作。
+
+- 字段定义
+  - id: 数字型用户标识符
+  - username: 用户名
+  - email: 邮箱地址
+  - user_identity: 用户身份(如 coser/photographer/other)
+  - role: 角色
+  - is_active: 是否激活(数值型布尔值)
+  - created_at: 创建时间
+
+- 关系
+  - 与预约模型存在一对多关系(一个用户可有多条预约记录)
+
+- 数据验证规则
+  - 必填字段:id、username、email、user_identity、role、is_active、created_at
+  - 数据类型:id 为数字;is_active 为数值型布尔值;created_at 为字符串格式的时间戳
+  - 范围验证:无特定范围限制
+
+- 数据转换与映射
+  - API 响应到内部模型:直接映射字段,保持原始数据结构
+  - 格式标准化:统一使用字符串表示时间戳
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L52-L60)
+
+### 活动模型 (Event)
+
+活动模型描述摄影活动的基本信息,支持活动列表展示与详情查询。
+
+- 字段定义
+  - id: 字符串型活动标识符(API 返回为字符串)
+  - name: 活动名称
+  - description: 活动描述
+  - event_date: 活动日期(字符串格式)
+  - cover_image_url: 封面图片 URL
+  - description_brief: 简短描述
+
+- 关系
+  - 与时间槽模型存在一对多关系(一个活动可有多个时间槽)
+  - 与预约模型存在一对多关系(一个活动可被多次预约)
+
+- 数据验证规则
+  - 必填字段:id、name、description、event_date、cover_image_url、description_brief
+  - 数据类型:id 为字符串;其他为字符串
+  - 范围验证:无特定范围限制
+
+- 数据转换与映射
+  - API 响应到内部模型:字段直接映射,保持原始数据结构
+  - 格式标准化:统一使用字符串表示日期和时间
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L20-L27)
+
+### 活动详情模型 (EventDetail)
+
+活动详情模型扩展了活动基本信息,包含更详细的描述和时间槽信息。
+
+- 字段定义
+  - id: 数字型活动标识符
+  - name: 活动名称
+  - description: 活动描述
+  - event_date: 活动日期(字符串格式)
+  - time_slots_with_prices: 时间槽与价格的原始字符串
+  - cover_image_url: 封面图片 URL
+  - detail_image_urls: 详情图片 URL 列表
+  - is_listed: 是否发布(数值型布尔值)
+  - login_required: 是否需要登录(数值型布尔值)
+  - allow_coupons: 是否允许使用优惠券(数值型布尔值)
+  - created_at: 创建时间
+  - slots: 时间槽数组
+  - gallery: 图片画廊 URL 数组
+
+- 关系
+  - 与时间槽模型存在一对多关系
+  - 与预约模型存在一对多关系
+
+- 数据验证规则
+  - 必填字段:id、name、description、event_date、cover_image_url、detail_image_urls、is_listed、login_required、allow_coupons、created_at、slots、gallery
+  - 数据类型:id 为数字;is_listed、login_required、allow_coupons 为数值型布尔值;slots 为数组
+  - 范围验证:无特定范围限制
+
+- 数据转换与映射
+  - API 响应到内部模型:字段直接映射,保持原始数据结构
+  - 格式标准化:统一使用字符串表示日期和时间
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L36-L50)
+
+### 时间槽模型 (TimeSlot)
+
+时间槽模型描述活动的具体时间段安排。
+
+- 字段定义
+  - range: 时间段范围(如 "13:30-14:30")
+  - price: 价格(字符串形式)
+  - capacity: 总容量
+  - remaining: 剩余座位数
+
+- 关系
+  - 与活动模型存在一对多关系
+  - 与预约模型存在一对多关系
+
+- 数据验证规则
+  - 必填字段:range、price、capacity、remaining
+  - 数据类型:range 为字符串;price 为字符串;capacity 和 remaining 为数字
+  - 范围验证:capacity 和 remaining 应为非负整数
+
+- 数据转换与映射
+  - API 响应到内部模型:字段直接映射,保持原始数据结构
+  - 格式标准化:价格统一使用字符串表示
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L29-L34)
+
+### 预约模型 (Booking)
+
+预约模型描述用户的活动预约信息。
+
+- 字段定义
+  - id: 数字型预约标识符
+  - status: 预约状态(字符串)
+  - booking_date: 预约日期(字符串格式)
+  - time_slot: 时间槽(字符串)
+  - final_price: 最终价格(字符串)
+  - payment_order_id: 支付订单号(字符串)
+  - notes_by_user: 用户备注(字符串)
+  - created_at: 创建时间(字符串)
+  - event_name: 活动名称(字符串)
+
+- 关系
+  - 与用户模型存在多对一关系
+  - 与活动模型存在多对一关系
+
+- 数据验证规则
+  - 必填字段:id、status、booking_date、time_slot、final_price、payment_order_id、notes_by_user、created_at、event_name
+  - 数据类型:id 为数字;其他为字符串
+  - 范围验证:无特定范围限制
+
+- 数据转换与映射
+  - API 响应到内部模型:字段直接映射,保持原始数据结构
+  - 格式标准化:统一使用字符串表示日期和时间
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L95-L105)
+
+### 优惠券模型 (Coupon)
+
+优惠券模型描述可用于活动预约的折扣券信息。
+
+- 字段定义
+  - id: 数字型优惠券标识符
+  - code: 优惠券代码(字符串)
+  - type: 优惠券类型(字符串,'percentage' 或 'fixed')
+  - value: 优惠券数值(数字)
+  - valid_to: 有效期截止时间(字符串格式)
+
+- 关系
+  - 与活动模型存在多对一关系
+  - 与预约模型存在多对一关系
+
+- 数据验证规则
+  - 必填字段:id、code、type、value、valid_to
+  - 数据类型:id 为数字;type 为字符串且仅限 'percentage' 或 'fixed';value 为数字;valid_to 为字符串
+  - 范围验证:type 必须为 'percentage' 或 'fixed'
+
+- 数据转换与映射
+  - API 响应到内部模型:字段直接映射,保持原始数据结构
+  - 格式标准化:统一使用字符串表示日期和时间
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L68-L74)
+
+## 架构概览
+
+系统采用分层架构,各层职责明确,耦合度低,便于维护和扩展。
+
+```mermaid
+graph TB
+subgraph "表现层"
+TelegramBot["Telegram Bot API"]
+InlineKeyboard["内联键盘"]
+end
+subgraph "应用层"
+CommandHandlers["命令处理器"]
+ConversationStorage["会话存储"]
+end
+subgraph "服务层"
+CosmoeAPIClient["Cosmoe API 客户端"]
+ValidationRules["验证规则"]
+end
+subgraph "数据层"
+KVStore["Cloudflare KV 存储"]
+APIServer["Cosmoe API 服务器"]
+end
+TelegramBot --> CommandHandlers
+CommandHandlers --> ConversationStorage
+CommandHandlers --> CosmoeAPIClient
+CosmoeAPIClient --> ValidationRules
+CosmoeAPIClient --> APIServer
+ConversationStorage --> KVStore
+KVStore --> APIServer
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L30-L76)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+## 详细组件分析
+
+### 登录流程
+
+登录流程涉及用户凭证的获取、存储和验证。
+
+```mermaid
+sequenceDiagram
+participant User as "用户"
+participant Bot as "Telegram Bot"
+participant Handler as "登录处理器"
+participant Client as "Cosmoe 客户端"
+participant KV as "KV 存储"
+participant API as "Cosmoe API"
+User->>Bot : 发送 /login 命令
+Bot->>Handler : 调用登录处理器
+Handler->>User : 请求用户名
+User->>Handler : 输入用户名
+Handler->>User : 请求密码
+User->>Handler : 输入密码
+Handler->>Client : 获取令牌
+Client->>API : POST /CreatToken.php
+API-->>Client : 返回令牌
+Client-->>Handler : 返回认证结果
+alt 认证成功
+Handler->>KV : 存储凭证
+KV-->>Handler : 存储成功
+Handler-->>User : 登录成功消息
+else 认证失败
+Handler-->>User : 登录失败消息
+end
+```
+
+**图表来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+
+### 预约流程
+
+预约流程包含活动选择、时间槽选择、优惠券使用和最终确认。
+
+```mermaid
+flowchart TD
+Start([开始预约]) --> CheckAuth["检查用户认证"]
+CheckAuth --> AuthOK{"已认证?"}
+AuthOK --> |否| PromptLogin["提示登录"]
+AuthOK --> |是| FetchEvents["获取活动列表"]
+FetchEvents --> SelectEvent["选择活动"]
+SelectEvent --> FetchDetails["获取活动详情"]
+FetchDetails --> CheckSlots{"有可用时间槽?"}
+CheckSlots --> |否| NoSlots["提示无可用时间槽"]
+CheckSlots --> |是| ShowSlots["显示时间槽"]
+ShowSlots --> SelectSlot["选择时间槽"]
+SelectSlot --> CheckCoupons{"有可用优惠券?"}
+CheckCoupons --> |否| ConfirmBooking["确认预约"]
+CheckCoupons --> |是| ShowCoupons["显示优惠券"]
+ShowCoupons --> ApplyCoupon["应用优惠券"]
+ApplyCoupon --> ConfirmBooking
+ConfirmBooking --> SubmitBooking["提交预约请求"]
+SubmitBooking --> BookingOK["预约成功"]
+NoSlots --> End([结束])
+PromptLogin --> End
+BookingOK --> End
+```
+
+**图表来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L39-L103)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L270)
+
+**章节来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L39-L103)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L270)
+
+### 数据验证与业务约束
+
+系统在多个层面实施数据验证和业务约束:
+
+- 字段完整性验证
+  - 必填字段检查:所有核心模型的关键字段都必须存在
+  - 类型验证:严格的数据类型检查,确保字段类型正确
+  - 范围验证:对数值字段进行合理的范围检查
+
+- 业务逻辑验证
+  - 时间槽容量验证:确保剩余座位数大于零
+  - 优惠券有效性验证:检查优惠券类型和有效期
+  - 用户权限验证:某些操作需要有效的认证状态
+
+- 数据转换策略
+  - API 响应标准化:统一处理不同 API 版本的数据格式
+  - 类型转换:在必要时进行类型转换以满足内部模型要求
+  - 格式规范化:统一日期和时间的表示格式
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L284-L286)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L60-L63)
+
+### 数据转换与映射策略
+
+系统实现了多种数据转换和映射策略:
+
+- API 响应到内部模型的转换
+  - 直接字段映射:大部分情况下采用一对一的字段映射
+  - 结构重组:对复杂的数据结构进行扁平化处理
+  - 类型转换:在必要时进行类型转换以满足内部要求
+
+- 数据格式标准化
+  - 日期时间格式:统一使用 ISO 8601 格式
+  - 数值格式:统一使用字符串表示货币金额
+  - 布尔值:统一使用数值型布尔值表示
+
+- 向后兼容性处理
+  - 字段类型兼容:支持字符串和数字类型的混合处理
+  - 接口版本管理:通过类型声明和注释标记版本差异
+  - 渐进式迁移:逐步更新数据结构而不影响现有功能
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L107-L111)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+
+### 数据版本管理与兼容性
+
+系统采用了多层次的版本管理和兼容性处理机制:
+
+- 接口版本控制
+  - 明确的接口版本标记:通过注释和类型声明标识 API 版本
+  - 向后兼容策略:保持旧接口的同时引入新功能
+  - 渐进式更新:分阶段更新数据结构和接口定义
+
+- 数据迁移策略
+  - 字段类型迁移:从数字类型迁移到字符串类型
+  - 结构变化处理:通过适配器模式处理结构变化
+  - 兼容性测试:确保新旧版本之间的数据兼容性
+
+- 版本演进路径
+  - 当前状态:API 返回字符串类型的活动 ID
+  - 迁移计划:逐步统一为数字类型
+  - 兼容措施:同时支持两种类型的数据
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L20-L27)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L37-L49)
+
+### 数据安全考虑
+
+系统在数据安全方面采取了多项措施:
+
+- 敏感信息保护
+  - 凭证加密存储:用户凭据存储在 KV 中,避免明文传输
+  - 密码强度验证:强制至少 6 位字符的密码长度
+  - 会话管理:通过令牌机制管理用户会话状态
+
+- 访问权限控制
+  - 认证要求:大部分操作需要有效的认证状态
+  - 权限分离:区分普通用户和管理员权限
+  - 资源访问控制:限制对敏感资源的访问
+
+- 数据传输安全
+  - HTTPS 通信:所有 API 调用使用 HTTPS 协议
+  - 参数验证:对所有输入参数进行严格的验证
+  - 错误处理:避免泄露敏感信息的错误消息
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L63)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L284-L286)
+
+## 依赖关系分析
+
+系统依赖关系清晰,各组件之间耦合度低,便于维护和扩展。
+
+```mermaid
+graph TB
+subgraph "外部依赖"
+Grammy["@grammyjs/conversations<br/>对话插件"]
+Cloudflare["@grammyjs/storage-cloudflare<br/>存储适配器"]
+WorkerRuntime["Cloudflare Workers Runtime<br/>运行时环境"]
+end
+subgraph "内部模块"
+Index["src/index.ts<br/>主入口"]
+CommandIndex["src/command/index.ts<br/>命令注册"]
+LoginHandler["src/command/handlers/login.ts<br/>登录处理器"]
+CosmoeClient["src/client/cosmoe.ts<br/>API 客户端"]
+end
+Index --> CommandIndex
+CommandIndex --> LoginHandler
+LoginHandler --> CosmoeClient
+CosmoeClient --> WorkerRuntime
+CommandIndex --> Grammy
+CommandIndex --> Cloudflare
+```
+
+**图表来源**
+- [package.json](file://package.json#L18-L22)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L30-L76)
+
+**章节来源**
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 性能考量
+
+系统在性能方面考虑了多个因素:
+
+- 异步处理
+  - 使用 Promise 和 async/await 处理异步操作
+  - 避免阻塞主线程的操作
+  - 合理的并发控制
+
+- 缓存策略
+  - KV 存储作为缓存层
+  - 会话状态的持久化存储
+  - 定时任务优化
+
+- 内存管理
+  - 及时清理不再使用的变量
+  - 合理的数据结构选择
+  - 避免内存泄漏
+
+- 网络优化
+  - 批量请求处理
+  - 错误重试机制
+  - 超时控制
+
+## 故障排除指南
+
+常见问题及解决方案:
+
+- 认证失败
+  - 检查用户名和密码是否正确
+  - 验证网络连接是否正常
+  - 查看 API 返回的错误信息
+
+- 预约失败
+  - 确认活动是否有可用时间槽
+  - 检查优惠券的有效性
+  - 验证支付订单号的正确性
+
+- 数据同步问题
+  - 检查 KV 存储的状态
+  - 验证 API 响应的完整性
+  - 查看日志中的错误信息
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L67-L69)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L34-L37)
+
+## 结论
+
+本数据模型设计文档全面阐述了 Cosmoe 摄影活动预约机器人的核心数据实体、关系结构、验证规则和转换策略。系统采用分层架构,实现了良好的模块化和可维护性。通过严格的验证规则、数据转换策略和安全措施,确保了系统的稳定性和可靠性。建议在未来版本中进一步完善数据模型的规范化和性能优化,以提升用户体验和系统效率。

+ 401 - 0
.qoder/repowiki/zh/content/数据管理/数据管理.md

@@ -0,0 +1,401 @@
+# 数据管理
+
+<cite>
+**本文引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [组件详解](#组件详解)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向 Cosmoe Bot 的数据管理系统,聚焦于 Cloudflare KV 的配置与使用、会话状态管理、数据模型设计、数据访问模式最佳实践、迁移与备份恢复策略、性能优化以及与 Cosmoe 服务端 API 的数据同步与冲突解决策略。文档基于仓库中实际代码进行分析,帮助开发者快速理解并维护该系统。
+
+## 项目结构
+- 入口与运行时:Worker 入口负责初始化 Bot、注册命令、设置 Webhook 和定时任务。
+- 命令层:通过 @grammyjs/conversations 提供交互式对话能力,使用 Cloudflare KV 作为会话存储。
+- 客户端层:封装 Cosmoe 服务端 API,统一认证、事件查询、预约、历史等接口。
+- 调度层:基于 Cron 定时任务,向已注册用户推送新活动通知,并持久化最新活动 ID。
+
+```mermaid
+graph TB
+A["入口: src/index.ts"] --> B["命令注册: src/command/index.ts"]
+B --> C["会话存储: Cloudflare KV(COSMOE_STORAGE)"]
+B --> D["命令处理器<br/>login/history/bookEvent/cancel"]
+D --> E["客户端: src/client/cosmoe.ts"]
+A --> F["调度器: src/scheduler/index.ts"]
+F --> G["KV(COSMOE_STORAGE) 最新活动ID"]
+F --> H["KV(COSMOE_CREDENTIALS) 注册用户列表"]
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L87)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 核心组件
+- Worker 入口与环境绑定
+  - 绑定 KV 命名空间:COSMOE_CREDENTIALS(用户凭证)、COSMOE_STORAGE(通用存储)。
+  - 初始化 Bot 并注册命令菜单;Webhook 回调适配 Cloudflare 运行时。
+- 会话状态管理
+  - 使用 @grammyjs/storage-cloudflare 将对话状态持久化到 COSMOE_STORAGE。
+  - 对话读写采用 JSON 序列化/反序列化。
+- Cosmoe 客户端
+  - 统一封装认证、事件、个人资料、预约、优惠券、取消等 API。
+  - 支持手动设置凭证或通过交互式登录获取并保存至 COSMOE_CREDENTIALS。
+- 调度任务
+  - 每分钟扫描新活动,向已注册用户发送通知,并更新最新活动 ID。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L87)
+
+## 架构总览
+下图展示从用户交互到服务端 API 与 KV 存储的整体流程。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot(grammy)"
+participant CMD as "命令处理器"
+participant KV as "Cloudflare KV"
+participant API as "Cosmoe API 客户端"
+participant S as "Cosmoe 服务端"
+U->>B : "/login" 或 "/events" 等命令
+B->>CMD : 分发到对应处理器
+CMD->>KV : 读取/写入会话/凭证/配置
+CMD->>API : 调用认证/查询/预约/取消等接口
+API->>S : 发起 HTTP 请求
+S-->>API : 返回 JSON 结果
+API-->>CMD : 返回业务结果
+CMD-->>B : 组织消息回复
+B-->>U : 发送消息/内联键盘
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L106)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L225)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L131)
+
+## 组件详解
+
+### Cloudflare KV 配置与使用
+- 命名空间绑定
+  - COSMOE_CREDENTIALS:存储用户凭证(Telegram 用户 ID -> 用户信息与令牌)。
+  - COSMOE_STORAGE:存储会话状态与通用配置(如最新活动 ID)。
+- 访问模式
+  - 会话存储:通过 @grammyjs/storage-cloudflare 的 KvAdapter,将对话状态以 JSON 字符串形式写入 KV。
+  - 业务数据:直接使用 env.COSMOE_CREDENTIALS.get/put 与 env.COSMOE_STORAGE.get/put。
+- 序列化与反序列化
+  - 会话读写:统一使用 JSON.stringify(JSON.parse(...))。
+  - 凭证与配置:统一使用 JSON.stringify(JSON.parse(...))。
+- 错误处理
+  - 读写异常均捕获并记录日志,避免中断对话流程。
+
+```mermaid
+flowchart TD
+Start(["进入命令"]) --> GetCreds["从 KV(COSMOE_CREDENTIALS) 获取用户凭证"]
+GetCreds --> HasCreds{"是否存在凭证?"}
+HasCreds -- 否 --> PromptLogin["提示先执行 /login"]
+HasCreds -- 是 --> UseClient["初始化 CosmoeClient 并 setCredentials"]
+UseClient --> CallAPI["调用 Cosmoe API 接口"]
+CallAPI --> UpdateKV["必要时更新 KV(COSMOE_STORAGE/COSMOE_CREDENTIALS)"]
+UpdateKV --> Reply["构造并发送回复"]
+PromptLogin --> Reply
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L63)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L13-L29)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L22-L39)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L21-L43)
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1809-L1850)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L63)
+
+### 会话状态管理
+- 设计原则
+  - 以 Telegram 用户 ID 为键,KV 中存储对话上下文对象(JSON)。
+  - 会话生命周期由 @grammyjs/conversations 控制,KV 仅作为持久化介质。
+- 创建与更新
+  - 登录对话结束后,将凭证写入 COSMOE_CREDENTIALS。
+  - 历史、预约、取消等命令在执行前读取凭证,确保认证有效。
+- 销毁
+  - 会话结束自动清理;注销命令可结合业务逻辑删除相关 KV 条目(当前实现未显式删除,建议在 logout 中扩展)。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant Conv as "对话(Conversation)"
+participant KV as "KV(COSMOE_STORAGE)"
+participant Login as "登录处理器"
+U->>Conv : 触发 /login
+Conv->>Login : 进入登录对话
+Login->>KV : 写入凭证(JSON)
+KV-->>Login : 成功
+Login-->>Conv : 登录成功
+Conv-->>U : 返回结果
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L63)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+### 数据模型设计
+- 用户信息
+  - 结构:包含用户标识、用户名、邮箱、角色、是否激活、创建时间等字段。
+  - 存储:KV(COSMOE_CREDENTIALS) 以 Telegram 用户 ID 为键,值为包含 user_id、token、timestamp 的对象。
+- 活动数据
+  - 结构:活动基本信息、描述、封面图、时间片数组等。
+  - 查询:通过 CosmoeClient.getEvents/getEventDetail 获取。
+- 预约记录
+  - 结构:包含预约 ID、状态、预约日期、时间段、最终价格、支付订单号、用户备注、创建时间、活动名称等。
+  - 查询:通过 CosmoeClient.getMyBookings 获取。
+
+```mermaid
+classDiagram
+class UserInfo {
++number id
++string username
++string email
++string user_identity
++string role
++number is_active
++string created_at
+}
+class Event {
++string id
++string name
++string description
++string event_date
++string cover_image_url
++string description_brief
+}
+class TimeSlot {
++string range
++string price
++number capacity
++number remaining
+}
+class EventDetail {
++number id
++string name
++string description
++string event_date
++string time_slots_with_prices
++string cover_image_url
++string detail_image_urls
++number is_listed
++number login_required
++number allow_coupons
++string created_at
++TimeSlot[] slots
++string[] gallery
+}
+class Booking {
++number id
++string status
++string booking_date
++string time_slot
++string final_price
++string payment_order_id
++string notes_by_user
++string created_at
++string event_name
+}
+class Credentials {
++number user_id
++string token
++number timestamp
+}
+EventDetail --> TimeSlot : "包含多个"
+Credentials <.. UserInfo : "关联用户"
+Booking <.. UserInfo : "关联用户"
+```
+
+图表来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L52-L105)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L57-L61)
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L20-L105)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L57-L61)
+
+### 数据访问模式最佳实践
+- 缓存策略
+  - 会话状态:KV 作为持久化存储,对话结束即释放;建议为高频读取的用户资料设置 TTL(当前未使用)。
+  - 通用配置:如最新活动 ID,按需读取并更新,避免频繁写入。
+- 并发控制
+  - KV 写入为原子操作;对话写入通过 @grammyjs/storage-cloudflare 的 Adapter 实现,建议避免在同一会话中并发写入。
+- 事务处理
+  - KV 不支持跨键事务;对于需要一致性的操作(如“先检查余量再下单”),可在应用层通过幂等设计与重试策略保证一致性。
+- 序列化与反序列化
+  - 统一使用 JSON.stringify/JSON.parse;对可能为 null 的值进行判空处理,避免解析异常。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L65-L74)
+
+### 数据迁移方案
+- 凭证迁移
+  - 将旧 KV 中的凭证结构转换为新的 {user_id, token, timestamp} 形式;迁移后验证登录有效性。
+- 会话迁移
+  - 若更换 KV 命名空间或键规则,需编写迁移脚本读取旧键,转换为新键并写入新命名空间。
+- 历史数据
+  - 预约历史为只读查询,无需迁移;若需导出,可按需拉取并落库到外部存储。
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L57-L61)
+
+### 备份与恢复策略
+- 备份
+  - 定期导出 KV 中的关键键集(如最新活动 ID、用户凭证键列表)。
+- 恢复
+  - 在新环境中重建 KV 命名空间后,导入备份数据;验证登录与会话功能正常。
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L26-L28)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L63)
+
+### 性能优化技巧
+- 减少 KV 读写次数:合并多次写入,批量读取常用键。
+- 合理使用 TTL:对临时数据设置 TTL,降低冷数据占用。
+- 限流与退避:对外部 API 调用增加指数退避与限流,避免触发限频。
+- 消息长度控制:历史消息过长时截断,避免 Telegram API 限制。
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L76-L78)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L94-L97)
+
+### 与 Cosmoe 服务端 API 的数据同步与冲突解决
+- 同步机制
+  - 定时任务每分钟轮询最新活动,对比本地存储的最新活动 ID,推送新增活动给已注册用户。
+  - 用户侧通过命令实时查询活动与预约,保持本地状态与服务端一致。
+- 冲突解决
+  - 预约冲突:在客户端层检查剩余容量与状态,避免重复提交;服务端返回错误时提示用户重试。
+  - 取消与变更:通过回调确认与服务端接口完成,失败时保留本地状态并提示用户重试。
+
+```mermaid
+sequenceDiagram
+participant Cron as "定时任务"
+participant KV as "KV(COSMOE_STORAGE)"
+participant API as "Cosmoe API"
+participant Users as "已注册用户"
+Cron->>KV : 读取 latestEventId
+Cron->>API : 获取所有活动
+API-->>Cron : 返回活动列表
+Cron->>KV : 更新 latestEventId(最大ID)
+loop 遍历新活动
+Cron->>Users : 发送通知
+end
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L84)
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L87)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+
+## 依赖关系分析
+- 运行时依赖
+  - @grammyjs/conversations:提供对话与会话状态管理。
+  - @grammyjs/storage-cloudflare:KV 适配器,用于会话持久化。
+  - grammy:Telegram Bot SDK。
+- 配置依赖
+  - Wrangler 将 KV 命名空间绑定到环境变量,供运行时访问。
+
+```mermaid
+graph LR
+Pkg["package.json 依赖"] --> G["@grammyjs/conversations"]
+Pkg --> GC["@grammyjs/storage-cloudflare"]
+Pkg --> GM["grammy"]
+W["wrangler.jsonc"] --> KVC["COSMOE_CREDENTIALS"]
+W --> KVS["COSMOE_STORAGE"]
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+章节来源
+- [package.json](file://package.json#L1-L24)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 性能考量
+- KV 读写延迟:尽量减少不必要的 KV 操作,合并读写。
+- API 调用频率:对频繁查询的接口增加本地缓存(如活动列表),并设置合理 TTL。
+- 并发与锁:避免同一用户并发写入 KV;必要时引入分布式锁或队列。
+- 日志与可观测性:开启 Wrangler 可观测性,监控 KV 读写与 API 调用成功率。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L13-L17)
+
+## 故障排查指南
+- 会话读写失败
+  - 检查 KV 命名空间绑定与权限;确认 JSON 解析异常(空值或格式错误)。
+- 登录失败
+  - 核对用户名/密码;检查 Cosmoe API 返回码与消息;确认凭证写入 KV 成功。
+- 预约失败
+  - 检查活动详情与时间片剩余容量;确认优惠券可用性;查看 API 返回错误。
+- 取消失败
+  - 确认预约状态允许取消;检查回调处理逻辑与 API 返回。
+- 定时任务未推送通知
+  - 检查 Cron 配置与 latestEventId 更新逻辑;确认已注册用户列表存在。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L67-L69)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L137-L156)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L117-L124)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L84)
+
+## 结论
+本系统通过 Cloudflare KV 实现会话状态与业务数据的持久化,结合 @grammyjs/conversations 与 Cosmoe API 客户端,提供了完整的用户交互与数据同步能力。建议在现有基础上进一步完善凭证与会话的生命周期管理、KV TTL 与缓存策略、以及对外部 API 的重试与限流机制,以提升稳定性与性能。
+
+## 附录
+- KV 类型与方法参考
+  - get/put/list 等方法签名与选项(如 TTL、metadata)可参考类型声明文件。
+- 部署与开发
+  - 使用 Wrangler 进行本地开发与部署;配置 Cron 触发器以启用定时任务。
+
+章节来源
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1809-L1850)
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L17)

+ 414 - 0
.qoder/repowiki/zh/content/架构设计/数据流设计.md

@@ -0,0 +1,414 @@
+# 数据流设计
+
+<cite>
+**本文引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [package.json](file://package.json)
+- [tsconfig.json](file://tsconfig.json)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+
+## 简介
+本设计文档围绕 Cosmoe Bot 的数据流进行系统性梳理,覆盖从 Telegram 用户消息进入 Cloudflare Workers,经由 grammY 框架解析与路由,到各命令处理器执行业务逻辑、调用 Cosmoe API 客户端访问外部服务,并通过 KV 存储完成状态持久化的完整链路。文档同时给出数据流向图、关键数据节点结构定义、缓存策略与一致性保障、异步处理与错误恢复机制等。
+
+## 项目结构
+该项目采用按功能模块组织的目录结构,核心入口在 Cloudflare Workers 中,使用 grammY 作为 Telegram Bot 框架,配合 @grammyjs/conversations 实现对话式交互,使用 @grammyjs/storage-cloudflare 将会话状态持久化至 KV。
+
+```mermaid
+graph TB
+subgraph "Cloudflare Workers"
+A["src/index.ts<br/>入口与webhook回调"]
+B["src/command/index.ts<br/>命令注册与会话存储"]
+C["src/scheduler/index.ts<br/>定时任务"]
+end
+subgraph "命令处理器"
+H1["start.ts"]
+H2["login.ts"]
+H3["events.ts"]
+H4["eventDetails.ts"]
+H5["bookEvent.ts"]
+H6["history.ts"]
+H7["cancel.ts"]
+H8["logout.ts"]
+end
+subgraph "外部服务"
+E["Telegram API"]
+F["Cosmoe API"]
+end
+subgraph "KV 存储"
+K1["COSMOE_CREDENTIALS<br/>用户凭证"]
+K2["COSMOE_STORAGE<br/>通用状态"]
+end
+A --> B
+A --> C
+B --> H1
+B --> H2
+B --> H3
+B --> H4
+B --> H5
+B --> H6
+B --> H7
+B --> H8
+H2 --> K1
+H6 --> K1
+H8 --> K1
+H5 --> F
+H6 --> F
+H7 --> F
+H3 --> F
+H4 --> F
+C --> F
+C --> K2
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 核心组件
+- 入口与 Webhook 回调:初始化 grammY Bot,设置命令菜单,将请求交由 Cloudflare 的 webhookCallback 处理。
+- 命令注册与会话存储:安装 conversations 插件,使用 KV 适配器实现会话状态持久化;注册各类命令与回调处理器。
+- 命令处理器:按功能拆分,包括启动引导、登录(对话式)、活动列表、活动详情、预约、历史、取消、登出等。
+- Cosmoe API 客户端:封装认证、事件查询、个人资料、预约、取消、修改等 API 调用。
+- 定时任务:周期性扫描新活动并向已注册用户推送通知。
+- KV 存储:COSMOE_CREDENTIALS 保存用户凭证;COSMOE_STORAGE 保存通用状态(如最新活动 ID)。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 架构总览
+下图展示从 Telegram 到 Cloudflare Workers、grammY、命令处理器、Cosmoe API 客户端以及 KV 存储的整体数据流。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant T as "Telegram API"
+participant W as "Cloudflare Workers<br/>src/index.ts"
+participant G as "grammY 框架"
+participant CMD as "命令处理器<br/>src/command/handlers/*"
+participant KV as "KV 存储<br/>COSMOE_CREDENTIALS/COSMOE_STORAGE"
+participant API as "Cosmoe API"
+U->>T : "发送消息/命令"
+T-->>W : "HTTP 请求"
+W->>G : "webhookCallback 分发"
+G->>CMD : "匹配命令/回调并执行"
+CMD->>KV : "读取/写入用户凭证/状态"
+CMD->>API : "调用 Cosmoe API"
+API-->>CMD : "返回业务数据"
+CMD-->>G : "构造响应"
+G-->>W : "生成 Telegram 响应"
+W-->>T : "回传消息"
+T-->>U : "显示结果"
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 详细组件分析
+
+### 命令注册与会话存储(KV)
+- 会话存储:通过 @grammyjs/storage-cloudflare 的 KvAdapter 将会话状态序列化为 JSON 并写入 COSMOE_STORAGE。
+- 登录对话:使用 createConversation 定义交互式登录流程,完成后将用户凭证写入 COSMOE_CREDENTIALS。
+- 命令路由:注册 /start、/login、/events、/event_{id}、/book_{event}_{slot}、/history、/cancel_{id}、回调等。
+
+```mermaid
+flowchart TD
+Start(["进入 setupCommands"]) --> KV["创建 KV 适配器<br/>绑定 COSMOE_STORAGE"]
+KV --> Conv["安装 conversations 插件<br/>指定 storage=KV"]
+Conv --> Login["注册 /login 对话<br/>enter('login')"]
+Login --> ReadCreds["读取用户凭证<br/>COSMOE_CREDENTIALS"]
+ReadCreds --> ExecCmd["执行命令处理器"]
+ExecCmd --> WriteKV["写入 KV 状态/凭证"]
+WriteKV --> End(["完成"])
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+
+### 登录流程(对话式)
+- 用户输入用户名/密码,调用 CosmoeClient.getToken 获取 token。
+- 将 user_id、token、timestamp 写入 COSMOE_CREDENTIALS,键为 Telegram 用户 ID。
+- 异常处理:输入缺失、认证失败、KV 写入异常均进行友好提示与日志记录。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant CMD as "handleInteractiveLogin"
+participant KV as "COSMOE_CREDENTIALS"
+participant API as "CosmoeClient.getToken"
+U->>CMD : "/login 进入对话"
+CMD->>U : "提示输入用户名"
+U-->>CMD : "用户名"
+CMD->>U : "提示输入密码"
+U-->>CMD : "密码"
+CMD->>API : "getToken(username,password)"
+API-->>CMD : "返回 {user_id,token}"
+CMD->>KV : "put(telegramUserId, JSON)"
+CMD-->>U : "登录成功提示"
+```
+
+图表来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+### 活动列表与详情
+- /events:调用 getEvents 获取最新活动列表,拼接 Markdown 链接供用户点击 /event_{id}。
+- /event_{id}:调用 getEventDetail 获取活动详情,渲染时间段、价格、剩余容量,并对可预约时间段提供 /book_{event}_{slot} 链接。
+
+```mermaid
+flowchart TD
+A["/events"] --> B["CosmoeClient.getEvents"]
+B --> C["筛选最新N条"]
+C --> D["拼装 Markdown 列表"]
+D --> E["发送消息"]
+F["/event_{id}"] --> G["CosmoeClient.getEventDetail"]
+G --> H["排序时间槽"]
+H --> I{"是否可预约"}
+I --> |是| J["生成 /book_{event}_{slot} 链接"]
+I --> |否| K["仅展示信息"]
+```
+
+图表来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L200)
+
+章节来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L200)
+
+### 预约流程(含优惠券选择)
+- 解析 /book_{event}_{slot},校验用户登录态,获取活动详情与时间槽。
+- 若存在多个可用优惠券,弹出内联键盘让用户选择;单个则自动使用。
+- 调用 bookEvent 提交预约,返回最终价格、预约编号等信息。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant CMD as "handleBookEvent"
+participant KV as "COSMOE_CREDENTIALS"
+participant API as "CosmoeClient"
+participant CB as "handleCouponSelection"
+U->>CMD : "/book_{event}_{slot}"
+CMD->>KV : "读取凭证"
+CMD->>API : "getEventDetail(eventId)"
+CMD->>API : "getAvailableCoupons(eventId)"
+alt 多个优惠券
+CMD-->>U : "显示内联键盘选择"
+U->>CB : "回调 : select_coupon_{...}"
+CB->>API : "bookEvent(带coupon)"
+else 单个/无优惠券
+CMD->>API : "bookEvent(直接提交)"
+end
+API-->>CMD : "返回预约结果"
+CMD-->>U : "发送成功/失败消息"
+```
+
+图表来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L270)
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L270)
+
+### 历史与取消
+- /history:读取用户凭证,调用 getMyBookings 获取预约历史,格式化 Markdown 并附带可取消链接。
+- /cancel_{id}:弹出确认内联键盘,确认后调用 cancelBooking 执行取消。
+
+```mermaid
+flowchart TD
+H1["/history"] --> H2["读取凭证"]
+H2 --> H3["CosmoeClient.getMyBookings"]
+H3 --> H4["格式化 Markdown"]
+H4 --> H5["发送消息"]
+C1["/cancel_{id}"] --> C2["读取凭证"]
+C2 --> C3["获取预约详情"]
+C3 --> C4["内联键盘确认"]
+C4 --> C5["cancelBooking"]
+C5 --> C6["编辑消息反馈结果"]
+```
+
+图表来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L226-L239)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+章节来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L226-L239)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+### 定时任务与通知
+- 触发频率:每分钟一次(*/1 * * * *)。
+- 逻辑:读取 COSMOE_STORAGE 中的 latestEventId,拉取全部活动,过滤新增活动,遍历 COSMOE_CREDENTIALS 中的用户键,逐个发送通知,并更新 latestEventId。
+
+```mermaid
+flowchart TD
+S["scheduled 触发"] --> L["读取 latestEventId"]
+L --> E["CosmoeClient.getEvents"]
+E --> F["过滤新活动"]
+F --> K["遍历已注册用户键"]
+K --> N["bot.api.sendMessage"]
+N --> U["更新 latestEventId"]
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+
+### 关键数据节点结构定义
+- 通用响应结构
+  - 字段:code、msg、data
+  - 用途:统一承载 API 返回状态与数据
+- 认证响应
+  - 字段:user_id、token
+  - 用途:登录成功后返回,后续请求需携带
+- 事件与活动详情
+  - 字段:id、name、description、event_date、cover_image_url、slots、gallery 等
+  - 用途:活动列表与详情展示
+- 时间槽
+  - 字段:range、price、capacity、remaining
+  - 用途:展示时间段、价格与剩余容量
+- 用户资料与统计
+  - 字段:user_info、statistics
+  - 用途:个人中心与历史记录
+- 预约
+  - 字段:id、status、booking_date、time_slot、final_price、notes_by_user、event_name 等
+  - 用途:历史记录与取消操作
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L9-L105)
+
+### 缓存策略与一致性
+- KV 会话存储:使用 @grammyjs/storage-cloudflare 的 KvAdapter 将会话状态持久化至 COSMOE_STORAGE,确保多实例间会话一致性。
+- 用户凭证:COSMOE_CREDENTIALS 以 Telegram 用户 ID 为键,存储 user_id、token、timestamp,便于命令处理器快速读取与鉴权。
+- 通用状态:COSMOE_STORAGE 用于保存 latestEventId 等全局状态,避免重复推送。
+- 一致性保障:KV 写入在登录、历史查询、取消等关键路径均有错误捕获与日志输出,保证异常可追踪;会话读写封装在 KV 适配器中,避免直接 KV 操作分散。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L63)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L26-L78)
+
+### 异步处理与错误恢复
+- 异步模型:grammY 与 Cloudflare Workers 均基于事件循环与 Promise,命令处理器与 API 调用均为异步。
+- 错误恢复:
+  - 命令处理器内部 try/catch 包裹,出现异常时向用户发送“稍后重试”提示并记录日志。
+  - KV 读写封装在会话存储中,异常时打印错误并继续执行,避免中断对话流程。
+  - 定时任务对每个用户的发送单独 try/catch,失败不影响其他用户的通知。
+- 超时与可观测性:Wrangler 启用 observability,便于监控与排障。
+
+章节来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L23-L26)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L103-L106)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L117)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L65-L67)
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+
+## 依赖关系分析
+- grammY 生态:grammy、@grammyjs/conversations、@grammyjs/storage-cloudflare。
+- 运行时类型:通过 wrangler types 生成的 worker-configuration.d.ts 提供环境变量与运行时类型声明。
+- 构建与脚本:使用 TypeScript 与 Vitest,部署与开发通过 Wrangler CLI。
+
+```mermaid
+graph LR
+P["package.json 依赖"] --> G["grammy"]
+P --> C["conversations"]
+P --> S["storage-cloudflare"]
+W["wrangler.jsonc 配置"] --> T["worker-configuration.d.ts 类型"]
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10849)
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10849)
+
+## 性能考量
+- 会话存储:KV 读写为网络 IO,建议减少不必要的频繁写入;对话结束后及时清理临时状态。
+- API 调用:批量获取活动与用户历史时注意分页与限流,避免超时。
+- Markdown 渲染:历史消息长度限制在 4000 字符以内,防止 Telegram API 报错。
+- 定时任务:每分钟触发一次,注意控制通知数量与并发发送,避免触发速率限制。
+
+## 故障排查指南
+- 登录失败:检查用户名/密码是否正确,确认 CosmoeClient.getToken 返回 code=200;查看 KV 写入是否成功。
+- 无凭证或凭证失效:确认 /login 是否执行成功,COSMOE_CREDENTIALS 中是否存在对应键;必要时执行 /logout 清理后重新登录。
+- 预约失败:核对时间槽剩余容量,确认优惠券有效性;查看 bookEvent 返回的 msg 信息。
+- 历史为空:确认用户是否有历史记录,或是否超过筛选条数上限。
+- 定时通知未送达:检查 COSMOE_STORAGE 中 latestEventId 是否更新,确认 COSMOE_CREDENTIALS 中用户键是否有效;查看定时任务日志。
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L67-L73)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L34-L37)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L137-L156)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L59-L64)
+
+## 结论
+该系统通过 grammY 与 Cloudflare Workers 实现高可用的 Telegram Bot 数据流:用户消息经由 webhook 进入 Worker,命令处理器负责业务编排,Cosmoe API 客户端承担外部数据交互,KV 存储贯穿凭证与会话状态管理。整体具备清晰的模块边界、完善的错误处理与可观测性配置,适合在生产环境中稳定运行与扩展。

+ 335 - 0
.qoder/repowiki/zh/content/架构设计/整体架构.md

@@ -0,0 +1,335 @@
+# 整体架构
+
+<cite>
+**本文引用的文件**
+- [package.json](file://package.json)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+- [tsconfig.json](file://tsconfig.json)
+- [test/index.spec.ts](file://test/index.spec.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能与成本考量](#性能与成本考量)
+8. [可扩展性与容错设计](#可扩展性与容错设计)
+9. [监控与可观测性](#监控与可观测性)
+10. [故障排查指南](#故障排查指南)
+11. [结论](#结论)
+
+## 简介
+本项目为基于 Cloudflare Workers 的 Telegram 机器人,采用三层架构:
+- Webhook 接收层:通过 Cloudflare Workers 的 fetch 事件接收 Telegram Webhook 请求,并交由 grammy 框架处理。
+- 业务逻辑层:grammy 框架承载命令路由、对话(conversations)状态管理、回调查询处理等;结合 KV 存储实现对话状态持久化。
+- 数据访问层:使用 Cloudflare KV 命名空间存储用户凭证与会话状态;同时通过定时触发器执行周期性任务(如新活动通知)。
+
+架构决策要点:
+- 运行时:选择 Cloudflare Workers 作为无服务器运行时,具备全球边缘节点、低延迟、按需计费与自动扩缩容能力。
+- 框架:grammy 提供简洁的 Telegram Bot API 封装、插件生态(如 conversations),便于快速构建复杂交互。
+- 数据层:KV 命名空间满足轻量级键值存储需求,配合 @grammyjs/storage-cloudflare 实现对话状态持久化。
+- 可观测性:启用 Wrangler 观测性开关,结合日志与错误处理实现基础监控。
+
+## 项目结构
+项目采用按功能模块划分的目录组织方式,核心入口位于 src/index.ts,命令处理集中在 src/command,定时任务在 src/scheduler,对外 API 客户端封装在 src/client。
+
+```mermaid
+graph TB
+subgraph "运行时与配置"
+WR["wrangler.jsonc"]
+PKG["package.json"]
+TS["tsconfig.json"]
+WCFG["worker-configuration.d.ts"]
+end
+subgraph "应用入口"
+IDX["src/index.ts"]
+end
+subgraph "业务逻辑层"
+CMD["src/command/index.ts"]
+HANDLERS["src/command/handlers/*.ts"]
+end
+subgraph "数据访问层"
+SCHED["src/scheduler/index.ts"]
+CLIENT["src/client/cosmoe.ts"]
+KV1["KV: COSMOE_CREDENTIALS"]
+KV2["KV: COSMOE_STORAGE"]
+end
+subgraph "测试"
+TEST["test/index.spec.ts"]
+end
+WR --> IDX
+PKG --> IDX
+TS --> IDX
+WCFG --> IDX
+IDX --> CMD
+CMD --> HANDLERS
+CMD --> KV2
+SCHED --> KV1
+SCHED --> KV2
+SCHED --> CLIENT
+HANDLERS --> CLIENT
+```
+
+**图表来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L1-L24)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10849)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L1-L24)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10849)
+
+## 核心组件
+- 入口与运行时适配:src/index.ts 作为 Cloudflare Worker 入口,初始化 Bot、设置命令菜单、挂载 webhook 回调,并注册定时任务处理器。
+- 命令与对话系统:src/command/index.ts 注册命令路由、回调查询、对话(conversations)以及基于 KV 的会话存储。
+- 外部 API 客户端:src/client/cosmoe.ts 封装对第三方摄影平台 API 的调用,统一响应结构与认证流程。
+- 定时任务:src/scheduler/index.ts 通过 Cloudflare Cron 触发器定期拉取新活动并向已注册用户推送通知。
+- 配置与类型:wrangler.jsonc 定义 Worker 名称、入口、KV 绑定、定时触发器与变量;tsconfig.json 与 worker-configuration.d.ts 提供类型支持。
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10849)
+
+## 架构总览
+整体架构以 Cloudflare Workers 为核心运行时,通过 webhook 接收 Telegram 请求,grammy 负责路由与状态管理,KV 提供会话与用户凭证存储,定时触发器负责后台任务。
+
+```mermaid
+graph TB
+TG["Telegram 用户"] --> WEBHOOK["Cloudflare Workers<br/>fetch 事件"]
+WEBHOOK --> BOT["grammy Bot"]
+BOT --> CMDS["命令与回调处理"]
+CMDS --> CONV["conversations 插件"]
+CONV --> KVSTORE["KV: COSMOE_STORAGE"]
+BOT --> API["Telegram API"]
+SCHED["Cron 触发器"] --> SCHEDTASK["定时任务处理器"]
+SCHEDTASK --> KVREG["KV: COSMOE_CREDENTIALS"]
+SCHEDTASK --> API
+SCHEDTASK --> CLIENT["CosmoeClient"]
+subgraph "KV 命名空间"
+KVREG
+KVSTORE
+end
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 详细组件分析
+
+### Webhook 接收层(HTTP 请求处理)
+- 入口函数:src/index.ts 中导出的默认对象包含 fetch 与 scheduled 方法,分别处理 HTTP 请求与定时任务。
+- 初始化 Bot:从环境变量读取 BOT_INFO 与 BOT_TOKEN,构造 Bot 实例。
+- 命令菜单:首次部署时设置可用命令列表,便于用户发现。
+- Webhook 回调:通过 webhookCallback(bot, "cloudflare-mod") 将请求交由 grammy 处理,返回响应。
+
+```mermaid
+sequenceDiagram
+participant TG as "Telegram"
+participant CF as "Cloudflare Workers"
+participant BOT as "grammy Bot"
+participant CMD as "命令处理器"
+participant KV as "KV 存储"
+TG->>CF : "POST /webhook"
+CF->>BOT : "webhookCallback(...)"
+BOT->>CMD : "匹配命令/回调"
+CMD->>KV : "读写会话/凭证"
+CMD-->>TG : "发送消息/内联键盘"
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L14-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+
+### 业务逻辑层(grammy 框架与命令处理器)
+- 对话(conversations):通过 @grammyjs/conversations 与 @grammyjs/storage-cloudflare 实现跨请求的状态持久化,KV 适配器负责序列化/反序列化。
+- 命令路由:注册 /start、/login、/events、/event_{id}、/book_{event_id}_{slot_id}、/history、/cancel_{booking_id} 等命令与回调查询。
+- 登录流程:交互式对话收集用户名/密码,调用 CosmoeClient 获取 token 并存入 KV,绑定 Telegram 用户 ID。
+- 事件与预约:调用 CosmoeClient 获取活动列表与详情,支持优惠券选择与取消确认等交互。
+
+```mermaid
+flowchart TD
+Start(["进入 /login"]) --> AskUser["提示输入用户名"]
+AskUser --> WaitUser["等待用户回复"]
+WaitUser --> AskPass["提示输入密码"]
+AskPass --> WaitPass["等待用户回复"]
+WaitPass --> CallAPI["调用 getToken 获取 token"]
+CallAPI --> SaveKV["以 Telegram 用户ID 为键保存凭证到 KV"]
+SaveKV --> Done(["完成登录"])
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L54-L75)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+
+**章节来源**
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+
+### 数据访问层(KV 存储)
+- KV 命名空间:
+  - COSMOE_CREDENTIALS:存储已登录用户的凭证(user_id、token、timestamp),键为 Telegram 用户 ID。
+  - COSMOE_STORAGE:存储会话状态与系统状态(如 latestEventId)。
+- 会话存储:通过 KV 适配器实现 conversations 的 read/write/delete,确保多实例间状态一致。
+- 定时任务:从 COSMOE_STORAGE 读取 latestEventId,对比新活动列表,向所有已注册用户发送通知后更新最新 ID。
+
+```mermaid
+flowchart TD
+Tick(["Cron 触发"]) --> LoadLast["从 COSMOE_STORAGE 读取 latestEventId"]
+LoadLast --> Fetch["调用 CosmoeClient.getEvents()"]
+Fetch --> Filter["筛选大于 latestEventId 的新活动"]
+Filter --> ListUsers["从 COSMOE_CREDENTIALS 列出所有用户键"]
+ListUsers --> Notify["逐用户发送通知消息"]
+Notify --> Update["更新 COSMOE_STORAGE 中的 latestEventId"]
+Update --> End(["结束"])
+```
+
+**图表来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+### 外部 API 客户端(CosmoeClient)
+- 统一响应结构:定义 ApiResponse<T>,便于统一处理 code/msg/data。
+- 认证与令牌:getToken 获取 user_id 与 token,setCredentials/getCredentials 支持手动设置与读取。
+- 业务接口:提供 getEvents、getEventDetail、getProfile、getMyBookings、bookEvent、cancelBooking 等方法,参数与返回值均遵循 API 文档约定。
+- 错误处理:未认证时抛出异常,便于上层统一处理。
+
+```mermaid
+classDiagram
+class CosmoeClient {
++getToken(username, password) ApiResponse<TokenResponse>
++setCredentials(userId, token) void
++getCredentials() {userId, token} | null
++isAuthenticated() boolean
++getEvents() ApiResponse<Event[]>
++getEventDetail(eventId) ApiResponse<EventDetail>
++getProfile() ApiResponse<ProfileData>
++getMyBookings() ApiResponse<Booking[]>
++bookEvent(req) ApiResponse<any>
++cancelBooking(bookingId) ApiResponse<any>
+}
+```
+
+**图表来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+## 依赖关系分析
+- 运行时与工具链:依赖 Wrangler 作为部署与开发工具,@cloudflare/vitest-pool-workers 提供 Workers 测试环境。
+- 框架与插件:grammy 提供核心 Bot 能力;@grammyjs/conversations 提供对话状态管理;@grammyjs/storage-cloudflare 提供 KV 存储适配。
+- 类型与配置:tsconfig.json 指定目标与模块解析策略;worker-configuration.d.ts 提供 Cloudflare 运行时类型声明。
+
+```mermaid
+graph LR
+PKG["package.json"] --> GRAMMY["grammy"]
+PKG --> CONVS["@grammyjs/conversations"]
+PKG --> KVADAPTER["@grammyjs/storage-cloudflare"]
+PKG --> WRANGLER["wrangler"]
+PKG --> VITEST["@cloudflare/vitest-pool-workers"]
+WR["wrangler.jsonc"] --> ENV["环境变量/KV 绑定"]
+TS["tsconfig.json"] --> TYPES["类型声明"]
+WCFG["worker-configuration.d.ts"] --> TYPES
+```
+
+**图表来源**
+- [package.json](file://package.json#L12-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L18-L30)
+- [tsconfig.json](file://tsconfig.json#L39-L41)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10849)
+
+**章节来源**
+- [package.json](file://package.json#L1-L24)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10849)
+
+## 性能与成本考量
+- 无服务器优势:Cloudflare Workers 具备全球边缘节点与按请求计费模式,适合突发流量与低延迟场景。
+- KV 成本:KV 读写次数与存储容量影响成本,建议合理设计键命名与数据结构,避免频繁小对象写入。
+- API 调用:外部 API 调用存在网络开销,建议在客户端层进行必要的缓存与去抖(可在后续扩展中引入)。
+- 扩展性:grammy 插件生态与 KV 存储天然支持水平扩展,无需维护数据库连接池或主从复制。
+
+[本节为通用性能讨论,不直接分析具体文件]
+
+## 可扩展性与容错设计
+- 可扩展性:
+  - 命令与处理器模块化,新增命令只需在 command/index.ts 中注册路由与处理器。
+  - KV 命名空间可按功能拆分,如将会话与用户凭证分离,提升隔离度。
+  - 定时任务可按业务拆分为多个 cron 表达式,降低单任务负载。
+- 容错机制:
+  - 命令与定时任务均包含 try/catch 与错误日志输出,便于定位问题。
+  - KV 读写失败时记录错误并继续执行,避免单点故障导致整体失败。
+  - 对外 API 调用失败时返回友好提示,避免崩溃。
+
+**章节来源**
+- [src/command/index.ts](file://src/command/index.ts#L26-L48)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L83)
+
+## 监控与可观测性
+- 观测性开关:wrangler.jsonc 启用 observability,便于在 Cloudflare 控制台查看日志与追踪。
+- 日志:命令与定时任务中广泛使用 console.log/error,便于排查问题。
+- 测试:使用 @cloudflare/vitest-pool-workers 提供 Workers 测试环境,支持单元与集成测试。
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+
+## 故障排查指南
+- Webhook 不生效:
+  - 检查 wrangler.jsonc 中的 main 与 name 是否正确。
+  - 确认部署后是否设置了正确的 Telegram Webhook。
+- 命令无响应:
+  - 查看控制台日志,确认命令是否被正确注册与路由。
+  - 检查 KV 命名空间绑定是否正确。
+- 登录失败:
+  - 确认外部 API 返回码与消息,检查用户名/密码是否正确。
+  - 检查 KV 写入是否成功。
+- 定时任务未执行:
+  - 检查 cron 表达式与触发器配置。
+  - 查看控制台日志,确认任务是否被调度。
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L17)
+- [src/index.ts](file://src/index.ts#L37-L45)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L47-L73)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L18-L87)
+
+## 结论
+本项目以 Cloudflare Workers 为基础,结合 grammy 框架与 KV 存储,实现了高可用、低延迟且易于扩展的 Telegram 机器人。通过清晰的三层架构与完善的错误处理,系统能够在无服务器环境下稳定运行,并为后续功能扩展(如队列、Durable Objects 或更复杂的缓存策略)预留空间。

+ 405 - 0
.qoder/repowiki/zh/content/架构设计/架构设计.md

@@ -0,0 +1,405 @@
+# 架构设计
+
+<cite>
+**本文档中引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [package.json](file://package.json)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概览](#架构概览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+
+Cosmoe Bot 是一个基于 Cloudflare Workers 的无服务器 Telegram 机器人,专门为摄影活动预约管理而设计。该系统采用现代化的无服务器架构,利用 grammY 框架构建,实现了完整的用户交互、事件管理和预约处理功能。
+
+本架构文档详细阐述了系统的整体设计思路、核心组件交互关系、数据流设计以及性能优化策略,为开发者提供了全面的技术参考。
+
+## 项目结构
+
+Cosmoe Bot 采用模块化的项目组织结构,按照功能域进行清晰的分离:
+
+```mermaid
+graph TB
+subgraph "核心入口层"
+Index[src/index.ts<br/>主入口模块]
+end
+subgraph "业务逻辑层"
+Command[command/index.ts<br/>命令处理器系统]
+Handlers[handlers/<br/>业务处理器]
+end
+subgraph "调度服务层"
+Scheduler[scheduler/index.ts<br/>定时任务调度器]
+end
+subgraph "外部集成层"
+Client[client/cosmoe.ts<br/>Cosmoe API 客户端]
+KV[KV 存储<br/>COSMOE_CREDENTIALS/COSMOE_STORAGE]
+end
+subgraph "配置层"
+Package[package.json<br/>依赖配置]
+Wrangler[wrangler.jsonc<br/>部署配置]
+end
+Index --> Command
+Index --> Scheduler
+Command --> Handlers
+Command --> Client
+Scheduler --> Client
+Command --> KV
+Scheduler --> KV
+Client --> KV
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 核心组件
+
+### 主入口模块 (src/index.ts)
+
+主入口模块是整个系统的协调中心,负责初始化 grammY Bot 实例、设置命令菜单和处理 Webhook 请求。
+
+**核心职责:**
+- 初始化 Bot 实例并配置 Conversation 插件
+- 设置全局命令菜单
+- 处理 HTTP 请求和 Webhook 回调
+- 协调定时任务执行
+
+**技术特点:**
+- 使用 Cloudflare Workers 的 webhookCallback 适配器
+- 支持并发请求处理
+- 集成环境变量配置管理
+
+### 命令处理器系统 (src/command/index.ts)
+
+命令处理器系统是业务逻辑的核心,基于 grammY 框架构建,实现了完整的对话式交互和命令路由。
+
+**核心特性:**
+- 基于 @grammyjs/conversations 的对话式交互
+- KV 存储集成的会话状态管理
+- 模块化的命令处理器架构
+- 支持正则表达式匹配的动态命令
+
+**章节来源**
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+### 调度器 (src/scheduler/index.ts)
+
+调度器专门处理定时任务,实现了新活动通知推送功能。
+
+**主要功能:**
+- 周期性检查新活动发布
+- 向注册用户发送活动通知
+- 基于 KV 存储的状态跟踪
+- 异步消息发送和错误处理
+
+**章节来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 架构概览
+
+Cosmoe Bot 采用三层架构设计,确保了良好的可维护性和扩展性:
+
+```mermaid
+graph TB
+subgraph "表示层"
+Telegram[Telegram 应用程序]
+Webhook[Webhook 回调]
+end
+subgraph "应用层"
+Main[主入口模块<br/>src/index.ts]
+Commands[命令处理器<br/>command/index.ts]
+Scheduler[调度器<br/>scheduler/index.ts]
+end
+subgraph "服务层"
+Grammy[grammY 框架]
+Conversations[对话插件]
+Storage[存储适配器]
+end
+subgraph "数据层"
+KV1[COSMOE_CREDENTIALS<br/>用户凭证存储]
+KV2[COSMOE_STORAGE<br/>系统状态存储]
+API[Cosmoe API<br/>外部服务]
+end
+Telegram --> Webhook
+Webhook --> Main
+Main --> Commands
+Main --> Scheduler
+Commands --> Grammy
+Commands --> Conversations
+Commands --> Storage
+Scheduler --> Grammy
+Storage --> KV1
+Storage --> KV2
+Commands --> API
+Scheduler --> API
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L17)
+
+## 详细组件分析
+
+### 主入口模块架构
+
+主入口模块采用了工厂模式和依赖注入的设计模式:
+
+```mermaid
+classDiagram
+class MainEntry {
++Env env
++ExecutionContext ctx
++fetch(request, env, ctx) Promise~Response~
++scheduled(controller, env, ctx) Promise~void~
+}
+class BotConfig {
++string BOT_TOKEN
++JSON BOT_INFO
++KVNamespace COSMOE_CREDENTIALS
++KVNamespace COSMOE_STORAGE
+}
+class WebhookHandler {
++webhookCallback(bot, adapter) Function
++handleRequest(request) Promise~Response~
+}
+MainEntry --> BotConfig : "使用"
+MainEntry --> WebhookHandler : "委托"
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L6-L46)
+
+### 命令处理器系统架构
+
+命令处理器系统实现了插件化的架构设计,支持动态加载和卸载:
+
+```mermaid
+classDiagram
+class CommandSystem {
++setupCommands(bot, env) void
++installConversations() void
++registerHandlers() void
+}
+class ConversationPlugin {
++VersionedStateStorage storage
++createConversation(handler, name) Conversation
++enter(conversationName) Promise~void~
+}
+class CommandHandlers {
++handleStartCommand(ctx) Promise~void~
++handleLoginCommand(ctx) Promise~void~
++handleEventsCommand(ctx) Promise~void~
++handleHistoryCommand(ctx, env) Promise~void~
++handleCancelCommand(ctx, env) Promise~void~
+}
+CommandSystem --> ConversationPlugin : "使用"
+CommandSystem --> CommandHandlers : "注册"
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+### 数据流设计
+
+系统采用事件驱动的数据流架构,实现了清晰的职责分离:
+
+```mermaid
+sequenceDiagram
+participant User as 用户
+participant Telegram as Telegram
+participant Main as 主入口
+participant Command as 命令处理器
+participant Client as Cosmoe 客户端
+participant KV as KV 存储
+participant API as 外部 API
+User->>Telegram : 发送消息
+Telegram->>Main : Webhook 请求
+Main->>Command : 路由到处理器
+Command->>Client : 执行业务逻辑
+Client->>KV : 读取/写入状态
+Client->>API : 调用外部服务
+API-->>Client : 返回数据
+Client-->>Command : 处理结果
+Command-->>Main : 组装响应
+Main-->>Telegram : 发送回复
+Telegram-->>User : 显示结果
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L14-L35)
+- [src/command/index.ts](file://src/command/index.ts#L59-L61)
+
+### KV 存储策略
+
+系统采用双 KV 命名空间的设计,实现了数据的逻辑分离:
+
+```mermaid
+graph LR
+subgraph "用户数据层"
+Credentials[COSMOE_CREDENTIALS<br/>用户凭证<br/>用户ID -> 凭证信息]
+end
+subgraph "系统数据层"
+Storage[COSMOE_STORAGE<br/>系统状态<br/>latestEventId -> 最新活动ID]
+end
+subgraph "业务逻辑"
+Login[登录处理]
+Schedule[定时任务]
+Events[活动查询]
+end
+Login --> Credentials
+Schedule --> Storage
+Events --> Storage
+```
+
+**图表来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L50-L63)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L27-L77)
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 依赖关系分析
+
+### 外部依赖架构
+
+系统依赖于多个 Cloudflare 生态系统的组件:
+
+```mermaid
+graph TB
+subgraph "grammY 生态系统"
+grammY[grammy 核心框架]
+conversations[@grammyjs/conversations]
+storage[@grammyjs/storage-cloudflare]
+end
+subgraph "Cloudflare 运行时"
+workers[Cloudflare Workers]
+kv[KV 存储]
+cron[Cron 触发器]
+end
+subgraph "配置管理"
+wrangler[Wrangler CLI]
+typescript[TypeScript]
+vitest[Vitest 测试]
+end
+grammY --> workers
+conversations --> workers
+storage --> kv
+wrangler --> workers
+typescript --> grammY
+vitest --> grammY
+```
+
+**图表来源**
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+### 内部模块依赖
+
+```mermaid
+graph TD
+Main[src/index.ts] --> Command[src/command/index.ts]
+Main --> Scheduler[src/scheduler/index.ts]
+Command --> Handlers[handlers/]
+Command --> Client[src/client/cosmoe.ts]
+Scheduler --> Client
+Handlers --> Client
+Client --> KV[KV 存储接口]
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L5)
+- [src/command/index.ts](file://src/command/index.ts#L1-L11)
+
+**章节来源**
+- [package.json](file://package.json#L1-L24)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 性能考虑
+
+### 无服务器架构优势
+
+1. **自动扩缩容**:根据请求量自动调整资源
+2. **冷启动优化**:通过合理的模块组织减少冷启动时间
+3. **边缘计算**:就近处理用户请求,降低延迟
+4. **成本效益**:按实际使用量付费
+
+### 代码级优化策略
+
+1. **模块懒加载**:仅在需要时加载相关模块
+2. **缓存策略**:合理使用 KV 存储进行状态缓存
+3. **异步处理**:充分利用 Cloudflare Workers 的异步特性
+4. **错误处理**:实现健壮的错误恢复机制
+
+### 部署配置优化
+
+- Cron 触发器配置为每分钟执行,平衡实时性和成本
+- 环境变量集中管理,便于配置变更
+- 类型安全的配置文件生成
+
+## 故障排除指南
+
+### 常见问题诊断
+
+1. **Webhook 配置问题**
+   - 检查 Bot Token 和 Bot Info 配置
+   - 验证域名解析和 SSL 证书
+   - 确认 Cloudflare Workers 部署状态
+
+2. **KV 存储访问问题**
+   - 验证 KV 命名空间绑定
+   - 检查存储键值格式和权限
+   - 监控存储配额使用情况
+
+3. **API 调用失败**
+   - 检查网络连接和防火墙设置
+   - 验证外部 API 的可用性和响应格式
+   - 实现适当的重试机制
+
+### 日志监控建议
+
+- 在关键路径添加结构化日志
+- 监控请求延迟和错误率
+- 设置告警阈值和通知机制
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L30-L32)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L81-L83)
+
+## 结论
+
+Cosmoe Bot 展示了现代无服务器架构的最佳实践,通过精心设计的模块化结构和清晰的职责分离,实现了高可维护性和良好的扩展性。grammY 框架的选择为聊天机器人的开发提供了强大的基础,而 Cloudflare Workers 的无服务器特性则确保了系统的成本效益和性能表现。
+
+该架构设计充分考虑了实际业务需求,通过对话式交互、定时任务和外部 API 集成,为用户提供了一站式的摄影活动预约解决方案。同时,完善的错误处理机制和监控体系确保了系统的稳定运行。
+
+未来可以考虑的功能增强包括:
+- 更丰富的用户界面交互
+- 增强的数据分析和报告功能
+- 更灵活的通知机制
+- 扩展的支付集成

+ 541 - 0
.qoder/repowiki/zh/content/架构设计/组件设计.md

@@ -0,0 +1,541 @@
+# 组件设计
+
+<cite>
+**本文档引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [package.json](file://package.json)
+- [wrangler.jsonc](file://wrangler.jsonc)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概览](#架构概览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 引言
+
+Cosmoe Bot 是一个基于 Cloudflare Workers 和 Grammy 框架构建的 Telegram 机器人应用。该系统为摄影活动管理提供了完整的解决方案,包括用户认证、活动浏览、在线预约、历史记录查询等功能。系统采用模块化设计,通过三个核心组件实现不同的功能职责:主入口模块负责系统协调和初始化,命令处理器系统提供插件化的对话式交互,调度器独立处理定时任务和事件通知。
+
+## 项目结构
+
+项目采用按功能模块组织的结构,主要分为以下层次:
+
+```mermaid
+graph TB
+subgraph "核心入口层"
+Main[src/index.ts 主入口]
+Scheduler[scheduler/index.ts 调度器]
+end
+subgraph "命令处理层"
+CommandRoot[command/index.ts 核心]
+Handlers[handlers/ 命令处理器]
+end
+subgraph "客户端层"
+Client[client/cosmoe.ts API客户端]
+end
+subgraph "配置层"
+Package[package.json 依赖]
+Wrangler[wrangler.jsonc 配置]
+end
+Main --> CommandRoot
+Main --> Scheduler
+CommandRoot --> Handlers
+CommandRoot --> Client
+Scheduler --> Client
+Handlers --> Client
+Package --> Main
+Wrangler --> Main
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 核心组件
+
+### 主入口模块(src/index.ts)
+
+主入口模块是整个系统的协调者和控制中心,负责初始化 bot 实例、注册命令处理器、设置 webhook 回调以及处理定时任务。该模块实现了 Cloudflare Worker 的标准接口,支持 HTTP 请求和 Cron 触发的任务执行。
+
+**关键职责:**
+- Bot 实例初始化和配置
+- 命令处理器注册和管理
+- Telegram Webhook 设置和回调处理
+- 定时任务调度器集成
+- 环境变量和 KV 存储管理
+
+**接口设计:**
+- `fetch()` 方法处理 HTTP 请求
+- `scheduled()` 方法处理 Cron 任务
+- 支持 ConversationFlavor 类型的上下文扩展
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+
+### 命令处理器系统(src/command/index.ts)
+
+命令处理器系统采用插件化设计,基于 Grammy 的 conversations 插件实现对话状态管理。该系统支持多种命令类型和交互模式,包括简单命令、正则表达式匹配、内联键盘回调等。
+
+**核心特性:**
+- 插件化命令注册机制
+- 对话状态持久化到 KV 存储
+- 复杂业务逻辑的模块化封装
+- 错误处理和异常恢复机制
+
+**扩展点:**
+- 新命令处理器的添加
+- 对话流程的自定义
+- KV 存储适配器的替换
+
+**章节来源**
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+### 调度器(src/scheduler/index.ts)
+
+调度器是一个独立运行的服务,专门处理定时任务和事件通知。它与主入口模块分离,确保定时任务不会影响主服务的响应性。
+
+**主要功能:**
+- 新活动自动通知
+- 用户注册状态管理
+- KV 存储的数据同步
+- 异步任务处理
+
+**章节来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 架构概览
+
+系统采用分层架构设计,通过清晰的职责分离实现高内聚低耦合:
+
+```mermaid
+graph TB
+subgraph "外部接口层"
+Telegram[Telegram Bot API]
+Cron[Cron 任务触发器]
+end
+subgraph "协调管理层"
+MainEntry[主入口模块]
+CommandSystem[命令处理器系统]
+Scheduler[调度器]
+end
+subgraph "业务逻辑层"
+LoginHandler[登录处理器]
+EventsHandler[活动处理器]
+BookingHandler[预约处理器]
+HistoryHandler[历史处理器]
+CancelHandler[取消处理器]
+LogoutHandler[登出处理器]
+end
+subgraph "数据访问层"
+CosmoeAPI[Cosmoe API]
+KVStorage[KV 存储]
+CredentialsKV[凭证存储]
+end
+Telegram --> MainEntry
+Cron --> Scheduler
+MainEntry --> CommandSystem
+CommandSystem --> LoginHandler
+CommandSystem --> EventsHandler
+CommandSystem --> BookingHandler
+CommandSystem --> HistoryHandler
+CommandSystem --> CancelHandler
+CommandSystem --> LogoutHandler
+LoginHandler --> CosmoeAPI
+EventsHandler --> CosmoeAPI
+BookingHandler --> CosmoeAPI
+HistoryHandler --> CosmoeAPI
+CancelHandler --> CosmoeAPI
+LoginHandler --> CredentialsKV
+BookingHandler --> KVStorage
+HistoryHandler --> KVStorage
+Scheduler --> CosmoeAPI
+Scheduler --> KVStorage
+Scheduler --> CredentialsKV
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 详细组件分析
+
+### 主入口模块详细分析
+
+主入口模块实现了 Cloudflare Worker 的标准生命周期方法,提供完整的 Telegram 机器人服务:
+
+```mermaid
+sequenceDiagram
+participant Telegram as Telegram Bot
+participant Main as 主入口模块
+participant Command as 命令系统
+participant Scheduler as 调度器
+Telegram->>Main : HTTP 请求
+Main->>Main : 初始化 Bot 实例
+Main->>Command : 注册命令处理器
+Command-->>Main : 命令注册完成
+Main->>Telegram : 设置命令菜单
+Main->>Main : 创建 webhook 回调
+Main-->>Telegram : 返回响应
+Note over Scheduler : Cron 触发
+Scheduler->>Main : 定时任务调用
+Main->>Scheduler : 处理调度事件
+Scheduler-->>Main : 任务完成
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L13-L46)
+
+**实现特点:**
+- 使用 ConversationFlavor 扩展 Context 类型
+- 动态设置 Telegram 命令菜单
+- 集成 Cloudflare Mod webhook 处理
+- 支持环境变量配置
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+
+### 命令处理器系统详细分析
+
+命令处理器系统采用模块化设计,每个命令都有独立的处理器文件:
+
+```mermaid
+classDiagram
+class CommandSystem {
++setupCommands(bot, env)
++handleStartCommand(ctx)
++handleLoginCommand(ctx)
++handleEventsCommand(ctx)
++handleEventDetails(ctx)
++handleBookEvent(ctx, env)
++handleHistoryCommand(ctx, env)
++handleCancelCommand(ctx, env)
++handleLogoutCommand(ctx, env)
+}
+class LoginHandler {
++handleInteractiveLogin(conversation, ctx, env)
++validateCredentials(username, password)
++storeCredentials(userId, token)
+}
+class EventsHandler {
++handleEventsCommand(ctx)
++formatEventsList(events)
+}
+class BookingHandler {
++handleBookEvent(ctx, env)
++proceedWithBooking(ctx, client, event, slot, coupon)
++handleCouponSelection(ctx, env, action)
+}
+class HistoryHandler {
++handleHistoryCommand(ctx, env)
++formatBookingHistory(bookings)
+}
+class CancelHandler {
++handleCancelCommand(ctx, env)
++handleCancelConfirmation(ctx, env, action)
+}
+class LogoutHandler {
++handleLogoutCommand(ctx, env)
++clearUserCredentials(userId)
+}
+CommandSystem --> LoginHandler : "委托"
+CommandSystem --> EventsHandler : "委托"
+CommandSystem --> BookingHandler : "委托"
+CommandSystem --> HistoryHandler : "委托"
+CommandSystem --> CancelHandler : "委托"
+CommandSystem --> LogoutHandler : "委托"
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L34)
+
+**对话状态管理机制:**
+
+```mermaid
+flowchart TD
+Start([用户输入 /login]) --> EnterConversation["进入登录对话"]
+EnterConversation --> AskUsername["询问用户名"]
+AskUsername --> WaitUsername["等待用户名输入"]
+WaitUsername --> AskPassword["询问密码"]
+AskPassword --> WaitPassword["等待密码输入"]
+WaitPassword --> Authenticate["验证用户凭据"]
+Authenticate --> AuthSuccess{"认证成功?"}
+AuthSuccess --> |是| StoreCredentials["存储用户凭证"]
+AuthSuccess --> |否| ShowError["显示认证失败消息"]
+StoreCredentials --> Success["登录成功"]
+ShowError --> End([结束])
+Success --> End
+```
+
+**图表来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L18-L74)
+
+**章节来源**
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+### 调度器详细分析
+
+调度器专注于处理定时任务,特别是新活动的通知功能:
+
+```mermaid
+sequenceDiagram
+participant Cron as Cron 触发器
+participant Scheduler as 调度器
+participant CosmoeAPI as Cosmoe API
+participant KVStorage as KV 存储
+participant Users as 用户列表
+participant Telegram as Telegram API
+Cron->>Scheduler : 每分钟触发
+Scheduler->>CosmoeAPI : 获取所有活动
+CosmoeAPI-->>Scheduler : 返回活动列表
+Scheduler->>KVStorage : 读取最新活动ID
+KVStorage-->>Scheduler : 返回存储的ID
+Scheduler->>Scheduler : 过滤新活动
+Scheduler->>Users : 获取所有注册用户
+loop 对于每个新活动
+loop 对于每个用户
+Scheduler->>Telegram : 发送通知消息
+Telegram-->>Scheduler : 确认发送结果
+end
+end
+Scheduler->>KVStorage : 更新最新活动ID
+```
+
+**图表来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L84)
+
+**核心算法流程:**
+
+```mermaid
+flowchart TD
+Start([定时任务启动]) --> LoadConfig["加载配置和凭据"]
+LoadConfig --> FetchEvents["获取所有活动"]
+FetchEvents --> CheckResult{"获取成功?"}
+CheckResult --> |否| LogError["记录错误日志"]
+CheckResult --> |是| LoadLastId["加载上次最新活动ID"]
+LoadLastId --> FilterNewEvents["过滤新活动"]
+FilterNewEvents --> HasNew{"有新活动?"}
+HasNew --> |否| Complete["任务完成"]
+HasNew --> |是| GetRegisteredUsers["获取注册用户列表"]
+GetRegisteredUsers --> NotifyUsers["向用户发送通知"]
+NotifyUsers --> UpdateLastId["更新最新活动ID"]
+UpdateLastId --> Complete
+LogError --> Complete
+```
+
+**图表来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L18-L88)
+
+**章节来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+### API 客户端详细分析
+
+Cosmoe API 客户端提供了完整的 API 封装,支持用户认证、活动管理、预约处理等功能:
+
+```mermaid
+classDiagram
+class CosmoeClient {
+-baseUrl : string
+-userId : number
+-token : string
++getToken(username, password)
++setCredentials(userId, token)
++getCredentials()
++isAuthenticated()
++getEvents()
++getEventDetail(eventId)
++getProfile()
++getMyBookings()
++bookEvent(bookingRequest)
++getAvailableCoupons(eventId)
++cancelBooking(bookingId)
++updatePaymentOrder(bookingId, orderId)
++updateBookingNote(bookingId, note)
++selfReschedule(bookingId, newTimeSlot)
++selfTransfer(bookingId, recipientUsername)
++register(key, username, email, password, userIdentity)
+}
+class Event {
++id : string
++name : string
++description : string
++event_date : string
++cover_image_url : string
++description_brief : string
+}
+class EventDetail {
++id : number
++name : string
++description : string
++event_date : string
++time_slots_with_prices : string
++cover_image_url : string
++detail_image_urls : string
++slots : TimeSlot[]
+}
+class TimeSlot {
++range : string
++price : string
++capacity : number
++remaining : number
+}
+class Booking {
++id : number
++status : string
++booking_date : string
++time_slot : string
++final_price : string
++payment_order_id : string
++notes_by_user : string
+}
+CosmoeClient --> Event : "返回"
+CosmoeClient --> EventDetail : "返回"
+CosmoeClient --> TimeSlot : "包含"
+CosmoeClient --> Booking : "返回"
+```
+
+**图表来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+## 依赖关系分析
+
+系统依赖关系清晰明确,遵循单一职责原则:
+
+```mermaid
+graph TB
+subgraph "外部依赖"
+Grammy[grammy ^1.39.3]
+Conversations[@grammyjs/conversations ^2.1.1]
+StorageCloudflare[@grammyjs/storage-cloudflare ^2.4.2]
+Wrangler[wrangler ^4.59.2]
+end
+subgraph "内部模块"
+MainModule[src/index.ts]
+CommandModule[src/command/index.ts]
+SchedulerModule[src/scheduler/index.ts]
+ClientModule[src/client/cosmoe.ts]
+HandlerModules[src/command/handlers/*]
+end
+subgraph "Cloudflare 平台"
+KVNamespace[KV Namespace]
+CronTrigger[Cron Trigger]
+Webhook[Webhook Callback]
+end
+MainModule --> CommandModule
+MainModule --> SchedulerModule
+CommandModule --> HandlerModules
+CommandModule --> ClientModule
+SchedulerModule --> ClientModule
+HandlerModules --> ClientModule
+MainModule --> KVNamespace
+SchedulerModule --> KVNamespace
+MainModule --> CronTrigger
+MainModule --> Webhook
+ClientModule --> CosmoeAPI[Cosmoe API]
+```
+
+**图表来源**
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+**依赖特性:**
+- 最小化外部依赖,仅使用必要的核心库
+- 通过 KV 存储实现数据持久化
+- 利用 Cloudflare Workers 的原生功能
+- 支持环境变量配置和类型安全
+
+**章节来源**
+- [package.json](file://package.json#L1-L24)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 性能考虑
+
+### 内存管理
+- 使用 KV 存储替代内存缓存,避免内存泄漏
+- 对话状态异步读写,减少阻塞时间
+- 及时清理临时数据和连接
+
+### 网络优化
+- 合理的 API 调用频率控制
+- 错误重试机制和超时处理
+- 数据格式化和传输优化
+
+### 并发处理
+- 避免在主入口中执行长时间任务
+- 调度器独立运行,不影响主服务响应
+- 使用异步操作处理用户请求
+
+## 故障排除指南
+
+### 常见问题及解决方案
+
+**Webhook 配置问题:**
+- 检查 Cloudflare Workers 配置
+- 验证 Bot Token 和 Bot Info
+- 确认域名解析和 SSL 证书
+
+**KV 存储访问失败:**
+- 验证 KV Namespace 绑定
+- 检查存储权限和配额
+- 确认键名格式和数据序列化
+
+**API 调用超时:**
+- 检查网络连接和防火墙设置
+- 验证 API 端点和认证信息
+- 实施适当的重试策略
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L19-L34)
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L27-L78)
+
+## 结论
+
+Cosmoe Bot 项目展现了优秀的软件架构设计,通过三个核心组件实现了清晰的职责分离和良好的扩展性。主入口模块作为系统协调者,命令处理器系统提供灵活的插件化交互,调度器独立处理定时任务,形成了高效稳定的整体架构。
+
+**设计优势:**
+- 模块化设计便于维护和扩展
+- 清晰的职责边界降低耦合度
+- 基于 Cloudflare 平台的高可用性
+- 完善的错误处理和监控机制
+
+**扩展建议:**
+- 添加单元测试覆盖关键业务逻辑
+- 实现更细粒度的日志记录和监控
+- 考虑添加缓存层提升性能
+- 增加配置管理的灵活性

+ 815 - 0
.qoder/repowiki/zh/content/架构设计/部署架构.md

@@ -0,0 +1,815 @@
+# 部署架构
+
+<cite>
+**本文档引用的文件**
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [.dev.vars](file://.dev.vars)
+- [package.json](file://package.json)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概览](#架构概览)
+5. [详细组件分析](#详细组件分析)
+6. [部署配置详解](#部署配置详解)
+7. [环境变量管理](#环境变量管理)
+8. [KV 命名空间配置](#kv-命名空间配置)
+9. [监控与日志配置](#监控与日志配置)
+10. [性能优化策略](#性能优化策略)
+11. [部署最佳实践](#部署最佳实践)
+12. [故障排除指南](#故障排除指南)
+13. [结论](#结论)
+
+## 简介
+
+Cosmoe Bot 是一个基于 Cloudflare Workers 的 Telegram 机器人应用,集成了摄影活动管理和用户交互功能。该系统通过 Cloudflare Workers 平台实现无服务器部署,利用 KV 存储进行数据持久化,并通过 Cron 触发器实现定时任务调度。
+
+本部署架构文档详细说明了 Cloudflare Workers 的部署配置和运行时环境,包括 wrangler.jsonc 配置选项、环境变量管理、Worker 脚本的部署流程,以及生产环境和开发环境的差异配置。
+
+## 项目结构
+
+该项目采用模块化的 TypeScript 架构,主要包含以下核心目录和文件:
+
+```mermaid
+graph TB
+subgraph "项目根目录"
+A[wrangler.jsonc] --> B[配置文件]
+C[package.json] --> D[依赖管理]
+E[.dev.vars] --> F[开发环境变量]
+G[worker-configuration.d.ts] --> H[类型定义]
+end
+subgraph "源代码结构"
+I[src/] --> J[主入口文件]
+K[src/command/] --> L[命令处理器]
+M[src/scheduler/] --> N[定时任务]
+O[src/client/] --> P[API 客户端]
+Q[src/index.ts] --> R[主控制器]
+end
+subgraph "命令处理器"
+S[start.ts] --> T[开始命令]
+U[login.ts] --> V[登录处理]
+W[events.ts] --> X[活动查询]
+Y[history.ts] --> Z[历史记录]
+end
+subgraph "定时任务"
+AA[index.ts] --> BB[事件通知]
+end
+subgraph "API 客户端"
+CC[cosmoe.ts] --> DD[Cosmoe API]
+end
+```
+
+**图表来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L1-L24)
+- [src/index.ts](file://src/index.ts#L1-L47)
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L1-L24)
+- [src/index.ts](file://src/index.ts#L1-L47)
+
+## 核心组件
+
+### 主要组件概述
+
+该系统由以下几个核心组件构成:
+
+1. **Bot 核心引擎** - 基于 Grammy.js 框架的 Telegram 机器人
+2. **命令处理器系统** - 处理各种用户命令和交互
+3. **定时任务调度器** - 周期性检查新活动并发送通知
+4. **KV 存储适配器** - 提供对话状态和用户数据持久化
+5. **API 客户端** - 与 Cosmoe 系统进行数据交互
+
+### 组件关系图
+
+```mermaid
+classDiagram
+class Bot {
++string BOT_INFO
++string BOT_TOKEN
++KVNamespace COSMOE_CREDENTIALS
++KVNamespace COSMOE_STORAGE
++fetch(request, env, ctx) Response
++scheduled(controller, env, ctx) void
+}
+class CommandSystem {
++setupCommands(bot, env) void
++handleStartCommand(ctx) void
++handleLoginCommand(ctx) void
++handleEventsCommand(ctx) void
++handleHistoryCommand(ctx, env) void
+}
+class Scheduler {
++handleScheduledEvent(bot, controller, env, ctx) void
++handleNewEventNotifications() void
+}
+class KVAdapter {
++read(key) any
++write(key, value) void
++delete(key) void
+}
+class CosmoeClient {
++getToken(username, password) ApiResponse
++getEvents() ApiResponse
++getEventDetail(eventId) ApiResponse
++getMyBookings() ApiResponse
++bookEvent(bookingRequest) ApiResponse
+}
+Bot --> CommandSystem : "使用"
+Bot --> Scheduler : "使用"
+CommandSystem --> KVAdapter : "使用"
+Scheduler --> CosmoeClient : "使用"
+CommandSystem --> CosmoeClient : "使用"
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L17)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L170)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 架构概览
+
+### 整体架构设计
+
+该系统采用事件驱动的无服务器架构,通过 Cloudflare Workers 的边缘网络实现全球分布的高可用服务。
+
+```mermaid
+graph TB
+subgraph "客户端层"
+A[Telegram 用户] --> B[Telegram Bot API]
+end
+subgraph "Cloudflare 边缘网络"
+C[Workers Runtime] --> D[请求处理]
+E[Workers Runtime] --> F[定时任务]
+G[Workers Runtime] --> H[缓存层]
+end
+subgraph "数据存储层"
+I[KV 存储 - COSMOE_CREDENTIALS] --> J[用户凭证]
+K[KV 存储 - COSMOE_STORAGE] --> L[对话状态]
+M[Telegram API] --> N[消息发送]
+end
+subgraph "外部服务"
+O[Cosmoe API] --> P[活动数据]
+Q[Cosmoe API] --> R[用户数据]
+end
+A --> B --> C
+C --> D
+C --> F
+D --> I
+D --> K
+F --> O
+O --> P
+O --> R
+D --> M
+M --> N
+```
+
+**图表来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L17)
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L17)
+
+### 请求处理流程
+
+```mermaid
+sequenceDiagram
+participant User as 机器人用户
+participant Telegram as Telegram API
+participant Worker as Cloudflare Worker
+participant Bot as Bot 核心
+participant Commands as 命令处理器
+participant KV as KV 存储
+User->>Telegram : 发送命令
+Telegram->>Worker : HTTP 请求
+Worker->>Bot : 初始化 Bot 实例
+Bot->>Commands : 设置命令处理器
+Commands->>KV : 读取对话状态
+KV-->>Commands : 返回状态数据
+Commands->>Commands : 处理命令逻辑
+Commands->>Telegram : 发送响应
+Telegram-->>User : 返回结果
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L14-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+
+## 详细组件分析
+
+### 主入口文件分析
+
+主入口文件负责初始化 Bot 实例、设置命令处理器和处理定时任务。
+
+```mermaid
+flowchart TD
+Start([Worker 启动]) --> InitBot["初始化 Bot 实例<br/>解析 BOT_INFO<br/>设置 BOT_TOKEN"]
+InitBot --> SetupCommands["设置命令处理器<br/>安装对话插件"]
+SetupCommands --> SetCommands["注册命令菜单<br/>setMyCommands"]
+SetCommands --> Webhook["设置 Webhook 回调"]
+Webhook --> Ready([就绪状态])
+Ready --> Request{"收到请求?"}
+Request --> |是| HandleRequest["处理 HTTP 请求"]
+Request --> |否| Scheduled{"定时触发?"}
+HandleRequest --> WebhookCallback["webhookCallback"]
+WebhookCallback --> TelegramResponse["返回 Telegram 响应"]
+Scheduled --> |是| HandleScheduled["处理定时任务"]
+HandleScheduled --> ProcessEvents["检查新活动"]
+ProcessEvents --> SendNotifications["发送通知给用户"]
+SendNotifications --> Complete([完成])
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L13-L46)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+
+### 命令处理系统
+
+命令处理系统基于 @grammyjs/conversations 插件,提供了丰富的用户交互能力。
+
+#### 对话状态管理
+
+```mermaid
+classDiagram
+class ConversationStorage {
++read(key) Promise~any~
++write(key, value) Promise~void~
++delete(key) Promise~void~
+}
+class KvAdapter {
++read(key) Promise~string|undefined~
++write(key, value) Promise~void~
++delete(key) Promise~void~
+}
+class LoginConversation {
++handleInteractiveLogin(conversation, ctx, env) Promise~void~
++askUsername() Promise~string~
++askPassword() Promise~string~
++storeCredentials() Promise~void~
+}
+ConversationStorage --> KvAdapter : "使用"
+LoginConversation --> ConversationStorage : "使用"
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+
+**章节来源**
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+### 定时任务调度器
+
+定时任务调度器每分钟检查一次新的摄影活动,并向已注册的用户发送通知。
+
+#### 事件通知流程
+
+```mermaid
+flowchart TD
+CronTrigger["Cron 触发器<br/>*/1 * * * *"] --> InitScheduler["初始化调度器"]
+InitScheduler --> LoadLatestEvent["加载最新事件ID"]
+LoadLatestEvent --> FetchEvents["获取所有活动"]
+FetchEvents --> FilterNewEvents{"有新活动?"}
+FilterNewEvents --> |否| Complete([完成])
+FilterNewEvents --> |是| ListUsers["列出所有用户"]
+ListUsers --> IterateUsers["遍历每个用户"]
+IterateUsers --> SendNotification["发送活动通知"]
+SendNotification --> VerifySuccess{"发送成功?"}
+VerifySuccess --> |是| UpdateLatest["更新最新事件ID"]
+VerifySuccess --> |否| LogError["记录错误"]
+UpdateLatest --> NextUser["下一个用户"]
+LogError --> NextUser
+NextUser --> IterateUsers
+UpdateLatest --> Complete
+LogError --> Complete
+```
+
+**图表来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+**章节来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+### API 客户端集成
+
+Cosmoe API 客户端提供了完整的摄影活动管理系统接口。
+
+#### API 接口分类
+
+```mermaid
+graph LR
+subgraph "认证相关"
+A[getToken] --> B[用户登录]
+C[getProfile] --> D[获取用户资料]
+E[getUserProfile] --> F[获取用户详情]
+end
+subgraph "活动相关"
+G[getEvents] --> H[获取活动列表]
+I[getEventDetail] --> J[获取活动详情]
+K[getAvailableCoupons] --> L[获取可用优惠券]
+end
+subgraph "预订相关"
+M[bookEvent] --> N[预订活动]
+O[getMyBookings] --> P[获取预订历史]
+Q[cancelBooking] --> R[取消预订]
+S[selfReschedule] --> T[重新安排时间]
+U[selfTransfer] --> V[转让预订]
+end
+subgraph "系统相关"
+W[changePassword] --> X[修改密码]
+Y[register] --> Z[用户注册]
+end
+```
+
+**图表来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+## 部署配置详解
+
+### Wrangler 配置文件分析
+
+Wrangler 配置文件定义了 Worker 的部署参数和运行时行为。
+
+#### 核心配置项
+
+| 配置项 | 类型 | 描述 | 默认值 |
+|--------|------|------|--------|
+| name | string | Worker 名称 | cosmoe-bot |
+| main | string | 主入口文件路径 | src/index.ts |
+| compatibility_date | string | 兼容性日期 | 2025-09-27 |
+| observability.enabled | boolean | 启用可观测性 | true |
+| triggers.crons | array | Cron 表达式数组 | */1 * * * * |
+
+#### KV 命名空间配置
+
+```mermaid
+erDiagram
+KV_NAMESPACES {
+string binding PK
+string id
+}
+KV_NAMESPACES {
+COSMOE_CREDENTIALS {
+string binding "COSMOE_CREDENTIALS"
+string id "668dab226bea4de6ab8ef8a5150b926c"
+}
+}
+KV_NAMESPACES {
+COSMOE_STORAGE {
+string binding "COSMOE_STORAGE"
+string id "a3d8a40e24b0469d8627171d4ce8e51d"
+}
+}
+```
+
+**图表来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+### 部署脚本配置
+
+项目使用 npm scripts 进行部署管理,提供了多种部署模式。
+
+#### 部署脚本对比
+
+| 脚本名称 | 命令 | 用途 | 特点 |
+|----------|------|------|------|
+| deploy | wrangler deploy | 生产部署 | 使用生产配置 |
+| dev | wrangler dev | 开发模式 | 启用热重载 |
+| start | wrangler dev | 启动服务 | 开发环境别名 |
+| cf-typegen | wrangler types | 类型生成 | 更新类型定义 |
+
+**章节来源**
+- [package.json](file://package.json#L5-L11)
+
+## 环境变量管理
+
+### 开发环境变量
+
+开发环境使用 `.dev.vars` 文件管理敏感配置信息。
+
+#### 开发环境配置
+
+```mermaid
+flowchart LR
+DevVars[".dev.vars 文件"] --> EnvVars["环境变量"]
+EnvVars --> BotToken["BOT_TOKEN<br/>8219164862:AAEIbExTBgH_8FsFCVAHqc3uZgpu4HxqRQY"]
+EnvVars --> DevMode["开发模式"]
+EnvVars --> LocalTesting["本地测试"]
+```
+
+**图表来源**
+- [.dev.vars](file://.dev.vars#L1-L2)
+
+#### 生产环境变量
+
+生产环境通过 Cloudflare Workers 控制台或 CLI 设置环境变量。
+
+**章节来源**
+- [.dev.vars](file://.dev.vars#L1-L2)
+- [src/index.ts](file://src/index.ts#L6-L11)
+
+### 变量绑定机制
+
+Worker 通过接口定义声明所需的环境变量,确保类型安全。
+
+```mermaid
+classDiagram
+class EnvInterface {
++string BOT_INFO
++string BOT_TOKEN
++KVNamespace COSMOE_CREDENTIALS
++KVNamespace COSMOE_STORAGE
+}
+class WorkerRuntime {
++EnvInterface env
++ExecutionContext ctx
++Request request
+}
+EnvInterface --> WorkerRuntime : "绑定"
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L8-L11)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L800)
+
+## KV 命名空间配置
+
+### 命名空间设计原则
+
+系统使用两个独立的 KV 命名空间来分离不同类型的数据:
+
+1. **COSMOE_CREDENTIALS** - 存储用户认证凭证
+2. **COSMOE_STORAGE** - 存储对话状态和应用数据
+
+### 数据模型设计
+
+#### 用户凭证存储
+
+```mermaid
+erDiagram
+USERS {
+string telegram_user_id PK
+object credentials {
+number user_id
+string token
+number timestamp
+}
+}
+CREDENTIALS {
+string telegram_user_id PK
+json credentials
+}
+USERS ||--|| CREDENTIALS : "关联"
+```
+
+#### 对话状态存储
+
+```mermaid
+erDiagram
+CONVERSATIONS {
+string conversation_key PK
+json conversation_data
+datetime created_at
+datetime updated_at
+}
+STORAGE {
+string key PK
+string value
+datetime last_modified
+}
+CONVERSATIONS ||--|| STORAGE : "使用"
+```
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L50-L65)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+
+### KV 访问模式
+
+系统采用异步访问模式,确保操作的可靠性和性能。
+
+```mermaid
+sequenceDiagram
+participant Handler as 命令处理器
+participant KV as KV 存储
+participant Adapter as KV 适配器
+Handler->>Adapter : read(key)
+Adapter->>KV : get(key)
+KV-->>Adapter : value
+Adapter-->>Handler : parsed_value
+Handler->>Adapter : write(key, value)
+Adapter->>KV : put(key, serialized_value)
+KV-->>Adapter : success
+Adapter-->>Handler : void
+Handler->>Adapter : delete(key)
+Adapter->>KV : delete(key)
+KV-->>Adapter : success
+Adapter-->>Handler : void
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L26-L49)
+
+## 监控与日志配置
+
+### 观测性配置
+
+系统启用了 Cloudflare Workers 的观测性功能,提供全面的监控能力。
+
+#### 观测性特性
+
+| 功能 | 描述 | 配置位置 |
+|------|------|----------|
+| 请求追踪 | 跟踪 HTTP 请求 | observability.enabled: true |
+| 性能指标 | 收集运行时指标 | 自动启用 |
+| 日志记录 | 控制台日志输出 | console.log() |
+| 错误报告 | 异常捕获和报告 | try-catch 包装 |
+
+### 日志记录策略
+
+系统在关键操作点记录详细日志,便于问题诊断和性能分析。
+
+#### 关键日志点
+
+```mermaid
+flowchart TD
+Start([操作开始]) --> LogStart["记录开始日志"]
+LogStart --> Process["执行业务逻辑"]
+Process --> Success{"操作成功?"}
+Success --> |是| LogSuccess["记录成功日志"]
+Success --> |否| LogError["记录错误日志<br/>包含错误详情"]
+LogSuccess --> Complete([操作完成])
+LogError --> Complete
+```
+
+**图表来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L18-L87)
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L18-L87)
+
+## 性能优化策略
+
+### 冷启动优化
+
+针对 Cloudflare Workers 的冷启动特性,系统采用了多项优化策略:
+
+#### 初始化优化
+
+```mermaid
+flowchart LR
+subgraph "冷启动优化策略"
+A[延迟初始化] --> B[按需加载模块]
+C[预热机制] --> D[缓存常用数据]
+E[代码分割] --> F[减少初始包大小]
+G[静态资源] --> H[预编译和压缩]
+end
+subgraph "运行时优化"
+I[连接复用] --> J[重用 HTTP 连接]
+K[内存管理] --> L[及时释放资源]
+M[并发控制] --> N[限制同时请求数]
+end
+```
+
+#### 资源限制与调优
+
+| 资源类别 | 限制 | 优化建议 |
+|----------|------|----------|
+| CPU 时间 | 30 秒 | 优化算法复杂度 |
+| 内存 | 256 MB | 减少对象创建 |
+| 请求大小 | 1 MB | 分块传输 |
+| 响应大小 | 1 MB | 流式响应 |
+| 并发连接 | 100 | 连接池管理 |
+
+### 缓存策略
+
+系统通过 KV 存储实现多层缓存机制:
+
+```mermaid
+graph TB
+subgraph "缓存层次"
+A[请求级缓存] --> B[会话级缓存]
+B --> C[用户级缓存]
+C --> D[全局缓存]
+end
+subgraph "缓存策略"
+E[L1 缓存] --> F[内存缓存]
+G[L2 缓存] --> H[KV 存储]
+I[L3 缓存] --> J[外部 API 缓存]
+end
+A --> E
+B --> G
+C --> I
+D --> J
+```
+
+**章节来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L27-L78)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+
+## 部署最佳实践
+
+### 开发环境配置
+
+开发环境强调快速迭代和调试能力:
+
+#### 开发环境特性
+
+```mermaid
+flowchart TD
+DevConfig["开发环境配置"] --> HotReload["热重载支持"]
+DevConfig --> LocalDebug["本地调试"]
+DevConfig --> DevKV["开发用 KV 空间"]
+DevConfig --> TestAPI["测试 API 端点"]
+HotReload --> FastIteration["快速迭代"]
+LocalDebug --> EasyDebug["易于调试"]
+DevKV --> SafeTesting["安全测试"]
+TestAPI --> APIValidation["API 验证"]
+```
+
+#### 开发工作流程
+
+```mermaid
+sequenceDiagram
+participant Dev as 开发者
+participant DevServer as 开发服务器
+participant TestEnv as 测试环境
+participant ProdEnv as 生产环境
+Dev->>DevServer : 修改代码
+DevServer->>DevServer : 自动重启
+Dev->>TestEnv : 部署到测试
+TestEnv->>TestEnv : 自动测试
+Dev->>ProdEnv : 部署到生产
+ProdEnv->>ProdEnv : 监控检查
+```
+
+### 生产环境配置
+
+生产环境强调稳定性和安全性:
+
+#### 生产环境特性
+
+```mermaid
+flowchart LR
+subgraph "稳定性保障"
+A[健康检查] --> B[自动恢复]
+C[流量控制] --> D[限流保护]
+E[备份策略] --> F[数据备份]
+end
+subgraph "安全措施"
+G[API 密钥管理] --> H[环境变量隔离]
+I[访问控制] --> J[权限验证]
+K[审计日志] --> L[操作记录]
+end
+```
+
+### 部署流程
+
+```mermaid
+flowchart TD
+Start([开始部署]) --> Validate["验证配置"]
+Validate --> Build["构建代码"]
+Build --> Test["运行测试"]
+Test --> Deploy["部署到目标环境"]
+Deploy --> Monitor["监控部署状态"]
+Monitor --> Rollback{"部署成功?"}
+Rollback --> |是| Complete([部署完成])
+Rollback --> |否| RollbackOps["回滚操作"]
+RollbackOps --> Complete
+```
+
+**章节来源**
+- [package.json](file://package.json#L5-L11)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 故障排除指南
+
+### 常见问题诊断
+
+#### KV 存储相关问题
+
+```mermaid
+flowchart TD
+KVError["KV 存储错误"] --> ReadError["读取失败"]
+KVError --> WriteError["写入失败"]
+KVError --> DeleteError["删除失败"]
+ReadError --> CheckKey["检查键是否存在"]
+ReadError --> CheckFormat["检查数据格式"]
+ReadError --> CheckPermissions["检查权限"]
+WriteError --> CheckSize["检查数据大小"]
+WriteError --> CheckType["检查数据类型"]
+WriteError --> CheckRateLimit["检查速率限制"]
+DeleteError --> CheckKeyExists["检查键存在"]
+DeleteError --> CheckPermissions
+```
+
+#### API 调用异常
+
+```mermaid
+flowchart TD
+APIError["API 调用异常"] --> NetworkError["网络错误"]
+APIError --> AuthError["认证失败"]
+APIError --> TimeoutError["超时错误"]
+APIError --> ValidationError["数据验证错误"]
+NetworkError --> Retry["重试机制"]
+AuthError --> RefreshToken["刷新令牌"]
+TimeoutError --> Backoff["指数退避"]
+ValidationError --> ValidateInput["验证输入"]
+```
+
+### 调试工具和技巧
+
+#### 日志分析
+
+系统提供了多层次的日志记录机制,便于问题定位:
+
+```mermaid
+graph TB
+subgraph "日志级别"
+A[错误日志] --> B[警告日志]
+B --> C[信息日志]
+C --> D[调试日志]
+end
+subgraph "日志内容"
+E[请求信息] --> F[响应信息]
+G[错误详情] --> H[堆栈跟踪]
+I[性能指标] --> J[执行时间]
+end
+A --> E
+B --> F
+C --> G
+D --> H
+```
+
+#### 性能监控
+
+```mermaid
+flowchart LR
+subgraph "性能指标"
+A[请求延迟] --> B[内存使用]
+C[CPU 使用率] --> D[错误率]
+E[吞吐量] --> F[缓存命中率]
+end
+subgraph "监控工具"
+G[Cloudflare Analytics] --> H[日志分析]
+I[自定义指标] --> J[告警系统]
+end
+A --> G
+B --> H
+C --> I
+D --> J
+```
+
+**章节来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L30-L87)
+- [src/command/index.ts](file://src/command/index.ts#L30-L49)
+
+## 结论
+
+Cosmoe Bot 项目展示了如何在 Cloudflare Workers 平台上构建高性能、可扩展的 Telegram 机器人应用。通过合理的架构设计、完善的监控体系和严格的部署流程,该系统能够稳定地为用户提供摄影活动管理和预订服务。
+
+### 关键优势
+
+1. **无服务器架构** - 无需管理服务器基础设施
+2. **全球分布** - 利用 Cloudflare 边缘网络提供低延迟服务
+3. **成本效益** - 按需付费的计费模式
+4. **高可用性** - 自动扩缩容和故障恢复
+5. **安全可靠** - 环境变量管理和访问控制
+
+### 未来改进方向
+
+1. **增强监控** - 集成更详细的性能指标和业务指标
+2. **优化缓存** - 实现更智能的缓存策略和失效机制
+3. **扩展功能** - 支持更多第三方服务集成
+4. **用户体验** - 改进界面交互和响应速度
+5. **安全性加固** - 实施更严格的身份验证和授权机制
+
+通过遵循本文档的部署架构指导和最佳实践,开发者可以确保系统的稳定运行和持续发展。

+ 541 - 0
.qoder/repowiki/zh/content/核心模块/API 客户端模块.md

@@ -0,0 +1,541 @@
+# API 客户端模块
+
+<cite>
+**本文档引用的文件**
+- [cosmoe.ts](file://src/client/cosmoe.ts)
+- [index.ts](file://src/command/index.ts)
+- [login.ts](file://src/command/handlers/login.ts)
+- [bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [events.ts](file://src/command/handlers/events.ts)
+- [eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [history.ts](file://src/command/handlers/history.ts)
+- [cancel.ts](file://src/command/handlers/cancel.ts)
+- [logout.ts](file://src/command/handlers/logout.ts)
+- [start.ts](file://src/command/handlers/start.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概览](#架构概览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+
+Cosmoe API 客户端模块是一个基于 TypeScript 的现代化 API 客户端库,专为与 Cosmoe 摄影平台进行交互而设计。该模块提供了完整的认证机制、用户管理、活动管理和预约管理功能,支持通过 Telegram 机器人界面进行用户友好的操作。
+
+该客户端模块采用现代 JavaScript 特性,包括异步/等待模式、接口定义和类型安全,确保了代码的可维护性和可靠性。模块设计遵循单一职责原则,将 API 交互逻辑与业务逻辑分离,便于测试和扩展。
+
+## 项目结构
+
+项目采用模块化架构,主要包含以下核心目录和文件:
+
+```mermaid
+graph TB
+subgraph "客户端层"
+C1[src/client/cosmoe.ts<br/>主客户端类]
+end
+subgraph "命令处理器层"
+H1[src/command/handlers/]
+H2[login.ts<br/>登录处理]
+H3[bookEvent.ts<br/>预约处理]
+H4[events.ts<br/>活动列表]
+H5[eventDetails.ts<br/>活动详情]
+H6[history.ts<br/>历史记录]
+H7[cancel.ts<br/>取消处理]
+H8[logout.ts<br/>登出处理]
+H9[start.ts<br/>启动命令]
+end
+subgraph "入口点"
+E1[src/command/index.ts<br/>命令注册]
+E2[src/index.ts<br/>应用入口]
+end
+subgraph "配置文件"
+P1[package.json<br/>依赖管理]
+W1[wrangler.jsonc<br/>Cloudflare Workers配置]
+end
+C1 --> H1
+E1 --> H1
+E2 --> E1
+```
+
+**图表来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [index.ts](file://src/command/index.ts#L1-L110)
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [index.ts](file://src/command/index.ts#L1-L110)
+
+## 核心组件
+
+### CosmoeClient 主类
+
+CosmoeClient 是整个模块的核心类,提供了所有与 Cosmoe API 交互的功能。该类采用面向对象设计,封装了所有 API 调用逻辑,并提供了清晰的方法接口。
+
+#### 主要特性
+- **认证管理**: 支持用户名密码认证和手动凭证设置
+- **数据模型**: 完整的 TypeScript 接口定义
+- **错误处理**: 统一的响应格式和错误处理机制
+- **类型安全**: 全面的 TypeScript 类型定义
+
+#### 关键属性
+- `baseUrl`: API 基础 URL (`https://cos.cx/api/v1`)
+- `userId`: 当前认证用户的 ID
+- `token`: 认证令牌
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+
+## 架构概览
+
+系统采用分层架构设计,实现了关注点分离:
+
+```mermaid
+graph TB
+subgraph "表现层"
+UI[Telegram 机器人界面]
+CMD[命令处理器]
+end
+subgraph "业务逻辑层"
+BC[CosmoeClient<br/>核心业务逻辑]
+UT[工具函数<br/>数据验证]
+end
+subgraph "数据访问层"
+API[Cosmoe API<br/>RESTful 接口]
+KV[KV 存储<br/>凭证持久化]
+end
+subgraph "配置层"
+CFG[环境配置]
+LOG[日志系统]
+end
+UI --> CMD
+CMD --> BC
+BC --> API
+BC --> KV
+CMD --> KV
+BC --> CFG
+CMD --> LOG
+```
+
+**图表来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [index.ts](file://src/command/index.ts#L20-L110)
+
+## 详细组件分析
+
+### 认证机制
+
+#### getToken 方法
+负责用户身份验证,通过用户名和密码获取认证令牌。
+
+**方法签名**: `getToken(username: string, password: string): Promise<ApiResponse<TokenResponse>>`
+
+**参数**:
+- `username`: 用户名 (字符串)
+- `password`: 密码 (字符串)
+
+**返回值**: `ApiResponse<TokenResponse>`
+- `code`: HTTP 状态码
+- `msg`: 错误消息 (可选)
+- `data`: 包含 `user_id` 和 `token` 的响应数据
+
+**错误处理**:
+- 认证失败时抛出 `Error("Authentication required")`
+- 网络请求异常时返回统一的错误格式
+
+**使用示例路径**:
+- [登录处理器](file://src/command/handlers/login.ts#L47-L69)
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+- [login.ts](file://src/command/handlers/login.ts#L47-L69)
+
+#### setCredentials 和 getCredentials 方法
+提供手动设置和获取用户凭证的功能。
+
+**setCredentials 方法**:
+- 参数: `userId: number, token: string`
+- 功能: 手动设置认证信息
+- 返回: `void`
+
+**getCredentials 方法**:
+- 返回: `{ userId: number, token: string } | null`
+- 功能: 获取当前认证信息,如果未认证则返回 null
+
+**isAuthenticated 方法**:
+- 返回: `boolean`
+- 功能: 检查用户是否已认证
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L147-L171)
+
+### 用户管理功能
+
+#### getUserProfile 方法
+获取用户个人信息和统计信息。
+
+**方法签名**: `getUserProfile(): Promise<ApiResponse<UserProfile>>`
+
+**返回值**: `ApiResponse<UserProfile>`
+- `user_info`: 用户基本信息
+- `statistics`: 预约统计信息
+
+**UserProfile 接口**:
+- `user_info`: UserInfo 对象
+- `statistics`: Statistics 对象
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L308-L321)
+
+#### changePassword 方法
+修改用户密码。
+
+**方法签名**: `changePassword(currentPassword: string, newPassword: string): Promise<ApiResponse<any>>`
+
+**参数**:
+- `currentPassword`: 当前密码
+- `newPassword`: 新密码 (至少6个字符)
+
+**错误处理**:
+- 新密码长度不足时抛出 `Error("New password must be at least 6 characters")`
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L279-L301)
+
+#### register 方法
+注册新用户。
+
+**方法签名**: `register(key: string, username: string, email: string, password: string, userIdentity: string = "photographer"): Promise<ApiResponse<{ user_id: number, username: string }>>`
+
+**参数**:
+- `key`: 权限密钥 (联系管理员获取)
+- `username`: 用户名 (2-10字符,仅允许字母数字和下划线)
+- `email`: 邮箱地址
+- `password`: 密码 (至少6个字符)
+- `userIdentity`: 用户身份 (默认: "photographer")
+
+**返回值**: 注册成功的用户信息
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L487-L502)
+
+### 活动管理功能
+
+#### getEvents 方法
+获取活动列表。
+
+**方法签名**: `getEvents(): Promise<ApiResponse<Event[]>>`
+
+**返回值**: `ApiResponse<Event[]>`
+- `Event` 接口包含活动的基本信息
+
+**Event 接口字段**:
+- `id`: 活动ID (字符串)
+- `name`: 活动名称
+- `description`: 活动描述
+- `event_date`: 活动日期
+- `cover_image_url`: 封面图片URL
+- `description_brief`: 简短描述
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+
+#### getEventDetail 方法
+获取活动详细信息。
+
+**方法签名**: `getEventDetail(eventId: number | string): Promise<ApiResponse<EventDetail>>`
+
+**返回值**: `ApiResponse<EventDetail>`
+- `EventDetail` 接口包含活动的完整信息
+
+**EventDetail 接口字段**:
+- `id`: 活动ID (数字)
+- `name`: 活动名称
+- `description`: 活动描述
+- `event_date`: 活动日期
+- `time_slots_with_prices`: 时间段价格字符串
+- `cover_image_url`: 封面图片URL
+- `detail_image_urls`: 详情图片URL数组
+- `slots`: TimeSlot 数组
+- `allow_coupons`: 是否允许使用优惠券
+
+**TimeSlot 接口字段**:
+- `range`: 时间段范围 (如 "13:30-14:30")
+- `price`: 价格 (字符串格式)
+- `capacity`: 总容量
+- `remaining`: 剩余位置
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L191-L199)
+
+### 预约管理功能
+
+#### getMyBookings 方法
+获取用户的预约历史。
+
+**方法签名**: `getMyBookings(): Promise<ApiResponse<Booking[]>>`
+
+**返回值**: `ApiResponse<Booking[]>`
+- `Booking` 接口包含预约信息
+
+**Booking 接口字段**:
+- `id`: 预约ID
+- `status`: 预约状态
+- `booking_date`: 预约日期
+- `time_slot`: 时间段
+- `final_price`: 最终价格
+- `payment_order_id`: 支付订单ID
+- `notes_by_user`: 用户备注
+- `created_at`: 创建时间
+- `event_name`: 活动名称
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L226-L239)
+
+#### bookEvent 方法
+预订活动。
+
+**方法签名**: `bookEvent(bookingRequest: BookingRequest): Promise<ApiResponse<any>>`
+
+**参数**: `BookingRequest` 对象
+- `event_id`: 活动ID
+- `time_slot`: 时间段
+- `user_note`: 用户备注 (可选)
+- `coupon_code`: 优惠码 (可选)
+
+**返回值**: 预订结果
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L247-L270)
+
+#### 取消和修改功能
+
+##### cancelBooking 方法
+取消预约。
+
+**方法签名**: `cancelBooking(bookingId: number): Promise<ApiResponse<any>>`
+
+**参数**:
+- `bookingId`: 预约ID
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+##### updatePaymentOrder 方法
+更新支付订单ID。
+
+**方法签名**: `updatePaymentOrder(bookingId: number, paymentOrderId: string): Promise<ApiResponse<any>>`
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L352-L370)
+
+##### updateBookingNote 方法
+更新预约备注。
+
+**方法签名**: `updateBookingNote(bookingId: number, note: string): Promise<ApiResponse<any>>`
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L379-L397)
+
+##### selfReschedule 方法
+自助改期。
+
+**方法签名**: `selfReschedule(bookingId: number, newTimeSlot: string): Promise<ApiResponse<any>>`
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L431-L449)
+
+##### selfTransfer 方法
+自助转让。
+
+**方法签名**: `selfTransfer(bookingId: number, recipientUsername: string): Promise<ApiResponse<any>>`
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L458-L476)
+
+### 优惠券系统
+
+#### getAvailableCoupons 方法
+获取活动可用的优惠券。
+
+**方法签名**: `getAvailableCoupons(eventId: number | string): Promise<ApiResponse<Coupon[]>>`
+
+**返回值**: `ApiResponse<Coupon[]>`
+- `Coupon` 接口包含优惠券信息
+
+**Coupon 接口字段**:
+- `id`: 优惠券ID
+- `code`: 优惠码
+- `type`: 类型 ('percentage' 或 'fixed')
+- `value`: 优惠值
+- `valid_to`: 有效期
+
+**章节来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L329-L343)
+
+## 依赖关系分析
+
+### 外部依赖
+
+项目使用以下关键依赖:
+
+```mermaid
+graph LR
+subgraph "核心框架"
+G[grammy<br/>Telegram 机器人框架]
+C[conversations<br/>对话插件]
+S[storage-cloudflare<br/>KV存储]
+end
+subgraph "开发工具"
+V[vitest<br/>测试框架]
+W[wrangler<br/>Cloudflare Workers]
+T[typescript<br/>类型系统]
+end
+subgraph "项目模块"
+CC[CosmoeClient]
+HP[Handlers]
+CM[Commands]
+end
+G --> C
+G --> S
+V --> W
+CC --> HP
+HP --> CM
+```
+
+**图表来源**
+- [package.json](file://package.json#L18-L23)
+
+### 内部依赖关系
+
+```mermaid
+graph TB
+subgraph "客户端层"
+CC[CosmoeClient]
+MD[数据模型]
+end
+subgraph "命令层"
+LH[登录处理器]
+BH[预约处理器]
+EH[事件处理器]
+HH[历史处理器]
+CH[取消处理器]
+LOGH[登出处理器]
+end
+subgraph "存储层"
+KV[KV 存储]
+end
+CC --> MD
+LH --> CC
+BH --> CC
+EH --> CC
+HH --> CC
+CH --> CC
+LOGH --> CC
+CC --> KV
+LH --> KV
+BH --> KV
+CH --> KV
+```
+
+**图表来源**
+- [cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [login.ts](file://src/command/handlers/login.ts#L1-L74)
+
+**章节来源**
+- [package.json](file://package.json#L18-L23)
+
+## 性能考虑
+
+### 缓存策略
+- **认证缓存**: 使用 Cloudflare KV 存储用户凭证,避免重复认证
+- **数据缓存**: 在会话期间缓存常用数据,减少 API 调用频率
+- **连接复用**: 使用持久连接减少网络开销
+
+### 错误处理优化
+- **重试机制**: 对临时性错误实施指数退避重试
+- **超时控制**: 设置合理的请求超时时间
+- **降级策略**: 在 API 不可用时提供本地降级选项
+
+### 内存管理
+- **对象池**: 复用频繁创建的对象实例
+- **垃圾回收**: 及时清理不再使用的引用
+- **内存泄漏防护**: 确保事件监听器正确移除
+
+## 故障排除指南
+
+### 常见问题及解决方案
+
+#### 认证失败
+**症状**: `Authentication required` 错误
+**原因**: 凭证过期或无效
+**解决**: 
+1. 重新执行 `/login` 命令
+2. 检查用户名和密码
+3. 验证网络连接
+
+#### API 调用超时
+**症状**: 请求在合理时间内无响应
+**原因**: 网络延迟或服务器负载过高
+**解决**:
+1. 检查网络连接稳定性
+2. 实施重试机制
+3. 调整超时参数
+
+#### 数据格式错误
+**症状**: 解析响应时出现类型错误
+**原因**: API 响应格式变化
+**解决**:
+1. 更新数据模型定义
+2. 添加类型验证
+3. 实施向后兼容性检查
+
+### 调试技巧
+
+#### 日志记录
+- 启用详细的 API 调用日志
+- 记录请求和响应的完整内容
+- 监控错误发生的时间和频率
+
+#### 性能监控
+- 监控 API 响应时间
+- 跟踪内存使用情况
+- 分析并发请求处理能力
+
+**章节来源**
+- [login.ts](file://src/command/handlers/login.ts#L70-L73)
+- [bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L117)
+
+## 结论
+
+Cosmoe API 客户端模块是一个设计精良、功能完整的现代化 API 客户端库。它成功地将复杂的 API 交互逻辑封装在简洁易用的接口后面,同时保持了高度的类型安全和错误处理能力。
+
+### 主要优势
+- **模块化设计**: 清晰的关注点分离,便于维护和扩展
+- **类型安全**: 完整的 TypeScript 类型定义,提供编译时检查
+- **错误处理**: 统一的错误处理机制和用户友好的错误消息
+- **性能优化**: 合理的缓存策略和资源管理
+- **可测试性**: 清晰的接口设计,便于单元测试和集成测试
+
+### 技术亮点
+- 使用现代 JavaScript 特性 (async/await, TypeScript)
+- 采用分层架构设计
+- 实现了完整的认证和授权机制
+- 提供了丰富的数据模型和验证逻辑
+- 集成了 Cloudflare Workers 和 KV 存储
+
+### 未来改进方向
+- 添加更多的缓存策略
+- 实现更精细的错误分类和处理
+- 增加更多的监控和日志功能
+- 扩展对更多 API 功能的支持
+- 提供更丰富的配置选项
+
+该模块为构建可靠的 Telegram 机器人应用提供了坚实的基础,能够满足摄影活动预约系统的各种需求。

+ 501 - 0
.qoder/repowiki/zh/content/核心模块/命令处理器系统/命令处理器系统.md

@@ -0,0 +1,501 @@
+# 命令处理器系统
+
+<cite>
+**本文档引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概览](#架构概览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+
+本项目是一个基于 grammY 框架构建的 Telegram 机器人,专门用于摄影活动的预约管理系统。该系统实现了完整的命令路由机制、对话状态管理、用户认证流程以及与外部 Cosmoe API 的集成。
+
+系统的核心功能包括:
+- 用户认证与会话管理
+- 活动浏览与详情展示
+- 在线预约与优惠券使用
+- 预约历史查询与管理
+- 实时状态更新与通知
+
+## 项目结构
+
+项目采用模块化的文件组织方式,主要分为以下几个层次:
+
+```mermaid
+graph TB
+subgraph "应用入口层"
+A[src/index.ts]
+B[src/command/index.ts]
+end
+subgraph "命令处理器层"
+C[src/command/handlers/]
+C1[start.ts]
+C2[login.ts]
+C3[logout.ts]
+C4[events.ts]
+C5[eventDetails.ts]
+C6[bookEvent.ts]
+C7[history.ts]
+C8[cancel.ts]
+end
+subgraph "服务客户端层"
+D[src/client/cosmoe.ts]
+end
+subgraph "依赖管理"
+E[package.json]
+end
+A --> B
+B --> C
+C --> D
+E --> A
+E --> B
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [package.json](file://package.json#L1-L24)
+
+## 核心组件
+
+### 应用入口与初始化
+
+应用入口负责创建 Bot 实例、配置命令路由和设置 Webhook 回调。主要职责包括:
+
+- 初始化 grammY Bot 实例并配置 bot 信息
+- 设置命令菜单(setMyCommands)
+- 配置 Cloudflare Workers Webhook 回调
+- 启动定时任务调度器
+
+### 命令路由系统
+
+命令路由系统采用 grammY 的命令匹配机制,支持多种路由模式:
+
+- 标准命令路由:`bot.command("command_name")`
+- 文本匹配路由:`bot.hears(/pattern/)`
+- 回调查询路由:`bot.callbackQuery(/pattern/)`
+
+### 对话状态管理
+
+系统使用 @grammyjs/conversations 插件实现复杂的多步骤交互流程,包括:
+- 用户名密码输入对话
+- 优惠券选择对话
+- 取消确认对话
+- 自定义对话存储(Cloudflare KV)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L13-L47)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+## 架构概览
+
+系统采用分层架构设计,确保关注点分离和代码可维护性:
+
+```mermaid
+graph TB
+subgraph "Telegram 层"
+T[Telegram API]
+U[用户交互]
+end
+subgraph "Bot 层"
+B[grammY Bot]
+R[命令路由]
+C[对话管理]
+end
+subgraph "业务逻辑层"
+H[命令处理器]
+V[验证器]
+M[消息格式化]
+end
+subgraph "数据访问层"
+K[Cloudflare KV 存储]
+S[会话存储]
+end
+subgraph "外部服务层"
+P[Cosmoe API]
+A[摄影活动服务]
+end
+T --> B
+B --> R
+R --> C
+C --> H
+H --> K
+H --> S
+H --> P
+P --> A
+U -.-> T
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 详细组件分析
+
+### /start 命令处理器
+
+/start 命令提供基础的欢迎信息和帮助菜单,是用户交互的入口点。
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot
+participant H as start处理器
+participant C as CosmoeClient
+U->>B : /start
+B->>H : handleStartCommand(ctx)
+H->>C : 创建 CosmoeClient 实例
+H->>U : 发送欢迎消息
+Note over U,H : 显示可用命令列表
+```
+
+**图表来源**
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L4-L6)
+
+**章节来源**
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+
+### 认证流程系统
+
+认证系统包含完整的登录和登出流程,采用对话状态管理实现多步骤交互。
+
+#### 登录对话流程
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot
+participant L as 登录处理器
+participant C as CosmoeClient
+participant K as KV存储
+U->>B : /login
+B->>L : 进入登录对话
+L->>U : 请求用户名
+U->>L : 输入用户名
+L->>U : 请求密码
+U->>L : 输入密码
+L->>C : 调用getToken()
+C-->>L : 返回认证结果
+alt 认证成功
+L->>K : 存储凭证
+L->>U : 发送成功消息
+else 认证失败
+L->>U : 发送失败消息
+end
+```
+
+**图表来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+#### 登出处理器
+
+登出功能负责清理用户存储的认证信息,确保安全性。
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+
+### 活动管理系统
+
+活动浏览和详情展示功能提供了完整的摄影活动信息查询和展示能力。
+
+#### 活动列表查询
+
+```mermaid
+flowchart TD
+A[收到 /events 命令] --> B[创建 CosmoeClient 实例]
+B --> C[调用 getEvents()]
+C --> D{响应状态检查}
+D --> |成功| E[获取最新10个活动]
+D --> |失败| F[发送错误消息]
+E --> G[构建活动列表消息]
+G --> H[发送 Markdown 格式消息]
+F --> I[结束]
+H --> I[结束]
+```
+
+**图表来源**
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+
+#### 活动详情展示
+
+活动详情页面包含时间槽信息、价格显示和预约链接生成。
+
+**章节来源**
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+
+### 预约管理系统
+
+预约系统是最复杂的功能模块,包含多个子流程和状态管理。
+
+#### 预约处理流程
+
+```mermaid
+flowchart TD
+A[收到 /book_{event_id}_{slot_index}] --> B[解析参数]
+B --> C{验证用户登录}
+C --> |未登录| D[提示先登录]
+C --> |已登录| E[获取用户凭证]
+E --> F[调用 getEventDetail]
+F --> G{验证时间槽有效性}
+G --> |无效| H[发送无效消息]
+G --> |有效| I[检查优惠券]
+I --> J{有多张优惠券?}
+J --> |是| K[显示优惠券选择键盘]
+J --> |否| L[直接预订]
+K --> M[等待用户选择]
+M --> N[处理选择结果]
+N --> O[执行预订]
+L --> O
+H --> P[结束]
+D --> P
+O --> Q[发送预订结果]
+Q --> P
+```
+
+**图表来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+
+#### 优惠券选择机制
+
+系统支持动态优惠券选择,提供用户友好的交互体验。
+
+**章节来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+
+### 预约管理功能
+
+#### 历史记录查询
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot
+participant H as history处理器
+participant C as CosmoeClient
+participant K as KV存储
+U->>B : /history
+B->>H : handleHistoryCommand(ctx, env)
+H->>K : 获取用户凭证
+K-->>H : 返回凭证数据
+H->>C : 设置凭证并验证
+C->>C : 调用 getMyBookings()
+C-->>H : 返回预订历史
+H->>H : 格式化历史消息
+H->>U : 发送历史记录
+```
+
+**图表来源**
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+
+#### 取消预约流程
+
+取消预约采用双重确认机制,确保用户意图明确。
+
+**章节来源**
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+
+## 依赖关系分析
+
+系统依赖关系清晰,遵循单一职责原则:
+
+```mermaid
+graph TB
+subgraph "grammY 生态系统"
+G[grammy@1.39.3]
+GC[@grammyjs/conversations@2.1.1]
+GS[@grammyjs/storage-cloudflare@2.4.2]
+end
+subgraph "应用层"
+A[src/index.ts]
+B[src/command/index.ts]
+C[src/command/handlers/]
+D[src/client/cosmoe.ts]
+end
+subgraph "Cloudflare 平台"
+CK[KV 存储]
+CW[Webhook]
+CS[Scheduled 任务]
+end
+G --> A
+GC --> B
+GS --> B
+A --> B
+B --> C
+C --> D
+D --> CK
+A --> CW
+A --> CS
+```
+
+**图表来源**
+- [package.json](file://package.json#L18-L22)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+**章节来源**
+- [package.json](file://package.json#L1-L24)
+
+## 性能考虑
+
+### 存储优化
+
+系统采用 Cloudflare KV 存储实现高可用性和低延迟的数据访问:
+
+- **会话存储**:使用自定义 KV 适配器实现对话状态持久化
+- **凭证存储**:安全存储用户认证信息,支持快速检索
+- **错误处理**:完善的异常捕获和日志记录机制
+
+### API 调用优化
+
+- **批量数据限制**:活动列表限制为最新 10 条,避免超长消息
+- **条件查询**:根据活动日期和状态进行智能过滤
+- **缓存策略**:合理使用 API 缓存减少重复请求
+
+### 内存管理
+
+- **对话生命周期**:自动清理过期对话状态
+- **资源释放**:及时释放网络连接和内存资源
+- **错误恢复**:优雅处理 API 调用失败情况
+
+## 故障排除指南
+
+### 常见问题诊断
+
+#### 认证相关问题
+
+**问题症状**:用户无法登录或登录后立即失效
+**可能原因**:
+- API 凭证存储失败
+- 网络连接不稳定
+- 用户名密码错误
+
+**解决方案**:
+- 检查 KV 存储连接状态
+- 验证 API 端点可达性
+- 确认用户凭据正确性
+
+#### 预约功能异常
+
+**问题症状**:预约失败或状态不更新
+**可能原因**:
+- 用户未登录就尝试预约
+- 时间槽已满
+- 优惠券无效
+
+**解决方案**:
+- 引导用户先完成登录
+- 提示选择其他时间槽
+- 验证优惠券有效性
+
+#### 数据同步问题
+
+**问题症状**:用户看到过期的活动信息
+**可能原因**:
+- API 缓存未及时更新
+- 本地状态不同步
+
+**解决方案**:
+- 清除相关缓存
+- 强制刷新数据
+- 检查网络连接
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L70-L74)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L118)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L103-L107)
+
+## 结论
+
+本命令处理器系统展现了现代聊天机器人开发的最佳实践:
+
+### 技术优势
+
+- **模块化设计**:清晰的文件组织和职责分离
+- **状态管理**:完善的对话状态和会话持久化
+- **错误处理**:全面的异常捕获和用户反馈
+- **扩展性**:易于添加新命令和功能模块
+
+### 架构特点
+
+- **分层架构**:关注点分离,便于维护和测试
+- **插件化设计**:grammy 生态系统的充分利用
+- **云原生**:基于 Cloudflare 平台的无服务器架构
+- **API 集成**:与外部服务的无缝对接
+
+### 改进建议
+
+1. **监控增强**:添加更详细的性能指标和错误追踪
+2. **国际化支持**:扩展多语言支持能力
+3. **测试覆盖**:增加单元测试和集成测试
+4. **文档完善**:补充详细的 API 文档和使用指南
+
+## 附录
+
+### 命令参考表
+
+| 命令 | 功能描述 | 触发条件 |
+|------|----------|----------|
+| /start | 欢迎界面和帮助菜单 | 用户首次使用或手动触发 |
+| /login | 用户登录认证 | 未认证用户 |
+| /logout | 用户登出并清除信息 | 已认证用户 |
+| /events | 查看最新摄影活动 | 任意时间 |
+| /event_{id} | 查看活动详情 | 匹配活动链接 |
+| /book_{event_id}_{slot_index} | 预约指定时间槽 | 活动详情页面 |
+| /history | 查看预约历史 | 已认证用户 |
+| /cancel_{booking_id} | 取消指定预约 | 历史记录页面 |
+
+### 开发最佳实践
+
+1. **错误处理**:始终包含 try-catch 块和用户友好的错误消息
+2. **输入验证**:对所有用户输入进行严格验证
+3. **状态管理**:合理使用对话状态,避免状态泄漏
+4. **API 调用**:实现重试机制和超时处理
+5. **日志记录**:记录关键操作和错误信息便于调试
+6. **安全性**:保护敏感数据,使用 HTTPS 和适当的权限控制
+
+### 扩展开发指南
+
+#### 添加新命令的步骤
+
+1. **创建处理器文件**:在 `src/command/handlers/` 下创建新文件
+2. **实现业务逻辑**:编写命令处理函数
+3. **注册路由**:在 `src/command/index.ts` 中注册新命令
+4. **测试验证**:编写测试用例并验证功能
+5. **文档更新**:更新相关文档和注释
+
+#### 对话状态管理最佳实践
+
+1. **状态设计**:设计清晰的状态转换图
+2. **数据持久化**:确保重要状态能够持久化
+3. **超时处理**:实现合理的对话超时机制
+4. **错误恢复**:提供状态恢复和清理机制

+ 453 - 0
.qoder/repowiki/zh/content/核心模块/命令处理器系统/命令路由机制.md

@@ -0,0 +1,453 @@
+# 命令路由机制
+
+<cite>
+**本文档引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概览](#架构概览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+
+本项目是一个基于 grammY 框架构建的 Telegram 机器人,专门用于摄影活动的预约管理。系统实现了完整的命令路由机制,支持多种路由模式包括标准命令路由、文本匹配路由和回调查询路由。
+
+该机器人提供了完整的摄影活动管理功能,包括活动浏览、预约管理、用户认证、历史记录查看等核心业务功能。通过精心设计的路由机制,系统能够高效地处理各种用户交互场景。
+
+## 项目结构
+
+项目采用模块化架构设计,主要分为以下几个核心层次:
+
+```mermaid
+graph TB
+subgraph "应用入口层"
+A[src/index.ts]
+end
+subgraph "命令路由层"
+B[src/command/index.ts]
+end
+subgraph "处理器层"
+C[src/command/handlers/]
+C1[start.ts]
+C2[login.ts]
+C3[events.ts]
+C4[eventDetails.ts]
+C5[bookEvent.ts]
+C6[cancel.ts]
+C7[history.ts]
+C8[logout.ts]
+end
+subgraph "客户端层"
+D[src/client/cosmoe.ts]
+end
+subgraph "配置层"
+E[package.json]
+end
+A --> B
+B --> C
+C --> D
+A --> E
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [package.json](file://package.json#L1-L24)
+
+## 核心组件
+
+### grammY 框架集成
+
+系统基于 grammY 框架构建,集成了以下核心功能:
+
+- **Bot 实例管理**:创建并配置 Telegram Bot 实例
+- **Webhook 支持**:通过 Cloudflare Workers 提供 webhook 回调
+- **对话插件**:使用 @grammyjs/conversations 实现多步骤交互
+- **KV 存储**:集成 Cloudflare KV 进行数据持久化
+
+### 命令路由系统
+
+系统实现了三种主要的路由模式:
+
+1. **标准命令路由**:使用 `/command` 格式的命令
+2. **文本匹配路由**:使用正则表达式匹配特定格式的消息
+3. **回调查询路由**:处理内联键盘的回调操作
+
+**章节来源**
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+## 架构概览
+
+系统采用分层架构设计,各层职责明确,耦合度低:
+
+```mermaid
+graph TB
+subgraph "Telegram 层"
+T1[用户消息]
+T2[回调查询]
+end
+subgraph "路由层"
+R1[command() 路由]
+R2[hears() 路由]
+R3[callbackQuery() 路由]
+end
+subgraph "处理器层"
+H1[事件详情处理器]
+H2[预约处理器]
+H3[取消处理器]
+H4[历史记录处理器]
+H5[登录处理器]
+end
+subgraph "业务逻辑层"
+B1[Cosmoe API 客户端]
+B2[数据验证]
+B3[错误处理]
+end
+subgraph "存储层"
+S1[KV 存储]
+S2[会话存储]
+end
+T1 --> R1
+T1 --> R2
+T2 --> R3
+R1 --> H1
+R1 --> H2
+R1 --> H3
+R1 --> H4
+R1 --> H5
+R2 --> H1
+R2 --> H2
+R3 --> H3
+R3 --> H2
+H1 --> B1
+H2 --> B1
+H3 --> B1
+H4 --> B1
+H5 --> B1
+B1 --> S1
+H1 --> S2
+H2 --> S2
+H3 --> S2
+H4 --> S2
+H5 --> S2
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L59-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 详细组件分析
+
+### 命令路由机制详解
+
+#### 标准命令路由
+
+系统支持多种标准命令,每种命令都有对应的处理器:
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot
+participant H as 处理器
+participant C as CosmoeClient
+U->>B : /start
+B->>H : handleStartCommand
+H-->>U : 欢迎消息
+U->>B : /login
+B->>H : handleInteractiveLogin
+H->>C : 获取用户凭据
+C-->>H : 返回结果
+H-->>U : 登录结果
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L59-L66)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L4-L6)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+
+#### 文本匹配路由(正则表达式)
+
+系统使用正则表达式实现智能路由匹配:
+
+##### 活动详情路由
+```mermaid
+flowchart TD
+A[/event_123] --> B{正则匹配}
+B --> |成功| C[提取活动ID]
+B --> |失败| D[忽略消息]
+C --> E[调用事件详情处理器]
+E --> F[获取活动详情]
+F --> G[格式化响应]
+G --> H[发送消息]
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L72-L75)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L10-L14)
+
+##### 预约路由
+```mermaid
+flowchart TD
+A[/book_123_456] --> B{正则匹配}
+B --> |成功| C[提取活动ID和时段索引]
+B --> |失败| D[忽略消息]
+C --> E[验证用户登录状态]
+E --> F[获取活动详情]
+F --> G[检查时段有效性]
+G --> H[处理优惠券选择]
+H --> I[执行预约操作]
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L77-L80)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L17-L58)
+
+##### 取消预约路由
+```mermaid
+flowchart TD
+A[/cancel_789] --> B{正则匹配}
+B --> |成功| C[提取预约ID]
+B --> |失败| D[忽略消息]
+C --> E[验证用户登录状态]
+E --> F[获取用户预约列表]
+F --> G[查找指定预约]
+G --> H[生成确认键盘]
+H --> I[发送确认消息]
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L86-L89)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L17-L58)
+
+#### 回调查询路由
+
+系统使用回调查询处理内联键盘交互:
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot
+participant K as 内联键盘
+participant H as 回调处理器
+participant C as CosmoeClient
+U->>B : 点击确认取消按钮
+B->>K : 触发回调查询
+K->>H : handleCancelConfirmation
+H->>C : 执行取消操作
+C-->>H : 返回取消结果
+H-->>U : 显示操作结果
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L91-L97)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L132)
+
+### 参数提取机制
+
+系统采用正则表达式实现精确的参数提取:
+
+#### 活动详情参数提取
+- 正则模式:`/^\/event_(.+)$/
+- 提取内容:活动ID(捕获组1)
+- 使用场景:`/event_123` → 提取 `123`
+
+#### 预约参数提取
+- 正则模式:`/^\/book_(\d+)_(\d+)$/
+- 提取内容:
+  - 捕获组1:活动ID
+  - 捕获组2:时段索引
+- 使用场景:`/book_123_456` → 提取 `123` 和 `456`
+
+#### 取消参数提取
+- 正则模式:`/^\/cancel_(\d+)$/
+- 提取内容:预约ID(捕获组1)
+- 使用场景:`/cancel_789` → 提取 `789`
+
+**章节来源**
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L10-L13)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L17-L20)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L17-L19)
+
+### 错误处理策略
+
+系统实现了多层次的错误处理机制:
+
+#### 输入验证错误
+- 检查消息文本是否存在
+- 验证正则表达式匹配结果
+- 处理参数类型转换错误
+
+#### 认证状态检查
+- 验证用户登录状态
+- 检查 KV 存储中的用户凭据
+- 处理认证失败情况
+
+#### API 调用错误
+- 捕获网络请求异常
+- 处理 API 响应错误
+- 提供友好的错误提示
+
+#### 业务逻辑错误
+- 验证活动状态和可用性
+- 检查时段的有效性
+- 处理库存不足等业务异常
+
+**章节来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L13-L33)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L21-L43)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L7-L29)
+
+## 依赖关系分析
+
+### 外部依赖
+
+系统依赖以下关键库:
+
+```mermaid
+graph LR
+subgraph "核心框架"
+A[grammy v1.39.3]
+B[@grammyjs/conversations v2.1.1]
+C[@grammyjs/storage-cloudflare v2.4.2]
+end
+subgraph "项目模块"
+D[命令路由模块]
+E[处理器模块]
+F[客户端模块]
+G[存储模块]
+end
+A --> D
+B --> D
+C --> G
+D --> E
+E --> F
+F --> G
+```
+
+**图表来源**
+- [package.json](file://package.json#L18-L22)
+
+### 内部模块依赖
+
+```mermaid
+graph TB
+subgraph "入口模块"
+A[src/index.ts]
+end
+subgraph "命令模块"
+B[src/command/index.ts]
+end
+subgraph "处理器模块"
+C[src/command/handlers/]
+C1[事件详情]
+C2[预约处理]
+C3[取消处理]
+C4[历史记录]
+C5[登录处理]
+end
+subgraph "客户端模块"
+D[src/client/cosmoe.ts]
+end
+A --> B
+B --> C
+C --> D
+C --> B
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+**章节来源**
+- [package.json](file://package.json#L18-L22)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+## 性能考虑
+
+### 路由性能优化
+
+1. **正则表达式优化**:使用预编译的正则表达式避免重复编译
+2. **早期返回机制**:在条件不满足时立即返回,减少不必要的处理
+3. **缓存策略**:合理使用 KV 存储减少重复查询
+
+### 内存管理
+
+1. **会话存储**:使用 Cloudflare KV 进行会话数据持久化
+2. **资源清理**:及时清理不再使用的变量和对象
+3. **错误恢复**:实现健壮的错误恢复机制
+
+### 并发处理
+
+1. **异步处理**:所有路由处理器都支持异步操作
+2. **并发限制**:合理控制同时处理的请求数量
+3. **超时处理**:为长时间运行的操作设置超时机制
+
+## 故障排除指南
+
+### 常见问题及解决方案
+
+#### 命令不响应
+- 检查命令是否正确注册到路由系统
+- 验证 Bot 权限设置
+- 确认 webhook 配置正确
+
+#### 正则表达式匹配失败
+- 验证输入格式是否符合预期
+- 检查正则表达式语法
+- 确认消息文本编码正确
+
+#### 认证失败
+- 验证用户凭据存储是否正常
+- 检查 KV 存储连接状态
+- 确认 API 密钥有效性
+
+#### API 调用错误
+- 检查网络连接状态
+- 验证 API 端点可达性
+- 确认请求参数格式正确
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L68-L73)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L117)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L128-L131)
+
+## 结论
+
+本项目展示了如何在 grammY 框架下构建一个功能完整、架构清晰的 Telegram 机器人。通过精心设计的命令路由机制,系统能够高效地处理各种用户交互场景。
+
+### 主要优势
+
+1. **模块化设计**:清晰的分层架构便于维护和扩展
+2. **灵活的路由机制**:支持多种路由模式适应不同场景
+3. **完善的错误处理**:多层次的错误处理确保系统稳定性
+4. **云原生架构**:充分利用 Cloudflare Workers 的特性
+
+### 技术亮点
+
+1. **正则表达式路由**:实现智能的消息匹配和参数提取
+2. **回调查询处理**:提供流畅的用户交互体验
+3. **会话管理**:支持复杂的多步骤业务流程
+4. **KV 存储集成**:实现数据持久化和状态管理
+
+该系统为类似的聊天机器人项目提供了良好的参考模板,展示了现代 WebAssembly 技术在聊天机器人开发中的应用潜力。

+ 288 - 0
.qoder/repowiki/zh/content/核心模块/命令处理器系统/对话状态管理.md

@@ -0,0 +1,288 @@
+# 对话状态管理
+
+<cite>
+**本文引用的文件**
+- [package.json](file://package.json)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [tsconfig.json](file://tsconfig.json)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件围绕对话状态管理系统进行系统性说明,重点覆盖以下方面:
+- @grammyjs/conversations 插件的安装与配置
+- KV 存储适配器的实现与会话数据持久化
+- createConversation 的使用与会话生命周期管理
+- conversationStorage 对象的 read、write、delete 方法实现及与 Cloudflare KV 的集成
+- 会话超时处理、并发访问控制与数据恢复策略的最佳实践
+
+该系统基于 Cloudflare Workers 运行环境,通过 KV 命名空间实现会话状态的跨请求持久化,并结合 @grammyjs/conversations 提供的对话能力,为用户提供交互式流程(如登录)的状态管理。
+
+## 项目结构
+该项目采用按功能模块划分的组织方式,核心入口在 src/index.ts,命令注册与对话定义集中在 src/command/index.ts,业务处理器分布在 src/command/handlers 下,API 客户端封装在 src/client/cosmoe.ts 中。Wrangler 配置文件定义了 KV 绑定与运行参数。
+
+```mermaid
+graph TB
+subgraph "Cloudflare Workers"
+A["src/index.ts<br/>Bot 入口与 Webhook 回调"]
+B["src/command/index.ts<br/>命令注册与对话插件安装"]
+C["src/command/handlers/*.ts<br/>业务处理器"]
+D["src/client/cosmoe.ts<br/>Cosmoe API 客户端"]
+end
+subgraph "KV 命名空间"
+E["COSMOE_CREDENTIALS<br/>用户凭证 KV"]
+F["COSMOE_STORAGE<br/>会话状态 KV"]
+end
+A --> B
+B --> C
+C --> D
+B --> E
+B --> F
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L46)
+- [src/command/index.ts](file://src/command/index.ts#L1-L102)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L46)
+- [src/command/index.ts](file://src/command/index.ts#L1-L102)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 核心组件
+- @grammyjs/conversations 插件:提供对话能力与状态持久化接口,支持自定义存储适配器。
+- @grammyjs/storage-cloudflare:Cloudflare KV 适配器,用于将会话状态读写到 KV。
+- KV 命名空间绑定:通过 Wrangler 在运行环境中暴露 COSMOE_CREDENTIALS(用户凭证)与 COSMOE_STORAGE(会话状态)两个 KV。
+- 会话存储适配器:在命令模块中以对象形式实现 read/write/delete,内部委托给 KV 适配器并进行 JSON 序列化/反序列化。
+- 业务处理器:登录、预约、历史、取消等命令处理器,部分场景下直接读写 KV,部分场景下通过对话状态完成交互。
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+
+## 架构总览
+下图展示了从请求进入 Worker 到对话状态持久化的整体流程,以及与 KV 的交互。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant W as "Worker 入口<br/>src/index.ts"
+participant B as "Bot 实例<br/>grammy"
+participant C as "命令注册与对话插件<br/>src/command/index.ts"
+participant K as "KV 命名空间<br/>COSMOE_STORAGE/COSMOE_CREDENTIALS"
+participant A as "API 客户端<br/>src/client/cosmoe.ts"
+U->>W : "HTTP 请求Webhook"
+W->>B : "初始化 Bot 并设置命令菜单"
+B->>C : "加载命令与对话插件"
+C->>C : "安装 conversations 插件storage=conversationStorage"
+U->>B : "发送 /login"
+B->>C : "路由到 login 对话"
+C->>K : "读取会话状态JSON 反序列化"
+C->>U : "提示输入用户名/密码"
+U->>C : "回复用户名/密码"
+C->>A : "调用 Cosmoe API 获取 token"
+A-->>C : "返回 token"
+C->>K : "写入会话状态JSON 序列化"
+C-->>U : "返回登录结果"
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+## 详细组件分析
+
+### 会话存储适配器与 KV 集成
+- KV 适配器:使用 @grammyjs/storage-cloudflare 的 KvAdapter,传入 COSMOE_STORAGE KV 命名空间,作为会话状态的后端存储。
+- conversationStorage 对象:实现 read/write/delete 三个方法,内部通过 KV 适配器读写字符串值,并对会话对象进行 JSON 序列化/反序列化。
+- 错误处理:在读写过程中捕获异常并记录日志,读取失败返回 undefined,写入失败仅记录错误,保证对话流程不中断。
+- 与 Cloudflare KV 的集成:通过 Wrangler 的 kv_namespaces 将 COSMOE_STORAGE 绑定到 Worker 运行时,确保在运行时可通过 env.COSMOE_STORAGE 访问。
+
+```mermaid
+flowchart TD
+Start(["进入 conversationStorage 方法"]) --> Op{"操作类型?"}
+Op --> |read| ReadKV["调用 KvAdapter.read(key)"]
+ReadKV --> Parse{"返回值存在?"}
+Parse --> |是| ParseJSON["JSON.parse(value)"]
+Parse --> |否| ReturnUndef["返回 undefined"]
+ParseJSON --> End(["结束"])
+Op --> |write| Serialize["JSON.stringify(value)"]
+Serialize --> WriteKV["调用 KvAdapter.write(key, serialized)"]
+WriteKV --> End
+Op --> |delete| DelKV["调用 KvAdapter.delete(key)"]
+DelKV --> End
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+### createConversation 使用与会话生命周期
+- 注册对话:通过 createConversation 定义一个名为 "login" 的对话,传入对话回调函数与名称。
+- 启动对话:在命令处理器中调用 ctx.conversation.enter("login") 进入对话。
+- 生命周期管理:对话在 enter 时开始,等待用户输入(conversation.wait),收到消息后继续执行,直至对话回调返回。
+- 状态持久化:对话状态在每次交互前后自动读写 KV,确保跨请求保持一致。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant C as "对话处理器<br/>login.ts"
+participant S as "会话存储<br/>conversationStorage"
+U->>B : "/login"
+B->>C : "enter('login')"
+C->>S : "读取会话状态首次可能为空"
+C->>U : "提示输入用户名"
+U->>C : "回复用户名"
+C->>S : "写入会话状态保存用户名"
+C->>U : "提示输入密码"
+U->>C : "回复密码"
+C->>S : "写入会话状态保存密码"
+C-->>U : "返回处理结果"
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+### 会话超时处理、并发访问控制与数据恢复策略
+- 超时处理:当前实现未显式设置会话过期时间。建议在 conversationStorage.write 中为 KV 写入设置 TTL 或在应用层维护过期键,以便定期清理陈旧会话。
+- 并发访问控制:@grammyjs/conversations 默认在单个会话内串行处理消息,避免并发冲突;但多个会话之间仍可能并发访问 KV。建议在业务关键路径(如写入凭证)增加幂等检查或使用分布式锁(例如基于 KV 的原子操作)。
+- 数据恢复策略:读取 KV 失败时返回 undefined,对话可从初始状态继续;写入失败仅记录错误,不影响后续流程。建议在关键写入点增加重试与回退逻辑,并在异常时向用户提示。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+
+### 登录对话与凭证存储
+- 登录流程:对话中依次收集用户名与密码,随后调用 Cosmoe API 获取 token。
+- 凭证存储:成功获取 token 后,将用户标识、token 与时间戳写入 COSMOE_CREDENTIALS KV,键为 Telegram 用户 ID。
+- 读取凭证:后续命令(如取消预约)会从 COSMOE_CREDENTIALS 读取凭证,初始化客户端并执行业务操作。
+
+```mermaid
+flowchart TD
+LStart["进入登录对话"] --> AskU["提示输入用户名"]
+AskU --> GetUser["等待用户回复"]
+GetUser --> SaveU["保存用户名到会话状态"]
+SaveU --> AskP["提示输入密码"]
+AskP --> GetP["等待用户回复"]
+GetP --> CallAPI["调用 Cosmoe API 获取 token"]
+CallAPI --> Check{"认证成功?"}
+Check --> |是| PutKV["写入 COSMOE_CREDENTIALS KV"]
+PutKV --> Done["返回登录成功"]
+Check --> |否| Fail["返回登录失败"]
+```
+
+图表来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+### 预约、历史与取消流程中的 KV 使用
+- 预约流程:解析命令参数,读取用户凭证,调用 API 获取活动详情与可用优惠券,根据选择自动下单或展示优惠券选择键盘。
+- 历史查询:读取用户凭证,调用 API 获取预约历史并格式化输出。
+- 取消流程:读取用户凭证,调用 API 取消预约,并提供二次确认回调处理。
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+
+## 依赖关系分析
+- 运行时依赖:grammy、@grammyjs/conversations、@grammyjs/storage-cloudflare。
+- 配置依赖:Wrangler 将 KV 命名空间绑定到 Worker 环境,TS 类型声明由 worker-configuration.d.ts 提供。
+- 模块耦合:命令模块依赖对话插件与 KV 适配器;业务处理器既可直接使用 KV,也可通过对话状态间接使用 KV。
+
+```mermaid
+graph LR
+P["package.json<br/>依赖声明"] --> G["@grammyjs/conversations"]
+P --> GC["@grammyjs/storage-cloudflare"]
+P --> GM["grammy"]
+W["wrangler.jsonc<br/>KV 绑定"] --> E["COSMOE_CREDENTIALS"]
+W --> F["COSMOE_STORAGE"]
+CI["src/command/index.ts"] --> G
+CI --> GC
+CI --> E
+CI --> F
+LG["src/command/handlers/login.ts"] --> CI
+BE["src/command/handlers/bookEvent.ts"] --> CI
+HI["src/command/handlers/history.ts"] --> CI
+CA["src/command/handlers/cancel.ts"] --> CI
+CL["src/client/cosmoe.ts"] --> GM
+```
+
+图表来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [src/command/index.ts](file://src/command/index.ts#L1-L102)
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [src/command/index.ts](file://src/command/index.ts#L1-L102)
+
+## 性能考量
+- KV 读写成本:KV 读写为网络 IO,建议减少不必要的频繁写入,合并状态更新。
+- 序列化开销:会话对象的 JSON 序列化/反序列化在高频交互中可能带来 CPU 开销,建议控制会话状态体量。
+- 并发与锁:多会话并发写入 KV 时,建议引入轻量级锁或幂等写入策略,避免竞争条件。
+- 缓存与 TTL:为 KV 设置合理的 TTL,降低陈旧数据占用空间;对热点数据可考虑本地缓存(需注意一致性)。
+
+## 故障排查指南
+- 会话读取失败:检查 conversationStorage.read 是否正确捕获异常并返回 undefined;确认 KV 命名空间绑定是否正确。
+- 会话写入失败:检查 conversationStorage.write 是否记录错误;确认 KV 写入权限与命名空间 ID。
+- 凭证读取失败:确认 COSMOE_CREDENTIALS 中是否存在对应用户的键;检查键名是否为 Telegram 用户 ID。
+- API 调用异常:在业务处理器中捕获并记录错误,向用户反馈通用提示,避免泄露敏感信息。
+- 日志与可观测性:启用 Wrangler 的 observability,结合 Cloudflare Workers 日志定位问题。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L25-L49)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L70-L74)
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+
+## 结论
+本系统通过 @grammyjs/conversations 与 @grammyjs/storage-cloudflare 的组合,实现了可靠的对话状态持久化与交互式流程管理。KV 命名空间的合理使用使得会话状态与用户凭证得以跨请求保持一致。为进一步提升稳定性与性能,建议补充会话过期策略、并发控制与数据恢复机制,并持续优化 KV 访问模式与错误处理策略。
+
+## 附录
+- 安装与配置要点
+  - 依赖安装:确保 @grammyjs/conversations 与 @grammyjs/storage-cloudflare 已添加至依赖。
+  - KV 绑定:在 Wrangler 中为 COSMOE_STORAGE 与 COSMOE_CREDENTIALS 配置正确的命名空间 ID。
+  - 类型声明:确保 TS 项目包含 worker-configuration.d.ts,以便在编译期识别 KV 类型。
+- 最佳实践清单
+  - 会话超时:为 KV 写入设置 TTL,定期清理陈旧会话。
+  - 并发控制:在关键写入路径增加幂等检查或分布式锁。
+  - 数据恢复:读取失败时优雅降级,写入失败时记录并提示用户重试。
+  - 错误处理:统一捕获与记录错误,避免将内部错误细节暴露给用户。
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [tsconfig.json](file://tsconfig.json#L39-L42)

+ 399 - 0
.qoder/repowiki/zh/content/核心模块/命令处理器系统/核心命令处理器.md

@@ -0,0 +1,399 @@
+# 核心命令处理器
+
+<cite>
+**本文档引用的文件**
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概览](#架构概览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+
+本文件详细解析了 Cosmoe 摄影会 Telegram 机器人的核心命令处理器,重点分析 `/start`、`/login`、`/logout` 三个基础命令的实现逻辑。该机器人基于 GramJS 和 @grammyjs/conversations 插件构建,提供了完整的用户认证、活动管理和预约功能。
+
+系统采用模块化设计,每个命令都有独立的处理器文件,通过统一的命令注册入口进行管理。核心特性包括:
+- 交互式对话式登录流程
+- 安全的凭据存储和会话管理
+- 用户友好的欢迎界面和帮助菜单
+- 基于 Cloudflare KV 的分布式状态存储
+
+## 项目结构
+
+项目采用按功能模块组织的结构,核心命令处理器位于 `src/command/handlers/` 目录下:
+
+```mermaid
+graph TB
+subgraph "命令系统"
+CMD_INDEX[src/command/index.ts<br/>命令注册入口]
+subgraph "命令处理器"
+START[start.ts<br/>欢迎命令]
+LOGIN[login.ts<br/>登录命令]
+LOGOUT[logout.ts<br/>登出命令]
+EVENTS[events.ts<br/>活动查询]
+HISTORY[history.ts<br/>历史记录]
+end
+subgraph "客户端层"
+CLIENT[cosmoe.ts<br/>API客户端]
+end
+CMD_INDEX --> START
+CMD_INDEX --> LOGIN
+CMD_INDEX --> LOGOUT
+CMD_INDEX --> EVENTS
+CMD_INDEX --> HISTORY
+START --> CLIENT
+LOGIN --> CLIENT
+LOGOUT --> CLIENT
+EVENTS --> CLIENT
+HISTORY --> CLIENT
+end
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+
+**章节来源**
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+## 核心组件
+
+### 命令注册系统
+
+主命令注册文件负责初始化整个命令系统,包括对话插件配置、环境变量绑定和命令路由设置。
+
+**关键特性:**
+- 使用 @grammyjs/conversations 插件实现对话式交互
+- 基于 Cloudflare KV 的分布式存储解决方案
+- 统一的环境变量接口设计
+- 清晰的命令路由映射
+
+### 交互式对话框架
+
+系统采用对话式设计模式,为复杂的多步骤操作提供结构化的用户体验:
+
+```mermaid
+sequenceDiagram
+participant User as 用户
+participant Bot as 机器人
+participant Conv as 对话系统
+participant API as Cosmoe API
+User->>Bot : /login
+Bot->>Conv : 进入登录对话
+Conv->>User : 请输入用户名
+User->>Conv : 用户名
+Conv->>User : 请输入密码
+User->>Conv : 密码
+Conv->>API : 验证凭据
+API-->>Conv : 认证结果
+alt 认证成功
+Conv->>User : 登录成功消息
+Conv->>KV : 存储凭据
+else 认证失败
+Conv->>User : 错误提示
+end
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+
+**章节来源**
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+
+## 架构概览
+
+系统采用分层架构设计,确保关注点分离和代码可维护性:
+
+```mermaid
+graph TB
+subgraph "应用层"
+BOT[Telegram Bot]
+CONV[对话系统]
+end
+subgraph "业务逻辑层"
+CMD[命令处理器]
+AUTH[认证服务]
+DATA[数据服务]
+end
+subgraph "数据访问层"
+KV[Cloudflare KV]
+API[Cosmoe API]
+end
+BOT --> CONV
+CONV --> CMD
+CMD --> AUTH
+CMD --> DATA
+AUTH --> KV
+DATA --> API
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+
+## 详细组件分析
+
+### /start 命令处理器
+
+/start 命令是用户首次交互的主要入口,负责提供欢迎信息和基本导航指导。
+
+#### 功能特性
+
+**欢迎界面构建:**
+- 提供清晰的项目介绍和价值主张
+- 展示可用命令列表和功能概览
+- 使用简洁明了的语言风格
+
+**帮助菜单生成:**
+- 列出核心功能命令
+- 提供快速导航链接
+- 支持 Markdown 格式化显示
+
+**用户引导流程:**
+- 新用户友好提示
+- 登录状态检查
+- 功能权限说明
+
+#### 实现细节
+
+处理器通过简单的文本回复实现,无需外部依赖,确保快速响应和低复杂度。
+
+**章节来源**
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+
+### /login 命令处理器
+
+/login 命令实现了完整的交互式认证流程,基于 @grammyjs/conversations 插件提供多轮对话体验。
+
+#### 交互式认证对话实现
+
+**对话流程设计:**
+1. **用户名输入请求** - 引导用户提供用户名
+2. **密码输入请求** - 引导用户提供密码(隐私保护)
+3. **凭据验证** - 调用 Cosmoe API 进行认证
+4. **会话建立** - 成功后存储凭据并建立会话
+
+#### 凭据验证和会话建立
+
+**验证流程:**
+- 初始化 CosmoeClient 实例
+- 调用 getToken 方法进行认证
+- 检查返回结果的状态码和数据完整性
+- 处理认证失败的情况
+
+**会话建立机制:**
+- 将用户 ID 和令牌存储到 Cloudflare KV
+- 包含时间戳用于后续验证
+- 使用 Telegram 用户 ID 作为键值
+
+#### 错误处理策略
+
+**异常情况处理:**
+- 空用户名或密码输入
+- API 调用失败
+- KV 存储异常
+- 用户身份获取失败
+
+**用户反馈机制:**
+- 清晰的错误消息
+- 取消操作的优雅处理
+- 系统内部错误的降级处理
+
+```mermaid
+flowchart TD
+START([开始登录]) --> GET_USERNAME["请求用户名输入"]
+GET_USERNAME --> WAIT_USERNAME["等待用户响应"]
+WAIT_USERNAME --> CHECK_USERNAME{"用户名有效?"}
+CHECK_USERNAME --> |否| CANCEL_LOGIN["取消登录流程"]
+CHECK_USERNAME --> |是| GET_PASSWORD["请求密码输入"]
+GET_PASSWORD --> WAIT_PASSWORD["等待密码响应"]
+WAIT_PASSWORD --> CHECK_PASSWORD{"密码有效?"}
+CHECK_PASSWORD --> |否| CANCEL_LOGIN
+CHECK_PASSWORD --> |是| AUTHENTICATE["调用API认证"]
+AUTHENTICATE --> AUTH_RESULT{"认证成功?"}
+AUTH_RESULT --> |否| SHOW_ERROR["显示认证失败消息"]
+AUTH_RESULT --> |是| STORE_CREDENTIALS["存储用户凭据"]
+STORE_CREDENTIALS --> SUCCESS["显示成功消息"]
+CANCEL_LOGIN --> END([结束])
+SHOW_ERROR --> END
+SUCCESS --> END
+```
+
+**图表来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L18-L74)
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+### /logout 命令处理器
+
+/logout 命令负责安全地清理用户会话状态,确保敏感信息不会在服务器端残留。
+
+#### 会话清理机制
+
+**清理流程:**
+1. **用户身份验证** - 获取 Telegram 用户 ID
+2. **凭据存在性检查** - 验证用户是否已登录
+3. **凭据删除** - 从 KV 存储中移除用户凭据
+4. **确认消息** - 向用户确认登出成功
+
+#### 安全退出机制
+
+**安全考虑:**
+- 基于用户身份的精确删除
+- 防止未授权访问
+- 清理客户端侧的认证状态
+- 避免敏感信息泄露
+
+**错误恢复:**
+- KV 删除失败的处理
+- 用户身份获取失败的降级
+- 系统内部错误的优雅处理
+
+```mermaid
+sequenceDiagram
+participant User as 用户
+participant Bot as 机器人
+participant KV as KV存储
+participant Client as 客户端
+User->>Bot : /logout
+Bot->>Bot : 获取用户ID
+Bot->>KV : 检查凭据存在性
+KV-->>Bot : 返回检查结果
+alt 凭据存在
+Bot->>KV : 删除用户凭据
+KV-->>Bot : 确认删除成功
+Bot->>User : 显示登出成功消息
+else 凭据不存在
+Bot->>User : 提示先登录
+end
+```
+
+**图表来源**
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L34)
+
+**章节来源**
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+
+## 依赖关系分析
+
+系统依赖关系清晰明确,遵循单一职责原则:
+
+```mermaid
+graph LR
+subgraph "外部依赖"
+GRAMMY[grammy]
+CONV[@grammyjs/conversations]
+KV[Cloudflare KV]
+end
+subgraph "内部模块"
+CMD_INDEX[命令注册]
+START_HANDLER[start处理器]
+LOGIN_HANDLER[login处理器]
+LOGOUT_HANDLER[logout处理器]
+COSMOE_CLIENT[Cosmoe客户端]
+end
+CMD_INDEX --> START_HANDLER
+CMD_INDEX --> LOGIN_HANDLER
+CMD_INDEX --> LOGOUT_HANDLER
+START_HANDLER --> COSMOE_CLIENT
+LOGIN_HANDLER --> COSMOE_CLIENT
+LOGOUT_HANDLER --> COSMOE_CLIENT
+CMD_INDEX --> CONV
+CMD_INDEX --> KV
+LOGIN_HANDLER --> KV
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L1-L11)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L3)
+
+**章节来源**
+- [src/command/index.ts](file://src/command/index.ts#L1-L11)
+
+## 性能考虑
+
+### 响应时间优化
+
+- **命令处理器简单化**:start 命令直接返回预定义消息,无外部调用
+- **异步操作最小化**:login 和 logout 操作使用异步处理避免阻塞
+- **缓存策略**:通过 KV 存储减少重复认证请求
+
+### 资源管理
+
+- **内存使用**:对话系统按需加载,避免长期占用
+- **网络请求**:API 调用使用连接池复用
+- **存储效率**:KV 存储采用键值对形式,便于快速检索
+
+## 故障排除指南
+
+### 常见问题及解决方案
+
+**登录失败问题:**
+- 检查用户名和密码格式
+- 验证 API 服务可用性
+- 确认用户凭据正确性
+
+**登出失败问题:**
+- 确认用户已登录状态
+- 检查 KV 存储权限
+- 验证用户身份识别
+
+**命令无响应问题:**
+- 检查网络连接状态
+- 验证 Telegram Bot Token
+- 确认命令注册正常
+
+### 错误日志分析
+
+系统在关键位置添加了详细的错误日志记录,便于问题诊断:
+
+- API 调用异常
+- KV 存储操作失败
+- 用户身份获取错误
+- 对话系统异常
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L70-L73)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L30-L33)
+
+## 结论
+
+核心命令处理器展现了现代聊天机器人开发的最佳实践:
+
+**设计优势:**
+- 模块化架构便于维护和扩展
+- 交互式对话提升用户体验
+- 分布式存储确保数据一致性
+- 清晰的错误处理机制
+
+**技术特点:**
+- 基于 TypeScript 的类型安全
+- 异步编程模型提高性能
+- 插件化架构支持功能扩展
+- 完善的错误处理策略
+
+**扩展建议:**
+- 添加更多认证方式支持
+- 实现更丰富的用户界面
+- 增强会话状态管理
+- 扩展通知和提醒功能
+
+该系统为类似的企业级聊天机器人项目提供了良好的参考模板,其模块化设计和清晰的职责分离使其易于维护和扩展。

+ 432 - 0
.qoder/repowiki/zh/content/核心模块/命令处理器系统/活动管理命令.md

@@ -0,0 +1,432 @@
+# 活动管理命令
+
+<cite>
+**本文引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能与缓存策略](#性能与缓存策略)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录:扩展开发指南](#附录扩展开发指南)
+
+## 简介
+本文件聚焦于活动管理相关命令的实现与扩展,重点解析以下命令:
+- /events:活动列表获取、分页显示、筛选排序与交互式导航(当前实现为“最近活动”列表)
+- /event_{id}:活动详情查询、图片展示、时间安排与报名状态显示
+- /book_{event_id}_{slot_index}:基于活动详情的预约流程(含优惠券选择)
+- /history:用户预约历史展示
+- /cancel_{booking_id}:预约取消确认与执行
+- /login:基于会话的交互式登录,凭据持久化至 KV
+
+同时,文档阐述活动数据的缓存策略、API 调用优化与错误处理机制,并提供活动搜索、过滤与个性化推荐的扩展开发建议。
+
+## 项目结构
+项目采用按功能模块划分的目录组织方式,命令入口集中于命令索引文件,各命令处理器位于独立文件中,客户端封装统一的 API 客户端。
+
+```mermaid
+graph TB
+subgraph "入口与配置"
+IDX["src/index.ts<br/>Bot 初始化与命令注册"]
+CMDIDX["src/command/index.ts<br/>命令注册与会话配置"]
+end
+subgraph "命令处理器"
+EVT["src/command/handlers/events.ts<br/>/events 列表"]
+DET["src/command/handlers/eventDetails.ts<br/>/event_{id} 详情"]
+BOOK["src/command/handlers/bookEvent.ts<br/>/book_* 预约与优惠券"]
+HIST["src/command/handlers/history.ts<br/>/history 历史"]
+CANCEL["src/command/handlers/cancel.ts<br/>/cancel_* 取消"]
+LOGIN["src/command/handlers/login.ts<br/>/login 交互式登录"]
+end
+subgraph "客户端"
+CLIENT["src/client/cosmoe.ts<br/>CosmoeClient 封装"]
+end
+IDX --> CMDIDX
+CMDIDX --> EVT
+CMDIDX --> DET
+CMDIDX --> BOOK
+CMDIDX --> HIST
+CMDIDX --> CANCEL
+CMDIDX --> LOGIN
+EVT --> CLIENT
+DET --> CLIENT
+BOOK --> CLIENT
+HIST --> CLIENT
+CANCEL --> CLIENT
+LOGIN --> CLIENT
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+## 核心组件
+- 命令注册与会话配置:在命令索引中完成命令绑定、会话插件安装与 KV 存储适配。
+- 事件命令处理器:负责获取活动列表并以 Markdown 格式输出,支持最多 10 条最近活动。
+- 事件详情处理器:解析 /event_{id},调用详情接口,格式化时间安排、剩余容量与预约链接。
+- 预约处理器:解析 /book_{event_id}_{slot_index},读取用户凭据,校验时段可用性,支持优惠券选择与自动下单。
+- 历史与取消:历史命令展示用户最近预约记录;取消命令提供二次确认与回调处理。
+- 登录处理器:通过交互式会话获取用户名与密码,调用认证接口并将凭据写入 KV。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+
+## 架构总览
+下图展示了从用户输入到 API 调用与响应处理的整体流程,以及关键组件之间的依赖关系。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot(grammy)"
+participant C as "命令处理器"
+participant K as "KV 存储"
+participant API as "CosmoeClient(API)"
+U->>B : "/events"
+B->>C : "handleEventsCommand"
+C->>API : "getEvents()"
+API-->>C : "返回活动列表"
+C-->>U : "Markdown 格式的活动列表"
+U->>B : "/event_{id}"
+B->>C : "handleEventDetails"
+C->>API : "getEventDetail(id)"
+API-->>C : "返回活动详情"
+C-->>U : "Markdown 格式的详情(含图片、时间安排、预约链接)"
+U->>B : "/book_{event_id}_{slot_index}"
+B->>C : "handleBookEvent"
+C->>K : "读取用户凭据"
+K-->>C : "返回凭据(JSON)"
+C->>API : "getEventDetail(id)"
+API-->>C : "返回活动详情"
+C->>API : "bookEvent(含可选优惠券)"
+API-->>C : "返回预约结果"
+C-->>U : "预约成功/失败消息"
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L68-L80)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L26)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L60)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L117)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L199)
+
+## 详细组件分析
+
+### /events 命令:活动列表获取与展示
+- 功能要点
+  - 调用 CosmoeClient 的活动列表接口,取回最新活动。
+  - 限制输出数量为前 10 条,避免消息过长。
+  - 使用 Markdown 格式输出,包含每个活动的跳转链接(/event_{id})。
+- 错误处理
+  - 当 API 返回非 200 或无数据时,提示“当前没有摄影活动”。
+  - 异常捕获后回复“获取摄影活动时出错,请稍后再试”。
+
+```mermaid
+flowchart TD
+Start(["进入 /events"]) --> CallAPI["调用 getEvents()"]
+CallAPI --> RespOK{"返回 code==200 且有数据?"}
+RespOK -- 否 --> NoEvents["回复: 当前没有摄影活动"]
+RespOK -- 是 --> SliceTop10["取前 10 条活动"]
+SliceTop10 --> BuildMsg["构建 Markdown 消息"]
+BuildMsg --> Reply["发送消息"]
+NoEvents --> End(["结束"])
+Reply --> End
+```
+
+图表来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L26)
+
+章节来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+
+### /eventDetails 命令:活动详情、图片与时间安排
+- 功能要点
+  - 解析 /event_{id},调用 CosmoeClient 的详情接口。
+  - 格式化标题、日期、时间段与剩余容量,生成 Markdown 消息。
+  - 对于当天或之前的活动,显示“预约 -> /book_{event_id}_{slot_index}”链接。
+  - 展示封面图链接。
+- 时间与状态判断
+  - 使用北京时间(UTC+8)比较活动日期与当前日期,决定是否允许预约。
+  - 时间段按 range 排序,保证展示顺序一致。
+- 错误处理
+  - API 非 200 或异常时,回复错误消息并记录日志。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H as "eventDetails 处理器"
+participant API as "CosmoeClient"
+U->>B : "/event_{id}"
+B->>H : "handleEventDetails"
+H->>API : "getEventDetail(id)"
+API-->>H : "返回活动详情"
+H->>H : "计算是否可预约(按北京时间比较)"
+H->>H : "按 range 排序时间段"
+H-->>U : "Markdown 格式详情(含图片与预约链接)"
+```
+
+图表来源
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L60)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L199)
+
+章节来源
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L36-L50)
+
+### /bookEvent 命令:预约流程与优惠券选择
+- 功能要点
+  - 解析 /book_{event_id}_{slot_index},读取 KV 中的用户凭据。
+  - 获取活动详情,按 range 排序时间段,校验所选索引与剩余容量。
+  - 若存在多个可用优惠券,弹出内联键盘供用户选择;否则自动使用唯一优惠券或不使用。
+  - 调用预约接口,返回最终价格、预约编号等信息。
+- 回调处理
+  - 通过回调选择优惠券后,更新消息并继续执行预约。
+- 错误处理
+  - 凭据缺失、无效索引、已满等情况均给出明确提示。
+  - 异常捕获后回复“处理预约请求时出错,请稍后再试”。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant HB as "handleBookEvent"
+participant HK as "handleCouponSelection"
+participant API as "CosmoeClient"
+participant KV as "KV 存储"
+U->>B : "/book_{event_id}_{slot_index}"
+B->>HB : "处理预约请求"
+HB->>KV : "读取用户凭据"
+KV-->>HB : "返回凭据(JSON)"
+HB->>API : "getEventDetail(event_id)"
+API-->>HB : "返回活动详情"
+HB->>HB : "校验索引与剩余容量"
+alt 多个优惠券
+HB-->>U : "内联键盘选择优惠券"
+U->>B : "回调 : 选择优惠券"
+B->>HK : "handleCouponSelection"
+HK->>API : "getEventDetail(event_id)"
+API-->>HK : "返回活动详情"
+HK->>API : "bookEvent(含优惠券)"
+API-->>HK : "返回预约结果"
+HK-->>U : "更新消息并回复结果"
+else 单个/无优惠券
+HB->>API : "bookEvent(可选优惠券)"
+API-->>HB : "返回预约结果"
+HB-->>U : "回复预约结果"
+end
+```
+
+图表来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L117)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L159-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L270)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L329-L343)
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L270)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L329-L343)
+
+### /history 命令:预约历史展示
+- 功能要点
+  - 读取 KV 中用户凭据,初始化 CosmoeClient 并设置认证信息。
+  - 获取用户预约历史,按预约日期降序取前 8 条,拼接 Markdown 消息。
+  - 对未来且未完成的预约,附加取消链接(/cancel_{booking_id})。
+- 时间处理
+  - 统一转换为北京时间进行比较,确保逻辑一致性。
+- 错误处理
+  - 凭据缺失、认证失败、API 失败等情况均有明确提示。
+
+章节来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L226-L239)
+
+### /cancel 命令:预约取消与确认
+- 功能要点
+  - 解析 /cancel_{booking_id},读取用户凭据,获取历史确认待取消的预约。
+  - 弹出内联键盘“确认/取消”,点击后执行取消或取消操作。
+  - 取消成功/失败均反馈消息。
+- 错误处理
+  - 未登录、无效 ID、认证失败、API 失败等情况均有提示。
+
+章节来源
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+### /login 命令:交互式登录与凭据存储
+- 功能要点
+  - 通过会话交互获取用户名与密码,调用 CosmoeClient.getToken 获取 user_id 与 token。
+  - 将凭据以 JSON 形式写入 KV,键为 Telegram 用户 ID,便于后续命令使用。
+- 错误处理
+  - 输入缺失、认证失败、KV 写入异常等情况均有提示。
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+## 依赖关系分析
+- 命令层依赖
+  - 所有命令处理器依赖 CosmoeClient 进行 API 调用。
+  - /bookEvent、/history、/cancel、/login 依赖 KV 存储读写用户凭据。
+  - /login 依赖会话插件实现交互式对话。
+- 客户端依赖
+  - CosmoeClient 封装了基础 URL、认证状态管理与多类 API 方法。
+- 入口依赖
+  - Bot 初始化与命令注册集中在入口文件,命令索引文件负责会话与回调注册。
+
+```mermaid
+graph LR
+EVT["events.ts"] --> CLI["cosmoe.ts:getEvents"]
+DET["eventDetails.ts"] --> CLI
+BOOK["bookEvent.ts"] --> CLI
+HIST["history.ts"] --> CLI
+CANCEL["cancel.ts"] --> CLI
+LOGIN["login.ts"] --> CLI
+BOOK --> KV["KV 存储(COSMOE_CREDENTIALS)"]
+HIST --> KV
+CANCEL --> KV
+LOGIN --> KV
+CMDIDX["command/index.ts"] --> EVT
+CMDIDX --> DET
+CMDIDX --> BOOK
+CMDIDX --> HIST
+CMDIDX --> CANCEL
+CMDIDX --> LOGIN
+```
+
+图表来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 性能与缓存策略
+- 当前实现
+  - /events 仅取最新 10 条,减少消息长度与渲染压力。
+  - /eventDetails 对时间段按 range 排序,提升一致性与可读性。
+  - /history 仅取最近 8 条,避免超长消息。
+- 缓存建议
+  - 活动列表与详情可引入短期缓存(如 TTL 5-10 分钟),结合 KV 或内存缓存,降低重复请求。
+  - 对热门活动的图片与描述可考虑本地镜像或 CDN 缓存,减少网络抖动影响。
+- API 优化
+  - 在客户端层增加重试与退避策略,针对瞬时网络错误提升成功率。
+  - 对批量请求(如历史)可合并为单次调用,减少往返次数。
+- 错误处理
+  - 所有命令均包含 try/catch 与条件分支,确保异常不影响整体服务稳定性。
+  - KV 读写失败时记录错误并优雅降级,避免阻塞主流程。
+
+[本节为通用性能建议,不直接分析具体文件,故无章节来源]
+
+## 故障排查指南
+- 常见问题定位
+  - /events 无结果:检查 API 返回码与数据结构,确认网络连通性与服务端状态。
+  - /eventDetails 报错:确认传入的 id 是否正确,检查 API 返回字段映射。
+  - /bookEvent 提示未登录:确认 KV 中是否存在对应 Telegram 用户的凭据。
+  - /history 为空:确认用户已登录且存在预约记录。
+  - /cancel 失败:确认预约状态与时间窗口(需为未来且未完成)。
+- 日志与调试
+  - 所有处理器均包含错误日志打印,便于定位问题。
+  - 建议在生产环境开启更详细的日志级别与错误追踪。
+
+章节来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L23-L26)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L57-L60)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L30-L33)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L14-L18)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L28-L32)
+
+## 结论
+本项目围绕活动管理构建了完整的命令体系,覆盖活动浏览、详情查看、预约、历史与取消等核心流程。当前实现简洁可靠,具备良好的错误处理与用户体验。为进一步增强系统能力,可在现有基础上引入缓存、搜索过滤与个性化推荐等扩展功能。
+
+[本节为总结性内容,不直接分析具体文件,故无章节来源]
+
+## 附录:扩展开发指南
+
+### 活动搜索与过滤
+- 搜索建议
+  - 在 CosmoeClient 中新增搜索接口,支持关键词、日期范围、状态等参数。
+  - 在命令层新增 /search 命令,解析参数并调用搜索接口,返回匹配结果列表。
+- 过滤建议
+  - 支持按“可预约”、“已结束”、“本周/本月”等维度过滤。
+  - 在 UI 层提供内联按钮快速切换过滤条件。
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L26)
+
+### 分页显示与交互式导航
+- 分页建议
+  - 在活动列表接口中支持 page/size 参数,命令层维护当前页码与翻页按钮。
+  - 使用内联键盘提供“上一页/下一页”与“直达页码”按钮。
+- 导航建议
+  - 在详情页提供“返回列表”与“下一活动”的快捷跳转。
+  - 对热门活动提供“收藏/取消收藏”功能(结合 KV 存储用户偏好)。
+
+章节来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L9-L10)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L40-L45)
+
+### 个性化推荐
+- 推荐策略
+  - 基于用户历史预约与偏好(如时间段、摄影师)生成候选集。
+  - 在 /events 列表中优先展示推荐项,并标注“为你推荐”。
+- 数据来源
+  - 通过 /history 与 /bookEvent 的数据统计,结合 KV 存储用户标签。
+
+章节来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L49-L52)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L128-L135)
+
+### 缓存与性能优化
+- 缓存策略
+  - 活动列表与详情设置 TTL,命中缓存时减少 API 调用。
+  - 对图片与静态资源使用 CDN 缓存,缩短加载时间。
+- 重试与退避
+  - 对瞬时网络错误实施指数退避重试,提升成功率。
+- 错误隔离
+  - 将 KV 读写与 API 调用置于独立模块,便于监控与限流。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L22-L49)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)

+ 361 - 0
.qoder/repowiki/zh/content/核心模块/命令处理器系统/预约与取消命令.md

@@ -0,0 +1,361 @@
+# 预约与取消命令
+
+<cite>
+**本文档引用的文件**
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向“预约与取消命令”的完整业务流程,深入解析以下命令:
+- 预约流程:/bookEvent(活动选择、时间槽确认、优惠券应用、用户确认和最终预订)
+- 历史查询:/history(预约记录获取、状态筛选、分页展示和详情查看)
+- 取消流程:/cancel(预约确认、取消原因选择、退款处理和状态更新)
+
+同时解释回调查询处理、按钮交互和实时状态更新机制,并提供预约冲突检测、容量管理与通知推送的扩展实现建议。
+
+## 项目结构
+该机器人基于 GrammY 框架构建,采用模块化命令处理器与 Cloudflare Workers 运行环境。核心目录与职责如下:
+- src/command/index.ts:注册命令与回调查询,配置对话式会话存储(KV)
+- src/command/handlers/*:各命令处理器(事件列表、活动详情、预约、历史、取消、登录、登出等)
+- src/client/cosmoe.ts:封装对 Cosmoe API 的调用(认证、事件、预约、取消等)
+- src/scheduler/index.ts:定时任务(新活动通知推送)
+- wrangler.jsonc:Cloudflare Workers 配置(KV 绑定、计划任务)
+- package.json:依赖与脚本
+
+```mermaid
+graph TB
+subgraph "Telegram 机器人"
+CMD["命令入口<br/>src/command/index.ts"]
+HANDLERS["命令处理器<br/>src/command/handlers/*"]
+SCHED["定时任务<br/>src/scheduler/index.ts"]
+end
+subgraph "客户端"
+CLIENT["Cosmoe 客户端<br/>src/client/cosmoe.ts"]
+end
+subgraph "Cloudflare Workers"
+KV["KV 存储<br/>COSMOE_CREDENTIALS/COSMOE_STORAGE"]
+TRIG["计划任务触发器<br/>*/1 * * * *"]
+end
+CMD --> HANDLERS
+HANDLERS --> CLIENT
+SCHED --> CLIENT
+HANDLERS --> KV
+SCHED --> KV
+TRIG --> SCHED
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 核心组件
+- 命令注册与会话存储:通过 KV 适配器实现对话状态持久化,支持登录对话、回调查询处理与命令路由。
+- Cosmoe 客户端:统一封装认证、事件查询、预约、取消、历史查询等 API 调用。
+- 定时任务:周期性检查新活动并推送通知给已登录用户。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+## 架构总览
+下图展示了从用户输入到 API 调用与 KV 存储的整体流程。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Telegram Bot"
+participant C as "命令处理器"
+participant K as "KV 存储"
+participant API as "Cosmoe API"
+U->>B : 发送命令/回调
+B->>C : 路由到对应处理器
+C->>K : 读取/写入用户凭证与会话
+C->>API : 调用事件/预约/取消接口
+API-->>C : 返回结果
+C-->>U : 发送消息/内联键盘
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 详细组件分析
+
+### 预约流程:/bookEvent
+- 输入格式:/book_{event_id}_{slot_index}
+- 关键步骤:
+  1) 解析命令参数,提取活动 ID 与时间槽索引
+  2) 从 KV 获取用户凭证并校验登录状态
+  3) 调用 Cosmoe API 获取活动详情与时间槽
+  4) 校验时间槽剩余容量
+  5) 查询可用优惠券,若多于一个则弹出内联键盘供用户选择
+  6) 用户确认后发起预约请求,返回最终价格、预约编号等信息
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H as "bookEvent 处理器"
+participant K as "KV 存储"
+participant API as "Cosmoe API"
+U->>B : /book_{event_id}_{slot_index}
+B->>H : 路由到处理函数
+H->>K : 读取用户凭证
+H->>API : 获取活动详情与时间槽
+API-->>H : 返回活动数据
+H->>H : 校验剩余容量
+H->>API : 查询可用优惠券
+API-->>H : 返回优惠券列表
+alt 多个优惠券
+H-->>U : 弹出内联键盘选择优惠券
+U->>B : 回调选择优惠券
+B->>H : 处理回调
+else 单个或无优惠券
+H->>H : 自动选择/不使用优惠券
+end
+H->>API : 提交预约请求
+API-->>H : 返回预约结果
+H-->>U : 成功/失败消息
+```
+
+图表来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L160-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L270)
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L160-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L270)
+
+### 历史查询:/history
+- 功能要点:
+  - 获取用户登录态,调用历史接口
+  - 对预约按时间倒序排序,限制展示数量
+  - 为可取消且未来时间的预约生成取消链接
+  - 支持 Markdown 格式输出,避免超长消息截断
+
+```mermaid
+flowchart TD
+Start(["进入 /history"]) --> GetUser["获取 Telegram 用户ID"]
+GetUser --> CheckCreds{"KV 中存在凭证?"}
+CheckCreds --> |否| PromptLogin["提示先登录"]
+CheckCreds --> |是| InitClient["初始化 Cosmoe 客户端"]
+InitClient --> FetchBookings["获取我的预约历史"]
+FetchBookings --> HasData{"有数据?"}
+HasData --> |否| EmptyMsg["提示历史为空"]
+HasData --> |是| SortLimit["按时间倒序并限制数量"]
+SortLimit --> BuildMsg["构建 Markdown 消息"]
+BuildMsg --> CancelLink{"满足可取消条件?"}
+CancelLink --> |是| AddLink["添加取消链接"]
+CancelLink --> |否| SkipLink["跳过"]
+AddLink --> SendMsg["发送消息"]
+SkipLink --> SendMsg
+PromptLogin --> End(["结束"])
+EmptyMsg --> End
+SendMsg --> End
+```
+
+图表来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L226-L239)
+
+章节来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L226-L239)
+
+### 取消流程:/cancel
+- 输入格式:/cancel_{booking_id}
+- 关键步骤:
+  1) 解析命令参数,获取预约 ID
+  2) 校验登录态并获取用户历史
+  3) 在历史中定位目标预约,构造确认内联键盘
+  4) 用户点击确认后,调用取消接口并更新消息
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H as "cancel 处理器"
+participant API as "Cosmoe API"
+U->>B : /cancel_{booking_id}
+B->>H : 路由到处理函数
+H->>API : 获取我的预约历史
+API-->>H : 返回历史列表
+H->>H : 定位目标预约
+H-->>U : 弹出确认内联键盘
+U->>B : 点击“确认”或“取消”
+B->>H : 处理回调
+alt 确认取消
+H->>API : 调用取消接口
+API-->>H : 返回结果
+H-->>U : 更新为成功/失败消息
+else 取消操作
+H-->>U : 提示操作已取消
+end
+```
+
+图表来源
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+章节来源
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L132)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L405-L422)
+
+### 回调查询与按钮交互
+- 回调类型:
+  - 取消确认:confirm_cancel_{booking_id} 或 cancel_action
+  - 优惠券选择:select_coupon_{event_id}_{slot_index}_{coupon_code|none}
+- 处理逻辑:
+  - 解析回调数据,校验用户登录态
+  - 读取活动详情与时间槽,更新消息内容
+  - 执行预约或取消操作并反馈结果
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L92-L105)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L160-L226)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L132)
+
+### 实时状态更新机制
+- 当前实现:
+  - 历史查询中根据当前北京时间判断是否可取消,但未实现自动刷新
+  - 定时任务用于推送新活动通知,未包含预约状态变更通知
+- 建议扩展:
+  - 在历史查询中增加“刷新”按钮,调用相同接口并重新渲染
+  - 在定时任务中加入“预约状态变更通知”,向用户推送取消/完成状态变化
+
+章节来源
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L68-L92)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L84)
+
+## 依赖关系分析
+- 命令入口依赖各处理器模块,处理器依赖 Cosmoe 客户端与 KV 存储
+- 定时任务依赖 Cosmoe 客户端与 KV 存储,通过计划任务触发器运行
+- Cloudflare Workers 配置定义 KV 绑定与计划任务
+
+```mermaid
+graph LR
+IDX["命令入口<br/>src/command/index.ts"] --> H_BOOK["预约处理器<br/>src/command/handlers/bookEvent.ts"]
+IDX --> H_CANCEL["取消处理器<br/>src/command/handlers/cancel.ts"]
+IDX --> H_HISTORY["历史处理器<br/>src/command/handlers/history.ts"]
+H_BOOK --> CLIENT["Cosmoe 客户端<br/>src/client/cosmoe.ts"]
+H_CANCEL --> CLIENT
+H_HISTORY --> CLIENT
+SCHED["定时任务<br/>src/scheduler/index.ts"] --> CLIENT
+SCHED --> KV["KV 存储"]
+IDX --> KV
+WRANGLER["Workers 配置<br/>wrangler.jsonc"] --> KV
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 性能考虑
+- KV 读写:会话与凭证均通过 KV 存储,注意控制读写频率与错误重试
+- API 调用:事件与历史接口可能返回大量数据,需在前端做分页与截断
+- Markdown 渲染:消息长度超过限制时应截断,避免 Telegram API 报错
+- 定时任务:每分钟触发一次,需确保任务执行时间短、异常处理完备
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L94-L102)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+## 故障排除指南
+- 认证失败
+  - 症状:提示需要登录或凭证无效
+  - 排查:确认 /login 是否成功写入 KV;检查凭证有效期
+- 预约失败
+  - 症状:提示预约失败或无空位
+  - 排查:检查时间槽剩余容量;确认优惠券是否可用
+- 取消失败
+  - 症状:取消请求返回失败
+  - 排查:确认预约状态是否允许取消;检查网络与 API 返回
+- 消息超长
+  - 症状:历史消息被截断
+  - 排查:减少展示条数或分页展示
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L69)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L60-L63)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L120-L124)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L94-L102)
+
+## 结论
+本系统以清晰的模块化设计实现了完整的预约与取消流程,结合 KV 会话存储与回调交互,提供了良好的用户体验。建议后续增强实时状态更新与通知推送能力,进一步提升用户参与度与满意度。
+
+## 附录
+
+### 命令与回调一览
+- 命令
+  - /start:欢迎与帮助
+  - /login:交互式登录
+  - /logout:登出并清除凭证
+  - /events:查看最新活动
+  - /event_{id}:查看活动详情与预约入口
+  - /book_{event_id}_{slot_index}:发起预约
+  - /history:查看预约历史
+  - /cancel_{booking_id}:发起取消
+- 回调
+  - confirm_cancel_{booking_id}:确认取消
+  - cancel_action:取消取消
+  - select_coupon_{event_id}_{slot_index}_{coupon_code|none}:选择优惠券
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L59-L109)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L160-L226)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L87-L132)
+
+### 扩展实现建议
+- 预约冲突检测
+  - 在提交预约前,查询用户当前未完成的预约,避免重复占用同一时间槽
+- 容量管理
+  - 在活动详情页显示更直观的剩余/容量比例,必要时提供“占位”或“候补”机制
+- 通知推送
+  - 新增“预约状态变更通知”:完成、取消、过期等状态变化时主动推送
+  - 新活动通知:现有定时任务已实现,可扩展为按用户偏好定制推送
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L84)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L270)

+ 472 - 0
.qoder/repowiki/zh/content/核心模块/核心模块.md

@@ -0,0 +1,472 @@
+# 核心模块
+
+<cite>
+**本文引用的文件**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/index.ts](file://src/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [package.json](file://package.json)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [tsconfig.json](file://tsconfig.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向 Cosmoe Bot 的核心模块,系统性梳理以下方面:
+- API 客户端模块(cosmoe.ts)的封装设计、认证机制与错误处理策略
+- 命令处理器系统(命令路由、对话状态管理、KV 存储)
+- 用户认证系统(登录流程、会话与凭证存储)
+- 活动管理系统(数据获取、展示与交互)
+- 预约管理系统(业务流程、时间槽管理、优惠券联动)
+- 模块间依赖关系与协作模式
+- 接口定义、配置项、使用示例与最佳实践
+
+## 项目结构
+该项目采用按功能域划分的目录组织方式,核心代码位于 src 目录下:
+- client:对外 API 客户端封装
+- command:Telegram Bot 命令与对话处理
+- scheduler:定时任务(新活动推送)
+- 入口与部署:src/index.ts、wrangler.jsonc、package.json
+
+```mermaid
+graph TB
+A["src/index.ts<br/>入口与 Webhook/定时触发"] --> B["src/command/index.ts<br/>命令注册与对话插件"]
+B --> C["src/command/handlers/*.ts<br/>命令处理器"]
+A --> D["src/scheduler/index.ts<br/>定时任务"]
+C --> E["src/client/cosmoe.ts<br/>API 客户端"]
+D --> E
+E --> F["外部 API: https://cos.cx/api/v1<br/>事件/预约/用户相关接口"]
+B --> G["KV: COSMOE_CREDENTIALS/COSMOE_STORAGE<br/>凭证与会话/状态存储"]
+D --> G
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+## 核心组件
+- API 客户端(CosmoeClient)
+  - 职责:封装对 Cosmoe 后端 API 的调用,统一响应格式、认证参数传递与错误处理
+  - 关键能力:登录、事件查询、活动详情、个人资料、预约历史、预约、改价/备注/取消/转赠等
+  - 认证:支持手动设置 user_id/token 或通过 getToken 获取并缓存
+- 命令与对话系统
+  - 职责:注册命令、建立对话(会话)、KV 存储对话状态、路由到具体处理器
+  - 组件:命令注册器、登录对话、各命令处理器(活动列表、详情、预约、历史、取消、登出)
+- 定时任务
+  - 职责:周期性检查新活动并推送通知给已登录用户
+- 配置与运行环境
+  - 依赖:Grammy、@grammyjs/conversations、@grammyjs/storage-cloudflare
+  - 部署:Wrangler(Cloudflare Workers),KV 命名空间绑定
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 架构总览
+整体交互链路如下:
+- 用户在 Telegram 中发送命令或回调,由入口函数接收并交由命令系统处理
+- 命令系统根据路由进入相应处理器,必要时读取 KV 中的用户凭证
+- 处理器通过 CosmoeClient 调用后端 API,返回结果并构造消息回复
+- 定时任务周期性拉取活动列表,筛选新活动并向已登录用户推送
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant W as "入口(src/index.ts)"
+participant CMD as "命令系统(src/command/index.ts)"
+participant H as "处理器(如 login/events/bookEvent)"
+participant KV as "KV(COSMOE_CREDENTIALS/STORAGE)"
+participant API as "CosmoeClient"
+participant S as "后端API(cos.cx)"
+U->>W : "发送命令/回调"
+W->>CMD : "分发至对应命令"
+CMD->>H : "执行处理器逻辑"
+H->>KV : "读取/写入用户凭证/会话"
+H->>API : "构建请求并调用"
+API->>S : "HTTP 请求"
+S-->>API : "JSON 响应(code/msg/data)"
+API-->>H : "返回解析后的结果"
+H-->>U : "发送 Telegram 消息/内联键盘"
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 详细组件分析
+
+### API 客户端模块(CosmoeClient)
+- 设计理念
+  - 单一职责:封装 API 调用,统一响应结构与认证参数拼装
+  - 明确的错误边界:非 200 响应抛出错误或返回带错误信息的结果
+  - 凭证缓存:支持手动设置或登录后自动缓存,避免重复登录
+- 数据模型与复杂度
+  - 主要数据结构:事件(Event)、活动详情(EventDetail)、时间槽(TimeSlot)、用户信息(UserInfo)、统计(Statistics)、优惠券(Coupon)、预约(Booking)、通用响应(ApiResponse)
+  - 复杂度:多数方法为 O(1) 请求开销;排序时间槽为 O(n log n),其中 n 为时间槽数量
+- 关键方法与流程
+  - getToken:表单提交用户名/密码,成功后缓存 user_id 与 token
+  - setCredentials/getCredentials/isAuthenticated:凭证管理
+  - getEvents/getEventDetail:活动列表与详情获取
+  - getProfile/getUserProfile/getMyBookings:用户资料与预约历史
+  - bookEvent/changePassword/getAvailableCoupons/updatePaymentOrder/updateBookingNote/cancelBooking/selfReschedule/selfTransfer:预约相关操作
+- 错误处理
+  - 认证要求:需要登录的方法在未认证时抛出错误
+  - 参数校验:修改密码长度校验、优惠券获取降级处理
+  - 异常捕获:上层处理器统一打印日志并提示用户
+
+```mermaid
+classDiagram
+class CosmoeClient {
+-baseUrl : string
+-userId : number
+-token : string
++getToken(username, password) Promise~ApiResponse~
++setCredentials(userId, token) void
++getCredentials() {userId, token}|null
++isAuthenticated() boolean
++getEvents() Promise~ApiResponse~Event[]~~
++getEventDetail(eventId) Promise~ApiResponse~EventDetail~~
++getProfile() Promise~ApiResponse~ProfileData~~
++getUserProfile() Promise~ApiResponse~UserProfile~~
++getMyBookings() Promise~ApiResponse~Booking[]~~
++bookEvent(req) Promise~ApiResponse~
++changePassword(old, new) Promise~ApiResponse~
++getAvailableCoupons(eventId) Promise~ApiResponse~Coupon[]~~
++updatePaymentOrder(id, orderId) Promise~ApiResponse~
++updateBookingNote(id, note) Promise~ApiResponse~
++cancelBooking(id) Promise~ApiResponse~
++selfReschedule(id, slot) Promise~ApiResponse~
++selfTransfer(id, user) Promise~ApiResponse~
++register(key, username, email, pwd, identity) Promise~ApiResponse~
+}
+```
+
+图表来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L9-L112)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+### 命令处理器系统(路由与对话状态)
+- 路由机制
+  - 命令:/start、/login、/events、/history、/logout
+  - 文本匹配:/event_{id}、/book_{event_id}_{slot_index}、/cancel_{booking_id}
+  - 回调查询:内联键盘确认取消、优惠券选择
+- 对话状态管理
+  - 使用 @grammyjs/conversations 插件,结合 KV 存储对话状态
+  - 登录对话:交互式输入用户名/密码,成功后写入 KV
+- 会话存储适配
+  - 自定义 KV 适配器,负责 JSON 序列化/反序列化与异常处理
+
+```mermaid
+flowchart TD
+Start(["收到命令/回调"]) --> Route{"命令类型?"}
+Route --> |/login| LoginConv["进入登录对话"]
+Route --> |/events| Events["获取活动列表并展示"]
+Route --> |/event_*| Details["解析活动ID并获取详情"]
+Route --> |/book_*_*| Book["解析活动ID/槽位并处理预约"]
+Route --> |/history| History["读取凭证并获取预约历史"]
+Route --> |/cancel_*| Cancel["解析预约ID并发起取消确认"]
+Route --> |/logout| Logout["删除KV中的凭证"]
+LoginConv --> Done(["结束"])
+Events --> Done
+Details --> Done
+Book --> Done
+History --> Done
+Cancel --> Done
+Logout --> Done
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L59-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L34)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+### 用户认证系统(登录流程与会话管理)
+- 登录流程
+  - 进入登录对话,提示输入用户名/密码
+  - 调用 CosmoeClient.getToken 获取 user_id 与 token
+  - 将凭证以 {user_id, token, timestamp} 形式写入 KV,键为 Telegram 用户 ID
+- 会话管理
+  - 读取:每次需要认证的操作前从 KV 读取凭证并注入到 CosmoeClient
+  - 清除:/logout 删除 KV 中的凭证
+- 安全与健壮性
+  - 输入校验:用户名/密码非空判断
+  - 异常处理:网络错误/解析错误统一捕获并提示用户
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant Conv as "登录对话"
+participant KV as "KV(COSMOE_CREDENTIALS)"
+participant API as "CosmoeClient"
+participant S as "后端API"
+U->>Conv : "/login"
+Conv->>U : "提示输入用户名"
+U-->>Conv : "用户名"
+Conv->>U : "提示输入密码"
+U-->>Conv : "密码"
+Conv->>API : "getToken(用户名, 密码)"
+API->>S : "POST /CreatToken.php"
+S-->>API : "{code,data : {user_id,token}}"
+API-->>Conv : "返回结果"
+alt 成功
+Conv->>KV : "put(Telegram用户ID, 凭证JSON)"
+Conv-->>U : "登录成功"
+else 失败
+Conv-->>U : "登录失败"
+end
+```
+
+图表来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L34)
+
+### 活动管理系统(数据获取与展示)
+- 功能点
+  - /events:获取最新活动列表,限制展示数量,生成 Markdown 列表
+  - /event_{id}:获取活动详情,渲染时间槽与预约入口;根据是否为活动当日或之前决定是否显示“预约”链接
+- 展示逻辑
+  - 时间处理:转换为北京时间进行比较,确保展示一致性
+  - 排序:按时间段字符串排序,保证输出稳定
+- 错误处理
+  - API 失败时统一提示;无活动时友好提示
+
+```mermaid
+flowchart TD
+A["/events"] --> B["CosmoeClient.getEvents()"]
+B --> C{"code==200 且有数据?"}
+C --> |否| D["提示无活动"]
+C --> |是| E["取前N条并生成Markdown列表"]
+E --> F["发送消息"]
+G["/event_{id}"] --> H["解析ID并getEventDetail()"]
+H --> I{"code==200"}
+I --> |否| J["提示错误"]
+I --> |是| K["计算是否活动当日或之前"]
+K --> L["按range排序时间槽"]
+L --> M{"剩余容量>0 且活动有效?"}
+M --> |是| N["为每个槽位添加 /book_... 链接"]
+M --> |否| O["仅显示不可预约"]
+N --> P["发送Markdown详情"]
+O --> P
+```
+
+图表来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L199)
+
+章节来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+
+### 预约管理系统(业务流程与时间槽管理)
+- 业务流程
+  - 解析 /book_{event_id}_{slot_index}
+  - 读取 KV 凭证并设置到 CosmoeClient
+  - 获取活动详情,排序时间槽,校验索引与剩余容量
+  - 查询可用优惠券,若多于一个则弹出内联键盘供选择;否则自动使用唯一优惠券或不使用
+  - 调用 bookEvent 提交预约,返回成功/失败消息
+- 时间槽管理
+  - 排序规则:按时间段字符串排序,确保索引稳定
+  - 可用性判断:剩余容量>0 且活动尚未过期
+- 优惠券联动
+  - 支持多优惠券选择与“不使用”选项
+  - 自动回退:获取失败时降级为无优惠券继续流程
+- 取消流程
+  - /cancel_{booking_id}:弹出确认内联键盘
+  - 确认后调用 cancelBooking 并反馈结果
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant CMD as "命令系统"
+participant H as "bookEvent处理器"
+participant KV as "KV"
+participant API as "CosmoeClient"
+participant S as "后端API"
+U->>CMD : "/book_{event}_{slot}"
+CMD->>H : "解析event_id/slot_index"
+H->>KV : "读取凭证"
+H->>API : "setCredentials + getEventDetail"
+API->>S : "GET /api.php?action=get_event_detail"
+S-->>API : "EventDetail"
+API-->>H : "返回详情"
+H->>H : "排序时间槽并校验索引/剩余"
+H->>API : "getAvailableCoupons"
+API->>S : "GET /api.php?action=get_available_coupons"
+S-->>API : "Coupons"
+API-->>H : "返回优惠券列表"
+alt 多个优惠券
+H-->>U : "内联键盘选择优惠券"
+else 一个或无
+H->>API : "bookEvent(含可选coupon_code)"
+API->>S : "POST /api.php?action=book_event"
+S-->>API : "结果"
+API-->>H : "返回结果"
+H-->>U : "发送成功/失败消息"
+end
+```
+
+图表来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L270)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+
+章节来源
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L226)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L132)
+
+### 历史与概览命令
+- /start:欢迎与命令菜单提示
+- /history:读取凭证,获取预约历史,按时间倒序并截取最新若干条,标注可取消项
+
+章节来源
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L4-L6)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+
+## 依赖分析
+- 内部依赖
+  - src/index.ts 依赖命令系统与定时任务
+  - 命令系统依赖各处理器与 KV 存储
+  - 处理器依赖 CosmoeClient
+  - 定时任务依赖 CosmoeClient 与 KV
+- 外部依赖
+  - GrammY 生态:bot、conversations、storage-cloudflare
+  - Cloudflare Workers:KV、定时触发器
+- 配置依赖
+  - Wrangler:KV 绑定、定时计划、变量
+  - TypeScript:严格类型检查
+
+```mermaid
+graph LR
+IDX["src/index.ts"] --> CMD["src/command/index.ts"]
+IDX --> SCH["src/scheduler/index.ts"]
+CMD --> H1["handlers/start.ts"]
+CMD --> H2["handlers/login.ts"]
+CMD --> H3["handlers/events.ts"]
+CMD --> H4["handlers/eventDetails.ts"]
+CMD --> H5["handlers/bookEvent.ts"]
+CMD --> H6["handlers/history.ts"]
+CMD --> H7["handlers/cancel.ts"]
+CMD --> H8["handlers/logout.ts"]
+CMD --> CLI["src/client/cosmoe.ts"]
+SCH --> CLI
+CMD --> KV["KV: COSMOE_CREDENTIALS/STORAGE"]
+SCH --> KV
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+章节来源
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+
+## 性能考虑
+- 网络请求
+  - 批量 API 调用建议合并或复用客户端实例,减少握手开销
+  - 对外请求增加超时与重试策略(建议在生产环境增强)
+- KV 访问
+  - 读写 KV 为异步 IO,尽量减少不必要的读写次数
+  - 对话状态与凭证均使用 KV,注意键命名规范与序列化开销
+- 消息体积
+  - 历史与活动列表消息可能较长,建议分页或截断,避免超过 Telegram API 限制
+- 定时任务
+  - 当前每分钟触发一次,建议评估活动更新频率与推送阈值,避免冗余通知
+
+## 故障排查指南
+- 认证相关
+  - 未登录即进行需认证操作:提示“请先登录”
+  - KV 中无凭证:/logout 后需重新 /login
+  - 凭证失效:建议重新登录或检查后端返回
+- API 返回异常
+  - code 非 200:检查用户名/密码、网络连通性与后端状态
+  - 个别接口降级:如优惠券获取失败不影响主流程
+- 消息与键盘
+  - 内联键盘点击无响应:确认回调查询正则匹配与回调处理
+  - Markdown 渲染问题:检查特殊字符转义与长度限制
+- 定时任务
+  - 未推送新活动:检查 latestEventId 是否正确更新、KV 可读写、用户是否已登录
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L67-L74)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L67-L74)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L84)
+
+## 结论
+本项目以清晰的功能域划分与模块化设计实现了完整的 Telegram Bot 服务:
+- API 客户端提供一致的调用体验与错误处理
+- 命令系统与对话插件结合 KV 实现稳定的会话与状态管理
+- 活动与预约流程完整覆盖前端展示、交互与后端业务
+- 定时任务完善了运营自动化能力
+建议后续在生产环境中补充超时/重试、日志分级与可观测性指标,进一步提升稳定性与可维护性。
+
+## 附录
+- 配置项说明
+  - BOT_INFO:Bot 基本信息(JSON 字符串)
+  - BOT_TOKEN:Telegram Bot Token
+  - KV 命名空间:COSMOE_CREDENTIALS(凭证)、COSMOE_STORAGE(会话/状态)
+  - 触发器:*/1 * * * *(每分钟)
+- 最佳实践
+  - 在处理器中优先检查认证状态与输入参数
+  - 对 KV 读写进行 try/catch 并记录错误日志
+  - 对长消息进行分片或截断,避免 Telegram API 限制
+  - 对外请求增加超时控制与幂等设计
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L18-L30)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L94-L97)

+ 772 - 0
.qoder/repowiki/zh/content/核心模块/活动管理系统.md

@@ -0,0 +1,772 @@
+# 活动管理系统
+
+<cite>
+**本文档引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概览](#架构概览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+
+活动管理系统是一个基于 Telegram 的摄影活动管理机器人,为用户提供活动浏览、详情查看、预约管理等完整功能。系统采用 Cloudflare Workers 架构,通过 API 客户端与外部摄影平台进行数据交互。
+
+该系统的核心功能包括:
+- 活动列表获取与展示(支持分页和筛选)
+- 活动详情页面设计(图片展示、时间槽信息、价格显示、可用性状态)
+- 实时通知机制(新活动提醒)
+- 用户认证与会话管理
+- 预约历史查询与管理
+
+## 项目结构
+
+项目采用模块化架构设计,主要分为以下几个层次:
+
+```mermaid
+graph TB
+subgraph "应用入口层"
+A[src/index.ts] --> B[src/command/index.ts]
+end
+subgraph "命令处理层"
+B --> C[src/command/handlers/events.ts]
+B --> D[src/command/handlers/eventDetails.ts]
+B --> E[src/command/handlers/bookEvent.ts]
+B --> F[src/command/handlers/history.ts]
+B --> G[src/command/handlers/login.ts]
+B --> H[src/command/handlers/cancel.ts]
+B --> I[src/command/handlers/logout.ts]
+end
+subgraph "服务客户端层"
+J[src/client/cosmoe.ts] --> K[外部摄影平台API]
+end
+subgraph "调度服务层"
+L[src/scheduler/index.ts] --> M[Cloudflare Cron触发器]
+end
+subgraph "配置层"
+N[wrangler.jsonc] --> O[环境变量配置]
+P[package.json] --> Q[依赖管理]
+end
+C --> J
+D --> J
+E --> J
+F --> J
+G --> J
+H --> J
+L --> J
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 核心组件
+
+### API 客户端 (CosmoeClient)
+
+CosmoeClient 是系统的核心数据访问组件,负责与外部摄影平台 API 进行通信。该类提供了完整的 CRUD 操作能力:
+
+```mermaid
+classDiagram
+class CosmoeClient {
+-string baseUrl
+-number userId
+-string token
++getToken(username, password) ApiResponse~TokenResponse~
++setCredentials(userId, token) void
++getCredentials() Object|null
++isAuthenticated() boolean
++getEvents() ApiResponse~Event[]~
++getEventDetail(eventId) ApiResponse~EventDetail~
++getProfile() ApiResponse~ProfileData~
++getMyBookings() ApiResponse~Booking[]~
++bookEvent(bookingRequest) ApiResponse~any~
++getAvailableCoupons(eventId) ApiResponse~Coupon[]~
++cancelBooking(bookingId) ApiResponse~any~
++updatePaymentOrder(bookingId, paymentOrderId) ApiResponse~any~
++updateBookingNote(bookingId, note) ApiResponse~any~
++selfReschedule(bookingId, newTimeSlot) ApiResponse~any~
++selfTransfer(bookingId, recipientUsername) ApiResponse~any~
++register(key, username, email, password, userIdentity) ApiResponse~Object~
+}
+class Event {
++string id
++string name
++string description
++string event_date
++string cover_image_url
++string description_brief
+}
+class EventDetail {
++number id
++string name
++string description
++string event_date
++string time_slots_with_prices
++string cover_image_url
++string detail_image_urls
++number is_listed
++number login_required
++number allow_coupons
++string created_at
++TimeSlot[] slots
++string[] gallery
+}
+class TimeSlot {
++string range
++string price
++number capacity
++number remaining
+}
+class Booking {
++number id
++string status
++string booking_date
++string time_slot
++string final_price
++string payment_order_id
++string notes_by_user
++string created_at
++string event_name
+}
+CosmoeClient --> Event : "获取活动列表"
+CosmoeClient --> EventDetail : "获取活动详情"
+CosmoeClient --> TimeSlot : "包含时间槽信息"
+CosmoeClient --> Booking : "管理预约"
+```
+
+**图表来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+### 命令处理器系统
+
+系统采用命令模式处理用户输入,每个命令都有专门的处理器:
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot核心
+participant C as 命令处理器
+participant A as API客户端
+participant S as 外部服务
+U->>B : 发送命令
+B->>C : 路由到对应处理器
+C->>A : 调用API方法
+A->>S : 发起HTTP请求
+S-->>A : 返回响应数据
+A-->>C : 处理后的业务数据
+C-->>U : 格式化后的消息
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+## 架构概览
+
+系统采用分层架构设计,确保各组件职责清晰、耦合度低:
+
+```mermaid
+graph TB
+subgraph "表现层"
+UI[Telegram界面]
+end
+subgraph "控制层"
+CMD[命令路由]
+CONV[对话管理]
+end
+subgraph "业务逻辑层"
+EVT[活动管理]
+BK[预约管理]
+ACC[账户管理]
+HIS[历史记录]
+end
+subgraph "数据访问层"
+KV[KV存储]
+API[API客户端]
+end
+subgraph "外部服务"
+EXT[摄影平台API]
+TG[Telegram API]
+end
+UI --> CMD
+CMD --> CONV
+CONV --> EVT
+CONV --> BK
+CONV --> ACC
+CONV --> HIS
+EVT --> KV
+BK --> KV
+ACC --> KV
+HIS --> KV
+EVT --> API
+BK --> API
+ACC --> API
+HIS --> API
+API --> EXT
+KV --> TG
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+### 数据流处理
+
+系统的数据流遵循以下模式:
+
+```mermaid
+flowchart TD
+A[用户请求] --> B[命令解析]
+B --> C[参数验证]
+C --> D{需要认证?}
+D --> |是| E[读取KV存储]
+D --> |否| F[直接处理]
+E --> G[验证凭据]
+G --> H[调用API客户端]
+F --> H
+H --> I[处理业务逻辑]
+I --> J[格式化响应]
+J --> K[发送Telegram消息]
+K --> L[更新状态]
+L --> M[结束]
+```
+
+**图表来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+
+## 详细组件分析
+
+### 活动列表获取与展示
+
+活动列表功能通过 `/events` 命令实现,提供最新的摄影活动信息:
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot
+participant H as EventsHandler
+participant C as CosmoeClient
+participant S as API服务
+U->>B : /events
+B->>H : handleEventsCommand
+H->>C : getEvents()
+C->>S : GET /api.php?action=get_events
+S-->>C : 活动列表数据
+C-->>H : ApiResponse<Event[]>
+H->>H : 处理数据(取前10条)
+H->>U : 发送Markdown格式消息
+```
+
+**图表来源**
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L4-L27)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+
+#### 分页处理机制
+
+系统实现了简单的分页策略:
+- 默认只显示最新的10个活动
+- 支持按事件ID排序(降序)
+- 自动截断超出限制的消息内容
+
+#### 活动过滤与排序
+
+```mermaid
+flowchart TD
+A[获取所有活动] --> B[按ID排序(降序)]
+B --> C[取前N条记录]
+C --> D[生成Markdown列表]
+D --> E[发送给用户]
+F[用户点击活动链接] --> G[解析活动ID]
+G --> H[调用getEventDetail]
+H --> I[返回详细信息]
+```
+
+**图表来源**
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L8-L17)
+
+**章节来源**
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+
+### 活动详情页面设计
+
+活动详情页面提供了丰富的信息展示:
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot
+participant DH as EventDetailsHandler
+participant C as CosmoeClient
+participant S as API服务
+U->>B : /event_{id}
+B->>DH : handleEventDetails
+DH->>C : getEventDetail(eventId)
+C->>S : GET /api.php?action=get_event_detail
+S-->>C : 活动详情数据
+C-->>DH : ApiResponse<EventDetail>
+DH->>DH : 处理时间槽和价格信息
+DH->>DH : 计算可用性状态
+DH->>U : 发送包含图片、时间槽、价格的详细信息
+```
+
+**图表来源**
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L4-L61)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L191-L199)
+
+#### 图片展示机制
+
+系统支持多种图片展示:
+- 封面图片:用于活动的主要视觉展示
+- 详情图片:活动的扩展图片集合
+- 图片URL验证:确保图片链接的有效性
+
+#### 时间槽信息管理
+
+```mermaid
+flowchart TD
+A[获取活动详情] --> B[解析时间槽数组]
+B --> C[按时间段排序]
+C --> D[计算剩余容量]
+D --> E{是否在活动日期内?}
+E --> |是| F[显示预约按钮]
+E --> |否| G[仅显示信息]
+F --> H[标记可预约状态]
+G --> I[标记不可预约状态]
+```
+
+**图表来源**
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L22-L45)
+
+#### 价格显示与可用性状态
+
+系统实现了智能的价格和状态显示:
+- 显示原价和剩余容量
+- 根据活动日期动态调整可用性状态
+- 提供预约链接(仅对可预约的时间槽)
+
+**章节来源**
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+
+### 预约管理功能
+
+预约功能是系统的核心业务逻辑:
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot
+participant BH as BookEventHandler
+participant C as CosmoeClient
+participant S as API服务
+participant K as KV存储
+U->>B : /book_{event_id}_{slot_index}
+B->>BH : handleBookEvent
+BH->>K : 读取用户凭据
+K-->>BH : 凭据数据
+BH->>C : setCredentials
+BH->>C : getEventDetail(eventId)
+C-->>BH : 活动详情
+BH->>BH : 验证时间槽可用性
+BH->>C : getAvailableCoupons(eventId)
+C-->>BH : 可用优惠券
+BH->>U : 显示优惠券选择
+U->>B : 选择优惠券
+B->>BH : handleCouponSelection
+BH->>C : bookEvent(bookingRequest)
+C-->>BH : 预约结果
+BH-->>U : 预约确认信息
+```
+
+**图表来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L160-L226)
+
+#### 优惠券系统集成
+
+系统支持多种类型的优惠券:
+- 固定金额折扣
+- 百分比折扣
+- 自动选择最优优惠券
+- 手动选择特定优惠券
+
+#### 实时状态更新
+
+```mermaid
+flowchart TD
+A[用户发起预约] --> B[检查时间槽剩余容量]
+B --> C{剩余容量 > 0?}
+C --> |否| D[提示已满]
+C --> |是| E[检查可用优惠券]
+E --> F[处理优惠券应用]
+F --> G[提交预约请求]
+G --> H[等待API响应]
+H --> I[更新本地状态]
+I --> J[发送确认消息]
+```
+
+**图表来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L60-L63)
+
+**章节来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+
+### 用户认证与会话管理
+
+系统采用交互式对话方式进行用户认证:
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot
+participant LC as LoginConversation
+participant C as CosmoeClient
+participant S as API服务
+participant K as KV存储
+U->>B : /login
+B->>LC : 启动登录对话
+LC->>U : 请求用户名
+U->>LC : 输入用户名
+LC->>U : 请求密码
+U->>LC : 输入密码
+LC->>C : getToken(username, password)
+C->>S : POST 认证请求
+S-->>C : 返回token
+C-->>LC : 认证结果
+LC->>K : 存储凭据
+K-->>LC : 存储成功
+LC-->>U : 登录成功消息
+```
+
+**图表来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+- [src/command/index.ts](file://src/command/index.ts#L54-L57)
+
+#### 凭据存储策略
+
+系统使用 Cloudflare KV 存储用户凭据:
+- 使用 Telegram 用户ID作为键
+- 存储用户ID、token和时间戳
+- 支持凭据的读取、写入和删除操作
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+
+### 预约历史管理
+
+历史记录功能允许用户查看和管理过去的预约:
+
+```mermaid
+flowchart TD
+A[用户请求历史] --> B[读取KV存储中的凭据]
+B --> C{凭据存在?}
+C --> |否| D[提示先登录]
+C --> |是| E[初始化CosmoeClient]
+E --> F[调用getMyBookings]
+F --> G[处理预约数据]
+G --> H{有历史记录?}
+H --> |否| I[提示无记录]
+H --> |是| J[格式化历史消息]
+J --> K[按日期排序(最新在前)]
+K --> L[限制显示数量]
+L --> M[发送历史记录]
+```
+
+**图表来源**
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+
+**章节来源**
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+
+### 实时通知系统
+
+系统通过 Cloudflare Cron 触发器实现定时任务:
+
+```mermaid
+sequenceDiagram
+participant CRON as Cron触发器
+participant SCH as Scheduler
+participant C as CosmoeClient
+participant S as API服务
+participant K as KV存储
+participant U as 用户
+CRON->>SCH : 每分钟触发
+SCH->>C : getEvents()
+C->>S : 获取活动列表
+S-->>C : 返回最新活动
+C-->>SCH : 活动数据
+SCH->>K : 读取最新活动ID
+K-->>SCH : 最新ID
+SCH->>SCH : 过滤新活动
+SCH->>K : 获取所有用户ID
+K-->>SCH : 用户列表
+SCH->>U : 发送新活动通知
+SCH->>K : 更新最新活动ID
+```
+
+**图表来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+#### 通知策略
+
+系统实现了智能的新活动通知机制:
+- 持续监控活动变化
+- 仅向注册用户发送通知
+- 使用 KV 存储跟踪最新活动ID
+- 支持 Markdown 格式的富文本通知
+
+**章节来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 依赖关系分析
+
+系统依赖关系清晰,各组件职责明确:
+
+```mermaid
+graph TB
+subgraph "外部依赖"
+A[grammy - Telegram Bot框架]
+B[@grammyjs/conversations - 对话插件]
+C[@grammyjs/storage-cloudflare - KV存储适配器]
+D[Cloudflare Workers Runtime]
+end
+subgraph "内部模块"
+E[src/index.ts - 应用入口]
+F[src/command/index.ts - 命令路由]
+G[src/client/cosmoe.ts - API客户端]
+H[src/command/handlers/* - 业务处理器]
+I[src/scheduler/index.ts - 定时任务]
+end
+E --> F
+F --> G
+F --> H
+I --> G
+A --> E
+B --> F
+C --> F
+D --> E
+D --> I
+```
+
+**图表来源**
+- [package.json](file://package.json#L18-L22)
+- [src/index.ts](file://src/index.ts#L1-L47)
+
+### 外部服务集成
+
+系统与多个外部服务进行集成:
+
+```mermaid
+erDiagram
+TELEGRAM_BOT {
+string BOT_TOKEN
+object BOT_INFO
+string USER_ID
+string MESSAGE
+}
+COSMOE_API {
+string BASE_URL
+string API_KEY
+string TOKEN
+number USER_ID
+}
+CLOUDFLARE_KV {
+string COSMOE_CREDENTIALS
+string COSMOE_STORAGE
+string LATEST_EVENT_ID
+}
+USER {
+number TELEGRAM_ID
+string USERNAME
+string PASSWORD
+string ACCESS_TOKEN
+}
+EVENT {
+string ID
+string NAME
+string DESCRIPTION
+string EVENT_DATE
+string COVER_IMAGE_URL
+}
+BOOKING {
+number ID
+number USER_ID
+string EVENT_ID
+string TIME_SLOT
+string STATUS
+string FINAL_PRICE
+}
+TELEGRAM_BOT ||--o{ USER : "认证"
+USER ||--o{ BOOKING : "创建"
+BOOKING ||--|| EVENT : "关联"
+COSMOE_API ||--o{ EVENT : "提供"
+COSMOE_API ||--o{ BOOKING : "管理"
+CLOUDFLARE_KV ||--o{ USER : "存储凭据"
+CLOUDFLARE_KV ||--o{ EVENT : "跟踪活动"
+```
+
+**图表来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+**章节来源**
+- [package.json](file://package.json#L1-L24)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 性能考虑
+
+### 缓存策略
+
+系统采用多层缓存策略优化性能:
+
+1. **KV存储缓存**
+   - 用户凭据缓存(短期有效)
+   - 最新活动ID缓存(避免重复通知)
+   - 会话状态缓存(对话管理)
+
+2. **内存缓存**
+   - API响应缓存(短期)
+   - 配置信息缓存
+   - 统计数据缓存
+
+### 并发处理
+
+系统支持高并发场景:
+- 异步处理用户请求
+- 非阻塞的API调用
+- 流水线化的数据处理
+
+### 错误处理与重试
+
+```mermaid
+flowchart TD
+A[API调用] --> B{请求成功?}
+B --> |是| C[正常处理]
+B --> |否| D{错误类型}
+D --> |网络错误| E[指数退避重试]
+D --> |认证失败| F[重新认证]
+D --> |业务错误| G[返回用户友好错误]
+E --> H{重试次数}
+H --> |达到上限| I[记录日志并返回错误]
+H --> |未达上限| A
+F --> J[刷新凭据]
+J --> A
+```
+
+**图表来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L117)
+
+## 故障排除指南
+
+### 常见问题诊断
+
+#### 认证相关问题
+
+**症状**: 用户无法登录或收到认证错误
+**排查步骤**:
+1. 检查用户凭据是否正确存储在 KV 中
+2. 验证 API 令牌是否过期
+3. 确认用户 ID 和 token 格式正确
+
+#### API连接问题
+
+**症状**: 系统无法获取活动数据
+**排查步骤**:
+1. 检查网络连接状态
+2. 验证 API 端点可达性
+3. 查看 API 响应状态码
+
+#### 会话管理问题
+
+**症状**: 对话无法正常结束或状态丢失
+**排查步骤**:
+1. 检查 KV 存储的会话数据
+2. 验证会话超时设置
+3. 确认对话生命周期管理
+
+### 日志记录与监控
+
+系统实现了全面的日志记录机制:
+- 关键操作的执行日志
+- 错误和异常的详细记录
+- 性能指标的监控数据
+- 用户行为的追踪记录
+
+**章节来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L117)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L81-L83)
+
+## 结论
+
+活动管理系统是一个功能完整、架构清晰的 Telegram 机器人应用。系统通过模块化设计实现了良好的可维护性和扩展性,同时采用了多种优化策略确保了良好的用户体验。
+
+### 主要优势
+
+1. **架构清晰**: 分层设计使得各组件职责明确,便于维护和测试
+2. **功能完整**: 覆盖了活动管理的全流程需求
+3. **性能优化**: 采用缓存和异步处理提升系统响应速度
+4. **用户体验**: 提供直观的界面和及时的通知机制
+
+### 改进建议
+
+1. **增加搜索功能**: 实现基于关键词的活动搜索
+2. **增强过滤选项**: 支持按日期、价格、地点等条件过滤
+3. **优化移动端体验**: 针对移动设备优化界面布局
+4. **添加数据分析**: 提供活动参与率等统计信息
+
+## 附录
+
+### API 接口规范
+
+系统主要 API 接口包括:
+- 获取活动列表:`GET /api.php?action=get_events`
+- 获取活动详情:`GET /api.php?action=get_event_detail&event_id={id}`
+- 用户认证:`POST /api.php?action=login`
+- 预约管理:`POST /api.php?action=book_event`
+
+### 配置选项
+
+系统支持的配置项:
+- BOT_TOKEN: Telegram 机器人的访问令牌
+- BOT_INFO: 机器人基本信息
+- COSMOE_CREDENTIALS: KV 命名空间绑定
+- COSMOE_STORAGE: KV 存储命名空间
+
+### 部署要求
+
+- Node.js 版本: 16+
+- Wrangler CLI: 3.0+
+- Cloudflare Workers: 免费套餐即可运行

+ 362 - 0
.qoder/repowiki/zh/content/核心模块/用户认证系统.md

@@ -0,0 +1,362 @@
+# 用户认证系统
+
+<cite>
+**本文档引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+
+## 简介
+本项目是一个基于 Cloudflare Workers 的 Telegram 机器人,提供用户认证与活动预约功能。认证系统采用交互式对话完成用户名/密码登录,通过 Cosmoe API 获取 Token 并持久化到 KV 存储;后续需要授权的操作(如查看历史、预约活动)均需使用已存储的凭证进行鉴权。系统未实现中间件层,而是通过各命令处理器在执行前主动检查凭证有效性。
+
+## 项目结构
+项目采用按职责分层的组织方式:
+- 入口与路由:src/index.ts 负责初始化 Bot、注册命令菜单与 Webhook 回调
+- 命令与对话:src/command/index.ts 安装对话插件、注册所有命令与回调处理器
+- 认证客户端:src/client/cosmoe.ts 提供与外部 Cosmoe API 的交互能力,包括 Token 获取与受保护接口调用
+- 处理器:src/command/handlers 下的各文件分别处理不同命令与业务流程
+- 配置:wrangler.jsonc 定义 Worker 名称、触发器、KV 绑定等运行时配置
+
+```mermaid
+graph TB
+A["入口: src/index.ts"] --> B["命令注册: src/command/index.ts"]
+B --> C["登录处理器: src/command/handlers/login.ts"]
+B --> D["登出处理器: src/command/handlers/logout.ts"]
+B --> E["历史查询: src/command/handlers/history.ts"]
+B --> F["活动预约: src/command/handlers/bookEvent.ts"]
+B --> G["活动列表: src/command/handlers/events.ts"]
+B --> H["活动详情: src/command/handlers/eventDetails.ts"]
+C --> I["认证客户端: src/client/cosmoe.ts"]
+D --> I
+E --> I
+F --> I
+G --> I
+H --> I
+A --> J["配置: wrangler.jsonc"]
+B --> K["依赖: package.json"]
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L1-L24)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L1-L24)
+
+## 核心组件
+- Bot 与环境绑定:入口文件初始化 Bot 并注入 KV 命名空间,同时设置命令菜单与 Webhook 回调
+- 对话系统:通过 @grammyjs/conversations 插件与 KV 适配器实现对话状态持久化
+- 认证客户端:封装与 Cosmoe API 的交互,支持获取 Token、设置凭证、判断认证状态以及调用受保护接口
+- 登录处理器:交互式对话收集用户名/密码,调用认证客户端获取 Token,并将 user_id、token 与时间戳写入 KV
+- 登出处理器:根据 Telegram 用户 ID 读取并删除 KV 中的凭证
+- 历史与预约处理器:在执行前从 KV 读取凭证,设置到认证客户端,再调用受保护接口
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L6-L11)
+- [src/command/index.ts](file://src/command/index.ts#L20-L57)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L34)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L30)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L40)
+
+## 架构总览
+下图展示了认证系统的关键交互路径:用户通过 /login 进入对话,输入凭据后由认证客户端向外部 API 请求 Token,并将凭证存入 KV;后续命令在执行前从 KV 读取凭证并设置到认证客户端以完成鉴权。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant T as "Telegram Bot"
+participant L as "登录处理器(login.ts)"
+participant C as "认证客户端(cosmoe.ts)"
+participant KV as "KV存储(COSMOE_CREDENTIALS)"
+participant API as "Cosmoe API"
+U->>T : "/login"
+T->>L : 进入对话
+L->>U : "请输入用户名"
+U-->>L : 用户名
+L->>U : "请输入密码"
+U-->>L : 密码
+L->>C : getToken(用户名, 密码)
+C->>API : POST /CreatToken.php
+API-->>C : 返回 {code, data : {user_id, token}}
+C-->>L : 认证结果
+alt 成功
+L->>KV : put(Telegram用户ID, {user_id, token, timestamp})
+L-->>U : "登录成功,凭证已存储"
+else 失败
+L-->>U : "登录失败:用户名或密码错误"
+end
+```
+
+**图表来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 详细组件分析
+
+### 登录流程(用户名/密码验证、Token 获取与存储)
+- 输入收集:通过对话等待用户输入用户名与密码,避免明文泄露
+- 凭证校验:调用认证客户端的 getToken 方法,向外部 API 发送表单数据
+- 成功分支:若返回 code=200 且包含 user_id 与 token,则将凭证写入 KV,键为 Telegram 用户 ID
+- 失败分支:提示用户名或密码错误
+- 异常处理:捕获并记录错误,向用户反馈“稍后重试”
+
+```mermaid
+flowchart TD
+Start(["进入登录对话"]) --> AskUser["提示输入用户名"]
+AskUser --> GetUser["等待用户名输入"]
+GetUser --> CheckUser{"用户名存在?"}
+CheckUser --> |否| Cancel1["取消登录并提示"]
+CheckUser --> |是| AskPass["提示输入密码"]
+AskPass --> GetPass["等待密码输入"]
+GetPass --> CheckPass{"密码存在?"}
+CheckPass --> |否| Cancel2["取消登录并提示"]
+CheckPass --> |是| CallAPI["调用getToken获取Token"]
+CallAPI --> Result{"code=200且有token?"}
+Result --> |是| SaveKV["以Telegram用户ID为键保存凭证到KV"]
+SaveKV --> Done(["回复登录成功"])
+Result --> |否| Fail(["回复登录失败"])
+Cancel1 --> End(["结束"])
+Cancel2 --> End
+Done --> End
+Fail --> End
+```
+
+**图表来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L19-L74)
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L74)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+### 登录后会话状态管理与凭证存储
+- KV 键设计:以 Telegram 用户 ID 作为键,值为包含 user_id、token、timestamp 的 JSON
+- 读取与设置:历史查询与预约等处理器在执行前从 KV 读取凭证,设置到认证客户端
+- 认证状态:认证客户端提供 isAuthenticated 与 getCredentials 方法用于判断与获取当前凭证
+
+```mermaid
+classDiagram
+class CosmoeClient {
+-number userId
+-string token
++getToken(username, password) ApiResponse
++setCredentials(userId, token) void
++getCredentials() {userId, token}|null
++isAuthenticated() boolean
+}
+class LoginHandler {
++handleInteractiveLogin(conversation, ctx, env) Promise
+}
+class HistoryHandler {
++handleHistoryCommand(ctx, env) Promise
+}
+class BookEventHandler {
++handleBookEvent(ctx, env) Promise
+}
+LoginHandler --> CosmoeClient : "获取Token并设置凭证"
+HistoryHandler --> CosmoeClient : "读取凭证并调用受保护接口"
+BookEventHandler --> CosmoeClient : "读取凭证并调用受保护接口"
+```
+
+**图表来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L47-L65)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L13-L30)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L22-L40)
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L65)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L13-L30)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L22-L40)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L156-L171)
+
+### 登出流程(清理机制、安全考虑与最佳实践)
+- 身份确认:从上下文提取 Telegram 用户 ID
+- 凭证检查:读取 KV 中是否存在对应凭证
+- 删除操作:存在则删除该键,不存在则提示先登录
+- 反馈与异常:统一回复与错误日志记录
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant T as "Telegram Bot"
+participant LO as "登出处理器(logout.ts)"
+participant KV as "KV存储(COSMOE_CREDENTIALS)"
+U->>T : "/logout"
+T->>LO : 处理登出请求
+LO->>LO : 获取Telegram用户ID
+LO->>KV : get(用户ID)
+alt 无凭证
+LO-->>U : "请先使用 /login 命令登录"
+else 有凭证
+LO->>KV : delete(用户ID)
+LO-->>U : "成功登出,账户信息已清除"
+end
+```
+
+**图表来源**
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L34)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+**章节来源**
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L10-L34)
+
+### 认证状态检查与错误处理策略
+- 认证状态检查:历史查询与预约处理器在调用受保护接口前,先从 KV 读取凭证并设置到认证客户端,随后通过 isAuthenticated 判断
+- 错误处理:对 KV 读取失败、API 返回非 200、凭证无效等情况分别给出明确提示
+- 最佳实践:对敏感操作(如变更密码、取消预约)在处理器内部再次校验认证状态,确保安全性
+
+```mermaid
+flowchart TD
+Enter(["进入受保护操作"]) --> ReadKV["从KV读取凭证"]
+ReadKV --> Parse{"解析成功?"}
+Parse --> |否| PromptLogin["提示先登录"]
+Parse --> |是| SetCreds["设置到认证客户端"]
+SetCreds --> CheckAuth{"isAuthenticated()?"}
+CheckAuth --> |否| PromptReauth["提示凭证无效并重新登录"]
+CheckAuth --> |是| CallAPI["调用受保护接口"]
+CallAPI --> Resp{"返回code=200?"}
+Resp --> |是| Success(["处理成功响应"])
+Resp --> |否| ShowErr(["显示错误消息"])
+PromptLogin --> End(["结束"])
+PromptReauth --> End
+Success --> End
+ShowErr --> End
+```
+
+**图表来源**
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L13-L30)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L22-L40)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L169-L171)
+
+**章节来源**
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L13-L30)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L22-L40)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L169-L171)
+
+### 会话超时与自动登出策略
+- 当前实现:系统未对凭证设置过期时间或定期轮询校验,KV 中仅保存 user_id、token 与 timestamp
+- 建议策略:
+  - 在 KV 值中增加 expires_in 或 refresh_token 字段,结合定时任务定期刷新
+  - 在处理器中增加对 timestamp 的校验,超过阈值则提示重新登录
+  - 结合外部 API 的 Token 有效期,在调用失败时自动触发刷新或提示重新登录
+
+[本节为通用建议,无需特定文件引用]
+
+### 认证中间件工作机制
+- 当前架构:未实现全局中间件,各命令处理器在执行前自行检查凭证
+- 实现建议:可在命令注册前安装中间件,拦截命令请求,统一完成凭证读取、校验与上下文注入,减少重复逻辑
+
+[本节为概念性说明,无需特定文件引用]
+
+## 依赖关系分析
+- 运行时依赖:grammy、@grammyjs/conversations、@grammyjs/storage-cloudflare
+- 配置依赖:wrangler.jsonc 中定义 KV 命名空间绑定与触发器
+- 内部依赖:命令处理器依赖认证客户端;登录/登出/历史/预约处理器共同依赖 KV 存储
+
+```mermaid
+graph LR
+P["package.json"] --> G["grammy"]
+P --> C["@grammyjs/conversations"]
+P --> S["@grammyjs/storage-cloudflare"]
+W["wrangler.jsonc"] --> KV1["COSMOE_CREDENTIALS"]
+W --> KV2["COSMOE_STORAGE"]
+CMD["命令注册(command/index.ts)"] --> H1["login.ts"]
+CMD --> H2["logout.ts"]
+CMD --> H3["history.ts"]
+CMD --> H4["bookEvent.ts"]
+CMD --> H5["events.ts"]
+CMD --> H6["eventDetails.ts"]
+H1 --> CL["cosmoe.ts"]
+H2 --> CL
+H3 --> CL
+H4 --> CL
+H5 --> CL
+H6 --> CL
+CL --> API["Cosmoe API"]
+```
+
+**图表来源**
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171)
+
+**章节来源**
+- [package.json](file://package.json#L18-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+## 性能考量
+- KV 读写:对话状态与用户凭证均通过 KV 读写,注意控制键数量与大小,避免频繁写入
+- API 调用:受保护接口需携带 user_id 与 token,建议在处理器内复用认证客户端实例
+- 消息长度:历史查询等场景对消息长度有限制,应做截断处理
+
+[本节提供一般性指导,无需特定文件引用]
+
+## 故障排除指南
+- 登录失败
+  - 检查用户名/密码是否正确
+  - 查看认证客户端返回的错误信息
+  - 确认外部 API 可达
+- 无法获取 Telegram 用户身份
+  - 检查上下文中的 from 字段是否可用
+  - 确认命令触发者为真实用户
+- KV 读取失败
+  - 检查 KV 命名空间绑定是否正确
+  - 确认键格式与权限
+- 凭证无效
+  - 重新执行 /login 获取新 Token
+  - 检查认证客户端的 isAuthenticated 状态
+- 预约失败
+  - 确认时间段仍有余位
+  - 检查优惠券是否可用
+  - 查看返回的错误消息
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L67-L73)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L14-L33)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L15-L37)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L43-L117)
+
+## 结论
+本认证系统通过交互式对话完成登录,使用 KV 存储凭证并在受保护操作前进行状态检查,整体流程清晰、易于维护。建议后续引入中间件统一鉴权、增加凭证过期与自动刷新机制,并完善错误日志与监控,以进一步提升安全性与用户体验。

+ 587 - 0
.qoder/repowiki/zh/content/核心模块/预约管理系统.md

@@ -0,0 +1,587 @@
+# 预约管理系统
+
+<cite>
+**本文档引用的文件**
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [package.json](file://package.json)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构概览](#架构概览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+
+这是一个基于 Telegram 的预约管理系统,专门为摄影活动提供预约服务。系统集成了 Cloudflare Workers 和 KV 存储,通过与 Cosmoe API 交互实现完整的预约生命周期管理。
+
+该系统的核心功能包括:
+- 活动浏览和详情查看
+- 时间槽选择和预约
+- 优惠券应用和价格计算
+- 预约历史查询和状态管理
+- 取消预约和退款处理
+- 定时任务通知新活动
+
+## 项目结构
+
+系统采用模块化设计,主要分为以下几个层次:
+
+```mermaid
+graph TB
+subgraph "入口层"
+A[src/index.ts] --> B[命令设置]
+end
+subgraph "命令处理器层"
+B --> C[事件命令]
+B --> D[预约命令]
+B --> E[历史命令]
+B --> F[取消命令]
+B --> G[登录命令]
+B --> H[登出命令]
+end
+subgraph "客户端层"
+I[CosmoeClient] --> J[API 调用]
+J --> K[认证]
+J --> L[预约]
+J --> M[历史]
+J --> N[取消]
+end
+subgraph "存储层"
+O[KV 存储]
+P[会话存储]
+end
+subgraph "调度层"
+Q[scheduler/index.ts] --> R[定时任务]
+end
+C --> I
+D --> I
+E --> I
+F --> I
+G --> I
+H --> I
+I --> O
+I --> P
+R --> A
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [package.json](file://package.json#L1-L24)
+
+## 核心组件
+
+### 1. 主入口应用
+- **文件路径**: [src/index.ts](file://src/index.ts#L1-L47)
+- **功能**: 初始化 Telegram Bot,配置命令路由,设置 Webhook 和定时任务
+
+### 2. 命令处理器系统
+- **文件路径**: [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- **功能**: 
+  - 管理所有命令路由
+  - 配置会话存储(使用 KV 存储)
+  - 处理回调查询
+  - 管理用户对话流程
+
+### 3. Cosmoe API 客户端
+- **文件路径**: [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- **功能**:
+  - 用户认证和凭证管理
+  - 活动数据获取
+  - 预约操作执行
+  - 历史记录查询
+  - 取消和退款处理
+
+### 4. 调度系统
+- **文件路径**: [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- **功能**: 定时检查新活动并发送通知给注册用户
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+## 架构概览
+
+系统采用分层架构设计,确保职责分离和可维护性:
+
+```mermaid
+graph TB
+subgraph "用户界面层"
+A[Telegram Bot]
+B[Inline Keyboard]
+C[消息格式化]
+end
+subgraph "应用逻辑层"
+D[命令处理器]
+E[会话管理]
+F[业务逻辑]
+end
+subgraph "数据访问层"
+G[CosmoeClient]
+H[API 适配器]
+I[数据模型]
+end
+subgraph "存储层"
+J[KV 存储]
+K[会话状态]
+L[用户凭证]
+end
+subgraph "外部服务"
+M[Cosmoe API]
+N[Cloudflare Workers]
+O[Telegram API]
+end
+A --> D
+D --> E
+E --> F
+F --> G
+G --> H
+H --> J
+J --> M
+N --> O
+O --> A
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L19-L34)
+- [src/command/index.ts](file://src/command/index.ts#L52-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L140)
+
+### 数据流架构
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot
+participant C as 命令处理器
+participant A as CosmoeClient
+participant S as KV存储
+participant API as Cosmoe API
+U->>B : 发送命令
+B->>C : 路由到相应处理器
+C->>S : 读取用户凭证
+C->>A : 执行业务操作
+A->>API : 调用API接口
+API-->>A : 返回数据
+A-->>C : 处理结果
+C->>S : 更新状态
+C-->>U : 返回响应
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L78-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L247-L270)
+
+## 详细组件分析
+
+### 预约流程组件
+
+#### 1. 预约处理流程
+
+```mermaid
+flowchart TD
+A[用户输入 /book_eventId_slotIndex] --> B[解析参数]
+B --> C[验证用户登录状态]
+C --> D[获取活动详情]
+D --> E[验证时间槽有效性]
+E --> F{是否有优惠券?}
+F --> |是| G[显示优惠券选择]
+F --> |否| H[直接预约]
+G --> I[用户选择优惠券]
+I --> J[执行预约]
+H --> J
+J --> K{预约成功?}
+K --> |是| L[返回成功信息]
+K --> |否| M[返回错误信息]
+L --> N[结束]
+M --> N
+```
+
+**图表来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L118)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L160-L226)
+
+#### 2. 预约状态管理
+
+系统支持以下预约状态:
+- **待确认**: 新创建的预约
+- **已完成**: 活动已结束
+- **已取消**: 用户主动取消
+- **待支付**: 需要完成支付
+
+#### 3. 时间槽管理
+
+```mermaid
+classDiagram
+class TimeSlot {
++string range
++string price
++number capacity
++number remaining
++validateAvailability() boolean
++updateRemaining(change) void
+}
+class EventDetail {
++number id
++string name
++TimeSlot[] slots
++validateTimeSlot(range) boolean
++getAvailableSlots() TimeSlot[]
+}
+class Booking {
++number id
++string status
++string time_slot
++string final_price
++string payment_order_id
++validateConflict(other) boolean
+}
+EventDetail --> TimeSlot : "包含多个"
+Booking --> TimeSlot : "关联"
+```
+
+**图表来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L29-L50)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L95-L105)
+
+**章节来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L11-L157)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L29-L50)
+
+### 历史查询组件
+
+#### 1. 历史记录展示
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot
+participant H as 历史处理器
+participant C as CosmoeClient
+participant API as Cosmoe API
+U->>B : /history
+B->>H : 处理历史命令
+H->>C : 获取用户凭证
+H->>C : 调用 getMyBookings()
+C->>API : 请求历史数据
+API-->>C : 返回历史记录
+C-->>H : 处理后的数据
+H->>H : 格式化显示
+H-->>U : 发送历史消息
+```
+
+**图表来源**
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L4-L107)
+
+#### 2. 分页和筛选机制
+
+系统实现了智能的历史记录分页:
+- 默认显示最新的 8 条记录
+- 支持按日期排序(最新在前)
+- 自动过滤过期记录
+- 限制消息长度避免 Telegram API 限制
+
+**章节来源**
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L46-L92)
+
+### 取消预约组件
+
+#### 1. 取消流程
+
+```mermaid
+flowchart TD
+A[用户输入 /cancel_bookingId] --> B[验证用户登录]
+B --> C[获取用户历史]
+C --> D[查找目标预约]
+D --> E[显示确认对话框]
+E --> F{用户确认?}
+F --> |是| G[调用取消API]
+F --> |否| H[取消操作]
+G --> I{取消成功?}
+I --> |是| J[返回成功信息]
+I --> |否| K[返回错误信息]
+J --> L[结束]
+K --> L
+H --> L
+```
+
+**图表来源**
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L11-L84)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L86-L132)
+
+#### 2. 业务规则和约束
+
+取消预约的业务规则:
+- 只能取消状态为"待确认"或"待支付"的预约
+- 不能取消已完成或已取消的预约
+- 不能取消过去的预约
+- 需要用户确认才能执行
+
+**章节来源**
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L117-L124)
+
+### 认证和会话管理
+
+#### 1. 交互式登录流程
+
+```mermaid
+sequenceDiagram
+participant U as 用户
+participant B as Bot
+participant L as 登录处理器
+participant C as CosmoeClient
+participant API as Cosmoe API
+participant S as KV存储
+U->>B : /login
+B->>L : 进入登录会话
+L->>U : 请求用户名
+U->>L : 输入用户名
+L->>U : 请求密码
+U->>L : 输入密码
+L->>C : 调用getToken()
+C->>API : 验证凭据
+API-->>C : 返回token
+C-->>L : 认证结果
+L->>S : 存储凭证
+L-->>U : 登录成功
+```
+
+**图表来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L13-L75)
+
+### 优惠券系统
+
+#### 1. 优惠券应用流程
+
+```mermaid
+flowchart TD
+A[用户选择时间槽] --> B[检查可用优惠券]
+B --> C{有多张优惠券?}
+C --> |是| D[显示优惠券选择键盘]
+C --> |否| E{有单张优惠券?}
+D --> F[用户选择优惠券]
+E --> |是| F
+E --> |否| G[直接预约]
+F --> H[执行预约带优惠券]
+G --> H
+H --> I[计算最终价格]
+I --> J[返回预约结果]
+```
+
+**图表来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L65-L110)
+
+#### 2. 优惠券类型支持
+
+系统支持两种优惠券类型:
+- **百分比折扣**: 基于原价的百分比减免
+- **固定金额折扣**: 固定金额减免
+
+**章节来源**
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L76-L106)
+
+## 依赖关系分析
+
+### 外部依赖
+
+```mermaid
+graph LR
+subgraph "核心框架"
+A[grammy]
+B[@grammyjs/conversations]
+C[@grammyjs/storage-cloudflare]
+end
+subgraph "运行时环境"
+D[Cloudflare Workers]
+E[KV 存储]
+F[Webhook]
+end
+subgraph "外部服务"
+G[Telegram API]
+H[Cosmoe API]
+end
+A --> D
+B --> D
+C --> E
+D --> F
+D --> G
+A --> H
+```
+
+**图表来源**
+- [package.json](file://package.json#L18-L22)
+
+### 内部模块依赖
+
+```mermaid
+graph TD
+A[src/index.ts] --> B[src/command/index.ts]
+B --> C[src/command/handlers/*.ts]
+C --> D[src/client/cosmoe.ts]
+A --> E[src/scheduler/index.ts]
+D --> F[KV 存储]
+C --> F
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L3-L4)
+- [src/command/index.ts](file://src/command/index.ts#L1-L11)
+
+**章节来源**
+- [package.json](file://package.json#L18-L22)
+- [src/index.ts](file://src/index.ts#L1-L47)
+
+## 性能考虑
+
+### 1. 缓存策略
+- 使用 KV 存储缓存用户凭证,避免重复认证
+- 会话状态持久化,支持断线重连
+- 定时任务优化,避免频繁 API 调用
+
+### 2. 并发处理
+- 基于 Cloudflare Workers 的无服务器架构
+- 异步处理用户请求
+- 会话隔离,避免状态冲突
+
+### 3. 错误处理
+- 全面的异常捕获和错误恢复
+- 用户友好的错误提示
+- 日志记录便于调试
+
+## 故障排除指南
+
+### 常见问题及解决方案
+
+#### 1. 登录失败
+**症状**: 用户无法登录系统
+**可能原因**:
+- 用户名或密码错误
+- 网络连接问题
+- Cosmoe API 服务不可用
+
+**解决步骤**:
+1. 检查用户名和密码是否正确
+2. 验证网络连接
+3. 确认 Cosmoe API 服务状态
+4. 重新尝试登录
+
+#### 2. 预约失败
+**症状**: 预约请求返回错误
+**可能原因**:
+- 时间槽已满
+- 用户未登录
+- API 调用超时
+
+**解决步骤**:
+1. 检查时间槽剩余容量
+2. 确认用户已登录
+3. 重试预约操作
+4. 查看系统日志
+
+#### 3. 历史记录为空
+**症状**: /history 命令返回空结果
+**可能原因**:
+- 用户没有预约记录
+- API 数据同步延迟
+- 用户凭证过期
+
+**解决步骤**:
+1. 确认用户确实有预约记录
+2. 等待数据同步完成
+3. 重新登录获取新凭证
+4. 联系管理员检查系统状态
+
+**章节来源**
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L67-L69)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L43-L46)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L41-L44)
+
+## 结论
+
+这个预约管理系统展现了现代聊天机器人开发的最佳实践:
+
+### 主要优势
+- **模块化设计**: 清晰的分层架构,易于维护和扩展
+- **用户体验**: 流畅的交互流程,支持多种操作场景
+- **可靠性**: 完善的错误处理和状态管理
+- **可扩展性**: 基于 Cloudflare Workers 的无服务器架构
+
+### 技术亮点
+- **会话管理**: 基于 KV 存储的会话状态管理
+- **实时通知**: 定时任务自动推送新活动通知
+- **状态机**: 清晰的预约状态流转
+- **安全认证**: 客户端凭证管理和会话隔离
+
+### 改进建议
+- 添加更详细的日志记录
+- 实现更灵活的权限控制系统
+- 增加更多统计和报告功能
+- 优化移动端用户体验
+
+## 附录
+
+### API 接口规范
+
+#### 1. 预约相关接口
+- `bookEvent()`: 创建新的预约
+- `getMyBookings()`: 获取用户预约历史
+- `cancelBooking()`: 取消现有预约
+- `updatePaymentOrder()`: 更新支付订单
+
+#### 2. 用户相关接口
+- `getToken()`: 获取认证令牌
+- `getProfile()`: 获取用户资料
+- `getAvailableCoupons()`: 获取可用优惠券
+
+#### 3. 活动相关接口
+- `getEvents()`: 获取活动列表
+- `getEventDetail()`: 获取活动详情
+
+### 最佳实践建议
+
+#### 1. 预约流程最佳实践
+- 提前检查时间槽容量
+- 明确展示费用明细
+- 提供多种支付方式
+- 及时发送确认通知
+
+#### 2. 用户体验优化
+- 提供清晰的操作指引
+- 实时反馈操作状态
+- 支持快捷操作
+- 保持界面简洁
+
+#### 3. 系统维护建议
+- 定期备份 KV 数据
+- 监控 API 响应时间
+- 优化错误处理逻辑
+- 持续改进用户体验

+ 338 - 0
.qoder/repowiki/zh/content/测试与调试.md

@@ -0,0 +1,338 @@
+# 测试与调试
+
+<cite>
+**本文引用的文件**
+- [vitest.config.mts](file://vitest.config.mts)
+- [test/index.spec.ts](file://test/index.spec.ts)
+- [test/env.d.ts](file://test/env.d.ts)
+- [test/tsconfig.json](file://test/tsconfig.json)
+- [package.json](file://package.json)
+- [tsconfig.json](file://tsconfig.json)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向 Cosmoe Bot 的测试与调试实践,围绕以下目标展开:
+- 单元测试:基于 Vitest 与 @cloudflare/vitest-pool-workers 的配置与用法,覆盖 Worker 入口、命令处理器、API 客户端等模块。
+- 集成测试:通过 cloudflare:test 提供的执行上下文与 SELF 端到端调用,验证从 Telegram 到 Worker 再到外部 API 的完整链路。
+- 调试技巧:Wrangler 调试模式、浏览器开发者工具、日志分析与可观测性。
+- 性能与压力测试:在本地与 Workers 环境中进行基准与压力评估的实施路径。
+
+## 项目结构
+该项目采用 Cloudflare Workers + Vitest 测试框架,核心目录与职责如下:
+- src:业务逻辑入口、命令注册、调度任务、API 客户端
+- test:Vitest 测试套件、类型声明与测试 TS 配置
+- 根目录:Vitest 配置、Wrangler 配置、包脚本与类型生成
+
+```mermaid
+graph TB
+subgraph "测试层"
+VConf["vitest.config.mts"]
+TSpec["test/index.spec.ts"]
+TEnv["test/env.d.ts"]
+TTsc["test/tsconfig.json"]
+end
+subgraph "应用层"
+Entry["src/index.ts"]
+Cmd["src/command/index.ts"]
+Sched["src/scheduler/index.ts"]
+Client["src/client/cosmoe.ts"]
+Handlers["src/command/handlers/*.ts"]
+end
+subgraph "运行时配置"
+Wcfg["wrangler.jsonc"]
+Wtype["worker-configuration.d.ts"]
+Pkg["package.json"]
+TsMain["tsconfig.json"]
+end
+VConf --> TSpec
+TSpec --> Entry
+TSpec --> Sched
+Entry --> Cmd
+Cmd --> Handlers
+Entry --> Client
+Sched --> Client
+Wcfg --> Entry
+Wcfg --> Sched
+Pkg --> VConf
+TsMain --> Entry
+TsMain --> Cmd
+TsMain --> Sched
+TsMain --> Client
+Wtype --> Entry
+Wtype --> Sched
+```
+
+图表来源
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L800)
+- [package.json](file://package.json#L1-L24)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+
+章节来源
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L800)
+- [package.json](file://package.json#L1-L24)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+
+## 核心组件
+- Worker 入口与命令系统:负责初始化 Bot、注册命令与回调、设置菜单,并通过 webhook 回调接入 Cloudflare 运行时。
+- 命令处理器:提供 start、login(交互式对话)、events、event_*、book_*、history、cancel_*、callbackQuery 等处理流程。
+- API 客户端:封装对 Cosmoe API 的请求,包括认证、事件查询、用户资料、预订、优惠券、支付单号更新、变更/转移/取消等。
+- 调度任务:定时拉取新活动并向已注册用户发送通知,同时维护最新活动 ID。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 架构总览
+下图展示测试视角下的关键交互:Vitest 使用 @cloudflare/vitest-pool-workers 在本地启动 Workers 环境,通过 cloudflare:test 的执行上下文与 SELF 发起请求,从而覆盖 Worker 入口与调度器。
+
+```mermaid
+sequenceDiagram
+participant VT as "Vitest"
+participant CF as "cloudflare : test"
+participant SELF as "SELF"
+participant WR as "src/index.ts"
+participant SCH as "src/scheduler/index.ts"
+VT->>CF : "创建执行上下文<br/>等待 waitUntil 完成"
+CF->>SELF : "发起请求到 /"
+SELF->>WR : "fetch(request, env, ctx)"
+WR-->>SELF : "返回 Response"
+SELF-->>CF : "断言响应内容"
+VT->>CF : "触发 scheduled 事件"
+CF->>SCH : "scheduled(controller, env, ctx)"
+SCH-->>CF : "完成通知逻辑"
+```
+
+图表来源
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+## 详细组件分析
+
+### 单元测试与 Vitest 配置
+- 测试运行池:通过 @cloudflare/vitest-pool-workers 将 Vitest 与 Wrangler 配置绑定,确保测试在 Workers 环境中执行。
+- 测试入口:使用 cloudflare:test 提供的辅助函数创建请求、执行上下文,并等待 waitUntil 中的异步任务完成。
+- 类型与环境:通过 test/tsconfig.json 引入 @cloudflare/vitest-pool-workers 类型;test/env.d.ts 将 Env 注入到测试环境。
+
+建议的测试设计模式
+- 模块化:每个被测模块(命令处理器、API 客户端)独立编写测试文件,便于聚焦与维护。
+- 模拟对象:对外部依赖(KV、Telegram API、Cosmoe API)进行模拟,避免真实网络与持久化。
+- 断言策略:对响应文本、回调行为、KV 写入、异常抛出进行断言。
+
+章节来源
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+- [test/env.d.ts](file://test/env.d.ts#L1-L4)
+- [test/tsconfig.json](file://test/tsconfig.json#L1-L9)
+
+### Worker 入口与命令系统测试
+- 入口测试要点:构造 Request,创建空执行上下文,调用 worker.fetch 并断言响应;使用 waitOnExecutionContext 等待后台任务。
+- 命令注册:通过 setupCommands 安装对话插件与各命令处理器,测试应覆盖命令匹配、正则路由与回调查询。
+- 环境变量:Bot 令牌、KV 绑定、Bot 信息等由 wrangler.jsonc 提供,测试需在相同环境下运行。
+
+```mermaid
+flowchart TD
+Start(["开始:构造请求"]) --> Ctx["创建执行上下文"]
+Ctx --> Fetch["调用 worker.fetch"]
+Fetch --> Wait["等待 waitUntil 完成"]
+Wait --> Assert["断言响应内容/状态"]
+Assert --> End(["结束"])
+```
+
+图表来源
+- [test/index.spec.ts](file://test/index.spec.ts#L10-L18)
+- [src/index.ts](file://src/index.ts#L13-L46)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [wrangler.jsonc](file://wrangler.jsonc#L18-L31)
+
+### API 客户端测试策略
+- 网络请求模拟:使用 fetch 的模拟实现,控制返回码与数据,覆盖成功、鉴权缺失、参数校验失败等分支。
+- 错误场景:模拟网络异常、服务端错误、鉴权失败、参数不合法等。
+- 异步操作:对所有异步方法进行超时与重试策略测试,确保 Promise 正常收敛。
+- 数据契约:基于接口定义(如 ApiResponse、Event、UserProfile 等)编写结构化断言。
+
+```mermaid
+classDiagram
+class CosmoeClient {
++getToken(username, password)
++getEvents()
++getEventDetail(eventId)
++getProfile()
++getMyBookings()
++bookEvent(request)
++changePassword(old, new)
++getUserProfile()
++getAvailableCoupons(eventId)
++updatePaymentOrder(bookingId, orderId)
++updateBookingNote(bookingId, note)
++cancelBooking(bookingId)
++selfReschedule(bookingId, slot)
++selfTransfer(bookingId, username)
++register(key, username, email, password, identity)
++setCredentials(userId, token)
++getCredentials()
++isAuthenticated()
+}
+```
+
+图表来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+### 命令处理器测试
+- start 命令:验证消息回复内容与格式。
+- login 交互:模拟用户输入用户名/密码,断言登录结果与 KV 写入。
+- events 命令:断言事件列表构建与 Markdown 格式输出。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant B as "Bot"
+participant H as "handleEventsCommand"
+participant C as "CosmoeClient"
+U->>B : "/events"
+B->>H : "调用处理器"
+H->>C : "getEvents()"
+C-->>H : "返回事件列表"
+H-->>U : "发送 Markdown 消息"
+```
+
+图表来源
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+
+章节来源
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+
+### 调度任务测试
+- 场景设计:准备不同时间点的事件列表,验证“新增事件”过滤逻辑与 KV 最大 ID 更新。
+- 测试数据:使用 COSMOE_STORAGE 存储 latestEventId,COSMOE_CREDENTIALS 存储用户凭证,模拟多用户通知。
+- 环境隔离:通过 Wrangler 配置的 KV 绑定与 cron 触发器,在测试中以 scheduled 事件驱动。
+
+```mermaid
+flowchart TD
+S(["定时触发"]) --> Load["读取 latestEventId"]
+Load --> Fetch["调用 CosmoeClient.getEvents()"]
+Fetch --> Filter{"存在新事件?"}
+Filter -- 否 --> End(["结束"])
+Filter -- 是 --> LoopUsers["遍历已注册用户"]
+LoopUsers --> Notify["bot.api.sendMessage(...)"]
+Notify --> Update["更新 latestEventId"]
+Update --> End
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L177-L184)
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L31)
+
+## 依赖关系分析
+- 测试依赖:Vitest + @cloudflare/vitest-pool-workers;cloudflare:test 提供执行上下文与 SELF。
+- 应用依赖:grammy 与 @grammyjs/conversations 实现对话与命令;KV 命名空间用于会话与凭证存储。
+- 运行时依赖:Wrangler 提供 KV 绑定、cron 触发器与可观测性开关。
+
+```mermaid
+graph LR
+Pkg["package.json"] --> Vitest["@cloudflare/vitest-pool-workers"]
+Pkg --> Wrk["wrangler"]
+Vitest --> VConf["vitest.config.mts"]
+VConf --> TSpec["test/index.spec.ts"]
+TSpec --> Entry["src/index.ts"]
+Entry --> Cmd["src/command/index.ts"]
+Cmd --> Handlers["src/command/handlers/*.ts"]
+Entry --> Client["src/client/cosmoe.ts"]
+Sched["src/scheduler/index.ts"] --> Client
+Wcfg["wrangler.jsonc"] --> Entry
+Wcfg --> Sched
+```
+
+图表来源
+- [package.json](file://package.json#L12-L22)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+章节来源
+- [package.json](file://package.json#L1-L24)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 性能考虑
+- 测试并发:在 Vitest 中合理拆分测试用例,避免阻塞;对异步任务使用 waitUntil 的等待策略。
+- 外部依赖模拟:对 fetch、KV、Telegram API 进行模拟,减少真实网络开销。
+- 基准测试:在本地与 Workers 环境分别测量命令处理与 API 请求的延迟,关注冷启动与热身差异。
+- 压力测试:通过 Wrangler dev 的本地代理与日志观测,评估高并发下的稳定性与资源占用。
+
+## 故障排查指南
+- 日志与可观测性:启用 wrangler.jsonc 中的 observability 开关,结合浏览器开发者工具 Network 面板查看请求与响应。
+- 调试模式:使用 Wrangler dev 启动本地开发服务器,配合断点与日志定位问题。
+- 环境隔离:确保测试与生产环境的 KV 绑定、cron 配置一致,避免因环境差异导致的失败。
+- 常见问题:
+  - 未等待 waitUntil:导致断言前异步任务未完成,需在测试中显式等待。
+  - KV 读写异常:检查命名空间绑定与键名格式,确保 JSON 序列化正确。
+  - Telegram API 返回异常:在处理器中捕获错误并记录堆栈,避免中断对话流程。
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+- [test/index.spec.ts](file://test/index.spec.ts#L15-L16)
+
+## 结论
+通过 Vitest 与 @cloudflare/vitest-pool-workers 的组合,Cosmoe Bot 能够在本地 Workers 环境中高效地进行单元与集成测试。配合 fetch、KV、Telegram API 的模拟,可覆盖从命令到 API 的完整链路。建议持续完善测试矩阵,强化边界条件与错误场景,并结合 Wrangler 的可观测性能力进行性能与稳定性评估。
+
+## 附录
+- 测试脚本:使用 npm/yarn 脚本运行测试,确保依赖安装与类型生成步骤正确。
+- 类型生成:通过 wrangler types 生成运行时类型声明,保证测试与生产环境类型一致性。
+
+章节来源
+- [package.json](file://package.json#L5-L11)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L800)

+ 375 - 0
.qoder/repowiki/zh/content/部署与运维/CI_CD 流水线.md

@@ -0,0 +1,375 @@
+# CI/CD 流水线
+
+<cite>
+**本文引用的文件**
+- [package.json](file://package.json)
+- [vitest.config.mts](file://vitest.config.mts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [tsconfig.json](file://tsconfig.json)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [test/index.spec.ts](file://test/index.spec.ts)
+- [.gitignore](file://.gitignore)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向 Cosmoe Bot 的 CI/CD 流水线设计与实施,目标是提供一套可落地的自动化测试、GitOps 工作流、多环境部署与安全策略,并给出监控与回滚的最佳实践。项目基于 Cloudflare Workers(Wrangler)与 Vitest 单元测试框架,具备定时任务与 KV 存储能力,适合在 GitHub Actions 等平台中实现端到端流水线。
+
+## 项目结构
+- 核心运行时入口为 src/index.ts,导出默认模块用于处理 HTTP 请求与计划任务。
+- 命令与会话逻辑集中在 src/command/index.ts,使用 @grammyjs/conversations 与 @grammyjs/storage-cloudflare 进行对话状态持久化。
+- 定时任务逻辑位于 src/scheduler/index.ts,通过 Wrangler 触发器周期性执行。
+- 客户端封装了与外部 Cosmoe API 的交互,位于 src/client/cosmoe.ts。
+- 测试使用 Vitest,配置于 vitest.config.mts,测试入口为 test/index.spec.ts。
+- 部署与运行时配置由 wrangler.jsonc 提供,类型声明通过 worker-configuration.d.ts 生成。
+
+```mermaid
+graph TB
+A["src/index.ts<br/>导出默认模块"] --> B["src/command/index.ts<br/>命令与会话"]
+A --> C["src/scheduler/index.ts<br/>计划任务"]
+B --> D["src/client/cosmoe.ts<br/>外部 API 客户端"]
+E["test/index.spec.ts<br/>单元测试入口"] --> A
+F["vitest.config.mts<br/>Vitest Workers 池配置"] --> E
+G["wrangler.jsonc<br/>部署与运行时配置"] --> A
+H["tsconfig.json<br/>编译配置"] --> A
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+
+## 核心组件
+- 入口模块与导出接口:负责初始化 Bot、注册命令菜单、转发请求至 grammY 处理器,并暴露 scheduled 方法以支持计划任务。
+- 命令系统:集中注册 start、login、events、history、cancel 等命令,使用 KV 作为会话存储后端。
+- 计划任务:周期性拉取新活动并通知已注册用户,使用 KV 记录最新事件 ID,避免重复推送。
+- 外部 API 客户端:封装认证、查询活动、预订、取消等操作,统一返回结构体。
+- 测试框架:Vitest + Workers 池,使用 cloudflare:test 环境进行单元与集成测试。
+- 部署配置:Wrangler 统一管理名称、兼容时间、可观测性、触发器与 KV 绑定;tsconfig 控制编译行为。
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L6-L47)
+- [src/command/index.ts](file://src/command/index.ts#L13-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [wrangler.jsonc](file://wrangler.jsonc#L5-L31)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+
+## 架构总览
+下图展示从请求进入、命令处理、KV 会话存储、计划任务触发到外部 API 调用的整体流程。
+
+```mermaid
+graph TB
+subgraph "运行时"
+W["Worker 入口<br/>src/index.ts"]
+CMD["命令系统<br/>src/command/index.ts"]
+SCH["计划任务<br/>src/scheduler/index.ts"]
+KV["KV 命名空间<br/>wrangler.jsonc"]
+end
+subgraph "外部服务"
+TG["Telegram Bot API"]
+API["Cosmoe API<br/>src/client/cosmoe.ts"]
+end
+U["用户请求/回调"] --> W
+W --> CMD
+CMD --> KV
+W --> SCH
+SCH --> KV
+SCH --> TG
+CMD --> API
+API --> CMD
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L13-L47)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 详细组件分析
+
+### 组件 A:Worker 入口与导出接口
+- 责任边界:初始化 Bot、注册命令菜单、转发请求、暴露 scheduled。
+- 关键点:Bot 初始化时读取环境变量中的 BOT_INFO 与 BOT_TOKEN;命令菜单一次性设置;scheduled 调用业务处理函数。
+- 错误处理:命令菜单设置失败时记录错误日志;计划任务内捕获异常并记录。
+
+```mermaid
+sequenceDiagram
+participant CF as "Cloudflare Workers"
+participant IDX as "src/index.ts"
+participant CMD as "src/command/index.ts"
+participant API as "Telegram Bot API"
+CF->>IDX : "fetch(request)"
+IDX->>CMD : "setupCommands(bot, env)"
+CMD-->>IDX : "命令注册完成"
+IDX->>API : "setMyCommands([...])"
+IDX-->>CF : "返回响应"
+CF->>IDX : "scheduled(controller)"
+IDX->>CMD : "调用计划任务处理"
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L13-L47)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L13-L47)
+
+### 组件 B:命令系统与会话存储
+- 责任边界:注册命令、启动交互式登录会话、处理事件列表、历史记录、取消与登出。
+- 会话存储:使用 @grammyjs/storage-cloudflare 将会话状态写入 KV,确保跨请求一致性。
+- 回调处理:针对取消确认与优惠券选择的回调查询进行分发。
+
+```mermaid
+flowchart TD
+Start(["进入命令处理"]) --> RegCmd["注册命令与会话"]
+RegCmd --> Login["交互式登录会话"]
+RegCmd --> Events["查询活动列表"]
+RegCmd --> History["查看历史记录"]
+RegCmd --> Cancel["发起取消流程"]
+RegCmd --> Logout["执行登出"]
+Login --> KVWrite["KV 写入会话状态"]
+Events --> KVRead["KV 读取会话状态"]
+History --> KVRead
+Cancel --> KVRead
+Logout --> KVDelete["KV 删除会话状态"]
+KVWrite --> End(["结束"])
+KVRead --> End
+KVDelete --> End
+```
+
+**图表来源**
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+**章节来源**
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+### 组件 C:计划任务与通知
+- 责任边界:周期性检查新活动,向已注册用户发送 Markdown 通知,并更新最新事件 ID。
+- 数据一致性:使用 KV 存储 latestEventId,避免重复推送。
+- 异常处理:对单个用户的推送失败进行日志记录,不影响整体流程。
+
+```mermaid
+sequenceDiagram
+participant CRON as "计划任务触发器"
+participant SCH as "src/scheduler/index.ts"
+participant KV as "KV 存储"
+participant API as "Cosmoe API"
+participant TG as "Telegram Bot API"
+CRON->>SCH : "scheduled(controller)"
+SCH->>KV : "读取 latestEventId"
+SCH->>API : "获取所有活动"
+API-->>SCH : "返回活动列表"
+SCH->>KV : "遍历用户列表并发送通知"
+KV-->>SCH : "返回用户键集合"
+SCH->>TG : "sendMessage(userId, message)"
+TG-->>SCH : "返回消息ID"
+SCH->>KV : "更新 latestEventId"
+SCH-->>CRON : "完成"
+```
+
+**图表来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L17)
+
+**章节来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+### 组件 D:外部 API 客户端
+- 责任边界:封装认证、查询活动详情、用户资料、预订、取消、转场等 API。
+- 数据模型:定义 ApiResponse、Event、EventDetail、Booking、Coupon 等接口,保证类型安全。
+- 错误处理:未认证时抛出错误;密码长度校验;对网络请求结果进行结构化解析。
+
+```mermaid
+classDiagram
+class CosmoeClient {
++getToken(username, password)
++getEvents()
++getEventDetail(eventId)
++getProfile()
++getMyBookings()
++bookEvent(request)
++changePassword(current, new)
++getUserProfile()
++getAvailableCoupons(eventId)
++updatePaymentOrder(bookingId, orderId)
++updateBookingNote(bookingId, note)
++cancelBooking(bookingId)
++selfReschedule(bookingId, newSlot)
++selfTransfer(bookingId, recipient)
++register(key, username, email, password, identity)
+}
+```
+
+**图表来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+**章节来源**
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+### 组件 E:测试与配置
+- 单元测试:使用 Vitest 与 @cloudflare/vitest-pool-workers,在 Workers 环境中模拟请求与上下文。
+- 配置要点:Vitest 使用 defineWorkersConfig 指定 Wrangler 配置路径;tsconfig 启用严格模式与类型声明;.gitignore 排除 node_modules 与 wrangler 缓存目录。
+
+```mermaid
+flowchart TD
+TStart(["执行测试"]) --> VConf["加载 Vitest Workers 配置"]
+VConf --> Mock["创建请求与执行上下文"]
+Mock --> Run["执行 worker.fetch()"]
+Run --> Assert["断言响应内容"]
+Assert --> End(["测试结束"])
+```
+
+**图表来源**
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+
+**章节来源**
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [.gitignore](file://.gitignore#L52-L168)
+
+## 依赖关系分析
+- 运行时依赖:grammy、@grammyjs/conversations、@grammyjs/storage-cloudflare。
+- 开发依赖:vitest、@cloudflare/vitest-pool-workers、wrangler。
+- 类型与编译:tsconfig 控制模块解析、严格模式与类型声明;worker-configuration.d.ts 由 wrangler 生成,提供运行时类型。
+
+```mermaid
+graph LR
+P["package.json"] --> G["@grammyjs/conversations"]
+P --> GC["@grammyjs/storage-cloudflare"]
+P --> GR["grammy"]
+P --> VT["vitest"]
+P --> VP["@cloudflare/vitest-pool-workers"]
+P --> WR["wrangler"]
+TS["tsconfig.json"] --> SRC["src/**"]
+WC["worker-configuration.d.ts"] --> SRC
+WR --> CFG["wrangler.jsonc"]
+```
+
+**图表来源**
+- [package.json](file://package.json#L12-L22)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L12)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+**章节来源**
+- [package.json](file://package.json#L12-L22)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L12)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+## 性能考量
+- 测试并发:Vitest Workers 池通过 poolOptions.workers.wrangler 指定配置路径,建议在 CI 中限制并发以平衡资源占用。
+- KV 访问:会话与状态均依赖 KV,建议批量读取与写入,减少往返次数;对高频键值使用缓存策略。
+- 计划任务频率:当前配置为每分钟一次,建议根据业务量调整,避免过度触发。
+- 编译优化:tsconfig 启用严格模式与 isolatedModules,有助于早期发现潜在问题。
+
+[本节为通用指导,无需具体文件引用]
+
+## 故障排查指南
+- 测试失败定位
+  - 使用 Vitest 输出与断言信息定位问题;结合 cloudflare:test 的 createExecutionContext 与 waitOnExecutionContext 确保异步任务完成。
+  - 参考测试入口与配置文件定位执行上下文与请求构造方式。
+- 部署与运行时
+  - 检查 wrangler.jsonc 中的 triggers、vars、kv_namespaces 是否正确;确认 compatibility_date 与运行时版本匹配。
+  - 若类型报错,重新执行 wrangler types 生成 worker-configuration.d.ts。
+- 计划任务异常
+  - 查看计划任务日志,确认 KV 读写是否成功;核对用户列表与消息发送返回值。
+- 常见问题
+  - .gitignore 排除了 node_modules 与 wrangler 缓存,确保 CI 环境安装依赖后再执行测试与部署。
+
+**章节来源**
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+- [vitest.config.mts](file://vitest.config.mts#L1-L12)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L12)
+- [.gitignore](file://.gitignore#L52-L168)
+
+## 结论
+本方案以 Wrangler 与 Vitest 为核心,结合 Cloudflare Workers 的 KV 与计划任务能力,提供了可扩展的 CI/CD 基础设施。通过严格的测试配置、清晰的命令与计划任务职责划分,以及完善的类型声明,能够支撑从开发到生产的全链路自动化。后续可在 CI 平台中按 GitOps 工作流推进,实现多环境自动化与安全治理。
+
+[本节为总结性内容,无需具体文件引用]
+
+## 附录
+
+### GitOps 工作流设计建议
+- 分支策略
+  - main:受保护分支,仅允许通过合并请求(含审查)合并。
+  - develop:每日构建与集成测试分支,合并前需通过 CI。
+  - feature/*:功能开发分支,定期 rebase develop。
+- 代码审查
+  - 强制至少一名审查者批准;审查者不得为提交作者。
+  - 合并前必须通过测试与静态检查。
+- 自动化部署触发条件
+  - main 分支 push:触发生产环境部署。
+  - develop 分支 push:触发测试环境部署。
+  - feature/* 合并:触发预发布环境部署(可选)。
+
+### 多环境部署与自动化切换
+- 环境变量与 KV
+  - 通过 wrangler.jsonc 的 vars 与 kv_namespaces 区分不同环境的配置与命名空间。
+  - 在 CI 中使用 secrets 注入敏感信息,避免硬编码。
+- 部署策略
+  - 生产:手动批准或满足特定标签触发;部署后进行健康检查。
+  - 测试:自动部署并运行测试套件;失败时阻断。
+  - 开发:按需部署,支持快速迭代与回滚。
+
+### 权限管理与安全策略
+- 最小权限原则
+  - 为不同环境分配独立的 API 密钥与 KV 命名空间访问权限。
+- 机密管理
+  - 使用 CI 平台的密钥管理服务存储 BOT_TOKEN、API 凭据等;禁止在仓库中提交。
+- 审计与可观测性
+  - 启用 Wrangler observability;在 CI 日志中记录关键步骤与结果。
+
+### 回滚机制与最佳实践
+- 版本化与灰度
+  - 采用语义化版本号标记部署;先在测试环境验证,再灰度到生产。
+- 快速回滚
+  - 保留最近若干次部署版本;出现严重问题时一键回滚至上一个稳定版本。
+- 监控与告警
+  - 结合 Cloudflare Workers 日志与指标,建立失败率与延迟阈值告警。
+
+### 监控流水线执行状态与失败分析
+- 测试阶段
+  - 记录 Vitest 执行时间、断言失败详情与覆盖率报告。
+- 构建阶段
+  - 记录编译耗时、类型检查结果与打包产物大小。
+- 部署阶段
+  - 记录部署时间、环境变量注入情况与 KV 更新结果;对计划任务进行健康检查。
+
+[本节为通用指导,无需具体文件引用]

+ 370 - 0
.qoder/repowiki/zh/content/部署与运维/故障排除与维护.md

@@ -0,0 +1,370 @@
+# 故障排除与维护
+
+<cite>
+**本文引用的文件列表**
+- [package.json](file://package.json)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+- [src/index.ts](file://src/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [test/index.spec.ts](file://test/index.spec.ts)
+- [vitest.config.mts](file://vitest.config.mts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [紧急恢复操作](#紧急恢复操作)
+10. [定期维护任务](#定期维护任务)
+11. [灾难恢复与数据备份](#灾难恢复与数据备份)
+12. [结论](#结论)
+
+## 简介
+本指南面向 Cosmoe Bot 的运维与开发人员,聚焦于在 Cloudflare Workers 平台上运行的 Telegram 机器人在部署、运行、性能与稳定性方面的故障排除与维护实践。内容覆盖:
+- Worker 启动失败、API 调用超时、KV 存储访问错误等常见问题的诊断与处理
+- 日志分析技巧(Cloudflare Workers 日志定位根因)
+- 性能问题识别与优化(冷启动、内存、执行时间)
+- 紧急恢复(快速回滚、临时修复、降级策略)
+- 定期维护(缓存清理、日志轮转、资源清理)
+- 灾难恢复与数据备份
+- 与 Telegram Bot API 集成相关的故障排除
+
+## 项目结构
+Cosmoe Bot 是一个基于 Cloudflare Workers 的 Telegram 机器人,采用模块化组织:
+- 入口与生命周期:src/index.ts 提供 fetch 与 scheduled 处理器
+- 命令系统:src/command/index.ts 注册命令与对话(conversations),并绑定 KV 存储
+- 业务客户端:src/client/cosmoe.ts 封装外部 Cosmoe API 的调用
+- 计划任务:src/scheduler/index.ts 每分钟扫描新活动并向用户推送通知
+- 测试:test/index.spec.ts 使用 @cloudflare/vitest-pool-workers 在 Workers 环境中进行单元与集成测试
+
+```mermaid
+graph TB
+subgraph "入口与生命周期"
+IDX["src/index.ts"]
+SCHED["src/scheduler/index.ts"]
+end
+subgraph "命令与对话"
+CMD["src/command/index.ts"]
+H_START["src/command/handlers/start.ts"]
+H_LOGIN["src/command/handlers/login.ts"]
+H_EVENTS["src/command/handlers/events.ts"]
+H_HISTORY["src/command/handlers/history.ts"]
+end
+subgraph "外部服务"
+API["Cosmoe API<br/>https://cos.cx/api/v1"]
+TG["Telegram Bot API"]
+end
+subgraph "存储"
+KV1["KV: COSMOE_CREDENTIALS"]
+KV2["KV: COSMOE_STORAGE"]
+end
+IDX --> CMD
+CMD --> H_START
+CMD --> H_LOGIN
+CMD --> H_EVENTS
+CMD --> H_HISTORY
+CMD --> KV1
+CMD --> KV2
+SCHED --> KV2
+SCHED --> TG
+H_LOGIN --> API
+H_EVENTS --> API
+H_HISTORY --> API
+H_HISTORY --> KV1
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 核心组件
+- 入口与生命周期
+  - fetch:初始化 Bot、注册命令菜单、通过 Cloudflare webhook 回调处理请求
+  - scheduled:每分钟触发一次,检查新活动并推送通知
+- 命令系统与对话
+  - 使用 @grammyjs/conversations 插件,结合 @grammyjs/storage-cloudflare 的 KV 适配器持久化对话状态
+  - 支持交互式登录、活动查询、历史查看、取消预约等命令
+- 外部 API 客户端
+  - 封装 Cosmoe API 的认证、事件、个人资料、预约等接口,统一返回结构
+- 存储
+  - KV 命名空间 COSMOE_CREDENTIALS:按 Telegram 用户 ID 存储第三方凭证
+  - KV 命名空间 COSMOE_STORAGE:用于持久化调度任务状态(如最新活动 ID)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+
+## 架构总览
+下图展示从 Telegram 请求到外部 API、KV 存储与计划任务的整体流程。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant W as "Worker 入口<br/>src/index.ts"
+participant B as "Bot/命令系统<br/>src/command/index.ts"
+participant KV as "KV 存储<br/>COSMOE_CREDENTIALS/COSMOE_STORAGE"
+participant API as "Cosmoe API"
+participant S as "计划任务<br/>src/scheduler/index.ts"
+U->>W : "POST Webhook"
+W->>B : "webhookCallback(...) 分发"
+B->>KV : "读取/写入对话/凭证"
+B->>API : "调用 Cosmoe API"
+API-->>B : "返回结果"
+B-->>U : "发送消息/内联键盘"
+S->>KV : "读取最新活动 ID"
+S->>API : "拉取活动列表"
+API-->>S : "返回活动"
+S->>U : "向已注册用户推送新活动"
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L14-L35)
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+## 详细组件分析
+
+### 组件一:入口与生命周期(fetch/scheduled)
+- 关键点
+  - 初始化 Bot 并设置命令菜单;若设置失败,记录错误日志
+  - 通过 Cloudflare webhook 回调处理请求
+  - scheduled 每分钟触发,检查新活动并逐用户推送通知
+- 常见问题
+  - Worker 启动失败:检查环境变量、KV 绑定、兼容性日期配置
+  - API 调用超时:关注外部 API 响应时间与重试策略
+  - KV 访问错误:确认 KV 名称空间绑定与权限
+
+章节来源
+- [src/index.ts](file://src/index.ts#L14-L46)
+- [wrangler.jsonc](file://wrangler.jsonc#L5-L31)
+
+### 组件二:命令系统与对话(conversations + KV)
+- 关键点
+  - 使用 KV 适配器持久化对话状态,避免冷启动丢失上下文
+  - 命令注册与回调查询处理,支持交互式登录、活动详情、预约、历史、取消等
+- 常见问题
+  - 对话状态丢失:检查 KV 写入/读取异常与序列化错误
+  - 命令无响应:确认命令注册顺序与回调正则匹配
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L110)
+
+### 组件三:外部 API 客户端(CosmoeClient)
+- 关键点
+  - 统一封装认证、事件、个人资料、预约、优惠券、变更密码、转账、取消等接口
+  - 返回统一结构,便于上层处理
+- 常见问题
+  - 认证失败:用户名/密码错误或第三方接口异常
+  - 数据类型不一致:注意事件 ID 类型为字符串的情况
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+### 组件四:计划任务(新活动通知)
+- 关键点
+  - 每分钟扫描新活动,向已注册用户推送 Markdown 格式通知
+  - 使用 KV 存储最新活动 ID,避免重复推送
+- 常见问题
+  - 推送失败:检查 Telegram Bot API 可达性与用户是否屏蔽机器人
+  - KV 读写异常:确认命名空间权限与键值格式
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+## 依赖关系分析
+- 运行时依赖
+  - @grammyjs/conversations:对话插件
+  - @grammyjs/storage-cloudflare:KV 适配器
+  - grammy:Telegram Bot SDK
+- 开发依赖
+  - vitest、@cloudflare/vitest-pool-workers:在 Workers 环境中进行测试
+  - wrangler:部署与本地开发工具
+- 配置
+  - wrangler.jsonc:定义 Worker 名称、入口、兼容性日期、观测性、定时触发、KV 命名空间与变量
+
+```mermaid
+graph LR
+P["package.json"] --> G["@grammyjs/conversations"]
+P --> GC["@grammyjs/storage-cloudflare"]
+P --> GR["grammy"]
+P --> VIT["vitest"]
+P --> VWP["@cloudflare/vitest-pool-workers"]
+P --> WR["wrangler"]
+CFG["wrangler.jsonc"] --> ENV["环境变量/命名空间"]
+CFG --> OBS["观测性开关"]
+CFG --> TRIG["定时触发"]
+```
+
+图表来源
+- [package.json](file://package.json#L12-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L5-L31)
+
+章节来源
+- [package.json](file://package.json#L12-L22)
+- [wrangler.jsonc](file://wrangler.jsonc#L5-L31)
+
+## 性能考虑
+- 冷启动优化
+  - 减少入口初始化开销:仅在必要时加载大模块;避免在每次请求中重复初始化
+  - 预热:利用定时触发器在非高峰时段预热关键路径
+- 内存使用监控
+  - 使用 Wrangler 观测性(observability.enabled=true)收集指标
+  - 控制对话状态大小,避免 KV 写入超限
+- 执行时间分析
+  - 限制单次请求处理时间,将长耗时任务放入计划任务或异步队列
+  - 对外部 API 调用设置合理超时与重试策略
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+
+## 故障排除指南
+
+### 一、Worker 启动失败
+- 检查项
+  - 环境变量与 KV 绑定:确认 wrangler.jsonc 中 vars 与 kv_namespaces 正确
+  - 兼容性日期:确保 compatibility_date 与运行时版本匹配
+  - 入口文件路径:main 指向 src/index.ts
+  - 观测性:开启 observability 以启用日志与追踪
+- 常见原因
+  - KV 命名空间未正确绑定或 ID 错误
+  - 环境变量缺失(如 BOT_TOKEN、BOT_INFO)
+  - 入口导出对象缺少必需方法(fetch/scheduled)
+- 诊断步骤
+  - 本地 dev:使用 wrangler dev 验证入口与依赖
+  - 部署日志:查看 Cloudflare Workers 日志中的启动错误堆栈
+  - KV 权限:确认 KV 命名空间具备读写权限
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L5-L31)
+- [src/index.ts](file://src/index.ts#L13-L46)
+
+### 二、API 调用超时
+- 检查项
+  - 外部 API 可达性:确认 cos.cx 的网络连通性
+  - 请求超时与重试:在客户端增加超时控制与指数退避重试
+  - 代理/防火墙:检查 Cloudflare Workers 的 egress 限制
+- 诊断步骤
+  - 使用 curl 或浏览器直接访问 API 端点,验证响应时间
+  - 在客户端捕获并记录 fetch 异常与响应码
+  - 结合 Wrangler 观测性追踪外部请求耗时
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L503)
+
+### 三、KV 存储访问错误
+- 检查项
+  - KV 命名空间绑定:确认 COSMOE_CREDENTIALS 与 COSMOE_STORAGE 已在 wrangler.jsonc 中声明
+  - 键名规范:KV 键通常为字符串,注意整数转字符串
+  - 序列化:写入 KV 前需 JSON.stringify,读取后 JSON.parse
+- 诊断步骤
+  - 在命令处理器中添加 KV 读写异常日志
+  - 使用 Wrangler CLI 或 Dashboard 检查 KV 命名空间状态
+  - 验证 KV 值是否被正确更新
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L27-L78)
+
+### 四、Telegram Bot API 集成相关问题
+- 常见症状
+  - 命令菜单设置失败:检查 BOT_INFO 与 BOT_TOKEN 是否正确
+  - 推送通知失败:用户可能屏蔽机器人或 API 限流
+  - 回调查询无响应:确认回调正则与数据解析
+- 诊断步骤
+  - 使用 /setMyCommands 验证命令菜单设置
+  - 检查 webhook 配置与回调地址
+  - 在回调处理中记录 callbackQuery.data 并返回 answerCallbackQuery
+
+章节来源
+- [src/index.ts](file://src/index.ts#L24-L34)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L54-L68)
+- [src/command/index.ts](file://src/command/index.ts#L92-L105)
+
+### 五、日志分析技巧(Cloudflare Workers)
+- 启用观测性:确保 wrangler.jsonc 中 observability.enabled=true
+- 关键日志点
+  - 命令注册与菜单设置失败:入口 fetch 中的错误日志
+  - KV 读写异常:命令处理器与计划任务中的异常日志
+  - 外部 API 调用错误:客户端方法中的异常与响应码
+- 定位根因
+  - 使用时间戳与请求 ID(如存在)关联 fetch/scheduled/traces
+  - 区分“请求级”与“任务级”日志,优先排查最近出现的异常
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+- [src/index.ts](file://src/index.ts#L30-L32)
+- [src/command/index.ts](file://src/command/index.ts#L28-L47)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L81-L83)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L124-L140)
+
+## 紧急恢复操作
+- 快速回滚
+  - 使用 Wrangler 回滚到上一个稳定版本
+  - 若配置变更导致问题,回退 wrangler.jsonc 的 KV 绑定或变量
+- 临时修复
+  - 临时禁用高风险命令或计划任务,降低影响面
+  - 为外部 API 调用增加超时与重试,缓解瞬时抖动
+- 降级策略
+  - 降级 KV 存储:在对话状态中减少持久化字段
+  - 降级通知:暂停新活动推送,仅保留关键通知
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L5-L31)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L18)
+
+## 定期维护任务
+- 缓存清理
+  - 清理过期的对话状态与临时数据(KV)
+  - 控制 KV 写入频率,避免超出配额
+- 日志轮转
+  - 利用 Wrangler 观测性与日志导出,定期归档
+- 资源清理
+  - 清理不再使用的 KV 键(如已注销用户的凭证)
+  - 优化计划任务执行频率,避免重复推送
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L84)
+
+## 灾难恢复与数据备份
+- 数据备份
+  - 备份 KV 命名空间中的关键数据(如最新活动 ID、用户凭证)
+  - 使用 Wrangler CLI 导出 KV 数据,定期归档
+- 灾难恢复
+  - 快速切换到备用 KV 命名空间
+  - 回滚到已知稳定版本的 Worker 部署
+  - 重建命令菜单与 webhook 配置
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L76-L78)
+
+## 结论
+通过明确的组件职责、完善的日志与观测性配置、以及针对 KV、外部 API 与 Telegram Bot API 的专项排障流程,可以有效提升 Cosmoe Bot 的稳定性与可维护性。建议持续:
+- 强化异常日志与指标监控
+- 优化冷启动与 KV 访问路径
+- 建立自动化测试与回滚机制
+- 定期演练灾难恢复流程

+ 302 - 0
.qoder/repowiki/zh/content/部署与运维/监控告警.md

@@ -0,0 +1,302 @@
+# 监控告警
+
+<cite>
+**本文引用的文件**
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [package.json](file://package.json)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [.dev.vars](file://.dev.vars)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向 Cosmoe Bot 的 Cloudflare Workers 监控与告警体系,基于仓库现有配置与代码实现,系统化说明可观测性启用方式、日志采集、性能指标与错误跟踪现状,并给出可落地的自定义指标与告警规则建议、日志分析方法、通知机制配置思路、仪表板可视化建议以及常见场景(流量峰值、API 异常)的配置示例。由于当前仓库未直接集成 Analytics Engine 数据集与第三方监控工具,本文在“实现层面”严格依据仓库内容,在“最佳实践与扩展”部分提供可操作的增强方案。
+
+## 项目结构
+Cosmoe Bot 为 Cloudflare Workers 应用,采用模块化组织:
+- 入口导出默认对象,包含 fetch 与 scheduled 处理器
+- 命令子系统通过插件注册命令与对话流程
+- 定时任务负责新活动推送与 KV 存取
+- 配置文件启用可观测性开关,声明 Cron 触发器与 KV 绑定
+
+```mermaid
+graph TB
+A["wrangler.jsonc<br/>可观测性开启/定时触发/Cron/变量/KV"] --> B["src/index.ts<br/>默认导出(fetch/scheduled)"]
+B --> C["src/command/index.ts<br/>命令注册/对话存储(KV)"]
+B --> D["src/scheduler/index.ts<br/>定时任务(新活动推送)"]
+E["worker-configuration.d.ts<br/>类型与运行时接口"] --> B
+F[".dev.vars<br/>BOT_TOKEN 等环境变量"] --> B
+```
+
+图表来源
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L17)
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L17)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L442-L451)
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L442-L451)
+
+## 核心组件
+- 可观测性开关:在配置中启用可观测性,便于收集 Tail/Trace 日志与性能数据
+- 定时触发器:配置 Cron 表达式以驱动定期任务
+- KV 命名空间:用于会话状态与用户凭证持久化
+- 环境变量:Bot 访问令牌等敏感信息通过变量注入
+- 运行时类型:提供 Tail/Trace/Analytics Engine 等类型支持
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L17)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L587-L594)
+
+## 架构总览
+下图展示从请求到定时任务的关键路径,以及可观测性事件流(Tail/Trace):
+
+```mermaid
+sequenceDiagram
+participant U as "用户/客户端"
+participant W as "Workers 入口(src/index.ts)"
+participant CMD as "命令子系统(src/command/index.ts)"
+participant S as "定时器(src/scheduler/index.ts)"
+participant KV as "KV 命名空间(COSMOE_CREDENTIALS/COSMOE_STORAGE)"
+participant AE as "Analytics Engine(类型支持)"
+U->>W : "HTTP 请求(webhook)"
+W->>CMD : "setupCommands(...) 注册命令/对话"
+CMD->>KV : "读写会话/凭证"
+W-->>U : "响应"
+Note over S,KV : "按 Cron 触发执行"
+S->>KV : "读取最新事件ID/用户列表"
+S->>CMD : "调用 API 获取活动列表"
+S->>U : "向已注册用户发送通知"
+W-->>AE : "Tail/Trace 事件(可观测性)"
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L436-L451)
+
+## 详细组件分析
+
+### 可观测性与日志采集
+- 配置启用:在配置文件中开启可观测性,使 Tail/Trace 事件可用
+- 类型支持:运行时类型声明包含 Tail/Trace/Analytics Engine 接口,便于在代码中消费日志与指标
+- 日志位置:代码中多处使用控制台输出进行调试与错误记录(例如命令与定时任务)
+
+```mermaid
+flowchart TD
+Start(["启用可观测性"]) --> Collect["Tail/Trace 事件收集"]
+Collect --> Logs["日志/异常/属性"]
+Logs --> View["在 Cloudflare 控制台查看"]
+View --> Alert["基于日志构建告警规则"]
+```
+
+图表来源
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L2586-L2650)
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L2586-L2650)
+
+### 性能指标监控现状与建议
+- 现状:仓库未显式写入 Analytics Engine 数据集;可通过 Tail/Trace 事件观察 CPU/Wall 时间、事件结果等
+- 建议:在关键路径(如 API 调用前后)埋点,将请求量、响应时间、错误数等指标写入 Analytics Engine 数据集,以便后续在 Cloudflare Analytics 中查询与告警
+
+```mermaid
+flowchart TD
+Entry(["进入关键路径"]) --> StartT["开始计时/初始化指标"]
+StartT --> CallAPI["调用外部 API"]
+CallAPI --> Result{"成功/失败"}
+Result -- "成功" --> Ok["记录成功计数/耗时"]
+Result -- "失败" --> Err["记录错误计数/错误码"]
+Ok --> WriteAE["写入 Analytics Engine 指标"]
+Err --> WriteAE
+WriteAE --> Exit(["结束"])
+```
+
+图表来源
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L587-L594)
+
+章节来源
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L587-L594)
+
+### 错误跟踪与日志分析
+- 错误捕获:命令与定时任务中广泛使用 try/catch 并输出错误日志
+- 日志级别:代码中使用控制台输出(含错误),便于在 Tail/Trace 中定位问题
+- 分析方法:结合 Cron 触发时间、用户 ID、事件 ID 等上下文字段,筛选异常日志并复现
+
+```mermaid
+flowchart TD
+A["发生异常"] --> B["捕获错误"]
+B --> C["输出错误日志(console.error)"]
+C --> D["Tail/Trace 展示异常详情"]
+D --> E["定位脚本/函数/参数"]
+E --> F["修复并回归测试"]
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L30-L47)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L65-L83)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L30-L47)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L65-L83)
+
+### 自定义指标与告警规则设计
+以下为基于仓库能力与最佳实践的指标与规则建议(不直接修改仓库代码):
+- 关键指标
+  - 请求量:每分钟/每小时请求数(可从 Tail/Trace 中统计)
+  - 响应时间:平均/分位数(CPU/Wall 时间)
+  - 错误率:HTTP 状态码异常/业务错误比例
+  - 业务指标:登录成功/失败次数、活动推送成功率
+- 告警规则
+  - 错误率超过阈值持续 N 分钟
+  - 响应时间 P95 超过阈值
+  - 业务关键指标骤降(如登录失败率上升)
+- 通知机制
+  - 使用 Cloudflare Workers 的通知通道(如邮件/消息队列)或第三方集成(需在部署层扩展)
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L46-L68)
+
+### 日志分析与性能瓶颈识别
+- 日志字段:请求 URL、方法、状态码、异常堆栈、事件上下文(如用户 ID、活动 ID)
+- 分析步骤
+  - 筛选高频错误与异常堆栈
+  - 对比不同时间段的响应时间分布
+  - 关联定时任务触发与 KV 读写延迟
+- 工具:在 Cloudflare 控制台的 Tail/Trace 页面进行筛选与聚合
+
+章节来源
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L2590-L2645)
+
+### 通知机制配置(邮件/消息)
+- 当前实现:定时任务向已注册用户发送通知
+- 扩展建议:在错误达到阈值时,通过邮件或消息通道发送告警(需在部署层新增绑定与路由逻辑)
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L46-L68)
+
+### 监控仪表板与可视化
+- 建议维度
+  - 请求总量/错误率趋势
+  - 响应时间分布(P50/P95)
+  - 业务关键指标(登录、活动推送)
+- 可视化位置:Cloudflare Analytics(若接入 Analytics Engine 数据集)
+
+章节来源
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L587-L594)
+
+### 常见监控场景配置示例
+- 流量峰值监控
+  - 指标:请求速率、并发连接数
+  - 规则:单位时间内请求数超过阈值触发告警
+- API 调用异常检测
+  - 指标:外部 API 错误率、超时率
+  - 规则:连续 N 次错误或错误率突增触发告警
+- 业务异常(登录失败、活动推送失败)
+  - 指标:登录失败次数、推送失败次数
+  - 规则:失败次数超过阈值或占比异常升高
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L67-L69)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L61-L64)
+
+### 与 Cloudflare Analytics 和第三方工具的集成
+- Cloudflare Analytics
+  - 通过 Analytics Engine 数据集写入自定义指标,再在控制台进行查询与告警
+- 第三方工具
+  - 可通过日志导出与告警平台对接(需在部署层扩展)
+
+章节来源
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L587-L594)
+
+## 依赖关系分析
+- 入口依赖命令子系统与定时处理器
+- 命令子系统依赖 KV 存储与会话插件
+- 定时处理器依赖 KV 与外部 API 客户端
+- 配置文件统一管理可观测性、触发器与命名空间
+
+```mermaid
+graph LR
+WR["wrangler.jsonc"] --> IDX["src/index.ts"]
+IDX --> CMD["src/command/index.ts"]
+IDX --> SCH["src/scheduler/index.ts"]
+CMD --> KV["KV 命名空间"]
+SCH --> KV
+WR --> ENV[".dev.vars"]
+```
+
+图表来源
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L17)
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L17)
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L17)
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L17)
+
+## 性能考量
+- 减少不必要的 KV 读写与外部 API 调用
+- 在定时任务中对 KV 列表进行分页/限流,避免一次性读取过多键
+- 合理使用控制台输出,避免在高并发下产生大量日志
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L44-L49)
+
+## 故障排查指南
+- 查看 Tail/Trace
+  - 在 Cloudflare 控制台筛选异常事件,关注异常堆栈与上下文
+- 核查 KV 存取
+  - 确认键名格式与序列化/反序列化一致性
+- 核查定时任务
+  - 确认 Cron 表达式与触发时间,检查 KV 最新事件 ID 更新逻辑
+
+章节来源
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L2586-L2650)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L26-L28)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L76-L78)
+
+## 结论
+Cosmoe Bot 已具备可观测性的基础能力(可观测性开关、Tail/Trace 类型支持),并通过控制台日志实现基本的错误跟踪。为进一步完善监控告警体系,建议:
+- 在关键路径写入 Analytics Engine 指标
+- 基于 Tail/Trace 构建告警规则与通知机制
+- 设计仪表板以可视化关键指标
+- 将业务关键指标纳入监控范围
+
+上述增强均在不破坏现有代码结构的前提下,通过部署配置与代码埋点实现。
+
+## 附录
+- 配置文件关键项
+  - 可观测性开关:启用 Tail/Trace 收集
+  - 定时触发器:Cron 表达式
+  - KV 命名空间:会话与凭证存储
+  - 环境变量:Bot 访问令牌等
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L17)
+- [package.json](file://package.json#L5-L11)
+- [.dev.vars](file://.dev.vars#L1-L2)

+ 329 - 0
.qoder/repowiki/zh/content/部署与运维/部署与运维.md

@@ -0,0 +1,329 @@
+# 部署与运维
+
+<cite>
+**本文引用的文件列表**
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [package.json](file://package.json)
+- [.dev.vars](file://.dev.vars)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+- [test/index.spec.ts](file://test/index.spec.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能与成本优化](#性能与成本优化)
+8. [CI/CD 流水线配置](#cicd-流水线配置)
+9. [监控与日志](#监控与日志)
+10. [故障排除指南](#故障排除指南)
+11. [结论](#结论)
+
+## 简介
+本文件面向运维与开发团队,系统化梳理 Cosmoe Bot 在 Cloudflare Workers 平台上的部署与运维实践,覆盖配置文件、环境变量、域名与证书、生产最佳实践(版本管理、回滚、监控告警)、CI/CD 自动化、性能与成本优化、日志与故障排查等主题。文档以仓库现有配置与源码为依据,避免臆测,确保可操作性与可追溯性。
+
+## 项目结构
+Cosmoe Bot 是一个基于 Cloudflare Workers 的 Telegram 机器人,采用 TypeScript 编写,通过 Wrangler 进行本地开发与部署。核心目录与职责如下:
+- src/index.ts:Worker 入口,定义 fetch 与 scheduled 处理逻辑,初始化 Bot 并注册命令与定时任务。
+- src/command/index.ts:命令与对话处理入口,集成 @grammyjs/conversations 与 @grammyjs/storage-cloudflare,使用 KV 存储会话状态。
+- src/scheduler/index.ts:定时任务处理器,周期性拉取活动并推送通知给已注册用户。
+- src/client/cosmoe.ts:封装对 Cosmoe API 的调用,统一响应结构与认证参数。
+- wrangler.jsonc:Wrangler 配置文件,定义 Worker 名称、兼容日期、可观测性、计划任务、KV 绑定与环境变量。
+- package.json:脚本与依赖,包含 wrangler、grammy、@grammyjs/conversations、@grammyjs/storage-cloudflare。
+- .dev.vars:本地开发时的环境变量示例(如 BOT_TOKEN)。
+- worker-configuration.d.ts:由 Wrangler 生成的类型声明,提供运行时类型支持。
+- test/index.spec.ts:基于 @cloudflare/vitest-pool-workers 的单元/集成测试样例。
+
+```mermaid
+graph TB
+A["wrangler.jsonc<br/>配置与计划任务"] --> B["src/index.ts<br/>入口与调度器"]
+B --> C["src/command/index.ts<br/>命令与对话处理"]
+B --> D["src/scheduler/index.ts<br/>定时任务"]
+C --> E["src/client/cosmoe.ts<br/>外部 API 客户端"]
+A --> F["KV 命名空间<br/>COSMOE_CREDENTIALS/COSMOE_STORAGE"]
+A --> G[".dev.vars<br/>本地环境变量"]
+A --> H["worker-configuration.d.ts<br/>类型声明"]
+I["package.json<br/>脚本与依赖"] --> A
+J["test/index.spec.ts<br/>测试样例"] --> B
+```
+
+图表来源
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L800)
+- [package.json](file://package.json#L1-L24)
+- [.dev.vars](file://.dev.vars#L1-L2)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L1-L24)
+
+## 核心组件
+- Worker 入口与路由
+  - 初始化 Bot,解析环境变量中的 BOT_INFO 与 BOT_TOKEN,并设置命令菜单。
+  - 使用 cloudflare-mod 模式回调适配 Telegram Webhook。
+- 命令与对话
+  - 注册 start、login、events、event_详情、book_预约、history、cancel、logout 等命令与回调。
+  - 使用 @grammyjs/conversations 提供交互式对话;使用 @grammyjs/storage-cloudflare 将会话状态持久化到 KV。
+- 定时任务
+  - 每分钟触发一次,从 Cosmoe API 拉取活动列表,对比最新事件 ID,向已注册用户发送 Markdown 通知。
+- 外部 API 客户端
+  - 统一封装 getToken、getEvents、getEventDetail、getMyBookings、bookEvent、cancelBooking 等接口,统一响应结构。
+- 配置与类型
+  - wrangler.jsonc 定义名称、兼容日期、可观测性、计划任务、KV 绑定与 vars;worker-configuration.d.ts 提供运行时类型。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L800)
+
+## 架构总览
+下图展示从 Telegram 请求到 Worker、命令处理、KV 存储与外部 API 调用的整体流程。
+
+```mermaid
+sequenceDiagram
+participant U as "用户"
+participant T as "Telegram"
+participant W as "Worker 入口(src/index.ts)"
+participant CMD as "命令模块(src/command/index.ts)"
+participant S as "定时模块(src/scheduler/index.ts)"
+participant KV as "KV 命名空间"
+participant API as "Cosmoe API 客户端(src/client/cosmoe.ts)"
+U->>T : 发送命令/回调
+T->>W : Webhook 请求
+W->>CMD : 分发命令/对话
+CMD->>KV : 读取/写入会话与用户凭证
+CMD->>API : 调用外部 API
+API-->>CMD : 返回数据
+CMD-->>W : 处理结果
+W-->>T : 回复消息
+Note over S,KV : 每分钟触发
+S->>API : 拉取活动列表
+S->>KV : 读取/更新最新事件ID
+S-->>T : 推送新活动通知
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+## 详细组件分析
+
+### 配置文件与环境变量
+- wrangler.jsonc 关键项
+  - name:Worker 名称,用于在 Cloudflare 控制台识别与部署。
+  - main:入口文件路径。
+  - compatibility_date:运行时兼容日期,影响可用 API 与行为。
+  - observability.enabled:开启可观测性(日志、度量、追踪)。
+  - triggers.crons:计划任务表达式,当前为每分钟触发。
+  - vars:环境变量绑定,例如 BOT_INFO 字符串。
+  - kv_namespaces:KV 命名空间绑定,COSMOE_CREDENTIALS 用于存储用户凭证,COSMOE_STORAGE 用于会话与元数据。
+- .dev.vars 与本地开发
+  - 包含 BOT_TOKEN 示例,用于本地 wrangler dev 启动。
+- worker-configuration.d.ts
+  - 由 wrangler types 生成,提供运行时类型与上下文接口,便于在 IDE 中获得类型提示。
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [.dev.vars](file://.dev.vars#L1-L2)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L800)
+
+### Worker 入口与路由
+- fetch 处理
+  - 解析 BOT_INFO 与 BOT_TOKEN,初始化 Bot。
+  - 注册命令菜单 setMyCommands。
+  - 使用 webhookCallback("cloudflare-mod") 适配 Cloudflare 环境。
+- scheduled 处理
+  - 每分钟执行一次,初始化 Bot 并调用定时任务处理函数。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+
+### 命令与对话处理
+- 会话存储
+  - 使用 @grammyjs/storage-cloudflare 的 KvAdapter,将对话状态存入 COSMOE_STORAGE。
+  - 对读写异常进行捕获与日志输出。
+- 命令与回调
+  - start:显示帮助与可用命令。
+  - login:交互式对话,输入用户名与密码,调用 CosmoeClient 获取 token 并保存至 COSMOE_CREDENTIALS。
+  - events:列出活动。
+  - event_详情:根据 /event_{id} 打开详情页。
+  - book_预约:根据 /book_{event_id}_{slot_id} 下单。
+  - history:查看预约历史。
+  - cancel:根据 /cancel_{booking_id} 取消。
+  - logout:清理账户信息。
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+### 定时任务
+- 触发频率:每分钟一次。
+- 逻辑要点
+  - 从 COSMOE_STORAGE 读取 latestEventId。
+  - 调用 CosmoeClient.getEvents 获取活动列表。
+  - 过滤大于 latestEventId 的新活动。
+  - 遍历 COSMOE_CREDENTIALS 中的用户键,逐个发送 Markdown 通知。
+  - 更新最新事件 ID。
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+### 外部 API 客户端
+- 统一响应结构 ApiResponse<T>,包含 code、msg、data。
+- 支持的方法
+  - getToken、getEvents、getEventDetail、getMyBookings、bookEvent、cancelBooking、updatePaymentOrder、updateBookingNote、selfReschedule、selfTransfer、register 等。
+- 认证与参数
+  - 多数接口需要 user_id 与 token,可通过 setCredentials 或 getToken 设置。
+  - 参数使用 URLSearchParams 或 FormData 组装。
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+### 类型与上下文
+- worker-configuration.d.ts 提供 ExportedHandler、ExecutionContext、KVNamespace 等类型,确保在本地与线上一致的类型体验。
+- src/index.ts 与 src/command/index.ts 中的 Env 接口与 KV 命名空间绑定保持一致。
+
+章节来源
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L800)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+
+## 依赖关系分析
+- 组件耦合
+  - src/index.ts 依赖 src/command/index.ts 与 src/scheduler/index.ts。
+  - 命令模块依赖 KV 命名空间与 CosmoeClient。
+  - 定时模块依赖 KV 与 CosmoeClient。
+- 外部依赖
+  - @grammyjs/conversations:对话插件。
+  - @grammyjs/storage-cloudflare:KV 存储适配器。
+  - grammy:Telegram Bot SDK。
+  - wrangler:本地开发与部署工具。
+- 运行时接口
+  - KVNamespace、ExecutionContext、ExportedHandler 等类型来自 worker-configuration.d.ts。
+
+```mermaid
+graph LR
+IDX["src/index.ts"] --> CMD["src/command/index.ts"]
+IDX --> SCH["src/scheduler/index.ts"]
+CMD --> KV["KV 命名空间"]
+CMD --> API["src/client/cosmoe.ts"]
+SCH --> KV
+SCH --> API
+WRG["wrangler.jsonc"] --> IDX
+PKG["package.json"] --> WRG
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L1-L24)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L1-L24)
+
+## 性能与成本优化
+- 计划任务频率
+  - 当前每分钟一次,建议结合业务峰值与通知频率评估是否需要降低频率,减少不必要的请求与 KV 查询。
+- KV 访问
+  - 会话读写与用户列表遍历均走 KV,建议:
+    - 合理分页与批量操作(若后续扩展)。
+    - 对频繁访问的数据进行缓存策略设计(注意 KV 无内置 TTL,需自行实现过期机制)。
+- API 调用
+  - 外部 API 采用 GET/POST,建议:
+    - 对返回数据进行必要的本地缓存(如活动列表),避免重复拉取。
+    - 对错误与超时进行指数退避与重试。
+- 日志与观测
+  - 开启 observability.enabled 后,可在 Cloudflare Logs、Metrics 与 Tracing 中查看 Worker 行为,定位慢请求与异常。
+- 成本控制
+  - 控制计划任务频率与 KV 写入次数。
+  - 使用 Cloudflare Analytics Engine(如启用)记录关键指标,避免冗余日志导致成本上升。
+
+[本节为通用指导,不直接分析具体文件]
+
+## CI/CD 流水线配置
+以下为基于仓库现状的可落地实践建议(概念性说明,非仓库内现有配置):
+- 触发条件
+  - 主分支保护:仅允许合并请求(MR)合并主分支。
+  - 代码变更:任何对 src、wrangler.jsonc、package.json 的修改触发构建。
+- 构建步骤
+  - 安装依赖:npm ci
+  - 类型生成:npm run cf-typegen
+  - 单元测试:npm test
+- 部署策略
+  - 开发环境:自动部署到预发布命名空间(如 staging)。
+  - 生产环境:手动批准后部署到 prod 命名空间。
+- 版本与回滚
+  - 使用 Git 标签作为版本号,部署时指定 --branch=标签名。
+  - 回滚:通过 Wrangler 切换到上一个版本的部署记录。
+- 监控与告警
+  - 结合 Cloudflare Logs Insights 与 Metrics 设置阈值告警(如错误率、P95 延迟)。
+
+[本节为通用指导,不直接分析具体文件]
+
+## 监控与日志
+- 日志采集
+  - 使用 console.* 输出日志,配合 Wrangler 与 Cloudflare 控制台查看。
+  - 定时任务与命令处理中均有日志输出点,便于定位问题。
+- 指标与追踪
+  - 开启 observability.enabled 后,可查看:
+    - 请求量、错误率、响应时间分布。
+    - Tail Traces 与 Tail Logs,定位慢请求与异常堆栈。
+- 建议
+  - 对关键路径(API 调用、KV 读写、消息发送)增加结构化日志字段(如 user_id、event_id、booking_id)。
+  - 使用 Cloudflare Analytics Engine(如启用)记录自定义指标。
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+
+## 故障排除指南
+- 部署失败
+  - 检查 wrangler.jsonc 的 name、main、compatibility_date 是否正确。
+  - 确认 KV 命名空间绑定与 id 是否匹配。
+- 认证失败
+  - 检查 .dev.vars 或生产环境中的 BOT_TOKEN 是否有效。
+  - 确认 CosmoeClient.getToken 返回的 code 与 data 字段。
+- 会话存储异常
+  - 检查 COSMOE_STORAGE 的读写权限与键名格式。
+  - 关注命令模块中的 KV 异常日志。
+- 定时任务未触发
+  - 检查 triggers.crons 表达式是否符合预期。
+  - 查看 scheduled 处理器日志,确认执行路径。
+- 命令菜单未生效
+  - 确认 setMyCommands 的调用是否被拦截或抛错。
+- 日志与观测
+  - 通过 Cloudflare 控制台查看 Tail Logs 与 Tail Traces,定位异常。
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 结论
+本文件基于仓库现有配置与源码,系统化梳理了 Cosmoe Bot 在 Cloudflare Workers 上的部署与运维要点。建议在现有基础上进一步完善 CI/CD、监控告警与成本优化策略,并持续关注 KV 与外部 API 的性能瓶颈,以提升稳定性与可维护性。

+ 289 - 0
.qoder/repowiki/zh/content/部署与运维/部署配置.md

@@ -0,0 +1,289 @@
+# 部署配置
+
+<cite>
+**本文引用的文件**
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [.dev.vars](file://.dev.vars)
+- [package.json](file://package.json)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+</cite>
+
+## 目录
+1. [简介](#简介)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖关系分析](#依赖关系分析)
+7. [性能考量](#性能考量)
+8. [故障排查指南](#故障排查指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 简介
+本文件面向 Cosmoe Bot 的部署与运维人员,系统化解读 wrangler.jsonc 配置文件的各项参数,说明 KV 命名空间的配置与绑定、环境变量的配置方法(尤其是 BOT_INFO 的格式与内容)、本地开发与生产部署流程,并提供配置验证与调试建议,帮助快速、稳定地完成从本地到生产的全流程部署。
+
+## 项目结构
+Cosmoe Bot 是一个基于 Cloudflare Workers 的 Telegram Bot,采用 TypeScript 编写,通过 Wrangler 进行本地开发与生产部署。项目主要由以下部分组成:
+- 配置层:wrangler.jsonc 定义 Worker 名称、入口文件、兼容性日期、可观测性、定时触发器、KV 命名空间与变量等。
+- 运行时层:src/index.ts 作为 Worker 入口,处理 HTTP 请求与计划任务;src/command/index.ts 注册命令与会话;src/scheduler/index.ts 处理定时任务。
+- 数据层:通过 KV 命名空间 COSMOE_CREDENTIALS 存储用户凭证,COSMOE_STORAGE 存储会话与状态数据。
+- 工具层:.dev.vars 提供本地开发所需的 BOT_TOKEN;package.json 提供脚本与依赖;worker-configuration.d.ts 为类型生成文件。
+
+```mermaid
+graph TB
+subgraph "配置层"
+WJ["wrangler.jsonc"]
+DV[".dev.vars"]
+PJ["package.json"]
+end
+subgraph "运行时层"
+IDX["src/index.ts"]
+CMD["src/command/index.ts"]
+SCH["src/scheduler/index.ts"]
+end
+subgraph "数据层"
+KV1["KV: COSMOE_CREDENTIALS"]
+KV2["KV: COSMOE_STORAGE"]
+end
+subgraph "工具层"
+WT["worker-configuration.d.ts"]
+end
+WJ --> IDX
+WJ --> CMD
+WJ --> SCH
+WJ --> KV1
+WJ --> KV2
+DV --> IDX
+PJ --> IDX
+WT --> IDX
+CMD --> KV2
+SCH --> KV1
+SCH --> KV2
+```
+
+**图表来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [package.json](file://package.json#L1-L24)
+
+## 核心组件
+- Worker 入口与路由:src/index.ts 负责初始化 Bot、注册命令、设置命令菜单,并通过 webhookCallback 将请求交由 grammY 处理;同时实现 scheduled 回调用于定时任务。
+- 命令系统与会话:src/command/index.ts 使用 @grammyjs/conversations 插件,结合 KV 命名空间 COSMOE_STORAGE 实现对话状态持久化。
+- 定时任务:src/scheduler/index.ts 每分钟检查新活动并通知已注册用户。
+- KV 命名空间:COSMOE_CREDENTIALS 用于存储用户的 Cosmoe 凭证(用户 ID 与令牌),COSMOE_STORAGE 用于存储会话与状态(如最新活动 ID)。
+- 环境变量:BOT_INFO 为 Bot 信息(JSON 字符串),BOT_TOKEN 为 Telegram Bot 访问令牌(本地开发使用)。
+
+**章节来源**
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 架构总览
+下图展示了从请求进入 Worker 到 KV 存取与定时任务执行的整体流程。
+
+```mermaid
+sequenceDiagram
+participant TG as "Telegram"
+participant WR as "Worker 入口<br/>src/index.ts"
+participant CMD as "命令注册<br/>src/command/index.ts"
+participant KV1 as "KV : COSMOE_CREDENTIALS"
+participant KV2 as "KV : COSMOE_STORAGE"
+participant SCH as "定时任务<br/>src/scheduler/index.ts"
+TG->>WR : "HTTP 请求webhook"
+WR->>CMD : "setupCommands(bot, env)"
+CMD->>KV2 : "读取/写入会话状态"
+WR-->>TG : "响应消息"
+SCH->>KV2 : "读取最新活动 ID"
+SCH->>KV1 : "枚举已注册用户"
+SCH-->>TG : "发送新活动通知"
+```
+
+**图表来源**
+- [src/index.ts](file://src/index.ts#L13-L46)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L12-L88)
+
+## 详细组件分析
+
+### wrangler.jsonc 配置详解
+- schema 与名称:$schema 指向 Wrangler 配置校验文件;name 为 "cosmoe-bot"。
+- 入口与兼容性:main 指向 src/index.ts;compatibility_date 设为 2025-09-27,确保运行时 API 的稳定性。
+- 可观测性:observability.enabled=true 开启可观测性(日志、追踪等)。
+- 定时触发器:triggers.crons 设置为每分钟一次("*/1 * * * *"),对应 Worker 的 scheduled 回调。
+- 环境变量 vars:BOT_INFO 为 Bot 信息的 JSON 字符串,包含机器人元数据(如 id、username、是否支持内联查询等)。
+- KV 命名空间:kv_namespaces 定义两个命名空间
+  - COSMOE_CREDENTIALS:用于存储用户凭证(键为 Telegram 用户 ID,值为包含 user_id、token、timestamp 的 JSON)。
+  - COSMOE_STORAGE:用于存储会话状态与系统状态(如 latestEventId)。
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+
+### KV 命名空间配置与绑定
+- 绑定名称:COSMOE_CREDENTIALS、COSMOE_STORAGE 在 wrangler.jsonc 中定义,并在运行时通过 Env 接口暴露给 Worker。
+- 使用场景:
+  - 登录流程:用户输入用户名/密码后,调用 Cosmoe API 获取 token,然后以 Telegram 用户 ID 为键存入 COSMOE_CREDENTIALS。
+  - 历史查询:根据 Telegram 用户 ID 从 COSMOE_CREDENTIALS 读取凭证,构造 CosmoeClient 并查询预约历史。
+  - 定时通知:从 COSMOE_STORAGE 读取 latestEventId,遍历 COSMOE_CREDENTIALS 中所有已注册用户,逐个发送新活动通知,并更新最新活动 ID。
+
+```mermaid
+flowchart TD
+Start(["开始"]) --> ReadLatest["读取 COSMOE_STORAGE 中的 latestEventId"]
+ReadLatest --> FetchEvents["调用 Cosmoe API 获取活动列表"]
+FetchEvents --> FilterNew{"筛选新活动"}
+FilterNew --> |是| ListUsers["枚举 COSMOE_CREDENTIALS 所有用户"]
+FilterNew --> |否| End(["结束"])
+ListUsers --> Notify["逐个用户发送新活动通知"]
+Notify --> UpdateId["更新 COSMOE_STORAGE 中的 latestEventId"]
+UpdateId --> End
+```
+
+**图表来源**
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L84)
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L65)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L13-L29)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L84)
+
+### 环境变量配置
+- BOT_INFO:在 wrangler.jsonc 的 vars 中配置,为 JSON 字符串,包含机器人元数据(如 id、username、是否支持内联查询等)。运行时通过 env.BOT_INFO 读取并解析为对象传入 Bot 初始化。
+- BOT_TOKEN:在 .dev.vars 中配置,用于本地开发时的 Telegram Bot 访问令牌。生产环境建议通过 Wrangler 的 secrets 或环境变量注入,避免明文保存在仓库中。
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L18-L20)
+- [.dev.vars](file://.dev.vars#L1-L2)
+- [src/index.ts](file://src/index.ts#L19-L19)
+
+### 本地开发环境配置
+- .dev.vars:包含 BOT_TOKEN=your_token,用于本地开发服务器启动时注入。
+- 启动命令:package.json 提供 dev 与 start 脚本,均指向 wrangler dev,启动本地开发服务器。
+- 类型生成:cf-typegen 脚本用于生成 worker-configuration.d.ts,确保 Env 接口与实际绑定一致。
+
+```mermaid
+sequenceDiagram
+participant Dev as "开发者"
+participant Wr as "Wrangler 开发服务器"
+participant Bot as "Bot 实例"
+participant KV as "KV 命名空间"
+Dev->>Wr : "npm run dev/start"
+Wr->>Bot : "加载 .dev.vars 注入 BOT_TOKEN"
+Bot->>KV : "读取/写入会话与凭证"
+Wr-->>Dev : "本地可访问的 Webhook 地址"
+```
+
+**图表来源**
+- [package.json](file://package.json#L5-L11)
+- [.dev.vars](file://.dev.vars#L1-L2)
+- [src/index.ts](file://src/index.ts#L19-L19)
+
+**章节来源**
+- [package.json](file://package.json#L5-L11)
+- [.dev.vars](file://.dev.vars#L1-L2)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10)
+
+### 生产环境部署流程
+- 代码构建:项目为纯前端/运行时代码,无需额外编译;wrangler 会自动打包 main 指向的入口文件。
+- 部署命令:package.json 提供 deploy 脚本,直接执行 wrangler deploy。
+- 环境变量注入:
+  - BOT_INFO:已在 wrangler.jsonc 中配置。
+  - BOT_TOKEN:建议通过 Wrangler secrets 或环境变量注入,避免明文提交。
+- KV 命名空间:确保在 Cloudflare 控制台中创建并绑定 COSMOE_CREDENTIALS 与 COSMOE_STORAGE,且与 wrangler.jsonc 中的 id 一致。
+
+**章节来源**
+- [package.json](file://package.json#L6-L6)
+- [wrangler.jsonc](file://wrangler.jsonc#L18-L30)
+
+## 依赖关系分析
+- 配置到运行时:wrangler.jsonc 决定 Worker 的入口、触发器、KV 绑定与变量;src/index.ts 作为入口文件,依赖这些配置。
+- 运行时到数据:src/command/index.ts 与 src/scheduler/index.ts 通过 KV 命名空间进行数据持久化与共享。
+- 类型与配置:worker-configuration.d.ts 由 wrangler types 生成,确保 Env 接口与实际绑定一致。
+
+```mermaid
+graph LR
+WJ["wrangler.jsonc"] --> IDX["src/index.ts"]
+WJ --> CMD["src/command/index.ts"]
+WJ --> SCH["src/scheduler/index.ts"]
+IDX --> CMD
+CMD --> KV["KV 命名空间"]
+SCH --> KV
+WT["worker-configuration.d.ts"] --> IDX
+```
+
+**图表来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10)
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10)
+
+## 性能考量
+- 定时任务频率:当前设置为每分钟一次,适合高频推送场景;若活动更新不频繁,可考虑降低频率以减少 KV 查询与 Telegram API 调用开销。
+- KV 访问模式:登录与历史查询均按用户 ID 键访问;定时任务遍历用户列表时注意 KV list 的性能与配额限制。
+- 会话存储:对话状态通过 KVAdapter 写入 COSMOE_STORAGE,建议控制单条会话数据大小,避免超限。
+
+[本节为通用指导,不直接分析具体文件]
+
+## 故障排查指南
+- 配置校验
+  - 使用 wrangler 的类型生成与校验:运行 cf-typegen 生成 worker-configuration.d.ts,确保 Env 接口与 KV 绑定一致。
+  - 检查 wrangler.jsonc 的 compatibility_date 是否与目标运行时匹配。
+- KV 读写问题
+  - 登录失败:确认 COSMOE_CREDENTIALS 的键为 Telegram 用户 ID,值为包含 user_id、token、timestamp 的 JSON。
+  - 历史查询失败:确认 COSMOE_CREDENTIALS 中存在该用户的凭证,且凭证有效。
+  - 定时通知未发送:检查 COSMOE_STORAGE 中的 latestEventId 是否正确更新,以及 COSMOE_CREDENTIALS 中是否存在用户。
+- 环境变量问题
+  - BOT_INFO 解析失败:确认其为合法 JSON 字符串,字段齐全。
+  - BOT_TOKEN 未生效:确认在本地开发时 .dev.vars 正确注入,在生产环境通过 secrets 注入。
+- 日志与可观测性
+  - 启用 observability 后,可在 Cloudflare Workers 控制台查看日志与追踪,定位异常。
+
+**章节来源**
+- [worker-configuration.d.ts](file://worker-configuration.d.ts#L1-L10)
+- [wrangler.jsonc](file://wrangler.jsonc#L10-L12)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L49-L65)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L13-L29)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L24-L84)
+
+## 结论
+通过合理配置 wrangler.jsonc、规范使用 KV 命名空间与环境变量、遵循本地开发与生产部署流程,Cosmoe Bot 可以稳定运行于 Cloudflare Workers 平台。建议在生产环境中严格管理密钥与变量,优化定时任务频率,并持续关注可观测性输出以提升运维效率。
+
+[本节为总结性内容,不直接分析具体文件]
+
+## 附录
+
+### 配置参数速查表
+- 项目基本信息
+  - name:cosmoe-bot
+  - main:src/index.ts
+  - compatibility_date:2025-09-27
+- 可观测性
+  - observability.enabled:true
+- 定时触发器
+  - triggers.crons:*/1 * * * *
+- 环境变量
+  - vars.BOT_INFO:JSON 字符串,包含机器人元数据
+  - vars.BOT_TOKEN:本地开发令牌(建议生产环境通过 secrets 注入)
+- KV 命名空间
+  - COSMOE_CREDENTIALS:存储用户凭证(键为 Telegram 用户 ID,值为 JSON)
+  - COSMOE_STORAGE:存储会话与系统状态(如 latestEventId)
+
+**章节来源**
+- [wrangler.jsonc](file://wrangler.jsonc#L7-L30)
+- [src/index.ts](file://src/index.ts#L6-L11)

+ 326 - 0
.qoder/repowiki/zh/content/项目概述.md

@@ -0,0 +1,326 @@
+# 项目概述
+
+<cite>
+**本文引用的文件**
+- [package.json](file://package.json)
+- [src/index.ts](file://src/index.ts)
+- [src/command/index.ts](file://src/command/index.ts)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts)
+- [src/command/handlers/start.ts](file://src/command/handlers/start.ts)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts)
+- [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts)
+- [wrangler.jsonc](file://wrangler.jsonc)
+- [tsconfig.json](file://tsconfig.json)
+- [test/index.spec.ts](file://test/index.spec.ts)
+</cite>
+
+## 目录
+1. [引言](#引言)
+2. [项目结构](#项目结构)
+3. [核心组件](#核心组件)
+4. [架构总览](#架构总览)
+5. [详细组件分析](#详细组件分析)
+6. [依赖分析](#依赖分析)
+7. [性能考虑](#性能考虑)
+8. [故障排除指南](#故障排除指南)
+9. [结论](#结论)
+10. [附录](#附录)
+
+## 引言
+Cosmoe Bot 是一个基于 Cloudflare Workers 的 Telegram 摄影活动预约管理机器人。它通过与 Cosmoe 摄影平台的 API 集成,为用户提供便捷的活动浏览、登录认证、在线预约与取消、预约历史查询等功能,并支持定时任务推送新活动通知。项目采用 TypeScript 开发,结合 grammY 框架与 Cloudflare Workers 平台,具备高扩展性与低运维成本。
+
+## 项目结构
+项目采用按功能模块划分的目录组织方式,核心入口位于 src/index.ts,命令路由与处理器集中在 src/command 下,客户端封装在 src/client 中,定时任务逻辑位于 src/scheduler。Wrangler 作为部署与配置工具,tsconfig 提供类型检查与编译选项,test 目录包含单元与集成测试。
+
+```mermaid
+graph TB
+A["src/index.ts<br/>Worker 入口与 Webhook"] --> B["src/command/index.ts<br/>命令注册与对话插件"]
+B --> C["src/command/handlers/*.ts<br/>命令处理器"]
+A --> D["src/scheduler/index.ts<br/>定时任务"]
+C --> E["src/client/cosmoe.ts<br/>Cosmoe API 客户端"]
+F["wrangler.jsonc<br/>部署与触发器配置"] --> A
+G["tsconfig.json<br/>TypeScript 编译配置"] --> A
+H["test/index.spec.ts<br/>测试用例"] --> A
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [tsconfig.json](file://tsconfig.json#L1-L46)
+
+## 核心组件
+- Worker 入口与 Webhook:负责初始化 Bot、注册命令菜单、设置 Webhook 回调,并在定时事件触发时执行调度逻辑。
+- 命令系统与对话插件:通过 grammY 的 conversations 插件实现多步交互式登录与状态持久化;统一注册各类命令与回调。
+- Cosmoe API 客户端:封装与 Cosmoe 平台的交互,包括认证、活动列表、活动详情、预约、历史、取消等接口。
+- 定时任务:周期性拉取活动列表,识别新增活动并向已登录用户发送通知。
+- 存储层:使用 Cloudflare KV 保存用户凭证与对话状态,确保跨实例一致性与可扩展性。
+
+章节来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 架构总览
+下图展示了从 Telegram 用户到 Cloudflare Workers、grammY、KV 存储与外部 Cosmoe API 的整体数据流与控制流。
+
+```mermaid
+sequenceDiagram
+participant U as "Telegram 用户"
+participant W as "Cloudflare Worker<br/>src/index.ts"
+participant CMD as "命令系统<br/>src/command/index.ts"
+participant CONV as "对话插件<br/>conversations"
+participant KV as "KV 存储<br/>COSMOE_CREDENTIALS/COSMOE_STORAGE"
+participant API as "Cosmoe API 客户端<br/>src/client/cosmoe.ts"
+participant S as "定时任务<br/>src/scheduler/index.ts"
+U->>W : 发送命令/消息
+W->>CMD : 路由到对应处理器
+CMD->>CONV : 进入对话如登录
+CONV->>KV : 读写对话状态
+CMD->>API : 调用 Cosmoe API
+API-->>CMD : 返回结果
+CMD-->>U : 发送回复/内联键盘
+S->>API : 拉取活动列表
+API-->>S : 返回活动数据
+S->>KV : 读取/更新最新活动ID
+S-->>U : 推送新活动通知
+```
+
+图表来源
+- [src/index.ts](file://src/index.ts#L1-L47)
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+
+## 详细组件分析
+
+### 命令系统与对话插件
+- 组件职责
+  - 注册命令菜单与路由:start、login、events、event_{id}、book_{event}_{slot}、history、cancel_{id}、callbackQuery 等。
+  - 对话插件:基于 @grammyjs/conversations,使用 @grammyjs/storage-cloudflare 将对话状态持久化至 KV。
+  - 环境绑定:通过 Env 接口注入 KV 命名空间与 Bot 配置。
+- 关键流程
+  - 登录对话:交互式收集用户名与密码,调用 Cosmoe API 获取 token,存入 KV。
+  - 预约流程:解析 /book_{event}_{slot},校验时段余量,支持优惠券选择与二次确认。
+  - 取消流程:解析 /cancel_{id},弹出确认内联键盘,二次确认后调用取消接口。
+- 错误处理
+  - 对话读写 KV 失败时记录日志并提示用户重试。
+  - API 调用异常时捕获并反馈错误信息。
+
+```mermaid
+flowchart TD
+Start(["进入命令处理"]) --> Route{"匹配命令/正则/回调"}
+Route --> |"/login"| LoginConv["进入登录对话"]
+Route --> |"/events"| EventsList["获取活动列表并展示"]
+Route --> |"/event_{id}"| EventDetail["获取活动详情并展示时段"]
+Route --> |"/book_{event}_{slot}"| BookFlow["校验余量/优惠券并下单"]
+Route --> |"/history"| History["获取并格式化历史记录"]
+Route --> |"/cancel_{id}"| CancelFlow["生成确认内联键盘"]
+Route --> |回调: 确认/优惠券选择| ConfirmOrCoupon["执行确认或优惠券选择"]
+LoginConv --> End(["结束"])
+EventsList --> End
+EventDetail --> End
+BookFlow --> End
+History --> End
+CancelFlow --> End
+ConfirmOrCoupon --> End
+```
+
+图表来源
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+
+章节来源
+- [src/command/index.ts](file://src/command/index.ts#L1-L110)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75)
+- [src/command/handlers/events.ts](file://src/command/handlers/events.ts#L1-L27)
+- [src/command/handlers/eventDetails.ts](file://src/command/handlers/eventDetails.ts#L1-L61)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L1-L226)
+- [src/command/handlers/history.ts](file://src/command/handlers/history.ts#L1-L107)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L1-L132)
+
+### Cosmoe API 客户端
+- 组件职责
+  - 封装认证、活动查询、详情获取、个人资料、预约、历史、取消、优惠券等 API。
+  - 支持手动设置凭证与自动读取 KV 凭证。
+- 数据模型要点
+  - 认证响应包含 user_id 与 token。
+  - 活动详情包含多个时间段与剩余容量。
+  - 预约返回包含最终价格与订单号等字段。
+- 错误处理
+  - 未认证调用抛出错误;KV 读写失败记录日志并提示用户。
+
+```mermaid
+classDiagram
+class CosmoeClient {
++getToken(username, password)
++setCredentials(userId, token)
++getCredentials()
++isAuthenticated()
++getEvents()
++getEventDetail(eventId)
++getProfile()
++getMyBookings()
++bookEvent(bookingRequest)
++getAvailableCoupons(eventId)
++cancelBooking(bookingId)
++updatePaymentOrder(bookingId, orderId)
++updateBookingNote(bookingId, note)
++selfReschedule(bookingId, newSlot)
++selfTransfer(bookingId, recipient)
++changePassword(current, new)
++register(key, username, email, password, identity)
+}
+```
+
+图表来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+章节来源
+- [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L1-L503)
+
+### 定时任务与新活动通知
+- 组件职责
+  - 每分钟检查一次新活动,对比上次最大活动 ID,向所有已登录用户推送通知。
+  - 使用 KV 存储“最新活动ID”,保证幂等与去重。
+- 关键流程
+  - 拉取活动列表 → 过滤新活动 → 遍历已登录用户 → 发送通知 → 更新最新活动ID。
+
+```mermaid
+flowchart TD
+Tick["定时触发"] --> LoadLast["读取最新活动ID"]
+LoadLast --> Fetch["拉取活动列表"]
+Fetch --> Filter{"过滤新活动"}
+Filter --> |有| Notify["遍历已登录用户并发送通知"]
+Filter --> |无| End["结束"]
+Notify --> Update["更新最新活动ID"]
+Update --> End
+```
+
+图表来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L17)
+
+章节来源
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L1-L88)
+- [wrangler.jsonc](file://wrangler.jsonc#L13-L17)
+
+### 存储与环境配置
+- KV 命名空间
+  - COSMOE_CREDENTIALS:存储用户的认证凭证(user_id、token、timestamp)。
+  - COSMOE_STORAGE:存储调度任务的“最新活动ID”等状态。
+- 环境变量
+  - BOT_INFO、BOT_TOKEN:Bot 基本信息与令牌。
+  - KV 绑定:通过 wrangler.jsonc 配置。
+
+章节来源
+- [wrangler.jsonc](file://wrangler.jsonc#L21-L30)
+- [src/command/index.ts](file://src/command/index.ts#L20-L52)
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L50-L65)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L26-L28)
+
+## 依赖分析
+- 运行时依赖
+  - grammY:Telegram Bot 框架,提供命令路由、回调、内联键盘等能力。
+  - @grammyjs/conversations:对话插件,配合 KV 实现多步交互。
+  - @grammyjs/storage-cloudflare:KV 适配器,用于对话状态持久化。
+- 开发依赖
+  - wrangler:Cloudflare Workers 部署与本地开发工具。
+  - vitest 与 @cloudflare/vitest-pool-workers:Workers 友好的测试框架。
+  - typescript:类型系统与编译支持。
+- 项目脚本
+  - dev/start:本地开发与调试。
+  - deploy:部署到 Cloudflare Workers。
+  - test:运行测试。
+  - cf-typegen:生成 Cloudflare 类型定义。
+
+```mermaid
+graph LR
+P["package.json"] --> G["grammy"]
+P --> C["@grammyjs/conversations"]
+P --> K["@grammyjs/storage-cloudflare"]
+P --> W["wrangler"]
+P --> V["vitest"]
+P --> T["typescript"]
+```
+
+图表来源
+- [package.json](file://package.json#L12-L22)
+
+章节来源
+- [package.json](file://package.json#L1-L24)
+
+## 性能考虑
+- 无服务器冷启动:Cloudflare Workers 在首次访问时可能产生冷启动延迟,建议通过常驻与合理拆分任务降低影响。
+- KV 读写:对话状态与用户凭证均使用 KV,注意批量读写与错误重试策略,避免阻塞主线程。
+- API 调用:对 Cosmoe API 的调用应尽量减少不必要的请求,例如在预约前先获取活动详情以校验时段。
+- 定时任务频率:当前每分钟触发一次,建议根据实际业务量调整 cron 表达式,避免过度轮询。
+- 消息长度限制:历史查询与活动详情需遵守 Telegram 的消息长度限制,必要时截断或分条发送。
+
+## 故障排除指南
+- 登录失败
+  - 检查用户名/密码是否正确,确认 Cosmoe API 返回码与消息。
+  - 确认 KV 写入是否成功,查看日志输出。
+- 预约失败
+  - 确认用户已登录且凭证有效。
+  - 检查活动时段余量与优惠券可用性。
+  - 查看 API 返回的错误信息并提示用户。
+- 取消失败
+  - 确认预约状态允许取消,且未过期。
+  - 检查回调数据解析与 KV 凭证有效性。
+- 新活动通知未送达
+  - 检查定时任务是否正常触发与 KV 最新活动ID是否更新。
+  - 确认已登录用户列表是否正确,关注用户拒收或账号异常情况。
+- 测试与本地调试
+  - 使用 vitest 与 @cloudflare/vitest-pool-workers 运行测试。
+  - 通过 wrangler dev 启动本地服务,结合日志定位问题。
+
+章节来源
+- [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L67-L74)
+- [src/command/handlers/bookEvent.ts](file://src/command/handlers/bookEvent.ts#L114-L118)
+- [src/command/handlers/cancel.ts](file://src/command/handlers/cancel.ts#L80-L84)
+- [src/scheduler/index.ts](file://src/scheduler/index.ts#L81-L84)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)
+
+## 结论
+Cosmoe Bot 通过 Cloudflare Workers 与 grammY 的组合,构建了一个轻量、可扩展、易于维护的摄影活动预约机器人。其清晰的模块划分、完善的错误处理与定时通知机制,使其能够稳定支撑日常运营与用户交互。未来可在前端界面、支付对接与更细粒度的权限控制方面进一步增强用户体验与安全性。
+
+## 附录
+
+### 快速开始指南
+- 环境准备
+  - 安装依赖:使用包管理器安装项目依赖。
+  - 配置 Wrangler:在 wrangler.jsonc 中完善 KV 绑定、Bot 令牌与 Cron 触发器。
+- 本地开发
+  - 启动本地服务:运行开发脚本,访问本地端口进行调试。
+  - 运行测试:使用测试脚本验证核心流程。
+- 部署上线
+  - 执行部署脚本,将 Worker 部署到 Cloudflare Workers。
+  - 在 Telegram 中配置 Webhook 与命令菜单,完成机器人上线。
+
+章节来源
+- [package.json](file://package.json#L5-L11)
+- [wrangler.jsonc](file://wrangler.jsonc#L1-L31)
+- [src/index.ts](file://src/index.ts#L13-L35)
+- [test/index.spec.ts](file://test/index.spec.ts#L1-L25)

File diff suppressed because it is too large
+ 0 - 0
.qoder/repowiki/zh/meta/repowiki-metadata.json


Some files were not shown because too many files changed in this diff