From c1b4d043a8f7aa48139889ff56e54d6013fde9a8 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Sat, 27 Dec 2025 01:58:58 +0100 Subject: [PATCH] Remove emitLastMessage from continue(), use prompt(AppMessage) instead Cleans up the temporary emitLastMessage plumbing since we now use Agent.prompt(AppMessage) for hook messages instead of appendMessage+continue. - Remove emitLastMessage parameter from Agent.continue() - Remove from transport interface and implementations - Remove from agentLoopContinue() --- packages/agent/src/agent.ts | 13 ++++--------- packages/agent/src/transports/AppTransport.ts | 4 ++-- packages/agent/src/transports/ProviderTransport.ts | 4 ++-- packages/agent/src/transports/types.ts | 7 +------ packages/ai/src/agent/agent-loop.ts | 9 +-------- 5 files changed, 10 insertions(+), 27 deletions(-) diff --git a/packages/agent/src/agent.ts b/packages/agent/src/agent.ts index 59ead2a3..ab4620d8 100644 --- a/packages/agent/src/agent.ts +++ b/packages/agent/src/agent.ts @@ -216,12 +216,7 @@ export class Agent { * Continue from the current context without adding a new user message. * Used for retry after overflow recovery when context already has user message or tool results. */ - /** - * Continue from the current context without adding a new user message. - * Used for retry after overflow recovery when context already has user message or tool results. - * @param emitLastMessage If true, emit message_start/message_end for the last message - */ - async continue(emitLastMessage?: boolean) { + async continue() { const messages = this._state.messages; if (messages.length === 0) { throw new Error("No messages to continue from"); @@ -232,7 +227,7 @@ export class Agent { throw new Error(`Cannot continue from message role: ${lastMessage.role}`); } - await this._runAgentLoopContinue(emitLastMessage); + await this._runAgentLoopContinue(); } /** @@ -249,10 +244,10 @@ export class Agent { /** * Internal: Continue the agent loop from current context. */ - private async _runAgentLoopContinue(emitLastMessage?: boolean) { + private async _runAgentLoopContinue() { const { llmMessages, cfg } = await this._prepareRun(); - const events = this.transport.continue(llmMessages, cfg, this.abortController!.signal, emitLastMessage); + const events = this.transport.continue(llmMessages, cfg, this.abortController!.signal); await this._processEvents(events); } diff --git a/packages/agent/src/transports/AppTransport.ts b/packages/agent/src/transports/AppTransport.ts index 8748525c..69b9af46 100644 --- a/packages/agent/src/transports/AppTransport.ts +++ b/packages/agent/src/transports/AppTransport.ts @@ -380,7 +380,7 @@ export class AppTransport implements AgentTransport { } } - async *continue(messages: Message[], cfg: AgentRunConfig, signal?: AbortSignal, emitLastMessage?: boolean) { + async *continue(messages: Message[], cfg: AgentRunConfig, signal?: AbortSignal) { const authToken = await this.options.getAuthToken(); if (!authToken) { throw new Error("Auth token is required for AppTransport"); @@ -390,7 +390,7 @@ export class AppTransport implements AgentTransport { const context = this.buildContext(messages, cfg); const pc = this.buildLoopConfig(cfg); - for await (const ev of agentLoopContinue(context, pc, signal, streamFn as any, emitLastMessage)) { + for await (const ev of agentLoopContinue(context, pc, signal, streamFn as any)) { yield ev; } } diff --git a/packages/agent/src/transports/ProviderTransport.ts b/packages/agent/src/transports/ProviderTransport.ts index 09240f73..024db0e4 100644 --- a/packages/agent/src/transports/ProviderTransport.ts +++ b/packages/agent/src/transports/ProviderTransport.ts @@ -73,12 +73,12 @@ export class ProviderTransport implements AgentTransport { } } - async *continue(messages: Message[], cfg: AgentRunConfig, signal?: AbortSignal, emitLastMessage?: boolean) { + async *continue(messages: Message[], cfg: AgentRunConfig, signal?: AbortSignal) { const model = this.getModel(cfg); const context = this.buildContext(messages, cfg); const pc = this.buildLoopConfig(model, cfg); - for await (const ev of agentLoopContinue(context, pc, signal, undefined, emitLastMessage)) { + for await (const ev of agentLoopContinue(context, pc, signal)) { yield ev; } } diff --git a/packages/agent/src/transports/types.ts b/packages/agent/src/transports/types.ts index baed2b81..736ba0c3 100644 --- a/packages/agent/src/transports/types.ts +++ b/packages/agent/src/transports/types.ts @@ -28,10 +28,5 @@ export interface AgentTransport { ): AsyncIterable; /** Continue from current context (no new user message) */ - continue( - messages: Message[], - config: AgentRunConfig, - signal?: AbortSignal, - emitLastMessage?: boolean, - ): AsyncIterable; + continue(messages: Message[], config: AgentRunConfig, signal?: AbortSignal): AsyncIterable; } diff --git a/packages/ai/src/agent/agent-loop.ts b/packages/ai/src/agent/agent-loop.ts index 059cb666..95f8b25b 100644 --- a/packages/ai/src/agent/agent-loop.ts +++ b/packages/ai/src/agent/agent-loop.ts @@ -44,14 +44,12 @@ export function agentLoop( * Continue an agent loop from the current context without adding a new message. * Used for retry after overflow - context already has user message or tool results. * Throws if the last message is not a user message or tool result. - * @param emitLastMessage If true, emit message_start/message_end for the last message in context */ export function agentLoopContinue( context: AgentContext, config: AgentLoopConfig, signal?: AbortSignal, streamFn?: typeof streamSimple, - emitLastMessage?: boolean, ): EventStream { // Validate that we can continue from this context const lastMessage = context.messages[context.messages.length - 1]; @@ -70,12 +68,7 @@ export function agentLoopContinue( stream.push({ type: "agent_start" }); stream.push({ type: "turn_start" }); - - // Optionally emit events for the last message (used when message was added outside the loop) - if (emitLastMessage) { - stream.push({ type: "message_start", message: lastMessage }); - stream.push({ type: "message_end", message: lastMessage }); - } + // No user message events - we're continuing from existing context await runLoop(currentContext, newMessages, config, signal, stream, streamFn); })();