Skip to content

需求拆解

用户目标

用户希望扩展现有的 Telegram 机器人功能,使其具备以下核心能力:

  1. 进度监听与通知:机器人需要监听 OpenCode 执行过程,实时捕获进度信息,并按照预定义的策略将信息发送给 Telegram 应用端。

  2. 进程控制:增加一个机器人指令,当接收到该指令后,能够终止服务器上运行的 OpenCode 进程。

工作流程分析

当前系统的工作流程是:

  1. 用户通过 Telegram 发送消息
  2. Bun 启动的 Telegram 机器人接收消息
  3. 机器人调用 opencode --prompt=<指令> 启动 OpenCode
  4. OpenCode 执行任务并返回结果

期望的工作流程是:

  1. 用户通过 Telegram 发送消息
  2. Telegram 机器人接收并启动 OpenCode 进程
  3. 机器人监听 OpenCode 的输出流(stdout/stderr)
  4. 根据预定义策略,将 OpenCode 的执行进度、结果或错误发送回 Telegram
  5. 用户可以发送特定指令(如 /kill)来终止正在运行的 OpenCode 进程
  6. 机器人接收到终止指令后,强制杀死对应的 OpenCode 进程

关键路径

路径一:OpenCode 进程输出监听

这是整个系统的核心挑战。要实现进度监听,需要解决以下技术问题:

  1. 输出捕获:OpenCode 作为独立的子进程运行,需要捕获其标准输出(stdout)和标准错误输出(stderr)流。

  2. 实时解析:OpenCode 的输出是持续不断的文本流,需要实时解析这些输出以识别关键的进度信息、状态变化和最终结果。

  3. 信息过滤与策略:并非所有输出都需要发送到 Telegram。需要实现智能过滤策略,避免发送过多冗余信息,同时确保重要信息不遗漏。

  4. 消息格式化:将 OpenCode 的原始输出转换为适合 Telegram 展示的格式(考虑消息长度限制、Markdown 格式等)。

路径二:进程生命周期管理

要实现进程控制功能,需要解决以下问题:

  1. 进程追踪:当机器人启动 OpenCode 进程后,需要持久化存储进程 ID(PID)或进程句柄,以便后续终止操作。

  2. 多会话管理:如果支持多个并发 OpenCode 会话(根据 OpenCode 的多会话特性),需要管理多个进程 ID,并确保终止指令能够正确对应到目标进程。

  3. 权限与安全:确保只有授权用户能够执行终止操作,防止恶意行为导致系统中断。

  4. 优雅关闭:尽可能先尝试优雅终止(SIGTERM),失败后再强制终止(SIGKILL)。

核心挑战

挑战一:OpenCode 输出格式不确定性

OpenCode 的输出格式可能是多变的:

  • 某些信息输出到 stdout,某些输出到 stderr
  • 输出可能包含 ANSI 颜色代码、进度条等控制字符
  • 输出内容可能非常长(完整的代码变更、文件内容等)

这给信息过滤和格式化带来了挑战。需要设计鲁棒的解析策略,能够适应不同类型的输出。

挑战二:Telegram 消息限制

Telegram Bot API 有以下限制:

  • 单条消息最大长度为 4096 字符
  • 频繁发送消息可能触发速率限制
  • Markdown 格式需要正确转义

需要实现消息分割、节流和格式化机制,确保 OpenCode 的输出能够安全、完整地传递到 Telegram。

挑战三:进程状态同步

当 OpenCode 进程执行时间较长时,可能出现以下问题:

  • 机器人进程崩溃后,OpenCode 进程仍在运行
  • 终止指令时无法确认目标进程是否仍然存在
  • 多个 OpenCode 进程同时运行时,难以准确追踪

需要设计可靠的进程状态管理机制,包括进程启动时的注册、运行时的监控、异常时的清理。

边界条件

功能边界

本方案的目标是实现 OpenCode 进程的基本监听和控制,但不包括:

  • OpenCode 内部执行的深度分析(如解析工具调用、文件操作等)
  • 复杂的进度条可视化
  • 多用户权限管理(基础权限控制除外)
  • 历史记录查询

技术边界

  • OpenCode 本身不提供程序化的进度回调 API(假设情况)
  • 依赖系统级进程管理(通过 Bun 的 child_process)
  • 通过 stdout/stderr 流获取信息,而非 API 轮询

非功能性需求

  1. 性能:监听和控制不应显著影响 OpenCode 的执行效率
  2. 可靠性:即使监听机制失败,OpenCode 的核心功能不应受影响
  3. 可维护性:代码结构清晰,便于后续扩展新的监听策略或控制指令

参考资料