feat: display toggles, smart session resume, fix stale transcript pane
Three things. 1. Two new display preferences. "Show Tool Calls" and "Show Reasoning" control whether each answer lists the tools Lam called and the model's thinking trace. Both default on, so nothing changes on upgrade. 2. Fix: starting a new chat left the previous conversation in the right pane. The pane rendered the highlighted row's transcript, and Vicinae exposes no way to set the selected row, so the selection could stay put when cmd+N prepended a new chat. The pane now derives from the active session rather than the row, so it follows the chat the user is actually in whatever the selection happens to be. A side benefit is that mount now reads only session summaries, not every transcript. 3. "Start New Chat After" (default 1 hour) starts a fresh chat when the command opens and the last conversation is older than the window. "Never" restores the old always-reopen behaviour, for people who want to stay in their last chat. Old conversations are never deleted; they just sort into their recency section. The setup screen lists all three so the current values are visible without opening preferences. Verified: setup renders "Show Tool Calls: Shown", "Show Reasoning: Shown", "Start New Chat After: After 1 hour" with 17 models reachable. typecheck, eslint, 127 tests and vici build all pass.
This commit is contained in:
@@ -13,7 +13,7 @@ Hit a global shortcut, type a question, get a streamed answer — without leavin
|
||||
|
||||
- **Global hotkey, instant input.** Bind a shortcut to the chat command and the search bar is focused before you finish the keystroke.
|
||||
- **Streaming answers.** Tokens render as they arrive, in a markdown side panel.
|
||||
- **Persistent conversations.** Every chat is saved locally and can be reopened later.
|
||||
- **Persistent conversations.** Every chat is saved locally. The sidebar lists them by recency, and reopening the command picks up where you left off — unless it has been idle longer than you allow.
|
||||
- **Tools.** Lam decides when to call them — current time, location context, web search, and page fetching.
|
||||
- **Chat only.** Lam answers questions. It does not touch your files or run commands.
|
||||
|
||||
@@ -100,6 +100,9 @@ vicinae 'vicinae://launch/lam-agent/chat?fallbackText=summarise%20this'
|
||||
| **System Prompt** | Lam's default | Replaces the built-in prompt entirely. |
|
||||
| **Web Tools** | on | Enables `web_search` and `web_fetch`. |
|
||||
| **Reasoning Effort** | Off | `low`/`medium`/`high` for models that support thinking. |
|
||||
| **Show Tool Calls** | on | Lists the tools Lam called under each answer. |
|
||||
| **Show Reasoning** | on | Includes the model's thinking trace. Turn off to keep replies short. |
|
||||
| **Start New Chat After** | 1 hour | Idle time past which opening the command starts a fresh chat. `Never` always reopens the last one. The old chat is never deleted either way. |
|
||||
|
||||
## Tools
|
||||
|
||||
@@ -141,7 +144,11 @@ A few decisions worth knowing about before you change things:
|
||||
|
||||
**The search bar is the composer.** It is the only always-focused text input in a `List`, which is what makes "hotkey, then just type" work. It is single-line and there is no API to change that. A multi-line `Form.TextArea` composer was built and then removed: Vicinae always renders it inside `FormField`, which reserves two ninths of the width for a label gutter and two ninths as an empty right spacer, so it shows up as a small box floating in a large empty form. `filtering` is off, because the left column is a conversation switcher — the builtin fuzzy filter would hide rows as you type a question.
|
||||
|
||||
**The two panes show different things on purpose.** Left is the list of conversations; right is the transcript of one. Both are required rather than a layout preference: `Detail` accepts no typed input (`onSearchTextChange` exists only on `List`, `Grid`, `Form` and `Dropdown`), and list rows are a fixed single line, so full message text cannot render in the list. Input needs a `List`; full text needs a `Detail`.
|
||||
**The two panes show different things on purpose.** Left is the list of conversations; right is the transcript of the open one. Both are required rather than a layout preference: `Detail` accepts no typed input (`onSearchTextChange` exists only on `List`, `Grid`, `Form` and `Dropdown`), and list rows are a fixed single line, so full message text cannot render in the list. Input needs a `List`; full text needs a `Detail`.
|
||||
|
||||
**Every sidebar row carries the same detail, and that is deliberate.** The right pane shows the *open* conversation, not the highlighted one. Vicinae exposes no way to set the selected row, so when ⌘N starts a new chat the selection can stay where it was and the pane would keep rendering the previous conversation — which is exactly the bug this replaced. Deriving the detail from the active session rather than the row makes the pane follow the chat the user is actually in, whatever the selection happens to be. It also means only summaries are read on mount, not every transcript. Switching conversations is explicit: Return on an empty search bar, or the action panel.
|
||||
|
||||
**Reopening may deliberately start a fresh chat.** `resumeTimeout` is checked against the newest conversation's `updatedAt` before resuming. Past that window the command opens a new chat instead; the old one is untouched and sorted into its recency section in the sidebar.
|
||||
|
||||
**Return adapts to the search bar.** With text in it, `↩` sends. Empty — where sending would be a no-op anyway — `↩` opens the highlighted conversation. Every row carries that conversation's transcript as its detail, so moving the selection previews it.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user