feat(tui): add /status session diagnostics
This commit is contained in:
@@ -845,6 +845,92 @@ describe('pi-tui chat lifecycle and transcript', () => {
|
||||
await dispose(result)
|
||||
})
|
||||
|
||||
it('shows detailed session diagnostics while the agent is running', async () => {
|
||||
const timestamp = Date.parse('2026-07-22T09:10:11.000Z')
|
||||
const dateNow = vi.spyOn(Date, 'now').mockReturnValue(timestamp)
|
||||
const result = await setup({
|
||||
cwd: '/workspace/status',
|
||||
contextWindow: 128_000,
|
||||
contextTokens: 42_000,
|
||||
config: { showReasoning: false },
|
||||
agentOptions: { provider: 'deepseek', model: 'deepseek-v4-pro' },
|
||||
beforeMount(session) {
|
||||
session.append('session/title', {
|
||||
title: 'Inspect status \u001B]2;unsafe\u0007',
|
||||
messageSeqs: [1],
|
||||
source: { kind: 'fallback' },
|
||||
})
|
||||
appendAssistant(session, [{ type: 'text', text: 'measured' }], {
|
||||
inputTokens: 1_250,
|
||||
outputTokens: 340,
|
||||
cacheReadTokens: 3_000,
|
||||
cacheWriteTokens: 250,
|
||||
})
|
||||
session.append('tool/call', {
|
||||
turn: 1, step: 1, callId: 'status-call-1' as never, name: 'read', arguments: '{}',
|
||||
})
|
||||
session.append('tool/call', {
|
||||
turn: 1, step: 1, callId: 'status-call-2' as never, name: 'write', arguments: '{}',
|
||||
})
|
||||
},
|
||||
})
|
||||
result.agent.status = 'running'
|
||||
agentEvents(result.ctx, result.agent).emit('agent/status', 'running')
|
||||
result.terminal.send('/status')
|
||||
result.terminal.send('\r')
|
||||
await tick()
|
||||
|
||||
expect(result.terminal.output).toContain('Session diagnostics')
|
||||
expect(result.terminal.output).toContain('Session main-session')
|
||||
expect(result.terminal.output).toContain('Title Inspect status \\x1b]2;unsafe\\x07')
|
||||
expect(result.terminal.output).toContain('Working dir /workspace/status')
|
||||
expect(result.terminal.output).toContain('Model deepseek/deepseek-v4-pro')
|
||||
expect(result.terminal.output).toContain('Reasoning view hidden')
|
||||
expect(result.terminal.output).toContain('Agent running')
|
||||
expect(result.terminal.output).toContain('Activity events 6 · turns 1 · steps 1 · tool calls 2')
|
||||
expect(result.terminal.output).toContain('Tokens input 1,250 · output 340')
|
||||
expect(result.terminal.output).toContain('Cache tokens read 3,000 · write 250')
|
||||
expect(result.terminal.output).toContain('KV cache hit 67%')
|
||||
expect(result.terminal.output).toContain('Context 42,000 / 128,000 (33%)')
|
||||
expect(result.terminal.output).toContain('Created 2026-07-22T09:10:11.000Z')
|
||||
expect(result.terminal.output).toContain('Last active 2026-07-22T09:10:11.000Z')
|
||||
expect(result.terminal.output).not.toContain('\u001B]2;unsafe\u0007')
|
||||
|
||||
await dispose(result)
|
||||
dateNow.mockRestore()
|
||||
})
|
||||
|
||||
it('labels unavailable status diagnostics without inventing values', async () => {
|
||||
const timestamp = Date.parse('2026-07-22T10:11:12.000Z')
|
||||
const dateNow = vi.spyOn(Date, 'now').mockReturnValue(timestamp)
|
||||
const result = await setup({
|
||||
cwd: null,
|
||||
omitInitialLifecycle: true,
|
||||
contextTokens: 7,
|
||||
agentOptions: {},
|
||||
catalog: {
|
||||
providers: [],
|
||||
models: [],
|
||||
resolveModelContext: () => Promise.resolve(undefined),
|
||||
},
|
||||
})
|
||||
result.terminal.send('/status')
|
||||
result.terminal.send('\r')
|
||||
await tick()
|
||||
|
||||
expect(result.terminal.output).toContain('Title untitled')
|
||||
expect(result.terminal.output).toContain('Model unset')
|
||||
expect(result.terminal.output).toContain('Reasoning view shown')
|
||||
expect(result.terminal.output).toContain('Agent idle')
|
||||
expect(result.terminal.output).toContain('Activity events 0 · turns 0 · steps 0 · tool calls 0')
|
||||
expect(result.terminal.output).toContain('KV cache hit n/a')
|
||||
expect(result.terminal.output).toContain('Context 7 used · capacity unknown')
|
||||
expect(result.terminal.output).toContain('Created 2026-07-22T10:11:12.000Z')
|
||||
expect(result.terminal.output).toContain('Last active 2026-07-22T10:11:12.000Z')
|
||||
await dispose(result)
|
||||
dateNow.mockRestore()
|
||||
})
|
||||
|
||||
it('sends, steers, handles commands, global keys, and disposed-agent input', async () => {
|
||||
const result = await setup()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user