Skip to content

核心能力验证

OpenCode 进程输出能力分析

输出机制验证

OpenCode 作为命令行工具,标准行为是向 stdout 和 stderr 输出信息。需要验证以下能力:

  1. Stdout 输出:OpenCode 的主要交互输出通常发送到 stdout,包括用户可见的响应、执行结果等。

  2. Stderr 输出:错误信息、调试日志通常发送到 stderr。

  3. 输出流特性

    • 是否支持缓冲控制(行缓冲或全缓冲)
    • 输出是否为流式(实时输出)还是批量输出
    • 是否包含 ANSI 控制字符(颜色、光标移动等)

验证方法

方法一:黑盒测试

通过实际运行 OpenCode 并捕获输出来验证:

bash
# 测试 stdout 输出
opencode --prompt="write hello world" 2>/dev/null

# 测试 stderr 输出
opencode --prompt="write hello world" 2>stderr.log >stdout.log

# 测试流式输出
opencode --prompt="write hello world" | tee output.log

方法二:源码分析

通过阅读 OpenCode 的源码来确认输出机制:

  • 查找 console.logconsole.errorprocess.stdout.write 等输出语句
  • 确认是否有专门的日志模块
  • 检查是否支持输出格式配置(如 JSON、无颜色等)

初步结论

基于 OpenCode 的设计和源码分析:

  • OpenCode 使用标准输出流机制
  • 输出包含 ANSI 颜色代码(可通过 --no-color 等选项禁用)
  • 输出是流式的,支持实时捕获
  • 没有原生的 WebSocket 或 API 回调机制用于外部监听

结论:OpenCode 支持通过 stdout/stderr 进行进程输出监听,需要额外实现流解析和消息路由逻辑。

Telegram Bot 通知能力分析

Telegram Bot API 能力

Telegram Bot API 提供了丰富的消息发送能力:

  1. 文本消息:支持纯文本和 Markdown/HTML 格式

    • 最大长度:4096 字符
    • 支持格式化(粗体、斜体、代码、链接等)
  2. 文件发送:可发送文本、图像、文档等文件

    • 适合传输大型输出(如代码文件、日志)
    • 支持通过文件 URL 或直接上传
  3. 编辑消息:可编辑已发送的消息

    • 适合更新进度状态
    • 避免发送多条重复消息
  4. 回复功能:支持消息回复和引用

    • 可将通知回复到原始指令消息
    • 保持上下文关联

Bun 生态中的 Telegram Bot 库

Bun 兼容 Node.js 的 npm 包,可使用以下库:

选项一:node-telegram-bot-api

成熟的 Telegram Bot 库:

  • 支持完整的 Bot API
  • 良好的 TypeScript 支持
  • 支持轮询和 Webhook 模式
  • 文档完善,社区活跃

选项二:grammY

现代化的 TypeScript 优先库:

  • 更好的性能(基于 fetch)
  • 中间件架构,易于扩展
  • 插件生态系统
  • 更适合 Bun 的现代 API

选项三:Telegraf

功能丰富的框架:

  • 强大的中间件系统
  • 丰富的扩展生态
  • 但较为复杂,可能过于重量级

验证结论

结论:Telegram Bot API 完全支持本方案的需求。Bun 生态中有成熟的 Telegram Bot 库可供选择,推荐使用 grammY 或 node-telegram-bot-api。

Bun 进程管理能力分析

Child Process API

Bun 兼容 Node.js 的 child_process 模块,提供了强大的进程管理能力:

  1. spawn

    • 启动新进程
    • 可访问 stdin、stdout、stderr 流
    • 适合长时间运行的进程
  2. exec

    • 执行命令并捕获完整输出
    • 适合短时间运行的命令
    • 不适合实时输出监听
  3. execFile

    • 类似 exec,但更高效
    • 适合执行已知路径的可执行文件

进程输出监听

通过 spawn 可以监听进程输出:

typescript
const process = Bun.spawn(['opencode', '--prompt=' + prompt], {
  stdout: 'pipe',
  stderr: 'pipe',
});

const reader = process.stdout.getReader();
while (true) {
  const { done, value } = await reader.read();
  if (done) break;
  const text = new TextDecoder().decode(value);
  // 处理输出
}

进程终止能力

Bun 提供多种终止进程的方式:

  1. process.kill(pid, signal):发送系统信号

    • SIGTERM:优雅终止
    • SIGKILL:强制终止
  2. spawn 对象的 kill():直接终止子进程

    • 更简洁的 API
    • 内部调用系统 kill
  3. 进程组管理:可终止整个进程树

    • 防止子进程遗留
    • 需要设置 detached: false

验证结论

结论:Bun 的进程管理能力完全满足本方案需求,支持:

  • 启动 OpenCode 作为子进程
  • 实时监听 stdout/stderr 流
  • 通过 PID 或进程对象进行终止
  • 进程状态监控和清理

差距分析

已验证的能力

能力支持说明
启动 OpenCode 进程Bun.spawn
监听 stdout/stderr流式读取
解析进程输出文本处理
发送 Telegram 消息Bot API
终止 OpenCode 进程process.kill
进程状态管理内部存储
ANSI 代码过滤正则/库
消息长度限制处理分割算法

能力缺口

缺口影响缓解方案
OpenCode 无原生进度事件需要解析输出推断进度基于输出模式识别(工具调用、文件操作等)
无内置进程持久化机器人重启后丢失进程追踪使用文件或数据库存储 PID
消息速率限制短时间内大量输出可能被限流实现消息队列和节流机制
输出格式不确定性解析可能出错多模式匹配、容错机制

综合结论

可行性评估

结论:本方案技术完全可行,OpenCode + Bun + Telegram Bot 的集成不需要修改 OpenCode 源码,可以通过外部包装实现所有需求功能。

关键依赖

  1. OpenCode 命令行输出:依赖标准输出流
  2. Bun child_process:核心进程管理
  3. Telegram Bot API:消息通知
  4. 输出解析逻辑:自定义实现

风险评估

风险级别缓解措施
OpenCode 输出格式变化设计鲁棒的解析器,多模式匹配
Telegram API 限流实现消息队列,避免突发大量消息
进程管理复杂度简化状态管理,避免过度设计
机器人异常中断使用 systemd/supervisor 保证运行稳定性

参考资料