From c357f94ddc3ba14ef9d2c67b6dfc76e3b3123231 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Tue, 4 Aug 2026 21:14:34 +0800 Subject: [PATCH] test(agent-loop): align consumers with direct wakeup --- packages/acp/acp/tests/turns.spec.ts | 11 ++++------- .../goal/goal-session/tests/goal-session.spec.ts | 4 ++-- .../subagent-spawn/tests/subagent-spawn.spec.ts | 16 ---------------- 3 files changed, 6 insertions(+), 25 deletions(-) diff --git a/packages/acp/acp/tests/turns.spec.ts b/packages/acp/acp/tests/turns.spec.ts index 1344f92257..329aff6d96 100644 --- a/packages/acp/acp/tests/turns.spec.ts +++ b/packages/acp/acp/tests/turns.spec.ts @@ -82,18 +82,15 @@ describe('ACP prompt lifecycle', () => { .resolves.toEqual({ stopReason: 'end_turn' }) }) - it('ignores an injection turn while correlating the owning message turn', async () => { + it('correlates the owning prompt when a synchronous injection joins its first step', async () => { harness = await makeBridgeHarness({ script: [textResponse('real answer')] }) const sessionId = await newSession(harness) const agent = harness.ctx.agents.get(SessionId(sessionId))! let injected = false - harness.ctx.on('session/event', (session, event) => { - if (session === agent.session && event.type === 'agent/inbox/spliced' - && event.data.inserted.some(message => message.source.kind === 'user') && !injected) { + harness.ctx.on('agent/inbox/inserted', (subject, { message }) => { + if (subject === agent && message.source.kind === 'user' && !injected) { injected = true - queueMicrotask(() => { - agent.inject(createUserMessage({ content: [{ type: 'text', text: 'context' }], source: { kind: 'plugin', plugin: 'test' } })) - }) + agent.inject(createUserMessage({ content: [{ type: 'text', text: 'context' }], source: { kind: 'plugin', plugin: 'test' } })) } }) diff --git a/packages/goal/goal-session/tests/goal-session.spec.ts b/packages/goal/goal-session/tests/goal-session.spec.ts index 5bdc1e0026..d9fd63c940 100644 --- a/packages/goal/goal-session/tests/goal-session.spec.ts +++ b/packages/goal/goal-session/tests/goal-session.spec.ts @@ -101,14 +101,14 @@ async function harness(script: ScriptEntry[]): Promise { return { ctx, adapter, agent, driver } } -/** Observe inserted inbox messages after the insertion call completes. */ +/** Observe inserted inbox messages after the live projection accepts them. */ function onInboxMessage( ctx: Context, agent: Agent, listener: (message: UserMessage) => void, ): () => void { return ctx.on('agent/inbox/inserted', (subject, { message }) => { - if (subject === agent) queueMicrotask(() => { listener(message) }) + if (subject === agent) listener(message) }) } diff --git a/packages/subagent/subagent-spawn/tests/subagent-spawn.spec.ts b/packages/subagent/subagent-spawn/tests/subagent-spawn.spec.ts index 4452a6b06a..0310c0b0b3 100644 --- a/packages/subagent/subagent-spawn/tests/subagent-spawn.spec.ts +++ b/packages/subagent/subagent-spawn/tests/subagent-spawn.spec.ts @@ -200,22 +200,6 @@ describe('dsh-subagent-spawn', () => { expect(published).toEqual([]) }) - it('a cancel after the child prompt is queued maps a no-turn child log to aborted', async () => { - const { ctx, parent } = await setup([]) - const controller = new AbortController() - ctx.on('session/event', (_session, event) => { - if (event.type === 'agent/inbox/spliced' && event.data.inserted.length > 0) { - queueMicrotask(() => { controller.abort('queued-window') }) - } - }) - const run = await start(ctx, 'spawn', { prompt: [{ type: 'text', text: 'p' }], parent, signal: controller.signal }) - const result = await run.result - expect(result).toMatchObject({ stopReason: 'aborted', output: [] }) - const child = ctx.agents.get(run.id)! - expect(child.session.events.some(event => event.type === 'turn/end')).toBe(false) - await run.dispose() - }) - it('cancelling a running child settles the run as aborted (the abort bridge + cancel())', async () => { // 'hang' makes the child's model stream one chunk then wait until aborted. const controller = new AbortController()