工程化 / Loop Engineering
10. 知名开源智能体-Crush是如何做运行循环工程的
原文备份 · 第 12 / 13 篇 · 查看极客时间原知识库 ↗
本篇目录 · 5 节
本章是迁移练习,不把 Crush 内部的一次 turn 等同于本课程的外部任务调度。预计用 20~30 分钟追踪三条调用链。
一、先固定所读源码
git clone https://github.com/charmbracelet/crush.git
cd crush
git rev-parse HEAD > ../crush-reading-commit.txt
git status --short
把提交号保存到阅读笔记。本文不声称对未来 main 分支路径永久有效;阅读时从该提交搜索符号,用本地跳转确认调用关系,引用源码时使用含该提交号的永久链接。
二、配置如何进入一次运行
从配置加载入口追到模型、工具权限和 LSP 的使用处。记录“文件或配置脚本 → 解析 → 校验 → 使用”的实际函数。lsp add、permissions allow/deny 若出现在该版本的配置脚本示例中,就属于配置语言,不是可直接在 shell 执行的通用命令;启动参数只能按本机 crush --help 验证。不要把裸 --yolo 当成一条命令,也不在练习中关闭权限检查。
回答:一个权限条目在哪里被检查?拒绝后调用者收到什么?权限控制决定允许执行什么,不是任务结果验收,也不等于操作系统沙箱。AGENTS.md 是否拆分,应按信息重复、职责和上下文成本判断,不按“一屏”长度。
三、停止与重复检测
搜索 toolResultOutputString 和循环检测调用者,追踪输入、签名、阈值和返回路径。原始工具文本可能带时间戳或临时路径;不能因为进入签名计算就称为“稳定文本”。用两次相同错误但不同时间戳的输出,判断该版本是否会识别为重复。
内部工具循环发生在一次 Agent turn 内,属于运行时控制;本课程多次运行之间的领取、重试、恢复是另一层。plan/coder 的角色分工也不自动构成独立验证器,必须查看谁制定验收、谁执行以及能否被候选修改。
四、关联标识与持久化
搜索 WithRunID、RunIDFromContext,追踪 RunID 如何进入事件与日志。它提供关联标识,单靠传递 ID 不提供去重;Mutex 串行化也不保证相同请求只执行一次。真正去重需要检查键、原子领取或持久记录。
再找到一次运行状态写入、加载和恢复的入口。写出一个中断点:此时已保存什么、可能重复哪些副作用、哪些状态必须由人确认。不要从“保存聊天历史”直接推出可恢复业务事务。
五、独立验收
交付一页阅读笔记:提交号、三条调用链的源码位置、一个重复检测反例、一个中断恢复边界。每条结论至少指向一个调用者与被调用者;没有找到的机制写“未在本次路径确认”,不要用概念相似代替实现证据。
参考:Crush 官方仓库。