Adds visibility into how much of the model context window the chat agent
is using and a way to free space when it fills up.
Backend
- New ContextUsage{used_chars, budget_chars} returned from chat_send
alongside messages (return type ChatTurnResult). Computed by running
build_history once at end of turn and counting char bytes — same data
path as the actual LLM call, so the count is exact for the chosen
budget unit.
- CONTEXT_BUDGET_CHARS = 24,000 (~6-8K tokens). Tuned for Ollama
defaults; can be exposed via AiSettings later.
- New chat_compact Tauri command. Splits the thread at the last user
turn, LLM-summarises everything before it (3-6 bullet points,
language-aware, < 800 chars), and returns a thread of
[Assistant("📋 Compacted N messages: …"), <last_user_turn?>]. The
recent user turn is preserved untouched so the agent can keep
answering it.
- render_thread_for_summary skips QueryResult.rows entirely so a single
large run_query can't blow the summariser's context.
- 3 new unit tests (last_user_turn_index, render skipping rows, empty
thread no-op).
Frontend
- ChatPanel header gets a usage badge: progress bar + `Xk / Yk tok ·
P%`, color-coded green (<30%) / muted (<60%) / amber (<85%) / red
(≥85%). Tooltip explains and nudges /compact when ≥60%.
- Compact button next to Clear in the header.
- Slash commands in ChatComposer: /compact, /clear.
- Empty-state shows the slash-command hint.
- Auto-compact: if the previous turn pushed usage past 85% AND the
thread has more than one message, the next user turn first runs
chat_compact transparently before chat_send. The compaction surfaces
as a visible Assistant("📋 Compacted …") message so the user can see
what the agent kept.
- app-store gets chatUsage map per tab + replaceChatThread + setChatUsage
actions; closeTab and clearChatThread clean up usage too.
Verification: cargo check clean, cargo test --lib 53 pass (+3),
tsc --noEmit clean, vitest run 20 pass.
Removes enterprise/DBA features and replaces the marginal AI bar with a
central chat agent that has progressive-discovery tools, cross-session
memory, saved-query reuse, and inline result actions. Adds ClickHouse
support alongside PostgreSQL/Greenplum.
Cleanup
- Drop ~10k LOC of advanced features: Docker, Snapshots, Validation,
Index Advisor, Role/User Management, Data Generator, ERD, Lookup.
- Trim deps: drop @xyflow/react, dagre, @types/dagre; cut tokio features
to rt-multi-thread/sync/time/net/macros.
- Remove unused TuskError variants and dead helpers (topological_sort,
invalidate_schema_cache).
Multi-DB (PostgreSQL + ClickHouse)
- New src-tauri/src/db/ module: ChClient (HTTP-based, reuses reqwest),
sql_guard (cross-flavor read-only whitelist with 8 tests).
- ConnectionConfig gains db_flavor and secure fields with serde defaults
for backwards-compatible connections.json.
- All connection/query/schema/data commands dispatch by flavor; CH
covers connect, execute_query, list_databases/schemas/tables/views/
columns/completion_schema, paginated table fetch.
- Frontend: dbCapabilities matrix, ConnectionDialog engine selector
with port auto-swap and HTTPS toggle, SqlEditor switches to
StandardSQL dialect for CH, TableDataView surfaces CH connections as
read-only.
AI-first chat agent
- New src/components/chat/ panel with composer, message rendering,
collapsible tool-call/result blocks, top-level ErrorBoundary.
- Backend agent loop in commands/chat.rs with strict-JSON tool
protocol. Nine tools: list_databases, list_tables, get_columns,
switch_database, run_query, remember, save_query, find_queries, final.
Forgiving parser accepts both flat and nested-input shapes.
- Compressed history: only the last 4 run_query results carry sample
rows (≤10, cells truncated to 200 chars) into LLM context; older
results marked omitted.
- System prompt uses lite OVERVIEW (DB list + active-DB tables only)
instead of full DDL — schema details are loaded on demand via
get_columns. CH OVERVIEW shows cross-DB tables since CH allows
db.table queries.
Cross-session memory (F1)
- Per-connection markdown file at app_data_dir/memory/<connection_id>.md,
16KB cap with oldest-block eviction. Agent appends via remember()
tool; the file is injected into LEARNED NOTES section of every system
prompt.
- New Memory sidebar tab with editable textarea, badge for note count,
empty-state with template. Edits picked up on the next agent turn.
Saved-query reuse (F2)
- Tools save_query and find_queries scoped to current connection.
save_query attaches a UUID + timestamp; find_queries returns top 10
matches with SQL preview ≤500 chars.
- Storage shared with the sidebar Saved panel.
Inline result actions (F3)
- run_query result block in chat gets Open-full (90vw × 80vh modal with
full ResultsTable, no row cap) and Export (reuses ExportDialog for
CSV/JSON via existing exportCsv/exportJson commands).
Verification
- cargo check clean, zero warnings.
- cargo test --lib: 50 pass (20 chat parser + 4 memory + 8 sql_guard +
6 clean_sql + 12 escape_ident).
- npx tsc --noEmit clean.
- npx vitest run: 20 pass.