核心任务:构建基于 Inngest 与 tmux 的持久化 Shell 助手 (QQ 桥接) 项目背景: 我需要构建一个名为 Butler-Shell 的系统。它通过 IM (QQ) 接收指令,在远程服务器上维护持久化的 Shell 会话。系统必须具备“模式感知”能力,能自动在“自然语言模式”与“PTY 透传交互模式”之间切换。 技术栈限制: Orchestrator: Inngest (Python SDK) - 用于任务编排、异步审批、持久化。 Execution: tmux (作为底层 PTY 容器) + pexpect (用于进程状态监控)。 Agent Logic: 调用 Claude API 执行复杂指令。 实现要求: Session 管理层 (Harness): 使用 tmux 为每个用户/会话创建一个独立的 session。 实现 capture_pane 功能,用于将终端屏幕内容(文本或 ANSI 渲染)抓取并返回。 实现 detect_mode 逻辑:通过检查 tmux 内的活跃进程(如 top, vim, claude)判断是否进入交互模式。 Inngest 工作流编排: handle_im_message: 接收 QQ 消息。如果当前处于 INTERACTIVE 模式,跳过 LLM,直接执行 tmux send-keys。 command_guardrail: 实现命令准入。对于危险命令(rm, chmod 等),触发 ctx.step.wait_for_event 等待用户在 QQ 回复“确认”。 context_compaction: 实现 /compact 指令。总结当前 shell 状态(pwd, env, key output),清空历史上下文,只保留状态快照。 PTY 劫持逻辑: 当 detect_mode 发现不退出进程时,向用户发送信号进入 Interactive Mode。 在此模式下,所有 QQ 输入必须原样透传给 tmux(包括特殊字符如 :q, C-c)。 实时返回 capture_pane 的快照给用户,模拟实时终端感。 Skill 扩展系统: 构建 SkillManager 基类。 实现 LogSkill: 自动记录所有 shell 交互到本地 SQLite,支持检索。 实现 SystemSkill: 快速获取负载信息。 请分步执行: 先设计项目目录结构和核心数据模型。 实现 TmuxWrapper 类,处理底层 PTY 交互。 编写 Inngest Functions 核心骨架。 在完成后,提供一个简单的 Mock 脚本模拟 QQ 消息输入进行测试。