Gajae-Code 的 bash 与 monitor 工具深度剖析:异步任务、超时钳制与输出溢出机制
Gajae-Code 的 bash 与 monitor 工具深度剖析异步任务、超时钳制与输出溢出机制【免费下载链接】gajae-codeGajae Code MVP项目地址: https://gitcode.com/gh_mirrors/ga/gajae-codeGajae Code 是面向 AI 编程场景的终端智能体其中的bash 工具负责在会话工作区里安全地执行 Shell 命令monitor 工具则把长时间运行的命令转成后台监控任务。本文带你快速看懂这两个工具背后的三大核心机制异步任务后台作业、超时钳制timeout clamp和输出溢出artifact spill——它们共同决定了 AI 在跑git、bun test、长轮询命令时既不会卡死会话也不会撑爆上下文。 先认识这两个工具在深入机制之前先搞清楚它们各自负责什么工具定位一句话概括bash前台执行 Shell 命令执行命令并合并返回 stdout/stderr支持 PTY、后台化与折叠monitor后台监控流式事件把日志轮询、文件监听等命令跑在后台按行捕获输出并合并通知job后台作业管理用poll/cancel/list/tail查询或终止上面两类后台任务bash 工具入口packages/coding-agent/src/tools/bash.tsmonitor 工具入口packages/coding-agent/src/tools/monitor.ts工具参考文档docs/tools/bash.md、docs/tools/monitor.md、docs/tools/job.md 选型口诀只要一次完成通知比如构建完成后告诉我→ 用bash加async: true需要持续多事件日志、轮询、目录监听→ 用monitor。详见 packages/coding-agent/src/prompts/tools/monitor.md。⚙️ 机制一异步任务——三种方式把命令扔进后台bash 工具并不是只有同步等待一种模式它提供了三条通往后台的路径1. 显式后台async: true在bash.autoBackground或async功能开启的会话中bash 支持传入async: true。此时工具立即返回一个 job id形如Background job id started命令继续运行完成后会自动唤醒后续的一轮对话交付结果而不是让当前轮次一直干等。2. 自动后台bash.autoBackground.enabled对非 PTY 命令bash 会先以受管作业方式启动最多等待min(阈值, 超时-1秒)默认阈值60 秒由 packages/coding-agent/src/tools/bash.ts 中的DEFAULT_AUTO_BACKGROUND_THRESHOLD_MS定义。命令如果还活着就自动转为后台作业返回后台启动结果。3. 前台折叠Foreground Fold一键折进后台在交互式 TUI 中你可以按快捷键默认AltShiftBmacOS 为CmdB把正在前台运行的命令折叠成后台作业当用户在命令已运行 2 秒后发出新消息时也会自动触发steer 折叠。关键保证是折叠从不杀死或重启命令原超时继续生效完成时会带着输出回执唤醒后续轮次。每次折叠都会记录foldReasonsteer/chord/timer/sdk_control。所有后台作业统一由 packages/coding-agent/src/async/job-manager.ts 管理可用job工具查看快照list: true、等待poll或取消cancel。作业默认保留 5 分钟会话内最多可运行 100 个作业默认上限。⏱️ 机制二超时钳制——timeout 不听话时的安全带模型有时会给工具传一个离谱的超时值比如 10 万秒。Gajae Code 用**超时钳制timeout clamp**兜底所有工具超时统一由 packages/coding-agent/src/tools/tool-timeouts.ts 中的clampTimeout()按工具上限截断。bash 的钳制规则是默认 300 秒、最小 1 秒、最大 3600 秒参数值说明默认超时300 s模型不传timeout时的取值下限1 s低于 1 秒会被抬升到 1 秒上限3600 s高于 1 小时会被压到 3600 秒并在结果中附上钳制说明两个容易踩坑的细节async: true不会延长超时——后台作业照样受原始 deadline 约束超时会照杀不误。想跑守护进程要么显式传大timeout最多 3600要么用nohup … /setsid … 让进程彻底脱离本次 Shell 生命周期。monitor 的超时更严格它直接复用 bash 的 3600 秒上限但超过上限会被直接拒绝报Monitor timeout ns exceeds the 3600s maximum而不是悄悄钳制。monitor 也不是定时器——过 N 秒再执行应该用cron别用sleep N; command糊弄。非 PTY 执行器还有5 秒硬杀宽限HARD_TIMEOUT_GRACE_MS见 packages/coding-agent/src/exec/bash-executor.ts确保超时后进程能被可靠终止。 机制三输出溢出——50KB 尾缓冲 artifact 落盘一条bun test可能喷出几 MB 输出。如果全部塞给模型token 成本会爆炸。bash 的**输出溢出output spill**机制分三层内存尾缓冲输出流经 packages/coding-agent/src/session/streaming-output.ts 中的OutputSink内存中最多保留50KBDEFAULT_MAX_BYTES 50 * 1024尾窗更早的内容不再驻留内存。溢出落盘一旦超过阈值完整输出会先写入会话预分配的artifact 文件再裁剪内存工具结果里会带上artifact://id脚注需要完整内容时可以凭引用取回。输出最小化Shell 输出在被模型看到前还可能经过 minimizer 压缩例如测试/lint 输出只保留失败行原始文本另存为bash-originalartifact结果末尾附[raw output: artifact://id]说明。由此带来两条实用规则别自己再管道| head -n N/| tail -n N——输出本来就截断好了重复裁剪反而可能丢掉关键信息别写21——stdout 和 stderr 在执行层已经合并只有当结果里出现artifact://id引用时截断的输出才是可恢复的没有引用的截断意味着可见部分就是不完整的。执行层的更多细节Shell 会话复用、快照、原生超时行为见 docs/bash-tool-runtime.md。 机制四monitor 的合并通知别让日志刷爆轮次monitor 把每条标准化后的 stdout 行捕获进后台作业管理器但**持久化persistent: true监控的通知是最新优先 去抖合并**的短时间内多行日志只投递一行最新内容加N 行已合并的计数命令退出时再 flush 最后挂起的一行。这避免了每一行日志都触发一轮模型对话的灾难。monitor 的生命周期规则非持久监控投递第一条 stdout 行通知后自动取消持久监控一直活到命令退出、timeout到期、会话结束或被job取消取消即清空取消或回收时会丢弃尚未投递的挂起通知绝不投递陈旧输出没有独立的 kill 工具用job传cancel: [task_id]即可终止。典型用例tail -F app.log | grep -i error盯错误日志、while true; do ...; sleep 30; done轮询 CI 状态。 小结一张表看懂三大机制机制关键数值兜底效果异步任务自动后台阈值 60s作业保留 5min长命令不卡死会话完成自动唤醒后续轮次超时钳制默认 300s范围 1–3600s防止失控超时后台作业同样受 deadline 约束输出溢出50KB 尾缓冲 artifact 落盘控制 token 成本完整输出可凭artifact://引用取回对于普通用户来说日常只需要记住三点长命令交给后台async或自动折叠、超时上限一小时、大输出靠 artifact 引用回取。深入细节可继续阅读 docs/tools/bash.md、docs/tools/monitor.md 与 docs/tools/job.md 这三份工具参考。【免费下载链接】gajae-codeGajae Code MVP项目地址: https://gitcode.com/gh_mirrors/ga/gajae-code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →