ui: lead the launcher with the prompt and one configuration line - #131
Conversation
The prompt was buried under a who-line and three settings rows, so the first thing on screen was chrome rather than the thing you came to do. It now opens the block, with one summary line under it naming what the next run will use and carrying the way into changing it. The editor takes the session list's place, so the block's height never depends on which is up. Also drop every UI-rendering test: tests here are unit tests, so the launcher's summary logic moved into configSummary() and is tested there.
There was a problem hiding this comment.
Caution
Changes requested ❌ — 2 issues
Reviewed 2c32688 in 4 minutes, 50 seconds.
- Reviewed
1commit with534lines of code in11files - Ran
1review agent producing2comments where2were posted - This pipeline runs no gatekeeper, so findings are posted as written.
- View full details on ellipsis.dev
This review was created by . You can tag
@ellipsis in this pull request.
| const pickedModelLabel = modelOptions[modelIdx]?.label ?? null | ||
| const summary = configSummary({ | ||
| model: pickedModelLabel === 'Default' ? null : pickedModelLabel, | ||
| repos: repoSel === null ? null : [...repoSel], |
There was a problem hiding this comment.
The summary line names the account-default model even when the selected Agent config declares its own claude.model, so it reports a model the run will not use; the config's model should win whenever the Model row is untouched (modelPick === null).
With GET /models returning a model flagged is_default_agent_model, composerModelOptions gives that row the null id but its raw id as the label, so an untouched Model row makes pickedModelLabel a real id (e.g. claude-opus-5), never the string Default. configSummary therefore takes input.model and never reaches its agentConfig.claude.model fallback. Pick an Agent config whose YAML sets claude: {model: claude-haiku-4-5-20251001}, leave the Model row alone: submit() sends no model override (modelOptions[modelIdx].id is null), the server resolves haiku from the config, and the launcher line says claude-opus-5. Note the repos bit gets this precedence right — untouched means null, and the config's environment.repositories answers. Fix needs both ends: pass model: modelPick === null ? null : pickedModelLabel and give configSummary a defaultModel argument it falls back to after the config's own model, so the untouched-row-with-no-config case still names the account default.
| setCursor({ kind: 'prompt' }) | ||
| return | ||
| } | ||
| if (ch && !key.ctrl && !key.meta) toPromptWith(ch) |
There was a problem hiding this comment.
Typing while the editor is open moves the cursor to the prompt but leaves editing true, so the session list stays hidden and the esc: back to your sessions hint below it does nothing — setEditing(false) belongs in toPromptWith.
Press ↓, enter (editor opens), then type any character: toPromptWith sets the cursor to prompt while editing stays true, so showList is false and the status line still reads esc: back to your sessions (line 926). At the prompt, esc hits if (key.escape || key.ctrl || key.meta || key.tab) return and is a no-op, so the list only comes back by pressing ↓ and then esc.
Important
Restructures the launcher's layout: the prompt now leads, followed by a one-line configuration summary, then the session list, with the "connected to" line moved to the bottom.
compactTokens()deleted,rowMeta()now shows only cost and age, never token counts.test/screenshot.test.ts,test/connect-render.test.ts,test/scrollback.test.tsand their snapshots deleted;@xterm/headlessdependency removed. AddedCLAUDE.mddocumenting that tests must cover pure functions only, not UI rendering.configSummary()function reads the saved config's Dockerfile and variables (which the pickers can't reach directly) and the current model/repo picks to produce a one-line summary.This description was created by
for 2c32688. It will automatically update as commits are pushed.