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