Agent 状态

本页定义 Holon 中 Agent 状态、生命周期和运行时投影的当前契约。契约基于下方 最后复核日期所对应的实现和测试进行验证。

Last verified: 2026-07-24 against src/types.rs AgentState, AgentStatus, AgentIdentityView, AgentSchedulingPosture, AgentPostureProjection, ClosureDecision, ContinuationResolution, RuntimePosture, and AgentSummary; src/storage/mod.rs agent_posture_projection; src/runtime/lifecycle.rs agent_summary; src/runtime/closure.rs closure derivation; and src/tool/tools/get_agent.rs.

源 RFC

权威记录与投影

Agent 状态派生自权威运行时记录,而不是存成单个不透明的状态字段。关键区别是:

层内容权威来源
身份agent_id、kind、profile preset 和监督元数据Agent 注册表记录
身份生命周期AgentRegistryStatus — Active、Deleting、DeletedAgent 身份仓库
生命周期状态AgentStatus — Booting、AwakeIdle、AwakeRunning、AwaitingTask、Asleep、Stopped调度器执行器(唯一写入方)
调度姿态AgentSchedulingPosture — 由队列、WorkItem、任务和等待状态派生调度器 derive_posture 投影
运行时姿态RuntimePosture — Awake 或 Sleeping轮次结束时的 closure 决策
延续ContinuationResolution — Agent 如何被重新激活轮次开始时的 ingress/dispatch
面向用户的摘要AgentSummary — 供 API/UI/模型展示的稳定投影GetAgent 工具 + HTTP /agents/{agent_id}

AgentSummary 是展示投影,不是调度决策的事实来源。调度器必须从队列、 WorkItem、任务和等待状态派生姿态,而不能读取摘要字段。

当前实现锚点:

Agent 生命周期状态(AgentStatus)

                ┌─────────────┐
                │   Booting   │
                └──────┬──────┘
                       │ daemon_start / Start
                       ▼
                ┌─────────────┐
         ┌─────►│  AwakeIdle  │◄─────────────┐
         │      └──────┬──────┘              │
         │             │ turn starts         │
         │             ▼                     │
         │      ┌──────────────┐             │
         │      │ AwakeRunning │             │
         │      └──────┬───────┘             │
         │             │ turn closure        │
         │             ▼                     │
         │      ┌─────────────┐     ┌────────┴──────┐
         ├──────│    Asleep    │────►│  AwaitingTask │
         │      └─────────────┘     └────────┬──────┘
         │         wake / resume              │ task result
         │                                    │
         └────────────────────────────────────┘

                          Stop ──► ┌──────────┐
                                   │  Stopped  │
                                   └──────────┘
状态含义
BootingAgent 正在初始化;尚未交给调度器
AwakeIdleAgent 已唤醒,但没有正在进行的模型轮次
AwakeRunning当前正在执行模型轮次
AwaitingTask已唤醒的 Agent 阻塞在非终态任务结果上时使用的过渡标签
Asleep运行时接受了轮次 closure,且没有模型轮次在运行
StoppedAgent 生命周期已停止;调度器不会启动新轮次

关键契约:

调度姿态(AgentSchedulingPosture)

调度器从当前状态派生出调度姿态。这是投影,不是存储状态。当前归约到 Agent 级的投影按以下优先级判定:

姿态条件
StoppedAgent 生命周期已停止(AgentStatus::Stopped)
ActiveTurnAgentState.current_run_id 已设置
HasQueuedInput队列中该 Agent 有等待处理的入队项
HasRunnableWork当前或排队的 WorkItem 可运行
WaitingForTask某个 WorkItem 有活跃的任务等待条件
WaitingForExternal某个 WorkItem 有活跃的外部等待意图
WaitingForOperatorWorkItem 的 plan_status=needs_input,或有活跃的操作者等待
BlockedWorkItem 设置了 blocked_by,或有活跃的定时器/系统/非操作者等待
Idle无入队输入、无可运行工作、无阻塞条件
Unknown首次投影前的默认值;不属于稳定契约

关键契约:

Closure 与延续

每轮结束时,closure 决策决定下一个姿态:

ClosureOutcome效果
Completed工作完成;Agent 可接收下一项工作
Continuable工作继续;同一 WorkItem 保持活跃
Failed轮次失败;Agent 可恢复或上报
WaitingAgent 正在等待操作者、外部、任务或定时器

等待中的 Agent 被重新激活时,ContinuationResolution 记录:

字段含义
trigger_kindOperatorInput、TaskResult、ExternalEvent、TimerFire、InternalFollowup、SystemTick
classResumeExpectedWait、ResumeOverride、LocalContinuation、TaskResultReentry、LivenessOnly
model_reentry模型是否应带着上下文重新进入
matched_waiting_reason触发器是否与先前的等待原因匹配

Closure 推导与展示姿态相互独立。它使用调度器投影事实和当前轮次事实来选择 ClosureOutcome、WaitingReason 和 RuntimePosture。当前实现中:

面向用户的投影(AgentSummary)

AgentSummary 是由 GetAgent 和 GET /api/agents/{agent_id} 返回的稳定投影。 它包含:

关键契约:

v0.38.0 身份迁移遗留

AgentVisibility、AgentOwnership、PrivateChild 和 PublicNamed 仅描述 v0.38.0 的迁移面。它们不是当前的公开身份契约,不得用于选择创建或委派行为。 当前调用方使用 CreateAgent 创建可寻址 Agent,使用 InvokeAgent 做父级监督的 委派执行。

生命周期控制

Agent 执行生命周期控制是 Start / Stop:

验证结论

本页对照 issue #1367 中列出的 RFC 和实现区域进行了验证。

领域结论分类当前处理
AgentSummary / GetAgent 推导摘要在读取时组装;GetAgent 只读,不修改状态。契约与实现一致上文已记录。
投影作为调度器输入面向用户的 AgentSummary.scheduling_posture 派生自存储/运行时事实。对调度敏感的 closure 和 run-loop 路径从队列、WorkItem、等待、任务和轮次状态派生,而不是读回摘要。契约与实现一致由存储和运行时测试覆盖。
生命周期标签当前实现保留了 Booting、AwakeIdle、AwakeRunning、AwaitingTask、Asleep 和 Stopped;Paused 仅作为 Stopped 的遗留别名反序列化。契约与实现一致,含过渡标签记录为当前契约和已知迁移缺口。
Agent 级定时器/系统等待WorkItem 调度区分 WaitingTimer 和 WaitingSystem,而归约后的 AgentSchedulingPosture 把它们报告为 Blocked。有意为之的归约投影已记录;测试覆盖该投影。
Stopped 姿态AgentSchedulingPosture::Stopped 覆盖已停止的 Agent;archived 仅保留为 serde 别名。旧规范措辞已过时已在本页修正。
持久状态与运行时投影AgentState、队列项、WorkItem、任务、等待条件/意图、外部触发器和审计/转录记录仍是权威;AgentSummary 仍是展示/API 投影。契约与实现一致记录为分层表和锚点。

已知缺口