fix(tui): populate session list from disk on startup
run_tui() now calls discover_sessions() before entering the event loop, converts each SessionRef to SessionListItem (sorted most-recent-first), and assigns to state.sessions. Failures silently yield an empty list. Fixes claudbg-zi1d Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>main
parent
3dd463b3ae
commit
7f864192e8
@ -0,0 +1,41 @@
|
||||
---
|
||||
# claudbg-zi1d
|
||||
title: TUI session list shows no sessions — state.sessions never populated on startup
|
||||
status: in-progress
|
||||
type: bug
|
||||
priority: high
|
||||
created_at: 2026-03-30T17:05:02Z
|
||||
updated_at: 2026-03-30T17:05:05Z
|
||||
parent: claudbg-i6l2
|
||||
---
|
||||
|
||||
## Problem
|
||||
|
||||
The TUI session list is always empty. `run_tui()` in `src/tui/run.rs` creates `AppState::new()` (which has `sessions: Vec::new()`) and enters the event loop without ever loading sessions from disk.
|
||||
|
||||
## Root cause
|
||||
|
||||
`discover_sessions()` in `src/parser/discovery.rs` is never called from the TUI startup path. The session list screen renders from `state.sessions` which stays empty forever.
|
||||
|
||||
## Fix
|
||||
|
||||
Before entering the event loop in `run_tui()`, call `discover_sessions()` and convert each `SessionRef` into a `SessionListItem`, then populate `state.sessions`.
|
||||
|
||||
### SessionRef → SessionListItem mapping
|
||||
- `short_id` = first 8 chars of `session_id`
|
||||
- `full_id` = `session_id`
|
||||
- `date` = `modified_at.format("%Y-%m-%d %H:%M:%S")`
|
||||
- `project` = `project_path.unwrap_or_default()`
|
||||
- `model` = `""` (leave empty — would require parsing JSONL)
|
||||
- `msg_count` = 0 (leave as 0 for now)
|
||||
- `agent_count` = call `discover_agents_for_session(&session_ref.file_path).map(|v| v.len()).unwrap_or(0)`
|
||||
|
||||
Sort by `modified_at` descending (most recent first).
|
||||
|
||||
### Error handling
|
||||
If `discover_sessions()` fails, start with an empty list (don't crash). Log the error to stderr before entering the alternate screen, or silently ignore.
|
||||
|
||||
## Relevant files
|
||||
- `src/tui/run.rs` — `run_tui()` function, add session loading before the event loop
|
||||
- `src/parser/discovery.rs` — `discover_sessions()` and `discover_agents_for_session()`
|
||||
- `src/tui/state.rs` — `SessionListItem` struct
|
||||
@ -0,0 +1,27 @@
|
||||
# Filter Queries
|
||||
|
||||
We want basic filtering to be able to narrow our view.
|
||||
Use cases include only showing sesisons...
|
||||
* with sub-agents
|
||||
* with a certain minimum/maximum of messages
|
||||
* in a given project
|
||||
* with a given model
|
||||
* between a given date range
|
||||
|
||||
Proposed query language is a simple `key:value` for static single values, with support for globbing and by default fuzzy searching.
|
||||
Examples:
|
||||
* `model:haiku` equivalent to `model:*haiku*`
|
||||
* `project:my-org/my-project` ~= `project:*my-org/my-project`
|
||||
* `project:*` project is non-empty
|
||||
|
||||
Also required is support for `>` and `<` to support ranges
|
||||
Examples:
|
||||
* `agents>0`
|
||||
* `messages<10`
|
||||
* `date>2026-03-20`
|
||||
|
||||
We also need to support `AND` and `OR` for logical combinations
|
||||
Examples:
|
||||
* `date>2026-03-15 AND date<2026-03-20` sessions between 03-15 and 03-20.
|
||||
|
||||
When a query uses a malformed syntax or a key which is not found, the command should fail to evaluate with an error displayed to the user.
|
||||
Loading…
Reference in New Issue