diff --git a/packages/client/connection/src/client/fixture.ts b/packages/client/connection/src/client/fixture.ts index c6ce23a289..510079b094 100644 --- a/packages/client/connection/src/client/fixture.ts +++ b/packages/client/connection/src/client/fixture.ts @@ -510,7 +510,7 @@ export function createFixtureApi(): ApiProxy { if (planState?.pending !== undefined) { const active = planState.pending planStates.set(id, { active }) - if (active !== planState.active) append(id, { type: 'plan/mode', data: { active } }) + append(id, { type: 'plan/mode', data: { active } }) } append(id, { type: 'user/message', surfaceOp: 'append', data: { content, source: { kind: 'user' } } }) startReply( @@ -551,10 +551,11 @@ export function createFixtureApi(): ApiProxy { details: { sessionId: request.payload.sessionId }, }) } - const target = state.pending ?? state.active - const next = request.payload.active === target - ? state - : { active: state.active, pending: request.payload.active } + const next = request.payload.active === state.active + ? { active: state.active } + : request.payload.active === state.pending + ? state + : { active: state.active, pending: request.payload.active } planStates.set(request.payload.sessionId, next) return ok(request, { ...next }) }, diff --git a/packages/client/connection/tests/fixture.spec.ts b/packages/client/connection/tests/fixture.spec.ts index ea71b706ef..147e256cee 100644 --- a/packages/client/connection/tests/fixture.spec.ts +++ b/packages/client/connection/tests/fixture.spec.ts @@ -56,6 +56,9 @@ describe('createFixtureApi', () => { expect((await client.sessions.setPlanMode({ sessionId: sid('fx-alpha'), active: true })).result).toEqual({ ok: true, value: { active: false, pending: true }, }) + expect((await client.sessions.setPlanMode({ sessionId: sid('fx-alpha'), active: true })).result).toEqual({ + ok: true, value: { active: false, pending: true }, + }) expect((await client.sessions.cancel({ sessionId: sid('fx-alpha') })).result).toEqual({ ok: true, value: { accepted: true }, }) @@ -83,12 +86,12 @@ describe('createFixtureApi', () => { const createdId = created.result.value.sessionId await client.sessions.setPlanMode({ sessionId: createdId, active: true }) expect((await client.sessions.setPlanMode({ sessionId: createdId, active: false })).result).toEqual({ - ok: true, value: { active: false, pending: false }, + ok: true, value: { active: false }, }) - // Selecting the effective target again is a no-op, and a net-zero pending - // target clears at the boundary without a redundant plan/mode event. + // Selecting the committed target clears pending immediately, and repeating + // that selection remains a no-op without a redundant plan/mode event. expect((await client.sessions.setPlanMode({ sessionId: createdId, active: false })).result).toEqual({ - ok: true, value: { active: false, pending: false }, + ok: true, value: { active: false }, }) await client.sessions.prompt({ sessionId: createdId, mode: 'queue', content: [{ type: 'text', text: 'remain default' }],