Appearance
核心能力验证
OpenCode 进程输出能力分析
输出机制验证
OpenCode 作为命令行工具,标准行为是向 stdout 和 stderr 输出信息。需要验证以下能力:
Stdout 输出:OpenCode 的主要交互输出通常发送到 stdout,包括用户可见的响应、执行结果等。
Stderr 输出:错误信息、调试日志通常发送到 stderr。
输出流特性:
- 是否支持缓冲控制(行缓冲或全缓冲)
- 输出是否为流式(实时输出)还是批量输出
- 是否包含 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.log、console.error、process.stdout.write等输出语句 - 确认是否有专门的日志模块
- 检查是否支持输出格式配置(如 JSON、无颜色等)
初步结论
基于 OpenCode 的设计和源码分析:
- OpenCode 使用标准输出流机制
- 输出包含 ANSI 颜色代码(可通过
--no-color等选项禁用) - 输出是流式的,支持实时捕获
- 没有原生的 WebSocket 或 API 回调机制用于外部监听
结论:OpenCode 支持通过 stdout/stderr 进行进程输出监听,需要额外实现流解析和消息路由逻辑。
Telegram Bot 通知能力分析
Telegram Bot API 能力
Telegram Bot API 提供了丰富的消息发送能力:
文本消息:支持纯文本和 Markdown/HTML 格式
- 最大长度:4096 字符
- 支持格式化(粗体、斜体、代码、链接等)
文件发送:可发送文本、图像、文档等文件
- 适合传输大型输出(如代码文件、日志)
- 支持通过文件 URL 或直接上传
编辑消息:可编辑已发送的消息
- 适合更新进度状态
- 避免发送多条重复消息
回复功能:支持消息回复和引用
- 可将通知回复到原始指令消息
- 保持上下文关联
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 模块,提供了强大的进程管理能力:
spawn:
- 启动新进程
- 可访问 stdin、stdout、stderr 流
- 适合长时间运行的进程
exec:
- 执行命令并捕获完整输出
- 适合短时间运行的命令
- 不适合实时输出监听
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 提供多种终止进程的方式:
process.kill(pid, signal):发送系统信号
SIGTERM:优雅终止SIGKILL:强制终止
spawn 对象的 kill():直接终止子进程
- 更简洁的 API
- 内部调用系统 kill
进程组管理:可终止整个进程树
- 防止子进程遗留
- 需要设置
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 源码,可以通过外部包装实现所有需求功能。
关键依赖
- OpenCode 命令行输出:依赖标准输出流
- Bun child_process:核心进程管理
- Telegram Bot API:消息通知
- 输出解析逻辑:自定义实现
风险评估
| 风险 | 级别 | 缓解措施 |
|---|---|---|
| OpenCode 输出格式变化 | 中 | 设计鲁棒的解析器,多模式匹配 |
| Telegram API 限流 | 低 | 实现消息队列,避免突发大量消息 |
| 进程管理复杂度 | 中 | 简化状态管理,避免过度设计 |
| 机器人异常中断 | 中 | 使用 systemd/supervisor 保证运行稳定性 |
参考资料
- OpenCode GitHub Repository - OpenCode 开源代码仓库
- Bun Documentation - Child Processes - Bun 进程管理文档
- grammY Documentation - Telegram Bot 库文档
- Telegram Bot API - sendMessage - Telegram API 文档