mecha-cli 0.1.15

The mecha CLI: an agent harness for local models.
[package]
name = "mecha-cli"
description = "The mecha CLI: an agent harness for local models."
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
repository.workspace = true

[[bin]]
name = "mecha"
path = "src/main.rs"

[dependencies]
mecha-core = { path = "../mecha-core", version = "0.1.1" }
mecha-slack = { path = "../mecha-slack", version = "0.1.1" }

anyhow.workspace = true
async-trait.workspace = true
chrono.workspace = true
# One flock, for the connector lock. See slack/connector.rs.
libc.workspace = true
chrono-tz.workspace = true
clap = { version = "4", features = ["derive", "env"] }
futures.workspace = true
httparse = "1"
rustyline = "18"
# What a character costs on screen. The input box wraps its own text, and a
# wrapper that counts characters puts the caret two cells left of the glyph the
# moment anything is not one cell wide.
unicode-width = "0.2"
serde.workspace = true
serde_json.workspace = true
tokio.workspace = true
tokio-util.workspace = true
toml.workspace = true
tracing.workspace = true
tracing-subscriber.workspace = true
# `unstable-rendered-line-info` gives Paragraph::line_count, which is how the
# transcript knows its own wrapped height and therefore how far it can scroll.
ratatui = { version = "0.30", features = ["unstable-rendered-line-info"] }
crossterm = { version = "0.29", features = ["event-stream"] }
# The tailnet web surface (`mecha serve`). Quarantined to this binary crate on
# the mecha-slack rule: mecha-core never learns HTTP exists. Serving static
# files goes through tower-http's ServeDir rather than anything hand-rolled,
# because path traversal is its test suite's job, not ours.
axum = "0.8"
tower-http = { version = "0.6", features = ["fs"] }
# One outbound hop: proxying the page's WebRTC offer to the loopback voice
# runner, so the browser talks same-origin and the offer sits behind the
# owner guard instead of a CORS-only endpoint. Same workspace version the
# other crates already carry.
reqwest.workspace = true

[dev-dependencies]
# `oneshot` on the serve router — auth is tested without binding a port.
tower = { version = "0.5", features = ["util"] }
# Only to write a real PNG for the drag-and-drop tests. Decoding belongs to
# mecha-core; nothing in the CLI needs it at runtime.
image.workspace = true