fix(agent-loop): route next-step input during admission

This commit is contained in:
_Kerman
2026-07-27 17:55:55 +08:00
parent 52174e32cb
commit a59ce0367c
18 changed files with 207 additions and 85 deletions

View File

@@ -2907,10 +2907,8 @@ export function createTuiChat(
agent.followup({ content, source: { kind: 'user' } })
return
}
// Idle: the snapshot rides the prompt's own admission transaction
// (PromptDecision.additionalContexts), so a blocking hook discards the
// prompt and its attached context together instead of stranding the
// snapshot in history for the next unrelated prompt.
// Idle: the snapshot rides the prompt's admission transaction so a
// blocking hook discards both together.
let cleanedUp = false
const cleanup = (): void => {
// Each trigger detaches both listeners, so a second call needs a

View File

@@ -1384,7 +1384,7 @@ describe('pi-tui chat lifecycle and transcript', () => {
// A steering queue for a different agent never touches this status line.
const other = { ...result.agent, id: SessionId('other') } as unknown as Agent
result.terminal.output = ''
result.ctx.emit('agent/inbox/enqueue', other, { id: AgentMessageId('stub'), content: [{ type: 'text', text: 'elsewhere' }], source: { kind: 'user' } })
result.ctx.emit('agent/inbox/enqueue', other, { id: AgentMessageId('stub'), content: [{ type: 'text', text: 'elsewhere' }], source: { kind: 'user' } }, 'queued')
await tick()
expect(result.terminal.output).not.toContain('queued')
@@ -1474,7 +1474,7 @@ describe('pi-tui chat lifecycle and transcript', () => {
// A live event before the turn runs has no status controller to move.
const idle = await setup()
// Inbox notifications do not affect the status phase while idle.
idle.ctx.emit('agent/inbox/enqueue', idle.agent, { id: AgentMessageId('stub'), content: [{ type: 'text', text: 'early' }], source: { kind: 'user' } })
idle.ctx.emit('agent/inbox/enqueue', idle.agent, { id: AgentMessageId('stub'), content: [{ type: 'text', text: 'early' }], source: { kind: 'user' } }, 'queued')
idle.session.append('tool/call', { turn: 1, step: 0, callId: 'pre' as never, name: 'bash', arguments: '{}' })
await tick()
expect(idle.terminal.output).not.toContain('Executing tools')