From 717cdeed41662719fb52fc93b7317c96eec8f5ee Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Sun, 9 Aug 2026 21:27:23 +0000 Subject: [PATCH] feat(core): expose previous agent on selection events --- packages/client/src/effect/api/api.ts | 6 +++++- packages/client/src/promise/generated/types.ts | 2 +- packages/core/src/session.ts | 3 ++- packages/core/test/session-create.test.ts | 4 ++-- packages/schema/src/session-event.ts | 1 + 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/client/src/effect/api/api.ts b/packages/client/src/effect/api/api.ts index e0867bedd9..f102d42e14 100644 --- a/packages/client/src/effect/api/api.ts +++ b/packages/client/src/effect/api/api.ts @@ -339,7 +339,11 @@ export type Endpoint5_31Output = readonly type: "session.agent.selected" readonly durable: { readonly aggregateID: string; readonly seq: Event.Seq; readonly version: Event.Version } readonly location?: Location.Ref | undefined - readonly data: { readonly sessionID: Session.ID; readonly agent: Agent.ID } + readonly data: { + readonly sessionID: Session.ID + readonly agent: Agent.ID + readonly previous?: Agent.ID | undefined + } } | { readonly id: Event.ID diff --git a/packages/client/src/promise/generated/types.ts b/packages/client/src/promise/generated/types.ts index 090811bc07..45d5e468fe 100644 --- a/packages/client/src/promise/generated/types.ts +++ b/packages/client/src/promise/generated/types.ts @@ -439,7 +439,7 @@ export type SessionAgentSelected = { type: "session.agent.selected" durable: { aggregateID: string; seq: number; version: 1 } location?: LocationRef - data: { sessionID: string; agent: string } + data: { sessionID: string; agent: string; previous?: string } } export type SessionModelSelected = { diff --git a/packages/core/src/session.ts b/packages/core/src/session.ts index fb49b19cb8..bbc0ee9c8e 100644 --- a/packages/core/src/session.ts +++ b/packages/core/src/session.ts @@ -716,10 +716,11 @@ const layer = Layer.effect( .pipe(Effect.ignore, Effect.forkIn(scope, { startImmediately: true }), Effect.asVoid) }), switchAgent: Effect.fn("Session.switchAgent")(function* (input) { - yield* result.get(input.sessionID) + const session = yield* result.get(input.sessionID) yield* bus.publish(SessionEvent.AgentSelected, { sessionID: input.sessionID, agent: input.agent, + previous: session.agent, }) }), switchModel: Effect.fn("Session.switchModel")(function* (input) { diff --git a/packages/core/test/session-create.test.ts b/packages/core/test/session-create.test.ts index 56db03a2c0..65cc321a2b 100644 --- a/packages/core/test/session-create.test.ts +++ b/packages/core/test/session-create.test.ts @@ -648,14 +648,14 @@ describe("Session.create", () => { it.effect("switches the selected agent through the durable Session event", () => Effect.gen(function* () { const session = yield* Session.Service - const created = yield* session.create({ location }) + const created = yield* session.create({ location, agent: Agent.defaultID }) yield* session.switchAgent({ sessionID: created.id, agent: Agent.ID.make("plan") }) expect(yield* session.get(created.id)).toMatchObject({ agent: "plan" }) expect( Array.from(yield* logEvents(session, created.id, true).pipe(Stream.drop(1), Stream.take(1), Stream.runCollect)), - ).toMatchObject([{ type: "session.agent.selected", data: { agent: "plan" } }]) + ).toMatchObject([{ type: "session.agent.selected", data: { agent: "plan", previous: "build" } }]) }), ) diff --git a/packages/schema/src/session-event.ts b/packages/schema/src/session-event.ts index 2ae3f7c405..1513e6fc37 100644 --- a/packages/schema/src/session-event.ts +++ b/packages/schema/src/session-event.ts @@ -69,6 +69,7 @@ export const AgentSelected = Event.durable({ schema: { ...Base, agent: Agent.ID, + previous: Agent.ID.pipe(optional), }, }) export type AgentSelected = typeof AgentSelected.Type