diff --git a/packages/core/agent-loop/src/index.ts b/packages/core/agent-loop/src/index.ts index 54b8f5c957..cc58f566e1 100644 --- a/packages/core/agent-loop/src/index.ts +++ b/packages/core/agent-loop/src/index.ts @@ -14,6 +14,7 @@ import type { AgentFactory, AgentHandle, AgentOptions, + AgentSetup, CreateAgentOptions, ResumeAgentOptions, SessionStartSource, @@ -555,23 +556,40 @@ export class AgentLoop extends Service implements AgentFactory { ...options.seed === undefined ? {} : { seed: options.seed }, ...options.meta === undefined ? {} : { meta: options.meta }, }) - const prepared = this.prepare(ownerCtx, options.sessionId, options.agentOptions ?? {}, session, options.signal) - const published = (async () => { - try { - const setupCommit = await raceAbort( - options.setup?.(prepared.agent.ctx), prepared.signal, options.sessionId, - ) - setupCommit?.commit() - return prepared.publish('startup') - } catch (error: unknown) { - await prepared.dispose() - throw error - } - })() + const published = this.setupAndPublish( + ownerCtx, + options.sessionId, + session, + options.agentOptions ?? {}, + options.setup, + options.signal, + 'startup', + ) this.ownership.trackWrapper(published) return published } + /** Prepare one Agent around an acquired Session, run setup, and publish it. */ + private async setupAndPublish( + ownerCtx: Context, + id: SessionId, + session: Session, + agentOptions: AgentOptions, + setup: AgentSetup | undefined, + signal: AbortSignal | undefined, + source: SessionStartSource, + ): Promise { + const prepared = this.prepare(ownerCtx, id, agentOptions, session, signal) + try { + const setupCommit = await raceAbort(setup?.(prepared.agent.ctx), prepared.signal, id) + setupCommit?.commit() + return prepared.publish(source) + } catch (error: unknown) { + await prepared.dispose() + throw error + } + } + /** * Resume an owned agent from the configured persistence service. * @param ownerCtx - caller context that owns load, setup, and the live lifecycle.