diff --git a/packages/eve/src/client/eve-agent-store.ts b/packages/eve/src/client/eve-agent-store.ts index 9fc73a22d..9a224e3bc 100644 --- a/packages/eve/src/client/eve-agent-store.ts +++ b/packages/eve/src/client/eve-agent-store.ts @@ -173,6 +173,14 @@ export class EveAgentStore { signal: createAbortSignal(preparedInput.signal, abortController.signal), }); + if (!this.#isCurrentOperation(operationId)) { + return; + } + + // Eagerly notify listeners of the session ID before streaming begins. + this.#callbacks.onSessionChange?.(this.#session.state); + this.#publish(); + let sawEvent = false; for await (const event of response) { if (!this.#isCurrentOperation(operationId)) { diff --git a/packages/eve/src/client/session.ts b/packages/eve/src/client/session.ts index d839259ce..0754e3f99 100644 --- a/packages/eve/src/client/session.ts +++ b/packages/eve/src/client/session.ts @@ -72,6 +72,12 @@ export class ClientSession { const postResult = await this.#postTurn(payload, state); const { continuationToken, sessionId } = postResult; + // Eagerly surface the session ID so callers can read it from + // `session.state` before the event stream is consumed. + if (sessionId !== state.sessionId) { + this.#state = { ...state, sessionId }; + } + return new MessageResponse({ continuationToken, createStream: () => this.#createEventStream(sessionId, continuationToken, state, payload),