[package]
name = "hex"
version = "3.3.0"
edition = "2024"
default-run = "hex"
license = "MIT"
repository = "https://github.com/anomalyco/hex"

# Crates imported from Scrawl live under `crates/`. Plain `cargo build` and
# `cargo test` still select only Hex; pass `--workspace` or `-p` for the others.
# `crates/capture` and `crates/capture-core` are excluded so `--workspace`
# never builds them: they compile only as the macOS and Linux dependencies
# of the `capture` experiment, and `-p scrawl-capture` / `-p capture-core` test and lint
# them. The root package is a member without being listed; listing "." would
# defeat `exclude`.
[workspace]
members = ["crates/console", "crates/router"]
exclude = ["crates/capture", "crates/capture-core"]

[[test]]
name = "keyboard_layout"
harness = false

[build-dependencies]
cc = "1"

[target.'cfg(windows)'.build-dependencies]
embed-resource = "3"

[features]
onnx-benchmark = ["dep:transcribe-rs"]

# Shipped executables carry no symbol table (about 11 MB on Linux). Panic
# backtraces lose function names; debug builds keep them.
[profile.release]
strip = true

# transcribe.cpp 0.4.1 plus one ggml patch that builds only the Vulkan
# shaders Hex's models use (see `CMAKE_ARGS` in .cargo/config.toml),
# Parakeet's vocabulary rescoring (branch hex/parakeet-vocabulary), and a Metal
# residency heartbeat that sleeps once its keep-alive runs out (branch
# hex/metal-idle-residency). Drop this once a transcribe.cpp release carries
# them.
[patch.crates-io]
transcribe-cpp = { git = "https://github.com/anomalyco/transcribe.cpp", rev = "2778ae4bf5ca5f394d129a39467f4ad9552dc34f" }
transcribe-cpp-sys = { git = "https://github.com/anomalyco/transcribe.cpp", rev = "2778ae4bf5ca5f394d129a39467f4ad9552dc34f" }

[dependencies]
clap = { version = "4.6.7", features = ["derive"] }
color-eyre = "0.6.5"
cpal = "0.18.2"
ctrlc = "3.5.2"
dirs = "7.0.0"
fs2 = "0.4.3"
getrandom = "0.4.3"
hound = "3.5.1"
libc = "0.2.189"
oxc_allocator = "0.156.0"
oxc_ast = "0.156.0"
oxc_ast_visit = "0.156.0"
oxc_parser = "0.156.0"
oxc_span = "0.156.0"
regex = "1.13.1"
rquickjs = { version = "0.14.0", default-features = false, features = ["std", "loader"] }
rodio = { version = "0.23.0", default-features = false, features = ["playback", "mp3"] }
rubato = "5.0.1"
serde = { version = "1.0.229", features = ["derive"] }
serde_json = "1.0.151"
serde_path_to_error = "0.1"
sha2 = "0.11.0"
tracing = "0.1.44"
tracing-subscriber = { version = "0.3.23", features = ["env-filter"] }
transcribe-cpp = "=0.4.1"
transcribe-rs = { git = "https://github.com/cjpais/transcribe-rs", rev = "e37c66b6df43af51fde8dec34f98a07aaf09564c", features = ["onnx"], optional = true }
unicode-normalization = "0.1.25"
unicode-segmentation = "1.13.3"
url = "2.5.8"
# Hex's HTTPS (`net`): model downloads, update checks, and transformation
# scripts' `fetch`, over the platform's TLS and trusted roots.
# `native-tls`, not `native-tls-no-default`: ureq 3.4 checks the former's
# name and panics on any https request without it.
ureq = { version = "3.4.2", default-features = false, features = ["native-tls"] }

[target.'cfg(target_os = "macos")'.dependencies]
capture-core = { path = "crates/capture-core" }
arboard = { version = "3.6.1", default-features = false }
block2 = "0.6.2"
core-graphics-types = "0.1.3"
crossterm = "0.29.0"
objc2 = "0.6.4"
objc2-app-kit = "0.3.2"
objc2-core-audio = "0.3.2"
objc2-core-audio-types = "0.3.2"
objc2-core-foundation = "0.3.2"
objc2-foundation = "0.3.2"
objc2-quartz-core = { version = "0.3.2", features = ["CALayer"] }
objc2-service-management = { version = "0.3.2", features = ["SMAppService"] }
ratatui = "0.30.2"
screencapturekit = { version = "=11.0.0", features = ["macos_15_0"] }

[target.'cfg(target_os = "linux")'.dependencies]
ctrlc = { version = "3.5.2", features = ["termination"] }
ed25519-dalek = { version = "2.2.0", default-features = false, features = ["std"] }
futures-util = { version = "0.3.34", default-features = false, features = ["alloc"] }
tokio = { version = "1.54.1", features = ["rt", "rt-multi-thread", "time"] }
transcribe-cpp = { version = "=0.4.1", features = ["vulkan"] }
wayland-client = "0.31.15"
wayland-protocols = { version = "0.32.13", features = ["client", "staging"] }
wayland-protocols-wlr = { version = "0.3.12", features = ["client"] }
x11-clipboard = "0.9.3"
x11rb = { version = "0.14.0", features = ["xkb", "xtest"] }
zbus = { version = "6.1.0", default-features = false, features = ["tokio", "proxy"] }

# The desktop UI, and Annotate (Scrawl's capture engine), compiled into
# every desktop build (`capture.enabled`).
[target.'cfg(any(target_os = "linux", target_os = "macos", target_os = "windows"))'.dependencies]
# `hex mcp`.
rmcp = { version = "3.5.1", default-features = false, features = ["server", "macros", "transport-io"] }
tokio = { version = "1.53.1", features = ["rt", "io-std"] }
anyhow = "1.0.104"
# The capture capsule's motion-lint trace.
rune-motion = { git = "https://github.com/anomalyco/rune.git", rev = "a138b97e654b8299b2a4cb518b8476b2b528c2c4" }
scrawl-capture = { path = "crates/capture", default-features = false, features = ["screen", "helper"] }
pollster = "1.0.1"
# Screenshot PNGs and the screenshot editor's export.
png = "0.18"
# The local API's `/profile/vitals`; it reports nothing off macOS.
procwatch = { git = "https://github.com/anomalyco/rune.git", rev = "a138b97e654b8299b2a4cb518b8476b2b528c2c4" }
rune = { git = "https://github.com/anomalyco/rune.git", rev = "a138b97e654b8299b2a4cb518b8476b2b528c2c4", features = ["native-file-dialog", "macos-background-cursor"] }
rune-kit = { git = "https://github.com/anomalyco/rune.git", rev = "a138b97e654b8299b2a4cb518b8476b2b528c2c4" }
rune-theme-opencode = { git = "https://github.com/anomalyco/rune.git", rev = "a138b97e654b8299b2a4cb518b8476b2b528c2c4" }
# The welcome hero's own GPU pass (`rune_ui::hero`); Rune's version.
wgpu = { version = "30", default-features = false, features = ["std", "parking_lot", "metal", "wgsl"] }

[target.'cfg(target_os = "windows")'.dependencies]
arboard = { version = "3.6.1", default-features = false, features = ["image-data"] }
winreg = "0.55.0"
windows-sys = { version = "0.61.2", features = [
  "Win32_Foundation",
  "Win32_Globalization",
  "Win32_Graphics_Dwm",
  "Win32_Graphics_Gdi",
  "Win32_Networking_WinHttp",
  "Win32_Networking_WinSock",
  "Win32_Security",
  "Win32_Storage_FileSystem",
  "Win32_System_Console",
  "Win32_System_DataExchange",
  "Win32_System_JobObjects",
  "Win32_System_LibraryLoader",
  "Win32_System_Memory",
  "Win32_System_Power",
  "Win32_System_SystemInformation",
  "Win32_System_Threading",
  "Win32_UI_Input_KeyboardAndMouse",
  "Win32_UI_Shell",
  "Win32_UI_WindowsAndMessaging",
] }
windows = { version = "0.62.2", features = ["Media_Control", "Foundation", "Foundation_Collections", "Win32_Foundation", "Win32_Media_Audio", "Win32_Security", "Win32_System_Com", "Win32_System_Com_StructuredStorage", "Win32_System_Ole", "Win32_System_Threading", "Win32_System_Variant", "Win32_UI_Accessibility"] }
windows-core = "0.62.2"
windows-future = "0.3.2"

# x64 Windows decodes on the GPU through Vulkan. ARM64 Windows stays CPU-only,
# as Handy ships it: ggml's ARM CPU backend needs clang-cl, and Vulkan drivers
# on Windows-on-ARM are not a dependable target yet.
[target.'cfg(all(target_os = "windows", target_arch = "x86_64"))'.dependencies]
transcribe-cpp = { version = "=0.4.1", features = ["vulkan"] }

[workspace.lints.rust]
# shared-lints begin
unsafe_op_in_unsafe_fn = "deny"
unused_must_use = "deny"
# shared-lints end
# shared: forbid; 346 errors left (t1003). Allowed, not warn: scripts/check runs clippy with -D warnings.
unsafe_code = "allow"

[workspace.lints.clippy]
# shared-lints begin
await_holding_lock = "deny"
await_holding_refcell_ref = "deny"
dbg_macro = "deny"
disallowed_types = "deny"
todo = "warn"
# shared-lints end
# shared: deny; 85 errors left (t1003). Allowed, not warn: scripts/check runs clippy with -D warnings.
disallowed_methods = "allow"
# shared: deny; 437 errors left (t1003)
let_underscore_must_use = "allow"
# shared: deny; 144 errors left (t1003)
undocumented_unsafe_blocks = "allow"
# shared: warn; 59 errors left under -D warnings (t1003)
expect_used = "allow"
# shared: warn; 41 errors left under -D warnings (t1003)
unwrap_used = "allow"

[lints]
workspace = true