| 1 | [package] |
| 2 | name = "codewhale-tui" |
| 3 | version.workspace = true |
| 4 | edition.workspace = true |
| 5 | rust-version.workspace = true |
| 6 | license.workspace = true |
| 7 | repository.workspace = true |
| 8 | description = "Terminal UI for open-source and open-weight coding models" |
| 9 | default-run = "codewhale-tui" |
| 10 | |
| 11 | [lints] |
| 12 | workspace = true |
| 13 | |
| 14 | [features] |
| 15 | default = ["mimalloc-allocator"] |
| 16 | mimalloc-allocator = ["dep:mimalloc"] |
| 17 | long-running-tests = [] |
| 18 | # Opt-in global-allocator swap (#5872): build on rusty_alloc (the pure-Rust |
| 19 | # mimalloc v2.4.5 remake — no C compiler, no build script) instead of the |
| 20 | # default mimalloc. Off by default; the default build is unchanged. |
| 21 | # Build with: cargo build -p codewhale-tui --no-default-features --features rusty-alloc |
| 22 | rusty-alloc = ["dep:rusty_alloc-api"] |
| 23 | |
| 24 | [lib] |
| 25 | name = "codewhale_tui" |
| 26 | path = "src/lib.rs" |
| 27 | |
| 28 | [[bin]] |
| 29 | name = "codewhale-tui" |
| 30 | path = "src/main.rs" |
| 31 | |
| 32 | [dependencies] |
| 33 | codewhale-memory = { path = "../memory", version = "0.10.0" } |
| 34 | ahash = "0.8" |
| 35 | anyhow.workspace = true |
| 36 | codewhale-config = { path = "../config", version = "0.10.0" } |
| 37 | codewhale-cloud-facts = { path = "../cloud-facts", version = "0.10.0" } |
| 38 | codewhale-command-contract = { path = "../command-contract", version = "0.10.0" } |
| 39 | codewhale-core = { path = "../core", version = "0.10.0" } |
| 40 | codewhale-execpolicy = { path = "../execpolicy", version = "0.10.0" } |
| 41 | codewhale-hooks = { path = "../hooks", version = "0.10.0" } |
| 42 | codewhale-lane = { path = "../lane", version = "0.10.0" } |
| 43 | codewhale-models = { path = "../models", version = "0.10.0" } |
| 44 | codewhale-palette = { path = "../palette", version = "0.10.0" } |
| 45 | codewhale-paths = { path = "../paths", version = "0.10.0" } |
| 46 | codewhale-protocol = { path = "../protocol", version = "0.10.0" } |
| 47 | codewhale-release = { path = "../release", version = "0.10.0" } |
| 48 | codewhale-secrets = { path = "../secrets", version = "0.10.0" } |
| 49 | codewhale-telemetry = { path = "../telemetry", version = "0.10.0" } |
| 50 | codewhale-tools = { path = "../tools", version = "0.10.0" } |
| 51 | codewhale-workflow = { path = "../workflow", version = "0.10.0" } |
| 52 | codewhale-workflow-js = { path = "../workflow-js", version = "0.10.0" } |
| 53 | async-stream = "0.3.6" |
| 54 | async-trait.workspace = true |
| 55 | base64 = "0.23.1" |
| 56 | axum.workspace = true |
| 57 | clap.workspace = true |
| 58 | clap_complete.workspace = true |
| 59 | colored = "3.0.0" |
| 60 | crossterm = "0.29" |
| 61 | dotenvy = "0.15.7" |
| 62 | encoding_rs.workspace = true |
| 63 | fd-lock = "4.0.4" |
| 64 | dirs.workspace = true |
| 65 | futures-util = "0.3.31" |
| 66 | hyper-util = { version = "=0.1.20", features = ["client-proxy"] } |
| 67 | oauth2 = { version = "5", default-features = false } |
| 68 | # No ratatui-core pin: ColorCompatBackend answers `get_cursor_position()` |
| 69 | # from tracked state (ratatui#2640's recommended workaround), so the CPR query |
| 70 | # inside `Terminal::clear()` no longer races the input loop. See |
| 71 | # `tui/color_compat.rs`. |
| 72 | ratatui = { version = "=0.30.2", features = ["unstable-rendered-line-info"] } |
| 73 | regex = "1.11" |
| 74 | reqwest = { workspace = true, features = ["blocking", "stream", "form", "http2"] } |
| 75 | rusqlite.workspace = true |
| 76 | rquickjs.workspace = true |
| 77 | rmcp = { version = "3.2.0", default-features = false, features = ["auth", "client"] } |
| 78 | rustls.workspace = true |
| 79 | qrcode = { version = "0.14", default-features = false } |
| 80 | similar = { version = "3", features = ["unicode"] } |
| 81 | ansi-to-tui = { version = "8.0.1", default-features = false } |
| 82 | # The renderer uses embedded syntax/theme dumps, not external YAML/plist loaders. |
| 83 | syntect = { version = "5.2", default-features = false, features = ["default-syntaxes", "default-themes", "regex-fancy"] } |
| 84 | serde.workspace = true |
| 85 | serde_json = { workspace = true, features = ["preserve_order", "raw_value"] } |
| 86 | schemars = { version = "1.2.1", features = ["derive", "preserve_order"] } |
| 87 | shellexpand = "3" |
| 88 | # Grammar-exact Rust parsing for the post-edit syntax gate (#6204). `syn` is |
| 89 | # already in the lockfile as a proc-macro build dependency; this reuses that |
| 90 | # same version rather than vendoring a second parser (#6151). `span-locations` |
| 91 | # is what turns a parse failure into the `line:column` the model needs — the |
| 92 | # feature is inert without it. |
| 93 | syn = { version = "3.0.3", default-features = false, features = ["full", "parsing"] } |
| 94 | proc-macro2 = { version = "1.0.107", features = ["span-locations"] } |
| 95 | toml.workspace = true |
| 96 | toml_edit.workspace = true |
| 97 | tokio.workspace = true |
| 98 | tokio-util = { version = "0.7.16", features = ["io"] } |
| 99 | unicode-width = "0.2" |
| 100 | unicode-segmentation = "1.12" |
| 101 | unicode-normalization = "0.1" |
| 102 | urlencoding = "2.1" |
| 103 | uuid.workspace = true |
| 104 | chrono.workspace = true |
| 105 | tempfile.workspace = true |
| 106 | thiserror.workspace = true |
| 107 | tracing.workspace = true |
| 108 | tracing-subscriber.workspace = true |
| 109 | tower-http.workspace = true |
| 110 | wait-timeout = "0.2" |
| 111 | webbrowser = "1.0" |
| 112 | shlex = "2.0.1" |
| 113 | globset = "0.4" |
| 114 | ignore = "0.4" |
| 115 | image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp", "gif"] } |
| 116 | htmd = "0.5.4" |
| 117 | # lru >= 0.18.2 fixes RUSTSEC-2026-0253 (panic-unsafe `pop()`). |
| 118 | lru = "0.18" |
| 119 | parking_lot = "0.12" |
| 120 | tar = "0.4" |
| 121 | # Vendored static liblzma keeps the full-fidelity session archive export |
| 122 | # (`session_export`) hermetic on every release target; no system xz headers. |
| 123 | # liblzma is the maintained, API-compatible continuation of xz2. |
| 124 | liblzma = { version = "0.4", features = ["static"] } |
| 125 | flate2 = "1.1" |
| 126 | sha2.workspace = true |
| 127 | semver.workspace = true |
| 128 | codewhale-localization = { path = "../localization", version = "0.10.0" } |
| 129 | shell-words = "1.1.1" |
| 130 | mimalloc = { workspace = true, optional = true } |
| 131 | rusty_alloc-api = { workspace = true, optional = true } |
| 132 | |
| 133 | [build-dependencies] |
| 134 | codewhale-build-support = { path = "../build-support", version = "0.10.0" } |
| 135 | |
| 136 | [dev-dependencies] |
| 137 | codewhale-models = { path = "../models", version = "0.10.0", features = [ |
| 138 | "test-support", |
| 139 | ] } |
| 140 | cucumber = "0.23.0" |
| 141 | jsonschema.workspace = true |
| 142 | wiremock = "0.6" |
| 143 | tiny_http = "0.12" |
| 144 | pretty_assertions = "1.4" |
| 145 | rio-vt = "0.5.1" |
| 146 | |
| 147 | [target.'cfg(unix)'.dependencies] |
| 148 | libc = "0.2" |
| 149 | |
| 150 | [target.'cfg(windows)'.dependencies] |
| 151 | windows-sys = { version = "0.61.2", features = ["Wdk_Storage_FileSystem", "Win32_System_IO", "Win32_Foundation", "Win32_Security", "Win32_Security_Authorization", "Win32_Storage_FileSystem", "Win32_System_Pipes", "Win32_System_Threading"] } |
| 152 | |
| 153 | [target.'cfg(any(target_os = "macos", target_os = "windows", all(target_os = "linux", not(target_env = "ohos"))))'.dependencies] |
| 154 | arboard = { version = "3.4", features = ["wayland-data-control"] } |
| 155 | |
| 156 | [target.'cfg(not(target_env = "ohos"))'.dependencies] |
| 157 | portable-pty = "0.9" |
| 158 | |
| 159 | [target.'cfg(target_os = "macos")'.dependencies] |
| 160 | objc2 = "0.6.3" |
| 161 | objc2-foundation = { version = "0.3.2", default-features = false, features = ["std", "NSArray", "NSDictionary", "NSError", "NSObject", "NSString", "NSURL"] } |
| 162 | |
| 163 | [target.'cfg(target_os = "windows")'.dependencies] |
| 164 | windows = { version = "0.62", features = ["Win32_Foundation", "Win32_Media_Audio", "Win32_Security", "Win32_Security_Authorization", "Win32_Storage_FileSystem", "Win32_System_Console", "Win32_System_Diagnostics_Debug", "Win32_System_Diagnostics_ToolHelp", "Win32_System_Environment", "Win32_System_JobObjects", "Win32_System_Registry", "Win32_System_Threading", "Win32_UI_WindowsAndMessaging"] } |
| 165 | # `windows` re-exports most of windows-core's types but not all of them |
| 166 | # (BOOL, HRESULT, … live in windows-core itself); window_control.rs names |
| 167 | # windows_core::BOOL for the EnumWindows callback, so it must be a direct |
| 168 | # dependency. Version already resolved via `windows` — no extra build work. |
| 169 | windows-core = { version = "0.62" } |
| 170 |