Update TUI

This commit is contained in:
2026-02-10 17:35:37 -08:00
parent c3ad7d59a3
commit 8feb3a48e7
14 changed files with 99 additions and 89 deletions
+24
View File
@@ -509,6 +509,30 @@ if [ -z "${CODE_VERSION:-}" ]; then
fi
fi
# Keep compile-time build metadata in sync with the current checkout so
# `dev --version` can always be matched back to git tag/hash/date.
if [ -z "${CODE_GIT_DESCRIBE:-}" ]; then
CODE_GIT_DESCRIBE="$(git describe --tags --always --dirty 2>/dev/null || true)"
if [ -n "${CODE_GIT_DESCRIBE}" ]; then
export CODE_GIT_DESCRIBE
fi
fi
if [ -z "${CODE_GIT_SHA:-}" ]; then
CODE_GIT_SHA="$(git rev-parse --short=12 HEAD 2>/dev/null || true)"
if [ -n "${CODE_GIT_SHA}" ]; then
export CODE_GIT_SHA
fi
fi
if [ -z "${CODE_GIT_DATE:-}" ]; then
CODE_GIT_DATE="$(git show -s --format=%cs HEAD 2>/dev/null || true)"
if [ -n "${CODE_GIT_DATE}" ]; then
export CODE_GIT_DATE
fi
fi
if [ -n "${CODE_GIT_DESCRIBE:-}" ] || [ -n "${CODE_GIT_SHA:-}" ] || [ -n "${CODE_GIT_DATE:-}" ]; then
echo "Build metadata: ${CODE_GIT_DESCRIBE:-unknown} ${CODE_GIT_SHA:+(${CODE_GIT_SHA})} ${CODE_GIT_DATE:+${CODE_GIT_DATE}}"
fi
echo "Building ${CRATE_PREFIX} binary (${PROFILE} mode)..."
# Ensure Cargo cache locations are stable.
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@hanzo/dev",
"version": "3.0.11",
"version": "0.6.61",
"license": "Apache-2.0",
"description": "Lightweight coding agent that runs in your terminal - fork of OpenAI Codex",
"bin": {
@@ -35,10 +35,10 @@
"prettier": "^3.3.3"
},
"optionalDependencies": {
"@hanzo/dev-darwin-arm64": "3.0.11",
"@hanzo/dev-darwin-x64": "3.0.11",
"@hanzo/dev-linux-x64-musl": "3.0.11",
"@hanzo/dev-linux-arm64-musl": "3.0.11",
"@hanzo/dev-win32-x64": "3.0.11"
"@hanzo/dev-darwin-arm64": "0.6.61",
"@hanzo/dev-darwin-x64": "0.6.61",
"@hanzo/dev-linux-x64-musl": "0.6.61",
"@hanzo/dev-linux-arm64-musl": "0.6.61",
"@hanzo/dev-win32-x64": "0.6.61"
}
}
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@hanzo/dev",
"version": "3.0.2",
"version": "0.6.61",
"license": "Apache-2.0",
"description": "Hanzo AI coding assistant - intelligent CLI for developers",
"bin": {
@@ -35,10 +35,10 @@
"prettier": "^3.3.3"
},
"optionalDependencies": {
"@hanzo/dev-darwin-arm64": "3.0.2",
"@hanzo/dev-darwin-x64": "3.0.2",
"@hanzo/dev-linux-x64-musl": "3.0.2",
"@hanzo/dev-linux-arm64-musl": "3.0.2",
"@hanzo/dev-win32-x64": "3.0.2"
"@hanzo/dev-darwin-arm64": "0.6.61",
"@hanzo/dev-darwin-x64": "0.6.61",
"@hanzo/dev-linux-x64-musl": "0.6.61",
"@hanzo/dev-linux-arm64-musl": "0.6.61",
"@hanzo/dev-win32-x64": "0.6.61"
}
}
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@hanzo/dev",
"version": "3.0.11",
"version": "0.6.61",
"license": "Apache-2.0",
"description": "Hanzo AI coding assistant - intelligent CLI for developers",
"bin": {
@@ -35,10 +35,10 @@
"prettier": "^3.3.3"
},
"optionalDependencies": {
"@hanzo/dev-darwin-arm64": "3.0.11",
"@hanzo/dev-darwin-x64": "3.0.11",
"@hanzo/dev-linux-x64-musl": "3.0.11",
"@hanzo/dev-linux-arm64-musl": "3.0.11",
"@hanzo/dev-win32-x64": "3.0.11"
"@hanzo/dev-darwin-arm64": "0.6.61",
"@hanzo/dev-darwin-x64": "0.6.61",
"@hanzo/dev-linux-x64-musl": "0.6.61",
"@hanzo/dev-linux-arm64-musl": "0.6.61",
"@hanzo/dev-win32-x64": "0.6.61"
}
}
+37 -37
View File
@@ -2310,7 +2310,7 @@ dependencies = [
[[package]]
name = "hanzo-ansi-escape"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"ansi-to-tui",
"ratatui",
@@ -2319,7 +2319,7 @@ dependencies = [
[[package]]
name = "hanzo-app-server"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"hanzo-arg0",
@@ -2340,7 +2340,7 @@ dependencies = [
[[package]]
name = "hanzo-app-server-protocol"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"hanzo-mcp-types",
"hanzo-protocol",
@@ -2348,7 +2348,7 @@ dependencies = [
[[package]]
name = "hanzo-apply-patch"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"assert_cmd",
@@ -2362,7 +2362,7 @@ dependencies = [
[[package]]
name = "hanzo-arg0"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"dotenvy",
@@ -2375,7 +2375,7 @@ dependencies = [
[[package]]
name = "hanzo-auto-drive-core"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"chrono",
@@ -2399,7 +2399,7 @@ dependencies = [
[[package]]
name = "hanzo-auto-drive-diagnostics"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"hanzo-auto-drive-core",
@@ -2426,7 +2426,7 @@ dependencies = [
[[package]]
name = "hanzo-backend-openapi-models"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"serde",
"serde_json",
@@ -2434,7 +2434,7 @@ dependencies = [
[[package]]
name = "hanzo-browser"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"async-trait",
@@ -2462,7 +2462,7 @@ dependencies = [
[[package]]
name = "hanzo-chatgpt"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"clap",
@@ -2497,7 +2497,7 @@ dependencies = [
[[package]]
name = "hanzo-cloud-tasks"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"async-trait",
@@ -2525,7 +2525,7 @@ dependencies = [
[[package]]
name = "hanzo-cloud-tasks-client"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"async-trait",
@@ -2540,7 +2540,7 @@ dependencies = [
[[package]]
name = "hanzo-common"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"clap",
"hanzo-app-server-protocol",
@@ -2553,7 +2553,7 @@ dependencies = [
[[package]]
name = "hanzo-core"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"agent-client-protocol",
"anyhow",
@@ -2640,7 +2640,7 @@ dependencies = [
[[package]]
name = "hanzo-dev"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"chrono",
@@ -2685,7 +2685,7 @@ dependencies = [
[[package]]
name = "hanzo-exec"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"chrono",
@@ -2716,7 +2716,7 @@ dependencies = [
[[package]]
name = "hanzo-execpolicy"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"allocative",
"anyhow",
@@ -2736,7 +2736,7 @@ dependencies = [
[[package]]
name = "hanzo-file-search"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"clap",
@@ -2749,7 +2749,7 @@ dependencies = [
[[package]]
name = "hanzo-git-apply"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"once_cell",
"regex",
@@ -2758,7 +2758,7 @@ dependencies = [
[[package]]
name = "hanzo-git-tooling"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"pretty_assertions",
"tempfile",
@@ -2786,7 +2786,7 @@ dependencies = [
[[package]]
name = "hanzo-linux-sandbox"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"clap",
"hanzo-core",
@@ -2799,7 +2799,7 @@ dependencies = [
[[package]]
name = "hanzo-login"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"base64 0.22.1",
"chrono",
@@ -2821,7 +2821,7 @@ dependencies = [
[[package]]
name = "hanzo-mcp-client"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"hanzo-mcp-types",
@@ -2834,7 +2834,7 @@ dependencies = [
[[package]]
name = "hanzo-mcp-server"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"agent-client-protocol",
"anyhow",
@@ -2859,7 +2859,7 @@ dependencies = [
[[package]]
name = "hanzo-mcp-types"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"codex-mcp-types",
"serde_json",
@@ -2867,7 +2867,7 @@ dependencies = [
[[package]]
name = "hanzo-ollama"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"async-stream",
"bytes",
@@ -2882,7 +2882,7 @@ dependencies = [
[[package]]
name = "hanzo-otel"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"chrono",
"eventsource-stream",
@@ -2903,14 +2903,14 @@ dependencies = [
[[package]]
name = "hanzo-process-hardening"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"libc",
]
[[package]]
name = "hanzo-protocol"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"base64 0.22.1",
@@ -2934,7 +2934,7 @@ dependencies = [
[[package]]
name = "hanzo-protocol-ts"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"clap",
@@ -2946,7 +2946,7 @@ dependencies = [
[[package]]
name = "hanzo-responses-api-proxy"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"clap",
@@ -2962,7 +2962,7 @@ dependencies = [
[[package]]
name = "hanzo-rmcp-client"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"axum 0.8.8",
@@ -2979,7 +2979,7 @@ dependencies = [
[[package]]
name = "hanzo-tui"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"arboard",
@@ -3056,7 +3056,7 @@ dependencies = [
[[package]]
name = "hanzo-utils-json-to-toml"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"pretty_assertions",
"serde_json",
@@ -3065,7 +3065,7 @@ dependencies = [
[[package]]
name = "hanzo-utils-readiness"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"async-trait",
"thiserror 2.0.17",
@@ -3075,11 +3075,11 @@ dependencies = [
[[package]]
name = "hanzo-version"
version = "0.6.0"
version = "0.6.61"
[[package]]
name = "hanzo-zap"
version = "0.6.0"
version = "0.6.61"
dependencies = [
"anyhow",
"async-trait",
+5 -5
View File
@@ -40,7 +40,7 @@ members = [
resolver = "2"
[workspace.package]
version = "0.6.0"
version = "0.6.61"
# Track the edition for all workspace crates in one place. Individual
# crates can still override this value, but keeping it here means new
# crates created with `cargo new -w ...` automatically inherit the 2024
@@ -68,11 +68,11 @@ hanzo-git-tooling = { path = "git-tooling" }
hanzo-git-apply = { path = "git-apply" }
hanzo-linux-sandbox = { path = "linux-sandbox" }
hanzo-login = { path = "login" }
hanzo-mcp-client = { path = "mcp-client", version = "0.6.0" }
hanzo-mcp-client = { path = "mcp-client", version = "0.6.61" }
hanzo-mcp-server = { path = "mcp-server" }
hanzo-ollama = { path = "ollama" }
hanzo-process-hardening = { path = "process-hardening" }
hanzo-protocol = { path = "protocol", version = "0.6.0" }
hanzo-protocol = { path = "protocol", version = "0.6.61" }
hanzo-protocol-ts = { path = "protocol-ts" }
hanzo-responses-api-proxy = { path = "responses-api-proxy" }
hanzo-rmcp-client = { path = "rmcp-client" }
@@ -81,8 +81,8 @@ hanzo-tui = { path = "tui" }
hanzo-utils-json-to-toml = { path = "utils/json-to-toml" }
hanzo-utils-readiness = { path = "utils/readiness" }
hanzo-auto-drive-core = { path = "code-auto-drive-core" }
hanzo-zap = { path = "zap", version = "0.6.0" }
mcp-types = { path = "mcp-types", package = "hanzo-mcp-types", version = "0.6.0" }
hanzo-zap = { path = "zap", version = "0.6.61" }
mcp-types = { path = "mcp-types", package = "hanzo-mcp-types", version = "0.6.61" }
upstream-mcp-types = { package = "codex-mcp-types", version = "0.63.0" }
# External - Guard for I/O sanitization
+2
View File
@@ -1974,6 +1974,7 @@ impl App<'_> {
colors,
label: crate::theme::custom_theme_label(),
is_dark: crate::theme::custom_theme_is_dark(),
zen: crate::theme::is_zen_mode(),
});
} else if let Ok(cfg) = hanzo_core::config::Config::load_with_cli_overrides(
vec![],
@@ -2023,6 +2024,7 @@ impl App<'_> {
colors,
label: crate::theme::custom_theme_label(),
is_dark: crate::theme::custom_theme_is_dark(),
zen: crate::theme::is_zen_mode(),
});
} else if let Ok(cfg) = hanzo_core::config::Config::load_with_cli_overrides(
vec![],
@@ -472,12 +472,7 @@ impl ChatComposer {
self.access_mode_label_expiry = None;
self.access_mode_hint_expiry = None;
}
pub fn set_access_mode_label_ephemeral(&mut self, label: String, dur: std::time::Duration) {
self.access_mode_label = Some(label);
let expiry = std::time::Instant::now() + dur;
self.access_mode_label_expiry = Some(expiry);
self.access_mode_hint_expiry = Some(expiry);
}
pub fn set_access_mode_hint_for(&mut self, dur: std::time::Duration) {
self.access_mode_hint_expiry = Some(std::time::Instant::now() + dur);
}
@@ -528,7 +523,7 @@ impl ChatComposer {
(ActivePopup::Command(c), _) => c.calculate_required_height(),
(ActivePopup::File(c), _) => c.calculate_required_height(),
(ActivePopup::None, true) => 0,
(ActivePopup::None, false) => 1,
(ActivePopup::None, false) => 0,
};
// IMPORTANT: `width` here is the full BottomPane width. Subtract the
@@ -550,7 +545,7 @@ impl ChatComposer {
(ActivePopup::Command(popup), _) => popup.calculate_required_height(),
(ActivePopup::File(popup), _) => popup.calculate_required_height(),
(ActivePopup::None, true) => 0,
(ActivePopup::None, false) => 1,
(ActivePopup::None, false) => 0,
};
// Calculate dynamic height based on content
let content_width = area.width.saturating_sub(4); // Account for border and padding
@@ -2290,7 +2285,7 @@ impl ChatComposer {
(ActivePopup::Command(popup), _) => popup.calculate_required_height(),
(ActivePopup::File(popup), _) => popup.calculate_required_height(),
(ActivePopup::None, true) => 0,
(ActivePopup::None, false) => 1,
(ActivePopup::None, false) => 0,
}
}
-16
View File
@@ -1184,22 +1184,6 @@ impl BottomPane<'_> {
self.request_redraw();
}
pub(crate) fn set_access_mode_label_ephemeral(&mut self, label: String, dur: Duration) {
self.composer.set_access_mode_label_ephemeral(label, dur);
// Schedule a redraw after expiry without blocking other scheduled frames.
let tx = self.app_event_tx.clone();
let fallback_tx = self.app_event_tx.clone();
if thread_spawner::spawn_lightweight("access-hint-ephemeral", move || {
std::thread::sleep(dur + Duration::from_millis(120));
tx.send(AppEvent::RequestRedraw);
})
.is_none()
{
fallback_tx.send(AppEvent::RequestRedraw);
}
self.request_redraw();
}
#[allow(dead_code)]
fn render_auto_coordinator_footer(&self, _area: Rect, _buf: &mut Buffer) {}
@@ -1381,6 +1381,7 @@ impl ThemeSelectionView {
colors,
label: Some(name),
is_dark: s.proposed_is_dark.get(),
zen: crate::theme::is_zen_mode(),
},
);
}
@@ -1420,6 +1421,7 @@ impl ThemeSelectionView {
colors: colors.clone(),
label: Some(name.clone()),
is_dark: s.proposed_is_dark.get(),
zen: crate::theme::is_zen_mode(),
},
);
self.revert_theme_on_back = ThemeName::Custom;
@@ -2039,6 +2041,7 @@ impl<'a> BottomPaneView<'a> for ThemeSelectionView {
colors,
label: Some(name),
is_dark: s.proposed_is_dark.get(),
zen: crate::theme::is_zen_mode(),
},
);
}
@@ -2081,6 +2084,7 @@ impl<'a> BottomPaneView<'a> for ThemeSelectionView {
colors: colors.clone(),
label: Some(name.clone()),
is_dark: s.proposed_is_dark.get(),
zen: crate::theme::is_zen_mode(),
},
);
self.revert_theme_on_back = ThemeName::Custom;
@@ -2905,6 +2909,7 @@ impl<'a> BottomPaneView<'a> for ThemeSelectionView {
colors: colors.clone(),
label: Some(name),
is_dark,
zen: crate::theme::is_zen_mode(),
},
);
}
+2
View File
@@ -1,3 +1,5 @@
#![allow(dead_code)]
use ratatui::buffer::Buffer;
use ratatui::prelude::*;
// Paragraph/Widget previously used; manual cell writes now keep static layer intact.
+1 -1
View File
@@ -136,7 +136,7 @@ impl HeightManager {
// Cap the bottom pane to a percentage of screen height.
// Keep a small floor so one-line input + footer fit, but avoid the
// extra trailing blank row in the borderless composer layout.
const MIN_BOTTOM_ROWS: u16 = 4;
const MIN_BOTTOM_ROWS: u16 = 3;
let percent_cap: u16 =
((area.height as u32).saturating_mul(self.cfg.bottom_percent_cap as u32) / 100) as u16;
let bottom_cap = percent_cap.max(MIN_BOTTOM_ROWS);
@@ -13,7 +13,6 @@ pub(crate) struct AnimatedWelcomeCell {
fade_start: RefCell<Option<Instant>>,
faded_out: Cell<bool>,
version_label: String,
hidden: Cell<bool>,
}
impl AnimatedWelcomeCell {
@@ -24,7 +23,6 @@ impl AnimatedWelcomeCell {
fade_start: RefCell::new(None),
faded_out: Cell::new(false),
version_label: format!("v{}", env!("CARGO_PKG_VERSION")),
hidden: Cell::new(false),
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@hanzo/zap",
"version": "0.6.0",
"version": "0.6.61",
"description": "Zero-copy Agent Protocol (ZAP) SDK for TypeScript - 1000x faster than MCP",
"type": "module",
"main": "./dist/index.js",