ASTER CODE / 02
任务执行流程
以一次编码任务为例,看模型如何调用工具、处理结果并完成验证。
- 01模型只提出下一步
模型读取当前上下文,再提出工具调用或最终答复。
fact_control.rsL126 ↗ - 02执行前先检查权限
Ask 等待准确的确认回答。Deny 返回拒绝结果。
- 03用事实检查能否结束
工具回执进入日志。完成门禁核对修改、验证和未决事项。
harness_loop.rsL1591 ↗
01 建立工作区会话
开始任务前,Agent 加载 ACL 配置,AgentSession 确定本次会话使用的工作区、模型、工具和权限。终端和桌面通过 ACP 调用 Core;Rust 应用可以直接使用 send 或 stream。
从 Agent::session_async L176 ↗ 进入会话创建,再沿 FactRun L126 ↗ 查看执行状态与事实日志。
宿主提供的可信配置与项目目录中自动发现的配置,拥有不同的权限。例如,仓库里的配置文件不能自行授权执行命令,也不能指定什么检查足以证明任务完成。
02 准备模型上下文
每次调用模型前,运行时收集系统指令、项目规则、对话历史和工具目录。这些内容经排序、去重后,再按上下文预算选择发送部分。预算限制发送给模型的内容量。历史过长时,可以用摘要替换较早的消息。
工作区检索用于查找相关代码,Skills 提供任务所需的操作说明,持久记忆保存可跨会话使用的信息。是否使用这些来源,取决于宿主接入了哪些能力。
- 01来源先提交候选
文件、技能目录和检索提供条目。
- 02同一来源只保留最新贡献
后一次贡献替换前一次贡献,再处理条目去重。
assembler.rsL153 ↗ - 03预算约束最终输入
装配器依据排序、必需项和来源配额选择内容。
assembler.rsL153 ↗
具体去重与预算选择见 ContextAssembler::assemble L153 ↗;各来源的每轮最新贡献不会无限叠加。
03 检查工具调用权限
模型返回工具名称和参数后,运行时先检查权限,再决定执行、拒绝或请求用户确认。获准的调用由工具执行器运行,并遵守当前沙箱配置。执行结果、拒绝原因和错误都会返回模型。
04 执行并记录结果
工具结果写入事实日志,文件修改和检查结果也会被记录。模型看到这些结果后,再决定继续查找、修改还是运行测试。
任务也可以交给子代理。子代理使用独立会话,仍要经过权限和完成检查。子代理修改共享工作区时,父任务必须取得并处理执行结果。尚未确认结果的后台任务会阻止父任务成功结束。
05 检查完成条件
模型准备给出最终答复时,CompletionGate 检查修改文件、对应检查、子任务和未决操作。常见的结束状态如下:
入口是 decide_completion L1565 ↗;它把修改账本、验证报告与宿主豁免交给完成规则判断。完整分支见权限与验证。
| 状态 | 何时出现 | 含义 |
|---|---|---|
| Narrative | 没有工作区修改,且无其他未解决事项 | 本轮可以用最终答复结束 |
| Verified | 检查通过,报告对应当前修改 | 声明的检查已通过 |
| Waived | 宿主或用户明确接受尚未验证的本次修改 | 允许结束,但不代表验证通过 |
| Incomplete | 缺少检查结果、操作结果不明或子任务尚未处理完 | 任务还不能算完成 |
effect_digest 是本次修改的摘要,用来确认验证报告对应哪一版修改。先测试版本 A,再改出版本 B,原报告就不能证明 B 也通过了测试。
- 01先证明当前修改
通过报告绑定修改摘要 A。报告只证明对应状态。
harness_loop.rsL1637 ↗ - 02再次修改后摘要改变
产生摘要 B 后,原报告仍保留为 A 的历史依据。
- 03为新状态取得依据
新修改需要匹配 B 的报告或明确豁免。
harness_loop.rsL1654 ↗
缺少检查结果时,运行会根据当前状态决定继续执行还是返回未完成。命令退出码为 0 只是报告的一部分,还需要知道它检查了哪些修改。
06 收尾与恢复
完成检查通过后,运行还要等待资源清理结束,例如关闭监听器、释放租约。清理失败、超时,或用户在此期间取消任务,都不能返回成功。
资源实现遵循 CapabilityEffect L39 ↗,释放原资源的异步结果也属于收尾依据。
会话中断后,可以从事实日志重建执行状态。已经发出但结果不明的操作需要先核实,再决定是否重试。长期目标启动下一轮执行前,还要检查宿主设定的期限、权限和进展要求。