فهرست منبع

test(agent-loop): align consumers with direct wakeup

_Kerman 2 ماه پیش
والد
کامیت
c357f94ddc

+ 4 - 7
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' } }))
       }
     })
 

+ 2 - 2
packages/goal/goal-session/tests/goal-session.spec.ts

@@ -101,14 +101,14 @@ async function harness(script: ScriptEntry[]): Promise<Harness> {
   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)
   })
 }
 

+ 0 - 16
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()