核心是强化 Agent loop,产品层再叠加大型 Session maintenance 状态机
packages/agent 处理模型、工具、steering 和 telemetry;产品 AgentSession 在 agent_end 后按优先级处理 yield、空 stop、goal compaction、异常 stop、stream stall、model fallback、todo、async wake 和 session_stop。
内层发动机负责每一步,外层管家负责一步结束后判断要不要重试、压缩、换模型、继续目标或等待后台工作。
自治恢复能力强,但 session maintenance 已成为复杂调度器,修改顺序容易产生竞态。
879 /**
880 * Main loop logic shared by agentLoop and agentLoopContinue.
881 */
882 async function runLoop(
883 currentContext: AgentContext,
884 newMessages: AgentMessage[],
885 config: AgentLoopConfig,
886 signal: AbortSignal | undefined,
887 stream: EventStream<AgentEvent, AgentMessage[]>,
888 streamFn?: StreamFn,
889 initialMessages: AgentMessage[] = [],
890 ): Promise<void> {
891 const telemetry = resolveTelemetry(config.telemetry, config.sessionId);
892 const invokeAgentSpan = startInvokeAgentSpan(telemetry, config.model);
893 const stepCounter = { count: 0 };
894 let caughtError: unknown;
895 try {
896 await runInActiveSpan(invokeAgentSpan, () =>
897 runLoopBody(
898 currentContext,
899 newMessages,
900 config,
901 signal,
902 stream,
903 telemetry,
… 4 lines omitted; exact range 879–918 …
908 ),
909 );
910 } catch (err) {
911 caughtError = err;
912 throw err;
913 } finally {
914 finishInvokeAgentSpan(telemetry, invokeAgentSpan, {
915 stepCount: stepCounter.count,
916 errorObject: caughtError,
917 });
918 }为什么相信这条结论?查看 3 处证据
- implementation
packages/agent/src/agent-loop.ts:879–918runLoop 与 invoke_agent telemetry 边界。 - implementation
packages/coding-agent/src/session/agent-session.ts:2491–2619yield、empty stop、goal compaction、unexpected stop 与 retry 路由。 - implementation
packages/coding-agent/src/session/agent-session.ts:2621–2740abort、model fallback、todo、async wake 与 session_stop。