diff --git a/packages/server/src/server/agent/agent-loading.test.ts b/packages/server/src/server/agent/agent-loading.test.ts index d6a53fb1bc..eba03b7459 100644 --- a/packages/server/src/server/agent/agent-loading.test.ts +++ b/packages/server/src/server/agent/agent-loading.test.ts @@ -559,6 +559,7 @@ test.each(["mode", "thinking", "rewind"])( expect.objectContaining({ message: "continue" }), ]), ); + runtime.latestSession().beginTurn(); runtime.latestSession().finishTurn(); await manager.waitForAgentEvent(agentId); await manager.archiveAgent(agentId); diff --git a/packages/server/src/server/agent/agent-manager.ts b/packages/server/src/server/agent/agent-manager.ts index 88b66608e0..2fffd0b026 100644 --- a/packages/server/src/server/agent/agent-manager.ts +++ b/packages/server/src/server/agent/agent-manager.ts @@ -4265,6 +4265,12 @@ export class AgentManager { agentId: string, options?: WaitForAgentOptions, ): Promise { + if (!this.getAgent(agentId)) { + throw new Error(`Agent ${agentId} not found`); + } + // A starting run publishes its running state only once its turn starts. Until then the + // replayed state below is the idle state before the run, which would end the wait early. + await this.runs.waitForForegroundStart(agentId); const snapshot = this.getAgent(agentId); if (!snapshot) { throw new Error(`Agent ${agentId} not found`); diff --git a/packages/server/src/server/agent/agent-run-state.ts b/packages/server/src/server/agent/agent-run-state.ts index 0ea85f6d81..b8a03dce2a 100644 --- a/packages/server/src/server/agent/agent-run-state.ts +++ b/packages/server/src/server/agent/agent-run-state.ts @@ -74,7 +74,7 @@ export class AgentRunState { */ async waitForForegroundStart(agentId: string): Promise { const run = this.getPendingRun(agentId); - if (run?.start.status !== "pending") { + if (!run || run.start.status === "started") { return; } await Promise.race([run.turnStartedPromise, run.settledPromise]);