fix(tui): make resume picker full-screen

This commit is contained in:
ZiyaZhang
2026-07-23 22:40:17 -07:00
parent d3b00bbdff
commit 33ee34b58e
9 changed files with 156 additions and 146 deletions

View File

@@ -1,69 +1,51 @@
terminal 92x32 buffer=normal length=32 base=0 viewport=0
lifecycle started=1 stopped=0 progress=inactive
title "DSH snapshot"
cursor hidden column=0 viewportRow=31 bufferRow=31
cursor hidden column=6 viewportRow=4 bufferRow=4
buffer
0| " DEEPSEEK HARNESS"
style 1-8 fg=bright-blue bold
style 10-16 bold
1| " Snapshot agent ready."
style 1-21 fg=bright-black
2| " deepseek-v4-flash • main-session"
style 1-34 dim
3| "────────────────────────────────────────────────────────────────────────────────────────────"
style 0-91 dim
4| " "
style 1-1 inverse
5| "────────────────────────────────────────────────────────────────────────────────────────────"
style 0-91 dim
6| "deepseek-v4-flash /workspace/project ↑0 ↓0 0% context tools:collapsed"
style 0-43 dim
style 65-91 dim
7-8| <blank>
9| " ╭ Resume session ──────────────────────────────────────────────────────────────────────╮ "
style 2-89 fg=bright-blue
10| " │ Search: title or session id │ "
style 2-2 fg=bright-blue
style 4-10 fg=bright-black
style 12-30 dim
style 89-89 fg=bright-blue
11| " │ │ "
style 2-2 fg=bright-blue
style 89-89 fg=bright-blue
12| " │ › Untitled session │ "
style 2-2 fg=bright-blue
style 4-21 fg=bright-blue bold
style 89-89 fg=bright-blue
13| " │ 2026-07-23T08:00:00.000Z · no completed turn · route unavailable │ "
style 2-2 fg=bright-blue
style 4-69 fg=bright-black
style 89-89 fg=bright-blue
14| " │ current · live · main-session │ "
style 2-2 fg=bright-blue
style 4-34 dim
style 89-89 fg=bright-blue
15| " │ unavailable: current session │ "
style 2-2 fg=bright-blue
style 4-33 fg=yellow
style 89-89 fg=bright-blue
16| " │ Resume selector design │ "
style 2-2 fg=bright-blue
style 89-89 fg=bright-blue
17| " │ 2024-01-01T00:00:08.000Z · turn 1: completed · deepseek/deepseek-v4-pro │ "
style 2-2 fg=bright-blue
style 4-76 fg=bright-black
style 89-89 fg=bright-blue
18| " │ persisted · earlier-session │ "
style 2-2 fg=bright-blue
style 4-32 dim
style 89-89 fg=bright-blue
19| " │ │ "
style 2-2 fg=bright-blue
style 89-89 fg=bright-blue
20| " │ Type to search • ↑/↓ navigate • Enter resume • Esc cancel │ "
style 2-2 fg=bright-blue
style 4-60 dim
style 89-89 fg=bright-blue
21| " ╰──────────────────────────────────────────────────────────────────────────────────────╯ "
style 2-89 fg=bright-blue
22-31| <blank>
0| " "
1| " Resume session (1 of 2) "
style 2-24 fg=bright-blue bold
2| " "
3| " ╭──────────────────────────────────────────────────────────────────────────────────────╮ "
style 2-89 dim
4| " │ ⌕ │ "
style 2-2 dim
style 6-6 inverse
style 89-89 dim
5| " ╰──────────────────────────────────────────────────────────────────────────────────────╯ "
style 2-89 dim
6| " "
7| " /workspace/project "
style 2-19 fg=bright-black
8| " "
9| " ❯ Untitled session "
style 2-19 fg=bright-blue bold
10| " 2026-07-23T08:00:00.000Z · no completed turn · route unavailable "
style 2-67 fg=bright-black
11| " current · live · main-session "
style 2-32 dim
12| " unavailable: current session "
style 2-31 fg=yellow
13| " Resume selector design "
14| " 2024-01-01T00:00:08.000Z · turn 1: completed · deepseek/deepseek-v4-pro "
style 2-74 fg=bright-black
15| " persisted · earlier-session "
style 2-30 dim
16| " "
17| " "
18| " "
19| " "
20| " "
21| " "
22| " "
23| " "
24| " "
25| " "
26| " "
27| " "
28| " "
29| " "
30| " Type to search • ↑/↓ navigate • Enter resume • Esc clear/cancel "
style 2-70 dim
31| " "

View File

@@ -159,8 +159,6 @@ describe('TUI config', () => {
questionDialogMaxHeight: 20,
modelDialogWidth: 72,
modelDialogMaxHeight: 20,
resumeDialogWidth: 88,
resumeDialogMaxHeight: 24,
fileSearchMaxResults: 20,
fileSearchMaxEntries: 10_000,
fileSearchExcludedDirectories: ['.git', 'node_modules'],
@@ -179,8 +177,6 @@ describe('TUI config', () => {
questionDialogMaxHeight: 14,
modelDialogWidth: 64,
modelDialogMaxHeight: 16,
resumeDialogWidth: 84,
resumeDialogMaxHeight: 22,
fileSearchMaxResults: 7,
fileSearchMaxEntries: 123,
fileSearchExcludedDirectories: ['.git', 'generated'],
@@ -198,8 +194,6 @@ describe('TUI config', () => {
questionDialogMaxHeight: 14,
modelDialogWidth: 64,
modelDialogMaxHeight: 16,
resumeDialogWidth: 84,
resumeDialogMaxHeight: 22,
fileSearchMaxResults: 7,
fileSearchMaxEntries: 123,
fileSearchExcludedDirectories: ['.git', 'generated'],
@@ -269,7 +263,7 @@ describe('resume command and /resume', () => {
await dispose(result)
})
it('opens a newest-active-first searchable selector and Esc cancels without side effects', async () => {
it('opens a newest-active-first searchable selector and Esc clears before cancelling', async () => {
const older = header('older-session', 500, '/workspace')
const newer = header('newer-session', 2000, '/workspace')
const handoff = vi.fn<NonNullable<TuiRuntime['handoffResume']>>()
@@ -296,7 +290,11 @@ describe('resume command and /resume', () => {
expect(output).not.toContain('foreign-session')
result.terminal.send('Older')
await tick()
expect(result.terminal.output).toContain('Search: Older')
expect(result.terminal.output).toContain('⌕ Older')
result.terminal.send('\x1b')
await tick()
expect(result.terminal.output.slice(result.terminal.output.lastIndexOf('Resume session')))
.not.toContain('⌕ Older')
result.terminal.send('\x1b')
await tick()
expect(handoff).not.toHaveBeenCalled()
@@ -325,7 +323,9 @@ describe('resume command and /resume', () => {
result.terminal.send('\x7f')
result.terminal.send('\x7f')
await tick()
expect(result.terminal.output).toContain('Search: title or session id')
const cleared = result.terminal.output.slice(result.terminal.output.lastIndexOf('Resume session'))
expect(cleared).toContain('⌕ ')
expect(cleared).not.toContain('zz')
result.terminal.send('\r')
await tick()
expect(result.terminal.output).toContain('current session')
@@ -349,7 +349,7 @@ describe('resume command and /resume', () => {
result.terminal.send('/resume')
result.terminal.send('\r')
await tick(); await tick()
expect(result.terminal.output).toContain('1/3')
expect(result.terminal.output).toContain('(1 of 3)')
await dispose(result)
})