资讯动态

Beans源码深度剖析:Agent会话管理与Claude Code进程生命周期

发布时间:2026/10/23 2:11:29 来源:尧图企业网站定制
【免费下载链接】beansA CLI-based, flat-file issue tracker for humans and robots. 项目地址https://gitcode.com/gh_mirrors/bean/beans点击查看免费下载Beans 是一个基于命令行和 Markdown 平文件的 issue tracker专为人类与 AI 编程机器人共同协作而设计。它的核心亮点之一是内置的 Agent 会话管理系统在beans serve启动的 Web UI 中每个 bean任务都拥有独立的 Claude Code 进程由internal/agent包统一完成会话创建、消息流解析、进程生命周期与持久化恢复。本文带你从源码角度拆解这套机制。一、整体架构一个 Manager 管住所有会话Beans 的 Agent 层由 internal/agent/ 包承担核心是Manager结构体见 manager.go一个 worktree 一个会话Manager 用map[string]*Session按 beanID 维护会话中央规划会话使用特殊 ID__central__一个 beanID 一个进程processes映射记录正在运行的 Claude Code 子进程发布/订阅机制Subscribe(beanID)返回通道会话状态一变就通知订阅者前端通过 GraphQL 订阅agentSessionChanged定义在 schema.graphqls实时刷新界面持久化存储可选的store负责把对话写成 JSONL 文件重启后可无缝恢复。装配过程发生在 serve.gobeans serve启动时创建 Manager并注入三类回调——上下文提供者把 bean 标题、正文注入首条消息、系统提示词提供者告诉 Agent 自己所在的 worktree 路径、以及各种生命周期钩子首条消息、回合完成、快捷回复上下文。二、会话数据模型Session 里装了什么types.go 中的Session是会话的核心快照几个关键字段值得注意字段作用Status三态机idle/running/errorSessionIDClaude Code 的会话 ID用于--resume恢复Messages聊天历史角色分user/assistant/tool/infostreamingIdx流式文本的目标消息下标保证增量文本落对位置PlanMode/ActMode只读规划模式 / 全自主执行模式PendingInteractionAgent 发起的阻塞式交互退出计划、询问用户QuickReplies每轮结束后由 Haiku 模型生成的快捷回复建议Session.snapshot()方法types.go会做一次深拷贝让并发读永远安全——这是 Go 无锁读路径的常见手法。三、进程生命周期从 spawn 到 graceful kill3.1 启动spawnAndRun当用户发送第一条消息且没有存活进程时Manager 调用spawnAndRunclaude.go用exec.CommandContext启动claude子进程工作目录设为该 bean 的 worktree 路径建立 stdin/stdout/stderr 三条管道stderr 被静默丢弃Claude Code 的进度输出太啰嗦把首条用户消息含注入的 bean 上下文按stream-json 格式写入 stdin进入readOutput循环逐行解析 stdout 直到进程退出。启动参数由buildClaudeArgsclaude.go拼装堪称一份进程模式说明书--output-format stream-json--input-format stream-json全 JSON 流式通信方便机器解析--include-partial-messages开启文本增量delta事件实现逐字流式渲染--permission-mode planPlan 模式Agent 只读--dangerously-skip-permissionsAct 模式完全自主会额外放行 CLAUDE.md 等敏感文件;--effort low|medium|high|max控制思考深度--resume sessionID进程重启后从上次会话继续记忆不丢--append-system-prompt附加工作区身份提示词。另外buildClaudeEnv会过滤掉CLAUDECODE环境变量允许在 Claude Code 内部再嵌套启动 Claude Code。3.2 停止先礼后兵的 kill 策略runningProcess.kill()claude.go体现了对子进程的优雅处理先发SIGINT并关闭 stdin给 Claude Code 3 秒钟保存自身会话状态这正是--resume能生效的前提3 秒未退出再升级为强制 Kill服务端关闭时Manager.Shutdown()会并发地终止所有进程避免超时时间累加。3.3 特殊时刻阻塞工具的杀死-复活模式这是整个生命周期设计中最巧妙的部分claude.go当 Agent 调用ExitPlanMode请求退出规划或AskUserQuestion向用户提问时Beans 会主动终止当前进程把问题挂到PendingInteraction上等待 UI 里用户点击批准/拒绝用户做出选择后凭借已持久化的SessionID用--resume重新拉起进程对话无缝衔接而EnterPlanMode这类模式切换则走autoApproveModeSwitch自动批准切换模式、发信号、立即带--resume重生用户完全无感。四、输出解析把 stream-json 事件变成聊天消息readOutput是进程的输出泵claude.go配合 parse.go 把 JSON 行归一化为约 12 种事件类型主要处理逻辑包括文本增量text_delta追加到streamingIdx指向的 assistant 消息UI 逐字滚动工具调用tool_use时新增一条 tool 消息并累积input_json_delta提取人类可读摘要如Bash: Build binary对Write工具还会在写入前提前快照文件旧内容回合结束后计算 unified diff 展示变更回合结束result事件到来时持久化 assistant 消息、落盘SessionID、重置状态为idle并异步触发两件事——用 Haiku 生成 3~4 条快捷回复建议quickreplies.go、以及更新 workspace 的活跃时间戳子代理进度task_progress事件让 UI 能实时展示并行子代理正在用哪个工具、做什么事。五、持久化JSONL 文件 图片附件对话存储由storestore.go负责设计极简却够用每个 bean 对应.beans/.conversations/beanID.jsonl一行一个 JSON 对象消息或 meta追加写入、损坏行自动跳过SessionID作为 meta 行单独追加供重启后--resume使用图片附件限 5MB仅 jpeg/png/gif/webp存于attachments/beanID/文件名走 UUID/compact压缩对话后会自动清理孤儿附件回收磁盘空间所有路径都经过safepath校验防止 beanID 路径穿越攻击。服务重启后GetSession发现内存里没有会话时会自动从 JSONL 读回历史消息并实体化用户看到的聊天记录不会丢。六、实时推送从 Manager 到浏览器的最后一公里serve.go 中的defer agentMgr.Shutdown()保证服务优雅退出而前端实时性则由AgentSessionChanged订阅解析器schema.resolvers.go保障。它采用最新值模式latest-value pattern先立即推送当前会话状态避免连接后的初始空窗之后每收到一次 Manager 通知就把最新快照送入 WebSocket 通道若发送阻塞期间又有新通知直接刷新待发送数据——即使传输层较慢前端也总能拿到最新状态不会漏掉IDLE→RUNNING这类关键跳转会话被清空时显式发送空会话让 UI 正确复位。七、小结这套设计给 Agent 集成项目的启示回看 Beans 的 Agent 会话管理几个思路对自建 AI 编程平台很有参考价值进程与状态分离子进程随时可杀可重生真正的状态消息、SessionID、模式都在内存 JSONL 里JSONL 追加写比数据库更轻天然防写坏还能被 Agent 自己读取迁移Beans 数据格式升级时就靠这个能力stream-json 全流式输入输出都是 JSON 行解析、测试、回放都方便优雅终止 恢复SIGINT 留足保存时间--resume让杀死-复活对用户透明。如果你想继续深挖建议按这个路径阅读源码internal/agent/manager.go → internal/agent/claude.go → internal/agent/parse.go → internal/agent/store.go再看 internal/graph/schema.resolvers.go 里订阅解析器如何把 Manager 桥接到 GraphQL 层即可完整掌握 Beans 的 Agent 会话管理与 Claude Code 进程生命周期全貌。赞分享【免费下载链接】beansA CLI-based, flat-file issue tracker for humans and robots. 项目地址https://gitcode.com/gh_mirrors/bean/beans点击查看免费下载相关推荐Positron Agent Host ClaudeAgent Phase 5Claude 会话生命周期Session Lifecycle的实现规划与源码剖析Positron Agent Host ClaudeAgent Phase 5Claude 会话生命周期Session Lifecycle的实现规划与源码代码编辑器桌面应用开发工具数据科学AI 应用gh_mirrors/docume/documentation架构方法论从零开始构建可扩展前端项目gh_mirrors/docume/documentation架构方法论从零开始构建可扩展前端项目 gh_mirrors/docume/documentatiTaskWeaver Session 深度指南会话生命周期、事件处理与多会话管理TaskWeaver Session 深度指南会话生命周期、事件处理与多会话管理 会话Session是用户与 TaskWeaver 应用进行交互的基本对话AI Agent数据分析上一篇Python GDSII设计实战从零开始构建半导体版图 下一篇OpenTimer shell命令详解轻松实现交互式VLSI时序分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑