Skip to content

Architecture

sivtr is a Cargo workspace with two main layers:

  • sivtr, the binary crate in src/;
  • sivtr-core, the library crate in crates/sivtr-core/.

The binary owns user interaction: CLI parsing, command dispatch, TUI state, workspace pickers, and platform-specific launcher/hotkey behavior. The core crate owns reusable memory logic: capture, parsing, buffers, selection, search primitives, history, export, config, and agent-provider session parsing.

sivtr/
|- Cargo.toml
|- src/
| |- cli.rs
| |- main.rs
| |- app.rs
| |- commands/
| `- tui/
`- crates/
`- sivtr-core/
`- src/
|- ai.rs
|- buffer/
|- capture/
|- claude.rs
|- codex.rs
|- config/
|- export/
|- history/
|- opencode.rs
|- parse/
|- pi.rs
|- search/
|- selection/
`- session/
AreaResponsibility
cli.rsclap command definitions and help text
commands/handlers for run, pipe, copy, history, config, hotkey, diff, import, search, show, clear, and Codex export
commands/copy/command-block copy, provider copy, workspace picker integration, and Vim-style picker view
app.rscaptured-output browser state machine
tui/terminal setup, event handling, browser rendering, workspace rendering, and workspace search UI
command_blocks.rsparsed command-block spans for session browsing and copying

This layer can depend on terminal UI libraries, platform APIs, and process spawning behavior.

ModuleResponsibility
aiprovider-neutral session, block, metadata, and parser helpers
codex, claude, opencode, piprovider-specific session discovery and parsing
capturestdin, subprocess, and scrollback/session capture helpers
parseANSI stripping, Unicode display width, and line parsing
bufferline, cursor, and viewport models
selectionvisual, line, and block selection extraction
searchtext matching and navigation state
historySQLite storage, schema, and search
exportclipboard, file, and editor export helpers
configTOML config model, defaults, and path resolution
sessionstructured shell session entries and rendering

This split keeps computation and data handling testable independently from the terminal UI.

Pipe mode:

stdin -> capture::pipe -> parse::parse_lines -> Buffer -> App -> TUI/editor

Run mode:

subprocess -> combined output -> parse::parse_lines -> Buffer -> App -> TUI/editor

Session import:

session log -> render entries -> parse::parse_lines -> Buffer -> command block spans -> TUI/editor

Command-block copy:

session log -> SessionEntry list -> command blocks -> selector -> filters -> clipboard

Agent-provider copy:

provider transcript/db -> AgentSession -> AgentBlock list -> selector -> filters -> clipboard

Workspace picker/search:

terminal context + provider sessions -> WorkspaceSession list -> search/pick/show -> clipboard/stdout/json

Agent support is provider-neutral at the command and workspace layers. Provider modules are responsible for finding local records and converting provider-specific event formats into shared memory blocks:

AgentProvider -> AgentSessionProvider -> AgentSession -> AgentBlock

The shared workspace code can then copy, pick, search, and show memory without depending on one vendor transcript shape.

The frontend layer is presentation and interaction. The Rust core performs the durable memory work: parsing, capture, selection extraction, search, storage, provider parsing, and formatting. This keeps UI changes from leaking into provider parsers and keeps provider changes from rewriting the whole CLI surface.