harness-app: - EngineHandle: non-blocking multi-turn API (prompt/abort/permission_reply/ list_sessions/session_messages/message_parts), persistent SQLite store, no auto-approve — TUI handles permission asks via real oneshot path - App refactored to wrap EngineHandle; headless run -p keeps auto-approve harness-tui: - Terminal guard (raw mode, alternate screen, panic hook, Drop restore) - Event loop: tokio::select! over crossterm events, bus events, 33ms render tick - AppState with MessageView/PartView (cached Vec<Line> field), ModalState - pulldown-cmark → ratatui markdown renderer (headings, bold, italic, code blocks, lists, blockquotes, links, manual word-wrap) - Layout: header, chat viewport, input (tui-textarea), status bar - Permission modal (y/a/n) wired to EngineHandle::permission_reply - Session picker (Ctrl+S) with resume - Abort (Esc), Ctrl+C×2 quit, slash commands (/new /model /agent /sessions) - 7 TestBackend snapshot tests (empty, messages, tool cards, modals)
33 lines
735 B
TOML
33 lines
735 B
TOML
[package]
|
|
name = "harness-tui"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
|
|
[[bin]]
|
|
name = "harness"
|
|
path = "src/main.rs"
|
|
|
|
[dependencies]
|
|
harness-app = { workspace = true }
|
|
harness-core = { workspace = true }
|
|
tokio = { workspace = true }
|
|
ratatui = { workspace = true }
|
|
crossterm = { workspace = true }
|
|
tui-textarea = { workspace = true }
|
|
pulldown-cmark = { workspace = true }
|
|
tracing = { workspace = true }
|
|
tracing-subscriber = { workspace = true }
|
|
tracing-appender = { workspace = true }
|
|
dirs = { workspace = true }
|
|
anyhow = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
futures = { workspace = true }
|
|
tokio-util = { workspace = true }
|
|
|
|
[dev-dependencies]
|
|
insta = "1"
|
|
|
|
[lints]
|
|
workspace = true
|