Symbol extraction (symbols.rs):
- tree-sitter parsers for Rust, TypeScript, Python
- Extracts: functions, structs, enums, traits, classes, interfaces
- Signatures, docstrings, line ranges for each symbol
- extract_project_symbols() walks project directory
- Skips hidden/vendor/target/node_modules, files >100KB
Proto: IndexSymbols + SymbolEntry messages for client→server symbol relay
Client: after SessionReady, extracts symbols and sends IndexSymbols
to Sol for indexing into the code search index.
14 unit tests for symbol extraction across Rust/TS/Python.
- Agent service (crossbeam channels): TUI never blocks on gRPC I/O.
Chat runs on a background tokio task, events flow back via bounded
crossbeam channel. Designed as a library-friendly internal RPC.
- Virtual viewport: pre-wrap text with textwrap on content/width change,
slice only visible rows for rendering. Paragraph gets no Wrap, no
scroll() — pure O(viewport) per frame.
- Event drain loop: coalesce all queued terminal events before drawing.
Filters MouseEventKind::Moved (crossterm's EnableMouseCapture floods
these via ?1003h any-event tracking). Single redraw per batch.
- Conditional drawing: skip frames when nothing changed (needs_redraw).
- Mouse wheel + PageUp/Down + Home/End scrolling, command history
(Up/Down, persistent to .sunbeam/history), Alt+L debug log overlay.
- Proto: SessionReady now includes history entries + resumed flag.
Session resume loads conversation from Matrix room on reconnect.
- Default model: devstral-small-latest (was devstral-small-2506).
shared protobuf definitions for the sunbeam code agent:
- CodeAgent service with bidirectional Session streaming
- ClientMessage: StartSession, UserInput, ToolResult, ToolApproval
- ServerMessage: TextDelta, ToolCall, ApprovalNeeded, Status
- ToolDef for client-side tool registration
this is the transport layer between `sunbeam code` (TUI client)
and Sol (server-side agent loop). next: JWT middleware for OIDC
auth, Sol gRPC server stub, CLI subcommand stub.