{
  "name": "harness-tui-kit",
  "language": "rust",
  "version": "0.1.0-alpha.1",
  "description": "Harness TUI Kit \u2014 production-ready TUI components for building agent harnesses (chat, history, harness observability, AHE widgets).",
  "manifest": "harness-tui-kit/Cargo.toml",
  "manifestSha256": "2d02f1c5526be01e092a25fa73227eae407d945c2866d5192e51ed88c21baa22",
  "status": "source-reference",
  "registryPublicationVerified": false,
  "route": "/libraries/rust/harness-tui-kit",
  "features": {},
  "files": [
    {
      "path": "harness-tui-kit/src/components/agent/agent_panel.rs",
      "sha256": "8902d02254921c9e277660322d0725ecd5813ff468fc10c517c58710dabafce8",
      "artifactSha256": "927515eb5565628b55bace533fc0e13138ee6c606ff494a864cf01609cf5def7",
      "url": "/reference/source/harness-tui-kit/src/components/agent/agent_panel.rs.txt",
      "declarations": [
        {
          "name": "::AgentPanel",
          "line": 85,
          "signature": "#[derive(Debug, Clone)]\npub struct AgentPanel<'a> {\n\n}",
          "documentation": "Full agent detail panel.\n\nDisplays a comprehensive view of an agent including identity, current task,\nmetrics, and tool access. Sections can be toggled via builder methods.\nContent is vertically scrollable when it exceeds the available height.\n\nThis is a [`StatefulWidget`] that renders against [`AgentPanelState`].\n\n# Sections\n\n- **Identity**: Agent name (bold, accent-colored), status dot, model badge,\n  and role description.\n- **Current task**: The label of the task the agent is working on, or \"Idle\"\n  if no task is set.\n- **Metrics** (optional): Tokens used, cost, and latency displayed as inline\n  text rows.\n- **Tool access** (optional): A bulleted list of tool names the agent can invoke.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentPanel, AgentPanelState, AgentInfo, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet info = AgentInfo::new(\"a1\", \"Coder\", \"gpt-4o\").with_role(\"Writes code\");\nlet mut state = AgentPanelState::default();\nlet area = Rect::new(0, 0, 50, 10);\nlet mut buf = Buffer::empty(area);\nAgentPanel::new(&info).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::AgentPanel<'a>::new",
          "line": 120,
          "signature": "#[must_use]\npub fn new(info: &'a AgentInfo) -> Self;",
          "documentation": "Create a new agent panel for the given agent info.\n\nDefaults to the standard dark theme with metrics and tools hidden.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentPanel, AgentInfo};\n\nlet info = AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\");\nlet panel = AgentPanel::new(&info);\n```"
        },
        {
          "name": "::AgentPanel<'a>::theme",
          "line": 146,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme (builder pattern).\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentPanel, AgentInfo, Theme};\n\nlet info = AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\");\nlet theme = Theme::midnight();\nlet panel = AgentPanel::new(&info).theme(&theme);\n```"
        },
        {
          "name": "::AgentPanel<'a>::show_metrics",
          "line": 164,
          "signature": "#[must_use]\npub fn show_metrics(mut self, show: bool) -> Self;",
          "documentation": "Toggle visibility of the metrics section (builder pattern).\n\nWhen enabled, displays tokens used, cost, and latency.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentPanel, AgentInfo};\n\nlet info = AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\");\nlet panel = AgentPanel::new(&info).show_metrics(true);\n```"
        },
        {
          "name": "::AgentPanel<'a>::show_tools",
          "line": 182,
          "signature": "#[must_use]\npub fn show_tools(mut self, show: bool) -> Self;",
          "documentation": "Toggle visibility of the tool access section (builder pattern).\n\nWhen enabled, displays a bulleted list of tool names.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentPanel, AgentInfo};\n\nlet info = AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\");\nlet panel = AgentPanel::new(&info).show_tools(true);\n```"
        },
        {
          "name": "::AgentPanel<'a>::current_task",
          "line": 200,
          "signature": "#[must_use]\npub fn current_task(mut self, task: &'a str) -> Self;",
          "documentation": "Set the current task label (builder pattern).\n\nIf not set or empty, the panel displays \"Idle\" in muted text.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentPanel, AgentInfo};\n\nlet info = AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\");\nlet panel = AgentPanel::new(&info).current_task(\"Analyzing code\");\n```"
        },
        {
          "name": "::AgentPanel<'a>::tokens_used",
          "line": 216,
          "signature": "#[must_use]\npub fn tokens_used(mut self, tokens: u64) -> Self;",
          "documentation": "Set the token usage count (builder pattern).\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentPanel, AgentInfo};\n\nlet info = AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\");\nlet panel = AgentPanel::new(&info).tokens_used(50000);\n```"
        },
        {
          "name": "::AgentPanel<'a>::cost_display",
          "line": 232,
          "signature": "#[must_use]\npub fn cost_display(mut self, cost: &'a str) -> Self;",
          "documentation": "Set the cost display string (builder pattern).\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentPanel, AgentInfo};\n\nlet info = AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\");\nlet panel = AgentPanel::new(&info).cost_display(\"$1.23\");\n```"
        },
        {
          "name": "::AgentPanel<'a>::latency_ms",
          "line": 248,
          "signature": "#[must_use]\npub fn latency_ms(mut self, ms: u64) -> Self;",
          "documentation": "Set the current latency in milliseconds (builder pattern).\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentPanel, AgentInfo};\n\nlet info = AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\");\nlet panel = AgentPanel::new(&info).latency_ms(85);\n```"
        },
        {
          "name": "::AgentPanel<'a>::tools",
          "line": 264,
          "signature": "#[must_use]\npub fn tools(mut self, names: &'a [&'a str]) -> Self;",
          "documentation": "Set the list of tool names available to this agent (builder pattern).\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentPanel, AgentInfo};\n\nlet info = AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\");\nlet panel = AgentPanel::new(&info).tools(&[\"read_file\", \"bash\"]);\n```"
        },
        {
          "name": "::AgentPanelState",
          "line": 286,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct AgentPanelState {\n\n}",
          "documentation": "Mutable state for [`AgentPanel`], persisted across frames.\n\nTracks the vertical scroll offset for content that exceeds the visible area.\n\n# Examples\n\n```\nuse harness_tui_kit::AgentPanelState;\n\nlet mut state = AgentPanelState::default();\nassert_eq!(state.scroll_offset(), 0);\n\nstate.scroll_down();\nassert_eq!(state.scroll_offset(), 1);\n```"
        },
        {
          "name": "::AgentPanelState::scroll_up",
          "line": 293,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll up by one row, clamping at zero."
        },
        {
          "name": "::AgentPanelState::scroll_down",
          "line": 298,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll down by one row."
        },
        {
          "name": "::AgentPanelState::scroll_offset",
          "line": 304,
          "signature": "#[must_use]\npub fn scroll_offset(&self) -> usize;",
          "documentation": "Returns the current scroll offset."
        },
        {
          "name": "::AgentPanelState::reset",
          "line": 309,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset state to defaults."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/agent/avatar.rs",
      "sha256": "cec2c9da348e7d23f0766ab90c634a2ac3b9faae3f1d4864dbb05645c4289ec8",
      "artifactSha256": "440f50a74b0a2a512ea7670ae522b0bf44a89c2f1865a9644a1d007380e4d70c",
      "url": "/reference/source/harness-tui-kit/src/components/agent/avatar.rs.txt",
      "declarations": [
        {
          "name": "::AvatarSize",
          "line": 58,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]\npub enum AvatarSize {\n    /// 1 character wide, 1 row tall.\n    Small,\n    /// 3 characters wide, 3 rows tall.\n    Medium,\n    /// 5 characters wide, 5 rows tall.\n    Large,\n}",
          "documentation": "Size of the avatar block.\n\nDetermines how many terminal cells the avatar occupies.\n\n# Examples\n\n```\nuse harness_tui_kit::AvatarSize;\n\nlet size = AvatarSize::Medium;\n```"
        },
        {
          "name": "::AgentAvatar",
          "line": 109,
          "signature": "#[derive(Debug, Clone)]\npub struct AgentAvatar<'a> {\n\n}",
          "documentation": "A widget that renders a deterministic visual identity from an agent ID.\n\nThe color is derived from a hash of the agent ID, ensuring that the same\nagent always renders with the same visual appearance. The avatar displays\nthe agent's initial(s) centered in the block.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentAvatar, AvatarSize, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::Widget;\n\nlet avatar = AgentAvatar::new(\"agent-1\", \"Coder\").size(AvatarSize::Medium);\nlet area = Rect::new(0, 0, 3, 3);\nlet mut buf = Buffer::empty(area);\navatar.render(area, &mut buf);\n```"
        },
        {
          "name": "::AgentAvatar<'a>::new",
          "line": 133,
          "signature": "#[must_use]\npub fn new(id: &'a str, name: &'a str) -> Self;",
          "documentation": "Create a new avatar for the given agent ID and name.\n\nDefaults to [`AvatarSize::Small`] and the default dark theme.\n\n# Examples\n\n```\nuse harness_tui_kit::AgentAvatar;\n\nlet avatar = AgentAvatar::new(\"agent-1\", \"Navigator\");\n```"
        },
        {
          "name": "::AgentAvatar<'a>::size",
          "line": 152,
          "signature": "#[must_use]\npub fn size(mut self, size: AvatarSize) -> Self;",
          "documentation": "Set the avatar size.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentAvatar, AvatarSize};\n\nlet avatar = AgentAvatar::new(\"a1\", \"Bot\").size(AvatarSize::Large);\n```"
        },
        {
          "name": "::AgentAvatar<'a>::theme",
          "line": 168,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentAvatar, Theme};\n\nlet theme = Theme::midnight();\nlet avatar = AgentAvatar::new(\"a1\", \"Bot\").theme(&theme);\n```"
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/agent/card.rs",
      "sha256": "9403451bae6bd3d04684f06a91eee085deb89d9db56b76203a53148691f83e10",
      "artifactSha256": "cdaf0a413586cebdeb822d3cf62c330b79e260dcbf019813c9f8996560397342",
      "url": "/reference/source/harness-tui-kit/src/components/agent/card.rs.txt",
      "declarations": [
        {
          "name": "::AgentCard",
          "line": 65,
          "signature": "#[derive(Debug, Clone)]\npub struct AgentCard<'a> {\n\n}",
          "documentation": "Expandable agent identity card.\n\nDisplays an agent's name, model, status, and role description. In compact\nmode (the default), everything fits on a single line. In expanded mode,\nthe card spans multiple lines with a colored left border.\n\nThis is a [`StatefulWidget`] that renders against [`AgentCardState`].\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentCard, AgentCardState, AgentInfo, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet info = AgentInfo::new(\"a1\", \"Coder\", \"gpt-4o\").with_role(\"Writes code\");\nlet mut state = AgentCardState::default();\nlet area = Rect::new(0, 0, 50, 1);\nlet mut buf = Buffer::empty(area);\nAgentCard::new(&info).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::AgentCard<'a>::new",
          "line": 86,
          "signature": "#[must_use]\npub fn new(info: &'a AgentInfo) -> Self;",
          "documentation": "Create a new agent card for the given agent info.\n\nDefaults to the standard dark theme.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentCard, AgentInfo};\n\nlet info = AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\");\nlet card = AgentCard::new(&info);\n```"
        },
        {
          "name": "::AgentCard<'a>::theme",
          "line": 105,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentCard, AgentInfo, Theme};\n\nlet info = AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\");\nlet theme = Theme::midnight();\nlet card = AgentCard::new(&info).theme(&theme);\n```"
        },
        {
          "name": "::AgentCardState",
          "line": 127,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct AgentCardState {\n/// Whether to show expanded (multi-line) or compact (single-line) mode.\n\npub expanded: bool\n}",
          "documentation": "Mutable state for [`AgentCard`], persisted across frames.\n\nTracks whether the card is in expanded or compact display mode.\n\n# Examples\n\n```\nuse harness_tui_kit::AgentCardState;\n\nlet mut state = AgentCardState::default();\nassert!(!state.expanded);\n\nstate.toggle();\nassert!(state.expanded);\n```"
        },
        {
          "name": "::AgentCardState::toggle",
          "line": 134,
          "signature": "pub fn toggle(&mut self);",
          "documentation": "Toggle between expanded and compact mode."
        },
        {
          "name": "::AgentCardState::reset",
          "line": 139,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset to default (compact) state."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/agent/list.rs",
      "sha256": "21ccd2c53a768924250d8426fee558f6f261d25e8c55fb9d7059b60ff6083d04",
      "artifactSha256": "739b1e0eff9a2d6be41add5772181691d301601c8b18ceedb371c571a667a33f",
      "url": "/reference/source/harness-tui-kit/src/components/agent/list.rs.txt",
      "declarations": [
        {
          "name": "::AgentList",
          "line": 68,
          "signature": "#[derive(Debug, Clone)]\npub struct AgentList<'a> {\n\n}",
          "documentation": "Scrollable, filterable list of agent cards.\n\nRenders a vertical list of agents using [`AgentCard`] for each entry.\nThe selected agent is highlighted with the theme's accent border color.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentList, AgentListState, AgentInfo, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet agents = vec![AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\")];\nlet mut state = AgentListState::default();\nlet area = Rect::new(0, 0, 40, 5);\nlet mut buf = Buffer::empty(area);\nAgentList::new(&agents).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::AgentList<'a>::new",
          "line": 87,
          "signature": "#[must_use]\npub fn new(agents: &'a [AgentInfo]) -> Self;",
          "documentation": "Create a new agent list for the given agents.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentList, AgentInfo};\n\nlet agents = vec![AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\")];\nlet list = AgentList::new(&agents);\n```"
        },
        {
          "name": "::AgentList<'a>::theme",
          "line": 106,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentList, AgentInfo, Theme};\n\nlet agents = vec![AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\")];\nlet theme = Theme::midnight();\nlet list = AgentList::new(&agents).theme(&theme);\n```"
        },
        {
          "name": "::AgentListState",
          "line": 130,
          "signature": "#[derive(Debug, Clone)]\npub struct AgentListState {\n/// Currently selected agent index (if any).\n\npub selected: Option<usize>,\n/// Scroll offset for the list.\n\npub scroll_offset: usize,\n/// Optional filter text.\n\npub filter: String,\n/// Whether to show agents in compact mode.\n\npub compact: bool\n}",
          "documentation": "Mutable state for [`AgentList`], persisted across frames.\n\nTracks selection, scroll offset, filter text, and display mode. The\napplication is responsible for keeping this state alive between renders.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentListState, AgentInfo};\n\nlet mut state = AgentListState::default();\nassert_eq!(state.selected, None);\nassert!(state.compact);\n\nstate.select_next(3);\nassert_eq!(state.selected, Some(0));\n```"
        },
        {
          "name": "::AgentListState::new",
          "line": 150,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new state with compact mode enabled and no selection."
        },
        {
          "name": "::AgentListState::select_next",
          "line": 175,
          "signature": "pub fn select_next(&mut self, total: usize);",
          "documentation": "Move selection to the next agent, wrapping around.\n\nIf nothing is selected, selects the first agent. `total` is the count\nof visible (filtered) agents.\n\n# Examples\n\n```\nuse harness_tui_kit::AgentListState;\n\nlet mut state = AgentListState::default();\nstate.select_next(3);\nassert_eq!(state.selected, Some(0));\nstate.select_next(3);\nassert_eq!(state.selected, Some(1));\n```"
        },
        {
          "name": "::AgentListState::select_prev",
          "line": 200,
          "signature": "pub fn select_prev(&mut self, total: usize);",
          "documentation": "Move selection to the previous agent, wrapping around.\n\nIf nothing is selected, selects the last agent. `total` is the count\nof visible (filtered) agents.\n\n# Examples\n\n```\nuse harness_tui_kit::AgentListState;\n\nlet mut state = AgentListState::default();\nstate.select_prev(3);\nassert_eq!(state.selected, Some(2));\n```"
        },
        {
          "name": "::AgentListState::set_filter",
          "line": 225,
          "signature": "pub fn set_filter(&mut self, text: impl AsRef<str>);",
          "documentation": "Set the filter text.\n\nResets selection and scroll offset to avoid pointing at a now-hidden agent.\n\n# Examples\n\n```\nuse harness_tui_kit::AgentListState;\n\nlet mut state = AgentListState::default();\nstate.set_filter(\"nav\");\nassert_eq!(state.filter, \"nav\");\n```"
        },
        {
          "name": "::AgentListState::clear_filter",
          "line": 234,
          "signature": "pub fn clear_filter(&mut self);",
          "documentation": "Clear the filter text.\n\nResets selection and scroll offset."
        },
        {
          "name": "::AgentListState::toggle_compact",
          "line": 243,
          "signature": "pub fn toggle_compact(&mut self);",
          "documentation": "Toggle between compact and expanded card display.\n\nResets scroll offset since the item height changes."
        },
        {
          "name": "::AgentListState::selected_agent",
          "line": 268,
          "signature": "#[must_use]\npub fn selected_agent<'a>(&self, agents: &'a [AgentInfo]) -> Option<&'a AgentInfo>;",
          "documentation": "Get the currently selected agent from a slice.\n\nReturns `None` if nothing is selected, the selection is out of bounds,\nor the filtered list has fewer items than the selection index.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentListState, AgentInfo};\n\nlet agents = vec![\n    AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\"),\n    AgentInfo::new(\"a2\", \"Nav\", \"gpt-4o\"),\n];\nlet mut state = AgentListState::default();\nstate.select_next(agents.len());\nlet selected = state.selected_agent(&agents);\nassert_eq!(selected.map(|a| a.name.as_str()), Some(\"Bot\"));\n```"
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/agent/mod.rs",
      "sha256": "afbe2851c928022f63f25188b54235c49458866279f38a7bd3ff2802e451767f",
      "artifactSha256": "f33eb07d9a0133588642a7b05a033207c15b0f904cc98d304a6710de1d3c2e82",
      "url": "/reference/source/harness-tui-kit/src/components/agent/mod.rs.txt",
      "declarations": [
        {
          "name": "agent_panel",
          "line": 5,
          "signature": "pub mod agent_panel;",
          "documentation": "Agent components.\n\nComponents for displaying agent identity, status, and details."
        },
        {
          "name": "pub use agent_panel::{AgentPanel, AgentPanelState};",
          "line": 12,
          "signature": "pub use agent_panel::{AgentPanel, AgentPanelState};",
          "documentation": ""
        },
        {
          "name": "pub use avatar::{AgentAvatar, AvatarSize};",
          "line": 13,
          "signature": "pub use avatar::{AgentAvatar, AvatarSize};",
          "documentation": ""
        },
        {
          "name": "pub use card::{AgentCard, AgentCardState};",
          "line": 14,
          "signature": "pub use card::{AgentCard, AgentCardState};",
          "documentation": ""
        },
        {
          "name": "pub use list::{AgentList, AgentListState};",
          "line": 15,
          "signature": "pub use list::{AgentList, AgentListState};",
          "documentation": ""
        },
        {
          "name": "pub use multi_agent_header::{MultiAgentHeader, MultiAgentHeaderState};",
          "line": 16,
          "signature": "pub use multi_agent_header::{MultiAgentHeader, MultiAgentHeaderState};",
          "documentation": ""
        },
        {
          "name": "pub use status::AgentStatusDot;",
          "line": 17,
          "signature": "pub use status::AgentStatusDot;",
          "documentation": ""
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/agent/multi_agent_header.rs",
      "sha256": "a65e74d67545f13aaec8bf57db1ddbdeedd5d451a8c30cb8c30450b7cd7f482a",
      "artifactSha256": "a4a504027eff84a86ce41dc9b9fcacf5aaf9fd44c823506aadc2bfded156fc4b",
      "url": "/reference/source/harness-tui-kit/src/components/agent/multi_agent_header.rs.txt",
      "declarations": [
        {
          "name": "::MultiAgentHeader",
          "line": 84,
          "signature": "#[derive(Debug, Clone)]\npub struct MultiAgentHeader<'a> {\n\n}",
          "documentation": "Horizontal bar showing all agents with status dots.\n\nEach agent is rendered as a \"chip\": a colored status dot followed by the\nagent's name. The currently focused agent receives accent-colored text\nwith a bold modifier. When the total chip width exceeds the available\narea, scroll indicators (`<` / `>`) appear at the edges, and the caller\ncan use [`MultiAgentHeaderState::scroll_left`]\n[`MultiAgentHeaderState::scroll_right`] to pan the view.\n\nA right-aligned badge shows the total agent count in muted styling.\n\n# Examples\n\n```\nuse harness_tui_kit::{MultiAgentHeader, MultiAgentHeaderState, AgentInfo, AgentStatus, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet agents = vec![\n    AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\").with_status(AgentStatus::Online),\n];\nlet mut state = MultiAgentHeaderState::default();\nlet area = Rect::new(0, 0, 40, 1);\nlet mut buf = Buffer::empty(area);\nMultiAgentHeader::new(&agents).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::MultiAgentHeaderState",
          "line": 110,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct MultiAgentHeaderState {\n\n}",
          "documentation": "Mutable state for [`MultiAgentHeader`], persisted across frames.\n\nTracks the horizontal scroll offset when agents overflow the available\nwidth.\n\n# Examples\n\n```\nuse harness_tui_kit::MultiAgentHeaderState;\n\nlet mut state = MultiAgentHeaderState::default();\nstate.scroll_right(5);\nassert_eq!(state.scroll_offset(), 1);\nstate.scroll_left();\nassert_eq!(state.scroll_offset(), 0);\n```"
        },
        {
          "name": "::MultiAgentHeader<'a>::new",
          "line": 127,
          "signature": "#[must_use]\npub fn new(agents: &'a [AgentInfo]) -> Self;",
          "documentation": "Create a new multi-agent header for the given agents.\n\n# Examples\n\n```\nuse harness_tui_kit::{MultiAgentHeader, AgentInfo};\n\nlet agents = vec![AgentInfo::new(\"a1\", \"Bot\", \"gpt-4o\")];\nlet header = MultiAgentHeader::new(&agents);\n```"
        },
        {
          "name": "::MultiAgentHeader<'a>::theme",
          "line": 137,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        },
        {
          "name": "::MultiAgentHeader<'a>::focused_index",
          "line": 146,
          "signature": "#[must_use]\npub fn focused_index(mut self, index: Option<usize>) -> Self;",
          "documentation": "Set the focused agent index.\n\nThe focused agent receives accent-colored, bold styling."
        },
        {
          "name": "::MultiAgentHeaderState::new",
          "line": 155,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new state with zero scroll offset."
        },
        {
          "name": "::MultiAgentHeaderState::scroll_left",
          "line": 162,
          "signature": "pub fn scroll_left(&mut self);",
          "documentation": "Scroll the header one agent chip to the left.\n\nClamps at zero (the beginning)."
        },
        {
          "name": "::MultiAgentHeaderState::scroll_right",
          "line": 169,
          "signature": "pub fn scroll_right(&mut self, agent_count: usize);",
          "documentation": "Scroll the header one agent chip to the right.\n\nClamps so the offset cannot exceed `agent_count - 1`."
        },
        {
          "name": "::MultiAgentHeaderState::reset",
          "line": 180,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset the state to its default (scroll offset zero)."
        },
        {
          "name": "::MultiAgentHeaderState::scroll_offset",
          "line": 186,
          "signature": "#[must_use]\npub fn scroll_offset(&self) -> usize;",
          "documentation": "Returns the current scroll offset."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/agent/status.rs",
      "sha256": "9bfdcbfdb0ec8c0ba08b652afb92f1dd6de26ede3e9f0b6411f8e4d2d1e8fd6e",
      "artifactSha256": "f0eb373d698162745a6f682fd219e3e3bff8fafb4bbcde170fc0b3ff1383f928",
      "url": "/reference/source/harness-tui-kit/src/components/agent/status.rs.txt",
      "declarations": [
        {
          "name": "::AgentStatusDot",
          "line": 38,
          "signature": "#[derive(Debug, Clone)]\npub struct AgentStatusDot<'a> {\n\n}",
          "documentation": "Colored dot indicating an agent's status.\n\nMaps each [`AgentStatus`] variant to a theme-defined color and renders\na single Unicode dot character (`\u25cf`). Optionally shows the status label."
        },
        {
          "name": "::AgentStatusDot<'a>::new",
          "line": 50,
          "signature": "#[must_use]\npub fn new(status: AgentStatus) -> Self;",
          "documentation": "Create a new status dot for the given status."
        },
        {
          "name": "::AgentStatusDot<'a>::theme",
          "line": 60,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        },
        {
          "name": "::AgentStatusDot<'a>::with_label",
          "line": 67,
          "signature": "#[must_use]\npub fn with_label(mut self, show: bool) -> Self;",
          "documentation": "Show the status label text after the dot."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/bubble.rs",
      "sha256": "ce2f13c3491c1f781d989d7c1133a5cb4bf7ae35a403770d6e4ea2fea5e23cb1",
      "artifactSha256": "af3596ea7289c9c4e6fb536f76517acafb6161b917dc26437f22e37e4cca42d7",
      "url": "/reference/source/harness-tui-kit/src/components/chat/bubble.rs.txt",
      "declarations": [
        {
          "name": "::ChatBubble",
          "line": 38,
          "signature": "#[derive(Debug, Clone)]\npub struct ChatBubble<'a> {\n\n}",
          "documentation": "Single chat message bubble with role indicator.\n\nRenders a message with a colored left stripe indicating the sender's role,\nthe sender name, content text (word-wrapped), and an optional timestamp."
        },
        {
          "name": "::ChatBubble<'a>::new",
          "line": 59,
          "signature": "#[must_use]\npub fn new(message: &'a ChatMessage) -> Self;",
          "documentation": "Create a new chat bubble for the given message."
        },
        {
          "name": "::ChatBubble<'a>::markdown",
          "line": 78,
          "signature": "#[must_use]\npub fn markdown(mut self, enabled: bool) -> Self;",
          "documentation": "Enable markdown rendering of the message body. When enabled,\nthe bubble delegates body painting to [`MarkdownRenderer`]\n(no scroll, no `max_lines` collapsing \u2014 those are not\nmeaningful for styled markdown blocks; use [`ChatTimeline`]\nfor scrolling).\n\n[`ChatTimeline`]: crate::ChatTimeline"
        },
        {
          "name": "::ChatBubble<'a>::theme",
          "line": 85,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        },
        {
          "name": "::ChatBubble<'a>::show_timestamp",
          "line": 92,
          "signature": "#[must_use]\npub fn show_timestamp(mut self, show: bool) -> Self;",
          "documentation": "Set whether to show the timestamp."
        },
        {
          "name": "::ChatBubble<'a>::show_sender",
          "line": 99,
          "signature": "#[must_use]\npub fn show_sender(mut self, show: bool) -> Self;",
          "documentation": "Set whether to show the sender name."
        },
        {
          "name": "::ChatBubble<'a>::max_lines",
          "line": 108,
          "signature": "#[must_use]\npub fn max_lines(mut self, max: usize) -> Self;",
          "documentation": "Set the maximum content lines before collapsing.\n\nWhen set, content beyond this many lines shows a \"... (N more lines)\" indicator."
        },
        {
          "name": "::ChatBubbleState",
          "line": 116,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct ChatBubbleState {\n/// Scroll offset within the message content.\n\npub scroll_offset: usize,\n/// Whether this bubble is currently selected.\n\npub selected: bool\n}",
          "documentation": "Mutable state for [`ChatBubble`], persists across frames."
        },
        {
          "name": "::ChatBubbleState::scroll_up",
          "line": 125,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll up by one line."
        },
        {
          "name": "::ChatBubbleState::scroll_down",
          "line": 130,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll down by one line."
        },
        {
          "name": "::ChatBubbleState::reset",
          "line": 135,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset scroll to the top."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/code_block.rs",
      "sha256": "97d1bbeca0f269f7693169c8d0856dd24248be54eeec7f1592305b6623af9470",
      "artifactSha256": "6ca2ad4cae751353281dfd99fc2642a816ec3a010c5e361f8f730ab56f299ed2",
      "url": "/reference/source/harness-tui-kit/src/components/chat/code_block.rs.txt",
      "declarations": [
        {
          "name": "::CodeBlock",
          "line": 44,
          "signature": "#[derive(Debug, Clone)]\npub struct CodeBlock<'a> {\n\n}",
          "documentation": "Syntax-highlighted code block display.\n\nRenders code with an optional language label, line numbers, background fill,\nand keyword-based syntax highlighting. Supports scroll for long code blocks."
        },
        {
          "name": "::CodeBlock<'a>::new",
          "line": 60,
          "signature": "#[must_use]\npub fn new(code: &'a str) -> Self;",
          "documentation": "Create a new code block with the given source code."
        },
        {
          "name": "::CodeBlock<'a>::language",
          "line": 72,
          "signature": "#[must_use]\npub fn language(mut self, lang: &'a str) -> Self;",
          "documentation": "Set the programming language (e.g., \"rust\", \"python\", \"javascript\")."
        },
        {
          "name": "::CodeBlock<'a>::theme",
          "line": 79,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        },
        {
          "name": "::CodeBlock<'a>::show_line_numbers",
          "line": 86,
          "signature": "#[must_use]\npub fn show_line_numbers(mut self, show: bool) -> Self;",
          "documentation": "Set whether to show line numbers."
        },
        {
          "name": "::CodeBlock<'a>::show_header",
          "line": 93,
          "signature": "#[must_use]\npub fn show_header(mut self, show: bool) -> Self;",
          "documentation": "Set whether to show the language header bar."
        },
        {
          "name": "::CodeBlockState",
          "line": 101,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct CodeBlockState {\n/// Vertical scroll offset (in lines).\n\npub scroll_offset: usize,\n/// Horizontal scroll offset (in columns).\n\npub h_scroll: usize\n}",
          "documentation": "Mutable state for [`CodeBlock`], persists across frames."
        },
        {
          "name": "::CodeBlockState::scroll_up",
          "line": 110,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll up by one line."
        },
        {
          "name": "::CodeBlockState::scroll_down",
          "line": 115,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll down by one line."
        },
        {
          "name": "::CodeBlockState::scroll_left",
          "line": 120,
          "signature": "pub fn scroll_left(&mut self);",
          "documentation": "Scroll left by one column."
        },
        {
          "name": "::CodeBlockState::scroll_right",
          "line": 125,
          "signature": "pub fn scroll_right(&mut self);",
          "documentation": "Scroll right by one column."
        },
        {
          "name": "::CodeBlockState::reset",
          "line": 130,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset scroll to origin."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/diff_view.rs",
      "sha256": "8750a1e23755e7a9af791f11a21c12f2789732a5ff2de30dd74b196192b26dc9",
      "artifactSha256": "16c85fc88f9599df14c6617b31f4dd1e1814dde19cd48d84432b7aeb8f4181c6",
      "url": "/reference/source/harness-tui-kit/src/components/chat/diff_view.rs.txt",
      "declarations": [
        {
          "name": "::DiffView",
          "line": 110,
          "signature": "#[derive(Debug, Clone)]\npub struct DiffView<'a> {\n\n}",
          "documentation": "Diff view displaying file changes with line numbers and color coding.\n\nSupports unified and side-by-side display modes. In unified mode every\ndiff line occupies a single row with both old and new line numbers shown.\nIn side-by-side mode the area is split in two: the left half shows the\nold file (removed + context), the right half shows the new file\n(added + context).\n\nWhen `context_lines` is non-zero, large runs of context lines are\ncollapsed into a single `\"\u2026 N lines hidden \u2026\"` separator row.\n\n# Examples\n\n```\nuse harness_tui_kit::components::chat::{DiffView, DiffViewState};\nuse harness_tui_kit::{DiffLine, DiffLineKind, Theme};\nuse ratatui::buffer::Buffer;\nuse ratatui::layout::Rect;\nuse ratatui::widgets::StatefulWidget;\n\nlet lines = vec![\n    DiffLine { kind: DiffLineKind::Added, content: \"new line\".into(),\n               old_line_no: None, new_line_no: Some(1) },\n];\nlet theme = Theme::dark();\nlet mut state = DiffViewState::default();\nlet area = Rect::new(0, 0, 60, 5);\nlet mut buf = Buffer::empty(area);\nDiffView::new(&lines).theme(&theme).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::DiffView<'a>::new",
          "line": 129,
          "signature": "#[must_use]\npub fn new(lines: &'a [DiffLine]) -> Self;",
          "documentation": "Create a new diff view for the given diff lines.\n\nDefaults: unified mode, no filename, context collapsing disabled\n(show all lines), dark theme."
        },
        {
          "name": "::DiffView<'a>::filename",
          "line": 141,
          "signature": "#[must_use]\npub fn filename(mut self, name: &'a str) -> Self;",
          "documentation": "Set the filename displayed in the header row."
        },
        {
          "name": "::DiffView<'a>::unified",
          "line": 150,
          "signature": "#[must_use]\npub fn unified(mut self, value: bool) -> Self;",
          "documentation": "Set the display mode.\n\n`true` renders unified diff; `false` renders side-by-side."
        },
        {
          "name": "::DiffView<'a>::context_lines",
          "line": 163,
          "signature": "#[must_use]\npub fn context_lines(mut self, n: usize) -> Self;",
          "documentation": "Set the number of context lines to show around changed lines.\n\nWhen `n > 0`, any run of consecutive context lines longer than\n`2 * n` is replaced by a `\"\u2026 K lines hidden \u2026\"` separator showing\nthe first `n` and last `n` lines of the run.\n\nSetting this to `0` disables collapsing (all lines visible)."
        },
        {
          "name": "::DiffView<'a>::theme",
          "line": 170,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        },
        {
          "name": "::DiffViewState",
          "line": 542,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct DiffViewState {\n/// Vertical scroll offset in rendered rows.\n\npub scroll_offset: usize\n}",
          "documentation": "Mutable state for [`DiffView`], persists across frames.\n\nTracks the vertical scroll offset so the user can navigate through diffs\nlonger than the available terminal height."
        },
        {
          "name": "::DiffViewState::new",
          "line": 550,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new state positioned at the top of the diff."
        },
        {
          "name": "::DiffViewState::scroll_up",
          "line": 555,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll up by one rendered row, clamped at zero."
        },
        {
          "name": "::DiffViewState::scroll_down",
          "line": 563,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll down by one rendered row.\n\nThe caller is responsible for clamping against the total row count\nif desired; this method simply increments."
        },
        {
          "name": "::DiffViewState::reset",
          "line": 568,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset state to the top of the diff."
        },
        {
          "name": "::DiffViewState::clamp",
          "line": 575,
          "signature": "pub fn clamp(&mut self, max_offset: usize) -> usize;",
          "documentation": "Clamp the scroll offset so it does not exceed `max_offset`.\n\nReturns the clamped value."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/document_preview.rs",
      "sha256": "103b7dddc0bab424bdfab3cceedce3e6cbb327c86ba32a90467fd265e8f54cb8",
      "artifactSha256": "d19e4e3842f5722080cdf14232e1d11eebbc402b00f1bd254b748be79f2d629e",
      "url": "/reference/source/harness-tui-kit/src/components/chat/document_preview.rs.txt",
      "declarations": [
        {
          "name": "::DocumentPreviewState",
          "line": 26,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct DocumentPreviewState {\n\n}",
          "documentation": "Persistent state for [`DocumentPreviewPane`]."
        },
        {
          "name": "::DocumentPreviewState::scroll",
          "line": 36,
          "signature": "#[must_use]\npub fn scroll(&self) -> u16;",
          "documentation": "Current scroll offset."
        },
        {
          "name": "::DocumentPreviewState::follow_tail",
          "line": 42,
          "signature": "#[must_use]\npub fn follow_tail(&self) -> bool;",
          "documentation": "Whether tail-following is on."
        },
        {
          "name": "::DocumentPreviewState::set_follow_tail",
          "line": 47,
          "signature": "pub fn set_follow_tail(&mut self, on: bool);",
          "documentation": "Toggle tail-following."
        },
        {
          "name": "::DocumentPreviewState::line_up",
          "line": 52,
          "signature": "pub fn line_up(&mut self);",
          "documentation": "Scroll up by one row."
        },
        {
          "name": "::DocumentPreviewState::line_down",
          "line": 58,
          "signature": "pub fn line_down(&mut self);",
          "documentation": "Scroll down by one row."
        },
        {
          "name": "::DocumentPreviewState::page_up",
          "line": 63,
          "signature": "pub fn page_up(&mut self, viewport_h: u16);",
          "documentation": "Page up by `viewport_h` rows."
        },
        {
          "name": "::DocumentPreviewState::page_down",
          "line": 69,
          "signature": "pub fn page_down(&mut self, viewport_h: u16);",
          "documentation": "Page down by `viewport_h` rows."
        },
        {
          "name": "::DocumentPreviewState::jump_top",
          "line": 74,
          "signature": "pub fn jump_top(&mut self);",
          "documentation": "Jump to the first row."
        },
        {
          "name": "::DocumentPreviewState::jump_bottom",
          "line": 80,
          "signature": "pub fn jump_bottom(&mut self, content_h: u16, viewport_h: u16);",
          "documentation": "Jump to the last row of the supplied content."
        },
        {
          "name": "::PageStyle",
          "line": 88,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]\npub enum PageStyle {\n    /// Subtle bordered chrome with page-number footer.\n    #[default]\n    Page,\n    /// Raw scrollable region with no border.\n    Plain,\n}",
          "documentation": "What \"page chrome\" to draw around the document body."
        },
        {
          "name": "::DocumentPreviewPane",
          "line": 98,
          "signature": "#[derive(Debug, Clone)]\npub struct DocumentPreviewPane<'a> {\n\n}",
          "documentation": "Page-style live document preview."
        },
        {
          "name": "::DocumentPreviewPane<'a>::new",
          "line": 116,
          "signature": "#[must_use]\npub fn new(lines: &'a [Line<'static>]) -> Self;",
          "documentation": "Build a pane over a slice of pre-rendered lines."
        },
        {
          "name": "::DocumentPreviewPane<'a>::theme",
          "line": 130,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::DocumentPreviewPane<'a>::title",
          "line": 137,
          "signature": "#[must_use]\npub fn title(mut self, title: &'a str) -> Self;",
          "documentation": "Set the title shown in the page chrome border."
        },
        {
          "name": "::DocumentPreviewPane<'a>::page_style",
          "line": 144,
          "signature": "#[must_use]\npub fn page_style(mut self, style: PageStyle) -> Self;",
          "documentation": "Pick a chrome style."
        },
        {
          "name": "::DocumentPreviewPane<'a>::page_number",
          "line": 151,
          "signature": "#[must_use]\npub fn page_number(mut self, n: u16) -> Self;",
          "documentation": "Set the 1-indexed page number shown in the footer."
        },
        {
          "name": "::DocumentPreviewPane<'a>::total_pages",
          "line": 158,
          "signature": "#[must_use]\npub fn total_pages(mut self, n: u16) -> Self;",
          "documentation": "Set the total page count for footer \"X / Y\" display."
        },
        {
          "name": "::DocumentPreviewPane<'a>::doc_type",
          "line": 165,
          "signature": "#[must_use]\npub fn doc_type(mut self, label: &'a str) -> Self;",
          "documentation": "Optional document type label (e.g. `\"privacy-policy.md\"`)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/file_display.rs",
      "sha256": "6938f20e964032c9d8fd334fadcccad49903d250a2361cd73525944ee6ee6301",
      "artifactSha256": "b15675bf84a43d2a4d1e38f60bbc7c33c2431732ac6ec9b7ef70a02f31dc926a",
      "url": "/reference/source/harness-tui-kit/src/components/chat/file_display.rs.txt",
      "declarations": [
        {
          "name": "::FileDisplay",
          "line": 86,
          "signature": "#[derive(Debug, Clone)]\npub struct FileDisplay<'a> {\n\n}",
          "documentation": "File content display with metadata header and line numbers.\n\nRenders a file with:\n- **Header bar** (1 line): `[lang] filename \u2014 size, N lines` in muted style\n  with the language tag highlighted in the accent color.\n- **Body** (remaining lines): scrollable content with right-aligned muted\n  line numbers separated from the content by a `\u2502` gutter.\n- **Collapsible**: when collapsed only the header row is shown with a `\u25b6`\n  indicator; when expanded the `\u25bc` indicator is shown instead.\n\nAll text sourced from the caller passes through\n[`crate::util::sanitize::sanitize`] before reaching the terminal buffer.\n\n# Examples\n\n```\nuse harness_tui_kit::components::chat::{FileDisplay, FileDisplayState};\nuse harness_tui_kit::Theme;\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet mut state = FileDisplayState::default();\nlet area = Rect::new(0, 0, 60, 10);\nlet mut buf = Buffer::empty(area);\nFileDisplay::new(\"hello.txt\", \"Hello, world!\")\n    .render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::FileDisplay<'a>::new",
          "line": 107,
          "signature": "#[must_use]\npub fn new(filename: &'a str, content: &'a str) -> Self;",
          "documentation": "Create a new `FileDisplay` with the required filename and content.\n\nBoth `filename` and `content` are considered untrusted and will be\nsanitized before rendering.\n\nDefaults: language = `\"\"`, file_size = `0`, theme = [`DEFAULT_THEME`]."
        },
        {
          "name": "::FileDisplay<'a>::language",
          "line": 119,
          "signature": "#[must_use]\npub fn language(mut self, lang: &'a str) -> Self;",
          "documentation": "Set the programming language tag displayed in the header."
        },
        {
          "name": "::FileDisplay<'a>::file_size",
          "line": 126,
          "signature": "#[must_use]\npub fn file_size(mut self, bytes: u64) -> Self;",
          "documentation": "Set the file size in bytes. Used to format the size label in the header."
        },
        {
          "name": "::FileDisplay<'a>::theme",
          "line": 133,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme used for all color tokens."
        },
        {
          "name": "::FileDisplayState",
          "line": 145,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct FileDisplayState {\n\n}",
          "documentation": "Mutable state for [`FileDisplay`], persisted across frames."
        },
        {
          "name": "::FileDisplayState::scroll_up",
          "line": 154,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll up by one source line, clamping at zero."
        },
        {
          "name": "::FileDisplayState::scroll_down",
          "line": 162,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll down by one source line.\n\nThe render pass clamps `scroll_offset` to the last line so this will\nnever scroll past the end of the file."
        },
        {
          "name": "::FileDisplayState::toggle_collapse",
          "line": 167,
          "signature": "pub fn toggle_collapse(&mut self);",
          "documentation": "Toggle the collapsed / expanded state of the component."
        },
        {
          "name": "::FileDisplayState::reset",
          "line": 172,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset the component to its default state (scroll = 0, expanded)."
        },
        {
          "name": "::FileDisplayState::scroll_to",
          "line": 180,
          "signature": "pub fn scroll_to(&mut self, line: usize);",
          "documentation": "Scroll so that `line` (0-indexed) is the first visible line.\n\nIf `line` exceeds the total number of lines the render pass will clamp\nit automatically."
        },
        {
          "name": "::FileDisplayState::is_collapsed",
          "line": 186,
          "signature": "#[must_use]\npub fn is_collapsed(&self) -> bool;",
          "documentation": "Return `true` when the component is currently collapsed."
        },
        {
          "name": "::FileDisplayState::scroll_offset",
          "line": 192,
          "signature": "#[must_use]\npub fn scroll_offset(&self) -> usize;",
          "documentation": "Return the current scroll offset."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/inline_diff_card.rs",
      "sha256": "dbf9247717b55cb5dc6d17f5f9153781b752340368e5e4d49c9a4fae2d2c2ccf",
      "artifactSha256": "1f250b7eeaf7b69426096c043754a1a212373701012ed47286bcc7d4006cc2cc",
      "url": "/reference/source/harness-tui-kit/src/components/chat/inline_diff_card.rs.txt",
      "declarations": [
        {
          "name": "::InlineDiffCard",
          "line": 32,
          "signature": "#[derive(Debug, Clone)]\npub struct InlineDiffCard<'a> {\n\n}",
          "documentation": "Compact inline diff card."
        },
        {
          "name": "::ChangeKind",
          "line": 49,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]\npub enum ChangeKind {\n    /// File was modified in place.\n    #[default]\n    Edit,\n    /// File was created from scratch.\n    Create,\n    /// File was deleted.\n    Delete,\n    /// File was renamed (or moved).\n    Rename,\n}",
          "documentation": "What kind of change the card represents \u2014 drives the leading\nglyph in the header (\u270e edit / \u271a create / \u2716 delete / \u25b7 rename)."
        },
        {
          "name": "::InlineDiffCard<'a>::new",
          "line": 75,
          "signature": "#[must_use]\npub fn new(file: &'a str, lines: &'a [DiffLine]) -> Self;",
          "documentation": "Construct a card for `file` with the supplied diff slice."
        },
        {
          "name": "::InlineDiffCard<'a>::theme",
          "line": 88,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::InlineDiffCard<'a>::kind",
          "line": 95,
          "signature": "#[must_use]\npub fn kind(mut self, kind: ChangeKind) -> Self;",
          "documentation": "Override the change kind (drives the header glyph)."
        },
        {
          "name": "::InlineDiffCard<'a>::footer_hint",
          "line": 102,
          "signature": "#[must_use]\npub fn footer_hint(mut self, hint: &'a str) -> Self;",
          "documentation": "Replace the footer hint. Pass `\"\"` to suppress the footer."
        },
        {
          "name": "::InlineDiffCard<'a>::max_body_rows",
          "line": 109,
          "signature": "#[must_use]\npub fn max_body_rows(mut self, rows: u16) -> Self;",
          "documentation": "Override how many body rows the card may show."
        },
        {
          "name": "::InlineDiffCard<'a>::suggested_height",
          "line": 116,
          "signature": "#[must_use]\npub fn suggested_height(&self) -> u16;",
          "documentation": "Suggested total height: chrome + header + max body + footer."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/input.rs",
      "sha256": "80eb172ad751c4cf03e0d1b56108b9eca8caf8cc1d9bb58f64f99b9b0ac031f8",
      "artifactSha256": "d313aa8aac36c9dc7fb2469baa2e70b7ab4fbd4c67687e3157a7bb36ff8fc976",
      "url": "/reference/source/harness-tui-kit/src/components/chat/input.rs.txt",
      "declarations": [
        {
          "name": "::InputBar",
          "line": 36,
          "signature": "#[derive(Debug, Clone)]\npub struct InputBar<'a> {\n\n}",
          "documentation": "Multi-line text input bar for chat.\n\nRenders a text input area with placeholder text, character count,\nand disabled state support. The application is responsible for\nfeeding keyboard events to [`InputBarState`]."
        },
        {
          "name": "::InputBar<'a>::new",
          "line": 59,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new input bar."
        },
        {
          "name": "::InputBar<'a>::bg_color",
          "line": 75,
          "signature": "#[must_use]\npub fn bg_color(mut self, color: ratatui::style::Color) -> Self;",
          "documentation": "Override the input's background color. Useful when embedding\ninside a card surface (e.g., the welcome screen's focus card,\nwhich uses `theme.bg_elevated`)."
        },
        {
          "name": "::InputBar<'a>::show_prompt",
          "line": 82,
          "signature": "#[must_use]\npub fn show_prompt(mut self, show: bool) -> Self;",
          "documentation": "Toggle the soft \"\u276f\" prompt indicator (default: on)."
        },
        {
          "name": "::InputBar<'a>::show_top_border",
          "line": 91,
          "signature": "#[must_use]\npub fn show_top_border(mut self, show: bool) -> Self;",
          "documentation": "Toggle the thin divider line above the input (default: on).\nSet this to `false` when embedding the input inside a panel\nthat already provides its own border."
        },
        {
          "name": "::InputBar<'a>::placeholder",
          "line": 98,
          "signature": "#[must_use]\npub fn placeholder(mut self, text: &'a str) -> Self;",
          "documentation": "Set the placeholder text."
        },
        {
          "name": "::InputBar<'a>::disabled",
          "line": 105,
          "signature": "#[must_use]\npub fn disabled(mut self, disabled: bool) -> Self;",
          "documentation": "Set whether the input is disabled."
        },
        {
          "name": "::InputBar<'a>::show_char_count",
          "line": 112,
          "signature": "#[must_use]\npub fn show_char_count(mut self, show: bool) -> Self;",
          "documentation": "Set whether to show the character count."
        },
        {
          "name": "::InputBar<'a>::theme",
          "line": 119,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        },
        {
          "name": "::InputBarState",
          "line": 133,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct InputBarState {\n\n}",
          "documentation": "Mutable state for [`InputBar`], persists across frames."
        },
        {
          "name": "::InputBarState::text",
          "line": 147,
          "signature": "#[must_use]\npub fn text(&self) -> &str;",
          "documentation": "Get the current text content."
        },
        {
          "name": "::InputBarState::take_text",
          "line": 154,
          "signature": "pub fn take_text(&mut self) -> String;",
          "documentation": "Take the current text, replacing it with empty string.\n\nAdds the text to history if non-empty."
        },
        {
          "name": "::InputBarState::set_text",
          "line": 165,
          "signature": "pub fn set_text(&mut self, text: impl Into<String>);",
          "documentation": "Set the text content."
        },
        {
          "name": "::InputBarState::insert_char",
          "line": 171,
          "signature": "pub fn insert_char(&mut self, ch: char);",
          "documentation": "Insert a character at the cursor position."
        },
        {
          "name": "::InputBarState::delete_char_before",
          "line": 181,
          "signature": "pub fn delete_char_before(&mut self);",
          "documentation": "Delete the character before the cursor (backspace)."
        },
        {
          "name": "::InputBarState::move_cursor_left",
          "line": 195,
          "signature": "pub fn move_cursor_left(&mut self);",
          "documentation": "Move cursor left by one character."
        },
        {
          "name": "::InputBarState::move_cursor_right",
          "line": 206,
          "signature": "pub fn move_cursor_right(&mut self);",
          "documentation": "Move cursor right by one character."
        },
        {
          "name": "::InputBarState::history_prev",
          "line": 217,
          "signature": "pub fn history_prev(&mut self);",
          "documentation": "Navigate to the previous history entry."
        },
        {
          "name": "::InputBarState::history_next",
          "line": 233,
          "signature": "pub fn history_next(&mut self);",
          "documentation": "Navigate to the next history entry."
        },
        {
          "name": "::InputBarState::char_count",
          "line": 251,
          "signature": "#[must_use]\npub fn char_count(&self) -> usize;",
          "documentation": "Get the character count."
        },
        {
          "name": "::InputBarState::is_empty",
          "line": 257,
          "signature": "#[must_use]\npub fn is_empty(&self) -> bool;",
          "documentation": "Check if the input is empty."
        },
        {
          "name": "::InputBarState::clear",
          "line": 262,
          "signature": "pub fn clear(&mut self);",
          "documentation": "Clear the input."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/markdown.rs",
      "sha256": "67b7a19a9dc057a9fb24192e15baa49f14231b11c6b80ef7303b7fd4ca27b59b",
      "artifactSha256": "ac0b93af4b3bf3e4098dba96917d51694d19057a4305a30278aa3e07cbab57e0",
      "url": "/reference/source/harness-tui-kit/src/components/chat/markdown.rs.txt",
      "declarations": [
        {
          "name": "::MarkdownRenderer",
          "line": 44,
          "signature": "#[derive(Debug, Clone)]\npub struct MarkdownRenderer<'a> {\n\n}",
          "documentation": "Markdown renderer widget.\n\nParses markdown content and renders it with terminal-appropriate styling.\nThis is a stateless `Widget` \u2014 for scrollable markdown, wrap in a\n`ChatTimeline` or use a custom scroll container."
        },
        {
          "name": "::MarkdownRenderer<'a>::new",
          "line": 56,
          "signature": "#[must_use]\npub fn new(content: &'a str) -> Self;",
          "documentation": "Create a new markdown renderer with the given content."
        },
        {
          "name": "::MarkdownRenderer<'a>::theme",
          "line": 66,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        },
        {
          "name": "::MarkdownRenderer<'a>::wrap_width",
          "line": 73,
          "signature": "#[must_use]\npub fn wrap_width(mut self, width: usize) -> Self;",
          "documentation": "Set the maximum wrap width. If 0, uses the render area width."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/markdown_stream.rs",
      "sha256": "009c8004bee91b1ca4f22814199692dd00fb1519450da23d4507166edb241bf6",
      "artifactSha256": "3e323220213dcf82e3d572e5dcc74b92785abed0990c1eccdbfe17adeee65ea4",
      "url": "/reference/source/harness-tui-kit/src/components/chat/markdown_stream.rs.txt",
      "declarations": [
        {
          "name": "::MarkdownStreamCollector",
          "line": 63,
          "signature": "#[derive(Debug, Clone)]\npub struct MarkdownStreamCollector {\n\n}",
          "documentation": "Newline-gated accumulator for streaming markdown deltas.\n\nThe collector exposes two commit modes:\n\n- [`commit_complete_source`] returns only newly-committed source\n  between the last committed offset and the most recent newline.\n  Returns `None` when no new newline has arrived since the prior\n  commit.\n- [`finalize_and_drain_source`] returns whatever remains, ensuring\n  the result is newline-terminated and resetting the collector.\n\nThe renderer is expected to re-parse the entire accumulated source\neach time so incremental commits do not desynchronize block-level\nconstructs (lists, fenced code blocks, blockquotes) when later\ndeltas arrive. The collector itself is parser-agnostic \u2014 it holds\nraw bytes and offsets only."
        },
        {
          "name": "::MarkdownStreamCollector::new",
          "line": 75,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a collector with the default size cap (4 MiB) and no\nassociated working directory."
        },
        {
          "name": "::MarkdownStreamCollector::with_cwd",
          "line": 90,
          "signature": "#[must_use]\npub fn with_cwd(mut self, cwd: &Path) -> Self;",
          "documentation": "Attach a working directory used by markdown renderers to\nshorten absolute local paths in link displays. The collector\nitself does not parse markdown \u2014 the value is passed through to\nthe renderer alongside the committed source."
        },
        {
          "name": "::MarkdownStreamCollector::max_bytes",
          "line": 99,
          "signature": "#[must_use]\npub fn max_bytes(mut self, max_bytes: usize) -> Self;",
          "documentation": "Override the maximum number of bytes the collector will hold\nbefore refusing further deltas. Useful when wrapping a known-\nsmall adapter or stress-testing."
        },
        {
          "name": "::MarkdownStreamCollector::cwd",
          "line": 107,
          "signature": "#[must_use]\npub fn cwd(&self) -> Option<&Path>;",
          "documentation": "The working directory previously attached via [`with_cwd`], if\nany."
        },
        {
          "name": "::MarkdownStreamCollector::overflowed",
          "line": 115,
          "signature": "#[must_use]\npub fn overflowed(&self) -> bool;",
          "documentation": "True once the collector has refused at least one delta because\nthe buffer hit `max_bytes`. Callers can surface this as a\ntruncation marker in the rendered output."
        },
        {
          "name": "::MarkdownStreamCollector::push_delta",
          "line": 122,
          "signature": "pub fn push_delta(&mut self, delta: &str);",
          "documentation": "Append a streaming delta. Drops deltas that would exceed the\nconfigured size cap; the overflow flag is set so the caller can\nrender a truncation indicator. Empty deltas are a no-op."
        },
        {
          "name": "::MarkdownStreamCollector::commit_complete_source",
          "line": 137,
          "signature": "pub fn commit_complete_source(&mut self) -> Option<String>;",
          "documentation": "Return committed source between the last commit boundary and\nthe most recent newline in the buffer. Returns `None` when no\nnew newline has arrived. Repeated calls without further\n`push_delta` always return `None`."
        },
        {
          "name": "::MarkdownStreamCollector::full_source",
          "line": 151,
          "signature": "#[must_use]\npub fn full_source(&self) -> &str;",
          "documentation": "Return the entire accumulated buffer (committed + uncommitted)\nwithout consuming it. Useful for the renderer when it wants to\nre-parse the full source after a width change."
        },
        {
          "name": "::MarkdownStreamCollector::committed_source",
          "line": 157,
          "signature": "#[must_use]\npub fn committed_source(&self) -> &str;",
          "documentation": "Return only the source committed so far."
        },
        {
          "name": "::MarkdownStreamCollector::pending_source",
          "line": 164,
          "signature": "#[must_use]\npub fn pending_source(&self) -> &str;",
          "documentation": "Return the trailing slice that has not yet been committed\n(everything after the last newline)."
        },
        {
          "name": "::MarkdownStreamCollector::len",
          "line": 170,
          "signature": "#[must_use]\npub fn len(&self) -> usize;",
          "documentation": "Number of bytes buffered so far."
        },
        {
          "name": "::MarkdownStreamCollector::is_empty",
          "line": 176,
          "signature": "#[must_use]\npub fn is_empty(&self) -> bool;",
          "documentation": "True when the collector holds no buffered source."
        },
        {
          "name": "::MarkdownStreamCollector::finalize_and_drain_source",
          "line": 183,
          "signature": "pub fn finalize_and_drain_source(&mut self) -> String;",
          "documentation": "Drain whatever remains, ensuring the returned chunk ends with\n`\\n` so the markdown parser sees a well-terminated final block.\nResets the collector for reuse."
        },
        {
          "name": "::MarkdownStreamCollector::clear",
          "line": 198,
          "signature": "pub fn clear(&mut self);",
          "documentation": "Clear all buffered source and reset commit state. Preserves the\nconfigured `cwd` and `max_bytes`."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/mod.rs",
      "sha256": "6442d2143ec652d1b3a5d889e950f3c23002562aadb93b8a6dbadb2b1a1cc979",
      "artifactSha256": "2f11eb2f0cde5ae59949146c9b12da8d8daa6c8dd5be43006d3fa7b48fbf3ea1",
      "url": "/reference/source/harness-tui-kit/src/components/chat/mod.rs.txt",
      "declarations": [
        {
          "name": "pub use bubble::{ChatBubble, ChatBubbleState};",
          "line": 21,
          "signature": "pub use bubble::{ChatBubble, ChatBubbleState};",
          "documentation": ""
        },
        {
          "name": "pub use code_block::{CodeBlock, CodeBlockState};",
          "line": 22,
          "signature": "pub use code_block::{CodeBlock, CodeBlockState};",
          "documentation": ""
        },
        {
          "name": "pub use diff_view::{DiffView, DiffViewState};",
          "line": 23,
          "signature": "pub use diff_view::{DiffView, DiffViewState};",
          "documentation": ""
        },
        {
          "name": "pub use document_preview::{DocumentPreviewPane, DocumentPreviewState, PageStyle};",
          "line": 24,
          "signature": "pub use document_preview::{DocumentPreviewPane, DocumentPreviewState, PageStyle};",
          "documentation": ""
        },
        {
          "name": "pub use file_display::{FileDisplay, FileDisplayState};",
          "line": 25,
          "signature": "pub use file_display::{FileDisplay, FileDisplayState};",
          "documentation": ""
        },
        {
          "name": "pub use inline_diff_card::{ChangeKind, InlineDiffCard};",
          "line": 26,
          "signature": "pub use inline_diff_card::{ChangeKind, InlineDiffCard};",
          "documentation": ""
        },
        {
          "name": "pub use input::{InputBar, InputBarState};",
          "line": 27,
          "signature": "pub use input::{InputBar, InputBarState};",
          "documentation": ""
        },
        {
          "name": "pub use markdown::MarkdownRenderer;",
          "line": 28,
          "signature": "pub use markdown::MarkdownRenderer;",
          "documentation": ""
        },
        {
          "name": "pub use markdown_stream::MarkdownStreamCollector;",
          "line": 29,
          "signature": "pub use markdown_stream::MarkdownStreamCollector;",
          "documentation": ""
        },
        {
          "name": "pub use streaming::{StreamingText, StreamingTextState};",
          "line": 30,
          "signature": "pub use streaming::{StreamingText, StreamingTextState};",
          "documentation": ""
        },
        {
          "name": "pub use timeline::{ChatTimeline, ChatTimelineState};",
          "line": 31,
          "signature": "pub use timeline::{ChatTimeline, ChatTimelineState};",
          "documentation": ""
        },
        {
          "name": "pub use tool_call::{ToolCallDisplay, ToolCallState};",
          "line": 32,
          "signature": "pub use tool_call::{ToolCallDisplay, ToolCallState};",
          "documentation": ""
        },
        {
          "name": "pub use tool_call_card::{ToolCallCard, ToolCallCardStatus};",
          "line": 33,
          "signature": "pub use tool_call_card::{ToolCallCard, ToolCallCardStatus};",
          "documentation": ""
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/streaming.rs",
      "sha256": "6d5733bb6c4acce004ad40bae4f54ae2c42b55a833e9e1611f9cc2f2d7486472",
      "artifactSha256": "e8d242c332af2fbe3342b9be2728ca1289b8cab2653d75a679469a4f8c70942b",
      "url": "/reference/source/harness-tui-kit/src/components/chat/streaming.rs.txt",
      "declarations": [
        {
          "name": "::StreamingText",
          "line": 37,
          "signature": "#[derive(Debug, Clone)]\npub struct StreamingText<'a> {\n\n}",
          "documentation": "Character-by-character streaming text display.\n\nRenders text that has been revealed so far, with a blinking cursor at\nthe end of the revealed content. The application controls how many\ncharacters are revealed by calling methods on [`StreamingTextState`]."
        },
        {
          "name": "::StreamingText<'a>::new",
          "line": 49,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new streaming text widget."
        },
        {
          "name": "::StreamingText<'a>::theme",
          "line": 59,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        },
        {
          "name": "::StreamingText<'a>::show_cursor",
          "line": 66,
          "signature": "#[must_use]\npub fn show_cursor(mut self, show: bool) -> Self;",
          "documentation": "Set whether to show the blinking cursor."
        },
        {
          "name": "::StreamingText<'a>::tick",
          "line": 73,
          "signature": "#[must_use]\npub fn tick(mut self, tick: usize) -> Self;",
          "documentation": "Set the animation tick for cursor blink."
        },
        {
          "name": "::StreamingTextState",
          "line": 87,
          "signature": "#[derive(Debug, Clone)]\npub struct StreamingTextState {\n\n}",
          "documentation": "Mutable state for [`StreamingText`], persists across frames."
        },
        {
          "name": "::StreamingTextState::new",
          "line": 103,
          "signature": "#[must_use]\npub fn new(text: impl Into<String>) -> Self;",
          "documentation": "Create a new streaming text state with the given full text."
        },
        {
          "name": "::StreamingTextState::full_text",
          "line": 116,
          "signature": "#[must_use]\npub fn full_text(&self) -> &str;",
          "documentation": "Get the full text content."
        },
        {
          "name": "::StreamingTextState::revealed_text",
          "line": 122,
          "signature": "#[must_use]\npub fn revealed_text(&self) -> &str;",
          "documentation": "Get the currently revealed portion of the text."
        },
        {
          "name": "::StreamingTextState::reveal",
          "line": 145,
          "signature": "pub fn reveal(&mut self, n: usize);",
          "documentation": "Reveal the next `n` characters."
        },
        {
          "name": "::StreamingTextState::reveal_all",
          "line": 154,
          "signature": "pub fn reveal_all(&mut self);",
          "documentation": "Reveal all remaining characters instantly."
        },
        {
          "name": "::StreamingTextState::append",
          "line": 160,
          "signature": "pub fn append(&mut self, text: &str);",
          "documentation": "Append additional text to the stream."
        },
        {
          "name": "::StreamingTextState::pause",
          "line": 166,
          "signature": "pub fn pause(&mut self);",
          "documentation": "Pause the streaming reveal."
        },
        {
          "name": "::StreamingTextState::resume",
          "line": 171,
          "signature": "pub fn resume(&mut self);",
          "documentation": "Resume the streaming reveal."
        },
        {
          "name": "::StreamingTextState::is_paused",
          "line": 177,
          "signature": "#[must_use]\npub fn is_paused(&self) -> bool;",
          "documentation": "Check if streaming is paused."
        },
        {
          "name": "::StreamingTextState::is_completed",
          "line": 183,
          "signature": "#[must_use]\npub fn is_completed(&self) -> bool;",
          "documentation": "Check if streaming has completed."
        },
        {
          "name": "::StreamingTextState::revealed_count",
          "line": 189,
          "signature": "#[must_use]\npub fn revealed_count(&self) -> usize;",
          "documentation": "Get the number of revealed characters."
        },
        {
          "name": "::StreamingTextState::total_count",
          "line": 195,
          "signature": "#[must_use]\npub fn total_count(&self) -> usize;",
          "documentation": "Get the total number of characters."
        },
        {
          "name": "::StreamingTextState::scroll_up",
          "line": 200,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll up."
        },
        {
          "name": "::StreamingTextState::scroll_down",
          "line": 205,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll down."
        },
        {
          "name": "::StreamingTextState::reset",
          "line": 210,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset to initial state."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/timeline.rs",
      "sha256": "4e3001a90967ecc471c04755ef88e5cb0ea6f094eb6985648873c18746dcbe8d",
      "artifactSha256": "e26a2a22a521e9ce7ddedfb0f67a55a1f2c23407f3e6aaddf1717d42a5e5bc3c",
      "url": "/reference/source/harness-tui-kit/src/components/chat/timeline.rs.txt",
      "declarations": [
        {
          "name": "::ChatTimeline",
          "line": 43,
          "signature": "#[derive(Debug, Clone)]\npub struct ChatTimeline<'a> {\n\n}",
          "documentation": "Scrollable conversation timeline.\n\nRenders a vertical list of [`ChatBubble`] instances with automatic scrolling,\nmessage grouping by role, and virtual scrolling for large conversation histories."
        },
        {
          "name": "::ChatTimeline<'a>::new",
          "line": 53,
          "signature": "#[must_use]\npub fn new(messages: &'a [ChatMessage]) -> Self;",
          "documentation": "Create a new timeline with the given messages."
        },
        {
          "name": "::ChatTimeline<'a>::theme",
          "line": 62,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        },
        {
          "name": "::ChatTimelineState",
          "line": 81,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct ChatTimelineState {\n\n}",
          "documentation": "Mutable state for [`ChatTimeline`], persists across frames."
        },
        {
          "name": "::ChatTimelineState::new",
          "line": 97,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new empty timeline state with auto-scroll enabled."
        },
        {
          "name": "::ChatTimelineState::messages",
          "line": 106,
          "signature": "#[must_use]\npub fn messages(&self) -> &[ChatMessage];",
          "documentation": "Get a reference to all messages."
        },
        {
          "name": "::ChatTimelineState::message_count",
          "line": 112,
          "signature": "#[must_use]\npub fn message_count(&self) -> usize;",
          "documentation": "Get the number of messages."
        },
        {
          "name": "::ChatTimelineState::push_message",
          "line": 119,
          "signature": "pub fn push_message(&mut self, message: ChatMessage);",
          "documentation": "Push a new message to the timeline.\n\nIf auto-scroll is enabled, scrolls to show the new message."
        },
        {
          "name": "::ChatTimelineState::update_streaming",
          "line": 128,
          "signature": "pub fn update_streaming(&mut self, delta: &str);",
          "documentation": "Update the content of the last message (for streaming updates)."
        },
        {
          "name": "::ChatTimelineState::scroll_up",
          "line": 138,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll up by one message."
        },
        {
          "name": "::ChatTimelineState::scroll_down",
          "line": 146,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll down by one message."
        },
        {
          "name": "::ChatTimelineState::scroll_to_bottom",
          "line": 157,
          "signature": "pub fn scroll_to_bottom(&mut self);",
          "documentation": "Scroll to the bottom of the timeline."
        },
        {
          "name": "::ChatTimelineState::scroll_to_top",
          "line": 163,
          "signature": "pub fn scroll_to_top(&mut self);",
          "documentation": "Scroll to the top of the timeline."
        },
        {
          "name": "::ChatTimelineState::select",
          "line": 169,
          "signature": "pub fn select(&mut self, index: usize);",
          "documentation": "Select the message at the given index."
        },
        {
          "name": "::ChatTimelineState::deselect",
          "line": 185,
          "signature": "pub fn deselect(&mut self);",
          "documentation": "Clear the selection."
        },
        {
          "name": "::ChatTimelineState::is_auto_scroll",
          "line": 195,
          "signature": "#[must_use]\npub fn is_auto_scroll(&self) -> bool;",
          "documentation": "Check if auto-scroll is enabled."
        },
        {
          "name": "::ChatTimelineState::clear",
          "line": 200,
          "signature": "pub fn clear(&mut self);",
          "documentation": "Clear all messages."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/tool_call.rs",
      "sha256": "7e9d696ce1310707f2a208c6663b9a659b64c78f3158c629ea86f9250019358a",
      "artifactSha256": "65a595239339c5764c30c3a5cd5e2d1ebd0ba1842e4b0c1aa203512463c835a2",
      "url": "/reference/source/harness-tui-kit/src/components/chat/tool_call.rs.txt",
      "declarations": [
        {
          "name": "::ToolCallDisplay",
          "line": 45,
          "signature": "#[derive(Debug, Clone)]\npub struct ToolCallDisplay<'a> {\n\n}",
          "documentation": "Expandable tool invocation card.\n\nShows the tool name and status in a compact header. When expanded,\nshows the arguments and output sections."
        },
        {
          "name": "::ToolCallDisplay<'a>::new",
          "line": 55,
          "signature": "#[must_use]\npub fn new(info: &'a ToolCallInfo) -> Self;",
          "documentation": "Create a new tool call display."
        },
        {
          "name": "::ToolCallDisplay<'a>::theme",
          "line": 64,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        },
        {
          "name": "::ToolCallState",
          "line": 72,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct ToolCallState {\n/// Whether the arguments section is expanded.\n\npub args_expanded: bool,\n/// Whether the output section is expanded.\n\npub output_expanded: bool\n}",
          "documentation": "Mutable state for [`ToolCallDisplay`], persists across frames."
        },
        {
          "name": "::ToolCallState::toggle_args",
          "line": 81,
          "signature": "pub fn toggle_args(&mut self);",
          "documentation": "Toggle the arguments section."
        },
        {
          "name": "::ToolCallState::toggle_output",
          "line": 86,
          "signature": "pub fn toggle_output(&mut self);",
          "documentation": "Toggle the output section."
        },
        {
          "name": "::ToolCallState::reset",
          "line": 91,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset to default (collapsed) state."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/chat/tool_call_card.rs",
      "sha256": "692381ec3e76b378f4708426476f5a817a6ff925edb191412814346f2612329b",
      "artifactSha256": "f9ce2fef1c2c2e59594a74d749eccfe89451930112d60fef2ebe41c5bd6606f2",
      "url": "/reference/source/harness-tui-kit/src/components/chat/tool_call_card.rs.txt",
      "declarations": [
        {
          "name": "::ToolCallCardStatus",
          "line": 32,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]\npub enum ToolCallCardStatus {\n    /// Queued but not yet executing.\n    #[default]\n    Pending,\n    /// Currently executing.\n    Running,\n    /// Finished successfully.\n    Success,\n    /// Finished with an error.\n    Failure,\n}",
          "documentation": "Status of a tool call. Drives the leading glyph and accent color."
        },
        {
          "name": "::ToolCallCard",
          "line": 62,
          "signature": "#[derive(Debug, Clone)]\npub struct ToolCallCard<'a> {\n\n}",
          "documentation": "Compact tool-call card."
        },
        {
          "name": "::ToolCallCard<'a>::new",
          "line": 79,
          "signature": "#[must_use]\npub fn new(name: &'a str) -> Self;",
          "documentation": "Build a card. `name` is the tool's user-visible label\n(e.g. `\"ran command\"`, `\"reading file\"`)."
        },
        {
          "name": "::ToolCallCard<'a>::theme",
          "line": 94,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::ToolCallCard<'a>::status",
          "line": 101,
          "signature": "#[must_use]\npub fn status(mut self, status: ToolCallCardStatus) -> Self;",
          "documentation": "Set the tool-call status."
        },
        {
          "name": "::ToolCallCard<'a>::tick",
          "line": 109,
          "signature": "#[must_use]\npub fn tick(mut self, tick: u8) -> Self;",
          "documentation": "Spinner tick for `Running`. Pass a monotonically-increasing\ncounter so the spinner phase advances each frame."
        },
        {
          "name": "::ToolCallCard<'a>::summary",
          "line": 117,
          "signature": "#[must_use]\npub fn summary(mut self, summary: &'a str) -> Self;",
          "documentation": "One-line summary rendered next to the tool name (e.g. the\ncommand being run, the file being read)."
        },
        {
          "name": "::ToolCallCard<'a>::detail",
          "line": 125,
          "signature": "#[must_use]\npub fn detail(mut self, detail: &'a str) -> Self;",
          "documentation": "Indented detail row shown under the summary (e.g. file path,\nargument list). Pass `\"\"` to omit."
        },
        {
          "name": "::ToolCallCard<'a>::result",
          "line": 133,
          "signature": "#[must_use]\npub fn result(mut self, result: &'a str) -> Self;",
          "documentation": "Indented result row shown after detail (e.g. tool output\nsnippet). Pass `\"\"` to omit."
        },
        {
          "name": "::ToolCallCard<'a>::elapsed",
          "line": 140,
          "signature": "#[must_use]\npub fn elapsed(mut self, label: &'a str) -> Self;",
          "documentation": "Right-aligned elapsed-time label (e.g. `\"0.32s\"`)."
        },
        {
          "name": "::ToolCallCard<'a>::measured_height",
          "line": 148,
          "signature": "#[must_use]\npub fn measured_height(&self) -> u16;",
          "documentation": "Estimated rendered height: header + (detail ? 1 : 0) +\n(result ? 1 : 0)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/governance/constitution_view.rs",
      "sha256": "e67728314762521a85f94c8ee1a04adf0e4c32d7e22dc25dce3be4f11218688a",
      "artifactSha256": "456fbee844ddc014cd42bcbf1f054484e4657460403ca89a25383b450eff3405",
      "url": "/reference/source/harness-tui-kit/src/components/governance/constitution_view.rs.txt",
      "declarations": [
        {
          "name": "::ConstitutionView",
          "line": 72,
          "signature": "#[derive(Debug, Clone)]\npub struct ConstitutionView<'a> {\n\n}",
          "documentation": "Scrollable constitution text viewer with YAML-like syntax highlighting.\n\nRenders a text document with:\n- **Line numbers** in a muted gutter on the left.\n- **YAML-like highlighting**: lines where a word is followed by `:` get the\n  key rendered in accent color and the value in primary color. Lines starting\n  with `#` are rendered entirely in muted color as comments.\n- **Scrollable** via [`ConstitutionViewState`].\n- **Section navigation** via optional named sections with line offsets.\n\nAll text is sanitized before rendering to prevent terminal escape injection.\n\n# Examples\n\n```\nuse harness_tui_kit::components::governance::constitution_view::{ConstitutionView, ConstitutionViewState};\nuse harness_tui_kit::Theme;\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet text = \"name: Example\\npurpose: Testing\";\nlet mut state = ConstitutionViewState::default();\nlet area = Rect::new(0, 0, 50, 8);\nlet mut buf = Buffer::empty(area);\nConstitutionView::new(text).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::ConstitutionView<'a>::new",
          "line": 86,
          "signature": "#[must_use]\npub fn new(text: &'a str) -> Self;",
          "documentation": "Create a new constitution view with the given text.\n\nThe text is considered untrusted and will be sanitized before rendering."
        },
        {
          "name": "::ConstitutionView<'a>::theme",
          "line": 96,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme used for all color tokens."
        },
        {
          "name": "::ConstitutionView<'a>::sections",
          "line": 106,
          "signature": "#[must_use]\npub fn sections(mut self, sections: &'a [(&'a str, usize)]) -> Self;",
          "documentation": "Set named sections with their starting line offsets (0-indexed).\n\nSections are used for jump navigation via [`ConstitutionViewState::jump_to_section`].\nThe section name may appear in a header when the section is active."
        },
        {
          "name": "::ConstitutionViewState",
          "line": 116,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct ConstitutionViewState {\n\n}",
          "documentation": "Mutable state for [`ConstitutionView`], persisted across frames.\n\nTracks scroll offset and selected section index for jump navigation."
        },
        {
          "name": "::ConstitutionViewState::scroll_up",
          "line": 125,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll up by one source line, clamping at zero."
        },
        {
          "name": "::ConstitutionViewState::scroll_down",
          "line": 133,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll down by one source line.\n\nThe render pass clamps `scroll_offset` to the last line, so this will\nnever scroll past the end of the document."
        },
        {
          "name": "::ConstitutionViewState::jump_to_section",
          "line": 140,
          "signature": "pub fn jump_to_section(&mut self, index: usize, sections: &[(&str, usize)]);",
          "documentation": "Jump to a named section by index, scrolling to its line offset.\n\nIf `index` is out of range for the provided sections slice, this is a no-op."
        },
        {
          "name": "::ConstitutionViewState::next_section",
          "line": 150,
          "signature": "pub fn next_section(&mut self, sections: &[(&str, usize)]);",
          "documentation": "Move to the next section, wrapping around if at the end.\n\nIf no sections are provided or the list is empty, this is a no-op."
        },
        {
          "name": "::ConstitutionViewState::prev_section",
          "line": 165,
          "signature": "pub fn prev_section(&mut self, sections: &[(&str, usize)]);",
          "documentation": "Move to the previous section, wrapping around if at the beginning.\n\nIf no sections are provided or the list is empty, this is a no-op."
        },
        {
          "name": "::ConstitutionViewState::scroll_offset",
          "line": 179,
          "signature": "#[must_use]\npub fn scroll_offset(&self) -> usize;",
          "documentation": "Return the current scroll offset."
        },
        {
          "name": "::ConstitutionViewState::selected_section",
          "line": 185,
          "signature": "#[must_use]\npub fn selected_section(&self) -> usize;",
          "documentation": "Return the currently selected section index."
        },
        {
          "name": "::ConstitutionViewState::reset",
          "line": 190,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset the state to defaults (scroll = 0, section = 0)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/governance/mod.rs",
      "sha256": "c743cfc78e106f927f034cbbb6f918b0147ec07282a8a885e4b4b43b327b32d0",
      "artifactSha256": "71218119257ed429a9a9341d19e6ee8ca0730b5d93cc9e7bed8be0a5a71d23d4",
      "url": "/reference/source/harness-tui-kit/src/components/governance/mod.rs.txt",
      "declarations": [
        {
          "name": "constitution_view",
          "line": 5,
          "signature": "pub mod constitution_view;",
          "documentation": "Governance components.\n\nComponents for proposals, voting, treasury display, and constitution viewing."
        },
        {
          "name": "proposal_card",
          "line": 6,
          "signature": "pub mod proposal_card;",
          "documentation": ""
        },
        {
          "name": "treasury_display",
          "line": 7,
          "signature": "pub mod treasury_display;",
          "documentation": ""
        },
        {
          "name": "voting_panel",
          "line": 8,
          "signature": "pub mod voting_panel;",
          "documentation": ""
        },
        {
          "name": "pub use constitution_view::{ConstitutionView, ConstitutionViewState};",
          "line": 10,
          "signature": "pub use constitution_view::{ConstitutionView, ConstitutionViewState};",
          "documentation": ""
        },
        {
          "name": "pub use proposal_card::{ProposalCard, ProposalCardState};",
          "line": 11,
          "signature": "pub use proposal_card::{ProposalCard, ProposalCardState};",
          "documentation": ""
        },
        {
          "name": "pub use treasury_display::TreasuryDisplay;",
          "line": 12,
          "signature": "pub use treasury_display::TreasuryDisplay;",
          "documentation": ""
        },
        {
          "name": "pub use voting_panel::{VotingPanel, VotingPanelState};",
          "line": 13,
          "signature": "pub use voting_panel::{VotingPanel, VotingPanelState};",
          "documentation": ""
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/governance/proposal_card.rs",
      "sha256": "2637584cf9a7d69cd183e670f08e1190d3a37d01828959acad788175eb2bf4dc",
      "artifactSha256": "1f8354ba3c70cf4485bde3d85b2184d9cce07fdd68d878837e550ae6340ce84a",
      "url": "/reference/source/harness-tui-kit/src/components/governance/proposal_card.rs.txt",
      "declarations": [
        {
          "name": "::ProposalCard",
          "line": 65,
          "signature": "#[derive(Debug, Clone)]\npub struct ProposalCard<'a> {\n\n}",
          "documentation": "Governance proposal card.\n\nDisplays a [`ProposalInfo`] including title, kind badge, status badge,\nvote tally bar, quorum progress, deadline, and creator. In compact mode,\nonly the title and status are shown on a single line. In expanded mode\n(toggled via [`ProposalCardState`]), all details are visible.\n\nThis is a [`StatefulWidget`] that renders against [`ProposalCardState`].\n\n# Examples\n\n```\nuse harness_tui_kit::{ProposalCard, ProposalCardState, ProposalInfo, ProposalKind, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet proposal = ProposalInfo::new(\"p-1\", \"Budget Increase\", ProposalKind::Treasury);\nlet mut state = ProposalCardState::default();\nlet area = Rect::new(0, 0, 50, 1);\nlet mut buf = Buffer::empty(area);\nProposalCard::new(&proposal).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::ProposalCard<'a>::new",
          "line": 88,
          "signature": "#[must_use]\npub fn new(proposal: &'a ProposalInfo) -> Self;",
          "documentation": "Create a new proposal card for the given proposal.\n\nDefaults to the standard dark theme with compact mode off.\n\n# Examples\n\n```\nuse harness_tui_kit::{ProposalCard, ProposalInfo, ProposalKind};\n\nlet proposal = ProposalInfo::new(\"p-1\", \"Test\", ProposalKind::General);\nlet card = ProposalCard::new(&proposal);\n```"
        },
        {
          "name": "::ProposalCard<'a>::theme",
          "line": 108,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme.\n\n# Examples\n\n```\nuse harness_tui_kit::{ProposalCard, ProposalInfo, ProposalKind, Theme};\n\nlet proposal = ProposalInfo::new(\"p-1\", \"Test\", ProposalKind::General);\nlet theme = Theme::midnight();\nlet card = ProposalCard::new(&proposal).theme(&theme);\n```"
        },
        {
          "name": "::ProposalCard<'a>::compact",
          "line": 127,
          "signature": "#[must_use]\npub fn compact(mut self, compact: bool) -> Self;",
          "documentation": "Force compact (single-line) rendering regardless of expand state.\n\nWhen `true`, the card always renders in a single line even if\n[`ProposalCardState::expanded`] is `true`.\n\n# Examples\n\n```\nuse harness_tui_kit::{ProposalCard, ProposalInfo, ProposalKind};\n\nlet proposal = ProposalInfo::new(\"p-1\", \"Test\", ProposalKind::General);\nlet card = ProposalCard::new(&proposal).compact(true);\n```"
        },
        {
          "name": "::ProposalCardState",
          "line": 149,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct ProposalCardState {\n\n}",
          "documentation": "Mutable state for [`ProposalCard`], persisted across frames.\n\nTracks whether the card is in expanded or compact display mode.\n\n# Examples\n\n```\nuse harness_tui_kit::ProposalCardState;\n\nlet mut state = ProposalCardState::default();\nassert!(!state.is_expanded());\n\nstate.toggle_expand();\nassert!(state.is_expanded());\n```"
        },
        {
          "name": "::ProposalCardState::toggle_expand",
          "line": 156,
          "signature": "pub fn toggle_expand(&mut self);",
          "documentation": "Toggle between expanded and compact mode."
        },
        {
          "name": "::ProposalCardState::is_expanded",
          "line": 162,
          "signature": "#[must_use]\npub fn is_expanded(&self) -> bool;",
          "documentation": "Returns `true` if the card is in expanded mode."
        },
        {
          "name": "::ProposalCardState::reset",
          "line": 167,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset to default (compact) state."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/governance/treasury_display.rs",
      "sha256": "4d79417bb4cfc318b43565c25938677284b41f4c333adb100b6859151a565132",
      "artifactSha256": "8b81a07bc8aa01f60703aaefc2c5f112dfabb4e42376bef6f36ecbd840275656",
      "url": "/reference/source/harness-tui-kit/src/components/governance/treasury_display.rs.txt",
      "declarations": [
        {
          "name": "::TreasuryDisplay",
          "line": 73,
          "signature": "#[derive(Debug, Clone)]\npub struct TreasuryDisplay<'a> {\n\n}",
          "documentation": "Displays treasury balance, recent transactions, and daily spend progress.\n\nThe component renders four sections vertically:\n- **Row 0**: Balance in bold accent with commas as thousands separators.\n- **Row 1**: Currency code and chain label in muted text.\n- **Rows 2..N**: Recent transactions with direction arrows, amount, and description.\n- **Last row**: Daily spend progress bar showing `daily_spent_cents / daily_limit_cents`.\n\n# Examples\n\n```\nuse harness_tui_kit::{TreasuryDisplay, TreasuryInfo, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::Widget;\n\nlet info = TreasuryInfo::new(500_00, \"USD\", \"Solana\");\nlet area = Rect::new(0, 0, 40, 6);\nlet mut buf = Buffer::empty(area);\nTreasuryDisplay::new(&info).render(area, &mut buf);\n```"
        },
        {
          "name": "::TreasuryDisplay<'a>::new",
          "line": 85,
          "signature": "#[must_use]\npub fn new(treasury: &'a TreasuryInfo) -> Self;",
          "documentation": "Create a new treasury display for the given treasury info."
        },
        {
          "name": "::TreasuryDisplay<'a>::theme",
          "line": 95,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme used for all color tokens."
        },
        {
          "name": "::TreasuryDisplay<'a>::max_transactions",
          "line": 105,
          "signature": "#[must_use]\npub fn max_transactions(mut self, max: usize) -> Self;",
          "documentation": "Set the maximum number of recent transactions to display.\n\nDefaults to 5. If the treasury has fewer transactions than this limit,\nall transactions are shown."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/governance/voting_panel.rs",
      "sha256": "ae2c8c3e8eb9b5d5be0d54e9d43737a08667c43d5a2f5926134db6bb1ff0fe7f",
      "artifactSha256": "bda3f5005fdee2757e54574e81993619fad7f5f841a3abdf3c42674d9fb3dc78",
      "url": "/reference/source/harness-tui-kit/src/components/governance/voting_panel.rs.txt",
      "declarations": [
        {
          "name": "::VotingPanel",
          "line": 86,
          "signature": "#[derive(Debug, Clone)]\npub struct VotingPanel<'a> {\n\n}",
          "documentation": "Governance voting panel.\n\nDisplays current vote tallies with percentages, three selectable vote\noptions with keyboard hints, the user's current vote (if any), and a\nquorum progress bar. Selection navigation is tracked by [`VotingPanelState`].\n\nThis is a [`StatefulWidget`] that renders against [`VotingPanelState`].\n\n# Examples\n\n```\nuse harness_tui_kit::{VotingPanel, VotingPanelState, ProposalInfo, ProposalKind};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet proposal = ProposalInfo::new(\"p-1\", \"Test\", ProposalKind::General);\nlet mut state = VotingPanelState::default();\nlet area = Rect::new(0, 0, 40, 7);\nlet mut buf = Buffer::empty(area);\nVotingPanel::new(&proposal).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::VotingPanel<'a>::new",
          "line": 109,
          "signature": "#[must_use]\npub fn new(proposal: &'a ProposalInfo) -> Self;",
          "documentation": "Create a new voting panel for the given proposal.\n\nDefaults to the standard dark theme with no current vote.\n\n# Examples\n\n```\nuse harness_tui_kit::{VotingPanel, ProposalInfo, ProposalKind};\n\nlet proposal = ProposalInfo::new(\"p-1\", \"Test\", ProposalKind::General);\nlet panel = VotingPanel::new(&proposal);\n```"
        },
        {
          "name": "::VotingPanel<'a>::theme",
          "line": 129,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme.\n\n# Examples\n\n```\nuse harness_tui_kit::{VotingPanel, ProposalInfo, ProposalKind, Theme};\n\nlet proposal = ProposalInfo::new(\"p-1\", \"Test\", ProposalKind::General);\nlet theme = Theme::midnight();\nlet panel = VotingPanel::new(&proposal).theme(&theme);\n```"
        },
        {
          "name": "::VotingPanel<'a>::current_vote",
          "line": 145,
          "signature": "#[must_use]\npub fn current_vote(mut self, vote: Option<VoteChoice>) -> Self;",
          "documentation": "Set the user's current vote, shown with a checkmark indicator.\n\n# Examples\n\n```\nuse harness_tui_kit::{VotingPanel, ProposalInfo, ProposalKind, VoteChoice};\n\nlet proposal = ProposalInfo::new(\"p-1\", \"Test\", ProposalKind::General);\nlet panel = VotingPanel::new(&proposal).current_vote(Some(VoteChoice::Yes));\n```"
        },
        {
          "name": "::VotingPanelState",
          "line": 167,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct VotingPanelState {\n\n}",
          "documentation": "Mutable state for [`VotingPanel`], persisted across frames.\n\nTracks which vote option is currently selected (highlighted).\n\n# Examples\n\n```\nuse harness_tui_kit::VotingPanelState;\n\nlet mut state = VotingPanelState::default();\nassert_eq!(state.selected_index(), 0);\n\nstate.select_next();\nassert_eq!(state.selected_index(), 1);\n```"
        },
        {
          "name": "::VotingPanelState::select_next",
          "line": 174,
          "signature": "pub fn select_next(&mut self);",
          "documentation": "Move selection to the next option, wrapping around."
        },
        {
          "name": "::VotingPanelState::select_prev",
          "line": 179,
          "signature": "pub fn select_prev(&mut self);",
          "documentation": "Move selection to the previous option, wrapping around."
        },
        {
          "name": "::VotingPanelState::confirm",
          "line": 192,
          "signature": "#[must_use]\npub fn confirm(&self) -> Option<VoteChoice>;",
          "documentation": "Confirm the current selection and return the corresponding [`VoteChoice`].\n\nReturns [`None`] if the selected index is somehow out of bounds\n(should not happen in normal usage)."
        },
        {
          "name": "::VotingPanelState::selected_index",
          "line": 198,
          "signature": "#[must_use]\npub fn selected_index(&self) -> usize;",
          "documentation": "Return the currently selected index (0=Yes, 1=No, 2=Abstain)."
        },
        {
          "name": "::VotingPanelState::reset",
          "line": 203,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset to default state (first option selected)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/harness/attribution_table.rs",
      "sha256": "0d61477f240ba987763c7f2aee21685a315d79b869bf9df57abd239b898732ca",
      "artifactSha256": "f8e528fe7e89534d1264763de91a2ab408679ed8ac52a92d7241dbc0f02dabb6",
      "url": "/reference/source/harness-tui-kit/src/components/harness/attribution_table.rs.txt",
      "declarations": [
        {
          "name": "::AttributionTaskOutcomeBadge",
          "line": 20,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum AttributionTaskOutcomeBadge {\n    /// Task passed.\n    Pass,\n    /// Task failed.\n    Fail,\n    /// Task did not run.\n    NotRun,\n}",
          "documentation": "Lightweight outcome badge mirroring `harness_sdk::TaskOutcome`.\nThe kit defines its own enum so it has no SDK build dependency;\nthe SDK consumer maps from the typed enum."
        },
        {
          "name": "::AttributionTableRow",
          "line": 52,
          "signature": "#[derive(Debug, Clone)]\npub struct AttributionTableRow {\n/// Task name.\n\npub task: String,\n/// Outcome before the iteration's edits.\n\npub before: AttributionTaskOutcomeBadge,\n/// Outcome after the iteration's edits.\n\npub after: AttributionTaskOutcomeBadge\n}",
          "documentation": "One row of the attribution table.\n\nSDK consumers populate one of these from each\n`harness_sdk::TaskDelta`."
        },
        {
          "name": "::AttributionTableRow::is_fix",
          "line": 64,
          "signature": "#[must_use]\npub fn is_fix(&self) -> bool;",
          "documentation": "True when this row represents a fix (Fail \u2192 Pass)."
        },
        {
          "name": "::AttributionTableRow::is_regression",
          "line": 71,
          "signature": "#[must_use]\npub fn is_regression(&self) -> bool;",
          "documentation": "True when this row represents a regression (Pass \u2192 Fail)."
        },
        {
          "name": "::AttributionTable",
          "line": 79,
          "signature": "#[derive(Debug, Clone)]\npub struct AttributionTable<'a> {\n\n}",
          "documentation": "Widget rendering a list of [`AttributionTableRow`]s."
        },
        {
          "name": "::AttributionTable<'a>::new",
          "line": 89,
          "signature": "#[must_use]\npub fn new(rows: &'a [AttributionTableRow]) -> Self;",
          "documentation": "Construct a new table."
        },
        {
          "name": "::AttributionTable<'a>::theme",
          "line": 100,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::AttributionTable<'a>::title",
          "line": 107,
          "signature": "#[must_use]\npub fn title(mut self, title: &'a str) -> Self;",
          "documentation": "Override the panel title."
        },
        {
          "name": "::AttributionTable<'a>::no_border",
          "line": 115,
          "signature": "#[must_use]\npub fn no_border(mut self) -> Self;",
          "documentation": "Disable the border block \u2014 useful when embedding in another\ncontainer."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/harness/component_tree.rs",
      "sha256": "c2ab4ba26ebc1b7d59aeda6453043ee9a89ba8e83056d01d0018295ed572a489",
      "artifactSha256": "c96e65830b3956bf45e610fa71150f01a0fea695f62f21f6e5edb831b6bd7a49",
      "url": "/reference/source/harness-tui-kit/src/components/harness/component_tree.rs.txt",
      "declarations": [
        {
          "name": "::HarnessComponentStatus",
          "line": 17,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum HarnessComponentStatus {\n    /// Editable + currently in sync with the last commit.\n    Clean,\n    /// Editable + has uncommitted edits in the current iteration.\n    Dirty,\n    /// Read-only \u2014 the runtime owns it (e.g. `ShortTermMemory`).\n    ReadOnly,\n}",
          "documentation": "Status of one harness component (mirrors the AHE evolve loop's\nview of the workspace \u2014 dirty / clean / read-only)."
        },
        {
          "name": "::HarnessComponentRow",
          "line": 38,
          "signature": "#[derive(Debug, Clone)]\npub struct HarnessComponentRow {\n/// Stable id (e.g. `\"system_prompt\"`). The SDK consumer sets\n\n/// this from `HarnessComponentKind::as_key()`.\n\npub id: String,\n/// Human-readable label (e.g. `\"system prompt\"`).\n\npub label: String,\n/// Mount path relative to the workspace root.\n\npub mount: String,\n/// Status badge.\n\npub status: HarnessComponentStatus,\n/// Number of edits applied to this component in the current\n\n/// iteration. Rendered as `+N` next to the label.\n\npub edit_count: u32\n}",
          "documentation": "One row in the [`HarnessComponentTree`]."
        },
        {
          "name": "::HarnessComponentTreeState",
          "line": 55,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct HarnessComponentTreeState {\n\n}",
          "documentation": "Persistent state for [`HarnessComponentTree`] (focused row)."
        },
        {
          "name": "::HarnessComponentTreeState::selected",
          "line": 62,
          "signature": "#[must_use]\npub fn selected(&self) -> usize;",
          "documentation": "Currently-focused index."
        },
        {
          "name": "::HarnessComponentTreeState::move_down",
          "line": 67,
          "signature": "pub fn move_down(&mut self, len: usize);",
          "documentation": "Move focus down by one row, clamped to `len - 1`."
        },
        {
          "name": "::HarnessComponentTreeState::move_up",
          "line": 76,
          "signature": "pub fn move_up(&mut self);",
          "documentation": "Move focus up by one row."
        },
        {
          "name": "::HarnessComponentTreeState::reset",
          "line": 81,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset focus to the first row."
        },
        {
          "name": "::HarnessComponentTree",
          "line": 88,
          "signature": "#[derive(Debug, Clone)]\npub struct HarnessComponentTree<'a> {\n\n}",
          "documentation": "Vertical list of harness components with focus + status."
        },
        {
          "name": "::HarnessComponentTree<'a>::new",
          "line": 97,
          "signature": "#[must_use]\npub fn new(rows: &'a [HarnessComponentRow]) -> Self;",
          "documentation": "Build a new tree over `rows`."
        },
        {
          "name": "::HarnessComponentTree<'a>::theme",
          "line": 107,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::HarnessComponentTree<'a>::title",
          "line": 114,
          "signature": "#[must_use]\npub fn title(mut self, title: &'a str) -> Self;",
          "documentation": "Override the panel title (default: `\"Harness\"`)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/harness/manifest_view.rs",
      "sha256": "b039f74e639e62bcb39a695e5f22a7bd77cc9036c39a02479419136a23a422f0",
      "artifactSha256": "2e6c4191c580007d62d1c4108d38c34e64582f4a7baedc8d9f7152b030a2b9e8",
      "url": "/reference/source/harness-tui-kit/src/components/harness/manifest_view.rs.txt",
      "declarations": [
        {
          "name": "::ManifestVerdictBadge",
          "line": 19,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum ManifestVerdictBadge {\n    /// Edit not yet evaluated (this iteration's fresh manifest).\n    Pending,\n    /// `AttributionDecision::Confirmed`.\n    Confirmed,\n    /// `AttributionDecision::PartiallyConfirmed`.\n    PartiallyConfirmed,\n    /// `AttributionDecision::Refuted`.\n    Refuted,\n    /// `AttributionDecision::UnfalsifiableContract`.\n    UnfalsifiableContract,\n}",
          "documentation": "Verdict badge mirroring `harness_sdk::AttributionDecision`.\nThe kit defines its own enum so it has zero AHE / SDK build\ndependency; the SDK consumer maps from the typed enum."
        },
        {
          "name": "::ManifestEntryView",
          "line": 81,
          "signature": "#[derive(Debug, Clone)]\npub struct ManifestEntryView {\n/// Entry id (uuid-as-string).\n\npub id: String,\n/// One-line summary of the targeted fix.\n\npub targeted_fix: String,\n/// Diagnosed root cause.\n\npub root_cause: String,\n/// Free-form list of failure evidence items.\n\npub failure_evidence: Vec<String>,\n/// Tasks the contract claims will be fixed.\n\npub expected_fixes: Vec<String>,\n/// Tasks the contract flags as at-risk for regression.\n\npub at_risk_regressions: Vec<String>,\n/// Verdict badge.\n\npub verdict: ManifestVerdictBadge,\n/// Component label (e.g. `\"system prompt\"`) the edit targets.\n\npub component_label: String,\n/// Path the edit touched.\n\npub edit_path: String\n}",
          "documentation": "Lightweight manifest entry view.\n\nSDK consumers construct one of these from a\n`harness_sdk::ManifestEntry` + the corresponding\n`AttributionVerdict` (or `ManifestVerdictBadge::Pending` if the\nedit hasn't been scored yet)."
        },
        {
          "name": "::ChangeManifestView",
          "line": 104,
          "signature": "#[derive(Debug, Clone)]\npub struct ChangeManifestView {\n\n}",
          "documentation": "Transcript cell wrapping one [`ManifestEntryView`]."
        },
        {
          "name": "::ChangeManifestView::new",
          "line": 111,
          "signature": "#[must_use]\npub fn new(entry: ManifestEntryView) -> Self;",
          "documentation": "Construct a view over an entry."
        },
        {
          "name": "::ChangeManifestView::entry",
          "line": 117,
          "signature": "#[must_use]\npub fn entry(&self) -> &ManifestEntryView;",
          "documentation": "Read-only access to the underlying view."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/harness/mod.rs",
      "sha256": "2b5aa9d20f01f0b231deef4774d0438b5090f2b1d71822f5260328eab9f3ca38",
      "artifactSha256": "f17909ee47f04e4c4866e0ec68cdf25bbe21f3e4be2303213acd84c465a18ca6",
      "url": "/reference/source/harness-tui-kit/src/components/harness/mod.rs.txt",
      "declarations": [
        {
          "name": "pub use attribution_table::{AttributionTable, AttributionTableRow, AttributionTaskOutcomeBadge};",
          "line": 21,
          "signature": "pub use attribution_table::{AttributionTable, AttributionTableRow, AttributionTaskOutcomeBadge};",
          "documentation": ""
        },
        {
          "name": "pub use component_tree::{\n    HarnessComponentRow, HarnessComponentStatus, HarnessComponentTree, HarnessComponentTreeState,\n};",
          "line": 22,
          "signature": "pub use component_tree::{\n    HarnessComponentRow, HarnessComponentStatus, HarnessComponentTree, HarnessComponentTreeState,\n};",
          "documentation": ""
        },
        {
          "name": "pub use manifest_view::{ChangeManifestView, ManifestEntryView, ManifestVerdictBadge};",
          "line": 25,
          "signature": "pub use manifest_view::{ChangeManifestView, ManifestEntryView, ManifestVerdictBadge};",
          "documentation": ""
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/history/approval_cell.rs",
      "sha256": "c0b904794d02bcba3ae09dbd25c9bb348300fc4386396d6255fbc3d739995f81",
      "artifactSha256": "32319296e928b6b0cbb4b1239d15ca695bc9c4fbd605b4f6a70d5cea73d795e0",
      "url": "/reference/source/harness-tui-kit/src/components/history/approval_cell.rs.txt",
      "declarations": [
        {
          "name": "::ApprovalState",
          "line": 22,
          "signature": "#[derive(Debug, Clone, PartialEq)]\npub enum ApprovalState {\n    /// The agent is waiting for the user's decision.\n    Pending,\n    /// The user resolved the request.\n    Resolved(PermissionDecision),\n}",
          "documentation": "Lifecycle state of an [`ApprovalCell`]."
        },
        {
          "name": "::ApprovalCell",
          "line": 31,
          "signature": "#[derive(Debug, Clone)]\npub struct ApprovalCell {\n\n}",
          "documentation": "A privileged-action request rendered as a transcript row."
        },
        {
          "name": "::ApprovalCell::pending",
          "line": 39,
          "signature": "#[must_use]\npub fn pending(request: PermissionRequest) -> Self;",
          "documentation": "Create a pending cell from a freshly-issued request."
        },
        {
          "name": "::ApprovalCell::resolved",
          "line": 48,
          "signature": "#[must_use]\npub fn resolved(request: PermissionRequest, decision: PermissionDecision) -> Self;",
          "documentation": "Create a resolved cell, attaching the decision the user made."
        },
        {
          "name": "::ApprovalCell::request",
          "line": 57,
          "signature": "#[must_use]\npub fn request(&self) -> &PermissionRequest;",
          "documentation": "Read-only access to the underlying request."
        },
        {
          "name": "::ApprovalCell::state",
          "line": 63,
          "signature": "#[must_use]\npub fn state(&self) -> &ApprovalState;",
          "documentation": "Read-only access to the lifecycle state."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/history/assistant_cell.rs",
      "sha256": "3072e0bcc832aa4a3b8b8e1c6a82c4f2902865356e5054ae069fea818c0cee1c",
      "artifactSha256": "b3bcb19de5898cc6e9635dc1823b6be83a69ff3046db50243b5806d68c0cbbed",
      "url": "/reference/source/harness-tui-kit/src/components/history/assistant_cell.rs.txt",
      "declarations": [
        {
          "name": "::AssistantCell",
          "line": 25,
          "signature": "#[derive(Debug, Clone)]\npub struct AssistantCell {\n\n}",
          "documentation": "An assistant / agent turn in the transcript.\n\nHolds an immutable snapshot of the markdown source. Stream\nadapters typically rebuild a fresh `AssistantCell` each commit\nboundary so `display_lines` always sees a fully-formed source\nstring."
        },
        {
          "name": "::AssistantCell::new",
          "line": 36,
          "signature": "#[must_use]\npub fn new(sender: impl Into<String>, body: impl Into<String>) -> Self;",
          "documentation": "Create a new cell with the given sender label and markdown\nbody. Both inputs are sanitized at construction time."
        },
        {
          "name": "::AssistantCell::sender_style",
          "line": 47,
          "signature": "#[must_use]\npub fn sender_style(mut self, style: Style) -> Self;",
          "documentation": "Override the sender header style."
        },
        {
          "name": "::AssistantCell::continuation",
          "line": 57,
          "signature": "#[must_use]\npub fn continuation(mut self) -> Self;",
          "documentation": "Mark this cell as a continuation of the previous assistant\nturn (e.g. a fresh commit boundary mid-stream). The\n[`super::HistoryView`] uses this flag to suppress the\nduplicate `\u25cf {sender}` header."
        },
        {
          "name": "::AssistantCell::body",
          "line": 64,
          "signature": "#[must_use]\npub fn body(&self) -> &str;",
          "documentation": "Read-only access to the sanitized body."
        },
        {
          "name": "::AssistantCell::sender",
          "line": 70,
          "signature": "#[must_use]\npub fn sender(&self) -> &str;",
          "documentation": "Read-only access to the sanitized sender label."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/history/cell.rs",
      "sha256": "9fbac8239b612ae5633d3b22f70c8e5813785748060588b969bae1ac06ecd7bb",
      "artifactSha256": "e17c94dd0453a59aa076b8ec74c011f8420efc6d1b9bb673827d02cb0127b14c",
      "url": "/reference/source/harness-tui-kit/src/components/history/cell.rs.txt",
      "declarations": [
        {
          "name": "::HistoryCell",
          "line": 26,
          "signature": "pub trait HistoryCell: Debug + Send + Sync {\n    /// The logical lines displayed in the main chat viewport.\n    fn display_lines(&self, width: u16) -> Vec<Line<'static>>;\n\n    /// Number of viewport rows needed to render this cell at `width`.\n    /// Defaults to the count of logical lines returned by\n    /// [`Self::display_lines`]. Override when the cell wraps content\n    /// or contains lines wider than `width`.\n    fn desired_height(&self, width: u16) -> u16 ;\n\n    /// Lines for the transcript overlay (e.g. Ctrl+T in Codex).\n    /// Defaults to [`Self::display_lines`]; override when the\n    /// transcript representation should differ (e.g. `ExecCell` may\n    /// show every grouped command in transcript mode but only the\n    /// most-recent in viewport mode).\n    fn transcript_lines(&self, width: u16) -> Vec<Line<'static>> ;\n\n    /// Coarse \"animation tick\" for cells whose rendered output depends\n    /// on elapsed time (spinners, shimmer effects). Returning `Some`\n    /// signals that any cached transcript output should be invalidated\n    /// once the tick changes; returning `None` (the default) means the\n    /// cell renders identically across frames.\n    fn transcript_animation_tick(&self) -> Option<u64> ;\n\n    /// True when this cell continues a stream from the previous cell.\n    /// Used by the view to suppress redundant headers / dividers\n    /// between consecutive assistant deltas. Defaults to `false`.\n    fn is_stream_continuation(&self) -> bool ;\n}",
          "documentation": "A single renderable unit of conversation history.\n\nEach cell produces logical [`Line`]s and reports how many viewport\nrows those lines occupy at a given terminal width. The default\nheight implementation simply returns the number of logical lines;\ncells whose content is longer than the viewport width should\noverride [`Self::desired_height`] with a width-aware measurement\n(e.g. ratatui's `Paragraph::line_count` after wrapping)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/history/diff_cell.rs",
      "sha256": "08885d6630a2c2a7caaa591ffcbf9d770959f14acdf032f2cc1b111cad2964f3",
      "artifactSha256": "a9955cd67484c32a69684155039d1a48e683e05cd2d653e596ad5de7cbffd7a7",
      "url": "/reference/source/harness-tui-kit/src/components/history/diff_cell.rs.txt",
      "declarations": [
        {
          "name": "::DiffCell",
          "line": 25,
          "signature": "#[derive(Debug, Clone)]\npub struct DiffCell {\n\n}",
          "documentation": "A single file diff in the transcript."
        },
        {
          "name": "::DiffCell::new",
          "line": 33,
          "signature": "#[must_use]\npub fn new(file: DiffFile) -> Self;",
          "documentation": "Create a diff cell from an already-parsed [`DiffFile`]."
        },
        {
          "name": "::DiffCell::from_unified_diff",
          "line": 44,
          "signature": "#[must_use]\npub fn from_unified_diff(source: &str) -> Vec<Self>;",
          "documentation": "Convenience: parse a unified-diff source string and return one\n`DiffCell` per file in the patch. Empty input returns an empty\nvector."
        },
        {
          "name": "::DiffCell::hide_summary",
          "line": 54,
          "signature": "#[must_use]\npub fn hide_summary(mut self) -> Self;",
          "documentation": "Hide the leading \"{path}  +A -B\" summary header line. Default\nis to show it."
        },
        {
          "name": "::DiffCell::file",
          "line": 61,
          "signature": "#[must_use]\npub fn file(&self) -> &DiffFile;",
          "documentation": "Read-only access to the underlying file diff."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/history/exec_cell.rs",
      "sha256": "f8b3f70fc7171a2184235aa7c41be3f41e2375e0f485654e8074735f5021f54f",
      "artifactSha256": "179d13e751e7e864518f61fa8545f2375dab018fc4327c2c2ffcd40f0f3f4d4b",
      "url": "/reference/source/harness-tui-kit/src/components/history/exec_cell.rs.txt",
      "declarations": [
        {
          "name": "::ExecOutcome",
          "line": 22,
          "signature": "#[derive(Debug, Clone)]\npub enum ExecOutcome {\n    /// Command still running.\n    Running,\n    /// Command finished with the given exit code and (possibly empty)\n    /// captured stdout+stderr.\n    Finished {\n        /// Process exit code (0 = success).\n        exit_code: i32,\n        /// Aggregated stdout + stderr output.\n        output: String,\n        /// Wall-clock duration.\n        duration: Duration,\n    },\n}",
          "documentation": "Final state of a shell exec."
        },
        {
          "name": "::ExecCell",
          "line": 39,
          "signature": "#[derive(Debug, Clone)]\npub struct ExecCell {\n\n}",
          "documentation": "A shell command execution in the transcript."
        },
        {
          "name": "::ExecCell::new",
          "line": 49,
          "signature": "#[must_use]\npub fn new(command: impl AsRef<str>) -> Self;",
          "documentation": "Create a cell for a freshly-started exec. The command string\nis truncated to a preview length before rendering."
        },
        {
          "name": "::ExecCell::cwd",
          "line": 59,
          "signature": "#[must_use]\npub fn cwd(mut self, cwd: impl Into<String>) -> Self;",
          "documentation": "Attach a working-directory label shown next to the command."
        },
        {
          "name": "::ExecCell::with_outcome",
          "line": 67,
          "signature": "#[must_use]\npub fn with_outcome(mut self, outcome: ExecOutcome) -> Self;",
          "documentation": "Mark the cell as finished with the given exit code, output,\nand duration."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/history/history_view.rs",
      "sha256": "316d3e661be1cc8332f3ec95edbaf512b039949794187cea276598b9cecbe874",
      "artifactSha256": "e3a1bd4c20aa23fb7e11045e26f511f52ecbc4ae235248334aea9a60c1a09cc1",
      "url": "/reference/source/harness-tui-kit/src/components/history/history_view.rs.txt",
      "declarations": [
        {
          "name": "::HistoryViewState",
          "line": 23,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct HistoryViewState {\n\n}",
          "documentation": "Persistent state for [`HistoryView`]."
        },
        {
          "name": "::HistoryViewState::following",
          "line": 35,
          "signature": "#[must_use]\npub fn following() -> Self;",
          "documentation": "Create a new state with `follow=true` (auto-scroll on)."
        },
        {
          "name": "::HistoryViewState::is_following",
          "line": 44,
          "signature": "#[must_use]\npub fn is_following(&self) -> bool;",
          "documentation": "Whether auto-follow is enabled."
        },
        {
          "name": "::HistoryViewState::set_follow",
          "line": 49,
          "signature": "pub fn set_follow(&mut self, follow: bool);",
          "documentation": "Set the auto-follow flag."
        },
        {
          "name": "::HistoryViewState::scroll_up",
          "line": 54,
          "signature": "pub fn scroll_up(&mut self, rows: u16);",
          "documentation": "Scroll up by `rows` (towards older history). Disables follow."
        },
        {
          "name": "::HistoryViewState::scroll_down",
          "line": 61,
          "signature": "pub fn scroll_down(&mut self, rows: u16);",
          "documentation": "Scroll down by `rows` (towards latest history). When the offset\nreaches zero, follow is re-enabled."
        },
        {
          "name": "::HistoryViewState::jump_to_latest",
          "line": 69,
          "signature": "pub fn jump_to_latest(&mut self);",
          "documentation": "Jump to the latest entry (scroll-up offset = 0, follow = true)."
        },
        {
          "name": "::HistoryView",
          "line": 81,
          "signature": "#[derive(Debug, Clone)]\npub struct HistoryView<'a> {\n\n}",
          "documentation": "Vertical history viewport widget.\n\nEach cell is rendered with its own logical line count; when the\nstack exceeds the viewport, the bottom-most cells win (consistent\nwith terminal-style chat surfaces)."
        },
        {
          "name": "::HistoryView<'a>::new",
          "line": 89,
          "signature": "#[must_use]\npub fn new(cells: &'a [Box<dyn HistoryCell>]) -> Self;",
          "documentation": "Create a new viewport over the supplied cells."
        },
        {
          "name": "::HistoryView<'a>::theme",
          "line": 98,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the theme."
        },
        {
          "name": "::HistoryView<'a>::total_height",
          "line": 105,
          "signature": "#[must_use]\npub fn total_height(&self, width: u16) -> u32;",
          "documentation": "Total number of viewport rows the cells would occupy at `width`."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/history/mod.rs",
      "sha256": "6a87db6ee2f187ea29d34281b871ffe7ed783b7ece09f40f54a30c3ecb3f4260",
      "artifactSha256": "fb26754db57ec945b1635cd49109f7bbbfbbbecc726d3f60bebe2cc4584a035c",
      "url": "/reference/source/harness-tui-kit/src/components/history/mod.rs.txt",
      "declarations": [
        {
          "name": "pub use approval_cell::{ApprovalCell, ApprovalState};",
          "line": 26,
          "signature": "pub use approval_cell::{ApprovalCell, ApprovalState};",
          "documentation": ""
        },
        {
          "name": "pub use assistant_cell::AssistantCell;",
          "line": 27,
          "signature": "pub use assistant_cell::AssistantCell;",
          "documentation": ""
        },
        {
          "name": "pub use cell::HistoryCell;",
          "line": 28,
          "signature": "pub use cell::HistoryCell;",
          "documentation": ""
        },
        {
          "name": "pub use diff_cell::DiffCell;",
          "line": 29,
          "signature": "pub use diff_cell::DiffCell;",
          "documentation": ""
        },
        {
          "name": "pub use exec_cell::{ExecCell, ExecOutcome};",
          "line": 30,
          "signature": "pub use exec_cell::{ExecCell, ExecOutcome};",
          "documentation": ""
        },
        {
          "name": "pub use history_view::{HistoryView, HistoryViewState};",
          "line": 31,
          "signature": "pub use history_view::{HistoryView, HistoryViewState};",
          "documentation": ""
        },
        {
          "name": "pub use system_cell::{SystemCell, SystemSeverity};",
          "line": 32,
          "signature": "pub use system_cell::{SystemCell, SystemSeverity};",
          "documentation": ""
        },
        {
          "name": "pub use tool_cell::{ToolCell, ToolCellOutcome};",
          "line": 33,
          "signature": "pub use tool_cell::{ToolCell, ToolCellOutcome};",
          "documentation": ""
        },
        {
          "name": "pub use user_cell::UserCell;",
          "line": 34,
          "signature": "pub use user_cell::UserCell;",
          "documentation": ""
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/history/system_cell.rs",
      "sha256": "6cb0b2c10e3c432f143c6afae59587cd30c7d604fef03c3247d61a9c7b2177be",
      "artifactSha256": "d80c2697fc1921fbfd2f62d8e9b4422446d36845f20c6dbed02fc42b71b7e8b3",
      "url": "/reference/source/harness-tui-kit/src/components/history/system_cell.rs.txt",
      "declarations": [
        {
          "name": "::SystemSeverity",
          "line": 18,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum SystemSeverity {\n    /// Informational notice (default).\n    Info,\n    /// Non-fatal warning.\n    Warn,\n    /// Error that did not crash the agent but the user should see.\n    Error,\n    /// Successful state change (operation completed, login granted).\n    Success,\n}",
          "documentation": "Severity level of a [`SystemCell`]."
        },
        {
          "name": "::SystemCell",
          "line": 31,
          "signature": "#[derive(Debug, Clone)]\npub struct SystemCell {\n\n}",
          "documentation": "A system notice in the transcript."
        },
        {
          "name": "::SystemCell::new",
          "line": 40,
          "signature": "#[must_use]\npub fn new(severity: SystemSeverity, body: impl Into<String>) -> Self;",
          "documentation": "Create a cell with the given severity and body. The body is\nsanitized at construction time."
        },
        {
          "name": "::SystemCell::info",
          "line": 49,
          "signature": "#[must_use]\npub fn info(body: impl Into<String>) -> Self;",
          "documentation": "Convenience: info-severity cell."
        },
        {
          "name": "::SystemCell::warn",
          "line": 55,
          "signature": "#[must_use]\npub fn warn(body: impl Into<String>) -> Self;",
          "documentation": "Convenience: warn-severity cell."
        },
        {
          "name": "::SystemCell::error",
          "line": 61,
          "signature": "#[must_use]\npub fn error(body: impl Into<String>) -> Self;",
          "documentation": "Convenience: error-severity cell."
        },
        {
          "name": "::SystemCell::success",
          "line": 67,
          "signature": "#[must_use]\npub fn success(body: impl Into<String>) -> Self;",
          "documentation": "Convenience: success-severity cell."
        },
        {
          "name": "::SystemCell::severity",
          "line": 73,
          "signature": "#[must_use]\npub fn severity(&self) -> SystemSeverity;",
          "documentation": "Read-only access to the severity."
        },
        {
          "name": "::SystemCell::body",
          "line": 79,
          "signature": "#[must_use]\npub fn body(&self) -> &str;",
          "documentation": "Read-only access to the sanitized body."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/history/tool_cell.rs",
      "sha256": "a71d4fd94b8c1bf3f15764db11e229c05185afcdca2b4586c6d0d96b53e7ffa5",
      "artifactSha256": "f8dd44a443b9a8ab392be5ccdd1f08ed9f84340bb2c6037e9d63fd8ee71832a4",
      "url": "/reference/source/harness-tui-kit/src/components/history/tool_cell.rs.txt",
      "declarations": [
        {
          "name": "::ToolCellOutcome",
          "line": 24,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum ToolCellOutcome {\n    /// Tool call still running \u2014 shows a \"running\u2026\" suffix.\n    Running,\n    /// Tool returned successfully.\n    Success,\n    /// Tool failed.\n    Failed,\n}",
          "documentation": "Final state of a tool invocation."
        },
        {
          "name": "::ToolCell",
          "line": 35,
          "signature": "#[derive(Debug, Clone)]\npub struct ToolCell {\n\n}",
          "documentation": "A single tool invocation in the transcript."
        },
        {
          "name": "::ToolCell::new",
          "line": 48,
          "signature": "#[must_use]\npub fn new(tool_name: impl Into<String>, input: impl AsRef<str>) -> Self;",
          "documentation": "Create a cell for a freshly-started tool call. Mark it running\nuntil [`Self::with_outcome`] is called."
        },
        {
          "name": "::ToolCell::with_outcome",
          "line": 62,
          "signature": "#[must_use]\npub fn with_outcome(\n        mut self,\n        outcome: ToolCellOutcome,\n        output: impl AsRef<str>,\n        duration_ms: Option<u64>,\n    ) -> Self;",
          "documentation": "Mark the tool call complete, attaching its final outcome and\n(optionally) the wall-clock duration in milliseconds."
        },
        {
          "name": "::ToolCell::set_expanded",
          "line": 76,
          "signature": "pub fn set_expanded(&mut self, expanded: bool);",
          "documentation": "Toggle the expansion state. Collapsed cells show a one-line\nsummary; expanded cells show input + output."
        },
        {
          "name": "::ToolCell::is_expanded",
          "line": 82,
          "signature": "#[must_use]\npub fn is_expanded(&self) -> bool;",
          "documentation": "Whether the cell is currently expanded."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/history/user_cell.rs",
      "sha256": "d7d463a526858564d341ee3f2fb79a0a1181cdfda3d23c055760321e3302ff9e",
      "artifactSha256": "c789efbf7b2d39170da4ed4a1d42021a397a32800cece1a4bbfed870e997e496",
      "url": "/reference/source/harness-tui-kit/src/components/history/user_cell.rs.txt",
      "declarations": [
        {
          "name": "::UserCell",
          "line": 17,
          "signature": "#[derive(Debug, Clone)]\npub struct UserCell {\n\n}",
          "documentation": "A user-authored turn in the transcript."
        },
        {
          "name": "::UserCell::new",
          "line": 27,
          "signature": "#[must_use]\npub fn new(body: impl Into<String>) -> Self;",
          "documentation": "Create a cell from a raw body string. The body is sanitized\n(terminal-injection escapes stripped) at construction time."
        },
        {
          "name": "::UserCell::prefix_style",
          "line": 38,
          "signature": "#[must_use]\npub fn prefix_style(mut self, style: Style) -> Self;",
          "documentation": "Override the prefix (`>`) style. Default is bold default fg."
        },
        {
          "name": "::UserCell::body_style",
          "line": 45,
          "signature": "#[must_use]\npub fn body_style(mut self, style: Style) -> Self;",
          "documentation": "Override the body style. Default is plain default fg."
        },
        {
          "name": "::UserCell::body",
          "line": 52,
          "signature": "#[must_use]\npub fn body(&self) -> &str;",
          "documentation": "Read-only access to the sanitized body."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/hitl/approval_chooser.rs",
      "sha256": "4c3bc67ef802879c3ecf8cd41c3bf11ad0eb8107a9ff99aa1a4d326c75be152a",
      "artifactSha256": "ccb4b223c580b6591cac0582794adba245208e9200f00f316855f4d6bed5e171",
      "url": "/reference/source/harness-tui-kit/src/components/hitl/approval_chooser.rs.txt",
      "declarations": [
        {
          "name": "::ApprovalChooserAction",
          "line": 26,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum ApprovalChooserAction {\n    /// Approve this specific request once.\n    AllowOnce,\n    /// Approve every request matching the suggested glob for the\n    /// rest of the session.\n    ApproveForSession,\n    /// Approve every request matching the suggested glob, and\n    /// persist the rule (e.g. write to `plugins.toml`).\n    ApproveForPrefix,\n    /// Decline this request.\n    Decline,\n    /// Open the linked thread / fullscreen detail view (Codex's\n    /// \"open fullscreen\" escape hatch for big payloads).\n    OpenThread,\n}",
          "documentation": "One choice in [`ApprovalChooser`]."
        },
        {
          "name": "::ApprovalChooserState",
          "line": 66,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct ApprovalChooserState {\n\n}",
          "documentation": "Persistent state \u2014 focused row index (default 0 = AllowOnce)."
        },
        {
          "name": "::ApprovalChooserState::focused",
          "line": 81,
          "signature": "#[must_use]\npub fn focused(&self) -> ApprovalChooserAction;",
          "documentation": "Currently-focused choice."
        },
        {
          "name": "::ApprovalChooserState::move_next",
          "line": 86,
          "signature": "pub fn move_next(&mut self);",
          "documentation": "Move focus to the next choice (wraps)."
        },
        {
          "name": "::ApprovalChooserState::move_prev",
          "line": 91,
          "signature": "pub fn move_prev(&mut self);",
          "documentation": "Move focus to the previous choice (wraps)."
        },
        {
          "name": "::ApprovalChooserState::reset",
          "line": 100,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset focus to the first row."
        },
        {
          "name": "::ApprovalChooserState::handle_key",
          "line": 109,
          "signature": "#[must_use]\npub fn handle_key(&mut self, ev: &KeyEvent) -> Option<ApprovalChooserAction>;",
          "documentation": "Translate a raw key event into a chooser decision.\nReturns `Some(action)` when the event activates a choice\n(Enter on the focused row, or one of the per-choice\nshortcut letters)."
        },
        {
          "name": "::ApprovalChooser",
          "line": 132,
          "signature": "#[derive(Debug, Clone)]\npub struct ApprovalChooser<'a> {\n\n}",
          "documentation": "Inline approval chooser widget. The SDK consumer renders one\ninstance per pending request."
        },
        {
          "name": "::ApprovalChooser<'a>::new",
          "line": 140,
          "signature": "#[must_use]\npub fn new(request: &'a PermissionRequest) -> Self;",
          "documentation": "Construct a chooser for `request`."
        },
        {
          "name": "::ApprovalChooser<'a>::theme",
          "line": 149,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/hitl/approval_dialog.rs",
      "sha256": "02132c0c2af8a87627c7f49bd3a36d3e8a349046190d08c16b5768d7fad3ab5e",
      "artifactSha256": "8eda4310885a748ab7d7f420f82df70530d82e9c5f445598ba2559d2d5de04bb",
      "url": "/reference/source/harness-tui-kit/src/components/hitl/approval_dialog.rs.txt",
      "declarations": [
        {
          "name": "::ApprovalDialogState",
          "line": 84,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct ApprovalDialogState {\n\n}",
          "documentation": "Mutable state for [`ApprovalDialog`], persists across frames.\n\nTracks which action option is selected, the inline edit text when editing,\nand whether the user is in edit mode.\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::approval_dialog::ApprovalDialogState;\n\nlet mut state = ApprovalDialogState::default();\nassert_eq!(state.selected_action(), 0);\nstate.select_next();\nassert_eq!(state.selected_action(), 1);\n```"
        },
        {
          "name": "::ApprovalDialogState::select_next",
          "line": 97,
          "signature": "pub fn select_next(&mut self);",
          "documentation": "Move selection to the next action option.\n\nWraps from Edit back to Approve."
        },
        {
          "name": "::ApprovalDialogState::select_prev",
          "line": 104,
          "signature": "pub fn select_prev(&mut self);",
          "documentation": "Move selection to the previous action option.\n\nWraps from Approve back to Edit."
        },
        {
          "name": "::ApprovalDialogState::start_edit",
          "line": 115,
          "signature": "pub fn start_edit(&mut self);",
          "documentation": "Enter edit mode.\n\nMoves selection to the Edit action and enables text input."
        },
        {
          "name": "::ApprovalDialogState::cancel_edit",
          "line": 123,
          "signature": "pub fn cancel_edit(&mut self);",
          "documentation": "Cancel edit mode without clearing text.\n\nDisables text input but preserves any text already typed."
        },
        {
          "name": "::ApprovalDialogState::confirm",
          "line": 133,
          "signature": "#[must_use]\npub fn confirm(&self) -> Option<ApprovalAction>;",
          "documentation": "Confirm the currently selected action.\n\nReturns `Some(ApprovalAction)` corresponding to the selected option.\nFor Edit, the modification text is taken from the edit buffer (trimmed).\nIf Edit is selected but the edit text is empty, returns `None`."
        },
        {
          "name": "::ApprovalDialogState::append_char",
          "line": 154,
          "signature": "pub fn append_char(&mut self, ch: char);",
          "documentation": "Append a character to the edit text buffer.\n\nOnly effective when in editing mode. No-op otherwise."
        },
        {
          "name": "::ApprovalDialogState::delete_char",
          "line": 163,
          "signature": "pub fn delete_char(&mut self);",
          "documentation": "Delete the last character from the edit text buffer.\n\nOnly effective when in editing mode. No-op otherwise."
        },
        {
          "name": "::ApprovalDialogState::reset",
          "line": 170,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset the state to its default values."
        },
        {
          "name": "::ApprovalDialogState::selected_action",
          "line": 176,
          "signature": "#[must_use]\npub const fn selected_action(&self) -> usize;",
          "documentation": "Returns the currently selected action index."
        },
        {
          "name": "::ApprovalDialogState::edit_text",
          "line": 182,
          "signature": "#[must_use]\npub fn edit_text(&self) -> &str;",
          "documentation": "Returns a reference to the current edit text."
        },
        {
          "name": "::ApprovalDialogState::is_editing",
          "line": 188,
          "signature": "#[must_use]\npub const fn is_editing(&self) -> bool;",
          "documentation": "Returns `true` if the user is currently in edit mode."
        },
        {
          "name": "::ApprovalDialog",
          "line": 263,
          "signature": "#[derive(Debug, Clone)]\npub struct ApprovalDialog<'a> {\n\n}",
          "documentation": "Full-context approval dialog for a single [`ApprovalRequest`].\n\nDisplays the following sections in order:\n\n1. **What** \u2014 The action summary (bold, primary text)\n2. **Why** \u2014 The reasoning behind the action\n3. **Impact** \u2014 A bulleted list of affected resources\n4. **Risk** \u2014 A badge colored by [`RiskLevel`]\n5. **Actions** \u2014 Three selectable options: Approve, Deny, Edit\n\nWhen the Edit action is selected and the user enters edit mode, a text input\nline appears below the action row for typing a modification description.\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::approval_dialog::{\n    ApprovalDialog, ApprovalDialogState,\n};\nuse harness_tui_kit::{ApprovalRequest, RiskLevel, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet theme = Theme::dark();\nlet request = ApprovalRequest::new(\"r-1\", \"Agent\", \"Run tests\")\n    .with_risk_level(RiskLevel::Low);\nlet mut state = ApprovalDialogState::default();\nlet area = Rect::new(0, 0, 50, 15);\nlet mut buf = Buffer::empty(area);\nApprovalDialog::new(&request)\n    .theme(&theme)\n    .render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::ApprovalDialog<'a>::new",
          "line": 275,
          "signature": "#[must_use]\npub fn new(request: &'a ApprovalRequest) -> Self;",
          "documentation": "Create a new approval dialog for the given request."
        },
        {
          "name": "::ApprovalDialog<'a>::theme",
          "line": 285,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        },
        {
          "name": "::ApprovalDialog<'a>::show_agent_name",
          "line": 292,
          "signature": "#[must_use]\npub fn show_agent_name(mut self, show: bool) -> Self;",
          "documentation": "Set whether to show the agent name header (default: `true`)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/hitl/approval_queue.rs",
      "sha256": "01ae2fb894a7a0111fbdbd1c975417facfe2a48083cfd78715e16674fa50f63b",
      "artifactSha256": "dd3f2c237e08deea8d00250978cc4600c2f486075df245bb6db3a785c58544f6",
      "url": "/reference/source/harness-tui-kit/src/components/hitl/approval_queue.rs.txt",
      "declarations": [
        {
          "name": "::ApprovalQueueState",
          "line": 77,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct ApprovalQueueState {\n\n}",
          "documentation": "Mutable state for [`ApprovalQueue`], persists across frames.\n\nTracks the currently selected index and the scroll offset for virtual\nscrolling when the list exceeds the available height.\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::approval_queue::ApprovalQueueState;\n\nlet mut state = ApprovalQueueState::default();\nstate.select_next(5);\nassert_eq!(state.selected_index(), 1);\nstate.select_prev();\nassert_eq!(state.selected_index(), 0);\n```"
        },
        {
          "name": "::ApprovalQueueState::select_next",
          "line": 89,
          "signature": "pub fn select_next(&mut self, len: usize);",
          "documentation": "Move selection to the next item.\n\nWraps around to the first item when the end is reached.\nDoes nothing if `len` is zero."
        },
        {
          "name": "::ApprovalQueueState::select_prev",
          "line": 100,
          "signature": "pub fn select_prev(&mut self);",
          "documentation": "Move selection to the previous item.\n\nWraps around to the last item when the beginning is reached,\nbut only if the current index is zero."
        },
        {
          "name": "::ApprovalQueueState::selected_index",
          "line": 106,
          "signature": "#[must_use]\npub const fn selected_index(&self) -> usize;",
          "documentation": "Returns the currently selected index."
        },
        {
          "name": "::ApprovalQueueState::scroll_offset",
          "line": 112,
          "signature": "#[must_use]\npub const fn scroll_offset(&self) -> usize;",
          "documentation": "Returns the current scroll offset."
        },
        {
          "name": "::ApprovalQueueState::reset",
          "line": 117,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset the state to its default values."
        },
        {
          "name": "::ApprovalQueue",
          "line": 183,
          "signature": "#[derive(Debug, Clone)]\npub struct ApprovalQueue<'a> {\n\n}",
          "documentation": "Scrollable list of pending approval requests.\n\nEach row displays:\n- Position number (1-indexed)\n- Agent name (bold)\n- Action summary (truncated to fit)\n- Risk badge colored by severity\n\nThe selected row is highlighted with the elevated background and an accent\nleft-border indicator.\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::approval_queue::{\n    ApprovalQueue, ApprovalQueueState,\n};\nuse harness_tui_kit::{ApprovalRequest, RiskLevel, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet theme = Theme::dark();\nlet requests = vec![\n    ApprovalRequest::new(\"r-1\", \"Agent\", \"Deploy service\")\n        .with_risk_level(RiskLevel::Medium),\n];\nlet mut state = ApprovalQueueState::default();\nlet area = Rect::new(0, 0, 50, 5);\nlet mut buf = Buffer::empty(area);\nApprovalQueue::new(&requests)\n    .theme(&theme)\n    .render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::ApprovalQueue<'a>::new",
          "line": 195,
          "signature": "#[must_use]\npub fn new(requests: &'a [ApprovalRequest]) -> Self;",
          "documentation": "Create a new approval queue with the given requests."
        },
        {
          "name": "::ApprovalQueue<'a>::theme",
          "line": 205,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        },
        {
          "name": "::ApprovalQueue<'a>::show_position",
          "line": 212,
          "signature": "#[must_use]\npub fn show_position(mut self, show: bool) -> Self;",
          "documentation": "Set whether to show position numbers (default: `true`)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/hitl/confirmation.rs",
      "sha256": "7dca1fc86ba806da619091aac08dd2d0d8e9efd2d9dd42d18642387f0aef209c",
      "artifactSha256": "781f9011428ef291ec41061a26bab7ca2dac7855f9118e7d7ae9bdb4baca42b2",
      "url": "/reference/source/harness-tui-kit/src/components/hitl/confirmation.rs.txt",
      "declarations": [
        {
          "name": "::ConfirmButton",
          "line": 62,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]\npub enum ConfirmButton {\n    /// The yes/accept action button.\n    Yes,\n    /// The no/cancel action button (default focus).\n    #[default]\n    No,\n}",
          "documentation": "Which button is currently focused in a [`ConfirmationPrompt`].\n\nDefaults to [`ConfirmButton::No`] so the non-destructive action is\nselected by default.\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::confirmation::ConfirmButton;\n\nlet button = ConfirmButton::default();\nassert_eq!(button, ConfirmButton::No);\n```"
        },
        {
          "name": "::ConfirmationPromptState",
          "line": 90,
          "signature": "#[derive(Debug, Clone)]\npub struct ConfirmationPromptState {\n/// Which button is focused.\n\npub focused: ConfirmButton,\n/// Whether the user has made a decision (and what it was).\n\npub decision: Option<bool>,\n/// Whether the prompt is visible.\n\npub visible: bool\n}",
          "documentation": "Mutable state for [`ConfirmationPrompt`], persists across frames.\n\nTracks which button is focused, whether the user has made a decision,\nand whether the prompt is visible.\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::confirmation::ConfirmationPromptState;\n\nlet mut state = ConfirmationPromptState::new();\nstate.show();\nassert!(state.visible);\nstate.toggle_focus();\nstate.confirm();\nassert_eq!(state.decision, Some(true));\n```"
        },
        {
          "name": "::ConfirmationPromptState::new",
          "line": 114,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new confirmation prompt state.\n\nStarts hidden with the No button focused and no decision.\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::confirmation::ConfirmationPromptState;\n\nlet state = ConfirmationPromptState::new();\nassert!(!state.visible);\nassert_eq!(state.decision, None);\n```"
        },
        {
          "name": "::ConfirmationPromptState::focus_yes",
          "line": 123,
          "signature": "pub fn focus_yes(&mut self);",
          "documentation": "Focus the Yes button."
        },
        {
          "name": "::ConfirmationPromptState::focus_no",
          "line": 128,
          "signature": "pub fn focus_no(&mut self);",
          "documentation": "Focus the No button."
        },
        {
          "name": "::ConfirmationPromptState::toggle_focus",
          "line": 133,
          "signature": "pub fn toggle_focus(&mut self);",
          "documentation": "Toggle focus between Yes and No buttons."
        },
        {
          "name": "::ConfirmationPromptState::confirm",
          "line": 143,
          "signature": "pub fn confirm(&mut self);",
          "documentation": "Confirm the decision based on the currently focused button.\n\nSets `decision` to `Some(true)` if Yes is focused, `Some(false)` if No."
        },
        {
          "name": "::ConfirmationPromptState::reset",
          "line": 148,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset the state to initial values (hidden, no decision, No focused)."
        },
        {
          "name": "::ConfirmationPromptState::show",
          "line": 153,
          "signature": "pub fn show(&mut self);",
          "documentation": "Show the prompt."
        },
        {
          "name": "::ConfirmationPromptState::hide",
          "line": 160,
          "signature": "pub fn hide(&mut self);",
          "documentation": "Hide the prompt."
        },
        {
          "name": "::ConfirmationPrompt",
          "line": 208,
          "signature": "#[derive(Debug, Clone)]\npub struct ConfirmationPrompt<'a> {\n\n}",
          "documentation": "Compact yes/no confirmation card.\n\nRenders an inline prompt with a message and two buttons. When `dangerous`\nis set, the left border and message use the theme's error color to signal\na destructive operation.\n\n# Layout (max 4 lines)\n\n```text\n\u2502 Delete this file?\n\u2502\n\u2502 [Yes]  [No]\n```\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::confirmation::{\n    ConfirmationPrompt, ConfirmationPromptState,\n};\nuse harness_tui_kit::Theme;\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet theme = Theme::dark();\nlet mut state = ConfirmationPromptState::new();\nstate.show();\nlet area = Rect::new(0, 0, 40, 4);\nlet mut buf = Buffer::empty(area);\nConfirmationPrompt::new(\"Proceed?\")\n    .theme(&theme)\n    .render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::ConfirmationPrompt<'a>::new",
          "line": 220,
          "signature": "#[must_use]\npub fn new(message: &'a str) -> Self;",
          "documentation": "Create a new confirmation prompt with the given message."
        },
        {
          "name": "::ConfirmationPrompt<'a>::theme",
          "line": 230,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme for the prompt."
        },
        {
          "name": "::ConfirmationPrompt<'a>::dangerous",
          "line": 239,
          "signature": "#[must_use]\npub fn dangerous(mut self, dangerous: bool) -> Self;",
          "documentation": "Set whether this is a dangerous/destructive action.\n\nWhen `true`, the left border and message text use the error color."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/hitl/decision_panel.rs",
      "sha256": "11352e11f972036fb4c6a2b29b8fbc38dde273ae3db40f403469ac3684e9a5e2",
      "artifactSha256": "bd6c594c0416d0a33b8cd269259ebe1218ee623266ff60e51c9fa526b20b8f20",
      "url": "/reference/source/harness-tui-kit/src/components/hitl/decision_panel.rs.txt",
      "declarations": [
        {
          "name": "::DecisionPanelState",
          "line": 78,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct DecisionPanelState {\n\n}",
          "documentation": "Mutable state for [`DecisionPanel`], persists across frames.\n\nTracks which option is currently selected and whether the user has\ncancelled or confirmed a decision.\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::decision_panel::DecisionPanelState;\n\nlet mut state = DecisionPanelState::default();\nassert_eq!(state.selected_index(), 0);\nassert!(!state.is_cancelled());\n\nstate.select_next(3);\nassert_eq!(state.selected_index(), 1);\n```"
        },
        {
          "name": "::DecisionPanelState::select_next",
          "line": 91,
          "signature": "pub fn select_next(&mut self, option_count: usize);",
          "documentation": "Move selection to the next option, wrapping within `option_count`.\n\nDoes nothing if `option_count` is zero."
        },
        {
          "name": "::DecisionPanelState::select_prev",
          "line": 101,
          "signature": "pub fn select_prev(&mut self, option_count: usize);",
          "documentation": "Move selection to the previous option, wrapping within `option_count`.\n\nDoes nothing if `option_count` is zero."
        },
        {
          "name": "::DecisionPanelState::select_by_number",
          "line": 116,
          "signature": "pub fn select_by_number(&mut self, n: usize, option_count: usize);",
          "documentation": "Select an option by its 1-based number key.\n\n`n` is 1-based (i.e., pressing key `1` selects index 0). If `n` is\nzero or exceeds `option_count`, this is a no-op."
        },
        {
          "name": "::DecisionPanelState::cancel",
          "line": 124,
          "signature": "pub fn cancel(&mut self);",
          "documentation": "Mark the decision as cancelled."
        },
        {
          "name": "::DecisionPanelState::confirm",
          "line": 133,
          "signature": "#[must_use]\npub fn confirm(&mut self, option_count: usize) -> Option<usize>;",
          "documentation": "Confirm the currently selected option.\n\nReturns `Some(index)` of the confirmed option, or `None` if no options\nare available (i.e., `option_count` is zero)."
        },
        {
          "name": "::DecisionPanelState::is_cancelled",
          "line": 144,
          "signature": "#[must_use]\npub fn is_cancelled(&self) -> bool;",
          "documentation": "Whether the user has cancelled the decision."
        },
        {
          "name": "::DecisionPanelState::selected_index",
          "line": 150,
          "signature": "#[must_use]\npub fn selected_index(&self) -> usize;",
          "documentation": "The index of the currently selected option."
        },
        {
          "name": "::DecisionPanelState::confirmed_index",
          "line": 156,
          "signature": "#[must_use]\npub fn confirmed_index(&self) -> Option<usize>;",
          "documentation": "The confirmed option index, if the user has confirmed."
        },
        {
          "name": "::DecisionPanelState::reset",
          "line": 161,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset the state to initial values."
        },
        {
          "name": "::DecisionPanel",
          "line": 210,
          "signature": "#[derive(Debug, Clone)]\npub struct DecisionPanel<'a> {\n\n}",
          "documentation": "Multi-option decision panel rendered as numbered rows.\n\nDisplays 2\u20136 [`DecisionOption`] items. The first option (index 0) is\ntreated as the recommended choice and receives a star marker and accent\nstyling. The currently selected option is highlighted with an accent\nbackground. A cancel hint is rendered at the bottom.\n\n# Layout\n\n```text\nChoose an action              \u2190 optional title (bold)\n  1. \u2605 Deploy \u2014 Push to staging    \u2190 recommended (index 0)\n  2.   Skip \u2014 Do nothing           \u2190 normal option\n  Esc to cancel                    \u2190 always present\n```\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::decision_panel::{\n    DecisionPanel, DecisionPanelState,\n};\nuse harness_tui_kit::{DecisionOption, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet theme = Theme::dark();\nlet options = vec![\n    DecisionOption::new(\"Deploy\", \"Push to staging\").with_recommended(true),\n    DecisionOption::new(\"Rollback\", \"Revert last deploy\"),\n    DecisionOption::new(\"Skip\", \"Do nothing\"),\n];\nlet mut state = DecisionPanelState::default();\nlet area = Rect::new(0, 0, 60, 8);\nlet mut buf = Buffer::empty(area);\nDecisionPanel::new(&options)\n    .theme(&theme)\n    .title(\"Choose an action\")\n    .render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::DecisionPanel<'a>::new",
          "line": 224,
          "signature": "#[must_use]\npub fn new(options: &'a [DecisionOption]) -> Self;",
          "documentation": "Create a new decision panel with the given options.\n\nOptions beyond [`MAX_OPTIONS`] (6) are silently ignored during rendering."
        },
        {
          "name": "::DecisionPanel<'a>::theme",
          "line": 234,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme for the panel."
        },
        {
          "name": "::DecisionPanel<'a>::title",
          "line": 241,
          "signature": "#[must_use]\npub fn title(mut self, title: &'a str) -> Self;",
          "documentation": "Set an optional title rendered at the top of the panel."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/hitl/mod.rs",
      "sha256": "b2d750b7b1ba428738f814b78a84a7c86084cb5aa961c5341c429689a68b2b78",
      "artifactSha256": "eeb54fa4e2e3f541eb74bc9e360af4ab3e4e30bbbbd39b8fcdb0cced6ec720b7",
      "url": "/reference/source/harness-tui-kit/src/components/hitl/mod.rs.txt",
      "declarations": [
        {
          "name": "approval_chooser",
          "line": 5,
          "signature": "pub mod approval_chooser;",
          "documentation": "Human-in-the-loop components.\n\nComponents for approval workflows, confirmation dialogs, and decision interfaces."
        },
        {
          "name": "approval_dialog",
          "line": 6,
          "signature": "pub mod approval_dialog;",
          "documentation": ""
        },
        {
          "name": "approval_queue",
          "line": 7,
          "signature": "pub mod approval_queue;",
          "documentation": ""
        },
        {
          "name": "confirmation",
          "line": 8,
          "signature": "pub mod confirmation;",
          "documentation": ""
        },
        {
          "name": "decision_panel",
          "line": 9,
          "signature": "pub mod decision_panel;",
          "documentation": ""
        },
        {
          "name": "permission_banner",
          "line": 10,
          "signature": "pub mod permission_banner;",
          "documentation": ""
        },
        {
          "name": "permission_prompt",
          "line": 11,
          "signature": "pub mod permission_prompt;",
          "documentation": ""
        },
        {
          "name": "pub use approval_chooser::{ApprovalChooser, ApprovalChooserAction, ApprovalChooserState};",
          "line": 13,
          "signature": "pub use approval_chooser::{ApprovalChooser, ApprovalChooserAction, ApprovalChooserState};",
          "documentation": ""
        },
        {
          "name": "pub use approval_dialog::{ApprovalDialog, ApprovalDialogState};",
          "line": 14,
          "signature": "pub use approval_dialog::{ApprovalDialog, ApprovalDialogState};",
          "documentation": ""
        },
        {
          "name": "pub use approval_queue::{ApprovalQueue, ApprovalQueueState};",
          "line": 15,
          "signature": "pub use approval_queue::{ApprovalQueue, ApprovalQueueState};",
          "documentation": ""
        },
        {
          "name": "pub use confirmation::{ConfirmButton, ConfirmationPrompt, ConfirmationPromptState};",
          "line": 16,
          "signature": "pub use confirmation::{ConfirmButton, ConfirmationPrompt, ConfirmationPromptState};",
          "documentation": ""
        },
        {
          "name": "pub use decision_panel::{DecisionPanel, DecisionPanelState};",
          "line": 17,
          "signature": "pub use decision_panel::{DecisionPanel, DecisionPanelState};",
          "documentation": ""
        },
        {
          "name": "pub use permission_banner::PermissionBanner;",
          "line": 18,
          "signature": "pub use permission_banner::PermissionBanner;",
          "documentation": ""
        },
        {
          "name": "pub use permission_prompt::{PermissionPrompt, PermissionPromptState};",
          "line": 19,
          "signature": "pub use permission_prompt::{PermissionPrompt, PermissionPromptState};",
          "documentation": ""
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/hitl/permission_banner.rs",
      "sha256": "5f61a5a865349a470c2f03356eed10db235857dcf8f2bd9137a3934e9680c517",
      "artifactSha256": "c5996d6f9a72717a5bbbe2768881bd29914aaa35dbe37fab8ecefab42a2c49ea",
      "url": "/reference/source/harness-tui-kit/src/components/hitl/permission_banner.rs.txt",
      "declarations": [
        {
          "name": "::PermissionBanner",
          "line": 59,
          "signature": "#[derive(Debug, Clone)]\npub struct PermissionBanner<'a> {\n\n}",
          "documentation": "Single-line permission status summary banner.\n\nShows pending and auto-approved permission counts. Renders nothing when\nboth counts are zero.\n\n# Layout (1 line)\n\n```text\n\u26a1 3 pending \u2502 \u2713 12 auto-approved\n```\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::permission_banner::PermissionBanner;\nuse harness_tui_kit::Theme;\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::Widget;\n\nlet banner = PermissionBanner::new(1, 5);\nlet area = Rect::new(0, 0, 50, 1);\nlet mut buf = Buffer::empty(area);\nbanner.render(area, &mut buf);\n```"
        },
        {
          "name": "::PermissionBanner<'a>::new",
          "line": 71,
          "signature": "#[must_use]\npub fn new(pending_count: usize, auto_approved_count: usize) -> Self;",
          "documentation": "Create a new permission banner with the given counts."
        },
        {
          "name": "::PermissionBanner<'a>::theme",
          "line": 81,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/hitl/permission_prompt.rs",
      "sha256": "48199ac6e2f1ce3da91e4cfa4c4120e2b1e6b1bed4526c10aa29060b107b4419",
      "artifactSha256": "21d308aef64b38409c28acf09aed81df800bd60aed4f982b8d9c8f227ddf1a61",
      "url": "/reference/source/harness-tui-kit/src/components/hitl/permission_prompt.rs.txt",
      "declarations": [
        {
          "name": "::PermissionPromptState",
          "line": 67,
          "signature": "#[derive(Debug, Clone)]\npub struct PermissionPromptState {\n/// The user's decision (if made).\n\npub decision: Option<PermissionDecision>,\n/// The auto-generated glob pattern (shown when user presses 'a').\n\npub suggested_pattern: Option<String>,\n/// Whether the pattern confirmation is showing.\n\npub showing_pattern: bool\n}",
          "documentation": "Mutable state for [`PermissionPrompt`], persists across frames.\n\nTracks the user's decision and the \"always allow\" pattern confirmation flow.\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::permission_prompt::PermissionPromptState;\n\nlet mut state = PermissionPromptState::new();\nstate.allow_once();\nassert!(state.decision.is_some());\n```"
        },
        {
          "name": "::PermissionPromptState::new",
          "line": 91,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new permission prompt state.\n\nStarts with no decision, no pattern, and pattern confirmation hidden.\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::permission_prompt::PermissionPromptState;\n\nlet state = PermissionPromptState::new();\nassert!(state.decision.is_none());\nassert!(!state.showing_pattern);\n```"
        },
        {
          "name": "::PermissionPromptState::allow_once",
          "line": 100,
          "signature": "pub fn allow_once(&mut self);",
          "documentation": "Set the decision to allow once."
        },
        {
          "name": "::PermissionPromptState::deny",
          "line": 105,
          "signature": "pub fn deny(&mut self);",
          "documentation": "Set the decision to deny."
        },
        {
          "name": "::PermissionPromptState::start_always_allow",
          "line": 112,
          "signature": "pub fn start_always_allow(&mut self, resource: &str);",
          "documentation": "Begin the \"always allow\" flow by generating a glob pattern from the resource.\n\nShows the pattern confirmation UI. The user must confirm or cancel."
        },
        {
          "name": "::PermissionPromptState::confirm_pattern",
          "line": 120,
          "signature": "pub fn confirm_pattern(&mut self);",
          "documentation": "Confirm the suggested pattern and set the decision to `AlwaysAllow`.\n\nOnly takes effect if `showing_pattern` is `true` and a pattern exists."
        },
        {
          "name": "::PermissionPromptState::cancel_pattern",
          "line": 130,
          "signature": "pub fn cancel_pattern(&mut self);",
          "documentation": "Cancel the pattern confirmation and return to the normal prompt view."
        },
        {
          "name": "::PermissionPromptState::reset",
          "line": 136,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset all state to initial values."
        },
        {
          "name": "::generate_glob_pattern",
          "line": 167,
          "signature": "#[must_use]\npub fn generate_glob_pattern(resource: &str) -> String;",
          "documentation": "Generate a glob pattern from a resource string.\n\n- For URLs (containing `://` or starting with a domain-like string): strips\n  the path after the first segment (e.g., `api.orgs.sh/*`).\n- For file paths (starting with `/` or `./` or `~`): takes the parent\n  directory and appends `/*`.\n- For commands (anything else): takes the first word and appends ` *`.\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::permission_prompt::generate_glob_pattern;\n\nassert_eq!(generate_glob_pattern(\"https://api.orgs.sh/v1/formations\"), \"api.orgs.sh/*\");\nassert_eq!(generate_glob_pattern(\"/home/user/.ssh/id_rsa\"), \"/home/user/.ssh/*\");\nassert_eq!(generate_glob_pattern(\"rm -rf build/\"), \"rm *\");\n```"
        },
        {
          "name": "::PermissionPrompt",
          "line": 258,
          "signature": "#[derive(Debug, Clone)]\npub struct PermissionPrompt<'a> {\n\n}",
          "documentation": "Inline permission request card.\n\nRenders a compact 4-line card with the permission request details and\naction hints. Uses a left border colored by the category's danger level.\n\n# Layout (4 lines)\n\n```text\n\u2502 N my-plugin\n\u2502 api.orgs.sh/v1/formations\n\u2502 Fetching organization data\n\u2502 [y] Allow  [a] Always  [d] Deny\n```\n\nWhen the \"always allow\" pattern confirmation is active:\n\n```text\n\u2502 N my-plugin\n\u2502 api.orgs.sh/v1/formations\n\u2502 Pattern: api.orgs.sh\n\u2502 [Enter] Confirm  [Esc] Cancel\n```\n\n# Examples\n\n```\nuse harness_tui_kit::components::hitl::permission_prompt::{\n    PermissionPrompt, PermissionPromptState,\n};\nuse harness_tui_kit::{PermissionRequest, PermissionCategory, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet theme = Theme::dark();\nlet request = PermissionRequest::new(\n    PermissionCategory::Shell,\n    \"build-agent\",\n    \"rm -rf build/\",\n);\nlet mut state = PermissionPromptState::new();\nlet area = Rect::new(0, 0, 60, 4);\nlet mut buf = Buffer::empty(area);\nPermissionPrompt::new(&request)\n    .theme(&theme)\n    .render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::PermissionPrompt<'a>::new",
          "line": 268,
          "signature": "#[must_use]\npub fn new(request: &'a PermissionRequest) -> Self;",
          "documentation": "Create a new permission prompt for the given request."
        },
        {
          "name": "::PermissionPrompt<'a>::theme",
          "line": 277,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/metrics/card.rs",
      "sha256": "61831835ef02759363b7c1fcfc961717ec7fb85445d0b6b0eb546d4e7023ad12",
      "artifactSha256": "8e0b410e29132e42b15e4ddc36c22c22c38661e9a29984a195dc3bd62d7dc2e1",
      "url": "/reference/source/harness-tui-kit/src/components/metrics/card.rs.txt",
      "declarations": [
        {
          "name": "::MetricCard",
          "line": 36,
          "signature": "#[derive(Debug, Clone)]\npub struct MetricCard<'a> {\n\n}",
          "documentation": "Single metric display with large value, label, and delta.\n\nDesigned for dashboard-style metric cards. Renders compactly in a small\nrectangle with the value prominently displayed and supporting metadata\naround it."
        },
        {
          "name": "::MetricCard<'a>::new",
          "line": 52,
          "signature": "#[must_use]\npub fn new(label: &'a str, value: &'a str) -> Self;",
          "documentation": "Create a new metric card with a label and value."
        },
        {
          "name": "::MetricCard<'a>::delta",
          "line": 67,
          "signature": "#[must_use]\npub fn delta(mut self, delta: &'a str) -> Self;",
          "documentation": "Set the delta display string.\n\nStrings starting with \"+\" are rendered in the success color,\nstrings starting with \"-\" in the error color."
        },
        {
          "name": "::MetricCard<'a>::unit",
          "line": 74,
          "signature": "#[must_use]\npub fn unit(mut self, unit: &'a str) -> Self;",
          "documentation": "Set the unit suffix."
        },
        {
          "name": "::MetricCard<'a>::theme",
          "line": 81,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/metrics/cost_tracker.rs",
      "sha256": "bded4a0ceee09b5326086fede514a59ac3ff194abbbb2f275912fc1b20420f63",
      "artifactSha256": "3a1ca66cd21b5e3cc0c4d09f0dac506f722ec8d17459827dbb7730ae391f224c",
      "url": "/reference/source/harness-tui-kit/src/components/metrics/cost_tracker.rs.txt",
      "declarations": [
        {
          "name": "::CostTracker",
          "line": 70,
          "signature": "#[derive(Debug, Clone)]\npub struct CostTracker<'a> {\n\n}",
          "documentation": "Displays running cost information with total, delta, rate, and per-agent breakdown.\n\nThe component renders:\n- **Row 0**: Total cost in bold, with a delta arrow if a previous total is provided.\n- **Row 1** (optional): Cost-per-minute rate in muted style.\n- **Rows 2+**: One row per unique `agent_id`, showing agent name, aggregated\n  amount, and the model name(s).\n\nEntries are aggregated by `agent_id` \u2014 if multiple entries share the same\n`agent_id`, their `amount_cents` values are summed and the model from the\nlast entry in the slice is displayed.\n\n# Examples\n\n```\nuse harness_tui_kit::{CostTracker, CostEntry, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::Widget;\n\nlet entries = vec![\n    CostEntry::new(\"summarizer\", \"claude-opus-4-6\", 450, \"USD\"),\n];\nlet tracker = CostTracker::new(&entries);\nlet area = Rect::new(0, 0, 40, 4);\nlet mut buf = Buffer::empty(area);\ntracker.render(area, &mut buf);\n```"
        },
        {
          "name": "::CostTracker<'a>::new",
          "line": 86,
          "signature": "#[must_use]\npub fn new(entries: &'a [CostEntry]) -> Self;",
          "documentation": "Create a new cost tracker from a slice of cost entries."
        },
        {
          "name": "::CostTracker<'a>::currency_symbol",
          "line": 98,
          "signature": "#[must_use]\npub fn currency_symbol(mut self, symbol: &'a str) -> Self;",
          "documentation": "Set the currency symbol (e.g., `\"$\"`, `\"\\u{20ac}\"`, `\"\\u{00a3}\"`)."
        },
        {
          "name": "::CostTracker<'a>::rate_per_min",
          "line": 105,
          "signature": "#[must_use]\npub fn rate_per_min(mut self, rate: f64) -> Self;",
          "documentation": "Set the cost-per-minute rate for display."
        },
        {
          "name": "::CostTracker<'a>::previous_total_cents",
          "line": 112,
          "signature": "#[must_use]\npub fn previous_total_cents(mut self, cents: u64) -> Self;",
          "documentation": "Set the previous total in cents, used to compute and render a delta indicator."
        },
        {
          "name": "::CostTracker<'a>::theme",
          "line": 119,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/metrics/latency_display.rs",
      "sha256": "2ba726117e98f17abd358f92e571c6d3014774be8e3bb5f3191977cc5571a2ba",
      "artifactSha256": "ced1c78e2b6d4a6b63196a49ba41f06463633cfbab8c0518d00f3d0b47868826",
      "url": "/reference/source/harness-tui-kit/src/components/metrics/latency_display.rs.txt",
      "declarations": [
        {
          "name": "::LatencyDisplay",
          "line": 71,
          "signature": "#[derive(Debug, Clone)]\npub struct LatencyDisplay<'a> {\n\n}",
          "documentation": "Response latency display with current value, percentiles, and sparkline.\n\nRenders a [`LatencySnapshot`] as a compact three-row widget:\n- **Row 0**: Current latency value in bold, colored by threshold\n- **Row 1**: P50, P95, P99 percentile values in muted text\n- **Row 2**: Sparkline of recent samples using vertical bar characters\n\nColor thresholds determine the current value's color:\n- Green (success) when below `warn_threshold_ms`\n- Yellow (warning) when at or above warn but below `error_threshold_ms`\n- Red (error) when at or above error threshold\n\n# Examples\n\n```\nuse harness_tui_kit::{LatencyDisplay, LatencySnapshot, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::Widget;\n\nlet snapshot = LatencySnapshot::new(230, 180, 450, 890)\n    .with_samples(vec![100, 200, 150, 300, 250]);\nlet theme = Theme::dark();\nlet display = LatencyDisplay::new(&snapshot)\n    .warn_threshold_ms(500)\n    .error_threshold_ms(1000)\n    .theme(&theme);\nlet area = Rect::new(0, 0, 40, 3);\nlet mut buf = Buffer::empty(area);\ndisplay.render(area, &mut buf);\n```"
        },
        {
          "name": "::LatencyDisplay<'a>::new",
          "line": 89,
          "signature": "#[must_use]\npub fn new(snapshot: &'a LatencySnapshot) -> Self;",
          "documentation": "Create a new latency display from a snapshot.\n\nDefault thresholds: warn at 500ms, error at 1000ms. Default unit: \"ms\"."
        },
        {
          "name": "::LatencyDisplay<'a>::warn_threshold_ms",
          "line": 104,
          "signature": "#[must_use]\npub fn warn_threshold_ms(mut self, ms: u64) -> Self;",
          "documentation": "Set the warning threshold in milliseconds.\n\nValues at or above this threshold (and below the error threshold)\nare rendered in the warning color."
        },
        {
          "name": "::LatencyDisplay<'a>::error_threshold_ms",
          "line": 113,
          "signature": "#[must_use]\npub fn error_threshold_ms(mut self, ms: u64) -> Self;",
          "documentation": "Set the error threshold in milliseconds.\n\nValues at or above this threshold are rendered in the error color."
        },
        {
          "name": "::LatencyDisplay<'a>::unit",
          "line": 120,
          "signature": "#[must_use]\npub fn unit(mut self, unit: &'a str) -> Self;",
          "documentation": "Set the unit label (default: \"ms\")."
        },
        {
          "name": "::LatencyDisplay<'a>::theme",
          "line": 127,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/metrics/metrics_bar.rs",
      "sha256": "cad330408e3109abb0d16eb814e682bb578c9217cd9d1beefd66e815e45a82b5",
      "artifactSha256": "f6f63ee94acadb42dfa425206e31385e2cff0c137904f7b80148cffd040e2f02",
      "url": "/reference/source/harness-tui-kit/src/components/metrics/metrics_bar.rs.txt",
      "declarations": [
        {
          "name": "::MetricBarItem",
          "line": 40,
          "signature": "#[derive(Debug, Clone)]\npub struct MetricBarItem<'a> {\n/// Metric label (e.g., \"Tokens\", \"Cost\", \"Latency\").\n\npub label: &'a str,\n/// Main value display (e.g., \"4,096\", \"$12.34\", \"230ms\").\n\npub value: &'a str,\n/// Delta from previous value (e.g., \"+12%\", \"-3.2%\").\n\npub delta: &'a str,\n/// Unit suffix (e.g., \"tok\", \"ms\", \"req/s\").\n\npub unit: &'a str\n}",
          "documentation": "Data for one metric in the bar.\n\nHolds the display strings needed to construct a [`MetricCard`]. All fields\nare borrowed references with the same lifetime as the parent [`MetricsBar`]."
        },
        {
          "name": "::MetricsBar",
          "line": 77,
          "signature": "#[derive(Debug, Clone)]\npub struct MetricsBar<'a> {\n\n}",
          "documentation": "Horizontal strip of [`MetricCard`] widgets.\n\nRenders metric cards left-to-right with configurable minimum card width and\nspacing between cards. When the available area cannot fit all items, the bar\nrenders as many cards as possible and shows a `\"+N more\"` overflow indicator\nat the right edge.\n\n# Examples\n\n```\nuse harness_tui_kit::{MetricBarItem, MetricsBar, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::Widget;\n\nlet items = [\n    MetricBarItem { label: \"RPS\", value: \"12,340\", delta: \"+8%\", unit: \"req/s\" },\n    MetricBarItem { label: \"P99\", value: \"42\", delta: \"-2%\", unit: \"ms\" },\n];\nlet theme = Theme::dark();\nlet bar = MetricsBar::new(&items).spacing(2).theme(&theme);\nlet area = Rect::new(0, 0, 60, 3);\nlet mut buf = Buffer::empty(area);\nbar.render(area, &mut buf);\n```"
        },
        {
          "name": "::MetricsBar<'a>::new",
          "line": 94,
          "signature": "#[must_use]\npub fn new(items: &'a [MetricBarItem<'a>]) -> Self;",
          "documentation": "Create a new metrics bar with the given items.\n\nUses default values of `min_card_width = 15`, `spacing = 1`, and\nthe default dark theme."
        },
        {
          "name": "::MetricsBar<'a>::min_card_width",
          "line": 108,
          "signature": "#[must_use]\npub fn min_card_width(mut self, width: u16) -> Self;",
          "documentation": "Set the minimum card width in columns.\n\nEach card will be at least this wide. If all items fit, extra width\nis distributed evenly across cards. A value of zero is treated as one."
        },
        {
          "name": "::MetricsBar<'a>::spacing",
          "line": 115,
          "signature": "#[must_use]\npub fn spacing(mut self, spacing: u16) -> Self;",
          "documentation": "Set the spacing between cards in columns."
        },
        {
          "name": "::MetricsBar<'a>::theme",
          "line": 122,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/metrics/mod.rs",
      "sha256": "4c8d2d797effe8e17eae990a32b8299c927fbe52e53ee933985ba91233683ec0",
      "artifactSha256": "2b9a7416246f23849f52d5a05031eb5247cf2632ae65756e81ac62b6d59b701a",
      "url": "/reference/source/harness-tui-kit/src/components/metrics/mod.rs.txt",
      "declarations": [
        {
          "name": "pub use card::MetricCard;",
          "line": 11,
          "signature": "pub use card::MetricCard;",
          "documentation": ""
        },
        {
          "name": "pub use cost_tracker::CostTracker;",
          "line": 12,
          "signature": "pub use cost_tracker::CostTracker;",
          "documentation": ""
        },
        {
          "name": "pub use latency_display::LatencyDisplay;",
          "line": 13,
          "signature": "pub use latency_display::LatencyDisplay;",
          "documentation": ""
        },
        {
          "name": "pub use metrics_bar::{MetricBarItem, MetricsBar};",
          "line": 14,
          "signature": "pub use metrics_bar::{MetricBarItem, MetricsBar};",
          "documentation": ""
        },
        {
          "name": "pub use token_meter::TokenMeter;",
          "line": 15,
          "signature": "pub use token_meter::TokenMeter;",
          "documentation": ""
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/metrics/token_meter.rs",
      "sha256": "a42d1a096dad1eafe7b940fc5a672c8cd4734098c196372e167ca3c1beeecf0a",
      "artifactSha256": "c840462b82b119e61c3000da530d52dd50fe52efd7ca45b707c0b7095aefc036",
      "url": "/reference/source/harness-tui-kit/src/components/metrics/token_meter.rs.txt",
      "declarations": [
        {
          "name": "::TokenMeter",
          "line": 35,
          "signature": "#[derive(Debug, Clone)]\npub struct TokenMeter<'a> {\n\n}",
          "documentation": "Horizontal progress bar for token usage.\n\nShows used/limit tokens with a color gradient that transitions from\ngreen (low usage) through yellow (moderate) to red (near limit).\nOptionally displays model name, numeric count, and estimated cost."
        },
        {
          "name": "::TokenMeter<'a>::new",
          "line": 59,
          "signature": "#[must_use]\npub fn new(used: u64, limit: u64) -> Self;",
          "documentation": "Create a new token meter with used and limit counts.\n\n# Examples\n\n```\nuse harness_tui_kit::TokenMeter;\n\nlet meter = TokenMeter::new(1000, 4096);\n```"
        },
        {
          "name": "::TokenMeter<'a>::model",
          "line": 71,
          "signature": "#[must_use]\npub fn model(mut self, model: &'a str) -> Self;",
          "documentation": "Set the model name label."
        },
        {
          "name": "::TokenMeter<'a>::cost",
          "line": 78,
          "signature": "#[must_use]\npub fn cost(mut self, cost: &'a str) -> Self;",
          "documentation": "Set the estimated cost display."
        },
        {
          "name": "::TokenMeter<'a>::theme",
          "line": 85,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/mod.rs",
      "sha256": "07025a6f2f654560ea7274644f075b441aad378f987585593474ec0210a64e57",
      "artifactSha256": "175974f5aa402dce52af7f0bbc7170e387726ce8d1607fc8793afe04afb8e3d5",
      "url": "/reference/source/harness-tui-kit/src/components/mod.rs.txt",
      "declarations": [
        {
          "name": "agent",
          "line": 3,
          "signature": "pub mod agent;",
          "documentation": "TUI components organized by domain."
        },
        {
          "name": "chat",
          "line": 4,
          "signature": "pub mod chat;",
          "documentation": ""
        },
        {
          "name": "governance",
          "line": 5,
          "signature": "pub mod governance;",
          "documentation": ""
        },
        {
          "name": "harness",
          "line": 6,
          "signature": "pub mod harness;",
          "documentation": ""
        },
        {
          "name": "history",
          "line": 7,
          "signature": "pub mod history;",
          "documentation": ""
        },
        {
          "name": "hitl",
          "line": 8,
          "signature": "pub mod hitl;",
          "documentation": ""
        },
        {
          "name": "metrics",
          "line": 9,
          "signature": "pub mod metrics;",
          "documentation": ""
        },
        {
          "name": "system",
          "line": 10,
          "signature": "pub mod system;",
          "documentation": ""
        },
        {
          "name": "workflow",
          "line": 11,
          "signature": "pub mod workflow;",
          "documentation": ""
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/app_shell.rs",
      "sha256": "cb2943fea94f40dd0abff1eb1a83352608ab05f5da1f210ba49746d798e62bfd",
      "artifactSha256": "50089ee24134e583774539527f2220925fa5615ff1150c3f3aeb0b4eead1a2db",
      "url": "/reference/source/harness-tui-kit/src/components/system/app_shell.rs.txt",
      "declarations": [
        {
          "name": "::ShellPanel",
          "line": 66,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]\npub enum ShellPanel {\n    /// The top header strip.\n    Header,\n    /// The left sidebar panel.\n    Sidebar,\n    /// The main content area.\n    #[default]\n    Content,\n    /// The bottom footer strip.\n    Footer,\n}",
          "documentation": "Identifies a panel within the application shell.\n\nUsed for focus tracking and determining which panel border should\nreceive the accent color highlight.\n\n# Variants\n\n- [`Header`](ShellPanel::Header) \u2014 The fixed-height strip at the top.\n- [`Sidebar`](ShellPanel::Sidebar) \u2014 The fixed-width panel on the left.\n- [`Content`](ShellPanel::Content) \u2014 The main content area (default focus).\n- [`Footer`](ShellPanel::Footer) \u2014 The fixed-height strip at the bottom."
        },
        {
          "name": "::AppShellState",
          "line": 117,
          "signature": "#[derive(Debug, Clone)]\npub struct AppShellState {\n\n}",
          "documentation": "Mutable state for [`AppShell`], persists across frames.\n\nTracks focus, sidebar visibility, and computed layout rectangles. After\nrendering, the computed [`Rect`] areas are available via accessor methods\nfor the caller to render content into each panel.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::{AppShellState, ShellPanel};\n\nlet mut state = AppShellState::default();\nassert_eq!(state.focused_panel(), ShellPanel::Content);\nassert!(!state.is_sidebar_collapsed());\n\nstate.toggle_sidebar();\nassert!(state.is_sidebar_collapsed());\n\nstate.cycle_focus();\nassert_eq!(state.focused_panel(), ShellPanel::Footer);\n```"
        },
        {
          "name": "::AppShellState::toggle_sidebar",
          "line": 163,
          "signature": "pub fn toggle_sidebar(&mut self);",
          "documentation": "Toggle sidebar between collapsed and expanded.\n\nWhen collapsed, the sidebar width becomes zero and the content area\nexpands to fill the remaining space.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::AppShellState;\n\nlet mut state = AppShellState::default();\nassert!(!state.is_sidebar_collapsed());\nstate.toggle_sidebar();\nassert!(state.is_sidebar_collapsed());\nstate.toggle_sidebar();\nassert!(!state.is_sidebar_collapsed());\n```"
        },
        {
          "name": "::AppShellState::set_focus",
          "line": 184,
          "signature": "pub fn set_focus(&mut self, panel: ShellPanel);",
          "documentation": "Set the currently focused panel.\n\nThe focused panel's adjacent borders are drawn with the accent color.\n\n# Arguments\n\n* `panel` \u2014 The panel to focus.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::{AppShellState, ShellPanel};\n\nlet mut state = AppShellState::default();\nstate.set_focus(ShellPanel::Sidebar);\nassert_eq!(state.focused_panel(), ShellPanel::Sidebar);\n```"
        },
        {
          "name": "::AppShellState::cycle_focus",
          "line": 205,
          "signature": "pub fn cycle_focus(&mut self);",
          "documentation": "Cycle focus to the next panel.\n\nOrder: `Header` -> `Sidebar` -> `Content` -> `Footer` -> `Header`.\nIf the sidebar is collapsed, `Sidebar` is skipped in the cycle.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::{AppShellState, ShellPanel};\n\nlet mut state = AppShellState::default();\nassert_eq!(state.focused_panel(), ShellPanel::Content);\nstate.cycle_focus();\nassert_eq!(state.focused_panel(), ShellPanel::Footer);\nstate.cycle_focus();\nassert_eq!(state.focused_panel(), ShellPanel::Header);\n```"
        },
        {
          "name": "::AppShellState::is_sidebar_collapsed",
          "line": 225,
          "signature": "#[must_use]\npub fn is_sidebar_collapsed(&self) -> bool;",
          "documentation": "Check whether the sidebar is currently collapsed.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::AppShellState;\n\nlet state = AppShellState::default();\nassert!(!state.is_sidebar_collapsed());\n```"
        },
        {
          "name": "::AppShellState::focused_panel",
          "line": 240,
          "signature": "#[must_use]\npub fn focused_panel(&self) -> ShellPanel;",
          "documentation": "Get the currently focused panel.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::{AppShellState, ShellPanel};\n\nlet state = AppShellState::default();\nassert_eq!(state.focused_panel(), ShellPanel::Content);\n```"
        },
        {
          "name": "::AppShellState::reset",
          "line": 258,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset state to defaults (content focused, sidebar visible, zero-area rects).\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::{AppShellState, ShellPanel};\n\nlet mut state = AppShellState::default();\nstate.set_focus(ShellPanel::Footer);\nstate.toggle_sidebar();\nstate.reset();\nassert_eq!(state.focused_panel(), ShellPanel::Content);\nassert!(!state.is_sidebar_collapsed());\n```"
        },
        {
          "name": "::AppShellState::header_area",
          "line": 276,
          "signature": "#[must_use]\npub fn header_area(&self) -> Rect;",
          "documentation": "Get the computed header area from the last render.\n\nReturns [`Rect::ZERO`] if the widget has not been rendered yet.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::AppShellState;\nuse ratatui::layout::Rect;\n\nlet state = AppShellState::default();\nassert_eq!(state.header_area(), Rect::ZERO);\n```"
        },
        {
          "name": "::AppShellState::sidebar_area",
          "line": 295,
          "signature": "#[must_use]\npub fn sidebar_area(&self) -> Rect;",
          "documentation": "Get the computed sidebar area from the last render.\n\nReturns a zero-width [`Rect`] when the sidebar is collapsed.\nReturns [`Rect::ZERO`] if the widget has not been rendered yet.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::AppShellState;\nuse ratatui::layout::Rect;\n\nlet state = AppShellState::default();\nassert_eq!(state.sidebar_area(), Rect::ZERO);\n```"
        },
        {
          "name": "::AppShellState::content_area",
          "line": 313,
          "signature": "#[must_use]\npub fn content_area(&self) -> Rect;",
          "documentation": "Get the computed content area from the last render.\n\nReturns [`Rect::ZERO`] if the widget has not been rendered yet.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::AppShellState;\nuse ratatui::layout::Rect;\n\nlet state = AppShellState::default();\nassert_eq!(state.content_area(), Rect::ZERO);\n```"
        },
        {
          "name": "::AppShellState::footer_area",
          "line": 331,
          "signature": "#[must_use]\npub fn footer_area(&self) -> Rect;",
          "documentation": "Get the computed footer area from the last render.\n\nReturns [`Rect::ZERO`] if the widget has not been rendered yet.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::AppShellState;\nuse ratatui::layout::Rect;\n\nlet state = AppShellState::default();\nassert_eq!(state.footer_area(), Rect::ZERO);\n```"
        },
        {
          "name": "::AppShell",
          "line": 384,
          "signature": "#[derive(Debug, Clone)]\npub struct AppShell<'a> {\n\n}",
          "documentation": "Application shell layout widget.\n\nComputes a 4-slot layout (header, footer, sidebar, content) within the given\narea and draws thin border lines (`\u2502`, `\u2500`) between panels when borders are\nenabled. The widget itself only draws the divider lines; the caller retrieves\nthe computed sub-areas from [`AppShellState`] to render content.\n\n# Layout\n\n```text\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                 Header                  \u2502  (header_height rows)\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502          \u2502                              \u2502\n\u2502 Sidebar  \u2502          Content             \u2502\n\u2502          \u2502                              \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502                 Footer                  \u2502  (footer_height rows)\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::{AppShell, AppShellState};\nuse harness_tui_kit::Theme;\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet theme = Theme::dark();\nlet mut state = AppShellState::default();\nlet area = Rect::new(0, 0, 80, 24);\nlet mut buf = Buffer::empty(area);\nAppShell::new()\n    .theme(&theme)\n    .header_height(2)\n    .sidebar_width(30)\n    .show_borders(true)\n    .render(area, &mut buf, &mut state);\n\n// Now use the computed areas\nlet content_rect = state.content_area();\nassert!(content_rect.width > 0);\n```"
        },
        {
          "name": "::AppShell<'a>::new",
          "line": 411,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new application shell with default settings.\n\nDefaults: `header_height=1`, `footer_height=1`, `sidebar_width=25`,\n`show_borders=true`.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::AppShell;\n\nlet shell = AppShell::new();\n```"
        },
        {
          "name": "::AppShell<'a>::theme",
          "line": 433,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme for border rendering.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::AppShell;\nuse harness_tui_kit::Theme;\n\nlet theme = Theme::midnight();\nlet shell = AppShell::new().theme(&theme);\n```"
        },
        {
          "name": "::AppShell<'a>::header_height",
          "line": 448,
          "signature": "#[must_use]\npub fn header_height(mut self, height: u16) -> Self;",
          "documentation": "Set the header height in rows.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::AppShell;\n\nlet shell = AppShell::new().header_height(3);\n```"
        },
        {
          "name": "::AppShell<'a>::footer_height",
          "line": 463,
          "signature": "#[must_use]\npub fn footer_height(mut self, height: u16) -> Self;",
          "documentation": "Set the footer height in rows.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::AppShell;\n\nlet shell = AppShell::new().footer_height(2);\n```"
        },
        {
          "name": "::AppShell<'a>::sidebar_width",
          "line": 478,
          "signature": "#[must_use]\npub fn sidebar_width(mut self, width: u16) -> Self;",
          "documentation": "Set the sidebar width in columns.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::AppShell;\n\nlet shell = AppShell::new().sidebar_width(40);\n```"
        },
        {
          "name": "::AppShell<'a>::show_borders",
          "line": 498,
          "signature": "#[must_use]\npub fn show_borders(mut self, show: bool) -> Self;",
          "documentation": "Set whether to draw border lines between panels.\n\nWhen `true`, thin lines (`\u2502` between sidebar and content, `\u2500` between\nheader/footer and the middle row) are drawn. The focused panel's\nadjacent borders use the accent color; unfocused borders use the\ndefault border color.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::app_shell::AppShell;\n\nlet shell = AppShell::new().show_borders(false);\n```"
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/banner.rs",
      "sha256": "cc07971f3297b5ee4f4720e11e7b125f20ef3fbdf756c45511a90b9a3b5ece54",
      "artifactSha256": "f1494f079e9fc3ec969dd5ea514111c31fe346a598e024f41bd07a42fc927a14",
      "url": "/reference/source/harness-tui-kit/src/components/system/banner.rs.txt",
      "declarations": [
        {
          "name": "::Banner",
          "line": 117,
          "signature": "#[derive(Debug, Clone)]\npub struct Banner<'a> {\n\n}",
          "documentation": "ASCII art banner text renderer.\n\nRenders text as large block characters (5 rows tall) with optional\ncolor gradient support. Supports A-Z, 0-9, space, and basic punctuation\n(`-`, `.`, `!`, `?`). Input text is uppercased before rendering.\n\nUnknown characters are rendered as a gap equal to one space glyph.\n\nWhen the total rendered width exceeds the available area, characters that\ndo not fit are silently truncated. The banner is vertically centred when\nthe area height exceeds 5 rows.\n\n# Examples\n\n```\nuse harness_tui_kit::{Banner, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::Widget;\n\nlet banner = Banner::new(\"HELLO\");\nlet area = Rect::new(0, 0, 40, 5);\nlet mut buf = Buffer::empty(area);\nbanner.render(area, &mut buf);\n```"
        },
        {
          "name": "::Banner<'a>::new",
          "line": 132,
          "signature": "#[must_use]\npub fn new(text: &'a str) -> Self;",
          "documentation": "Create a new banner with the given text and default settings.\n\nThe default theme is [`crate::DEFAULT_THEME`] (dark) and gradient is\ndisabled. Use the builder methods to change these."
        },
        {
          "name": "::Banner<'a>::gradient",
          "line": 146,
          "signature": "#[must_use]\npub fn gradient(mut self, gradient: bool) -> Self;",
          "documentation": "Enable or disable the left-to-right color gradient.\n\nWhen enabled the foreground color is interpolated from `theme.accent`\n(left edge) to `theme.success` (right edge) across the total rendered\nwidth."
        },
        {
          "name": "::Banner<'a>::theme",
          "line": 153,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme used for colors."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/block_logo.rs",
      "sha256": "56099bfc61b8c840513d6907ca391b7a641b39fc68d1280f5087dbc1c553edc6",
      "artifactSha256": "72747cadca4a7106b32313894bdae326d0887bb08772dad2d5d9c540f0fdf426",
      "url": "/reference/source/harness-tui-kit/src/components/system/block_logo.rs.txt",
      "declarations": [
        {
          "name": "::BLOCK_LOGO_HEIGHT",
          "line": 26,
          "signature": "pub const BLOCK_LOGO_HEIGHT: u16;",
          "documentation": "Number of cell rows each glyph occupies."
        },
        {
          "name": "::BLOCK_LOGO_GLYPH_WIDTH",
          "line": 28,
          "signature": "pub const BLOCK_LOGO_GLYPH_WIDTH: u16;",
          "documentation": "Width of a single glyph in terminal cells."
        },
        {
          "name": "::BLOCK_LOGO_SPACING",
          "line": 30,
          "signature": "pub const BLOCK_LOGO_SPACING: u16;",
          "documentation": "Spacing inserted between glyphs."
        },
        {
          "name": "::BlockLogo",
          "line": 50,
          "signature": "#[derive(Debug, Clone)]\npub struct BlockLogo<'a> {\n\n}",
          "documentation": "A hero-sized block-letter logo.\n\n# Examples\n\n```\nuse harness_tui_kit::{BlockLogo, Theme};\nuse ratatui::buffer::Buffer;\nuse ratatui::layout::Rect;\nuse ratatui::widgets::Widget;\n\nlet theme = Theme::claude();\nlet area = Rect::new(0, 0, 80, 8);\nlet mut buf = Buffer::empty(area);\nBlockLogo::new(\"clausen\").theme(&theme).render(area, &mut buf);\n```"
        },
        {
          "name": "::BlockLogo<'a>::new",
          "line": 67,
          "signature": "#[must_use]\npub fn new(text: &'a str) -> Self;",
          "documentation": "Create a logo for `text`. Lowercase letters are folded to\nuppercase glyphs since the bundled font is uppercase-only."
        },
        {
          "name": "::BlockLogo<'a>::theme",
          "line": 79,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::BlockLogo<'a>::fill",
          "line": 86,
          "signature": "#[must_use]\npub fn fill(mut self, color: Color) -> Self;",
          "documentation": "Override the fill color (defaults to `theme.fg_primary`)."
        },
        {
          "name": "::BlockLogo<'a>::gradient",
          "line": 96,
          "signature": "#[must_use]\npub fn gradient(mut self, from: Color, to: Color) -> Self;",
          "documentation": "Set a horizontal color gradient: cells are linearly\ninterpolated from `from` (left edge) to `to` (right edge).\nBoth endpoints must be RGB colors; non-RGB inputs are\nsilently treated as the fixed [`Self::fill`] color."
        },
        {
          "name": "::BlockLogo<'a>::dim_prefix",
          "line": 106,
          "signature": "#[must_use]\npub fn dim_prefix(mut self, n: usize) -> Self;",
          "documentation": "Render the first `n` characters of the brand at half-strength\n(using `theme.fg_disabled`) so the latter half pops. Set this\nto e.g. `4` when the brand text is \"opencode\" so \"open\" is\ndim and \"code\" is bright \u2014 mirroring the opencode banner."
        },
        {
          "name": "::BlockLogo<'a>::measured_width",
          "line": 113,
          "signature": "#[must_use]\npub fn measured_width(&self) -> u16;",
          "documentation": "Total width in cells the logo will occupy when rendered."
        },
        {
          "name": "::BlockLogo<'a>::measured_height",
          "line": 123,
          "signature": "#[must_use]\npub const fn measured_height(&self) -> u16;",
          "documentation": "Height in cells."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/command_palette.rs",
      "sha256": "202243418e6fc5a3e5114988a9c4ef36a7bf6345e619e90b75f48b3bc121e9bf",
      "artifactSha256": "88d3e1e8525d9f04dc73f0a4406ca623ae816a79d441b09737a15199810a9ba6",
      "url": "/reference/source/harness-tui-kit/src/components/system/command_palette.rs.txt",
      "declarations": [
        {
          "name": "::fuzzy_score",
          "line": 84,
          "signature": "#[must_use]\npub fn fuzzy_score(query: &str, text: &str) -> Option<u32>;",
          "documentation": "Compute a fuzzy match score between a query and a target text.\n\nPerforms case-insensitive ordered substring matching: every character in `query`\nmust appear in `text` in order, but not necessarily contiguously. The score is\nthe sum of a consecutive-match bonus and a position bonus (earlier matches score\nhigher).\n\nReturns `None` if not all query characters are found in order.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::command_palette::fuzzy_score;\n\nassert!(fuzzy_score(\"of\", \"Open File\").is_some());\nassert!(fuzzy_score(\"xyz\", \"Open File\").is_none());\nassert_eq!(fuzzy_score(\"\", \"anything\"), Some(0));\n```"
        },
        {
          "name": "::CommandPaletteState",
          "line": 150,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct CommandPaletteState {\n\n}",
          "documentation": "Mutable state for [`CommandPalette`], persists across frames.\n\nTracks the current search query, which items match the query, the selected\nindex within the filtered list, and whether the palette is visible.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::command_palette::CommandPaletteState;\nuse harness_tui_kit::PaletteItem;\n\nlet items = vec![\n    PaletteItem::new(\"Open\", \"Open file\", \"File\"),\n    PaletteItem::new(\"Save\", \"Save file\", \"File\"),\n];\nlet mut state = CommandPaletteState::default();\nstate.show();\nstate.set_query(\"sav\", &items);\nassert_eq!(state.filtered_indices().len(), 1);\n```"
        },
        {
          "name": "::CommandPaletteState::set_query",
          "line": 167,
          "signature": "pub fn set_query(&mut self, text: &str, items: &[PaletteItem]);",
          "documentation": "Set the search query and refilter items.\n\nReplaces the current query with `text` (after sanitization), recomputes\nthe filtered indices, and resets the selection to the first result."
        },
        {
          "name": "::CommandPaletteState::append_char",
          "line": 176,
          "signature": "pub fn append_char(&mut self, ch: char);",
          "documentation": "Append a character to the current query.\n\nDoes not refilter automatically; call [`refilter`](Self::refilter) after\nappending to update the filtered results."
        },
        {
          "name": "::CommandPaletteState::delete_char",
          "line": 184,
          "signature": "pub fn delete_char(&mut self);",
          "documentation": "Delete the last character from the query.\n\nDoes not refilter automatically; call [`refilter`](Self::refilter) after\ndeleting to update the filtered results."
        },
        {
          "name": "::CommandPaletteState::refilter",
          "line": 193,
          "signature": "pub fn refilter(&mut self, items: &[PaletteItem]);",
          "documentation": "Recompute filtered indices based on the current query.\n\nWhen the query is empty, all items are included (in original order).\nOtherwise, items are fuzzy-matched and sorted by score descending.\nResets the selected index to 0."
        },
        {
          "name": "::CommandPaletteState::select_next",
          "line": 226,
          "signature": "pub fn select_next(&mut self);",
          "documentation": "Move selection to the next filtered item.\n\nWraps around to the first item when at the end."
        },
        {
          "name": "::CommandPaletteState::select_prev",
          "line": 239,
          "signature": "pub fn select_prev(&mut self);",
          "documentation": "Move selection to the previous filtered item.\n\nStops at the first item (does not wrap)."
        },
        {
          "name": "::CommandPaletteState::confirm",
          "line": 248,
          "signature": "#[must_use]\npub fn confirm(&self) -> Option<usize>;",
          "documentation": "Confirm the current selection and return the original index.\n\nReturns `Some(index)` where `index` is the position in the original\nitems slice, or `None` if there are no filtered results."
        },
        {
          "name": "::CommandPaletteState::show",
          "line": 255,
          "signature": "pub fn show(&mut self);",
          "documentation": "Show the command palette.\n\nMakes the palette visible on the next render frame."
        },
        {
          "name": "::CommandPaletteState::hide",
          "line": 262,
          "signature": "pub fn hide(&mut self);",
          "documentation": "Hide the command palette.\n\nMakes the palette invisible on the next render frame."
        },
        {
          "name": "::CommandPaletteState::toggle",
          "line": 269,
          "signature": "pub fn toggle(&mut self);",
          "documentation": "Toggle the palette's visibility.\n\nIf visible, hides it. If hidden, shows it."
        },
        {
          "name": "::CommandPaletteState::is_visible",
          "line": 275,
          "signature": "#[must_use]\npub fn is_visible(&self) -> bool;",
          "documentation": "Returns `true` if the palette is currently visible."
        },
        {
          "name": "::CommandPaletteState::reset",
          "line": 282,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset the palette to its default state.\n\nClears the query, selection, filtered indices, and hides the palette."
        },
        {
          "name": "::CommandPaletteState::query",
          "line": 288,
          "signature": "#[must_use]\npub fn query(&self) -> &str;",
          "documentation": "Returns the current search query."
        },
        {
          "name": "::CommandPaletteState::selected",
          "line": 294,
          "signature": "#[must_use]\npub fn selected(&self) -> usize;",
          "documentation": "Returns the current selected index within filtered results."
        },
        {
          "name": "::CommandPaletteState::filtered_indices",
          "line": 300,
          "signature": "#[must_use]\npub fn filtered_indices(&self) -> &[usize];",
          "documentation": "Returns the filtered indices."
        },
        {
          "name": "::CommandPalette",
          "line": 341,
          "signature": "#[derive(Debug, Clone)]\npub struct CommandPalette<'a> {\n\n}",
          "documentation": "Overlay command palette for searching and selecting commands.\n\nRenders as a centered overlay on top of the existing terminal content when\nthe state is visible. The palette contains:\n\n1. A search input row with a `> ` prompt, the current query, and a cursor\n2. Filtered result rows grouped by category, with label (bold), description\n   (muted), category badge (right-aligned, dimmed), and optional shortcut\n\nThe background behind the palette is dimmed. Items are fuzzy-matched against\nthe current query and sorted by relevance.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::command_palette::{CommandPalette, CommandPaletteState};\nuse harness_tui_kit::{PaletteItem, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet items = vec![\n    PaletteItem::new(\"Open File\", \"Open a file\", \"File\"),\n];\nlet theme = Theme::dark();\nlet mut state = CommandPaletteState::default();\nstate.show();\nstate.refilter(&items);\n\nlet area = Rect::new(0, 0, 80, 30);\nlet mut buf = Buffer::empty(area);\nCommandPalette::new(&items).theme(&theme).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::CommandPalette<'a>::new",
          "line": 357,
          "signature": "#[must_use]\npub fn new(items: &'a [PaletteItem]) -> Self;",
          "documentation": "Create a new command palette with the given items.\n\nUses the default theme, 12 max visible rows, and 60% width."
        },
        {
          "name": "::CommandPalette<'a>::theme",
          "line": 368,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme (builder pattern)."
        },
        {
          "name": "::CommandPalette<'a>::max_visible",
          "line": 375,
          "signature": "#[must_use]\npub fn max_visible(mut self, max_visible: usize) -> Self;",
          "documentation": "Set the maximum number of visible result rows (builder pattern)."
        },
        {
          "name": "::CommandPalette<'a>::width_percent",
          "line": 384,
          "signature": "#[must_use]\npub fn width_percent(mut self, pct: u16) -> Self;",
          "documentation": "Set the width as a percentage of the terminal area (builder pattern).\n\nClamped to 10..=100. Values outside this range are clamped."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/custom_logo.rs",
      "sha256": "7f305e53a61702cfad178c9f6d986028645b9b1d9f1e0416ef46d9d3c0d8599c",
      "artifactSha256": "02e24eec059c17194e894271c8ec1a29cb0fc1961aac25b69ea5e5bbff702c28",
      "url": "/reference/source/harness-tui-kit/src/components/system/custom_logo.rs.txt",
      "declarations": [
        {
          "name": "::CLAUSEN_LOGO_ROWS",
          "line": 33,
          "signature": "pub const CLAUSEN_LOGO_ROWS: &[&str];",
          "documentation": "Hand-authored Clausen wordmark \u2014 7 rows, ~100 cells wide.\n\nExported from `/Volumes/L1feAI/l1feosx/clausen-text-logo.rs` and\nstripped of ANSI styling so the widget can apply theme colors."
        },
        {
          "name": "::CustomLogo",
          "line": 45,
          "signature": "#[derive(Debug, Clone)]\npub struct CustomLogo<'a> {\n\n}",
          "documentation": "Render arbitrary block art onto a [`Buffer`]."
        },
        {
          "name": "::CustomLogo<'a>::new",
          "line": 57,
          "signature": "#[must_use]\npub fn new(rows: &'a [&'a str]) -> Self;",
          "documentation": "Construct a custom logo from explicit rows."
        },
        {
          "name": "::CustomLogo<'a>::clausen",
          "line": 68,
          "signature": "#[must_use]\npub fn clausen() -> Self;",
          "documentation": "Convenience: render the bundled Clausen wordmark."
        },
        {
          "name": "::CustomLogo<'a>::theme",
          "line": 74,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::CustomLogo<'a>::fill",
          "line": 81,
          "signature": "#[must_use]\npub fn fill(mut self, color: Color) -> Self;",
          "documentation": "Override the `\u2588` (full block) fill color."
        },
        {
          "name": "::CustomLogo<'a>::shade",
          "line": 88,
          "signature": "#[must_use]\npub fn shade(mut self, color: Color) -> Self;",
          "documentation": "Override the `\u2591` (shade) color."
        },
        {
          "name": "::CustomLogo<'a>::measured_width",
          "line": 95,
          "signature": "#[must_use]\npub fn measured_width(&self) -> u16;",
          "documentation": "Width in cells the logo occupies (max row length)."
        },
        {
          "name": "::CustomLogo<'a>::measured_height",
          "line": 105,
          "signature": "#[must_use]\npub fn measured_height(&self) -> u16;",
          "documentation": "Height in cells (number of rows)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/focus_card.rs",
      "sha256": "1c5f54fe17edb600d765f2faf6cac97142862d2034e327c06c7eb06d4b23ca4c",
      "artifactSha256": "cb2103497bcbdec7554e6b6a741395a2cae7a6f0d7c3701674eb4b7218788785",
      "url": "/reference/source/harness-tui-kit/src/components/system/focus_card.rs.txt",
      "declarations": [
        {
          "name": "::FocusCard",
          "line": 65,
          "signature": "#[derive(Debug, Clone)]\npub struct FocusCard<'a> {\n\n}",
          "documentation": "An elevated composer-style panel.\n\nLayout:\n\n```text\n\u258e Ask anything... \"Fix a TODO in the codebase\"\n\u258e\n\u258e Build \u00b7 Kimi K2.6 Kimi For Coding\n```\n\nThe accent stripe color comes from `theme.accent`. The placeholder\nis rendered dim/italic, and the meta line uses a bold mode tag\nfollowed by a dim model name and tagline.\n\n# Examples\n\n```\nuse harness_tui_kit::{FocusCard, Theme};\nuse ratatui::buffer::Buffer;\nuse ratatui::layout::Rect;\nuse ratatui::widgets::Widget;\n\nlet theme = Theme::claude();\nlet area = Rect::new(0, 0, 80, 5);\nlet mut buf = Buffer::empty(area);\nFocusCard::new()\n    .placeholder(\"Ask anything... \\\"Fix a TODO in the codebase\\\"\")\n    .mode(\"Build\")\n    .model(\"Kimi K2.6\")\n    .tagline(\"Kimi For Coding\")\n    .theme(&theme)\n    .render(area, &mut buf);\n```"
        },
        {
          "name": "::FocusCard<'a>::new",
          "line": 76,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Construct a card with default empty content."
        },
        {
          "name": "::FocusCard<'a>::placeholder",
          "line": 88,
          "signature": "#[must_use]\npub fn placeholder(mut self, text: &'a str) -> Self;",
          "documentation": "Set the dim placeholder line shown at the top of the card."
        },
        {
          "name": "::FocusCard<'a>::mode",
          "line": 96,
          "signature": "#[must_use]\npub fn mode(mut self, label: &'a str) -> Self;",
          "documentation": "Set the bold mode tag rendered first on the meta line\n(e.g. `\"Build\"`, `\"Plan\"`, `\"Auto\"`)."
        },
        {
          "name": "::FocusCard<'a>::model",
          "line": 103,
          "signature": "#[must_use]\npub fn model(mut self, name: &'a str) -> Self;",
          "documentation": "Set the model name shown after the mode tag (e.g. `\"GPT-4o\"`)."
        },
        {
          "name": "::FocusCard<'a>::tagline",
          "line": 111,
          "signature": "#[must_use]\npub fn tagline(mut self, text: &'a str) -> Self;",
          "documentation": "Set the dim tagline that follows the model name on the meta\nline (e.g. `\"Kimi For Coding\"`)."
        },
        {
          "name": "::FocusCard<'a>::theme",
          "line": 118,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::FocusCard<'a>::suggested_height",
          "line": 126,
          "signature": "#[must_use]\npub const fn suggested_height() -> u16;",
          "documentation": "Suggested height: 1 placeholder + 1 spacer + 1 meta = 3 rows\nof content + 2 vertical pad rows = 5 rows total."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/goal_display.rs",
      "sha256": "8dea79888504ecd7332070e7d5bbacecc447c2d98acf68c3993ba34575e99657",
      "artifactSha256": "94f043b33de631562c6fbed570d42f62d9da926a530d1779d7c160f555a81c4e",
      "url": "/reference/source/harness-tui-kit/src/components/system/goal_display.rs.txt",
      "declarations": [
        {
          "name": "::GoalStepStatus",
          "line": 22,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum GoalStepStatus {\n    /// Not started yet.\n    Pending,\n    /// Currently executing.\n    InProgress,\n    /// Completed successfully.\n    Done,\n    /// Skipped by the user / planner.\n    Skipped,\n    /// Failed (with an error).\n    Failed,\n}",
          "documentation": "Status of one step in the goal plan."
        },
        {
          "name": "::GoalStep",
          "line": 49,
          "signature": "#[derive(Debug, Clone)]\npub struct GoalStep {\n/// One-line description of the step.\n\npub label: String,\n/// Current execution status.\n\npub status: GoalStepStatus\n}",
          "documentation": "One step in a goal plan."
        },
        {
          "name": "::GoalStep::new",
          "line": 59,
          "signature": "#[must_use]\npub fn new(label: impl Into<String>, status: GoalStepStatus) -> Self;",
          "documentation": "Convenience constructor."
        },
        {
          "name": "::GoalDisplay",
          "line": 69,
          "signature": "#[derive(Debug, Clone)]\npub struct GoalDisplay<'a> {\n\n}",
          "documentation": "Goal panel widget."
        },
        {
          "name": "::GoalDisplay<'a>::new",
          "line": 80,
          "signature": "#[must_use]\npub fn new(goal: &'a str, steps: &'a [GoalStep]) -> Self;",
          "documentation": "Construct a new goal panel."
        },
        {
          "name": "::GoalDisplay<'a>::title",
          "line": 92,
          "signature": "#[must_use]\npub fn title(mut self, title: &'a str) -> Self;",
          "documentation": "Override the panel title."
        },
        {
          "name": "::GoalDisplay<'a>::no_border",
          "line": 100,
          "signature": "#[must_use]\npub fn no_border(mut self) -> Self;",
          "documentation": "Disable the bordered block \u2014 useful when embedding the goal\ndisplay inside another container."
        },
        {
          "name": "::GoalDisplay<'a>::theme",
          "line": 107,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/hint_bar.rs",
      "sha256": "cf0823e78394b29e32cf04d707fc49b047ff04765d882b05780cd2399d05abc5",
      "artifactSha256": "48b3c47a6651daeb9ffee1ab5b17d386138cb6cea9cebb6093dd6c7c598354b3",
      "url": "/reference/source/harness-tui-kit/src/components/system/hint_bar.rs.txt",
      "declarations": [
        {
          "name": "::HintItem",
          "line": 25,
          "signature": "#[derive(Debug, Clone)]\npub struct HintItem {\n/// Keystroke label (e.g. `\"tab\"`, `\"ctrl+p\"`).\n\npub key: String,\n/// What the key does (e.g. `\"agents\"`, `\"commands\"`).\n\npub action: String\n}",
          "documentation": "A single key/action pair."
        },
        {
          "name": "::HintItem::new",
          "line": 35,
          "signature": "#[must_use]\npub fn new(key: impl Into<String>, action: impl Into<String>) -> Self;",
          "documentation": "Construct a hint item."
        },
        {
          "name": "::HintItem::width",
          "line": 44,
          "signature": "#[must_use]\npub fn width(&self) -> u16;",
          "documentation": "Width in cells the item will occupy: `key`+space+`action`."
        },
        {
          "name": "::HintBar",
          "line": 51,
          "signature": "#[derive(Debug, Clone)]\npub struct HintBar<'a> {\n\n}",
          "documentation": "Right-aligned hint row."
        },
        {
          "name": "::HintBar<'a>::new",
          "line": 64,
          "signature": "#[must_use]\npub fn new(items: &'a [HintItem]) -> Self;",
          "documentation": "Create a hint bar from a slice of pairs."
        },
        {
          "name": "::HintBar<'a>::theme",
          "line": 75,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::HintBar<'a>::right_align",
          "line": 82,
          "signature": "#[must_use]\npub fn right_align(mut self, on: bool) -> Self;",
          "documentation": "Toggle right-alignment (default: on)."
        },
        {
          "name": "::HintBar<'a>::item_gap",
          "line": 89,
          "signature": "#[must_use]\npub fn item_gap(mut self, gap: u16) -> Self;",
          "documentation": "Override the inter-item gap (default: 3 cells)."
        },
        {
          "name": "::HintBar<'a>::measured_width",
          "line": 96,
          "signature": "#[must_use]\npub fn measured_width(&self) -> u16;",
          "documentation": "Total width the items will consume."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/keyboard_help.rs",
      "sha256": "8000990550f10cd3f075575a2e9e615e927e8cada886fe1ddff4beac79761fef",
      "artifactSha256": "5ff8405325190b2a850aee5b519a3120433615e2e44b78c393798859c8743f4c",
      "url": "/reference/source/harness-tui-kit/src/components/system/keyboard_help.rs.txt",
      "declarations": [
        {
          "name": "::KeyboardHelpState",
          "line": 85,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct KeyboardHelpState {\n\n}",
          "documentation": "Mutable state for [`KeyboardHelp`], persists across frames.\n\nTracks the overlay's visibility and vertical scroll position.\nToggle visibility with [`show`](KeyboardHelpState::show),\n[`hide`](KeyboardHelpState::hide), or [`toggle`](KeyboardHelpState::toggle).\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::keyboard_help::KeyboardHelpState;\n\nlet mut state = KeyboardHelpState::default();\nassert!(!state.is_visible());\nstate.show();\nassert!(state.is_visible());\nstate.toggle();\nassert!(!state.is_visible());\n```"
        },
        {
          "name": "::KeyboardHelpState::show",
          "line": 97,
          "signature": "pub fn show(&mut self);",
          "documentation": "Show the help overlay.\n\nMakes the overlay visible on the next render frame.\nResets the scroll position to the top."
        },
        {
          "name": "::KeyboardHelpState::hide",
          "line": 103,
          "signature": "pub fn hide(&mut self);",
          "documentation": "Hide the help overlay."
        },
        {
          "name": "::KeyboardHelpState::toggle",
          "line": 110,
          "signature": "pub fn toggle(&mut self);",
          "documentation": "Toggle the help overlay's visibility.\n\nIf visible, hides it. If hidden, shows it (resetting scroll to top)."
        },
        {
          "name": "::KeyboardHelpState::is_visible",
          "line": 129,
          "signature": "#[must_use]\npub fn is_visible(&self) -> bool;",
          "documentation": "Returns `true` if the overlay is currently visible.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::keyboard_help::KeyboardHelpState;\n\nlet state = KeyboardHelpState::default();\nassert!(!state.is_visible());\n```"
        },
        {
          "name": "::KeyboardHelpState::scroll_up",
          "line": 136,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll the content up by one line.\n\nStops at the top (offset 0)."
        },
        {
          "name": "::KeyboardHelpState::scroll_down",
          "line": 144,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll the content down by one line.\n\nThe maximum scroll is clamped during rendering to prevent scrolling\npast the content."
        },
        {
          "name": "::KeyboardHelpState::reset",
          "line": 151,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset the state to its default values.\n\nHides the overlay and resets scroll to the top."
        },
        {
          "name": "::KeyboardHelp",
          "line": 193,
          "signature": "#[derive(Debug, Clone)]\npub struct KeyboardHelp<'a> {\n\n}",
          "documentation": "Overlay panel displaying keyboard shortcuts grouped by category.\n\nRenders as a centered overlay on top of the existing terminal content,\ndimming the background. Shortcuts are grouped by their category string\nand displayed in a two-column format (keys | description). When the\noverlay is wide enough, multiple shortcut columns are used:\n\n- Width < 80: single column\n- Width >= 80: two columns side by side\n- Width >= 120: three columns side by side\n\nThe overlay covers approximately 80% of the provided area in both\ndimensions.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::keyboard_help::{KeyboardHelp, KeyboardHelpState};\nuse harness_tui_kit::{KeyShortcut, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet shortcuts = vec![\n    KeyShortcut::new(\"q\", \"Quit\", \"General\"),\n    KeyShortcut::new(\"j\", \"Down\", \"Navigation\"),\n];\nlet mut state = KeyboardHelpState::default();\nstate.show();\n\nlet area = Rect::new(0, 0, 60, 20);\nlet mut buf = Buffer::empty(area);\nKeyboardHelp::new(&shortcuts).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::KeyboardHelp<'a>::new",
          "line": 207,
          "signature": "#[must_use]\npub fn new(shortcuts: &'a [KeyShortcut]) -> Self;",
          "documentation": "Create a new keyboard help overlay with the given shortcuts.\n\nUses the default theme and title \"Keyboard Shortcuts\"."
        },
        {
          "name": "::KeyboardHelp<'a>::title",
          "line": 217,
          "signature": "#[must_use]\npub fn title(mut self, title: &'a str) -> Self;",
          "documentation": "Set the title displayed at the top of the overlay."
        },
        {
          "name": "::KeyboardHelp<'a>::theme",
          "line": 224,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme for the overlay."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/log_viewer.rs",
      "sha256": "6a9bccc9dd8a60c31ea21341a4a3fdee7b9e4ccbdd521dd50db58763c3924584",
      "artifactSha256": "f802a8a0cbe433a59f2e758bbb52ef440fb32d6b2148853de55b541b91eb6e93",
      "url": "/reference/source/harness-tui-kit/src/components/system/log_viewer.rs.txt",
      "declarations": [
        {
          "name": "::LogViewer",
          "line": 100,
          "signature": "#[derive(Debug, Clone)]\npub struct LogViewer<'a> {\n\n}",
          "documentation": "Scrollable log viewer.\n\nDisplays log entries as a vertically scrollable list with colored level\nbadges. Entries can be filtered by level and searched by message substring.\nSupports auto-scroll mode that keeps the view pinned to the latest entries.\n\nThis is a [`StatefulWidget`] that renders against [`LogViewerState`].\n\n# Level Coloring\n\n- **Trace**: `fg_muted`\n- **Debug**: `fg_secondary`\n- **Info**: `success`\n- **Warn**: `warning`\n- **Error**: `error`\n\n# Examples\n\n```\nuse harness_tui_kit::{LogViewer, LogViewerState, LogEntry, LogLevel, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet entries = vec![LogEntry::new(LogLevel::Info, \"app\", \"Hello\")];\nlet mut state = LogViewerState::default();\nlet area = Rect::new(0, 0, 60, 10);\nlet mut buf = Buffer::empty(area);\nLogViewer::new(&entries).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::LogViewer<'a>::new",
          "line": 123,
          "signature": "#[must_use]\npub fn new(entries: &'a [LogEntry]) -> Self;",
          "documentation": "Create a new log viewer for the given entries.\n\nDefaults to the standard dark theme with auto-scroll disabled.\n\n# Examples\n\n```\nuse harness_tui_kit::{LogViewer, LogEntry, LogLevel};\n\nlet entries = vec![LogEntry::new(LogLevel::Info, \"app\", \"Hello\")];\nlet viewer = LogViewer::new(&entries);\n```"
        },
        {
          "name": "::LogViewer<'a>::theme",
          "line": 143,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme (builder pattern).\n\n# Examples\n\n```\nuse harness_tui_kit::{LogViewer, LogEntry, LogLevel, Theme};\n\nlet entries = vec![LogEntry::new(LogLevel::Info, \"app\", \"Hello\")];\nlet theme = Theme::midnight();\nlet viewer = LogViewer::new(&entries).theme(&theme);\n```"
        },
        {
          "name": "::LogViewer<'a>::auto_scroll",
          "line": 162,
          "signature": "#[must_use]\npub fn auto_scroll(mut self, enabled: bool) -> Self;",
          "documentation": "Set whether auto-scroll is enabled for new state objects (builder pattern).\n\nThis only affects the initial value; the state's `auto_scroll` field\nis read during rendering.\n\n# Examples\n\n```\nuse harness_tui_kit::{LogViewer, LogEntry, LogLevel};\n\nlet entries = vec![LogEntry::new(LogLevel::Info, \"app\", \"Hello\")];\nlet viewer = LogViewer::new(&entries).auto_scroll(true);\n```"
        },
        {
          "name": "::LogViewerState",
          "line": 201,
          "signature": "#[derive(Debug, Clone)]\npub struct LogViewerState {\n\n}",
          "documentation": "Mutable state for [`LogViewer`], persisted across frames.\n\nTracks scroll offset, level filter bitfield, search query, and auto-scroll mode.\n\n# Level Filter\n\nThe `level_filter` field is a bitfield where each bit enables visibility of\na log level: Trace=1, Debug=2, Info=4, Warn=8, Error=16. The default is\n31 (all levels visible).\n\n# Examples\n\n```\nuse harness_tui_kit::{LogViewerState, LogLevel};\n\nlet mut state = LogViewerState::default();\nassert!(state.is_level_visible(LogLevel::Info));\n\nstate.toggle_level(LogLevel::Info);\nassert!(!state.is_level_visible(LogLevel::Info));\n```"
        },
        {
          "name": "::LogViewerState::scroll_up",
          "line": 225,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll up by one row, clamping at zero."
        },
        {
          "name": "::LogViewerState::scroll_down",
          "line": 230,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll down by one row."
        },
        {
          "name": "::LogViewerState::scroll_to_bottom",
          "line": 238,
          "signature": "pub fn scroll_to_bottom(&mut self, entries_len: usize, visible_height: usize);",
          "documentation": "Scroll to the bottom so that the last entries are visible.\n\n`entries_len` is the total number of visible (filtered) entries.\n`visible_height` is the number of rows available for rendering."
        },
        {
          "name": "::LogViewerState::toggle_level",
          "line": 245,
          "signature": "pub fn toggle_level(&mut self, level: LogLevel);",
          "documentation": "Toggle visibility of a specific log level.\n\nFlips the corresponding bit in `level_filter`."
        },
        {
          "name": "::LogViewerState::is_level_visible",
          "line": 251,
          "signature": "#[must_use]\npub fn is_level_visible(&self, level: LogLevel) -> bool;",
          "documentation": "Check whether a log level is currently visible."
        },
        {
          "name": "::LogViewerState::set_search",
          "line": 258,
          "signature": "pub fn set_search(&mut self, query: &str);",
          "documentation": "Set the search query for message filtering.\n\nEntries whose message does not contain the query as a substring are hidden."
        },
        {
          "name": "::LogViewerState::clear_search",
          "line": 263,
          "signature": "pub fn clear_search(&mut self);",
          "documentation": "Clear the search query."
        },
        {
          "name": "::LogViewerState::toggle_auto_scroll",
          "line": 268,
          "signature": "pub fn toggle_auto_scroll(&mut self);",
          "documentation": "Toggle auto-scroll mode."
        },
        {
          "name": "::LogViewerState::reset",
          "line": 273,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset state to defaults (all levels visible, no search, scroll at top)."
        },
        {
          "name": "::LogViewerState::scroll_offset",
          "line": 279,
          "signature": "#[must_use]\npub fn scroll_offset(&self) -> usize;",
          "documentation": "Returns the current scroll offset."
        },
        {
          "name": "::LogViewerState::level_filter",
          "line": 285,
          "signature": "#[must_use]\npub fn level_filter(&self) -> u8;",
          "documentation": "Returns the current level filter bitfield."
        },
        {
          "name": "::LogViewerState::search_query",
          "line": 291,
          "signature": "#[must_use]\npub fn search_query(&self) -> &str;",
          "documentation": "Returns a reference to the current search query."
        },
        {
          "name": "::LogViewerState::auto_scroll",
          "line": 297,
          "signature": "#[must_use]\npub fn auto_scroll(&self) -> bool;",
          "documentation": "Returns whether auto-scroll is enabled."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/mod.rs",
      "sha256": "d6460884d4ee197b8669169605c3f67bad7e601678d0cbd1b125a5b08d6f7b36",
      "artifactSha256": "d39181534daa7d08dc33265a69e8ef5b7432f0a5aa9cfcadc9e75ef9ab23879f",
      "url": "/reference/source/harness-tui-kit/src/components/system/mod.rs.txt",
      "declarations": [
        {
          "name": "app_shell",
          "line": 6,
          "signature": "pub mod app_shell;",
          "documentation": "System-level components.\n\nComponents for application chrome: banners, spinners, status bars, thinking\nindicators, modals, tabs, and other structural elements."
        },
        {
          "name": "block_logo",
          "line": 8,
          "signature": "pub mod block_logo;",
          "documentation": ""
        },
        {
          "name": "command_palette",
          "line": 9,
          "signature": "pub mod command_palette;",
          "documentation": ""
        },
        {
          "name": "custom_logo",
          "line": 10,
          "signature": "pub mod custom_logo;",
          "documentation": ""
        },
        {
          "name": "focus_card",
          "line": 11,
          "signature": "pub mod focus_card;",
          "documentation": ""
        },
        {
          "name": "hint_bar",
          "line": 13,
          "signature": "pub mod hint_bar;",
          "documentation": ""
        },
        {
          "name": "keyboard_help",
          "line": 14,
          "signature": "pub mod keyboard_help;",
          "documentation": ""
        },
        {
          "name": "log_viewer",
          "line": 15,
          "signature": "pub mod log_viewer;",
          "documentation": ""
        },
        {
          "name": "modal",
          "line": 16,
          "signature": "pub mod modal;",
          "documentation": ""
        },
        {
          "name": "model_picker",
          "line": 17,
          "signature": "pub mod model_picker;",
          "documentation": ""
        },
        {
          "name": "notification_toast",
          "line": 18,
          "signature": "pub mod notification_toast;",
          "documentation": ""
        },
        {
          "name": "pager_overlay",
          "line": 19,
          "signature": "pub mod pager_overlay;",
          "documentation": ""
        },
        {
          "name": "resume_picker",
          "line": 20,
          "signature": "pub mod resume_picker;",
          "documentation": ""
        },
        {
          "name": "settings_palette",
          "line": 21,
          "signature": "pub mod settings_palette;",
          "documentation": ""
        },
        {
          "name": "slash_dropdown",
          "line": 23,
          "signature": "pub mod slash_dropdown;",
          "documentation": ""
        },
        {
          "name": "split_pane",
          "line": 25,
          "signature": "pub mod split_pane;",
          "documentation": ""
        },
        {
          "name": "status_footer",
          "line": 27,
          "signature": "pub mod status_footer;",
          "documentation": ""
        },
        {
          "name": "tabs",
          "line": 29,
          "signature": "pub mod tabs;",
          "documentation": ""
        },
        {
          "name": "welcome_screen",
          "line": 33,
          "signature": "pub mod welcome_screen;",
          "documentation": ""
        },
        {
          "name": "pub use app_shell::{AppShell, AppShellState, ShellPanel};",
          "line": 35,
          "signature": "pub use app_shell::{AppShell, AppShellState, ShellPanel};",
          "documentation": ""
        },
        {
          "name": "pub use banner::Banner;",
          "line": 36,
          "signature": "pub use banner::Banner;",
          "documentation": ""
        },
        {
          "name": "pub use block_logo::{BlockLogo, BLOCK_LOGO_GLYPH_WIDTH, BLOCK_LOGO_HEIGHT, BLOCK_LOGO_SPACING};",
          "line": 37,
          "signature": "pub use block_logo::{BlockLogo, BLOCK_LOGO_GLYPH_WIDTH, BLOCK_LOGO_HEIGHT, BLOCK_LOGO_SPACING};",
          "documentation": ""
        },
        {
          "name": "pub use command_palette::{CommandPalette, CommandPaletteState};",
          "line": 38,
          "signature": "pub use command_palette::{CommandPalette, CommandPaletteState};",
          "documentation": ""
        },
        {
          "name": "pub use custom_logo::{CustomLogo, CLAUSEN_LOGO_ROWS};",
          "line": 39,
          "signature": "pub use custom_logo::{CustomLogo, CLAUSEN_LOGO_ROWS};",
          "documentation": ""
        },
        {
          "name": "pub use focus_card::FocusCard;",
          "line": 40,
          "signature": "pub use focus_card::FocusCard;",
          "documentation": ""
        },
        {
          "name": "pub use goal_display::{GoalDisplay, GoalStep, GoalStepStatus};",
          "line": 41,
          "signature": "pub use goal_display::{GoalDisplay, GoalStep, GoalStepStatus};",
          "documentation": ""
        },
        {
          "name": "pub use hint_bar::{HintBar, HintItem};",
          "line": 42,
          "signature": "pub use hint_bar::{HintBar, HintItem};",
          "documentation": ""
        },
        {
          "name": "pub use keyboard_help::{KeyboardHelp, KeyboardHelpState};",
          "line": 43,
          "signature": "pub use keyboard_help::{KeyboardHelp, KeyboardHelpState};",
          "documentation": ""
        },
        {
          "name": "pub use log_viewer::{LogViewer, LogViewerState};",
          "line": 44,
          "signature": "pub use log_viewer::{LogViewer, LogViewerState};",
          "documentation": ""
        },
        {
          "name": "pub use modal::{Modal, ModalButton, ModalState};",
          "line": 45,
          "signature": "pub use modal::{Modal, ModalButton, ModalState};",
          "documentation": ""
        },
        {
          "name": "pub use model_picker::{ModelCapabilities, ModelPicker, ModelPickerRow, ModelPickerState};",
          "line": 46,
          "signature": "pub use model_picker::{ModelCapabilities, ModelPicker, ModelPickerRow, ModelPickerState};",
          "documentation": ""
        },
        {
          "name": "pub use notification_toast::{NotificationToast, NotificationToastState, ToastMessage};",
          "line": 47,
          "signature": "pub use notification_toast::{NotificationToast, NotificationToastState, ToastMessage};",
          "documentation": ""
        },
        {
          "name": "pub use pager_overlay::{PagerOverlay, PagerOverlayState};",
          "line": 48,
          "signature": "pub use pager_overlay::{PagerOverlay, PagerOverlayState};",
          "documentation": ""
        },
        {
          "name": "pub use resume_picker::{ResumePicker, ResumePickerRow, ResumePickerState};",
          "line": 49,
          "signature": "pub use resume_picker::{ResumePicker, ResumePickerRow, ResumePickerState};",
          "documentation": ""
        },
        {
          "name": "pub use settings_palette::{\n    PendingSelection, SettingsPalette, SettingsPaletteItem, SettingsPalettePage,\n    SettingsPaletteState,\n};",
          "line": 50,
          "signature": "pub use settings_palette::{\n    PendingSelection, SettingsPalette, SettingsPaletteItem, SettingsPalettePage,\n    SettingsPaletteState,\n};",
          "documentation": ""
        },
        {
          "name": "pub use shimmer::{Shimmer, ShimmerState, SHIMMER_DEFAULT_WINDOW};",
          "line": 54,
          "signature": "pub use shimmer::{Shimmer, ShimmerState, SHIMMER_DEFAULT_WINDOW};",
          "documentation": ""
        },
        {
          "name": "pub use slash_dropdown::{SlashDropdown, SlashDropdownItem, SlashDropdownState};",
          "line": 55,
          "signature": "pub use slash_dropdown::{SlashDropdown, SlashDropdownItem, SlashDropdownState};",
          "documentation": ""
        },
        {
          "name": "pub use spinner::{Spinner, SpinnerStyle};",
          "line": 56,
          "signature": "pub use spinner::{Spinner, SpinnerStyle};",
          "documentation": ""
        },
        {
          "name": "pub use split_pane::{CollapseState, SplitDirection, SplitPane, SplitPaneState};",
          "line": 57,
          "signature": "pub use split_pane::{CollapseState, SplitDirection, SplitPane, SplitPaneState};",
          "documentation": ""
        },
        {
          "name": "pub use status_bar::StatusBar;",
          "line": 58,
          "signature": "pub use status_bar::StatusBar;",
          "documentation": ""
        },
        {
          "name": "pub use status_footer::{StatusFooter, StatusFooterIndicator};",
          "line": 59,
          "signature": "pub use status_footer::{StatusFooter, StatusFooterIndicator};",
          "documentation": ""
        },
        {
          "name": "pub use status_indicator::{\n    fmt_elapsed_compact, StatusIndicator, StatusIndicatorState, StatusKind,\n};",
          "line": 60,
          "signature": "pub use status_indicator::{\n    fmt_elapsed_compact, StatusIndicator, StatusIndicatorState, StatusKind,\n};",
          "documentation": ""
        },
        {
          "name": "pub use tabs::{TabItem, Tabs, TabsState};",
          "line": 63,
          "signature": "pub use tabs::{TabItem, Tabs, TabsState};",
          "documentation": ""
        },
        {
          "name": "pub use theme_picker::{ThemePicker, ThemePickerRow, ThemePickerState};",
          "line": 64,
          "signature": "pub use theme_picker::{ThemePicker, ThemePickerRow, ThemePickerState};",
          "documentation": ""
        },
        {
          "name": "pub use thinking::ThinkingIndicator;",
          "line": 65,
          "signature": "pub use thinking::ThinkingIndicator;",
          "documentation": ""
        },
        {
          "name": "pub use thinking_animation::{\n    ThinkingAnimation, ThinkingAnimationState, THINKING_ANIMATION_DEFAULT_CHARSET,\n    THINKING_ANIMATION_DEFAULT_WIDTH,\n};",
          "line": 66,
          "signature": "pub use thinking_animation::{\n    ThinkingAnimation, ThinkingAnimationState, THINKING_ANIMATION_DEFAULT_CHARSET,\n    THINKING_ANIMATION_DEFAULT_WIDTH,\n};",
          "documentation": ""
        },
        {
          "name": "pub use welcome_screen::{WelcomeConfig, WelcomeScreen};",
          "line": 70,
          "signature": "pub use welcome_screen::{WelcomeConfig, WelcomeScreen};",
          "documentation": ""
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/modal.rs",
      "sha256": "49ea9e2e7688e6a6461b35247bd40df4ccb15df316e603f368c1410612d0ef72",
      "artifactSha256": "b8e78de9de64fc7bd9e372ef552f6615c9c1d7623205e3c682c8acfbaa5591e1",
      "url": "/reference/source/harness-tui-kit/src/components/system/modal.rs.txt",
      "declarations": [
        {
          "name": "::ModalButton",
          "line": 69,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]\npub enum ModalButton {\n    /// The confirm/accept action button.\n    Confirm,\n    /// The cancel/dismiss action button (default focus).\n    #[default]\n    Cancel,\n}",
          "documentation": "Which action button is currently focused in a [`Modal`].\n\nUsed to determine which button receives the highlight style and which\naction is triggered when the user presses Enter.\n\nDefaults to [`ModalButton::Cancel`] so the non-destructive action is\nselected by default.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::modal::ModalButton;\n\nlet button = ModalButton::default();\nassert_eq!(button, ModalButton::Cancel);\n```"
        },
        {
          "name": "::ModalState",
          "line": 99,
          "signature": "#[derive(Debug, Clone)]\npub struct ModalState {\n\n}",
          "documentation": "Mutable state for [`Modal`], persists across frames.\n\nTracks the modal's visibility, title, body content, scroll position, and\nwhich action button is focused. Create with [`ModalState::new`] and control\nvisibility with [`show`](ModalState::show), [`hide`](ModalState::hide), and\n[`toggle`](ModalState::toggle).\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::modal::ModalState;\n\nlet mut state = ModalState::new(\"Delete File\");\nstate.set_body(\"This action cannot be undone.\\nProceed?\");\nstate.show();\nassert!(state.is_visible());\nstate.cycle_focus();\nassert_eq!(state.focused_button(), harness_tui_kit::components::system::modal::ModalButton::Confirm);\n```"
        },
        {
          "name": "::ModalState::new",
          "line": 127,
          "signature": "#[must_use]\npub fn new(title: &str) -> Self;",
          "documentation": "Create a new modal state with the given title.\n\nThe modal starts hidden with the Cancel button focused.\nThe title is sanitized to strip terminal escape sequences.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::modal::ModalState;\n\nlet state = ModalState::new(\"Confirm\");\nassert!(!state.is_visible());\n```"
        },
        {
          "name": "::ModalState::set_body",
          "line": 141,
          "signature": "pub fn set_body(&mut self, body: &str);",
          "documentation": "Set the body content text.\n\nThe body is sanitized to strip terminal escape sequences.\nResets the scroll offset to the top."
        },
        {
          "name": "::ModalState::show",
          "line": 150,
          "signature": "pub fn show(&mut self);",
          "documentation": "Show the modal.\n\nMakes the modal visible on the next render frame.\nResets focus to the Cancel button and scroll to the top."
        },
        {
          "name": "::ModalState::hide",
          "line": 159,
          "signature": "pub fn hide(&mut self);",
          "documentation": "Hide the modal.\n\nMakes the modal invisible on the next render frame."
        },
        {
          "name": "::ModalState::toggle",
          "line": 166,
          "signature": "pub fn toggle(&mut self);",
          "documentation": "Toggle the modal's visibility.\n\nIf visible, hides it. If hidden, shows it (resetting focus and scroll)."
        },
        {
          "name": "::ModalState::cycle_focus",
          "line": 178,
          "signature": "pub fn cycle_focus(&mut self);",
          "documentation": "Cycle focus between the action buttons.\n\nPressing Tab in the modal should call this to move focus between\nCancel and Confirm buttons."
        },
        {
          "name": "::ModalState::scroll_up",
          "line": 188,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll the body content up by one line.\n\nStops at the top (offset 0)."
        },
        {
          "name": "::ModalState::scroll_down",
          "line": 196,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll the body content down by one line.\n\nThe maximum scroll is clamped during rendering to prevent scrolling\npast the content."
        },
        {
          "name": "::ModalState::is_visible",
          "line": 211,
          "signature": "#[must_use]\npub fn is_visible(&self) -> bool;",
          "documentation": "Returns `true` if the modal is currently visible.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::modal::ModalState;\n\nlet state = ModalState::new(\"Test\");\nassert!(!state.is_visible());\n```"
        },
        {
          "name": "::ModalState::focused_button",
          "line": 226,
          "signature": "#[must_use]\npub fn focused_button(&self) -> ModalButton;",
          "documentation": "Returns which action button currently has focus.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::modal::{ModalState, ModalButton};\n\nlet state = ModalState::new(\"Test\");\nassert_eq!(state.focused_button(), ModalButton::Cancel);\n```"
        },
        {
          "name": "::Modal",
          "line": 270,
          "signature": "#[derive(Debug, Clone)]\npub struct Modal<'a> {\n\n}",
          "documentation": "Overlay modal dialog with title bar, scrollable body, and action buttons.\n\nRenders as a centered overlay on top of the existing terminal content.\nThe background behind the modal is dimmed. The modal contains:\n\n1. A title bar with centered, bold title text\n2. A scrollable body content area\n3. A separator line above the button bar\n4. Action buttons (Cancel and Confirm) with focus highlighting\n\nThe modal uses box-drawing characters for its border (`\\u{250c}\\u{2500}\\u{2510}\\u{2502}\\u{2514}\\u{2500}\\u{2518}`).\n\n# Focus Trap\n\nTab cycles focus between the Cancel and Confirm buttons via\n[`ModalState::cycle_focus`]. Escape should hide the modal via\n[`ModalState::hide`] (handled by the caller's event loop).\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::modal::{Modal, ModalState};\nuse harness_tui_kit::Theme;\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet theme = Theme::dark();\nlet mut state = ModalState::new(\"Confirm\");\nstate.set_body(\"Are you sure?\");\nstate.show();\n\nlet area = Rect::new(0, 0, 60, 20);\nlet mut buf = Buffer::empty(area);\nModal::new().theme(&theme).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::Modal<'a>::new",
          "line": 285,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new modal with default settings.\n\nUses the default theme, \"Confirm\" for the confirm label, and \"Cancel\"\nfor the cancel label."
        },
        {
          "name": "::Modal<'a>::theme",
          "line": 295,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme for the modal."
        },
        {
          "name": "::Modal<'a>::confirm_label",
          "line": 302,
          "signature": "#[must_use]\npub fn confirm_label(mut self, label: &'a str) -> Self;",
          "documentation": "Set the confirm button label."
        },
        {
          "name": "::Modal<'a>::cancel_label",
          "line": 309,
          "signature": "#[must_use]\npub fn cancel_label(mut self, label: &'a str) -> Self;",
          "documentation": "Set the cancel button label."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/model_picker.rs",
      "sha256": "bb0ef51167dfb8d79b274ac8286fff4493b83a240e69b6688a3362779630459a",
      "artifactSha256": "cd830a3a0de76eb110363db23b8c9a6f8cb1df05221609d4162f8a7d81163bdf",
      "url": "/reference/source/harness-tui-kit/src/components/system/model_picker.rs.txt",
      "declarations": [
        {
          "name": "::ModelCapabilities",
          "line": 21,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub struct ModelCapabilities {\n/// Whether the model supports tool / function calling.\n\npub tools: bool,\n/// Whether the model supports vision input.\n\npub vision: bool,\n/// Whether the model exposes a \"thinking\" / reasoning channel.\n\npub thinking: bool,\n/// Whether the model is generally available (vs. preview).\n\npub ga: bool\n}",
          "documentation": "Coarse capability flags surfaced as badges on each row."
        },
        {
          "name": "::ModelCapabilities::none",
          "line": 35,
          "signature": "#[must_use]\npub fn none() -> Self;",
          "documentation": "Convenience: a fully-disabled set."
        },
        {
          "name": "::ModelPickerRow",
          "line": 47,
          "signature": "#[derive(Debug, Clone)]\npub struct ModelPickerRow {\n/// Stable id (e.g. `\"claude-opus-4.7\"`).\n\npub id: String,\n/// Display name (e.g. `\"Claude Opus 4.7 (1M)\"`).\n\npub name: String,\n/// Short provider label (e.g. `\"Anthropic\"`).\n\npub provider: String,\n/// One-line description shown below the name.\n\npub description: String,\n/// Capability flags rendered as a `[T] [V] [R]` badge strip.\n\npub capabilities: ModelCapabilities,\n/// Coarse cost tier label (e.g. `\"$\"`, `\"$$\"`, `\"$$$\"`).\n\npub cost: String\n}",
          "documentation": "One row in [`ModelPicker`]."
        },
        {
          "name": "::ModelPickerState",
          "line": 64,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct ModelPickerState {\n\n}",
          "documentation": "Persistent state for [`ModelPicker`]."
        },
        {
          "name": "::ModelPickerState::selected",
          "line": 71,
          "signature": "#[must_use]\npub fn selected(&self) -> usize;",
          "documentation": "Currently-focused index."
        },
        {
          "name": "::ModelPickerState::move_down",
          "line": 76,
          "signature": "pub fn move_down(&mut self, len: usize);",
          "documentation": "Move focus down by one row, clamped to `len - 1`."
        },
        {
          "name": "::ModelPickerState::move_up",
          "line": 85,
          "signature": "pub fn move_up(&mut self);",
          "documentation": "Move focus up by one row."
        },
        {
          "name": "::ModelPickerState::reset",
          "line": 90,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset focus to the first row."
        },
        {
          "name": "::ModelPicker",
          "line": 97,
          "signature": "#[derive(Debug, Clone)]\npub struct ModelPicker<'a> {\n\n}",
          "documentation": "Model picker widget."
        },
        {
          "name": "::ModelPicker<'a>::new",
          "line": 106,
          "signature": "#[must_use]\npub fn new(rows: &'a [ModelPickerRow]) -> Self;",
          "documentation": "Construct a new picker over `rows`."
        },
        {
          "name": "::ModelPicker<'a>::theme",
          "line": 116,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::ModelPicker<'a>::title",
          "line": 123,
          "signature": "#[must_use]\npub fn title(mut self, title: &'a str) -> Self;",
          "documentation": "Override the title at the top of the picker block."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/notification_toast.rs",
      "sha256": "8bb55bea142c5c87947c803d01f79a60f5d2db3bdf824f79c54f34be6ed50b66",
      "artifactSha256": "7f15e77983a4155beb21db701711abd7defaf8afacd0d5b0707d7d87211ed71d",
      "url": "/reference/source/harness-tui-kit/src/components/system/notification_toast.rs.txt",
      "declarations": [
        {
          "name": "::ToastMessage",
          "line": 74,
          "signature": "#[derive(Debug, Clone)]\npub struct ToastMessage {\n/// The severity level of this notification.\n\npub severity: Severity,\n/// The sanitized message text.\n\npub message: String,\n/// Number of ticks remaining before auto-dismissal.\n\npub remaining_ticks: u16\n}",
          "documentation": "A single toast notification entry.\n\nContains the severity level, sanitized message text, remaining display\nduration in ticks, and the initial duration (for countdown bar calculation).\n\n# Examples\n\n```\nuse harness_tui_kit::{ToastMessage, Severity};\n\nlet toast = ToastMessage::new(Severity::Info, \"Hello\", 60);\nassert_eq!(toast.severity, Severity::Info);\nassert_eq!(toast.message, \"Hello\");\nassert_eq!(toast.remaining_ticks, 60);\n```"
        },
        {
          "name": "::ToastMessage::new",
          "line": 99,
          "signature": "#[must_use]\npub fn new(severity: Severity, message: impl Into<String>, duration_ticks: u16) -> Self;",
          "documentation": "Create a new toast message with the given severity, text, and duration.\n\nThe message text is sanitized to remove terminal escape sequences.\n\n# Examples\n\n```\nuse harness_tui_kit::{ToastMessage, Severity};\n\nlet toast = ToastMessage::new(Severity::Warning, \"Low disk\", 100);\nassert_eq!(toast.remaining_ticks, 100);\n```"
        },
        {
          "name": "::NotificationToastState",
          "line": 146,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct NotificationToastState {\n\n}",
          "documentation": "Mutable state for [`NotificationToast`], persists across frames.\n\nManages the queue of active toast notifications. Push new toasts with\n[`push`](Self::push) and call [`tick`](Self::tick) each frame to advance\nauto-dismiss countdowns.\n\n# Examples\n\n```\nuse harness_tui_kit::{NotificationToastState, Severity};\n\nlet mut state = NotificationToastState::default();\nassert!(state.is_empty());\n\nstate.push(Severity::Info, \"Hello\", 10);\nassert_eq!(state.count(), 1);\n\n// Tick 10 times to expire the toast\nfor _ in 0..10 {\n    state.tick();\n}\nassert!(state.is_empty());\n```"
        },
        {
          "name": "::NotificationToastState::push",
          "line": 166,
          "signature": "pub fn push(&mut self, severity: Severity, message: impl Into<String>, duration_ticks: u16);",
          "documentation": "Add a new toast notification to the queue.\n\nThe message is sanitized to strip terminal escape sequences.\nThe toast will be auto-dismissed after `duration_ticks` calls to [`tick`](Self::tick).\n\n# Examples\n\n```\nuse harness_tui_kit::{NotificationToastState, Severity};\n\nlet mut state = NotificationToastState::default();\nstate.push(Severity::Error, \"Connection lost\", 120);\nassert_eq!(state.count(), 1);\n```"
        },
        {
          "name": "::NotificationToastState::tick",
          "line": 185,
          "signature": "pub fn tick(&mut self);",
          "documentation": "Advance the countdown on all toasts by one tick and remove expired ones.\n\nToasts whose `remaining_ticks` reaches zero are removed from the queue.\n\n# Examples\n\n```\nuse harness_tui_kit::{NotificationToastState, Severity};\n\nlet mut state = NotificationToastState::default();\nstate.push(Severity::Info, \"Quick\", 1);\nstate.tick();\nassert!(state.is_empty());\n```"
        },
        {
          "name": "::NotificationToastState::dismiss",
          "line": 207,
          "signature": "pub fn dismiss(&mut self);",
          "documentation": "Dismiss the oldest (top-most rendered) toast.\n\nDoes nothing if the queue is empty.\n\n# Examples\n\n```\nuse harness_tui_kit::{NotificationToastState, Severity};\n\nlet mut state = NotificationToastState::default();\nstate.push(Severity::Info, \"First\", 60);\nstate.push(Severity::Warning, \"Second\", 60);\nstate.dismiss();\nassert_eq!(state.count(), 1);\n```"
        },
        {
          "name": "::NotificationToastState::dismiss_all",
          "line": 226,
          "signature": "pub fn dismiss_all(&mut self);",
          "documentation": "Dismiss all active toasts.\n\n# Examples\n\n```\nuse harness_tui_kit::{NotificationToastState, Severity};\n\nlet mut state = NotificationToastState::default();\nstate.push(Severity::Info, \"A\", 60);\nstate.push(Severity::Warning, \"B\", 60);\nstate.dismiss_all();\nassert!(state.is_empty());\n```"
        },
        {
          "name": "::NotificationToastState::is_empty",
          "line": 241,
          "signature": "#[must_use]\npub fn is_empty(&self) -> bool;",
          "documentation": "Returns `true` if there are no active toasts.\n\n# Examples\n\n```\nuse harness_tui_kit::NotificationToastState;\n\nlet state = NotificationToastState::default();\nassert!(state.is_empty());\n```"
        },
        {
          "name": "::NotificationToastState::count",
          "line": 257,
          "signature": "#[must_use]\npub fn count(&self) -> usize;",
          "documentation": "Returns the number of active toasts in the queue.\n\n# Examples\n\n```\nuse harness_tui_kit::{NotificationToastState, Severity};\n\nlet mut state = NotificationToastState::default();\nstate.push(Severity::Info, \"Test\", 60);\nassert_eq!(state.count(), 1);\n```"
        },
        {
          "name": "::NotificationToast",
          "line": 297,
          "signature": "#[derive(Debug, Clone)]\npub struct NotificationToast<'a> {\n\n}",
          "documentation": "Toast notification overlay rendered from the top-right corner of the area.\n\nEach toast is 2 rows tall: the first row shows a severity icon and message\ntext; the second row shows a countdown progress bar. A severity-colored left\nborder visually distinguishes notification severity. Multiple toasts stack\nvertically from the top.\n\n# Severity Mapping\n\n| Severity | Icon | Border Color |\n|----------|------|--------------|\n| Info     | `\u2139`  | `theme.info` |\n| Success  | `\u2713`  | `theme.success` |\n| Warning  | `\u26a0`  | `theme.warning` |\n| Error    | `\u2715`  | `theme.error` |\n\n# Examples\n\n```\nuse harness_tui_kit::{NotificationToast, NotificationToastState, Severity, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet theme = Theme::dark();\nlet mut state = NotificationToastState::default();\nstate.push(Severity::Info, \"Saved\", 60);\n\nlet area = Rect::new(0, 0, 80, 24);\nlet mut buf = Buffer::empty(area);\nNotificationToast::new().theme(&theme).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::NotificationToast<'a>::new",
          "line": 311,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new notification toast renderer with default settings.\n\nDefaults: up to 5 visible toasts, 40 columns wide, dark theme."
        },
        {
          "name": "::NotificationToast<'a>::theme",
          "line": 321,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme for rendering."
        },
        {
          "name": "::NotificationToast<'a>::max_visible",
          "line": 330,
          "signature": "#[must_use]\npub fn max_visible(mut self, max: usize) -> Self;",
          "documentation": "Set the maximum number of toasts visible at once.\n\nToasts beyond this limit are queued and shown as older ones expire."
        },
        {
          "name": "::NotificationToast<'a>::toast_width",
          "line": 337,
          "signature": "#[must_use]\npub fn toast_width(mut self, width: u16) -> Self;",
          "documentation": "Set the width of each toast in terminal columns."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/pager_overlay.rs",
      "sha256": "0086cb94678c1ef72a175a79d02645e203212d6e738c3bfa4a48dc329a266d3e",
      "artifactSha256": "cc76cc2496cc82d55858bff4383c9b61bb9dba720b1a2ea0d2df29b4898571d4",
      "url": "/reference/source/harness-tui-kit/src/components/system/pager_overlay.rs.txt",
      "declarations": [
        {
          "name": "::PagerOverlayState",
          "line": 19,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct PagerOverlayState {\n\n}",
          "documentation": "Persistent state for [`PagerOverlay`]."
        },
        {
          "name": "::PagerOverlayState::scroll",
          "line": 27,
          "signature": "#[must_use]\npub fn scroll(&self) -> u16;",
          "documentation": "Current scroll offset."
        },
        {
          "name": "::PagerOverlayState::line_up",
          "line": 32,
          "signature": "pub fn line_up(&mut self);",
          "documentation": "Scroll up one row."
        },
        {
          "name": "::PagerOverlayState::line_down",
          "line": 37,
          "signature": "pub fn line_down(&mut self);",
          "documentation": "Scroll down one row."
        },
        {
          "name": "::PagerOverlayState::page_up",
          "line": 42,
          "signature": "pub fn page_up(&mut self, viewport_height: u16);",
          "documentation": "Page up by `viewport_height` rows."
        },
        {
          "name": "::PagerOverlayState::page_down",
          "line": 47,
          "signature": "pub fn page_down(&mut self, viewport_height: u16);",
          "documentation": "Page down by `viewport_height` rows."
        },
        {
          "name": "::PagerOverlayState::half_page_up",
          "line": 52,
          "signature": "pub fn half_page_up(&mut self, viewport_height: u16);",
          "documentation": "Half-page up."
        },
        {
          "name": "::PagerOverlayState::half_page_down",
          "line": 57,
          "signature": "pub fn half_page_down(&mut self, viewport_height: u16);",
          "documentation": "Half-page down."
        },
        {
          "name": "::PagerOverlayState::jump_top",
          "line": 62,
          "signature": "pub fn jump_top(&mut self);",
          "documentation": "Jump to the top."
        },
        {
          "name": "::PagerOverlayState::jump_bottom",
          "line": 68,
          "signature": "pub fn jump_bottom(&mut self, content_height: u16, viewport_height: u16);",
          "documentation": "Jump to the bottom (caller supplies total content rows so we\ncan clamp; passing the rendered content height is fine)."
        },
        {
          "name": "::PagerOverlay",
          "line": 79,
          "signature": "#[derive(Debug, Clone)]\npub struct PagerOverlay<'a> {\n\n}",
          "documentation": "Full-screen transcript pager.\n\nLines are produced by the SDK consumer (typically the union of\nevery `HistoryCell::transcript_lines(width)`). The pager renders\nthem with a bordered chrome and a footer hint."
        },
        {
          "name": "::PagerOverlay<'a>::new",
          "line": 89,
          "signature": "#[must_use]\npub fn new(lines: &'a [Line<'static>]) -> Self;",
          "documentation": "Construct a pager over `lines`."
        },
        {
          "name": "::PagerOverlay<'a>::theme",
          "line": 100,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::PagerOverlay<'a>::title",
          "line": 107,
          "signature": "#[must_use]\npub fn title(mut self, title: &'a str) -> Self;",
          "documentation": "Override the panel title."
        },
        {
          "name": "::PagerOverlay<'a>::footer_hint",
          "line": 114,
          "signature": "#[must_use]\npub fn footer_hint(mut self, hint: &'a str) -> Self;",
          "documentation": "Override the footer key hint."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/resume_picker.rs",
      "sha256": "f60e60a059f8b1880e6df6d976f105c6cef32a5352152447f22345b96dff864f",
      "artifactSha256": "0d57bf00c8f8811a96cd83c0a00f1fa3afd4d3a64c6f13737f4b25bc692eff64",
      "url": "/reference/source/harness-tui-kit/src/components/system/resume_picker.rs.txt",
      "declarations": [
        {
          "name": "::ResumePickerRow",
          "line": 27,
          "signature": "#[derive(Debug, Clone)]\npub struct ResumePickerRow {\n/// Stable id used by the activation handler to identify the\n\n/// chosen session (typically the session uuid as a string).\n\npub id: String,\n/// Primary label (e.g. \"clausen \u2014 /Users/me/repo\").\n\npub title: String,\n/// One-line preview (e.g. the first user message, truncated).\n\npub preview: String,\n/// Right-aligned metadata column (e.g. \"12 turns \u00b7 3m ago\").\n\npub meta: String\n}",
          "documentation": "One row in [`ResumePicker`]. The application is responsible for\ntranslating its session-store metadata into rows; the picker\nitself never reaches into the SDK."
        },
        {
          "name": "::ResumePickerState",
          "line": 41,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct ResumePickerState {\n\n}",
          "documentation": "State for [`ResumePicker`]: which row is currently focused."
        },
        {
          "name": "::ResumePickerState::selected",
          "line": 48,
          "signature": "#[must_use]\npub fn selected(&self) -> usize;",
          "documentation": "Currently-focused index."
        },
        {
          "name": "::ResumePickerState::move_down",
          "line": 53,
          "signature": "pub fn move_down(&mut self, len: usize);",
          "documentation": "Move focus down by one row, clamped to `len - 1`."
        },
        {
          "name": "::ResumePickerState::move_up",
          "line": 62,
          "signature": "pub fn move_up(&mut self);",
          "documentation": "Move focus up by one row, clamped to 0."
        },
        {
          "name": "::ResumePickerState::reset",
          "line": 67,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset focus to the first row."
        },
        {
          "name": "::ResumePicker",
          "line": 75,
          "signature": "#[derive(Debug, Clone)]\npub struct ResumePicker<'a> {\n\n}",
          "documentation": "Widget rendering a list of [`ResumePickerRow`]s with a focused\nhighlight."
        },
        {
          "name": "::ResumePicker<'a>::new",
          "line": 85,
          "signature": "#[must_use]\npub fn new(rows: &'a [ResumePickerRow]) -> Self;",
          "documentation": "Construct a new picker over `rows`."
        },
        {
          "name": "::ResumePicker<'a>::theme",
          "line": 96,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the theme."
        },
        {
          "name": "::ResumePicker<'a>::title",
          "line": 103,
          "signature": "#[must_use]\npub fn title(mut self, title: &'a str) -> Self;",
          "documentation": "Override the title shown at the top of the picker block."
        },
        {
          "name": "::ResumePicker<'a>::empty_label",
          "line": 110,
          "signature": "#[must_use]\npub fn empty_label(mut self, label: &'a str) -> Self;",
          "documentation": "Override the label shown when there are no rows."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/settings_palette.rs",
      "sha256": "42ad1486ed3c22b32ae732cb5537d400d8150c2f2cbbaba616f70d3019e82ce9",
      "artifactSha256": "5b3f0497054946febaa534e88489b503ed699c64798091f617eebbf855b648ef",
      "url": "/reference/source/harness-tui-kit/src/components/system/settings_palette.rs.txt",
      "declarations": [
        {
          "name": "::SettingsPalettePage",
          "line": 39,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Default)]\npub enum SettingsPalettePage {\n    /// Top-level menu (Modes / Providers / \u2026).\n    #[default]\n    Root,\n    /// Mode picker.\n    Modes,\n    /// Provider picker.\n    Providers,\n    /// Per-provider hub: drills into Models or Settings for the\n    /// chosen provider. Replaces the old special-case Flocks page \u2014\n    /// every provider now goes through this same hub.\n    Provider { provider_id: String },\n    /// Models for a specific provider.\n    Models { provider_id: String },\n    /// Provider-specific settings (api keys, base URLs, Flocks CLI\n    /// selection, etc.). Field metadata comes from the adapter.\n    ProviderSettings { provider_id: String },\n    /// Flocks CLI picker \u2014 only reachable from\n    /// `ProviderSettings { provider_id == \"flocks\" }`.\n    FlocksClis,\n    /// Models for a specific Flocks CLI.\n    FlocksModels { cli_id: String },\n}",
          "documentation": "Identifier for a palette page."
        },
        {
          "name": "::SettingsPalettePage::title",
          "line": 66,
          "signature": "#[must_use]\npub fn title(&self) -> String;",
          "documentation": "Human-readable title shown at the top of the palette."
        },
        {
          "name": "::SettingsPaletteItem",
          "line": 82,
          "signature": "#[derive(Debug, Clone)]\npub struct SettingsPaletteItem {\n/// Stable identifier \u2014 passed back to the runtime when this row\n\n/// is selected.\n\npub id: String,\n/// Primary label.\n\npub label: String,\n/// Optional secondary description (rendered dim, after the label).\n\npub description: String,\n/// `true` if the row represents the *currently-active* selection\n\n/// \u2014 gets a check glyph and accent color.\n\npub active: bool,\n/// `true` if picking this row drills into a sub-page rather than\n\n/// applying a value directly. Drill-in rows show a `\u203a` glyph.\n\npub drills_in: bool,\n/// Optional badge rendered to the right of the row (e.g.\n\n/// `\"healthy\"`, `\"offline\"`, `\"context: 1M\"`). Dim by default.\n\npub badge: String\n}",
          "documentation": "One row rendered inside the palette body."
        },
        {
          "name": "::SettingsPaletteItem::leaf",
          "line": 104,
          "signature": "#[must_use]\npub fn leaf(id: impl Into<String>, label: impl Into<String>) -> Self;",
          "documentation": "Build a leaf item (selecting it applies a value)."
        },
        {
          "name": "::SettingsPaletteItem::drill",
          "line": 117,
          "signature": "#[must_use]\npub fn drill(id: impl Into<String>, label: impl Into<String>) -> Self;",
          "documentation": "Build a drill-in item (selecting it switches to another page)."
        },
        {
          "name": "::SettingsPaletteItem::description",
          "line": 130,
          "signature": "#[must_use]\npub fn description(mut self, text: impl Into<String>) -> Self;",
          "documentation": "Builder-style description."
        },
        {
          "name": "::SettingsPaletteItem::active",
          "line": 137,
          "signature": "#[must_use]\npub fn active(mut self, on: bool) -> Self;",
          "documentation": "Builder-style active flag."
        },
        {
          "name": "::SettingsPaletteItem::badge",
          "line": 144,
          "signature": "#[must_use]\npub fn badge(mut self, text: impl Into<String>) -> Self;",
          "documentation": "Builder-style badge."
        },
        {
          "name": "::SettingsPaletteState",
          "line": 152,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct SettingsPaletteState {\n\n}",
          "documentation": "Persistent state for [`SettingsPalette`]."
        },
        {
          "name": "::PendingSelection",
          "line": 167,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq)]\npub struct PendingSelection {\n/// The page where the selection happened.\n\npub page: SettingsPalettePage,\n/// The selected item's id.\n\npub item_id: String\n}",
          "documentation": "What the user just selected. Cleared after the runtime reads it."
        },
        {
          "name": "::SettingsPaletteState::is_visible",
          "line": 177,
          "signature": "#[must_use]\npub fn is_visible(&self) -> bool;",
          "documentation": "Whether the palette is visible."
        },
        {
          "name": "::SettingsPaletteState::page",
          "line": 183,
          "signature": "#[must_use]\npub fn page(&self) -> &SettingsPalettePage;",
          "documentation": "Current page identifier."
        },
        {
          "name": "::SettingsPaletteState::cursor",
          "line": 189,
          "signature": "#[must_use]\npub fn cursor(&self) -> usize;",
          "documentation": "Current cursor row."
        },
        {
          "name": "::SettingsPaletteState::filter",
          "line": 195,
          "signature": "#[must_use]\npub fn filter(&self) -> &str;",
          "documentation": "Current filter text (always lowercase)."
        },
        {
          "name": "::SettingsPaletteState::open",
          "line": 200,
          "signature": "pub fn open(&mut self);",
          "documentation": "Open the palette at the root page."
        },
        {
          "name": "::SettingsPaletteState::close",
          "line": 210,
          "signature": "pub fn close(&mut self);",
          "documentation": "Close the palette and discard any in-flight state."
        },
        {
          "name": "::SettingsPaletteState::drill",
          "line": 220,
          "signature": "pub fn drill(&mut self, page: SettingsPalettePage);",
          "documentation": "Navigate forward into a sub-page."
        },
        {
          "name": "::SettingsPaletteState::back",
          "line": 228,
          "signature": "pub fn back(&mut self) -> bool;",
          "documentation": "Pop the page stack \u2014 returns `true` if a page was popped,\n`false` if we were already at root (caller should close)."
        },
        {
          "name": "::SettingsPaletteState::cursor_up",
          "line": 240,
          "signature": "pub fn cursor_up(&mut self);",
          "documentation": "Move the cursor up."
        },
        {
          "name": "::SettingsPaletteState::cursor_down",
          "line": 245,
          "signature": "pub fn cursor_down(&mut self, len: usize);",
          "documentation": "Move the cursor down (clamped to `len - 1`)."
        },
        {
          "name": "::SettingsPaletteState::filter_push",
          "line": 254,
          "signature": "pub fn filter_push(&mut self, ch: char);",
          "documentation": "Append a character to the filter."
        },
        {
          "name": "::SettingsPaletteState::filter_pop",
          "line": 262,
          "signature": "pub fn filter_pop(&mut self);",
          "documentation": "Drop the last filter character."
        },
        {
          "name": "::SettingsPaletteState::filter_clear",
          "line": 268,
          "signature": "pub fn filter_clear(&mut self);",
          "documentation": "Clear the filter without closing the palette."
        },
        {
          "name": "::SettingsPaletteState::select",
          "line": 275,
          "signature": "pub fn select(&mut self, item_id: impl Into<String>);",
          "documentation": "Record a selection so the runtime can dispatch the\ncorresponding adapter action."
        },
        {
          "name": "::SettingsPaletteState::take_pending",
          "line": 283,
          "signature": "pub fn take_pending(&mut self) -> Option<PendingSelection>;",
          "documentation": "Take the pending selection (atomically clears it)."
        },
        {
          "name": "::SettingsPalette",
          "line": 290,
          "signature": "#[derive(Debug, Clone)]\npub struct SettingsPalette<'a> {\n\n}",
          "documentation": "The settings palette modal widget."
        },
        {
          "name": "::SettingsPalette<'a>::new",
          "line": 300,
          "signature": "#[must_use]\npub fn new(items: &'a [SettingsPaletteItem]) -> Self;",
          "documentation": "Construct a palette over the supplied items."
        },
        {
          "name": "::SettingsPalette<'a>::theme",
          "line": 310,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::SettingsPalette<'a>::hint",
          "line": 317,
          "signature": "#[must_use]\npub fn hint(mut self, hint: &'a str) -> Self;",
          "documentation": "Override the footer hint."
        },
        {
          "name": "::SettingsPalette<'a>::filtered_indices",
          "line": 324,
          "signature": "#[must_use]\npub fn filtered_indices(items: &[SettingsPaletteItem], filter: &str) -> Vec<usize>;",
          "documentation": "Items that survive the current filter on `state`."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/shimmer.rs",
      "sha256": "ad9092a91ddc934c60052d6430ee4100d3d59d187cd999816a42e7f62de7549e",
      "artifactSha256": "100f15d238ff03d0bbc26bd2a9f6252352cba213b3224e11166dbad6f2aebe36",
      "url": "/reference/source/harness-tui-kit/src/components/system/shimmer.rs.txt",
      "declarations": [
        {
          "name": "::SHIMMER_DEFAULT_WINDOW",
          "line": 24,
          "signature": "pub const SHIMMER_DEFAULT_WINDOW: u16;",
          "documentation": "Default width (in cells) of the bright wave window."
        },
        {
          "name": "::ShimmerState",
          "line": 28,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct ShimmerState {\n\n}",
          "documentation": "Persistent state for [`Shimmer`]."
        },
        {
          "name": "::ShimmerState::advance",
          "line": 34,
          "signature": "pub fn advance(&mut self);",
          "documentation": "Advance one frame."
        },
        {
          "name": "::ShimmerState::reset",
          "line": 39,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset the wave to position zero."
        },
        {
          "name": "::ShimmerState::tick",
          "line": 45,
          "signature": "#[must_use]\npub fn tick(&self) -> u64;",
          "documentation": "Current tick (useful for tests)."
        },
        {
          "name": "::Shimmer",
          "line": 52,
          "signature": "#[derive(Debug, Clone)]\npub struct Shimmer<'a> {\n\n}",
          "documentation": "Single-line shimmering label widget."
        },
        {
          "name": "::Shimmer<'a>::new",
          "line": 63,
          "signature": "#[must_use]\npub fn new(label: &'a str) -> Self;",
          "documentation": "Construct with default 4-cell wave window."
        },
        {
          "name": "::Shimmer<'a>::theme",
          "line": 75,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::Shimmer<'a>::window",
          "line": 82,
          "signature": "#[must_use]\npub fn window(mut self, window: u16) -> Self;",
          "documentation": "Override the wave window width."
        },
        {
          "name": "::Shimmer<'a>::base_fg",
          "line": 89,
          "signature": "#[must_use]\npub fn base_fg(mut self, fg: Color) -> Self;",
          "documentation": "Override the base (non-shimmer) colour."
        },
        {
          "name": "::Shimmer<'a>::bright_fg",
          "line": 96,
          "signature": "#[must_use]\npub fn bright_fg(mut self, fg: Color) -> Self;",
          "documentation": "Override the bright (shimmer-window) colour."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/slash_dropdown.rs",
      "sha256": "a3407a78bbc95ac6c83b03e1f749776d6600a51a846573497b46e79181242237",
      "artifactSha256": "3965195bfa9f6fddce059a2cd463285247df2d76fd07972372f84468ab2cda2f",
      "url": "/reference/source/harness-tui-kit/src/components/system/slash_dropdown.rs.txt",
      "declarations": [
        {
          "name": "::SlashDropdownItem",
          "line": 47,
          "signature": "#[derive(Debug, Clone)]\npub struct SlashDropdownItem {\n/// Command name (e.g., \"mode\").\n\npub name: String,\n/// Short description (e.g., \"Switch mode (chat/auto)\").\n\npub description: String,\n/// Usage template (e.g., \"/mode <chat|auto>\").\n\npub usage: String,\n/// Category label (e.g., \"built-in\" or plugin name).\n\npub category: String\n}",
          "documentation": "A single item in the slash dropdown."
        },
        {
          "name": "::SlashDropdownState",
          "line": 62,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct SlashDropdownState {\n\n}",
          "documentation": "Mutable state for [`SlashDropdown`], persists across frames."
        },
        {
          "name": "::SlashDropdownState::show",
          "line": 75,
          "signature": "pub fn show(&mut self);",
          "documentation": "Show the dropdown."
        },
        {
          "name": "::SlashDropdownState::hide",
          "line": 80,
          "signature": "pub fn hide(&mut self);",
          "documentation": "Hide the dropdown."
        },
        {
          "name": "::SlashDropdownState::is_visible",
          "line": 86,
          "signature": "#[must_use]\npub fn is_visible(&self) -> bool;",
          "documentation": "Returns `true` if the dropdown is visible."
        },
        {
          "name": "::SlashDropdownState::set_query",
          "line": 91,
          "signature": "pub fn set_query(&mut self, text: &str, items: &[SlashDropdownItem]);",
          "documentation": "Set the query and refilter against the given items."
        },
        {
          "name": "::SlashDropdownState::select_next",
          "line": 122,
          "signature": "pub fn select_next(&mut self);",
          "documentation": "Move selection down."
        },
        {
          "name": "::SlashDropdownState::select_prev",
          "line": 133,
          "signature": "pub fn select_prev(&mut self);",
          "documentation": "Move selection up."
        },
        {
          "name": "::SlashDropdownState::confirm",
          "line": 139,
          "signature": "#[must_use]\npub fn confirm(&self) -> Option<usize>;",
          "documentation": "Confirm the current selection; returns the original item index."
        },
        {
          "name": "::SlashDropdownState::reset",
          "line": 144,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset to default state."
        },
        {
          "name": "::SlashDropdownState::query",
          "line": 150,
          "signature": "#[must_use]\npub fn query(&self) -> &str;",
          "documentation": "Returns the current query."
        },
        {
          "name": "::SlashDropdownState::filtered_indices",
          "line": 156,
          "signature": "#[must_use]\npub fn filtered_indices(&self) -> &[usize];",
          "documentation": "Returns the filtered indices."
        },
        {
          "name": "::SlashDropdownState::selected",
          "line": 162,
          "signature": "#[must_use]\npub fn selected(&self) -> usize;",
          "documentation": "Returns the selected index within filtered results."
        },
        {
          "name": "::SlashDropdown",
          "line": 174,
          "signature": "#[derive(Debug, Clone)]\npub struct SlashDropdown<'a> {\n\n}",
          "documentation": "Inline dropdown widget for slash-command autocomplete.\n\nRenders a list of matching commands with the selected item highlighted.\nThe selected item expands to show usage info on a second row."
        },
        {
          "name": "::SlashDropdown<'a>::new",
          "line": 186,
          "signature": "#[must_use]\npub fn new(items: &'a [SlashDropdownItem]) -> Self;",
          "documentation": "Create a new slash dropdown."
        },
        {
          "name": "::SlashDropdown<'a>::theme",
          "line": 196,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme (builder pattern)."
        },
        {
          "name": "::SlashDropdown<'a>::max_visible",
          "line": 203,
          "signature": "#[must_use]\npub fn max_visible(mut self, n: usize) -> Self;",
          "documentation": "Set the maximum number of visible items (builder pattern)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/spinner.rs",
      "sha256": "07edf7f6ec78a14058b3326bab680ecce0f7674aa967205979cd2c7fb2e6ce1f",
      "artifactSha256": "cba13d892d1795686e62c90cbe5cd7e427c3fb3c3e3f7b0719630db32fbd10cc",
      "url": "/reference/source/harness-tui-kit/src/components/system/spinner.rs.txt",
      "declarations": [
        {
          "name": "::SpinnerStyle",
          "line": 29,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]\npub enum SpinnerStyle {\n    /// Braille pattern dots: \u280b\u2819\u2839\u2838\u283c\u2834\u2826\u2827\u2807\u280f\n    #[default]\n    Dots,\n    /// Line rotation: |/-\\\n    Line,\n    /// Arc rotation: \u25dc\u25dd\u25de\u25df\n    Arc,\n    /// Bounce: \u2801\u2802\u2804\u2840\u2880\u2820\u2810\u2808\n    Bounce,\n    /// Moon phases: \ud83c\udf11\ud83c\udf12\ud83c\udf13\ud83c\udf14\ud83c\udf15\ud83c\udf16\ud83c\udf17\ud83c\udf18\n    Moon,\n    /// Clock: \ud83d\udd50\ud83d\udd51\ud83d\udd52\ud83d\udd53\ud83d\udd54\ud83d\udd55\ud83d\udd56\ud83d\udd57\ud83d\udd58\ud83d\udd59\ud83d\udd5a\ud83d\udd5b\n    Clock,\n    /// Arrow: \u2190\u2196\u2191\u2197\u2192\u2198\u2193\u2199\n    Arrow,\n    /// Toggle: \u22b6\u22b7\n    Toggle,\n    /// Growing bar: \u258f\u258e\u258d\u258c\u258b\u258a\u2589\u2588\n    GrowingBar,\n    /// Box bounce: \u2596\u2598\u259d\u2597\n    BoxBounce,\n}",
          "documentation": "Animation style for the spinner."
        },
        {
          "name": "::Spinner",
          "line": 88,
          "signature": "#[derive(Debug, Clone)]\npub struct Spinner<'a> {\n\n}",
          "documentation": "Animated loading indicator with configurable style and optional label.\n\nThis is a pure `Widget` \u2014 the animation frame is determined by a `tick` counter\nthat you increment externally (typically on each render frame or timer tick).\n\n# Examples\n\n```\nuse harness_tui_kit::{Spinner, SpinnerStyle};\nuse ratatui::widgets::Widget;\n\nlet spinner = Spinner::new(0)\n    .style(SpinnerStyle::Dots)\n    .label(\"Loading...\");\n```"
        },
        {
          "name": "::Spinner<'a>::new",
          "line": 104,
          "signature": "#[must_use]\npub fn new(tick: usize) -> Self;",
          "documentation": "Create a new spinner at the given animation tick.\n\nIncrement `tick` each frame to animate the spinner."
        },
        {
          "name": "::Spinner<'a>::style",
          "line": 115,
          "signature": "#[must_use]\npub fn style(mut self, style: SpinnerStyle) -> Self;",
          "documentation": "Set the animation style."
        },
        {
          "name": "::Spinner<'a>::label",
          "line": 122,
          "signature": "#[must_use]\npub fn label(mut self, label: &'a str) -> Self;",
          "documentation": "Set the label text displayed after the spinner character."
        },
        {
          "name": "::Spinner<'a>::theme",
          "line": 129,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/split_pane.rs",
      "sha256": "226600dfbfb35bbbf5b638fd34b7231ad0c2a083d33f258a3fb833b08896520a",
      "artifactSha256": "465af5a14e9fa72f01492a0b68795c55428b7bea2750119fd6c18941e2b1a13a",
      "url": "/reference/source/harness-tui-kit/src/components/system/split_pane.rs.txt",
      "declarations": [
        {
          "name": "::SplitDirection",
          "line": 69,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum SplitDirection {\n    /// Side-by-side layout: primary on the left, secondary on the right.\n    /// The divider is a vertical line of `\u2502` characters.\n    Horizontal,\n    /// Stacked layout: primary on top, secondary on the bottom.\n    /// The divider is a horizontal line of `\u2500` characters.\n    Vertical,\n}",
          "documentation": "Direction in which the split pane divides its area.\n\n# Variants\n\n- [`Horizontal`](SplitDirection::Horizontal) \u2014 Side-by-side layout (left | right),\n  with a vertical divider line.\n- [`Vertical`](SplitDirection::Vertical) \u2014 Stacked layout (top / bottom),\n  with a horizontal divider line."
        },
        {
          "name": "::CollapseState",
          "line": 85,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]\npub enum CollapseState {\n    /// Both panes are visible with a divider between them.\n    #[default]\n    None,\n    /// Primary pane is collapsed; secondary fills the entire area.\n    Primary,\n    /// Secondary pane is collapsed; primary fills the entire area.\n    Secondary,\n}",
          "documentation": "Current collapse state of the split pane.\n\nWhen collapsed, one pane is hidden and the other fills the entire area.\nNo divider is drawn in a collapsed state."
        },
        {
          "name": "::SplitPaneState",
          "line": 119,
          "signature": "#[derive(Debug, Clone)]\npub struct SplitPaneState {\n\n}",
          "documentation": "Mutable state for [`SplitPane`], persists across frames.\n\nTracks the split direction, ratio, minimum size constraints, and\ncollapse state. Provides methods for resizing, collapsing, and\ncomputing sub-area rectangles.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPaneState, SplitDirection, CollapseState};\nuse ratatui::layout::Rect;\n\nlet mut state = SplitPaneState::new(SplitDirection::Horizontal, 0.3);\nassert!((state.ratio() - 0.3).abs() < f32::EPSILON);\n\nlet area = Rect::new(0, 0, 80, 24);\nlet primary = state.primary_area(area);\nlet secondary = state.secondary_area(area);\nassert!(primary.width > 0);\nassert!(secondary.width > 0);\n```"
        },
        {
          "name": "::SplitPaneState::new",
          "line": 151,
          "signature": "#[must_use]\npub fn new(direction: SplitDirection, ratio: f32) -> Self;",
          "documentation": "Create a new split pane state.\n\nThe `ratio` is clamped to the range `0.1..=0.9`.\n\n# Arguments\n\n* `direction` \u2014 Whether to split horizontally (left|right) or vertically (top/bottom).\n* `ratio` \u2014 Proportion of space given to the primary pane (0.0 to 1.0).\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPaneState, SplitDirection};\n\nlet state = SplitPaneState::new(SplitDirection::Horizontal, 0.3);\nassert!((state.ratio() - 0.3).abs() < f32::EPSILON);\n```"
        },
        {
          "name": "::SplitPaneState::set_ratio",
          "line": 172,
          "signature": "pub fn set_ratio(&mut self, ratio: f32);",
          "documentation": "Set the split ratio, clamped to `0.1..=0.9`.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPaneState, SplitDirection};\n\nlet mut state = SplitPaneState::new(SplitDirection::Horizontal, 0.5);\nstate.set_ratio(0.7);\nassert!((state.ratio() - 0.7).abs() < f32::EPSILON);\n```"
        },
        {
          "name": "::SplitPaneState::resize",
          "line": 199,
          "signature": "pub fn resize(&mut self, delta: i16);",
          "documentation": "Nudge the ratio by a cell delta relative to the total axis length.\n\nA positive `delta` grows the primary pane; a negative `delta` shrinks it.\nThe resulting ratio is clamped to `0.1..=0.9`.\n\nThe `total` size is determined from the split direction: `area.width` for\nhorizontal splits, `area.height` for vertical splits. If the total is zero\nor too small, this method does nothing.\n\n# Arguments\n\n* `delta` \u2014 Number of cells to shift the divider. Positive = grow primary.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPaneState, SplitDirection};\n\nlet mut state = SplitPaneState::new(SplitDirection::Horizontal, 0.5);\n// Simulating a 100-wide area: +10 cells => ratio grows by ~0.10\nstate.resize(10);\nassert!(state.ratio() > 0.5);\n```"
        },
        {
          "name": "::SplitPaneState::collapse_primary",
          "line": 218,
          "signature": "pub fn collapse_primary(&mut self);",
          "documentation": "Collapse the primary pane so the secondary fills the entire area.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPaneState, SplitDirection, CollapseState};\n\nlet mut state = SplitPaneState::new(SplitDirection::Horizontal, 0.5);\nstate.collapse_primary();\nassert_eq!(state.collapsed(), CollapseState::Primary);\n```"
        },
        {
          "name": "::SplitPaneState::collapse_secondary",
          "line": 233,
          "signature": "pub fn collapse_secondary(&mut self);",
          "documentation": "Collapse the secondary pane so the primary fills the entire area.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPaneState, SplitDirection, CollapseState};\n\nlet mut state = SplitPaneState::new(SplitDirection::Horizontal, 0.5);\nstate.collapse_secondary();\nassert_eq!(state.collapsed(), CollapseState::Secondary);\n```"
        },
        {
          "name": "::SplitPaneState::expand",
          "line": 249,
          "signature": "pub fn expand(&mut self);",
          "documentation": "Expand both panes (restore from collapsed state).\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPaneState, SplitDirection, CollapseState};\n\nlet mut state = SplitPaneState::new(SplitDirection::Horizontal, 0.5);\nstate.collapse_primary();\nstate.expand();\nassert_eq!(state.collapsed(), CollapseState::None);\n```"
        },
        {
          "name": "::SplitPaneState::toggle_collapse",
          "line": 269,
          "signature": "pub fn toggle_collapse(&mut self);",
          "documentation": "Cycle collapse state: `None` -> `Primary` -> `Secondary` -> `None`.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPaneState, SplitDirection, CollapseState};\n\nlet mut state = SplitPaneState::new(SplitDirection::Horizontal, 0.5);\nassert_eq!(state.collapsed(), CollapseState::None);\nstate.toggle_collapse();\nassert_eq!(state.collapsed(), CollapseState::Primary);\nstate.toggle_collapse();\nassert_eq!(state.collapsed(), CollapseState::Secondary);\nstate.toggle_collapse();\nassert_eq!(state.collapsed(), CollapseState::None);\n```"
        },
        {
          "name": "::SplitPaneState::reset",
          "line": 290,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset to default ratio (0.5) and expand both panes.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPaneState, SplitDirection, CollapseState};\n\nlet mut state = SplitPaneState::new(SplitDirection::Horizontal, 0.3);\nstate.collapse_primary();\nstate.reset();\nassert!((state.ratio() - 0.5).abs() < f32::EPSILON);\nassert_eq!(state.collapsed(), CollapseState::None);\n```"
        },
        {
          "name": "::SplitPaneState::direction",
          "line": 297,
          "signature": "#[must_use]\npub fn direction(&self) -> SplitDirection;",
          "documentation": "Get the split direction."
        },
        {
          "name": "::SplitPaneState::ratio",
          "line": 303,
          "signature": "#[must_use]\npub fn ratio(&self) -> f32;",
          "documentation": "Get the current ratio."
        },
        {
          "name": "::SplitPaneState::collapsed",
          "line": 309,
          "signature": "#[must_use]\npub fn collapsed(&self) -> CollapseState;",
          "documentation": "Get the current collapse state."
        },
        {
          "name": "::SplitPaneState::primary_area",
          "line": 336,
          "signature": "#[must_use]\npub fn primary_area(&self, area: Rect) -> Rect;",
          "documentation": "Compute the rectangle for the primary pane within the given area.\n\nWhen [`CollapseState::Primary`], returns a zero-width/height rect at the\narea origin. When [`CollapseState::Secondary`], returns the full area.\nOtherwise, returns the left (horizontal) or top (vertical) portion.\n\n# Arguments\n\n* `area` \u2014 The total area available for the split pane.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPaneState, SplitDirection};\nuse ratatui::layout::Rect;\n\nlet state = SplitPaneState::new(SplitDirection::Horizontal, 0.5);\nlet area = Rect::new(0, 0, 80, 24);\nlet primary = state.primary_area(area);\nassert!(primary.width > 0);\nassert_eq!(primary.height, 24);\n```"
        },
        {
          "name": "::SplitPaneState::secondary_area",
          "line": 375,
          "signature": "#[must_use]\npub fn secondary_area(&self, area: Rect) -> Rect;",
          "documentation": "Compute the rectangle for the secondary pane within the given area.\n\nWhen [`CollapseState::Secondary`], returns a zero-width/height rect.\nWhen [`CollapseState::Primary`], returns the full area.\nOtherwise, returns the right (horizontal) or bottom (vertical) portion.\n\n# Arguments\n\n* `area` \u2014 The total area available for the split pane.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPaneState, SplitDirection};\nuse ratatui::layout::Rect;\n\nlet state = SplitPaneState::new(SplitDirection::Horizontal, 0.5);\nlet area = Rect::new(0, 0, 80, 24);\nlet secondary = state.secondary_area(area);\nassert!(secondary.width > 0);\nassert_eq!(secondary.height, 24);\n```"
        },
        {
          "name": "::SplitPaneState::divider_area",
          "line": 419,
          "signature": "#[must_use]\npub fn divider_area(&self, area: Rect) -> Rect;",
          "documentation": "Compute the rectangle for the divider strip.\n\nReturns a 1-cell-wide (horizontal) or 1-cell-tall (vertical) rectangle\npositioned between the primary and secondary panes. Returns a zero-size\nrect when collapsed.\n\n# Arguments\n\n* `area` \u2014 The total area available for the split pane.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPaneState, SplitDirection};\nuse ratatui::layout::Rect;\n\nlet state = SplitPaneState::new(SplitDirection::Horizontal, 0.5);\nlet area = Rect::new(0, 0, 80, 24);\nlet divider = state.divider_area(area);\nassert_eq!(divider.width, 1);\nassert_eq!(divider.height, 24);\n```"
        },
        {
          "name": "::SplitPane",
          "line": 505,
          "signature": "#[derive(Debug, Clone)]\npub struct SplitPane<'a> {\n\n}",
          "documentation": "Resizable split pane widget.\n\nRenders a divider line between two panels. The widget itself only draws\nthe divider; the caller is responsible for rendering content into the\nprimary and secondary areas obtained from [`SplitPaneState::primary_area`]\nand [`SplitPaneState::secondary_area`].\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::{SplitPane, SplitPaneState, SplitDirection};\nuse harness_tui_kit::Theme;\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet theme = Theme::dark();\nlet mut state = SplitPaneState::new(SplitDirection::Vertical, 0.4);\nlet area = Rect::new(0, 0, 80, 24);\nlet mut buf = Buffer::empty(area);\nSplitPane::new().theme(&theme).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::SplitPane<'a>::new",
          "line": 521,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new split pane widget with the default theme.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::SplitPane;\n\nlet pane = SplitPane::new();\n```"
        },
        {
          "name": "::SplitPane<'a>::theme",
          "line": 539,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme for divider rendering.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::split_pane::SplitPane;\nuse harness_tui_kit::Theme;\n\nlet theme = Theme::midnight();\nlet pane = SplitPane::new().theme(&theme);\n```"
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/status_bar.rs",
      "sha256": "0f6d207e846843a730a7a450652a484710ee9ceb6000e6bca6bce481c3853745",
      "artifactSha256": "02ffbafb9463c51b6e4451090be2cc728aab3772253a71d75254b0b2e7789e08",
      "url": "/reference/source/harness-tui-kit/src/components/system/status_bar.rs.txt",
      "declarations": [
        {
          "name": "::StatusBar",
          "line": 39,
          "signature": "#[derive(Debug, Clone)]\npub struct StatusBar<'a> {\n\n}",
          "documentation": "Bottom status strip with configurable segments.\n\nDisplays a horizontal bar at the bottom of the terminal with key\ninformation: connection state, active mode, current agent, metrics,\nand keyboard hints."
        },
        {
          "name": "::StatusBar<'a>::new",
          "line": 57,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new empty status bar."
        },
        {
          "name": "::StatusBar<'a>::connection",
          "line": 70,
          "signature": "#[must_use]\npub fn connection(mut self, text: &'a str) -> Self;",
          "documentation": "Set the connection state text."
        },
        {
          "name": "::StatusBar<'a>::mode",
          "line": 77,
          "signature": "#[must_use]\npub fn mode(mut self, text: &'a str) -> Self;",
          "documentation": "Set the mode label."
        },
        {
          "name": "::StatusBar<'a>::agent",
          "line": 84,
          "signature": "#[must_use]\npub fn agent(mut self, text: &'a str) -> Self;",
          "documentation": "Set the agent name."
        },
        {
          "name": "::StatusBar<'a>::metric",
          "line": 91,
          "signature": "#[must_use]\npub fn metric(mut self, text: &'a str) -> Self;",
          "documentation": "Set the metric text."
        },
        {
          "name": "::StatusBar<'a>::hint",
          "line": 98,
          "signature": "#[must_use]\npub fn hint(mut self, text: &'a str) -> Self;",
          "documentation": "Set the keyboard hint text."
        },
        {
          "name": "::StatusBar<'a>::theme",
          "line": 105,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/status_footer.rs",
      "sha256": "3ca02b2b158eadf26c3807addc2ab45c297d554516c51f79d28abd3876776b8d",
      "artifactSha256": "1cbeb0463112798c84514a403400b3965481971a98aa8dbff03bc87363ba10c1",
      "url": "/reference/source/harness-tui-kit/src/components/system/status_footer.rs.txt",
      "declarations": [
        {
          "name": "::StatusFooterIndicator",
          "line": 34,
          "signature": "#[derive(Debug, Clone)]\npub struct StatusFooterIndicator {\npub dot: char,\npub label: String,\npub active: bool\n}",
          "documentation": "One status indicator. Renders as `<dot> <label>` with optional\naccent on the dot."
        },
        {
          "name": "::StatusFooterIndicator::new",
          "line": 43,
          "signature": "#[must_use]\npub fn new(label: impl Into<String>) -> Self;",
          "documentation": "Build an indicator. Defaults to active (accent dot)."
        },
        {
          "name": "::StatusFooterIndicator::dot",
          "line": 53,
          "signature": "#[must_use]\npub fn dot(mut self, glyph: char) -> Self;",
          "documentation": "Override the dot glyph."
        },
        {
          "name": "::StatusFooterIndicator::inactive",
          "line": 60,
          "signature": "#[must_use]\npub fn inactive(mut self) -> Self;",
          "documentation": "Mark the indicator inactive \u2014 dot uses muted color."
        },
        {
          "name": "::StatusFooter",
          "line": 73,
          "signature": "#[derive(Debug, Clone)]\npub struct StatusFooter<'a> {\n\n}",
          "documentation": "The bottom-of-screen status strip."
        },
        {
          "name": "::StatusFooter<'a>::new",
          "line": 84,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Build a footer with empty defaults."
        },
        {
          "name": "::StatusFooter<'a>::left",
          "line": 96,
          "signature": "#[must_use]\npub fn left(mut self, text: &'a str) -> Self;",
          "documentation": "Set the left-aligned text (typically `cwd:branch`)."
        },
        {
          "name": "::StatusFooter<'a>::indicators",
          "line": 103,
          "signature": "#[must_use]\npub fn indicators(mut self, items: &'a [StatusFooterIndicator]) -> Self;",
          "documentation": "Set the centered indicator slice."
        },
        {
          "name": "::StatusFooter<'a>::right",
          "line": 110,
          "signature": "#[must_use]\npub fn right(mut self, text: &'a str) -> Self;",
          "documentation": "Set the right-aligned text (typically a version label)."
        },
        {
          "name": "::StatusFooter<'a>::theme",
          "line": 117,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::StatusFooter<'a>::indicator_gap",
          "line": 124,
          "signature": "#[must_use]\npub fn indicator_gap(mut self, gap: u16) -> Self;",
          "documentation": "Override the gap between indicators (default: 2 cells)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/status_indicator.rs",
      "sha256": "b1870ed1858c8cb790cba3abccaffeceeb1a509b6b1b6306bbe6d039f8fa61c0",
      "artifactSha256": "2109bd0c588daf6c6f3d290b074ef473a460c762e03e4f77587e44be2d6a8ce2",
      "url": "/reference/source/harness-tui-kit/src/components/system/status_indicator.rs.txt",
      "declarations": [
        {
          "name": "::StatusKind",
          "line": 24,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum StatusKind {\n    /// No active response \u2014 just the prompt blinking.\n    Idle,\n    /// Model thinking (no tokens streamed yet).\n    Thinking,\n    /// Tokens streaming in.\n    Streaming,\n    /// Tool / shell call in flight.\n    ToolCall,\n    /// User pressed `Esc` / `/stop` and the SDK is draining.\n    Stopping,\n    /// Stream finished, waiting on the next user input.\n    Done,\n}",
          "documentation": "What the agent is doing right now."
        },
        {
          "name": "::StatusKind::is_busy",
          "line": 42,
          "signature": "#[must_use]\npub fn is_busy(self) -> bool;",
          "documentation": "Is the agent currently busy (animated spinner shown)?"
        },
        {
          "name": "::StatusKind::label",
          "line": 54,
          "signature": "#[must_use]\npub fn label(self) -> &'static str;",
          "documentation": "Default header label for the status row."
        },
        {
          "name": "::StatusIndicatorState",
          "line": 71,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct StatusIndicatorState {\n/// Animation tick (caller increments each frame).\n\npub tick: u64\n}",
          "documentation": "Persistent state for [`StatusIndicator`]. The animation tick is a\nmonotonically increasing counter the caller bumps on each render\nframe; the indicator picks the right glyph from a small braille\nframe set."
        },
        {
          "name": "::StatusIndicatorState::advance",
          "line": 78,
          "signature": "pub fn advance(&mut self);",
          "documentation": "Bump the tick by 1."
        },
        {
          "name": "::StatusIndicatorState::reset",
          "line": 83,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset tick to 0."
        },
        {
          "name": "::StatusIndicator",
          "line": 90,
          "signature": "#[derive(Debug, Clone)]\npub struct StatusIndicator<'a> {\n\n}",
          "documentation": "Render a single-row status indicator."
        },
        {
          "name": "::StatusIndicator<'a>::new",
          "line": 101,
          "signature": "#[must_use]\npub fn new(kind: StatusKind) -> Self;",
          "documentation": "Construct a new status row in the given kind."
        },
        {
          "name": "::StatusIndicator<'a>::theme",
          "line": 113,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::StatusIndicator<'a>::elapsed",
          "line": 120,
          "signature": "#[must_use]\npub fn elapsed(mut self, elapsed: Duration) -> Self;",
          "documentation": "Show an elapsed-time pill (`12s` / `1m 02s` / `1h 03m 09s`)."
        },
        {
          "name": "::StatusIndicator<'a>::detail",
          "line": 128,
          "signature": "#[must_use]\npub fn detail(mut self, detail: &'a str) -> Self;",
          "documentation": "Show a short inline detail (e.g. the current tool name or the\nmodel id)."
        },
        {
          "name": "::StatusIndicator<'a>::interrupt_hint",
          "line": 135,
          "signature": "#[must_use]\npub fn interrupt_hint(mut self, on: bool) -> Self;",
          "documentation": "Show \"Esc to interrupt\" on the right-hand side."
        },
        {
          "name": "::fmt_elapsed_compact",
          "line": 206,
          "signature": "#[must_use]\npub fn fmt_elapsed_compact(elapsed_secs: u64) -> String;",
          "documentation": "Format elapsed seconds into a compact human-readable string.\nModeled on `openai/codex@codex-rs/tui/src/status_indicator_widget.rs::fmt_elapsed_compact`."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/tabs.rs",
      "sha256": "a60a9e1be3de93a31e4f12227abeb10962a5673ad936833d7da71a5e3d6b5149",
      "artifactSha256": "ae2a2a217c940ad0e2f00e29c9f08b870bc17721da492d3a95f4097edf87a78d",
      "url": "/reference/source/harness-tui-kit/src/components/system/tabs.rs.txt",
      "declarations": [
        {
          "name": "::TabItem",
          "line": 62,
          "signature": "#[derive(Debug, Clone)]\npub struct TabItem {\n\n}",
          "documentation": "A single tab descriptor carrying a sanitized label and an optional badge count.\n\nLabels are sanitized at construction time via [`sanitize`] to strip ANSI escapes,\nOSC sequences, null bytes, and other dangerous terminal content.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::TabItem;\n\nlet tab = TabItem::new(\"Agents\").with_badge(5);\nassert_eq!(tab.label(), \"Agents\");\nassert_eq!(tab.badge(), Some(5));\n```"
        },
        {
          "name": "::TabItem::new",
          "line": 85,
          "signature": "#[must_use]\npub fn new(label: impl Into<String>) -> Self;",
          "documentation": "Create a new tab item with the given label.\n\nThe label is sanitized to remove terminal escape sequences and control\ncharacters. An empty or all-whitespace label is stored as-is after\nsanitization.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::TabItem;\n\nlet tab = TabItem::new(\"Chat\");\nassert_eq!(tab.label(), \"Chat\");\n```"
        },
        {
          "name": "::TabItem::with_badge",
          "line": 106,
          "signature": "#[must_use]\npub fn with_badge(mut self, count: u32) -> Self;",
          "documentation": "Attach a badge count to this tab.\n\nThe badge is displayed as `(N)` after the label in the tab bar. A badge\nof `0` is treated as no badge and will not render.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::TabItem;\n\nlet tab = TabItem::new(\"Alerts\").with_badge(12);\nassert_eq!(tab.badge(), Some(12));\n```"
        },
        {
          "name": "::TabItem::label",
          "line": 113,
          "signature": "#[must_use]\npub fn label(&self) -> &str;",
          "documentation": "Returns the sanitized label."
        },
        {
          "name": "::TabItem::badge",
          "line": 119,
          "signature": "#[must_use]\npub fn badge(&self) -> Option<u32>;",
          "documentation": "Returns the badge count, if any."
        },
        {
          "name": "::TabsState",
          "line": 167,
          "signature": "#[derive(Debug, Clone)]\npub struct TabsState {\n\n}",
          "documentation": "Mutable state for [`Tabs`], persisted across frames.\n\nTracks which tab is active, the set of tab items, and the horizontal\nscroll offset for overflow handling. The application is responsible for\nkeeping this state alive between renders.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::{TabsState, TabItem};\n\nlet items = vec![TabItem::new(\"A\"), TabItem::new(\"B\"), TabItem::new(\"C\")];\nlet mut state = TabsState::new(items);\nassert_eq!(state.active(), 0);\n\nstate.next();\nassert_eq!(state.active(), 1);\n\nstate.prev();\nassert_eq!(state.active(), 0);\n```"
        },
        {
          "name": "::TabsState::new",
          "line": 192,
          "signature": "#[must_use]\npub fn new(items: Vec<TabItem>) -> Self;",
          "documentation": "Create a new state with the given tab items.\n\nThe first tab is selected by default. If `items` is empty the state is\nvalid but will render nothing.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::{TabsState, TabItem};\n\nlet state = TabsState::new(vec![TabItem::new(\"Home\")]);\nassert_eq!(state.active(), 0);\nassert_eq!(state.len(), 1);\n```"
        },
        {
          "name": "::TabsState::select",
          "line": 218,
          "signature": "pub fn select(&mut self, index: usize);",
          "documentation": "Select the tab at `index`, clamping to the last valid index.\n\nIf the items list is empty this is a no-op. The scroll offset is\nadjusted so the active tab is always visible.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::{TabsState, TabItem};\n\nlet mut state = TabsState::new(vec![TabItem::new(\"A\"), TabItem::new(\"B\")]);\nstate.select(1);\nassert_eq!(state.active(), 1);\n\n// Out-of-bounds clamps to last tab\nstate.select(100);\nassert_eq!(state.active(), 1);\n```"
        },
        {
          "name": "::TabsState::next",
          "line": 241,
          "signature": "pub fn next(&mut self);",
          "documentation": "Move to the next tab, wrapping around to the first tab after the last.\n\nNo-op when there are zero or one tabs.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::{TabsState, TabItem};\n\nlet mut state = TabsState::new(vec![TabItem::new(\"A\"), TabItem::new(\"B\")]);\nstate.next();\nassert_eq!(state.active(), 1);\nstate.next();\nassert_eq!(state.active(), 0); // wrapped\n```"
        },
        {
          "name": "::TabsState::prev",
          "line": 264,
          "signature": "pub fn prev(&mut self);",
          "documentation": "Move to the previous tab, wrapping around to the last tab before the first.\n\nNo-op when there are zero or one tabs.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::{TabsState, TabItem};\n\nlet mut state = TabsState::new(vec![TabItem::new(\"A\"), TabItem::new(\"B\")]);\nstate.prev();\nassert_eq!(state.active(), 1); // wrapped\nstate.prev();\nassert_eq!(state.active(), 0);\n```"
        },
        {
          "name": "::TabsState::active",
          "line": 278,
          "signature": "#[must_use]\npub fn active(&self) -> usize;",
          "documentation": "Returns the index of the currently active tab."
        },
        {
          "name": "::TabsState::active_label",
          "line": 295,
          "signature": "#[must_use]\npub fn active_label(&self) -> &str;",
          "documentation": "Returns the label of the currently active tab.\n\nReturns an empty string if there are no tabs.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::{TabsState, TabItem};\n\nlet state = TabsState::new(vec![TabItem::new(\"Home\"), TabItem::new(\"Settings\")]);\nassert_eq!(state.active_label(), \"Home\");\n```"
        },
        {
          "name": "::TabsState::len",
          "line": 301,
          "signature": "#[must_use]\npub fn len(&self) -> usize;",
          "documentation": "Returns the number of tabs."
        },
        {
          "name": "::TabsState::is_empty",
          "line": 307,
          "signature": "#[must_use]\npub fn is_empty(&self) -> bool;",
          "documentation": "Returns `true` if there are no tabs."
        },
        {
          "name": "::TabsState::set_badge",
          "line": 327,
          "signature": "pub fn set_badge(&mut self, index: usize, count: Option<u32>);",
          "documentation": "Set or clear the badge on the tab at `index`.\n\nIf `index` is out of bounds, this is a no-op.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::{TabsState, TabItem};\n\nlet mut state = TabsState::new(vec![TabItem::new(\"Inbox\")]);\nstate.set_badge(0, Some(7));\nassert_eq!(state.items().get(0).and_then(|t| t.badge()), Some(7));\n\nstate.set_badge(0, None);\nassert_eq!(state.items().get(0).and_then(|t| t.badge()), None);\n```"
        },
        {
          "name": "::TabsState::reset",
          "line": 345,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset the state to its initial configuration: first tab active, no scroll.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::{TabsState, TabItem};\n\nlet mut state = TabsState::new(vec![TabItem::new(\"A\"), TabItem::new(\"B\")]);\nstate.select(1);\nstate.reset();\nassert_eq!(state.active(), 0);\n```"
        },
        {
          "name": "::TabsState::items",
          "line": 352,
          "signature": "#[must_use]\npub fn items(&self) -> &[TabItem];",
          "documentation": "Returns a slice of all tab items."
        },
        {
          "name": "::Tabs",
          "line": 399,
          "signature": "#[derive(Debug, Clone)]\npub struct Tabs<'a> {\n\n}",
          "documentation": "Tab navigation bar rendered as a horizontal strip.\n\nThis is a [`StatefulWidget`] that renders against [`TabsState`]. It draws\ntab labels left-to-right with the active tab highlighted, optional badge\ncounts, and overflow indicators (`<` / `>`) when tabs exceed the\navailable width.\n\n# Layout\n\n- **Height 1**: Tab labels on a single line with active tab in accent color.\n- **Height >= 2**: Tab labels on line 1, underline indicator and bottom border\n  on line 2. The active tab gets a highlighted underline segment using `\u2501`.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::{Tabs, TabsState, TabItem};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet mut state = TabsState::new(vec![\n    TabItem::new(\"Chat\"),\n    TabItem::new(\"Agents\").with_badge(2),\n]);\nlet area = Rect::new(0, 0, 40, 2);\nlet mut buf = Buffer::empty(area);\nTabs::new().render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::Tabs<'a>::new",
          "line": 415,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Create a new tab bar widget using the default theme.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::Tabs;\n\nlet tabs = Tabs::new();\n```"
        },
        {
          "name": "::Tabs<'a>::theme",
          "line": 433,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme for rendering.\n\n# Examples\n\n```\nuse harness_tui_kit::components::system::tabs::Tabs;\nuse harness_tui_kit::Theme;\n\nlet theme = Theme::midnight();\nlet tabs = Tabs::new().theme(&theme);\n```"
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/theme_picker.rs",
      "sha256": "dcac6f9d0304d8ddbd48fbc74d80bb69ee14151bea6360de832cdd913c7a0981",
      "artifactSha256": "fb3f7d7edc1c5e23ad157afd13d54635055a99f91d47aadd6d6de3f5cbea12b9",
      "url": "/reference/source/harness-tui-kit/src/components/system/theme_picker.rs.txt",
      "declarations": [
        {
          "name": "::ThemePickerRow",
          "line": 21,
          "signature": "#[derive(Debug, Clone)]\npub struct ThemePickerRow {\n/// Stable id (used by the activation handler).\n\npub id: String,\n/// Display name (e.g. \"Solarized Dark\").\n\npub name: String,\n/// One-line description shown beside the focus marker.\n\npub description: String,\n/// Background color preview (for the swatch column).\n\npub preview_bg: Color,\n/// Foreground color preview.\n\npub preview_fg: Color,\n/// Accent color preview.\n\npub preview_accent: Color\n}",
          "documentation": "One row in [`ThemePicker`]."
        },
        {
          "name": "::ThemePickerState",
          "line": 38,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct ThemePickerState {\n\n}",
          "documentation": "Persistent state for [`ThemePicker`]."
        },
        {
          "name": "::ThemePickerState::selected",
          "line": 45,
          "signature": "#[must_use]\npub fn selected(&self) -> usize;",
          "documentation": "Currently-focused index."
        },
        {
          "name": "::ThemePickerState::move_down",
          "line": 50,
          "signature": "pub fn move_down(&mut self, len: usize);",
          "documentation": "Move focus down by one row, clamped to `len - 1`."
        },
        {
          "name": "::ThemePickerState::move_up",
          "line": 59,
          "signature": "pub fn move_up(&mut self);",
          "documentation": "Move focus up by one row."
        },
        {
          "name": "::ThemePickerState::reset",
          "line": 64,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset focus to the first row."
        },
        {
          "name": "::ThemePicker",
          "line": 71,
          "signature": "#[derive(Debug, Clone)]\npub struct ThemePicker<'a> {\n\n}",
          "documentation": "Theme picker widget."
        },
        {
          "name": "::ThemePicker<'a>::new",
          "line": 80,
          "signature": "#[must_use]\npub fn new(rows: &'a [ThemePickerRow]) -> Self;",
          "documentation": "Construct a new picker over `rows`."
        },
        {
          "name": "::ThemePicker<'a>::theme",
          "line": 91,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme (the picker's chrome \u2014 separate\nfrom any theme being previewed in a row)."
        },
        {
          "name": "::ThemePicker<'a>::title",
          "line": 98,
          "signature": "#[must_use]\npub fn title(mut self, title: &'a str) -> Self;",
          "documentation": "Override the title at the top of the picker block."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/thinking.rs",
      "sha256": "f0fe57f8368c4909116ac7ffa45a1a04a8eaa79ab79fb7f5664f4d7b510fc46d",
      "artifactSha256": "7e320a7a1a242d77232a4bab98f28e1952d5dcda368da59cc3e3a0525ba2c1a8",
      "url": "/reference/source/harness-tui-kit/src/components/system/thinking.rs.txt",
      "declarations": [
        {
          "name": "::ThinkingIndicator",
          "line": 36,
          "signature": "#[derive(Debug, Clone)]\npub struct ThinkingIndicator<'a> {\n\n}",
          "documentation": "Animated reasoning indicator with phase label and elapsed timer.\n\nRenders an animated spinner followed by a label (e.g., \"Thinking...\")\nand optionally an elapsed time display."
        },
        {
          "name": "::ThinkingIndicator<'a>::new",
          "line": 50,
          "signature": "#[must_use]\npub fn new(tick: usize) -> Self;",
          "documentation": "Create a new thinking indicator at the given animation tick."
        },
        {
          "name": "::ThinkingIndicator<'a>::label",
          "line": 61,
          "signature": "#[must_use]\npub fn label(mut self, label: &'a str) -> Self;",
          "documentation": "Set the phase label."
        },
        {
          "name": "::ThinkingIndicator<'a>::elapsed",
          "line": 68,
          "signature": "#[must_use]\npub fn elapsed(mut self, elapsed: &'a str) -> Self;",
          "documentation": "Set the elapsed time display string."
        },
        {
          "name": "::ThinkingIndicator<'a>::theme",
          "line": 75,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/thinking_animation.rs",
      "sha256": "b5d947f264a1ded10c9a1bb9853ff13c644b83f5350d83d0b259ba1b376482b0",
      "artifactSha256": "557191cb50a13d949e6cddd7cd7b5ec498203d9d6086c64f31166fa22833a382",
      "url": "/reference/source/harness-tui-kit/src/components/system/thinking_animation.rs.txt",
      "declarations": [
        {
          "name": "::THINKING_ANIMATION_DEFAULT_WIDTH",
          "line": 34,
          "signature": "pub const THINKING_ANIMATION_DEFAULT_WIDTH: u16;",
          "documentation": "Default visible width in terminal cells. The user asked for ~32\n\u2014 wide enough to feel substantial, narrow enough to drop into a\nstatus row without dominating it."
        },
        {
          "name": "::THINKING_ANIMATION_DEFAULT_CHARSET",
          "line": 37,
          "signature": "pub const THINKING_ANIMATION_DEFAULT_CHARSET: &str;",
          "documentation": "Default character alphabet \u2014 hex digits."
        },
        {
          "name": "::ThinkingAnimationState",
          "line": 43,
          "signature": "#[derive(Debug, Clone)]\npub struct ThinkingAnimationState {\n\n}",
          "documentation": "Persistent state for [`ThinkingAnimation`]. The runtime calls\n[`Self::advance`] once per frame so each cell's phase steps\nforward."
        },
        {
          "name": "::ThinkingAnimationState::with_width",
          "line": 59,
          "signature": "#[must_use]\npub fn with_width(width: u16) -> Self;",
          "documentation": "Construct state for a band of `width` cells. Each cell gets a\ndistinct seed phase + flip cadence."
        },
        {
          "name": "::ThinkingAnimationState::advance",
          "line": 85,
          "signature": "pub fn advance(&mut self);",
          "documentation": "Advance one frame. Cells whose cadence divides the current\ntick rotate their phase by a small per-cell offset."
        },
        {
          "name": "::ThinkingAnimationState::reset",
          "line": 99,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset to a fresh phase pattern at the same width."
        },
        {
          "name": "::ThinkingAnimationState::width",
          "line": 106,
          "signature": "#[must_use]\npub fn width(&self) -> u16;",
          "documentation": "Width (in cells) the state was sized for."
        },
        {
          "name": "::ThinkingAnimationState::tick",
          "line": 112,
          "signature": "#[must_use]\npub fn tick(&self) -> u64;",
          "documentation": "Current global tick. Useful for tests / diagnostics."
        },
        {
          "name": "::ThinkingAnimation",
          "line": 134,
          "signature": "#[derive(Debug, Clone)]\npub struct ThinkingAnimation<'a> {\n\n}",
          "documentation": "Single-row band of fluttering hex characters that signals the\nagent is thinking."
        },
        {
          "name": "::ThinkingAnimation<'a>::new",
          "line": 148,
          "signature": "#[must_use]\npub fn new() -> Self;",
          "documentation": "Build with the default 32-char hex band."
        },
        {
          "name": "::ThinkingAnimation<'a>::theme",
          "line": 160,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::ThinkingAnimation<'a>::width",
          "line": 168,
          "signature": "#[must_use]\npub fn width(mut self, width: u16) -> Self;",
          "documentation": "Override the visible width in cells. Values < 1 are clamped\nto 1."
        },
        {
          "name": "::ThinkingAnimation<'a>::charset",
          "line": 176,
          "signature": "#[must_use]\npub fn charset(mut self, charset: &'a str) -> Self;",
          "documentation": "Override the character alphabet (hex by default). Empty\nstrings render as spaces."
        },
        {
          "name": "::ThinkingAnimation<'a>::fg",
          "line": 184,
          "signature": "#[must_use]\npub fn fg(mut self, fg: Color) -> Self;",
          "documentation": "Override the foreground colour. Defaults to the theme's\nprimary accent when unset."
        },
        {
          "name": "::ThinkingAnimation<'a>::bg",
          "line": 191,
          "signature": "#[must_use]\npub fn bg(mut self, bg: Color) -> Self;",
          "documentation": "Optional background colour."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/system/welcome_screen.rs",
      "sha256": "eb66f12f77fb3ac7c7cd4a218f2e3dc9ffbf27b5696f2e2b9c4396bb671b6ea0",
      "artifactSha256": "6028e87d7a8bc7b7388c365892f50043ed8a238512c6c9de7bfeb7982db5d745",
      "url": "/reference/source/harness-tui-kit/src/components/system/welcome_screen.rs.txt",
      "declarations": [
        {
          "name": "::WelcomeConfig",
          "line": 43,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct WelcomeConfig {\n/// Hero text rendered as block letters (e.g. `\"clausen\"`).\n\n/// Ignored when [`Self::custom_logo_rows`] is set.\n\npub brand: String,\n/// Optional pixel-art logo overriding the block-font [`Self::brand`].\n\n/// Each row contains `\u2588` (filled), `\u2591` (shade), or ` ` (transparent)\n\n/// cells \u2014 see [`crate::CustomLogo`] for the renderer and\n\n/// [`crate::CLAUSEN_LOGO_ROWS`] for the bundled Clausen art.\n\npub custom_logo_rows: Option<&'static [&'static str]>,\n/// How many leading characters of `brand` to render dim \u2014 used\n\n/// for the opencode-style \"open\" dim / \"code\" bright effect.\n\n/// Set to 0 to render the whole brand at full strength.\n\npub dim_prefix: usize,\n/// Optional `(from, to)` truecolor gradient swept across the\n\n/// block letters. Both colors must be `Color::Rgb`.\n\npub gradient: Option<(Color, Color)>,\n/// Placeholder line shown inside the focus card.\n\npub placeholder: String,\n/// Bold mode tag on the meta line (e.g. `\"Build\"`).\n\npub mode: String,\n/// Model name (e.g. `\"Kimi K2.6\"`).\n\npub model: String,\n/// Dim tagline that follows the model (e.g. `\"Kimi For Coding\"`).\n\npub model_tagline: String,\n/// Hint pairs rendered in the bar below the focus card.\n\npub hints: Vec<HintItem>,\n/// Footer left-aligned text (cwd, branch).\n\npub footer_left: String,\n/// Footer center indicators.\n\npub footer_indicators: Vec<StatusFooterIndicator>,\n/// Footer right-aligned text (typically version).\n\npub footer_right: String\n}",
          "documentation": "Brand + hint configuration consumed by [`WelcomeScreen`].\n\nAll fields are owned `String`s so the type can be passed across\nbuilder boundaries (e.g. stored on the SDK's `AgentApp`)."
        },
        {
          "name": "::WelcomeConfig::new",
          "line": 80,
          "signature": "#[must_use]\npub fn new(brand: impl Into<String>) -> Self;",
          "documentation": "Convenience constructor."
        },
        {
          "name": "::WelcomeConfig::placeholder",
          "line": 89,
          "signature": "#[must_use]\npub fn placeholder(mut self, text: impl Into<String>) -> Self;",
          "documentation": "Set placeholder text."
        },
        {
          "name": "::WelcomeConfig::mode",
          "line": 96,
          "signature": "#[must_use]\npub fn mode(mut self, label: impl Into<String>) -> Self;",
          "documentation": "Set mode tag."
        },
        {
          "name": "::WelcomeConfig::model",
          "line": 103,
          "signature": "#[must_use]\npub fn model(mut self, name: impl Into<String>) -> Self;",
          "documentation": "Set model name."
        },
        {
          "name": "::WelcomeConfig::model_tagline",
          "line": 110,
          "signature": "#[must_use]\npub fn model_tagline(mut self, text: impl Into<String>) -> Self;",
          "documentation": "Set model tagline."
        },
        {
          "name": "::WelcomeConfig::hints",
          "line": 117,
          "signature": "#[must_use]\npub fn hints(mut self, items: Vec<HintItem>) -> Self;",
          "documentation": "Replace the hint pairs."
        },
        {
          "name": "::WelcomeConfig::footer_left",
          "line": 124,
          "signature": "#[must_use]\npub fn footer_left(mut self, text: impl Into<String>) -> Self;",
          "documentation": "Set the footer left text."
        },
        {
          "name": "::WelcomeConfig::footer_indicators",
          "line": 131,
          "signature": "#[must_use]\npub fn footer_indicators(mut self, items: Vec<StatusFooterIndicator>) -> Self;",
          "documentation": "Replace the footer indicators."
        },
        {
          "name": "::WelcomeConfig::footer_right",
          "line": 138,
          "signature": "#[must_use]\npub fn footer_right(mut self, text: impl Into<String>) -> Self;",
          "documentation": "Set the footer right-side text."
        },
        {
          "name": "::WelcomeConfig::dim_prefix",
          "line": 145,
          "signature": "#[must_use]\npub fn dim_prefix(mut self, n: usize) -> Self;",
          "documentation": "Apply the opencode dim-prefix effect."
        },
        {
          "name": "::WelcomeConfig::gradient",
          "line": 152,
          "signature": "#[must_use]\npub fn gradient(mut self, from: Color, to: Color) -> Self;",
          "documentation": "Apply a horizontal color gradient to the brand logo."
        },
        {
          "name": "::WelcomeConfig::custom_logo",
          "line": 161,
          "signature": "#[must_use]\npub fn custom_logo(mut self, rows: &'static [&'static str]) -> Self;",
          "documentation": "Use a pixel-art logo (slice of `\u2588`/`\u2591`/` ` rows) instead of\nrendering the brand text via [`BlockLogo`]. Pass\n[`crate::CLAUSEN_LOGO_ROWS`] for the bundled Clausen wordmark."
        },
        {
          "name": "::WelcomeScreen",
          "line": 169,
          "signature": "#[derive(Debug, Clone)]\npub struct WelcomeScreen<'a> {\n\n}",
          "documentation": "Render a welcome screen given a [`WelcomeConfig`]."
        },
        {
          "name": "::WelcomeScreen<'a>::new",
          "line": 180,
          "signature": "#[must_use]\npub fn new(config: &'a WelcomeConfig) -> Self;",
          "documentation": "Build a welcome screen."
        },
        {
          "name": "::WelcomeScreen<'a>::theme",
          "line": 190,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Override the rendering theme."
        },
        {
          "name": "::WelcomeScreen<'a>::focus_card_max_width",
          "line": 197,
          "signature": "#[must_use]\npub fn focus_card_max_width(mut self, w: u16) -> Self;",
          "documentation": "Override the focus card width clamp."
        },
        {
          "name": "::WelcomeScreen<'a>::focus_card_rect",
          "line": 219,
          "signature": "#[must_use]\npub fn focus_card_rect(&self, area: Rect) -> Option<Rect>;",
          "documentation": "Compute where the focus card sits inside `area`, so callers\ncan overlay a real composer (e.g., a kit `InputBar`) onto the\ncard's placeholder row instead of having a separate input bar\nat the bottom of the screen. Returns `None` when `area` is\ntoo small for the welcome layout."
        },
        {
          "name": "::WelcomeScreen<'a>::input_overlay_rect",
          "line": 248,
          "signature": "#[must_use]\npub fn input_overlay_rect(&self, area: Rect) -> Option<Rect>;",
          "documentation": "Compute the 1-row strip *inside* the focus card body where\nthe placeholder line is rendered. This is the rect a runtime\nshould pass to its `InputBar` so the live composer\nvisually replaces the placeholder when the user starts\ntyping. Returns `None` if the area can't host the welcome\nlayout."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/workflow/mod.rs",
      "sha256": "a0b9d73372b2f1e29a49470557e3912aa53b763fe1b558fd1f323187a8d03f90",
      "artifactSha256": "c93c6b8980b77dc442407b82e3d8a23b90c0346ef1b51526db922bafef2eb856",
      "url": "/reference/source/harness-tui-kit/src/components/workflow/mod.rs.txt",
      "declarations": [
        {
          "name": "progress_timeline",
          "line": 5,
          "signature": "pub mod progress_timeline;",
          "documentation": "Workflow and orchestration components.\n\nComponents for visualizing task execution, DAG workflows, and progress tracking."
        },
        {
          "name": "task_list",
          "line": 6,
          "signature": "pub mod task_list;",
          "documentation": ""
        },
        {
          "name": "workflow_dag",
          "line": 7,
          "signature": "pub mod workflow_dag;",
          "documentation": ""
        },
        {
          "name": "workflow_node",
          "line": 8,
          "signature": "pub mod workflow_node;",
          "documentation": ""
        },
        {
          "name": "pub use progress_timeline::ProgressTimeline;",
          "line": 10,
          "signature": "pub use progress_timeline::ProgressTimeline;",
          "documentation": ""
        },
        {
          "name": "pub use task_list::{TaskList, TaskListState};",
          "line": 11,
          "signature": "pub use task_list::{TaskList, TaskListState};",
          "documentation": ""
        },
        {
          "name": "pub use workflow_dag::{WorkflowDAG, WorkflowDAGState};",
          "line": 12,
          "signature": "pub use workflow_dag::{WorkflowDAG, WorkflowDAGState};",
          "documentation": ""
        },
        {
          "name": "pub use workflow_node::WorkflowNode;",
          "line": 13,
          "signature": "pub use workflow_node::WorkflowNode;",
          "documentation": ""
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/workflow/progress_timeline.rs",
      "sha256": "761b1b4637914cf22519c63ae9884bcb295c6502af246fc866a8cfbbd766fc79",
      "artifactSha256": "7cc25948834200fc7767f4dca7dad8b10b9562c6a89b3b12aee2f0ed26b3737e",
      "url": "/reference/source/harness-tui-kit/src/components/workflow/progress_timeline.rs.txt",
      "declarations": [
        {
          "name": "::ProgressTimeline",
          "line": 107,
          "signature": "#[derive(Debug, Clone)]\npub struct ProgressTimeline<'a> {\n\n}",
          "documentation": "Horizontal progress bar with labeled step markers.\n\nRenders a multi-row display showing step labels on row 0, a connecting line\nwith status-colored node markers on row 1, and optional per-step elapsed\ntimes on row 2.\n\nEach step's marker is colored by its [`TaskStatus`]: active uses the accent\ncolor, complete uses success, error uses error, and both pending and skipped\nuse the muted foreground color.\n\nThe connecting line between steps is colored based on the status of the\n*left* step: complete or skipped steps produce a success-colored line,\nwhile other statuses produce a muted-colored line.\n\n# Examples\n\n```\nuse harness_tui_kit::components::workflow::progress_timeline::ProgressTimeline;\nuse harness_tui_kit::{TaskStatus, Theme};\nuse ratatui::buffer::Buffer;\nuse ratatui::layout::Rect;\nuse ratatui::widgets::Widget;\n\nlet theme = Theme::dark();\nlet steps: Vec<(String, TaskStatus)> = vec![\n    (\"Build\".into(), TaskStatus::Complete),\n    (\"Test\".into(), TaskStatus::Active),\n    (\"Deploy\".into(), TaskStatus::Pending),\n];\nlet elapsed = vec![3u64, 12, 0];\nlet area = Rect::new(0, 0, 60, 3);\nlet mut buf = Buffer::empty(area);\nProgressTimeline::new(&steps)\n    .theme(&theme)\n    .show_elapsed(true)\n    .elapsed_seconds(&elapsed)\n    .render(area, &mut buf);\n```"
        },
        {
          "name": "::ProgressTimeline<'a>::new",
          "line": 124,
          "signature": "#[must_use]\npub fn new(steps: &'a [(String, TaskStatus)]) -> Self;",
          "documentation": "Create a new progress timeline with the given steps.\n\nEach step is a `(label, status)` pair. Steps are rendered left-to-right\nin the order provided, evenly spaced across the available width."
        },
        {
          "name": "::ProgressTimeline<'a>::theme",
          "line": 135,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme (builder pattern)."
        },
        {
          "name": "::ProgressTimeline<'a>::show_elapsed",
          "line": 142,
          "signature": "#[must_use]\npub fn show_elapsed(mut self, show: bool) -> Self;",
          "documentation": "Set whether elapsed times are shown below each marker (builder pattern)."
        },
        {
          "name": "::ProgressTimeline<'a>::elapsed_seconds",
          "line": 153,
          "signature": "#[must_use]\npub fn elapsed_seconds(mut self, elapsed: &'a [u64]) -> Self;",
          "documentation": "Set per-step elapsed seconds (builder pattern).\n\nOnly displayed when [`show_elapsed`](Self::show_elapsed) is `true`.\nIf the slice is shorter than the number of steps, missing values default\nto zero. If longer, extra values are ignored."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/workflow/task_list.rs",
      "sha256": "200c2bcc0774d5026abd6961394fc6eba11e28118f05a18e1abcc10de80de1f3",
      "artifactSha256": "981c94fbe7bb6264f9ce4ba64902a3e8a511407d64e23726b0943df89aebc39a",
      "url": "/reference/source/harness-tui-kit/src/components/workflow/task_list.rs.txt",
      "declarations": [
        {
          "name": "::TaskListState",
          "line": 78,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct TaskListState {\n\n}",
          "documentation": "Mutable state for [`TaskList`], persists across frames.\n\nTracks the selected row index, scroll offset, and which parent tasks\nhave their children collapsed.\n\n# Examples\n\n```\nuse harness_tui_kit::components::workflow::task_list::TaskListState;\n\nlet mut state = TaskListState::default();\nstate.select_next(3);\nassert_eq!(state.selected_index(), 1);\nstate.select_prev();\nassert_eq!(state.selected_index(), 0);\n```"
        },
        {
          "name": "::TaskListState::select_next",
          "line": 91,
          "signature": "pub fn select_next(&mut self, total_visible: usize);",
          "documentation": "Move selection down by one position, clamped to the total visible row count.\n\n`total_visible` is the number of visible (flattened, not collapsed) rows."
        },
        {
          "name": "::TaskListState::select_prev",
          "line": 102,
          "signature": "pub fn select_prev(&mut self);",
          "documentation": "Move selection up by one position."
        },
        {
          "name": "::TaskListState::toggle_collapse",
          "line": 109,
          "signature": "pub fn toggle_collapse(&mut self, id: impl AsRef<str>);",
          "documentation": "Toggle whether a task's children are collapsed.\n\nIf the task is currently expanded, it becomes collapsed and vice versa."
        },
        {
          "name": "::TaskListState::selected_index",
          "line": 120,
          "signature": "#[must_use]\npub fn selected_index(&self) -> usize;",
          "documentation": "Returns the currently selected row index."
        },
        {
          "name": "::TaskListState::scroll_up",
          "line": 125,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll the view up by one row."
        },
        {
          "name": "::TaskListState::scroll_down",
          "line": 130,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll the view down by one row."
        },
        {
          "name": "::TaskListState::reset",
          "line": 135,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset all state to defaults."
        },
        {
          "name": "::TaskList",
          "line": 198,
          "signature": "#[derive(Debug, Clone)]\npub struct TaskList<'a> {\n\n}",
          "documentation": "Vertical checklist of [`TaskItem`] entries with status icons and progress.\n\nSupports hierarchical display via sub-tasks, keyboard navigation, collapsible\nsections, and inline progress bars. Each row shows a status-colored icon,\nthe task label, and an optional progress bar for tasks with non-zero progress.\n\n# Layout\n\n```text\n\u25cf Build project\n  \u25ce Compile          [\u2588\u2588\u2588\u2588\u2591\u2591\u2591\u2591] 50%\n  \u25cb Link\n\u2715 Run tests\n\u25cb Deploy\n```\n\n# Examples\n\n```\nuse harness_tui_kit::components::workflow::task_list::{TaskList, TaskListState};\nuse harness_tui_kit::{TaskItem, TaskStatus, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet theme = Theme::dark();\nlet tasks = vec![\n    TaskItem::new(\"t-1\", \"Build\").with_status(TaskStatus::Complete),\n];\nlet mut state = TaskListState::default();\nlet area = Rect::new(0, 0, 30, 5);\nlet mut buf = Buffer::empty(area);\nTaskList::new(&tasks).theme(&theme).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::TaskList<'a>::new",
          "line": 210,
          "signature": "#[must_use]\npub fn new(items: &'a [TaskItem]) -> Self;",
          "documentation": "Create a new task list with the given items."
        },
        {
          "name": "::TaskList<'a>::theme",
          "line": 220,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme (builder pattern)."
        },
        {
          "name": "::TaskList<'a>::show_progress",
          "line": 227,
          "signature": "#[must_use]\npub fn show_progress(mut self, show: bool) -> Self;",
          "documentation": "Set whether progress bars are shown (builder pattern)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/workflow/workflow_dag.rs",
      "sha256": "6cfadc052607062db896de278bb5097c5cf811c4a7d604c4ff4950d28e0b22a2",
      "artifactSha256": "5da87b6dea6ddd022ff1d9f370ef562116180769bd048803c518a1e74571085a",
      "url": "/reference/source/harness-tui-kit/src/components/workflow/workflow_dag.rs.txt",
      "declarations": [
        {
          "name": "::WorkflowDAGState",
          "line": 87,
          "signature": "#[derive(Debug, Clone, Default)]\npub struct WorkflowDAGState {\n\n}",
          "documentation": "Mutable state for [`WorkflowDAG`], persists across frames.\n\nTracks horizontal and vertical scroll offsets for panning through\nlarge DAGs that exceed the visible area.\n\n# Examples\n\n```\nuse harness_tui_kit::components::workflow::workflow_dag::WorkflowDAGState;\n\nlet mut state = WorkflowDAGState::default();\nstate.scroll_right();\nassert_eq!(state.scroll_x(), 1);\nstate.scroll_down();\nassert_eq!(state.scroll_y(), 1);\nstate.reset();\nassert_eq!(state.scroll_x(), 0);\nassert_eq!(state.scroll_y(), 0);\n```"
        },
        {
          "name": "::WorkflowDAGState::scroll_left",
          "line": 96,
          "signature": "pub fn scroll_left(&mut self);",
          "documentation": "Scroll left by one column."
        },
        {
          "name": "::WorkflowDAGState::scroll_right",
          "line": 101,
          "signature": "pub fn scroll_right(&mut self);",
          "documentation": "Scroll right by one column."
        },
        {
          "name": "::WorkflowDAGState::scroll_up",
          "line": 106,
          "signature": "pub fn scroll_up(&mut self);",
          "documentation": "Scroll up by one row."
        },
        {
          "name": "::WorkflowDAGState::scroll_down",
          "line": 111,
          "signature": "pub fn scroll_down(&mut self);",
          "documentation": "Scroll down by one row."
        },
        {
          "name": "::WorkflowDAGState::reset",
          "line": 116,
          "signature": "pub fn reset(&mut self);",
          "documentation": "Reset scroll offsets to origin."
        },
        {
          "name": "::WorkflowDAGState::scroll_x",
          "line": 122,
          "signature": "#[must_use]\npub fn scroll_x(&self) -> usize;",
          "documentation": "Returns the current horizontal scroll offset."
        },
        {
          "name": "::WorkflowDAGState::scroll_y",
          "line": 128,
          "signature": "#[must_use]\npub fn scroll_y(&self) -> usize;",
          "documentation": "Returns the current vertical scroll offset."
        },
        {
          "name": "::WorkflowDAG",
          "line": 174,
          "signature": "#[derive(Debug, Clone)]\npub struct WorkflowDAG<'a> {\n\n}",
          "documentation": "Directed acyclic graph widget for workflow visualization.\n\nRenders workflow nodes in columns organized by topological layer (left-to-right),\nconnected by horizontal edge lines. The layout is computed each frame from the\nprovided nodes and edges using Kahn's algorithm for topological ordering.\n\n# Layout Algorithm\n\n1. Nodes with no incoming edges are assigned to layer 0.\n2. Each subsequent layer contains nodes whose dependencies are all in prior layers.\n3. Within each layer, nodes are stacked vertically.\n4. Edges are drawn as horizontal `\u2500` connectors between the source node's right\n   side and the target node's left side.\n\n# Scrolling\n\nWhen the total DAG dimensions exceed the visible area, the widget supports\nhorizontal and vertical scrolling via [`WorkflowDAGState`].\n\n# Examples\n\n```\nuse harness_tui_kit::components::workflow::workflow_dag::{WorkflowDAG, WorkflowDAGState};\nuse harness_tui_kit::{WorkflowNodeInfo, WorkflowNodeKind, WorkflowEdge, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::StatefulWidget;\n\nlet nodes = vec![\n    WorkflowNodeInfo::new(\"a\", \"Start\", WorkflowNodeKind::Agent),\n    WorkflowNodeInfo::new(\"b\", \"End\", WorkflowNodeKind::Tool),\n];\nlet edges = vec![WorkflowEdge::new(\"a\", \"b\")];\nlet mut state = WorkflowDAGState::default();\nlet area = Rect::new(0, 0, 30, 5);\nlet mut buf = Buffer::empty(area);\nWorkflowDAG::new(&nodes, &edges).render(area, &mut buf, &mut state);\n```"
        },
        {
          "name": "::WorkflowDAG<'a>::new",
          "line": 190,
          "signature": "#[must_use]\npub fn new(nodes: &'a [WorkflowNodeInfo], edges: &'a [WorkflowEdge]) -> Self;",
          "documentation": "Create a new DAG widget with the given nodes and edges."
        },
        {
          "name": "::WorkflowDAG<'a>::theme",
          "line": 202,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme (builder pattern)."
        },
        {
          "name": "::WorkflowDAG<'a>::node_width",
          "line": 211,
          "signature": "#[must_use]\npub fn node_width(mut self, width: u16) -> Self;",
          "documentation": "Set the node cell width in columns (builder pattern).\n\nDefaults to 10. Minimum effective value is 3."
        },
        {
          "name": "::WorkflowDAG<'a>::node_height",
          "line": 220,
          "signature": "#[must_use]\npub fn node_height(mut self, height: u16) -> Self;",
          "documentation": "Set the node cell height in rows (builder pattern).\n\nDefaults to 3. Minimum effective value is 1."
        },
        {
          "name": "::compute_layers",
          "line": 578,
          "signature": "#[must_use]\npub fn compute_layers(nodes: &[WorkflowNodeInfo], edges: &[WorkflowEdge]) -> Vec<Vec<usize>>;",
          "documentation": "Compute topological layers from a set of nodes and edges.\n\nThis is the same algorithm used internally by [`WorkflowDAG`] for layout.\nExposed for testing and advanced layout customization.\n\nReturns a `Vec<Vec<usize>>` where each inner `Vec` contains node indices\nbelonging to that layer (layer 0 = no incoming edges)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/components/workflow/workflow_node.rs",
      "sha256": "bbdf2583133a43cc455e942e687f05c11562384f088d52488c5cdd776e48d360",
      "artifactSha256": "ef3ecb9829b9c8de035b8d70137615d07b3cfb7b365a2cdd2aa56f1a692ca7f3",
      "url": "/reference/source/harness-tui-kit/src/components/workflow/workflow_node.rs.txt",
      "declarations": [
        {
          "name": "::WorkflowNode",
          "line": 101,
          "signature": "#[derive(Debug, Clone)]\npub struct WorkflowNode<'a> {\n\n}",
          "documentation": "Widget rendering a single workflow DAG node.\n\nDisplays a kind-specific icon and the node label, optionally inside a border\nwhose color reflects the node's [`TaskStatus`]. In compact mode (one row, no\nborder), the node renders as `[icon] label`. In normal mode (three or more\nrows), the node renders inside a light box-drawing border.\n\n# Layout\n\n**Compact (1 row):\n```text\nT Build\n```\n\n**Normal (3+ rows):\n```text\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 T Build  \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n# Examples\n\n```\nuse harness_tui_kit::components::workflow::workflow_node::WorkflowNode;\nuse harness_tui_kit::{WorkflowNodeInfo, WorkflowNodeKind, TaskStatus, Theme};\nuse ratatui::layout::Rect;\nuse ratatui::buffer::Buffer;\nuse ratatui::widgets::Widget;\n\nlet node = WorkflowNodeInfo::new(\"n-1\", \"Review\", WorkflowNodeKind::Agent)\n    .with_status(TaskStatus::Complete);\nlet area = Rect::new(0, 0, 14, 3);\nlet mut buf = Buffer::empty(area);\nWorkflowNode::new(&node).render(area, &mut buf);\n```"
        },
        {
          "name": "::WorkflowNode<'a>::new",
          "line": 113,
          "signature": "#[must_use]\npub fn new(info: &'a WorkflowNodeInfo) -> Self;",
          "documentation": "Create a new workflow node widget."
        },
        {
          "name": "::WorkflowNode<'a>::theme",
          "line": 123,
          "signature": "#[must_use]\npub fn theme(mut self, theme: &'a Theme) -> Self;",
          "documentation": "Set the theme (builder pattern)."
        },
        {
          "name": "::WorkflowNode<'a>::compact",
          "line": 133,
          "signature": "#[must_use]\npub fn compact(mut self, compact: bool) -> Self;",
          "documentation": "Set compact mode (builder pattern).\n\nWhen `true`, the node renders as a single row without a border.\nWhen `false` (default), the node renders with a box-drawing border."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/effects.rs",
      "sha256": "62fe1acb5fd9dedbd00f51a443dc9707340b09bccdadc45153d8b921fa03963b",
      "artifactSha256": "4491c2dab528cdefcad7427d50c87882b61fa2c0694f68c5eba7348f2e58ce73",
      "url": "/reference/source/harness-tui-kit/src/effects.rs.txt",
      "declarations": [
        {
          "name": "::KitEffect",
          "line": 26,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]\npub enum KitEffect {\n    // \u2500\u2500\u2500 Chat Effects \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    /// New message slides up and fades in (250ms).\n    MessageAppear,\n    /// Blinking cursor at end of streaming text (500ms cycle).\n    StreamingCursor,\n    /// Tool call card expands (300ms).\n    ToolCallExpand,\n    /// Tool call card collapses (200ms).\n    ToolCallCollapse,\n    /// Code block copy flash (100ms).\n    CodeCopyFlash,\n\n    // \u2500\u2500\u2500 Agent Effects \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    /// Active agent status dot pulses (speed from theme).\n    StatusPulse,\n    /// Agent card glows briefly on status change (400ms).\n    StatusTransition,\n    /// Agent comes online \u2014 brief green glow (500ms).\n    AgentOnline,\n    /// Agent errors \u2014 brief red flash (300ms).\n    AgentError,\n    /// Agent terminated \u2014 fade to dim (600ms).\n    AgentTerminated,\n\n    // \u2500\u2500\u2500 System Effects \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    /// Cross-fade between screens (300ms).\n    ScreenTransition,\n    /// Toast slides in from edge (200ms).\n    NotificationSlideIn,\n    /// Toast fades out (300ms).\n    NotificationFadeOut,\n    /// Modal background dims (200ms).\n    ModalDim,\n    /// Modal content fades in (250ms).\n    ModalAppear,\n    /// Command palette drops down (150ms).\n    PaletteOpen,\n\n    // \u2500\u2500\u2500 Ambient Effects \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    /// Subtle breathing when system is idle (3s cycle).\n    IdleBreathe,\n    /// Ripple from an active element (400ms).\n    ActivityRipple,\n\n    // \u2500\u2500\u2500 Celebration Effects \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    /// Brief green flash on approval.\n    ApprovalGranted,\n    /// Brief red flash on denial.\n    ApprovalDenied,\n}",
          "documentation": "Named effect presets for Agent TUI Kit components.\n\nEach preset encapsulates a tachyonfx effect configuration tuned for\na specific UI interaction. Use [`KitEffect::to_effect`] to convert\nto a concrete [`tachyonfx::Effect`]."
        },
        {
          "name": "::KitEffect::to_effect",
          "line": 84,
          "signature": "#[must_use]\npub fn to_effect(&self, theme: &Theme) -> Effect;",
          "documentation": "Convert this preset to a tachyonfx [`Effect`] parameterized by the given theme.\n\nIf effects are disabled in the theme (`theme.effects_enabled == false`),\nreturns a no-op effect that completes immediately."
        },
        {
          "name": "::KitEffect::base_duration_ms",
          "line": 143,
          "signature": "#[must_use]\npub fn base_duration_ms(&self) -> u32;",
          "documentation": "Duration of this effect in milliseconds.\n\nReturns the base duration before any theme-based adjustments."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/lib.rs",
      "sha256": "e50cc92fc82cd94824b628145ae9e28c906ee02446709834296c6a11d770cb9a",
      "artifactSha256": "f6b2c9951a601a00b8da15bf3819212ac554668f0c68abeb12a37b03503f35fb",
      "url": "/reference/source/harness-tui-kit/src/lib.rs.txt",
      "declarations": [
        {
          "name": "components",
          "line": 25,
          "signature": "pub mod components;",
          "documentation": "# Agent TUI Kit\n\nProduction-ready TUI components for building agent-interaction terminal interfaces.\n\nAgent TUI Kit provides 44 themed, animated components built on [Ratatui](https://ratatui.rs/).\nEvery component is a standard `StatefulWidget` or `Widget` that composes through\nstandard Ratatui layout primitives.\n\n## Quick Start\n\n```rust,no_run\nuse harness_tui_kit::{Theme, ChatMessage, Role};\n\nlet theme = Theme::dark();\nlet msg = ChatMessage::user(\"Hello, agent!\");\n```\n\n## Design Philosophy\n\n- **Beautiful by default** \u2014 Ships with a dark theme that looks professional out of the box.\n- **Animated by nature** \u2014 Components use tachyonfx effects for state transitions.\n- **Framework-agnostic** \u2014 Knows nothing about LLMs, agents, or orchestration.\n- **Composable** \u2014 Standard Ratatui `Widget` / `StatefulWidget` implementations."
        },
        {
          "name": "util",
          "line": 29,
          "signature": "pub mod util;",
          "documentation": ""
        },
        {
          "name": "pub use effects::KitEffect;",
          "line": 31,
          "signature": "pub use effects::KitEffect;",
          "documentation": ""
        },
        {
          "name": "pub use theme::{Theme, ThemeOverrides, DEFAULT_THEME};",
          "line": 32,
          "signature": "pub use theme::{Theme, ThemeOverrides, DEFAULT_THEME};",
          "documentation": ""
        },
        {
          "name": "pub use types::{\n    AgentInfo, AgentStatus, ApprovalAction, ApprovalRequest, ChatMessage, CommandHint, CostEntry,\n    DecisionOption, DiffLine, DiffLineKind, KeyShortcut, LatencySnapshot, LogEntry, LogLevel,\n    PaletteItem, PermissionCategory, PermissionDecision, PermissionRequest, ProposalInfo,\n    ProposalKind, ProposalStatus, RiskLevel, Role, Severity, TaskItem, TaskStatus, ToolCallInfo,\n    ToolCallStatus, TransactionEntry, TreasuryInfo, VoteChoice, WorkflowEdge, WorkflowNodeInfo,\n    WorkflowNodeKind,\n};",
          "line": 33,
          "signature": "pub use types::{\n    AgentInfo, AgentStatus, ApprovalAction, ApprovalRequest, ChatMessage, CommandHint, CostEntry,\n    DecisionOption, DiffLine, DiffLineKind, KeyShortcut, LatencySnapshot, LogEntry, LogLevel,\n    PaletteItem, PermissionCategory, PermissionDecision, PermissionRequest, ProposalInfo,\n    ProposalKind, ProposalStatus, RiskLevel, Role, Severity, TaskItem, TaskStatus, ToolCallInfo,\n    ToolCallStatus, TransactionEntry, TreasuryInfo, VoteChoice, WorkflowEdge, WorkflowNodeInfo,\n    WorkflowNodeKind,\n};",
          "documentation": ""
        },
        {
          "name": "pub use components::agent::{\n    AgentAvatar, AgentCard, AgentCardState, AgentList, AgentListState, AgentPanel, AgentPanelState,\n    AgentStatusDot, AvatarSize, MultiAgentHeader, MultiAgentHeaderState,\n};",
          "line": 43,
          "signature": "pub use components::agent::{\n    AgentAvatar, AgentCard, AgentCardState, AgentList, AgentListState, AgentPanel, AgentPanelState,\n    AgentStatusDot, AvatarSize, MultiAgentHeader, MultiAgentHeaderState,\n};",
          "documentation": ""
        },
        {
          "name": "pub use components::chat::{\n    ChangeKind, ChatBubble, ChatBubbleState, ChatTimeline, ChatTimelineState, CodeBlock,\n    CodeBlockState, DiffView, DiffViewState, DocumentPreviewPane, DocumentPreviewState,\n    FileDisplay, FileDisplayState, InlineDiffCard, InputBar, InputBarState, MarkdownRenderer,\n    MarkdownStreamCollector, PageStyle, StreamingText, StreamingTextState, ToolCallCard,\n    ToolCallCardStatus, ToolCallDisplay, ToolCallState,\n};",
          "line": 47,
          "signature": "pub use components::chat::{\n    ChangeKind, ChatBubble, ChatBubbleState, ChatTimeline, ChatTimelineState, CodeBlock,\n    CodeBlockState, DiffView, DiffViewState, DocumentPreviewPane, DocumentPreviewState,\n    FileDisplay, FileDisplayState, InlineDiffCard, InputBar, InputBarState, MarkdownRenderer,\n    MarkdownStreamCollector, PageStyle, StreamingText, StreamingTextState, ToolCallCard,\n    ToolCallCardStatus, ToolCallDisplay, ToolCallState,\n};",
          "documentation": ""
        },
        {
          "name": "pub use components::governance::{\n    ConstitutionView, ConstitutionViewState, ProposalCard, ProposalCardState, TreasuryDisplay,\n    VotingPanel, VotingPanelState,\n};",
          "line": 54,
          "signature": "pub use components::governance::{\n    ConstitutionView, ConstitutionViewState, ProposalCard, ProposalCardState, TreasuryDisplay,\n    VotingPanel, VotingPanelState,\n};",
          "documentation": ""
        },
        {
          "name": "pub use components::harness::{\n    AttributionTable, AttributionTableRow, AttributionTaskOutcomeBadge, ChangeManifestView,\n    HarnessComponentRow, HarnessComponentStatus, HarnessComponentTree, HarnessComponentTreeState,\n    ManifestEntryView, ManifestVerdictBadge,\n};",
          "line": 58,
          "signature": "pub use components::harness::{\n    AttributionTable, AttributionTableRow, AttributionTaskOutcomeBadge, ChangeManifestView,\n    HarnessComponentRow, HarnessComponentStatus, HarnessComponentTree, HarnessComponentTreeState,\n    ManifestEntryView, ManifestVerdictBadge,\n};",
          "documentation": ""
        },
        {
          "name": "pub use components::history::{\n    ApprovalCell, ApprovalState, AssistantCell, DiffCell, ExecCell, ExecOutcome, HistoryCell,\n    HistoryView, HistoryViewState, SystemCell, SystemSeverity, ToolCell, ToolCellOutcome, UserCell,\n};",
          "line": 63,
          "signature": "pub use components::history::{\n    ApprovalCell, ApprovalState, AssistantCell, DiffCell, ExecCell, ExecOutcome, HistoryCell,\n    HistoryView, HistoryViewState, SystemCell, SystemSeverity, ToolCell, ToolCellOutcome, UserCell,\n};",
          "documentation": ""
        },
        {
          "name": "pub use components::hitl::{\n    ApprovalChooser, ApprovalChooserAction, ApprovalChooserState, ApprovalDialog,\n    ApprovalDialogState, ApprovalQueue, ApprovalQueueState, ConfirmButton, ConfirmationPrompt,\n    ConfirmationPromptState, DecisionPanel, DecisionPanelState, PermissionBanner, PermissionPrompt,\n    PermissionPromptState,\n};",
          "line": 67,
          "signature": "pub use components::hitl::{\n    ApprovalChooser, ApprovalChooserAction, ApprovalChooserState, ApprovalDialog,\n    ApprovalDialogState, ApprovalQueue, ApprovalQueueState, ConfirmButton, ConfirmationPrompt,\n    ConfirmationPromptState, DecisionPanel, DecisionPanelState, PermissionBanner, PermissionPrompt,\n    PermissionPromptState,\n};",
          "documentation": ""
        },
        {
          "name": "pub use components::metrics::{\n    CostTracker, LatencyDisplay, MetricBarItem, MetricCard, MetricsBar, TokenMeter,\n};",
          "line": 73,
          "signature": "pub use components::metrics::{\n    CostTracker, LatencyDisplay, MetricBarItem, MetricCard, MetricsBar, TokenMeter,\n};",
          "documentation": ""
        },
        {
          "name": "pub use components::system::{\n    custom_logo::CLAUSEN_LOGO_ROWS, fmt_elapsed_compact, AppShell, AppShellState, Banner,\n    BlockLogo, CollapseState, CommandPalette, CommandPaletteState, CustomLogo, FocusCard,\n    GoalDisplay, GoalStep, GoalStepStatus, HintBar, HintItem, KeyboardHelp, KeyboardHelpState,\n    LogViewer, LogViewerState, Modal, ModalButton, ModalState, ModelCapabilities, ModelPicker,\n    ModelPickerRow, ModelPickerState, NotificationToast, NotificationToastState, PagerOverlay,\n    PagerOverlayState, PendingSelection, ResumePicker, ResumePickerRow, ResumePickerState,\n    SettingsPalette, SettingsPaletteItem, SettingsPalettePage, SettingsPaletteState, ShellPanel,\n    Shimmer, ShimmerState, SlashDropdown, SlashDropdownItem, SlashDropdownState, Spinner,\n    SpinnerStyle, SplitDirection, SplitPane, SplitPaneState, StatusBar, StatusFooter,\n    StatusFooterIndicator, StatusIndicator, StatusIndicatorState, StatusKind, TabItem, Tabs,\n    TabsState, ThemePicker, ThemePickerRow, ThemePickerState, ThinkingAnimation,\n    ThinkingAnimationState, ThinkingIndicator, ToastMessage, WelcomeConfig, WelcomeScreen,\n    BLOCK_LOGO_GLYPH_WIDTH, BLOCK_LOGO_HEIGHT, BLOCK_LOGO_SPACING, SHIMMER_DEFAULT_WINDOW,\n    THINKING_ANIMATION_DEFAULT_CHARSET, THINKING_ANIMATION_DEFAULT_WIDTH,\n};",
          "line": 76,
          "signature": "pub use components::system::{\n    custom_logo::CLAUSEN_LOGO_ROWS, fmt_elapsed_compact, AppShell, AppShellState, Banner,\n    BlockLogo, CollapseState, CommandPalette, CommandPaletteState, CustomLogo, FocusCard,\n    GoalDisplay, GoalStep, GoalStepStatus, HintBar, HintItem, KeyboardHelp, KeyboardHelpState,\n    LogViewer, LogViewerState, Modal, ModalButton, ModalState, ModelCapabilities, ModelPicker,\n    ModelPickerRow, ModelPickerState, NotificationToast, NotificationToastState, PagerOverlay,\n    PagerOverlayState, PendingSelection, ResumePicker, ResumePickerRow, ResumePickerState,\n    SettingsPalette, SettingsPaletteItem, SettingsPalettePage, SettingsPaletteState, ShellPanel,\n    Shimmer, ShimmerState, SlashDropdown, SlashDropdownItem, SlashDropdownState, Spinner,\n    SpinnerStyle, SplitDirection, SplitPane, SplitPaneState, StatusBar, StatusFooter,\n    StatusFooterIndicator, StatusIndicator, StatusIndicatorState, StatusKind, TabItem, Tabs,\n    TabsState, ThemePicker, ThemePickerRow, ThemePickerState, ThinkingAnimation,\n    ThinkingAnimationState, ThinkingIndicator, ToastMessage, WelcomeConfig, WelcomeScreen,\n    BLOCK_LOGO_GLYPH_WIDTH, BLOCK_LOGO_HEIGHT, BLOCK_LOGO_SPACING, SHIMMER_DEFAULT_WINDOW,\n    THINKING_ANIMATION_DEFAULT_CHARSET, THINKING_ANIMATION_DEFAULT_WIDTH,\n};",
          "documentation": ""
        },
        {
          "name": "pub use components::workflow::{\n    ProgressTimeline, TaskList, TaskListState, WorkflowDAG, WorkflowDAGState, WorkflowNode,\n};",
          "line": 92,
          "signature": "pub use components::workflow::{\n    ProgressTimeline, TaskList, TaskListState, WorkflowDAG, WorkflowDAGState, WorkflowNode,\n};",
          "documentation": ""
        },
        {
          "name": "pub use util::live_wrap::{display_width, wrap_unicode};",
          "line": 95,
          "signature": "pub use util::live_wrap::{display_width, wrap_unicode};",
          "documentation": ""
        },
        {
          "name": "pub use util::unified_diff::{parse_unified_diff, DiffFile};",
          "line": 96,
          "signature": "pub use util::unified_diff::{parse_unified_diff, DiffFile};",
          "documentation": ""
        },
        {
          "name": "pub use util::word_diff::{pair_changed_lines, word_diff, ChangedPair, WordDiff};",
          "line": 97,
          "signature": "pub use util::word_diff::{pair_changed_lines, word_diff, ChangedPair, WordDiff};",
          "documentation": ""
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/theme.rs",
      "sha256": "181ec5910a301a0736791a335a91e2de89ba0795415f060add742a9db8476530",
      "artifactSha256": "f9b9ad058e18ab3dfdcde4d90beb90c1eb313cd199982e5667ffa0abaf3e9c6a",
      "url": "/reference/source/harness-tui-kit/src/theme.rs.txt",
      "declarations": [
        {
          "name": "::DEFAULT_THEME",
          "line": 40,
          "signature": "pub static DEFAULT_THEME: LazyLock<Theme>;",
          "documentation": "Global default theme instance.\n\nInitialized to [`Theme::dark()`] on first access. Use this when you need a\n`&'static Theme` reference for components that require a default."
        },
        {
          "name": "::Theme",
          "line": 69,
          "signature": "#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]\npub struct Theme {\n// \u2500\u2500\u2500 Surface Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Base background color for the entire terminal area.\n\npub bg_base: Color,\n/// Slightly elevated surface for cards and panels.\n\npub bg_surface: Color,\n/// More prominently elevated surface for floating elements.\n\npub bg_elevated: Color,\n/// Semi-transparent overlay backdrop for modals and dialogs.\n\npub bg_overlay: Color,\n// \u2500\u2500\u2500 Text Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Primary text color for body content and headings.\n\npub fg_primary: Color,\n/// Secondary text color for labels and less important content.\n\npub fg_secondary: Color,\n/// Muted text for hints, timestamps, and metadata.\n\npub fg_muted: Color,\n/// Disabled text for inactive or unavailable elements.\n\npub fg_disabled: Color,\n// \u2500\u2500\u2500 Semantic Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Accent color for interactive elements, links, and highlights.\n\npub accent: Color,\n/// Success state indicator (confirmations, completions).\n\npub success: Color,\n/// Warning state indicator (caution, degraded state).\n\npub warning: Color,\n/// Error state indicator (failures, critical issues).\n\npub error: Color,\n/// Informational state indicator (notices, tips).\n\npub info: Color,\n// \u2500\u2500\u2500 Agent Status Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Agent is online and ready to accept work.\n\npub agent_online: Color,\n/// Agent is actively working on a task.\n\npub agent_working: Color,\n/// Agent is processing or reasoning (thinking state).\n\npub agent_thinking: Color,\n/// Agent is idle with no current task.\n\npub agent_idle: Color,\n/// Agent is waiting for external input or approval.\n\npub agent_waiting: Color,\n/// Agent has encountered an error condition.\n\npub agent_error: Color,\n/// Agent has been terminated or shut down.\n\npub agent_terminated: Color,\n/// Agent is offline and unreachable.\n\npub agent_offline: Color,\n// \u2500\u2500\u2500 Chat Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Color for user messages in chat.\n\npub chat_user: Color,\n/// Color for agent/assistant messages in chat.\n\npub chat_agent: Color,\n/// Color for system messages in chat.\n\npub chat_system: Color,\n/// Color for tool call/result messages in chat.\n\npub chat_tool: Color,\n// \u2500\u2500\u2500 Border Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Default border color for unfocused elements.\n\npub border_default: Color,\n/// Border color for focused/selected elements.\n\npub border_focus: Color,\n/// Border color for active/interacting elements.\n\npub border_active: Color,\n// \u2500\u2500\u2500 Effect Parameters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Whether tachyonfx effects are enabled globally.\n\npub effects_enabled: bool,\n/// Color used for glow and highlight effects.\n\npub effect_glow: Color,\n/// Pulse animation speed in cycles per second.\n\npub effect_pulse_speed: f32,\n/// Streaming text speed in characters per second.\n\npub effect_streaming_cps: f32,\n/// Fade transition duration in milliseconds.\n\npub effect_fade_ms: u32\n}",
          "documentation": "Complete theme configuration for Agent TUI Kit.\n\nContains 35 design tokens covering every visual aspect of the component library.\nAll color fields use [`ratatui::style::Color`] and support RGB, indexed, and named\ncolor variants. Effect parameters control animation speed and behavior.\n\n# Built-in Themes\n\n- [`Theme::dark()`] \u2014 Cool gray surfaces, white text, blue accent. Default.\n- [`Theme::light()`] \u2014 Warm white surfaces, dark text, blue accent.\n- [`Theme::midnight()`] \u2014 Deep navy surfaces, silver text, cyan accent.\n\n# Custom Themes\n\nUse [`Theme::custom`] to create a theme by applying [`ThemeOverrides`] to a base theme.\n\n# Examples\n\n```\nuse harness_tui_kit::Theme;\n\nlet theme = Theme::dark();\n// Access color tokens directly\nlet bg = theme.bg_base;\nlet accent = theme.accent;\n```"
        },
        {
          "name": "::Theme::dark",
          "line": 164,
          "signature": "#[must_use]\npub fn dark() -> Self;",
          "documentation": "Create the default dark theme.\n\nCool gray surfaces with white text and a blue accent. This is the recommended\ndefault for most terminal environments.\n\n# Examples\n\n```\nuse harness_tui_kit::Theme;\nlet theme = Theme::dark();\n```"
        },
        {
          "name": "::Theme::light",
          "line": 227,
          "signature": "#[must_use]\npub fn light() -> Self;",
          "documentation": "Create a light theme for bright terminal environments.\n\nWarm white surfaces with dark text and a blue accent. Suitable for terminals\nwith light backgrounds.\n\n# Examples\n\n```\nuse harness_tui_kit::Theme;\nlet theme = Theme::light();\n```"
        },
        {
          "name": "::Theme::midnight",
          "line": 290,
          "signature": "#[must_use]\npub fn midnight() -> Self;",
          "documentation": "Create a midnight theme with deep navy tones.\n\nDeep navy surfaces with silver text and a cyan accent. Designed for\nextended coding sessions with minimal eye strain.\n\n# Examples\n\n```\nuse harness_tui_kit::Theme;\nlet theme = Theme::midnight();\n```"
        },
        {
          "name": "::Theme::claude",
          "line": 359,
          "signature": "#[must_use]\npub fn claude() -> Self;",
          "documentation": "The recommended modern theme \u2014 a sophisticated warm-charcoal\npalette modeled on Claude Code's chat surface. Backgrounds are\nnear-black with a faint brown undertone, the accent is a soft\npeach (rather than the saturated blue used by [`Theme::dark`])\nso streamed text and emphasis read as warm rather than cold.\nBorders are barely there, surfaces are flat, and effects are\ndialed back so the eye lands on content, not chrome.\n\nUse this for new applications that want the polished\n\"AI assistant\" aesthetic out of the box.\n\n# Examples\n\n```\nuse harness_tui_kit::Theme;\nlet theme = Theme::claude();\n```"
        },
        {
          "name": "::Theme::monochrome",
          "line": 423,
          "signature": "#[must_use]\npub fn monochrome() -> Self;",
          "documentation": "Pure monochrome \u2014 every semantic colour collapses to a shade\nof grey on a black surface. Designed for the Clausen TUI:\nemphasis is conveyed by `Modifier::BOLD` / `REVERSED`\n`ITALIC`, not hue.\n\n# Examples\n\n```\nuse harness_tui_kit::Theme;\nlet theme = Theme::monochrome();\n```"
        },
        {
          "name": "::Theme::custom",
          "line": 493,
          "signature": "#[must_use]\npub fn custom(base: Self, overrides: &ThemeOverrides) -> Self;",
          "documentation": "Create a custom theme by applying overrides to a base theme.\n\nAny field set to `Some(...)` in the overrides replaces the corresponding\nfield in the base theme. Fields left as `None` retain the base value.\n\n# Examples\n\n```\nuse harness_tui_kit::{Theme, ThemeOverrides};\nuse ratatui::style::Color;\n\nlet overrides = ThemeOverrides {\n    accent: Some(Color::Rgb(255, 0, 128)),\n    effects_enabled: Some(false),\n    ..ThemeOverrides::default()\n};\nlet theme = Theme::custom(Theme::dark(), &overrides);\nassert_eq!(theme.accent, Color::Rgb(255, 0, 128));\nassert!(!theme.effects_enabled);\n```"
        },
        {
          "name": "::Theme::resolve_color",
          "line": 565,
          "signature": "#[must_use]\npub fn resolve_color(&self, color: Color) -> Color;",
          "documentation": "Resolve a color for terminals that may not support true-color (RGB).\n\nIf the color is [`Color::Rgb`], converts it to the nearest ANSI 256-color\nindex via [`crate::util::color::rgb_to_ansi256`]. All other color variants\nare returned unchanged.\n\n# Examples\n\n```\nuse harness_tui_kit::Theme;\nuse ratatui::style::Color;\n\nlet theme = Theme::dark();\nlet resolved = theme.resolve_color(Color::Rgb(100, 140, 255));\n// Returns Color::Indexed(69) or similar 256-color approximation\n```"
        },
        {
          "name": "::Theme::role_color",
          "line": 590,
          "signature": "#[must_use]\npub fn role_color(&self, role: &Role) -> Color;",
          "documentation": "Get the theme color associated with a chat message [`Role`].\n\nMaps each role to its corresponding chat color token:\n- [`Role::User`] -> [`Theme::chat_user`]\n- [`Role::Agent`] -> [`Theme::chat_agent`]\n- [`Role::System`] -> [`Theme::chat_system`]\n- [`Role::Tool`] -> [`Theme::chat_tool`]\n\n# Examples\n\n```\nuse harness_tui_kit::{Theme, Role};\n\nlet theme = Theme::dark();\nlet color = theme.role_color(&Role::User);\nassert_eq!(color, theme.chat_user);\n```"
        },
        {
          "name": "::Theme::agent_status_color",
          "line": 613,
          "signature": "#[must_use]\npub fn agent_status_color(&self, status: &AgentStatus) -> Color;",
          "documentation": "Get the theme color associated with an [`AgentStatus`].\n\nMaps each status variant to its corresponding agent status color token.\n\n# Examples\n\n```\nuse harness_tui_kit::{Theme, AgentStatus};\n\nlet theme = Theme::dark();\nlet color = theme.agent_status_color(&AgentStatus::Online);\nassert_eq!(color, theme.agent_online);\n```"
        },
        {
          "name": "::Theme::severity_color",
          "line": 644,
          "signature": "#[must_use]\npub fn severity_color(&self, severity: &Severity) -> Color;",
          "documentation": "Get the theme color associated with a [`Severity`] level.\n\nMaps each severity to its corresponding semantic color:\n- [`Severity::Success`] -> [`Theme::success`]\n- [`Severity::Info`] -> [`Theme::info`]\n- [`Severity::Warning`] -> [`Theme::warning`]\n- [`Severity::Error`] -> [`Theme::error`]\n\n# Examples\n\n```\nuse harness_tui_kit::{Theme, Severity};\n\nlet theme = Theme::dark();\nlet color = theme.severity_color(&Severity::Error);\nassert_eq!(color, theme.error);\n```"
        },
        {
          "name": "::ThemeOverrides",
          "line": 679,
          "signature": "#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]\npub struct ThemeOverrides {\n// \u2500\u2500\u2500 Surface Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Override for [`Theme::bg_base`].\n\npub bg_base: Option<Color>,\n/// Override for [`Theme::bg_surface`].\n\npub bg_surface: Option<Color>,\n/// Override for [`Theme::bg_elevated`].\n\npub bg_elevated: Option<Color>,\n/// Override for [`Theme::bg_overlay`].\n\npub bg_overlay: Option<Color>,\n// \u2500\u2500\u2500 Text Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Override for [`Theme::fg_primary`].\n\npub fg_primary: Option<Color>,\n/// Override for [`Theme::fg_secondary`].\n\npub fg_secondary: Option<Color>,\n/// Override for [`Theme::fg_muted`].\n\npub fg_muted: Option<Color>,\n/// Override for [`Theme::fg_disabled`].\n\npub fg_disabled: Option<Color>,\n// \u2500\u2500\u2500 Semantic Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Override for [`Theme::accent`].\n\npub accent: Option<Color>,\n/// Override for [`Theme::success`].\n\npub success: Option<Color>,\n/// Override for [`Theme::warning`].\n\npub warning: Option<Color>,\n/// Override for [`Theme::error`].\n\npub error: Option<Color>,\n/// Override for [`Theme::info`].\n\npub info: Option<Color>,\n// \u2500\u2500\u2500 Agent Status Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Override for [`Theme::agent_online`].\n\npub agent_online: Option<Color>,\n/// Override for [`Theme::agent_working`].\n\npub agent_working: Option<Color>,\n/// Override for [`Theme::agent_thinking`].\n\npub agent_thinking: Option<Color>,\n/// Override for [`Theme::agent_idle`].\n\npub agent_idle: Option<Color>,\n/// Override for [`Theme::agent_waiting`].\n\npub agent_waiting: Option<Color>,\n/// Override for [`Theme::agent_error`].\n\npub agent_error: Option<Color>,\n/// Override for [`Theme::agent_terminated`].\n\npub agent_terminated: Option<Color>,\n/// Override for [`Theme::agent_offline`].\n\npub agent_offline: Option<Color>,\n// \u2500\u2500\u2500 Chat Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Override for [`Theme::chat_user`].\n\npub chat_user: Option<Color>,\n/// Override for [`Theme::chat_agent`].\n\npub chat_agent: Option<Color>,\n/// Override for [`Theme::chat_system`].\n\npub chat_system: Option<Color>,\n/// Override for [`Theme::chat_tool`].\n\npub chat_tool: Option<Color>,\n// \u2500\u2500\u2500 Border Colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Override for [`Theme::border_default`].\n\npub border_default: Option<Color>,\n/// Override for [`Theme::border_focus`].\n\npub border_focus: Option<Color>,\n/// Override for [`Theme::border_active`].\n\npub border_active: Option<Color>,\n// \u2500\u2500\u2500 Effect Parameters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/// Override for [`Theme::effects_enabled`].\n\npub effects_enabled: Option<bool>,\n/// Override for [`Theme::effect_glow`].\n\npub effect_glow: Option<Color>,\n/// Override for [`Theme::effect_pulse_speed`].\n\npub effect_pulse_speed: Option<f32>,\n/// Override for [`Theme::effect_streaming_cps`].\n\npub effect_streaming_cps: Option<f32>,\n/// Override for [`Theme::effect_fade_ms`].\n\npub effect_fade_ms: Option<u32>\n}",
          "documentation": "Optional overrides for creating a custom [`Theme`].\n\nEvery field mirrors the corresponding field in [`Theme`] but wrapped in\n[`Option`]. When passed to [`Theme::custom`], only `Some(...)` values\nreplace the base theme's values; `None` fields are left unchanged.\n\n# Examples\n\n```\nuse harness_tui_kit::ThemeOverrides;\nuse ratatui::style::Color;\n\nlet overrides = ThemeOverrides {\n    accent: Some(Color::Rgb(255, 0, 128)),\n    bg_base: Some(Color::Rgb(0, 0, 0)),\n    ..ThemeOverrides::default()\n};\n```"
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/types.rs",
      "sha256": "fe451d870e4287bae66a2c90e5a191ceaf3005d40cc9c603d742fe3dd423bfcf",
      "artifactSha256": "b8557e57149e757b1f3a1eeb974638ac0c5ea8acd10917de94770cd9c004bed8",
      "url": "/reference/source/harness-tui-kit/src/types.rs.txt",
      "declarations": [
        {
          "name": "::Role",
          "line": 52,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]\n#[serde(rename_all = \"lowercase\")]\npub enum Role {\n    /// A human end-user.\n    User,\n    /// An AI agent.\n    Agent,\n    /// A system-generated message (e.g. connection notice, error).\n    System,\n    /// Output from a tool invocation.\n    Tool,\n}",
          "documentation": "The role of a participant in a conversation.\n\nUsed by [`ChatMessage`] and rendering components to determine visual\ntreatment (alignment, color, icon)."
        },
        {
          "name": "::Role::label",
          "line": 73,
          "signature": "#[must_use]\npub const fn label(&self) -> &'static str;",
          "documentation": "Human-readable label for this role.\n\n# Examples\n\n```\nuse harness_tui_kit::Role;\nassert_eq!(Role::User.label(), \"User\");\n```"
        },
        {
          "name": "::Role::symbol",
          "line": 91,
          "signature": "#[must_use]\npub const fn symbol(&self) -> &'static str;",
          "documentation": "Single-character symbol for compact displays.\n\n# Examples\n\n```\nuse harness_tui_kit::Role;\nassert_eq!(Role::Agent.symbol(), \"A\");\n```"
        },
        {
          "name": "::AgentStatus",
          "line": 117,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum AgentStatus {\n    /// The agent is connected and ready to accept work.\n    #[default]\n    Online,\n    /// The agent is actively executing a task.\n    Working,\n    /// The agent is reasoning / planning (no tool calls yet).\n    Thinking,\n    /// The agent is connected but has no pending work.\n    Idle,\n    /// The agent is blocked waiting on an external resource or human input.\n    Waiting,\n    /// The agent encountered an error.\n    Error,\n    /// The agent has been permanently shut down.\n    Terminated,\n    /// The agent is disconnected / unreachable.\n    Offline,\n}",
          "documentation": "Lifecycle status of an agent.\n\nComponents such as status dots and agent cards use this to determine colour\nand animation. The default status is [`AgentStatus::Online`]."
        },
        {
          "name": "::AgentStatus::label",
          "line": 147,
          "signature": "#[must_use]\npub const fn label(&self) -> &'static str;",
          "documentation": "Human-readable label for this status.\n\n# Examples\n\n```\nuse harness_tui_kit::AgentStatus;\nassert_eq!(AgentStatus::Working.label(), \"Working\");\n```"
        },
        {
          "name": "::AgentStatus::is_active",
          "line": 171,
          "signature": "#[must_use]\npub const fn is_active(&self) -> bool;",
          "documentation": "Returns `true` if the agent is performing work (Working or Thinking).\n\n# Examples\n\n```\nuse harness_tui_kit::AgentStatus;\nassert!(AgentStatus::Working.is_active());\nassert!(AgentStatus::Thinking.is_active());\nassert!(!AgentStatus::Idle.is_active());\n```"
        },
        {
          "name": "::AgentStatus::is_terminal",
          "line": 189,
          "signature": "#[must_use]\npub const fn is_terminal(&self) -> bool;",
          "documentation": "Returns `true` if the agent has reached a final state (Terminated or Offline).\n\nTerminal agents will not transition to other states without external\nintervention (reconnect, restart).\n\n# Examples\n\n```\nuse harness_tui_kit::AgentStatus;\nassert!(AgentStatus::Terminated.is_terminal());\nassert!(AgentStatus::Offline.is_terminal());\nassert!(!AgentStatus::Error.is_terminal());\n```"
        },
        {
          "name": "::ChatMessage",
          "line": 228,
          "signature": "#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]\npub struct ChatMessage {\n/// Unique identifier for this message (monotonic counter per process).\n\npub id: String,\n/// Role of the message author.\n\npub role: Role,\n/// Display name of the sender.\n\npub sender: String,\n/// Message body (plain text or markdown).\n\npub content: String,\n/// ISO-8601 timestamp string, or empty if not set.\n\npub timestamp: String\n}",
          "documentation": "A single message in a conversation timeline.\n\n`ChatMessage` is the primary data unit for chat components. Each message\ncarries an auto-generated unique `id`, a [`Role`], sender name, content\nbody, and an optional ISO-8601 timestamp.\n\n# Construction\n\nUse the convenience constructors [`ChatMessage::user`], [`ChatMessage::agent`],\n[`ChatMessage::system`], and [`ChatMessage::tool`] for common cases. For full\ncontrol, use [`ChatMessage::new`] followed by builder methods.\n\n# Examples\n\n```\nuse harness_tui_kit::{ChatMessage, Role};\n\nlet msg = ChatMessage::user(\"Hello!\")\n    .with_timestamp(\"2026-02-18T12:00:00Z\");\nassert_eq!(msg.role, Role::User);\nassert_eq!(msg.sender, \"User\");\nassert_eq!(msg.content, \"Hello!\");\n```"
        },
        {
          "name": "::ChatMessage::new",
          "line": 256,
          "signature": "#[must_use]\npub fn new(role: Role, sender: impl AsRef<str>, content: impl AsRef<str>) -> Self;",
          "documentation": "Create a new message with explicit role, sender, and content.\n\nAn auto-incremented numeric ID is assigned. Timestamp defaults to empty.\n\n# Examples\n\n```\nuse harness_tui_kit::{ChatMessage, Role};\n\nlet msg = ChatMessage::new(Role::Agent, \"GPT-4\", \"Thinking...\");\nassert_eq!(msg.role, Role::Agent);\nassert_eq!(msg.sender, \"GPT-4\");\n```"
        },
        {
          "name": "::ChatMessage::user",
          "line": 278,
          "signature": "#[must_use]\npub fn user(content: impl AsRef<str>) -> Self;",
          "documentation": "Create a user message with the default sender name \"User\".\n\n# Examples\n\n```\nuse harness_tui_kit::{ChatMessage, Role};\n\nlet msg = ChatMessage::user(\"How are you?\");\nassert_eq!(msg.role, Role::User);\nassert_eq!(msg.sender, \"User\");\n```"
        },
        {
          "name": "::ChatMessage::agent",
          "line": 294,
          "signature": "#[must_use]\npub fn agent(sender: impl AsRef<str>, content: impl AsRef<str>) -> Self;",
          "documentation": "Create an agent message with the given sender name.\n\n# Examples\n\n```\nuse harness_tui_kit::{ChatMessage, Role};\n\nlet msg = ChatMessage::agent(\"Claude\", \"I'm doing well.\");\nassert_eq!(msg.role, Role::Agent);\nassert_eq!(msg.sender, \"Claude\");\n```"
        },
        {
          "name": "::ChatMessage::system",
          "line": 309,
          "signature": "#[must_use]\npub fn system(content: impl AsRef<str>) -> Self;",
          "documentation": "Create a system message with the default sender name \"System\".\n\n# Examples\n\n```\nuse harness_tui_kit::{ChatMessage, Role};\n\nlet msg = ChatMessage::system(\"Connection established.\");\nassert_eq!(msg.role, Role::System);\n```"
        },
        {
          "name": "::ChatMessage::tool",
          "line": 324,
          "signature": "#[must_use]\npub fn tool(content: impl AsRef<str>) -> Self;",
          "documentation": "Create a tool message with the default sender name \"Tool\".\n\n# Examples\n\n```\nuse harness_tui_kit::{ChatMessage, Role};\n\nlet msg = ChatMessage::tool(\"Result: 42\");\nassert_eq!(msg.role, Role::Tool);\n```"
        },
        {
          "name": "::ChatMessage::with_timestamp",
          "line": 339,
          "signature": "#[must_use]\npub fn with_timestamp(mut self, timestamp: impl AsRef<str>) -> Self;",
          "documentation": "Set the timestamp (builder pattern).\n\n# Examples\n\n```\nuse harness_tui_kit::ChatMessage;\n\nlet msg = ChatMessage::user(\"Hi\").with_timestamp(\"2026-02-18T00:00:00Z\");\nassert_eq!(msg.timestamp, \"2026-02-18T00:00:00Z\");\n```"
        },
        {
          "name": "::ChatMessage::with_id",
          "line": 357,
          "signature": "#[must_use]\npub fn with_id(mut self, id: impl AsRef<str>) -> Self;",
          "documentation": "Override the auto-generated ID (builder pattern).\n\nUseful when reconstructing messages from a persistence layer.\n\n# Examples\n\n```\nuse harness_tui_kit::ChatMessage;\n\nlet msg = ChatMessage::user(\"Hi\").with_id(\"custom-123\");\nassert_eq!(msg.id, \"custom-123\");\n```"
        },
        {
          "name": "::AgentInfo",
          "line": 388,
          "signature": "#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]\npub struct AgentInfo {\n/// Unique identifier for this agent.\n\npub id: String,\n/// Human-readable display name.\n\npub name: String,\n/// Short description of the agent's role or purpose.\n\npub role_description: String,\n/// Model identifier (e.g. \"gpt-4o\", \"claude-opus-4-6\").\n\npub model: String,\n/// Current lifecycle status.\n\npub status: AgentStatus\n}",
          "documentation": "Metadata describing a connected agent.\n\nUsed by agent cards, roster lists, and status indicators to render agent\nidentity and current status.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentInfo, AgentStatus};\n\nlet info = AgentInfo::new(\"agent-1\", \"Navigator\", \"gpt-4o\")\n    .with_status(AgentStatus::Working);\nassert!(info.status.is_active());\n```"
        },
        {
          "name": "::AgentInfo::new",
          "line": 417,
          "signature": "#[must_use]\npub fn new(id: impl AsRef<str>, name: impl AsRef<str>, model: impl AsRef<str>) -> Self;",
          "documentation": "Create a new agent info with required fields.\n\nStatus defaults to [`AgentStatus::Online`]. Role description defaults\nto an empty string.\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentInfo, AgentStatus};\n\nlet info = AgentInfo::new(\"a1\", \"Coder\", \"claude-opus-4-6\");\nassert_eq!(info.status, AgentStatus::Online);\nassert_eq!(info.role_description, \"\");\n```"
        },
        {
          "name": "::AgentInfo::with_role",
          "line": 439,
          "signature": "#[must_use]\npub fn with_role(mut self, role_description: impl AsRef<str>) -> Self;",
          "documentation": "Set the role description (builder pattern).\n\n# Examples\n\n```\nuse harness_tui_kit::AgentInfo;\n\nlet info = AgentInfo::new(\"a1\", \"Coder\", \"gpt-4o\")\n    .with_role(\"Writes and reviews code\");\nassert_eq!(info.role_description, \"Writes and reviews code\");\n```"
        },
        {
          "name": "::AgentInfo::with_status",
          "line": 456,
          "signature": "#[must_use]\npub fn with_status(mut self, status: AgentStatus) -> Self;",
          "documentation": "Set the agent status (builder pattern).\n\n# Examples\n\n```\nuse harness_tui_kit::{AgentInfo, AgentStatus};\n\nlet info = AgentInfo::new(\"a1\", \"Coder\", \"gpt-4o\")\n    .with_status(AgentStatus::Thinking);\nassert_eq!(info.status, AgentStatus::Thinking);\n```"
        },
        {
          "name": "::ToolCallStatus",
          "line": 478,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum ToolCallStatus {\n    /// The tool call has been requested but not yet started.\n    #[default]\n    Pending,\n    /// The tool call is currently executing.\n    Running,\n    /// The tool call completed successfully.\n    Success,\n    /// The tool call failed with an error.\n    Error,\n}",
          "documentation": "Status of a single tool invocation.\n\nUsed by tool call cards and timeline entries to indicate progress.\nThe default status is [`ToolCallStatus::Pending`]."
        },
        {
          "name": "::ToolCallStatus::label",
          "line": 500,
          "signature": "#[must_use]\npub const fn label(&self) -> &'static str;",
          "documentation": "Human-readable label for this status.\n\n# Examples\n\n```\nuse harness_tui_kit::ToolCallStatus;\nassert_eq!(ToolCallStatus::Running.label(), \"Running\");\n```"
        },
        {
          "name": "::ToolCallStatus::is_complete",
          "line": 520,
          "signature": "#[must_use]\npub const fn is_complete(&self) -> bool;",
          "documentation": "Returns `true` if the tool call has finished (Success or Error).\n\n# Examples\n\n```\nuse harness_tui_kit::ToolCallStatus;\nassert!(ToolCallStatus::Success.is_complete());\nassert!(ToolCallStatus::Error.is_complete());\nassert!(!ToolCallStatus::Running.is_complete());\n```"
        },
        {
          "name": "::ToolCallInfo",
          "line": 552,
          "signature": "#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]\npub struct ToolCallInfo {\n/// Name of the tool (e.g. \"read_file\", \"bash\").\n\npub name: String,\n/// Serialized arguments passed to the tool (typically JSON).\n\npub arguments: String,\n/// Output produced by the tool, or empty if not yet available.\n\npub output: String,\n/// Current execution status.\n\npub status: ToolCallStatus,\n/// Wall-clock duration of the tool call, if completed.\n\n#[serde(\n        serialize_with = \"serialize_opt_duration\",\n        deserialize_with = \"deserialize_opt_duration\"\n    )]\npub duration: Option<Duration>\n}",
          "documentation": "Metadata and state for a single tool invocation.\n\nDisplayed by tool call cards, timeline entries, and audit logs.\n\n# Examples\n\n```\nuse harness_tui_kit::{ToolCallInfo, ToolCallStatus};\nuse std::time::Duration;\n\nlet info = ToolCallInfo::new(\"read_file\", r#\"{\"path\": \"/tmp/foo.rs\"}\"#)\n    .with_status(ToolCallStatus::Success)\n    .with_output(\"fn main() {}\")\n    .with_duration(Duration::from_millis(42));\nassert!(info.status.is_complete());\n```"
        },
        {
          "name": "::ToolCallInfo::new",
          "line": 583,
          "signature": "#[must_use]\npub fn new(name: impl AsRef<str>, arguments: impl AsRef<str>) -> Self;",
          "documentation": "Create a new tool call info in [`ToolCallStatus::Pending`] state.\n\n# Examples\n\n```\nuse harness_tui_kit::{ToolCallInfo, ToolCallStatus};\n\nlet info = ToolCallInfo::new(\"bash\", \"ls -la\");\nassert_eq!(info.status, ToolCallStatus::Pending);\nassert_eq!(info.output, \"\");\nassert!(info.duration.is_none());\n```"
        },
        {
          "name": "::ToolCallInfo::with_status",
          "line": 605,
          "signature": "#[must_use]\npub fn with_status(mut self, status: ToolCallStatus) -> Self;",
          "documentation": "Set the tool call status (builder pattern).\n\n# Examples\n\n```\nuse harness_tui_kit::{ToolCallInfo, ToolCallStatus};\n\nlet info = ToolCallInfo::new(\"bash\", \"echo hi\")\n    .with_status(ToolCallStatus::Running);\nassert_eq!(info.status, ToolCallStatus::Running);\n```"
        },
        {
          "name": "::ToolCallInfo::with_output",
          "line": 621,
          "signature": "#[must_use]\npub fn with_output(mut self, output: impl AsRef<str>) -> Self;",
          "documentation": "Set the tool output (builder pattern).\n\n# Examples\n\n```\nuse harness_tui_kit::ToolCallInfo;\n\nlet info = ToolCallInfo::new(\"bash\", \"echo hi\").with_output(\"hi\\n\");\nassert_eq!(info.output, \"hi\\n\");\n```"
        },
        {
          "name": "::ToolCallInfo::with_duration",
          "line": 639,
          "signature": "#[must_use]\npub fn with_duration(mut self, duration: Duration) -> Self;",
          "documentation": "Set the execution duration (builder pattern).\n\n# Examples\n\n```\nuse harness_tui_kit::ToolCallInfo;\nuse std::time::Duration;\n\nlet info = ToolCallInfo::new(\"bash\", \"sleep 1\")\n    .with_duration(Duration::from_secs(1));\nassert_eq!(info.duration, Some(Duration::from_secs(1)));\n```"
        },
        {
          "name": "::Severity",
          "line": 670,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]\n#[serde(rename_all = \"lowercase\")]\npub enum Severity {\n    /// Informational message.\n    #[default]\n    Info,\n    /// Positive outcome or confirmation.\n    Success,\n    /// Non-critical issue requiring attention.\n    Warning,\n    /// Critical failure or error condition.\n    Error,\n}",
          "documentation": "Severity level for notifications, toasts, and inline status messages.\n\nThe default severity is [`Severity::Info`].\n\n# Examples\n\n```\nuse harness_tui_kit::Severity;\n\nlet sev = Severity::Warning;\nassert_eq!(sev.label(), \"Warning\");\nassert_eq!(sev.icon(), \"!\");\n```"
        },
        {
          "name": "::Severity::label",
          "line": 692,
          "signature": "#[must_use]\npub const fn label(&self) -> &'static str;",
          "documentation": "Human-readable label for this severity.\n\n# Examples\n\n```\nuse harness_tui_kit::Severity;\nassert_eq!(Severity::Error.label(), \"Error\");\n```"
        },
        {
          "name": "::Severity::icon",
          "line": 716,
          "signature": "#[must_use]\npub const fn icon(&self) -> &'static str;",
          "documentation": "Single-character icon for compact displays.\n\n- Info: `i`\n- Success: check mark\n- Warning: `!`\n- Error: `x`\n\n# Examples\n\n```\nuse harness_tui_kit::Severity;\nassert_eq!(Severity::Info.icon(), \"i\");\nassert_eq!(Severity::Success.icon(), \"\\u{2713}\");\n```"
        },
        {
          "name": "::CommandHint",
          "line": 752,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]\npub struct CommandHint {\n/// The command name (e.g., \"help\", \"orgs form\", \"clear\").\n\npub name: String,\n/// Short description (e.g., \"Show available commands\").\n\npub description: String,\n/// Source label \u2014 \"built-in\" or a plugin name (e.g., \"orgs\").\n\npub source: String\n}",
          "documentation": "A slash command hint for InputBar autocomplete rendering.\n\nKit renders these in the autocomplete dropdown when the user types `/`.\nThe Kit has zero knowledge of what commands do \u2014 it renders hints and\nemits events. The application or SDK provides the command list.\n\n# Examples\n\n```\nuse harness_tui_kit::CommandHint;\n\nlet hint = CommandHint::new(\"help\", \"Show available commands\", \"built-in\");\nassert_eq!(hint.name, \"help\");\nassert_eq!(hint.source, \"built-in\");\n```"
        },
        {
          "name": "::CommandHint::new",
          "line": 773,
          "signature": "#[must_use]\npub fn new(\n        name: impl AsRef<str>,\n        description: impl AsRef<str>,\n        source: impl AsRef<str>,\n    ) -> Self;",
          "documentation": "Create a new command hint.\n\n# Examples\n\n```\nuse harness_tui_kit::CommandHint;\n\nlet hint = CommandHint::new(\"clear\", \"Clear the conversation\", \"built-in\");\nassert_eq!(hint.name, \"clear\");\n```"
        },
        {
          "name": "::PermissionCategory",
          "line": 801,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum PermissionCategory {\n    /// Network access (HTTP, DNS, WebSocket).\n    Network,\n    /// Filesystem read access.\n    Read,\n    /// Filesystem write access.\n    Write,\n    /// Shell command execution.\n    Shell,\n    /// Tool invocation (agent-to-agent or external).\n    Tool,\n}",
          "documentation": "Category of a permission request.\n\nDetermines the icon and color treatment in the [`PermissionPrompt`] component."
        },
        {
          "name": "::PermissionCategory::icon",
          "line": 824,
          "signature": "#[must_use]\npub const fn icon(&self) -> &'static str;",
          "documentation": "Icon character for this category.\n\n# Examples\n\n```\nuse harness_tui_kit::PermissionCategory;\nassert_eq!(PermissionCategory::Network.icon(), \"N\");\n```"
        },
        {
          "name": "::PermissionCategory::label",
          "line": 843,
          "signature": "#[must_use]\npub const fn label(&self) -> &'static str;",
          "documentation": "Human-readable label for this category.\n\n# Examples\n\n```\nuse harness_tui_kit::PermissionCategory;\nassert_eq!(PermissionCategory::Shell.label(), \"shell\");\n```"
        },
        {
          "name": "::PermissionRequest",
          "line": 878,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\npub struct PermissionRequest {\n/// Category of access being requested.\n\npub category: PermissionCategory,\n/// Name of the requesting entity (plugin or agent).\n\npub requester: String,\n/// Specific resource (URL, file path, shell command).\n\npub resource: String,\n/// One-line context explaining why the access is needed.\n\npub context: String,\n/// Suggested glob pattern for \"always allow\" (e.g., `api.orgs.sh/*`).\n\npub suggested_pattern: String\n}",
          "documentation": "A permission request for rendering in the PermissionPrompt component.\n\nKit renders these; it has no knowledge of WASM sandboxing or plugins.\nThe application provides the data; Kit displays it.\n\n# Examples\n\n```\nuse harness_tui_kit::{PermissionRequest, PermissionCategory};\n\nlet req = PermissionRequest::new(\n    PermissionCategory::Network,\n    \"orgs-plugin\",\n    \"https://api.orgs.sh/v1/formations\",\n);\nassert_eq!(req.category, PermissionCategory::Network);\n```"
        },
        {
          "name": "::PermissionRequest::new",
          "line": 896,
          "signature": "#[must_use]\npub fn new(\n        category: PermissionCategory,\n        requester: impl AsRef<str>,\n        resource: impl AsRef<str>,\n    ) -> Self;",
          "documentation": "Create a new permission request with minimal fields.\n\nContext and suggested pattern default to empty strings."
        },
        {
          "name": "::PermissionRequest::with_context",
          "line": 912,
          "signature": "#[must_use]\npub fn with_context(mut self, context: impl AsRef<str>) -> Self;",
          "documentation": "Set the context string (builder pattern)."
        },
        {
          "name": "::PermissionRequest::with_suggested_pattern",
          "line": 919,
          "signature": "#[must_use]\npub fn with_suggested_pattern(mut self, pattern: impl AsRef<str>) -> Self;",
          "documentation": "Set the suggested glob pattern (builder pattern)."
        },
        {
          "name": "::PermissionDecision",
          "line": 943,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum PermissionDecision {\n    /// Allow this specific request once.\n    AllowOnce,\n    /// Always allow requests matching the given glob pattern.\n    AlwaysAllow {\n        /// The glob pattern to persist (e.g., `api.orgs.sh/*`).\n        pattern: String,\n    },\n    /// Deny this request.\n    Deny,\n}",
          "documentation": "The user's decision on a permission prompt.\n\nEmitted by the PermissionPrompt component when the user presses a key."
        },
        {
          "name": "::DiffLineKind",
          "line": 981,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum DiffLineKind {\n    /// Unchanged context line.\n    Context,\n    /// Added line (green).\n    Added,\n    /// Removed line (red).\n    Removed,\n    /// Section header (@@).\n    Header,\n}",
          "documentation": "A single line in a diff view.\n\n# Examples\n\n```\nuse harness_tui_kit::DiffLineKind;\n\nlet kind = DiffLineKind::Added;\nassert_eq!(kind.prefix(), \"+\");\n```"
        },
        {
          "name": "::DiffLineKind::prefix",
          "line": 995,
          "signature": "#[must_use]\npub const fn prefix(&self) -> &'static str;",
          "documentation": "Prefix character for this line kind."
        },
        {
          "name": "::DiffLine",
          "line": 1007,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\npub struct DiffLine {\n/// What kind of diff line this is.\n\npub kind: DiffLineKind,\n/// The line content (without the +/- prefix).\n\npub content: String,\n/// Original line number (for removed/context lines), if known.\n\npub old_line_no: Option<usize>,\n/// New line number (for added/context lines), if known.\n\npub new_line_no: Option<usize>\n}",
          "documentation": "A line in a diff with its kind and content."
        },
        {
          "name": "::CostEntry",
          "line": 1036,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]\npub struct CostEntry {\n/// Agent that incurred the cost.\n\npub agent_id: String,\n/// Model used (e.g., \"claude-opus-4-6\", \"gpt-4o\").\n\npub model: String,\n/// Cost in the smallest currency unit (cents for USD).\n\npub amount_cents: u64,\n/// ISO 4217 currency code (e.g., \"USD\", \"EUR\").\n\npub currency: String\n}",
          "documentation": "A single cost data point for an agent or model.\n\nUsed by the CostTracker component to display running costs per agent/model.\n\n# Examples\n\n```\nuse harness_tui_kit::CostEntry;\n\nlet entry = CostEntry::new(\"agent-1\", \"claude-opus-4-6\", 1250, \"USD\");\nassert_eq!(entry.amount_cents, 1250);\nassert_eq!(entry.display_amount(), \"$12.50\");\n```"
        },
        {
          "name": "::CostEntry::new",
          "line": 1050,
          "signature": "#[must_use]\npub fn new(\n        agent_id: impl AsRef<str>,\n        model: impl AsRef<str>,\n        amount_cents: u64,\n        currency: impl AsRef<str>,\n    ) -> Self;",
          "documentation": "Create a new cost entry."
        },
        {
          "name": "::CostEntry::display_amount",
          "line": 1066,
          "signature": "#[must_use]\npub fn display_amount(&self) -> String;",
          "documentation": "Format the amount as a display string (e.g., \"$12.50\")."
        },
        {
          "name": "::LatencySnapshot",
          "line": 1108,
          "signature": "#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]\npub struct LatencySnapshot {\n/// Current latency in milliseconds.\n\npub current_ms: u64,\n/// 50th percentile (median) latency in milliseconds.\n\npub p50: u64,\n/// 95th percentile latency in milliseconds.\n\npub p95: u64,\n/// 99th percentile latency in milliseconds.\n\npub p99: u64,\n/// Recent latency samples for sparkline rendering.\n\npub samples: Vec<u64>\n}",
          "documentation": "A snapshot of latency metrics with percentile data.\n\n# Examples\n\n```\nuse harness_tui_kit::LatencySnapshot;\n\nlet snap = LatencySnapshot::new(120, 80, 150, 300)\n    .with_samples(vec![100, 110, 120, 130, 140]);\nassert_eq!(snap.current_ms, 120);\nassert_eq!(snap.samples.len(), 5);\n```"
        },
        {
          "name": "::LatencySnapshot::new",
          "line": 1124,
          "signature": "#[must_use]\npub fn new(current_ms: u64, p50: u64, p95: u64, p99: u64) -> Self;",
          "documentation": "Create a new latency snapshot with percentile values."
        },
        {
          "name": "::LatencySnapshot::with_samples",
          "line": 1136,
          "signature": "#[must_use]\npub fn with_samples(mut self, samples: Vec<u64>) -> Self;",
          "documentation": "Set the recent samples (builder pattern)."
        },
        {
          "name": "::RiskLevel",
          "line": 1171,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum RiskLevel {\n    /// Low risk, routine action.\n    #[default]\n    Low,\n    /// Medium risk, warrants attention.\n    Medium,\n    /// High risk, requires careful review.\n    High,\n    /// Critical risk, potentially destructive or irreversible.\n    Critical,\n}",
          "documentation": "Risk level for an approval request.\n\nDetermines visual severity treatment in approval components.\n\n# Examples\n\n```\nuse harness_tui_kit::RiskLevel;\n\nlet risk = RiskLevel::High;\nassert_eq!(risk.label(), \"High\");\nassert!(risk.requires_review());\n```"
        },
        {
          "name": "::RiskLevel::label",
          "line": 1186,
          "signature": "#[must_use]\npub const fn label(&self) -> &'static str;",
          "documentation": "Human-readable label for this risk level."
        },
        {
          "name": "::RiskLevel::requires_review",
          "line": 1197,
          "signature": "#[must_use]\npub const fn requires_review(&self) -> bool;",
          "documentation": "Returns `true` if this risk level requires explicit review."
        },
        {
          "name": "::RiskLevel::weight",
          "line": 1203,
          "signature": "#[must_use]\npub const fn weight(&self) -> u8;",
          "documentation": "Numeric severity weight for sorting (higher = more severe)."
        },
        {
          "name": "::ApprovalRequest",
          "line": 1236,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\npub struct ApprovalRequest {\n/// Unique identifier for this request.\n\npub id: String,\n/// Name of the agent requesting approval.\n\npub agent_name: String,\n/// Short summary of the proposed action.\n\npub action_summary: String,\n/// Detailed reasoning for the action.\n\npub reasoning: String,\n/// Resources affected by the action.\n\npub resources: Vec<String>,\n/// Assessed risk level.\n\npub risk_level: RiskLevel,\n/// ISO-8601 timestamp of when the request was created.\n\npub created_at: String\n}",
          "documentation": "A request awaiting human approval.\n\n# Examples\n\n```\nuse harness_tui_kit::{ApprovalRequest, RiskLevel};\n\nlet req = ApprovalRequest::new(\"req-1\", \"CodeAgent\", \"Delete production database\")\n    .with_risk_level(RiskLevel::Critical)\n    .with_reasoning(\"Cleanup of deprecated schema\");\nassert!(req.risk_level.requires_review());\n```"
        },
        {
          "name": "::ApprovalRequest::new",
          "line": 1256,
          "signature": "#[must_use]\npub fn new(\n        id: impl AsRef<str>,\n        agent_name: impl AsRef<str>,\n        action_summary: impl AsRef<str>,\n    ) -> Self;",
          "documentation": "Create a new approval request with required fields."
        },
        {
          "name": "::ApprovalRequest::with_risk_level",
          "line": 1274,
          "signature": "#[must_use]\npub fn with_risk_level(mut self, risk_level: RiskLevel) -> Self;",
          "documentation": "Set the risk level (builder pattern)."
        },
        {
          "name": "::ApprovalRequest::with_reasoning",
          "line": 1281,
          "signature": "#[must_use]\npub fn with_reasoning(mut self, reasoning: impl AsRef<str>) -> Self;",
          "documentation": "Set the reasoning (builder pattern)."
        },
        {
          "name": "::ApprovalRequest::with_resources",
          "line": 1288,
          "signature": "#[must_use]\npub fn with_resources(mut self, resources: Vec<String>) -> Self;",
          "documentation": "Set the affected resources (builder pattern)."
        },
        {
          "name": "::ApprovalRequest::with_created_at",
          "line": 1295,
          "signature": "#[must_use]\npub fn with_created_at(mut self, created_at: impl AsRef<str>) -> Self;",
          "documentation": "Set the creation timestamp (builder pattern)."
        },
        {
          "name": "::ApprovalAction",
          "line": 1318,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum ApprovalAction {\n    /// Approve the request as-is.\n    Approve,\n    /// Deny the request.\n    Deny,\n    /// Approve with modifications.\n    Edit {\n        /// Description of the modification.\n        modification: String,\n    },\n}",
          "documentation": "The user's action on an approval request."
        },
        {
          "name": "::TaskStatus",
          "line": 1357,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum TaskStatus {\n    /// Task has not started.\n    #[default]\n    Pending,\n    /// Task is currently executing.\n    Active,\n    /// Task completed successfully.\n    Complete,\n    /// Task failed with an error.\n    Error,\n    /// Task was skipped.\n    Skipped,\n}",
          "documentation": "Status of a task in a workflow.\n\n# Examples\n\n```\nuse harness_tui_kit::TaskStatus;\n\nlet status = TaskStatus::Active;\nassert_eq!(status.icon(), \"\\u{25ce}\");\nassert!(!status.is_terminal());\n```"
        },
        {
          "name": "::TaskStatus::label",
          "line": 1374,
          "signature": "#[must_use]\npub const fn label(&self) -> &'static str;",
          "documentation": "Human-readable label for this status."
        },
        {
          "name": "::TaskStatus::icon",
          "line": 1386,
          "signature": "#[must_use]\npub const fn icon(&self) -> &'static str;",
          "documentation": "Status icon character."
        },
        {
          "name": "::TaskStatus::is_terminal",
          "line": 1398,
          "signature": "#[must_use]\npub const fn is_terminal(&self) -> bool;",
          "documentation": "Returns `true` if this is a terminal state."
        },
        {
          "name": "::TaskItem",
          "line": 1426,
          "signature": "#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]\npub struct TaskItem {\n/// Unique task identifier.\n\npub id: String,\n/// Display label for the task.\n\npub label: String,\n/// Current task status.\n\npub status: TaskStatus,\n/// Sub-tasks (for hierarchical display).\n\npub children: Vec<TaskItem>,\n/// Progress fraction (0.0 to 1.0), where applicable.\n\npub progress: f32\n}",
          "documentation": "A single task item in a task list or workflow.\n\n# Examples\n\n```\nuse harness_tui_kit::{TaskItem, TaskStatus};\n\nlet task = TaskItem::new(\"t-1\", \"Run tests\")\n    .with_status(TaskStatus::Active)\n    .with_progress(0.5);\nassert_eq!(task.progress, 0.5);\n```"
        },
        {
          "name": "::TaskItem::new",
          "line": 1442,
          "signature": "#[must_use]\npub fn new(id: impl AsRef<str>, label: impl AsRef<str>) -> Self;",
          "documentation": "Create a new task item."
        },
        {
          "name": "::TaskItem::with_status",
          "line": 1454,
          "signature": "#[must_use]\npub fn with_status(mut self, status: TaskStatus) -> Self;",
          "documentation": "Set the task status (builder pattern)."
        },
        {
          "name": "::TaskItem::with_progress",
          "line": 1461,
          "signature": "#[must_use]\npub fn with_progress(mut self, progress: f32) -> Self;",
          "documentation": "Set the progress fraction (builder pattern). Clamped to [0.0, 1.0]."
        },
        {
          "name": "::TaskItem::with_children",
          "line": 1468,
          "signature": "#[must_use]\npub fn with_children(mut self, children: Vec<TaskItem>) -> Self;",
          "documentation": "Set the children (builder pattern)."
        },
        {
          "name": "::WorkflowNodeKind",
          "line": 1496,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum WorkflowNodeKind {\n    /// An agent node.\n    #[default]\n    Agent,\n    /// A tool invocation node.\n    Tool,\n    /// A conditional branch node.\n    Condition,\n    /// A parallel execution node.\n    Parallel,\n    /// A human-in-the-loop gate.\n    HitlGate,\n}",
          "documentation": "Kind of node in a workflow DAG.\n\n# Examples\n\n```\nuse harness_tui_kit::WorkflowNodeKind;\n\nlet kind = WorkflowNodeKind::Agent;\nassert_eq!(kind.icon(), \"A\");\n```"
        },
        {
          "name": "::WorkflowNodeKind::label",
          "line": 1513,
          "signature": "#[must_use]\npub const fn label(&self) -> &'static str;",
          "documentation": "Human-readable label."
        },
        {
          "name": "::WorkflowNodeKind::icon",
          "line": 1525,
          "signature": "#[must_use]\npub const fn icon(&self) -> &'static str;",
          "documentation": "Icon character for this node kind."
        },
        {
          "name": "::WorkflowNodeInfo",
          "line": 1544,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\npub struct WorkflowNodeInfo {\n/// Unique node identifier.\n\npub id: String,\n/// Display label for the node.\n\npub label: String,\n/// Node kind (determines icon and styling).\n\npub kind: WorkflowNodeKind,\n/// Current execution status.\n\npub status: TaskStatus\n}",
          "documentation": "Information about a single node in a workflow DAG."
        },
        {
          "name": "::WorkflowNodeInfo::new",
          "line": 1558,
          "signature": "#[must_use]\npub fn new(id: impl AsRef<str>, label: impl AsRef<str>, kind: WorkflowNodeKind) -> Self;",
          "documentation": "Create a new workflow node."
        },
        {
          "name": "::WorkflowNodeInfo::with_status",
          "line": 1569,
          "signature": "#[must_use]\npub fn with_status(mut self, status: TaskStatus) -> Self;",
          "documentation": "Set the node status (builder pattern)."
        },
        {
          "name": "::WorkflowEdge",
          "line": 1583,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]\npub struct WorkflowEdge {\n/// Source node ID.\n\npub source_id: String,\n/// Target node ID.\n\npub target_id: String,\n/// Whether this edge is currently active (data flowing).\n\npub active: bool\n}",
          "documentation": "A directed edge between two nodes in a workflow DAG."
        },
        {
          "name": "::WorkflowEdge::new",
          "line": 1595,
          "signature": "#[must_use]\npub fn new(source_id: impl AsRef<str>, target_id: impl AsRef<str>) -> Self;",
          "documentation": "Create a new edge between two nodes."
        },
        {
          "name": "::WorkflowEdge::with_active",
          "line": 1605,
          "signature": "#[must_use]\npub fn with_active(mut self, active: bool) -> Self;",
          "documentation": "Set the active state (builder pattern)."
        },
        {
          "name": "::LogLevel",
          "line": 1634,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum LogLevel {\n    /// Trace-level diagnostic output.\n    Trace,\n    /// Debug-level diagnostic output.\n    Debug,\n    /// Informational messages.\n    #[default]\n    Info,\n    /// Warning conditions.\n    Warn,\n    /// Error conditions.\n    Error,\n}",
          "documentation": "Log level for structured log entries.\n\n# Examples\n\n```\nuse harness_tui_kit::LogLevel;\n\nlet level = LogLevel::Warn;\nassert_eq!(level.label(), \"WARN\");\n```"
        },
        {
          "name": "::LogLevel::label",
          "line": 1651,
          "signature": "#[must_use]\npub const fn label(&self) -> &'static str;",
          "documentation": "Upper-case label for this log level."
        },
        {
          "name": "::LogLevel::severity",
          "line": 1663,
          "signature": "#[must_use]\npub const fn severity(&self) -> u8;",
          "documentation": "Numeric severity (higher = more severe) for filtering."
        },
        {
          "name": "::LogEntry",
          "line": 1682,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\npub struct LogEntry {\n/// ISO-8601 timestamp.\n\npub timestamp: String,\n/// Log level.\n\npub level: LogLevel,\n/// Source component or module.\n\npub source: String,\n/// Log message text.\n\npub message: String\n}",
          "documentation": "A single log entry for display in the LogViewer."
        },
        {
          "name": "::LogEntry::new",
          "line": 1696,
          "signature": "#[must_use]\npub fn new(level: LogLevel, source: impl AsRef<str>, message: impl AsRef<str>) -> Self;",
          "documentation": "Create a new log entry."
        },
        {
          "name": "::LogEntry::with_timestamp",
          "line": 1707,
          "signature": "#[must_use]\npub fn with_timestamp(mut self, timestamp: impl AsRef<str>) -> Self;",
          "documentation": "Set the timestamp (builder pattern)."
        },
        {
          "name": "::PaletteItem",
          "line": 1738,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]\npub struct PaletteItem {\n/// Display label.\n\npub label: String,\n/// Short description.\n\npub description: String,\n/// Category for grouping.\n\npub category: String,\n/// Keyboard shortcut hint (e.g., \"Ctrl+O\").\n\npub shortcut: String\n}",
          "documentation": "An item in the command palette.\n\n# Examples\n\n```\nuse harness_tui_kit::PaletteItem;\n\nlet item = PaletteItem::new(\"Open File\", \"Open a file in the editor\", \"File\");\nassert_eq!(item.label, \"Open File\");\n```"
        },
        {
          "name": "::PaletteItem::new",
          "line": 1752,
          "signature": "#[must_use]\npub fn new(\n        label: impl AsRef<str>,\n        description: impl AsRef<str>,\n        category: impl AsRef<str>,\n    ) -> Self;",
          "documentation": "Create a new palette item."
        },
        {
          "name": "::PaletteItem::with_shortcut",
          "line": 1767,
          "signature": "#[must_use]\npub fn with_shortcut(mut self, shortcut: impl AsRef<str>) -> Self;",
          "documentation": "Set the shortcut hint (builder pattern)."
        },
        {
          "name": "::KeyShortcut",
          "line": 1789,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]\npub struct KeyShortcut {\n/// Key combination (e.g., \"Ctrl+C\", \"q\", \"Shift+Tab\").\n\npub keys: String,\n/// Description of what the shortcut does.\n\npub description: String,\n/// Category for grouping (e.g., \"Navigation\", \"Editing\").\n\npub category: String\n}",
          "documentation": "A keyboard shortcut for the help overlay."
        },
        {
          "name": "::KeyShortcut::new",
          "line": 1801,
          "signature": "#[must_use]\npub fn new(\n        keys: impl AsRef<str>,\n        description: impl AsRef<str>,\n        category: impl AsRef<str>,\n    ) -> Self;",
          "documentation": "Create a new key shortcut."
        },
        {
          "name": "::ProposalKind",
          "line": 1837,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum ProposalKind {\n    /// General governance proposal.\n    #[default]\n    General,\n    /// Treasury spending or allocation.\n    Treasury,\n    /// Membership change (add/remove).\n    Membership,\n    /// Policy or constitution amendment.\n    Policy,\n    /// Technical or infrastructure change.\n    Technical,\n}",
          "documentation": "Kind of governance proposal.\n\n# Examples\n\n```\nuse harness_tui_kit::ProposalKind;\n\nlet kind = ProposalKind::Treasury;\nassert_eq!(kind.label(), \"Treasury\");\n```"
        },
        {
          "name": "::ProposalKind::label",
          "line": 1854,
          "signature": "#[must_use]\npub const fn label(&self) -> &'static str;",
          "documentation": "Human-readable label."
        },
        {
          "name": "::ProposalStatus",
          "line": 1874,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum ProposalStatus {\n    /// Proposal is open for voting.\n    #[default]\n    Active,\n    /// Proposal was approved.\n    Passed,\n    /// Proposal was rejected.\n    Rejected,\n    /// Proposal was withdrawn by the creator.\n    Withdrawn,\n    /// Proposal expired without reaching quorum.\n    Expired,\n}",
          "documentation": "Status of a governance proposal."
        },
        {
          "name": "::ProposalStatus::label",
          "line": 1891,
          "signature": "#[must_use]\npub const fn label(&self) -> &'static str;",
          "documentation": "Human-readable label."
        },
        {
          "name": "::ProposalStatus::is_open",
          "line": 1903,
          "signature": "#[must_use]\npub const fn is_open(&self) -> bool;",
          "documentation": "Returns `true` if voting is still possible."
        },
        {
          "name": "::ProposalInfo",
          "line": 1916,
          "signature": "#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]\npub struct ProposalInfo {\n/// Unique proposal identifier.\n\npub id: String,\n/// Proposal title.\n\npub title: String,\n/// Proposal kind.\n\npub kind: ProposalKind,\n/// Current status.\n\npub status: ProposalStatus,\n/// Creator name.\n\npub creator: String,\n/// Votes in favor.\n\npub votes_yes: u32,\n/// Votes against.\n\npub votes_no: u32,\n/// Abstentions.\n\npub votes_abstain: u32,\n/// Required quorum (total votes needed).\n\npub quorum: u32,\n/// ISO-8601 deadline timestamp.\n\npub deadline: String\n}",
          "documentation": "Information about a governance proposal."
        },
        {
          "name": "::ProposalInfo::new",
          "line": 1942,
          "signature": "#[must_use]\npub fn new(id: impl AsRef<str>, title: impl AsRef<str>, kind: ProposalKind) -> Self;",
          "documentation": "Create a new proposal info."
        },
        {
          "name": "::ProposalInfo::with_creator",
          "line": 1959,
          "signature": "#[must_use]\npub fn with_creator(mut self, creator: impl AsRef<str>) -> Self;",
          "documentation": "Set the creator (builder pattern)."
        },
        {
          "name": "::ProposalInfo::with_status",
          "line": 1966,
          "signature": "#[must_use]\npub fn with_status(mut self, status: ProposalStatus) -> Self;",
          "documentation": "Set the status (builder pattern)."
        },
        {
          "name": "::ProposalInfo::with_votes",
          "line": 1973,
          "signature": "#[must_use]\npub fn with_votes(mut self, yes: u32, no: u32, abstain: u32) -> Self;",
          "documentation": "Set the vote tallies (builder pattern)."
        },
        {
          "name": "::ProposalInfo::with_quorum",
          "line": 1982,
          "signature": "#[must_use]\npub fn with_quorum(mut self, quorum: u32) -> Self;",
          "documentation": "Set the quorum (builder pattern)."
        },
        {
          "name": "::ProposalInfo::with_deadline",
          "line": 1989,
          "signature": "#[must_use]\npub fn with_deadline(mut self, deadline: impl AsRef<str>) -> Self;",
          "documentation": "Set the deadline (builder pattern)."
        },
        {
          "name": "::ProposalInfo::total_votes",
          "line": 1996,
          "signature": "#[must_use]\npub fn total_votes(&self) -> u32;",
          "documentation": "Total votes cast."
        },
        {
          "name": "::ProposalInfo::has_quorum",
          "line": 2004,
          "signature": "#[must_use]\npub fn has_quorum(&self) -> bool;",
          "documentation": "Whether quorum has been reached."
        },
        {
          "name": "::VoteChoice",
          "line": 2022,
          "signature": "#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum VoteChoice {\n    /// Vote in favor.\n    Yes,\n    /// Vote against.\n    No,\n    /// Abstain from voting.\n    Abstain,\n}",
          "documentation": "A vote choice on a governance proposal."
        },
        {
          "name": "::VoteChoice::label",
          "line": 2034,
          "signature": "#[must_use]\npub const fn label(&self) -> &'static str;",
          "documentation": "Human-readable label."
        },
        {
          "name": "::TreasuryInfo",
          "line": 2051,
          "signature": "#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]\npub struct TreasuryInfo {\n/// Current balance in the smallest currency unit.\n\npub balance_cents: u64,\n/// Currency code (e.g., \"USD\", \"USDC\").\n\npub currency: String,\n/// Chain or network label (e.g., \"Ethereum\", \"Solana\").\n\npub chain: String,\n/// Daily spending limit in the smallest unit.\n\npub daily_limit_cents: u64,\n/// Amount spent today in the smallest unit.\n\npub daily_spent_cents: u64,\n/// Recent transactions.\n\npub recent_transactions: Vec<TransactionEntry>\n}",
          "documentation": "Treasury balance and metadata."
        },
        {
          "name": "::TreasuryInfo::new",
          "line": 2069,
          "signature": "#[must_use]\npub fn new(balance_cents: u64, currency: impl AsRef<str>, chain: impl AsRef<str>) -> Self;",
          "documentation": "Create a new treasury info."
        },
        {
          "name": "::TreasuryInfo::with_daily_limit",
          "line": 2082,
          "signature": "#[must_use]\npub fn with_daily_limit(mut self, limit_cents: u64) -> Self;",
          "documentation": "Set the daily limit (builder pattern)."
        },
        {
          "name": "::TreasuryInfo::with_daily_spent",
          "line": 2089,
          "signature": "#[must_use]\npub fn with_daily_spent(mut self, spent_cents: u64) -> Self;",
          "documentation": "Set the daily spent amount (builder pattern)."
        },
        {
          "name": "::TreasuryInfo::with_transactions",
          "line": 2096,
          "signature": "#[must_use]\npub fn with_transactions(mut self, txns: Vec<TransactionEntry>) -> Self;",
          "documentation": "Set recent transactions (builder pattern)."
        },
        {
          "name": "::TreasuryInfo::display_balance",
          "line": 2103,
          "signature": "#[must_use]\npub fn display_balance(&self) -> String;",
          "documentation": "Format the balance as a display string."
        },
        {
          "name": "::TransactionEntry",
          "line": 2118,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\npub struct TransactionEntry {\n/// Amount in the smallest currency unit.\n\npub amount_cents: u64,\n/// Direction: true = inflow, false = outflow.\n\npub is_inflow: bool,\n/// Description or recipient.\n\npub description: String,\n/// ISO-8601 timestamp.\n\npub timestamp: String\n}",
          "documentation": "A treasury transaction entry."
        },
        {
          "name": "::TransactionEntry::new",
          "line": 2132,
          "signature": "#[must_use]\npub fn new(amount_cents: u64, is_inflow: bool, description: impl AsRef<str>) -> Self;",
          "documentation": "Create a new transaction entry."
        },
        {
          "name": "::TransactionEntry::with_timestamp",
          "line": 2143,
          "signature": "#[must_use]\npub fn with_timestamp(mut self, timestamp: impl AsRef<str>) -> Self;",
          "documentation": "Set the timestamp (builder pattern)."
        },
        {
          "name": "::DecisionOption",
          "line": 2170,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]\npub struct DecisionOption {\n/// Display label for this option.\n\npub label: String,\n/// Description of what this option does.\n\npub description: String,\n/// Whether this is the recommended choice.\n\npub recommended: bool\n}",
          "documentation": "A decision option for the DecisionPanel component.\n\n# Examples\n\n```\nuse harness_tui_kit::DecisionOption;\n\nlet opt = DecisionOption::new(\"Deploy to staging\", \"Push changes to staging environment\")\n    .with_recommended(true);\nassert!(opt.recommended);\n```"
        },
        {
          "name": "::DecisionOption::new",
          "line": 2182,
          "signature": "#[must_use]\npub fn new(label: impl AsRef<str>, description: impl AsRef<str>) -> Self;",
          "documentation": "Create a new decision option."
        },
        {
          "name": "::DecisionOption::with_recommended",
          "line": 2192,
          "signature": "#[must_use]\npub fn with_recommended(mut self, recommended: bool) -> Self;",
          "documentation": "Set the recommended flag (builder pattern)."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/util/color.rs",
      "sha256": "75861c3cdab0134287428440d00efa8e41eb884951856ad068485543c8be17b3",
      "artifactSha256": "9e99269406217b234d3a1f730258afeafbbcd2cb4696928402f082f1e93325d6",
      "url": "/reference/source/harness-tui-kit/src/util/color.rs.txt",
      "declarations": [
        {
          "name": "::rgb_to_ansi256",
          "line": 37,
          "signature": "#[must_use]\npub fn rgb_to_ansi256(r: u8, g: u8, b: u8) -> Color;",
          "documentation": "Map an RGB color value to the nearest ANSI 256-color palette entry.\n\nUses the 6x6x6 color cube (indices 16--231) and the grayscale ramp\n(indices 232--255), selecting whichever is closest in Euclidean RGB\ndistance.\n\n# Examples\n\n```\nuse harness_tui_kit::util::color::rgb_to_ansi256;\nuse ratatui::style::Color;\n\nlet c = rgb_to_ansi256(0, 0, 0);\nassert!(matches!(c, Color::Indexed(_)));\n```"
        },
        {
          "name": "::lerp_color",
          "line": 81,
          "signature": "#[must_use]\npub fn lerp_color(from: Color, to: Color, t: f32) -> Color;",
          "documentation": "Linearly interpolate between two colors.\n\n`t` is clamped to the range `[0.0, 1.0]`. At `t = 0.0` the result equals\n`from`; at `t = 1.0` the result equals `to`.\n\nBoth colors must be [`Color::Rgb`]; other variants are treated as black.\n\n# Examples\n\n```\nuse ratatui::style::Color;\nuse harness_tui_kit::util::color::lerp_color;\n\nlet mid = lerp_color(Color::Rgb(0, 0, 0), Color::Rgb(200, 100, 50), 0.5);\nassert!(matches!(mid, Color::Rgb(100, 50, 25)));\n```"
        },
        {
          "name": "::luminance",
          "line": 106,
          "signature": "#[must_use]\npub fn luminance(color: Color) -> f32;",
          "documentation": "Compute the relative luminance of a color using the sRGB formula.\n\nReturns a value between `0.0` (black) and `1.0` (white).\nNon-RGB color variants are treated as black (`0.0`).\n\nUses the ITU-R BT.709 coefficients: `0.2126 R + 0.7152 G + 0.0722 B`,\napplied to linearized sRGB channels.\n\n# Examples\n\n```\nuse ratatui::style::Color;\nuse harness_tui_kit::util::color::luminance;\n\nassert!((luminance(Color::Rgb(255, 255, 255)) - 1.0).abs() < 0.01);\nassert!((luminance(Color::Rgb(0, 0, 0))).abs() < 0.01);\n```"
        },
        {
          "name": "::has_sufficient_contrast",
          "line": 130,
          "signature": "#[must_use]\npub fn has_sufficient_contrast(fg: Color, bg: Color, min_ratio: f32) -> bool;",
          "documentation": "Check whether two colors have sufficient contrast for readability.\n\nComputes the WCAG 2.0 contrast ratio and returns `true` if it meets or\nexceeds `min_ratio`. A `min_ratio` of `4.5` satisfies WCAG AA for normal\ntext; `7.0` satisfies WCAG AAA.\n\n# Examples\n\n```\nuse ratatui::style::Color;\nuse harness_tui_kit::util::color::has_sufficient_contrast;\n\nassert!(has_sufficient_contrast(Color::Rgb(255, 255, 255), Color::Rgb(0, 0, 0), 4.5));\nassert!(!has_sufficient_contrast(Color::Rgb(128, 128, 128), Color::Rgb(130, 130, 130), 4.5));\n```"
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/util/layout.rs",
      "sha256": "6b750b6125a2c19790bdda787666e9230b821c782bc7789b3734031759891789",
      "artifactSha256": "7e17b3b65a0172bd297c0bee4162c3c6ea78eb23603643e7d343506cce180aa0",
      "url": "/reference/source/harness-tui-kit/src/util/layout.rs.txt",
      "declarations": [
        {
          "name": "::centered_rect",
          "line": 37,
          "signature": "#[must_use]\npub fn centered_rect(width: u16, height: u16, outer: Rect) -> Rect;",
          "documentation": "Return a rectangle of the given size centered within `outer`.\n\nIf the requested `width` or `height` exceeds the corresponding dimension\nof `outer`, the result is clamped to fit entirely within `outer`.\n\n# Examples\n\n```\nuse ratatui::layout::Rect;\nuse harness_tui_kit::util::layout::centered_rect;\n\nlet outer = Rect::new(0, 0, 80, 24);\nlet r = centered_rect(40, 10, outer);\nassert_eq!(r, Rect::new(20, 7, 40, 10));\n```"
        },
        {
          "name": "::percentage_rect",
          "line": 62,
          "signature": "#[must_use]\npub fn percentage_rect(width_pct: u16, height_pct: u16, outer: Rect) -> Rect;",
          "documentation": "Return a rectangle sized as a percentage of `outer`, centered within it.\n\n`width_pct` and `height_pct` are clamped to the range `0..=100`.\nA percentage of `0` produces a zero-sized dimension; `100` produces\na rectangle equal to `outer`.\n\n# Examples\n\n```\nuse ratatui::layout::Rect;\nuse harness_tui_kit::util::layout::percentage_rect;\n\nlet outer = Rect::new(0, 0, 100, 50);\nlet r = percentage_rect(50, 50, outer);\nassert_eq!(r, Rect::new(25, 12, 50, 25));\n```"
        },
        {
          "name": "::pad_rect",
          "line": 87,
          "signature": "#[must_use]\npub fn pad_rect(rect: Rect, horizontal: u16, vertical: u16) -> Rect;",
          "documentation": "Shrink a rectangle by the given horizontal and vertical padding.\n\n`horizontal` is removed from each side (left and right), and `vertical`\nfrom the top and bottom. If the padding is too large for the rectangle,\nthe result collapses to a zero-area rectangle at the center.\n\n# Examples\n\n```\nuse ratatui::layout::Rect;\nuse harness_tui_kit::util::layout::pad_rect;\n\nlet r = Rect::new(10, 10, 40, 20);\nlet padded = pad_rect(r, 5, 3);\nassert_eq!(padded, Rect::new(15, 13, 30, 14));\n```"
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/util/live_wrap.rs",
      "sha256": "82c0b78378060ce6aacc64b104f197c5671690d829a163fa850c01b41c7a81f4",
      "artifactSha256": "d34716283b08674d230568477162c7b802ebef0feb2a99422c5d51c36f28b3d7",
      "url": "/reference/source/harness-tui-kit/src/util/live_wrap.rs.txt",
      "declarations": [
        {
          "name": "::wrap_unicode",
          "line": 34,
          "signature": "#[must_use]\npub fn wrap_unicode(text: &str, width: usize, hanging_indent: &str) -> Vec<String>;",
          "documentation": "Wrap `text` to `width` cells, supporting unicode width and an\noptional hanging indent applied to continuation rows.\n\n`hanging_indent` is prepended to every line *after the first*. It\ncounts toward the wrap budget \u2014 a 4-cell indent in a 20-cell\nwidth leaves 16 cells for body text on continuation rows.\n\n`width` of 0 returns a single line containing the original text\nverbatim (the caller is responsible for not rendering an empty\narea, but we don't want to panic)."
        },
        {
          "name": "::display_width",
          "line": 112,
          "signature": "#[must_use]\npub fn display_width(s: &str) -> usize;",
          "documentation": "Total cell width of a string, treating CJK and double-width emoji\nas 2 cells and ignoring zero-width modifiers."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/util/mod.rs",
      "sha256": "bcb0e96b7fbc933d52315f5953a708946416f1a6dd0e85958fe0a7fbea11a669",
      "artifactSha256": "2dfdc73ea41ede8c5d478dc7defc2b16368e7f52e55f47d0729aa21b1ed00586",
      "url": "/reference/source/harness-tui-kit/src/util/mod.rs.txt",
      "declarations": [
        {
          "name": "color",
          "line": 2,
          "signature": "pub mod color;",
          "documentation": "Utility functions for color, text, layout, and input sanitization."
        },
        {
          "name": "layout",
          "line": 3,
          "signature": "pub mod layout;",
          "documentation": ""
        },
        {
          "name": "live_wrap",
          "line": 4,
          "signature": "pub mod live_wrap;",
          "documentation": ""
        },
        {
          "name": "sanitize",
          "line": 5,
          "signature": "pub mod sanitize;",
          "documentation": ""
        },
        {
          "name": "text",
          "line": 6,
          "signature": "pub mod text;",
          "documentation": ""
        },
        {
          "name": "unified_diff",
          "line": 7,
          "signature": "pub mod unified_diff;",
          "documentation": ""
        },
        {
          "name": "word_diff",
          "line": 8,
          "signature": "pub mod word_diff;",
          "documentation": ""
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/util/sanitize.rs",
      "sha256": "6d37bca626eaa8eee47687bf4187cb5c321be59ce43e96bd63d80b4b6fabe7c6",
      "artifactSha256": "4266c351c2fa05e48cf7faa1a46a82d46eaf688ca14f1ec3ebfbe116920b601d",
      "url": "/reference/source/harness-tui-kit/src/util/sanitize.rs.txt",
      "declarations": [
        {
          "name": "::sanitize",
          "line": 58,
          "signature": "#[must_use]\npub fn sanitize(input: &str) -> String;",
          "documentation": "Sanitize untrusted text for terminal rendering.\n\nStrips the following dangerous sequences:\n- ANSI CSI sequences (`\\x1b[...m`, `\\x1b[...H`, etc.)\n- OSC sequences (`\\x1b]...ST` including hyperlinks, title changes)\n- APC, DCS, PM, SOS sequences (`\\x1b_`, `\\x1bP`, `\\x1b^`, `\\x1bX`)\n- Single-character C1 controls (0x80..0x9F)\n- Null bytes (`\\0`)\n- ASCII control characters (0x00..0x1F) except tab (`\\t`), newline (`\\n`),\n  and carriage return (`\\r`)\n- BEL character (`\\x07`)\n\nPreserves all valid Unicode including emoji, CJK, and combining characters.\n\nInput exceeding [`MAX_SANITIZED_LEN`] bytes is truncated.\n\n# Examples\n\n```\nuse harness_tui_kit::util::sanitize::sanitize;\n\n// Strips ANSI color codes\nassert_eq!(sanitize(\"\\x1b[31mred\\x1b[0m\"), \"red\");\n\n// Strips terminal title injection\nassert_eq!(sanitize(\"\\x1b]0;evil title\\x07normal\"), \"normal\");\n\n// Preserves Unicode\nassert_eq!(sanitize(\"\u3053\u3093\u306b\u3061\u306f \ud83c\udf0d\"), \"\u3053\u3093\u306b\u3061\u306f \ud83c\udf0d\");\n```"
        },
        {
          "name": "::sanitize_truncated",
          "line": 147,
          "signature": "#[must_use]\npub fn sanitize_truncated(input: &str, max_len: usize) -> String;",
          "documentation": "Sanitize text and enforce a maximum display length.\n\nAfter sanitizing, if the result exceeds `max_len` characters, it is truncated\nand an ellipsis (\"...\") is appended (if space permits).\n\n# Examples\n\n```\nuse harness_tui_kit::util::sanitize::sanitize_truncated;\n\nassert_eq!(sanitize_truncated(\"hello world\", 8), \"hello...\");\nassert_eq!(sanitize_truncated(\"hi\", 10), \"hi\");\n```"
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/util/text.rs",
      "sha256": "31cf27f67199a260471dca083b93f04e6194df0167308b0b17d20d637bb9db22",
      "artifactSha256": "2fd113ea13c5f3b43a9355b9ae7cd21babf27edf76d94295e0c1519acc015d7c",
      "url": "/reference/source/harness-tui-kit/src/util/text.rs.txt",
      "declarations": [
        {
          "name": "::display_width",
          "line": 36,
          "signature": "#[must_use]\npub fn display_width(s: &str) -> usize;",
          "documentation": "Return the display width of a string in terminal columns.\n\nAccounts for wide characters (e.g., CJK ideographs, emoji) that occupy\ntwo columns. Control characters and zero-width joiners are ignored per\nthe Unicode UAX #11 rules as implemented by the `unicode-width` crate.\n\n# Examples\n\n```\nuse harness_tui_kit::util::text::display_width;\n\nassert_eq!(display_width(\"abc\"), 3);\nassert_eq!(display_width(\"\"), 0);\n```"
        },
        {
          "name": "::truncate_with_ellipsis",
          "line": 60,
          "signature": "#[must_use]\npub fn truncate_with_ellipsis(s: &str, max_width: usize) -> String;",
          "documentation": "Truncate a string to fit within `max_width` terminal columns.\n\nIf the string fits, it is returned unchanged. Otherwise it is truncated\nand an ellipsis (`...`) is appended so the total display width does not\nexceed `max_width`.\n\nIf `max_width` is less than 4, the string is simply truncated to\n`max_width` characters with no ellipsis (there is not enough room for\nmeaningful text plus `...`).\n\n# Examples\n\n```\nuse harness_tui_kit::util::text::truncate_with_ellipsis;\n\nassert_eq!(truncate_with_ellipsis(\"Hello, world!\", 8), \"Hello...\");\nassert_eq!(truncate_with_ellipsis(\"Hi\", 10), \"Hi\");\nassert_eq!(truncate_with_ellipsis(\"abcdef\", 3), \"abc\");\n```"
        },
        {
          "name": "::wrap_text",
          "line": 92,
          "signature": "#[must_use]\npub fn wrap_text(text: &str, max_width: usize) -> Vec<String>;",
          "documentation": "Word-wrap text to fit within `max_width` terminal columns.\n\nRespects existing newlines in the input. Words that are longer than\n`max_width` are broken at the column boundary. Empty input returns\na single empty string. A `max_width` of zero returns a single empty string.\n\n# Examples\n\n```\nuse harness_tui_kit::util::text::wrap_text;\n\nassert_eq!(wrap_text(\"hello world\", 6), vec![\"hello\", \"world\"]);\nassert_eq!(wrap_text(\"a\\nb\", 80), vec![\"a\", \"b\"]);\n```"
        },
        {
          "name": "::line_count",
          "line": 179,
          "signature": "#[must_use]\npub fn line_count(text: &str, width: usize) -> usize;",
          "documentation": "Count the number of wrapped lines a text string would produce at the\ngiven column width.\n\nEquivalent to `wrap_text(text, width).len()` but semantically clearer\nat call sites that only need the count.\n\n# Examples\n\n```\nuse harness_tui_kit::util::text::line_count;\n\nassert_eq!(line_count(\"short\", 80), 1);\nassert_eq!(line_count(\"hello world\", 6), 2);\nassert_eq!(line_count(\"a\\nb\\nc\", 80), 3);\n```"
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/util/unified_diff.rs",
      "sha256": "6401a7631c850eb294a0a077373f568ed07966980aba496030058ccf3349b0cb",
      "artifactSha256": "00c9e6259d512cefdb8d0e99214cb1e84f606b49b58a31b832b879cc3038cac2",
      "url": "/reference/source/harness-tui-kit/src/util/unified_diff.rs.txt",
      "declarations": [
        {
          "name": "::DiffFile",
          "line": 18,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq)]\npub struct DiffFile {\n/// Display path. Prefers the `+++ b/<path>` side; falls back to\n\n/// the `--- a/<path>` side; falls back to \"(unknown)\".\n\npub path: String,\n/// Lines belonging to this file (`@@`, ` `, `+`, `-` rows).\n\npub lines: Vec<DiffLine>\n}",
          "documentation": "One file's worth of unified-diff content."
        },
        {
          "name": "::DiffFile::additions",
          "line": 29,
          "signature": "#[must_use]\npub fn additions(&self) -> usize;",
          "documentation": "Number of added lines in this file."
        },
        {
          "name": "::DiffFile::deletions",
          "line": 38,
          "signature": "#[must_use]\npub fn deletions(&self) -> usize;",
          "documentation": "Number of removed lines in this file."
        },
        {
          "name": "::parse_unified_diff",
          "line": 51,
          "signature": "#[must_use]\npub fn parse_unified_diff(source: &str) -> Vec<DiffFile>;",
          "documentation": "Parse a unified-diff source string into a list of files.\n\nEmpty input or input that contains no recognizable diff markers\nreturns an empty vector."
        }
      ]
    },
    {
      "path": "harness-tui-kit/src/util/word_diff.rs",
      "sha256": "ae917b53b256cab54c7a03bbc06596f6d1e48be6deb31a560be6e927122f6c95",
      "artifactSha256": "a1e2f35cb527ed7fa878eb8d8e44a982c775a8507e02fea159c00d505c4fb1cc",
      "url": "/reference/source/harness-tui-kit/src/util/word_diff.rs.txt",
      "declarations": [
        {
          "name": "::WordDiff",
          "line": 18,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq)]\npub struct WordDiff {\n/// Number of leading characters that match exactly.\n\npub prefix_chars: usize,\n/// Number of trailing characters that match exactly.\n\npub suffix_chars: usize,\n/// The changed-region character range on the old line:\n\n/// `prefix_chars..(old_len - suffix_chars)`.\n\npub old_changed_range: std::ops::Range<usize>,\n/// The changed-region character range on the new line:\n\n/// `prefix_chars..(new_len - suffix_chars)`.\n\npub new_changed_range: std::ops::Range<usize>\n}",
          "documentation": "Highlight spans for a single side of a changed pair. Byte offsets\nare character (not byte) counts to keep callers Unicode-safe."
        },
        {
          "name": "::word_diff",
          "line": 34,
          "signature": "#[must_use]\npub fn word_diff(old: &str, new: &str) -> WordDiff;",
          "documentation": "Compute character-level prefix/suffix overlap between `old` and\n`new`. Both strings are walked by Unicode scalar."
        },
        {
          "name": "::ChangedPair",
          "line": 68,
          "signature": "#[derive(Debug, Clone, PartialEq, Eq)]\npub struct ChangedPair {\n/// Index of the removed line.\n\npub removed_idx: usize,\n/// Index of the added line.\n\npub added_idx: usize,\n/// Word-level diff between the two contents.\n\npub word_diff: WordDiff\n}",
          "documentation": "One adjacent removed/added line pair detected in a unified diff.\nIndices are into the original `&[DiffLine]` slice."
        },
        {
          "name": "::pair_changed_lines",
          "line": 82,
          "signature": "#[must_use]\npub fn pair_changed_lines(lines: &[DiffLine]) -> Vec<ChangedPair>;",
          "documentation": "Walk a unified-diff slice and pair every adjacent\n`Removed` \u2192 `Added` row. Pairs that aren't immediately\nadjacent are skipped \u2014 that matches Codex's heuristic and avoids\npainting unrelated edits as \"modified\"."
        }
      ]
    }
  ]
}
