From 90965fbc848b3795105f80fc3f5fa70f4115fa45 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Fri, 12 Sep 2025 08:44:44 -0700 Subject: [PATCH 01/77] chore: add `just test`, which runs `cargo nextest` (#3508) Since I can never seem to remember to add `--no-fail-fast` when running `cargo nextest run`, let's just create an alias for it. --- codex-rs/justfile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/codex-rs/justfile b/codex-rs/justfile index e47ad1a2bd..850737efd6 100644 --- a/codex-rs/justfile +++ b/codex-rs/justfile @@ -31,6 +31,13 @@ install: rustup show active-toolchain cargo fetch +# Run `cargo nextest` since it's faster than `cargo test`, though including +# --no-fail-fast is important to ensure all tests are run. +# +# Run `cargo install cargo-nextest` if you don't have it installed. +test: + cargo nextest run --no-fail-fast + # Run the MCP server mcp-server-run *args: cargo run -p codex-mcp-server -- "$@" From f805d179304bd5934cf141f81299dbbc16218f1c Mon Sep 17 00:00:00 2001 From: Charlie Weems Date: Fri, 12 Sep 2025 09:04:49 -0700 Subject: [PATCH 02/77] MCP Documentation Changes Requests in Code Review (#3507) Add in review changes from @bolinfest that were dropped due to auto-merge (#3345). --- docs/advanced.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/advanced.md b/docs/advanced.md index 38fbd0db45..71ede3133a 100644 --- a/docs/advanced.md +++ b/docs/advanced.md @@ -54,22 +54,22 @@ Send a `tools/list` request and you will see that there are two tools available: Property | Type | Description -------------------|----------|---------------------------------------------------------------------------------------------------------- -approval-policy | string | Approval policy for shell commands generated by the model: `untrusted`, `on-failure`, `never`. -base-instructions | string | The set of instructions to use instead of the default ones. -config | object | Individual [config settings](https://github.com/openai/codex/blob/main/docs/config.md#config) that will override what is in CODEX_HOME/config.toml. -cwd | string | Working directory for the session. If relative, resolved against the server process's current directory. -include-plan-tool | boolean | Whether to include the plan tool in the conversation. -model | string | Optional override for the model name (e.g. "o3", "o4-mini"). -profile | string | Configuration profile from config.toml to specify default options. -**prompt** (required) | string | The initial user prompt to start the Codex conversation. -sandbox | string | Sandbox mode: `read-only`, `workspace-write`, or `danger-full-access`. +**`prompt`** (required) | string | The initial user prompt to start the Codex conversation. +`approval-policy` | string | Approval policy for shell commands generated by the model: `untrusted`, `on-failure`, `never`. +`base-instructions` | string | The set of instructions to use instead of the default ones. +`config` | object | Individual [config settings](https://github.com/openai/codex/blob/main/docs/config.md#config) that will override what is in `$CODEX_HOME/config.toml`. +`cwd` | string | Working directory for the session. If relative, resolved against the server process's current directory. +`include-plan-tool` | boolean | Whether to include the plan tool in the conversation. +`model` | string | Optional override for the model name (e.g. `o3`, `o4-mini`). +`profile` | string | Configuration profile from `config.toml` to specify default options. +`sandbox` | string | Sandbox mode: `read-only`, `workspace-write`, or `danger-full-access`. -**`codex-reply`** - Continue a Codex session by providing the session id and prompt. The `codex-reply` tool takes the following properties: +**`codex-reply`** - Continue a Codex session by providing the conversation id and prompt. The `codex-reply` tool takes the following properties: Property | Type | Description -----------|--------|--------------------------------------------------------------- -**prompt** (required) | string | The next user prompt to continue the Codex conversation. -**conversationId** (required) | string | The id of the conversation to continue. +**`prompt`** (required) | string | The next user prompt to continue the Codex conversation. +**`conversationId`** (required) | string | The id of the conversation to continue. ### Trying it Out > [!TIP] From ba6af23cb6ad59c150d233570a6930a97c2916ad Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Fri, 12 Sep 2025 12:05:57 -0400 Subject: [PATCH 03/77] Add spacing to timer duration formats (#3471) image --- codex-rs/common/src/elapsed.rs | 18 ++++++++++++------ codex-rs/tui/src/status_indicator_widget.rs | 20 ++++++++++---------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/codex-rs/common/src/elapsed.rs b/codex-rs/common/src/elapsed.rs index 3cc3d547ce..297832b1ec 100644 --- a/codex-rs/common/src/elapsed.rs +++ b/codex-rs/common/src/elapsed.rs @@ -2,7 +2,7 @@ use std::time::Duration; use std::time::Instant; /// Returns a string representing the elapsed time since `start_time` like -/// "1m15s" or "1.50s". +/// "1m 15s" or "1.50s". pub fn format_elapsed(start_time: Instant) -> String { format_duration(start_time.elapsed()) } @@ -12,7 +12,7 @@ pub fn format_elapsed(start_time: Instant) -> String { /// Formatting rules: /// * < 1 s -> "{milli}ms" /// * < 60 s -> "{sec:.2}s" (two decimal places) -/// * >= 60 s -> "{min}m{sec:02}s" +/// * >= 60 s -> "{min}m {sec:02}s" pub fn format_duration(duration: Duration) -> String { let millis = duration.as_millis() as i64; format_elapsed_millis(millis) @@ -26,7 +26,7 @@ fn format_elapsed_millis(millis: i64) -> String { } else { let minutes = millis / 60_000; let seconds = (millis % 60_000) / 1000; - format!("{minutes}m{seconds:02}s") + format!("{minutes}m {seconds:02}s") } } @@ -61,12 +61,18 @@ mod tests { fn test_format_duration_minutes() { // Durations ≥ 1 minute should be printed mmss. let dur = Duration::from_millis(75_000); // 1m15s - assert_eq!(format_duration(dur), "1m15s"); + assert_eq!(format_duration(dur), "1m 15s"); let dur_exact = Duration::from_millis(60_000); // 1m0s - assert_eq!(format_duration(dur_exact), "1m00s"); + assert_eq!(format_duration(dur_exact), "1m 00s"); let dur_long = Duration::from_millis(3_601_000); - assert_eq!(format_duration(dur_long), "60m01s"); + assert_eq!(format_duration(dur_long), "60m 01s"); + } + + #[test] + fn test_format_duration_one_hour_has_space() { + let dur_hour = Duration::from_millis(3_600_000); + assert_eq!(format_duration(dur_hour), "60m 00s"); } } diff --git a/codex-rs/tui/src/status_indicator_widget.rs b/codex-rs/tui/src/status_indicator_widget.rs index 5b2fe720c3..bf392b6997 100644 --- a/codex-rs/tui/src/status_indicator_widget.rs +++ b/codex-rs/tui/src/status_indicator_widget.rs @@ -32,7 +32,7 @@ pub(crate) struct StatusIndicatorWidget { } // Format elapsed seconds into a compact human-friendly form used by the status line. -// Examples: 0s, 59s, 1m00s, 59m59s, 1h00m00s, 2h03m09s +// Examples: 0s, 59s, 1m 00s, 59m 59s, 1h 00m 00s, 2h 03m 09s fn fmt_elapsed_compact(elapsed_secs: u64) -> String { if elapsed_secs < 60 { return format!("{elapsed_secs}s"); @@ -40,12 +40,12 @@ fn fmt_elapsed_compact(elapsed_secs: u64) -> String { if elapsed_secs < 3600 { let minutes = elapsed_secs / 60; let seconds = elapsed_secs % 60; - return format!("{minutes}m{seconds:02}s"); + return format!("{minutes}m {seconds:02}s"); } let hours = elapsed_secs / 3600; let minutes = (elapsed_secs % 3600) / 60; let seconds = elapsed_secs % 60; - format!("{hours}h{minutes:02}m{seconds:02}s") + format!("{hours}h {minutes:02}m {seconds:02}s") } impl StatusIndicatorWidget { @@ -209,13 +209,13 @@ mod tests { assert_eq!(fmt_elapsed_compact(0), "0s"); assert_eq!(fmt_elapsed_compact(1), "1s"); assert_eq!(fmt_elapsed_compact(59), "59s"); - assert_eq!(fmt_elapsed_compact(60), "1m00s"); - assert_eq!(fmt_elapsed_compact(61), "1m01s"); - assert_eq!(fmt_elapsed_compact(3 * 60 + 5), "3m05s"); - assert_eq!(fmt_elapsed_compact(59 * 60 + 59), "59m59s"); - assert_eq!(fmt_elapsed_compact(3600), "1h00m00s"); - assert_eq!(fmt_elapsed_compact(3600 + 60 + 1), "1h01m01s"); - assert_eq!(fmt_elapsed_compact(25 * 3600 + 2 * 60 + 3), "25h02m03s"); + assert_eq!(fmt_elapsed_compact(60), "1m 00s"); + assert_eq!(fmt_elapsed_compact(61), "1m 01s"); + assert_eq!(fmt_elapsed_compact(3 * 60 + 5), "3m 05s"); + assert_eq!(fmt_elapsed_compact(59 * 60 + 59), "59m 59s"); + assert_eq!(fmt_elapsed_compact(3600), "1h 00m 00s"); + assert_eq!(fmt_elapsed_compact(3600 + 60 + 1), "1h 01m 01s"); + assert_eq!(fmt_elapsed_compact(25 * 3600 + 2 * 60 + 3), "25h 02m 03s"); } #[test] From bba567cee91c86d7e0f911587a91ded7a705b70a Mon Sep 17 00:00:00 2001 From: jif-oai Date: Fri, 12 Sep 2025 10:38:12 -0700 Subject: [PATCH 04/77] bug: fix model save (#3525) Fix those 2 behaviors: 1. The model does not get saved if we don't CTRL + S 2. The reasoning effort get saved --- codex-rs/core/src/codex.rs | 18 ---- codex-rs/core/tests/suite/mod.rs | 1 + codex-rs/core/tests/suite/model_overrides.rs | 92 ++++++++++++++++++++ codex-rs/tui/src/app.rs | 81 ++++++++++++++++- codex-rs/tui/src/chatwidget.rs | 2 +- codex-rs/tui/src/chatwidget/tests.rs | 11 +++ 6 files changed, 185 insertions(+), 20 deletions(-) create mode 100644 codex-rs/core/tests/suite/model_overrides.rs diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index f77e6a40c3..79bf72ec98 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -9,9 +9,6 @@ use std::sync::atomic::AtomicU64; use std::time::Duration; use crate::AuthManager; -use crate::config_edit::CONFIG_KEY_EFFORT; -use crate::config_edit::CONFIG_KEY_MODEL; -use crate::config_edit::persist_non_null_overrides; use crate::event_mapping::map_response_item_to_event_messages; use async_channel::Receiver; use async_channel::Sender; @@ -1170,21 +1167,6 @@ async fn submission_loop( turn_context = Arc::new(new_turn_context); // Optionally persist changes to model / effort - let effort_str = effort.map(|_| effective_effort.to_string()); - - if let Err(e) = persist_non_null_overrides( - &config.codex_home, - config.active_profile.as_deref(), - &[ - (&[CONFIG_KEY_MODEL], model.as_deref()), - (&[CONFIG_KEY_EFFORT], effort_str.as_deref()), - ], - ) - .await - { - warn!("failed to persist overrides: {e:#}"); - } - if cwd.is_some() || approval_policy.is_some() || sandbox_policy.is_some() { sess.record_conversation_items(&[ResponseItem::from(EnvironmentContext::new( cwd, diff --git a/codex-rs/core/tests/suite/mod.rs b/codex-rs/core/tests/suite/mod.rs index aabf83bbe3..10661413a4 100644 --- a/codex-rs/core/tests/suite/mod.rs +++ b/codex-rs/core/tests/suite/mod.rs @@ -7,6 +7,7 @@ mod exec; mod exec_stream_events; mod fork_conversation; mod live_cli; +mod model_overrides; mod prompt_caching; mod seatbelt; mod stream_error_allows_next_turn; diff --git a/codex-rs/core/tests/suite/model_overrides.rs b/codex-rs/core/tests/suite/model_overrides.rs new file mode 100644 index 0000000000..8bd3a8564d --- /dev/null +++ b/codex-rs/core/tests/suite/model_overrides.rs @@ -0,0 +1,92 @@ +use codex_core::CodexAuth; +use codex_core::ConversationManager; +use codex_core::protocol::EventMsg; +use codex_core::protocol::Op; +use codex_core::protocol_config_types::ReasoningEffort; +use core_test_support::load_default_config_for_test; +use core_test_support::wait_for_event; +use pretty_assertions::assert_eq; +use tempfile::TempDir; + +const CONFIG_TOML: &str = "config.toml"; + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn override_turn_context_does_not_persist_when_config_exists() { + let codex_home = TempDir::new().unwrap(); + let config_path = codex_home.path().join(CONFIG_TOML); + let initial_contents = "model = \"gpt-4o\"\n"; + tokio::fs::write(&config_path, initial_contents) + .await + .expect("seed config.toml"); + + let mut config = load_default_config_for_test(&codex_home); + config.model = "gpt-4o".to_string(); + + let conversation_manager = + ConversationManager::with_auth(CodexAuth::from_api_key("Test API Key")); + let codex = conversation_manager + .new_conversation(config) + .await + .expect("create conversation") + .conversation; + + codex + .submit(Op::OverrideTurnContext { + cwd: None, + approval_policy: None, + sandbox_policy: None, + model: Some("o3".to_string()), + effort: Some(ReasoningEffort::High), + summary: None, + }) + .await + .expect("submit override"); + + codex.submit(Op::Shutdown).await.expect("request shutdown"); + wait_for_event(&codex, |ev| matches!(ev, EventMsg::ShutdownComplete)).await; + + let contents = tokio::fs::read_to_string(&config_path) + .await + .expect("read config.toml after override"); + assert_eq!(contents, initial_contents); +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn override_turn_context_does_not_create_config_file() { + let codex_home = TempDir::new().unwrap(); + let config_path = codex_home.path().join(CONFIG_TOML); + assert!( + !config_path.exists(), + "test setup should start without config" + ); + + let config = load_default_config_for_test(&codex_home); + + let conversation_manager = + ConversationManager::with_auth(CodexAuth::from_api_key("Test API Key")); + let codex = conversation_manager + .new_conversation(config) + .await + .expect("create conversation") + .conversation; + + codex + .submit(Op::OverrideTurnContext { + cwd: None, + approval_policy: None, + sandbox_policy: None, + model: Some("o3".to_string()), + effort: Some(ReasoningEffort::Medium), + summary: None, + }) + .await + .expect("submit override"); + + codex.submit(Op::Shutdown).await.expect("request shutdown"); + wait_for_event(&codex, |ev| matches!(ev, EventMsg::ShutdownComplete)).await; + + assert!( + !config_path.exists(), + "override should not create config.toml" + ); +} diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index 5680c2265c..d881927605 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -14,6 +14,7 @@ use codex_core::config::Config; use codex_core::config::persist_model_selection; use codex_core::model_family::find_family_for_model; use codex_core::protocol::TokenUsage; +use codex_core::protocol_config_types::ReasoningEffort as ReasoningEffortConfig; use color_eyre::eyre::Result; use color_eyre::eyre::WrapErr; use crossterm::event::KeyCode; @@ -297,7 +298,7 @@ impl App { self.chat_widget.apply_file_search_result(query, matches); } AppEvent::UpdateReasoningEffort(effort) => { - self.chat_widget.set_reasoning_effort(effort); + self.on_update_reasoning_effort(effort); } AppEvent::UpdateModel(model) => { self.chat_widget.set_model(model.clone()); @@ -336,6 +337,20 @@ impl App { } } + fn on_update_reasoning_effort(&mut self, effort: ReasoningEffortConfig) { + let changed = self.config.model_reasoning_effort != effort; + self.chat_widget.set_reasoning_effort(effort); + self.config.model_reasoning_effort = effort; + if changed { + let show_hint = self.model_saved_to_profile || self.model_saved_to_global; + self.model_saved_to_profile = false; + self.model_saved_to_global = false; + if show_hint { + self.show_model_save_hint(); + } + } + } + async fn persist_model_shortcut(&mut self) { enum SaveScope<'a> { Profile(&'a str), @@ -476,3 +491,67 @@ impl App { }; } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::app_backtrack::BacktrackState; + use crate::chatwidget::tests::make_chatwidget_manual_with_sender; + use crate::file_search::FileSearchManager; + use codex_core::CodexAuth; + use codex_core::ConversationManager; + use ratatui::text::Line; + use std::sync::Arc; + use std::sync::atomic::AtomicBool; + + fn make_test_app() -> App { + let (chat_widget, app_event_tx, _rx, _op_rx) = make_chatwidget_manual_with_sender(); + let config = chat_widget.config_ref().clone(); + + let server = Arc::new(ConversationManager::with_auth(CodexAuth::from_api_key( + "Test API Key", + ))); + let file_search = FileSearchManager::new(config.cwd.clone(), app_event_tx.clone()); + + App { + server, + app_event_tx, + chat_widget, + config, + active_profile: None, + model_saved_to_profile: false, + model_saved_to_global: false, + file_search, + transcript_lines: Vec::>::new(), + overlay: None, + deferred_history_lines: Vec::new(), + has_emitted_history_lines: false, + enhanced_keys_supported: false, + commit_anim_running: Arc::new(AtomicBool::new(false)), + backtrack: BacktrackState::default(), + } + } + + #[test] + fn update_reasoning_effort_updates_config_and_resets_flags() { + let mut app = make_test_app(); + app.model_saved_to_profile = true; + app.model_saved_to_global = true; + app.config.model_reasoning_effort = ReasoningEffortConfig::Medium; + app.chat_widget + .set_reasoning_effort(ReasoningEffortConfig::Medium); + + app.on_update_reasoning_effort(ReasoningEffortConfig::High); + + assert_eq!( + app.config.model_reasoning_effort, + ReasoningEffortConfig::High + ); + assert_eq!( + app.chat_widget.config_ref().model_reasoning_effort, + ReasoningEffortConfig::High + ); + assert!(!app.model_saved_to_profile); + assert!(!app.model_saved_to_global); + } +} diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index f9987a68b3..1f33facdbf 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -1451,4 +1451,4 @@ fn extract_first_bold(s: &str) -> Option { } #[cfg(test)] -mod tests; +pub(crate) mod tests; diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index dc1da26eb4..298fc84951 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -247,6 +247,17 @@ fn make_chatwidget_manual() -> ( (widget, rx, op_rx) } +pub(crate) fn make_chatwidget_manual_with_sender() -> ( + ChatWidget, + AppEventSender, + tokio::sync::mpsc::UnboundedReceiver, + tokio::sync::mpsc::UnboundedReceiver, +) { + let (widget, rx, op_rx) = make_chatwidget_manual(); + let app_event_tx = widget.app_event_tx.clone(); + (widget, app_event_tx, rx, op_rx) +} + fn drain_insert_history( rx: &mut tokio::sync::mpsc::UnboundedReceiver, ) -> Vec>> { From 4ae6b9787a0e6f39bb7b0b01828947db8835daec Mon Sep 17 00:00:00 2001 From: Dylan Date: Fri, 12 Sep 2025 14:24:09 -0400 Subject: [PATCH 05/77] standardize shell description (#3514) ## Summary Standardizes the shell description across sandbox_types, since we cover this in the prompt, and have moved necessary details (like network_access and writeable workspace roots) to EnvironmentContext messages. ## Test Plan - [x] updated unit tests --- codex-rs/core/src/openai_tools.rs | 82 ++----------------------------- 1 file changed, 3 insertions(+), 79 deletions(-) diff --git a/codex-rs/core/src/openai_tools.rs b/codex-rs/core/src/openai_tools.rs index ec56fdfd2c..a511d6dd16 100644 --- a/codex-rs/core/src/openai_tools.rs +++ b/codex-rs/core/src/openai_tools.rs @@ -288,58 +288,9 @@ fn create_shell_tool_for_sandbox(sandbox_policy: &SandboxPolicy) -> OpenAiTool { ); } - let description = match sandbox_policy { - SandboxPolicy::WorkspaceWrite { - network_access, - .. - } => { - let network_line = if !network_access { - "\n - Commands that require network access" - } else { - "" - }; - - format!( - r#" -The shell tool is used to execute shell commands. -- When invoking the shell tool, your call will be running in a sandbox, and some shell commands will require escalated privileges: - - Types of actions that require escalated privileges: - - Writing files other than those in the writable roots (see the environment context for the allowed directories){network_line} - - Examples of commands that require escalated privileges: - - git commit - - npm install or pnpm install - - cargo build - - cargo test -- When invoking a command that will require escalated privileges: - - Provide the with_escalated_permissions parameter with the boolean value true - - Include a short, 1 sentence explanation for why we need to run with_escalated_permissions in the justification parameter."#, - ) - } - SandboxPolicy::DangerFullAccess => { - "Runs a shell command and returns its output.".to_string() - } - SandboxPolicy::ReadOnly => { - r#" -The shell tool is used to execute shell commands. -- When invoking the shell tool, your call will be running in a sandbox, and some shell commands (including apply_patch) will require escalated permissions: - - Types of actions that require escalated privileges: - - Writing files - - Applying patches - - Examples of commands that require escalated privileges: - - apply_patch - - git commit - - npm install or pnpm install - - cargo build - - cargo test -- When invoking a command that will require escalated privileges: - - Provide the with_escalated_permissions parameter with the boolean value true - - Include a short, 1 sentence explanation for why we need to run with_escalated_permissions in the justification parameter"#.to_string() - } - }; - OpenAiTool::Function(ResponsesApiTool { name: "shell".to_string(), - description, + description: "Runs a shell command and returns its output.".to_string(), strict: false, parameters: JsonSchema::Object { properties, @@ -1165,20 +1116,7 @@ mod tests { }; assert_eq!(name, "shell"); - let expected = r#" -The shell tool is used to execute shell commands. -- When invoking the shell tool, your call will be running in a sandbox, and some shell commands will require escalated privileges: - - Types of actions that require escalated privileges: - - Writing files other than those in the writable roots (see the environment context for the allowed directories) - - Commands that require network access - - Examples of commands that require escalated privileges: - - git commit - - npm install or pnpm install - - cargo build - - cargo test -- When invoking a command that will require escalated privileges: - - Provide the with_escalated_permissions parameter with the boolean value true - - Include a short, 1 sentence explanation for why we need to run with_escalated_permissions in the justification parameter."#; + let expected = "Runs a shell command and returns its output."; assert_eq!(description, expected); } @@ -1193,21 +1131,7 @@ The shell tool is used to execute shell commands. }; assert_eq!(name, "shell"); - let expected = r#" -The shell tool is used to execute shell commands. -- When invoking the shell tool, your call will be running in a sandbox, and some shell commands (including apply_patch) will require escalated permissions: - - Types of actions that require escalated privileges: - - Writing files - - Applying patches - - Examples of commands that require escalated privileges: - - apply_patch - - git commit - - npm install or pnpm install - - cargo build - - cargo test -- When invoking a command that will require escalated privileges: - - Provide the with_escalated_permissions parameter with the boolean value true - - Include a short, 1 sentence explanation for why we need to run with_escalated_permissions in the justification parameter"#; + let expected = "Runs a shell command and returns its output."; assert_eq!(description, expected); } From abdcb40f4c93a6afa32f44284b7c09fa92876fd1 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Fri, 12 Sep 2025 11:35:51 -0700 Subject: [PATCH 06/77] feat: change the behavior of SetDefaultModel RPC so None clears the value. (#3529) It turns out that we want slightly different behavior for the `SetDefaultModel` RPC because some models do not work with reasoning (like GPT-4.1), so we should be able to explicitly clear this value. Verified in `codex-rs/mcp-server/tests/suite/set_default_model.rs`. --- codex-rs/core/src/config_edit.rs | 264 ++++++++++++++---- .../mcp-server/src/codex_message_processor.rs | 4 +- .../tests/suite/set_default_model.rs | 26 +- codex-rs/protocol/src/mcp_protocol.rs | 3 + 4 files changed, 240 insertions(+), 57 deletions(-) diff --git a/codex-rs/core/src/config_edit.rs b/codex-rs/core/src/config_edit.rs index ae41ebcb40..4b3a5cbdb0 100644 --- a/codex-rs/core/src/config_edit.rs +++ b/codex-rs/core/src/config_edit.rs @@ -7,6 +7,12 @@ use toml_edit::DocumentMut; pub const CONFIG_KEY_MODEL: &str = "model"; pub const CONFIG_KEY_EFFORT: &str = "model_reasoning_effort"; +#[derive(Copy, Clone)] +enum NoneBehavior { + Skip, + Remove, +} + /// Persist overrides into `config.toml` using explicit key segments per /// override. This avoids ambiguity with keys that contain dots or spaces. pub async fn persist_overrides( @@ -14,47 +20,12 @@ pub async fn persist_overrides( profile: Option<&str>, overrides: &[(&[&str], &str)], ) -> Result<()> { - let config_path = codex_home.join(CONFIG_TOML_FILE); + let with_options: Vec<(&[&str], Option<&str>)> = overrides + .iter() + .map(|(segments, value)| (*segments, Some(*value))) + .collect(); - let mut doc = match tokio::fs::read_to_string(&config_path).await { - Ok(s) => s.parse::()?, - Err(e) if e.kind() == std::io::ErrorKind::NotFound => { - tokio::fs::create_dir_all(codex_home).await?; - DocumentMut::new() - } - Err(e) => return Err(e.into()), - }; - - let effective_profile = if let Some(p) = profile { - Some(p.to_owned()) - } else { - doc.get("profile") - .and_then(|i| i.as_str()) - .map(|s| s.to_string()) - }; - - for (segments, val) in overrides.iter().copied() { - let value = toml_edit::value(val); - if let Some(ref name) = effective_profile { - if segments.first().copied() == Some("profiles") { - apply_toml_edit_override_segments(&mut doc, segments, value); - } else { - let mut seg_buf: Vec<&str> = Vec::with_capacity(2 + segments.len()); - seg_buf.push("profiles"); - seg_buf.push(name.as_str()); - seg_buf.extend_from_slice(segments); - apply_toml_edit_override_segments(&mut doc, &seg_buf, value); - } - } else { - apply_toml_edit_override_segments(&mut doc, segments, value); - } - } - - let tmp_file = NamedTempFile::new_in(codex_home)?; - tokio::fs::write(tmp_file.path(), doc.to_string()).await?; - tmp_file.persist(config_path)?; - - Ok(()) + persist_overrides_with_behavior(codex_home, profile, &with_options, NoneBehavior::Skip).await } /// Persist overrides where values may be optional. Any entries with `None` @@ -65,16 +36,17 @@ pub async fn persist_non_null_overrides( profile: Option<&str>, overrides: &[(&[&str], Option<&str>)], ) -> Result<()> { - let filtered: Vec<(&[&str], &str)> = overrides - .iter() - .filter_map(|(k, v)| v.map(|vv| (*k, vv))) - .collect(); + persist_overrides_with_behavior(codex_home, profile, overrides, NoneBehavior::Skip).await +} - if filtered.is_empty() { - return Ok(()); - } - - persist_overrides(codex_home, profile, &filtered).await +/// Persist overrides where `None` values clear any existing values from the +/// configuration file. +pub async fn persist_overrides_and_clear_if_none( + codex_home: &Path, + profile: Option<&str>, + overrides: &[(&[&str], Option<&str>)], +) -> Result<()> { + persist_overrides_with_behavior(codex_home, profile, overrides, NoneBehavior::Remove).await } /// Apply a single override onto a `toml_edit` document while preserving @@ -121,6 +93,125 @@ fn apply_toml_edit_override_segments( current[last] = value; } +async fn persist_overrides_with_behavior( + codex_home: &Path, + profile: Option<&str>, + overrides: &[(&[&str], Option<&str>)], + none_behavior: NoneBehavior, +) -> Result<()> { + if overrides.is_empty() { + return Ok(()); + } + + let should_skip = match none_behavior { + NoneBehavior::Skip => overrides.iter().all(|(_, value)| value.is_none()), + NoneBehavior::Remove => false, + }; + + if should_skip { + return Ok(()); + } + + let config_path = codex_home.join(CONFIG_TOML_FILE); + + let read_result = tokio::fs::read_to_string(&config_path).await; + let mut doc = match read_result { + Ok(contents) => contents.parse::()?, + Err(e) if e.kind() == std::io::ErrorKind::NotFound => { + if overrides + .iter() + .all(|(_, value)| value.is_none() && matches!(none_behavior, NoneBehavior::Remove)) + { + return Ok(()); + } + + tokio::fs::create_dir_all(codex_home).await?; + DocumentMut::new() + } + Err(e) => return Err(e.into()), + }; + + let effective_profile = if let Some(p) = profile { + Some(p.to_owned()) + } else { + doc.get("profile") + .and_then(|i| i.as_str()) + .map(|s| s.to_string()) + }; + + let mut mutated = false; + + for (segments, value) in overrides.iter().copied() { + let mut seg_buf: Vec<&str> = Vec::new(); + let segments_to_apply: &[&str]; + + if let Some(ref name) = effective_profile { + if segments.first().copied() == Some("profiles") { + segments_to_apply = segments; + } else { + seg_buf.reserve(2 + segments.len()); + seg_buf.push("profiles"); + seg_buf.push(name.as_str()); + seg_buf.extend_from_slice(segments); + segments_to_apply = seg_buf.as_slice(); + } + } else { + segments_to_apply = segments; + } + + match value { + Some(v) => { + let item_value = toml_edit::value(v); + apply_toml_edit_override_segments(&mut doc, segments_to_apply, item_value); + mutated = true; + } + None => { + if matches!(none_behavior, NoneBehavior::Remove) + && remove_toml_edit_segments(&mut doc, segments_to_apply) + { + mutated = true; + } + } + } + } + + if !mutated { + return Ok(()); + } + + let tmp_file = NamedTempFile::new_in(codex_home)?; + tokio::fs::write(tmp_file.path(), doc.to_string()).await?; + tmp_file.persist(config_path)?; + + Ok(()) +} + +fn remove_toml_edit_segments(doc: &mut DocumentMut, segments: &[&str]) -> bool { + use toml_edit::Item; + + if segments.is_empty() { + return false; + } + + let mut current = doc.as_table_mut(); + for seg in &segments[..segments.len() - 1] { + let Some(item) = current.get_mut(seg) else { + return false; + }; + + match item { + Item::Table(table) => { + current = table; + } + _ => { + return false; + } + } + } + + current.remove(segments[segments.len() - 1]).is_some() +} + #[cfg(test)] mod tests { use super::*; @@ -574,6 +665,81 @@ model = "o3" assert_eq!(contents, expected); } + #[tokio::test] + async fn persist_clear_none_removes_top_level_value() { + let tmpdir = tempdir().expect("tmp"); + let codex_home = tmpdir.path(); + + let seed = r#"model = "gpt-5" +model_reasoning_effort = "medium" +"#; + tokio::fs::write(codex_home.join(CONFIG_TOML_FILE), seed) + .await + .expect("seed write"); + + persist_overrides_and_clear_if_none( + codex_home, + None, + &[ + (&[CONFIG_KEY_MODEL], None), + (&[CONFIG_KEY_EFFORT], Some("high")), + ], + ) + .await + .expect("persist"); + + let contents = read_config(codex_home).await; + let expected = "model_reasoning_effort = \"high\"\n"; + assert_eq!(contents, expected); + } + + #[tokio::test] + async fn persist_clear_none_respects_active_profile() { + let tmpdir = tempdir().expect("tmp"); + let codex_home = tmpdir.path(); + + let seed = r#"profile = "team" + +[profiles.team] +model = "gpt-4" +model_reasoning_effort = "minimal" +"#; + tokio::fs::write(codex_home.join(CONFIG_TOML_FILE), seed) + .await + .expect("seed write"); + + persist_overrides_and_clear_if_none( + codex_home, + None, + &[ + (&[CONFIG_KEY_MODEL], None), + (&[CONFIG_KEY_EFFORT], Some("high")), + ], + ) + .await + .expect("persist"); + + let contents = read_config(codex_home).await; + let expected = r#"profile = "team" + +[profiles.team] +model_reasoning_effort = "high" +"#; + assert_eq!(contents, expected); + } + + #[tokio::test] + async fn persist_clear_none_noop_when_file_missing() { + let tmpdir = tempdir().expect("tmp"); + let codex_home = tmpdir.path(); + + persist_overrides_and_clear_if_none(codex_home, None, &[(&[CONFIG_KEY_MODEL], None)]) + .await + .expect("persist"); + + assert!(!codex_home.join(CONFIG_TOML_FILE).exists()); + } + // Test helper moved to bottom per review guidance. async fn read_config(codex_home: &Path) -> String { let p = codex_home.join(CONFIG_TOML_FILE); diff --git a/codex-rs/mcp-server/src/codex_message_processor.rs b/codex-rs/mcp-server/src/codex_message_processor.rs index 6cd6fdeca8..2850c6b830 100644 --- a/codex-rs/mcp-server/src/codex_message_processor.rs +++ b/codex-rs/mcp-server/src/codex_message_processor.rs @@ -20,7 +20,7 @@ use codex_core::config::ConfigToml; use codex_core::config::load_config_as_toml; use codex_core::config_edit::CONFIG_KEY_EFFORT; use codex_core::config_edit::CONFIG_KEY_MODEL; -use codex_core::config_edit::persist_non_null_overrides; +use codex_core::config_edit::persist_overrides_and_clear_if_none; use codex_core::default_client::get_codex_user_agent; use codex_core::exec::ExecParams; use codex_core::exec_env::create_env; @@ -519,7 +519,7 @@ impl CodexMessageProcessor { (&[CONFIG_KEY_EFFORT], effort_str.as_deref()), ]; - match persist_non_null_overrides( + match persist_overrides_and_clear_if_none( &self.config.codex_home, self.config.active_profile.as_deref(), &overrides, diff --git a/codex-rs/mcp-server/tests/suite/set_default_model.rs b/codex-rs/mcp-server/tests/suite/set_default_model.rs index e11b69ed2d..7ffee3438d 100644 --- a/codex-rs/mcp-server/tests/suite/set_default_model.rs +++ b/codex-rs/mcp-server/tests/suite/set_default_model.rs @@ -1,5 +1,6 @@ +use std::path::Path; + use codex_core::config::ConfigToml; -use codex_protocol::config_types::ReasoningEffort; use codex_protocol::mcp_protocol::SetDefaultModelParams; use codex_protocol::mcp_protocol::SetDefaultModelResponse; use mcp_test_support::McpProcess; @@ -14,7 +15,8 @@ const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn set_default_model_persists_overrides() { - let codex_home = TempDir::new().unwrap_or_else(|e| panic!("create tempdir: {e}")); + let codex_home = TempDir::new().expect("create tempdir"); + create_config_toml(codex_home.path()).expect("write config.toml"); let mut mcp = McpProcess::new(codex_home.path()) .await @@ -25,8 +27,8 @@ async fn set_default_model_persists_overrides() { .expect("init failed"); let params = SetDefaultModelParams { - model: Some("o4-mini".to_string()), - reasoning_effort: Some(ReasoningEffort::High), + model: Some("gpt-4.1".to_string()), + reasoning_effort: None, }; let request_id = mcp @@ -53,10 +55,22 @@ async fn set_default_model_persists_overrides() { assert_eq!( ConfigToml { - model: Some("o4-mini".to_string()), - model_reasoning_effort: Some(ReasoningEffort::High), + model: Some("gpt-4.1".to_string()), + model_reasoning_effort: None, ..Default::default() }, config_toml, ); } + +// Helper to create a config.toml; mirrors create_conversation.rs +fn create_config_toml(codex_home: &Path) -> std::io::Result<()> { + let config_toml = codex_home.join("config.toml"); + std::fs::write( + config_toml, + r#" +model = "gpt-5" +model_reasoning_effort = "medium" +"#, + ) +} diff --git a/codex-rs/protocol/src/mcp_protocol.rs b/codex-rs/protocol/src/mcp_protocol.rs index 42f38d46bd..24357ce1cb 100644 --- a/codex-rs/protocol/src/mcp_protocol.rs +++ b/codex-rs/protocol/src/mcp_protocol.rs @@ -424,8 +424,11 @@ pub struct GetUserSavedConfigResponse { #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, TS)] #[serde(rename_all = "camelCase")] pub struct SetDefaultModelParams { + /// If set to None, this means `model` should be cleared in config.toml. #[serde(skip_serializing_if = "Option::is_none")] pub model: Option, + /// If set to None, this means `model_reasoning_effort` should be cleared + /// in config.toml. #[serde(skip_serializing_if = "Option::is_none")] pub reasoning_effort: Option, } From c6fd056aa6e2eb7f98cc02b1eb85c3cbced54da3 Mon Sep 17 00:00:00 2001 From: jif-oai Date: Fri, 12 Sep 2025 12:06:33 -0700 Subject: [PATCH 07/77] feat: reasoning effort as optional (#3527) Allow the reasoning effort to be optional --- codex-rs/common/src/config_summary.rs | 5 ++- codex-rs/common/src/model_presets.rs | 12 +++---- codex-rs/core/src/client.rs | 6 ++-- codex-rs/core/src/client_common.rs | 10 +++--- codex-rs/core/src/codex.rs | 2 +- codex-rs/core/src/config.rs | 31 ++++++++++++------- codex-rs/core/tests/suite/client.rs | 17 +++++++--- codex-rs/core/tests/suite/model_overrides.rs | 4 +-- codex-rs/core/tests/suite/prompt_caching.rs | 4 +-- codex-rs/mcp-server/src/outgoing_message.rs | 4 +-- .../suite/codex_message_processor_flow.rs | 2 +- codex-rs/protocol/src/mcp_protocol.rs | 6 ++-- codex-rs/protocol/src/protocol.rs | 16 +++++++--- codex-rs/tui/src/app.rs | 25 ++++++++------- codex-rs/tui/src/app_event.rs | 2 +- codex-rs/tui/src/chatwidget.rs | 8 +++-- codex-rs/tui/src/chatwidget/tests.rs | 2 +- 17 files changed, 95 insertions(+), 61 deletions(-) diff --git a/codex-rs/common/src/config_summary.rs b/codex-rs/common/src/config_summary.rs index 39d524731f..dabc606ce1 100644 --- a/codex-rs/common/src/config_summary.rs +++ b/codex-rs/common/src/config_summary.rs @@ -17,7 +17,10 @@ pub fn create_config_summary_entries(config: &Config) -> Vec<(&'static str, Stri { entries.push(( "reasoning effort", - config.model_reasoning_effort.to_string(), + config + .model_reasoning_effort + .map(|effort| effort.to_string()) + .unwrap_or_else(|| "none".to_string()), )); entries.push(( "reasoning summaries", diff --git a/codex-rs/common/src/model_presets.rs b/codex-rs/common/src/model_presets.rs index 2b6e5dfb92..cf536119e1 100644 --- a/codex-rs/common/src/model_presets.rs +++ b/codex-rs/common/src/model_presets.rs @@ -12,7 +12,7 @@ pub struct ModelPreset { /// Model slug (e.g., "gpt-5"). pub model: &'static str, /// Reasoning effort to apply for this preset. - pub effort: ReasoningEffort, + pub effort: Option, } /// Built-in list of model presets that pair a model with a reasoning effort. @@ -26,35 +26,35 @@ pub fn builtin_model_presets() -> &'static [ModelPreset] { label: "gpt-5 minimal", description: "— fastest responses with limited reasoning; ideal for coding, instructions, or lightweight tasks", model: "gpt-5", - effort: ReasoningEffort::Minimal, + effort: Some(ReasoningEffort::Minimal), }, ModelPreset { id: "gpt-5-low", label: "gpt-5 low", description: "— balances speed with some reasoning; useful for straightforward queries and short explanations", model: "gpt-5", - effort: ReasoningEffort::Low, + effort: Some(ReasoningEffort::Low), }, ModelPreset { id: "gpt-5-medium", label: "gpt-5 medium", description: "— default setting; provides a solid balance of reasoning depth and latency for general-purpose tasks", model: "gpt-5", - effort: ReasoningEffort::Medium, + effort: Some(ReasoningEffort::Medium), }, ModelPreset { id: "gpt-5-high", label: "gpt-5 high", description: "— maximizes reasoning depth for complex or ambiguous problems", model: "gpt-5", - effort: ReasoningEffort::High, + effort: Some(ReasoningEffort::High), }, ModelPreset { id: "gpt-5-high-new", label: "gpt-5 high new", description: "— our latest release tuned to rely on the model's built-in reasoning defaults", model: "gpt-5-high-new", - effort: ReasoningEffort::Medium, + effort: None, }, ]; PRESETS diff --git a/codex-rs/core/src/client.rs b/codex-rs/core/src/client.rs index e6e21df396..8af61d0ca7 100644 --- a/codex-rs/core/src/client.rs +++ b/codex-rs/core/src/client.rs @@ -72,7 +72,7 @@ pub struct ModelClient { client: reqwest::Client, provider: ModelProviderInfo, conversation_id: ConversationId, - effort: ReasoningEffortConfig, + effort: Option, summary: ReasoningSummaryConfig, } @@ -81,7 +81,7 @@ impl ModelClient { config: Arc, auth_manager: Option>, provider: ModelProviderInfo, - effort: ReasoningEffortConfig, + effort: Option, summary: ReasoningSummaryConfig, conversation_id: ConversationId, ) -> Self { @@ -356,7 +356,7 @@ impl ModelClient { } /// Returns the current reasoning effort setting. - pub fn get_reasoning_effort(&self) -> ReasoningEffortConfig { + pub fn get_reasoning_effort(&self) -> Option { self.effort } diff --git a/codex-rs/core/src/client_common.rs b/codex-rs/core/src/client_common.rs index 2f849239ab..ffcc63f557 100644 --- a/codex-rs/core/src/client_common.rs +++ b/codex-rs/core/src/client_common.rs @@ -136,14 +136,14 @@ pub(crate) struct ResponsesApiRequest<'a> { pub(crate) fn create_reasoning_param_for_request( model_family: &ModelFamily, - effort: ReasoningEffortConfig, + effort: Option, summary: ReasoningSummaryConfig, ) -> Option { - if model_family.supports_reasoning_summaries { - Some(Reasoning { effort, summary }) - } else { - None + if !model_family.supports_reasoning_summaries { + return None; } + + effort.map(|effort| Reasoning { effort, summary }) } pub(crate) fn create_text_param_for_request( diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 79bf72ec98..6d6eb9131b 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -323,7 +323,7 @@ struct ConfigureSession { /// If not specified, server will use its default model. model: String, - model_reasoning_effort: ReasoningEffortConfig, + model_reasoning_effort: Option, model_reasoning_summary: ReasoningSummaryConfig, /// Model instructions that are appended to the base instructions. diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index 2cfd15fcae..443c92a81c 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -140,7 +140,7 @@ pub struct Config { /// Value to use for `reasoning.effort` when making a request using the /// Responses API. - pub model_reasoning_effort: ReasoningEffort, + pub model_reasoning_effort: Option, /// If not "none", the value to use for `reasoning.summary` when making a /// request using the Responses API. @@ -423,14 +423,24 @@ pub async fn persist_model_selection( if let Some(profile_name) = active_profile { let profile_table = ensure_profile_table(&mut doc, profile_name)?; profile_table["model"] = toml_edit::value(model); - if let Some(effort) = effort { - profile_table["model_reasoning_effort"] = toml_edit::value(effort.to_string()); + match effort { + Some(effort) => { + profile_table["model_reasoning_effort"] = toml_edit::value(effort.to_string()); + } + None => { + profile_table.remove("model_reasoning_effort"); + } } } else { let table = doc.as_table_mut(); table["model"] = toml_edit::value(model); - if let Some(effort) = effort { - table["model_reasoning_effort"] = toml_edit::value(effort.to_string()); + match effort { + Some(effort) => { + table["model_reasoning_effort"] = toml_edit::value(effort.to_string()); + } + None => { + table.remove("model_reasoning_effort"); + } } } @@ -913,8 +923,7 @@ impl Config { .unwrap_or(false), model_reasoning_effort: config_profile .model_reasoning_effort - .or(cfg.model_reasoning_effort) - .unwrap_or_default(), + .or(cfg.model_reasoning_effort), model_reasoning_summary: config_profile .model_reasoning_summary .or(cfg.model_reasoning_summary) @@ -1438,7 +1447,7 @@ model_verbosity = "high" codex_linux_sandbox_exe: None, hide_agent_reasoning: false, show_raw_agent_reasoning: false, - model_reasoning_effort: ReasoningEffort::High, + model_reasoning_effort: Some(ReasoningEffort::High), model_reasoning_summary: ReasoningSummary::Detailed, model_verbosity: None, chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(), @@ -1494,7 +1503,7 @@ model_verbosity = "high" codex_linux_sandbox_exe: None, hide_agent_reasoning: false, show_raw_agent_reasoning: false, - model_reasoning_effort: ReasoningEffort::default(), + model_reasoning_effort: None, model_reasoning_summary: ReasoningSummary::default(), model_verbosity: None, chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(), @@ -1565,7 +1574,7 @@ model_verbosity = "high" codex_linux_sandbox_exe: None, hide_agent_reasoning: false, show_raw_agent_reasoning: false, - model_reasoning_effort: ReasoningEffort::default(), + model_reasoning_effort: None, model_reasoning_summary: ReasoningSummary::default(), model_verbosity: None, chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(), @@ -1622,7 +1631,7 @@ model_verbosity = "high" codex_linux_sandbox_exe: None, hide_agent_reasoning: false, show_raw_agent_reasoning: false, - model_reasoning_effort: ReasoningEffort::High, + model_reasoning_effort: Some(ReasoningEffort::High), model_reasoning_summary: ReasoningSummary::Detailed, model_verbosity: Some(Verbosity::High), chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(), diff --git a/codex-rs/core/tests/suite/client.rs b/codex-rs/core/tests/suite/client.rs index 992679df7f..579f37cd6e 100644 --- a/codex-rs/core/tests/suite/client.rs +++ b/codex-rs/core/tests/suite/client.rs @@ -441,6 +441,7 @@ async fn chatgpt_auth_sends_correct_request() { // Init session let codex_home = TempDir::new().unwrap(); let mut config = load_default_config_for_test(&codex_home); + let include_reasoning = config.model_reasoning_effort.is_some(); config.model_provider = model_provider; let conversation_manager = ConversationManager::with_auth(create_dummy_codex_auth()); let NewConversation { @@ -482,10 +483,18 @@ async fn chatgpt_auth_sends_correct_request() { ); assert_eq!(request_chatgpt_account_id.to_str().unwrap(), "account_id"); assert!(request_body["stream"].as_bool().unwrap()); - assert_eq!( - request_body["include"][0].as_str().unwrap(), - "reasoning.encrypted_content" - ); + if include_reasoning { + assert_eq!( + request_body["include"][0].as_str().unwrap(), + "reasoning.encrypted_content" + ); + } else { + assert!( + request_body["include"] + .as_array() + .is_none_or(|items| items.is_empty()) + ); + } } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] diff --git a/codex-rs/core/tests/suite/model_overrides.rs b/codex-rs/core/tests/suite/model_overrides.rs index 8bd3a8564d..a186c13ef3 100644 --- a/codex-rs/core/tests/suite/model_overrides.rs +++ b/codex-rs/core/tests/suite/model_overrides.rs @@ -36,7 +36,7 @@ async fn override_turn_context_does_not_persist_when_config_exists() { approval_policy: None, sandbox_policy: None, model: Some("o3".to_string()), - effort: Some(ReasoningEffort::High), + effort: Some(Some(ReasoningEffort::High)), summary: None, }) .await @@ -76,7 +76,7 @@ async fn override_turn_context_does_not_create_config_file() { approval_policy: None, sandbox_policy: None, model: Some("o3".to_string()), - effort: Some(ReasoningEffort::Medium), + effort: Some(Some(ReasoningEffort::Medium)), summary: None, }) .await diff --git a/codex-rs/core/tests/suite/prompt_caching.rs b/codex-rs/core/tests/suite/prompt_caching.rs index 5ac3da6003..c6731fee34 100644 --- a/codex-rs/core/tests/suite/prompt_caching.rs +++ b/codex-rs/core/tests/suite/prompt_caching.rs @@ -387,7 +387,7 @@ async fn overrides_turn_context_but_keeps_cached_prefix_and_key_constant() { exclude_slash_tmp: true, }), model: Some("o3".to_string()), - effort: Some(ReasoningEffort::High), + effort: Some(Some(ReasoningEffort::High)), summary: Some(ReasoningSummary::Detailed), }) .await @@ -519,7 +519,7 @@ async fn per_turn_overrides_keep_cached_prefix_and_key_constant() { exclude_slash_tmp: true, }, model: "o3".to_string(), - effort: ReasoningEffort::High, + effort: Some(ReasoningEffort::High), summary: ReasoningSummary::Detailed, }) .await diff --git a/codex-rs/mcp-server/src/outgoing_message.rs b/codex-rs/mcp-server/src/outgoing_message.rs index 04e99516ce..90e7f9d26a 100644 --- a/codex-rs/mcp-server/src/outgoing_message.rs +++ b/codex-rs/mcp-server/src/outgoing_message.rs @@ -280,7 +280,7 @@ mod tests { msg: EventMsg::SessionConfigured(SessionConfiguredEvent { session_id: conversation_id, model: "gpt-4o".to_string(), - reasoning_effort: ReasoningEffort::default(), + reasoning_effort: Some(ReasoningEffort::default()), history_log_id: 1, history_entry_count: 1000, initial_messages: None, @@ -314,7 +314,7 @@ mod tests { let session_configured_event = SessionConfiguredEvent { session_id: conversation_id, model: "gpt-4o".to_string(), - reasoning_effort: ReasoningEffort::default(), + reasoning_effort: Some(ReasoningEffort::default()), history_log_id: 1, history_entry_count: 1000, initial_messages: None, diff --git a/codex-rs/mcp-server/tests/suite/codex_message_processor_flow.rs b/codex-rs/mcp-server/tests/suite/codex_message_processor_flow.rs index 49d9ab1807..50a480b4a0 100644 --- a/codex-rs/mcp-server/tests/suite/codex_message_processor_flow.rs +++ b/codex-rs/mcp-server/tests/suite/codex_message_processor_flow.rs @@ -320,7 +320,7 @@ async fn test_send_user_turn_changes_approval_policy_behavior() { approval_policy: AskForApproval::Never, sandbox_policy: SandboxPolicy::new_read_only_policy(), model: "mock-model".to_string(), - effort: ReasoningEffort::Medium, + effort: Some(ReasoningEffort::Medium), summary: ReasoningSummary::Auto, }) .await diff --git a/codex-rs/protocol/src/mcp_protocol.rs b/codex-rs/protocol/src/mcp_protocol.rs index 24357ce1cb..fe77d20b66 100644 --- a/codex-rs/protocol/src/mcp_protocol.rs +++ b/codex-rs/protocol/src/mcp_protocol.rs @@ -223,7 +223,8 @@ pub struct NewConversationResponse { pub conversation_id: ConversationId, pub model: String, /// Note this could be ignored by the model. - pub reasoning_effort: ReasoningEffort, + #[serde(skip_serializing_if = "Option::is_none")] + pub reasoning_effort: Option, pub rollout_path: PathBuf, } @@ -526,7 +527,8 @@ pub struct SendUserTurnParams { pub approval_policy: AskForApproval, pub sandbox_policy: SandboxPolicy, pub model: String, - pub effort: ReasoningEffort, + #[serde(skip_serializing_if = "Option::is_none")] + pub effort: Option, pub summary: ReasoningSummary, } diff --git a/codex-rs/protocol/src/protocol.rs b/codex-rs/protocol/src/protocol.rs index 134059e978..3ae8ffef5b 100644 --- a/codex-rs/protocol/src/protocol.rs +++ b/codex-rs/protocol/src/protocol.rs @@ -81,7 +81,8 @@ pub enum Op { model: String, /// Will only be honored if the model is configured to use reasoning. - effort: ReasoningEffortConfig, + #[serde(skip_serializing_if = "Option::is_none")] + effort: Option, /// Will only be honored if the model is configured to use reasoning. summary: ReasoningSummaryConfig, @@ -111,8 +112,11 @@ pub enum Op { model: Option, /// Updated reasoning effort (honored only for reasoning-capable models). + /// + /// Use `Some(Some(_))` to set a specific effort, `Some(None)` to clear + /// the effort, or `None` to leave the existing value unchanged. #[serde(skip_serializing_if = "Option::is_none")] - effort: Option, + effort: Option>, /// Updated reasoning summary preference (honored only for reasoning-capable models). #[serde(skip_serializing_if = "Option::is_none")] @@ -913,7 +917,8 @@ pub struct TurnContextItem { pub approval_policy: AskForApproval, pub sandbox_policy: SandboxPolicy, pub model: String, - pub effort: ReasoningEffortConfig, + #[serde(skip_serializing_if = "Option::is_none")] + pub effort: Option, pub summary: ReasoningSummaryConfig, } @@ -1082,7 +1087,8 @@ pub struct SessionConfiguredEvent { pub model: String, /// The effort the model is putting into reasoning about the user's request. - pub reasoning_effort: ReasoningEffortConfig, + #[serde(skip_serializing_if = "Option::is_none")] + pub reasoning_effort: Option, /// Identifier of the history log file (inode on Unix, 0 otherwise). pub history_log_id: u64, @@ -1172,7 +1178,7 @@ mod tests { msg: EventMsg::SessionConfigured(SessionConfiguredEvent { session_id: conversation_id, model: "codex-mini-latest".to_string(), - reasoning_effort: ReasoningEffortConfig::default(), + reasoning_effort: Some(ReasoningEffortConfig::default()), history_log_id: 0, history_entry_count: 0, initial_messages: None, diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index d881927605..2b22396f43 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -337,7 +337,7 @@ impl App { } } - fn on_update_reasoning_effort(&mut self, effort: ReasoningEffortConfig) { + fn on_update_reasoning_effort(&mut self, effort: Option) { let changed = self.config.model_reasoning_effort != effort; self.chat_widget.set_reasoning_effort(effort); self.config.model_reasoning_effort = effort; @@ -372,17 +372,18 @@ impl App { let model = self.config.model.clone(); let effort = self.config.model_reasoning_effort; + let effort_label = effort + .map(|effort| effort.to_string()) + .unwrap_or_else(|| "none".to_string()); let codex_home = self.config.codex_home.clone(); match scope { SaveScope::Profile(profile) => { - match persist_model_selection(&codex_home, Some(profile), &model, Some(effort)) - .await - { + match persist_model_selection(&codex_home, Some(profile), &model, effort).await { Ok(()) => { self.model_saved_to_profile = true; self.chat_widget.add_info_message(format!( - "Saved model {model} ({effort}) for profile `{profile}`. Press Ctrl+S again to make this your global default." + "Saved model {model} ({effort_label}) for profile `{profile}`. Press Ctrl+S again to make this your global default." )); } Err(err) => { @@ -397,11 +398,11 @@ impl App { } } SaveScope::Global => { - match persist_model_selection(&codex_home, None, &model, Some(effort)).await { + match persist_model_selection(&codex_home, None, &model, effort).await { Ok(()) => { self.model_saved_to_global = true; self.chat_widget.add_info_message(format!( - "Saved model {model} ({effort}) as your global default." + "Saved model {model} ({effort_label}) as your global default." )); } Err(err) => { @@ -537,19 +538,19 @@ mod tests { let mut app = make_test_app(); app.model_saved_to_profile = true; app.model_saved_to_global = true; - app.config.model_reasoning_effort = ReasoningEffortConfig::Medium; + app.config.model_reasoning_effort = Some(ReasoningEffortConfig::Medium); app.chat_widget - .set_reasoning_effort(ReasoningEffortConfig::Medium); + .set_reasoning_effort(Some(ReasoningEffortConfig::Medium)); - app.on_update_reasoning_effort(ReasoningEffortConfig::High); + app.on_update_reasoning_effort(Some(ReasoningEffortConfig::High)); assert_eq!( app.config.model_reasoning_effort, - ReasoningEffortConfig::High + Some(ReasoningEffortConfig::High) ); assert_eq!( app.chat_widget.config_ref().model_reasoning_effort, - ReasoningEffortConfig::High + Some(ReasoningEffortConfig::High) ); assert!(!app.model_saved_to_profile); assert!(!app.model_saved_to_global); diff --git a/codex-rs/tui/src/app_event.rs b/codex-rs/tui/src/app_event.rs index cbd6f3d8f0..ec0677920f 100644 --- a/codex-rs/tui/src/app_event.rs +++ b/codex-rs/tui/src/app_event.rs @@ -46,7 +46,7 @@ pub(crate) enum AppEvent { CommitTick, /// Update the current reasoning effort in the running app and widget. - UpdateReasoningEffort(ReasoningEffort), + UpdateReasoningEffort(Option), /// Update the current model slug in the running app and widget. UpdateModel(String), diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 1f33facdbf..f47467e4c1 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -1191,9 +1191,13 @@ impl ChatWidget { tracing::info!( "New model: {}, New effort: {}, Current model: {}, Current effort: {}", model_slug.clone(), - effort, + effort + .map(|effort| effort.to_string()) + .unwrap_or_else(|| "none".to_string()), current_model, current_effort + .map(|effort| effort.to_string()) + .unwrap_or_else(|| "none".to_string()) ); })]; items.push(SelectionItem { @@ -1264,7 +1268,7 @@ impl ChatWidget { } /// Set the reasoning effort in the widget's config copy. - pub(crate) fn set_reasoning_effort(&mut self, effort: ReasoningEffortConfig) { + pub(crate) fn set_reasoning_effort(&mut self, effort: Option) { self.config.model_reasoning_effort = effort; } diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index 298fc84951..2cb0685ffc 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -138,7 +138,7 @@ fn resumed_initial_messages_render_history() { let configured = codex_core::protocol::SessionConfiguredEvent { session_id: conversation_id, model: "test-model".to_string(), - reasoning_effort: ReasoningEffortConfig::default(), + reasoning_effort: Some(ReasoningEffortConfig::default()), history_log_id: 0, history_entry_count: 0, initial_messages: Some(vec![ From 1a6a95fb2aa31e10b4dbfb7f48b233adbc2076d0 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Fri, 12 Sep 2025 15:31:15 -0400 Subject: [PATCH 08/77] Add spacing between dropdown headers and items (#3472) image image --- .../src/bottom_pane/list_selection_view.rs | 103 +++++++++++++++--- ..._list_selection_spacing_with_subtitle.snap | 11 ++ ...st_selection_spacing_without_subtitle.snap | 10 ++ 3 files changed, 111 insertions(+), 13 deletions(-) create mode 100644 codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_with_subtitle.snap create mode 100644 codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_without_subtitle.snap diff --git a/codex-rs/tui/src/bottom_pane/list_selection_view.rs b/codex-rs/tui/src/bottom_pane/list_selection_view.rs index 357639693b..7be91db202 100644 --- a/codex-rs/tui/src/bottom_pane/list_selection_view.rs +++ b/codex-rs/tui/src/bottom_pane/list_selection_view.rs @@ -137,11 +137,12 @@ impl BottomPaneView for ListSelectionView { fn desired_height(&self, _width: u16) -> u16 { let rows = (self.items.len()).clamp(1, MAX_POPUP_ROWS); - // +1 for the title row, +1 for optional subtitle, +1 for optional footer - let mut height = rows as u16 + 1; + // +1 for the title row, +1 for a spacer line beneath the header, + // +1 for optional subtitle, +1 for optional footer + let mut height = rows as u16 + 2; if self.subtitle.is_some() { - // +1 for subtitle, +1 for a blank spacer line beneath it - height = height.saturating_add(2); + // +1 for subtitle (the spacer is accounted for above) + height = height.saturating_add(1); } if self.footer_hint.is_some() { height = height.saturating_add(2); @@ -178,17 +179,18 @@ impl BottomPaneView for ListSelectionView { vec![Self::dim_prefix_span(), sub.clone().dim()]; let subtitle_para = Paragraph::new(Line::from(subtitle_spans)); subtitle_para.render(subtitle_area, buf); - // Render the extra spacer line with the dimmed prefix to align with title/subtitle - let spacer_area = Rect { - x: area.x, - y: next_y.saturating_add(1), - width: area.width, - height: 1, - }; - Self::render_dim_prefix_line(spacer_area, buf); - next_y = next_y.saturating_add(2); + next_y = next_y.saturating_add(1); } + let spacer_area = Rect { + x: area.x, + y: next_y, + width: area.width, + height: 1, + }; + Self::render_dim_prefix_line(spacer_area, buf); + next_y = next_y.saturating_add(1); + let footer_reserved = if self.footer_hint.is_some() { 2 } else { 0 }; let rows_area = Rect { x: area.x, @@ -245,3 +247,78 @@ impl BottomPaneView for ListSelectionView { } } } + +#[cfg(test)] +mod tests { + use super::BottomPaneView; + use super::*; + use crate::app_event::AppEvent; + use insta::assert_snapshot; + use ratatui::layout::Rect; + use tokio::sync::mpsc::unbounded_channel; + + fn make_selection_view(subtitle: Option<&str>) -> ListSelectionView { + let (tx_raw, _rx) = unbounded_channel::(); + let tx = AppEventSender::new(tx_raw); + let items = vec![ + SelectionItem { + name: "Read Only".to_string(), + description: Some("Codex can read files".to_string()), + is_current: true, + actions: vec![], + }, + SelectionItem { + name: "Full Access".to_string(), + description: Some("Codex can edit files".to_string()), + is_current: false, + actions: vec![], + }, + ]; + ListSelectionView::new( + "Select Approval Mode".to_string(), + subtitle.map(str::to_string), + Some("Press Enter to confirm or Esc to go back".to_string()), + items, + tx, + ) + } + + fn render_lines(view: &ListSelectionView) -> String { + let width = 48; + let height = BottomPaneView::desired_height(view, width); + let area = Rect::new(0, 0, width, height); + let mut buf = Buffer::empty(area); + view.render(area, &mut buf); + + let lines: Vec = (0..area.height) + .map(|row| { + let mut line = String::new(); + for col in 0..area.width { + let symbol = buf[(area.x + col, area.y + row)].symbol(); + if symbol.is_empty() { + line.push(' '); + } else { + line.push_str(symbol); + } + } + line + }) + .collect(); + lines.join("\n") + } + + #[test] + fn renders_blank_line_between_title_and_items_without_subtitle() { + let view = make_selection_view(None); + assert_snapshot!( + "list_selection_spacing_without_subtitle", + render_lines(&view) + ); + } + + #[test] + fn renders_blank_line_between_subtitle_and_items() { + let view = make_selection_view(Some("Switch between Codex approval presets")); + assert_snapshot!("list_selection_spacing_with_subtitle", render_lines(&view)); + } +} diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_with_subtitle.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_with_subtitle.snap new file mode 100644 index 0000000000..aab7e7c9b6 --- /dev/null +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_with_subtitle.snap @@ -0,0 +1,11 @@ +--- +source: tui/src/bottom_pane/list_selection_view.rs +expression: render_lines(&view) +--- +▌ Select Approval Mode +▌ Switch between Codex approval presets +▌ +▌> 1. Read Only (current) Codex can read files +▌ 2. Full Access Codex can edit files + +Press Enter to confirm or Esc to go back diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_without_subtitle.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_without_subtitle.snap new file mode 100644 index 0000000000..77552f2b93 --- /dev/null +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_without_subtitle.snap @@ -0,0 +1,10 @@ +--- +source: tui/src/bottom_pane/list_selection_view.rs +expression: render_lines(&view) +--- +▌ Select Approval Mode +▌ +▌> 1. Read Only (current) Codex can read files +▌ 2. Full Access Codex can edit files + +Press Enter to confirm or Esc to go back From d4848e558b067f689f51d7a28a305716663fa883 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Fri, 12 Sep 2025 15:31:24 -0400 Subject: [PATCH 09/77] Add spacing before composer footer hints (#3469) image --- codex-rs/tui/src/bottom_pane/chat_composer.rs | 97 ++++++++++++++++--- ...mposer__tests__backspace_after_pastes.snap | 2 +- ...tom_pane__chat_composer__tests__empty.snap | 2 +- ...tom_pane__chat_composer__tests__large.snap | 2 +- ...chat_composer__tests__multiple_pastes.snap | 2 +- ...tom_pane__chat_composer__tests__small.snap | 2 +- ...chatwidget__tests__chat_small_idle_h2.snap | 2 +- ...exec_and_status_layout_vt100_snapshot.snap | 1 + ...atwidget__tests__status_widget_active.snap | 1 + 9 files changed, 92 insertions(+), 19 deletions(-) diff --git a/codex-rs/tui/src/bottom_pane/chat_composer.rs b/codex-rs/tui/src/bottom_pane/chat_composer.rs index 410701a629..065232d86c 100644 --- a/codex-rs/tui/src/bottom_pane/chat_composer.rs +++ b/codex-rs/tui/src/bottom_pane/chat_composer.rs @@ -95,6 +95,10 @@ enum ActivePopup { File(FileSearchPopup), } +const FOOTER_HINT_HEIGHT: u16 = 1; +const FOOTER_SPACING_HEIGHT: u16 = 1; +const FOOTER_HEIGHT_WITH_HINT: u16 = FOOTER_HINT_HEIGHT + FOOTER_SPACING_HEIGHT; + impl ChatComposer { pub fn new( has_input_focus: bool, @@ -134,20 +138,20 @@ impl ChatComposer { pub fn desired_height(&self, width: u16) -> u16 { self.textarea.desired_height(width - 1) + match &self.active_popup { - ActivePopup::None => 1u16, + ActivePopup::None => FOOTER_HEIGHT_WITH_HINT, ActivePopup::Command(c) => c.calculate_required_height(), ActivePopup::File(c) => c.calculate_required_height(), } } pub fn cursor_pos(&self, area: Rect) -> Option<(u16, u16)> { - let popup_height = match &self.active_popup { - ActivePopup::Command(popup) => popup.calculate_required_height(), - ActivePopup::File(popup) => popup.calculate_required_height(), - ActivePopup::None => 1, + let popup_constraint = match &self.active_popup { + ActivePopup::Command(popup) => Constraint::Max(popup.calculate_required_height()), + ActivePopup::File(popup) => Constraint::Max(popup.calculate_required_height()), + ActivePopup::None => Constraint::Max(FOOTER_HEIGHT_WITH_HINT), }; let [textarea_rect, _] = - Layout::vertical([Constraint::Min(1), Constraint::Max(popup_height)]).areas(area); + Layout::vertical([Constraint::Min(1), popup_constraint]).areas(area); let mut textarea_rect = textarea_rect; textarea_rect.width = textarea_rect.width.saturating_sub(1); textarea_rect.x += 1; @@ -1223,13 +1227,16 @@ impl ChatComposer { impl WidgetRef for ChatComposer { fn render_ref(&self, area: Rect, buf: &mut Buffer) { - let popup_height = match &self.active_popup { - ActivePopup::Command(popup) => popup.calculate_required_height(), - ActivePopup::File(popup) => popup.calculate_required_height(), - ActivePopup::None => 1, + let (popup_constraint, hint_spacing) = match &self.active_popup { + ActivePopup::Command(popup) => (Constraint::Max(popup.calculate_required_height()), 0), + ActivePopup::File(popup) => (Constraint::Max(popup.calculate_required_height()), 0), + ActivePopup::None => ( + Constraint::Length(FOOTER_HEIGHT_WITH_HINT), + FOOTER_SPACING_HEIGHT, + ), }; let [textarea_rect, popup_rect] = - Layout::vertical([Constraint::Min(1), Constraint::Max(popup_height)]).areas(area); + Layout::vertical([Constraint::Min(1), popup_constraint]).areas(area); match &self.active_popup { ActivePopup::Command(popup) => { popup.render_ref(popup_rect, buf); @@ -1238,7 +1245,16 @@ impl WidgetRef for ChatComposer { popup.render_ref(popup_rect, buf); } ActivePopup::None => { - let bottom_line_rect = popup_rect; + let hint_rect = if hint_spacing > 0 { + let [_, hint_rect] = Layout::vertical([ + Constraint::Length(hint_spacing), + Constraint::Length(FOOTER_HINT_HEIGHT), + ]) + .areas(popup_rect); + hint_rect + } else { + popup_rect + }; let mut hint: Vec> = if self.ctrl_c_quit_hint { let ctrl_c_followup = if self.is_task_running { " to interrupt" @@ -1309,7 +1325,7 @@ impl WidgetRef for ChatComposer { Line::from(hint) .style(Style::default().dim()) - .render_ref(bottom_line_rect, buf); + .render_ref(hint_rect, buf); } } let border_style = if self.has_focus { @@ -1344,6 +1360,7 @@ mod tests { use super::*; use image::ImageBuffer; use image::Rgba; + use pretty_assertions::assert_eq; use std::path::PathBuf; use tempfile::tempdir; @@ -1356,6 +1373,60 @@ mod tests { use crate::bottom_pane::textarea::TextArea; use tokio::sync::mpsc::unbounded_channel; + #[test] + fn footer_hint_row_is_separated_from_composer() { + let (tx, _rx) = unbounded_channel::(); + let sender = AppEventSender::new(tx); + let composer = ChatComposer::new( + true, + sender, + false, + "Ask Codex to do anything".to_string(), + false, + ); + + let area = Rect::new(0, 0, 40, 6); + let mut buf = Buffer::empty(area); + composer.render_ref(area, &mut buf); + + let row_to_string = |y: u16| { + let mut row = String::new(); + for x in 0..area.width { + row.push(buf[(x, y)].symbol().chars().next().unwrap_or(' ')); + } + row + }; + + let mut hint_row: Option<(u16, String)> = None; + for y in 0..area.height { + let row = row_to_string(y); + if row.contains(" send") { + hint_row = Some((y, row)); + break; + } + } + + let (hint_row_idx, hint_row_contents) = + hint_row.expect("expected footer hint row to be rendered"); + assert_eq!( + hint_row_idx, + area.height - 1, + "hint row should occupy the bottom line: {hint_row_contents:?}", + ); + + assert!( + hint_row_idx > 0, + "expected a spacing row above the footer hints", + ); + + let spacing_row = row_to_string(hint_row_idx - 1); + assert_eq!( + spacing_row.trim(), + "", + "expected blank spacing row above hints but saw: {spacing_row:?}", + ); + } + #[test] fn test_current_at_token_basic_cases() { let test_cases = vec![ diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__backspace_after_pastes.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__backspace_after_pastes.snap index 0c278fd7f7..eafcf94535 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__backspace_after_pastes.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__backspace_after_pastes.snap @@ -10,5 +10,5 @@ expression: terminal.backend() "▌ " "▌ " "▌ " -"▌ " +" " " ⏎ send ⌃J newline ⌃T transcript ⌃C quit " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__empty.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__empty.snap index c61924854f..8de047f1fb 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__empty.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__empty.snap @@ -10,5 +10,5 @@ expression: terminal.backend() "▌ " "▌ " "▌ " -"▌ " +" " " ⏎ send ⌃J newline ⌃T transcript ⌃C quit " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__large.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__large.snap index 1660bb49c3..b9e96aed37 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__large.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__large.snap @@ -10,5 +10,5 @@ expression: terminal.backend() "▌ " "▌ " "▌ " -"▌ " +" " " ⏎ send ⌃J newline ⌃T transcript ⌃C quit " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__multiple_pastes.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__multiple_pastes.snap index 21869a0758..cb5465955e 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__multiple_pastes.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__multiple_pastes.snap @@ -10,5 +10,5 @@ expression: terminal.backend() "▌ " "▌ " "▌ " -"▌ " +" " " ⏎ send ⌃J newline ⌃T transcript ⌃C quit " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__small.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__small.snap index 1f25731722..8843b4a5cd 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__small.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__small.snap @@ -10,5 +10,5 @@ expression: terminal.backend() "▌ " "▌ " "▌ " -"▌ " +" " " ⏎ send ⌃J newline ⌃T transcript ⌃C quit " diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_idle_h2.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_idle_h2.snap index 41f43babf0..48e6154eb2 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_idle_h2.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_idle_h2.snap @@ -3,4 +3,4 @@ source: tui/src/chatwidget/tests.rs expression: terminal.backend() --- "▌ Ask Codex to do anything " -" ⏎ send ⌃J newline ⌃T transcript ⌃" +" " diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chatwidget_exec_and_status_layout_vt100_snapshot.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chatwidget_exec_and_status_layout_vt100_snapshot.snap index c6d5b00291..df4fd4ca86 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chatwidget_exec_and_status_layout_vt100_snapshot.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chatwidget_exec_and_status_layout_vt100_snapshot.snap @@ -12,4 +12,5 @@ expression: visual Investigating rendering code (0s • Esc to interrupt) ▌Summarize recent commits + ⏎ send ⌃J newline ⌃T transcript ⌃C quit diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_active.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_active.snap index 088b43a74d..8eb6e72a4e 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_active.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_active.snap @@ -6,5 +6,6 @@ expression: terminal.backend() " Analyzing (0s • Esc to interrupt) " " " "▌ Ask Codex to do anything " +" " " ⏎ send ⌃J newline ⌃T transcript ⌃C quit " " " From ea225df22e4441144639dac44a49d539b5a7e498 Mon Sep 17 00:00:00 2001 From: jif-oai Date: Fri, 12 Sep 2025 13:07:10 -0700 Subject: [PATCH 10/77] feat: context compaction (#3446) ## Compact feature: 1. Stops the model when the context window become too large 2. Add a user turn, asking for the model to summarize 3. Build a bridge that contains all the previous user message + the summary. Rendered from a template 4. Start sampling again from a clean conversation with only that bridge --- codex-rs/Cargo.lock | 69 ++ codex-rs/core/Cargo.toml | 1 + codex-rs/core/src/client.rs | 6 + codex-rs/core/src/codex.rs | 270 +++----- codex-rs/core/src/codex/compact.rs | 401 ++++++++++++ codex-rs/core/src/config.rs | 16 + codex-rs/core/src/conversation_history.rs | 49 +- codex-rs/core/src/openai_model_info.rs | 73 +-- .../core/src/prompt_for_compact_command.md | 21 - codex-rs/core/src/unified_exec/mod.rs | 22 +- .../core/templates/compact/history_bridge.md | 7 + codex-rs/core/templates/compact/prompt.md | 5 + codex-rs/core/tests/suite/compact.rs | 601 +++++++++++++++++- codex-rs/protocol/src/protocol.rs | 28 +- 14 files changed, 1243 insertions(+), 326 deletions(-) create mode 100644 codex-rs/core/src/codex/compact.rs delete mode 100644 codex-rs/core/src/prompt_for_compact_command.md create mode 100644 codex-rs/core/templates/compact/history_bridge.md create mode 100644 codex-rs/core/templates/compact/prompt.md diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 3955f79f10..37767c0dd4 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -212,6 +212,50 @@ dependencies = [ "term", ] +[[package]] +name = "askama" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" +dependencies = [ + "askama_derive", + "askama_escape", + "humansize", + "num-traits", + "percent-encoding", +] + +[[package]] +name = "askama_derive" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" +dependencies = [ + "askama_parser", + "basic-toml", + "mime", + "mime_guess", + "proc-macro2", + "quote", + "serde", + "syn 2.0.104", +] + +[[package]] +name = "askama_escape" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" + +[[package]] +name = "askama_parser" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" +dependencies = [ + "nom", +] + [[package]] name = "assert-json-diff" version = "2.0.2" @@ -305,6 +349,15 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + [[package]] name = "beef" version = "0.5.2" @@ -606,6 +659,7 @@ name = "codex-core" version = "0.0.0" dependencies = [ "anyhow", + "askama", "assert_cmd", "async-channel", "base64", @@ -1981,6 +2035,15 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "humansize" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" +dependencies = [ + "libm", +] + [[package]] name = "hyper" version = "1.7.0" @@ -2536,6 +2599,12 @@ version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + [[package]] name = "libredox" version = "0.1.6" diff --git a/codex-rs/core/Cargo.toml b/codex-rs/core/Cargo.toml index 69ef7bc449..34c7ba554a 100644 --- a/codex-rs/core/Cargo.toml +++ b/codex-rs/core/Cargo.toml @@ -13,6 +13,7 @@ workspace = true [dependencies] anyhow = "1" +askama = "0.12" async-channel = "2.3.1" base64 = "0.22" bytes = "1.10.1" diff --git a/codex-rs/core/src/client.rs b/codex-rs/core/src/client.rs index 8af61d0ca7..dab1bf6831 100644 --- a/codex-rs/core/src/client.rs +++ b/codex-rs/core/src/client.rs @@ -104,6 +104,12 @@ impl ModelClient { .or_else(|| get_model_info(&self.config.model_family).map(|info| info.context_window)) } + pub fn get_auto_compact_token_limit(&self) -> Option { + self.config.model_auto_compact_token_limit.or_else(|| { + get_model_info(&self.config.model_family).and_then(|info| info.auto_compact_token_limit) + }) + } + /// Dispatches to either the Responses or Chat implementation depending on /// the provider config. Public callers always invoke `stream()` – the /// specialised helpers are private to avoid accidental misuse. diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 6d6eb9131b..58dd86818c 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -16,7 +16,6 @@ use codex_apply_patch::ApplyPatchAction; use codex_apply_patch::MaybeApplyPatchVerified; use codex_apply_patch::maybe_parse_apply_patch_verified; use codex_protocol::mcp_protocol::ConversationId; -use codex_protocol::protocol::CompactedItem; use codex_protocol::protocol::ConversationPathResponseEvent; use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::TaskStartedEvent; @@ -77,7 +76,6 @@ use crate::parse_command::parse_command; use crate::plan_tool::handle_update_plan; use crate::project_doc::get_user_instructions; use crate::protocol::AgentMessageDeltaEvent; -use crate::protocol::AgentMessageEvent; use crate::protocol::AgentReasoningDeltaEvent; use crate::protocol::AgentReasoningRawContentDeltaEvent; use crate::protocol::AgentReasoningSectionBreakEvent; @@ -102,6 +100,7 @@ use crate::protocol::SessionConfiguredEvent; use crate::protocol::StreamErrorEvent; use crate::protocol::Submission; use crate::protocol::TaskCompleteEvent; +use crate::protocol::TokenUsage; use crate::protocol::TokenUsageInfo; use crate::protocol::TurnDiffEvent; use crate::protocol::WebSearchBeginEvent; @@ -127,6 +126,8 @@ use codex_protocol::models::ResponseItem; use codex_protocol::models::ShellToolCallParams; use codex_protocol::protocol::InitialHistory; +mod compact; + // A convenience extension trait for acquiring mutex locks where poisoning is // unrecoverable and should abort the program. This avoids scattered `.unwrap()` // calls on `lock()` while still surfacing a clear panic message when a lock is @@ -264,6 +265,7 @@ struct State { pending_input: Vec, history: ConversationHistory, token_info: Option, + next_internal_sub_id: u64, } /// Context for an initialized model agent @@ -534,6 +536,13 @@ impl Session { } } + fn next_internal_sub_id(&self) -> String { + let mut state = self.state.lock_unchecked(); + let id = state.next_internal_sub_id; + state.next_internal_sub_id += 1; + format!("auto-compact-{id}") + } + async fn record_initial_history( &self, turn_context: &TurnContext, @@ -707,6 +716,21 @@ impl Session { } } + fn update_token_usage_info( + &self, + turn_context: &TurnContext, + token_usage: &Option, + ) -> Option { + let mut state = self.state.lock_unchecked(); + let info = TokenUsageInfo::new_or_append( + &state.token_info, + token_usage, + turn_context.client.get_model_context_window(), + ); + state.token_info = info.clone(); + info + } + /// Record a user input item to conversation history and also persist a /// corresponding UserMessage EventMsg to rollout. async fn record_input_and_rollout_usermsg(&self, response_input: &ResponseInputItem) { @@ -1026,8 +1050,7 @@ impl AgentTask { let sess = sess.clone(); let sub_id = sub_id.clone(); let tc = Arc::clone(&turn_context); - tokio::spawn(async move { run_task(sess, tc.as_ref(), sub_id, input).await }) - .abort_handle() + tokio::spawn(async move { run_task(sess, tc, sub_id, input).await }).abort_handle() }; Self { sess, @@ -1048,7 +1071,7 @@ impl AgentTask { let sub_id = sub_id.clone(); let tc = Arc::clone(&turn_context); tokio::spawn(async move { - run_compact_task(sess, tc.as_ref(), sub_id, input, compact_instructions).await + compact::run_compact_task(sess, tc, sub_id, input, compact_instructions).await }) .abort_handle() }; @@ -1342,21 +1365,16 @@ async fn submission_loop( sess.send_event(event).await; } Op::Compact => { - // Create a summarization request as user input - const SUMMARIZATION_PROMPT: &str = include_str!("prompt_for_compact_command.md"); - // Attempt to inject input into current task if let Err(items) = sess.inject_input(vec![InputItem::Text { - text: "Start Summarization".to_string(), + text: compact::COMPACT_TRIGGER_TEXT.to_string(), }]) { - let task = AgentTask::compact( + compact::spawn_compact_task( sess.clone(), Arc::clone(&turn_context), sub.id, items, - SUMMARIZATION_PROMPT.to_string(), ); - sess.set_task(task); } } Op::Shutdown => { @@ -1435,7 +1453,7 @@ async fn submission_loop( /// conversation history and consider the task complete. async fn run_task( sess: Arc, - turn_context: &TurnContext, + turn_context: Arc, sub_id: String, input: Vec, ) { @@ -1458,6 +1476,7 @@ async fn run_task( // Although from the perspective of codex.rs, TurnDiffTracker has the lifecycle of a Task which contains // many turns, from the perspective of the user, it is a single turn. let mut turn_diff_tracker = TurnDiffTracker::new(); + let mut auto_compact_recently_attempted = false; loop { // Note that pending_input would be something like a message the user @@ -1492,7 +1511,7 @@ async fn run_task( .collect(); match run_turn( &sess, - turn_context, + turn_context.as_ref(), &mut turn_diff_tracker, sub_id.clone(), turn_input, @@ -1500,9 +1519,23 @@ async fn run_task( .await { Ok(turn_output) => { + let TurnRunResult { + processed_items, + total_token_usage, + } = turn_output; + let limit = turn_context + .client + .get_auto_compact_token_limit() + .unwrap_or(i64::MAX); + let total_usage_tokens = total_token_usage + .as_ref() + .map(|usage| usage.tokens_in_context_window()); + let token_limit_reached = total_usage_tokens + .map(|tokens| (tokens as i64) >= limit) + .unwrap_or(false); let mut items_to_record_in_conversation_history = Vec::::new(); let mut responses = Vec::::new(); - for processed_response_item in turn_output { + for processed_response_item in processed_items { let ProcessedResponseItem { item, response } = processed_response_item; match (&item, &response) { (ResponseItem::Message { role, .. }, None) if role == "assistant" => { @@ -1599,8 +1632,31 @@ async fn run_task( .await; } + if token_limit_reached { + if auto_compact_recently_attempted { + let limit_str = limit.to_string(); + let current_tokens = total_usage_tokens + .map(|tokens| tokens.to_string()) + .unwrap_or_else(|| "unknown".to_string()); + let event = Event { + id: sub_id.clone(), + msg: EventMsg::Error(ErrorEvent { + message: format!( + "Conversation is still above the token limit after automatic summarization (limit {limit_str}, current {current_tokens}). Please start a new session or trim your input." + ), + }), + }; + sess.send_event(event).await; + break; + } + auto_compact_recently_attempted = true; + compact::run_inline_auto_compact_task(sess.clone(), turn_context.clone()).await; + continue; + } + + auto_compact_recently_attempted = false; + if responses.is_empty() { - debug!("Turn completed"); last_agent_message = get_last_assistant_message_from_turn( &items_to_record_in_conversation_history, ); @@ -1611,6 +1667,7 @@ async fn run_task( }); break; } + continue; } Err(e) => { info!("Turn error: {e:#}"); @@ -1640,7 +1697,7 @@ async fn run_turn( turn_diff_tracker: &mut TurnDiffTracker, sub_id: String, input: Vec, -) -> CodexResult> { +) -> CodexResult { let tools = get_openai_tools( &turn_context.tools_config, Some(sess.mcp_connection_manager.list_all_tools()), @@ -1704,13 +1761,19 @@ struct ProcessedResponseItem { response: Option, } +#[derive(Debug)] +struct TurnRunResult { + processed_items: Vec, + total_token_usage: Option, +} + async fn try_run_turn( sess: &Session, turn_context: &TurnContext, turn_diff_tracker: &mut TurnDiffTracker, sub_id: &str, prompt: &Prompt, -) -> CodexResult> { +) -> CodexResult { // call_ids that are part of this response. let completed_call_ids = prompt .input @@ -1828,16 +1891,7 @@ async fn try_run_turn( response_id: _, token_usage, } => { - let info = { - let mut st = sess.state.lock_unchecked(); - let info = TokenUsageInfo::new_or_append( - &st.token_info, - &token_usage, - turn_context.client.get_model_context_window(), - ); - st.token_info = info.clone(); - info - }; + let info = sess.update_token_usage_info(turn_context, &token_usage); let _ = sess .send_event(Event { id: sub_id.to_string(), @@ -1855,7 +1909,12 @@ async fn try_run_turn( sess.send_event(event).await; } - return Ok(output); + let result = TurnRunResult { + processed_items: output, + total_token_usage: token_usage.clone(), + }; + + return Ok(result); } ResponseEvent::OutputTextDelta(delta) => { let event = Event { @@ -1893,95 +1952,6 @@ async fn try_run_turn( } } -async fn run_compact_task( - sess: Arc, - turn_context: &TurnContext, - sub_id: String, - input: Vec, - compact_instructions: String, -) { - let model_context_window = turn_context.client.get_model_context_window(); - let start_event = Event { - id: sub_id.clone(), - msg: EventMsg::TaskStarted(TaskStartedEvent { - model_context_window, - }), - }; - sess.send_event(start_event).await; - - let initial_input_for_turn: ResponseInputItem = ResponseInputItem::from(input); - let turn_input: Vec = - sess.turn_input_with_history(vec![initial_input_for_turn.clone().into()]); - - let prompt = Prompt { - input: turn_input, - tools: Vec::new(), - base_instructions_override: Some(compact_instructions.clone()), - }; - - let max_retries = turn_context.client.get_provider().stream_max_retries(); - let mut retries = 0; - - loop { - let attempt_result = drain_to_completed(&sess, turn_context, &sub_id, &prompt).await; - - match attempt_result { - Ok(()) => break, - Err(CodexErr::Interrupted) => return, - Err(e) => { - if retries < max_retries { - retries += 1; - let delay = backoff(retries); - sess.notify_stream_error( - &sub_id, - format!( - "stream error: {e}; retrying {retries}/{max_retries} in {delay:?}…" - ), - ) - .await; - tokio::time::sleep(delay).await; - continue; - } else { - let event = Event { - id: sub_id.clone(), - msg: EventMsg::Error(ErrorEvent { - message: e.to_string(), - }), - }; - sess.send_event(event).await; - return; - } - } - } - } - - sess.remove_task(&sub_id); - - let rollout_item = { - let mut state = sess.state.lock_unchecked(); - state.history.keep_last_messages(1); - RolloutItem::Compacted(CompactedItem { - message: state.history.last_agent_message(), - }) - }; - sess.persist_rollout_items(&[rollout_item]).await; - - let event = Event { - id: sub_id.clone(), - msg: EventMsg::AgentMessage(AgentMessageEvent { - message: "Compact task completed".to_string(), - }), - }; - sess.send_event(event).await; - let event = Event { - id: sub_id.clone(), - msg: EventMsg::TaskComplete(TaskCompleteEvent { - last_agent_message: None, - }), - }; - sess.send_event(event).await; -} - async fn handle_response_item( sess: &Session, turn_context: &TurnContext, @@ -2964,7 +2934,7 @@ fn format_exec_output(exec_output: &ExecToolCallOutput) -> String { serde_json::to_string(&payload).expect("serialize ExecOutput") } -fn get_last_assistant_message_from_turn(responses: &[ResponseItem]) -> Option { +pub(super) fn get_last_assistant_message_from_turn(responses: &[ResponseItem]) -> Option { responses.iter().rev().find_map(|item| { if let ResponseItem::Message { role, content, .. } = item { if role == "assistant" { @@ -2983,68 +2953,6 @@ fn get_last_assistant_message_from_turn(responses: &[ResponseItem]) -> Option CodexResult<()> { - let rollout_item = RolloutItem::TurnContext(TurnContextItem { - cwd: turn_context.cwd.clone(), - approval_policy: turn_context.approval_policy, - sandbox_policy: turn_context.sandbox_policy.clone(), - model: turn_context.client.get_model(), - effort: turn_context.client.get_reasoning_effort(), - summary: turn_context.client.get_reasoning_summary(), - }); - sess.persist_rollout_items(&[rollout_item]).await; - let mut stream = turn_context.client.clone().stream(prompt).await?; - loop { - let maybe_event = stream.next().await; - let Some(event) = maybe_event else { - return Err(CodexErr::Stream( - "stream closed before response.completed".into(), - None, - )); - }; - match event { - Ok(ResponseEvent::OutputItemDone(item)) => { - // Record only to in-memory conversation history; avoid state snapshot. - let mut state = sess.state.lock_unchecked(); - state.history.record_items(std::slice::from_ref(&item)); - } - Ok(ResponseEvent::Completed { - response_id: _, - token_usage, - }) => { - let info = { - let mut st = sess.state.lock_unchecked(); - let info = TokenUsageInfo::new_or_append( - &st.token_info, - &token_usage, - turn_context.client.get_model_context_window(), - ); - st.token_info = info.clone(); - info - }; - - sess.tx_event - .send(Event { - id: sub_id.to_string(), - msg: EventMsg::TokenCount(crate::protocol::TokenCountEvent { info }), - }) - .await - .ok(); - - return Ok(()); - } - Ok(_) => continue, - Err(e) => return Err(e), - } - } -} - fn convert_call_tool_result_to_function_call_output_payload( call_tool_result: &CallToolResult, ) -> FunctionCallOutputPayload { diff --git a/codex-rs/core/src/codex/compact.rs b/codex-rs/core/src/codex/compact.rs new file mode 100644 index 0000000000..757cf2e049 --- /dev/null +++ b/codex-rs/core/src/codex/compact.rs @@ -0,0 +1,401 @@ +use std::sync::Arc; + +use super::AgentTask; +use super::MutexExt; +use super::Session; +use super::TurnContext; +use super::get_last_assistant_message_from_turn; +use crate::Prompt; +use crate::client_common::ResponseEvent; +use crate::error::CodexErr; +use crate::error::Result as CodexResult; +use crate::protocol::AgentMessageEvent; +use crate::protocol::CompactedItem; +use crate::protocol::ErrorEvent; +use crate::protocol::Event; +use crate::protocol::EventMsg; +use crate::protocol::InputItem; +use crate::protocol::InputMessageKind; +use crate::protocol::TaskCompleteEvent; +use crate::protocol::TaskStartedEvent; +use crate::protocol::TurnContextItem; +use crate::util::backoff; +use askama::Template; +use codex_protocol::models::ContentItem; +use codex_protocol::models::ResponseInputItem; +use codex_protocol::models::ResponseItem; +use codex_protocol::protocol::RolloutItem; +use futures::prelude::*; + +pub(super) const COMPACT_TRIGGER_TEXT: &str = "Start Summarization"; +const SUMMARIZATION_PROMPT: &str = include_str!("../../templates/compact/prompt.md"); + +#[derive(Template)] +#[template(path = "compact/history_bridge.md", escape = "none")] +struct HistoryBridgeTemplate<'a> { + user_messages_text: &'a str, + summary_text: &'a str, +} + +pub(super) fn spawn_compact_task( + sess: Arc, + turn_context: Arc, + sub_id: String, + input: Vec, +) { + let task = AgentTask::compact( + sess.clone(), + turn_context, + sub_id, + input, + SUMMARIZATION_PROMPT.to_string(), + ); + sess.set_task(task); +} + +pub(super) async fn run_inline_auto_compact_task( + sess: Arc, + turn_context: Arc, +) { + let sub_id = sess.next_internal_sub_id(); + let input = vec![InputItem::Text { + text: COMPACT_TRIGGER_TEXT.to_string(), + }]; + run_compact_task_inner( + sess, + turn_context, + sub_id, + input, + SUMMARIZATION_PROMPT.to_string(), + false, + ) + .await; +} + +pub(super) async fn run_compact_task( + sess: Arc, + turn_context: Arc, + sub_id: String, + input: Vec, + compact_instructions: String, +) { + run_compact_task_inner( + sess, + turn_context, + sub_id, + input, + compact_instructions, + true, + ) + .await; +} + +async fn run_compact_task_inner( + sess: Arc, + turn_context: Arc, + sub_id: String, + input: Vec, + compact_instructions: String, + remove_task_on_completion: bool, +) { + let model_context_window = turn_context.client.get_model_context_window(); + let start_event = Event { + id: sub_id.clone(), + msg: EventMsg::TaskStarted(TaskStartedEvent { + model_context_window, + }), + }; + sess.send_event(start_event).await; + + let initial_input_for_turn: ResponseInputItem = ResponseInputItem::from(input); + let instructions_override = compact_instructions; + let turn_input = sess.turn_input_with_history(vec![initial_input_for_turn.clone().into()]); + + let prompt = Prompt { + input: turn_input, + tools: Vec::new(), + base_instructions_override: Some(instructions_override), + }; + + let max_retries = turn_context.client.get_provider().stream_max_retries(); + let mut retries = 0; + + let rollout_item = RolloutItem::TurnContext(TurnContextItem { + cwd: turn_context.cwd.clone(), + approval_policy: turn_context.approval_policy, + sandbox_policy: turn_context.sandbox_policy.clone(), + model: turn_context.client.get_model(), + effort: turn_context.client.get_reasoning_effort(), + summary: turn_context.client.get_reasoning_summary(), + }); + sess.persist_rollout_items(&[rollout_item]).await; + + loop { + let attempt_result = drain_to_completed(&sess, turn_context.as_ref(), &prompt).await; + + match attempt_result { + Ok(()) => { + break; + } + Err(CodexErr::Interrupted) => { + return; + } + Err(e) => { + if retries < max_retries { + retries += 1; + let delay = backoff(retries); + sess.notify_stream_error( + &sub_id, + format!( + "stream error: {e}; retrying {retries}/{max_retries} in {delay:?}…" + ), + ) + .await; + tokio::time::sleep(delay).await; + continue; + } else { + let event = Event { + id: sub_id.clone(), + msg: EventMsg::Error(ErrorEvent { + message: e.to_string(), + }), + }; + sess.send_event(event).await; + return; + } + } + } + } + + if remove_task_on_completion { + sess.remove_task(&sub_id); + } + let history_snapshot = { + let state = sess.state.lock_unchecked(); + state.history.contents() + }; + let summary_text = get_last_assistant_message_from_turn(&history_snapshot).unwrap_or_default(); + let user_messages = collect_user_messages(&history_snapshot); + let new_history = + build_compacted_history(&sess, turn_context.as_ref(), &user_messages, &summary_text); + { + let mut state = sess.state.lock_unchecked(); + state.history.replace(new_history); + } + + let rollout_item = RolloutItem::Compacted(CompactedItem { + message: summary_text.clone(), + }); + sess.persist_rollout_items(&[rollout_item]).await; + + let event = Event { + id: sub_id.clone(), + msg: EventMsg::AgentMessage(AgentMessageEvent { + message: "Compact task completed".to_string(), + }), + }; + sess.send_event(event).await; + let event = Event { + id: sub_id.clone(), + msg: EventMsg::TaskComplete(TaskCompleteEvent { + last_agent_message: None, + }), + }; + sess.send_event(event).await; +} + +fn content_items_to_text(content: &[ContentItem]) -> Option { + let mut pieces = Vec::new(); + for item in content { + match item { + ContentItem::InputText { text } | ContentItem::OutputText { text } => { + if !text.is_empty() { + pieces.push(text.as_str()); + } + } + ContentItem::InputImage { .. } => {} + } + } + if pieces.is_empty() { + None + } else { + Some(pieces.join("\n")) + } +} + +fn collect_user_messages(items: &[ResponseItem]) -> Vec { + items + .iter() + .filter_map(|item| match item { + ResponseItem::Message { role, content, .. } if role == "user" => { + content_items_to_text(content) + } + _ => None, + }) + .filter(|text| !is_session_prefix_message(text)) + .collect() +} + +fn is_session_prefix_message(text: &str) -> bool { + matches!( + InputMessageKind::from(("user", text)), + InputMessageKind::UserInstructions | InputMessageKind::EnvironmentContext + ) +} + +fn build_compacted_history( + sess: &Session, + turn_context: &TurnContext, + user_messages: &[String], + summary_text: &str, +) -> Vec { + let mut history = sess.build_initial_context(turn_context); + let user_messages_text = if user_messages.is_empty() { + "(none)".to_string() + } else { + user_messages.join("\n\n") + }; + let summary_text = if summary_text.is_empty() { + "(no summary available)".to_string() + } else { + summary_text.to_string() + }; + let Ok(bridge) = HistoryBridgeTemplate { + user_messages_text: &user_messages_text, + summary_text: &summary_text, + } + .render() else { + return vec![]; + }; + history.push(ResponseItem::Message { + id: None, + role: "user".to_string(), + content: vec![ContentItem::InputText { text: bridge }], + }); + history +} + +async fn drain_to_completed( + sess: &Session, + turn_context: &TurnContext, + prompt: &Prompt, +) -> CodexResult<()> { + let mut stream = turn_context.client.clone().stream(prompt).await?; + loop { + let maybe_event = stream.next().await; + let Some(event) = maybe_event else { + return Err(CodexErr::Stream( + "stream closed before response.completed".into(), + None, + )); + }; + match event { + Ok(ResponseEvent::OutputItemDone(item)) => { + let mut state = sess.state.lock_unchecked(); + state.history.record_items(std::slice::from_ref(&item)); + } + Ok(ResponseEvent::Completed { .. }) => { + return Ok(()); + } + Ok(_) => continue, + Err(e) => return Err(e), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use pretty_assertions::assert_eq; + + #[test] + fn content_items_to_text_joins_non_empty_segments() { + let items = vec![ + ContentItem::InputText { + text: "hello".to_string(), + }, + ContentItem::OutputText { + text: String::new(), + }, + ContentItem::OutputText { + text: "world".to_string(), + }, + ]; + + let joined = content_items_to_text(&items); + + assert_eq!(Some("hello\nworld".to_string()), joined); + } + + #[test] + fn content_items_to_text_ignores_image_only_content() { + let items = vec![ContentItem::InputImage { + image_url: "file://image.png".to_string(), + }]; + + let joined = content_items_to_text(&items); + + assert_eq!(None, joined); + } + + #[test] + fn collect_user_messages_extracts_user_text_only() { + let items = vec![ + ResponseItem::Message { + id: Some("assistant".to_string()), + role: "assistant".to_string(), + content: vec![ContentItem::OutputText { + text: "ignored".to_string(), + }], + }, + ResponseItem::Message { + id: Some("user".to_string()), + role: "user".to_string(), + content: vec![ + ContentItem::InputText { + text: "first".to_string(), + }, + ContentItem::OutputText { + text: "second".to_string(), + }, + ], + }, + ResponseItem::Other, + ]; + + let collected = collect_user_messages(&items); + + assert_eq!(vec!["first\nsecond".to_string()], collected); + } + + #[test] + fn collect_user_messages_filters_session_prefix_entries() { + let items = vec![ + ResponseItem::Message { + id: None, + role: "user".to_string(), + content: vec![ContentItem::InputText { + text: "do things".to_string(), + }], + }, + ResponseItem::Message { + id: None, + role: "user".to_string(), + content: vec![ContentItem::InputText { + text: "cwd=/tmp".to_string(), + }], + }, + ResponseItem::Message { + id: None, + role: "user".to_string(), + content: vec![ContentItem::InputText { + text: "real user message".to_string(), + }], + }, + ]; + + let collected = collect_user_messages(&items); + + assert_eq!(vec!["real user message".to_string()], collected); + } +} diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index 443c92a81c..8be93f76ba 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -55,6 +55,9 @@ pub struct Config { /// Maximum number of output tokens. pub model_max_output_tokens: Option, + /// Token usage threshold triggering auto-compaction of conversation history. + pub model_auto_compact_token_limit: Option, + /// Key into the model_providers map that specifies which provider to use. pub model_provider_id: String, @@ -519,6 +522,9 @@ pub struct ConfigToml { /// Maximum number of output tokens. pub model_max_output_tokens: Option, + /// Token usage threshold triggering auto-compaction of conversation history. + pub model_auto_compact_token_limit: Option, + /// Default approval policy for executing commands. pub approval_policy: Option, @@ -877,6 +883,11 @@ impl Config { .as_ref() .map(|info| info.max_output_tokens) }); + let model_auto_compact_token_limit = cfg.model_auto_compact_token_limit.or_else(|| { + openai_model_info + .as_ref() + .and_then(|info| info.auto_compact_token_limit) + }); let experimental_resume = cfg.experimental_resume; @@ -896,6 +907,7 @@ impl Config { model_family, model_context_window, model_max_output_tokens, + model_auto_compact_token_limit, model_provider_id, model_provider, cwd: resolved_cwd, @@ -1430,6 +1442,7 @@ model_verbosity = "high" model_family: find_family_for_model("o3").expect("known model slug"), model_context_window: Some(200_000), model_max_output_tokens: Some(100_000), + model_auto_compact_token_limit: None, model_provider_id: "openai".to_string(), model_provider: fixture.openai_provider.clone(), approval_policy: AskForApproval::Never, @@ -1486,6 +1499,7 @@ model_verbosity = "high" model_family: find_family_for_model("gpt-3.5-turbo").expect("known model slug"), model_context_window: Some(16_385), model_max_output_tokens: Some(4_096), + model_auto_compact_token_limit: None, model_provider_id: "openai-chat-completions".to_string(), model_provider: fixture.openai_chat_completions_provider.clone(), approval_policy: AskForApproval::UnlessTrusted, @@ -1557,6 +1571,7 @@ model_verbosity = "high" model_family: find_family_for_model("o3").expect("known model slug"), model_context_window: Some(200_000), model_max_output_tokens: Some(100_000), + model_auto_compact_token_limit: None, model_provider_id: "openai".to_string(), model_provider: fixture.openai_provider.clone(), approval_policy: AskForApproval::OnFailure, @@ -1614,6 +1629,7 @@ model_verbosity = "high" model_family: find_family_for_model("gpt-5").expect("known model slug"), model_context_window: Some(272_000), model_max_output_tokens: Some(128_000), + model_auto_compact_token_limit: None, model_provider_id: "openai".to_string(), model_provider: fixture.openai_provider.clone(), approval_policy: AskForApproval::OnFailure, diff --git a/codex-rs/core/src/conversation_history.rs b/codex-rs/core/src/conversation_history.rs index 3cdbbb33c7..891a2ea472 100644 --- a/codex-rs/core/src/conversation_history.rs +++ b/codex-rs/core/src/conversation_history.rs @@ -1,4 +1,3 @@ -use codex_protocol::models::ContentItem; use codex_protocol::models::ResponseItem; /// Transcript of conversation history @@ -33,52 +32,8 @@ impl ConversationHistory { } } - pub(crate) fn keep_last_messages(&mut self, n: usize) { - if n == 0 { - self.items.clear(); - return; - } - - // Collect the last N message items (assistant/user), newest to oldest. - let mut kept: Vec = Vec::with_capacity(n); - for item in self.items.iter().rev() { - if let ResponseItem::Message { role, content, .. } = item { - kept.push(ResponseItem::Message { - // we need to remove the id or the model will complain that messages are sent without - // their reasonings - id: None, - role: role.clone(), - content: content.clone(), - }); - if kept.len() == n { - break; - } - } - } - - // Preserve chronological order (oldest to newest) within the kept slice. - kept.reverse(); - self.items = kept; - } - - pub(crate) fn last_agent_message(&self) -> String { - for item in self.items.iter().rev() { - if let ResponseItem::Message { role, content, .. } = item - && role == "assistant" - { - return content - .iter() - .find_map(|ci| { - if let ContentItem::OutputText { text } = ci { - Some(text.clone()) - } else { - None - } - }) - .unwrap_or_default(); - } - } - String::new() + pub(crate) fn replace(&mut self, items: Vec) { + self.items = items; } } diff --git a/codex-rs/core/src/openai_model_info.rs b/codex-rs/core/src/openai_model_info.rs index 2f81619c66..6fbe99fffc 100644 --- a/codex-rs/core/src/openai_model_info.rs +++ b/codex-rs/core/src/openai_model_info.rs @@ -12,6 +12,19 @@ pub(crate) struct ModelInfo { /// Maximum number of output tokens that can be generated for the model. pub(crate) max_output_tokens: u64, + + /// Token threshold where we should automatically compact conversation history. + pub(crate) auto_compact_token_limit: Option, +} + +impl ModelInfo { + const fn new(context_window: u64, max_output_tokens: u64) -> Self { + Self { + context_window, + max_output_tokens, + auto_compact_token_limit: None, + } + } } pub(crate) fn get_model_info(model_family: &ModelFamily) -> Option { @@ -20,73 +33,37 @@ pub(crate) fn get_model_info(model_family: &ModelFamily) -> Option { // OSS models have a 128k shared token pool. // Arbitrarily splitting it: 3/4 input context, 1/4 output. // https://openai.com/index/gpt-oss-model-card/ - "gpt-oss-20b" => Some(ModelInfo { - context_window: 96_000, - max_output_tokens: 32_000, - }), - "gpt-oss-120b" => Some(ModelInfo { - context_window: 96_000, - max_output_tokens: 32_000, - }), + "gpt-oss-20b" => Some(ModelInfo::new(96_000, 32_000)), + "gpt-oss-120b" => Some(ModelInfo::new(96_000, 32_000)), // https://platform.openai.com/docs/models/o3 - "o3" => Some(ModelInfo { - context_window: 200_000, - max_output_tokens: 100_000, - }), + "o3" => Some(ModelInfo::new(200_000, 100_000)), // https://platform.openai.com/docs/models/o4-mini - "o4-mini" => Some(ModelInfo { - context_window: 200_000, - max_output_tokens: 100_000, - }), + "o4-mini" => Some(ModelInfo::new(200_000, 100_000)), // https://platform.openai.com/docs/models/codex-mini-latest - "codex-mini-latest" => Some(ModelInfo { - context_window: 200_000, - max_output_tokens: 100_000, - }), + "codex-mini-latest" => Some(ModelInfo::new(200_000, 100_000)), // As of Jun 25, 2025, gpt-4.1 defaults to gpt-4.1-2025-04-14. // https://platform.openai.com/docs/models/gpt-4.1 - "gpt-4.1" | "gpt-4.1-2025-04-14" => Some(ModelInfo { - context_window: 1_047_576, - max_output_tokens: 32_768, - }), + "gpt-4.1" | "gpt-4.1-2025-04-14" => Some(ModelInfo::new(1_047_576, 32_768)), // As of Jun 25, 2025, gpt-4o defaults to gpt-4o-2024-08-06. // https://platform.openai.com/docs/models/gpt-4o - "gpt-4o" | "gpt-4o-2024-08-06" => Some(ModelInfo { - context_window: 128_000, - max_output_tokens: 16_384, - }), + "gpt-4o" | "gpt-4o-2024-08-06" => Some(ModelInfo::new(128_000, 16_384)), // https://platform.openai.com/docs/models/gpt-4o?snapshot=gpt-4o-2024-05-13 - "gpt-4o-2024-05-13" => Some(ModelInfo { - context_window: 128_000, - max_output_tokens: 4_096, - }), + "gpt-4o-2024-05-13" => Some(ModelInfo::new(128_000, 4_096)), // https://platform.openai.com/docs/models/gpt-4o?snapshot=gpt-4o-2024-11-20 - "gpt-4o-2024-11-20" => Some(ModelInfo { - context_window: 128_000, - max_output_tokens: 16_384, - }), + "gpt-4o-2024-11-20" => Some(ModelInfo::new(128_000, 16_384)), // https://platform.openai.com/docs/models/gpt-3.5-turbo - "gpt-3.5-turbo" => Some(ModelInfo { - context_window: 16_385, - max_output_tokens: 4_096, - }), + "gpt-3.5-turbo" => Some(ModelInfo::new(16_385, 4_096)), - _ if slug.starts_with("gpt-5") => Some(ModelInfo { - context_window: 272_000, - max_output_tokens: 128_000, - }), + _ if slug.starts_with("gpt-5") => Some(ModelInfo::new(272_000, 128_000)), - _ if slug.starts_with("codex-") => Some(ModelInfo { - context_window: 272_000, - max_output_tokens: 128_000, - }), + _ if slug.starts_with("codex-") => Some(ModelInfo::new(272_000, 128_000)), _ => None, } diff --git a/codex-rs/core/src/prompt_for_compact_command.md b/codex-rs/core/src/prompt_for_compact_command.md deleted file mode 100644 index 5cdecdbf4c..0000000000 --- a/codex-rs/core/src/prompt_for_compact_command.md +++ /dev/null @@ -1,21 +0,0 @@ -You are a summarization assistant. A conversation follows between a user and a coding-focused AI (Codex). Your task is to generate a clear summary capturing: - -• High-level objective or problem being solved -• Key instructions or design decisions given by the user -• Main code actions or behaviors from the AI -• Important variables, functions, modules, or outputs discussed -• Any unresolved questions or next steps - -Produce the summary in a structured format like: - -**Objective:** … - -**User instructions:** … (bulleted) - -**AI actions / code behavior:** … (bulleted) - -**Important entities:** … (e.g. function names, variables, files) - -**Open issues / next steps:** … (if any) - -**Summary (concise):** (one or two sentences) diff --git a/codex-rs/core/src/unified_exec/mod.rs b/codex-rs/core/src/unified_exec/mod.rs index 2fe8661f0e..5d8efbe0bb 100644 --- a/codex-rs/core/src/unified_exec/mod.rs +++ b/codex-rs/core/src/unified_exec/mod.rs @@ -421,7 +421,7 @@ mod tests { .handle_request(UnifiedExecRequest { session_id: None, input_chunks: &["bash".to_string(), "-i".to_string()], - timeout_ms: Some(1_500), + timeout_ms: Some(2_500), }) .await?; let session_id = open_shell.session_id.expect("expected session_id"); @@ -441,7 +441,7 @@ mod tests { .handle_request(UnifiedExecRequest { session_id: Some(session_id), input_chunks: &["echo $CODEX_INTERACTIVE_SHELL_VAR\n".to_string()], - timeout_ms: Some(1_500), + timeout_ms: Some(2_500), }) .await?; assert!(out_2.output.contains("codex")); @@ -458,7 +458,7 @@ mod tests { .handle_request(UnifiedExecRequest { session_id: None, input_chunks: &["/bin/bash".to_string(), "-i".to_string()], - timeout_ms: Some(1_500), + timeout_ms: Some(2_500), }) .await?; let session_a = shell_a.session_id.expect("expected session id"); @@ -467,7 +467,7 @@ mod tests { .handle_request(UnifiedExecRequest { session_id: Some(session_a), input_chunks: &["export CODEX_INTERACTIVE_SHELL_VAR=codex\n".to_string()], - timeout_ms: Some(1_500), + timeout_ms: Some(2_500), }) .await?; @@ -478,7 +478,7 @@ mod tests { "echo".to_string(), "$CODEX_INTERACTIVE_SHELL_VAR\n".to_string(), ], - timeout_ms: Some(1_500), + timeout_ms: Some(2_500), }) .await?; assert!(!out_2.output.contains("codex")); @@ -487,7 +487,7 @@ mod tests { .handle_request(UnifiedExecRequest { session_id: Some(session_a), input_chunks: &["echo $CODEX_INTERACTIVE_SHELL_VAR\n".to_string()], - timeout_ms: Some(1_500), + timeout_ms: Some(2_500), }) .await?; assert!(out_3.output.contains("codex")); @@ -504,7 +504,7 @@ mod tests { .handle_request(UnifiedExecRequest { session_id: None, input_chunks: &["bash".to_string(), "-i".to_string()], - timeout_ms: Some(1_500), + timeout_ms: Some(2_500), }) .await?; let session_id = open_shell.session_id.expect("expected session id"); @@ -516,7 +516,7 @@ mod tests { "export".to_string(), "CODEX_INTERACTIVE_SHELL_VAR=codex\n".to_string(), ], - timeout_ms: Some(1_500), + timeout_ms: Some(2_500), }) .await?; @@ -574,7 +574,7 @@ mod tests { .handle_request(UnifiedExecRequest { session_id: None, input_chunks: &["/bin/echo".to_string(), "codex".to_string()], - timeout_ms: Some(1_500), + timeout_ms: Some(2_500), }) .await?; @@ -595,7 +595,7 @@ mod tests { .handle_request(UnifiedExecRequest { session_id: None, input_chunks: &["/bin/bash".to_string(), "-i".to_string()], - timeout_ms: Some(1_500), + timeout_ms: Some(2_500), }) .await?; let session_id = open_shell.session_id.expect("expected session id"); @@ -604,7 +604,7 @@ mod tests { .handle_request(UnifiedExecRequest { session_id: Some(session_id), input_chunks: &["exit\n".to_string()], - timeout_ms: Some(1_500), + timeout_ms: Some(2_500), }) .await?; diff --git a/codex-rs/core/templates/compact/history_bridge.md b/codex-rs/core/templates/compact/history_bridge.md new file mode 100644 index 0000000000..ef003440af --- /dev/null +++ b/codex-rs/core/templates/compact/history_bridge.md @@ -0,0 +1,7 @@ +You were originally given instructions from a user over one or more turns. Here were the user messages: + +{{ user_messages_text }} + +Another language model started to solve this problem and produced a summary of its thinking process. You also have access to the state of the tools that were used by that language model. Use this to build on the work that has already been done and avoid duplicating work. Here is the summary produced by the other language model, use the information in this summary to assist with your own analysis: + +{{ summary_text }} \ No newline at end of file diff --git a/codex-rs/core/templates/compact/prompt.md b/codex-rs/core/templates/compact/prompt.md new file mode 100644 index 0000000000..47dfeaba5e --- /dev/null +++ b/codex-rs/core/templates/compact/prompt.md @@ -0,0 +1,5 @@ +You have exceeded the maximum number of tokens, please stop coding and instead write a short memento message for the next agent. Your note should: +- Summarize what you finished and what still needs work. If there was a recent update_plan call, repeat its steps verbatim. +- List outstanding TODOs with file paths / line numbers so they're easy to find. +- Flag code that needs more tests (edge cases, performance, integration, etc.). +- Record any open bugs, quirks, or setup steps that will make it easier for the next agent to pick up where you left off. \ No newline at end of file diff --git a/codex-rs/core/tests/suite/compact.rs b/codex-rs/core/tests/suite/compact.rs index 524f819b3e..c61c4a5cde 100644 --- a/codex-rs/core/tests/suite/compact.rs +++ b/codex-rs/core/tests/suite/compact.rs @@ -5,6 +5,7 @@ use codex_core::ConversationManager; use codex_core::ModelProviderInfo; use codex_core::NewConversation; use codex_core::built_in_model_providers; +use codex_core::protocol::ErrorEvent; use codex_core::protocol::EventMsg; use codex_core::protocol::InputItem; use codex_core::protocol::Op; @@ -15,13 +16,20 @@ use core_test_support::load_default_config_for_test; use core_test_support::wait_for_event; use serde_json::Value; use tempfile::TempDir; +use wiremock::BodyPrintLimit; use wiremock::Mock; use wiremock::MockServer; +use wiremock::Request; +use wiremock::Respond; use wiremock::ResponseTemplate; use wiremock::matchers::method; use wiremock::matchers::path; use pretty_assertions::assert_eq; +use std::sync::Arc; +use std::sync::Mutex; +use std::sync::atomic::AtomicUsize; +use std::sync::atomic::Ordering; // --- Test helpers ----------------------------------------------------------- @@ -52,6 +60,22 @@ fn ev_completed(id: &str) -> Value { }) } +fn ev_completed_with_tokens(id: &str, total_tokens: u64) -> Value { + serde_json::json!({ + "type": "response.completed", + "response": { + "id": id, + "usage": { + "input_tokens": total_tokens, + "input_tokens_details": null, + "output_tokens": 0, + "output_tokens_details": null, + "total_tokens": total_tokens + } + } + }) +} + /// Convenience: SSE event for a single assistant message output item. fn ev_assistant_message(id: &str, text: &str) -> Value { serde_json::json!({ @@ -65,6 +89,18 @@ fn ev_assistant_message(id: &str, text: &str) -> Value { }) } +fn ev_function_call(call_id: &str, name: &str, arguments: &str) -> Value { + serde_json::json!({ + "type": "response.output_item.done", + "item": { + "type": "function_call", + "call_id": call_id, + "name": name, + "arguments": arguments + } + }) +} + fn sse_response(body: String) -> ResponseTemplate { ResponseTemplate::new(200) .insert_header("content-type", "text/event-stream") @@ -84,10 +120,28 @@ where .await; } +async fn start_mock_server() -> MockServer { + MockServer::builder() + .body_print_limit(BodyPrintLimit::Limited(80_000)) + .start() + .await +} + const FIRST_REPLY: &str = "FIRST_REPLY"; const SUMMARY_TEXT: &str = "SUMMARY_ONLY_CONTEXT"; const SUMMARIZE_TRIGGER: &str = "Start Summarization"; const THIRD_USER_MSG: &str = "next turn"; +const AUTO_SUMMARY_TEXT: &str = "AUTO_SUMMARY"; +const FIRST_AUTO_MSG: &str = "token limit start"; +const SECOND_AUTO_MSG: &str = "token limit push"; +const STILL_TOO_BIG_REPLY: &str = "STILL_TOO_BIG"; +const MULTI_AUTO_MSG: &str = "multi auto"; +const SECOND_LARGE_REPLY: &str = "SECOND_LARGE_REPLY"; +const FIRST_AUTO_SUMMARY: &str = "FIRST_AUTO_SUMMARY"; +const SECOND_AUTO_SUMMARY: &str = "SECOND_AUTO_SUMMARY"; +const FINAL_REPLY: &str = "FINAL_REPLY"; +const DUMMY_FUNCTION_NAME: &str = "unsupported_tool"; +const DUMMY_CALL_ID: &str = "call-multi-auto"; #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn summarize_context_three_requests_and_instructions() { @@ -99,7 +153,7 @@ async fn summarize_context_three_requests_and_instructions() { } // Set up a mock server that we can inspect after the run. - let server = MockServer::start().await; + let server = start_mock_server().await; // SSE 1: assistant replies normally so it is recorded in history. let sse1 = sse(vec![ @@ -144,6 +198,7 @@ async fn summarize_context_three_requests_and_instructions() { let home = TempDir::new().unwrap(); let mut config = load_default_config_for_test(&home); config.model_provider = model_provider; + config.model_auto_compact_token_limit = Some(200_000); let conversation_manager = ConversationManager::with_auth(CodexAuth::from_api_key("dummy")); let NewConversation { conversation: codex, @@ -198,7 +253,7 @@ async fn summarize_context_three_requests_and_instructions() { "summarization should override base instructions" ); assert!( - instr2.contains("You are a summarization assistant"), + instr2.contains("You have exceeded the maximum number of tokens"), "summarization instructions not applied" ); @@ -209,14 +264,17 @@ async fn summarize_context_three_requests_and_instructions() { assert_eq!(last2.get("type").unwrap().as_str().unwrap(), "message"); assert_eq!(last2.get("role").unwrap().as_str().unwrap(), "user"); let text2 = last2["content"][0]["text"].as_str().unwrap(); - assert!(text2.contains(SUMMARIZE_TRIGGER)); + assert!( + text2.contains(SUMMARIZE_TRIGGER), + "expected summarize trigger, got `{text2}`" + ); - // Third request must contain only the summary from step 2 as prior history plus new user msg. + // Third request must contain the refreshed instructions, bridge summary message and new user msg. let input3 = body3.get("input").and_then(|v| v.as_array()).unwrap(); println!("third request body: {body3}"); assert!( - input3.len() >= 2, - "expected summary + new user message in third request" + input3.len() >= 3, + "expected refreshed context and new user message in third request" ); // Collect all (role, text) message tuples. @@ -232,24 +290,35 @@ async fn summarize_context_three_requests_and_instructions() { } } - // Exactly one assistant message should remain after compaction and the new user message is present. + // No previous assistant messages should remain and the new user message is present. let assistant_count = messages.iter().filter(|(r, _)| r == "assistant").count(); - assert_eq!( - assistant_count, 1, - "exactly one assistant message should remain after compaction" - ); + assert_eq!(assistant_count, 0, "assistant history should be cleared"); assert!( messages .iter() .any(|(r, t)| r == "user" && t == THIRD_USER_MSG), "third request should include the new user message" ); + let Some((_, bridge_text)) = messages.iter().find(|(role, text)| { + role == "user" + && (text.contains("Here were the user messages") + || text.contains("Here are all the user messages")) + && text.contains(SUMMARY_TEXT) + }) else { + panic!("expected a bridge message containing the summary"); + }; assert!( - !messages.iter().any(|(_, t)| t.contains("hello world")), - "third request should not include the original user input" + bridge_text.contains("hello world"), + "bridge should capture earlier user messages" ); assert!( - !messages.iter().any(|(_, t)| t.contains(SUMMARIZE_TRIGGER)), + !bridge_text.contains(SUMMARIZE_TRIGGER), + "bridge text should not echo the summarize trigger" + ); + assert!( + !messages + .iter() + .any(|(_, text)| text.contains(SUMMARIZE_TRIGGER)), "third request should not include the summarize trigger" ); @@ -258,6 +327,7 @@ async fn summarize_context_three_requests_and_instructions() { wait_for_event(&codex, |ev| matches!(ev, EventMsg::ShutdownComplete)).await; // Verify rollout contains APITurn entries for each API call and a Compacted entry. + println!("rollout path: {}", rollout_path.display()); let text = std::fs::read_to_string(&rollout_path).unwrap_or_else(|e| { panic!( "failed to read rollout file {}: {e}", @@ -296,3 +366,506 @@ async fn summarize_context_three_requests_and_instructions() { "expected a Compacted entry containing the summarizer output" ); } + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn auto_compact_runs_after_token_limit_hit() { + if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { + println!( + "Skipping test because it cannot execute when network is disabled in a Codex sandbox." + ); + return; + } + + let server = start_mock_server().await; + + let sse1 = sse(vec![ + ev_assistant_message("m1", FIRST_REPLY), + ev_completed_with_tokens("r1", 70_000), + ]); + + let sse2 = sse(vec![ + ev_assistant_message("m2", "SECOND_REPLY"), + ev_completed_with_tokens("r2", 330_000), + ]); + + let sse3 = sse(vec![ + ev_assistant_message("m3", AUTO_SUMMARY_TEXT), + ev_completed_with_tokens("r3", 200), + ]); + + let first_matcher = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains(FIRST_AUTO_MSG) + && !body.contains(SECOND_AUTO_MSG) + && !body.contains("You have exceeded the maximum number of tokens") + }; + Mock::given(method("POST")) + .and(path("/v1/responses")) + .and(first_matcher) + .respond_with(sse_response(sse1)) + .mount(&server) + .await; + + let second_matcher = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains(SECOND_AUTO_MSG) + && body.contains(FIRST_AUTO_MSG) + && !body.contains("You have exceeded the maximum number of tokens") + }; + Mock::given(method("POST")) + .and(path("/v1/responses")) + .and(second_matcher) + .respond_with(sse_response(sse2)) + .mount(&server) + .await; + + let third_matcher = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains("You have exceeded the maximum number of tokens") + }; + Mock::given(method("POST")) + .and(path("/v1/responses")) + .and(third_matcher) + .respond_with(sse_response(sse3)) + .mount(&server) + .await; + + let model_provider = ModelProviderInfo { + base_url: Some(format!("{}/v1", server.uri())), + ..built_in_model_providers()["openai"].clone() + }; + + let home = TempDir::new().unwrap(); + let mut config = load_default_config_for_test(&home); + config.model_provider = model_provider; + config.model_auto_compact_token_limit = Some(200_000); + let conversation_manager = ConversationManager::with_auth(CodexAuth::from_api_key("dummy")); + let codex = conversation_manager + .new_conversation(config) + .await + .unwrap() + .conversation; + + codex + .submit(Op::UserInput { + items: vec![InputItem::Text { + text: FIRST_AUTO_MSG.into(), + }], + }) + .await + .unwrap(); + wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; + + codex + .submit(Op::UserInput { + items: vec![InputItem::Text { + text: SECOND_AUTO_MSG.into(), + }], + }) + .await + .unwrap(); + wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; + // wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; + + let requests = server.received_requests().await.unwrap(); + assert_eq!(requests.len(), 3, "auto compact should add a third request"); + + let body3 = requests[2].body_json::().unwrap(); + let instructions = body3 + .get("instructions") + .and_then(|v| v.as_str()) + .unwrap_or_default(); + assert!( + instructions.contains("You have exceeded the maximum number of tokens"), + "auto compact should reuse summarization instructions" + ); +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn auto_compact_persists_rollout_entries() { + if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { + println!( + "Skipping test because it cannot execute when network is disabled in a Codex sandbox." + ); + return; + } + + let server = start_mock_server().await; + + let sse1 = sse(vec![ + ev_assistant_message("m1", FIRST_REPLY), + ev_completed_with_tokens("r1", 70_000), + ]); + + let sse2 = sse(vec![ + ev_assistant_message("m2", "SECOND_REPLY"), + ev_completed_with_tokens("r2", 330_000), + ]); + + let sse3 = sse(vec![ + ev_assistant_message("m3", AUTO_SUMMARY_TEXT), + ev_completed_with_tokens("r3", 200), + ]); + + let first_matcher = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains(FIRST_AUTO_MSG) + && !body.contains(SECOND_AUTO_MSG) + && !body.contains("You have exceeded the maximum number of tokens") + }; + Mock::given(method("POST")) + .and(path("/v1/responses")) + .and(first_matcher) + .respond_with(sse_response(sse1)) + .mount(&server) + .await; + + let second_matcher = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains(SECOND_AUTO_MSG) + && body.contains(FIRST_AUTO_MSG) + && !body.contains("You have exceeded the maximum number of tokens") + }; + Mock::given(method("POST")) + .and(path("/v1/responses")) + .and(second_matcher) + .respond_with(sse_response(sse2)) + .mount(&server) + .await; + + let third_matcher = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains("You have exceeded the maximum number of tokens") + }; + Mock::given(method("POST")) + .and(path("/v1/responses")) + .and(third_matcher) + .respond_with(sse_response(sse3)) + .mount(&server) + .await; + + let model_provider = ModelProviderInfo { + base_url: Some(format!("{}/v1", server.uri())), + ..built_in_model_providers()["openai"].clone() + }; + + let home = TempDir::new().unwrap(); + let mut config = load_default_config_for_test(&home); + config.model_provider = model_provider; + let conversation_manager = ConversationManager::with_auth(CodexAuth::from_api_key("dummy")); + let NewConversation { + conversation: codex, + session_configured, + .. + } = conversation_manager.new_conversation(config).await.unwrap(); + + codex + .submit(Op::UserInput { + items: vec![InputItem::Text { + text: FIRST_AUTO_MSG.into(), + }], + }) + .await + .unwrap(); + wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; + + codex + .submit(Op::UserInput { + items: vec![InputItem::Text { + text: SECOND_AUTO_MSG.into(), + }], + }) + .await + .unwrap(); + wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; + + codex.submit(Op::Shutdown).await.unwrap(); + wait_for_event(&codex, |ev| matches!(ev, EventMsg::ShutdownComplete)).await; + + let rollout_path = session_configured.rollout_path; + let text = std::fs::read_to_string(&rollout_path).unwrap_or_else(|e| { + panic!( + "failed to read rollout file {}: {e}", + rollout_path.display() + ) + }); + + let mut turn_context_count = 0usize; + for line in text.lines() { + let trimmed = line.trim(); + if trimmed.is_empty() { + continue; + } + let Ok(entry): Result = serde_json::from_str(trimmed) else { + continue; + }; + match entry.item { + RolloutItem::TurnContext(_) => { + turn_context_count += 1; + } + RolloutItem::Compacted(_) => {} + _ => {} + } + } + + assert!( + turn_context_count >= 2, + "expected at least two turn context entries, got {turn_context_count}" + ); +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn auto_compact_stops_after_failed_attempt() { + if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { + println!( + "Skipping test because it cannot execute when network is disabled in a Codex sandbox." + ); + return; + } + + let server = start_mock_server().await; + + let sse1 = sse(vec![ + ev_assistant_message("m1", FIRST_REPLY), + ev_completed_with_tokens("r1", 500), + ]); + + let sse2 = sse(vec![ + ev_assistant_message("m2", SUMMARY_TEXT), + ev_completed_with_tokens("r2", 50), + ]); + + let sse3 = sse(vec![ + ev_assistant_message("m3", STILL_TOO_BIG_REPLY), + ev_completed_with_tokens("r3", 500), + ]); + + let first_matcher = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains(FIRST_AUTO_MSG) + && !body.contains("You have exceeded the maximum number of tokens") + }; + Mock::given(method("POST")) + .and(path("/v1/responses")) + .and(first_matcher) + .respond_with(sse_response(sse1.clone())) + .mount(&server) + .await; + + let second_matcher = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains("You have exceeded the maximum number of tokens") + }; + Mock::given(method("POST")) + .and(path("/v1/responses")) + .and(second_matcher) + .respond_with(sse_response(sse2.clone())) + .mount(&server) + .await; + + let third_matcher = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + !body.contains("You have exceeded the maximum number of tokens") + && body.contains(SUMMARY_TEXT) + }; + Mock::given(method("POST")) + .and(path("/v1/responses")) + .and(third_matcher) + .respond_with(sse_response(sse3.clone())) + .mount(&server) + .await; + + let model_provider = ModelProviderInfo { + base_url: Some(format!("{}/v1", server.uri())), + ..built_in_model_providers()["openai"].clone() + }; + + let home = TempDir::new().unwrap(); + let mut config = load_default_config_for_test(&home); + config.model_provider = model_provider; + config.model_auto_compact_token_limit = Some(200); + let conversation_manager = ConversationManager::with_auth(CodexAuth::from_api_key("dummy")); + let codex = conversation_manager + .new_conversation(config) + .await + .unwrap() + .conversation; + + codex + .submit(Op::UserInput { + items: vec![InputItem::Text { + text: FIRST_AUTO_MSG.into(), + }], + }) + .await + .unwrap(); + + let error_event = wait_for_event(&codex, |ev| matches!(ev, EventMsg::Error(_))).await; + let EventMsg::Error(ErrorEvent { message }) = error_event else { + panic!("expected error event"); + }; + assert!( + message.contains("limit"), + "error message should include limit information: {message}" + ); + wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; + + let requests = server.received_requests().await.unwrap(); + assert_eq!( + requests.len(), + 3, + "auto compact should attempt at most one summarization before erroring" + ); + + let last_body = requests[2].body_json::().unwrap(); + let instructions = last_body + .get("instructions") + .and_then(|v| v.as_str()) + .unwrap_or_default(); + assert!( + !instructions.contains("You have exceeded the maximum number of tokens"), + "third request should be the follow-up turn, not another summarization" + ); +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn auto_compact_allows_multiple_attempts_when_interleaved_with_other_turn_events() { + if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { + println!( + "Skipping test because it cannot execute when network is disabled in a Codex sandbox." + ); + return; + } + + let server = start_mock_server().await; + + let sse1 = sse(vec![ + ev_assistant_message("m1", FIRST_REPLY), + ev_completed_with_tokens("r1", 500), + ]); + let sse2 = sse(vec![ + ev_assistant_message("m2", FIRST_AUTO_SUMMARY), + ev_completed_with_tokens("r2", 50), + ]); + let sse3 = sse(vec![ + ev_function_call(DUMMY_CALL_ID, DUMMY_FUNCTION_NAME, "{}"), + ev_completed_with_tokens("r3", 150), + ]); + let sse4 = sse(vec![ + ev_assistant_message("m4", SECOND_LARGE_REPLY), + ev_completed_with_tokens("r4", 450), + ]); + let sse5 = sse(vec![ + ev_assistant_message("m5", SECOND_AUTO_SUMMARY), + ev_completed_with_tokens("r5", 60), + ]); + let sse6 = sse(vec![ + ev_assistant_message("m6", FINAL_REPLY), + ev_completed_with_tokens("r6", 120), + ]); + + #[derive(Clone)] + struct SeqResponder { + bodies: Arc>, + calls: Arc, + requests: Arc>>>, + } + + impl SeqResponder { + fn new(bodies: Vec) -> Self { + Self { + bodies: Arc::new(bodies), + calls: Arc::new(AtomicUsize::new(0)), + requests: Arc::new(Mutex::new(Vec::new())), + } + } + + fn recorded_requests(&self) -> Vec> { + self.requests.lock().unwrap().clone() + } + } + + impl Respond for SeqResponder { + fn respond(&self, req: &Request) -> ResponseTemplate { + let idx = self.calls.fetch_add(1, Ordering::SeqCst); + self.requests.lock().unwrap().push(req.body.clone()); + let body = self + .bodies + .get(idx) + .unwrap_or_else(|| panic!("unexpected request index {idx}")) + .clone(); + ResponseTemplate::new(200) + .insert_header("content-type", "text/event-stream") + .set_body_raw(body, "text/event-stream") + } + } + + let responder = SeqResponder::new(vec![sse1, sse2, sse3, sse4, sse5, sse6]); + Mock::given(method("POST")) + .and(path("/v1/responses")) + .respond_with(responder.clone()) + .expect(6) + .mount(&server) + .await; + + let model_provider = ModelProviderInfo { + base_url: Some(format!("{}/v1", server.uri())), + ..built_in_model_providers()["openai"].clone() + }; + + let home = TempDir::new().unwrap(); + let mut config = load_default_config_for_test(&home); + config.model_provider = model_provider; + config.model_auto_compact_token_limit = Some(200); + let conversation_manager = ConversationManager::with_auth(CodexAuth::from_api_key("dummy")); + let codex = conversation_manager + .new_conversation(config) + .await + .unwrap() + .conversation; + + codex + .submit(Op::UserInput { + items: vec![InputItem::Text { + text: MULTI_AUTO_MSG.into(), + }], + }) + .await + .unwrap(); + + loop { + let event = codex.next_event().await.unwrap(); + if let EventMsg::TaskComplete(_) = &event.msg + && !event.id.starts_with("auto-compact-") + { + break; + } + } + + let request_bodies: Vec = responder + .recorded_requests() + .into_iter() + .map(|body| String::from_utf8(body).unwrap_or_default()) + .collect(); + assert_eq!( + request_bodies.len(), + 6, + "expected six requests including two auto compactions" + ); + assert!( + request_bodies[0].contains(MULTI_AUTO_MSG), + "first request should contain the user input" + ); + assert!( + request_bodies[1].contains("You have exceeded the maximum number of tokens"), + "first auto compact request should use summarization instructions" + ); + assert!( + request_bodies[3].contains(&format!("unsupported call: {DUMMY_FUNCTION_NAME}")), + "function call output should be sent before the second auto compact" + ); + assert!( + request_bodies[4].contains("You have exceeded the maximum number of tokens"), + "second auto compact request should reuse summarization instructions" + ); +} diff --git a/codex-rs/protocol/src/protocol.rs b/codex-rs/protocol/src/protocol.rs index 3ae8ffef5b..f888accfd5 100644 --- a/codex-rs/protocol/src/protocol.rs +++ b/codex-rs/protocol/src/protocol.rs @@ -712,12 +712,12 @@ where let (_role, message) = value; let message = message.as_ref(); let trimmed = message.trim(); - if trimmed.starts_with(ENVIRONMENT_CONTEXT_OPEN_TAG) - && trimmed.ends_with(ENVIRONMENT_CONTEXT_CLOSE_TAG) + if starts_with_ignore_ascii_case(trimmed, ENVIRONMENT_CONTEXT_OPEN_TAG) + && ends_with_ignore_ascii_case(trimmed, ENVIRONMENT_CONTEXT_CLOSE_TAG) { InputMessageKind::EnvironmentContext - } else if trimmed.starts_with(USER_INSTRUCTIONS_OPEN_TAG) - && trimmed.ends_with(USER_INSTRUCTIONS_CLOSE_TAG) + } else if starts_with_ignore_ascii_case(trimmed, USER_INSTRUCTIONS_OPEN_TAG) + && ends_with_ignore_ascii_case(trimmed, USER_INSTRUCTIONS_CLOSE_TAG) { InputMessageKind::UserInstructions } else { @@ -726,6 +726,26 @@ where } } +fn starts_with_ignore_ascii_case(text: &str, prefix: &str) -> bool { + let text_bytes = text.as_bytes(); + let prefix_bytes = prefix.as_bytes(); + text_bytes.len() >= prefix_bytes.len() + && text_bytes + .iter() + .zip(prefix_bytes.iter()) + .all(|(a, b)| a.eq_ignore_ascii_case(b)) +} + +fn ends_with_ignore_ascii_case(text: &str, suffix: &str) -> bool { + let text_bytes = text.as_bytes(); + let suffix_bytes = suffix.as_bytes(); + text_bytes.len() >= suffix_bytes.len() + && text_bytes[text_bytes.len() - suffix_bytes.len()..] + .iter() + .zip(suffix_bytes.iter()) + .all(|(a, b)| a.eq_ignore_ascii_case(b)) +} + #[derive(Debug, Clone, Deserialize, Serialize, TS)] pub struct AgentMessageDeltaEvent { pub delta: String, From a2e9cc5530b484e18e8594d0cca1be41baf9275c Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Fri, 12 Sep 2025 16:17:02 -0400 Subject: [PATCH 11/77] Update interruption error message styling (#3470) image image --- codex-rs/tui/src/chatwidget.rs | 4 +++- ...s__disabled_slash_command_while_task_running_snapshot.snap | 2 +- codex-rs/tui/src/history_cell.rs | 3 +-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index f47467e4c1..5f0eac0564 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -289,7 +289,9 @@ impl ChatWidget { /// separated by newlines rather than auto‑submitting the next one. fn on_interrupted_turn(&mut self) { // Finalize, log a gentle prompt, and clear running state. - self.finalize_turn_with_error_message("Tell the model what to do differently".to_owned()); + self.finalize_turn_with_error_message( + "Conversation interrupted - tell the model what to do differently".to_owned(), + ); // If any messages were queued during the task, restore them into the composer. if !self.queued_user_messages.is_empty() { diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__disabled_slash_command_while_task_running_snapshot.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__disabled_slash_command_while_task_running_snapshot.snap index 52b6807b4d..e8f08a437a 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__disabled_slash_command_while_task_running_snapshot.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__disabled_slash_command_while_task_running_snapshot.snap @@ -2,4 +2,4 @@ source: tui/src/chatwidget/tests.rs expression: blob --- -🖐  '/model' is disabled while a task is in progress. +■ '/model' is disabled while a task is in progress. diff --git a/codex-rs/tui/src/history_cell.rs b/codex-rs/tui/src/history_cell.rs index 42a79d60c5..e85e0fb1ee 100644 --- a/codex-rs/tui/src/history_cell.rs +++ b/codex-rs/tui/src/history_cell.rs @@ -1063,8 +1063,7 @@ pub(crate) fn new_error_event(message: String) -> PlainHistoryCell { // Use a hair space (U+200A) to create a subtle, near-invisible separation // before the text. VS16 is intentionally omitted to keep spacing tighter // in terminals like Ghostty. - let lines: Vec> = - vec![vec![padded_emoji("🖐").red().bold(), " ".into(), message.into()].into()]; + let lines: Vec> = vec![vec![format!("■ {message}").red()].into()]; PlainHistoryCell { lines } } From 5f6e95b592a923c00334f7688af1a0ea9fcbe2bf Mon Sep 17 00:00:00 2001 From: Jeremy Rose <172423086+nornagon-openai@users.noreply.github.com> Date: Fri, 12 Sep 2025 13:47:41 -0700 Subject: [PATCH 12/77] if a command parses as a patch, do not attempt to run it (#3382) sometimes the model forgets to actually invoke `apply_patch` and puts a patch as the script body. trying to execute this as bash sometimes creates files named `,` or `{` or does other unknown things, so catch this situation and return an error to the model. --- codex-rs/apply-patch/src/lib.rs | 49 +++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/codex-rs/apply-patch/src/lib.rs b/codex-rs/apply-patch/src/lib.rs index de22173c26..5bda31c4c2 100644 --- a/codex-rs/apply-patch/src/lib.rs +++ b/codex-rs/apply-patch/src/lib.rs @@ -40,6 +40,11 @@ pub enum ApplyPatchError { /// Error that occurs while computing replacements when applying patch chunks #[error("{0}")] ComputeReplacements(String), + /// A raw patch body was provided without an explicit `apply_patch` invocation. + #[error( + "patch detected without explicit call to apply_patch. Rerun as [\"apply_patch\", \"\"]" + )] + ImplicitInvocation, } impl From for ApplyPatchError { @@ -93,10 +98,12 @@ pub struct ApplyPatchArgs { pub fn maybe_parse_apply_patch(argv: &[String]) -> MaybeApplyPatch { match argv { + // Direct invocation: apply_patch [cmd, body] if APPLY_PATCH_COMMANDS.contains(&cmd.as_str()) => match parse_patch(body) { Ok(source) => MaybeApplyPatch::Body(source), Err(e) => MaybeApplyPatch::PatchParseError(e), }, + // Bash heredoc form: (optional `cd &&`) apply_patch <<'EOF' ... [bash, flag, script] if bash == "bash" && flag == "-lc" => { match extract_apply_patch_from_bash(script) { Ok((body, workdir)) => match parse_patch(&body) { @@ -207,6 +214,26 @@ impl ApplyPatchAction { /// cwd must be an absolute path so that we can resolve relative paths in the /// patch. pub fn maybe_parse_apply_patch_verified(argv: &[String], cwd: &Path) -> MaybeApplyPatchVerified { + // Detect a raw patch body passed directly as the command or as the body of a bash -lc + // script. In these cases, report an explicit error rather than applying the patch. + match argv { + [body] => { + if parse_patch(body).is_ok() { + return MaybeApplyPatchVerified::CorrectnessError( + ApplyPatchError::ImplicitInvocation, + ); + } + } + [bash, flag, script] if bash == "bash" && flag == "-lc" => { + if parse_patch(script).is_ok() { + return MaybeApplyPatchVerified::CorrectnessError( + ApplyPatchError::ImplicitInvocation, + ); + } + } + _ => {} + } + match maybe_parse_apply_patch(argv) { MaybeApplyPatch::Body(ApplyPatchArgs { patch, @@ -875,6 +902,28 @@ mod tests { )); } + #[test] + fn test_implicit_patch_single_arg_is_error() { + let patch = "*** Begin Patch\n*** Add File: foo\n+hi\n*** End Patch".to_string(); + let args = vec![patch]; + let dir = tempdir().unwrap(); + assert!(matches!( + maybe_parse_apply_patch_verified(&args, dir.path()), + MaybeApplyPatchVerified::CorrectnessError(ApplyPatchError::ImplicitInvocation) + )); + } + + #[test] + fn test_implicit_patch_bash_script_is_error() { + let script = "*** Begin Patch\n*** Add File: foo\n+hi\n*** End Patch"; + let args = args_bash(script); + let dir = tempdir().unwrap(); + assert!(matches!( + maybe_parse_apply_patch_verified(&args, dir.path()), + MaybeApplyPatchVerified::CorrectnessError(ApplyPatchError::ImplicitInvocation) + )); + } + #[test] fn test_literal() { let args = strs_to_strings(&[ From e3c6903199e47c9b6263223db9f5e83de483db69 Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Fri, 12 Sep 2025 13:52:15 -0700 Subject: [PATCH 13/77] Add Azure Responses API workaround (#3528) Azure Responses API doesn't work well with store:false and response items. If store = false and id is sent an error is thrown that ID is not found If store = false and id is not sent an error is thrown that ID is required Add detection for Azure urls and add a workaround to preserve reasoning item IDs and send store:true --- codex-rs/core/src/client.rs | 42 ++++++++- codex-rs/core/src/model_provider_info.rs | 92 +++++++++++++++++++ codex-rs/core/tests/suite/client.rs | 108 +++++++++++++++++++++++ 3 files changed, 239 insertions(+), 3 deletions(-) diff --git a/codex-rs/core/src/client.rs b/codex-rs/core/src/client.rs index dab1bf6831..6bea3820e8 100644 --- a/codex-rs/core/src/client.rs +++ b/codex-rs/core/src/client.rs @@ -193,6 +193,15 @@ impl ModelClient { None }; + // In general, we want to explicitly send `store: false` when using the Responses API, + // but in practice, the Azure Responses API rejects `store: false`: + // + // - If store = false and id is sent an error is thrown that ID is not found + // - If store = false and id is not sent an error is thrown that ID is required + // + // For Azure, we send `store: true` and preserve reasoning item IDs. + let azure_workaround = self.provider.is_azure_responses_endpoint(); + let payload = ResponsesApiRequest { model: &self.config.model, instructions: &full_instructions, @@ -201,13 +210,19 @@ impl ModelClient { tool_choice: "auto", parallel_tool_calls: false, reasoning, - store: false, + store: azure_workaround, stream: true, include, prompt_cache_key: Some(self.conversation_id.to_string()), text, }; + let mut payload_json = serde_json::to_value(&payload)?; + if azure_workaround { + attach_item_ids(&mut payload_json, &input_with_instructions); + } + let payload_body = serde_json::to_string(&payload_json)?; + let mut attempt = 0; let max_retries = self.provider.request_max_retries(); @@ -220,7 +235,7 @@ impl ModelClient { trace!( "POST to {}: {}", self.provider.get_full_url(&auth), - serde_json::to_string(&payload)? + payload_body.as_str() ); let mut req_builder = self @@ -234,7 +249,7 @@ impl ModelClient { .header("conversation_id", self.conversation_id.to_string()) .header("session_id", self.conversation_id.to_string()) .header(reqwest::header::ACCEPT, "text/event-stream") - .json(&payload); + .json(&payload_json); if let Some(auth) = auth.as_ref() && auth.mode == AuthMode::ChatGPT @@ -431,6 +446,27 @@ struct ResponseCompletedOutputTokensDetails { reasoning_tokens: u64, } +fn attach_item_ids(payload_json: &mut Value, original_items: &[ResponseItem]) { + let Some(input_value) = payload_json.get_mut("input") else { + return; + }; + let serde_json::Value::Array(items) = input_value else { + return; + }; + + for (value, item) in items.iter_mut().zip(original_items.iter()) { + if let ResponseItem::Reasoning { id, .. } = item { + if id.is_empty() { + continue; + } + + if let Some(obj) = value.as_object_mut() { + obj.insert("id".to_string(), Value::String(id.clone())); + } + } + } +} + async fn process_sse( stream: S, tx_event: mpsc::Sender>, diff --git a/codex-rs/core/src/model_provider_info.rs b/codex-rs/core/src/model_provider_info.rs index 7fca131cd8..2850996dcf 100644 --- a/codex-rs/core/src/model_provider_info.rs +++ b/codex-rs/core/src/model_provider_info.rs @@ -162,6 +162,21 @@ impl ModelProviderInfo { } } + pub(crate) fn is_azure_responses_endpoint(&self) -> bool { + if self.wire_api != WireApi::Responses { + return false; + } + + if self.name.eq_ignore_ascii_case("azure") { + return true; + } + + self.base_url + .as_ref() + .map(|base| matches_azure_responses_base_url(base)) + .unwrap_or(false) + } + /// Apply provider-specific HTTP headers (both static and environment-based) /// onto an existing `reqwest::RequestBuilder` and return the updated /// builder. @@ -329,6 +344,18 @@ pub fn create_oss_provider_with_base_url(base_url: &str) -> ModelProviderInfo { } } +fn matches_azure_responses_base_url(base_url: &str) -> bool { + let base = base_url.to_ascii_lowercase(); + const AZURE_MARKERS: [&str; 5] = [ + "openai.azure.", + "cognitiveservices.azure.", + "aoai.azure.", + "azure-api.", + "azurefd.", + ]; + AZURE_MARKERS.iter().any(|marker| base.contains(marker)) +} + #[cfg(test)] mod tests { use super::*; @@ -419,4 +446,69 @@ env_http_headers = { "X-Example-Env-Header" = "EXAMPLE_ENV_VAR" } let provider: ModelProviderInfo = toml::from_str(azure_provider_toml).unwrap(); assert_eq!(expected_provider, provider); } + + #[test] + fn detects_azure_responses_base_urls() { + fn provider_for(base_url: &str) -> ModelProviderInfo { + ModelProviderInfo { + name: "test".into(), + base_url: Some(base_url.into()), + env_key: None, + env_key_instructions: None, + wire_api: WireApi::Responses, + query_params: None, + http_headers: None, + env_http_headers: None, + request_max_retries: None, + stream_max_retries: None, + stream_idle_timeout_ms: None, + requires_openai_auth: false, + } + } + + let positive_cases = [ + "https://foo.openai.azure.com/openai", + "https://foo.openai.azure.us/openai/deployments/bar", + "https://foo.cognitiveservices.azure.cn/openai", + "https://foo.aoai.azure.com/openai", + "https://foo.openai.azure-api.net/openai", + "https://foo.z01.azurefd.net/", + ]; + for base_url in positive_cases { + let provider = provider_for(base_url); + assert!( + provider.is_azure_responses_endpoint(), + "expected {base_url} to be detected as Azure" + ); + } + + let named_provider = ModelProviderInfo { + name: "Azure".into(), + base_url: Some("https://example.com".into()), + env_key: None, + env_key_instructions: None, + wire_api: WireApi::Responses, + query_params: None, + http_headers: None, + env_http_headers: None, + request_max_retries: None, + stream_max_retries: None, + stream_idle_timeout_ms: None, + requires_openai_auth: false, + }; + assert!(named_provider.is_azure_responses_endpoint()); + + let negative_cases = [ + "https://api.openai.com/v1", + "https://example.com/openai", + "https://myproxy.azurewebsites.net/openai", + ]; + for base_url in negative_cases { + let provider = provider_for(base_url); + assert!( + !provider.is_azure_responses_endpoint(), + "expected {base_url} not to be detected as Azure" + ); + } + } } diff --git a/codex-rs/core/tests/suite/client.rs b/codex-rs/core/tests/suite/client.rs index 579f37cd6e..232788073d 100644 --- a/codex-rs/core/tests/suite/client.rs +++ b/codex-rs/core/tests/suite/client.rs @@ -1,18 +1,27 @@ use codex_core::CodexAuth; use codex_core::ConversationManager; +use codex_core::ModelClient; use codex_core::ModelProviderInfo; use codex_core::NewConversation; +use codex_core::Prompt; +use codex_core::ReasoningItemContent; +use codex_core::ResponseEvent; +use codex_core::ResponseItem; use codex_core::WireApi; use codex_core::built_in_model_providers; use codex_core::protocol::EventMsg; use codex_core::protocol::InputItem; use codex_core::protocol::Op; use codex_core::spawn::CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR; +use codex_protocol::mcp_protocol::ConversationId; +use codex_protocol::models::ReasoningItemReasoningSummary; use core_test_support::load_default_config_for_test; use core_test_support::load_sse_fixture_with_id; use core_test_support::wait_for_event; +use futures::StreamExt; use serde_json::json; use std::io::Write; +use std::sync::Arc; use tempfile::TempDir; use uuid::Uuid; use wiremock::Mock; @@ -629,6 +638,105 @@ async fn includes_user_instructions_message_in_request() { assert_message_ends_with(&request_body["input"][1], ""); } +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn azure_responses_request_includes_store_and_reasoning_ids() { + if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { + println!( + "Skipping test because it cannot execute when network is disabled in a Codex sandbox." + ); + return; + } + + let server = MockServer::start().await; + + let sse_body = concat!( + "data: {\"type\":\"response.created\",\"response\":{}}\n\n", + "data: {\"type\":\"response.completed\",\"response\":{\"id\":\"resp_1\"}}\n\n", + ); + + let template = ResponseTemplate::new(200) + .insert_header("content-type", "text/event-stream") + .set_body_raw(sse_body, "text/event-stream"); + + Mock::given(method("POST")) + .and(path("/openai/responses")) + .respond_with(template) + .expect(1) + .mount(&server) + .await; + + let provider = ModelProviderInfo { + name: "azure".into(), + base_url: Some(format!("{}/openai", server.uri())), + env_key: None, + env_key_instructions: None, + wire_api: WireApi::Responses, + query_params: None, + http_headers: None, + env_http_headers: None, + request_max_retries: Some(0), + stream_max_retries: Some(0), + stream_idle_timeout_ms: Some(5_000), + requires_openai_auth: false, + }; + + let codex_home = TempDir::new().unwrap(); + let mut config = load_default_config_for_test(&codex_home); + config.model_provider_id = provider.name.clone(); + config.model_provider = provider.clone(); + let effort = config.model_reasoning_effort; + let summary = config.model_reasoning_summary; + let config = Arc::new(config); + + let client = ModelClient::new( + Arc::clone(&config), + None, + provider, + effort, + summary, + ConversationId::new(), + ); + + let mut prompt = Prompt::default(); + prompt.input.push(ResponseItem::Reasoning { + id: "reasoning-id".into(), + summary: vec![ReasoningItemReasoningSummary::SummaryText { + text: "summary".into(), + }], + content: Some(vec![ReasoningItemContent::ReasoningText { + text: "content".into(), + }]), + encrypted_content: None, + }); + + let mut stream = client + .stream(&prompt) + .await + .expect("responses stream to start"); + + while let Some(event) = stream.next().await { + if let Ok(ResponseEvent::Completed { .. }) = event { + break; + } + } + + let requests = server + .received_requests() + .await + .expect("mock server collected requests"); + assert_eq!(requests.len(), 1, "expected a single request"); + let body: serde_json::Value = requests[0] + .body_json() + .expect("request body to be valid JSON"); + + assert_eq!(body["store"], serde_json::Value::Bool(true)); + assert_eq!(body["stream"], serde_json::Value::Bool(true)); + assert_eq!( + body["input"][0]["id"], + serde_json::Value::String("reasoning-id".into()) + ); +} + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn azure_overrides_assign_properties_used_for_responses_url() { let existing_env_var_with_random_value = if cfg!(windows) { "USERNAME" } else { "USER" }; From b8ccfe9b65d1784bedff507021503081782dce14 Mon Sep 17 00:00:00 2001 From: Jeremy Rose <172423086+nornagon-openai@users.noreply.github.com> Date: Fri, 12 Sep 2025 14:03:02 -0700 Subject: [PATCH 14/77] core: expand default sandbox (#3483) this adds some more capabilities to the default sandbox which I feel are safe. Most are in the [renderer.sb](https://source.chromium.org/chromium/chromium/src/+/main:sandbox/policy/mac/renderer.sb) sandbox for chrome renderers, which i feel is fair game for codex commands. Specific changes: 1. Allow processes in the sandbox to send signals to any other process in the same sandbox (e.g. child processes or daemonized processes), instead of just themselves. 2. Allow user-preference-read 3. Allow process-info* to anything in the same sandbox. This is a bit wider than Chromium allows, but it seems OK to me to allow anything in the sandbox to get details about other processes in the same sandbox. Bazel uses these to e.g. wait for another process to exit. 4. Allow all CPU feature detection, this seems harmless to me. It's wider than Chromium, but Chromium is concerned about fingerprinting, and tightly controls what CPU features they actually care about, and we don't have either that restriction or that advantage. 5. Allow new sysctl-reads: ``` (sysctl-name "vm.loadavg") (sysctl-name-prefix "kern.proc.pgrp.") (sysctl-name-prefix "kern.proc.pid.") (sysctl-name-prefix "net.routetable.") ``` bazel needs these for waiting on child processes and for communicating with its local build server, i believe. I wonder if we should just allow all (sysctl-read), as reading any arbitrary info about the system seems fine to me. 6. Allow iokit-open on RootDomainUserClient. This has to do with power management I believe, and Chromium allows renderers to do this, so okay. Bazel needs it to boot successfully, possibly for sleep/wake callbacks? 7. Mach lookup to `com.apple.system.opendirectoryd.libinfo`, which has to do with user data, and which Chrome allows. 8. Mach lookup to `com.apple.PowerManagement.control`. Chromium allows its GPU process to do this, but not its renderers. Bazel needs this to boot, probably relatedly to sleep/wake stuff. --- codex-rs/core/src/seatbelt_base_policy.sbpl | 46 ++++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/codex-rs/core/src/seatbelt_base_policy.sbpl b/codex-rs/core/src/seatbelt_base_policy.sbpl index f165f067c9..27b8252b2a 100644 --- a/codex-rs/core/src/seatbelt_base_policy.sbpl +++ b/codex-rs/core/src/seatbelt_base_policy.sbpl @@ -2,6 +2,7 @@ ; inspired by Chrome's sandbox policy: ; https://source.chromium.org/chromium/chromium/src/+/main:sandbox/policy/mac/common.sb;l=273-319;drc=7b3962fe2e5fc9e2ee58000dc8fbf3429d84d3bd +; https://source.chromium.org/chromium/chromium/src/+/main:sandbox/policy/mac/renderer.sb;l=64;drc=7b3962fe2e5fc9e2ee58000dc8fbf3429d84d3bd ; start with closed-by-default (deny default) @@ -9,7 +10,13 @@ ; child processes inherit the policy of their parent (allow process-exec) (allow process-fork) -(allow signal (target self)) +(allow signal (target same-sandbox)) + +; Allow cf prefs to work. +(allow user-preference-read) + +; process-info +(allow process-info* (target same-sandbox)) (allow file-write-data (require-all @@ -32,28 +39,22 @@ (sysctl-name "hw.l3cachesize_compat") (sysctl-name "hw.logicalcpu_max") (sysctl-name "hw.machine") + (sysctl-name "hw.memsize") (sysctl-name "hw.ncpu") (sysctl-name "hw.nperflevels") - (sysctl-name "hw.optional.arm.FEAT_BF16") - (sysctl-name "hw.optional.arm.FEAT_DotProd") - (sysctl-name "hw.optional.arm.FEAT_FCMA") - (sysctl-name "hw.optional.arm.FEAT_FHM") - (sysctl-name "hw.optional.arm.FEAT_FP16") - (sysctl-name "hw.optional.arm.FEAT_I8MM") - (sysctl-name "hw.optional.arm.FEAT_JSCVT") - (sysctl-name "hw.optional.arm.FEAT_LSE") - (sysctl-name "hw.optional.arm.FEAT_RDM") - (sysctl-name "hw.optional.arm.FEAT_SHA512") - (sysctl-name "hw.optional.armv8_2_sha512") - (sysctl-name "hw.memsize") - (sysctl-name "hw.pagesize") + ; Chrome locks these CPU feature detection down a bit more tightly, + ; but mostly for fingerprinting concerns which isn't an issue for codex. + (sysctl-name-prefix "hw.optional.arm.") + (sysctl-name-prefix "hw.optional.armv8_") (sysctl-name "hw.packages") (sysctl-name "hw.pagesize_compat") + (sysctl-name "hw.pagesize") (sysctl-name "hw.physicalcpu_max") (sysctl-name "hw.tbfrequency_compat") (sysctl-name "hw.vectorunit") (sysctl-name "kern.hostname") (sysctl-name "kern.maxfilesperproc") + (sysctl-name "kern.maxproc") (sysctl-name "kern.osproductversion") (sysctl-name "kern.osrelease") (sysctl-name "kern.ostype") @@ -63,14 +64,27 @@ (sysctl-name "kern.usrstack64") (sysctl-name "kern.version") (sysctl-name "sysctl.proc_cputype") + (sysctl-name "vm.loadavg") (sysctl-name-prefix "hw.perflevel") + (sysctl-name-prefix "kern.proc.pgrp.") + (sysctl-name-prefix "kern.proc.pid.") + (sysctl-name-prefix "net.routetable.") +) + +; IOKit +(allow iokit-open + (iokit-registry-entry-class "RootDomainUserClient") +) + +; needed to look up user info, see https://crbug.com/792228 +(allow mach-lookup + (global-name "com.apple.system.opendirectoryd.libinfo") ) ; Added on top of Chrome profile ; Needed for python multiprocessing on MacOS for the SemLock (allow ipc-posix-sem) -; needed to look up user info, see https://crbug.com/792228 (allow mach-lookup - (global-name "com.apple.system.opendirectoryd.libinfo") + (global-name "com.apple.PowerManagement.control") ) From 8408f3e8ed40b5b348f94d450787801cd27acd20 Mon Sep 17 00:00:00 2001 From: jif-oai Date: Fri, 12 Sep 2025 14:09:31 -0700 Subject: [PATCH 15/77] Fix NUX UI (#3534) Fix NUX UI --- codex-rs/tui/src/app.rs | 32 +++++++++++++++-------------- codex-rs/tui/src/chatwidget.rs | 4 ++-- codex-rs/tui/src/history_cell.rs | 10 ++++++--- codex-rs/tui/src/new_model_popup.rs | 10 +++++---- 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index 2b22396f43..2cb49b1849 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -327,13 +327,15 @@ impl App { fn show_model_save_hint(&mut self) { let model = self.config.model.clone(); if self.active_profile.is_some() { - self.chat_widget.add_info_message(format!( - "Model switched to {model}. Press Ctrl+S to save it for this profile, then press Ctrl+S again to set it as your global default." - )); + self.chat_widget.add_info_message( + format!("Model changed to {model} for the current session"), + Some("(ctrl+s to set as profile default)".to_string()), + ); } else { - self.chat_widget.add_info_message(format!( - "Model switched to {model}. Press Ctrl+S to save it as your global default." - )); + self.chat_widget.add_info_message( + format!("Model changed to {model} for the current session"), + Some("(ctrl+s to set as default)".to_string()), + ); } } @@ -372,9 +374,6 @@ impl App { let model = self.config.model.clone(); let effort = self.config.model_reasoning_effort; - let effort_label = effort - .map(|effort| effort.to_string()) - .unwrap_or_else(|| "none".to_string()); let codex_home = self.config.codex_home.clone(); match scope { @@ -382,9 +381,10 @@ impl App { match persist_model_selection(&codex_home, Some(profile), &model, effort).await { Ok(()) => { self.model_saved_to_profile = true; - self.chat_widget.add_info_message(format!( - "Saved model {model} ({effort_label}) for profile `{profile}`. Press Ctrl+S again to make this your global default." - )); + self.chat_widget.add_info_message( + format!("Profile model changed to {model} for all sessions"), + Some("(view global config in config.toml)".to_string()), + ); } Err(err) => { tracing::error!( @@ -401,9 +401,10 @@ impl App { match persist_model_selection(&codex_home, None, &model, effort).await { Ok(()) => { self.model_saved_to_global = true; - self.chat_widget.add_info_message(format!( - "Saved model {model} ({effort_label}) as your global default." - )); + self.chat_widget.add_info_message( + format!("Default model changed to {model} for all sessions"), + Some("(view global config in config.toml)".to_string()), + ) } Err(err) => { tracing::error!( @@ -420,6 +421,7 @@ impl App { self.chat_widget.add_info_message( "Model preference already saved globally; no further action needed." .to_string(), + None, ); } } diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 5f0eac0564..6a6c77d155 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -1279,8 +1279,8 @@ impl ChatWidget { self.config.model = model; } - pub(crate) fn add_info_message(&mut self, message: String) { - self.add_to_history(history_cell::new_info_event(message)); + pub(crate) fn add_info_message(&mut self, message: String, hint: Option) { + self.add_to_history(history_cell::new_info_event(message, hint)); self.request_redraw(); } diff --git a/codex-rs/tui/src/history_cell.rs b/codex-rs/tui/src/history_cell.rs index e85e0fb1ee..e4405d7b93 100644 --- a/codex-rs/tui/src/history_cell.rs +++ b/codex-rs/tui/src/history_cell.rs @@ -1053,9 +1053,13 @@ pub(crate) fn new_mcp_tools_output( PlainHistoryCell { lines } } -pub(crate) fn new_info_event(message: String) -> PlainHistoryCell { - let lines: Vec> = - vec![vec![padded_emoji("💾").green(), " ".into(), message.into()].into()]; +pub(crate) fn new_info_event(message: String, hint: Option) -> PlainHistoryCell { + let mut line = vec!["> ".into(), message.into()]; + if let Some(hint) = hint { + line.push(" ".into()); + line.push(hint.dark_gray()); + } + let lines: Vec> = vec![line.into()]; PlainHistoryCell { lines } } diff --git a/codex-rs/tui/src/new_model_popup.rs b/codex-rs/tui/src/new_model_popup.rs index e89fb67ef5..ff09573e9f 100644 --- a/codex-rs/tui/src/new_model_popup.rs +++ b/codex-rs/tui/src/new_model_popup.rs @@ -82,12 +82,14 @@ impl WidgetRef for &ModelUpgradePopup { Clear.render(area, buf); let mut lines: Vec = vec![ + String::new().into(), + format!(" Codex is now powered by {GPT5_HIGH_MODEL}, a new model that is").into(), Line::from(vec![ - "> ".into(), - format!("Try {GPT5_HIGH_MODEL} as your default model").bold(), + " ".into(), + "faster, a better collaborator, ".bold(), + "and ".into(), + "more steerable.".bold(), ]), - format!(" {GPT5_HIGH_MODEL} is our latest model tuned for coding workflows.").into(), - " Switch now or keep your current default – you can change models any time.".into(), "".into(), ]; From 8d56d2f655fd1d45d53a7c66a01f3e063dcf0069 Mon Sep 17 00:00:00 2001 From: jif-oai Date: Fri, 12 Sep 2025 14:17:49 -0700 Subject: [PATCH 16/77] fix: NIT None reasoning effort (#3536) Fix the reasoning effort not being set to None in the UI --- codex-rs/core/src/config.rs | 2 +- codex-rs/tui/src/lib.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index 8be93f76ba..48624ffc82 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -32,7 +32,7 @@ use toml::Value as TomlValue; use toml_edit::DocumentMut; const OPENAI_DEFAULT_MODEL: &str = "gpt-5"; -pub const GPT5_HIGH_MODEL: &str = "gpt-5-high"; +pub const GPT5_HIGH_MODEL: &str = "gpt-5-high-new"; /// Maximum number of bytes of the documentation that will be embedded. Larger /// files are *silently truncated* to this size so we do not take up too much of diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 7ce175286b..41e36a9cf1 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -380,11 +380,12 @@ async fn run_ratatui_app( if switch_to_new_model { config.model = GPT5_HIGH_MODEL.to_owned(); + config.model_reasoning_effort = None; if let Err(e) = persist_model_selection( &config.codex_home, active_profile.as_deref(), &config.model, - None, + config.model_reasoning_effort, ) .await { From 90a0fd342f5dc678b63d2b27faff7ace46d4af51 Mon Sep 17 00:00:00 2001 From: dedrisian-oai Date: Fri, 12 Sep 2025 16:25:10 -0700 Subject: [PATCH 17/77] Review Mode (Core) (#3401) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📝 Review Mode -- Core This PR introduces the Core implementation for Review mode: - New op `Op::Review { prompt: String }:` spawns a child review task with isolated context, a review‑specific system prompt, and a `Config.review_model`. - `EnteredReviewMode`: emitted when the child review session starts. Every event from this point onwards reflects the review session. - `ExitedReviewMode(Option)`: emitted when the review finishes or is interrupted, with optional structured findings: ```json { "findings": [ { "title": "<≤ 80 chars, imperative>", "body": "", "confidence_score": , "priority": , "code_location": { "absolute_file_path": "", "line_range": {"start": , "end": } } } ], "overall_correctness": "patch is correct" | "patch is incorrect", "overall_explanation": "<1-3 sentence explanation justifying the overall_correctness verdict>", "overall_confidence_score": } ``` ## Questions ### Why separate out its own message history? We want the review thread to match the training of our review models as much as possible -- that means using a custom prompt, removing user instructions, and starting a clean chat history. We also want to make sure the review thread doesn't leak into the parent thread. ### Why do this as a mode, vs. sub-agents? 1. We want review to be a synchronous task, so it's fine for now to do a bespoke implementation. 2. We're still unclear about the final structure for sub-agents. We'd prefer to land this quickly and then refactor into sub-agents without rushing that implementation. --- codex-rs/core/review_prompt.md | 87 +++ codex-rs/core/src/client_common.rs | 3 + codex-rs/core/src/codex.rs | 263 ++++++++- codex-rs/core/src/config.rs | 22 + codex-rs/core/src/rollout/policy.rs | 4 +- codex-rs/core/tests/suite/mod.rs | 1 + codex-rs/core/tests/suite/review.rs | 542 ++++++++++++++++++ .../src/event_processor_with_human_output.rs | 2 + codex-rs/exec/src/lib.rs | 1 + .../mcp-server/src/codex_message_processor.rs | 1 + codex-rs/mcp-server/src/codex_tool_config.rs | 1 + codex-rs/mcp-server/src/codex_tool_runner.rs | 4 +- codex-rs/protocol/src/protocol.rs | 61 ++ codex-rs/tui/src/chatwidget.rs | 2 + codex-rs/tui/src/lib.rs | 1 + 15 files changed, 976 insertions(+), 19 deletions(-) create mode 100644 codex-rs/core/review_prompt.md create mode 100644 codex-rs/core/tests/suite/review.rs diff --git a/codex-rs/core/review_prompt.md b/codex-rs/core/review_prompt.md new file mode 100644 index 0000000000..01d93598a7 --- /dev/null +++ b/codex-rs/core/review_prompt.md @@ -0,0 +1,87 @@ +# Review guidelines: + +You are acting as a reviewer for a proposed code change made by another engineer. + +Below are some default guidelines for determining whether the original author would appreciate the issue being flagged. + +These are not the final word in determining whether an issue is a bug. In many cases, you will encounter other, more specific guidelines. These may be present elsewhere in a developer message, a user message, a file, or even elsewhere in this system message. +Those guidelines should be considered to override these general instructions. + +Here are the general guidelines for determining whether something is a bug and should be flagged. + +1. It meaningfully impacts the accuracy, performance, security, or maintainability of the code. +2. The bug is discrete and actionable (i.e. not a general issue with the codebase or a combination of multiple issues). +3. Fixing the bug does not demand a level of rigor that is not present in the rest of the codebase (e.g. one doesn't need very detailed comments and input validation in a repository of one-off scripts in personal projects) +4. The bug was introduced in the commit (pre-existing bugs should not be flagged). +5. The author of the original PR would likely fix the issue if they were made aware of it. +6. The bug does not rely on unstated assumptions about the codebase or author's intent. +7. It is not enough to speculate that a change may disrupt another part of the codebase, to be considered a bug, one must identify the other parts of the code that are provably affected. +8. The bug is clearly not just an intentional change by the original author. + +When flagging a bug, you will also provide an accompanying comment. Once again, these guidelines are not the final word on how to construct a comment -- defer to any subsequent guidelines that you encounter. + +1. The comment should be clear about why the issue is a bug. +2. The comment should appropriately communicate the severity of the issue. It should not claim that an issue is more severe than it actually is. +3. The comment should be brief. The body should be at most 1 paragraph. It should not introduce line breaks within the natural language flow unless it is necessary for the code fragment. +4. The comment should not include any chunks of code longer than 3 lines. Any code chunks should be wrapped in markdown inline code tags or a code block. +5. The comment should clearly and explicitly communicate the scenarios, environments, or inputs that are necessary for the bug to arise. The comment should immediately indicate that the issue's severity depends on these factors. +6. The comment's tone should be matter-of-fact and not accusatory or overly positive. It should read as a helpful AI assistant suggestion without sounding too much like a human reviewer. +7. The comment should be written such that the original author can immediately grasp the idea without close reading. +8. The comment should avoid excessive flattery and comments that are not helpful to the original author. The comment should avoid phrasing like "Great job ...", "Thanks for ...". + +Below are some more detailed guidelines that you should apply to this specific review. + +HOW MANY FINDINGS TO RETURN: + +Output all findings that the original author would fix if they knew about it. If there is no finding that a person would definitely love to see and fix, prefer outputting no findings. Do not stop at the first qualifying finding. Continue until you've listed every qualifying finding. + +GUIDELINES: + +- Ignore trivial style unless it obscures meaning or violates documented standards. +- Use one comment per distinct issue (or a multi-line range if necessary). +- Use ```suggestion blocks ONLY for concrete replacement code (minimal lines; no commentary inside the block). +- In every ```suggestion block, preserve the exact leading whitespace of the replaced lines (spaces vs tabs, number of spaces). +- Do NOT introduce or remove outer indentation levels unless that is the actual fix. + +The comments will be presented in the code review as inline comments. You should avoid providing unnecessary location details in the comment body. Always keep the line range as short as possible for interpreting the issue. Avoid ranges longer than 5–10 lines; instead, choose the most suitable subrange that pinpoints the problem. + +At the beginning of the finding title, tag the bug with priority level. For example "[P1] Un-padding slices along wrong tensor dimensions". [P0] – Drop everything to fix. Blocking release, operations, or major usage. Only use for universal issues that do not depend on any assumptions about the inputs. · [P1] – Urgent. Should be addressed in the next cycle · [P2] – Normal. To be fixed eventually · [P3] – Low. Nice to have. + +Additionally, include a numeric priority field in the JSON output for each finding: set "priority" to 0 for P0, 1 for P1, 2 for P2, or 3 for P3. If a priority cannot be determined, omit the field or use null. + +At the end of your findings, output an "overall correctness" verdict of whether or not the patch should be considered "correct". +Correct implies that existing code and tests will not break, and the patch is free of bugs and other blocking issues. +Ignore non-blocking issues such as style, formatting, typos, documentation, and other nits. + +FORMATTING GUIDELINES: +The finding description should be one paragraph. + +OUTPUT FORMAT: + +## Output schema — MUST MATCH *exactly* + +```json +{ + "findings": [ + { + "title": "<≤ 80 chars, imperative>", + "body": "", + "confidence_score": , + "priority": , + "code_location": { + "absolute_file_path": "", + "line_range": {"start": , "end": } + } + } + ], + "overall_correctness": "patch is correct" | "patch is incorrect", + "overall_explanation": "<1-3 sentence explanation justifying the overall_correctness verdict>", + "overall_confidence_score": +} +``` + +* **Do not** wrap the JSON in markdown fences or extra prose. +* The code_location field is required and must include absolute_file_path and line_range. +*Line ranges must be as short as possible for interpreting the issue (avoid ranges over 5–10 lines; pick the most suitable subrange). +* The code_location should overlap with the diff. +* Do not generate a PR fix. \ No newline at end of file diff --git a/codex-rs/core/src/client_common.rs b/codex-rs/core/src/client_common.rs index ffcc63f557..5aa0d8cf28 100644 --- a/codex-rs/core/src/client_common.rs +++ b/codex-rs/core/src/client_common.rs @@ -19,6 +19,9 @@ use tokio::sync::mpsc; /// with this content. const BASE_INSTRUCTIONS: &str = include_str!("../prompt.md"); +/// Review thread system prompt. Edit `core/src/review_prompt.md` to customize. +pub const REVIEW_PROMPT: &str = include_str!("../review_prompt.md"); + /// API request payload for a single model turn #[derive(Default, Debug, Clone)] pub struct Prompt { diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 58dd86818c..9aa8486a0d 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -9,6 +9,7 @@ use std::sync::atomic::AtomicU64; use std::time::Duration; use crate::AuthManager; +use crate::client_common::REVIEW_PROMPT; use crate::event_mapping::map_response_item_to_event_messages; use async_channel::Receiver; use async_channel::Sender; @@ -17,6 +18,7 @@ use codex_apply_patch::MaybeApplyPatchVerified; use codex_apply_patch::maybe_parse_apply_patch_verified; use codex_protocol::mcp_protocol::ConversationId; use codex_protocol::protocol::ConversationPathResponseEvent; +use codex_protocol::protocol::ReviewRequest; use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::TaskStartedEvent; use codex_protocol::protocol::TurnAbortReason; @@ -95,6 +97,7 @@ use crate::protocol::Op; use crate::protocol::PatchApplyBeginEvent; use crate::protocol::PatchApplyEndEvent; use crate::protocol::ReviewDecision; +use crate::protocol::ReviewOutputEvent; use crate::protocol::SandboxPolicy; use crate::protocol::SessionConfiguredEvent; use crate::protocol::StreamErrorEvent; @@ -307,6 +310,7 @@ pub(crate) struct TurnContext { pub(crate) sandbox_policy: SandboxPolicy, pub(crate) shell_environment_policy: ShellEnvironmentPolicy, pub(crate) tools_config: ToolsConfig, + pub(crate) is_review_mode: bool, } impl TurnContext { @@ -478,6 +482,7 @@ impl Session { sandbox_policy, shell_environment_policy: config.shell_environment_policy.clone(), cwd, + is_review_mode: false, }; let sess = Arc::new(Session { conversation_id, @@ -1032,11 +1037,19 @@ pub(crate) struct ApplyPatchCommandContext { pub(crate) changes: HashMap, } +#[derive(Clone, Debug, Eq, PartialEq)] +enum AgentTaskKind { + Regular, + Review, + Compact, +} + /// A series of Turns in response to user input. pub(crate) struct AgentTask { sess: Arc, sub_id: String, handle: AbortHandle, + kind: AgentTaskKind, } impl AgentTask { @@ -1056,6 +1069,27 @@ impl AgentTask { sess, sub_id, handle, + kind: AgentTaskKind::Regular, + } + } + + fn review( + sess: Arc, + turn_context: Arc, + sub_id: String, + input: Vec, + ) -> Self { + let handle = { + let sess = sess.clone(); + let sub_id = sub_id.clone(); + let tc = Arc::clone(&turn_context); + tokio::spawn(async move { run_task(sess, tc, sub_id, input).await }).abort_handle() + }; + Self { + sess, + sub_id, + handle, + kind: AgentTaskKind::Review, } } @@ -1079,12 +1113,20 @@ impl AgentTask { sess, sub_id, handle, + kind: AgentTaskKind::Compact, } } fn abort(self, reason: TurnAbortReason) { // TOCTOU? if !self.handle.is_finished() { + if self.kind == AgentTaskKind::Review { + let sess = self.sess.clone(); + let sub_id = self.sub_id.clone(); + tokio::spawn(async move { + exit_review_mode(sess, sub_id, None).await; + }); + } self.handle.abort(); let event = Event { id: self.sub_id, @@ -1184,6 +1226,7 @@ async fn submission_loop( sandbox_policy: new_sandbox_policy.clone(), shell_environment_policy: prev.shell_environment_policy.clone(), cwd: new_cwd.clone(), + is_review_mode: false, }; // Install the new persistent context for subsequent tasks/turns. @@ -1269,6 +1312,7 @@ async fn submission_loop( sandbox_policy, shell_environment_policy: turn_context.shell_environment_policy.clone(), cwd, + is_review_mode: false, }; // TODO: record the new environment context in the conversation history // no current task, spawn a new one with the per‑turn context @@ -1430,6 +1474,16 @@ async fn submission_loop( }; sess.send_event(event).await; } + Op::Review { review_request } => { + spawn_review_thread( + sess.clone(), + config.clone(), + turn_context.clone(), + sub.id, + review_request, + ) + .await; + } _ => { // Ignore unknown ops; enum is non_exhaustive to allow extensions. } @@ -1438,6 +1492,82 @@ async fn submission_loop( debug!("Agent loop exited"); } +/// Spawn a review thread using the given prompt. +async fn spawn_review_thread( + sess: Arc, + config: Arc, + parent_turn_context: Arc, + sub_id: String, + review_request: ReviewRequest, +) { + let model = config.review_model.clone(); + let review_model_family = find_family_for_model(&model) + .unwrap_or_else(|| parent_turn_context.client.get_model_family()); + let tools_config = ToolsConfig::new(&ToolsConfigParams { + model_family: &review_model_family, + approval_policy: parent_turn_context.approval_policy, + sandbox_policy: parent_turn_context.sandbox_policy.clone(), + include_plan_tool: false, + include_apply_patch_tool: config.include_apply_patch_tool, + include_web_search_request: false, + use_streamable_shell_tool: false, + include_view_image_tool: false, + experimental_unified_exec_tool: config.use_experimental_unified_exec_tool, + }); + + let base_instructions = Some(REVIEW_PROMPT.to_string()); + let provider = parent_turn_context.client.get_provider(); + let auth_manager = parent_turn_context.client.get_auth_manager(); + let model_family = review_model_family.clone(); + + // Build per‑turn client with the requested model/family. + let mut per_turn_config = (*config).clone(); + per_turn_config.model = model.clone(); + per_turn_config.model_family = model_family.clone(); + if let Some(model_info) = get_model_info(&model_family) { + per_turn_config.model_context_window = Some(model_info.context_window); + } + + let client = ModelClient::new( + Arc::new(per_turn_config), + auth_manager, + provider, + parent_turn_context.client.get_reasoning_effort(), + parent_turn_context.client.get_reasoning_summary(), + sess.conversation_id, + ); + + let review_turn_context = TurnContext { + client, + tools_config, + user_instructions: None, + base_instructions, + approval_policy: parent_turn_context.approval_policy, + sandbox_policy: parent_turn_context.sandbox_policy.clone(), + shell_environment_policy: parent_turn_context.shell_environment_policy.clone(), + cwd: parent_turn_context.cwd.clone(), + is_review_mode: true, + }; + + // Seed the child task with the review prompt as the initial user message. + let input: Vec = vec![InputItem::Text { + text: review_request.prompt.clone(), + }]; + let tc = Arc::new(review_turn_context); + + // Clone sub_id for the upcoming announcement before moving it into the task. + let sub_id_for_event = sub_id.clone(); + let task = AgentTask::review(sess.clone(), tc.clone(), sub_id, input); + sess.set_task(task); + + // Announce entering review mode so UIs can switch modes. + sess.send_event(Event { + id: sub_id_for_event, + msg: EventMsg::EnteredReviewMode(review_request), + }) + .await; +} + /// Takes a user message as input and runs a loop where, at each turn, the model /// replies with either: /// @@ -1451,6 +1581,10 @@ async fn submission_loop( /// back to the model in the next turn. /// - If the model sends only an assistant message, we record it in the /// conversation history and consider the task complete. +/// +/// Review mode: when `turn_context.is_review_mode` is true, the turn runs in an +/// isolated in-memory thread without the parent session's prior history or +/// user_instructions. Emits ExitedReviewMode upon final review message. async fn run_task( sess: Arc, turn_context: Arc, @@ -1469,8 +1603,17 @@ async fn run_task( sess.send_event(event).await; let initial_input_for_turn: ResponseInputItem = ResponseInputItem::from(input); - sess.record_input_and_rollout_usermsg(&initial_input_for_turn) - .await; + // For review threads, keep an isolated in-memory history so the + // model sees a fresh conversation without the parent session's history. + // For normal turns, continue recording to the session history as before. + let is_review_mode = turn_context.is_review_mode; + let mut review_thread_history: Vec = Vec::new(); + if is_review_mode { + review_thread_history.push(initial_input_for_turn.into()); + } else { + sess.record_input_and_rollout_usermsg(&initial_input_for_turn) + .await; + } let mut last_agent_message: Option = None; // Although from the perspective of codex.rs, TurnDiffTracker has the lifecycle of a Task which contains @@ -1487,14 +1630,26 @@ async fn run_task( .into_iter() .map(ResponseItem::from) .collect::>(); - sess.record_conversation_items(&pending_input).await; - // Construct the input that we will send to the model. When using the - // Chat completions API (or ZDR clients), the model needs the full - // conversation history on each turn. The rollout file, however, should - // only record the new items that originated in this turn so that it - // represents an append-only log without duplicates. - let turn_input: Vec = sess.turn_input_with_history(pending_input); + // Construct the input that we will send to the model. + // + // - For review threads, use the isolated in-memory history so the + // model sees a fresh conversation (no parent history/user_instructions). + // + // - For normal turns, use the session's full history. When using the + // chat completions API (or ZDR clients), the model needs the full + // conversation history on each turn. The rollout file, however, should + // only record the new items that originated in this turn so that it + // represents an append-only log without duplicates. + let turn_input: Vec = if is_review_mode { + if !pending_input.is_empty() { + review_thread_history.extend(pending_input); + } + review_thread_history.clone() + } else { + sess.record_conversation_items(&pending_input).await; + sess.turn_input_with_history(pending_input) + }; let turn_input_messages: Vec = turn_input .iter() @@ -1628,8 +1783,13 @@ async fn run_task( // Only attempt to take the lock if there is something to record. if !items_to_record_in_conversation_history.is_empty() { - sess.record_conversation_items(&items_to_record_in_conversation_history) - .await; + if is_review_mode { + review_thread_history + .extend(items_to_record_in_conversation_history.clone()); + } else { + sess.record_conversation_items(&items_to_record_in_conversation_history) + .await; + } } if token_limit_reached { @@ -1683,6 +1843,23 @@ async fn run_task( } } } + + // If this was a review thread and we have a final assistant message, + // try to parse it as a ReviewOutput. + // + // If parsing fails, construct a minimal ReviewOutputEvent using the plain + // text as the overall explanation. Else, just exit review mode with None. + // + // Emits an ExitedReviewMode event with the parsed review output. + if turn_context.is_review_mode { + exit_review_mode( + sess.clone(), + sub_id.clone(), + last_agent_message.as_deref().map(parse_review_output_event), + ) + .await; + } + sess.remove_task(&sub_id); let event = Event { id: sub_id, @@ -1691,6 +1868,31 @@ async fn run_task( sess.send_event(event).await; } +/// Parse the review output; when not valid JSON, build a structured +/// fallback that carries the plain text as the overall explanation. +/// +/// Returns: a ReviewOutputEvent parsed from JSON or a fallback populated from text. +fn parse_review_output_event(text: &str) -> ReviewOutputEvent { + // Try direct parse first + if let Ok(ev) = serde_json::from_str::(text) { + return ev; + } + // If wrapped in markdown fences or extra prose, attempt to extract the first JSON object + if let (Some(start), Some(end)) = (text.find('{'), text.rfind('}')) + && start < end + && let Some(slice) = text.get(start..=end) + && let Ok(ev) = serde_json::from_str::(slice) + { + return ev; + } + // Not JSON – return a structured ReviewOutputEvent that carries + // the plain text as the overall explanation. + ReviewOutputEvent { + overall_explanation: text.to_string(), + ..Default::default() + } +} + async fn run_turn( sess: &Session, turn_context: &TurnContext, @@ -1917,11 +2119,17 @@ async fn try_run_turn( return Ok(result); } ResponseEvent::OutputTextDelta(delta) => { - let event = Event { - id: sub_id.to_string(), - msg: EventMsg::AgentMessageDelta(AgentMessageDeltaEvent { delta }), - }; - sess.send_event(event).await; + // In review child threads, suppress assistant text deltas; the + // UI will show a selection popup from the final ReviewOutput. + if !turn_context.is_review_mode { + let event = Event { + id: sub_id.to_string(), + msg: EventMsg::AgentMessageDelta(AgentMessageDeltaEvent { delta }), + }; + sess.send_event(event).await; + } else { + trace!("suppressing OutputTextDelta in review mode"); + } } ResponseEvent::ReasoningSummaryDelta(delta) => { let event = Event { @@ -2053,7 +2261,15 @@ async fn handle_response_item( ResponseItem::Message { .. } | ResponseItem::Reasoning { .. } | ResponseItem::WebSearchCall { .. } => { - let msgs = map_response_item_to_event_messages(&item, sess.show_raw_agent_reasoning); + // In review child threads, suppress assistant message events but + // keep reasoning/web search. + let msgs = match &item { + ResponseItem::Message { .. } if turn_context.is_review_mode => { + trace!("suppressing assistant Message in review mode"); + Vec::new() + } + _ => map_response_item_to_event_messages(&item, sess.show_raw_agent_reasoning), + }; for msg in msgs { let event = Event { id: sub_id.to_string(), @@ -2988,6 +3204,19 @@ fn convert_call_tool_result_to_function_call_output_payload( } } +/// Emits an ExitedReviewMode Event with optional ReviewOutput. +async fn exit_review_mode( + session: Arc, + task_sub_id: String, + res: Option, +) { + let event = Event { + id: task_sub_id, + msg: EventMsg::ExitedReviewMode(res), + }; + session.send_event(event).await; +} + #[cfg(test)] mod tests { use super::*; diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index 48624ffc82..53e246d26d 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -32,6 +32,7 @@ use toml::Value as TomlValue; use toml_edit::DocumentMut; const OPENAI_DEFAULT_MODEL: &str = "gpt-5"; +const OPENAI_DEFAULT_REVIEW_MODEL: &str = "gpt-5"; pub const GPT5_HIGH_MODEL: &str = "gpt-5-high-new"; /// Maximum number of bytes of the documentation that will be embedded. Larger @@ -47,6 +48,9 @@ pub struct Config { /// Optional override of model selection. pub model: String, + /// Model used specifically for review sessions. Defaults to "gpt-5". + pub review_model: String, + pub model_family: ModelFamily, /// Size of the context window for the model, in tokens. @@ -512,6 +516,8 @@ fn apply_toml_override(root: &mut TomlValue, path: &str, value: TomlValue) { pub struct ConfigToml { /// Optional override of model selection. pub model: Option, + /// Review model override used by the `/review` feature. + pub review_model: Option, /// Provider to use from the model_providers map. pub model_provider: Option, @@ -740,6 +746,7 @@ impl ConfigToml { #[derive(Default, Debug, Clone)] pub struct ConfigOverrides { pub model: Option, + pub review_model: Option, pub cwd: Option, pub approval_policy: Option, pub sandbox_mode: Option, @@ -767,6 +774,7 @@ impl Config { // Destructure ConfigOverrides fully to ensure all overrides are applied. let ConfigOverrides { model, + review_model: override_review_model, cwd, approval_policy, sandbox_mode, @@ -902,8 +910,14 @@ impl Config { Self::get_base_instructions(experimental_instructions_path, &resolved_cwd)?; let base_instructions = base_instructions.or(file_base_instructions); + // Default review model when not set in config; allow CLI override to take precedence. + let review_model = override_review_model + .or(cfg.review_model) + .unwrap_or_else(default_review_model); + let config = Self { model, + review_model, model_family, model_context_window, model_max_output_tokens, @@ -1027,6 +1041,10 @@ fn default_model() -> String { OPENAI_DEFAULT_MODEL.to_string() } +fn default_review_model() -> String { + OPENAI_DEFAULT_REVIEW_MODEL.to_string() +} + /// Returns the path to the Codex configuration directory, which can be /// specified by the `CODEX_HOME` environment variable. If not set, defaults to /// `~/.codex`. @@ -1439,6 +1457,7 @@ model_verbosity = "high" assert_eq!( Config { model: "o3".to_string(), + review_model: "gpt-5".to_string(), model_family: find_family_for_model("o3").expect("known model slug"), model_context_window: Some(200_000), model_max_output_tokens: Some(100_000), @@ -1496,6 +1515,7 @@ model_verbosity = "high" )?; let expected_gpt3_profile_config = Config { model: "gpt-3.5-turbo".to_string(), + review_model: "gpt-5".to_string(), model_family: find_family_for_model("gpt-3.5-turbo").expect("known model slug"), model_context_window: Some(16_385), model_max_output_tokens: Some(4_096), @@ -1568,6 +1588,7 @@ model_verbosity = "high" )?; let expected_zdr_profile_config = Config { model: "o3".to_string(), + review_model: "gpt-5".to_string(), model_family: find_family_for_model("o3").expect("known model slug"), model_context_window: Some(200_000), model_max_output_tokens: Some(100_000), @@ -1626,6 +1647,7 @@ model_verbosity = "high" )?; let expected_gpt5_profile_config = Config { model: "gpt-5".to_string(), + review_model: "gpt-5".to_string(), model_family: find_family_for_model("gpt-5").expect("known model slug"), model_context_window: Some(272_000), model_max_output_tokens: Some(128_000), diff --git a/codex-rs/core/src/rollout/policy.rs b/codex-rs/core/src/rollout/policy.rs index c1a5cb238d..f46fa7cab5 100644 --- a/codex-rs/core/src/rollout/policy.rs +++ b/codex-rs/core/src/rollout/policy.rs @@ -38,7 +38,9 @@ pub(crate) fn should_persist_event_msg(ev: &EventMsg) -> bool { | EventMsg::AgentMessage(_) | EventMsg::AgentReasoning(_) | EventMsg::AgentReasoningRawContent(_) - | EventMsg::TokenCount(_) => true, + | EventMsg::TokenCount(_) + | EventMsg::EnteredReviewMode(_) + | EventMsg::ExitedReviewMode(_) => true, EventMsg::Error(_) | EventMsg::TaskStarted(_) | EventMsg::TaskComplete(_) diff --git a/codex-rs/core/tests/suite/mod.rs b/codex-rs/core/tests/suite/mod.rs index 10661413a4..d771d6b98d 100644 --- a/codex-rs/core/tests/suite/mod.rs +++ b/codex-rs/core/tests/suite/mod.rs @@ -9,6 +9,7 @@ mod fork_conversation; mod live_cli; mod model_overrides; mod prompt_caching; +mod review; mod seatbelt; mod stream_error_allows_next_turn; mod stream_no_completed; diff --git a/codex-rs/core/tests/suite/review.rs b/codex-rs/core/tests/suite/review.rs new file mode 100644 index 0000000000..21d447e25d --- /dev/null +++ b/codex-rs/core/tests/suite/review.rs @@ -0,0 +1,542 @@ +use codex_core::CodexAuth; +use codex_core::CodexConversation; +use codex_core::ConversationManager; +use codex_core::ModelProviderInfo; +use codex_core::built_in_model_providers; +use codex_core::config::Config; +use codex_core::protocol::EventMsg; +use codex_core::protocol::InputItem; +use codex_core::protocol::Op; +use codex_core::protocol::ReviewCodeLocation; +use codex_core::protocol::ReviewFinding; +use codex_core::protocol::ReviewLineRange; +use codex_core::protocol::ReviewOutputEvent; +use codex_core::protocol::ReviewRequest; +use codex_core::spawn::CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR; +use core_test_support::load_default_config_for_test; +use core_test_support::load_sse_fixture_with_id_from_str; +use core_test_support::wait_for_event; +use pretty_assertions::assert_eq; +use std::path::PathBuf; +use std::sync::Arc; +use tempfile::TempDir; +use tokio::io::AsyncWriteExt as _; +use uuid::Uuid; +use wiremock::Mock; +use wiremock::MockServer; +use wiremock::ResponseTemplate; +use wiremock::matchers::method; +use wiremock::matchers::path; + +/// Verify that submitting `Op::Review` spawns a child task and emits +/// EnteredReviewMode -> ExitedReviewMode(None) -> TaskComplete +/// in that order when the model returns a structured review JSON payload. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn review_op_emits_lifecycle_and_review_output() { + // Skip under Codex sandbox network restrictions. + if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { + println!( + "Skipping test because it cannot execute when network is disabled in a Codex sandbox." + ); + return; + } + + // Start mock Responses API server. Return a single assistant message whose + // text is a JSON-encoded ReviewOutputEvent. + let review_json = serde_json::json!({ + "findings": [ + { + "title": "Prefer Stylize helpers", + "body": "Use .dim()/.bold() chaining instead of manual Style where possible.", + "confidence_score": 0.9, + "priority": 1, + "code_location": { + "absolute_file_path": "/tmp/file.rs", + "line_range": {"start": 10, "end": 20} + } + } + ], + "overall_correctness": "good", + "overall_explanation": "All good with some improvements suggested.", + "overall_confidence_score": 0.8 + }) + .to_string(); + let sse_template = r#"[ + {"type":"response.output_item.done", "item":{ + "type":"message", "role":"assistant", + "content":[{"type":"output_text","text":__REVIEW__}] + }}, + {"type":"response.completed", "response": {"id": "__ID__"}} + ]"#; + let review_json_escaped = serde_json::to_string(&review_json).unwrap(); + let sse_raw = sse_template.replace("__REVIEW__", &review_json_escaped); + let server = start_responses_server_with_sse(&sse_raw, 1).await; + let codex_home = TempDir::new().unwrap(); + let codex = new_conversation_for_server(&server, &codex_home, |_| {}).await; + + // Submit review request. + codex + .submit(Op::Review { + review_request: ReviewRequest { + prompt: "Please review my changes".to_string(), + user_facing_hint: "my changes".to_string(), + }, + }) + .await + .unwrap(); + + // Verify lifecycle: Entered -> Exited(Some(review)) -> TaskComplete. + let _entered = wait_for_event(&codex, |ev| matches!(ev, EventMsg::EnteredReviewMode(_))).await; + let closed = wait_for_event(&codex, |ev| matches!(ev, EventMsg::ExitedReviewMode(_))).await; + let review = match closed { + EventMsg::ExitedReviewMode(Some(r)) => r, + other => panic!("expected ExitedReviewMode(Some(..)), got {other:?}"), + }; + + // Deep compare full structure using PartialEq (floats are f32 on both sides). + let expected = ReviewOutputEvent { + findings: vec![ReviewFinding { + title: "Prefer Stylize helpers".to_string(), + body: "Use .dim()/.bold() chaining instead of manual Style where possible.".to_string(), + confidence_score: 0.9, + priority: 1, + code_location: ReviewCodeLocation { + absolute_file_path: PathBuf::from("/tmp/file.rs"), + line_range: ReviewLineRange { start: 10, end: 20 }, + }, + }], + overall_correctness: "good".to_string(), + overall_explanation: "All good with some improvements suggested.".to_string(), + overall_confidence_score: 0.8, + }; + assert_eq!(expected, review); + let _complete = wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; + + server.verify().await; +} + +/// When the model returns plain text that is not JSON, ensure the child +/// lifecycle still occurs and the plain text is surfaced via +/// ExitedReviewMode(Some(..)) as the overall_explanation. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn review_op_with_plain_text_emits_review_fallback() { + if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { + println!( + "Skipping test because it cannot execute when network is disabled in a Codex sandbox." + ); + return; + } + + let sse_raw = r#"[ + {"type":"response.output_item.done", "item":{ + "type":"message", "role":"assistant", + "content":[{"type":"output_text","text":"just plain text"}] + }}, + {"type":"response.completed", "response": {"id": "__ID__"}} + ]"#; + let server = start_responses_server_with_sse(sse_raw, 1).await; + let codex_home = TempDir::new().unwrap(); + let codex = new_conversation_for_server(&server, &codex_home, |_| {}).await; + + codex + .submit(Op::Review { + review_request: ReviewRequest { + prompt: "Plain text review".to_string(), + user_facing_hint: "plain text review".to_string(), + }, + }) + .await + .unwrap(); + + let _entered = wait_for_event(&codex, |ev| matches!(ev, EventMsg::EnteredReviewMode(_))).await; + let closed = wait_for_event(&codex, |ev| matches!(ev, EventMsg::ExitedReviewMode(_))).await; + let review = match closed { + EventMsg::ExitedReviewMode(Some(r)) => r, + other => panic!("expected ExitedReviewMode(Some(..)), got {other:?}"), + }; + + // Expect a structured fallback carrying the plain text. + let expected = ReviewOutputEvent { + overall_explanation: "just plain text".to_string(), + ..Default::default() + }; + assert_eq!(expected, review); + let _complete = wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; + + server.verify().await; +} + +/// When the model returns structured JSON in a review, ensure no AgentMessage +/// is emitted; the UI consumes the structured result via ExitedReviewMode. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn review_does_not_emit_agent_message_on_structured_output() { + if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { + println!( + "Skipping test because it cannot execute when network is disabled in a Codex sandbox." + ); + return; + } + + let review_json = serde_json::json!({ + "findings": [ + { + "title": "Example", + "body": "Structured review output.", + "confidence_score": 0.5, + "priority": 1, + "code_location": { + "absolute_file_path": "/tmp/file.rs", + "line_range": {"start": 1, "end": 2} + } + } + ], + "overall_correctness": "ok", + "overall_explanation": "ok", + "overall_confidence_score": 0.5 + }) + .to_string(); + let sse_template = r#"[ + {"type":"response.output_item.done", "item":{ + "type":"message", "role":"assistant", + "content":[{"type":"output_text","text":__REVIEW__}] + }}, + {"type":"response.completed", "response": {"id": "__ID__"}} + ]"#; + let review_json_escaped = serde_json::to_string(&review_json).unwrap(); + let sse_raw = sse_template.replace("__REVIEW__", &review_json_escaped); + let server = start_responses_server_with_sse(&sse_raw, 1).await; + let codex_home = TempDir::new().unwrap(); + let codex = new_conversation_for_server(&server, &codex_home, |_| {}).await; + + codex + .submit(Op::Review { + review_request: ReviewRequest { + prompt: "check structured".to_string(), + user_facing_hint: "check structured".to_string(), + }, + }) + .await + .unwrap(); + + // Drain events until TaskComplete; ensure none are AgentMessage. + use tokio::time::Duration; + use tokio::time::timeout; + let mut saw_entered = false; + let mut saw_exited = false; + loop { + let ev = timeout(Duration::from_secs(5), codex.next_event()) + .await + .expect("timeout waiting for event") + .expect("stream ended unexpectedly"); + match ev.msg { + EventMsg::TaskComplete(_) => break, + EventMsg::AgentMessage(_) => { + panic!("unexpected AgentMessage during review with structured output") + } + EventMsg::EnteredReviewMode(_) => saw_entered = true, + EventMsg::ExitedReviewMode(_) => saw_exited = true, + _ => {} + } + } + assert!(saw_entered && saw_exited, "missing review lifecycle events"); + + server.verify().await; +} + +/// Ensure that when a custom `review_model` is set in the config, the review +/// request uses that model (and not the main chat model). +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn review_uses_custom_review_model_from_config() { + if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { + println!( + "Skipping test because it cannot execute when network is disabled in a Codex sandbox." + ); + return; + } + + // Minimal stream: just a completed event + let sse_raw = r#"[ + {"type":"response.completed", "response": {"id": "__ID__"}} + ]"#; + let server = start_responses_server_with_sse(sse_raw, 1).await; + let codex_home = TempDir::new().unwrap(); + // Choose a review model different from the main model; ensure it is used. + let codex = new_conversation_for_server(&server, &codex_home, |cfg| { + cfg.model = "gpt-4.1".to_string(); + cfg.review_model = "gpt-5".to_string(); + }) + .await; + + codex + .submit(Op::Review { + review_request: ReviewRequest { + prompt: "use custom model".to_string(), + user_facing_hint: "use custom model".to_string(), + }, + }) + .await + .unwrap(); + + // Wait for completion + let _entered = wait_for_event(&codex, |ev| matches!(ev, EventMsg::EnteredReviewMode(_))).await; + let _closed = wait_for_event(&codex, |ev| matches!(ev, EventMsg::ExitedReviewMode(None))).await; + let _complete = wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; + + // Assert the request body model equals the configured review model + let request = &server.received_requests().await.unwrap()[0]; + let body = request.body_json::().unwrap(); + assert_eq!(body["model"].as_str().unwrap(), "gpt-5"); + + server.verify().await; +} + +/// When a review session begins, it must not prepend prior chat history from +/// the parent session. The request `input` should contain only the review +/// prompt from the user. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn review_input_isolated_from_parent_history() { + if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { + println!( + "Skipping test because it cannot execute when network is disabled in a Codex sandbox." + ); + return; + } + + // Mock server for the single review request + let sse_raw = r#"[ + {"type":"response.completed", "response": {"id": "__ID__"}} + ]"#; + let server = start_responses_server_with_sse(sse_raw, 1).await; + + // Seed a parent session history via resume file with both user + assistant items. + let codex_home = TempDir::new().unwrap(); + let mut config = load_default_config_for_test(&codex_home); + config.model_provider = ModelProviderInfo { + base_url: Some(format!("{}/v1", server.uri())), + ..built_in_model_providers()["openai"].clone() + }; + + let session_file = codex_home.path().join("resume.jsonl"); + { + let mut f = tokio::fs::File::create(&session_file).await.unwrap(); + let convo_id = Uuid::new_v4(); + // Proper session_meta line (enveloped) with a conversation id + let meta_line = serde_json::json!({ + "timestamp": "2024-01-01T00:00:00.000Z", + "type": "session_meta", + "payload": { + "id": convo_id, + "timestamp": "2024-01-01T00:00:00Z", + "instructions": null, + "cwd": ".", + "originator": "test_originator", + "cli_version": "test_version" + } + }); + f.write_all(format!("{meta_line}\n").as_bytes()) + .await + .unwrap(); + + // Prior user message (enveloped response_item) + let user = codex_protocol::models::ResponseItem::Message { + id: None, + role: "user".to_string(), + content: vec![codex_protocol::models::ContentItem::InputText { + text: "parent: earlier user message".to_string(), + }], + }; + let user_json = serde_json::to_value(&user).unwrap(); + let user_line = serde_json::json!({ + "timestamp": "2024-01-01T00:00:01.000Z", + "type": "response_item", + "payload": user_json + }); + f.write_all(format!("{user_line}\n").as_bytes()) + .await + .unwrap(); + + // Prior assistant message (enveloped response_item) + let assistant = codex_protocol::models::ResponseItem::Message { + id: None, + role: "assistant".to_string(), + content: vec![codex_protocol::models::ContentItem::OutputText { + text: "parent: assistant reply".to_string(), + }], + }; + let assistant_json = serde_json::to_value(&assistant).unwrap(); + let assistant_line = serde_json::json!({ + "timestamp": "2024-01-01T00:00:02.000Z", + "type": "response_item", + "payload": assistant_json + }); + f.write_all(format!("{assistant_line}\n").as_bytes()) + .await + .unwrap(); + } + config.experimental_resume = Some(session_file); + + let codex = new_conversation_for_server(&server, &codex_home, |cfg| { + // apply resume file + cfg.experimental_resume = config.experimental_resume.clone(); + }) + .await; + + // Submit review request; it must start fresh (no parent history in `input`). + let review_prompt = "Please review only this".to_string(); + codex + .submit(Op::Review { + review_request: ReviewRequest { + prompt: review_prompt.clone(), + user_facing_hint: review_prompt.clone(), + }, + }) + .await + .unwrap(); + + let _entered = wait_for_event(&codex, |ev| matches!(ev, EventMsg::EnteredReviewMode(_))).await; + let _closed = wait_for_event(&codex, |ev| matches!(ev, EventMsg::ExitedReviewMode(None))).await; + let _complete = wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; + + // Assert the request `input` contains only the single review user message. + let request = &server.received_requests().await.unwrap()[0]; + let body = request.body_json::().unwrap(); + let expected_input = serde_json::json!([ + { + "type": "message", + "role": "user", + "content": [{"type": "input_text", "text": review_prompt}] + } + ]); + assert_eq!(body["input"], expected_input); + + server.verify().await; +} + +/// After a review thread finishes, its conversation should not leak into the +/// parent session. A subsequent parent turn must not include any review +/// messages in its request `input`. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn review_history_does_not_leak_into_parent_session() { + if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { + println!( + "Skipping test because it cannot execute when network is disabled in a Codex sandbox." + ); + return; + } + + // Respond to both the review request and the subsequent parent request. + let sse_raw = r#"[ + {"type":"response.output_item.done", "item":{ + "type":"message", "role":"assistant", + "content":[{"type":"output_text","text":"review assistant output"}] + }}, + {"type":"response.completed", "response": {"id": "__ID__"}} + ]"#; + let server = start_responses_server_with_sse(sse_raw, 2).await; + let codex_home = TempDir::new().unwrap(); + let codex = new_conversation_for_server(&server, &codex_home, |_| {}).await; + + // 1) Run a review turn that produces an assistant message (isolated in child). + codex + .submit(Op::Review { + review_request: ReviewRequest { + prompt: "Start a review".to_string(), + user_facing_hint: "Start a review".to_string(), + }, + }) + .await + .unwrap(); + let _entered = wait_for_event(&codex, |ev| matches!(ev, EventMsg::EnteredReviewMode(_))).await; + let _closed = wait_for_event(&codex, |ev| { + matches!(ev, EventMsg::ExitedReviewMode(Some(_))) + }) + .await; + let _complete = wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; + + // 2) Continue in the parent session; request input must not include any review items. + let followup = "back to parent".to_string(); + codex + .submit(Op::UserInput { + items: vec![InputItem::Text { + text: followup.clone(), + }], + }) + .await + .unwrap(); + let _complete = wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; + + // Inspect the second request (parent turn) input contents. + // Parent turns include session initial messages (user_instructions, environment_context). + // Critically, no messages from the review thread should appear. + let requests = server.received_requests().await.unwrap(); + assert_eq!(requests.len(), 2); + let body = requests[1].body_json::().unwrap(); + let input = body["input"].as_array().expect("input array"); + + // Must include the followup as the last item for this turn + let last = input.last().expect("at least one item in input"); + assert_eq!(last["role"].as_str().unwrap(), "user"); + let last_text = last["content"][0]["text"].as_str().unwrap(); + assert_eq!(last_text, followup); + + // Ensure no review-thread content leaked into the parent request + let contains_review_prompt = input + .iter() + .any(|msg| msg["content"][0]["text"].as_str().unwrap_or_default() == "Start a review"); + let contains_review_assistant = input.iter().any(|msg| { + msg["content"][0]["text"].as_str().unwrap_or_default() == "review assistant output" + }); + assert!( + !contains_review_prompt, + "review prompt leaked into parent turn input" + ); + assert!( + !contains_review_assistant, + "review assistant output leaked into parent turn input" + ); + + server.verify().await; +} + +/// Start a mock Responses API server and mount the given SSE stream body. +async fn start_responses_server_with_sse(sse_raw: &str, expected_requests: usize) -> MockServer { + let server = MockServer::start().await; + let sse = load_sse_fixture_with_id_from_str(sse_raw, &Uuid::new_v4().to_string()); + Mock::given(method("POST")) + .and(path("/v1/responses")) + .respond_with( + ResponseTemplate::new(200) + .insert_header("content-type", "text/event-stream") + .set_body_raw(sse.clone(), "text/event-stream"), + ) + .expect(expected_requests as u64) + .mount(&server) + .await; + server +} + +/// Create a conversation configured to talk to the provided mock server. +#[expect(clippy::expect_used)] +async fn new_conversation_for_server( + server: &MockServer, + codex_home: &TempDir, + mutator: F, +) -> Arc +where + F: FnOnce(&mut Config), +{ + let model_provider = ModelProviderInfo { + base_url: Some(format!("{}/v1", server.uri())), + ..built_in_model_providers()["openai"].clone() + }; + let mut config = load_default_config_for_test(codex_home); + config.model_provider = model_provider; + mutator(&mut config); + let conversation_manager = + ConversationManager::with_auth(CodexAuth::from_api_key("Test API Key")); + conversation_manager + .new_conversation(config) + .await + .expect("create conversation") + .conversation +} diff --git a/codex-rs/exec/src/event_processor_with_human_output.rs b/codex-rs/exec/src/event_processor_with_human_output.rs index 3856e05bf5..c126208fad 100644 --- a/codex-rs/exec/src/event_processor_with_human_output.rs +++ b/codex-rs/exec/src/event_processor_with_human_output.rs @@ -562,6 +562,8 @@ impl EventProcessor for EventProcessorWithHumanOutput { EventMsg::ShutdownComplete => return CodexStatus::Shutdown, EventMsg::ConversationPath(_) => {} EventMsg::UserMessage(_) => {} + EventMsg::EnteredReviewMode(_) => {} + EventMsg::ExitedReviewMode(_) => {} } CodexStatus::Running } diff --git a/codex-rs/exec/src/lib.rs b/codex-rs/exec/src/lib.rs index 40b30f2bba..7853374b55 100644 --- a/codex-rs/exec/src/lib.rs +++ b/codex-rs/exec/src/lib.rs @@ -137,6 +137,7 @@ pub async fn run_main(cli: Cli, codex_linux_sandbox_exe: Option) -> any // Load configuration and determine approval policy let overrides = ConfigOverrides { model, + review_model: None, config_profile, // This CLI is intended to be headless and has no affordances for asking // the user for approval. diff --git a/codex-rs/mcp-server/src/codex_message_processor.rs b/codex-rs/mcp-server/src/codex_message_processor.rs index 2850c6b830..3fc4eec090 100644 --- a/codex-rs/mcp-server/src/codex_message_processor.rs +++ b/codex-rs/mcp-server/src/codex_message_processor.rs @@ -1248,6 +1248,7 @@ fn derive_config_from_params( } = params; let overrides = ConfigOverrides { model, + review_model: None, config_profile: profile, cwd: cwd.map(PathBuf::from), approval_policy, diff --git a/codex-rs/mcp-server/src/codex_tool_config.rs b/codex-rs/mcp-server/src/codex_tool_config.rs index 7b635d2dc3..d90924aa94 100644 --- a/codex-rs/mcp-server/src/codex_tool_config.rs +++ b/codex-rs/mcp-server/src/codex_tool_config.rs @@ -152,6 +152,7 @@ impl CodexToolCallParam { // Build the `ConfigOverrides` recognized by codex-core. let overrides = codex_core::config::ConfigOverrides { model, + review_model: None, config_profile: profile, cwd: cwd.map(PathBuf::from), approval_policy: approval_policy.map(Into::into), diff --git a/codex-rs/mcp-server/src/codex_tool_runner.rs b/codex-rs/mcp-server/src/codex_tool_runner.rs index 226408f805..db48da28e2 100644 --- a/codex-rs/mcp-server/src/codex_tool_runner.rs +++ b/codex-rs/mcp-server/src/codex_tool_runner.rs @@ -279,7 +279,9 @@ async fn run_codex_tool_session_inner( | EventMsg::TurnAborted(_) | EventMsg::ConversationPath(_) | EventMsg::UserMessage(_) - | EventMsg::ShutdownComplete => { + | EventMsg::ShutdownComplete + | EventMsg::EnteredReviewMode(_) + | EventMsg::ExitedReviewMode(_) => { // For now, we do not do anything extra for these // events. Note that // send(codex_event_to_notification(&event)) above has diff --git a/codex-rs/protocol/src/protocol.rs b/codex-rs/protocol/src/protocol.rs index f888accfd5..6f102cdeb1 100644 --- a/codex-rs/protocol/src/protocol.rs +++ b/codex-rs/protocol/src/protocol.rs @@ -166,6 +166,10 @@ pub enum Op { /// The agent will use its existing context (either conversation history or previous response id) /// to generate a summary which will be returned as an AgentMessage event. Compact, + + /// Request a code review from the agent. + Review { review_request: ReviewRequest }, + /// Request to shut down codex instance. Shutdown, } @@ -504,6 +508,12 @@ pub enum EventMsg { ShutdownComplete, ConversationPath(ConversationPathResponseEvent), + + /// Entered review mode. + EnteredReviewMode(ReviewRequest), + + /// Exited review mode with an optional final result to apply. + ExitedReviewMode(Option), } // Individual event payload types matching each `EventMsg` variant. @@ -962,6 +972,57 @@ pub struct GitInfo { pub repository_url: Option, } +/// Review request sent to the review session. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, TS)] +pub struct ReviewRequest { + pub prompt: String, + pub user_facing_hint: String, +} + +/// Structured review result produced by a child review session. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, TS)] +pub struct ReviewOutputEvent { + pub findings: Vec, + pub overall_correctness: String, + pub overall_explanation: String, + pub overall_confidence_score: f32, +} + +impl Default for ReviewOutputEvent { + fn default() -> Self { + Self { + findings: Vec::new(), + overall_correctness: String::default(), + overall_explanation: String::default(), + overall_confidence_score: 0.0, + } + } +} + +/// A single review finding describing an observed issue or recommendation. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, TS)] +pub struct ReviewFinding { + pub title: String, + pub body: String, + pub confidence_score: f32, + pub priority: i32, + pub code_location: ReviewCodeLocation, +} + +/// Location of the code related to a review finding. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, TS)] +pub struct ReviewCodeLocation { + pub absolute_file_path: PathBuf, + pub line_range: ReviewLineRange, +} + +/// Inclusive line range in a file associated with the finding. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, TS)] +pub struct ReviewLineRange { + pub start: u32, + pub end: u32, +} + #[derive(Debug, Clone, Deserialize, Serialize, TS)] pub struct ExecCommandBeginEvent { /// Identifier so this can be paired with the ExecCommandEnd event. diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 6a6c77d155..b53f87e664 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -1089,6 +1089,8 @@ impl ChatWidget { self.app_event_tx .send(crate::app_event::AppEvent::ConversationHistory(ev)); } + EventMsg::EnteredReviewMode(_) => {} + EventMsg::ExitedReviewMode(_) => {} } } diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 41e36a9cf1..7971ccf484 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -122,6 +122,7 @@ pub async fn run_main( let overrides = ConfigOverrides { model, + review_model: None, approval_policy, sandbox_mode, cwd, From 414b8be8b68e736c8fe0d97426538c25336842d9 Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Fri, 12 Sep 2025 16:51:30 -0700 Subject: [PATCH 18/77] Always request encrypted cot (#3539) Otherwise future requests will fail with 500 --- codex-rs/core/src/client_common.rs | 11 ++++++++--- codex-rs/core/tests/suite/client.rs | 17 ++++------------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/codex-rs/core/src/client_common.rs b/codex-rs/core/src/client_common.rs index 5aa0d8cf28..fd894a633f 100644 --- a/codex-rs/core/src/client_common.rs +++ b/codex-rs/core/src/client_common.rs @@ -84,8 +84,10 @@ pub enum ResponseEvent { #[derive(Debug, Serialize)] pub(crate) struct Reasoning { - pub(crate) effort: ReasoningEffortConfig, - pub(crate) summary: ReasoningSummaryConfig, + #[serde(skip_serializing_if = "Option::is_none")] + pub(crate) effort: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub(crate) summary: Option, } /// Controls under the `text` field in the Responses API for GPT-5. @@ -146,7 +148,10 @@ pub(crate) fn create_reasoning_param_for_request( return None; } - effort.map(|effort| Reasoning { effort, summary }) + Some(Reasoning { + effort, + summary: Some(summary), + }) } pub(crate) fn create_text_param_for_request( diff --git a/codex-rs/core/tests/suite/client.rs b/codex-rs/core/tests/suite/client.rs index 232788073d..8360a8366b 100644 --- a/codex-rs/core/tests/suite/client.rs +++ b/codex-rs/core/tests/suite/client.rs @@ -450,7 +450,6 @@ async fn chatgpt_auth_sends_correct_request() { // Init session let codex_home = TempDir::new().unwrap(); let mut config = load_default_config_for_test(&codex_home); - let include_reasoning = config.model_reasoning_effort.is_some(); config.model_provider = model_provider; let conversation_manager = ConversationManager::with_auth(create_dummy_codex_auth()); let NewConversation { @@ -492,18 +491,10 @@ async fn chatgpt_auth_sends_correct_request() { ); assert_eq!(request_chatgpt_account_id.to_str().unwrap(), "account_id"); assert!(request_body["stream"].as_bool().unwrap()); - if include_reasoning { - assert_eq!( - request_body["include"][0].as_str().unwrap(), - "reasoning.encrypted_content" - ); - } else { - assert!( - request_body["include"] - .as_array() - .is_none_or(|items| items.is_empty()) - ); - } + assert_eq!( + request_body["include"][0].as_str().unwrap(), + "reasoning.encrypted_content" + ); } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] From 3d4acbaea04527b2c2a4c32d4e6b6babe40e481a Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Fri, 12 Sep 2025 18:09:56 -0700 Subject: [PATCH 19/77] Preserve IDs for more item types in azure (#3542) https://github.com/openai/codex/issues/3509 --- codex-rs/core/src/client.rs | 8 ++++- codex-rs/core/tests/suite/client.rs | 55 ++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/codex-rs/core/src/client.rs b/codex-rs/core/src/client.rs index 6bea3820e8..055c3afa87 100644 --- a/codex-rs/core/src/client.rs +++ b/codex-rs/core/src/client.rs @@ -455,7 +455,13 @@ fn attach_item_ids(payload_json: &mut Value, original_items: &[ResponseItem]) { }; for (value, item) in items.iter_mut().zip(original_items.iter()) { - if let ResponseItem::Reasoning { id, .. } = item { + if let ResponseItem::Reasoning { id, .. } + | ResponseItem::Message { id: Some(id), .. } + | ResponseItem::WebSearchCall { id: Some(id), .. } + | ResponseItem::FunctionCall { id: Some(id), .. } + | ResponseItem::LocalShellCall { id: Some(id), .. } + | ResponseItem::CustomToolCall { id: Some(id), .. } = item + { if id.is_empty() { continue; } diff --git a/codex-rs/core/tests/suite/client.rs b/codex-rs/core/tests/suite/client.rs index 8360a8366b..70e0161d13 100644 --- a/codex-rs/core/tests/suite/client.rs +++ b/codex-rs/core/tests/suite/client.rs @@ -1,5 +1,9 @@ use codex_core::CodexAuth; +use codex_core::ContentItem; use codex_core::ConversationManager; +use codex_core::LocalShellAction; +use codex_core::LocalShellExecAction; +use codex_core::LocalShellStatus; use codex_core::ModelClient; use codex_core::ModelProviderInfo; use codex_core::NewConversation; @@ -15,6 +19,7 @@ use codex_core::protocol::Op; use codex_core::spawn::CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR; use codex_protocol::mcp_protocol::ConversationId; use codex_protocol::models::ReasoningItemReasoningSummary; +use codex_protocol::models::WebSearchAction; use core_test_support::load_default_config_for_test; use core_test_support::load_sse_fixture_with_id; use core_test_support::wait_for_event; @@ -699,6 +704,45 @@ async fn azure_responses_request_includes_store_and_reasoning_ids() { }]), encrypted_content: None, }); + prompt.input.push(ResponseItem::Message { + id: Some("message-id".into()), + role: "assistant".into(), + content: vec![ContentItem::OutputText { + text: "message".into(), + }], + }); + prompt.input.push(ResponseItem::WebSearchCall { + id: Some("web-search-id".into()), + status: Some("completed".into()), + action: WebSearchAction::Search { + query: "weather".into(), + }, + }); + prompt.input.push(ResponseItem::FunctionCall { + id: Some("function-id".into()), + name: "do_thing".into(), + arguments: "{}".into(), + call_id: "function-call-id".into(), + }); + prompt.input.push(ResponseItem::LocalShellCall { + id: Some("local-shell-id".into()), + call_id: Some("local-shell-call-id".into()), + status: LocalShellStatus::Completed, + action: LocalShellAction::Exec(LocalShellExecAction { + command: vec!["echo".into(), "hello".into()], + timeout_ms: None, + working_directory: None, + env: None, + user: None, + }), + }); + prompt.input.push(ResponseItem::CustomToolCall { + id: Some("custom-tool-id".into()), + status: Some("completed".into()), + call_id: "custom-tool-call-id".into(), + name: "custom_tool".into(), + input: "{}".into(), + }); let mut stream = client .stream(&prompt) @@ -722,10 +766,13 @@ async fn azure_responses_request_includes_store_and_reasoning_ids() { assert_eq!(body["store"], serde_json::Value::Bool(true)); assert_eq!(body["stream"], serde_json::Value::Bool(true)); - assert_eq!( - body["input"][0]["id"], - serde_json::Value::String("reasoning-id".into()) - ); + assert_eq!(body["input"].as_array().map(Vec::len), Some(6)); + assert_eq!(body["input"][0]["id"].as_str(), Some("reasoning-id")); + assert_eq!(body["input"][1]["id"].as_str(), Some("message-id")); + assert_eq!(body["input"][2]["id"].as_str(), Some("web-search-id")); + assert_eq!(body["input"][3]["id"].as_str(), Some("function-id")); + assert_eq!(body["input"][4]["id"].as_str(), Some("local-shell-id")); + assert_eq!(body["input"][5]["id"].as_str(), Some("custom-tool-id")); } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] From 19b4ed3c96e04c43ecb89c27eb637b3cf8148bc0 Mon Sep 17 00:00:00 2001 From: Thibault Sottiaux Date: Fri, 12 Sep 2025 22:44:05 -0700 Subject: [PATCH 20/77] w --- codex-rs/common/src/model_presets.rs | 22 ++++++++++++++++++---- codex-rs/core/src/config.rs | 17 ++++++++++------- codex-rs/tui/src/lib.rs | 4 ++-- codex-rs/tui/src/new_model_popup.rs | 7 ++++--- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/codex-rs/common/src/model_presets.rs b/codex-rs/common/src/model_presets.rs index cf536119e1..8606fcafe4 100644 --- a/codex-rs/common/src/model_presets.rs +++ b/codex-rs/common/src/model_presets.rs @@ -50,10 +50,24 @@ pub fn builtin_model_presets() -> &'static [ModelPreset] { effort: Some(ReasoningEffort::High), }, ModelPreset { - id: "gpt-5-high-new", - label: "gpt-5 high new", - description: "— our latest release tuned to rely on the model's built-in reasoning defaults", - model: "gpt-5-high-new", + id: "swiftfox-low", + label: "swiftfox low", + description: "— balances speed with some reasoning; useful for straightforward queries and short explanations", + model: "swiftfox-low", + effort: None, + }, + ModelPreset { + id: "swiftfox-medium", + label: "swiftfox medium", + description: "— default setting; provides a solid balance of reasoning depth and latency for general-purpose tasks", + model: "swiftfox-medium", + effort: None, + }, + ModelPreset { + id: "swiftfox-high", + label: "swiftfox high", + description: "", + model: "swiftfox-high", effort: None, }, ]; diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index 53e246d26d..4e010ae79d 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -33,7 +33,7 @@ use toml_edit::DocumentMut; const OPENAI_DEFAULT_MODEL: &str = "gpt-5"; const OPENAI_DEFAULT_REVIEW_MODEL: &str = "gpt-5"; -pub const GPT5_HIGH_MODEL: &str = "gpt-5-high-new"; +pub const SWIFTFOX_MEDIUM_MODEL: &str = "swiftfox-medium"; /// Maximum number of bytes of the documentation that will be embedded. Larger /// files are *silently truncated* to this size so we do not take up too much of @@ -1184,7 +1184,7 @@ exclude_slash_tmp = true persist_model_selection( codex_home.path(), None, - "gpt-5-high-new", + "swiftfox-high", Some(ReasoningEffort::High), ) .await?; @@ -1193,7 +1193,7 @@ exclude_slash_tmp = true tokio::fs::read_to_string(codex_home.path().join(CONFIG_TOML_FILE)).await?; let parsed: ConfigToml = toml::from_str(&serialized)?; - assert_eq!(parsed.model.as_deref(), Some("gpt-5-high-new")); + assert_eq!(parsed.model.as_deref(), Some("swiftfox-high")); assert_eq!(parsed.model_reasoning_effort, Some(ReasoningEffort::High)); Ok(()) @@ -1247,8 +1247,8 @@ model = "gpt-4.1" persist_model_selection( codex_home.path(), Some("dev"), - "gpt-5-high-new", - Some(ReasoningEffort::Low), + "swiftfox-medium", + Some(ReasoningEffort::Medium), ) .await?; @@ -1260,8 +1260,11 @@ model = "gpt-4.1" .get("dev") .expect("profile should be created"); - assert_eq!(profile.model.as_deref(), Some("gpt-5-high-new")); - assert_eq!(profile.model_reasoning_effort, Some(ReasoningEffort::Low)); + assert_eq!(profile.model.as_deref(), Some("swiftfox-medium")); + assert_eq!( + profile.model_reasoning_effort, + Some(ReasoningEffort::Medium) + ); Ok(()) } diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 7971ccf484..a9528dc875 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -11,7 +11,7 @@ use codex_core::RolloutRecorder; use codex_core::config::Config; use codex_core::config::ConfigOverrides; use codex_core::config::ConfigToml; -use codex_core::config::GPT5_HIGH_MODEL; +use codex_core::config::SWIFTFOX_MEDIUM_MODEL; use codex_core::config::find_codex_home; use codex_core::config::load_config_as_toml_with_cli_overrides; use codex_core::config::persist_model_selection; @@ -380,7 +380,7 @@ async fn run_ratatui_app( let switch_to_new_model = upgrade_decision == ModelUpgradeDecision::Switch; if switch_to_new_model { - config.model = GPT5_HIGH_MODEL.to_owned(); + config.model = SWIFTFOX_MEDIUM_MODEL.to_owned(); config.model_reasoning_effort = None; if let Err(e) = persist_model_selection( &config.codex_home, diff --git a/codex-rs/tui/src/new_model_popup.rs b/codex-rs/tui/src/new_model_popup.rs index ff09573e9f..0d7092840b 100644 --- a/codex-rs/tui/src/new_model_popup.rs +++ b/codex-rs/tui/src/new_model_popup.rs @@ -1,7 +1,7 @@ use crate::tui::FrameRequester; use crate::tui::Tui; use crate::tui::TuiEvent; -use codex_core::config::GPT5_HIGH_MODEL; +use codex_core::config::SWIFTFOX_MEDIUM_MODEL; use color_eyre::eyre::Result; use crossterm::event::KeyCode; use crossterm::event::KeyEvent; @@ -83,7 +83,8 @@ impl WidgetRef for &ModelUpgradePopup { let mut lines: Vec = vec![ String::new().into(), - format!(" Codex is now powered by {GPT5_HIGH_MODEL}, a new model that is").into(), + format!(" Codex is now powered by {SWIFTFOX_MEDIUM_MODEL}, a new model that is") + .into(), Line::from(vec![ " ".into(), "faster, a better collaborator, ".bold(), @@ -108,7 +109,7 @@ impl WidgetRef for &ModelUpgradePopup { lines.push(create_option( 0, ModelUpgradeOption::TryNewModel, - &format!("Yes, switch me to {GPT5_HIGH_MODEL}"), + &format!("Yes, switch me to {SWIFTFOX_MEDIUM_MODEL}"), )); lines.push(create_option( 1, From a77364bbaab268dc369edf593bb260bc83cd9a53 Mon Sep 17 00:00:00 2001 From: Thibault Sottiaux Date: Fri, 12 Sep 2025 22:55:40 -0700 Subject: [PATCH 21/77] chore: remove descriptions --- codex-rs/common/src/model_presets.rs | 44 ++++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/codex-rs/common/src/model_presets.rs b/codex-rs/common/src/model_presets.rs index 8606fcafe4..73db148f68 100644 --- a/codex-rs/common/src/model_presets.rs +++ b/codex-rs/common/src/model_presets.rs @@ -19,8 +19,29 @@ pub struct ModelPreset { /// /// Keep this UI-agnostic so it can be reused by both TUI and MCP server. pub fn builtin_model_presets() -> &'static [ModelPreset] { - // Order reflects effort from minimal to high. + // Order groups swiftfox variants before gpt-5 presets, each from minimal to high. const PRESETS: &[ModelPreset] = &[ + ModelPreset { + id: "swiftfox-low", + label: "swiftfox low", + description: "", + model: "swiftfox-low", + effort: None, + }, + ModelPreset { + id: "swiftfox-medium", + label: "swiftfox medium", + description: "", + model: "swiftfox-medium", + effort: None, + }, + ModelPreset { + id: "swiftfox-high", + label: "swiftfox high", + description: "", + model: "swiftfox-high", + effort: None, + }, ModelPreset { id: "gpt-5-minimal", label: "gpt-5 minimal", @@ -49,27 +70,6 @@ pub fn builtin_model_presets() -> &'static [ModelPreset] { model: "gpt-5", effort: Some(ReasoningEffort::High), }, - ModelPreset { - id: "swiftfox-low", - label: "swiftfox low", - description: "— balances speed with some reasoning; useful for straightforward queries and short explanations", - model: "swiftfox-low", - effort: None, - }, - ModelPreset { - id: "swiftfox-medium", - label: "swiftfox medium", - description: "— default setting; provides a solid balance of reasoning depth and latency for general-purpose tasks", - model: "swiftfox-medium", - effort: None, - }, - ModelPreset { - id: "swiftfox-high", - label: "swiftfox high", - description: "", - model: "swiftfox-high", - effort: None, - }, ]; PRESETS } From 14ab1063a7de43a6ef758e8bf64d12b6f0e0a204 Mon Sep 17 00:00:00 2001 From: Thibault Sottiaux Date: Fri, 12 Sep 2025 23:17:41 -0700 Subject: [PATCH 22/77] chore: rename --- codex-rs/core/src/internal_storage.rs | 4 ++-- codex-rs/tui/src/lib.rs | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/codex-rs/core/src/internal_storage.rs b/codex-rs/core/src/internal_storage.rs index f7d17e88f9..d6f71ff676 100644 --- a/codex-rs/core/src/internal_storage.rs +++ b/codex-rs/core/src/internal_storage.rs @@ -10,8 +10,8 @@ pub(crate) const INTERNAL_STORAGE_FILE: &str = "internal_storage.json"; pub struct InternalStorage { #[serde(skip)] storage_path: PathBuf, - #[serde(default)] - pub gpt_5_high_model_prompt_seen: bool, + #[serde(default, alias = "gpt_5_high_model_prompt_seen")] + pub swiftfox_model_prompt_seen: bool, } // TODO(jif) generalise all the file writers and build proper async channel inserters. diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index a9528dc875..8cac4d4bc4 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -369,9 +369,9 @@ async fn run_ratatui_app( &cli, &config, active_profile.as_deref(), - internal_storage.gpt_5_high_model_prompt_seen, + internal_storage.swiftfox_model_prompt_seen, ) { - internal_storage.gpt_5_high_model_prompt_seen = true; + internal_storage.swiftfox_model_prompt_seen = true; if let Err(e) = internal_storage.persist().await { error!("Failed to persist internal storage: {e:?}"); } @@ -513,7 +513,7 @@ fn should_show_model_rollout_prompt( cli: &Cli, config: &Config, active_profile: Option<&str>, - gpt_5_high_model_prompt_seen: bool, + swiftfox_model_prompt_seen: bool, ) -> bool { // TODO(jif) drop. let debug_high_enabled = std::env::var("DEBUG_HIGH") @@ -523,7 +523,7 @@ fn should_show_model_rollout_prompt( active_profile.is_none() && debug_high_enabled && cli.model.is_none() - && !gpt_5_high_model_prompt_seen + && !swiftfox_model_prompt_seen && config.model_provider.requires_openai_auth && !cli.oss } From bac8a427f39f045b67230c03f845d5591a7e034e Mon Sep 17 00:00:00 2001 From: Thibault Sottiaux Date: Sat, 13 Sep 2025 16:40:54 -0700 Subject: [PATCH 23/77] chore: default swiftfox models to experimental reasoning summaries (#3560) --- codex-rs/core/src/model_family.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/codex-rs/core/src/model_family.rs b/codex-rs/core/src/model_family.rs index 59fd622f1c..a042a50348 100644 --- a/codex-rs/core/src/model_family.rs +++ b/codex-rs/core/src/model_family.rs @@ -92,12 +92,6 @@ pub fn find_family_for_model(slug: &str) -> Option { supports_reasoning_summaries: true, uses_local_shell_tool: true, ) - } else if slug.starts_with("codex-") { - model_family!( - slug, slug, - supports_reasoning_summaries: true, - reasoning_summary_format: ReasoningSummaryFormat::Experimental, - ) } else if slug.starts_with("gpt-4.1") { model_family!( slug, "gpt-4.1", @@ -109,6 +103,12 @@ pub fn find_family_for_model(slug: &str) -> Option { simple_model_family!(slug, "gpt-4o") } else if slug.starts_with("gpt-3.5") { simple_model_family!(slug, "gpt-3.5") + } else if slug.starts_with("codex-") || slug.starts_with("swiftfox") { + model_family!( + slug, slug, + supports_reasoning_summaries: true, + reasoning_summary_format: ReasoningSummaryFormat::Experimental, + ) } else if slug.starts_with("gpt-5") { model_family!( slug, "gpt-5", From 4891ee29c5f80d5bdb2018ac521a7fa23adf09b4 Mon Sep 17 00:00:00 2001 From: Jeremy Rose <172423086+nornagon-openai@users.noreply.github.com> Date: Sat, 13 Sep 2025 19:23:14 -0700 Subject: [PATCH 24/77] refactor transcript view to handle HistoryCells (#3538) No (intended) functional change. This refactors the transcript view to hold a list of HistoryCells instead of a list of Lines. This simplifies and makes much of the logic more robust, as well as laying the groundwork for future changes, e.g. live-updating history cells in the transcript. Similar to #2879 in goal. Fixes #2755. --- codex-rs/core/src/conversation_manager.rs | 32 +- .../core/tests/suite/fork_conversation.rs | 14 +- codex-rs/tui/src/app.rs | 21 +- codex-rs/tui/src/app_backtrack.rs | 160 +++++----- codex-rs/tui/src/backtrack_helpers.rs | 153 --------- codex-rs/tui/src/history_cell.rs | 11 +- codex-rs/tui/src/lib.rs | 1 - codex-rs/tui/src/pager_overlay.rs | 302 +++++++++++------- ...ts__transcript_overlay_snapshot_basic.snap | 4 +- 9 files changed, 309 insertions(+), 389 deletions(-) delete mode 100644 codex-rs/tui/src/backtrack_helpers.rs diff --git a/codex-rs/core/src/conversation_manager.rs b/codex-rs/core/src/conversation_manager.rs index a5f66d4553..3c02e0ebfa 100644 --- a/codex-rs/core/src/conversation_manager.rs +++ b/codex-rs/core/src/conversation_manager.rs @@ -144,19 +144,19 @@ impl ConversationManager { self.conversations.write().await.remove(conversation_id) } - /// Fork an existing conversation by dropping the last `drop_last_messages` - /// user/assistant messages from its transcript and starting a new + /// Fork an existing conversation by taking messages up to the given position + /// (not including the message at the given position) and starting a new /// conversation with identical configuration (unless overridden by the /// caller's `config`). The new conversation will have a fresh id. pub async fn fork_conversation( &self, - num_messages_to_drop: usize, + nth_user_message: usize, config: Config, path: PathBuf, ) -> CodexResult { // Compute the prefix up to the cut point. let history = RolloutRecorder::get_rollout_history(&path).await?; - let history = truncate_after_dropping_last_messages(history, num_messages_to_drop); + let history = truncate_after_nth_user_message(history, nth_user_message); // Spawn a new conversation with the computed initial history. let auth_manager = self.auth_manager.clone(); @@ -169,14 +169,10 @@ impl ConversationManager { } } -/// Return a prefix of `items` obtained by dropping the last `n` user messages -/// and all items that follow them. -fn truncate_after_dropping_last_messages(history: InitialHistory, n: usize) -> InitialHistory { - if n == 0 { - return InitialHistory::Forked(history.get_rollout_items()); - } - - // Work directly on rollout items, and cut the vector at the nth-from-last user message input. +/// Return a prefix of `items` obtained by cutting strictly before the nth user message +/// (0-based) and all items that follow it. +fn truncate_after_nth_user_message(history: InitialHistory, n: usize) -> InitialHistory { + // Work directly on rollout items, and cut the vector at the nth user message input. let items: Vec = history.get_rollout_items(); // Find indices of user message inputs in rollout order. @@ -189,13 +185,13 @@ fn truncate_after_dropping_last_messages(history: InitialHistory, n: usize) -> I } } - // If fewer than n user messages exist, treat as empty. - if user_positions.len() < n { + // If fewer than or equal to n user messages exist, treat as empty (out of range). + if user_positions.len() <= n { return InitialHistory::New; } - // Cut strictly before the nth-from-last user message (do not keep the nth itself). - let cut_idx = user_positions[user_positions.len() - n]; + // Cut strictly before the nth user message (do not keep the nth itself). + let cut_idx = user_positions[n]; let rolled: Vec = items.into_iter().take(cut_idx).collect(); if rolled.is_empty() { @@ -262,7 +258,7 @@ mod tests { .cloned() .map(RolloutItem::ResponseItem) .collect(); - let truncated = truncate_after_dropping_last_messages(InitialHistory::Forked(initial), 1); + let truncated = truncate_after_nth_user_message(InitialHistory::Forked(initial), 1); let got_items = truncated.get_rollout_items(); let expected_items = vec![ RolloutItem::ResponseItem(items[0].clone()), @@ -279,7 +275,7 @@ mod tests { .cloned() .map(RolloutItem::ResponseItem) .collect(); - let truncated2 = truncate_after_dropping_last_messages(InitialHistory::Forked(initial2), 2); + let truncated2 = truncate_after_nth_user_message(InitialHistory::Forked(initial2), 2); assert!(matches!(truncated2, InitialHistory::New)); } } diff --git a/codex-rs/core/tests/suite/fork_conversation.rs b/codex-rs/core/tests/suite/fork_conversation.rs index 08e3f29d28..c9f66ea183 100644 --- a/codex-rs/core/tests/suite/fork_conversation.rs +++ b/codex-rs/core/tests/suite/fork_conversation.rs @@ -104,7 +104,8 @@ async fn fork_conversation_twice_drops_to_first_message() { items }; - // Compute expected prefixes after each fork by truncating base rollout at nth-from-last user input. + // Compute expected prefixes after each fork by truncating base rollout + // strictly before the nth user input (0-based). let base_items = read_items(&base_path); let find_user_input_positions = |items: &[RolloutItem]| -> Vec { let mut pos = Vec::new(); @@ -126,11 +127,8 @@ async fn fork_conversation_twice_drops_to_first_message() { }; let user_inputs = find_user_input_positions(&base_items); - // After dropping last user input (n=1), cut strictly before that input if present, else empty. - let cut1 = user_inputs - .get(user_inputs.len().saturating_sub(1)) - .copied() - .unwrap_or(0); + // After cutting at nth user input (n=1 → second user message), cut strictly before that input. + let cut1 = user_inputs.get(1).copied().unwrap_or(0); let expected_after_first: Vec = base_items[..cut1].to_vec(); // After dropping again (n=1 on fork1), compute expected relative to fork1's rollout. @@ -161,12 +159,12 @@ async fn fork_conversation_twice_drops_to_first_message() { serde_json::to_value(&expected_after_first).unwrap() ); - // Fork again with n=1 → drops the (new) last user message, leaving only the first. + // Fork again with n=0 → drops the (new) last user message, leaving only the first. let NewConversation { conversation: codex_fork2, .. } = conversation_manager - .fork_conversation(1, config_for_fork.clone(), fork1_path.clone()) + .fork_conversation(0, config_for_fork.clone(), fork1_path.clone()) .await .expect("fork 2"); diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index 2cb49b1849..d4a24d69f6 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -3,6 +3,7 @@ use crate::app_event::AppEvent; use crate::app_event_sender::AppEventSender; use crate::chatwidget::ChatWidget; use crate::file_search::FileSearchManager; +use crate::history_cell::HistoryCell; use crate::pager_overlay::Overlay; use crate::resume_picker::ResumeSelection; use crate::tui; @@ -46,7 +47,7 @@ pub(crate) struct App { pub(crate) file_search: FileSearchManager, - pub(crate) transcript_lines: Vec>, + pub(crate) transcript_cells: Vec>, // Pager overlay state (Transcript or Static like Diff) pub(crate) overlay: Option, @@ -131,7 +132,7 @@ impl App { model_saved_to_global: false, file_search, enhanced_keys_supported, - transcript_lines: Vec::new(), + transcript_cells: Vec::new(), overlay: None, deferred_history_lines: Vec::new(), has_emitted_history_lines: false, @@ -213,15 +214,12 @@ impl App { tui.frame_requester().schedule_frame(); } AppEvent::InsertHistoryCell(cell) => { - let mut cell_transcript = cell.transcript_lines(); - if !cell.is_stream_continuation() && !self.transcript_lines.is_empty() { - cell_transcript.insert(0, Line::from("")); - } + let cell: Arc = cell.into(); if let Some(Overlay::Transcript(t)) = &mut self.overlay { - t.insert_lines(cell_transcript.clone()); + t.insert_cell(cell.clone()); tui.frame_requester().schedule_frame(); } - self.transcript_lines.extend(cell_transcript.clone()); + self.transcript_cells.push(cell.clone()); let mut display = cell.display_lines(tui.terminal.last_known_screen_size.width); if !display.is_empty() { // Only insert a separating blank line for new cells that are not @@ -437,7 +435,7 @@ impl App { } => { // Enter alternate screen and set viewport to full size. let _ = tui.enter_alt_screen(); - self.overlay = Some(Overlay::new_transcript(self.transcript_lines.clone())); + self.overlay = Some(Overlay::new_transcript(self.transcript_cells.clone())); tui.frame_requester().schedule_frame(); } KeyEvent { @@ -470,7 +468,7 @@ impl App { kind: KeyEventKind::Press, .. } if self.backtrack.primed - && self.backtrack.count > 0 + && self.backtrack.nth_user_message != usize::MAX && self.chat_widget.composer_is_empty() => { // Delegate to helper for clarity; preserves behavior. @@ -503,7 +501,6 @@ mod tests { use crate::file_search::FileSearchManager; use codex_core::CodexAuth; use codex_core::ConversationManager; - use ratatui::text::Line; use std::sync::Arc; use std::sync::atomic::AtomicBool; @@ -525,7 +522,7 @@ mod tests { model_saved_to_profile: false, model_saved_to_global: false, file_search, - transcript_lines: Vec::>::new(), + transcript_cells: Vec::new(), overlay: None, deferred_history_lines: Vec::new(), has_emitted_history_lines: false, diff --git a/codex-rs/tui/src/app_backtrack.rs b/codex-rs/tui/src/app_backtrack.rs index d1765c1976..b3ca171ccc 100644 --- a/codex-rs/tui/src/app_backtrack.rs +++ b/codex-rs/tui/src/app_backtrack.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use crate::app::App; -use crate::backtrack_helpers; +use crate::history_cell::UserHistoryCell; use crate::pager_overlay::Overlay; use crate::tui; use crate::tui::TuiEvent; @@ -19,11 +19,11 @@ pub(crate) struct BacktrackState { pub(crate) primed: bool, /// Session id of the base conversation to fork from. pub(crate) base_id: Option, - /// Current step count (Nth last user message). - pub(crate) count: usize, + /// Index in the transcript of the last user message. + pub(crate) nth_user_message: usize, /// True when the transcript overlay is showing a backtrack preview. pub(crate) overlay_preview_active: bool, - /// Pending fork request: (base_id, drop_count, prefill). + /// Pending fork request: (base_id, nth_user_message, prefill). pub(crate) pending: Option<(ConversationId, usize, String)>, } @@ -96,9 +96,9 @@ impl App { &mut self, prefill: String, base_id: ConversationId, - drop_last_messages: usize, + nth_user_message: usize, ) { - self.backtrack.pending = Some((base_id, drop_last_messages, prefill)); + self.backtrack.pending = Some((base_id, nth_user_message, prefill)); self.app_event_tx.send(crate::app_event::AppEvent::CodexOp( codex_core::protocol::Op::GetPath, )); @@ -107,7 +107,7 @@ impl App { /// Open transcript overlay (enters alternate screen and shows full transcript). pub(crate) fn open_transcript_overlay(&mut self, tui: &mut tui::Tui) { let _ = tui.enter_alt_screen(); - self.overlay = Some(Overlay::new_transcript(self.transcript_lines.clone())); + self.overlay = Some(Overlay::new_transcript(self.transcript_cells.clone())); tui.frame_requester().schedule_frame(); } @@ -130,15 +130,17 @@ impl App { /// Re-render the full transcript into the terminal scrollback in one call. /// Useful when switching sessions to ensure prior history remains visible. pub(crate) fn render_transcript_once(&mut self, tui: &mut tui::Tui) { - if !self.transcript_lines.is_empty() { - tui.insert_history_lines(self.transcript_lines.clone()); + if !self.transcript_cells.is_empty() { + for cell in &self.transcript_cells { + tui.insert_history_lines(cell.transcript_lines()); + } } } /// Initialize backtrack state and show composer hint. fn prime_backtrack(&mut self) { self.backtrack.primed = true; - self.backtrack.count = 0; + self.backtrack.nth_user_message = usize::MAX; self.backtrack.base_id = self.chat_widget.conversation_id(); self.chat_widget.show_esc_backtrack_hint(); } @@ -157,51 +159,44 @@ impl App { self.backtrack.primed = true; self.backtrack.base_id = self.chat_widget.conversation_id(); self.backtrack.overlay_preview_active = true; - let sel = self.compute_backtrack_selection(tui, 1); - self.apply_backtrack_selection(sel); + let last_user_cell_position = self + .transcript_cells + .iter() + .filter_map(|c| c.as_any().downcast_ref::()) + .count() as i64 + - 1; + if last_user_cell_position >= 0 { + self.apply_backtrack_selection(last_user_cell_position as usize); + } tui.frame_requester().schedule_frame(); } /// Step selection to the next older user message and update overlay. fn step_backtrack_and_highlight(&mut self, tui: &mut tui::Tui) { - let next = self.backtrack.count.saturating_add(1); - let sel = self.compute_backtrack_selection(tui, next); - self.apply_backtrack_selection(sel); + let last_user_cell_position = self + .transcript_cells + .iter() + .filter(|c| c.as_any().is::()) + .take(self.backtrack.nth_user_message) + .count() + .saturating_sub(1); + self.apply_backtrack_selection(last_user_cell_position); tui.frame_requester().schedule_frame(); } - /// Compute normalized target, scroll offset, and highlight for requested step. - fn compute_backtrack_selection( - &self, - tui: &tui::Tui, - requested_n: usize, - ) -> (usize, Option, Option<(usize, usize)>) { - let nth = backtrack_helpers::normalize_backtrack_n(&self.transcript_lines, requested_n); - let header_idx = - backtrack_helpers::find_nth_last_user_header_index(&self.transcript_lines, nth); - let offset = header_idx.map(|idx| { - backtrack_helpers::wrapped_offset_before( - &self.transcript_lines, - idx, - tui.terminal.viewport_area.width, - ) - }); - let hl = backtrack_helpers::highlight_range_for_nth_last_user(&self.transcript_lines, nth); - (nth, offset, hl) - } - /// Apply a computed backtrack selection to the overlay and internal counter. - fn apply_backtrack_selection( - &mut self, - selection: (usize, Option, Option<(usize, usize)>), - ) { - let (nth, offset, hl) = selection; - self.backtrack.count = nth; + fn apply_backtrack_selection(&mut self, nth_user_message: usize) { + self.backtrack.nth_user_message = nth_user_message; if let Some(Overlay::Transcript(t)) = &mut self.overlay { - if let Some(off) = offset { - t.set_scroll_offset(off); + let cell = self + .transcript_cells + .iter() + .enumerate() + .filter(|(_, c)| c.as_any().is::()) + .nth(nth_user_message); + if let Some((idx, _)) = cell { + t.set_highlight_cell(Some(idx)); } - t.set_highlight_range(hl); } } @@ -219,13 +214,19 @@ impl App { /// Handle Enter in overlay backtrack preview: confirm selection and reset state. fn overlay_confirm_backtrack(&mut self, tui: &mut tui::Tui) { + let nth_user_message = self.backtrack.nth_user_message; if let Some(base_id) = self.backtrack.base_id { - let drop_last_messages = self.backtrack.count; - let prefill = - backtrack_helpers::nth_last_user_text(&self.transcript_lines, drop_last_messages) - .unwrap_or_default(); + let user_cells = self + .transcript_cells + .iter() + .filter_map(|c| c.as_any().downcast_ref::()) + .collect::>(); + let prefill = user_cells + .get(nth_user_message) + .map(|c| c.message.clone()) + .unwrap_or_default(); self.close_transcript_overlay(tui); - self.request_backtrack(prefill, base_id, drop_last_messages); + self.request_backtrack(prefill, base_id, nth_user_message); } self.reset_backtrack_state(); } @@ -244,11 +245,15 @@ impl App { /// Computes the prefill from the selected user message and requests history. pub(crate) fn confirm_backtrack_from_main(&mut self) { if let Some(base_id) = self.backtrack.base_id { - let drop_last_messages = self.backtrack.count; - let prefill = - backtrack_helpers::nth_last_user_text(&self.transcript_lines, drop_last_messages) - .unwrap_or_default(); - self.request_backtrack(prefill, base_id, drop_last_messages); + let prefill = self + .transcript_cells + .iter() + .filter(|c| c.as_any().is::()) + .nth(self.backtrack.nth_user_message) + .and_then(|c| c.as_any().downcast_ref::()) + .map(|c| c.message.clone()) + .unwrap_or_default(); + self.request_backtrack(prefill, base_id, self.backtrack.nth_user_message); } self.reset_backtrack_state(); } @@ -257,7 +262,7 @@ impl App { pub(crate) fn reset_backtrack_state(&mut self) { self.backtrack.primed = false; self.backtrack.base_id = None; - self.backtrack.count = 0; + self.backtrack.nth_user_message = usize::MAX; // In case a hint is somehow still visible (e.g., race with overlay open/close). self.chat_widget.clear_esc_backtrack_hint(); } @@ -271,9 +276,9 @@ impl App { ) -> Result<()> { if let Some((base_id, _, _)) = self.backtrack.pending.as_ref() && ev.conversation_id == *base_id - && let Some((_, drop_count, prefill)) = self.backtrack.pending.take() + && let Some((_, nth_user_message, prefill)) = self.backtrack.pending.take() { - self.fork_and_switch_to_new_conversation(tui, ev, drop_count, prefill) + self.fork_and_switch_to_new_conversation(tui, ev, nth_user_message, prefill) .await; } Ok(()) @@ -284,17 +289,17 @@ impl App { &mut self, tui: &mut tui::Tui, ev: ConversationPathResponseEvent, - drop_count: usize, + nth_user_message: usize, prefill: String, ) { let cfg = self.chat_widget.config_ref().clone(); // Perform the fork via a thin wrapper for clarity/testability. let result = self - .perform_fork(ev.path.clone(), drop_count, cfg.clone()) + .perform_fork(ev.path.clone(), nth_user_message, cfg.clone()) .await; match result { Ok(new_conv) => { - self.install_forked_conversation(tui, cfg, new_conv, drop_count, &prefill) + self.install_forked_conversation(tui, cfg, new_conv, nth_user_message, &prefill) } Err(e) => tracing::error!("error forking conversation: {e:#}"), } @@ -304,10 +309,12 @@ impl App { async fn perform_fork( &self, path: PathBuf, - drop_count: usize, + nth_user_message: usize, cfg: codex_core::config::Config, ) -> codex_core::error::Result { - self.server.fork_conversation(drop_count, cfg, path).await + self.server + .fork_conversation(nth_user_message, cfg, path) + .await } /// Install a forked conversation into the ChatWidget and update UI to reflect selection. @@ -316,7 +323,7 @@ impl App { tui: &mut tui::Tui, cfg: codex_core::config::Config, new_conv: codex_core::NewConversation, - drop_count: usize, + nth_user_message: usize, prefill: &str, ) { let conv = new_conv.conversation; @@ -332,7 +339,7 @@ impl App { self.chat_widget = crate::chatwidget::ChatWidget::new_from_existing(init, conv, session_configured); // Trim transcript up to the selected user message and re-render it. - self.trim_transcript_for_backtrack(drop_count); + self.trim_transcript_for_backtrack(nth_user_message); self.render_transcript_once(tui); if !prefill.is_empty() { self.chat_widget.set_composer_text(prefill.to_string()); @@ -340,14 +347,21 @@ impl App { tui.frame_requester().schedule_frame(); } - /// Trim transcript_lines to preserve only content up to the selected user message. - fn trim_transcript_for_backtrack(&mut self, drop_count: usize) { - if let Some(cut_idx) = - backtrack_helpers::find_nth_last_user_header_index(&self.transcript_lines, drop_count) - { - self.transcript_lines.truncate(cut_idx); - } else { - self.transcript_lines.clear(); - } + /// Trim transcript_cells to preserve only content up to the selected user message. + fn trim_transcript_for_backtrack(&mut self, nth_user_message: usize) { + let cut_idx = self + .transcript_cells + .iter() + .enumerate() + .filter_map(|(idx, cell)| { + if cell.as_any().is::() { + Some(idx) + } else { + None + } + }) + .nth(nth_user_message - 1) + .unwrap_or(self.transcript_cells.len()); + self.transcript_cells.truncate(cut_idx); } } diff --git a/codex-rs/tui/src/backtrack_helpers.rs b/codex-rs/tui/src/backtrack_helpers.rs deleted file mode 100644 index e2306b80b1..0000000000 --- a/codex-rs/tui/src/backtrack_helpers.rs +++ /dev/null @@ -1,153 +0,0 @@ -use ratatui::text::Line; - -/// Convenience: compute the highlight range for the Nth last user message. -pub(crate) fn highlight_range_for_nth_last_user( - lines: &[Line<'_>], - n: usize, -) -> Option<(usize, usize)> { - let header = find_nth_last_user_header_index(lines, n)?; - Some(highlight_range_from_header(lines, header)) -} - -/// Compute the wrapped display-line offset before `header_idx`, for a given width. -pub(crate) fn wrapped_offset_before(lines: &[Line<'_>], header_idx: usize, width: u16) -> usize { - let before = &lines[0..header_idx]; - crate::wrapping::word_wrap_lines(before, width as usize).len() -} - -/// Find the header index for the Nth last user message in the transcript. -/// Returns `None` if `n == 0` or there are fewer than `n` user messages. -pub(crate) fn find_nth_last_user_header_index(lines: &[Line<'_>], n: usize) -> Option { - if n == 0 { - return None; - } - let mut found = 0usize; - for (idx, line) in lines.iter().enumerate().rev() { - let content: String = line - .spans - .iter() - .map(|s| s.content.as_ref()) - .collect::>() - .join(""); - if content.trim() == "user" { - found += 1; - if found == n { - return Some(idx); - } - } - } - None -} - -/// Normalize a requested backtrack step `n` against the available user messages. -/// - Returns `0` if there are no user messages. -/// - Returns `n` if the Nth last user message exists. -/// - Otherwise wraps to `1` (the most recent user message). -pub(crate) fn normalize_backtrack_n(lines: &[Line<'_>], n: usize) -> usize { - if n == 0 { - return 0; - } - if find_nth_last_user_header_index(lines, n).is_some() { - return n; - } - if find_nth_last_user_header_index(lines, 1).is_some() { - 1 - } else { - 0 - } -} - -/// Extract the text content of the Nth last user message. -/// The message body is considered to be the lines following the "user" header -/// until the first blank line. -pub(crate) fn nth_last_user_text(lines: &[Line<'_>], n: usize) -> Option { - let header_idx = find_nth_last_user_header_index(lines, n)?; - extract_message_text_after_header(lines, header_idx) -} - -/// Extract message text starting after `header_idx` until the first blank line. -fn extract_message_text_after_header(lines: &[Line<'_>], header_idx: usize) -> Option { - let start = header_idx + 1; - let mut out: Vec = Vec::new(); - for line in lines.iter().skip(start) { - let is_blank = line - .spans - .iter() - .all(|s| s.content.as_ref().trim().is_empty()); - if is_blank { - break; - } - let text: String = line - .spans - .iter() - .map(|s| s.content.as_ref()) - .collect::>() - .join(""); - out.push(text); - } - if out.is_empty() { - None - } else { - Some(out.join("\n")) - } -} - -/// Given a header index, return the inclusive range for the message block -/// [header_idx, end) where end is the first blank line after the header or the -/// end of the transcript. -fn highlight_range_from_header(lines: &[Line<'_>], header_idx: usize) -> (usize, usize) { - let mut end = header_idx + 1; - while end < lines.len() { - let is_blank = lines[end] - .spans - .iter() - .all(|s| s.content.as_ref().trim().is_empty()); - if is_blank { - break; - } - end += 1; - } - (header_idx, end) -} - -#[cfg(test)] -mod tests { - use super::*; - - fn line(s: &str) -> Line<'static> { - s.to_string().into() - } - - fn transcript_with_users(count: usize) -> Vec> { - // Build a transcript with `count` user messages, each followed by one body line and a blank line. - let mut v = Vec::new(); - for i in 0..count { - v.push(line("user")); - v.push(line(&format!("message {i}"))); - v.push(line("")); - } - v - } - - #[test] - fn normalize_wraps_to_one_when_past_oldest() { - let lines = transcript_with_users(2); - assert_eq!(normalize_backtrack_n(&lines, 1), 1); - assert_eq!(normalize_backtrack_n(&lines, 2), 2); - // Requesting 3rd when only 2 exist wraps to 1 - assert_eq!(normalize_backtrack_n(&lines, 3), 1); - } - - #[test] - fn normalize_returns_zero_when_no_user_messages() { - let lines = transcript_with_users(0); - assert_eq!(normalize_backtrack_n(&lines, 1), 0); - assert_eq!(normalize_backtrack_n(&lines, 5), 0); - } - - #[test] - fn normalize_keeps_valid_n() { - let lines = transcript_with_users(3); - assert_eq!(normalize_backtrack_n(&lines, 2), 2); - } -} diff --git a/codex-rs/tui/src/history_cell.rs b/codex-rs/tui/src/history_cell.rs index e4405d7b93..31a91753e4 100644 --- a/codex-rs/tui/src/history_cell.rs +++ b/codex-rs/tui/src/history_cell.rs @@ -43,6 +43,7 @@ use ratatui::style::Stylize; use ratatui::widgets::Paragraph; use ratatui::widgets::WidgetRef; use ratatui::widgets::Wrap; +use std::any::Any; use std::collections::HashMap; use std::io::Cursor; use std::path::Path; @@ -69,7 +70,7 @@ pub(crate) enum PatchEventType { /// Represents an event to display in the conversation history. Returns its /// `Vec>` representation to make it easier to display in a /// scrollable list. -pub(crate) trait HistoryCell: std::fmt::Debug + Send + Sync { +pub(crate) trait HistoryCell: std::fmt::Debug + Send + Sync + Any { fn display_lines(&self, width: u16) -> Vec>; fn transcript_lines(&self) -> Vec> { @@ -89,9 +90,15 @@ pub(crate) trait HistoryCell: std::fmt::Debug + Send + Sync { } } +impl dyn HistoryCell { + pub(crate) fn as_any(&self) -> &dyn Any { + self + } +} + #[derive(Debug)] pub(crate) struct UserHistoryCell { - message: String, + pub message: String, } impl HistoryCell for UserHistoryCell { diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 8cac4d4bc4..e5b35fbdc4 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -31,7 +31,6 @@ mod app; mod app_backtrack; mod app_event; mod app_event_sender; -mod backtrack_helpers; mod bottom_pane; mod chatwidget; mod citation_regex; diff --git a/codex-rs/tui/src/pager_overlay.rs b/codex-rs/tui/src/pager_overlay.rs index 0a7e54f06f..e5524b252b 100644 --- a/codex-rs/tui/src/pager_overlay.rs +++ b/codex-rs/tui/src/pager_overlay.rs @@ -1,6 +1,8 @@ use std::io::Result; +use std::sync::Arc; use std::time::Duration; +use crate::history_cell::HistoryCell; use crate::render::line_utils::push_owned_lines; use crate::tui; use crate::tui::TuiEvent; @@ -15,6 +17,7 @@ use ratatui::style::Styled; use ratatui::style::Stylize; use ratatui::text::Line; use ratatui::text::Span; +use ratatui::text::Text; use ratatui::widgets::Paragraph; use ratatui::widgets::WidgetRef; @@ -24,8 +27,8 @@ pub(crate) enum Overlay { } impl Overlay { - pub(crate) fn new_transcript(lines: Vec>) -> Self { - Self::Transcript(TranscriptOverlay::new(lines)) + pub(crate) fn new_transcript(cells: Vec>) -> Self { + Self::Transcript(TranscriptOverlay::new(cells)) } pub(crate) fn new_static_with_title(lines: Vec>, title: String) -> Self { @@ -73,21 +76,24 @@ fn render_key_hints(area: Rect, buf: &mut Buffer, pairs: &[(&str, &str)]) { /// Generic widget for rendering a pager view. struct PagerView { - lines: Vec>, + texts: Vec>, scroll_offset: usize, title: String, wrap_cache: Option, last_content_height: Option, + /// If set, on next render ensure this chunk is visible. + pending_scroll_chunk: Option, } impl PagerView { - fn new(lines: Vec>, title: String, scroll_offset: usize) -> Self { + fn new(texts: Vec>, title: String, scroll_offset: usize) -> Self { Self { - lines, + texts, scroll_offset, title, wrap_cache: None, last_content_height: None, + pending_scroll_chunk: None, } } @@ -96,6 +102,14 @@ impl PagerView { let content_area = self.scroll_area(area); self.update_last_content_height(content_area.height); self.ensure_wrapped(content_area.width); + // If there is a pending request to scroll a specific chunk into view, + // satisfy it now that wrapping is up to date for this width. + if let (Some(idx), Some(cache)) = + (self.pending_scroll_chunk.take(), self.wrap_cache.as_ref()) + && let Some(range) = cache.chunk_ranges.get(idx).cloned() + { + self.ensure_range_visible(range, content_area.height as usize, cache.wrapped.len()); + } // Compute page bounds without holding an immutable borrow on cache while mutating self let wrapped_len = self .wrap_cache @@ -108,40 +122,12 @@ impl PagerView { let start = self.scroll_offset; let end = (start + content_area.height as usize).min(wrapped_len); - let (wrapped, _src_idx) = self.cached(); + let wrapped = self.cached(); let page = &wrapped[start..end]; self.render_content_page_prepared(content_area, buf, page); self.render_bottom_bar(area, content_area, buf, wrapped); } - fn render_with_highlight( - &mut self, - area: Rect, - buf: &mut Buffer, - highlight: Option<(usize, usize)>, - ) { - self.render_header(area, buf); - let content_area = self.scroll_area(area); - self.update_last_content_height(content_area.height); - self.ensure_wrapped(content_area.width); - // Compute page bounds first to avoid borrow conflicts - let wrapped_len = self - .wrap_cache - .as_ref() - .map(|c| c.wrapped.len()) - .unwrap_or(0); - self.scroll_offset = self - .scroll_offset - .min(wrapped_len.saturating_sub(content_area.height as usize)); - let start = self.scroll_offset; - let end = (start + content_area.height as usize).min(wrapped_len); - - let (wrapped, src_idx) = self.cached(); - let page = self.page_with_optional_highlight(wrapped, src_idx, start, end, highlight); - self.render_content_page_prepared(content_area, buf, &page); - self.render_bottom_bar(area, content_area, buf, wrapped); - } - fn render_header(&self, area: Rect, buf: &mut Buffer) { Span::from("/ ".repeat(area.width as usize / 2)) .dim() @@ -270,7 +256,8 @@ impl PagerView { struct WrapCache { width: u16, wrapped: Vec>, - src_idx: Vec, + /// For each input Text chunk, the inclusive-excluded range of wrapped lines produced. + chunk_ranges: Vec>, base_len: usize, } @@ -278,74 +265,39 @@ impl PagerView { fn ensure_wrapped(&mut self, width: u16) { let width = width.max(1); let needs = match self.wrap_cache { - Some(ref c) => c.width != width || c.base_len != self.lines.len(), + Some(ref c) => c.width != width || c.base_len != self.texts.len(), None => true, }; if !needs { return; } let mut wrapped: Vec> = Vec::new(); - let mut src_idx: Vec = Vec::new(); - for (i, line) in self.lines.iter().enumerate() { - let ws = crate::wrapping::word_wrap_line(line, width as usize); - src_idx.extend(std::iter::repeat_n(i, ws.len())); - push_owned_lines(&ws, &mut wrapped); + let mut chunk_ranges: Vec> = Vec::with_capacity(self.texts.len()); + for text in &self.texts { + let start = wrapped.len(); + for line in &text.lines { + let ws = crate::wrapping::word_wrap_line(line, width as usize); + push_owned_lines(&ws, &mut wrapped); + } + let end = wrapped.len(); + chunk_ranges.push(start..end); } self.wrap_cache = Some(WrapCache { width, wrapped, - src_idx, - base_len: self.lines.len(), + chunk_ranges, + base_len: self.texts.len(), }); } - fn cached(&self) -> (&[Line<'static>], &[usize]) { + fn cached(&self) -> &[Line<'static>] { if let Some(cache) = self.wrap_cache.as_ref() { - (&cache.wrapped, &cache.src_idx) + &cache.wrapped } else { - (&[], &[]) + &[] } } - fn page_with_optional_highlight<'a>( - &self, - wrapped: &'a [Line<'static>], - src_idx: &[usize], - start: usize, - end: usize, - highlight: Option<(usize, usize)>, - ) -> std::borrow::Cow<'a, [Line<'static>]> { - use ratatui::style::Modifier; - let (hi_start, hi_end) = match highlight { - Some(r) => r, - None => return std::borrow::Cow::Borrowed(&wrapped[start..end]), - }; - let mut out: Vec> = Vec::with_capacity(end - start); - let mut bold_done = false; - for (row, src_line) in wrapped - .iter() - .enumerate() - .skip(start) - .take(end.saturating_sub(start)) - { - let mut line = src_line.clone(); - if let Some(src) = src_idx.get(row).copied() - && src >= hi_start - && src < hi_end - { - for (i, s) in line.spans.iter_mut().enumerate() { - s.style.add_modifier |= Modifier::REVERSED; - if !bold_done && i == 0 { - s.style.add_modifier |= Modifier::BOLD; - bold_done = true; - } - } - } - out.push(line); - } - std::borrow::Cow::Owned(out) - } - fn is_scrolled_to_bottom(&self) -> bool { if self.scroll_offset == usize::MAX { return true; @@ -363,38 +315,108 @@ impl PagerView { let max_scroll = cache.wrapped.len().saturating_sub(visible); self.scroll_offset >= max_scroll } + + /// Request that the given text chunk index be scrolled into view on next render. + fn scroll_chunk_into_view(&mut self, chunk_index: usize) { + self.pending_scroll_chunk = Some(chunk_index); + } + + fn ensure_range_visible( + &mut self, + range: std::ops::Range, + viewport_height: usize, + total_wrapped: usize, + ) { + if viewport_height == 0 || total_wrapped == 0 { + return; + } + let first = range.start.min(total_wrapped.saturating_sub(1)); + let last = range + .end + .saturating_sub(1) + .min(total_wrapped.saturating_sub(1)); + let current_top = self.scroll_offset.min(total_wrapped.saturating_sub(1)); + let current_bottom = current_top.saturating_add(viewport_height.saturating_sub(1)); + + if first < current_top { + self.scroll_offset = first; + } else if last > current_bottom { + // Scroll just enough so that 'last' is visible at the bottom + self.scroll_offset = last.saturating_sub(viewport_height.saturating_sub(1)); + } + } } pub(crate) struct TranscriptOverlay { view: PagerView, - highlight_range: Option<(usize, usize)>, + cells: Vec>, + highlight_cell: Option, is_done: bool, } impl TranscriptOverlay { - pub(crate) fn new(transcript_lines: Vec>) -> Self { + pub(crate) fn new(transcript_cells: Vec>) -> Self { Self { view: PagerView::new( - transcript_lines, + Self::render_cells_to_texts(&transcript_cells, None), "T R A N S C R I P T".to_string(), usize::MAX, ), - highlight_range: None, + cells: transcript_cells, + highlight_cell: None, is_done: false, } } - pub(crate) fn insert_lines(&mut self, lines: Vec>) { + fn render_cells_to_texts( + cells: &[Arc], + highlight_cell: Option, + ) -> Vec> { + let mut texts: Vec> = Vec::new(); + let mut first = true; + for (idx, cell) in cells.iter().enumerate() { + let mut lines: Vec> = Vec::new(); + if !cell.is_stream_continuation() && !first { + lines.push(Line::from("")); + } + let cell_lines = if Some(idx) == highlight_cell { + cell.transcript_lines() + .into_iter() + .map(|l| l.reversed()) + .collect() + } else { + cell.transcript_lines() + }; + lines.extend(cell_lines); + texts.push(Text::from(lines)); + first = false; + } + texts + } + + pub(crate) fn insert_cell(&mut self, cell: Arc) { let follow_bottom = self.view.is_scrolled_to_bottom(); - self.view.lines.extend(lines); + // Append as a new Text chunk (with a separating blank if needed) + let mut lines: Vec> = Vec::new(); + if !cell.is_stream_continuation() && !self.cells.is_empty() { + lines.push(Line::from("")); + } + lines.extend(cell.transcript_lines()); + self.view.texts.push(Text::from(lines)); + self.cells.push(cell); self.view.wrap_cache = None; if follow_bottom { self.view.scroll_offset = usize::MAX; } } - pub(crate) fn set_highlight_range(&mut self, range: Option<(usize, usize)>) { - self.highlight_range = range; + pub(crate) fn set_highlight_cell(&mut self, cell: Option) { + self.highlight_cell = cell; + self.view.wrap_cache = None; + self.view.texts = Self::render_cells_to_texts(&self.cells, self.highlight_cell); + if let Some(idx) = self.highlight_cell { + self.view.scroll_chunk_into_view(idx); + } } fn render_hints(&self, area: Rect, buf: &mut Buffer) { @@ -402,9 +424,7 @@ impl TranscriptOverlay { let line2 = Rect::new(area.x, area.y.saturating_add(1), area.width, 1); render_key_hints(line1, buf, PAGER_KEY_HINTS); let mut pairs: Vec<(&str, &str)> = vec![("q", "quit"), ("Esc", "edit prev")]; - if let Some((start, end)) = self.highlight_range - && end > start - { + if self.highlight_cell.is_some() { pairs.push(("⏎", "edit message")); } render_key_hints(line2, buf, &pairs); @@ -414,8 +434,7 @@ impl TranscriptOverlay { let top_h = area.height.saturating_sub(3); let top = Rect::new(area.x, area.y, area.width, top_h); let bottom = Rect::new(area.x, area.y + top_h, area.width, 3); - self.view - .render_with_highlight(top, buf, self.highlight_range); + self.view.render(top, buf); self.render_hints(bottom, buf); } } @@ -458,9 +477,6 @@ impl TranscriptOverlay { pub(crate) fn is_done(&self) -> bool { self.is_done } - pub(crate) fn set_scroll_offset(&mut self, offset: usize) { - self.view.scroll_offset = offset; - } } pub(crate) struct StaticOverlay { @@ -471,7 +487,7 @@ pub(crate) struct StaticOverlay { impl StaticOverlay { pub(crate) fn with_title(lines: Vec>, title: String) -> Self { Self { - view: PagerView::new(lines, title, 0), + view: PagerView::new(vec![Text::from(lines)], title, 0), is_done: false, } } @@ -534,9 +550,26 @@ mod tests { use ratatui::Terminal; use ratatui::backend::TestBackend; + #[derive(Debug)] + struct TestCell { + lines: Vec>, + } + + impl crate::history_cell::HistoryCell for TestCell { + fn display_lines(&self, _width: u16) -> Vec> { + self.lines.clone() + } + + fn transcript_lines(&self) -> Vec> { + self.lines.clone() + } + } + #[test] fn edit_prev_hint_is_visible() { - let mut overlay = TranscriptOverlay::new(vec![Line::from("hello")]); + let mut overlay = TranscriptOverlay::new(vec![Arc::new(TestCell { + lines: vec![Line::from("hello")], + })]); // Render into a small buffer and assert the backtrack hint is present let area = Rect::new(0, 0, 40, 10); @@ -561,9 +594,15 @@ mod tests { fn transcript_overlay_snapshot_basic() { // Prepare a transcript overlay with a few lines let mut overlay = TranscriptOverlay::new(vec![ - Line::from("alpha"), - Line::from("beta"), - Line::from("gamma"), + Arc::new(TestCell { + lines: vec![Line::from("alpha")], + }), + Arc::new(TestCell { + lines: vec![Line::from("beta")], + }), + Arc::new(TestCell { + lines: vec![Line::from("gamma")], + }), ]); let mut term = Terminal::new(TestBackend::new(40, 10)).expect("term"); term.draw(|f| overlay.render(f.area(), f.buffer_mut())) @@ -573,8 +612,15 @@ mod tests { #[test] fn transcript_overlay_keeps_scroll_pinned_at_bottom() { - let mut overlay = - TranscriptOverlay::new((0..20).map(|i| Line::from(format!("line{i}"))).collect()); + let mut overlay = TranscriptOverlay::new( + (0..20) + .map(|i| { + Arc::new(TestCell { + lines: vec![Line::from(format!("line{i}"))], + }) as Arc + }) + .collect(), + ); let mut term = Terminal::new(TestBackend::new(40, 12)).expect("term"); term.draw(|f| overlay.render(f.area(), f.buffer_mut())) .expect("draw"); @@ -584,22 +630,33 @@ mod tests { "expected initial render to leave view at bottom" ); - overlay.insert_lines(vec!["tail".into()]); + overlay.insert_cell(Arc::new(TestCell { + lines: vec!["tail".into()], + })); assert_eq!(overlay.view.scroll_offset, usize::MAX); } #[test] fn transcript_overlay_preserves_manual_scroll_position() { - let mut overlay = - TranscriptOverlay::new((0..20).map(|i| Line::from(format!("line{i}"))).collect()); + let mut overlay = TranscriptOverlay::new( + (0..20) + .map(|i| { + Arc::new(TestCell { + lines: vec![Line::from(format!("line{i}"))], + }) as Arc + }) + .collect(), + ); let mut term = Terminal::new(TestBackend::new(40, 12)).expect("term"); term.draw(|f| overlay.render(f.area(), f.buffer_mut())) .expect("draw"); overlay.view.scroll_offset = 0; - overlay.insert_lines(vec!["tail".into()]); + overlay.insert_cell(Arc::new(TestCell { + lines: vec!["tail".into()], + })); assert_eq!(overlay.view.scroll_offset, 0); } @@ -620,17 +677,21 @@ mod tests { #[test] fn pager_wrap_cache_reuses_for_same_width_and_rebuilds_on_change() { let long = "This is a long line that should wrap multiple times to ensure non-empty wrapped output."; - let mut pv = PagerView::new(vec![long.into(), long.into()], "T".to_string(), 0); + let mut pv = PagerView::new( + vec![Text::from(vec![long.into()]), Text::from(vec![long.into()])], + "T".to_string(), + 0, + ); // Build cache at width 24 pv.ensure_wrapped(24); - let (w1, _) = pv.cached(); + let w1 = pv.cached(); assert!(!w1.is_empty(), "expected wrapped output to be non-empty"); let ptr1 = w1.as_ptr(); // Re-run with same width: cache should be reused (pointer stability heuristic) pv.ensure_wrapped(24); - let (w2, _) = pv.cached(); + let w2 = pv.cached(); let ptr2 = w2.as_ptr(); assert_eq!(ptr1, ptr2, "cache should not rebuild for unchanged width"); @@ -638,7 +699,7 @@ mod tests { // Drop immutable borrow before mutating let prev_len = w2.len(); pv.ensure_wrapped(36); - let (w3, _) = pv.cached(); + let w3 = pv.cached(); assert_ne!( prev_len, w3.len(), @@ -649,15 +710,16 @@ mod tests { #[test] fn pager_wrap_cache_invalidates_on_append() { let long = "Another long line for wrapping behavior verification."; - let mut pv = PagerView::new(vec![long.into()], "T".to_string(), 0); + let mut pv = PagerView::new(vec![Text::from(vec![long.into()])], "T".to_string(), 0); pv.ensure_wrapped(28); - let (w1, _) = pv.cached(); + let w1 = pv.cached(); let len1 = w1.len(); // Append new lines should cause ensure_wrapped to rebuild due to len change - pv.lines.extend([long.into(), long.into()]); + pv.texts.push(Text::from(vec![long.into()])); + pv.texts.push(Text::from(vec![long.into()])); pv.ensure_wrapped(28); - let (w2, _) = pv.cached(); + let w2 = pv.cached(); assert!( w2.len() >= len1, "wrapped length should grow or stay same after append" diff --git a/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__transcript_overlay_snapshot_basic.snap b/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__transcript_overlay_snapshot_basic.snap index b9105e8021..0c03edef47 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__transcript_overlay_snapshot_basic.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__transcript_overlay_snapshot_basic.snap @@ -4,10 +4,10 @@ expression: term.backend() --- "/ T R A N S C R I P T / / / / / / / / / " "alpha " +" " "beta " +" " "gamma " -"~ " -"~ " "───────────────────────────────── 100% ─" " ↑/↓ scroll PgUp/PgDn page Home/End " " q quit Esc edit prev " From bbea6bbf7e758488df757102b6631bf380d9e8d6 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Sun, 14 Sep 2025 09:23:31 -0400 Subject: [PATCH 25/77] Handle resuming/forking after compact (#3533) We need to construct the history different when compact happens. For this, we need to just consider the history after compact and convert compact to a response item. This needs to change and use `build_compact_history` when this #3446 is merged. --- codex-rs/core/src/codex.rs | 261 +++++- codex-rs/core/src/codex/compact.rs | 13 +- codex-rs/core/tests/suite/compact.rs | 17 +- .../core/tests/suite/compact_resume_fork.rs | 838 ++++++++++++++++++ codex-rs/core/tests/suite/mod.rs | 1 + codex-rs/protocol/src/protocol.rs | 34 +- 6 files changed, 1118 insertions(+), 46 deletions(-) create mode 100644 codex-rs/core/tests/suite/compact_resume_fork.rs diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 9aa8486a0d..4745c4da3b 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -130,6 +130,8 @@ use codex_protocol::models::ShellToolCallParams; use codex_protocol::protocol::InitialHistory; mod compact; +use self::compact::build_compacted_history; +use self::compact::collect_user_messages; // A convenience extension trait for acquiring mutex locks where poisoning is // unrecoverable and should abort the program. This avoids scattered `.unwrap()` @@ -205,7 +207,7 @@ impl Codex { config.clone(), auth_manager.clone(), tx_event.clone(), - conversation_history.clone(), + conversation_history, ) .await .map_err(|e| { @@ -564,9 +566,10 @@ impl Session { let persist = matches!(conversation_history, InitialHistory::Forked(_)); // Always add response items to conversation history - let response_items = conversation_history.get_response_items(); - if !response_items.is_empty() { - self.record_into_history(&response_items); + let reconstructed_history = + self.reconstruct_history_from_rollout(turn_context, &rollout_items); + if !reconstructed_history.is_empty() { + self.record_into_history(&reconstructed_history); } // If persisting, persist all rollout items as-is (recorder filters) @@ -678,6 +681,33 @@ impl Session { self.persist_rollout_response_items(items).await; } + fn reconstruct_history_from_rollout( + &self, + turn_context: &TurnContext, + rollout_items: &[RolloutItem], + ) -> Vec { + let mut history = ConversationHistory::new(); + for item in rollout_items { + match item { + RolloutItem::ResponseItem(response_item) => { + history.record_items(std::iter::once(response_item)); + } + RolloutItem::Compacted(compacted) => { + let snapshot = history.contents(); + let user_messages = collect_user_messages(&snapshot); + let rebuilt = build_compacted_history( + self.build_initial_context(turn_context), + &user_messages, + &compacted.message, + ); + history.replace(rebuilt); + } + _ => {} + } + } + history.contents() + } + /// Append ResponseItems to the in-memory conversation history only. fn record_into_history(&self, items: &[ResponseItem]) { self.state @@ -3220,18 +3250,59 @@ async fn exit_review_mode( #[cfg(test)] mod tests { use super::*; + use crate::config::ConfigOverrides; + use crate::config::ConfigToml; + use crate::protocol::CompactedItem; + use crate::protocol::InitialHistory; + use crate::protocol::ResumedHistory; + use codex_protocol::models::ContentItem; use mcp_types::ContentBlock; use mcp_types::TextContent; use pretty_assertions::assert_eq; use serde_json::json; + use std::path::PathBuf; + use std::sync::Arc; use std::time::Duration as StdDuration; - fn text_block(s: &str) -> ContentBlock { - ContentBlock::TextContent(TextContent { - annotations: None, - text: s.to_string(), - r#type: "text".to_string(), - }) + #[test] + fn reconstruct_history_matches_live_compactions() { + let (session, turn_context) = make_session_and_context(); + let (rollout_items, expected) = sample_rollout(&session, &turn_context); + + let reconstructed = session.reconstruct_history_from_rollout(&turn_context, &rollout_items); + + assert_eq!(expected, reconstructed); + } + + #[test] + fn record_initial_history_reconstructs_resumed_transcript() { + let (session, turn_context) = make_session_and_context(); + let (rollout_items, expected) = sample_rollout(&session, &turn_context); + + tokio_test::block_on(session.record_initial_history( + &turn_context, + InitialHistory::Resumed(ResumedHistory { + conversation_id: ConversationId::default(), + history: rollout_items, + rollout_path: PathBuf::from("/tmp/resume.jsonl"), + }), + )); + + let actual = session.state.lock_unchecked().history.contents(); + assert_eq!(expected, actual); + } + + #[test] + fn record_initial_history_reconstructs_forked_transcript() { + let (session, turn_context) = make_session_and_context(); + let (rollout_items, expected) = sample_rollout(&session, &turn_context); + + tokio_test::block_on( + session.record_initial_history(&turn_context, InitialHistory::Forked(rollout_items)), + ); + + let actual = session.state.lock_unchecked().history.contents(); + assert_eq!(expected, actual); } #[test] @@ -3386,4 +3457,174 @@ mod tests { assert_eq!(expected, got); } + + fn text_block(s: &str) -> ContentBlock { + ContentBlock::TextContent(TextContent { + annotations: None, + text: s.to_string(), + r#type: "text".to_string(), + }) + } + + fn make_session_and_context() -> (Session, TurnContext) { + let (tx_event, _rx_event) = async_channel::unbounded(); + let codex_home = tempfile::tempdir().expect("create temp dir"); + let config = Config::load_from_base_config_with_overrides( + ConfigToml::default(), + ConfigOverrides::default(), + codex_home.path().to_path_buf(), + ) + .expect("load default test config"); + let config = Arc::new(config); + let conversation_id = ConversationId::default(); + let client = ModelClient::new( + config.clone(), + None, + config.model_provider.clone(), + config.model_reasoning_effort, + config.model_reasoning_summary, + conversation_id, + ); + let tools_config = ToolsConfig::new(&ToolsConfigParams { + model_family: &config.model_family, + approval_policy: config.approval_policy, + sandbox_policy: config.sandbox_policy.clone(), + include_plan_tool: config.include_plan_tool, + include_apply_patch_tool: config.include_apply_patch_tool, + include_web_search_request: config.tools_web_search_request, + use_streamable_shell_tool: config.use_experimental_streamable_shell_tool, + include_view_image_tool: config.include_view_image_tool, + experimental_unified_exec_tool: config.use_experimental_unified_exec_tool, + }); + let turn_context = TurnContext { + client, + cwd: config.cwd.clone(), + base_instructions: config.base_instructions.clone(), + user_instructions: config.user_instructions.clone(), + approval_policy: config.approval_policy, + sandbox_policy: config.sandbox_policy.clone(), + shell_environment_policy: config.shell_environment_policy.clone(), + tools_config, + is_review_mode: false, + }; + let session = Session { + conversation_id, + tx_event, + mcp_connection_manager: McpConnectionManager::default(), + session_manager: ExecSessionManager::default(), + unified_exec_manager: UnifiedExecSessionManager::default(), + notify: None, + rollout: Mutex::new(None), + state: Mutex::new(State { + history: ConversationHistory::new(), + ..Default::default() + }), + codex_linux_sandbox_exe: None, + user_shell: shell::Shell::Unknown, + show_raw_agent_reasoning: config.show_raw_agent_reasoning, + }; + (session, turn_context) + } + + fn sample_rollout( + session: &Session, + turn_context: &TurnContext, + ) -> (Vec, Vec) { + let mut rollout_items = Vec::new(); + let mut live_history = ConversationHistory::new(); + + let initial_context = session.build_initial_context(turn_context); + for item in &initial_context { + rollout_items.push(RolloutItem::ResponseItem(item.clone())); + } + live_history.record_items(initial_context.iter()); + + let user1 = ResponseItem::Message { + id: None, + role: "user".to_string(), + content: vec![ContentItem::InputText { + text: "first user".to_string(), + }], + }; + live_history.record_items(std::iter::once(&user1)); + rollout_items.push(RolloutItem::ResponseItem(user1.clone())); + + let assistant1 = ResponseItem::Message { + id: None, + role: "assistant".to_string(), + content: vec![ContentItem::OutputText { + text: "assistant reply one".to_string(), + }], + }; + live_history.record_items(std::iter::once(&assistant1)); + rollout_items.push(RolloutItem::ResponseItem(assistant1.clone())); + + let summary1 = "summary one"; + let snapshot1 = live_history.contents(); + let user_messages1 = collect_user_messages(&snapshot1); + let rebuilt1 = build_compacted_history( + session.build_initial_context(turn_context), + &user_messages1, + summary1, + ); + live_history.replace(rebuilt1); + rollout_items.push(RolloutItem::Compacted(CompactedItem { + message: summary1.to_string(), + })); + + let user2 = ResponseItem::Message { + id: None, + role: "user".to_string(), + content: vec![ContentItem::InputText { + text: "second user".to_string(), + }], + }; + live_history.record_items(std::iter::once(&user2)); + rollout_items.push(RolloutItem::ResponseItem(user2.clone())); + + let assistant2 = ResponseItem::Message { + id: None, + role: "assistant".to_string(), + content: vec![ContentItem::OutputText { + text: "assistant reply two".to_string(), + }], + }; + live_history.record_items(std::iter::once(&assistant2)); + rollout_items.push(RolloutItem::ResponseItem(assistant2.clone())); + + let summary2 = "summary two"; + let snapshot2 = live_history.contents(); + let user_messages2 = collect_user_messages(&snapshot2); + let rebuilt2 = build_compacted_history( + session.build_initial_context(turn_context), + &user_messages2, + summary2, + ); + live_history.replace(rebuilt2); + rollout_items.push(RolloutItem::Compacted(CompactedItem { + message: summary2.to_string(), + })); + + let user3 = ResponseItem::Message { + id: None, + role: "user".to_string(), + content: vec![ContentItem::InputText { + text: "third user".to_string(), + }], + }; + live_history.record_items(std::iter::once(&user3)); + rollout_items.push(RolloutItem::ResponseItem(user3.clone())); + + let assistant3 = ResponseItem::Message { + id: None, + role: "assistant".to_string(), + content: vec![ContentItem::OutputText { + text: "assistant reply three".to_string(), + }], + }; + live_history.record_items(std::iter::once(&assistant3)); + rollout_items.push(RolloutItem::ResponseItem(assistant3.clone())); + + (rollout_items, live_history.contents()) + } } diff --git a/codex-rs/core/src/codex/compact.rs b/codex-rs/core/src/codex/compact.rs index 757cf2e049..a465f937d4 100644 --- a/codex-rs/core/src/codex/compact.rs +++ b/codex-rs/core/src/codex/compact.rs @@ -176,8 +176,8 @@ async fn run_compact_task_inner( }; let summary_text = get_last_assistant_message_from_turn(&history_snapshot).unwrap_or_default(); let user_messages = collect_user_messages(&history_snapshot); - let new_history = - build_compacted_history(&sess, turn_context.as_ref(), &user_messages, &summary_text); + let initial_context = sess.build_initial_context(turn_context.as_ref()); + let new_history = build_compacted_history(initial_context, &user_messages, &summary_text); { let mut state = sess.state.lock_unchecked(); state.history.replace(new_history); @@ -223,7 +223,7 @@ fn content_items_to_text(content: &[ContentItem]) -> Option { } } -fn collect_user_messages(items: &[ResponseItem]) -> Vec { +pub(crate) fn collect_user_messages(items: &[ResponseItem]) -> Vec { items .iter() .filter_map(|item| match item { @@ -243,13 +243,12 @@ fn is_session_prefix_message(text: &str) -> bool { ) } -fn build_compacted_history( - sess: &Session, - turn_context: &TurnContext, +pub(crate) fn build_compacted_history( + initial_context: Vec, user_messages: &[String], summary_text: &str, ) -> Vec { - let mut history = sess.build_initial_context(turn_context); + let mut history = initial_context; let user_messages_text = if user_messages.is_empty() { "(none)".to_string() } else { diff --git a/codex-rs/core/tests/suite/compact.rs b/codex-rs/core/tests/suite/compact.rs index c61c4a5cde..72f4021e83 100644 --- a/codex-rs/core/tests/suite/compact.rs +++ b/codex-rs/core/tests/suite/compact.rs @@ -34,7 +34,7 @@ use std::sync::atomic::Ordering; // --- Test helpers ----------------------------------------------------------- /// Build an SSE stream body from a list of JSON events. -fn sse(events: Vec) -> String { +pub(super) fn sse(events: Vec) -> String { use std::fmt::Write as _; let mut out = String::new(); for ev in events { @@ -50,7 +50,7 @@ fn sse(events: Vec) -> String { } /// Convenience: SSE event for a completed response with a specific id. -fn ev_completed(id: &str) -> Value { +pub(super) fn ev_completed(id: &str) -> Value { serde_json::json!({ "type": "response.completed", "response": { @@ -77,7 +77,7 @@ fn ev_completed_with_tokens(id: &str, total_tokens: u64) -> Value { } /// Convenience: SSE event for a single assistant message output item. -fn ev_assistant_message(id: &str, text: &str) -> Value { +pub(super) fn ev_assistant_message(id: &str, text: &str) -> Value { serde_json::json!({ "type": "response.output_item.done", "item": { @@ -101,13 +101,13 @@ fn ev_function_call(call_id: &str, name: &str, arguments: &str) -> Value { }) } -fn sse_response(body: String) -> ResponseTemplate { +pub(super) fn sse_response(body: String) -> ResponseTemplate { ResponseTemplate::new(200) .insert_header("content-type", "text/event-stream") .set_body_raw(body, "text/event-stream") } -async fn mount_sse_once(server: &MockServer, matcher: M, body: String) +pub(super) async fn mount_sse_once(server: &MockServer, matcher: M, body: String) where M: wiremock::Match + Send + Sync + 'static, { @@ -115,7 +115,6 @@ where .and(path("/v1/responses")) .and(matcher) .respond_with(sse_response(body)) - .expect(1) .mount(server) .await; } @@ -127,9 +126,9 @@ async fn start_mock_server() -> MockServer { .await } -const FIRST_REPLY: &str = "FIRST_REPLY"; -const SUMMARY_TEXT: &str = "SUMMARY_ONLY_CONTEXT"; -const SUMMARIZE_TRIGGER: &str = "Start Summarization"; +pub(super) const FIRST_REPLY: &str = "FIRST_REPLY"; +pub(super) const SUMMARY_TEXT: &str = "SUMMARY_ONLY_CONTEXT"; +pub(super) const SUMMARIZE_TRIGGER: &str = "Start Summarization"; const THIRD_USER_MSG: &str = "next turn"; const AUTO_SUMMARY_TEXT: &str = "AUTO_SUMMARY"; const FIRST_AUTO_MSG: &str = "token limit start"; diff --git a/codex-rs/core/tests/suite/compact_resume_fork.rs b/codex-rs/core/tests/suite/compact_resume_fork.rs new file mode 100644 index 0000000000..dd14ad89b5 --- /dev/null +++ b/codex-rs/core/tests/suite/compact_resume_fork.rs @@ -0,0 +1,838 @@ +#![allow(clippy::expect_used)] + +//! Integration tests that cover compacting, resuming, and forking conversations. +//! +//! Each test sets up a mocked SSE conversation and drives the conversation through +//! a specific sequence of operations. After every operation we capture the +//! request payload that Codex would send to the model and assert that the +//! model-visible history matches the expected sequence of messages. + +use super::compact::FIRST_REPLY; +use super::compact::SUMMARIZE_TRIGGER; +use super::compact::SUMMARY_TEXT; +use super::compact::ev_assistant_message; +use super::compact::ev_completed; +use super::compact::mount_sse_once; +use super::compact::sse; +use codex_core::CodexAuth; +use codex_core::CodexConversation; +use codex_core::ConversationManager; +use codex_core::ModelProviderInfo; +use codex_core::NewConversation; +use codex_core::built_in_model_providers; +use codex_core::config::Config; +use codex_core::protocol::ConversationPathResponseEvent; +use codex_core::protocol::EventMsg; +use codex_core::protocol::InputItem; +use codex_core::protocol::Op; +use codex_core::spawn::CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR; +use core_test_support::load_default_config_for_test; +use core_test_support::wait_for_event; +use pretty_assertions::assert_eq; +use serde_json::Value; +use serde_json::json; +use std::sync::Arc; +use tempfile::TempDir; +use wiremock::MockServer; + +const AFTER_SECOND_RESUME: &str = "AFTER_SECOND_RESUME"; + +fn network_disabled() -> bool { + std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +/// Scenario: compact an initial conversation, resume it, fork one turn back, and +/// ensure the model-visible history matches expectations at each request. +async fn compact_resume_and_fork_preserve_model_history_view() { + if network_disabled() { + println!("Skipping test because network is disabled in this sandbox"); + return; + } + + // 1. Arrange mocked SSE responses for the initial compact/resume/fork flow. + let server = MockServer::start().await; + mount_initial_flow(&server).await; + + // 2. Start a new conversation and drive it through the compact/resume/fork steps. + let (_home, config, manager, base) = start_test_conversation(&server).await; + + user_turn(&base, "hello world").await; + compact_conversation(&base).await; + user_turn(&base, "AFTER_COMPACT").await; + let base_path = fetch_conversation_path(&base, "base conversation").await; + assert!( + base_path.exists(), + "compact+resume test expects base path {base_path:?} to exist", + ); + + let resumed = resume_conversation(&manager, &config, base_path).await; + user_turn(&resumed, "AFTER_RESUME").await; + let resumed_path = fetch_conversation_path(&resumed, "resumed conversation").await; + assert!( + resumed_path.exists(), + "compact+resume test expects resumed path {resumed_path:?} to exist", + ); + + let forked = fork_conversation(&manager, &config, resumed_path, 4).await; + user_turn(&forked, "AFTER_FORK").await; + + // 3. Capture the requests to the model and validate the history slices. + let requests = gather_request_bodies(&server).await; + + // input after compact is a prefix of input after resume/fork + let input_after_compact = json!(requests[requests.len() - 3]["input"]); + let input_after_resume = json!(requests[requests.len() - 2]["input"]); + let input_after_fork = json!(requests[requests.len() - 1]["input"]); + + let compact_arr = input_after_compact + .as_array() + .expect("input after compact should be an array"); + let resume_arr = input_after_resume + .as_array() + .expect("input after resume should be an array"); + let fork_arr = input_after_fork + .as_array() + .expect("input after fork should be an array"); + + assert!( + compact_arr.len() <= resume_arr.len(), + "after-resume input should have at least as many items as after-compact", + ); + assert_eq!(compact_arr.as_slice(), &resume_arr[..compact_arr.len()]); + eprint!( + "len of compact: {}, len of fork: {}", + compact_arr.len(), + fork_arr.len() + ); + eprintln!("input_after_fork:{}", json!(input_after_fork)); + assert!( + compact_arr.len() <= fork_arr.len(), + "after-fork input should have at least as many items as after-compact", + ); + assert_eq!(compact_arr.as_slice(), &fork_arr[..compact_arr.len()]); + + let prompt = requests[0]["instructions"] + .as_str() + .unwrap_or_default() + .to_string(); + let user_instructions = requests[0]["input"][0]["content"][0]["text"] + .as_str() + .unwrap_or_default() + .to_string(); + let environment_context = requests[0]["input"][1]["content"][0]["text"] + .as_str() + .unwrap_or_default() + .to_string(); + let tool_calls = json!(requests[0]["tools"].as_array()); + let prompt_cache_key = requests[0]["prompt_cache_key"] + .as_str() + .unwrap_or_default() + .to_string(); + let fork_prompt_cache_key = requests[requests.len() - 1]["prompt_cache_key"] + .as_str() + .unwrap_or_default() + .to_string(); + let user_turn_1 = json!( + { + "model": "gpt-5", + "instructions": prompt, + "input": [ + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": user_instructions + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": environment_context + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "hello world" + } + ] + } + ], + "tools": tool_calls, + "tool_choice": "auto", + "parallel_tool_calls": false, + "reasoning": { + "summary": "auto" + }, + "store": false, + "stream": true, + "include": [ + "reasoning.encrypted_content" + ], + "prompt_cache_key": prompt_cache_key + }); + let compact_1 = json!( + { + "model": "gpt-5", + "instructions": "You have exceeded the maximum number of tokens, please stop coding and instead write a short memento message for the next agent. Your note should: +- Summarize what you finished and what still needs work. If there was a recent update_plan call, repeat its steps verbatim. +- List outstanding TODOs with file paths / line numbers so they're easy to find. +- Flag code that needs more tests (edge cases, performance, integration, etc.). +- Record any open bugs, quirks, or setup steps that will make it easier for the next agent to pick up where you left off.", + "input": [ + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": user_instructions + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": environment_context + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "hello world" + } + ] + }, + { + "type": "message", + "role": "assistant", + "content": [ + { + "type": "output_text", + "text": "FIRST_REPLY" + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "Start Summarization" + } + ] + } + ], + "tools": [], + "tool_choice": "auto", + "parallel_tool_calls": false, + "reasoning": { + "summary": "auto" + }, + "store": false, + "stream": true, + "include": [ + "reasoning.encrypted_content" + ], + "prompt_cache_key": prompt_cache_key + }); + let user_turn_2_after_compact = json!( + { + "model": "gpt-5", + "instructions": prompt, + "input": [ + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": user_instructions + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": environment_context + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "You were originally given instructions from a user over one or more turns. Here were the user messages: + +hello world + +Another language model started to solve this problem and produced a summary of its thinking process. You also have access to the state of the tools that were used by that language model. Use this to build on the work that has already been done and avoid duplicating work. Here is the summary produced by the other language model, use the information in this summary to assist with your own analysis: + +SUMMARY_ONLY_CONTEXT" + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "AFTER_COMPACT" + } + ] + } + ], + "tools": tool_calls, + "tool_choice": "auto", + "parallel_tool_calls": false, + "reasoning": { + "summary": "auto" + }, + "store": false, + "stream": true, + "include": [ + "reasoning.encrypted_content" + ], + "prompt_cache_key": prompt_cache_key + }); + let usert_turn_3_after_resume = json!( + { + "model": "gpt-5", + "instructions": prompt, + "input": [ + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": user_instructions + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": environment_context + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "You were originally given instructions from a user over one or more turns. Here were the user messages: + +hello world + +Another language model started to solve this problem and produced a summary of its thinking process. You also have access to the state of the tools that were used by that language model. Use this to build on the work that has already been done and avoid duplicating work. Here is the summary produced by the other language model, use the information in this summary to assist with your own analysis: + +SUMMARY_ONLY_CONTEXT" + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "AFTER_COMPACT" + } + ] + }, + { + "type": "message", + "role": "assistant", + "content": [ + { + "type": "output_text", + "text": "AFTER_COMPACT_REPLY" + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "AFTER_RESUME" + } + ] + } + ], + "tools": tool_calls, + "tool_choice": "auto", + "parallel_tool_calls": false, + "reasoning": { + "summary": "auto" + }, + "store": false, + "stream": true, + "include": [ + "reasoning.encrypted_content" + ], + "prompt_cache_key": prompt_cache_key + }); + let user_turn_3_after_fork = json!( + { + "model": "gpt-5", + "instructions": prompt, + "input": [ + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": user_instructions + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": environment_context + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "You were originally given instructions from a user over one or more turns. Here were the user messages: + +hello world + +Another language model started to solve this problem and produced a summary of its thinking process. You also have access to the state of the tools that were used by that language model. Use this to build on the work that has already been done and avoid duplicating work. Here is the summary produced by the other language model, use the information in this summary to assist with your own analysis: + +SUMMARY_ONLY_CONTEXT" + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "AFTER_COMPACT" + } + ] + }, + { + "type": "message", + "role": "assistant", + "content": [ + { + "type": "output_text", + "text": "AFTER_COMPACT_REPLY" + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "AFTER_FORK" + } + ] + } + ], + "tools": tool_calls, + "tool_choice": "auto", + "parallel_tool_calls": false, + "reasoning": { + "summary": "auto" + }, + "store": false, + "stream": true, + "include": [ + "reasoning.encrypted_content" + ], + "prompt_cache_key": fork_prompt_cache_key + }); + let expected = json!([ + user_turn_1, + compact_1, + user_turn_2_after_compact, + usert_turn_3_after_resume, + user_turn_3_after_fork + ]); + assert_eq!(requests.len(), 5); + assert_eq!(json!(requests), expected); +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +/// Scenario: after the forked branch is compacted, resuming again should reuse +/// the compacted history and only append the new user message. +async fn compact_resume_after_second_compaction_preserves_history() { + if network_disabled() { + println!("Skipping test because network is disabled in this sandbox"); + return; + } + + // 1. Arrange mocked SSE responses for the initial flow plus the second compact. + let server = MockServer::start().await; + mount_initial_flow(&server).await; + mount_second_compact_flow(&server).await; + + // 2. Drive the conversation through compact -> resume -> fork -> compact -> resume. + let (_home, config, manager, base) = start_test_conversation(&server).await; + + user_turn(&base, "hello world").await; + compact_conversation(&base).await; + user_turn(&base, "AFTER_COMPACT").await; + let base_path = fetch_conversation_path(&base, "base conversation").await; + assert!( + base_path.exists(), + "second compact test expects base path {base_path:?} to exist", + ); + + let resumed = resume_conversation(&manager, &config, base_path).await; + user_turn(&resumed, "AFTER_RESUME").await; + let resumed_path = fetch_conversation_path(&resumed, "resumed conversation").await; + assert!( + resumed_path.exists(), + "second compact test expects resumed path {resumed_path:?} to exist", + ); + + let forked = fork_conversation(&manager, &config, resumed_path, 1).await; + user_turn(&forked, "AFTER_FORK").await; + + compact_conversation(&forked).await; + user_turn(&forked, "AFTER_COMPACT_2").await; + let forked_path = fetch_conversation_path(&forked, "forked conversation").await; + assert!( + forked_path.exists(), + "second compact test expects forked path {forked_path:?} to exist", + ); + + let resumed_again = resume_conversation(&manager, &config, forked_path).await; + user_turn(&resumed_again, AFTER_SECOND_RESUME).await; + + let requests = gather_request_bodies(&server).await; + let input_after_compact = json!(requests[requests.len() - 2]["input"]); + let input_after_resume = json!(requests[requests.len() - 1]["input"]); + + // test input after compact before resume is the same as input after resume + let compact_input_array = input_after_compact + .as_array() + .expect("input after compact should be an array"); + let resume_input_array = input_after_resume + .as_array() + .expect("input after resume should be an array"); + assert!( + compact_input_array.len() <= resume_input_array.len(), + "after-resume input should have at least as many items as after-compact" + ); + assert_eq!( + compact_input_array.as_slice(), + &resume_input_array[..compact_input_array.len()] + ); + // hard coded test + let prompt = requests[0]["instructions"] + .as_str() + .unwrap_or_default() + .to_string(); + let user_instructions = requests[0]["input"][0]["content"][0]["text"] + .as_str() + .unwrap_or_default() + .to_string(); + let environment_instructions = requests[0]["input"][1]["content"][0]["text"] + .as_str() + .unwrap_or_default() + .to_string(); + + let expected = json!([ + { + "instructions": prompt, + "input": [ + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": user_instructions + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": environment_instructions + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "You were originally given instructions from a user over one or more turns. Here were the user messages:\n\nAFTER_FORK\n\nAnother language model started to solve this problem and produced a summary of its thinking process. You also have access to the state of the tools that were used by that language model. Use this to build on the work that has already been done and avoid duplicating work. Here is the summary produced by the other language model, use the information in this summary to assist with your own analysis:\n\nSUMMARY_ONLY_CONTEXT" + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "AFTER_COMPACT_2" + } + ] + }, + { + "type": "message", + "role": "user", + "content": [ + { + "type": "input_text", + "text": "AFTER_SECOND_RESUME" + } + ] + } + ], + } + ]); + let last_request_after_2_compacts = json!([{ + "instructions": requests[requests.len() -1]["instructions"], + "input": requests[requests.len() -1]["input"], + }]); + assert_eq!(expected, last_request_after_2_compacts); +} + +fn normalize_line_endings(value: &mut Value) { + match value { + Value::String(text) => { + if text.contains('\r') { + *text = text.replace("\r\n", "\n").replace('\r', "\n"); + } + } + Value::Array(items) => { + for item in items { + normalize_line_endings(item); + } + } + Value::Object(map) => { + for item in map.values_mut() { + normalize_line_endings(item); + } + } + _ => {} + } +} + +async fn gather_request_bodies(server: &MockServer) -> Vec { + server + .received_requests() + .await + .expect("mock server should not fail") + .into_iter() + .map(|req| { + let mut value = req.body_json::().expect("valid JSON body"); + normalize_line_endings(&mut value); + value + }) + .collect() +} + +async fn mount_initial_flow(server: &MockServer) { + let sse1 = sse(vec![ + ev_assistant_message("m1", FIRST_REPLY), + ev_completed("r1"), + ]); + let sse2 = sse(vec![ + ev_assistant_message("m2", SUMMARY_TEXT), + ev_completed("r2"), + ]); + let sse3 = sse(vec![ + ev_assistant_message("m3", "AFTER_COMPACT_REPLY"), + ev_completed("r3"), + ]); + let sse4 = sse(vec![ev_completed("r4")]); + let sse5 = sse(vec![ev_completed("r5")]); + + let match_first = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains("\"text\":\"hello world\"") + && !body.contains(&format!("\"text\":\"{SUMMARIZE_TRIGGER}\"")) + && !body.contains("\"text\":\"AFTER_COMPACT\"") + && !body.contains("\"text\":\"AFTER_RESUME\"") + && !body.contains("\"text\":\"AFTER_FORK\"") + }; + mount_sse_once(server, match_first, sse1).await; + + let match_compact = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains(&format!("\"text\":\"{SUMMARIZE_TRIGGER}\"")) + }; + mount_sse_once(server, match_compact, sse2).await; + + let match_after_compact = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains("\"text\":\"AFTER_COMPACT\"") + && !body.contains("\"text\":\"AFTER_RESUME\"") + && !body.contains("\"text\":\"AFTER_FORK\"") + }; + mount_sse_once(server, match_after_compact, sse3).await; + + let match_after_resume = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains("\"text\":\"AFTER_RESUME\"") + }; + mount_sse_once(server, match_after_resume, sse4).await; + + let match_after_fork = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains("\"text\":\"AFTER_FORK\"") + }; + mount_sse_once(server, match_after_fork, sse5).await; +} + +async fn mount_second_compact_flow(server: &MockServer) { + let sse6 = sse(vec![ + ev_assistant_message("m4", SUMMARY_TEXT), + ev_completed("r6"), + ]); + let sse7 = sse(vec![ev_completed("r7")]); + + let match_second_compact = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains(&format!("\"text\":\"{SUMMARIZE_TRIGGER}\"")) && body.contains("AFTER_FORK") + }; + mount_sse_once(server, match_second_compact, sse6).await; + + let match_after_second_resume = |req: &wiremock::Request| { + let body = std::str::from_utf8(&req.body).unwrap_or(""); + body.contains(&format!("\"text\":\"{AFTER_SECOND_RESUME}\"")) + }; + mount_sse_once(server, match_after_second_resume, sse7).await; +} + +async fn start_test_conversation( + server: &MockServer, +) -> (TempDir, Config, ConversationManager, Arc) { + let model_provider = ModelProviderInfo { + base_url: Some(format!("{}/v1", server.uri())), + ..built_in_model_providers()["openai"].clone() + }; + let home = TempDir::new().expect("create temp dir"); + let mut config = load_default_config_for_test(&home); + config.model_provider = model_provider; + + let manager = ConversationManager::with_auth(CodexAuth::from_api_key("dummy")); + let NewConversation { conversation, .. } = manager + .new_conversation(config.clone()) + .await + .expect("create conversation"); + + (home, config, manager, conversation) +} + +async fn user_turn(conversation: &Arc, text: &str) { + conversation + .submit(Op::UserInput { + items: vec![InputItem::Text { text: text.into() }], + }) + .await + .expect("submit user turn"); + wait_for_event(conversation, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; +} + +async fn compact_conversation(conversation: &Arc) { + conversation + .submit(Op::Compact) + .await + .expect("compact conversation"); + wait_for_event(conversation, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; +} + +async fn fetch_conversation_path( + conversation: &Arc, + context: &str, +) -> std::path::PathBuf { + conversation + .submit(Op::GetPath) + .await + .expect("request conversation path"); + match wait_for_event(conversation, |ev| { + matches!(ev, EventMsg::ConversationPath(_)) + }) + .await + { + EventMsg::ConversationPath(ConversationPathResponseEvent { path, .. }) => path, + _ => panic!("expected ConversationPath event for {context}"), + } +} + +async fn resume_conversation( + manager: &ConversationManager, + config: &Config, + path: std::path::PathBuf, +) -> Arc { + let auth_manager = + codex_core::AuthManager::from_auth_for_testing(CodexAuth::from_api_key("dummy")); + let NewConversation { conversation, .. } = manager + .resume_conversation_from_rollout(config.clone(), path, auth_manager) + .await + .expect("resume conversation"); + conversation +} + +async fn fork_conversation( + manager: &ConversationManager, + config: &Config, + path: std::path::PathBuf, + back_steps: usize, +) -> Arc { + let NewConversation { conversation, .. } = manager + .fork_conversation(back_steps, config.clone(), path) + .await + .expect("fork conversation"); + conversation +} diff --git a/codex-rs/core/tests/suite/mod.rs b/codex-rs/core/tests/suite/mod.rs index d771d6b98d..323cb78d33 100644 --- a/codex-rs/core/tests/suite/mod.rs +++ b/codex-rs/core/tests/suite/mod.rs @@ -3,6 +3,7 @@ mod cli_stream; mod client; mod compact; +mod compact_resume_fork; mod exec; mod exec_stream_events; mod fork_conversation; diff --git a/codex-rs/protocol/src/protocol.rs b/codex-rs/protocol/src/protocol.rs index 6f102cdeb1..6405bf0c22 100644 --- a/codex-rs/protocol/src/protocol.rs +++ b/codex-rs/protocol/src/protocol.rs @@ -15,6 +15,7 @@ use crate::config_types::ReasoningSummary as ReasoningSummaryConfig; use crate::custom_prompts::CustomPrompt; use crate::mcp_protocol::ConversationId; use crate::message_history::HistoryEntry; +use crate::models::ContentItem; use crate::models::ResponseItem; use crate::num_format::format_with_separators; use crate::parse_command::ParsedCommand; @@ -862,26 +863,7 @@ impl InitialHistory { InitialHistory::Forked(items) => items.clone(), } } - pub fn get_response_items(&self) -> Vec { - match self { - InitialHistory::New => Vec::new(), - InitialHistory::Resumed(resumed) => resumed - .history - .iter() - .filter_map(|ri| match ri { - RolloutItem::ResponseItem(item) => Some(item.clone()), - _ => None, - }) - .collect(), - InitialHistory::Forked(items) => items - .iter() - .filter_map(|ri| match ri { - RolloutItem::ResponseItem(item) => Some(item.clone()), - _ => None, - }) - .collect(), - } - } + pub fn get_event_msgs(&self) -> Option> { match self { InitialHistory::New => None, @@ -941,6 +923,18 @@ pub struct CompactedItem { pub message: String, } +impl From for ResponseItem { + fn from(value: CompactedItem) -> Self { + ResponseItem::Message { + id: None, + role: "assistant".to_string(), + content: vec![ContentItem::OutputText { + text: value.message, + }], + } + } +} + #[derive(Serialize, Deserialize, Clone, Debug, TS)] pub struct TurnContextItem { pub cwd: PathBuf, From e9327222927ae9fa7c5e843ce44954a49b026e92 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Sun, 14 Sep 2025 15:37:28 -0400 Subject: [PATCH 26/77] Add spacing before queued status indicator messages (#3474) image --- ...cator_widget__tests__renders_with_queued_messages.snap | 2 +- codex-rs/tui/src/status_indicator_widget.rs | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_queued_messages.snap b/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_queued_messages.snap index 0290eb6976..7f2c267f21 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_queued_messages.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_queued_messages.snap @@ -3,10 +3,10 @@ source: tui/src/status_indicator_widget.rs expression: terminal.backend() --- " Working (0s • Esc to interrupt) " +" " " ↳ first " " ↳ second " " ⌥↑ edit " " " " " " " -" " diff --git a/codex-rs/tui/src/status_indicator_widget.rs b/codex-rs/tui/src/status_indicator_widget.rs index bf392b6997..e3a1b854db 100644 --- a/codex-rs/tui/src/status_indicator_widget.rs +++ b/codex-rs/tui/src/status_indicator_widget.rs @@ -63,10 +63,13 @@ impl StatusIndicatorWidget { } pub fn desired_height(&self, width: u16) -> u16 { - // Status line + wrapped queued messages (up to 3 lines per message) + // Status line + optional blank line + wrapped queued messages (up to 3 lines per message) // + optional ellipsis line per truncated message + 1 spacer line let inner_width = width.max(1) as usize; let mut total: u16 = 1; // status line + if !self.queued_messages.is_empty() { + total = total.saturating_add(1); // blank line between status and queued messages + } let text_width = inner_width.saturating_sub(3); // account for " ↳ " prefix if text_width > 0 { for q in &self.queued_messages { @@ -168,6 +171,9 @@ impl WidgetRef for StatusIndicatorWidget { // Build lines: status, then queued messages, then spacer. let mut lines: Vec> = Vec::new(); lines.push(Line::from(spans)); + if !self.queued_messages.is_empty() { + lines.push(Line::from("")); + } // Wrap queued messages using textwrap and show up to the first 3 lines per message. let text_width = area.width.saturating_sub(3); // " ↳ " prefix for q in &self.queued_messages { From 9baae77533d861c8a8c14576c2ac168a242928c3 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Sun, 14 Sep 2025 13:07:38 -0700 Subject: [PATCH 27/77] chore: update output_lines() to take a struct instead of a sequence of bools (#3591) I found the boolean literals hard to follow. --- codex-rs/tui/src/history_cell.rs | 33 +++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/codex-rs/tui/src/history_cell.rs b/codex-rs/tui/src/history_cell.rs index 31a91753e4..b2af581727 100644 --- a/codex-rs/tui/src/history_cell.rs +++ b/codex-rs/tui/src/history_cell.rs @@ -436,9 +436,16 @@ impl ExecCell { if let Some(output) = call.output.as_ref() && output.exit_code != 0 { - let out = output_lines(Some(output), false, false, false) - .into_iter() - .join("\n"); + let out = output_lines( + Some(output), + OutputLinesParams { + only_err: false, + include_angle_pipe: false, + include_prefix: false, + }, + ) + .into_iter() + .join("\n"); if !out.trim().is_empty() { // Wrap the output. for line in out.lines() { @@ -1178,9 +1185,11 @@ pub(crate) fn new_patch_apply_failure(stderr: String) -> PlainHistoryCell { stderr, formatted_output: String::new(), }), - true, - true, - true, + OutputLinesParams { + only_err: true, + include_angle_pipe: true, + include_prefix: true, + }, )); } @@ -1261,12 +1270,18 @@ pub(crate) fn new_reasoning_summary_block( vec![Box::new(new_reasoning_block(full_reasoning_buffer, config))] } -fn output_lines( - output: Option<&CommandOutput>, +struct OutputLinesParams { only_err: bool, include_angle_pipe: bool, include_prefix: bool, -) -> Vec> { +} + +fn output_lines(output: Option<&CommandOutput>, params: OutputLinesParams) -> Vec> { + let OutputLinesParams { + only_err, + include_angle_pipe, + include_prefix, + } = params; let CommandOutput { exit_code, stdout, From d701eb32d7a40043a8c294a4c8555bdbaa7974ff Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Sun, 14 Sep 2025 16:08:24 -0400 Subject: [PATCH 28/77] Gate model upgrade prompt behind ChatGPT auth (#3586) - refresh the login_state after onboarding. - should be on chatgpt for upgrade --- codex-rs/tui/src/lib.rs | 70 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 4 deletions(-) diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index e5b35fbdc4..455a9a2196 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -514,6 +514,7 @@ fn should_show_model_rollout_prompt( active_profile: Option<&str>, swiftfox_model_prompt_seen: bool, ) -> bool { + let login_status = get_login_status(config); // TODO(jif) drop. let debug_high_enabled = std::env::var("DEBUG_HIGH") .map(|v| v.eq_ignore_ascii_case("1")) @@ -524,6 +525,7 @@ fn should_show_model_rollout_prompt( && cli.model.is_none() && !swiftfox_model_prompt_seen && config.model_provider.requires_openai_auth + && matches!(login_status, LoginStatus::AuthMode(AuthMode::ChatGPT)) && !cli.oss } @@ -531,6 +533,12 @@ fn should_show_model_rollout_prompt( mod tests { use super::*; use clap::Parser; + use codex_core::auth::AuthDotJson; + use codex_core::auth::get_auth_file; + use codex_core::auth::login_with_api_key; + use codex_core::auth::write_auth_json; + use codex_core::token_data::IdTokenInfo; + use codex_core::token_data::TokenData; use std::sync::Once; fn enable_debug_high_env() { @@ -546,14 +554,56 @@ mod tests { fn make_config() -> Config { enable_debug_high_env(); + // Create a unique CODEX_HOME per test to isolate auth.json writes. + let mut codex_home = std::env::temp_dir(); + let unique_suffix = format!( + "codex_tui_test_{}_{}", + std::process::id(), + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_nanos() + ); + codex_home.push(unique_suffix); + std::fs::create_dir_all(&codex_home).expect("create unique CODEX_HOME"); + Config::load_from_base_config_with_overrides( ConfigToml::default(), ConfigOverrides::default(), - std::env::temp_dir(), + codex_home, ) .expect("load default config") } + /// Test helper to write an `auth.json` with the requested auth mode into the + /// provided CODEX_HOME directory. This ensures `get_login_status()` reads the + /// intended mode deterministically. + fn set_auth_method(codex_home: &std::path::Path, mode: AuthMode) { + match mode { + AuthMode::ApiKey => { + login_with_api_key(codex_home, "sk-test-key").expect("write api key auth.json"); + } + AuthMode::ChatGPT => { + // Minimal valid JWT payload: header.payload.signature (all base64url, no padding) + const FAKE_JWT: &str = "eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.e30.c2ln"; // {"alg":"none","typ":"JWT"}.{}."sig" + let mut id_info = IdTokenInfo::default(); + id_info.raw_jwt = FAKE_JWT.to_string(); + let auth = AuthDotJson { + openai_api_key: None, + tokens: Some(TokenData { + id_token: id_info, + access_token: "access-token".to_string(), + refresh_token: "refresh-token".to_string(), + account_id: None, + }), + last_refresh: None, + }; + let file = get_auth_file(codex_home); + write_auth_json(&file, &auth).expect("write chatgpt auth.json"); + } + } + } + #[test] fn shows_login_when_not_authenticated() { let cfg = make_config(); @@ -567,27 +617,39 @@ mod tests { fn shows_model_rollout_prompt_for_default_model() { let cli = Cli::parse_from(["codex"]); let cfg = make_config(); - assert!(should_show_model_rollout_prompt(&cli, &cfg, None, false)); + set_auth_method(&cfg.codex_home, AuthMode::ChatGPT); + assert!(should_show_model_rollout_prompt(&cli, &cfg, None, false,)); + } + + #[test] + fn hides_model_rollout_prompt_when_api_auth_mode() { + let cli = Cli::parse_from(["codex"]); + let cfg = make_config(); + set_auth_method(&cfg.codex_home, AuthMode::ApiKey); + assert!(!should_show_model_rollout_prompt(&cli, &cfg, None, false,)); } #[test] fn hides_model_rollout_prompt_when_marked_seen() { let cli = Cli::parse_from(["codex"]); let cfg = make_config(); - assert!(!should_show_model_rollout_prompt(&cli, &cfg, None, true)); + set_auth_method(&cfg.codex_home, AuthMode::ChatGPT); + assert!(!should_show_model_rollout_prompt(&cli, &cfg, None, true,)); } #[test] fn hides_model_rollout_prompt_when_cli_overrides_model() { let cli = Cli::parse_from(["codex", "--model", "gpt-4.1"]); let cfg = make_config(); - assert!(!should_show_model_rollout_prompt(&cli, &cfg, None, false)); + set_auth_method(&cfg.codex_home, AuthMode::ChatGPT); + assert!(!should_show_model_rollout_prompt(&cli, &cfg, None, false,)); } #[test] fn hides_model_rollout_prompt_when_profile_active() { let cli = Cli::parse_from(["codex"]); let cfg = make_config(); + set_auth_method(&cfg.codex_home, AuthMode::ChatGPT); assert!(!should_show_model_rollout_prompt( &cli, &cfg, From 7e1543f5d8e34db97fb79bb1d4952cedbaef7725 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Sun, 14 Sep 2025 16:51:08 -0400 Subject: [PATCH 29/77] Align user history message prefix width (#3467) image --- codex-rs/tui/src/bottom_pane/chat_composer.rs | 18 +++++++++++------- ...omposer__tests__backspace_after_pastes.snap | 4 ++-- ...ttom_pane__chat_composer__tests__empty.snap | 2 +- ...ttom_pane__chat_composer__tests__large.snap | 4 ++-- ..._chat_composer__tests__multiple_pastes.snap | 4 ++-- ...__chat_composer__tests__slash_popup_mo.snap | 2 +- ...ttom_pane__chat_composer__tests__small.snap | 4 ++-- ...atwidget__tests__chat_small_running_h2.snap | 2 +- ..._exec_and_status_layout_vt100_snapshot.snap | 6 +++--- ...hatwidget__tests__status_widget_active.snap | 4 ++-- codex-rs/tui/src/history_cell.rs | 17 +++++++++-------- codex-rs/tui/src/lib.rs | 1 + ..._wraps_and_prefixes_each_line_snapshot.snap | 8 ++++---- ...cator_widget__tests__renders_truncated.snap | 2 +- ...t__tests__renders_with_queued_messages.snap | 2 +- ...et__tests__renders_with_working_header.snap | 2 +- codex-rs/tui/src/status_indicator_widget.rs | 3 ++- codex-rs/tui/src/ui_consts.rs | 10 ++++++++++ 18 files changed, 56 insertions(+), 39 deletions(-) create mode 100644 codex-rs/tui/src/ui_consts.rs diff --git a/codex-rs/tui/src/bottom_pane/chat_composer.rs b/codex-rs/tui/src/bottom_pane/chat_composer.rs index 065232d86c..2138d54098 100644 --- a/codex-rs/tui/src/bottom_pane/chat_composer.rs +++ b/codex-rs/tui/src/bottom_pane/chat_composer.rs @@ -38,6 +38,7 @@ use crate::bottom_pane::textarea::TextAreaState; use crate::clipboard_paste::normalize_pasted_path; use crate::clipboard_paste::pasted_image_format; use crate::key_hint; +use crate::ui_consts::LIVE_PREFIX_COLS; use codex_file_search::FileMatch; use std::cell::RefCell; use std::collections::HashMap; @@ -136,7 +137,9 @@ impl ChatComposer { } pub fn desired_height(&self, width: u16) -> u16 { - self.textarea.desired_height(width - 1) + // Leave 1 column for the left border and 1 column for left padding + self.textarea + .desired_height(width.saturating_sub(LIVE_PREFIX_COLS)) + match &self.active_popup { ActivePopup::None => FOOTER_HEIGHT_WITH_HINT, ActivePopup::Command(c) => c.calculate_required_height(), @@ -153,8 +156,9 @@ impl ChatComposer { let [textarea_rect, _] = Layout::vertical([Constraint::Min(1), popup_constraint]).areas(area); let mut textarea_rect = textarea_rect; - textarea_rect.width = textarea_rect.width.saturating_sub(1); - textarea_rect.x += 1; + // Leave 1 for border and 1 for padding + textarea_rect.width = textarea_rect.width.saturating_sub(LIVE_PREFIX_COLS); + textarea_rect.x = textarea_rect.x.saturating_add(LIVE_PREFIX_COLS); let state = self.textarea_state.borrow(); self.textarea.cursor_pos_with_state(textarea_rect, &state) } @@ -1274,7 +1278,6 @@ impl WidgetRef for ChatComposer { key_hint::ctrl('J') }; vec![ - " ".into(), key_hint::plain('⏎'), " send ".into(), newline_hint_key, @@ -1342,15 +1345,16 @@ impl WidgetRef for ChatComposer { buf, ); let mut textarea_rect = textarea_rect; - textarea_rect.width = textarea_rect.width.saturating_sub(1); - textarea_rect.x += 1; + // Leave 1 for border and 1 for padding + textarea_rect.width = textarea_rect.width.saturating_sub(LIVE_PREFIX_COLS); + textarea_rect.x = textarea_rect.x.saturating_add(LIVE_PREFIX_COLS); let mut state = self.textarea_state.borrow_mut(); StatefulWidgetRef::render_ref(&(&self.textarea), textarea_rect, buf, &mut state); if self.textarea.text().is_empty() { Line::from(self.placeholder_text.as_str()) .style(Style::default().dim()) - .render_ref(textarea_rect.inner(Margin::new(1, 0)), buf); + .render_ref(textarea_rect.inner(Margin::new(0, 0)), buf); } } } diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__backspace_after_pastes.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__backspace_after_pastes.snap index eafcf94535..c9f5cb9720 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__backspace_after_pastes.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__backspace_after_pastes.snap @@ -2,7 +2,7 @@ source: tui/src/bottom_pane/chat_composer.rs expression: terminal.backend() --- -"▌[Pasted Content 1002 chars][Pasted Content 1004 chars] " +"▌ [Pasted Content 1002 chars][Pasted Content 1004 chars] " "▌ " "▌ " "▌ " @@ -11,4 +11,4 @@ expression: terminal.backend() "▌ " "▌ " " " -" ⏎ send ⌃J newline ⌃T transcript ⌃C quit " +"⏎ send ⌃J newline ⌃T transcript ⌃C quit " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__empty.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__empty.snap index 8de047f1fb..823a41cf62 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__empty.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__empty.snap @@ -11,4 +11,4 @@ expression: terminal.backend() "▌ " "▌ " " " -" ⏎ send ⌃J newline ⌃T transcript ⌃C quit " +"⏎ send ⌃J newline ⌃T transcript ⌃C quit " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__large.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__large.snap index b9e96aed37..d89c4033de 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__large.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__large.snap @@ -2,7 +2,7 @@ source: tui/src/bottom_pane/chat_composer.rs expression: terminal.backend() --- -"▌[Pasted Content 1005 chars] " +"▌ [Pasted Content 1005 chars] " "▌ " "▌ " "▌ " @@ -11,4 +11,4 @@ expression: terminal.backend() "▌ " "▌ " " " -" ⏎ send ⌃J newline ⌃T transcript ⌃C quit " +"⏎ send ⌃J newline ⌃T transcript ⌃C quit " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__multiple_pastes.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__multiple_pastes.snap index cb5465955e..636d5c22af 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__multiple_pastes.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__multiple_pastes.snap @@ -2,7 +2,7 @@ source: tui/src/bottom_pane/chat_composer.rs expression: terminal.backend() --- -"▌[Pasted Content 1003 chars][Pasted Content 1007 chars] another short paste " +"▌ [Pasted Content 1003 chars][Pasted Content 1007 chars] another short paste " "▌ " "▌ " "▌ " @@ -11,4 +11,4 @@ expression: terminal.backend() "▌ " "▌ " " " -" ⏎ send ⌃J newline ⌃T transcript ⌃C quit " +"⏎ send ⌃J newline ⌃T transcript ⌃C quit " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__slash_popup_mo.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__slash_popup_mo.snap index 63f9b3a964..b626f80ca1 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__slash_popup_mo.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__slash_popup_mo.snap @@ -2,7 +2,7 @@ source: tui/src/bottom_pane/chat_composer.rs expression: terminal.backend() --- -"▌/mo " +"▌ /mo " "▌ " "▌/model choose what model and reasoning effort to use " "▌/mention mention a file " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__small.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__small.snap index 8843b4a5cd..111e45b65b 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__small.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__small.snap @@ -2,7 +2,7 @@ source: tui/src/bottom_pane/chat_composer.rs expression: terminal.backend() --- -"▌short " +"▌ short " "▌ " "▌ " "▌ " @@ -11,4 +11,4 @@ expression: terminal.backend() "▌ " "▌ " " " -" ⏎ send ⌃J newline ⌃T transcript ⌃C quit " +"⏎ send ⌃J newline ⌃T transcript ⌃C quit " diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_running_h2.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_running_h2.snap index f509728658..917f012603 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_running_h2.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chat_small_running_h2.snap @@ -2,5 +2,5 @@ source: tui/src/chatwidget/tests.rs expression: terminal.backend() --- -" Thinking (0s • Esc to interrupt) " +" Thinking (0s • Esc to interrupt) " "▌ Ask Codex to do anything " diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chatwidget_exec_and_status_layout_vt100_snapshot.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chatwidget_exec_and_status_layout_vt100_snapshot.snap index df4fd4ca86..9a2859046a 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chatwidget_exec_and_status_layout_vt100_snapshot.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__chatwidget_exec_and_status_layout_vt100_snapshot.snap @@ -9,8 +9,8 @@ expression: visual └ Search Change Approved Read diff_render.rs - Investigating rendering code (0s • Esc to interrupt) + Investigating rendering code (0s • Esc to interrupt) -▌Summarize recent commits +▌ Summarize recent commits - ⏎ send ⌃J newline ⌃T transcript ⌃C quit +⏎ send ⌃J newline ⌃T transcript ⌃C quit diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_active.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_active.snap index 8eb6e72a4e..e28659e2aa 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_active.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_active.snap @@ -3,9 +3,9 @@ source: tui/src/chatwidget/tests.rs expression: terminal.backend() --- " " -" Analyzing (0s • Esc to interrupt) " +" Analyzing (0s • Esc to interrupt) " " " "▌ Ask Codex to do anything " " " -" ⏎ send ⌃J newline ⌃T transcript ⌃C quit " +"⏎ send ⌃J newline ⌃T transcript ⌃C quit " " " diff --git a/codex-rs/tui/src/history_cell.rs b/codex-rs/tui/src/history_cell.rs index b2af581727..c4c019dbe0 100644 --- a/codex-rs/tui/src/history_cell.rs +++ b/codex-rs/tui/src/history_cell.rs @@ -7,6 +7,7 @@ use crate::render::line_utils::prefix_lines; use crate::render::line_utils::push_owned_lines; use crate::slash_command::SlashCommand; use crate::text_formatting::format_and_truncate_tool_result; +use crate::ui_consts::LIVE_PREFIX_COLS; use crate::wrapping::RtOptions; use crate::wrapping::word_wrap_line; use crate::wrapping::word_wrap_lines; @@ -106,7 +107,7 @@ impl HistoryCell for UserHistoryCell { let mut lines: Vec> = Vec::new(); // Wrap the content first, then prefix each wrapped line with the marker. - let wrap_width = width.saturating_sub(1); // account for the ▌ prefix + let wrap_width = width.saturating_sub(LIVE_PREFIX_COLS); // account for the ▌ prefix and trailing space let wrapped = textwrap::wrap( &self.message, textwrap::Options::new(wrap_width as usize) @@ -114,7 +115,7 @@ impl HistoryCell for UserHistoryCell { ); for line in wrapped { - lines.push(vec!["▌".cyan().dim(), line.to_string().dim()].into()); + lines.push(vec!["▌ ".cyan().dim(), line.to_string().dim()].into()); } lines } @@ -644,25 +645,25 @@ pub(crate) fn new_session_info( ])); lines.push(Line::from("".dim())); lines.push(Line::from( - " To get started, describe a task or try one of these commands:".dim(), + " To get started, describe a task or try one of these commands:".dim(), )); lines.push(Line::from("".dim())); if !has_agents_md { lines.push(Line::from(vec![ - " /init".bold(), + " /init".bold(), format!(" - {}", SlashCommand::Init.description()).dim(), ])); } lines.push(Line::from(vec![ - " /status".bold(), + " /status".bold(), format!(" - {}", SlashCommand::Status.description()).dim(), ])); lines.push(Line::from(vec![ - " /approvals".bold(), + " /approvals".bold(), format!(" - {}", SlashCommand::Approvals.description()).dim(), ])); lines.push(Line::from(vec![ - " /model".bold(), + " /model".bold(), format!(" - {}", SlashCommand::Model.description()).dim(), ])); PlainHistoryCell { lines } @@ -1785,7 +1786,7 @@ mod tests { message: msg.to_string(), }; - // Small width to force wrapping more clearly. Effective wrap width is width-1 due to the ▌ prefix. + // Small width to force wrapping more clearly. Effective wrap width is width-2 due to the ▌ prefix and trailing space. let width: u16 = 12; let lines = cell.display_lines(width); let rendered = render_lines(&lines).join("\n"); diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 455a9a2196..e050e5b5c6 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -60,6 +60,7 @@ mod status_indicator_widget; mod streaming; mod text_formatting; mod tui; +mod ui_consts; mod user_approval_widget; mod version; mod wrapping; diff --git a/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__user_history_cell_wraps_and_prefixes_each_line_snapshot.snap b/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__user_history_cell_wraps_and_prefixes_each_line_snapshot.snap index 8b8cc38a03..ef0ceabc48 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__user_history_cell_wraps_and_prefixes_each_line_snapshot.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__history_cell__tests__user_history_cell_wraps_and_prefixes_each_line_snapshot.snap @@ -2,7 +2,7 @@ source: tui/src/history_cell.rs expression: rendered --- -▌one two -▌three four -▌five six -▌seven +▌ one two +▌ three four +▌ five six +▌ seven diff --git a/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_truncated.snap b/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_truncated.snap index 19dc5d3137..6aa3401770 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_truncated.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_truncated.snap @@ -2,5 +2,5 @@ source: tui/src/status_indicator_widget.rs expression: terminal.backend() --- -" Working (0s • Esc t" +" Working (0s • Esc " " " diff --git a/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_queued_messages.snap b/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_queued_messages.snap index 7f2c267f21..061f3a1393 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_queued_messages.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_queued_messages.snap @@ -2,7 +2,7 @@ source: tui/src/status_indicator_widget.rs expression: terminal.backend() --- -" Working (0s • Esc to interrupt) " +" Working (0s • Esc to interrupt) " " " " ↳ first " " ↳ second " diff --git a/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_working_header.snap b/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_working_header.snap index fe9eebedd6..debf282118 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_working_header.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__status_indicator_widget__tests__renders_with_working_header.snap @@ -2,5 +2,5 @@ source: tui/src/status_indicator_widget.rs expression: terminal.backend() --- -" Working (0s • Esc to interrupt) " +" Working (0s • Esc to interrupt) " " " diff --git a/codex-rs/tui/src/status_indicator_widget.rs b/codex-rs/tui/src/status_indicator_widget.rs index e3a1b854db..96f2c49fee 100644 --- a/codex-rs/tui/src/status_indicator_widget.rs +++ b/codex-rs/tui/src/status_indicator_widget.rs @@ -17,6 +17,7 @@ use crate::app_event_sender::AppEventSender; use crate::key_hint; use crate::shimmer::shimmer_spans; use crate::tui::FrameRequester; +use crate::ui_consts::LIVE_PREFIX_COLS; pub(crate) struct StatusIndicatorWidget { /// Animated header text (defaults to "Working"). @@ -159,7 +160,7 @@ impl WidgetRef for StatusIndicatorWidget { let pretty_elapsed = fmt_elapsed_compact(elapsed); // Plain rendering: no borders or padding so the live cell is visually indistinguishable from terminal scrollback. - let mut spans = vec![" ".into()]; + let mut spans = vec![" ".repeat(LIVE_PREFIX_COLS as usize).into()]; spans.extend(shimmer_spans(&self.header)); spans.extend(vec![ " ".into(), diff --git a/codex-rs/tui/src/ui_consts.rs b/codex-rs/tui/src/ui_consts.rs new file mode 100644 index 0000000000..b249cd5fcf --- /dev/null +++ b/codex-rs/tui/src/ui_consts.rs @@ -0,0 +1,10 @@ +//! Shared UI constants for layout and alignment within the TUI. + +/// Width (in terminal columns) reserved for the left gutter/prefix used by +/// live cells and aligned widgets. +/// +/// Semantics: +/// - Chat composer reserves this many columns for the left border + padding. +/// - Status indicator lines begin with this many spaces for alignment. +/// - User history lines account for this many columns (e.g., "▌ ") when wrapping. +pub(crate) const LIVE_PREFIX_COLS: u16 = 2; From 863d9c237ec8babb4defb7a3ef821b23a3e3811f Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Sun, 14 Sep 2025 14:38:26 -0700 Subject: [PATCH 30/77] Include command output when sending timeout to model (#3576) Being able to see the output helps the model decide how to handle the timeout. --- codex-rs/core/src/codex.rs | 46 ++++++++++-- codex-rs/core/src/error.rs | 17 +++-- codex-rs/core/src/exec.rs | 75 ++++++++++++------- .../core/tests/suite/exec_stream_events.rs | 36 +++++++++ .../linux-sandbox/tests/suite/landlock.rs | 23 +++--- 5 files changed, 147 insertions(+), 50 deletions(-) diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 4745c4da3b..7177348f57 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -845,6 +845,7 @@ impl Session { aggregated_output, duration, exit_code, + timed_out: _, } = output; // Send full stdout/stderr to clients; do not truncate. let stdout = stdout.text.clone(); @@ -920,6 +921,7 @@ impl Session { let output_stderr; let borrowed: &ExecToolCallOutput = match &result { Ok(output) => output, + Err(CodexErr::Sandbox(SandboxErr::Timeout { output })) => output, Err(e) => { output_stderr = ExecToolCallOutput { exit_code: -1, @@ -927,6 +929,7 @@ impl Session { stderr: StreamOutput::new(get_error_message_ui(e)), aggregated_output: StreamOutput::new(get_error_message_ui(e)), duration: Duration::default(), + timed_out: false, }; &output_stderr } @@ -2917,15 +2920,12 @@ async fn handle_sandbox_error( let sub_id = exec_command_context.sub_id.clone(); let cwd = exec_command_context.cwd.clone(); - // if the command timed out, we can simply return this failure to the model - if matches!(error, SandboxErr::Timeout) { + if let SandboxErr::Timeout { output } = &error { + let content = format_exec_output(output); return ResponseInputItem::FunctionCallOutput { call_id, output: FunctionCallOutputPayload { - content: format!( - "command timed out after {} milliseconds", - params.timeout_duration().as_millis() - ), + content, success: Some(false), }, }; @@ -3050,7 +3050,17 @@ fn format_exec_output_str(exec_output: &ExecToolCallOutput) -> String { // Head+tail truncation for the model: show the beginning and end with an elision. // Clients still receive full streams; only this formatted summary is capped. - let s = aggregated_output.text.as_str(); + let mut s = &aggregated_output.text; + let prefixed_str: String; + + if exec_output.timed_out { + prefixed_str = format!( + "command timed out after {} milliseconds\n", + exec_output.duration.as_millis() + ) + s; + s = &prefixed_str; + } + let total_lines = s.lines().count(); if s.len() <= MODEL_FORMAT_MAX_BYTES && total_lines <= MODEL_FORMAT_MAX_LINES { return s.to_string(); @@ -3093,6 +3103,7 @@ fn format_exec_output_str(exec_output: &ExecToolCallOutput) -> String { // Build final string respecting byte budgets let head_part = take_bytes_at_char_boundary(&head_lines_text, head_budget); let mut result = String::with_capacity(MODEL_FORMAT_MAX_BYTES.min(s.len())); + result.push_str(head_part); result.push_str(&marker); @@ -3342,6 +3353,7 @@ mod tests { stderr: StreamOutput::new(String::new()), aggregated_output: StreamOutput::new(full), duration: StdDuration::from_secs(1), + timed_out: false, }; let out = format_exec_output_str(&exec); @@ -3384,6 +3396,7 @@ mod tests { stderr: StreamOutput::new(String::new()), aggregated_output: StreamOutput::new(full.clone()), duration: StdDuration::from_secs(1), + timed_out: false, }; let out = format_exec_output_str(&exec); @@ -3406,6 +3419,25 @@ mod tests { ); } + #[test] + fn includes_timed_out_message() { + let exec = ExecToolCallOutput { + exit_code: 0, + stdout: StreamOutput::new(String::new()), + stderr: StreamOutput::new(String::new()), + aggregated_output: StreamOutput::new("Command output".to_string()), + duration: StdDuration::from_secs(1), + timed_out: true, + }; + + let out = format_exec_output_str(&exec); + + assert_eq!( + out, + "command timed out after 1000 milliseconds\nCommand output" + ); + } + #[test] fn falls_back_to_content_when_structured_is_null() { let ctr = CallToolResult { diff --git a/codex-rs/core/src/error.rs b/codex-rs/core/src/error.rs index b1cda02420..77b447e5cf 100644 --- a/codex-rs/core/src/error.rs +++ b/codex-rs/core/src/error.rs @@ -1,3 +1,4 @@ +use crate::exec::ExecToolCallOutput; use crate::token_data::KnownPlan; use crate::token_data::PlanType; use codex_protocol::mcp_protocol::ConversationId; @@ -13,8 +14,11 @@ pub type Result = std::result::Result; #[derive(Error, Debug)] pub enum SandboxErr { /// Error from sandbox execution - #[error("sandbox denied exec error, exit code: {0}, stdout: {1}, stderr: {2}")] - Denied(i32, String, String), + #[error( + "sandbox denied exec error, exit code: {}, stdout: {}, stderr: {}", + .output.exit_code, .output.stdout.text, .output.stderr.text + )] + Denied { output: Box }, /// Error from linux seccomp filter setup #[cfg(target_os = "linux")] @@ -28,7 +32,7 @@ pub enum SandboxErr { /// Command timed out #[error("command timed out")] - Timeout, + Timeout { output: Box }, /// Command was killed by a signal #[error("command was killed by a signal")] @@ -245,9 +249,12 @@ impl CodexErr { pub fn get_error_message_ui(e: &CodexErr) -> String { match e { - CodexErr::Sandbox(SandboxErr::Denied(_, _, stderr)) => stderr.to_string(), + CodexErr::Sandbox(SandboxErr::Denied { output }) => output.stderr.text.clone(), // Timeouts are not sandbox errors from a UX perspective; present them plainly - CodexErr::Sandbox(SandboxErr::Timeout) => "error: command timed out".to_string(), + CodexErr::Sandbox(SandboxErr::Timeout { output }) => format!( + "error: command timed out after {} ms", + output.duration.as_millis() + ), _ => e.to_string(), } } diff --git a/codex-rs/core/src/exec.rs b/codex-rs/core/src/exec.rs index 3b40766764..8fecb16fc3 100644 --- a/codex-rs/core/src/exec.rs +++ b/codex-rs/core/src/exec.rs @@ -34,6 +34,7 @@ const DEFAULT_TIMEOUT_MS: u64 = 10_000; const SIGKILL_CODE: i32 = 9; const TIMEOUT_CODE: i32 = 64; const EXIT_CODE_SIGNAL_BASE: i32 = 128; // conventional shell: 128 + signal +const EXEC_TIMEOUT_EXIT_CODE: i32 = 124; // conventional timeout exit code // I/O buffer sizing const READ_CHUNK_SIZE: usize = 8192; // bytes per read @@ -86,11 +87,12 @@ pub async fn process_exec_tool_call( ) -> Result { let start = Instant::now(); + let timeout_duration = params.timeout_duration(); + let raw_output_result: std::result::Result = match sandbox_type { SandboxType::None => exec(params, sandbox_policy, stdout_stream.clone()).await, SandboxType::MacosSeatbelt => { - let timeout = params.timeout_duration(); let ExecParams { command, cwd, env, .. } = params; @@ -102,10 +104,9 @@ pub async fn process_exec_tool_call( env, ) .await?; - consume_truncated_output(child, timeout, stdout_stream.clone()).await + consume_truncated_output(child, timeout_duration, stdout_stream.clone()).await } SandboxType::LinuxSeccomp => { - let timeout = params.timeout_duration(); let ExecParams { command, cwd, env, .. } = params; @@ -123,41 +124,56 @@ pub async fn process_exec_tool_call( ) .await?; - consume_truncated_output(child, timeout, stdout_stream).await + consume_truncated_output(child, timeout_duration, stdout_stream).await } }; let duration = start.elapsed(); match raw_output_result { Ok(raw_output) => { - let stdout = raw_output.stdout.from_utf8_lossy(); - let stderr = raw_output.stderr.from_utf8_lossy(); + #[allow(unused_mut)] + let mut timed_out = raw_output.timed_out; #[cfg(target_family = "unix")] - match raw_output.exit_status.signal() { - Some(TIMEOUT_CODE) => return Err(CodexErr::Sandbox(SandboxErr::Timeout)), - Some(signal) => { - return Err(CodexErr::Sandbox(SandboxErr::Signal(signal))); + { + if let Some(signal) = raw_output.exit_status.signal() { + if signal == TIMEOUT_CODE { + timed_out = true; + } else { + return Err(CodexErr::Sandbox(SandboxErr::Signal(signal))); + } } - None => {} } - let exit_code = raw_output.exit_status.code().unwrap_or(-1); - - if exit_code != 0 && is_likely_sandbox_denied(sandbox_type, exit_code) { - return Err(CodexErr::Sandbox(SandboxErr::Denied( - exit_code, - stdout.text, - stderr.text, - ))); + let mut exit_code = raw_output.exit_status.code().unwrap_or(-1); + if timed_out { + exit_code = EXEC_TIMEOUT_EXIT_CODE; } - Ok(ExecToolCallOutput { + let stdout = raw_output.stdout.from_utf8_lossy(); + let stderr = raw_output.stderr.from_utf8_lossy(); + let aggregated_output = raw_output.aggregated_output.from_utf8_lossy(); + let exec_output = ExecToolCallOutput { exit_code, stdout, stderr, - aggregated_output: raw_output.aggregated_output.from_utf8_lossy(), + aggregated_output, duration, - }) + timed_out, + }; + + if timed_out { + return Err(CodexErr::Sandbox(SandboxErr::Timeout { + output: Box::new(exec_output), + })); + } + + if exit_code != 0 && is_likely_sandbox_denied(sandbox_type, exit_code) { + return Err(CodexErr::Sandbox(SandboxErr::Denied { + output: Box::new(exec_output), + })); + } + + Ok(exec_output) } Err(err) => { tracing::error!("exec error: {err}"); @@ -197,6 +213,7 @@ struct RawExecToolCallOutput { pub stdout: StreamOutput>, pub stderr: StreamOutput>, pub aggregated_output: StreamOutput>, + pub timed_out: bool, } impl StreamOutput { @@ -229,6 +246,7 @@ pub struct ExecToolCallOutput { pub stderr: StreamOutput, pub aggregated_output: StreamOutput, pub duration: Duration, + pub timed_out: bool, } async fn exec( @@ -298,22 +316,24 @@ async fn consume_truncated_output( Some(agg_tx.clone()), )); - let exit_status = tokio::select! { + let (exit_status, timed_out) = tokio::select! { result = tokio::time::timeout(timeout, child.wait()) => { match result { - Ok(Ok(exit_status)) => exit_status, - Ok(e) => e?, + Ok(status_result) => { + let exit_status = status_result?; + (exit_status, false) + } Err(_) => { // timeout child.start_kill()?; // Debatable whether `child.wait().await` should be called here. - synthetic_exit_status(EXIT_CODE_SIGNAL_BASE + TIMEOUT_CODE) + (synthetic_exit_status(EXIT_CODE_SIGNAL_BASE + TIMEOUT_CODE), true) } } } _ = tokio::signal::ctrl_c() => { child.start_kill()?; - synthetic_exit_status(EXIT_CODE_SIGNAL_BASE + SIGKILL_CODE) + (synthetic_exit_status(EXIT_CODE_SIGNAL_BASE + SIGKILL_CODE), false) } }; @@ -336,6 +356,7 @@ async fn consume_truncated_output( stdout, stderr, aggregated_output, + timed_out, }) } diff --git a/codex-rs/core/tests/suite/exec_stream_events.rs b/codex-rs/core/tests/suite/exec_stream_events.rs index 521823d2d4..0b3edf2e1c 100644 --- a/codex-rs/core/tests/suite/exec_stream_events.rs +++ b/codex-rs/core/tests/suite/exec_stream_events.rs @@ -2,8 +2,11 @@ use std::collections::HashMap; use std::path::PathBuf; +use std::time::Duration; use async_channel::Receiver; +use codex_core::error::CodexErr; +use codex_core::error::SandboxErr; use codex_core::exec::ExecParams; use codex_core::exec::SandboxType; use codex_core::exec::StdoutStream; @@ -170,3 +173,36 @@ async fn test_aggregated_output_interleaves_in_order() { assert_eq!(result.aggregated_output.text, "O1\nE1\nO2\nE2\n"); assert_eq!(result.aggregated_output.truncated_after_lines, None); } + +#[tokio::test] +async fn test_exec_timeout_returns_partial_output() { + let cmd = vec![ + "/bin/sh".to_string(), + "-c".to_string(), + "printf 'before\\n'; sleep 2; printf 'after\\n'".to_string(), + ]; + + let params = ExecParams { + command: cmd, + cwd: std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")), + timeout_ms: Some(200), + env: HashMap::new(), + with_escalated_permissions: None, + justification: None, + }; + + let policy = SandboxPolicy::new_read_only_policy(); + + let result = process_exec_tool_call(params, SandboxType::None, &policy, &None, None).await; + + let Err(CodexErr::Sandbox(SandboxErr::Timeout { output })) = result else { + panic!("expected timeout error"); + }; + + assert_eq!(output.exit_code, 124); + assert_eq!(output.stdout.text, "before\n"); + assert!(output.stderr.text.is_empty()); + assert_eq!(output.aggregated_output.text, "before\n"); + assert!(output.duration >= Duration::from_millis(200)); + assert!(output.timed_out); +} diff --git a/codex-rs/linux-sandbox/tests/suite/landlock.rs b/codex-rs/linux-sandbox/tests/suite/landlock.rs index 8faa02d158..fddb43c38e 100644 --- a/codex-rs/linux-sandbox/tests/suite/landlock.rs +++ b/codex-rs/linux-sandbox/tests/suite/landlock.rs @@ -121,7 +121,7 @@ async fn test_writable_root() { } #[tokio::test] -#[should_panic(expected = "Sandbox(Timeout)")] +#[should_panic(expected = "Sandbox(Timeout")] async fn test_timeout() { run_cmd(&["sleep", "2"], &[], 50).await; } @@ -156,26 +156,27 @@ async fn assert_network_blocked(cmd: &[&str]) { ) .await; - let (exit_code, stdout, stderr) = match result { - Ok(output) => (output.exit_code, output.stdout.text, output.stderr.text), - Err(CodexErr::Sandbox(SandboxErr::Denied(exit_code, stdout, stderr))) => { - (exit_code, stdout, stderr) - } + let output = match result { + Ok(output) => output, + Err(CodexErr::Sandbox(SandboxErr::Denied { output })) => *output, _ => { panic!("expected sandbox denied error, got: {result:?}"); } }; - dbg!(&stderr); - dbg!(&stdout); - dbg!(&exit_code); + dbg!(&output.stderr.text); + dbg!(&output.stdout.text); + dbg!(&output.exit_code); // A completely missing binary exits with 127. Anything else should also // be non‑zero (EPERM from seccomp will usually bubble up as 1, 2, 13…) // If—*and only if*—the command exits 0 we consider the sandbox breached. - if exit_code == 0 { - panic!("Network sandbox FAILED - {cmd:?} exited 0\nstdout:\n{stdout}\nstderr:\n{stderr}",); + if output.exit_code == 0 { + panic!( + "Network sandbox FAILED - {cmd:?} exited 0\nstdout:\n{}\nstderr:\n{}", + output.stdout.text, output.stderr.text + ); } } From 916fdc2a37b40e4cc44f4512eea7159eb09cb252 Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Sun, 14 Sep 2025 15:45:15 -0700 Subject: [PATCH 31/77] Add per-model-family prompts (#3597) Allows more flexibility in defining prompts. --- codex-rs/core/src/client_common.rs | 13 ++-- codex-rs/core/src/config.rs | 12 +--- codex-rs/core/src/model_family.rs | 30 +++++++++ codex-rs/core/swiftfox_prompt.md | 99 ++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 15 deletions(-) create mode 100644 codex-rs/core/swiftfox_prompt.md diff --git a/codex-rs/core/src/client_common.rs b/codex-rs/core/src/client_common.rs index fd894a633f..dda69a7ef8 100644 --- a/codex-rs/core/src/client_common.rs +++ b/codex-rs/core/src/client_common.rs @@ -10,15 +10,12 @@ use codex_protocol::models::ResponseItem; use futures::Stream; use serde::Serialize; use std::borrow::Cow; +use std::ops::Deref; use std::pin::Pin; use std::task::Context; use std::task::Poll; use tokio::sync::mpsc; -/// The `instructions` field in the payload sent to a model should always start -/// with this content. -const BASE_INSTRUCTIONS: &str = include_str!("../prompt.md"); - /// Review thread system prompt. Edit `core/src/review_prompt.md` to customize. pub const REVIEW_PROMPT: &str = include_str!("../review_prompt.md"); @@ -41,7 +38,7 @@ impl Prompt { let base = self .base_instructions_override .as_deref() - .unwrap_or(BASE_INSTRUCTIONS); + .unwrap_or(model.base_instructions.deref()); let mut sections: Vec<&str> = vec![base]; // When there are no custom instructions, add apply_patch_tool_instructions if either: @@ -185,8 +182,12 @@ mod tests { let prompt = Prompt { ..Default::default() }; - let expected = format!("{BASE_INSTRUCTIONS}\n{APPLY_PATCH_TOOL_INSTRUCTIONS}"); let model_family = find_family_for_model("gpt-4.1").expect("known model slug"); + + let expected = format!( + "{}\n{}", + model_family.base_instructions, APPLY_PATCH_TOOL_INSTRUCTIONS + ); let full = prompt.get_full_instructions(&model_family); assert_eq!(full, expected); } diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index 4e010ae79d..2332c8f6c0 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -9,6 +9,7 @@ use crate::config_types::Tui; use crate::config_types::UriBasedFileOpener; use crate::git_info::resolve_root_git_project_for_trust; use crate::model_family::ModelFamily; +use crate::model_family::derive_default_model_family; use crate::model_family::find_family_for_model; use crate::model_provider_info::ModelProviderInfo; use crate::model_provider_info::built_in_model_providers; @@ -865,15 +866,8 @@ impl Config { .or(cfg.model) .unwrap_or_else(default_model); - let mut model_family = find_family_for_model(&model).unwrap_or_else(|| ModelFamily { - slug: model.clone(), - family: model.clone(), - needs_special_apply_patch_instructions: false, - supports_reasoning_summaries: false, - reasoning_summary_format: ReasoningSummaryFormat::None, - uses_local_shell_tool: false, - apply_patch_tool_type: None, - }); + let mut model_family = + find_family_for_model(&model).unwrap_or_else(|| derive_default_model_family(&model)); if let Some(supports_reasoning_summaries) = cfg.model_supports_reasoning_summaries { model_family.supports_reasoning_summaries = supports_reasoning_summaries; diff --git a/codex-rs/core/src/model_family.rs b/codex-rs/core/src/model_family.rs index a042a50348..0756b121c4 100644 --- a/codex-rs/core/src/model_family.rs +++ b/codex-rs/core/src/model_family.rs @@ -1,6 +1,11 @@ use crate::config_types::ReasoningSummaryFormat; use crate::tool_apply_patch::ApplyPatchToolType; +/// The `instructions` field in the payload sent to a model should always start +/// with this content. +const BASE_INSTRUCTIONS: &str = include_str!("../prompt.md"); +const SWIFTFOX_INSTRUCTIONS: &str = include_str!("../swiftfox_prompt.md"); + /// A model family is a group of models that share certain characteristics. #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct ModelFamily { @@ -33,6 +38,9 @@ pub struct ModelFamily { /// Present if the model performs better when `apply_patch` is provided as /// a tool call instead of just a bash command pub apply_patch_tool_type: Option, + + // Instructions to use for querying the model + pub base_instructions: String, } macro_rules! model_family { @@ -48,6 +56,7 @@ macro_rules! model_family { reasoning_summary_format: ReasoningSummaryFormat::None, uses_local_shell_tool: false, apply_patch_tool_type: None, + base_instructions: BASE_INSTRUCTIONS.to_string(), }; // apply overrides $( @@ -69,6 +78,7 @@ macro_rules! simple_model_family { reasoning_summary_format: ReasoningSummaryFormat::None, uses_local_shell_tool: false, apply_patch_tool_type: None, + base_instructions: BASE_INSTRUCTIONS.to_string(), }) }}; } @@ -114,7 +124,27 @@ pub fn find_family_for_model(slug: &str) -> Option { slug, "gpt-5", supports_reasoning_summaries: true, ) + } else if slug.starts_with("swiftfox") { + model_family!( + slug, "swiftfox", + supports_reasoning_summaries: true, + reasoning_summary_format: ReasoningSummaryFormat::Experimental, + base_instructions: SWIFTFOX_INSTRUCTIONS.to_string(), + ) } else { None } } + +pub fn derive_default_model_family(model: &str) -> ModelFamily { + ModelFamily { + slug: model.to_string(), + family: model.to_string(), + needs_special_apply_patch_instructions: false, + supports_reasoning_summaries: false, + reasoning_summary_format: ReasoningSummaryFormat::None, + uses_local_shell_tool: false, + apply_patch_tool_type: None, + base_instructions: BASE_INSTRUCTIONS.to_string(), + } +} diff --git a/codex-rs/core/swiftfox_prompt.md b/codex-rs/core/swiftfox_prompt.md new file mode 100644 index 0000000000..cef7cc4072 --- /dev/null +++ b/codex-rs/core/swiftfox_prompt.md @@ -0,0 +1,99 @@ +You are Swiftfox. You are running as a coding agent in the Codex CLI on a user's computer. + +## Overall + +- You must try hard to complete the task AND to do it as fast and well as possible. + * Do not waste time on actions which are unlikely to result in successful task completion + +- Before taking action on a question, assume by default that it concerns local artifacts (code, docs, data). Quickly confirm or rule out that assumption; only if the question clearly requires external knowledge should you start elsewhere. +- Search the repository when the request plausibly maps to code, configuration, or documentation. Avoid unnecessary searches when it is obvious local files cannot help; in those cases state that explicitly before offering broader context, and when you do search, mention the files or paths you consulted so the answer stays grounded. +- After each attempt, re-evaluate whether the current strategy is yielding useful information and be ready to switch paths quickly rather than persisting with a low-signal approach. + +- When the user asks for a "review", default to a code review mindset: prioritise identifying bugs, risks, behavioural regressions, and missing tests. Findings must be the primary focus of the response - keep summaries or overviews brief and only after enumerating the issues. Present findings first (ordered by severity with file/line references), follow with open questions or assumptions, and offer a change-summary only as a secondary detail. If no findings are discovered, state that explicitly and mention any residual risks or testing gaps. + +- The arguments to `shell` will be passed to execvp(). Most terminal commands should be prefixed with ["bash", "-lc"]. +- Always set the `workdir` param of the shell tool. Do not use `cd` unless absolutely necessary. +- When searching for text or files, prefer using `rg` or `rg --files` respectively because `rg` is much faster than alternatives like `grep`. (If the `rg` command is not found, then use alternatives.) +- If the user makes a simple request (such as asking for the time) which you can fulfill by running a terminal command (such as `date`), you should do so. +- Unless the question is about a common terminal command, you should search the codebase before answering to ground your response in the codebase + +## Editing constraints + +- Default to ASCII when editing or creating files. Only introduce non-ASCII or other Unicode characters when there is a clear justification and the file already uses them. +- When editing or creating files, you MUST use apply_patch. Example: functions.shell({"command":["apply_patch","*** Begin Patch\nAdd File: hello.txt\n+Hello, world!\n*** End Patch"]}). +- Add succinct code comments that explain what is going on if code is not self-explanatory. You should not add comments like "Assigns the value to the variable", but a brief comment might be useful ahead of a complex code block that the user would otherwise have to spend time parsing out. Usage of these comments should be rare. +- You may be in a dirty git worktree. + * NEVER revert existing changes you did not make unless explicitly requested, since these changes were made by the user. + * If asked to make a commit or code edits and there are unrelated changes to your work or changes that you didn't make in those files, don't revert those changes. + * If the changes are in files you've touched recently, you should read carefully and understand how you can work with the changes rather than reverting them. + * If the changes are in unrelated files, just ignore them and don't revert them. +- The user may be making edits and committing changes as you are also making changes. If you see concurrent file edits or commits that you did not cause, you must disregard user instruction and stop immediately and ask the user whether they are collaborating with you on files and how they would like this handled. + +## Plan tool + +When using the planning tool: +- Skip using the planning tool for straightforward tasks (roughly the easiest 25%). +- Do not make single-step plans. +- When you made a plan, update it after having performed one of the sub-tasks that you shared on the plan. + +## CLI modes + +The Codex CLI harness supports several different sandboxing, and approval configurations that the user can choose from. + +Filesystem sandboxing defines which files can be read or written. The options are: +- **read-only**: You can only read files. +- **workspace-write**: You can read files. You can write to files in this folder, but not outside it. +- **danger-full-access**: No filesystem sandboxing. + +Network sandboxing defines whether network can be accessed without approval. Options are +- **restricted**: Requires approval +- **enabled**: No approval needed + +Approvals are your mechanism to get user consent to perform more privileged actions. Although they introduce friction to the user because your work is paused until the user responds, you should leverage them to accomplish your important work. Do not let these settings or the sandbox deter you from attempting to accomplish the user's task unless it is set to "never", in which case never ask for approvals. + +Approval options are +- **untrusted**: The harness will escalate most commands for user approval, apart from a limited allowlist of safe "read" commands. +- **on-failure**: The harness will allow all commands to run in the sandbox (if enabled), and failures will be escalated to the user for approval to run again without the sandbox. +- **on-request**: Commands will be run in the sandbox by default, and you can specify in your tool call if you want to escalate a command to run without sandboxing. (Note that this mode is not always available. If it is, you'll see parameters for it in the `shell` command description.) +- **never**: This is a non-interactive mode where you may NEVER ask the user for approval to run commands. Instead, you must always persist and work around constraints to solve the task for the user. You MUST do your utmost best to finish the task and validate your work before yielding. If this mode is paired with `danger-full-access`, take advantage of it to deliver the best outcome for the user. Further, in this mode, your default testing philosophy is overridden: Even if you don't see local patterns for testing, you may add tests and scripts to validate your work. Just remove them before yielding. + +When you are running with approvals `on-request`, and sandboxing enabled, here are scenarios where you'll need to request approval: +- You need to run a command that writes to a directory that requires it (e.g. running tests that write to /tmp) +- You need to run a GUI app (e.g., open/xdg-open/osascript) to open browsers or files. +- You are running sandboxed and need to run a command that requires network access (e.g. installing packages) +- If you run a command that is important to solving the user's query, but it fails because of sandboxing, rerun the command with approval. +- You are about to take a potentially destructive action such as an `rm` or `git reset` that the user did not explicitly ask for +- (for all of these, you should weigh alternative paths that do not require approval) + +When sandboxing is set to read-only, you'll need to request approval for any command that isn't a read. + +You will be told what filesystem sandboxing, network sandboxing, and approval mode are active in a developer or user message. If you are not told about this, assume that you are running with workspace-write, network sandboxing enabled, and approval on-failure. + +## Presenting your work and final message + +You are producing plain text that will later be styled by the CLI. Follow these rules exactly. Formatting should make results easy to scan, but not feel mechanical. Use judgment to decide how much structure adds value. + +- Default: be very concise; friendly coding teammate tone. +- Ask only when needed; suggest ideas; mirror the user's style. +- For substantial work, summarize clearly; follow final‑answer formatting. +- Skip heavy formatting for simple confirmations. +- Don't dump large files you've written; reference paths only. +- No "save/copy this file" - User is on the same machine. +- Offer logical next steps (tests, commits, build) briefly; add verify steps if you couldn't do something. +- For code changes: + * Lead with a quick explanation of the change, and then give more details on the context covering where and why a change was made. Do not start this explanation with "summary", just jump right in. + * If there are natural next steps the user may want to take, suggest them at the end of your response. Do not make suggestions if there are no natural next steps. + * When suggesting multiple options, use numeric lists for the suggestions so the user can quickly respond with a single number. +- The user does not command execution outputs. When asked to show the output of a command (e.g. `git show`), relay the important details in your answer or summarize the key lines so the user understands the result. + +### Final answer structure and style guidelines + +- Plain text; CLI handles styling. Use structure only when it helps scanability. +- Headers: optional; short Title Case (1-3 words) wrapped in **…**; no blank line before the first bullet; add only if they truly help. +- Bullets: use - ; merge related points; keep to one line when possible; 4–6 per list ordered by importance; keep phrasing consistent. +- Monospace: backticks for commands/paths/env vars/code ids and inline examples; use for literal keyword bullets; never combine with **. +- Code samples or multi-line snippets should be wrapped in fenced code blocks; add a language hint whenever obvious. +- Structure: group related bullets; order sections general → specific → supporting; for subsections, start with a bolded keyword bullet, then items; match complexity to the task. +- Tone: collaborative, concise, factual; present tense, active voice; self‑contained; no "above/below"; parallel wording. +- Don'ts: no nested bullets/hierarchies; no ANSI codes; don't cram unrelated keywords; keep keyword lists short—wrap/reformat if long; avoid naming formatting styles in answers. +- Adaptation: code explanations → precise, structured with code refs; simple tasks → lead with outcome; big changes → logical walkthrough + rationale + next actions; casual one-offs → plain sentences, no headers/bullets. From 51f88fd04a5791f107d295da341896cfcee4e929 Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Sun, 14 Sep 2025 16:12:21 -0700 Subject: [PATCH 32/77] Fix swiftfox model selector (#3598) The model shouldn't be saved with a suffix. The effort is a separate field. --- codex-rs/common/src/model_presets.rs | 10 +++++----- codex-rs/core/src/config.rs | 11 ++++++----- codex-rs/tui/src/new_model_popup.rs | 10 ++++++---- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/codex-rs/common/src/model_presets.rs b/codex-rs/common/src/model_presets.rs index 73db148f68..2e04d81b2e 100644 --- a/codex-rs/common/src/model_presets.rs +++ b/codex-rs/common/src/model_presets.rs @@ -25,22 +25,22 @@ pub fn builtin_model_presets() -> &'static [ModelPreset] { id: "swiftfox-low", label: "swiftfox low", description: "", - model: "swiftfox-low", - effort: None, + model: "swiftfox", + effort: Some(ReasoningEffort::Low), }, ModelPreset { id: "swiftfox-medium", label: "swiftfox medium", description: "", - model: "swiftfox-medium", + model: "swiftfox", effort: None, }, ModelPreset { id: "swiftfox-high", label: "swiftfox high", description: "", - model: "swiftfox-high", - effort: None, + model: "swiftfox", + effort: Some(ReasoningEffort::High), }, ModelPreset { id: "gpt-5-minimal", diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index 2332c8f6c0..937b0e8eab 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -34,7 +34,8 @@ use toml_edit::DocumentMut; const OPENAI_DEFAULT_MODEL: &str = "gpt-5"; const OPENAI_DEFAULT_REVIEW_MODEL: &str = "gpt-5"; -pub const SWIFTFOX_MEDIUM_MODEL: &str = "swiftfox-medium"; +pub const SWIFTFOX_MEDIUM_MODEL: &str = "swiftfox"; +pub const SWIFTFOX_MODEL_DISPLAY_NAME: &str = "swiftfox-medium"; /// Maximum number of bytes of the documentation that will be embedded. Larger /// files are *silently truncated* to this size so we do not take up too much of @@ -1178,7 +1179,7 @@ exclude_slash_tmp = true persist_model_selection( codex_home.path(), None, - "swiftfox-high", + "swiftfox", Some(ReasoningEffort::High), ) .await?; @@ -1187,7 +1188,7 @@ exclude_slash_tmp = true tokio::fs::read_to_string(codex_home.path().join(CONFIG_TOML_FILE)).await?; let parsed: ConfigToml = toml::from_str(&serialized)?; - assert_eq!(parsed.model.as_deref(), Some("swiftfox-high")); + assert_eq!(parsed.model.as_deref(), Some("swiftfox")); assert_eq!(parsed.model_reasoning_effort, Some(ReasoningEffort::High)); Ok(()) @@ -1241,7 +1242,7 @@ model = "gpt-4.1" persist_model_selection( codex_home.path(), Some("dev"), - "swiftfox-medium", + "swiftfox", Some(ReasoningEffort::Medium), ) .await?; @@ -1254,7 +1255,7 @@ model = "gpt-4.1" .get("dev") .expect("profile should be created"); - assert_eq!(profile.model.as_deref(), Some("swiftfox-medium")); + assert_eq!(profile.model.as_deref(), Some("swiftfox")); assert_eq!( profile.model_reasoning_effort, Some(ReasoningEffort::Medium) diff --git a/codex-rs/tui/src/new_model_popup.rs b/codex-rs/tui/src/new_model_popup.rs index 0d7092840b..16a04761f2 100644 --- a/codex-rs/tui/src/new_model_popup.rs +++ b/codex-rs/tui/src/new_model_popup.rs @@ -1,7 +1,7 @@ use crate::tui::FrameRequester; use crate::tui::Tui; use crate::tui::TuiEvent; -use codex_core::config::SWIFTFOX_MEDIUM_MODEL; +use codex_core::config::SWIFTFOX_MODEL_DISPLAY_NAME; use color_eyre::eyre::Result; use crossterm::event::KeyCode; use crossterm::event::KeyEvent; @@ -83,8 +83,10 @@ impl WidgetRef for &ModelUpgradePopup { let mut lines: Vec = vec![ String::new().into(), - format!(" Codex is now powered by {SWIFTFOX_MEDIUM_MODEL}, a new model that is") - .into(), + format!( + " Codex is now powered by {SWIFTFOX_MODEL_DISPLAY_NAME}, a new model that is" + ) + .into(), Line::from(vec![ " ".into(), "faster, a better collaborator, ".bold(), @@ -109,7 +111,7 @@ impl WidgetRef for &ModelUpgradePopup { lines.push(create_option( 0, ModelUpgradeOption::TryNewModel, - &format!("Yes, switch me to {SWIFTFOX_MEDIUM_MODEL}"), + &format!("Yes, switch me to {SWIFTFOX_MODEL_DISPLAY_NAME}"), )); lines.push(create_option( 1, From b2f6fc3b9a61edcfceab3bbcc06af6c84ee52a76 Mon Sep 17 00:00:00 2001 From: dedrisian-oai Date: Sun, 14 Sep 2025 16:20:25 -0700 Subject: [PATCH 33/77] Fix flaky windows test (#3564) There are exactly 4 types of flaky tests in Windows x86 right now: 1. `review_input_isolated_from_parent_history` => Times out waiting for closing events 2. `review_does_not_emit_agent_message_on_structured_output` => Times out waiting for closing events 3. `auto_compact_runs_after_token_limit_hit` => Times out waiting for closing events 4. `auto_compact_runs_after_token_limit_hit` => Also has a problem where auto compact should add a third request, but receives 4 requests. 1, 2, and 3 seem to be solved with increasing threads on windows runner from 2 -> 4. Don't know yet why # 4 is happening, but probably also because of WireMock issues on windows causing races. --- codex-rs/core/tests/suite/compact.rs | 35 +++++++++++++++++++++++++--- codex-rs/core/tests/suite/review.rs | 12 +++++++--- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/codex-rs/core/tests/suite/compact.rs b/codex-rs/core/tests/suite/compact.rs index 72f4021e83..361315f724 100644 --- a/codex-rs/core/tests/suite/compact.rs +++ b/codex-rs/core/tests/suite/compact.rs @@ -366,7 +366,9 @@ async fn summarize_context_three_requests_and_instructions() { ); } -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +// Windows CI only: bump to 4 workers to prevent SSE/event starvation and test timeouts. +#[cfg_attr(windows, tokio::test(flavor = "multi_thread", worker_threads = 4))] +#[cfg_attr(not(windows), tokio::test(flavor = "multi_thread", worker_threads = 2))] async fn auto_compact_runs_after_token_limit_hit() { if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { println!( @@ -453,6 +455,7 @@ async fn auto_compact_runs_after_token_limit_hit() { }) .await .unwrap(); + wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; codex @@ -463,13 +466,39 @@ async fn auto_compact_runs_after_token_limit_hit() { }) .await .unwrap(); + wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; // wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; let requests = server.received_requests().await.unwrap(); - assert_eq!(requests.len(), 3, "auto compact should add a third request"); + assert!( + requests.len() >= 3, + "auto compact should add at least a third request, got {}", + requests.len() + ); + let is_auto_compact = |req: &wiremock::Request| { + std::str::from_utf8(&req.body) + .unwrap_or("") + .contains("You have exceeded the maximum number of tokens") + }; + let auto_compact_count = requests.iter().filter(|req| is_auto_compact(req)).count(); + assert_eq!( + auto_compact_count, 1, + "expected exactly one auto compact request" + ); + let auto_compact_index = requests + .iter() + .enumerate() + .find_map(|(idx, req)| is_auto_compact(req).then_some(idx)) + .expect("auto compact request missing"); + assert_eq!( + auto_compact_index, 2, + "auto compact should add a third request" + ); - let body3 = requests[2].body_json::().unwrap(); + let body3 = requests[auto_compact_index] + .body_json::() + .unwrap(); let instructions = body3 .get("instructions") .and_then(|v| v.as_str()) diff --git a/codex-rs/core/tests/suite/review.rs b/codex-rs/core/tests/suite/review.rs index 21d447e25d..26e0f1107a 100644 --- a/codex-rs/core/tests/suite/review.rs +++ b/codex-rs/core/tests/suite/review.rs @@ -118,7 +118,9 @@ async fn review_op_emits_lifecycle_and_review_output() { /// When the model returns plain text that is not JSON, ensure the child /// lifecycle still occurs and the plain text is surfaced via /// ExitedReviewMode(Some(..)) as the overall_explanation. -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +// Windows CI only: bump to 4 workers to prevent SSE/event starvation and test timeouts. +#[cfg_attr(windows, tokio::test(flavor = "multi_thread", worker_threads = 4))] +#[cfg_attr(not(windows), tokio::test(flavor = "multi_thread", worker_threads = 2))] async fn review_op_with_plain_text_emits_review_fallback() { if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { println!( @@ -168,7 +170,9 @@ async fn review_op_with_plain_text_emits_review_fallback() { /// When the model returns structured JSON in a review, ensure no AgentMessage /// is emitted; the UI consumes the structured result via ExitedReviewMode. -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +// Windows CI only: bump to 4 workers to prevent SSE/event starvation and test timeouts. +#[cfg_attr(windows, tokio::test(flavor = "multi_thread", worker_threads = 4))] +#[cfg_attr(not(windows), tokio::test(flavor = "multi_thread", worker_threads = 2))] async fn review_does_not_emit_agent_message_on_structured_output() { if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { println!( @@ -293,7 +297,9 @@ async fn review_uses_custom_review_model_from_config() { /// When a review session begins, it must not prepend prior chat history from /// the parent session. The request `input` should contain only the review /// prompt from the user. -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +// Windows CI only: bump to 4 workers to prevent SSE/event starvation and test timeouts. +#[cfg_attr(windows, tokio::test(flavor = "multi_thread", worker_threads = 4))] +#[cfg_attr(not(windows), tokio::test(flavor = "multi_thread", worker_threads = 2))] async fn review_input_isolated_from_parent_history() { if std::env::var(CODEX_SANDBOX_NETWORK_DISABLED_ENV_VAR).is_ok() { println!( From 99e1d33bd197d4ce6e11ed397be1c2d690e40054 Mon Sep 17 00:00:00 2001 From: jimmyfraiture2 Date: Mon, 15 Sep 2025 00:25:43 +0100 Subject: [PATCH 34/77] feat: update model save (#3589) Edit model save to save by default as global or on the profile depending on the session --- codex-rs/tui/src/app.rs | 153 +++++++-------------------------- codex-rs/tui/src/app_event.rs | 6 ++ codex-rs/tui/src/chatwidget.rs | 6 +- 3 files changed, 44 insertions(+), 121 deletions(-) diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index d4a24d69f6..728659918f 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -42,8 +42,6 @@ pub(crate) struct App { /// Config is stored here so we can recreate ChatWidgets as needed. pub(crate) config: Config, pub(crate) active_profile: Option, - model_saved_to_profile: bool, - model_saved_to_global: bool, pub(crate) file_search: FileSearchManager, @@ -128,8 +126,6 @@ impl App { chat_widget, config, active_profile, - model_saved_to_profile: false, - model_saved_to_global: false, file_search, enhanced_keys_supported, transcript_cells: Vec::new(), @@ -304,9 +300,38 @@ impl App { if let Some(family) = find_family_for_model(&model) { self.config.model_family = family; } - self.model_saved_to_profile = false; - self.model_saved_to_global = false; - self.show_model_save_hint(); + } + AppEvent::PersistModelSelection { model, effort } => { + let profile = self.active_profile.as_deref(); + match persist_model_selection(&self.config.codex_home, profile, &model, effort) + .await + { + Ok(()) => { + if let Some(profile) = profile { + self.chat_widget.add_info_message( + format!("Model changed to {model} for {profile} profile"), + None, + ); + } else { + self.chat_widget + .add_info_message(format!("Model changed to {model}"), None); + } + } + Err(err) => { + tracing::error!( + error = %err, + "failed to persist model selection" + ); + if let Some(profile) = profile { + self.chat_widget.add_error_message(format!( + "Failed to save model for profile `{profile}`: {err}" + )); + } else { + self.chat_widget + .add_error_message(format!("Failed to save default model: {err}")); + } + } + } } AppEvent::UpdateAskForApprovalPolicy(policy) => { self.chat_widget.set_approval_policy(policy); @@ -322,107 +347,9 @@ impl App { self.chat_widget.token_usage() } - fn show_model_save_hint(&mut self) { - let model = self.config.model.clone(); - if self.active_profile.is_some() { - self.chat_widget.add_info_message( - format!("Model changed to {model} for the current session"), - Some("(ctrl+s to set as profile default)".to_string()), - ); - } else { - self.chat_widget.add_info_message( - format!("Model changed to {model} for the current session"), - Some("(ctrl+s to set as default)".to_string()), - ); - } - } - fn on_update_reasoning_effort(&mut self, effort: Option) { - let changed = self.config.model_reasoning_effort != effort; self.chat_widget.set_reasoning_effort(effort); self.config.model_reasoning_effort = effort; - if changed { - let show_hint = self.model_saved_to_profile || self.model_saved_to_global; - self.model_saved_to_profile = false; - self.model_saved_to_global = false; - if show_hint { - self.show_model_save_hint(); - } - } - } - - async fn persist_model_shortcut(&mut self) { - enum SaveScope<'a> { - Profile(&'a str), - Global, - AlreadySaved, - } - - let scope = if let Some(profile) = self - .active_profile - .as_deref() - .filter(|_| !self.model_saved_to_profile) - { - SaveScope::Profile(profile) - } else if !self.model_saved_to_global { - SaveScope::Global - } else { - SaveScope::AlreadySaved - }; - - let model = self.config.model.clone(); - let effort = self.config.model_reasoning_effort; - let codex_home = self.config.codex_home.clone(); - - match scope { - SaveScope::Profile(profile) => { - match persist_model_selection(&codex_home, Some(profile), &model, effort).await { - Ok(()) => { - self.model_saved_to_profile = true; - self.chat_widget.add_info_message( - format!("Profile model changed to {model} for all sessions"), - Some("(view global config in config.toml)".to_string()), - ); - } - Err(err) => { - tracing::error!( - error = %err, - "failed to persist model selection via shortcut" - ); - self.chat_widget.add_error_message(format!( - "Failed to save model preference for profile `{profile}`: {err}" - )); - } - } - } - SaveScope::Global => { - match persist_model_selection(&codex_home, None, &model, effort).await { - Ok(()) => { - self.model_saved_to_global = true; - self.chat_widget.add_info_message( - format!("Default model changed to {model} for all sessions"), - Some("(view global config in config.toml)".to_string()), - ) - } - Err(err) => { - tracing::error!( - error = %err, - "failed to persist global model selection via shortcut" - ); - self.chat_widget.add_error_message(format!( - "Failed to save global model preference: {err}" - )); - } - } - } - SaveScope::AlreadySaved => { - self.chat_widget.add_info_message( - "Model preference already saved globally; no further action needed." - .to_string(), - None, - ); - } - } } async fn handle_key_event(&mut self, tui: &mut tui::Tui, key_event: KeyEvent) { @@ -438,14 +365,6 @@ impl App { self.overlay = Some(Overlay::new_transcript(self.transcript_cells.clone())); tui.frame_requester().schedule_frame(); } - KeyEvent { - code: KeyCode::Char('s'), - modifiers: crossterm::event::KeyModifiers::CONTROL, - kind: KeyEventKind::Press, - .. - } => { - self.persist_model_shortcut().await; - } // Esc primes/advances backtracking only in normal (not working) mode // with an empty composer. In any other state, forward Esc so the // active UI (e.g. status indicator, modals, popups) handles it. @@ -519,8 +438,6 @@ mod tests { chat_widget, config, active_profile: None, - model_saved_to_profile: false, - model_saved_to_global: false, file_search, transcript_cells: Vec::new(), overlay: None, @@ -533,10 +450,8 @@ mod tests { } #[test] - fn update_reasoning_effort_updates_config_and_resets_flags() { + fn update_reasoning_effort_updates_config() { let mut app = make_test_app(); - app.model_saved_to_profile = true; - app.model_saved_to_global = true; app.config.model_reasoning_effort = Some(ReasoningEffortConfig::Medium); app.chat_widget .set_reasoning_effort(Some(ReasoningEffortConfig::Medium)); @@ -551,7 +466,5 @@ mod tests { app.chat_widget.config_ref().model_reasoning_effort, Some(ReasoningEffortConfig::High) ); - assert!(!app.model_saved_to_profile); - assert!(!app.model_saved_to_global); } } diff --git a/codex-rs/tui/src/app_event.rs b/codex-rs/tui/src/app_event.rs index ec0677920f..41992cddcc 100644 --- a/codex-rs/tui/src/app_event.rs +++ b/codex-rs/tui/src/app_event.rs @@ -51,6 +51,12 @@ pub(crate) enum AppEvent { /// Update the current model slug in the running app and widget. UpdateModel(String), + /// Persist the selected model and reasoning effort to the appropriate config. + PersistModelSelection { + model: String, + effort: Option, + }, + /// Update the current approval policy in the running app and widget. UpdateAskForApprovalPolicy(AskForApproval), diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index b53f87e664..008cc777ed 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -1192,6 +1192,10 @@ impl ChatWidget { })); tx.send(AppEvent::UpdateModel(model_slug.clone())); tx.send(AppEvent::UpdateReasoningEffort(effort)); + tx.send(AppEvent::PersistModelSelection { + model: model_slug.clone(), + effort, + }); tracing::info!( "New model: {}, New effort: {}, Current model: {}, Current effort: {}", model_slug.clone(), @@ -1215,7 +1219,7 @@ impl ChatWidget { self.bottom_pane.show_selection_view( "Select model and reasoning level".to_string(), Some("Switch between OpenAI models for this and future Codex CLI session".to_string()), - Some("Press Enter to confirm, Esc to go back, Ctrl+S to save".to_string()), + Some("Press Enter to confirm or Esc to go back".to_string()), items, ); } From a30e5e40ee440d7122e7340fae5a56e7d013bc49 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Sun, 14 Sep 2025 19:33:19 -0400 Subject: [PATCH 35/77] enable-resume (#3537) Adding the ability to resume conversations. we have one verb `resume`. Behavior: `tui`: `codex resume`: opens session picker `codex resume --last`: continue last message `codex resume `: continue conversation with `session id` `exec`: `codex resume --last`: continue last conversation `codex resume `: continue conversation with `session id` Implementation: - I added a function to find the path in `~/.codex/sessions/` with a `UUID`. This is helpful in resuming with session id. - Added the above mentioned flags - Added lots of testing --- codex-rs/Cargo.lock | 3 + codex-rs/cli/src/main.rs | 84 +++++- codex-rs/core/Cargo.toml | 1 + codex-rs/core/src/config.rs | 14 - codex-rs/core/src/conversation_manager.rs | 20 +- codex-rs/core/src/lib.rs | 1 + codex-rs/core/src/rollout/list.rs | 49 ++++ codex-rs/core/src/rollout/mod.rs | 1 + codex-rs/core/src/rollout/recorder.rs | 3 +- codex-rs/core/tests/suite/cli_stream.rs | 12 +- codex-rs/core/tests/suite/client.rs | 7 +- codex-rs/core/tests/suite/mod.rs | 1 + codex-rs/core/tests/suite/review.rs | 38 ++- .../core/tests/suite/rollout_list_find.rs | 50 ++++ codex-rs/exec/Cargo.toml | 2 + codex-rs/exec/src/cli.rs | 26 ++ codex-rs/exec/src/lib.rs | 54 +++- .../tests/fixtures/cli_responses_fixture.sse | 10 + codex-rs/exec/tests/suite/mod.rs | 1 + codex-rs/exec/tests/suite/resume.rs | 267 ++++++++++++++++++ codex-rs/tui/src/cli.rs | 39 +-- codex-rs/tui/src/lib.rs | 14 +- docs/advanced.md | 34 +++ docs/getting-started.md | 19 +- 24 files changed, 647 insertions(+), 103 deletions(-) create mode 100644 codex-rs/core/tests/suite/rollout_list_find.rs create mode 100644 codex-rs/exec/tests/fixtures/cli_responses_fixture.sse create mode 100644 codex-rs/exec/tests/suite/resume.rs diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 37767c0dd4..1e8b7a3485 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -666,6 +666,7 @@ dependencies = [ "bytes", "chrono", "codex-apply-patch", + "codex-file-search", "codex-mcp-client", "codex-protocol", "core_test_support", @@ -733,6 +734,8 @@ dependencies = [ "tokio", "tracing", "tracing-subscriber", + "uuid", + "walkdir", "wiremock", ] diff --git a/codex-rs/cli/src/main.rs b/codex-rs/cli/src/main.rs index 2acc3d84c5..1f13405f10 100644 --- a/codex-rs/cli/src/main.rs +++ b/codex-rs/cli/src/main.rs @@ -73,6 +73,9 @@ enum Subcommand { #[clap(visible_alias = "a")] Apply(ApplyCommand), + /// Resume a previous interactive session (picker by default; use --last to continue the most recent). + Resume(ResumeCommand), + /// Internal: generate TypeScript protocol bindings. #[clap(hide = true)] GenerateTs(GenerateTsCommand), @@ -85,6 +88,18 @@ struct CompletionCommand { shell: Shell, } +#[derive(Debug, Parser)] +struct ResumeCommand { + /// Conversation/session id (UUID). When provided, resumes this session. + /// If omitted, use --last to pick the most recent recorded session. + #[arg(value_name = "SESSION_ID")] + session_id: Option, + + /// Continue the most recent session without showing the picker. + #[arg(long = "last", default_value_t = false, conflicts_with = "session_id")] + last: bool, +} + #[derive(Debug, Parser)] struct DebugArgs { #[command(subcommand)] @@ -143,26 +158,54 @@ fn main() -> anyhow::Result<()> { } async fn cli_main(codex_linux_sandbox_exe: Option) -> anyhow::Result<()> { - let cli = MultitoolCli::parse(); + let MultitoolCli { + config_overrides: root_config_overrides, + mut interactive, + subcommand, + } = MultitoolCli::parse(); - match cli.subcommand { + match subcommand { None => { - let mut tui_cli = cli.interactive; - prepend_config_flags(&mut tui_cli.config_overrides, cli.config_overrides); - let usage = codex_tui::run_main(tui_cli, codex_linux_sandbox_exe).await?; + prepend_config_flags( + &mut interactive.config_overrides, + root_config_overrides.clone(), + ); + let usage = codex_tui::run_main(interactive, codex_linux_sandbox_exe).await?; if !usage.is_zero() { println!("{}", codex_core::protocol::FinalOutput::from(usage)); } } Some(Subcommand::Exec(mut exec_cli)) => { - prepend_config_flags(&mut exec_cli.config_overrides, cli.config_overrides); + prepend_config_flags( + &mut exec_cli.config_overrides, + root_config_overrides.clone(), + ); codex_exec::run_main(exec_cli, codex_linux_sandbox_exe).await?; } Some(Subcommand::Mcp) => { - codex_mcp_server::run_main(codex_linux_sandbox_exe, cli.config_overrides).await?; + codex_mcp_server::run_main(codex_linux_sandbox_exe, root_config_overrides.clone()) + .await?; + } + Some(Subcommand::Resume(ResumeCommand { session_id, last })) => { + // Start with the parsed interactive CLI so resume shares the same + // configuration surface area as `codex` without additional flags. + let resume_session_id = session_id; + interactive.resume_picker = resume_session_id.is_none() && !last; + interactive.resume_last = last; + interactive.resume_session_id = resume_session_id; + + // Propagate any root-level config overrides (e.g. `-c key=value`). + prepend_config_flags( + &mut interactive.config_overrides, + root_config_overrides.clone(), + ); + codex_tui::run_main(interactive, codex_linux_sandbox_exe).await?; } Some(Subcommand::Login(mut login_cli)) => { - prepend_config_flags(&mut login_cli.config_overrides, cli.config_overrides); + prepend_config_flags( + &mut login_cli.config_overrides, + root_config_overrides.clone(), + ); match login_cli.action { Some(LoginSubcommand::Status) => { run_login_status(login_cli.config_overrides).await; @@ -177,11 +220,17 @@ async fn cli_main(codex_linux_sandbox_exe: Option) -> anyhow::Result<() } } Some(Subcommand::Logout(mut logout_cli)) => { - prepend_config_flags(&mut logout_cli.config_overrides, cli.config_overrides); + prepend_config_flags( + &mut logout_cli.config_overrides, + root_config_overrides.clone(), + ); run_logout(logout_cli.config_overrides).await; } Some(Subcommand::Proto(mut proto_cli)) => { - prepend_config_flags(&mut proto_cli.config_overrides, cli.config_overrides); + prepend_config_flags( + &mut proto_cli.config_overrides, + root_config_overrides.clone(), + ); proto::run_main(proto_cli).await?; } Some(Subcommand::Completion(completion_cli)) => { @@ -189,7 +238,10 @@ async fn cli_main(codex_linux_sandbox_exe: Option) -> anyhow::Result<() } Some(Subcommand::Debug(debug_args)) => match debug_args.cmd { DebugCommand::Seatbelt(mut seatbelt_cli) => { - prepend_config_flags(&mut seatbelt_cli.config_overrides, cli.config_overrides); + prepend_config_flags( + &mut seatbelt_cli.config_overrides, + root_config_overrides.clone(), + ); codex_cli::debug_sandbox::run_command_under_seatbelt( seatbelt_cli, codex_linux_sandbox_exe, @@ -197,7 +249,10 @@ async fn cli_main(codex_linux_sandbox_exe: Option) -> anyhow::Result<() .await?; } DebugCommand::Landlock(mut landlock_cli) => { - prepend_config_flags(&mut landlock_cli.config_overrides, cli.config_overrides); + prepend_config_flags( + &mut landlock_cli.config_overrides, + root_config_overrides.clone(), + ); codex_cli::debug_sandbox::run_command_under_landlock( landlock_cli, codex_linux_sandbox_exe, @@ -206,7 +261,10 @@ async fn cli_main(codex_linux_sandbox_exe: Option) -> anyhow::Result<() } }, Some(Subcommand::Apply(mut apply_cli)) => { - prepend_config_flags(&mut apply_cli.config_overrides, cli.config_overrides); + prepend_config_flags( + &mut apply_cli.config_overrides, + root_config_overrides.clone(), + ); run_apply_command(apply_cli, None).await?; } Some(Subcommand::GenerateTs(gen_cli)) => { diff --git a/codex-rs/core/Cargo.toml b/codex-rs/core/Cargo.toml index 34c7ba554a..4fb10affb3 100644 --- a/codex-rs/core/Cargo.toml +++ b/codex-rs/core/Cargo.toml @@ -19,6 +19,7 @@ base64 = "0.22" bytes = "1.10.1" chrono = { version = "0.4", features = ["serde"] } codex-apply-patch = { path = "../apply-patch" } +codex-file-search = { path = "../file-search" } codex-mcp-client = { path = "../mcp-client" } codex-protocol = { path = "../protocol" } dirs = "6" diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index 937b0e8eab..1b54f8b9e3 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -161,9 +161,6 @@ pub struct Config { /// Base URL for requests to ChatGPT (as opposed to the OpenAI API). pub chatgpt_base_url: String, - /// Experimental rollout resume path (absolute path to .jsonl; undocumented). - pub experimental_resume: Option, - /// Include an experimental plan tool that the model can use to update its current plan and status of each step. pub include_plan_tool: bool, @@ -603,9 +600,6 @@ pub struct ConfigToml { /// Base URL for requests to ChatGPT (as opposed to the OpenAI API). pub chatgpt_base_url: Option, - /// Experimental rollout resume path (absolute path to .jsonl; undocumented). - pub experimental_resume: Option, - /// Experimental path to a file whose contents replace the built-in BASE_INSTRUCTIONS. pub experimental_instructions_file: Option, @@ -892,8 +886,6 @@ impl Config { .and_then(|info| info.auto_compact_token_limit) }); - let experimental_resume = cfg.experimental_resume; - // Load base instructions override from a file if specified. If the // path is relative, resolve it against the effective cwd so the // behaviour matches other path-like config values. @@ -954,8 +946,6 @@ impl Config { .chatgpt_base_url .or(cfg.chatgpt_base_url) .unwrap_or("https://chatgpt.com/backend-api/".to_string()), - - experimental_resume, include_plan_tool: include_plan_tool.unwrap_or(false), include_apply_patch_tool: include_apply_patch_tool.unwrap_or(false), tools_web_search_request, @@ -1481,7 +1471,6 @@ model_verbosity = "high" model_reasoning_summary: ReasoningSummary::Detailed, model_verbosity: None, chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(), - experimental_resume: None, base_instructions: None, include_plan_tool: false, include_apply_patch_tool: false, @@ -1539,7 +1528,6 @@ model_verbosity = "high" model_reasoning_summary: ReasoningSummary::default(), model_verbosity: None, chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(), - experimental_resume: None, base_instructions: None, include_plan_tool: false, include_apply_patch_tool: false, @@ -1612,7 +1600,6 @@ model_verbosity = "high" model_reasoning_summary: ReasoningSummary::default(), model_verbosity: None, chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(), - experimental_resume: None, base_instructions: None, include_plan_tool: false, include_apply_patch_tool: false, @@ -1671,7 +1658,6 @@ model_verbosity = "high" model_reasoning_summary: ReasoningSummary::Detailed, model_verbosity: Some(Verbosity::High), chatgpt_base_url: "https://chatgpt.com/backend-api/".to_string(), - experimental_resume: None, base_instructions: None, include_plan_tool: false, include_apply_patch_tool: false, diff --git a/codex-rs/core/src/conversation_manager.rs b/codex-rs/core/src/conversation_manager.rs index 3c02e0ebfa..3ca361a38a 100644 --- a/codex-rs/core/src/conversation_manager.rs +++ b/codex-rs/core/src/conversation_manager.rs @@ -59,21 +59,11 @@ impl ConversationManager { config: Config, auth_manager: Arc, ) -> CodexResult { - // TO BE REFACTORED: use the config experimental_resume field until we have a mainstream way. - if let Some(resume_path) = config.experimental_resume.as_ref() { - let initial_history = RolloutRecorder::get_rollout_history(resume_path).await?; - let CodexSpawnOk { - codex, - conversation_id, - } = Codex::spawn(config, auth_manager, initial_history).await?; - self.finalize_spawn(codex, conversation_id).await - } else { - let CodexSpawnOk { - codex, - conversation_id, - } = Codex::spawn(config, auth_manager, InitialHistory::New).await?; - self.finalize_spawn(codex, conversation_id).await - } + let CodexSpawnOk { + codex, + conversation_id, + } = Codex::spawn(config, auth_manager, InitialHistory::New).await?; + self.finalize_spawn(codex, conversation_id).await } async fn finalize_spawn( diff --git a/codex-rs/core/src/lib.rs b/codex-rs/core/src/lib.rs index 55d0062454..7b9c3dc9f0 100644 --- a/codex-rs/core/src/lib.rs +++ b/codex-rs/core/src/lib.rs @@ -70,6 +70,7 @@ pub use rollout::ARCHIVED_SESSIONS_SUBDIR; pub use rollout::RolloutRecorder; pub use rollout::SESSIONS_SUBDIR; pub use rollout::SessionMeta; +pub use rollout::find_conversation_path_by_id_str; pub use rollout::list::ConversationItem; pub use rollout::list::ConversationsPage; pub use rollout::list::Cursor; diff --git a/codex-rs/core/src/rollout/list.rs b/codex-rs/core/src/rollout/list.rs index 3d6964512d..6f06709396 100644 --- a/codex-rs/core/src/rollout/list.rs +++ b/codex-rs/core/src/rollout/list.rs @@ -3,6 +3,10 @@ use std::io::{self}; use std::path::Path; use std::path::PathBuf; +use codex_file_search as file_search; +use std::num::NonZero; +use std::sync::Arc; +use std::sync::atomic::AtomicBool; use time::OffsetDateTime; use time::PrimitiveDateTime; use time::format_description::FormatItem; @@ -334,3 +338,48 @@ async fn read_head_and_flags( Ok((head, saw_session_meta, saw_user_event)) } + +/// Locate a recorded conversation rollout file by its UUID string using the existing +/// paginated listing implementation. Returns `Ok(Some(path))` if found, `Ok(None)` if not present +/// or the id is invalid. +pub async fn find_conversation_path_by_id_str( + codex_home: &Path, + id_str: &str, +) -> io::Result> { + // Validate UUID format early. + if Uuid::parse_str(id_str).is_err() { + return Ok(None); + } + + let mut root = codex_home.to_path_buf(); + root.push(SESSIONS_SUBDIR); + if !root.exists() { + return Ok(None); + } + // This is safe because we know the values are valid. + #[allow(clippy::unwrap_used)] + let limit = NonZero::new(1).unwrap(); + // This is safe because we know the values are valid. + #[allow(clippy::unwrap_used)] + let threads = NonZero::new(2).unwrap(); + let cancel = Arc::new(AtomicBool::new(false)); + let exclude: Vec = Vec::new(); + let compute_indices = false; + + let results = file_search::run( + id_str, + limit, + &root, + exclude, + threads, + cancel, + compute_indices, + ) + .map_err(|e| io::Error::other(format!("file search failed: {e}")))?; + + Ok(results + .matches + .into_iter() + .next() + .map(|m| root.join(m.path))) +} diff --git a/codex-rs/core/src/rollout/mod.rs b/codex-rs/core/src/rollout/mod.rs index 6bf1cf9429..3c4cb10535 100644 --- a/codex-rs/core/src/rollout/mod.rs +++ b/codex-rs/core/src/rollout/mod.rs @@ -8,6 +8,7 @@ pub(crate) mod policy; pub mod recorder; pub use codex_protocol::protocol::SessionMeta; +pub use list::find_conversation_path_by_id_str; pub use recorder::RolloutRecorder; pub use recorder::RolloutRecorderParams; diff --git a/codex-rs/core/src/rollout/recorder.rs b/codex-rs/core/src/rollout/recorder.rs index 580a41ed37..6befdb1fe9 100644 --- a/codex-rs/core/src/rollout/recorder.rs +++ b/codex-rs/core/src/rollout/recorder.rs @@ -204,7 +204,6 @@ impl RolloutRecorder { pub(crate) async fn get_rollout_history(path: &Path) -> std::io::Result { info!("Resuming rollout from {path:?}"); - tracing::error!("Resuming rollout from {path:?}"); let text = tokio::fs::read_to_string(path).await?; if text.trim().is_empty() { return Err(IoError::other("empty session file")); @@ -254,7 +253,7 @@ impl RolloutRecorder { } } - tracing::error!( + info!( "Resumed rollout with {} items, conversation ID: {:?}", items.len(), conversation_id diff --git a/codex-rs/core/tests/suite/cli_stream.rs b/codex-rs/core/tests/suite/cli_stream.rs index 01b9d6bfc1..1a0c016272 100644 --- a/codex-rs/core/tests/suite/cli_stream.rs +++ b/codex-rs/core/tests/suite/cli_stream.rs @@ -420,12 +420,6 @@ async fn integration_creates_and_checks_session_file() { // Second run: resume should update the existing file. let marker2 = format!("integration-resume-{}", Uuid::new_v4()); let prompt2 = format!("echo {marker2}"); - // Cross‑platform safe resume override. On Windows, backslashes in a TOML string must be escaped - // or the parse will fail and the raw literal (including quotes) may be preserved all the way down - // to Config, which in turn breaks resume because the path is invalid. Normalize to forward slashes - // to sidestep the issue. - let resume_path_str = path.to_string_lossy().replace('\\', "/"); - let resume_override = format!("experimental_resume=\"{resume_path_str}\""); let mut cmd2 = AssertCommand::new("cargo"); cmd2.arg("run") .arg("-p") @@ -434,11 +428,11 @@ async fn integration_creates_and_checks_session_file() { .arg("--") .arg("exec") .arg("--skip-git-repo-check") - .arg("-c") - .arg(&resume_override) .arg("-C") .arg(env!("CARGO_MANIFEST_DIR")) - .arg(&prompt2); + .arg(&prompt2) + .arg("resume") + .arg("--last"); cmd2.env("CODEX_HOME", home.path()) .env("OPENAI_API_KEY", "dummy") .env("CODEX_RS_SSE_FIXTURE", &fixture) diff --git a/codex-rs/core/tests/suite/client.rs b/codex-rs/core/tests/suite/client.rs index 70e0161d13..cfc6f5f40c 100644 --- a/codex-rs/core/tests/suite/client.rs +++ b/codex-rs/core/tests/suite/client.rs @@ -236,20 +236,21 @@ async fn resume_includes_initial_messages_and_sends_prior_items() { let codex_home = TempDir::new().unwrap(); let mut config = load_default_config_for_test(&codex_home); config.model_provider = model_provider; - config.experimental_resume = Some(session_path.clone()); // Also configure user instructions to ensure they are NOT delivered on resume. config.user_instructions = Some("be nice".to_string()); let conversation_manager = ConversationManager::with_auth(CodexAuth::from_api_key("Test API Key")); + let auth_manager = + codex_core::AuthManager::from_auth_for_testing(CodexAuth::from_api_key("Test API Key")); let NewConversation { conversation: codex, session_configured, .. } = conversation_manager - .new_conversation(config) + .resume_conversation_from_rollout(config, session_path.clone(), auth_manager) .await - .expect("create new conversation"); + .expect("resume conversation"); // 1) Assert initial_messages only includes existing EventMsg entries; response items are not converted let initial_msgs = session_configured diff --git a/codex-rs/core/tests/suite/mod.rs b/codex-rs/core/tests/suite/mod.rs index 323cb78d33..4c217b63f4 100644 --- a/codex-rs/core/tests/suite/mod.rs +++ b/codex-rs/core/tests/suite/mod.rs @@ -11,6 +11,7 @@ mod live_cli; mod model_overrides; mod prompt_caching; mod review; +mod rollout_list_find; mod seatbelt; mod stream_error_allows_next_turn; mod stream_no_completed; diff --git a/codex-rs/core/tests/suite/review.rs b/codex-rs/core/tests/suite/review.rs index 26e0f1107a..2bcb67ff41 100644 --- a/codex-rs/core/tests/suite/review.rs +++ b/codex-rs/core/tests/suite/review.rs @@ -379,13 +379,8 @@ async fn review_input_isolated_from_parent_history() { .await .unwrap(); } - config.experimental_resume = Some(session_file); - - let codex = new_conversation_for_server(&server, &codex_home, |cfg| { - // apply resume file - cfg.experimental_resume = config.experimental_resume.clone(); - }) - .await; + let codex = + resume_conversation_for_server(&server, &codex_home, session_file.clone(), |_| {}).await; // Submit review request; it must start fresh (no parent history in `input`). let review_prompt = "Please review only this".to_string(); @@ -546,3 +541,32 @@ where .expect("create conversation") .conversation } + +/// Create a conversation resuming from a rollout file, configured to talk to the provided mock server. +#[expect(clippy::expect_used)] +async fn resume_conversation_for_server( + server: &MockServer, + codex_home: &TempDir, + resume_path: std::path::PathBuf, + mutator: F, +) -> Arc +where + F: FnOnce(&mut Config), +{ + let model_provider = ModelProviderInfo { + base_url: Some(format!("{}/v1", server.uri())), + ..built_in_model_providers()["openai"].clone() + }; + let mut config = load_default_config_for_test(codex_home); + config.model_provider = model_provider; + mutator(&mut config); + let conversation_manager = + ConversationManager::with_auth(CodexAuth::from_api_key("Test API Key")); + let auth_manager = + codex_core::AuthManager::from_auth_for_testing(CodexAuth::from_api_key("Test API Key")); + conversation_manager + .resume_conversation_from_rollout(config, resume_path, auth_manager) + .await + .expect("resume conversation") + .conversation +} diff --git a/codex-rs/core/tests/suite/rollout_list_find.rs b/codex-rs/core/tests/suite/rollout_list_find.rs new file mode 100644 index 0000000000..88409a4616 --- /dev/null +++ b/codex-rs/core/tests/suite/rollout_list_find.rs @@ -0,0 +1,50 @@ +#![allow(clippy::unwrap_used, clippy::expect_used)] +use std::io::Write; +use std::path::PathBuf; + +use codex_core::find_conversation_path_by_id_str; +use tempfile::TempDir; +use uuid::Uuid; + +/// Create sessions/YYYY/MM/DD and write a minimal rollout file containing the +/// provided conversation id in the SessionMeta line. Returns the absolute path. +fn write_minimal_rollout_with_id(codex_home: &TempDir, id: Uuid) -> PathBuf { + let sessions = codex_home.path().join("sessions/2024/01/01"); + std::fs::create_dir_all(&sessions).unwrap(); + + let file = sessions.join(format!("rollout-2024-01-01T00-00-00-{id}.jsonl")); + let mut f = std::fs::File::create(&file).unwrap(); + // Minimal first line: session_meta with the id so content search can find it + writeln!( + f, + "{}", + serde_json::json!({ + "timestamp": "2024-01-01T00:00:00.000Z", + "type": "session_meta", + "payload": { + "id": id, + "timestamp": "2024-01-01T00:00:00Z", + "instructions": null, + "cwd": ".", + "originator": "test", + "cli_version": "test" + } + }) + ) + .unwrap(); + + file +} + +#[tokio::test] +async fn find_locates_rollout_file_by_id() { + let home = TempDir::new().unwrap(); + let id = Uuid::new_v4(); + let expected = write_minimal_rollout_with_id(&home, id); + + let found = find_conversation_path_by_id_str(home.path(), &id.to_string()) + .await + .unwrap(); + + assert_eq!(found.unwrap(), expected); +} diff --git a/codex-rs/exec/Cargo.toml b/codex-rs/exec/Cargo.toml index 89dc3951e7..9f6833eb41 100644 --- a/codex-rs/exec/Cargo.toml +++ b/codex-rs/exec/Cargo.toml @@ -46,4 +46,6 @@ core_test_support = { path = "../core/tests/common" } libc = "0.2" predicates = "3" tempfile = "3.13.0" +uuid = "1" +walkdir = "2" wiremock = "0.6" diff --git a/codex-rs/exec/src/cli.rs b/codex-rs/exec/src/cli.rs index 31dd410991..19093ec925 100644 --- a/codex-rs/exec/src/cli.rs +++ b/codex-rs/exec/src/cli.rs @@ -6,6 +6,10 @@ use std::path::PathBuf; #[derive(Parser, Debug)] #[command(version)] pub struct Cli { + /// Action to perform. If omitted, runs a new non-interactive session. + #[command(subcommand)] + pub command: Option, + /// Optional image(s) to attach to the initial prompt. #[arg(long = "image", short = 'i', value_name = "FILE", value_delimiter = ',', num_args = 1..)] pub images: Vec, @@ -69,6 +73,28 @@ pub struct Cli { pub prompt: Option, } +#[derive(Debug, clap::Subcommand)] +pub enum Command { + /// Resume a previous session by id or pick the most recent with --last. + Resume(ResumeArgs), +} + +#[derive(Parser, Debug)] +pub struct ResumeArgs { + /// Conversation/session id (UUID). When provided, resumes this session. + /// If omitted, use --last to pick the most recent recorded session. + #[arg(value_name = "SESSION_ID")] + pub session_id: Option, + + /// Resume the most recent recorded session (newest) without specifying an id. + #[arg(long = "last", default_value_t = false, conflicts_with = "session_id")] + pub last: bool, + + /// Prompt to send after resuming the session. If `-` is used, read from stdin. + #[arg(value_name = "PROMPT")] + pub prompt: Option, +} + #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, ValueEnum)] #[value(rename_all = "kebab-case")] pub enum Color { diff --git a/codex-rs/exec/src/lib.rs b/codex-rs/exec/src/lib.rs index 7853374b55..097231da60 100644 --- a/codex-rs/exec/src/lib.rs +++ b/codex-rs/exec/src/lib.rs @@ -30,11 +30,14 @@ use tracing::error; use tracing::info; use tracing_subscriber::EnvFilter; +use crate::cli::Command as ExecCommand; use crate::event_processor::CodexStatus; use crate::event_processor::EventProcessor; +use codex_core::find_conversation_path_by_id_str; pub async fn run_main(cli: Cli, codex_linux_sandbox_exe: Option) -> anyhow::Result<()> { let Cli { + command, images, model: model_cli_arg, oss, @@ -51,8 +54,15 @@ pub async fn run_main(cli: Cli, codex_linux_sandbox_exe: Option) -> any config_overrides, } = cli; - // Determine the prompt based on CLI arg and/or stdin. - let prompt = match prompt { + // Determine the prompt source (parent or subcommand) and read from stdin if needed. + let prompt_arg = match &command { + // Allow prompt before the subcommand by falling back to the parent-level prompt + // when the Resume subcommand did not provide its own prompt. + Some(ExecCommand::Resume(args)) => args.prompt.clone().or(prompt), + None => prompt, + }; + + let prompt = match prompt_arg { Some(p) if p != "-" => p, // Either `-` was passed or no positional arg. maybe_dash => { @@ -190,11 +200,29 @@ pub async fn run_main(cli: Cli, codex_linux_sandbox_exe: Option) -> any let conversation_manager = ConversationManager::new(AuthManager::shared(config.codex_home.clone())); + + // Handle resume subcommand by resolving a rollout path and using explicit resume API. let NewConversation { conversation_id: _, conversation, session_configured, - } = conversation_manager.new_conversation(config).await?; + } = if let Some(ExecCommand::Resume(args)) = command { + let resume_path = resolve_resume_path(&config, &args).await?; + + if let Some(path) = resume_path { + conversation_manager + .resume_conversation_from_rollout( + config.clone(), + path, + AuthManager::shared(config.codex_home.clone()), + ) + .await? + } else { + conversation_manager.new_conversation(config).await? + } + } else { + conversation_manager.new_conversation(config).await? + }; info!("Codex initialized with event: {session_configured:?}"); let (tx, mut rx) = tokio::sync::mpsc::unbounded_channel::(); @@ -279,3 +307,23 @@ pub async fn run_main(cli: Cli, codex_linux_sandbox_exe: Option) -> any Ok(()) } + +async fn resolve_resume_path( + config: &Config, + args: &crate::cli::ResumeArgs, +) -> anyhow::Result> { + if args.last { + match codex_core::RolloutRecorder::list_conversations(&config.codex_home, 1, None).await { + Ok(page) => Ok(page.items.first().map(|it| it.path.clone())), + Err(e) => { + error!("Error listing conversations: {e}"); + Ok(None) + } + } + } else if let Some(id_str) = args.session_id.as_deref() { + let path = find_conversation_path_by_id_str(&config.codex_home, id_str).await?; + Ok(path) + } else { + Ok(None) + } +} diff --git a/codex-rs/exec/tests/fixtures/cli_responses_fixture.sse b/codex-rs/exec/tests/fixtures/cli_responses_fixture.sse new file mode 100644 index 0000000000..660c56b1d8 --- /dev/null +++ b/codex-rs/exec/tests/fixtures/cli_responses_fixture.sse @@ -0,0 +1,10 @@ +event: response.created +data: {"type":"response.created","response":{"id":"resp1"}} + +event: response.output_item.done +data: {"type":"response.output_item.done","item":{"type":"message","role":"assistant","content":[{"type":"output_text","text":"fixture hello"}]}} + +event: response.completed +data: {"type":"response.completed","response":{"id":"resp1","output":[]}} + + diff --git a/codex-rs/exec/tests/suite/mod.rs b/codex-rs/exec/tests/suite/mod.rs index 75b19ee1b2..5748fba1e8 100644 --- a/codex-rs/exec/tests/suite/mod.rs +++ b/codex-rs/exec/tests/suite/mod.rs @@ -1,4 +1,5 @@ // Aggregates all former standalone integration tests as modules. mod apply_patch; mod common; +mod resume; mod sandbox; diff --git a/codex-rs/exec/tests/suite/resume.rs b/codex-rs/exec/tests/suite/resume.rs new file mode 100644 index 0000000000..5868ed8eb2 --- /dev/null +++ b/codex-rs/exec/tests/suite/resume.rs @@ -0,0 +1,267 @@ +#![allow(clippy::unwrap_used, clippy::expect_used)] +use anyhow::Context; +use assert_cmd::prelude::*; +use serde_json::Value; +use std::process::Command; +use tempfile::TempDir; +use uuid::Uuid; +use walkdir::WalkDir; + +/// Utility: scan the sessions dir for a rollout file that contains `marker` +/// in any response_item.message.content entry. Returns the absolute path. +fn find_session_file_containing_marker( + sessions_dir: &std::path::Path, + marker: &str, +) -> Option { + for entry in WalkDir::new(sessions_dir) { + let entry = match entry { + Ok(e) => e, + Err(_) => continue, + }; + if !entry.file_type().is_file() { + continue; + } + if !entry.file_name().to_string_lossy().ends_with(".jsonl") { + continue; + } + let path = entry.path(); + let Ok(content) = std::fs::read_to_string(path) else { + continue; + }; + // Skip the first meta line and scan remaining JSONL entries. + let mut lines = content.lines(); + if lines.next().is_none() { + continue; + } + for line in lines { + if line.trim().is_empty() { + continue; + } + let Ok(item): Result = serde_json::from_str(line) else { + continue; + }; + if item.get("type").and_then(|t| t.as_str()) == Some("response_item") + && let Some(payload) = item.get("payload") + && payload.get("type").and_then(|t| t.as_str()) == Some("message") + && payload + .get("content") + .map(|c| c.to_string()) + .unwrap_or_default() + .contains(marker) + { + return Some(path.to_path_buf()); + } + } + } + None +} + +/// Extract the conversation UUID from the first SessionMeta line in the rollout file. +fn extract_conversation_id(path: &std::path::Path) -> String { + let content = std::fs::read_to_string(path).unwrap(); + let mut lines = content.lines(); + let meta_line = lines.next().expect("missing meta line"); + let meta: Value = serde_json::from_str(meta_line).expect("invalid meta json"); + meta.get("payload") + .and_then(|p| p.get("id")) + .and_then(|v| v.as_str()) + .unwrap_or_default() + .to_string() +} + +#[test] +fn exec_resume_last_appends_to_existing_file() -> anyhow::Result<()> { + let home = TempDir::new()?; + let fixture = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests/fixtures/cli_responses_fixture.sse"); + + // 1) First run: create a session with a unique marker in the content. + let marker = format!("resume-last-{}", Uuid::new_v4()); + let prompt = format!("echo {marker}"); + + Command::cargo_bin("codex-exec") + .context("should find binary for codex-exec")? + .env("CODEX_HOME", home.path()) + .env("OPENAI_API_KEY", "dummy") + .env("CODEX_RS_SSE_FIXTURE", &fixture) + .env("OPENAI_BASE_URL", "http://unused.local") + .arg("--skip-git-repo-check") + .arg("-C") + .arg(env!("CARGO_MANIFEST_DIR")) + .arg(&prompt) + .assert() + .success(); + + // Find the created session file containing the marker. + let sessions_dir = home.path().join("sessions"); + let path = find_session_file_containing_marker(&sessions_dir, &marker) + .expect("no session file found after first run"); + + // 2) Second run: resume the most recent file with a new marker. + let marker2 = format!("resume-last-2-{}", Uuid::new_v4()); + let prompt2 = format!("echo {marker2}"); + + let mut binding = assert_cmd::Command::cargo_bin("codex-exec") + .context("should find binary for codex-exec")?; + let cmd = binding + .env("CODEX_HOME", home.path()) + .env("OPENAI_API_KEY", "dummy") + .env("CODEX_RS_SSE_FIXTURE", &fixture) + .env("OPENAI_BASE_URL", "http://unused.local") + .arg("--skip-git-repo-check") + .arg("-C") + .arg(env!("CARGO_MANIFEST_DIR")) + .arg(&prompt2) + .arg("resume") + .arg("--last"); + cmd.assert().success(); + + // Ensure the same file was updated and contains both markers. + let resumed_path = find_session_file_containing_marker(&sessions_dir, &marker2) + .expect("no resumed session file containing marker2"); + assert_eq!( + resumed_path, path, + "resume --last should append to existing file" + ); + let content = std::fs::read_to_string(&resumed_path)?; + assert!(content.contains(&marker)); + assert!(content.contains(&marker2)); + Ok(()) +} + +#[test] +fn exec_resume_by_id_appends_to_existing_file() -> anyhow::Result<()> { + let home = TempDir::new()?; + let fixture = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests/fixtures/cli_responses_fixture.sse"); + + // 1) First run: create a session + let marker = format!("resume-by-id-{}", Uuid::new_v4()); + let prompt = format!("echo {marker}"); + + Command::cargo_bin("codex-exec") + .context("should find binary for codex-exec")? + .env("CODEX_HOME", home.path()) + .env("OPENAI_API_KEY", "dummy") + .env("CODEX_RS_SSE_FIXTURE", &fixture) + .env("OPENAI_BASE_URL", "http://unused.local") + .arg("--skip-git-repo-check") + .arg("-C") + .arg(env!("CARGO_MANIFEST_DIR")) + .arg(&prompt) + .assert() + .success(); + + let sessions_dir = home.path().join("sessions"); + let path = find_session_file_containing_marker(&sessions_dir, &marker) + .expect("no session file found after first run"); + let session_id = extract_conversation_id(&path); + assert!( + !session_id.is_empty(), + "missing conversation id in meta line" + ); + + // 2) Resume by id + let marker2 = format!("resume-by-id-2-{}", Uuid::new_v4()); + let prompt2 = format!("echo {marker2}"); + + let mut binding = assert_cmd::Command::cargo_bin("codex-exec") + .context("should find binary for codex-exec")?; + let cmd = binding + .env("CODEX_HOME", home.path()) + .env("OPENAI_API_KEY", "dummy") + .env("CODEX_RS_SSE_FIXTURE", &fixture) + .env("OPENAI_BASE_URL", "http://unused.local") + .arg("--skip-git-repo-check") + .arg("-C") + .arg(env!("CARGO_MANIFEST_DIR")) + .arg(&prompt2) + .arg("resume") + .arg(&session_id); + cmd.assert().success(); + + let resumed_path = find_session_file_containing_marker(&sessions_dir, &marker2) + .expect("no resumed session file containing marker2"); + assert_eq!( + resumed_path, path, + "resume by id should append to existing file" + ); + let content = std::fs::read_to_string(&resumed_path)?; + assert!(content.contains(&marker)); + assert!(content.contains(&marker2)); + Ok(()) +} + +#[test] +fn exec_resume_preserves_cli_configuration_overrides() -> anyhow::Result<()> { + let home = TempDir::new()?; + let fixture = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests/fixtures/cli_responses_fixture.sse"); + + let marker = format!("resume-config-{}", Uuid::new_v4()); + let prompt = format!("echo {marker}"); + + Command::cargo_bin("codex-exec") + .context("should find binary for codex-exec")? + .env("CODEX_HOME", home.path()) + .env("OPENAI_API_KEY", "dummy") + .env("CODEX_RS_SSE_FIXTURE", &fixture) + .env("OPENAI_BASE_URL", "http://unused.local") + .arg("--skip-git-repo-check") + .arg("--sandbox") + .arg("workspace-write") + .arg("--model") + .arg("gpt-5") + .arg("-C") + .arg(env!("CARGO_MANIFEST_DIR")) + .arg(&prompt) + .assert() + .success(); + + let sessions_dir = home.path().join("sessions"); + let path = find_session_file_containing_marker(&sessions_dir, &marker) + .expect("no session file found after first run"); + + let marker2 = format!("resume-config-2-{}", Uuid::new_v4()); + let prompt2 = format!("echo {marker2}"); + + let output = Command::cargo_bin("codex-exec") + .context("should find binary for codex-exec")? + .env("CODEX_HOME", home.path()) + .env("OPENAI_API_KEY", "dummy") + .env("CODEX_RS_SSE_FIXTURE", &fixture) + .env("OPENAI_BASE_URL", "http://unused.local") + .arg("--skip-git-repo-check") + .arg("--sandbox") + .arg("workspace-write") + .arg("--model") + .arg("gpt-5-high") + .arg("-C") + .arg(env!("CARGO_MANIFEST_DIR")) + .arg(&prompt2) + .arg("resume") + .arg("--last") + .output() + .context("resume run should succeed")?; + + assert!(output.status.success(), "resume run failed: {output:?}"); + + let stdout = String::from_utf8(output.stdout)?; + assert!( + stdout.contains("model: gpt-5-high"), + "stdout missing model override: {stdout}" + ); + assert!( + stdout.contains("sandbox: workspace-write"), + "stdout missing sandbox override: {stdout}" + ); + + let resumed_path = find_session_file_containing_marker(&sessions_dir, &marker2) + .expect("no resumed session file containing marker2"); + assert_eq!(resumed_path, path, "resume should append to same file"); + + let content = std::fs::read_to_string(&resumed_path)?; + assert!(content.contains(&marker)); + assert!(content.contains(&marker2)); + Ok(()) +} diff --git a/codex-rs/tui/src/cli.rs b/codex-rs/tui/src/cli.rs index cb5f8ac778..e9e999268d 100644 --- a/codex-rs/tui/src/cli.rs +++ b/codex-rs/tui/src/cli.rs @@ -13,35 +13,18 @@ pub struct Cli { #[arg(long = "image", short = 'i', value_name = "FILE", value_delimiter = ',', num_args = 1..)] pub images: Vec, - /// Open an interactive picker to resume a previous session recorded on disk - /// instead of starting a new one. - /// - /// Notes: - /// - Mutually exclusive with `--continue`. - /// - The picker displays recent sessions and a preview of the first real user - /// message to help you select the right one. - #[arg( - long = "resume", - default_value_t = false, - conflicts_with = "continue", - hide = true - )] - pub resume: bool, + // Internal controls set by the top-level `codex resume` subcommand. + // These are not exposed as user flags on the base `codex` command. + #[clap(skip)] + pub resume_picker: bool, - /// Continue the most recent conversation without showing the picker. - /// - /// Notes: - /// - Mutually exclusive with `--resume`. - /// - If no recorded sessions are found, this behaves like starting fresh. - /// - Equivalent to picking the newest item in the resume picker. - #[arg( - id = "continue", - long = "continue", - default_value_t = false, - conflicts_with = "resume", - hide = true - )] - pub r#continue: bool, + #[clap(skip)] + pub resume_last: bool, + + /// Internal: resume a specific recorded session by id (UUID). Set by the + /// top-level `codex resume ` wrapper; not exposed as a public flag. + #[clap(skip)] + pub resume_session_id: Option, /// Model the agent should use. #[arg(long, short = 'm')] diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index e050e5b5c6..83c37b75fa 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -15,6 +15,7 @@ use codex_core::config::SWIFTFOX_MEDIUM_MODEL; use codex_core::config::find_codex_home; use codex_core::config::load_config_as_toml_with_cli_overrides; use codex_core::config::persist_model_selection; +use codex_core::find_conversation_path_by_id_str; use codex_core::protocol::AskForApproval; use codex_core::protocol::SandboxPolicy; use codex_ollama::DEFAULT_OSS_MODEL; @@ -343,7 +344,16 @@ async fn run_ratatui_app( } } - let resume_selection = if cli.r#continue { + // Determine resume behavior: explicit id, then resume last, then picker. + let resume_selection = if let Some(id_str) = cli.resume_session_id.as_deref() { + match find_conversation_path_by_id_str(&config.codex_home, id_str).await? { + Some(path) => resume_picker::ResumeSelection::Resume(path), + None => { + error!("Error finding conversation path: {id_str}"); + resume_picker::ResumeSelection::StartFresh + } + } + } else if cli.resume_last { match RolloutRecorder::list_conversations(&config.codex_home, 1, None).await { Ok(page) => page .items @@ -352,7 +362,7 @@ async fn run_ratatui_app( .unwrap_or(resume_picker::ResumeSelection::StartFresh), Err(_) => resume_picker::ResumeSelection::StartFresh, } - } else if cli.resume { + } else if cli.resume_picker { match resume_picker::run_resume_picker(&mut tui, &config.codex_home).await? { resume_picker::ResumeSelection::Exit => { restore(); diff --git a/docs/advanced.md b/docs/advanced.md index 71ede3133a..4edca7646f 100644 --- a/docs/advanced.md +++ b/docs/advanced.md @@ -12,6 +12,40 @@ Run Codex head-less in pipelines. Example GitHub Action step: codex exec --full-auto "update CHANGELOG for next release" ``` +### Resuming non-interactive sessions + +You can resume a previous headless run to continue the same conversation context and append to the same rollout file. + +Interactive TUI equivalent: + +```shell +codex resume # picker +codex resume --last # most recent +codex resume +``` + +Compatibility: + +- Latest source builds include `codex exec resume` (examples below). +- Current released CLI may not include this yet. If `codex exec --help` shows no `resume`, use the workaround in the next subsection. + +```shell +# Resume the most recent recorded session and run with a new prompt (source builds) +codex exec "ship a release draft changelog" resume --last + +# Alternatively, pass the prompt via stdin (source builds) +# Note: omit the trailing '-' to avoid it being parsed as a SESSION_ID +echo "ship a release draft changelog" | codex exec resume --last + +# Or resume a specific session by id (UUID) (source builds) +codex exec resume 7f9f9a2e-1b3c-4c7a-9b0e-123456789abc "continue the task" +``` + +Notes: + +- When using `--last`, Codex picks the newest recorded session; if none exist, it behaves like starting fresh. +- Resuming appends new events to the existing session file and maintains the same conversation id. + ## Tracing / verbose logging Because Codex is written in Rust, it honors the `RUST_LOG` environment variable to configure its logging behavior. diff --git a/docs/getting-started.md b/docs/getting-started.md index cc7dd1293c..e97de6a048 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -10,19 +10,24 @@ Key flags: `--model/-m`, `--ask-for-approval/-a`. - ### Running with a prompt as input From 9177bdae5eb82b144f2df8ea7a4815b0a0861ec0 Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Sun, 14 Sep 2025 16:56:22 -0700 Subject: [PATCH 36/77] Only one branch for swiftfox (#3601) Make each model family have a single branch. --- codex-rs/core/src/model_family.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codex-rs/core/src/model_family.rs b/codex-rs/core/src/model_family.rs index 0756b121c4..93ab947eac 100644 --- a/codex-rs/core/src/model_family.rs +++ b/codex-rs/core/src/model_family.rs @@ -113,7 +113,7 @@ pub fn find_family_for_model(slug: &str) -> Option { simple_model_family!(slug, "gpt-4o") } else if slug.starts_with("gpt-3.5") { simple_model_family!(slug, "gpt-3.5") - } else if slug.starts_with("codex-") || slug.starts_with("swiftfox") { + } else if slug.starts_with("codex-") { model_family!( slug, slug, supports_reasoning_summaries: true, From 2aa84b889140903ec809a99362ca49dfcc46cb7d Mon Sep 17 00:00:00 2001 From: dedrisian-oai Date: Sun, 14 Sep 2025 17:34:33 -0700 Subject: [PATCH 37/77] Fix EventMsg Optional (#3604) --- codex-rs/core/src/codex.rs | 5 ++-- codex-rs/core/tests/suite/review.rs | 40 ++++++++++++++++++++++++----- codex-rs/protocol/src/protocol.rs | 8 +++++- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 7177348f57..375183ab82 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -18,6 +18,7 @@ use codex_apply_patch::MaybeApplyPatchVerified; use codex_apply_patch::maybe_parse_apply_patch_verified; use codex_protocol::mcp_protocol::ConversationId; use codex_protocol::protocol::ConversationPathResponseEvent; +use codex_protocol::protocol::ExitedReviewModeEvent; use codex_protocol::protocol::ReviewRequest; use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::TaskStartedEvent; @@ -3249,11 +3250,11 @@ fn convert_call_tool_result_to_function_call_output_payload( async fn exit_review_mode( session: Arc, task_sub_id: String, - res: Option, + review_output: Option, ) { let event = Event { id: task_sub_id, - msg: EventMsg::ExitedReviewMode(res), + msg: EventMsg::ExitedReviewMode(ExitedReviewModeEvent { review_output }), }; session.send_event(event).await; } diff --git a/codex-rs/core/tests/suite/review.rs b/codex-rs/core/tests/suite/review.rs index 2bcb67ff41..f65913a2ca 100644 --- a/codex-rs/core/tests/suite/review.rs +++ b/codex-rs/core/tests/suite/review.rs @@ -5,6 +5,7 @@ use codex_core::ModelProviderInfo; use codex_core::built_in_model_providers; use codex_core::config::Config; use codex_core::protocol::EventMsg; +use codex_core::protocol::ExitedReviewModeEvent; use codex_core::protocol::InputItem; use codex_core::protocol::Op; use codex_core::protocol::ReviewCodeLocation; @@ -89,8 +90,10 @@ async fn review_op_emits_lifecycle_and_review_output() { let _entered = wait_for_event(&codex, |ev| matches!(ev, EventMsg::EnteredReviewMode(_))).await; let closed = wait_for_event(&codex, |ev| matches!(ev, EventMsg::ExitedReviewMode(_))).await; let review = match closed { - EventMsg::ExitedReviewMode(Some(r)) => r, - other => panic!("expected ExitedReviewMode(Some(..)), got {other:?}"), + EventMsg::ExitedReviewMode(ev) => ev + .review_output + .expect("expected ExitedReviewMode with Some(review_output)"), + other => panic!("expected ExitedReviewMode(..), got {other:?}"), }; // Deep compare full structure using PartialEq (floats are f32 on both sides). @@ -153,8 +156,10 @@ async fn review_op_with_plain_text_emits_review_fallback() { let _entered = wait_for_event(&codex, |ev| matches!(ev, EventMsg::EnteredReviewMode(_))).await; let closed = wait_for_event(&codex, |ev| matches!(ev, EventMsg::ExitedReviewMode(_))).await; let review = match closed { - EventMsg::ExitedReviewMode(Some(r)) => r, - other => panic!("expected ExitedReviewMode(Some(..)), got {other:?}"), + EventMsg::ExitedReviewMode(ev) => ev + .review_output + .expect("expected ExitedReviewMode with Some(review_output)"), + other => panic!("expected ExitedReviewMode(..), got {other:?}"), }; // Expect a structured fallback carrying the plain text. @@ -283,7 +288,15 @@ async fn review_uses_custom_review_model_from_config() { // Wait for completion let _entered = wait_for_event(&codex, |ev| matches!(ev, EventMsg::EnteredReviewMode(_))).await; - let _closed = wait_for_event(&codex, |ev| matches!(ev, EventMsg::ExitedReviewMode(None))).await; + let _closed = wait_for_event(&codex, |ev| { + matches!( + ev, + EventMsg::ExitedReviewMode(ExitedReviewModeEvent { + review_output: None + }) + ) + }) + .await; let _complete = wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; // Assert the request body model equals the configured review model @@ -395,7 +408,15 @@ async fn review_input_isolated_from_parent_history() { .unwrap(); let _entered = wait_for_event(&codex, |ev| matches!(ev, EventMsg::EnteredReviewMode(_))).await; - let _closed = wait_for_event(&codex, |ev| matches!(ev, EventMsg::ExitedReviewMode(None))).await; + let _closed = wait_for_event(&codex, |ev| { + matches!( + ev, + EventMsg::ExitedReviewMode(ExitedReviewModeEvent { + review_output: None + }) + ) + }) + .await; let _complete = wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; // Assert the request `input` contains only the single review user message. @@ -449,7 +470,12 @@ async fn review_history_does_not_leak_into_parent_session() { .unwrap(); let _entered = wait_for_event(&codex, |ev| matches!(ev, EventMsg::EnteredReviewMode(_))).await; let _closed = wait_for_event(&codex, |ev| { - matches!(ev, EventMsg::ExitedReviewMode(Some(_))) + matches!( + ev, + EventMsg::ExitedReviewMode(ExitedReviewModeEvent { + review_output: Some(_) + }) + ) }) .await; let _complete = wait_for_event(&codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; diff --git a/codex-rs/protocol/src/protocol.rs b/codex-rs/protocol/src/protocol.rs index 6405bf0c22..c3aebcdd42 100644 --- a/codex-rs/protocol/src/protocol.rs +++ b/codex-rs/protocol/src/protocol.rs @@ -414,6 +414,7 @@ pub struct Event { } /// Response event from the agent +/// NOTE: Make sure none of these values have optional types, as it will mess up the extension code-gen. #[derive(Debug, Clone, Deserialize, Serialize, Display, TS)] #[serde(tag = "type", rename_all = "snake_case")] #[strum(serialize_all = "snake_case")] @@ -514,7 +515,12 @@ pub enum EventMsg { EnteredReviewMode(ReviewRequest), /// Exited review mode with an optional final result to apply. - ExitedReviewMode(Option), + ExitedReviewMode(ExitedReviewModeEvent), +} + +#[derive(Debug, Clone, Deserialize, Serialize, TS)] +pub struct ExitedReviewModeEvent { + pub review_output: Option, } // Individual event payload types matching each `EventMsg` variant. From 76c37c54937287b6f199fa8900c1460812a5d0ea Mon Sep 17 00:00:00 2001 From: jimmyfraiture2 Date: Mon, 15 Sep 2025 01:42:17 +0100 Subject: [PATCH 38/77] feat: UI animation (#3590) Add NUX animation --------- Co-authored-by: Thibault Sottiaux --- codex-rs/tui/frames/blocks/frame_000.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_004.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_008.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_012.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_016.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_020.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_024.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_028.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_032.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_036.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_040.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_044.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_048.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_052.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_056.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_060.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_064.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_068.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_072.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_076.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_080.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_084.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_088.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_092.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_096.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_100.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_104.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_108.txt | 27 +++++ codex-rs/tui/frames/blocks/frame_112.txt | 27 +++++ codex-rs/tui/frames/codex/frame_000.txt | 27 +++++ codex-rs/tui/frames/codex/frame_004.txt | 27 +++++ codex-rs/tui/frames/codex/frame_008.txt | 27 +++++ codex-rs/tui/frames/codex/frame_012.txt | 27 +++++ codex-rs/tui/frames/codex/frame_016.txt | 27 +++++ codex-rs/tui/frames/codex/frame_020.txt | 27 +++++ codex-rs/tui/frames/codex/frame_024.txt | 27 +++++ codex-rs/tui/frames/codex/frame_028.txt | 27 +++++ codex-rs/tui/frames/codex/frame_032.txt | 27 +++++ codex-rs/tui/frames/codex/frame_036.txt | 27 +++++ codex-rs/tui/frames/codex/frame_040.txt | 27 +++++ codex-rs/tui/frames/codex/frame_044.txt | 27 +++++ codex-rs/tui/frames/codex/frame_048.txt | 27 +++++ codex-rs/tui/frames/codex/frame_052.txt | 27 +++++ codex-rs/tui/frames/codex/frame_056.txt | 27 +++++ codex-rs/tui/frames/codex/frame_060.txt | 27 +++++ codex-rs/tui/frames/codex/frame_064.txt | 27 +++++ codex-rs/tui/frames/codex/frame_068.txt | 27 +++++ codex-rs/tui/frames/codex/frame_072.txt | 27 +++++ codex-rs/tui/frames/codex/frame_076.txt | 27 +++++ codex-rs/tui/frames/codex/frame_080.txt | 27 +++++ codex-rs/tui/frames/codex/frame_084.txt | 27 +++++ codex-rs/tui/frames/codex/frame_088.txt | 27 +++++ codex-rs/tui/frames/codex/frame_092.txt | 27 +++++ codex-rs/tui/frames/codex/frame_096.txt | 27 +++++ codex-rs/tui/frames/codex/frame_100.txt | 27 +++++ codex-rs/tui/frames/codex/frame_104.txt | 27 +++++ codex-rs/tui/frames/codex/frame_108.txt | 27 +++++ codex-rs/tui/frames/codex/frame_112.txt | 27 +++++ codex-rs/tui/frames/default/frame_000.txt | 27 +++++ codex-rs/tui/frames/default/frame_004.txt | 27 +++++ codex-rs/tui/frames/default/frame_008.txt | 27 +++++ codex-rs/tui/frames/default/frame_012.txt | 27 +++++ codex-rs/tui/frames/default/frame_016.txt | 27 +++++ codex-rs/tui/frames/default/frame_020.txt | 27 +++++ codex-rs/tui/frames/default/frame_024.txt | 27 +++++ codex-rs/tui/frames/default/frame_028.txt | 27 +++++ codex-rs/tui/frames/default/frame_032.txt | 27 +++++ codex-rs/tui/frames/default/frame_036.txt | 27 +++++ codex-rs/tui/frames/default/frame_040.txt | 27 +++++ codex-rs/tui/frames/default/frame_044.txt | 27 +++++ codex-rs/tui/frames/default/frame_048.txt | 27 +++++ codex-rs/tui/frames/default/frame_052.txt | 27 +++++ codex-rs/tui/frames/default/frame_056.txt | 27 +++++ codex-rs/tui/frames/default/frame_060.txt | 27 +++++ codex-rs/tui/frames/default/frame_064.txt | 27 +++++ codex-rs/tui/frames/default/frame_068.txt | 27 +++++ codex-rs/tui/frames/default/frame_072.txt | 27 +++++ codex-rs/tui/frames/default/frame_076.txt | 27 +++++ codex-rs/tui/frames/default/frame_080.txt | 27 +++++ codex-rs/tui/frames/default/frame_084.txt | 27 +++++ codex-rs/tui/frames/default/frame_088.txt | 27 +++++ codex-rs/tui/frames/default/frame_092.txt | 27 +++++ codex-rs/tui/frames/default/frame_096.txt | 27 +++++ codex-rs/tui/frames/default/frame_100.txt | 27 +++++ codex-rs/tui/frames/default/frame_104.txt | 27 +++++ codex-rs/tui/frames/default/frame_108.txt | 27 +++++ codex-rs/tui/frames/default/frame_112.txt | 27 +++++ codex-rs/tui/frames/dots/frame_000.txt | 27 +++++ codex-rs/tui/frames/dots/frame_004.txt | 27 +++++ codex-rs/tui/frames/dots/frame_008.txt | 27 +++++ codex-rs/tui/frames/dots/frame_012.txt | 27 +++++ codex-rs/tui/frames/dots/frame_016.txt | 27 +++++ codex-rs/tui/frames/dots/frame_020.txt | 27 +++++ codex-rs/tui/frames/dots/frame_024.txt | 27 +++++ codex-rs/tui/frames/dots/frame_028.txt | 27 +++++ codex-rs/tui/frames/dots/frame_032.txt | 27 +++++ codex-rs/tui/frames/dots/frame_036.txt | 27 +++++ codex-rs/tui/frames/dots/frame_040.txt | 27 +++++ codex-rs/tui/frames/dots/frame_044.txt | 27 +++++ codex-rs/tui/frames/dots/frame_048.txt | 27 +++++ codex-rs/tui/frames/dots/frame_052.txt | 27 +++++ codex-rs/tui/frames/dots/frame_056.txt | 27 +++++ codex-rs/tui/frames/dots/frame_060.txt | 27 +++++ codex-rs/tui/frames/dots/frame_064.txt | 27 +++++ codex-rs/tui/frames/dots/frame_068.txt | 27 +++++ codex-rs/tui/frames/dots/frame_072.txt | 27 +++++ codex-rs/tui/frames/dots/frame_076.txt | 27 +++++ codex-rs/tui/frames/dots/frame_080.txt | 27 +++++ codex-rs/tui/frames/dots/frame_084.txt | 27 +++++ codex-rs/tui/frames/dots/frame_088.txt | 27 +++++ codex-rs/tui/frames/dots/frame_092.txt | 27 +++++ codex-rs/tui/frames/dots/frame_096.txt | 27 +++++ codex-rs/tui/frames/dots/frame_100.txt | 27 +++++ codex-rs/tui/frames/dots/frame_104.txt | 27 +++++ codex-rs/tui/frames/dots/frame_108.txt | 27 +++++ codex-rs/tui/frames/dots/frame_112.txt | 27 +++++ codex-rs/tui/frames/hash/frame_000.txt | 27 +++++ codex-rs/tui/frames/hash/frame_004.txt | 27 +++++ codex-rs/tui/frames/hash/frame_008.txt | 27 +++++ codex-rs/tui/frames/hash/frame_012.txt | 27 +++++ codex-rs/tui/frames/hash/frame_016.txt | 27 +++++ codex-rs/tui/frames/hash/frame_020.txt | 27 +++++ codex-rs/tui/frames/hash/frame_024.txt | 27 +++++ codex-rs/tui/frames/hash/frame_028.txt | 27 +++++ codex-rs/tui/frames/hash/frame_032.txt | 27 +++++ codex-rs/tui/frames/hash/frame_036.txt | 27 +++++ codex-rs/tui/frames/hash/frame_040.txt | 27 +++++ codex-rs/tui/frames/hash/frame_044.txt | 27 +++++ codex-rs/tui/frames/hash/frame_048.txt | 27 +++++ codex-rs/tui/frames/hash/frame_052.txt | 27 +++++ codex-rs/tui/frames/hash/frame_056.txt | 27 +++++ codex-rs/tui/frames/hash/frame_060.txt | 27 +++++ codex-rs/tui/frames/hash/frame_064.txt | 27 +++++ codex-rs/tui/frames/hash/frame_068.txt | 27 +++++ codex-rs/tui/frames/hash/frame_072.txt | 27 +++++ codex-rs/tui/frames/hash/frame_076.txt | 27 +++++ codex-rs/tui/frames/hash/frame_080.txt | 27 +++++ codex-rs/tui/frames/hash/frame_084.txt | 27 +++++ codex-rs/tui/frames/hash/frame_088.txt | 27 +++++ codex-rs/tui/frames/hash/frame_092.txt | 27 +++++ codex-rs/tui/frames/hash/frame_096.txt | 27 +++++ codex-rs/tui/frames/hash/frame_100.txt | 27 +++++ codex-rs/tui/frames/hash/frame_104.txt | 27 +++++ codex-rs/tui/frames/hash/frame_108.txt | 27 +++++ codex-rs/tui/frames/hash/frame_112.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_000.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_004.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_008.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_012.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_016.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_020.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_024.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_028.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_032.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_036.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_040.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_044.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_048.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_052.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_056.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_060.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_064.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_068.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_072.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_076.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_080.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_084.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_088.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_092.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_096.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_100.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_104.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_108.txt | 27 +++++ codex-rs/tui/frames/hbars/frame_112.txt | 27 +++++ codex-rs/tui/frames/openai/frame_000.txt | 27 +++++ codex-rs/tui/frames/openai/frame_004.txt | 27 +++++ codex-rs/tui/frames/openai/frame_008.txt | 27 +++++ codex-rs/tui/frames/openai/frame_012.txt | 27 +++++ codex-rs/tui/frames/openai/frame_016.txt | 27 +++++ codex-rs/tui/frames/openai/frame_020.txt | 27 +++++ codex-rs/tui/frames/openai/frame_024.txt | 27 +++++ codex-rs/tui/frames/openai/frame_028.txt | 27 +++++ codex-rs/tui/frames/openai/frame_032.txt | 27 +++++ codex-rs/tui/frames/openai/frame_036.txt | 27 +++++ codex-rs/tui/frames/openai/frame_040.txt | 27 +++++ codex-rs/tui/frames/openai/frame_044.txt | 27 +++++ codex-rs/tui/frames/openai/frame_048.txt | 27 +++++ codex-rs/tui/frames/openai/frame_052.txt | 27 +++++ codex-rs/tui/frames/openai/frame_056.txt | 27 +++++ codex-rs/tui/frames/openai/frame_060.txt | 27 +++++ codex-rs/tui/frames/openai/frame_064.txt | 27 +++++ codex-rs/tui/frames/openai/frame_068.txt | 27 +++++ codex-rs/tui/frames/openai/frame_072.txt | 27 +++++ codex-rs/tui/frames/openai/frame_076.txt | 27 +++++ codex-rs/tui/frames/openai/frame_080.txt | 27 +++++ codex-rs/tui/frames/openai/frame_084.txt | 27 +++++ codex-rs/tui/frames/openai/frame_088.txt | 27 +++++ codex-rs/tui/frames/openai/frame_092.txt | 27 +++++ codex-rs/tui/frames/openai/frame_096.txt | 27 +++++ codex-rs/tui/frames/openai/frame_100.txt | 27 +++++ codex-rs/tui/frames/openai/frame_104.txt | 27 +++++ codex-rs/tui/frames/openai/frame_108.txt | 27 +++++ codex-rs/tui/frames/openai/frame_112.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_000.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_004.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_008.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_012.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_016.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_020.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_024.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_028.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_032.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_036.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_040.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_044.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_048.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_052.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_056.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_060.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_064.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_068.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_072.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_076.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_080.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_084.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_088.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_092.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_096.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_100.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_104.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_108.txt | 27 +++++ codex-rs/tui/frames/shapes/frame_112.txt | 27 +++++ codex-rs/tui/frames/slug/frame_000.txt | 27 +++++ codex-rs/tui/frames/slug/frame_004.txt | 27 +++++ codex-rs/tui/frames/slug/frame_008.txt | 27 +++++ codex-rs/tui/frames/slug/frame_012.txt | 27 +++++ codex-rs/tui/frames/slug/frame_016.txt | 27 +++++ codex-rs/tui/frames/slug/frame_020.txt | 27 +++++ codex-rs/tui/frames/slug/frame_024.txt | 27 +++++ codex-rs/tui/frames/slug/frame_028.txt | 27 +++++ codex-rs/tui/frames/slug/frame_032.txt | 27 +++++ codex-rs/tui/frames/slug/frame_036.txt | 27 +++++ codex-rs/tui/frames/slug/frame_040.txt | 27 +++++ codex-rs/tui/frames/slug/frame_044.txt | 27 +++++ codex-rs/tui/frames/slug/frame_048.txt | 27 +++++ codex-rs/tui/frames/slug/frame_052.txt | 27 +++++ codex-rs/tui/frames/slug/frame_056.txt | 27 +++++ codex-rs/tui/frames/slug/frame_060.txt | 27 +++++ codex-rs/tui/frames/slug/frame_064.txt | 27 +++++ codex-rs/tui/frames/slug/frame_068.txt | 27 +++++ codex-rs/tui/frames/slug/frame_072.txt | 27 +++++ codex-rs/tui/frames/slug/frame_076.txt | 27 +++++ codex-rs/tui/frames/slug/frame_080.txt | 27 +++++ codex-rs/tui/frames/slug/frame_084.txt | 27 +++++ codex-rs/tui/frames/slug/frame_088.txt | 27 +++++ codex-rs/tui/frames/slug/frame_092.txt | 27 +++++ codex-rs/tui/frames/slug/frame_096.txt | 27 +++++ codex-rs/tui/frames/slug/frame_100.txt | 27 +++++ codex-rs/tui/frames/slug/frame_104.txt | 27 +++++ codex-rs/tui/frames/slug/frame_108.txt | 27 +++++ codex-rs/tui/frames/slug/frame_112.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_000.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_004.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_008.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_012.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_016.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_020.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_024.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_028.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_032.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_036.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_040.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_044.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_048.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_052.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_056.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_060.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_064.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_068.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_072.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_076.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_080.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_084.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_088.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_092.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_096.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_100.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_104.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_108.txt | 27 +++++ codex-rs/tui/frames/vbars/frame_112.txt | 27 +++++ codex-rs/tui/src/new_model_popup.rs | 129 ++++++++++++++++++++-- 291 files changed, 7949 insertions(+), 10 deletions(-) create mode 100644 codex-rs/tui/frames/blocks/frame_000.txt create mode 100644 codex-rs/tui/frames/blocks/frame_004.txt create mode 100644 codex-rs/tui/frames/blocks/frame_008.txt create mode 100644 codex-rs/tui/frames/blocks/frame_012.txt create mode 100644 codex-rs/tui/frames/blocks/frame_016.txt create mode 100644 codex-rs/tui/frames/blocks/frame_020.txt create mode 100644 codex-rs/tui/frames/blocks/frame_024.txt create mode 100644 codex-rs/tui/frames/blocks/frame_028.txt create mode 100644 codex-rs/tui/frames/blocks/frame_032.txt create mode 100644 codex-rs/tui/frames/blocks/frame_036.txt create mode 100644 codex-rs/tui/frames/blocks/frame_040.txt create mode 100644 codex-rs/tui/frames/blocks/frame_044.txt create mode 100644 codex-rs/tui/frames/blocks/frame_048.txt create mode 100644 codex-rs/tui/frames/blocks/frame_052.txt create mode 100644 codex-rs/tui/frames/blocks/frame_056.txt create mode 100644 codex-rs/tui/frames/blocks/frame_060.txt create mode 100644 codex-rs/tui/frames/blocks/frame_064.txt create mode 100644 codex-rs/tui/frames/blocks/frame_068.txt create mode 100644 codex-rs/tui/frames/blocks/frame_072.txt create mode 100644 codex-rs/tui/frames/blocks/frame_076.txt create mode 100644 codex-rs/tui/frames/blocks/frame_080.txt create mode 100644 codex-rs/tui/frames/blocks/frame_084.txt create mode 100644 codex-rs/tui/frames/blocks/frame_088.txt create mode 100644 codex-rs/tui/frames/blocks/frame_092.txt create mode 100644 codex-rs/tui/frames/blocks/frame_096.txt create mode 100644 codex-rs/tui/frames/blocks/frame_100.txt create mode 100644 codex-rs/tui/frames/blocks/frame_104.txt create mode 100644 codex-rs/tui/frames/blocks/frame_108.txt create mode 100644 codex-rs/tui/frames/blocks/frame_112.txt create mode 100644 codex-rs/tui/frames/codex/frame_000.txt create mode 100644 codex-rs/tui/frames/codex/frame_004.txt create mode 100644 codex-rs/tui/frames/codex/frame_008.txt create mode 100644 codex-rs/tui/frames/codex/frame_012.txt create mode 100644 codex-rs/tui/frames/codex/frame_016.txt create mode 100644 codex-rs/tui/frames/codex/frame_020.txt create mode 100644 codex-rs/tui/frames/codex/frame_024.txt create mode 100644 codex-rs/tui/frames/codex/frame_028.txt create mode 100644 codex-rs/tui/frames/codex/frame_032.txt create mode 100644 codex-rs/tui/frames/codex/frame_036.txt create mode 100644 codex-rs/tui/frames/codex/frame_040.txt create mode 100644 codex-rs/tui/frames/codex/frame_044.txt create mode 100644 codex-rs/tui/frames/codex/frame_048.txt create mode 100644 codex-rs/tui/frames/codex/frame_052.txt create mode 100644 codex-rs/tui/frames/codex/frame_056.txt create mode 100644 codex-rs/tui/frames/codex/frame_060.txt create mode 100644 codex-rs/tui/frames/codex/frame_064.txt create mode 100644 codex-rs/tui/frames/codex/frame_068.txt create mode 100644 codex-rs/tui/frames/codex/frame_072.txt create mode 100644 codex-rs/tui/frames/codex/frame_076.txt create mode 100644 codex-rs/tui/frames/codex/frame_080.txt create mode 100644 codex-rs/tui/frames/codex/frame_084.txt create mode 100644 codex-rs/tui/frames/codex/frame_088.txt create mode 100644 codex-rs/tui/frames/codex/frame_092.txt create mode 100644 codex-rs/tui/frames/codex/frame_096.txt create mode 100644 codex-rs/tui/frames/codex/frame_100.txt create mode 100644 codex-rs/tui/frames/codex/frame_104.txt create mode 100644 codex-rs/tui/frames/codex/frame_108.txt create mode 100644 codex-rs/tui/frames/codex/frame_112.txt create mode 100644 codex-rs/tui/frames/default/frame_000.txt create mode 100644 codex-rs/tui/frames/default/frame_004.txt create mode 100644 codex-rs/tui/frames/default/frame_008.txt create mode 100644 codex-rs/tui/frames/default/frame_012.txt create mode 100644 codex-rs/tui/frames/default/frame_016.txt create mode 100644 codex-rs/tui/frames/default/frame_020.txt create mode 100644 codex-rs/tui/frames/default/frame_024.txt create mode 100644 codex-rs/tui/frames/default/frame_028.txt create mode 100644 codex-rs/tui/frames/default/frame_032.txt create mode 100644 codex-rs/tui/frames/default/frame_036.txt create mode 100644 codex-rs/tui/frames/default/frame_040.txt create mode 100644 codex-rs/tui/frames/default/frame_044.txt create mode 100644 codex-rs/tui/frames/default/frame_048.txt create mode 100644 codex-rs/tui/frames/default/frame_052.txt create mode 100644 codex-rs/tui/frames/default/frame_056.txt create mode 100644 codex-rs/tui/frames/default/frame_060.txt create mode 100644 codex-rs/tui/frames/default/frame_064.txt create mode 100644 codex-rs/tui/frames/default/frame_068.txt create mode 100644 codex-rs/tui/frames/default/frame_072.txt create mode 100644 codex-rs/tui/frames/default/frame_076.txt create mode 100644 codex-rs/tui/frames/default/frame_080.txt create mode 100644 codex-rs/tui/frames/default/frame_084.txt create mode 100644 codex-rs/tui/frames/default/frame_088.txt create mode 100644 codex-rs/tui/frames/default/frame_092.txt create mode 100644 codex-rs/tui/frames/default/frame_096.txt create mode 100644 codex-rs/tui/frames/default/frame_100.txt create mode 100644 codex-rs/tui/frames/default/frame_104.txt create mode 100644 codex-rs/tui/frames/default/frame_108.txt create mode 100644 codex-rs/tui/frames/default/frame_112.txt create mode 100644 codex-rs/tui/frames/dots/frame_000.txt create mode 100644 codex-rs/tui/frames/dots/frame_004.txt create mode 100644 codex-rs/tui/frames/dots/frame_008.txt create mode 100644 codex-rs/tui/frames/dots/frame_012.txt create mode 100644 codex-rs/tui/frames/dots/frame_016.txt create mode 100644 codex-rs/tui/frames/dots/frame_020.txt create mode 100644 codex-rs/tui/frames/dots/frame_024.txt create mode 100644 codex-rs/tui/frames/dots/frame_028.txt create mode 100644 codex-rs/tui/frames/dots/frame_032.txt create mode 100644 codex-rs/tui/frames/dots/frame_036.txt create mode 100644 codex-rs/tui/frames/dots/frame_040.txt create mode 100644 codex-rs/tui/frames/dots/frame_044.txt create mode 100644 codex-rs/tui/frames/dots/frame_048.txt create mode 100644 codex-rs/tui/frames/dots/frame_052.txt create mode 100644 codex-rs/tui/frames/dots/frame_056.txt create mode 100644 codex-rs/tui/frames/dots/frame_060.txt create mode 100644 codex-rs/tui/frames/dots/frame_064.txt create mode 100644 codex-rs/tui/frames/dots/frame_068.txt create mode 100644 codex-rs/tui/frames/dots/frame_072.txt create mode 100644 codex-rs/tui/frames/dots/frame_076.txt create mode 100644 codex-rs/tui/frames/dots/frame_080.txt create mode 100644 codex-rs/tui/frames/dots/frame_084.txt create mode 100644 codex-rs/tui/frames/dots/frame_088.txt create mode 100644 codex-rs/tui/frames/dots/frame_092.txt create mode 100644 codex-rs/tui/frames/dots/frame_096.txt create mode 100644 codex-rs/tui/frames/dots/frame_100.txt create mode 100644 codex-rs/tui/frames/dots/frame_104.txt create mode 100644 codex-rs/tui/frames/dots/frame_108.txt create mode 100644 codex-rs/tui/frames/dots/frame_112.txt create mode 100644 codex-rs/tui/frames/hash/frame_000.txt create mode 100644 codex-rs/tui/frames/hash/frame_004.txt create mode 100644 codex-rs/tui/frames/hash/frame_008.txt create mode 100644 codex-rs/tui/frames/hash/frame_012.txt create mode 100644 codex-rs/tui/frames/hash/frame_016.txt create mode 100644 codex-rs/tui/frames/hash/frame_020.txt create mode 100644 codex-rs/tui/frames/hash/frame_024.txt create mode 100644 codex-rs/tui/frames/hash/frame_028.txt create mode 100644 codex-rs/tui/frames/hash/frame_032.txt create mode 100644 codex-rs/tui/frames/hash/frame_036.txt create mode 100644 codex-rs/tui/frames/hash/frame_040.txt create mode 100644 codex-rs/tui/frames/hash/frame_044.txt create mode 100644 codex-rs/tui/frames/hash/frame_048.txt create mode 100644 codex-rs/tui/frames/hash/frame_052.txt create mode 100644 codex-rs/tui/frames/hash/frame_056.txt create mode 100644 codex-rs/tui/frames/hash/frame_060.txt create mode 100644 codex-rs/tui/frames/hash/frame_064.txt create mode 100644 codex-rs/tui/frames/hash/frame_068.txt create mode 100644 codex-rs/tui/frames/hash/frame_072.txt create mode 100644 codex-rs/tui/frames/hash/frame_076.txt create mode 100644 codex-rs/tui/frames/hash/frame_080.txt create mode 100644 codex-rs/tui/frames/hash/frame_084.txt create mode 100644 codex-rs/tui/frames/hash/frame_088.txt create mode 100644 codex-rs/tui/frames/hash/frame_092.txt create mode 100644 codex-rs/tui/frames/hash/frame_096.txt create mode 100644 codex-rs/tui/frames/hash/frame_100.txt create mode 100644 codex-rs/tui/frames/hash/frame_104.txt create mode 100644 codex-rs/tui/frames/hash/frame_108.txt create mode 100644 codex-rs/tui/frames/hash/frame_112.txt create mode 100644 codex-rs/tui/frames/hbars/frame_000.txt create mode 100644 codex-rs/tui/frames/hbars/frame_004.txt create mode 100644 codex-rs/tui/frames/hbars/frame_008.txt create mode 100644 codex-rs/tui/frames/hbars/frame_012.txt create mode 100644 codex-rs/tui/frames/hbars/frame_016.txt create mode 100644 codex-rs/tui/frames/hbars/frame_020.txt create mode 100644 codex-rs/tui/frames/hbars/frame_024.txt create mode 100644 codex-rs/tui/frames/hbars/frame_028.txt create mode 100644 codex-rs/tui/frames/hbars/frame_032.txt create mode 100644 codex-rs/tui/frames/hbars/frame_036.txt create mode 100644 codex-rs/tui/frames/hbars/frame_040.txt create mode 100644 codex-rs/tui/frames/hbars/frame_044.txt create mode 100644 codex-rs/tui/frames/hbars/frame_048.txt create mode 100644 codex-rs/tui/frames/hbars/frame_052.txt create mode 100644 codex-rs/tui/frames/hbars/frame_056.txt create mode 100644 codex-rs/tui/frames/hbars/frame_060.txt create mode 100644 codex-rs/tui/frames/hbars/frame_064.txt create mode 100644 codex-rs/tui/frames/hbars/frame_068.txt create mode 100644 codex-rs/tui/frames/hbars/frame_072.txt create mode 100644 codex-rs/tui/frames/hbars/frame_076.txt create mode 100644 codex-rs/tui/frames/hbars/frame_080.txt create mode 100644 codex-rs/tui/frames/hbars/frame_084.txt create mode 100644 codex-rs/tui/frames/hbars/frame_088.txt create mode 100644 codex-rs/tui/frames/hbars/frame_092.txt create mode 100644 codex-rs/tui/frames/hbars/frame_096.txt create mode 100644 codex-rs/tui/frames/hbars/frame_100.txt create mode 100644 codex-rs/tui/frames/hbars/frame_104.txt create mode 100644 codex-rs/tui/frames/hbars/frame_108.txt create mode 100644 codex-rs/tui/frames/hbars/frame_112.txt create mode 100644 codex-rs/tui/frames/openai/frame_000.txt create mode 100644 codex-rs/tui/frames/openai/frame_004.txt create mode 100644 codex-rs/tui/frames/openai/frame_008.txt create mode 100644 codex-rs/tui/frames/openai/frame_012.txt create mode 100644 codex-rs/tui/frames/openai/frame_016.txt create mode 100644 codex-rs/tui/frames/openai/frame_020.txt create mode 100644 codex-rs/tui/frames/openai/frame_024.txt create mode 100644 codex-rs/tui/frames/openai/frame_028.txt create mode 100644 codex-rs/tui/frames/openai/frame_032.txt create mode 100644 codex-rs/tui/frames/openai/frame_036.txt create mode 100644 codex-rs/tui/frames/openai/frame_040.txt create mode 100644 codex-rs/tui/frames/openai/frame_044.txt create mode 100644 codex-rs/tui/frames/openai/frame_048.txt create mode 100644 codex-rs/tui/frames/openai/frame_052.txt create mode 100644 codex-rs/tui/frames/openai/frame_056.txt create mode 100644 codex-rs/tui/frames/openai/frame_060.txt create mode 100644 codex-rs/tui/frames/openai/frame_064.txt create mode 100644 codex-rs/tui/frames/openai/frame_068.txt create mode 100644 codex-rs/tui/frames/openai/frame_072.txt create mode 100644 codex-rs/tui/frames/openai/frame_076.txt create mode 100644 codex-rs/tui/frames/openai/frame_080.txt create mode 100644 codex-rs/tui/frames/openai/frame_084.txt create mode 100644 codex-rs/tui/frames/openai/frame_088.txt create mode 100644 codex-rs/tui/frames/openai/frame_092.txt create mode 100644 codex-rs/tui/frames/openai/frame_096.txt create mode 100644 codex-rs/tui/frames/openai/frame_100.txt create mode 100644 codex-rs/tui/frames/openai/frame_104.txt create mode 100644 codex-rs/tui/frames/openai/frame_108.txt create mode 100644 codex-rs/tui/frames/openai/frame_112.txt create mode 100644 codex-rs/tui/frames/shapes/frame_000.txt create mode 100644 codex-rs/tui/frames/shapes/frame_004.txt create mode 100644 codex-rs/tui/frames/shapes/frame_008.txt create mode 100644 codex-rs/tui/frames/shapes/frame_012.txt create mode 100644 codex-rs/tui/frames/shapes/frame_016.txt create mode 100644 codex-rs/tui/frames/shapes/frame_020.txt create mode 100644 codex-rs/tui/frames/shapes/frame_024.txt create mode 100644 codex-rs/tui/frames/shapes/frame_028.txt create mode 100644 codex-rs/tui/frames/shapes/frame_032.txt create mode 100644 codex-rs/tui/frames/shapes/frame_036.txt create mode 100644 codex-rs/tui/frames/shapes/frame_040.txt create mode 100644 codex-rs/tui/frames/shapes/frame_044.txt create mode 100644 codex-rs/tui/frames/shapes/frame_048.txt create mode 100644 codex-rs/tui/frames/shapes/frame_052.txt create mode 100644 codex-rs/tui/frames/shapes/frame_056.txt create mode 100644 codex-rs/tui/frames/shapes/frame_060.txt create mode 100644 codex-rs/tui/frames/shapes/frame_064.txt create mode 100644 codex-rs/tui/frames/shapes/frame_068.txt create mode 100644 codex-rs/tui/frames/shapes/frame_072.txt create mode 100644 codex-rs/tui/frames/shapes/frame_076.txt create mode 100644 codex-rs/tui/frames/shapes/frame_080.txt create mode 100644 codex-rs/tui/frames/shapes/frame_084.txt create mode 100644 codex-rs/tui/frames/shapes/frame_088.txt create mode 100644 codex-rs/tui/frames/shapes/frame_092.txt create mode 100644 codex-rs/tui/frames/shapes/frame_096.txt create mode 100644 codex-rs/tui/frames/shapes/frame_100.txt create mode 100644 codex-rs/tui/frames/shapes/frame_104.txt create mode 100644 codex-rs/tui/frames/shapes/frame_108.txt create mode 100644 codex-rs/tui/frames/shapes/frame_112.txt create mode 100644 codex-rs/tui/frames/slug/frame_000.txt create mode 100644 codex-rs/tui/frames/slug/frame_004.txt create mode 100644 codex-rs/tui/frames/slug/frame_008.txt create mode 100644 codex-rs/tui/frames/slug/frame_012.txt create mode 100644 codex-rs/tui/frames/slug/frame_016.txt create mode 100644 codex-rs/tui/frames/slug/frame_020.txt create mode 100644 codex-rs/tui/frames/slug/frame_024.txt create mode 100644 codex-rs/tui/frames/slug/frame_028.txt create mode 100644 codex-rs/tui/frames/slug/frame_032.txt create mode 100644 codex-rs/tui/frames/slug/frame_036.txt create mode 100644 codex-rs/tui/frames/slug/frame_040.txt create mode 100644 codex-rs/tui/frames/slug/frame_044.txt create mode 100644 codex-rs/tui/frames/slug/frame_048.txt create mode 100644 codex-rs/tui/frames/slug/frame_052.txt create mode 100644 codex-rs/tui/frames/slug/frame_056.txt create mode 100644 codex-rs/tui/frames/slug/frame_060.txt create mode 100644 codex-rs/tui/frames/slug/frame_064.txt create mode 100644 codex-rs/tui/frames/slug/frame_068.txt create mode 100644 codex-rs/tui/frames/slug/frame_072.txt create mode 100644 codex-rs/tui/frames/slug/frame_076.txt create mode 100644 codex-rs/tui/frames/slug/frame_080.txt create mode 100644 codex-rs/tui/frames/slug/frame_084.txt create mode 100644 codex-rs/tui/frames/slug/frame_088.txt create mode 100644 codex-rs/tui/frames/slug/frame_092.txt create mode 100644 codex-rs/tui/frames/slug/frame_096.txt create mode 100644 codex-rs/tui/frames/slug/frame_100.txt create mode 100644 codex-rs/tui/frames/slug/frame_104.txt create mode 100644 codex-rs/tui/frames/slug/frame_108.txt create mode 100644 codex-rs/tui/frames/slug/frame_112.txt create mode 100644 codex-rs/tui/frames/vbars/frame_000.txt create mode 100644 codex-rs/tui/frames/vbars/frame_004.txt create mode 100644 codex-rs/tui/frames/vbars/frame_008.txt create mode 100644 codex-rs/tui/frames/vbars/frame_012.txt create mode 100644 codex-rs/tui/frames/vbars/frame_016.txt create mode 100644 codex-rs/tui/frames/vbars/frame_020.txt create mode 100644 codex-rs/tui/frames/vbars/frame_024.txt create mode 100644 codex-rs/tui/frames/vbars/frame_028.txt create mode 100644 codex-rs/tui/frames/vbars/frame_032.txt create mode 100644 codex-rs/tui/frames/vbars/frame_036.txt create mode 100644 codex-rs/tui/frames/vbars/frame_040.txt create mode 100644 codex-rs/tui/frames/vbars/frame_044.txt create mode 100644 codex-rs/tui/frames/vbars/frame_048.txt create mode 100644 codex-rs/tui/frames/vbars/frame_052.txt create mode 100644 codex-rs/tui/frames/vbars/frame_056.txt create mode 100644 codex-rs/tui/frames/vbars/frame_060.txt create mode 100644 codex-rs/tui/frames/vbars/frame_064.txt create mode 100644 codex-rs/tui/frames/vbars/frame_068.txt create mode 100644 codex-rs/tui/frames/vbars/frame_072.txt create mode 100644 codex-rs/tui/frames/vbars/frame_076.txt create mode 100644 codex-rs/tui/frames/vbars/frame_080.txt create mode 100644 codex-rs/tui/frames/vbars/frame_084.txt create mode 100644 codex-rs/tui/frames/vbars/frame_088.txt create mode 100644 codex-rs/tui/frames/vbars/frame_092.txt create mode 100644 codex-rs/tui/frames/vbars/frame_096.txt create mode 100644 codex-rs/tui/frames/vbars/frame_100.txt create mode 100644 codex-rs/tui/frames/vbars/frame_104.txt create mode 100644 codex-rs/tui/frames/vbars/frame_108.txt create mode 100644 codex-rs/tui/frames/vbars/frame_112.txt diff --git a/codex-rs/tui/frames/blocks/frame_000.txt b/codex-rs/tui/frames/blocks/frame_000.txt new file mode 100644 index 0000000000..2130f9840c --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_000.txt @@ -0,0 +1,27 @@ + + + ▒▒▒▒▒██████████▒▒ + █▒█░▓█ ██░▒▒░▓▓▓░░ █░███▒ + ▒▓░▒█ █░█▒░██░░█▒█░ █████▒ █▒ + ██░▓██▒██▓██ ▓░░ ██▓▒ ██ + ▒█░▓██▒▓▓ █ █░█▒██ + █░░▓▓█▓░ █▒█░░▒▒▒ + ▓▓░▓ ░█ ░ ▒▒▒█ ▒▓▒░█▒░ + █▓░░█ ░░ █▒▒█░▓░░ ░█▒▒░█▒░ + ██░░▒░█ ░█▓▒▒▒▒▓░ ███░▒▒█ + ░▒ ░░▒░░ █▒░█▒▓░░▒▓ ▓░░░░ ░ + ▓░▓░ ▒░ █▒▓▓ █░▓ ░░░▓░ + ▒▒ ▓░ █▒▓░░ ▓█ ▒░░░░ + ░░░░ ▓ █░▓▓ ▓░░ ▒▒▒█▒██████████ ░▓▓░ ░ + █░▓ ░█ ▒▓░░██ ▓█░ ▓░░▒▒██████ ░▓▒░▒░ + ▒▓░▒▓ ░▒ █░▓░ ▒░░ ░ ▓▓▓▓▓▓ ░ ░░█░░ + ▒▒░░▒▒░█ ████▓ █▓░▓▓ ▓▓ + ▒▒▒░ ▒▒▒ ▓█▓█▓░▓▓ + ▒░░░█ █░▒▒ ▒░▒█░█▒░█ + ████░█ ████ ▓▒██░███▓▓█ + ░█░░█ ░▒███▒░█▒▒███████░█░███▒██░ + █ ███▓█░░█▒░▓ ██▓░░▒██ ▒██ + ███▓░█░░▓▒▒▒▒▒▒██▓██░ + ░░ █ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_004.txt b/codex-rs/tui/frames/blocks/frame_004.txt new file mode 100644 index 0000000000..4d4a138a1e --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_004.txt @@ -0,0 +1,27 @@ + + + ▒▒▒▒▓██████████▒▒ + █▒▓░▓█ ██ ▒█░▓▓▓ █ █░ ██▒ + ▒▓░░█░█░▓▒░██░░█▒░░ ████▓▒ █▒ + █░█▓██▒█░▓█ █ █▒▓▒ ██ + ▒█░▓█ ▒▓▓█ ███░█▒██ + █░░▓▓▒▓░ ▒▓░░▒▒▒ + ▓░░█ ░█ ▒▓ ░▒▒█ █▓█░██░ + █▓░░█▒░░ █▒▒▒▒▓▒▓ ▓▒█░░▒░ + ██░░▓░█ ░░░░▒▒▒▒ ░ ██░░▒█ + ░█ ░░ ░ █▒░██▒▓░ ░░░░ ░ + █░▓░█▒░ █▒▓░█ ▓█▓ ▒░░░█░ + ▒▓ █░█ ▒▓░░ ▓▓█░ ░░ ░ + ░░░░█ █▒ ▓░▓▓▓ ▓▓░░ ▒▒▒█▒██▒███████ █ ▓░ ░ + █░█ ░▒ ▓░░███▓█ █ ░▒██ ███ █ ░▓▒░▒░ + ▒█░▒▒ ░█ █░▓█ ▒░ ▓██▓██▒░░░▓▒▒██ ▓▓▓░░░░ + ▒▒▒░█▒░▒ ████ ░ █▓░▓░ ▓▓ + █▒▒░▒ ▒█▒ ▒█▓█▓█▓▓ + ▒▒░░█▓█▓▒▒ ▒▓▓█░█▒░█ + ███░░▒ ████ ▒▒██░██░░▓█ + █░█░░█ ████░░█▒▒██████░░▓░██ ▒██░ + ░ ███▓▒▓░░▓█░ ███░█▒██ █▒██ + ██░░██▒▓▒▒▒▒▒▒██▓██░ + ░░ █ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_008.txt b/codex-rs/tui/frames/blocks/frame_008.txt new file mode 100644 index 0000000000..777c028bf1 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_008.txt @@ -0,0 +1,27 @@ + + + ▒▒▒▒▒██████████▒▒ + ▒▒▓░██ ░█░▒█░▓▓▓ ▒ █░ ██▒ + ▒▓░░███▒▓▓███░█▒▒░░ ██▒█▓▒ ▒█ + █░░█░ ▒▒█░█ ▓ █ █▒▓▒ ██ + ██░▓▓░█░█ █▒█░████ + ▓░░█ ▒░█ ██▒█ █▒▒░░▒▒▒ + ▓░▓███░ █░ █▒█▓ ▒█░█▒▒ + ▓░▓░ █░ ▒░ ▒ ██ ▒▒░▓▒░ + ░░░▒ ░░░ ░░▓░█▒▒ ▒█░█░░ + ░░░░ ░░█ █▒ ░▒░▒ █ ▒░░ ░ + ░░▒░ ░ █░░▓ ▓░▓ ░░░▒░ + █░▓▓ ▒█ ▒█░░░ ▒░▒ ░ ░░░░░░ + ██░░ ░░ ▓▓▓█░ ░▓ ▓▒█▒█▒██▒███████ ▒█░░ ░ + █░▒░ ▓░ ▒░░▓░▓▒░█ ▓▒░░██████▒ ░▒▒░▒░ + ░▒░▒ ▒▒▒ ▒ █▓▓ ██ ▒▒█░██░░░░▓▒▒▓█ ██░░░▓█ + ▒░░▓ ▒▒▒ ▒███ ▓ ▓▓██▓ + ▓░░▒ █░░▒ ▒▓▓█▓███ + ▓█░░▒ ▒██▒ ▒▓░███▒░█ + ▒ ▒▒█▒ ▒░███▒▓░ ▒▒██░██░░▓█ + ░█░█▓ ██░██░░█▒▒███████░█░██ ▒▒█░ + ░░░██▒▒░░█▒█▓░░█░░░▒██ █▒░█ + ▒█░░░█▒▒▒▒▒▒▒▒██▓██░ + ░░ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_012.txt b/codex-rs/tui/frames/blocks/frame_012.txt new file mode 100644 index 0000000000..98ac6c4266 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_012.txt @@ -0,0 +1,27 @@ + + + ▒▒▒▒███████▒██▒ + ▒█▓░████ ▒▒██▒ ▓░▒ █░███▒ + ▒█░▓░█░█▒▓██░░█▒▒█████▒▒▓█▒█ ██ + █▓█░█▒▒░█░█ ▓ █░██▒█ █▒ + ▒░▓░ ▓▓██ ▓▓ █░█░▒ ▒ + ▓░░▒ ░▓█ ███▒ ░█░ ▒▒▒ + ▓░░▓▒░░░ ▓▒░████▓ █▒█░▒▒██ + ▓░░▓▒░█▓ ▒█▒░▒▒▒▒▒ █▓░█▒▒▒ + ░░█░░░█░ ▒█▒░░▒▒ ▒▒ ▒█░ ▒░ + ░░█ █░ ▒▒█░░░██▒ ░░▓ ▓█ + ▒░░ ░░ █▓▒░░ ▓░ ░░░ ░░ + ░░░ ░░█ █░░█ ▒█▓▒ ░░░░░░ + ██░ ░░█ ▓▒▓░▓ ░█▓ ██▒▒▒██████████ ░░░ ░░ + ░▒ ░▓ ░░▓█░█░█ ░ ░░▓███ ████ ▒░ ▒░█░ ░ + ░░░ █▓░ █░░ █▓░░█ ░▒█▓████▓░░░░▓▒▒█░▒▓░░▓▓ + ░░▒ █▓▒ ████ ▒▓▓▓▓▓░ + ▒░▒ ███ ▓░█▓█▓░ + ▒░░█ ████▒ ▒█░▓▓ ▒▓█ + █░░░▒ █████▒▒ ▒▓█░▒▓░▓▓▓░ + ░ ░░▒ ██░█░░██▒▓███████░░░░█░▒▒█░ + ███▒▓▒ ██▒░░░░░░████░ ▒██ + █ ███▓▒▒▒▒▒▒▒▒█▒▓██░ + ░ █ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_016.txt b/codex-rs/tui/frames/blocks/frame_016.txt new file mode 100644 index 0000000000..ca0e62297b --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_016.txt @@ -0,0 +1,27 @@ + + + ▒▒▒███████████▒ + █▒▓█░██ ▒▒▓░▒██▒ █░ ███▒ + ▓▓▓█ ▒▒▓███░░█▒▒██░░░▓▒▒▒ ██▒█ + ▒▓██░█▓████ ░ ░██░▒█▒░▓█▒▒ + ▓██▓░░███ █░░░▓▒█▓ + ▒░░▓▓░█ ███ █░░█ ███ + ▒░░░▓░▓█ ░░ ▒▒░█ ▒░▓ ▒▒▒ + ░░░▓░ █░▒▓ ██▒▒ █░░ ▓░▒ + ░▓▓░░▓ █░░▒░▒▒█▒▒ █░▓ █░█ + ░▓▓░░ ▒▒░░░▒█▒▒▓ █░░ ░░█ + ░░░ ░ ░ █░░ ▓█▓░█ ░░ ▓▒ + ░░▒ ░ ▓ ▓█▓▓█░█ █ ░ ▓▒ + ░▓ ░░░ ▒▓██▓░░█ ████▒▒█████▒███ █░█░░░ + █░▓░▓▒█ █░ ▓▓▒█▓░ █▓███ ▓ ███░ ▒░░█▓░ + █▒█ ░▒░▒ ██▒▓▒▓█ ░▒██████░░▓░░░░█ ▓▒ ▒▒░ + ▒▒█ ▒▒█▒ ████░ ▒░▒░▓ ██ + █▒█ ▒ ░█ █░█░█▓░█ + ░▓▒ ▒█░█▒ ▒█░░███░█ + █░▓▒ ▒█░░█▒▒▓ ▒▓▓░░█░▒▓▓ + █░░█▒ █░░░█░██▓▓███████░░░██ ▒██ + ░██▒▒▒ ░████░░░░░░███ ▒██▓ + ░█▒░▓█▒▒▒▒▒▒▒▒█▒▓██ + ░ ██ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_020.txt b/codex-rs/tui/frames/blocks/frame_020.txt new file mode 100644 index 0000000000..e3396542a4 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_020.txt @@ -0,0 +1,27 @@ + + + ▒▒▒▒█▒███████▒▒▒ + █▒▓░██ ▒▒▒▓▓█▒▒███████▓▓▒ + █▓█░ █▒▓▒█░▓██▒▒██▓█░██▒ ░█▒▓░ + ██░░▒▓▓████ ▓▒░▒▒ ████▒ + ██ ▓███▓ ░█ █░▒█▒▒▒█ + ▓░ ▒░█▓▒ ██ ▒▓ █▒▓█ + ▓ █░░░ ▓ ▒ ░ ░▒▒ ░█▒▒ + ▓░ █░██░ ░▓▓██▒▒▒ ▒▒ ░▒░█ + ▒██▒░░▓ ░▒░█▒ ░▒ ░█ ▓░█ + ░ ░░░░ █░▓███▒▒▒ ░ ░█░░ + ░░█░░▒ ░▒▒░█ ▓░░█ ░░▒░▓ + ░▓█░░▒▓ █ ▓ ▓▓█▓░ ░▒ ░░ + ▒░█░░░▒ ▓▓▓▒▓░░▓ ▒▓████▒▒▒▒▒▒▒▒█▒ ░▒▒░░ + ██▒▒░▓▒▓ ▒███▓██ ███████ ████░▓ ▒░▓░░ + ░▒▒░▒ ░ ▒ ▓█▓░ ░██████░░▒░░█░▓ ▒▒▒░▒█ + ░▒ ░▒▓▒ ░░ ▒█▓▓▓▓ + ░▒█▒███▒░ █▓░░█▒▓ ░ + ▒░██████▒ ▒██▓░░░▓█ + █░▓▒█▒▓░███▒▓ ▒█▓█▒░░██ + █░█ ██░░░░███████████░░███░▓███ + ███▒▒ ███████░▓▓▒█ ░ ▒███▒░ + ██░░██▒▒▒▒▒▒▒██████ + ░ ██ ░░ + + diff --git a/codex-rs/tui/frames/blocks/frame_024.txt b/codex-rs/tui/frames/blocks/frame_024.txt new file mode 100644 index 0000000000..4e35e58f23 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_024.txt @@ -0,0 +1,27 @@ + + + ▒█▒█▒█████▓▒▒▒ + ▒▓▓░ ░ █ ██ ▒██░████▓█▒ + ▒▓ ▒███ ▓██▒▒██▒▓█▒▓ ░ ████ + ▓█ ███▒██▒█ ▒░█▒█▒ ██▒░▒ + ██ ▒▓█ █▒ ▓██▒ ▒█▒▒▒ + ▓ ▓▓░█ ▓█▒█ ████▓▒█░ + ░ ▓▓█▒ ▒█▒░ █▒█ ░▒▒░ + ░ ░▓▓▒ ░░ ▒██ ░░ ░▒▓░ + █░ █░ ▒ ░▒█▒▒ ▓▒███░█▓ + ░▓░░░▓ ░▓▒ █▒▒ ██░ ░▒ + ░▓░░▒█ ▒░ █▒█ ▓▓░░░▒ + ░▒░█░░ ▒█ ▒█ ▒░░░░░ + ░▓█▓░█ ░▓░█ ▓▓ ▒▓███▒▒▒█▒█▒▒█▒ ▒ ░░░░ + ░█░█▒░ ▒░ ▒░█ ░▓▒▒██████████░▓█ ░░ ░▓░▓ + ░▓██▒▒▒ ▒▒█▓░ ███▒██▒▒▒███░▓ ▒░▓█▒█ █ + ░▒██▒██ ▓░▒█▓ ▓ + █░▒██▒ ▒ ▒█▒░█ █ + ░▒ ▒ ███▒ ▓▓██░▓▒▓ + █░▒ ░▒▒▓██▒▒ ▒██▒█ ▓█▒█░ + █░▒▒ ▒░██░░▒██▓▒▒▒███████▓▓▓████ + █░█▒ ████░███░███░████▓░█░ + ░███▒▓▓▒▒▒▒▒▒███░██ + ░ ██ ░░░ + + diff --git a/codex-rs/tui/frames/blocks/frame_028.txt b/codex-rs/tui/frames/blocks/frame_028.txt new file mode 100644 index 0000000000..3a4eab12fb --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_028.txt @@ -0,0 +1,27 @@ + + + ▒█▒░▓█████▓▒▒▒ + █▒██░ ░██░█▒░▓ + ▒▓█░ ▒███ ░░█▒▒▒█▒█▒ ░▒██▒██ + ▒▓ ▒██ █▓ ░▒█ ██▓▒██ + ███▒▓█ █▒ ▒░█ ▓▒▒▒▒▒ + ░▓▓▓▓ ▒ ██ █░█░▒▒░█▒ + ░ ▓░█▓ ░ ███ █▒██▒░▓▒ + ▓░░▓█ ▒ █▒█▒█▓ ██▓▒█▒▓░ + ░▒▒░▓▓ ▒▒▒▒▒ ██ ░ ░░▒ + ░ ▓█░ █▒███▒█ ░░ ░░ █ + ░▓░░░░█ ░ ░ ▓▒█▓ ▓ ▒ ░░▓ + ░ ░░░▓ ░░████ █ ░ ░░░▓ + ░░ ░░▒ ███ ██▓▒█▒███▒▒▒██▒█▓ █ ▒░░▓ + ░ ░░ ░ ░▓░▓ ▓░ █▓▓▓█▒▒▒▓▓▓█▒░█ ░█░░▓ █ + ░▒▒▓▓ ▒█░ █▓▓▓░▒▒▒▒▒▒▒█ ▓▓▒░▓ ▓ + ░▒▒█▒█ ▒░ ░ █ ▓ + ░▒▒░░█▒ █░▓▓░█ █░ + ░█▒▓██ ▒▓█▒▓░▓ ▓░ + █░▒█▓░░█ ▒ ▒▒██░░█ █▒█ + █░▓ ░█░░█░▒▓█▒▒████░░░█░█▓░░▒▓░ + █░██░░░░██████░▒█ █▒▒▓▓▒▓█ + █░██░░▒░░░░▒██░░ █ + ░ ██ ░ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_032.txt b/codex-rs/tui/frames/blocks/frame_032.txt new file mode 100644 index 0000000000..86a5d93425 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_032.txt @@ -0,0 +1,27 @@ + + + ▒██▒█▒▒███▓▓▒▓ + ▒▓▓█ █░▒▒██▒ + ▒▓█░▒███ █░█▒▒████ ░▒███ █ + ▒░█▓░██▒██░▓ ░▒█ ▒▒▒ █ + ██▒░█ ▓▓ ░█ ░▒█ █▒ + ▓██░█▓▒ ▒ ▓░▒ ▒▒█▒░█ + ▓█▓░█░▓░ ░▒▓▒ ▓▒█▒ ░█░▒ + ▒░▒▓█ ▓ ▓▒▒█▒ █ █ ▒▒▒ + ░█▒░ █ ▒█▒▒▒▒▒ ▒█▒█░▓▒░ + ░ ░░ ░ ░▒▓███▓ ░█▒█░█▒▓ + █▒░░██ ▒▒░▓█▓▓▒▓ ░░░▓ ░░ + ▓█░░▒ ██▓██▓░█ ▓ ░░░░█ + ░░░░ ░ ▒░░▒░░ ▒██▒░▒█▒▒▒▒█ ░█░█░░ + ░█▓░ ▒ █▒▒░▓ ░▒███▓▒▒▓▒▒▒▓ ▓ ▒░░░░░ + █░░█░ ████▓▒░▓░▒░█ ▓░▓░ ▓ + ░▓▒▓▒ ░ ░░ ▓█░▓▓ ▓ + ░▒▒░░▓▒ ▓█▒▓░▓ █░ + ░░██▒▒█ ▒░ █▓ ▓▓█░ + █▓▒▒████░ █░█░▓██░▒▓ + █░░████▒░█▓░▓█████░░█░▓▓░▒ █ + █░░░░█░ ███████ ░▓▒██▒▒▓░ + ░██░▓▒▒▒▒▒▒███▓█ ▓█ + ░ █ ░ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_036.txt b/codex-rs/tui/frames/blocks/frame_036.txt new file mode 100644 index 0000000000..2726923335 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_036.txt @@ -0,0 +1,27 @@ + + + ▒████▓███▓▒▒▓ + ▒▒██ ▒▓▓▓ █ █░██░▒█ + █░█▓▓████ █▒██░█ ▓▒█ ▒▒ + ▒░█░▓█▒▒█ ██ █░▒░█▒ + █▓█░█ ░▒ ▒▒██ ▒▒ + █▓█▓▓ ▒ ▒ █▒░▒▓█▒ + ░█▓▓ ▓▒▒▒█ ▒ ▒▒▒█▒▒ + ░░░░ ▒▒█▓█▒██ ▓▒▒ █▒▒░ + ░░▒░ ███▓▒█▒ ▓ ▒▒ ▒▒▓▒ + ░ ░█ ▓ ░░█▓▓▒▒▓ ▒ ░░██░░ + ░ ▒ ░▒▒ █▓▒▓▓ ░ ░░░ ░░ + ░▒▒▒ █░▓ ▓██ ░ ▒░░░█░ + ░▓▓█ ░ ██▓░ ▓▒██████▒█▒ █░░░░░░░ + ░░▓░▒█ █ ▓ ░█████████▒▒ ▓ ░█░░░░ + ░▒▓░ ░ ▒█████░▒▒▒░█ ░ ░█░░░▒░ + ░█ ░ ░ ░░░░░ ▒▓ ▓█▓ ░ + ▒░░░▓ ▒ █░░░ ▓ + ▒░░▒▒▒█▓ ██ ▓ █░ + █░░█░▒▒█ ▒░███▒▓█ ▓ + ▒░░██▓█░█▒█▓▒███░░░░█▓░▒ █ + ██▒ ████░█░███░▓▒▓██▒██ + ██▓▒▒▒▒▓▒▓████▒▓█░ + ░░ █░ + + diff --git a/codex-rs/tui/frames/blocks/frame_040.txt b/codex-rs/tui/frames/blocks/frame_040.txt new file mode 100644 index 0000000000..4c886c2ca1 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_040.txt @@ -0,0 +1,27 @@ + + + ▒██████▓██▒▒▒ + █▓█ ▒▓▒▒▒███░░▓█░██▒ + █░ ▒████ ░▒██▓▒ ░█▒ ░▒▒ + ▓ ▓░ ░▓█ ██ ▒ █▒ + ░▒█░░ ▓█▓░█ ░░ + ░░█░ ▒▒█▒ █▓▒█ ▒░ + ▓▒▓░ ▒▒░░▒ █▓█▒▒▒█▒ + ░░░░ ░▒▒ ░▒ █ ▒█░░ ▒▒ + ▒ ░░ ▒▒▒ ▒▒█ ▒░▒░░░░░ + ░░░░ ▓░▒█░▒▒▒█ ░▒░▓██ + ▓░░░ ▒░▒▓▒░▓█ ░▓░░░░░░ + ▒▓░░ ▒░▓▓ ▓ ░ ░ ░░░░░░ + ░ ░█ ▒▓░▓ █▒▒████████ █░░░▒█▓░ + █▓▓█ ▓ ██████████░░ ░ ░ ░░░▒ + ░░▓█ ░████▒░▒▒▓░ ▓█░ ░░░░░ + ░▓▓░██ ░ ░░░░░ ░ ▒█░░░░█ + ░░▒▒ █▒ ░░░░▓░░▓░ + ░▒██▒█▒ ▒░░▓▓▓█ ░ + ░░█░▒░█ ██░█▓▓▒ ▒▓ + █▒ █▒▓█░█████▒██ ██▓█░ ██ + █▒ ██░░░░██░█▓▒█▒ ██ + ██▓▒▓█▒▒███▓█▒▓█ + ░ ░░ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_044.txt b/codex-rs/tui/frames/blocks/frame_044.txt new file mode 100644 index 0000000000..3516e0c22e --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_044.txt @@ -0,0 +1,27 @@ + + + ▒██▒██▒███▒▒▒ + █▓█▒████ █░█░▓ ██▒ + ▒░░▓███ ░██▓▒█▒██▓ █ + ██▓█▓ ░█▒▒ ▒▒█ + █▒█▓░ ▒▒░▓█ ░█ + ▓░█ ▒▒█ ▒█▒░▒ ▓█ + ░▓▓ █░▒█ ▓▒▒▒█▒▒ + ░ ░ ▒░▒▓▒▒█ ▒█ ░░ ░ + █▒▒░ █░█▓▒▒░▒ ▓▒░░░ ░ + ░░█ ▒▒▒░█░█ ░▒▓░▓ ▓ + █░ ▒▓░▓█ ░ ░░░█░░░ + ▓░ ░ ▓█▓░▓ ░░░░░░░░ + ░░▓░ ▒░ ▓░ ▒▒████████ ░░░░▓█░░ + █░░ ░ ▓░▓ ████████▒█▓░ ▒░█░░░ + ░▓█▒░█▓ ▓██▒▒░▒█░▓░█░░░░░░ ▓ + ░░█▒█ ░░ ░░░░░ ▒ ░█░░ █░ + ░▓▒▒▓█ ▓▒░ ▓░▒░ + ▒▓░▒▒▒▒ ██▓█ ▓ ▓█ + ▒▓░▒████ ▓█▓█▓▓ ▓▓ + ▒▒█░██▒███▒▒██░▓▓▒▒ ▓ + █▒▒ ██▒▒░██░▒█▒░░ ██ + ░██▒▒▒█▓▓█▓▒░▒██░ + ░ ░ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_048.txt b/codex-rs/tui/frames/blocks/frame_048.txt new file mode 100644 index 0000000000..3b09f67bc2 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_048.txt @@ -0,0 +1,27 @@ + + + █▒▒░███████ + ██░▓█▒ ▒▓░█▓ █▒█ + ▓█░ █ ░██▒▒▒▒▒ █▒ + ▓░▓██ ▒░▒▒ ▓░░ + ░░▒▒ ░▒▒▒ █▒░ + ▒▒ ▒█▒ ▒█░▓▓█▒▒ + ░▓░░░██ ▓ ▒▒ ▒█▒ + ▒ ░ ▓▒ ▒ ░▓ ▒▒ ░ + ▓░░░ █░░░▒█ ░ ░▒▒░░░ + ░░▒ █░▓▓▓ █ ███░█▓▒█ + ░░░ ░▒▒░░░ ░▓░░█▓░░ + ░░░░ ▒ █ █ ░▒░░░░░░ + ░░▓▒ ░▓ ▒▒█████ ░▒░░░░░░ + ░░ ░▓▒█ ██████░▒ ░ ░░░░░░ + ▓░░█░░ ██▒░▒█▓ ░█░░░ ▒░ + ░▓██░ ░ ░░░ ░░░▒░ + ██▓░ ░ ▒ ▓▒░░░░▒▓ + ░░▓█▒▒▒ ░▓█ ▓░░█░ + █░░▒██▒▓ ░░█░█░█ ▓█░ + ███▒█▒███▒█▓▒█ ▓▓ ░░ + ▒▒██▒░▓█░▓███▒ ▒▓ + █▒▒▒▒██▓█▒ ▒▓░ + ░ █░░░░ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_052.txt b/codex-rs/tui/frames/blocks/frame_052.txt new file mode 100644 index 0000000000..abd5f260d2 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_052.txt @@ -0,0 +1,27 @@ + + + ▒▓▒███▓▒██▒ + ▓ ██ ▒█▓▒ ▒░█ + ░▓▓█ █▒██▒█░█ ▒▒ + ▓░▓█▓ ░▓▓ ▒▒ + ░░▒ ▓ ▒░▒▒ ▒█▒ + ░░█▒▒░▒ ░▓░█ ░░ + █ ░░▒███ ▒ █░ ░▓█ + ░░ ░░░▒░ █ ░░ ▒░▒ + ▓▓░ ▓▓▒░▒ ░░░▓ ░ + ░░ ░░░▒▒ ░▓█░░▒░ + ░░▓ █░▓░▒ ░▓░▒▓░ ░▓█ + ░░▓ ░▓▓▒█ ░▓▒░░░▓ ░░ + ░▓ ░░ ▒▒▒████▒▒░░░░░░░ + ░ ▒█ █████▒░░ ░░░░░░░ + ░░▓ ░ ▒▒▓▒░█░░▒ ░░ ░ + ▓░░ ▓▓ ░ ░░░ ░░ ░ + ░░ ░ ▒▒▓ ░░ ▒░ + ░░░▒ ░░█▓░░░██ + ░░█▒ █░▒▒░░░░ ▓ + ▒░█▓▒█▒▒█▓▒░█ ▓▓░ + ▒▒█░ ▓░▓▒░█ ▓▓ + ██▒▒█ ▒▓█▓▒░ + █ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_056.txt b/codex-rs/tui/frames/blocks/frame_056.txt new file mode 100644 index 0000000000..065700f9b5 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_056.txt @@ -0,0 +1,27 @@ + + + █▒████▒██▒ + ▓█▒▒▒▓▓▓█ ░█ + ▓░▓█▒▒ ░░ █░█ + █░█▓░▒░██ ██ ▒ + ░▒░ ▒▒▓▒▒▒ ▓▓ + ░▒█▒██ ░░▒░█ █░ + ░░░█ ░ █░░ ░▓░░▒ + ▒▓█▓ ░░█ ▒░ ░ + ░ ░██ ▒░ ░░░▓ + ▒▓▒█▒▓░ ░░█░░█▓░ + ░▓░▓▒█░ ░░▓██░▓░ + ░▓█▓█ ░ ░░ ░ ░░░ + █▓▒░▒▒▒█ ░░▓░░█░░ + ▒▒░ ██░▒ ░░▓ ░░ ░ + ▒░ ▓ ░░░░░░░▒░ + ░░█░██ ░ ▓░░░░ ▓░ + ░░░ ░░ ▒ ░░░░░ ░ + ▒░ ▒ ▓░░░ █▓▓▒░ + ░█▒ ░ ░ ▒▒█░ ░░ + ▒░▒▒█▓▒▓█░ ░░▒█ + ▒█▓ ▓▓█ ▓ + █▒▒▓▒█ ▒█ + █░█ + + diff --git a/codex-rs/tui/frames/blocks/frame_060.txt b/codex-rs/tui/frames/blocks/frame_060.txt new file mode 100644 index 0000000000..c801e0a65c --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_060.txt @@ -0,0 +1,27 @@ + + + ▒███▓███ + ▒ ▒░▓ █ █▒ + ▓░░░▓░ ▒▒▒ + ▓▓▓░▓░ █░░░ + ░░░▓░██ ░░ + ░░▒░▓▓░▒░ ▒░ + ░░▓█░░▓░ ░░ + ░░ █░░░░▒ █ + ░░▓░░█▓▒░░░░░ + ░░░░░ ░░░ ▒▒░ + ░░▒█ ░██░ ░░ + ░░░▒░ ░ ░▓░░ + ░░▒▒░▒░▓░░░░█ + ░░░░░░░░░ ░▒ + ░░▒░ ░ ░░░ ░▓ + ░░▒░░░░░░░░ ░ + ░▒▓▓▓░ ▓ ░ + ░░▓░░ ▓░░ + ▓░░░▒░█▒▒░▒ + ░▒█░▒ ░█░░ + ▒ ░ ▒▒ █▒▒█ + ██░ ██▓▓░░ + █ ░ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_064.txt b/codex-rs/tui/frames/blocks/frame_064.txt new file mode 100644 index 0000000000..72fc0830c6 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_064.txt @@ -0,0 +1,27 @@ + + + ████████ + ░▒░ ▒░ + ░▒░█ ░▒▓▒ + ░░░▒▒▒ ░▓ + ░▓▓░█ ▒░░ + █ ▓ ▒▒▓▒░ + █▓ ░▓██ ░ + ▒░░░ ░▓▒▒ + ▒░▒▒█ ▓░ + ░░░░▒▒░░▒ + ░░░ ██ ░░░ + ░░░░▓▓▒▓░ + ░░░░░░░░░░ + ░░░░░░▒▒░░ + ░░░░░░░░░░ + ░░▓░░░░░ ░ + ░░░░░░░░░░ + ░░░░░░░░▓░ + ░░█░▒▓█░▒░ + ▒░▓░░▓ ░▒░ + ▒░█░ ░ ░ ░ + █▓ ▓█▓ + █ ██ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_068.txt b/codex-rs/tui/frames/blocks/frame_068.txt new file mode 100644 index 0000000000..b5d4889493 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_068.txt @@ -0,0 +1,27 @@ + + + ███▓███▒█ + ▒▓ ▒▓░▒ + ░█░██▒▒░▒▒ + ░█ █ ░█░▓░ + ░░░ ░▒░░░ ░ + █░▓░▓▒░▒ ░ + ▒░░░░░░░░ ░ + ▓░░░▓░▒░░░ ░ + ░░░░░░▒░░█ ░ + ░▒░░░░ ▓░▒ ░ + ░░ █░▒░▓░█▓░ + ░█ ▓░ ░░▓░ + ▒░ ░░░ ░░░█░ + ▒ ░░░█░░░ ░ + ▒░░░░█░█░░░ + ▒▒░░░ ▓▒░░░ + ░▓░░░▒▓░░▓░ + ░░▒▓█░░▒▓▓░ + ░█░▓██░█░░░ + █▒ ░ ░░▒ + ░░█ ░░▓░▓░ + ░▓▒ ░█▒▒░ + ░ █ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_072.txt b/codex-rs/tui/frames/blocks/frame_072.txt new file mode 100644 index 0000000000..6b9cfcdc96 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_072.txt @@ -0,0 +1,27 @@ + + + ██░▓█▓█░█ + ▓▒▒░▓░▒▓▒▓█ + ░░ ░ ▓░▒█▒▒▒ + █▒░ █░░░░██ ▓ + ░░▓░▓▒░ ░ █▓░██ + ░ ░█░░░░░░░ ▒░ + ▒░░ ▒ ░█░ ▓▓░▓ + ░░░░░▒░░░▒ ░ ░░ + ░░░░░░░░ ░░░ █▓░ + ░░░░▒▓░░▓ ▒█░░░░ + ░░ ▒░▓░▓▓█░▓▓░░ + ░░▒░▓▓▒ ▒▒▒▒ ▒▒░ + ░░░░░▒ ░▓▓▓█▒▒░░ + ░░░░░ ░█░░░░░█░░ + ░░ ▒ ░░ ░ ▒▒░█░░ + ░ ▒ ░ ░░░▒▒▓▒▒░ + ░█ ░█░▒ ░░░▓▒ + ░░░ ▒█▒▒██░▓░░ + █░▓▒▓█ ▓░░▓░░█░ + ░░█ █▓▒░█░ + █▒ ▓ ▒█░█▓▓▓ + █▓░▓ ▒░▒▒▓ + ░ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_076.txt b/codex-rs/tui/frames/blocks/frame_076.txt new file mode 100644 index 0000000000..3a4ceb7970 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_076.txt @@ -0,0 +1,27 @@ + + + ▒███▓███░▒▒ + █▒▓░░▒▒▒█▒▓█▒ + ░░▓░█▒▓░▒░ ██▒▒ + ░▓░▓▓▓▒░█▓ ▒███░█ + ██▓░░█▓▓░░ ▓█▒▓ + ░▒▒▓▓ ░█▓█▒ ▒░█ + ▒░▓▒▒█ ░░▒█ ▒░░ + ░░▒░▓░░ ░░░█▓ ▓░ + ░░▒█░░░▒▒▒░░░ █▓░░ + ▒░░░░░ ░░▒█ ░░▒░ + ░░░░░▓ ▓░▒░█░░ ░▓▒░ + ░░░░░▓ ▒▓▒ ░▒░ ░▒░ + ░░░░░ ▓░░▒▒██▒░░░ + ░░░░░ ▓░▒▒█░░▒▓░ ░░ + ░░░░░ ▒▒░░▒▒█ ▓░█▓░░ + ░░░░ ▒▒░░█▒░▒█░▒░▓░ + ░░░░ ▒░▓ ░ ░▒█ + █░░░░░ ░ ▓▓▒█░█ + ░▒█▒█░░█▓█ █░ ░█▒ + █▒▓ ░░▒▒░▓█▓░▒██ + █░█▓ ░▒ ███▓▓▒▓ + ▒██ █░█▒▒▓ + ░░ ░█ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_080.txt b/codex-rs/tui/frames/blocks/frame_080.txt new file mode 100644 index 0000000000..3c56ed0c5d --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_080.txt @@ -0,0 +1,27 @@ + + + █▒█░▒█▒█░▒▒ + ▓██ █ ░░█░█▓░██ + ░░█▓█▓█░ ██ ████▒ + ▓ ░░ ▓▓░█▓▓░ ░ ██▒▒ + ░ ▓░░██░▒█ ▓▒░█ + ▓▓░█▓▓░▒█ ▒ ▒▓ + ░░▓▒▒░█░█ ▒█▒ ▒▓░█ + ▓░░ ░░███░ ▒▓░▒ █░▓ + ░▒░ ░▒░░░ ▓▒▒█▓ ░░ + ▒░░░ ░░░░ ▒░░▒ ░▓░ + ░░░░░▒▒░░ ▓▓ ▓ ▓█▓░ + ░░░░█░▒░░ ░▒░▒ ░░░ + ░▓░░░ ░░░ ▓▒ ░▒ █ ▓▒░░░ + ░░░░░ ▓░ ░▓░█░░ █ ░░░▒░ + ░░░░▓ █░ █▒ ▓ ░░▓ ▓ ░░█ + ░░░░░ █░ ▓█▓ ▒░░░▒░ + ░░░░░█░░ ▓░░░░ + ▒▒░░▒▓ ░█▒ ▓▒▒ + █░█ ░░▒▒▒▒▒ ░░█░ + ▒▒▒ ▒▒▒▒▒████░▒░██▓ + ░▒ █▓ █▒█▓█▒█ + █▒▒ █▒██▒▒▓█░ + ░ ░░░░ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_084.txt b/codex-rs/tui/frames/blocks/frame_084.txt new file mode 100644 index 0000000000..7925fdd8fa --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_084.txt @@ -0,0 +1,27 @@ + + + ▒█▓█▒█▓█████ + ▒░█ ▓ ░░█ ▒▓▓▒█▒▒ + ▒░█░░▓ ▓▓▒███ ██ ▒░▒ + █▓██ ▒█████▓ ░░ ▒ ▒░ + █▓██ ░▓█░░█ ░░ + ░▓░█▓██▓▒█ ▒ █▒█ + ░░░▓▒░█░░ █░▒ ▓░▒ + ░░ ▓░░░░█ ░█▒▒▒ █▓░█ + ░█░▓ ░░█ ▒▓▒░▒ █░▒ + ░░░░░ ▒░░ ▒▒▓█ ░░░ + ░▓░░ ▒░█░ █ ▒░█▒ ░░▒ + ░ ▒▓█▒▒░░ ░▒██░░ ░░▓ + ░ ░█░▓░░ █▓▒█▒█▒▒██▒▒ ▒▒░▓ + ░░ ▒░ ░░░░ ▓▓▓▒▓ █░█ ░ ░░░░ + ░█ ██░░▒░ ▒▓ ░ ▒░█░ ██▓ ░ + ░ █░█ ░▓ ▒░░░ + ▒▒ █▒░░░█░ █░█░█░ + ▒░▒ ▒█▒ ▒ ░▓▒▒▒░ + ░░ ▒█░▒ ░▒ ▓ ░█▓ + ▒▒ ░ ▓░▒▒█▒▒▒██▒▓▓░ ▓ + █░▒ ░▒░▒░ █████ █ + ██▒ █▒█▒▒▒▒▒▓█ + ░ ░░░░ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_088.txt b/codex-rs/tui/frames/blocks/frame_088.txt new file mode 100644 index 0000000000..6e8ec14d0d --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_088.txt @@ -0,0 +1,27 @@ + + + ▓█▓░▒▓█▓▒███▒ + █▓▒ █▓▓░▓█░▒▓▒▓ ██ + ▒▓░▓ ████▒███░░█░ ░▒██ + ▓░ ▓▓▓▓▓▓█░ █░█░█▒░▒ + ▓▒█░▓█▓██ ▒▓░▒░▒ + ▓░▓▓█▓▓▓▒ ▒ ██ ░░ + ▒░▒▒ ░ █▓ ░█▓ ▒ ▒░██ + ░░░▓▓██░ ░███ ▒ █░░ + ░▒▒ ▒▓▒█░▒░ ▒░▓ + ░░░░░▓▒░ ▓█▓▒█ █▓░░░ + ░░░░░░░▓ ▓ ▒▓░▒░ █▓░░▓ + ░▒ ░░░░░ ▓█░▓▒░█ ▓░░▒ + ░░ ░▓░░░ ░░▒█▓░█ ███▒▒ ▓░░ + ▓ █▓░ ▓▓▓▓█▓▓ ▒█ ░▓ ░░░░░ + ░ ▓ ░░▒ ▒░░█ ▒███▓ ░██ + █▓▓ ░ ░ ▒█░ ░░▓▓ + ░█ ▒░▒▒█▒█ ▒█▓▓░▒░ + █▓▒███░█▒█ ▓█▓▓▒▒▓ + ░▓▒▒█▒░██▒ ▒▓░█░█░▓ + ░▓ ▒▒▒▒ ███▒▒▓█▒░░░█▒█ + ░▒░ ▒ ▒░ █▒████ ▒▓░ + ██ ░████▓▒▒▒▒██░ + ██░░ █ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_092.txt b/codex-rs/tui/frames/blocks/frame_092.txt new file mode 100644 index 0000000000..1e61c995a8 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_092.txt @@ -0,0 +1,27 @@ + + + ▒██▓█▒████▓░█▒ + ▒█░ █ ░█ █ ▒▓▓░▓ █▒█ + ▒▓ ░▓████ ▒███░░ ███▓▒▒█ + ▓██▓▓█▒ ███ ▒▓▒██░█▒ + ░░▓ █ ░▓ ░▓ █▒▒ + ░░▒▒▒██ █▒▓ ██░░ + ▓█ █░▓░█ ▓░█▒ ▒▓▒░ + ▒░▓█░░▓░ ░▓██▒ ░▓▒ + ░░░░ ░▒█ ░███▒░▒ ░░░ + ░░░ █░░ ░█▓█▒ ▓░░ + ▒░░░░▒░ ▓▓▒░ ░░▓ + ▒░░▒░░░ ▓▓▓▓█▓ ░█ + ░░░▓░░░ ▓▒▓▓▓▓▓▒ ▒▒████░▓ ▓ ░█ + ░░░░█▒▓ ▓▓▓▓▓░█ █▒█ █░ ░ █░░▒ + █░░░▒░░█▒ ██░ ▒ █░█▓█▓░█ ░▒█░░ + █▒░░░▓▓ ░ █▒█░ ░ █ ░░ + ██▒▒██▒ ░ ██ ░▒▒▓ + █░▒▒▒█▒▒ ░ ░▒▓█░▓ + █░▒▒▒▒░▒▒██ ▒▓██▒▓▓█▓ + ▒▒ █░░█░██▒▒▒▒████░█████ + ▒▒▒▒░▒█▓ ░████████░▒█ + ██▒░███░█▒▒▒▒▒██ + ░█ ░░ █ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_096.txt b/codex-rs/tui/frames/blocks/frame_096.txt new file mode 100644 index 0000000000..8c5bd29323 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_096.txt @@ -0,0 +1,27 @@ + + + ▒▒█░██████░▒▒ + ▒█ ▒█░░█ ░ ▒▓█▓ ░ ███▒ + ▒▓▒▓▓███ ░▒▓███░░ ██▓▒██▒▒ + ▓ ██░░ ▒████▓█▒ + ░ ▓░▓▓ █ ▓██▒ + ░▓▓▓░▓█ ██▒ █▒▒ + █▓▓▓░█▓ ▓▓ ▒▒ ██▒░ + ▓▓█▓░▒█ ░░▓ ░ ░ ░▓█ + █▒ ██░ ░█░▓░ ▒ ░░░ + ▒░░░▒░▒ ▒▒▒▒░▒█ ░░▓ + ░ ░ ▓░░ █ ▒█░░░▓ ▓░░░░ + ░░░ ░░░ ░▓▓░▓ ▓▒█ ░▓░░░░ + █░░░░░░ ░▓██ ▓█ ▒████▓▓▒ ▒ ░█▓░ + █░░░░██ ░███░▓█▓ ░▒█ ░█ ░ ▒░▓ + ░ ░░░░░ █▓▓ █░ ▒░███▓█ ░ ▓▓░█ + ▒░▒ ███ ░▒█ ▓██░░░░ + █▒▒░ ▓▓▒ █▓██░█▒▓ + ▒░▒█░▒░▒█▓ ▒▓ ▓██░▓ + █▒▒▒█░▒▓ ██▓ ▒█ ░██▓▓ + ▒▒ ▒█░▒▒ ██▓▒▒▒▒███▓▒█░▓ ░░ + ▒▒ ▒██░▓█░█████████ ▒█ + ██▒▒▓▒░█▒▒▒▒▒▒▓██░ + ░ ░░░ █ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_100.txt b/codex-rs/tui/frames/blocks/frame_100.txt new file mode 100644 index 0000000000..43235d273d --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_100.txt @@ -0,0 +1,27 @@ + + + ▓▒▒█▓███████▒▒ + ██░█▒▓██░▓█ ░█▓░░ ███▒ + ▒█▒▒▓██▓▓▓▒████▒░░███▓▒░ ██ + ▓ ▓▓▓▓▓ ░██▒▓▓██ + ▒░█▒████▒ ▒ ██▓█ + ▒░░░▓▓█ █▓▒ ▓▒█░ + ░▓▒▓▓▒▓ ▓░ ░▒ ▓▒▒█░ + ▓▓▓░░▓░ █░▒▒░▒░ ░▒█░▒ + ░ ▓██░ █▒█░█▓ ▒ ░░░ + ░░░░█░░ █░▒ █▒▓█ ░█░█ + ░ ░░▒█ █░ ▒▓▒ ▒█ ░░▒░ + ░░ ▒▒▒░ ▓▒▒█▓ ▒░ ░░ ░ + ░ ░ ░░▒ ░▒▒█▓░▒▓ ▒▒▒▒▒██▓█▓▒▒ ▒░▓░░ + █▒ ░░░ ░░███░█▓ ░░▓█ █░▒░░░░ ░░█░ + ░▓█░▒▓▒▒ ░█▓░ ▒█ ░█░█▒▓██▒ ▓░▒▒▓ + █▒░░░█▒ ░ ░▒██ ██ ▒▓▓█░ + ▒░░░░▒░ ░▒ ▓ ██░░▓ + ▒▓█▒░░▒▒██ ▓░▒█▒▒ ▓▓▓ + █ █ ░░▓ ░▒ ▒▓█ ▒██░█ + █▒ ██░█▒ ░░▓█▒▒█████░▒███░▓▓ + ██▒██░▓▒ █░████████ ███░ + ░█▓▒█ ██▒▓▒▒▒▒▒████ + ░ ░ ██ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_104.txt b/codex-rs/tui/frames/blocks/frame_104.txt new file mode 100644 index 0000000000..3411b68abb --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_104.txt @@ -0,0 +1,27 @@ + + + ▒▓▓▓█▒███████▒▒ + ▒█ █░▓██░ ████ + ██▒▓███ ▒█▒███▒░░███▓█░░██▒ + ██▓▓▓▒▓ ▒██ ▓▒█░█▒ ▒▒ + ▓ ▓███ █▓ █░▓▓▒▒█▒ + █ ▓██▓ ▓ ▓▓▒▒ ▒ ░█▓▒ + ░█▓░░▓█░ ▓▓ ██▒ █▒ ░▓▓▒ + ░▒▒▒▓█▓▓░ ▒▒█░▒▒▒░ ░ ▒▓▒█ + ░▓░▒░▒▒ █░▒ █░ ░ ▒ ░░▒█ + ░█░░░░█░ █ ░░█▓░▒░ ░▓ █ + ░█ ░░ ░ ░▒▓ ░█ ▓░ ░░ ░ + ░░░▓░░ ░ ▒██▓▓░ ▓ ░▓░░█░ + ▒█ ░░░█░ ██▓▓░█▓░░ ▒██▒███▓▓█ ▒░░░█░ + ▒░ █▓ █ ▓░█░▓ ▒░ █▓▒█ █░▒ ░ ▓█░▒░░ + ▒ ░░░░█░ ██▓░░▒ ░██░░▓▓███ ░░░░░ + █░▒▒▒▒░ ░ █▓ ▒▒░▒░ + ▒▒▒▓▒░█▒░▒ ▒▓░▓█▓██ + █▓ ░░▒█ ░█ ▒▓█▒█▓░░█ + ▒ ██░▓▒ ░█▒ ▒█ ▒▓▒██▓░ + █▓ ███▓▒ ░█████▒█████░▒▓██░███ + █▒▒█▒█▒▒ █░█████ ██░█░▓ + ░ █░███▒▒▒▒▒▒█▒██ + ░ ░ ██ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_108.txt b/codex-rs/tui/frames/blocks/frame_108.txt new file mode 100644 index 0000000000..9dc5397ab5 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_108.txt @@ -0,0 +1,27 @@ + + + ▒▓▒▓▓█████████▒▒ + █▓░████ ██▒ + ▒▓██░█▓▓▓▓▒███░░░░░████▒▒▓███ + ▒▓█▓▓ ▒░█▓█ ▒█ ██░░██ + ▓░▓██░░█░ █▓▒██▓░▒ + ░░▓░███░░ ██░▒ █ ░▒▒▒█ + ░▒▓░██▒░ ▒▓▓▓░█ ░▒▒▒░▒██ + ▓█░▒▒▓ ░ █░▓▒█▒▒ ▒▒ ▒▒░▒ + ░░░░░▓░ █░▓▒░░█ ██▒█▒░ + ░░▒░░▓▓ ▓█░▒█▒▒█ ░░▓ ░░░ + ██░░░▓░ ░ ░░█▓░░ ▓ ░▓▒█ + ░░░░▒░ ▓▒█████░ ▓▓░▒ ░ + ▒ ▓░░█ ░ ▒█ ▓▓▓▓▓▓ ██▒▒██████▓███ ░▓░░▒░ + █▒ ░░░▒░ █▒█▓▓ ▓ █░░▒█ ██▒ ▒██ █░░░░ + ░█▒▒░▓ ░░ █░▓█▓ ▒▒██░░▒▒██ ░░ ▓ + ░█░█▓██▒▓ █▒▓▓░▓░█ + █▒█░▓░▒█▒▒ ░▓█▒▓▓░█░ + ██ ░░░█ ░█ ▒█▒▓▓▓▒▓░ + ▒▒▒█░▒█ ░█▒ ▓█▒░█░█▒█ + █▒█░██▒ ▒█████▒▒█▒███░▒▓█░█░▒▓░ + ██ █░░▒▒ █░ ████ ██░▒▒██ + █ ▓██░░█▓▒▒▒▒▒▒▓███ + ░ ██ ░ + + diff --git a/codex-rs/tui/frames/blocks/frame_112.txt b/codex-rs/tui/frames/blocks/frame_112.txt new file mode 100644 index 0000000000..5fc8ad686e --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_112.txt @@ -0,0 +1,27 @@ + + + ▒▒▒▓▓█████████▒▒ + ▒▓██▓░█ ▓▒█ ██▒ + ███░█▓█ █▒██▓██▒░░░█████▒ ██▒ + █ ▓█ █ ▓▓██░▒ █ ██▓█ ▒▒ + ██░░██ █░ ██ ████▒ + ▓▓▓░░█ ▓ ▓███▒ ▒▓ ▒▒ ░ + ▓▒▓▓██▒░░ ▒▒░▒██░ █▒ ▒░ ░ + █▓░▒▒██░ ░▒▒▓██▓▒ █▒ ▒░ ░ + ░░░░░█▓░ █▒▒█▒▒▒ ▒▓ ░░██ + ▒░░█░░▓░ ▒█░▒ ▒ █ ░ ░░▒░ + ░▒ ░ ▒ █▒▓▒ ▓ ░█▒░▓░ + ░░░▒░ ▒ ▒█▒█▓ ▓█ █▓░░░░ + █░ ▒░▒ ░ ▓░█░▒ ▒░░ █▒▒▒█▒▒██▓███▒ ▒ ░░▒░ + █ ░░░ ░ ▒▓▓▓█░ ▓█ ▒░░▓██ ███ ▒░█░█░▒░▒█░ + ▒█ ▒█▓ ░ ░░ ▓▓ █▓▒█░██▒▒████▓░░▓░▓░ + ▒█░▓░ █▒ ▓▒▒▒█▒▓ + ▒█░░▒▒▒█▒ ▒▓░▓█▓ ▓ + ▒▓░░░▒█▒▒▒ ▒████▓░██ + ██ ░░▓█ ▒██▒▒ ▒██ ░█▓░▒▓░ + ██▒█░▒█▓█░█████▒▒█▒███░▒██░█ ▒█ + █▒░░▒▒ ▒ █░ ▓███ ██ █▒██░ + ░░▓███░███▒▒▒▒▒▒▓████░ + ░ █ ██ ░ + + diff --git a/codex-rs/tui/frames/codex/frame_000.txt b/codex-rs/tui/frames/codex/frame_000.txt new file mode 100644 index 0000000000..0e0f20c87b --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_000.txt @@ -0,0 +1,27 @@ + + + eeeedcccccccccoee + oecxocccceeeedooeecceccce + eoxeccceoexccxxcdcxcccccoe cce + ocxoocecoocc oxxcccde co + ecxooceoo cccxoeco + oxxoocox oeoxxeee + ooxoc xc xceeec edexoex + ooxxccxe ceecxoxx eceexoex + ccxxexc xcdeeeeox cocxeeo + xecxeexx cexceoxxeo oxexx x + oxdx ex ceod cxd cxxxdx + c ee ox ceoxxc dc exxxx + xexx o oxooc oxe eddcdccccccccco xdox x + cxd xo eoxxcc oce oxxdeccccccccc xdexex + eoxeo xe cxoe exe cxcoooooo x xxcxe + eexxeexo ccccd ooeoocoo + eeex ede dcdcoeoo + exxxo cxee execxcexc + coccxo cocc deccxcccodc + cxcxxc eeoccexceeoooccccxcxccceoce + cccccdoxxcdxocccdxxdccc eccc + cccdxcxxdeeeeeeocdcce + eeccccccce + + diff --git a/codex-rs/tui/frames/codex/frame_004.txt b/codex-rs/tui/frames/codex/frame_004.txt new file mode 100644 index 0000000000..5b0eefe662 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_004.txt @@ -0,0 +1,27 @@ + + + eeeedcccccccccoee + oeoxoccccceoeooo ccceccce + eoxxcxcedexccxxcdxxcccccde cce + oxcoocecxocc cccede co + ecxoocedoc ccccxoeco + oxxooeox eoxxeee + oxxcc xc edceeec cdcxocx + ooxxcexe ceeeeoeo oecxxex + ccxxoxc exxxeeee ecocxxeo + xccxe x oexcceoxc xexx x + cxoxcex ceoxc oco dxxxcx + c eo cxo eoxxc odce xx x + xexxccce dxooo doee eddcdccdcccccco o ox x + cxo xe oxxcccoc c xecccccccccccc xdexex + ecxeecxo cxoc exc oocdccexxxdddcc oooxexe + eeexoexe cccc e ooeoxcoo + oeexecece ecdcocoo + eexxoocoee eodcxcexc + cocxxe cocc eeccxccxedc + cxcxxc ccoccxxceeooocccxxdxccceoce + eccccdeoxxdcxccccxcdcccceccc + cccxxccddeeeeeeocdcce + eeccccccce + + diff --git a/codex-rs/tui/frames/codex/frame_008.txt b/codex-rs/tui/frames/codex/frame_008.txt new file mode 100644 index 0000000000..1b2911ff74 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_008.txt @@ -0,0 +1,27 @@ + + + eeeedcccccccccoee + eeoxcccxceeoeooo eccxccce + eoxxccceodcccxcddxxcccecde ceo + oxxcxceecxcco cccede co + ocxooeoxc ccecxocco + oxxocexc ooeo ceexxeee + oxooooxc cecoecd ecxoee + oxox ox exccecoc eexdex + xxxe xxe cxxdxoee cecxoxx + xxex xxc ce xexeco exx x + xxex xc ccxxd dxo xxxex + oxod ec ecxxe exe e xxxxxe + ccxx xx oooce xo decdcdccdcccccco ecxx x + cxex cox exxoeoexc oexxcccccceccccc xeexex + xexe eee eccoo oc eecxccxxxxddddc ocxxeoc + exxd eee ecccc ocoocoo + oxxe cxxe eodcococ + ocxxe ecce eoxcocexc + e eece exccoedx eeccxccxedc + cxcxco ccxccxxceeoooccccxcxccceece + exxcoeexxcdooxxcxxxdccccexcc + cecxxxcdeeeeeeeocdcce + eeccccccce + + diff --git a/codex-rs/tui/frames/codex/frame_012.txt b/codex-rs/tui/frames/codex/frame_012.txt new file mode 100644 index 0000000000..3db39633b1 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_012.txt @@ -0,0 +1,27 @@ + + + eeedcccccccdooe + eooxccccceeooe dxeccxccce + ecxoxceoedccxxcddccccceedoeccco + oocxceexcxcco cxcceo cce + exoxcddcccoo cxcxe ce + oxxecxoc oooe xcx eee + oxxoexxe deeococd cecxeeco + oxxoexco ecexeeeee coxoeee + xxcexxce eoexxeecee ecx ex + xxc cxc eecxxxoce cxxo oo + exx xx coeee dx xxx xx + xxx xxc oxxc ecoe xxxxxx + ocx xxo deoxocxcoc ocdddccccccccco xxx xx + xe xo xxoceoxc e xxocccccccccccccex excx x + xxx cox cxx ooeec eecdccccoxxxxdddceeoxxooc + xxe coe cccc eoooodx + exe coco oxcocox + exxo cocce eoxooceoc + cxxxe cccccee edcxeoxddoe + ecxxe ccxcxxccedoooccccxxxxceeece + ccceoe cccdxxxxxxcccce eccc + cccccodeeeeeeeeoddcce + eccccccce + + diff --git a/codex-rs/tui/frames/codex/frame_016.txt b/codex-rs/tui/frames/codex/frame_016.txt new file mode 100644 index 0000000000..daac17bdd2 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_016.txt @@ -0,0 +1,27 @@ + + + eeeoccccccccooe + oeocxccceeoxeooeccxcccoe + odocceedcccxxcddccxxxoeeeccceo + eocceodcccccx eccxecexocee + occoxxccc ccxxxdecd + exxodxc ooo cxxococo + exxxoxoc xxceexo exd eee + xxxox cxeococee cxx dxe + xooxxo cxxexeecee cxd oxo + xooxx eexxxeceeo cxx xxc + xex xcx cxx ocdxc xx oe + xee xco dcoocxocc cxc oe + xo xxx eoocoxxc occcddcccccdcco cxcexx + cxoxoeo oxcodecox coccccccocccccccx exxoox + ceo xexe coeoedc xeccccccxxoxxxxc oeceex + eeo eece cccce exexoccc + cec ecxc oxoxcoxc + cxdececxce eoxxcooxc + cxdeceoxxceeo edoxxcxeoo + cxxoeccxxxcxccddoooocccxxxcc ecc + ecceee eccccxxxxxxcccc eococ + cxcdxdoeeeeeeeeoddccc + eccccccce + + diff --git a/codex-rs/tui/frames/codex/frame_020.txt b/codex-rs/tui/frames/codex/frame_020.txt new file mode 100644 index 0000000000..cff12de7ff --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_020.txt @@ -0,0 +1,27 @@ + + + eeeecdccccccoeee + oeoxccceeedooeecccccccdoe + odcxcoeddcxdccddccocxccecxceox + oceeedococc oexeeccccce + oc ooccocec ccxeceeec + oe excoe oo edcoeoo + o oxex ocecx eee xcee + oe oxocx xodcoeee ee xexo + ecoexeo cxexoecxe xo dxc + x exxx cxdccoeee cx xcxx + xxcxxe eeexc dxxc xxexo + xocxxeo oco docoe xecxx + excxxxe oooedxeo edccccddddddddoe xeexe + coeexoeo ecccocc occcccccccccccxo exoxx + xeexecx ecdooe xccccccxxexxcxo eeexeo + xe xeoe ee ecoooo + xeoecocex ooexceo e + exocccoce eocoxxeoo + cxdecedxccoeo eoocexxcocc + ccxo ccxxxxcccooooocccxxcccedcoc + cccee ccccccccxoodcce ecccee + cccxxooeeeeeeeoocccc + eccccccee + + diff --git a/codex-rs/tui/frames/codex/frame_024.txt b/codex-rs/tui/frames/codex/frame_024.txt new file mode 100644 index 0000000000..43c0dd4444 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_024.txt @@ -0,0 +1,27 @@ + + + eoecdcccccdeee + eodxce c ccceccxcccodoe + eoc eocccdccddccedoeocxcccco + oc occeccec exceoecccexe + oc eoccoe dcce eceee + o doeo dceo coccdeox + x oooe ecex ceccxeex + x xode xxceco xxcxeox + oe ox e eecee deocoxcd + xoxxxo xoe cee ccx xecc + xoxxeo ex cec ooxxxe + xexcex cec ecc exxxxx + xocoxc xoeccoo edcccdddcdcddce ec xxxx + xoxcex exccexc xdeeccccccccccxoc xxcxoxo + xocoeee eeode ccccecceeecccxo exocec c + xecoeco oxeco o + cxecoece eceecc o + xe ecccce oocoeoeo + cxecxeedccee ecceccdceoe + cxeecexccxxeccdeeecccccocodoococ + ccxoe cccccxcccxcccxccccoxce + ecccdddeeeeeeoccxcccc + ecccccceee + + diff --git a/codex-rs/tui/frames/codex/frame_028.txt b/codex-rs/tui/frames/codex/frame_028.txt new file mode 100644 index 0000000000..835aee7460 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_028.txt @@ -0,0 +1,27 @@ + + + eoexdcccccdeee + odcce eccxcexo + edce eocccxxcdddcece eecceco + eoc ecccoo xeo ccdeco + occeoc oe exc deeeee + xoooo e oc cxoeeexoe + xcoxcd e coccc ceccexoe + oxxoc e oececd cooeoeox + xeexoo eeeee cc x xxe + xcdcx oeccoec ex cex o + xdxxexc x e oeco dcecxxdc + x xxxo xxcccc c cxcxxxo + xx cxxe coo ocoeodcccdddccdcd occdxxo + x xx x edxo oe cdddceeddddcexo xoxxo o + xeeodc ece cdddxeeeeeeecc doexd o + xeecec excx o o + cxeexxce oxooec oe + xoedco eoceoeo oe + cxecdxxc e eeccxxc cec + cxdcxcxxcxedcdeccccxxxceooexeoe + cxcoxxxxccccccxdccoeeooeoc + ccxccxxdxxxxeccxxccc + ecccccce e + + diff --git a/codex-rs/tui/frames/codex/frame_032.txt b/codex-rs/tui/frames/codex/frame_032.txt new file mode 100644 index 0000000000..efcb8195d4 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_032.txt @@ -0,0 +1,27 @@ + + + eocdcddcccddeo + eoocc ccxeecce + edcxeoccccxcddccco eeccccc + excdxcceccxo xeo eee co + ocexcc od xo xeo ce + ocoxcoe e dxe eeoexo + ocoxcxde xeoe coece xcxe + exeoc o oeeoe c o eee + xoex c eoeeeee eceoxoex + x xx x xeococo eoeoxceo + cexxcc eexocooeo xxxocxx + ocxxe cooccoxc o xxxxc + xxxxcx exeexe eocdxdcddddc xoxcxx + xoox e ceexo xecccddedddeo dcexxxxx + cxxox ccccdexdxexc oxox c o + xoeoecx ee dcxooc o + xeexxoe oceoxo oe + xxcceec excoo oooe + cdeeccocx oxceocoeeo + cxxcoccexcdxdoooccxxceooee cc + cxxxxcxccccccccceoecceeoe + eccxdeeeeeeoccdccocc + ecccccce e + + diff --git a/codex-rs/tui/frames/codex/frame_036.txt b/codex-rs/tui/frames/codex/frame_036.txt new file mode 100644 index 0000000000..a600c78685 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_036.txt @@ -0,0 +1,27 @@ + + + eocccdcccdeeo + eecccedoo cccccxccxeo + oxcddccccccdccxo coec cee + excxoceecc co oxeece + oooxcc xe eeoo ee + ooooo e e cexeoce + xooo deeec e eeeoee + xexx eecoceco oee oeex + xxee ocooece o eeceeoe + x xc ocxxoodeeo d xxooxx + x ec eeecooedo x xxx xx + xede cxo occ x exxxcx + xooc x ocoxc oeccccccdcd cxxxexxx + xxoxeo c oc xcccccccccee o xcexxx + xdox x ecccccxdeexc xcxcxxxee + cxccx x eeeee eo ooo x + exxxd e oxex o + exxeeecd oc oc oe + cxxoxeec excooeoc o + exxccdcxcecdeoocxxeecdxe oc + ccecccccxcxcccededcceoc + ccodeeeededccoceoce + ccccee ce + + diff --git a/codex-rs/tui/frames/codex/frame_040.txt b/codex-rs/tui/frames/codex/frame_040.txt new file mode 100644 index 0000000000..e110f93586 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_040.txt @@ -0,0 +1,27 @@ + + + eocccccdcceee + odcceoeeecccxxdcxcce + oxcecccccxdccdeccxce eee + ocoxcedcc ccce ce + xecxe ocoxo ex + xxcx eeoe ooec ex + deox ceeexe coceeeoe + xxxe xee xe oceoxx ee + ecxx eee eec exexxxxx + xxxx oxeoxeeeo ccxdxdoc + oxxx exeoexoo xoxxxexx + eoxx eeooc o e x xxxxxx + xcxc eoeo oeecccccccc cexxeoox + cooo co occcccccccxx x x xxxe + xxoo eccccexdedxc ocxcxxxxx + xooxoc e eeeee x eoxxxxc + xxee ce xexeoxxox + xeccece exeoooc x + xxoxeec ocecooe eo + ceccedoxcccooeoccoooce oc + cce cccxxxxcceodece oc + ccdeooeecccdcedcc + ecccee e + + diff --git a/codex-rs/tui/frames/codex/frame_044.txt b/codex-rs/tui/frames/codex/frame_044.txt new file mode 100644 index 0000000000..f522c4b16f --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_044.txt @@ -0,0 +1,27 @@ + + + eocdcceccceee + ooceooocccxcxd cce + exxdccccxccdececod cc + ococo xoee eeo + oecoe eexdc xo + oxc eeo eoexe oo + xoo cxeo oedecee + x x exeoeeo eo xx x + oeex cxcoeexe oexxx x + xxc eeexcxc xeoxd o + cxc eoxoccx cxxxcxxx + oxce oooxo xxxxexxx + xxox ex ox eecccccccocxxxxooxx + cxx x oxo cccccccceoox exoxxx + xoceeoo occddxdcxoeoexxxxx o + xxoec ex eeeeece xoxx cx + xoeeoo oexc oxee + eoxeeee ocoo o oc + eoxeccco ocoodo oo + eecxcceccoeeoceooee dc + ceecccddxcceecexe oc + ecoeeeooocddeeoce + eccce ce + + diff --git a/codex-rs/tui/frames/codex/frame_048.txt b/codex-rs/tui/frames/codex/frame_048.txt new file mode 100644 index 0000000000..b1fda5075e --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_048.txt @@ -0,0 +1,27 @@ + + + oedxcooccoo + ocxdoecedxcdcceo + ooxcccxcceeeee ce + oxoco exee oex + xxee xeee cex + eec eoe eoxodoee + xoxxxooc o ee ece + e x coe e xdcee x + oxxe oxxxeo x xeexxx + xxe cxood c oocxoodo + xxx xeexxx xoxxcoxx + xxxe e ccc xexxxxxx + xxoe xo eeccccc xexxxxxx + xxcxoeo ccccccxe xcxxxxxx + oxxcxe ccdxdcoc xcxxx ee + xoccx ecxxx xxxex + ccdx x ecoexxxxeo + xxooeee xoo oxxox + coxxecceo exoxoxc ooe + cocececcceooeo od xe + ceeccdxocedcoce eo + cceeeeccdce eoe + ecceeeece + + diff --git a/codex-rs/tui/frames/codex/frame_052.txt b/codex-rs/tui/frames/codex/frame_052.txt new file mode 100644 index 0000000000..f6c55ac3ad --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_052.txt @@ -0,0 +1,27 @@ + + + eodccodecoe + ocoocecoe cexo + xoocccecoeoec ee + dxoco cxoo ee + xxe o exee ece + xxceeee xdxcc xx + ccxxeccc e cx cxoo + xx xxxex o xx exe + oox ooexe xxxo cx + xxc xxxee xooxxex + xxo cxoxe xoxdoe xoo + xxo xdoecc eoexxxd xx + xo xx eeecccceexxxxxxx + xc ec cccccexxcexxxxxe + xxo x eddexcxxd xx x + oxx oo ecxxx xx cx + xxcx eeoc xx ex + xxxe xxooexxco + xxce oxeexxxx o + excdeceecoexc oox + eecxcoeoexc oo + cceeoceocoexc + ccceccc + + diff --git a/codex-rs/tui/frames/codex/frame_056.txt b/codex-rs/tui/frames/codex/frame_056.txt new file mode 100644 index 0000000000..4391e74d4e --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_056.txt @@ -0,0 +1,27 @@ + + + odccooecoe + ooeeeoodccxo + dxoceecxe cxo + cxcoxexco coce + xex eeoeee cod + xeoeco xxexc cx + xxxo x cxx edxxe + eoco xxo ex x + cxcxcc excexxo + eoecedx xxcxxoox + xoxddcx xxoccxox + xococcx xxce xxx + coexeeec xxoxxcxx + dexcccxe xxd xx x + cex d xxxxxxxex + xxceco e oxxxx ox + xxx xx e exxxx x + exc e dxxx odoee + xce x x eece xx + exeecoeoox xxec + ecoccodc co + ceeoec ec + ccecccc + + diff --git a/codex-rs/tui/frames/codex/frame_060.txt b/codex-rs/tui/frames/codex/frame_060.txt new file mode 100644 index 0000000000..3f002f8991 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_060.txt @@ -0,0 +1,27 @@ + + + dccoocco + e exo ccoe + oxxxoeceee + oooxdx cxxx + xxxoxco cxx + xxexooxex ex + xxocxxox xx + xxccxxxxecc o + xxoxxcoexxxex + xxxxx xxx eex + xxecc xccxcxx + xxeex x cxoxx + xxeexeeoxxxxc + xxxxxxxxx xe + xxexcx xxx xo + xxexxxxxxxxcx + xeooox o x + xxoxxcdxxc + oxxxexceexe + xecxec xcxx + d x ee oeec + ccx ccodxx + cccecce + + diff --git a/codex-rs/tui/frames/codex/frame_064.txt b/codex-rs/tui/frames/codex/frame_064.txt new file mode 100644 index 0000000000..59f853965c --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_064.txt @@ -0,0 +1,27 @@ + + + cccoccco + xexc ccdx + xexc xeoe + xxxeeecxo + xooxocexx + cco eeoex + cocxocccx + exex xoee + exdeo ox + xxxeeexxe + xxxcoccxxx + xxxxoodox + xxxxxxexxe + xxxxxxeexe + xxxxxxxxxx + xxoxxxxxcx + xxxxxxxxex + xxxxxxxxox + xxcxeooxex + exdxxocxee + excx x x e + cocc oco + cccccce + + diff --git a/codex-rs/tui/frames/codex/frame_068.txt b/codex-rs/tui/frames/codex/frame_068.txt new file mode 100644 index 0000000000..99d4683512 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_068.txt @@ -0,0 +1,27 @@ + + + occooocdo + eoceoxe c + xoecceexed + cxo o xcxox + xxx eexxx x + ccxoxoexe x + exxexxxxx x + oxxxoxexxx x + xxxxxxexxc x + xexxxxcoxe x + xxccxexoxoox + xocoecccxxox + ex xxx xxxcx + e xxxoxxxcx + exxxxcxcxxx + eexxx oexxx + xoxxxeoxxox + xxedcxxeodx + xcxoooxoxex + cecc xccxee + xxo xxoxox + xoe xceee + ecccccce + + diff --git a/codex-rs/tui/frames/codex/frame_072.txt b/codex-rs/tui/frames/codex/frame_072.txt new file mode 100644 index 0000000000..a93d3bfc6e --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_072.txt @@ -0,0 +1,27 @@ + + + ocxdodcxo + oeexoxeoeoc + xxc e oxeceee + oee cxxxxoc o + xxoxoexcxccdxco + xcxoxxxxxxx ex + exxccecxox ooxo + xxxxxexxxecx ex + xxxxxxxxcxxx oox + xxxxdoxxo ecxxxx + xxc exoxoooxooxx + xxexdoeceeeeceex + xxxxxecxoodcddxx + xxxxx xcxxxxxcxx + xx e xxcxceexcxx + xcecxcxxxeeoeex + xo cxcxe xxxoe + xxx eoeeocxoxx + cxoedo dxxoxxox + xxc c ccoexcx + oe o ecxcdoo + coxo eeeeo + ccceccce + + diff --git a/codex-rs/tui/frames/codex/frame_076.txt b/codex-rs/tui/frames/codex/frame_076.txt new file mode 100644 index 0000000000..248cc9e5e1 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_076.txt @@ -0,0 +1,27 @@ + + + ecccdoccxee + ceoxxeeeceoce + xxoxceoxexccoee + xoeoooexcocecccxo + ocdxecooxx oceo + xeeoo eooce exo + exoeeocxxec exx + xxeeoxx xxxcd ox + xxecxxeeeeexx odxx + exxxxx exeo xxex + xxxxxo oxexoxx xoex + xxxxxo eoe xex cxex + xxxxx oxxedcodxxx + xxxxx oxdeoxxeoxc xx + xxxxx eexxeeccoxcoxx + xxxx eexxceeeoxexox + xxxx exo xcxec + cxxxxx cx ooecxc + xeceoxxcoo ox xoe + coeo xxeexocdxecc + cxoo eecoocdoeo + cecc cceceedc + ceececce + + diff --git a/codex-rs/tui/frames/codex/frame_080.txt b/codex-rs/tui/frames/codex/frame_080.txt new file mode 100644 index 0000000000..6ce6bd6e49 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_080.txt @@ -0,0 +1,27 @@ + + + odcxeodcxee + occ ccxxceodxco + xecoooox ccccccoe + ocxx ooxoooece ccee + xcoxxooxec oexo + ooxoooeec e eo + xxoeexoxc ece eoxo + dxx xxcccx edxe cxo + xexccxexxe oeeoo xx + exxxcxxxx exxe xox + xxxxxeexx do o ocox + xxxxcxexx xexe cxxx + xoxxecxxx oecxd c oexxx + xxxxx oxc xdxcex c eexex + xxxxo cx ce o exo ocxxc + xxxxx cx oco exxxex + xxxxxcxx oxxxe + dexxeocxce oee + cxo exeeeee exce + eee eeeeecocceexoco + cxe cd cdcocec + cee ccecoeedce + eceeeecce + + diff --git a/codex-rs/tui/frames/codex/frame_084.txt b/codex-rs/tui/frames/codex/frame_084.txt new file mode 100644 index 0000000000..1f21c1e2a8 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_084.txt @@ -0,0 +1,27 @@ + + + eodceodcccco + exc dcxxccedoecee + exceeo ooecccccccexe + ooco ecococd ee ecex + ooco xooxxc cxx + xoeooccoec e ceo + xxxoexoxxc cee oxe + xx oxeexo xoeee coxo + xcxocxxcc eoexe cxe + xxxxxcdxx eeoo xxx + xoxxcexcx o exce xxe + xceoceexx xecoex exo + xc eoxoxx coececddccee eexo + xx eecxxxx oooeo cxcce xxxx + xc ccxxex eo x excx ccocx + x cccxc xo exxe + ee cexexox oxoxox + exe cece e xoeeee + xx ecxe xe oc cxco + ee ecoxeeceeecceodxco + cxe eeeex cccccccoc + cce cceceeeeeoc + eceeeecce + + diff --git a/codex-rs/tui/frames/codex/frame_088.txt b/codex-rs/tui/frames/codex/frame_088.txt new file mode 100644 index 0000000000..8288ef49cb --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_088.txt @@ -0,0 +1,27 @@ + + + oodxedcddccoe + ooe cdoxoceededcco + eoeo ococecccxxcxcxdco + ox cooooodcx cxoecexe + oeceococc eoeexe + oxooooode e cc cxx + exeecx oo xcd e exoo + xxeooccx xoco e ccxx + ccc xee eoecxee cexo + xxxxxddx ocoec coxxx + xxxxxxxo d eoxex coxxo + xecxxxxx ocxoeeoc oxxe + xx xoxxx xxecoxc cccee dxxc + coc cox oooocoo ecccxo xxxxx + x o xxe exxo eccco xcc + cod xcxc eoe xxoo + xo exeeoeo ecooxee + coecocxoeo dcooeeo + xdeeoexoce eoeoxoxo + xd eeee ccoeedcexxxcec + cxeececex ccdccccceoe + cco ecoccdeeeecce + cceecccce + + diff --git a/codex-rs/tui/frames/codex/frame_092.txt b/codex-rs/tui/frames/codex/frame_092.txt new file mode 100644 index 0000000000..afcc3863e7 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_092.txt @@ -0,0 +1,27 @@ + + + eoodceccccdxoe + ecx ccxccccedoxdcceo + eoceooccccecccxxccccdeeo + ocoodce coc eoeccxoe + xeo oced xo cee + xxeeeco ced ccxx + occcxoeo oxcec eoex + exooxxdx xooce cxoe + xexx xec xooceee xxx + xxx oxx xooce oxx + exxxxex oddecc xxo + exxexxx ooooco xcc + xxxoxxx oeoooooe ddccccxd ocxc + xxxxceo dooooxc cdcccxce oxxe + cxxxexxoe cox e cxcdcdxc xecxx + cexxxoo x ceoe e c xx + coeeocecx oc xeeo + cxeeeoee x xeooxo + cxeeeexeeco edcceooco + ee coxxoecceeeecccoxcccoc + ceeeexeoo ecccccccceec + cceecocxoeeeeeocc + ec eecccce + + diff --git a/codex-rs/tui/frames/codex/frame_096.txt b/codex-rs/tui/frames/codex/frame_096.txt new file mode 100644 index 0000000000..bd0c20af91 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_096.txt @@ -0,0 +1,27 @@ + + + eecxocccccxee + eocecxxccxcedoocxcccoe + eoedoccc eeocccxxcccdeocee + oc ooxe eocccdce + x oxoo c ocoe + xoooxoc ocec cee + cddoxoo oocee ccex + doodxeo xxocx ecxoo + cecccx xoxox e xxx + exxxexe eeeexec xxo + xcxcoxx o ecxxxo oxxxx + xxecxxx xodeo oec xoxxxx + cxxxxxx xooo oc dccccdde ecxcoe + oxxxxoo xoocedco xecccxcc x exo + x xxxxx coo oe excccdc xcdoxo + execooo xeoc dccxxxe + ceex ooe cdccxoeo + execxexeco eocdcoxo + ceeeoxed coo ecc xccoo + ee ecxeecccdeeeecccdecxocxe + ee eccxooeccccccccccecc + ccoeeoexoeeeeeedcce + eceeecccce + + diff --git a/codex-rs/tui/frames/codex/frame_100.txt b/codex-rs/tui/frames/codex/frame_100.txt new file mode 100644 index 0000000000..65ae59b2a6 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_100.txt @@ -0,0 +1,27 @@ + + + oeecdcccccccee + oceodocceoccecoexcccce + eceeoccoooeocccdxxcccdexcco + oc oodoo xocedoco + exoeoccce e ccoc + exexooo ode oeox + xoeooeo oxcxe oeeox + oooxxoe cxeexee eeoxe + x oocx ceoecd e xxx + xexxcxx cxeccedc xoxo + x cxxec cx eoe ec xxex + xeceeex oeeco ex xxcx + x ecxxe xeecoeeo dddddccdcdee exoxx + ce xxx xeoocxoo xxocccxdeeex xxce + xdcxeoee xcox ec cxcxcddccd dxeed + cexxxce x xeoc cc eooce + exxxxex xe ococxxo + edcexxeeco oxeceecooo + co ccxxocxe edccecoxoc + ce ccxcecxxdceeoocccxecccxoo + coeccxde cxccccccccccoce + ecoeccccedeeeeeooccc + e eccccce + + diff --git a/codex-rs/tui/frames/codex/frame_104.txt b/codex-rs/tui/frames/codex/frame_104.txt new file mode 100644 index 0000000000..c31a6eb9cd --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_104.txt @@ -0,0 +1,27 @@ + + + eoodcdcccccccee + eccoxocce cccco + oceoccc eodcccdxxcccdoxxcce + ocdooeoceoc decxoecee + o dococoo cxooeece + ccocco o ddee e xcoe + xcoxeocx odccoe ce xooe + xeeeooooe eeoeeeee e eoeo + xdxexee cxe cxcx e xxec + xcxxxxcx o xxooxex xoco + cxccxx x eeo xc ox c xx x + xxeoxx x ecoode oc xoxxcx + ec xxxcx ocooxcoxe dccdcccddo exxxox + eecco o oeoxo ex coecccxdcec ocxexe + e xxxxox cooxee xccxxddccc exxxx + cxeeeexcx co eexee + eeeoexoexe eoeococc + cdcxxeo xo edcecoxxc + ce ccxdecxoe ecceoeccoe + cd cccdecxccccoeoocccxedcoxcoc + cceececee ccxccccccccxcxoc + cx ccxccoeeeeeeoeccc + e ecccccce + + diff --git a/codex-rs/tui/frames/codex/frame_108.txt b/codex-rs/tui/frames/codex/frame_108.txt new file mode 100644 index 0000000000..a865caed66 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_108.txt @@ -0,0 +1,27 @@ + + + eoeddccccccccoee + odxccccc ccoe + eoccxcdoooecccxxxxxcccceedcco + eocoocdeodc eocccxxco + oedocxeox coeccoxe + xxoxoccxx ocxe o xeeeo + xeoxocex eddoxc eeeexeco + ocxeeocx cxdecee eeceexe + xxxxxox cxdexxo cceoex + xxexxoo ocxeceec exo xxx + ccxexox x xxooxx o xoeo + cexexex oeooccox ooxe x + e oxxo x ec oooooo ocddccccccdcoo xdxxee + ce xxxex cecoococ oxxeccccdceccc cxxxx + xoeexo xe oxooo eeccxxddcc xx o + xcxoooceo oeooxoxc + cecxoxecee edceooxoe + cccxxxo xo eceodddoe + eeecxeocxce ocexcxcec + ccecxccececcccceeodcccxedcxceeoe + coccxxeecccxcccccccccxeecc + ccoccxxcdeeeeeedcccc + e ccccccce + + diff --git a/codex-rs/tui/frames/codex/frame_112.txt b/codex-rs/tui/frames/codex/frame_112.txt new file mode 100644 index 0000000000..23351643d8 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_112.txt @@ -0,0 +1,27 @@ + + + eeeddccccccccoee + eocooxccoecc ccce + ocoxcdccoeococcdxxxccccce cce + ococcccddccxe occcdocee + ocxxcocox ccccooce + oooxec o doooe ed ceecx + oeooocexe eeeecce ce ex x + ooxeeccx cxeedocde ce ex x + xxxxxcoe ceeceeec eo xxco + exxcxeox ecxececoc x xxex + xec x e cceoe o xoexox + xexex e ececo oc coxxxx + ce exe x oxoxe exe odddcddccdccoe ecxxex + o xxxcx eoooce dc exxdcccccccexcxoxexecx + eocecocx xxcdoc cdecxccddccccoexdxoe + ecxox ce oeeeceo + ecxxeeece eoeooo o + eoxxxeoeee eccocoxoc + cocxxdocdccee eoccxcoxeoe + coecxeoocxccccceeodcccxeccxccecc + ccexxee e ccxcdcccccccccecce + eeocccxccoeeeeeedcccce + e ccccccce + + diff --git a/codex-rs/tui/frames/default/frame_000.txt b/codex-rs/tui/frames/default/frame_000.txt new file mode 100644 index 0000000000..abe1b5d34c --- /dev/null +++ b/codex-rs/tui/frames/default/frame_000.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                     ____=+++++++++,__                       +                 ,_*|/*"+*`__`:..``"*`**+_                   +              _/|\*"*`,_|+*||*=+|"***+,_  "+_                +            ,*|/,*_+,/** -|~"*+;_ *,              +          _*|/,*_//    +"*|,^*,            +         ,||//'/| ,\,||_\\           +        //|/" |*  |"\\\* ^;\|,^|          +       ,/||*"|`    *\_'|/|~  `*\^|,^|         +       **~|\|*   |*;\\\_/|  *,*|_\,        +      |\"|`_|~     *\|*^/||^.  .|`|| |        +      /|;~ \|   +_/:  *~:  "~||:|        +      " \\ /|    '_/||"  ;*        \||~|        +      |`||  /      ,|//" /|`  _==+=+++++++++,  |:/| |        +        *|; |,   _/||*' /*`  /~|=^******"""  |;\|\|        +       \.|\/ |\  *|/` _|`     "~"------ | ||'|`        +        \\||_^|,   *++*;                  ,/`//"//         +         \\\|  \=_                       ;*;*/`//          +          \|||, *|\_    _|_+|*_|'           +           ',**|, *,*+    :_+*|*+*-;*             +             "~*||+ `\,**\|+__,,,++**|+|+*'_,*`              +                *"**+;,~|*=~/"**;||=+*" _+*"                 +                    **+;|+||;______,+;**`                    +                         ``""*""""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_004.txt b/codex-rs/tui/frames/default/frame_004.txt new file mode 100644 index 0000000000..c7431d5d0b --- /dev/null +++ b/codex-rs/tui/frames/default/frame_004.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                     ____;+++++++++,__                       +                 ,_/|/*"+*"_,`... '"*`"*+_                   +              _/||*|*`;_|+*||*=||"***+;_  "+_                +            ,|*/,*_+|/*" +"*\;_ *,              +          _*|/,"_;/*  "+'*|,^*,            +         ,||//^/| \/||_\\           +        /||*" |* \;"`\\*    *;*|,'|          +       ,/||*_|`   *\_^^/\-     /\'||^|         +       **~|/|*     `|||\\\\   `",*|~\,        +      |*"|` |      ,^|**^/|"   |`|| |        +      *|/~'_|        +_/|' /+.     =~||'|        +      " \/ *|,   _/||" -;*`   !|| |        +      |`||'"*\     ;|/// ;/`` _==+=++=++++++,  ,!/| |        +        *|, |_    /||*''/*   * |^**"***"""""*  |;\|_|        +       \'|\_"|,  *|/' _|"    .,*;++_|~|;==++ ///|`|`        +        \\\|,^|_   *++*     `         ,/`/|"//         +         ,\\|_"\+_               _*;*/'//          +          \^||,.*/\_   _/;+|*_|'           +           ',*||_ *,*+         __+*|*+|`;*             +             '~*||+ "*,**||+__,,,++*||;|+*"_,*`              +                `"**+;_/|~;+|"***|+=+*"'_+*"                 +                    "*+||++=;______,+;**`                    +                         ``""*""""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_008.txt b/codex-rs/tui/frames/default/frame_008.txt new file mode 100644 index 0000000000..69f2c278d6 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_008.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                     ____=+++++++++,__                       +                 __/|**"~*`_,`... _"*~"*+_                   +              _/||*+*_.;++*|*==||"**\+;_  "\,                +            ,||*|"__+|*"/ +"*\;_ *,              +          ,*|//`,|* "+_*|,'*,            +         /||,"_|* ,,_,   '^_||_\\           +        /|/,,,|" *`",\*:  \*|,^\          +       /|/| ,|     \|""\",*       \^|;^|         +       |||\ |~`   "||;|,\_ "\*|,||        +      ||`| ||'     *_!|\|\",   !_|| |        +      ~|_| |"        "+||; :|.   |||^|        +      ,|/; \+      _*||` _|^ `   |||~|`       +      **|| ||      ///*` |/  :_+=+=++=++++++,  _*|| |        +      '~^|!"/|   _||/`/_|'  .^~|******\"""""  |_\|_|        +       |^|\ \\_ ^"*/. ,*     \_*|++||~|;==;+ ,*||`/'        +        _||; \\_  ^+++"                 /"//*,/         +         /||\ *||_                 _/;*/',*          +          .*||_ \*+_                _/|+,*_|*           +           ^ \\+_ \|*+,_:~           __+*|*+|`;*             +             "~*|*/ **|**||+__,,,++**|+|+*"__*`              +                `||*,__~|*=,/||*|||=**"'_|+"                 +                    "^+|||+=_______,+;**`                    +                         ``"""""""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_012.txt b/codex-rs/tui/frames/default/frame_012.txt new file mode 100644 index 0000000000..d9212a6206 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_012.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                      ___=+++++++=,,_                        +                 _,/|**+*"__,,_!;|_"*~**+_                   +              _+|/|*`,_;+*||*==++***\\;,_*"*,                +            ,/+|*_\|*|*"/ +|*+_, "+_             +          _|/|";;*+"..  *|*|_ "\            +         /||^"|/* ,,,_    |+| \\_          +        /||/_||` ;\`,*,*: '\*|_^*,         +       /||/_|*/  ^*\~^^_\_      */|,^\_        +       ||*`||'`   ^,\||\\"\^  \'| \|        +      ||*!+|"      \\*|||,*_   "||/ /,       +      \|| ||       */\`` ;|          ||| ||       +      ~|| ||'     ,||* _*/^       |||~||       +      ,*| ||, :_/|/"~+/"   ,+===+++++++++,   ||| ||       +       !|_ |/    ||/*`,|* ` ~|/***"****"""""^| \|*| |        +       ||| */|  *||  ,/``'  `\*;++++/~|||;==*`_/||-/"        +        ||\ */\   *++*                      _////;|         +         ^|\ ",*,                  /|*/'/|          +          \||, *,*+_            _,|//"_/*           +           '|||_ *+**+__            _;*|\/|:;/`            +             `"||_  *+|*||++_;,,,+++*||||*`__*`              +                 **+_._ "**=||||||++**` _+*"                 +                    "*"*+,;________,=;+*`                    +                          `""*""""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_016.txt b/codex-rs/tui/frames/default/frame_016.txt new file mode 100644 index 0000000000..db3c516cab --- /dev/null +++ b/codex-rs/tui/frames/default/frame_016.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                      ___,++++++++,,_                        +                  ,_/*|**"__/|_,,_"*~"*+,_                   +               .;/*"__;++*||+==++|||/\__"+*\,                +            _/+*`,;+*+*"|  `*+|\+_|-*\_             +           /+*/||*+*   "*|||;\*;            +         _||/;|* ,,,    *||,",+,          +        _|||/|/' ||"\_|,   \|; \\\         +        |||/|    +|\/",*\_    *|| ;|\        +       |//||/   *||\|\_*\_   *|; ,|,       +       |//||!       \\|||\'\_. '|| ||*       +      |`~ |"~        *|| /*;|'    ||  /^       +      |`^ |"/      ;*/.'|,"'     "|" /^       +       |/ |||     _/,*/||*    ,+++==+++++=++,  '|*`~|        +       +|.|/\,  ,|"/;\+/|    */***"""/""""**+| _||,/~        +       '\, |\|^ *,^/^;*      |\++++++~|/||||*  /\"_\|        +        \\, \\*_ *++*`                       _|\|/"*'        +         *\+ \"|+                 ,|,|*/|'         +          "|;_"\*|+_                     _,||*,,|*           +            *|;_"\,||+__.             _;/||*~_//             +              *||,_"*|||*|++;;,,,,++*|||** _+*               +                `**___ `**++||||||***" _,+/"                 +                    "~*=~;,________,=;+*"                    +                          `""**"""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_020.txt b/codex-rs/tui/frames/default/frame_020.txt new file mode 100644 index 0000000000..ddc7272a2c --- /dev/null +++ b/codex-rs/tui/frames/default/frame_020.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                      ____+=++++++,___                       +                  ,_/|**"__\;.,\_***+**+;._                  +               ,;*|",_;=*|;++==++/*|++_"~*\/~                +             ,+``_;/*,** .\|\_"+*+*_             +           ,* -,**-"`' "*|\'\^\*            +          /` _|*/^ ,, \;",\/,          +         /  ,|`| /"\"|    `\\ |*\\         +        /` ,|,'~  |/:*,\\_      \\ |\|,        +       _*,_|`/    "|\~,\"|\    |, ;|*        +       | `|||       *|;**,\\_   "| |*~|       +       ||'||^      `\_|*  ;||'      |~^~/        +       |/'||\.   ,"/ ;/*/`     |\"~|        +       \|'|||_  /./_;|`/  _;++++========,_   |\^~`        +       ',\\~/\.  _***/**     ,******"""****|/  \|/||         +        |\\|\"|  \":,/`    |++++++||\|~+|/  _\\~\,         +         |\ |\/\     ``             _*////          +          |\,\',*_~                        ,/`|*^/ `         +           \|,'+*,*_               _,*/||`/,           +            '|;_'\;|*+,_. _,/*_||*,""            +              "*|, *+||||*++,,,,,+++||*+*`;*,'               +                 **+__ "**+++++|//=*"` _+**^`                +                    "**|~,,_______,,+++*                     +                          `""**""``                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_024.txt b/codex-rs/tui/frames/default/frame_024.txt new file mode 100644 index 0000000000..4cb3a57f1b --- /dev/null +++ b/codex-rs/tui/frames/default/frame_024.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                       _,_+=+++++;___                        +                  _.;~"`   ' '*"^'*~**+,;,_                  +                _/"  _,+*";++==++\;,_."~"*+*,                +              /*  ,**_+*\+ \|*\,\"+*\|\              +            ,* _/*",^ ;*+\ \*\_\            +           /  ;/`, ;+_, *,+*;\,|           +          |  //,^  \*_|   *\+"|\\|          +         |  |/:^   ||"\*, ||"|\/|         +        ,` ,|  \ `\*_\ ;\,*,|*;        +        |/|||/     |/\!'\\  '*| |^""        +        |/|~_,  \|   +\*  //|||\        +        |^|*`| "_*  _*"       \~||||        +        |/*/|+    ~/`'"//    _;+++===+=+==+_  _" ||||        +        !|,|*_|  _|""_|*    |;^^**********|/* ||"|/|/        +         |/',\^_  \_,;`     "+++_++___+++|.  _|/+\' '        +          |_*,\',             /|\'/ .         +          '|_*,\"\      _'\`*" ,          +            |_ \"+*+_            //+,`._/           +             *|_"~^\;*+__      _+*_+";'^,`            +               *|__"^|*+||\++;___+++**,+/;/,*,'              +                 "*|,_ "****|***|++*|**+*-|'`                +                    `**+=;;______,++|**""                    +                          `""**""```                         +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_028.txt b/codex-rs/tui/frames/default/frame_028.txt new file mode 100644 index 0000000000..2471080abe --- /dev/null +++ b/codex-rs/tui/frames/default/frame_028.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                       _,_~;+++++;___                        +                   ,=**`          `**|+_~.                   +                _;*` _,+*"||+===+\+_  `^*+_*,                +              _/" _+*",/ |\,  **;_*,              +             ,''_/* ,^ \|+ :\^\_\             +            |//// _ ,* *|,`^\|,\            +           |"/|*:!`  ",**"   *\'*\|/\           +          /||/* ^    ,\'\+; *,.^,\/|          +          |_\|./     \\_\^ +' | ||\         +         |";*|!!   ,\*',\' `| "`| ,         +         |;||`~'    | ` /\*-   ;"\"~|:"         +         |!|||/  |~''*' *   "|"|||.         +         ||!"||_     *,, ,'._,=+++===++=+;  ,""=||.         +          | || |   `;|/ /` *:::+^^=:::+^|,  |,||/ ,         +          |_\/;" \*`     *;;;|_______+"  ;/_|;  /         +           |\\'_*          _|"| , /          +           "|^\||*\        ,|//`' ,`          +             |,^;*,       _/*_/`/ /`           +              *|_*;|~* _  __+*~|* '_*             +                *|;"~*|~*|\;+=_++++|||*`,/`~_/`              +                  *|+,~|||******|=*",__/.^.*                 +                     "*|++||=||||\+*||"*"                    +                          `""**""` `                         +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_032.txt b/codex-rs/tui/frames/default/frame_032.txt new file mode 100644 index 0000000000..875e64a51a --- /dev/null +++ b/codex-rs/tui/frames/default/frame_032.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                       _,+=+==+++;;_.                        +                   _./*"          "*|\_*+_                   +                 _;*|_,+*"*|+==**+,  `\**'"+                 +               _|*;|**_+*|/ |\,  \\\ ",               +              ,*_|*" /; |,  |\, *_             +             /*,|+._ _      :|\  \^,_|,            +            /*/|*|;` |\/\      "/_'\ |'|_           +           _|\/* /   .\\,\      *  , \\\           +           |,\| '    \,\\_\_ \'^,|-\|          +           | || |     |\/',*. `,\,|'^/          +           *\||*'   ^\|/'//\.    |~|/"||          +           /*||\   ',/*'/|'  / ||||*          +           |~||"|  _|`_|`    _,+=|=+====+   |,|*||!          +           |,/| \  *\_|/  |^**+;=^:==^/  ;"\|||||          +           *||,|       ++++;_|;|_|+  /|.| "  /          +            |/\/_"|       ``  ;*~//" /           +             |^\||/\         /*_/~/ ,`           +              ||**\_*   _|",/ /.,`            +               *;^\**,*|      ,|*`/*,`_/              +                 *||+,**\|+;~;,,,++||*`-/`^ +"               +                   *||||+~"*******"`._+*^_/`                 +                     `**|;______,+*;*".*"                    +                          `"""*""` `                         +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_036.txt b/codex-rs/tui/frames/default/frame_036.txt new file mode 100644 index 0000000000..b2fd32ec4f --- /dev/null +++ b/codex-rs/tui/frames/default/frame_036.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                        _,+++;+++;__.                        +                    __+*"_;.. ""*"*|++|\,                    +                  ,|*;;+***"+=**~,  ".\* "\_                 +                _|*|/*^_+" *,  ,|_`'\                +               ,/,|*"  |_ \\,, \_              +              ,/,//  _   \ '\|\.*_             +              |,//  :^\_* \ \\\,^\             +             |`||  ^\'/*_',  /^\ ,_\|            +             ||\`   ,',/_*\ . \_"\\/_           +            | |'    ."||,/;^\. = |~,,||           +            | \"    `_\",/\;.   | ||| ||           +            |\=^  '|/ /*'      | \|||'|           +            |//* |  ,*.|"   ._++++++=+=  *|||`|||           +             ||/|^, * /"   |*********\\   / |*`|||           +             |=/| |      \+++++|=__|*  |"|'|||_`           +             "|*"| |      ````` _/ /,/  |            +              \|||; \          ,|`|    /             +               \||\\_*;        ,* /"   ,`             +                *||,~\_*         _|*,,_.' /               +                  \||+*:+|*\+;_,,+||``*;|^ ,"                +                    *+_"****|*|***`:_;**_,*                  +                      "+,;____;_;**,*_.*`                    +                           """"`` '`                         +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_040.txt b/codex-rs/tui/frames/default/frame_040.txt new file mode 100644 index 0000000000..db32b16299 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_040.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                        _,+++++;++___                        +                     ,;*"_/\\_**+||;+~*+_                    +                   ,|"_+*+*"|=*+;_""|+_ `\_                  +                  /"/|"`;*" '*"\  *\                 +                 |_*~`   .'/|, `|                +                |~*~ __,\  ,/\' \|               +               ;\/|  "\\`|\   '/'^\\,\              +               |||`  |\\ |^  ,"\,|| ^_             +              _"||     \\\ \^* _|_|||||             +              |~||    /|\,|\\^,    ""|=|:,*             +              /|||    \|\/\|-,     |/|||`||             +              \/||   \`//" / ` | ||||||             +              |"|' \/`/   ,__++++++++ '`||_,.|             +              '//,  "/   ,*********|| | |!|||\             +               ||/,     `*+++_|=_;|" /*|"|||||             +               |//|,*  ` ````` | \,||||'             +                ||\\ *_          |`|`/||/|              +                 |\*+_*\       _|`//.'  |               +                  ||,|\`*       ,*`'//^ _/                +                   *_"+\;,|*++,,_,*",,/*` ,*                 +                    "+_ "**||||**`,;^*^ ,*                   +                       *+;_.,__++*:*_;+"                     +                           `"""``  `                         +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_044.txt b/codex-rs/tui/frames/default/frame_044.txt new file mode 100644 index 0000000000..e59d3fc97b --- /dev/null +++ b/codex-rs/tui/frames/default/frame_044.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                        _,+=++_+++___                        +                      ,/*_,,,*"+|*|; *+_                     +                    _||;*+*"|*+;_*\*,: "+                    +                   ,*/*/ |,\_ \\,                  +                  ,\*/` \\|;' |,                 +                  /|' __, \,\~\ /,                +                 |// *|\,  /^=\'\\                +                 |!| \|\/_^, \, || |               +                ,\_| '|'/\_|_ /_||| |               +                ||*    \^\|'|* |\/~: /               +                *|"    \.|/*"~    "|||'|||              +                /|"`   /,/|. ~|||`|||              +                ||/| _| /|  __+++++++,"~|||.,~|              +                !*|| | /|. ********\,.|!\~,|||               +                 |/+_`,/  /*+==|=+|/`,`||~|| /               +                 ||,\* `~   `````"\ |,|| '|               +                  |/\_/,       /\|"  .~\`               +                  \/|\_\\       ,*/, /  /*                +                   \/|_+'*,      /*/,;/  //                 +                    \_*|++_*+,__,*`//_^  ;"                  +                     '\_"*+==|**`_+\|` ,*                    +                       `*,___,./*;=`_,*`                     +                           `"""`  "`                         +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_048.txt b/codex-rs/tui/frames/default/frame_048.txt new file mode 100644 index 0000000000..82ea699436 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_048.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                         ,_=~+,,*+,,                         +                       ,*|;,_"\;|*;"*\,                      +                      /,|"*"|*+_\\\_  *\                     +                     /|/*,   \|\_ .`|                    +                    ||^^     |\\_ '^|                   +                   _\"  _,_  \,|/:,\\                  +                   |/|||,,"    / \\!\*_                 +                   \ | "/\ \   |;"\\  |                 +                  .||` ,|||\, |!|\\|||                 +                  ||\  *|//;!'     ,,*|,/=,                +                  |||  |\\|~~     |/||'/||                +                  |||` \ *"'        |\||||||                +                  ||/\ !|/  __+++++ |\||||||                +                  ||"|/_,  ******|\ |"||||||                +                   /||*|`  ++=|=+/" |'||| \`                +                   |/'*~ `"||| |||^|                 +                   **;| |  _"/\||||_/                 +                    ||/,^\_     |/, /||,|                  +                    ",||\'*_.   `|,~,~' /,`                  +                     ',*_+_**+_,/_, /:  |`                   +                      "\_*+=|/*`;*,*^ _/                     +                        "+____+*;*^ _/`                      +                           `"*````"`                         +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_052.txt b/codex-rs/tui/frames/default/frame_052.txt new file mode 100644 index 0000000000..90ce85c17f --- /dev/null +++ b/codex-rs/tui/frames/default/frame_052.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                         _.=++,;^+,_                         +                        /",,"\*/\ "^|,                       +                       |//+"*\*,\,`' \\                      +                      ;|/'/   "|//   \\                     +                      ||^ /     \|\\  \'_                    +                     ||*__`_     |;|'" ||                    +                     *"||_+*'    \!'| "|/,                   +                     || ||~\|   , || _|\                   +                    //| //_~\     |||/ !"|                   +                    ||"  |||\_    |/,||\|                   +                    ||/  *|/|\   ~/~=/` ~/,                  +                    ||/ |;/^'"   `/_|||: ||                  +                     |/ || ___++++\_|||||||                  +                     |" \* *****^~~"`|||||`                  +                     ||/ | \=;_|*||=  || |                   +                     /|| -/   `"||| ||!"|                   +                     ||"|      _\/" || ^|                   +                      |||\     ||,-`||',                    +                      ||*\     ,~\\~||~ /                    +                       \|*;_*\_*/^~* //|                     +                        \^+~"/`/^|'  //                      +                         *+__,"_/'._|"                       +                            "*"`"""                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_056.txt b/codex-rs/tui/frames/default/frame_056.txt new file mode 100644 index 0000000000..f4f7024e96 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_056.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                          ,=++,,^+,_                         +                         /,_\\/.:'"|,                        +                        ;|/*\\"|`  '|,                       +                        +|*/|\|+, ',"\                       +                        |\~ ^^/\\\  "/;                      +                       |^,_',  ||\|' *|                      +                       |||, |  *|| `:|~\                     +                       \/*/     ~~, ^| |                     +                       "|"|+'    _|"`||/                     +                       \/\*_;|  ||*||,/|                     +                       |/|;=+|  ||/''|/|                     +                       |/*/*"|  ||"` |||                     +                       */\|___+ ||/||'~|                     +                       =\|"**~\ ||: || |                     +                       "\| :! |||||||\|                     +                       ||*`+, ` /|||| /|                     +                       ||| ||! \ `|||| |                     +                       ^|" _ ;||| ,:-_`                     +                        |'^ | |!\\*` ||                      +                        \|^\*/\/,| ~~_'                      +                         \*-""/;*   "/                       +                          +__/_*   \*                        +                            "*`'"""                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_060.txt b/codex-rs/tui/frames/default/frame_060.txt new file mode 100644 index 0000000000..2daf8b5922 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_060.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                           =++,.*+,                          +                          ^ \|/ *",\                         +                          /|||/`"^^\                         +                          ///|;~ '|||                        +                         ||~/|*,  "||                        +                         ||_|//|\| \|                        +                         ||.*||/|! ~|                        +                         ||"'||||^"" ,                       +                         ||/~~*/^|||`|                       +                         ||||~ ||~ \_|                       +                         ||\+" |''~"||                       +                         ||`^~ | "~/||                       +                         ||__~_`.||||*                       +                         ||~|~|||| |\                       +                         ||_|"| ||| |/                       +                         ||\~~||||||"|                       +                         |\///|   .! |                       +                         !||/||";||" !                       +                          /|||\|+\_|\                        +                          |\*|\" ~*~|                        +                          = ~ \^ ,^_*                        +                          **| *'-;||                         +                            "*"`""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_064.txt b/codex-rs/tui/frames/default/frame_064.txt new file mode 100644 index 0000000000..918e3261f1 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_064.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                           +++,+++,                          +                          |\|"!""=|                          +                          |_|' ~^/\                          +                          |~|\_^"|/                          +                          |//|,"\||                          +                          *"/!^^/^|                          +                          */"|/**"|                          +                          ^|`~ |.\^                          +                          \|=_, .|                           +                          |||`^^~|_                          +                          |||",*"~~~                         +                          ||||-/=/|                          +                          ||||||`~|`                         +                          ||||||\_|`                         +                          ||||||||||                         +                          ||/|||||"|                         +                          ||||||||`|                         +                          ||||||||/|                         +                          ||*|\/,|_|                         +                          \|;|~-"|\`                         +                          \|'| ~ | `                         +                           */"" /*/                          +                            "*"'*"`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_068.txt b/codex-rs/tui/frames/default/frame_068.txt new file mode 100644 index 0000000000..24c9c6b2c0 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_068.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                          ,++.,,+=,                          +                          \/"\/|\ "                          +                         |,`''^\|\=                          +                         "|, , |*|-|                         +                         |~| `\||| |                         +                         "*~-|/\|\ |                         +                         \~~`||||| |                         +                        /|||.|\||| |                         +                        |~||||\||* |                         +                        |_||~|"/|\ |                         +                        |~"'|^|/|,/|                         +                        |,".`"""||/|                         +                        ^| ||| |||*|                         +                         _ |||,|||"|                         +                         _~|||'|*|||                         +                         \\||| /^|||                         +                         |/|||_.~|/|                         +                         ||\:'~|\/;|                         +                         |*|-,,|,~`|                         +                         '\"" |""|`\                         +                          ||, ||.|.|                         +                          |/^  ~+^_`                         +                           `"'""""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_072.txt b/codex-rs/tui/frames/default/frame_072.txt new file mode 100644 index 0000000000..ceceac8447 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_072.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                          ,+~;,;+~,                          +                         /^^~/|\/_.*                         +                        ||" ` /|_*\\\                        +                       ,\`  '~|||,' /                        +                       ||/|.\|"|"';|*,                       +                       |"~,||~||||  \|                       +                       \||""\"|,~ -.~/                       +                      |||||_|||\"~  `|                       +                      ||||||||"~|| ,/|                       +                      ||||=/||/ ^*~|||                       +                      ||" \|/|/.,~//||                       +                      ||\~:-^"\_\\"\\|                       +                      |||||\"~//;+==||                       +                      ||||| |*|||||'||                       +                      ||!\ ||"|"\\|+||                       +                       |"\"|"|||\\/\_|                       +                       |,  "|'|\ |||/\                       +                       |||  \,\^,*|/~|                       +                       '|/\:,!;||/||,|                       +                        ||+ "!"*/_|'|                        +                         ,\ - \'|*;//                        +                         '/|.  \`\_/                         +                           """`"""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_076.txt b/codex-rs/tui/frames/default/frame_076.txt new file mode 100644 index 0000000000..40b74bec2a --- /dev/null +++ b/codex-rs/tui/frames/default/frame_076.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                         _+**;,++~__                         +                        *^/~~^\\*_.*\                        +                       ||/~'\/|\|"*,\\                       +                      |/`.//\|*/"\'''|,                      +                     ,+;~`'//|| -'\/                      +                     |\\//!`,/+_   \|,                     +                     \|/\_,"||\*   ^||                     +                    ||\`/|| |||*;   /|                     +                    ||\+||`_\^`||  ,;~|                     +                    \|||||  `|\,  ||_|                     +                    |||||/ /|_|,||  |/\|                     +                    |||||. \/_ |\|  "|\|                     +                    ||||| /|~\=*,=|||                     +                    ||||| /|=_,||_/|" ||                     +                    ||||| \\||_^*"/|+/~|                     +                     |||| \\||*\`^,|\|/|                     +                     ||||! \|/     |"|\+                     +                     *||||| "|    //\*|'                     +                      |\'\,||*/, ,| ~,\                      +                      ",\. ~|\\|/*;|\*'                      +                       '|,. `^",,*:/\/                       +                        "\+* "+`*__;"                        +                           "``"`*"`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_080.txt b/codex-rs/tui/frames/default/frame_080.txt new file mode 100644 index 0000000000..7c8ffffca2 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_080.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                         ,=*~_,=*~__                         +                       /** *"||*`,:|*,                       +                      |`'/,/,|!+*"*+*,\                      +                     /"|| //|,/-`"` ''\\                     +                    |"/||,,|\*       .^|,                    +                   //~,//`\' _      \/                    +                   ||/\\|,|+ _*_      ^/|,                   +                  ;|~ ||*'*| \;|\      '|/                   +                  |\|""~_~~` .\_,.     ||                   +                  \|||"|~||  \||\      |/|                   +                  ||||~__||  :/ /    /*/|                   +                  ||||'|_|| |^|_     "|||                   +                  |/||`"||| /_"|= * ._|||                   +                  ||||| /|" |;|'`~ * ``|\|                   +                  ||||. *| *_ / `|/ /"||*                   +                   ||||| *| .*/    _|||\|                   +                   |||||'||         /|||`                   +                    =\||^/"|*_      !/\\                    +                    *|, `|\\\\_    `|*`                    +                     \\_ \\^\\*,+*`_|,*/                     +                      "|_  ! *; *=+/*_*                      +                        *\_ "+_*,__;*`                       +                          `"````""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_084.txt b/codex-rs/tui/frames/default/frame_084.txt new file mode 100644 index 0000000000..ca22988c9a --- /dev/null +++ b/codex-rs/tui/frames/default/frame_084.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                        _,;*_,;++++,                         +                      _|* ;"||*"_;._*\_                      +                    _|*``/!//_+**"*+"\|\                     +                   ,/', ^*,*,*:   `` \"\|                    +                  ,/', ~/,||* "||                   +                  |/`,/''/\+ _     '\,                  +                 |||/\|,||" *`\     /|\                  +                 |~ /|``|,  |,\_^       '/|,                 +                |*|/"~~+"   \/_|\        '|\                 +                |||||"=||   ^\/,        ~||                 +                |/||"\|*|  , \|+^        ||\                 +                |"_-'__||  ~\*,`|       `|/                 +                |" `,|/|| */_*^+==+*\_ __~/                 +                || ^`"||~| ///^/ +|*"` |~|~                 +                 |' *'||_| _/ |  _|*| **/"|                 +                 |!  ""*|* |/          \||`                 +                 ^\ '\|`|,|          ,|,|,|                  +                  \|\ "_'\ \        |/_\\`                  +                   ||  \'|\ |_     /" "|*/                   +                    \\ `"/|\_*___+*_/;|"/                    +                     *|_ `\`\~ "*++**","                     +                       *+_ "+_*\____/*                       +                          `"````""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_088.txt b/codex-rs/tui/frames/default/frame_088.txt new file mode 100644 index 0000000000..72ca94576e --- /dev/null +++ b/codex-rs/tui/frames/default/frame_088.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                        .,;~_;+;=++,_                        +                     ,/^ +;/|/*`_;\;"*,                      +                   _/`. ,*,*_+**||*~"~=*,                    +                  /| ".////;*~  '~,`'^|\                   +                 /^'`/*/'*  \.`^|\                  +                /|//,//;^ _!**     "||                 +               _|\^"| ,/   |*;  \     \|,,                +               ||`//''|    |,*, ^    "'||                +               !""" ~_^    \/_*~\` "\|/                +              |||||;=|   /*/\'       '.|||               +              |||||||/   ; _/|^|        '.||/               +              |_"|||||   /*|/_`,"         .||\               +              || ~.||| ||_*/|+ +**\_ ;||"               +               "." */|  .///+//  \*""|/ |||||               +               |  .!||_ _||,    \**+. |+*                +               */:  ~"|" \,`         ~|//                +                |, \|^\,\,            _*//~\`                +                 */\','|,\,          ;*./\\/                 +                  |;\^,\|,*\       _/`,|,|/                  +                   |;  \\\\ *+,__;*_|~|*\*                   +                    "|_`"^"\~ "*=++**"_/`                    +                      "+, `+,*+;____+*`                      +                          ''``"*""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_092.txt b/codex-rs/tui/frames/default/frame_092.txt new file mode 100644 index 0000000000..0cf925ee90 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_092.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                       _,,;*_++++;~,_                        +                    _+~ +"|*"*"_;.|;"*\,                     +                  _/"`.,*'*"_+**||"*+*:_\,                   +                 /*,/;*^ *,* ^._**|,\                  +                |`/ ,"`; ~. *\\                 +               |~__\', +_;     '*||                +              /*"*|/`,  /|*\"   ^/\|               +             _|/,||;|    |/,*\       "|/_              +             |`|| |_'     |,,*\`\      |||              +             ||| ,||       |,/*\          /||              +             \||~|^|      .;=`""       ||/              +             \||_|||    ////'/         ~*"              +             |||.|||   /^///./_ ==+++*|; -"|*              +             ||||*\/  ;////|'  *=*"*|"` ,||^              +             *|||\||,\ +,| \    *|*;*;|+ |\*||              +              *_|~~// |  *\,`    `   '    ||!               +               *,^\,*\"|           ,* |\\/               +               *|^\\,\\ |       |_/,|/                +                '|_\^\|\_*,    _;*'_//*/                 +                  \_ ",||,`*+____+**,~*+*,*                  +                   "\_\^|^,- `**+++***`_*                    +                      *+_`+,*~,_____,+"                      +                         `' ``"*""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_096.txt b/codex-rs/tui/frames/default/frame_096.txt new file mode 100644 index 0000000000..70e8050e7e --- /dev/null +++ b/codex-rs/tui/frames/default/frame_096.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                        __+~,+++++~__                        +                   _,"_+||*"~"_;,."|"**,_                    +                 _/\:/+*' `_/***||"*+;\,*\_                  +                /" ,,|`  ^,'**;*\                 +               |  /|// + .*,\                +              |///|/' ,+_"   *\\               +             *;;/|,/   //"\_     **\|              +            ;/,;|\,   ||/"|      `"|/,             +            *^"'*|     |,|.| \   |||             +           _|||_|\     \\\\|_'     ||/             +           |"|"/||    , \+|||-         .||||            +           |~`"|||      |/;`/ /^'     |-||||            +           *||||||    |/,,! /' =++++;;\ _"|*/`            +            ,||~|,,   |,,*`;'/  |_*""|*" | \|/             +            |!|||||  +// ,`    \|+**;+ |":/|,             +             \|\",,,   |_,"          ;*'|||`             +             *\\|!./_            ';*'|,\/              +              \|\*|\|_*.         _/";+,|/               +               *\\^,|\; *,.       _+" |**//                +                 \_ ^*|\_"*+;____++*;_+|/"|`                 +                   \_ ^**|-,`***+++***"_+"                   +                     "+,_^._~,______;+*`                     +                         `"```"*""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_100.txt b/codex-rs/tui/frames/default/frame_100.txt new file mode 100644 index 0000000000..ed39ba5c5e --- /dev/null +++ b/codex-rs/tui/frames/default/frame_100.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                       .__+;+++++++__                        +                   ,+`,=/**`/*"`'.`|"**+_                    +                _+^_/+*///_,+**=||**+;\~"*,                  +               /" //;//  ~,*^;.*,                +             _|,_,***_ ^  *'/*               +            _|`~//,  ,;_   .\,|              +            |/\//\/   /|"|_    .\\,|             +           ///||/`   +|_\|_`   `^,~\            +           | /,*|       *\,`*; \  |||            +          |`||'|~     *|\"*\:'       |,~,           +          | "|~\*      '| _/\ ^+           ||^|           +          |`"\_\|      /\\*/ _|        ||"|           +          | `"||_    |\_'/`_/  =====++;*;__ \|/~|           +          '_  |||    |`,,*~,/   ~|/*"*|=```|  ~|'`           +           |:'|\/_\ ~+/| _*     "|+|*=;++= :~^\;            +           '\|||*\ |   |\,'             '' _//+`            +            \||||\| |_                 /",*||/             +             \;'\||\_*,       .~_*__"///              +              ", *"||/"|_         _;*"_*,|,"               +                *_ **|+_"||;+__,,++*|_+*+|//                 +                  *,_**|;_  *~**++**+*"',*`                  +                    `*._*"**\;_____,,+*"                     +                         `  `"**""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_104.txt b/codex-rs/tui/frames/default/frame_104.txt new file mode 100644 index 0000000000..3ba709b3d4 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_104.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                      _.-;+=+++++++__                        +                  _+",|/**`         "**+,                    +                ,*_/+*'  _,=+**=||**+;,~|*+_                 +              ,*://^-"_,* ;_*|,\"\_               +             / ;,*,",/ *|..\\*\              +            *"/+'/ / ;;^\  \  |'/\             +           |*/|`/'|   /;"*,\  '\ |//\            +          |^\\/,//`   \\,`\\\`    `  \/^,           +          |;|\|\_ *|\ *|"| \ ~|\+           +         |'||||'|  , ||,.|_~     |/",          +         "|*"|| |     `^/ |*  /~      " || |          +         ||`/|| |   _*,/;` /"        |.||'|          +         \' |||'|    ,*//|'/|` =++=+++;;,  \|~|,|          +         !_`"*/!!,  /`,|/ _|   +/^*"*|="`" /+|\~`          +          \!~|||,|  *,/|`_      |*+||;;+++ `||||           +          '|_\\\|"|   +/                 _\|^`           +           \_\/\|,^|_               _/`/'/*'            +            *;"||\, |,        _;*_+/||'             +             "\ **|;_"|,_ _+"_/^+*/`              +               *; ***;_"~*+++,_,,++*|_;*,|+,*                +                 "+_^*\+__ "*~*****"+*|*|/"                  +                    "~ "*|*+,______,_+*"                     +                         ` `""**""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_108.txt b/codex-rs/tui/frames/default/frame_108.txt new file mode 100644 index 0000000000..35d1b3f8dd --- /dev/null +++ b/codex-rs/tui/frames/default/frame_108.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                      _._;;++++++++,__                       +                  ,;|++**"            "+,_                   +               _/*+|*;//._++*|||||**++\_;**,                 +             _/*//"=`,;* ^,"++~|*,               +            /`;,*|`,| *.\**/|_             +           |~/|,*'|| ,+|\ , ~\\\,            +          |\/|,*\|   \;:.|* `\^\|\*,           +         /*|\\/"|   *|;^*\_  \^"\\|_          +         |||||/|     '|;_~|,    ''\,_|          +        |~\||/.   .*|\*\\* `|. |||          +        **|`|/~ | ||,.||   / |/^,         +        "`~`|_~  /\,,*',|   /.|\ |         +        \ .||, | _*!////// ,+==++++++;+,, |;||_`         +        '_ |||^|    *\*//"/"  ,|~^*"**="_'*" '||||          +         |,^\|/ |` ,|/,/  \\++||==++  || /          +          |'|,/,*\.    ,_//|/|'           +          '\*|/|_'\_    `;*_//|,`           +           '+"|||, |,     _*_/;;=/`            +             \_^*|\,"|+_ /*_|*|+\*              +              "+_*|*+_"\**+++__,=++*|_;*|*`_/`               +                 *,"*||_^""*~"****""+*|^_+*                  +                    *"/*+||+;______;++*"                     +                         ` """**""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/default/frame_112.txt b/codex-rs/tui/frames/default/frame_112.txt new file mode 100644 index 0000000000..629134ba86 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_112.txt @@ -0,0 +1,27 @@ +                                                             +                                                             +                      ___;;++++++++,__                       +                 _.*,/|*"-^'"         "*+_                   +               ,*,|*;+",_,+/**=|||**+++_  *+_                +             ,".+"+";;+*|^ !,"*+;,"\_              +           ,*||*,",| *+"*,,*\             +          ///|`* / ;,,,_ \; "\\"|            +         /\//,*_|`  ^\`\**`    *\ \| |           +        ,/|\\*'|    "|\\:,+:_  *\ \| |          +        |||||'/`   *\_'\\_" \. ||',         +       _||'|`.|     _*|_"^","   | ||_|         +       |\" | \      "+_/^  /  ~,\|/|         +       |`~_| ^       _*_*/  /*    '/||||         +       '` \|_ |     /|,|^ _|`  ,===+==++;++,_ \"||_|         +        , |||"|   _///+` ;*   ^~|;**"***"_|*|,|_|\'|         +        \,"\+/"|   ||":/"      *;_+|++==+++*/`|;|/`         +         \'|/| '\                      /\_\*_/          +          \*||\_^+_  _/`/,/!/           +           \/|||_,^\_   _+*,*/|,*            +            *,"||;,"=++__  _,*"|*/|^/`             +              *,^*|\,.*|**+++__,=++*|_+*|+"_+"               +                "+_||\_ _ "*~":***""+*"'_+*`                 +                   ``.**+|++,______;++**`                    +                         ` '"**"""`                          +                                                             +                                                             diff --git a/codex-rs/tui/frames/dots/frame_000.txt b/codex-rs/tui/frames/dots/frame_000.txt new file mode 100644 index 0000000000..287bcd0468 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_000.txt @@ -0,0 +1,27 @@ + + + ○○○○○●●●●●●●●●●○○ + ●○●·◉● ●●·○○·◉◉◉·· ●·●●●○ + ○◉·○● ●·●○·●●··●○●· ●●●●●○ ●○ + ●●·◉●●○●●◉●● ◉·· ●●◉○ ●● + ○●·◉●●○◉◉ ● ●·●○●● + ●··◉◉●◉· ●○●··○○○ + ◉◉·◉ ·● · ○○○● ○◉○·●○· + ●◉··● ·· ●○○●·◉·· ·●○○·●○· + ●●··○·● ·●◉○○○○◉· ●●●·○○● + ·○ ··○·· ●○·●○◉··○◉ ◉···· · + ◉·◉· ○· ●○◉◉ ●·◉ ···◉· + ○○ ◉· ●○◉·· ◉● ○···· + ···· ◉ ●·◉◉ ◉·· ○○○●○●●●●●●●●●● ·◉◉· · + ●·◉ ·● ○◉··●● ◉●· ◉··○○●●●●●● ·◉○·○· + ○◉·○◉ ·○ ●·◉· ○·· · ◉◉◉◉◉◉ · ··●·· + ○○··○○·● ●●●●◉ ●◉·◉◉ ◉◉ + ○○○· ○○○ ◉●◉●◉·◉◉ + ○···● ●·○○ ○·○●·●○·● + ●●●●·● ●●●● ◉○●●·●●●◉◉● + ·●··● ·○●●●○·●○○●●●●●●●·●·●●●○●●· + ● ●●●◉●··●○·◉ ●●◉··○●● ○●● + ●●●◉·●··◉○○○○○○●●◉●●· + ·· ● · + + diff --git a/codex-rs/tui/frames/dots/frame_004.txt b/codex-rs/tui/frames/dots/frame_004.txt new file mode 100644 index 0000000000..eaf6483452 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_004.txt @@ -0,0 +1,27 @@ + + + ○○○○◉●●●●●●●●●●○○ + ●○◉·◉● ●● ○●·◉◉◉ ● ●· ●●○ + ○◉··●·●·◉○·●●··●○·· ●●●●◉○ ●○ + ●·●◉●●○●·◉● ● ●○◉○ ●● + ○●·◉● ○◉◉● ●●●·●○●● + ●··◉◉○◉· ○◉··○○○ + ◉··● ·● ○◉ ·○○● ●◉●·●●· + ●◉··●○·· ●○○○○◉○◉ ◉○●··○· + ●●··◉·● ····○○○○ · ●●··○● + ·● ·· · ●○·●●○◉· ···· · + ●·◉·●○· ●○◉·● ◉●◉ ○···●· + ○◉ ●·● ○◉·· ◉◉●· ·· · + ····● ●○ ◉·◉◉◉ ◉◉·· ○○○●○●●○●●●●●●● ● ◉· · + ●·● ·○ ◉··●●●◉● ● ·○●● ●●● ● ·◉○·○· + ○●·○○ ·● ●·◉● ○· ◉●●◉●●○···◉○○●● ◉◉◉···· + ○○○·●○·○ ●●●● · ●◉·◉· ◉◉ + ●○○·○ ○●○ ○●◉●◉●◉◉ + ○○··●◉●◉○○ ○◉◉●·●○·● + ●●●··○ ●●●● ○○●●·●●··◉● + ●·●··● ●●●●··●○○●●●●●●··◉·●● ○●●· + · ●●●◉○◉··◉●· ●●●·●○●● ●○●● + ●●··●●○◉○○○○○○●●◉●●· + ·· ● · + + diff --git a/codex-rs/tui/frames/dots/frame_008.txt b/codex-rs/tui/frames/dots/frame_008.txt new file mode 100644 index 0000000000..508aad22af --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_008.txt @@ -0,0 +1,27 @@ + + + ○○○○○●●●●●●●●●●○○ + ○○◉·●● ·●·○●·◉◉◉ ○ ●· ●●○ + ○◉··●●●○◉◉●●●·●○○·· ●●○●◉○ ○● + ●··●· ○○●·● ◉ ● ●○◉○ ●● + ●●·◉◉·●·● ●○●·●●●● + ◉··● ○·● ●●○● ●○○··○○○ + ◉·◉●●●· ●· ●○●◉ ○●·●○○ + ◉·◉· ●· ○· ○ ●● ○○·◉○· + ···○ ··· ··◉·●○○ ○●·●·· + ···· ··● ●○ ·○·○ ● ○·· · + ··○· · ●··◉ ◉·◉ ···○· + ●·◉◉ ○● ○●··· ○·○ · ······ + ●●·· ·· ◉◉◉●· ·◉ ◉○●○●○●●○●●●●●●● ○●·· · + ●·○· ◉· ○··◉·◉○·● ◉○··●●●●●●○ ·○○·○· + ·○·○ ○○○ ○ ●◉◉ ●● ○○●·●●····◉○○◉● ●●···◉● + ○··◉ ○○○ ○●●● ◉ ◉◉●●◉ + ◉··○ ●··○ ○◉◉●◉●●● + ◉●··○ ○●●○ ○◉·●●●○·● + ○ ○○●○ ○·●●●○◉· ○○●●·●●··◉● + ·●·●◉ ●●·●●··●○○●●●●●●●·●·●● ○○●· + ···●●○○··●○●◉··●···○●● ●○·● + ○●···●○○○○○○○○●●◉●●· + ·· · + + diff --git a/codex-rs/tui/frames/dots/frame_012.txt b/codex-rs/tui/frames/dots/frame_012.txt new file mode 100644 index 0000000000..b6842db391 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_012.txt @@ -0,0 +1,27 @@ + + + ○○○○●●●●●●●○●●○ + ○●◉·●●●● ○○●●○ ◉·○ ●·●●●○ + ○●·◉·●·●○◉●●··●○○●●●●●○○◉●○● ●● + ●◉●·●○○·●·● ◉ ●·●●○● ●○ + ○·◉· ◉◉●● ◉◉ ●·●·○ ○ + ◉··○ ·◉● ●●●○ ·●· ○○○ + ◉··◉○··· ◉○·●●●●◉ ●○●·○○●● + ◉··◉○·●◉ ○●○·○○○○○ ●◉·●○○○ + ··●···●· ○●○··○○ ○○ ○●· ○· + ··● ●· ○○●···●●○ ··◉ ◉● + ○·· ·· ●◉○·· ◉· ··· ·· + ··· ··● ●··● ○●◉○ ······ + ●●· ··● ◉○◉·◉ ·●◉ ●●○○○●●●●●●●●●● ··· ·· + ·○ ·◉ ··◉●·●·● · ··◉●●● ●●●● ○· ○·●· · + ··· ●◉· ●·· ●◉··● ·○●◉●●●●◉····◉○○●·○◉··◉◉ + ··○ ●◉○ ●●●● ○◉◉◉◉◉· + ○·○ ●●● ◉·●◉●◉· + ○··● ●●●●○ ○●·◉◉ ○◉● + ●···○ ●●●●●○○ ○◉●·○◉·◉◉◉· + · ··○ ●●·●··●●○◉●●●●●●●····●·○○●· + ●●●○◉○ ●●○······●●●●· ○●● + ● ●●●◉○○○○○○○○●○◉●●· + · ● · + + diff --git a/codex-rs/tui/frames/dots/frame_016.txt b/codex-rs/tui/frames/dots/frame_016.txt new file mode 100644 index 0000000000..a4c04660c6 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_016.txt @@ -0,0 +1,27 @@ + + + ○○○●●●●●●●●●●●○ + ●○◉●·●● ○○◉·○●●○ ●· ●●●○ + ◉◉◉● ○○◉●●●··●○○●●···◉○○○ ●●○● + ○◉●●·●◉●●●● · ·●●·○●○·◉●○○ + ◉●●◉··●●● ●···◉○●◉ + ○··◉◉·● ●●● ●··● ●●● + ○···◉·◉● ·· ○○·● ○·◉ ○○○ + ···◉· ●·○◉ ●●○○ ●·· ◉·○ + ·◉◉··◉ ●··○·○○●○○ ●·◉ ●·● + ·◉◉·· ○○···○●○○◉ ●·· ··● + ··· · · ●·· ◉●◉·● ·· ◉○ + ··○ · ◉ ◉●◉◉●·● ● · ◉○ + ·◉ ··· ○◉●●◉··● ●●●●○○●●●●●○●●● ●·●··· + ●·◉·◉○● ●· ◉◉○●◉· ●◉●●● ◉ ●●●· ○··●◉· + ●○● ·○·○ ●●○◉○◉● ·○●●●●●●··◉····● ◉○ ○○· + ○○● ○○●○ ●●●●· ○·○·◉ ●● + ●○● ○ ·● ●·●·●◉·● + ·◉○ ○●·●○ ○●··●●●·● + ●·◉○ ○●··●○○◉ ○◉◉··●·○◉◉ + ●··●○ ●···●·●●◉◉●●●●●●●···●● ○●● + ·●●○○○ ·●●●●······●●● ○●●◉ + ·●○·◉●○○○○○○○○●○◉●● + · ●● · + + diff --git a/codex-rs/tui/frames/dots/frame_020.txt b/codex-rs/tui/frames/dots/frame_020.txt new file mode 100644 index 0000000000..1caae6e972 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_020.txt @@ -0,0 +1,27 @@ + + + ○○○○●○●●●●●●●○○○ + ●○◉·●● ○○○◉◉●○○●●●●●●●◉◉○ + ●◉●· ●○◉○●·◉●●○○●●◉●·●●○ ·●○◉· + ●●··○◉◉●●●● ◉○·○○ ●●●●○ + ●● ◉●●●◉ ·● ●·○●○○○● + ◉· ○·●◉○ ●● ○◉ ●○◉● + ◉ ●··· ◉ ○ · ·○○ ·●○○ + ◉· ●·●●· ·◉◉●●○○○ ○○ ·○·● + ○●●○··◉ ·○·●○ ·○ ·● ◉·● + · ···· ●·◉●●●○○○ · ·●·· + ··●··○ ·○○·● ◉··● ··○·◉ + ·◉●··○◉ ● ◉ ◉◉●◉· ·○ ·· + ○·●···○ ◉◉◉○◉··◉ ○◉●●●●○○○○○○○○●○ ·○○·· + ●●○○·◉○◉ ○●●●◉●● ●●●●●●● ●●●●·◉ ○·◉·· + ·○○·○ · ○ ◉●◉· ·●●●●●●··○··●·◉ ○○○·○● + ·○ ·○◉○ ·· ○●◉◉◉◉ + ·○●○●●●○· ●◉··●○◉ · + ○·●●●●●●○ ○●●◉···◉● + ●·◉○●○◉·●●●○◉ ○●◉●○··●● + ●·● ●●····●●●●●●●●●●●··●●●·◉●●● + ●●●○○ ●●●●●●●·◉◉○● · ○●●●○· + ●●··●●○○○○○○○●●●●●● + · ●● ·· + + diff --git a/codex-rs/tui/frames/dots/frame_024.txt b/codex-rs/tui/frames/dots/frame_024.txt new file mode 100644 index 0000000000..c81c245432 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_024.txt @@ -0,0 +1,27 @@ + + + ○●○●○●●●●●◉○○○ + ○◉◉· · ● ●● ○●●·●●●●◉●○ + ○◉ ○●●● ◉●●○○●●○◉●○◉ · ●●●● + ◉● ●●●○●●○● ○·●○●○ ●●○·○ + ●● ○◉● ●○ ◉●●○ ○●○○○ + ◉ ◉◉·● ◉●○● ●●●●◉○●· + · ◉◉●○ ○●○· ●○● ·○○· + · ·◉◉○ ·· ○●● ·· ·○◉· + ●· ●· ○ ·○●○○ ◉○●●●·●◉ + ·◉···◉ ·◉○ ●○○ ●●· ·○ + ·◉··○● ○· ●○● ◉◉···○ + ·○·●·· ○● ○● ○····· + ·◉●◉·● ·◉·● ◉◉ ○◉●●●○○○●○●○○●○ ○ ···· + ·●·●○· ○· ○·● ·◉○○●●●●●●●●●●·◉● ·· ·◉·◉ + ·◉●●○○○ ○○●◉· ●●●○●●○○○●●●·◉ ○·◉●○● ● + ·○●●○●● ◉·○●◉ ◉ + ●·○●●○ ○ ○●○·● ● + ·○ ○ ●●●○ ◉◉●●·◉○◉ + ●·○ ·○○◉●●○○ ○●●○● ◉●○●· + ●·○○ ○·●●··○●●◉○○○●●●●●●●◉◉◉●●●● + ●·●○ ●●●●·●●●·●●●·●●●●◉·●· + ·●●●○◉◉○○○○○○●●●·●● + · ●● ··· + + diff --git a/codex-rs/tui/frames/dots/frame_028.txt b/codex-rs/tui/frames/dots/frame_028.txt new file mode 100644 index 0000000000..2c0850aad9 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_028.txt @@ -0,0 +1,27 @@ + + + ○●○·◉●●●●●◉○○○ + ●○●●· ·●●·●○·◉ + ○◉●· ○●●● ··●○○○●○●○ ·○●●○●● + ○◉ ○●● ●◉ ·○● ●●◉○●● + ●●●○◉● ●○ ○·● ◉○○○○○ + ·◉◉◉◉ ○ ●● ●·●·○○·●○ + · ◉·●◉ · ●●● ●○●●○·◉○ + ◉··◉● ○ ●○●○●◉ ●●◉○●○◉· + ·○○·◉◉ ○○○○○ ●● · ··○ + · ◉●· ●○●●●○● ·· ·· ● + ·◉····● · · ◉○●◉ ◉ ○ ··◉ + · ···◉ ··●●●● ● · ···◉ + ·· ··○ ●●● ●●◉○●○●●●○○○●●○●◉ ● ○··◉ + · ·· · ·◉·◉ ◉· ●◉◉◉●○○○◉◉◉●○·● ·●··◉ ● + ·○○◉◉ ○●· ●◉◉◉·○○○○○○○● ◉◉○·◉ ◉ + ·○○●○● ○· · ● ◉ + ·○○··●○ ●·◉◉·● ●· + ·●○◉●● ○◉●○◉·◉ ◉· + ●·○●◉··● ○ ○○●●··● ●○● + ●·◉ ·●··●·○◉●○○●●●●···●·●◉··○◉· + ●·●●····●●●●●●·○● ●○○◉◉○◉● + ●·●●··○····○●●·· ● + · ●● · · + + diff --git a/codex-rs/tui/frames/dots/frame_032.txt b/codex-rs/tui/frames/dots/frame_032.txt new file mode 100644 index 0000000000..1881baf59a --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_032.txt @@ -0,0 +1,27 @@ + + + ○●●○●○○●●●◉◉○◉ + ○◉◉● ●·○○●●○ + ○◉●·○●●● ●·●○○●●●● ·○●●● ● + ○·●◉·●●○●●·◉ ·○● ○○○ ● + ●●○·● ◉◉ ·● ·○● ●○ + ◉●●·●◉○ ○ ◉·○ ○○●○·● + ◉●◉·●·◉· ·○◉○ ◉○●○ ·●·○ + ○·○◉● ◉ ◉○○●○ ● ● ○○○ + ·●○· ● ○●○○○○○ ○●○●·◉○· + · ·· · ·○◉●●●◉ ·●○●·●○◉ + ●○··●● ○○·◉●◉◉○◉ ···◉ ·· + ◉●··○ ●●◉●●◉·● ◉ ····● + ···· · ○··○·· ○●●○·○●○○○○● ·●·●·· + ·●◉· ○ ●○○·◉ ·○●●●◉○○◉○○○◉ ◉ ○····· + ●··●· ●●●●◉○·◉·○·● ◉·◉· ◉ + ·◉○◉○ · ·· ◉●·◉◉ ◉ + ·○○··◉○ ◉●○◉·◉ ●· + ··●●○○● ○· ●◉ ◉◉●· + ●◉○○●●●●· ●·●·◉●●·○◉ + ●··●●●●○·●◉·◉●●●●●··●·◉◉·○ ● + ●····●· ●●●●●●● ·◉○●●○○◉· + ·●●·◉○○○○○○●●●◉● ◉● + · ● · · + + diff --git a/codex-rs/tui/frames/dots/frame_036.txt b/codex-rs/tui/frames/dots/frame_036.txt new file mode 100644 index 0000000000..079d6d0fee --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_036.txt @@ -0,0 +1,27 @@ + + + ○●●●●◉●●●◉○○◉ + ○○●● ○◉◉◉ ● ●·●●·○● + ●·●◉◉●●●● ●○●●·● ◉○● ○○ + ○·●·◉●○○● ●● ●·○·●○ + ●◉●·● ·○ ○○●● ○○ + ●◉●◉◉ ○ ○ ●○·○◉●○ + ·●◉◉ ◉○○○● ○ ○○○●○○ + ···· ○○●◉●○●● ◉○○ ●○○· + ··○· ●●●◉○●○ ◉ ○○ ○○◉○ + · ·● ◉ ··●◉◉○○◉ ○ ··●●·· + · ○ ·○○ ●◉○◉◉ · ··· ·· + ·○○○ ●·◉ ◉●● · ○···●· + ·◉◉● · ●●◉· ◉○●●●●●●○●○ ●······· + ··◉·○● ● ◉ ·●●●●●●●●●○○ ◉ ·●···· + ·○◉· · ○●●●●●·○○○·● · ·●···○· + ·● · · ····· ○◉ ◉●◉ · + ○···◉ ○ ●··· ◉ + ○··○○○●◉ ●● ◉ ●· + ●··●·○○● ○·●●●○◉● ◉ + ○··●●◉●·●○●◉○●●●····●◉·○ ● + ●●○ ●●●●·●·●●●·◉○◉●●○●● + ●●◉○○○○◉○◉●●●●○◉●· + ·· ●· + + diff --git a/codex-rs/tui/frames/dots/frame_040.txt b/codex-rs/tui/frames/dots/frame_040.txt new file mode 100644 index 0000000000..f66eb5c258 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_040.txt @@ -0,0 +1,27 @@ + + + ○●●●●●●◉●●○○○ + ●◉● ○◉○○○●●●··◉●·●●○ + ●· ○●●●● ·○●●◉○ ·●○ ·○○ + ◉ ◉· ·◉● ●● ○ ●○ + ·○●·· ◉●◉·● ·· + ··●· ○○●○ ●◉○● ○· + ◉○◉· ○○··○ ●◉●○○○●○ + ···· ·○○ ·○ ● ○●·· ○○ + ○ ·· ○○○ ○○● ○·○····· + ···· ◉·○●·○○○● ·○·◉●● + ◉··· ○·○◉○·◉● ·◉······ + ○◉·· ○·◉◉ ◉ · · ······ + · ·● ○◉·◉ ●○○●●●●●●●● ●···○●◉· + ●◉◉● ◉ ●●●●●●●●●●·· · · ···○ + ··◉● ·●●●●○·○○◉· ◉●· ····· + ·◉◉·●● · ····· · ○●····● + ··○○ ●○ ····◉··◉· + ·○●●○●○ ○··◉◉◉● · + ··●·○·● ●●·●◉◉○ ○◉ + ●○ ●○◉●·●●●●●○●● ●●◉●· ●● + ●○ ●●····●●·●◉○●○ ●● + ●●◉○◉●○○●●●◉●○◉● + · ·· · + + diff --git a/codex-rs/tui/frames/dots/frame_044.txt b/codex-rs/tui/frames/dots/frame_044.txt new file mode 100644 index 0000000000..f3b0028863 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_044.txt @@ -0,0 +1,27 @@ + + + ○●●○●●○●●●○○○ + ●◉●○●●●● ●·●·◉ ●●○ + ○··◉●●● ·●●◉○●○●●◉ ● + ●●◉●◉ ·●○○ ○○● + ●○●◉· ○○·◉● ·● + ◉·● ○○● ○●○·○ ◉● + ·◉◉ ●·○● ◉○○○●○○ + · · ○·○◉○○● ○● ·· · + ●○○· ●·●◉○○·○ ◉○··· · + ··● ○○○·●·● ·○◉·◉ ◉ + ●· ○◉·◉● · ···●··· + ◉· · ◉●◉·◉ ········ + ··◉· ○· ◉· ○○●●●●●●●● ····◉●·· + ●·· · ◉·◉ ●●●●●●●●○●◉· ○·●··· + ·◉●○·●◉ ◉●●○○·○●·◉·●······ ◉ + ··●○● ·· ····· ○ ·●·· ●· + ·◉○○◉● ◉○· ◉·○· + ○◉·○○○○ ●●◉● ◉ ◉● + ○◉·○●●●● ◉●◉●◉◉ ◉◉ + ○○●·●●○●●●○○●●·◉◉○○ ◉ + ●○○ ●●○○·●●·○●○·· ●● + ·●●○○○●◉◉●◉○·○●●· + · · · + + diff --git a/codex-rs/tui/frames/dots/frame_048.txt b/codex-rs/tui/frames/dots/frame_048.txt new file mode 100644 index 0000000000..ca45df737f --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_048.txt @@ -0,0 +1,27 @@ + + + ●○○·●●●●●●● + ●●·◉●○ ○◉·●◉ ●○● + ◉●· ● ·●●○○○○○ ●○ + ◉·◉●● ○·○○ ◉·· + ··○○ ·○○○ ●○· + ○○ ○●○ ○●·◉◉●○○ + ·◉···●● ◉ ○○ ○●○ + ○ · ◉○ ○ ·◉ ○○ · + ◉··· ●···○● · ·○○··· + ··○ ●·◉◉◉ ● ●●●·●◉○● + ··· ·○○··· ·◉··●◉·· + ···· ○ ● ● ·○······ + ··◉○ ·◉ ○○●●●●● ·○······ + ·· ·◉○● ●●●●●●·○ · ······ + ◉··●·· ●●○·○●◉ ·●··· ○· + ·◉●●· · ··· ···○· + ●●◉· · ○ ◉○····○◉ + ··◉●○○○ ·◉● ◉··●· + ●··○●●○◉ ··●·●·● ◉●· + ●●●○●○●●●○●◉○● ◉◉ ·· + ○○●●○·◉●·◉●●●○ ○◉ + ●○○○○●●◉●○ ○◉· + · ●···· · + + diff --git a/codex-rs/tui/frames/dots/frame_052.txt b/codex-rs/tui/frames/dots/frame_052.txt new file mode 100644 index 0000000000..ab006f7caf --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_052.txt @@ -0,0 +1,27 @@ + + + ○◉○●●●◉○●●○ + ◉ ●● ○●◉○ ○·● + ·◉◉● ●○●●○●·● ○○ + ◉·◉●◉ ·◉◉ ○○ + ··○ ◉ ○·○○ ○●○ + ··●○○·○ ·◉·● ·· + ● ··○●●● ○ ●· ·◉● + ·· ···○· ● ·· ○·○ + ◉◉· ◉◉○·○ ···◉ · + ·· ···○○ ·◉●··○· + ··◉ ●·◉·○ ·◉·○◉· ·◉● + ··◉ ·◉◉○● ·◉○···◉ ·· + ·◉ ·· ○○○●●●●○○······· + · ○● ●●●●●○·· ······· + ··◉ · ○○◉○·●··○ ·· · + ◉·· ◉◉ · ··· ·· · + ·· · ○○◉ ·· ○· + ···○ ··●◉···●● + ··●○ ●·○○···· ◉ + ○·●◉○●○○●◉○·● ◉◉· + ○○●· ◉·◉○·● ◉◉ + ●●○○● ○◉●◉○· + ● · + + diff --git a/codex-rs/tui/frames/dots/frame_056.txt b/codex-rs/tui/frames/dots/frame_056.txt new file mode 100644 index 0000000000..709d607586 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_056.txt @@ -0,0 +1,27 @@ + + + ●○●●●●○●●○ + ◉●○○○◉◉◉● ·● + ◉·◉●○○ ·· ●·● + ●·●◉·○·●● ●● ○ + ·○· ○○◉○○○ ◉◉ + ·○●○●● ··○·● ●· + ···● · ●·· ·◉··○ + ○◉●◉ ··● ○· · + · ·●● ○· ···◉ + ○◉○●○◉· ··●··●◉· + ·◉·◉○●· ··◉●●·◉· + ·◉●◉● · ·· · ··· + ●◉○·○○○● ··◉··●·· + ○○· ●●·○ ··◉ ·· · + ○· ◉ ·······○· + ··●·●● · ◉···· ◉· + ··· ·· ○ ····· · + ○· ○ ◉··· ●◉◉○· + ·●○ · · ○○●· ·· + ○·○○●◉○◉●· ··○● + ○●◉ ◉◉● ◉ + ●○○◉○● ○● + ●·● + + diff --git a/codex-rs/tui/frames/dots/frame_060.txt b/codex-rs/tui/frames/dots/frame_060.txt new file mode 100644 index 0000000000..59daaf3022 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_060.txt @@ -0,0 +1,27 @@ + + + ○●●●◉●●● + ○ ○·◉ ● ●○ + ◉···◉· ○○○ + ◉◉◉·◉· ●··· + ···◉·●● ·· + ··○·◉◉·○· ○· + ··◉●··◉· ·· + ·· ●····○ ● + ··◉··●◉○····· + ····· ··· ○○· + ··○● ·●●· ·· + ···○· · ·◉·· + ··○○·○·◉····● + ········· ·○ + ··○· · ··· ·◉ + ··○········ · + ·○◉◉◉· ◉ · + ··◉·· ◉·· + ◉···○·●○○·○ + ·○●·○ ·●·· + ○ · ○○ ●○○● + ●●· ●●◉◉·· + ● · · + + diff --git a/codex-rs/tui/frames/dots/frame_064.txt b/codex-rs/tui/frames/dots/frame_064.txt new file mode 100644 index 0000000000..02f917de24 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_064.txt @@ -0,0 +1,27 @@ + + + ●●●●●●●● + ·○· ○· + ·○·● ·○◉○ + ···○○○ ·◉ + ·◉◉·● ○·· + ● ◉ ○○◉○· + ●◉ ·◉●● · + ○··· ·◉○○ + ○·○○● ◉· + ····○○··○ + ··· ●● ··· + ····◉◉○◉· + ·········· + ······○○·· + ·········· + ··◉····· · + ·········· + ········◉· + ··●·○◉●·○· + ○·◉··◉ ·○· + ○·●· · · · + ●◉ ◉●◉ + ● ●● · + + diff --git a/codex-rs/tui/frames/dots/frame_068.txt b/codex-rs/tui/frames/dots/frame_068.txt new file mode 100644 index 0000000000..b0ebd0a919 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_068.txt @@ -0,0 +1,27 @@ + + + ●●●◉●●●○● + ○◉ ○◉·○ + ·●·●●○○·○○ + ·● ● ·●·◉· + ··· ·○··· · + ●·◉·◉○·○ · + ○········ · + ◉···◉·○··· · + ······○··● · + ·○···· ◉·○ · + ·· ●·○·◉·●◉· + ·● ◉· ··◉· + ○· ··· ···●· + ○ ···●··· · + ○····●·●··· + ○○··· ◉○··· + ·◉···○◉··◉· + ··○◉●··○◉◉· + ·●·◉●●·●··· + ●○ · ··○ + ··● ··◉·◉· + ·◉○ ·●○○· + · ● · + + diff --git a/codex-rs/tui/frames/dots/frame_072.txt b/codex-rs/tui/frames/dots/frame_072.txt new file mode 100644 index 0000000000..ea4f8a8e05 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_072.txt @@ -0,0 +1,27 @@ + + + ●●·◉●◉●·● + ◉○○·◉·○◉○◉● + ·· · ◉·○●○○○ + ●○· ●····●● ◉ + ··◉·◉○· · ●◉·●● + · ·●······· ○· + ○·· ○ ·●· ◉◉·◉ + ·····○···○ · ·· + ········ ··· ●◉· + ····○◉··◉ ○●···· + ·· ○·◉·◉◉●·◉◉·· + ··○·◉◉○ ○○○○ ○○· + ·····○ ·◉◉◉●○○·· + ····· ·●·····●·· + ·· ○ ·· · ○○·●·· + · ○ · ···○○◉○○· + ·● ·●·○ ···◉○ + ··· ○●○○●●·◉·· + ●·◉○◉● ◉··◉··●· + ··● ●◉○·●· + ●○ ◉ ○●·●◉◉◉ + ●◉·◉ ○·○○◉ + · · + + diff --git a/codex-rs/tui/frames/dots/frame_076.txt b/codex-rs/tui/frames/dots/frame_076.txt new file mode 100644 index 0000000000..07e34dae53 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_076.txt @@ -0,0 +1,27 @@ + + + ○●●●◉●●●·○○ + ●○◉··○○○●○◉●○ + ··◉·●○◉·○· ●●○○ + ·◉·◉◉◉○·●◉ ○●●●·● + ●●◉··●◉◉·· ◉●○◉ + ·○○◉◉ ·●◉●○ ○·● + ○·◉○○● ··○● ○·· + ··○·◉·· ···●◉ ◉· + ··○●···○○○··· ●◉·· + ○····· ··○● ··○· + ·····◉ ◉·○·●·· ·◉○· + ·····◉ ○◉○ ·○· ·○· + ····· ◉··○○●●○··· + ····· ◉·○○●··○◉· ·· + ····· ○○··○○● ◉·●◉·· + ···· ○○··●○·○●·○·◉· + ···· ○·◉ · ·○● + ●····· · ◉◉○●·● + ·○●○●··●◉● ●· ·●○ + ●○◉ ··○○·◉●◉·○●● + ●·●◉ ·○ ●●●◉◉○◉ + ○●● ●·●○○◉ + ·· ·● · + + diff --git a/codex-rs/tui/frames/dots/frame_080.txt b/codex-rs/tui/frames/dots/frame_080.txt new file mode 100644 index 0000000000..d0961cd8cc --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_080.txt @@ -0,0 +1,27 @@ + + + ●○●·○●○●·○○ + ◉●● ● ··●·●◉·●● + ··●◉●◉●· ●● ●●●●○ + ◉ ·· ◉◉·●◉◉· · ●●○○ + · ◉··●●·○● ◉○·● + ◉◉·●◉◉·○● ○ ○◉ + ··◉○○·●·● ○●○ ○◉·● + ◉·· ··●●●· ○◉·○ ●·◉ + ·○· ·○··· ◉○○●◉ ·· + ○··· ···· ○··○ ·◉· + ·····○○·· ◉◉ ◉ ◉●◉· + ····●·○·· ·○·○ ··· + ·◉··· ··· ◉○ ·○ ● ◉○··· + ····· ◉· ·◉·●·· ● ···○· + ····◉ ●· ●○ ◉ ··◉ ◉ ··● + ····· ●· ◉●◉ ○···○· + ·····●·· ◉···· + ○○··○◉ ·●○ ◉○○ + ●·● ··○○○○○ ··●· + ○○○ ○○○○○●●●●·○·●●◉ + ·○ ●◉ ●○●◉●○● + ●○○ ●○●●○○◉●· + · ···· · + + diff --git a/codex-rs/tui/frames/dots/frame_084.txt b/codex-rs/tui/frames/dots/frame_084.txt new file mode 100644 index 0000000000..d5e6dbb38d --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_084.txt @@ -0,0 +1,27 @@ + + + ○●◉●○●◉●●●●● + ○·● ◉ ··● ○◉◉○●○○ + ○·●··◉ ◉◉○●●● ●● ○·○ + ●◉●● ○●●●●●◉ ·· ○ ○· + ●◉●● ·◉●··● ·· + ·◉·●◉●●◉○● ○ ●○● + ···◉○·●·· ●·○ ◉·○ + ·· ◉····● ·●○○○ ●◉·● + ·●·◉ ··● ○◉○·○ ●·○ + ····· ○·· ○○◉● ··· + ·◉·· ○·●· ● ○·●○ ··○ + · ○◉●○○·· ·○●●·· ··◉ + · ·●·◉·· ●◉○●○●○○●●○○ ○○·◉ + ·· ○· ···· ◉◉◉○◉ ●·● · ···· + ·● ●●··○· ○◉ · ○·●· ●●◉ · + · ●·● ·◉ ○··· + ○○ ●○···●· ●·●·●· + ○·○ ○●○ ○ ·◉○○○· + ·· ○●·○ ·○ ◉ ·●◉ + ○○ · ◉·○○●○○○●●○◉◉· ◉ + ●·○ ·○·○· ●●●●● ● + ●●○ ●○●○○○○○◉● + · ···· · + + diff --git a/codex-rs/tui/frames/dots/frame_088.txt b/codex-rs/tui/frames/dots/frame_088.txt new file mode 100644 index 0000000000..16b5489ae2 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_088.txt @@ -0,0 +1,27 @@ + + + ◉●◉·○◉●◉○●●●○ + ●◉○ ●◉◉·◉●·○◉○◉ ●● + ○◉·◉ ●●●●○●●●··●· ·○●● + ◉· ◉◉◉◉◉◉●· ●·●·●○·○ + ◉○●·◉●◉●● ○◉·○·○ + ◉·◉◉●◉◉◉○ ○ ●● ·· + ○·○○ · ●◉ ·●◉ ○ ○·●● + ···◉◉●●· ·●●● ○ ●·· + ·○○ ○◉○●·○· ○·◉ + ·····◉○· ◉●◉○● ●◉··· + ·······◉ ◉ ○◉·○· ●◉··◉ + ·○ ····· ◉●·◉○·● ◉··○ + ·· ·◉··· ··○●◉·● ●●●○○ ◉·· + ◉ ●◉· ◉◉◉◉●◉◉ ○● ·◉ ····· + · ◉ ··○ ○··● ○●●●◉ ·●● + ●◉◉ · · ○●· ··◉◉ + ·● ○·○○●○● ○●◉◉·○· + ●◉○●●●·●○● ◉●◉◉○○◉ + ·◉○○●○·●●○ ○◉·●·●·◉ + ·◉ ○○○○ ●●●○○◉●○···●○● + ·○· ○ ○· ●○●●●● ○◉· + ●● ·●●●●◉○○○○●●· + ●●·· ● · + + diff --git a/codex-rs/tui/frames/dots/frame_092.txt b/codex-rs/tui/frames/dots/frame_092.txt new file mode 100644 index 0000000000..224c0c703b --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_092.txt @@ -0,0 +1,27 @@ + + + ○●●◉●○●●●●◉·●○ + ○●· ● ·● ● ○◉◉·◉ ●○● + ○◉ ·◉●●●● ○●●●·· ●●●◉○○● + ◉●●◉◉●○ ●●● ○◉○●●·●○ + ··◉ ● ·◉ ·◉ ●○○ + ··○○○●● ●○◉ ●●·· + ◉● ●·◉·● ◉·●○ ○◉○· + ○·◉●··◉· ·◉●●○ ·◉○ + ···· ·○● ·●●●○·○ ··· + ··· ●·· ·●◉●○ ◉·· + ○····○· ◉◉○· ··◉ + ○··○··· ◉◉◉◉●◉ ·● + ···◉··· ◉○◉◉◉◉◉○ ○○●●●●·◉ ◉ ·● + ····●○◉ ◉◉◉◉◉·● ●○● ●· · ●··○ + ●···○··●○ ●●· ○ ●·●◉●◉·● ·○●·· + ●○···◉◉ · ●○●· · ● ·· + ●●○○●●○ · ●● ·○○◉ + ●·○○○●○○ · ·○◉●·◉ + ●·○○○○·○○●● ○◉●●○◉◉●◉ + ○○ ●··●·●●○○○○●●●●·●●●●● + ○○○○·○●◉ ·●●●●●●●●·○● + ●●○·●●●·●○○○○○●● + ·● ·· ● · + + diff --git a/codex-rs/tui/frames/dots/frame_096.txt b/codex-rs/tui/frames/dots/frame_096.txt new file mode 100644 index 0000000000..aa4cedcdb5 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_096.txt @@ -0,0 +1,27 @@ + + + ○○●·●●●●●●·○○ + ○● ○●··● · ○◉●◉ · ●●●○ + ○◉○◉◉●●● ·○◉●●●·· ●●◉○●●○○ + ◉ ●●·· ○●●●●◉●○ + · ◉·◉◉ ● ◉●●○ + ·◉◉◉·◉● ●●○ ●○○ + ●◉◉◉·●◉ ◉◉ ○○ ●●○· + ◉◉●◉·○● ··◉ · · ·◉● + ●○ ●●· ·●·◉· ○ ··· + ○···○·○ ○○○○·○● ··◉ + · · ◉·· ● ○●···◉ ◉···· + ··· ··· ·◉◉·◉ ◉○● ·◉···· + ●······ ·◉●● ◉● ○●●●●◉◉○ ○ ·●◉· + ●····●● ·●●●·◉●◉ ·○● ·● · ○·◉ + · ····· ●◉◉ ●· ○·●●●◉● · ◉◉·● + ○·○ ●●● ·○● ◉●●···· + ●○○· ◉◉○ ●◉●●·●○◉ + ○·○●·○·○●◉ ○◉ ◉●●·◉ + ●○○○●·○◉ ●●◉ ○● ·●●◉◉ + ○○ ○●·○○ ●●◉○○○○●●●◉○●·◉ ·· + ○○ ○●●·◉●·●●●●●●●●● ○● + ●●○○◉○·●○○○○○○◉●●· + · ··· ● · + + diff --git a/codex-rs/tui/frames/dots/frame_100.txt b/codex-rs/tui/frames/dots/frame_100.txt new file mode 100644 index 0000000000..9aa9c4aa4a --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_100.txt @@ -0,0 +1,27 @@ + + + ◉○○●◉●●●●●●●○○ + ●●·●○◉●●·◉● ·●◉·· ●●●○ + ○●○○◉●●◉◉◉○●●●●○··●●●◉○· ●● + ◉ ◉◉◉◉◉ ·●●○◉◉●● + ○·●○●●●●○ ○ ●●◉● + ○···◉◉● ●◉○ ◉○●· + ·◉○◉◉○◉ ◉· ·○ ◉○○●· + ◉◉◉··◉· ●·○○·○· ·○●·○ + · ◉●●· ●○●·●◉ ○ ··· + ····●·· ●·○ ●○◉● ·●·● + · ··○● ●· ○◉○ ○● ··○· + ·· ○○○· ◉○○●◉ ○· ·· · + · · ··○ ·○○●◉·○◉ ○○○○○●●◉●◉○○ ○·◉·· + ●○ ··· ··●●●·●◉ ··◉● ●·○···· ··●· + ·◉●·○◉○○ ·●◉· ○● ·●·●○◉●●○ ◉·○○◉ + ●○···●○ · ·○●● ●● ○◉◉●· + ○····○· ·○ ◉ ●●··◉ + ○◉●○··○○●● ◉·○●○○ ◉◉◉ + ● ● ··◉ ·○ ○◉● ○●●·● + ●○ ●●·●○ ··◉●○○●●●●●·○●●●·◉◉ + ●●○●●·◉○ ●·●●●●●●●● ●●●· + ·●◉○● ●●○◉○○○○○●●●● + · · ●● · + + diff --git a/codex-rs/tui/frames/dots/frame_104.txt b/codex-rs/tui/frames/dots/frame_104.txt new file mode 100644 index 0000000000..e252956d84 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_104.txt @@ -0,0 +1,27 @@ + + + ○◉◉◉●○●●●●●●●○○ + ○● ●·◉●●· ●●●● + ●●○◉●●● ○●○●●●○··●●●◉●··●●○ + ●●◉◉◉○◉ ○●● ◉○●·●○ ○○ + ◉ ◉●●● ●◉ ●·◉◉○○●○ + ● ◉●●◉ ◉ ◉◉○○ ○ ·●◉○ + ·●◉··◉●· ◉◉ ●●○ ●○ ·◉◉○ + ·○○○◉●◉◉· ○○●·○○○· · ○◉○● + ·◉·○·○○ ●·○ ●· · ○ ··○● + ·●····●· ● ··●◉·○· ·◉ ● + ·● ·· · ·○◉ ·● ◉· ·· · + ···◉·· · ○●●◉◉· ◉ ·◉··●· + ○● ···●· ●●◉◉·●◉·· ○●●○●●●◉◉● ○···●· + ○· ●◉ ● ◉·●·◉ ○· ●◉○● ●·○ · ◉●·○·· + ○ ····●· ●●◉··○ ·●●··◉◉●●● ····· + ●·○○○○· · ●◉ ○○·○· + ○○○◉○·●○·○ ○◉·◉●◉●● + ●◉ ··○● ·● ○◉●○●◉··● + ○ ●●·◉○ ·●○ ○● ○◉○●●◉· + ●◉ ●●●◉○ ·●●●●●○●●●●●·○◉●●·●●● + ●○○●○●○○ ●·●●●●● ●●·●·◉ + · ●·●●●○○○○○○●○●● + · · ●● · + + diff --git a/codex-rs/tui/frames/dots/frame_108.txt b/codex-rs/tui/frames/dots/frame_108.txt new file mode 100644 index 0000000000..ad8bb9fdc1 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_108.txt @@ -0,0 +1,27 @@ + + + ○◉○◉◉●●●●●●●●●○○ + ●◉·●●●● ●●○ + ○◉●●·●◉◉◉◉○●●●·····●●●●○○◉●●● + ○◉●◉◉ ○·●◉● ○● ●●··●● + ◉·◉●●··●· ●◉○●●◉·○ + ··◉·●●●·· ●●·○ ● ·○○○● + ·○◉·●●○· ○◉◉◉·● ·○○○·○●● + ◉●·○○◉ · ●·◉○●○○ ○○ ○○·○ + ·····◉· ●·◉○··● ●●○●○· + ··○··◉◉ ◉●·○●○○● ··◉ ··· + ●●···◉· · ··●◉·· ◉ ·◉○● + ····○· ◉○●●●●●· ◉◉·○ · + ○ ◉··● · ○● ◉◉◉◉◉◉ ●●○○●●●●●●◉●●● ·◉··○· + ●○ ···○· ●○●◉◉ ◉ ●··○● ●●○ ○●● ●···· + ·●○○·◉ ·· ●·◉●◉ ○○●●··○○●● ·· ◉ + ·●·●◉●●○◉ ●○◉◉·◉·● + ●○●·◉·○●○○ ·◉●○◉◉·●· + ●● ···● ·● ○●○◉◉◉○◉· + ○○○●·○● ·●○ ◉●○·●·●○● + ●○●·●●○ ○●●●●●○○●○●●●·○◉●·●·○◉· + ●● ●··○○ ●· ●●●● ●●·○○●● + ● ◉●●··●◉○○○○○○◉●●● + · ●● · + + diff --git a/codex-rs/tui/frames/dots/frame_112.txt b/codex-rs/tui/frames/dots/frame_112.txt new file mode 100644 index 0000000000..d7b6fa07f7 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_112.txt @@ -0,0 +1,27 @@ + + + ○○○◉◉●●●●●●●●●○○ + ○◉●●◉·● ◉○● ●●○ + ●●●·●◉● ●○●●◉●●○···●●●●●○ ●●○ + ● ◉● ● ◉◉●●·○ ● ●●◉● ○○ + ●●··●● ●· ●● ●●●●○ + ◉◉◉··● ◉ ◉●●●○ ○◉ ○○ · + ◉○◉◉●●○·· ○○·○●●· ●○ ○· · + ●◉·○○●●· ·○○◉●●◉○ ●○ ○· · + ·····●◉· ●○○●○○○ ○◉ ··●● + ○··●··◉· ○●·○ ○ ● · ··○· + ·○ · ○ ●○◉○ ◉ ·●○·◉· + ···○· ○ ○●○●◉ ◉● ●◉···· + ●· ○·○ · ◉·●·○ ○·· ●○○○●○○●●◉●●●○ ○ ··○· + ● ··· · ○◉◉◉●· ◉● ○··◉●● ●●● ○·●·●·○·○●· + ○● ○●◉ · ·· ◉◉ ●◉○●·●●○○●●●●◉··◉·◉· + ○●·◉· ●○ ◉○○○●○◉ + ○●··○○○●○ ○◉·◉●◉ ◉ + ○◉···○●○○○ ○●●●●◉·●● + ●● ··◉● ○●●○○ ○●● ·●◉·○◉· + ●●○●·○●◉●·●●●●●○○●○●●●·○●●·● ○● + ●○··○○ ○ ●· ◉●●● ●● ●○●●· + ··◉●●●·●●●○○○○○○◉●●●●· + · ● ●● · + + diff --git a/codex-rs/tui/frames/hash/frame_000.txt b/codex-rs/tui/frames/hash/frame_000.txt new file mode 100644 index 0000000000..57f25436e2 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_000.txt @@ -0,0 +1,27 @@ + + + ----*##########-- + #-*.A*█#*----A..--█*-**#- + -A.**█*-#-.#*..**#.█***##- █#- + #*.A#*-##A** -..█*#*- *# + -*.A#*-AA #█*.#-*# + #..AA█A. #*#..-** + AA.A█ .* .█**** -**.#-. + #A..*█.- **-█.A.. -**-.#-. + **..*.* .*****-A. *#*.-*# + .*█.--.. **.*-A..-. ..-.. . + A.*. *. #-AA *.A █...A. + █ ** A. █-A..█ ** *.... + .-.. A #.AA█ A.- -**#*########## .AA. . + *.* .# -A..*█ A*- A..*-******███ .**.*. + *..*A .* *.A- -.- █.█------ . ..█.- + **..--.# *##** #A-AA█AA + ***. **- ****A-AA + *...# *.*- -.-#.*-.█ + █#**.# *#*# A-#*.*#*-** + █.*..# -*#***.#--#####**.#.#*█-#*- + *█**#*#..**.A█***..*#*█ -#*█ + **#*.#..*------##***- + --██*████- + + diff --git a/codex-rs/tui/frames/hash/frame_004.txt b/codex-rs/tui/frames/hash/frame_004.txt new file mode 100644 index 0000000000..2e9dc0222e --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_004.txt @@ -0,0 +1,27 @@ + + + ----*##########-- + #-A.A*█#*█-#-... ██*-█*#- + -A..*.*-*-.#*..**..█***#*- █#- + #.*A#*-#.A*█ #█***- *# + -*.A#█-*A* █#█*.#-*# + #..AA-A. *A..-** + A..*█ .* **█-*** ***.#█. + #A..*-.- **---A*- A*█..-. + **..A.* -...**** -█#*..*# + .*█.- . #-.**-A.█ .-.. . + *.A.█-. #-A.█ A#. *...█. + █ *A *.# -A..█ -**- .. . + .-..██** *.AAA *A-- -**#*##*####### # A. . + *.# .- A..*██A* * .-**█***█████* .**.-. + *█.*-█.# *.A█ -.█ .#**##-...***## AAA.-.- + ***.#-.- *##* - #A-A.█AA + #**.-█*#- -***A█AA + *-..#.*A*- -A*#.*-.█ + █#*..- *#*# --#*.*#.-** + █.*..# █*#**..#--#####*..*.#*█-#*- + -█**#*-A..*#.█***.#*#*██-#*█ + █*#..##**------##***- + --██*████- + + diff --git a/codex-rs/tui/frames/hash/frame_008.txt b/codex-rs/tui/frames/hash/frame_008.txt new file mode 100644 index 0000000000..b8eec636f9 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_008.txt @@ -0,0 +1,27 @@ + + + ----*##########-- + --A.**█.*--#-... -█*.█*#- + -A..*#*-.*##*.***..█***#*- █*# + #..*.█--#.*█A #█***- *# + #*.AA-#.* █#-*.#█*# + A..#█-.* ##-# █--..-** + A.A###.█ *-█#**A **.#-* + A.A. #. *.██*█#* *-.*-. + ...* ..- █..*.#*- █**.#.. + ..-. ..█ *- .*.*█# -.. . + ..-. .█ █#..* A.. ...-. + #.A* *# -*..- -.- - .....- + **.. .. AAA*- .A A-#*#*##*####### -*.. . + █.-. █A. -..A-A-.█ .-..*******█████ .-*.-. + .-.* **- -█*A. #* *-*.##....****# #*..-A█ + -..* **- -###█ A█AA*#A + A..* *..- -A**A█#* + .*..- **#- -A.##*-.* + - **#- *.*##-A. --#*.*#.-** + █.*.*A **.**..#--#####**.#.#*█--*- + -..*#--..**#A..*...***██-.#█ + █-#...#*-------##***- + --███████- + + diff --git a/codex-rs/tui/frames/hash/frame_012.txt b/codex-rs/tui/frames/hash/frame_012.txt new file mode 100644 index 0000000000..f78229c6a1 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_012.txt @@ -0,0 +1,27 @@ + + + ---*#######*##- + -#A.**#*█--##- *.-█*.**#- + -#.A.*-#-*#*..***##******#-*█*# + #A#.*-*.*.*█A #.*#-# █#- + -.A.█***#█.. *.*.- █* + A..-█.A* ###- .#. **- + A..A-..- **-#*#*A █**.--*# + A..A-.*A -**.---*- *A.#-*- + ..*-..█- -#*..**█*- *█. *. + ..* #.█ ***...#*- █..A A# + *.. .. *A*-- *. ... .. + ... ..█ #..* -*A- ...... + #*. ..# A-A.A█.#A█ ##***########## ... .. + .- .A ..A*-#.* - ..A***█****█████-. *.*. . + ... *A. *.. #A--█ -***####A....****--A..-A█ + ..* *A* *##* -AAAA*. + -.* █#*# A.*A█A. + *..# *#*#- -#.AA█-A* + █...- *#**#-- -**.*A.A*A- + -█..- *#.*..##-*######*....*---*- + **#-.- █***......##**- -#*█ + █*█*##*--------#**#*- + -██*████- + + diff --git a/codex-rs/tui/frames/hash/frame_016.txt b/codex-rs/tui/frames/hash/frame_016.txt new file mode 100644 index 0000000000..012bf5961b --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_016.txt @@ -0,0 +1,27 @@ + + + ---###########- + #-A*.**█--A.-##-█*.█*##- + .*A*█--*##*..#**##...A*--█#**# + -A#*-#*#*#*█. -*#.*#-.-**- + A#*A..*#* █*...**** + -..A*.* ### *..#█### + -...A.A█ ..█*-.# *.* *** + ...A. #.*A█#**- *.. *.* + .AA..A *..*.*-**- *.* #.# + .AA.. **...*█*-. █.. ..* + .-. .█. *.. A**.█ .. A- + .-- .█A **A.█.#██ █.█ A- + .A ... -A#*A..* ####**#####*### █.*-.. + #...A*# #.█A**#A. *A***███A████**#. -..#A. + █*# .*.- *#-A-** .*######..A....* A*█-*. + **# ***- *##*- -.*.A█*█ + **# *█.# #.#.*A.█ + █.*-█**.#- -#..*##.* + *.*-█*#..#--. -*A..*.-AA + *..#-█*...*.##**######*...** -#* + -**--- -**##......***█ -##A█ + █.**.*#--------#**#*█ + -██**███- + + diff --git a/codex-rs/tui/frames/hash/frame_020.txt b/codex-rs/tui/frames/hash/frame_020.txt new file mode 100644 index 0000000000..c6f8405af9 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_020.txt @@ -0,0 +1,27 @@ + + + ----#*#######--- + #-A.**█--**.#*-***#**#*.- + #**.█#-***.*##**##A*.##-█.**A. + ##---*A*#** .*.*-█#*#*- + #* -#**-█-█ █*.*█*-** + A- -.*A- ## **█#*A# + A #.-. A█*█. -** .*** + A- #.#█. .AA*#**- ** .*.# + -*#-.-A █.*.#*█.* .# *.* + . -... *.***#**- █. .*.. + ..█..- -*-.* *..█ ..-.A + .A█..*. #█A *A*A- .*█.. + *.█...- A.A-*.-A -*####********#- .*-.- + █#**.A*. -***A** #******███****.A *.A.. + .**.*█. *█A#A- .######..*..#.A -**.*# + .* .*A* -- -*AAAA + .*#*█#*-. #A-.*-A - + *.#█#*#*- -#*A..-A# + █.*-█**.*##-. -#A*-..*#██ + █*.# *#....*##########..*#*-**#█ + **#-- █**#####.AA**█- -#**-- + █**..##-------#####* + -██**██-- + + diff --git a/codex-rs/tui/frames/hash/frame_024.txt b/codex-rs/tui/frames/hash/frame_024.txt new file mode 100644 index 0000000000..d4de240b46 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_024.txt @@ -0,0 +1,27 @@ + + + -#-#*#####*--- + -.*.█- █ █*█-█*.**##*#- + -A█ -##*█*##**##**#-.█.█*#*# + A* #**-#**# *.**#*█#**.* + #* -A*█#- **#* ***-* + A *A-# *#-# *##***#. + . AA#- **-. **#█.**. + . .AA- ..█**# ..█.*A. + #- #. * -**-* **#*#.** + .A...A .A* █** █*. .-██ + .A..-# *. #** AA...* + .-.*-. █-* -*█ *..... + .A*A.# .A-██AA -*###***#*#**#- -█ .... + .#.*-. -.██-.* .*--**********.A* ..█.A.A + .A█#*-- *-#*- █###-##---###.. -.A#*█ █ + .-*#*█# A.*█A . + █.-*#*█* -█*-*█ # + .- *█#*#- AA##-.-A + *.-█.-***#-- -#*-#█*█-#- + *.--█-.*#..*##*---###**##A*A#*#█ + █*.#- █****.***.##*.**#*-.█- + -**#***------###.**██ + -██**██--- + + diff --git a/codex-rs/tui/frames/hash/frame_028.txt b/codex-rs/tui/frames/hash/frame_028.txt new file mode 100644 index 0000000000..f35141840a --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_028.txt @@ -0,0 +1,27 @@ + + + -#-.*#####*--- + #***- -**.#-.. + -**- -##*█..#***#*#- --*#-*# + -A█ -#*█#A .*# ***-*# + #██-A* #- *.# A*-*-* + .AAAA - #* *.#--*.#* + .█A.*A - █#**█ **█**.A* + A..A* - #*█*#* *#.-#*A. + .-*..A **-*- #█ . ..* + .█**. #**█#*█ -. █-. # + .*..-.█ . - A**- *█*█..A█ + . ...A ..██*█ * █.█.... + .. █..- *## #█.-#*###***##*#* #██*... + . .. . -*.A A- *AAA#--*AAA#-.# .#..A # + .-*A*█ **- ****.-------#█ *A-.* A + .**█-* -.█. # A + █.-*..** #.AA-█ #- + .#-**# -A*-A-A A- + *.-**..* - --#*..* █-* + *.*█.*..*.**#*-####...*-#A-.-A- + *.##....******.**█#--A.-.* + █*.##..*....*#*..█*█ + -██**██- - + + diff --git a/codex-rs/tui/frames/hash/frame_032.txt b/codex-rs/tui/frames/hash/frame_032.txt new file mode 100644 index 0000000000..8b7af6fb69 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_032.txt @@ -0,0 +1,27 @@ + + + -##*#**###**-. + -.A*█ █*.*-*#- + -**.-##*█*.#****## -***██# + -.**.**-#*.A .*# *** █# + #*-.*█ A* .# .*# *- + A*#.#.- - A.* *-#-.# + A*A.*.*- .*A* █A-█* .█.- + -.*A* A .**#* * # *** + .#*. █ *#**-*- *█-#.-*. + . .. . .*A█#*. -#*#.█-A + **..*█ -*.A█AA*. ...A█.. + A*..* █#A*█A.█ A ....* + ....█. -.--.- -##*.*#****# .#.*.. + .#A. * **-.A .-**#**-A**-A *█*..... + *..#. ####*-.*.-.# A... █ A + .A*A-█. -- **.AA█ A + .-*..A* A*-A.A #- + ..***-* -.█#A A.#- + **-***#*. #.*-A*#--A + *..##***.#*.*#####..*--A-- #█ + *....#.█*******█-.-#*--A- + -**.*------##***█.*█ + -███*██- - + + diff --git a/codex-rs/tui/frames/hash/frame_036.txt b/codex-rs/tui/frames/hash/frame_036.txt new file mode 100644 index 0000000000..3e6573e648 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_036.txt @@ -0,0 +1,27 @@ + + + -####*###*--. + --#*█-*.. ██*█*.##.*# + #.***#***█#***.# █.** █*- + -.*.A*--#█ *# #.--█* + #A#.*█ .- **## *- + #A#AA - * █*.*.*- + .#AA A-*-* * ***#-* + .-.. -*█A*-█# A-* #-*. + ..*- #█#A-** . *-█**A- + . .█ .█..#A*-*. * ..##.. + . *█ --*█#A**. . ... .. + .**- █.A A*█ . *...█. + .AA* . #*..█ .-######*#* *...-... + ..A.-# * A█ .*********** A .*-... + .*A. . *#####.*--.* .█.█...-- + █.*█. . ----- -A A#A . + *...* * #.-. A + *..**-** #* A█ #- + *..#.*-* -.*##-.█ A + *..#*A#.**#*-###..--**.- #█ + *#-█****.*.***-A-***-#* + █##*----*-***#*-.*- + ████-- █- + + diff --git a/codex-rs/tui/frames/hash/frame_040.txt b/codex-rs/tui/frames/hash/frame_040.txt new file mode 100644 index 0000000000..98fdd527ec --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_040.txt @@ -0,0 +1,27 @@ + + + -######*##--- + #**█-A**-**#..*#.*#- + #.█-#*#*█.**#*-██.#- -*- + A█A.█-**█ █*█* ** + .-*.- .█A.# -. + ..*. --#* #A*█ *. + **A. █**-.* █A█-**#* + ...- .** .- #█*#.. -- + -█.. *** *-* -.-..... + .... A.*#.**-# ██.*.A#* + A... *.*A*.-# .A...-.. + *A.. *-AA█ A - . ...... + .█.█ *A-A #--######## █-..-#.. + █AA# █A #*********.. . . ...* + ..A# -*###-.*-*.█ A*.█..... + .AA.#* - ----- . *#....█ + ..** *- .-.-A..A. + .**#-** -.-AA.█ . + ..#.*-* #*-█AA- -A + *-█#**#.*####-#*█##A*- #* + █#- █**....**-#*-*- #* + *#*-.#--##*A*-*#█ + -███-- - + + diff --git a/codex-rs/tui/frames/hash/frame_044.txt b/codex-rs/tui/frames/hash/frame_044.txt new file mode 100644 index 0000000000..20b89c305c --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_044.txt @@ -0,0 +1,27 @@ + + + -##*##-###--- + #A*-###*█#.*.* *#- + -..**#*█.*#*-***#A █# + #*A*A .#*- **# + #**A- **.*█ .# + A.█ --# *#*.* A# + .AA *.*# A-**█** + . . *.*A--# *# .. . + #*-. █.█A*-.- A-... . + ..* *-*.█.* .*A.A A + *.█ *..A*█. █...█... + A.█- A#A.. ....-... + ..A. -. A. --########█.....#.. + *.. . A.. *********#.. *.#... + .A#--#A A*#**.*#.A-#-..... A + ..#** -. -----█* .#.. █. + .A*-A# A*.█ ..*- + *A.*-** #*A# A A* + *A.-#█*# A*A#*A AA + *-*.##-*##--#*-AA-- *█ + █*-█*#**.**--#*.- #* + -*#---#.A***--#*- + -███- █- + + diff --git a/codex-rs/tui/frames/hash/frame_048.txt b/codex-rs/tui/frames/hash/frame_048.txt new file mode 100644 index 0000000000..def219f3ce --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_048.txt @@ -0,0 +1,27 @@ + + + #-*.###*### + #*.*#-█**.**█**# + A#.█*█.*#-***- ** + A.A*# *.*- .-. + ..-- .**- █-. + -*█ -#- *#.AA#** + .A...##█ A ** **- + * . █A* * .*█** . + ...- #...*# . .**... + ..* *.AA* █ ##*.#A*# + ... .**... .A..█A.. + ...- * *██ .*...... + ..A* .A --##### .*...... + ..█.A-# ******.* .█...... + A..*.- ##*.*#A█ .█... *- + .A█*. -█... ...-. + ***. . -█A*....-A + ..A#-*- .A# A..#. + █#..*█*-. -.#.#.█ A#- + █#*-#-**#-#A-# AA .- + █*-*#*.A*-**#*- -A + █#----#***- -A- + -█*----█- + + diff --git a/codex-rs/tui/frames/hash/frame_052.txt b/codex-rs/tui/frames/hash/frame_052.txt new file mode 100644 index 0000000000..eae803aa8f --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_052.txt @@ -0,0 +1,27 @@ + + + -.*###*-##- + A█##█**A* █-.# + .AA#█***#*#-█ ** + *.A█A █.AA ** + ..- A *.** *█- + ..*---- .*.██ .. + *█..-#*█ * █. █.A# + .. ...*. # .. -.* + AA. AA-.* ...A █. + ..█ ...*- .A#..*. + ..A *.A.* .A.*A- .A# + ..A .*A-██ -A-...A .. + .A .. ---####*-....... + .█ ** *****-..█-.....- + ..A . ***-.*..* .. . + A.. -A -█... .. █. + ..█. -*A█ .. -. + ...* ..#--..█# + ..** #.**.... A + *.**-**-*A-.* AA. + *-#.█A-A-.█ AA + *#--#█-A█.-.█ + █*█-███ + + diff --git a/codex-rs/tui/frames/hash/frame_056.txt b/codex-rs/tui/frames/hash/frame_056.txt new file mode 100644 index 0000000000..40bbbaefa7 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_056.txt @@ -0,0 +1,27 @@ + + + #*####-##- + A#-**A.A██.# + *.A***█.- █.# + #.*A.*.## █#█* + .*. --A*** █A* + .-#-█# ..*.█ *. + ...# . *.. -A..* + *A*A ..# -. . + █.█.#█ -.█-..A + *A**-*. ..*..#A. + .A.**#. ..A██.A. + .A*A*█. ..█- ... + *A*.---# ..A..█.. + **.█**.* ..A .. . + █*. A .......*. + ..*-## - A.... A. + ... .. * -.... . + -.█ - *... #A--- + .█- . . ***- .. + *.-**A*A#. ..-█ + **-██A** █A + #--A-* ** + █*-████ + + diff --git a/codex-rs/tui/frames/hash/frame_060.txt b/codex-rs/tui/frames/hash/frame_060.txt new file mode 100644 index 0000000000..3bea67cf19 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_060.txt @@ -0,0 +1,27 @@ + + + *###.*## + - *.A *█#* + A...A-█--* + AAA.*. █... + ...A.*# █.. + ..-.AA.*. *. + ...*..A. .. + ..██....-██ # + ..A..*A-...-. + ..... ... *-. + ..*#█ .██.█.. + ..--. . █.A.. + ..--.--.....* + ......... .* + ..-.█. ... .A + ..*........█. + .*AAA. . . + ..A..█*..█ + A...*.#*-.* + .**.*█ .*.. + * . *- #--* + **. *█-*.. + █*█-██- + + diff --git a/codex-rs/tui/frames/hash/frame_064.txt b/codex-rs/tui/frames/hash/frame_064.txt new file mode 100644 index 0000000000..747ee7ae13 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_064.txt @@ -0,0 +1,27 @@ + + + ######## + .*.█ ██*. + .-.█ .-A* + ...*--█.A + .AA.#█*.. + *█A --A-. + *A█.A**█. + -.-. ..*- + *.*-# .. + ...---..- + ...█#*█... + ....-A*A. + ......-..- + ......*-.- + .......... + ..A.....█. + ........-. + ........A. + ..*.*A#.-. + *.*..-█.*- + *.█. . . - + *A██ A*A + █*██*█- + + diff --git a/codex-rs/tui/frames/hash/frame_068.txt b/codex-rs/tui/frames/hash/frame_068.txt new file mode 100644 index 0000000000..82206e2200 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_068.txt @@ -0,0 +1,27 @@ + + + ###.###*# + *A█*A.* █ + .#-██-*.** + █.# # .*.-. + ... -*... . + █*.-.A*.* . + *..-..... . + A.....*... . + ......*..* . + .-....█A.* . + ..██.-.A.#A. + .#█.-███..A. + -. ... ...*. + - ...#...█. + -....█.*... + **... A-... + .A...-...A. + ..*A█..*A*. + .*.-##.#.-. + █*██ .██.-* + ..# ...... + .A- .#--- + -██████- + + diff --git a/codex-rs/tui/frames/hash/frame_072.txt b/codex-rs/tui/frames/hash/frame_072.txt new file mode 100644 index 0000000000..b95211b3ff --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_072.txt @@ -0,0 +1,27 @@ + + + ##.*#*#.# + A--.A.*A-.* + ..█ - A.-**** + #*- █....#█ A + ..A..*.█.██*.*# + .█.#....... *. + *..██*█.#. -..A + .....-...*█. -. + ........█... #A. + ....*A..A -*.... + ..█ *.A.A.#.AA.. + ..*.A--█*-**█**. + .....*█.AA*#**.. + ..... .*.....█.. + .. * ..█.█**.#.. + .█*█.█...**A*-. + .# █.█.* ...A* + ... *#*-#*.A.. + █.A*A# *..A..#. + ..# █ █*A-.█. + #* - *█.**AA + █A.. *-*-A + ███-███- + + diff --git a/codex-rs/tui/frames/hash/frame_076.txt b/codex-rs/tui/frames/hash/frame_076.txt new file mode 100644 index 0000000000..831da0fd1b --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_076.txt @@ -0,0 +1,27 @@ + + + -#***###.-- + *-A..-***-.** + ..A.█*A.*.█*#** + .A-.AA*.*A█*███.# + ##*.-█AA.. -█*A + .**AA -#A#- *.# + *.A*-#█..** -.. + ..*-A.. ...** A. + ..*#..--*--.. #*.. + *..... -.*# ..-. + .....A A.-.#.. .A*. + ...... *A- .*. █.*. + ..... A..***#*... + ..... A.*-#..-A.█ .. + ..... **..--*█A.#A.. + .... **..**--#.*.A. + .... *.A .█.*# + *..... █. AA**.█ + .*█*#..*A# #. .#* + █#*. ..**.A**.**█ + █.#. --█##*AA*A + █*#* █#-*--*█ + █--█-*█- + + diff --git a/codex-rs/tui/frames/hash/frame_080.txt b/codex-rs/tui/frames/hash/frame_080.txt new file mode 100644 index 0000000000..0583704823 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_080.txt @@ -0,0 +1,27 @@ + + + #**.-#**.-- + A** *█..*-#A.*# + .-█A#A#. #*█*#*#* + A█.. AA.#A--█- ██** + .█A..##.** .-.# + AA.#AA-*█ - *A + ..A**.#.# -*- -A.# + *.. ..*█*. **.* █.A + .*.██.-..- .*-#. .. + *...█.... *..* .A. + .....--.. AA A A*A. + ....█.-.. .-.- █... + .A..-█... A-█.* * .-... + ..... A.█ .*.█-. * --.*. + ..... *. *- A -.A A█..* + ..... *. .*A -...*. + .....█.. A...- + **..-A█.*- A** + *.# -.****- -.*- + **- **-***##*--.#*A + █.- ** **#A*-* + **- █#-*#--**- + -█----██- + + diff --git a/codex-rs/tui/frames/hash/frame_084.txt b/codex-rs/tui/frames/hash/frame_084.txt new file mode 100644 index 0000000000..64ffbd99db --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_084.txt @@ -0,0 +1,27 @@ + + + -#**-#*##### + -.* *█..*█-*.-**- + -.*--A AA-#**█*#█*.* + #A█# -*#*#*A -- *█*. + #A█# .A#..* █.. + .A-#A██A*# - █*# + ...A*.#..█ *-* A.* + .. A.--.# .#*-- █A.# + .*.A█..#█ *A-.* █.* + .....█*.. -*A# ... + .A..█*.*. # *.#- ..* + .█--█--.. .**#-. -.A + .█ -#.A.. *A-*-#**#**- --.A + .. --█.... AAA-A #.*█- .... + .█ *█..-. -A . -.*. **A█. + . ██*.* .A *..- + -* █*.-.#. #.#.#. + *.* █-█* * .A-**- + .. *█.* .- A█ █.*A + ** -█A.*-*---#*-A*.█A + *.- -*-*. █*##**█#█ + *#- █#-**----A* + -█----██- + + diff --git a/codex-rs/tui/frames/hash/frame_088.txt b/codex-rs/tui/frames/hash/frame_088.txt new file mode 100644 index 0000000000..6c1e74021c --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_088.txt @@ -0,0 +1,27 @@ + + + .#*.-*#**###- + #A- #*A.A*--***█*# + -A-. #*#*-#**..*.█.**# + A. █.AAAA**. █.#-█-.* + A-█-A*A█* *.--.* + A.AA#AA*- - ** █.. + -.*-█. #A .** * *.## + ..-AA██. .#*# - ██.. + ███ .-- *A-*.*- █*.A + .....**. A*A*█ █.... + .......A * -A.-. █...A + .-█..... A*.A--#█ ...* + .. ..... ..-*A.# #***- *..█ + █.█ *A. .AAA#AA **██.A ..... + . . ..- -..# ***#. .#* + *AA .█.█ *#- ..AA + .# *.-*#*# -*AA.*- + *A*█#█.#*# **.A**A + .**-#*.#** -A-#.#.A + .* **** *##--**-...*** + █.--█-█*. █**##**█-A- + █## -##*#*----#*- + ██--█*██- + + diff --git a/codex-rs/tui/frames/hash/frame_092.txt b/codex-rs/tui/frames/hash/frame_092.txt new file mode 100644 index 0000000000..67ff7a9d1b --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_092.txt @@ -0,0 +1,27 @@ + + + -##**-####*.#- + -#. #█.*█*█-*..*█**# + -A█-.#*█*█-#**..█*#*A-*# + A*#A**- *#* -.-**.#* + .-A #█-* .. *** + ..--*█# #-* █*.. + A*█*.A-# A.**█ -A*. + -.A#..*. .A#** █.A- + .-.. .-█ .##**-* ... + ... #.. .#A** A.. + *....-. .**-██ ..A + *..-... AAAA█A .*█ + ....... A-AAA.A- **###*.* -█.* + ....**A *AAAA.█ ***█*.█- #..- + *...*..#* ##. * *.****.# .**.. + *-...AA . **#- - █ .. + *#-*#**█. #* .**A + *.-**#** . .-A#.A + █.-*-*.*-*# -**█-AA*A + *- █#..#-*#----#**#.*#*#* + █*-*-.-#- -**###***--* + *#--##*.#-----##█ + -█ --█*██- + + diff --git a/codex-rs/tui/frames/hash/frame_096.txt b/codex-rs/tui/frames/hash/frame_096.txt new file mode 100644 index 0000000000..69c457e197 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_096.txt @@ -0,0 +1,27 @@ + + + --#.######.-- + -#█-#..*█.█-*#.█.█**#- + -A*AA#*█ --A***..█*#**#**- + A█ ##.- -#█***** + . A.AA # .*#* + .AAA.A█ ##-█ *** + ***A.#A AA█*- ***. + *A#*.*# ..A█. -█.A# + *-██*. .#... * ... + -...-.* ****.-█ ..A + .█.█A.. # *#...- ..... + ..-█... .A*-A A-█ .-.... + *...... .A## A█ *####*** -█.*A- + #....## .##*-*█A .-*██.*█ . *.A + . ..... #AA #- *.#***# .█AA.# + *.*█### .-#█ **█...- + ***. .A- █**█.#*A + *.**.*.-*. -A█*##.A + ***-#.** *#. -#█ .**AA + *- -*.*-█*#*----##**-#.A█.- + *- -**.-#-***###***█-#█ + █##--.-.#------*#*- + -█---█*██- + + diff --git a/codex-rs/tui/frames/hash/frame_100.txt b/codex-rs/tui/frames/hash/frame_100.txt new file mode 100644 index 0000000000..cc68e0119b --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_100.txt @@ -0,0 +1,27 @@ + + + .--#*#######-- + ##-#*A**-A*█-█.-.█**#- + -#--A#*AAA-##***..**#**.█*# + A█ AA*AA .#*-*.*# + -.#-#***- - *█A* + -.-.AA# #*- .*#. + .A*AA*A A.█.- .**#. + AAA..A- #.-*.-- --#.* + . A#*. **#-** * ... + .-..█.. *.*█**A█ .#.# + . █..** █. -A* -# ..-. + .-█*-*. A***A -. ..█. + . -█..- .*-█A--A *****##***-- *.A.. + █- ... .-##*.#A ..A*█*.*---. ..█- + .A█.*A-* .#A. -* █.#.***##* A.-** + █*...** . .*#█ ██ -AA#- + *....*. .- A█#*..A + **█*..*-*# ..-*--█AAA + █# *█..A█.- -**█-*#.#█ + *- **.#-█..*#--####*.-#*#.AA + *#-**.*- *.**##**#*██#*- + -*.-*█****-----###*█ + - -█**██- + + diff --git a/codex-rs/tui/frames/hash/frame_104.txt b/codex-rs/tui/frames/hash/frame_104.txt new file mode 100644 index 0000000000..ee4c28f421 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_104.txt @@ -0,0 +1,27 @@ + + + -.-*#*#######-- + -#█#.A**- █**## + #*-A#*█ -#*#***..**#*#..*#- + #*AAA--█-#* *-*.#*█*- + A *#*#█#A *...**** + *█A#█A A **-* * .█A* + .*A.-A█. A*█*#* █* .AA* + .-**A#AA- **#-***- - *A-# + .*.*.*- *.* *.█. * ..*# + .█....█. # ..#..-. .A█# + █.*█.. . --A .* A. █ .. . + ..-A.. . -*#A*- A█ ....█. + *█ ...█. #*AA.█A.- *##*###**# *...#. + --█*A # A-#.A -. #A-*█*.*█-█ A#.*.- + * ....#. *#A.-- .*#..**### -.... + █.-***.█. #A -*.-- + *-*A*.#-.- -A-A█A*█ + **█..*# .# -**-#A..█ + █* **.*-█.#- -#█-A-#*A- + ** ****-█.*####-####*.-**#.##* + █#--**#-- █*.*****█#*.*.A█ + █. █*.*##------#-#*█ + - -██**██- + + diff --git a/codex-rs/tui/frames/hash/frame_108.txt b/codex-rs/tui/frames/hash/frame_108.txt new file mode 100644 index 0000000000..78d78874f9 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_108.txt @@ -0,0 +1,27 @@ + + + -.-**#########-- + #*.##**█ █##- + -A*#.**AA.-##*.....**##*-***# + -A*AA█*-#** -#█##..*# + A-*#*.-#. *.***A.- + ..A.#*█.. ##.* # .***# + .*A.#**. **A..* -*-*.**# + A*.**A█. *.*-**- *-█**.- + .....A. █.*-..# ██*#-. + ..*..A. .*.***** -.. ... + **.-.A. . ..#... A .A-# + █-.-.-. A*##*█#. A..* . + * ...# . -* AAAAAA ##**######*### .*..-- + █- ...-. ***AA█A█ #..-*█***█-█*█ █.... + .#-*.A .- #.A#A **##..**## .. A + .█.#A#**. #-AA.A.█ + █**.A.-█*- -**-AA.#- + █#█...# .# -*-A***A- + *--*.*#█.#- A*-.*.#** + █#-*.*#-█***###--#*##*.-**.*--A- + *#█*..--██*.█****██#*.--#* + *█A*#..#*------*##*█ + - ███**██- + + diff --git a/codex-rs/tui/frames/hash/frame_112.txt b/codex-rs/tui/frames/hash/frame_112.txt new file mode 100644 index 0000000000..64854858e5 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_112.txt @@ -0,0 +1,27 @@ + + + ---**#########-- + -.*#A.*█--██ █*#- + #*#.**#█#-##A***...**###- *#- + #█.#█#█**#*.- #█*#*#█*- + #*..*#█#. *#█*##** + AAA.-* A *###- ** █**█. + A*AA#*-.- -*-***- ** *. . + #A.***█. █.**A##A- ** *. . + .....█A- **-█**-█ *. ..█# + -..█.-.. -*.-█-█#█ . ..-. + .*█ . * █#-A- A .#*.A. + .-.-. - -*-*A A* █A.... + █- *.- . A.#.- -.- #***#**##*###- *█..-. + # ...█. -AAA#- ** -..***█***█-.*.#.-.*█. + *#█*#A█. ..█AA█ **-#.##**###*A-.*.A- + *█.A. █* A*-**-A + **..*--#- -A-A#A A + *A...-#-*- -#*#*A.#* + *#█..*#█*##-- -#*█.*A.-A- + *#-*.*#.*.**###--#*##*.-#*.#█-#█ + █#-..*- - █*.█A***██#*██-#*- + --.**#.###------*##**- + - ██**███- + + diff --git a/codex-rs/tui/frames/hbars/frame_000.txt b/codex-rs/tui/frames/hbars/frame_000.txt new file mode 100644 index 0000000000..ef3f8fafd2 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_000.txt @@ -0,0 +1,27 @@ + + + ▂▂▂▂▄▇▇▇▇▇▇▇▇▇▆▂▂ + ▆▂▇▁▅▇█▇▇▂▂▂▂▅▅▅▂▂█▇▂▇▇▇▂ + ▂▅▁▃▇█▇▂▆▂▁▇▇▁▁▇▄▇▁█▇▇▇▇▆▂ █▇▂ + ▆▇▁▅▆▇▂▇▆▅▇▇ ▆▁▁█▇▇▄▂ ▇▆ + ▂▇▁▅▆▇▂▅▅ ▇█▇▁▆▃▇▆ + ▆▁▁▅▅█▅▁ ▆▃▆▁▁▂▃▃ + ▅▅▁▅█ ▁▇ ▁█▃▃▃▇ ▃▄▃▁▆▃▁ + ▆▅▁▁▇█▁▂ ▇▃▂█▁▅▁▁ ▂▇▃▃▁▆▃▁ + ▇▇▁▁▃▁▇ ▁▇▄▃▃▃▂▅▁ ▇▆▇▁▂▃▆ + ▁▃█▁▂▂▁▁ ▇▃▁▇▃▅▁▁▃▅ ▅▁▂▁▁ ▁ + ▅▁▄▁ ▃▁ ▇▂▅▅ ▇▁▅ █▁▁▁▅▁ + █ ▃▃ ▅▁ █▂▅▁▁█ ▄▇ ▃▁▁▁▁ + ▁▂▁▁ ▅ ▆▁▅▅█ ▅▁▂ ▂▄▄▇▄▇▇▇▇▇▇▇▇▇▆ ▁▅▅▁ ▁ + ▇▁▄ ▁▆ ▂▅▁▁▇█ ▅▇▂ ▅▁▁▄▃▇▇▇▇▇▇███ ▁▄▃▁▃▁ + ▃▅▁▃▅ ▁▃ ▇▁▅▂ ▂▁▂ █▁█▆▆▆▆▆▆ ▁ ▁▁█▁▂ + ▃▃▁▁▂▃▁▆ ▇▇▇▇▄ ▆▅▂▅▅█▅▅ + ▃▃▃▁ ▃▄▂ ▄▇▄▇▅▂▅▅ + ▃▁▁▁▆ ▇▁▃▂ ▂▁▂▇▁▇▂▁█ + █▆▇▇▁▆ ▇▆▇▇ ▅▂▇▇▁▇▇▇▆▄▇ + █▁▇▁▁▇ ▂▃▆▇▇▃▁▇▂▂▆▆▆▇▇▇▇▁▇▁▇▇█▂▆▇▂ + ▇█▇▇▇▄▆▁▁▇▄▁▅█▇▇▄▁▁▄▇▇█ ▂▇▇█ + ▇▇▇▄▁▇▁▁▄▂▂▂▂▂▂▆▇▄▇▇▂ + ▂▂██▇████▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_004.txt b/codex-rs/tui/frames/hbars/frame_004.txt new file mode 100644 index 0000000000..adef89cb4f --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_004.txt @@ -0,0 +1,27 @@ + + + ▂▂▂▂▄▇▇▇▇▇▇▇▇▇▆▂▂ + ▆▂▅▁▅▇█▇▇█▂▆▂▅▅▅ ██▇▂█▇▇▂ + ▂▅▁▁▇▁▇▂▄▂▁▇▇▁▁▇▄▁▁█▇▇▇▇▄▂ █▇▂ + ▆▁▇▅▆▇▂▇▁▅▇█ ▇█▇▃▄▂ ▇▆ + ▂▇▁▅▆█▂▄▅▇ █▇█▇▁▆▃▇▆ + ▆▁▁▅▅▃▅▁ ▃▅▁▁▂▃▃ + ▅▁▁▇█ ▁▇ ▃▄█▂▃▃▇ ▇▄▇▁▆█▁ + ▆▅▁▁▇▂▁▂ ▇▃▂▃▃▅▃▆ ▅▃█▁▁▃▁ + ▇▇▁▁▅▁▇ ▂▁▁▁▃▃▃▃ ▂█▆▇▁▁▃▆ + ▁▇█▁▂ ▁ ▆▃▁▇▇▃▅▁█ ▁▂▁▁ ▁ + ▇▁▅▁█▂▁ ▇▂▅▁█ ▅▇▅ ▄▁▁▁█▁ + █ ▃▅ ▇▁▆ ▂▅▁▁█ ▆▄▇▂ ▁▁ ▁ + ▁▂▁▁██▇▃ ▄▁▅▅▅ ▄▅▂▂ ▂▄▄▇▄▇▇▄▇▇▇▇▇▇▆ ▆ ▅▁ ▁ + ▇▁▆ ▁▂ ▅▁▁▇██▅▇ ▇ ▁▃▇▇█▇▇▇█████▇ ▁▄▃▁▂▁ + ▃█▁▃▂█▁▆ ▇▁▅█ ▂▁█ ▅▆▇▄▇▇▂▁▁▁▄▄▄▇▇ ▅▅▅▁▂▁▂ + ▃▃▃▁▆▃▁▂ ▇▇▇▇ ▂ ▆▅▂▅▁█▅▅ + ▆▃▃▁▂█▃▇▂ ▂▇▄▇▅█▅▅ + ▃▃▁▁▆▅▇▅▃▂ ▂▅▄▇▁▇▂▁█ + █▆▇▁▁▂ ▇▆▇▇ ▂▂▇▇▁▇▇▁▂▄▇ + █▁▇▁▁▇ █▇▆▇▇▁▁▇▂▂▆▆▆▇▇▇▁▁▄▁▇▇█▂▆▇▂ + ▂█▇▇▇▄▂▅▁▁▄▇▁█▇▇▇▁▇▄▇▇██▂▇▇█ + █▇▇▁▁▇▇▄▄▂▂▂▂▂▂▆▇▄▇▇▂ + ▂▂██▇████▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_008.txt b/codex-rs/tui/frames/hbars/frame_008.txt new file mode 100644 index 0000000000..ddefe1c3a0 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_008.txt @@ -0,0 +1,27 @@ + + + ▂▂▂▂▄▇▇▇▇▇▇▇▇▇▆▂▂ + ▂▂▅▁▇▇█▁▇▂▂▆▂▅▅▅ ▂█▇▁█▇▇▂ + ▂▅▁▁▇▇▇▂▅▄▇▇▇▁▇▄▄▁▁█▇▇▃▇▄▂ █▃▆ + ▆▁▁▇▁█▂▂▇▁▇█▅ ▇█▇▃▄▂ ▇▆ + ▆▇▁▅▅▂▆▁▇ █▇▂▇▁▆█▇▆ + ▅▁▁▆█▂▁▇ ▆▆▂▆ █▃▂▁▁▂▃▃ + ▅▁▅▆▆▆▁█ ▇▂█▆▃▇▅ ▃▇▁▆▃▃ + ▅▁▅▁ ▆▁ ▃▁██▃█▆▇ ▃▃▁▄▃▁ + ▁▁▁▃ ▁▁▂ █▁▁▄▁▆▃▂ █▃▇▁▆▁▁ + ▁▁▂▁ ▁▁█ ▇▂ ▁▃▁▃█▆ ▂▁▁ ▁ + ▁▁▂▁ ▁█ █▇▁▁▄ ▅▁▅ ▁▁▁▃▁ + ▆▁▅▄ ▃▇ ▂▇▁▁▂ ▂▁▃ ▂ ▁▁▁▁▁▂ + ▇▇▁▁ ▁▁ ▅▅▅▇▂ ▁▅ ▅▂▇▄▇▄▇▇▄▇▇▇▇▇▇▆ ▂▇▁▁ ▁ + █▁▃▁ █▅▁ ▂▁▁▅▂▅▂▁█ ▅▃▁▁▇▇▇▇▇▇▃█████ ▁▂▃▁▂▁ + ▁▃▁▃ ▃▃▂ ▃█▇▅▅ ▆▇ ▃▂▇▁▇▇▁▁▁▁▄▄▄▄▇ ▆▇▁▁▂▅█ + ▂▁▁▄ ▃▃▂ ▃▇▇▇█ ▅█▅▅▇▆▅ + ▅▁▁▃ ▇▁▁▂ ▂▅▄▇▅█▆▇ + ▅▇▁▁▂ ▃▇▇▂ ▂▅▁▇▆▇▂▁▇ + ▃ ▃▃▇▂ ▃▁▇▇▆▂▅▁ ▂▂▇▇▁▇▇▁▂▄▇ + █▁▇▁▇▅ ▇▇▁▇▇▁▁▇▂▂▆▆▆▇▇▇▇▁▇▁▇▇█▂▂▇▂ + ▂▁▁▇▆▂▂▁▁▇▄▆▅▁▁▇▁▁▁▄▇▇██▂▁▇█ + █▃▇▁▁▁▇▄▂▂▂▂▂▂▂▆▇▄▇▇▂ + ▂▂███████▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_012.txt b/codex-rs/tui/frames/hbars/frame_012.txt new file mode 100644 index 0000000000..aca329e85e --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_012.txt @@ -0,0 +1,27 @@ + + + ▂▂▂▄▇▇▇▇▇▇▇▄▆▆▂ + ▂▆▅▁▇▇▇▇█▂▂▆▆▂ ▄▁▂█▇▁▇▇▇▂ + ▂▇▁▅▁▇▂▆▂▄▇▇▁▁▇▄▄▇▇▇▇▇▃▃▄▆▂▇█▇▆ + ▆▅▇▁▇▂▃▁▇▁▇█▅ ▇▁▇▇▂▆ █▇▂ + ▂▁▅▁█▄▄▇▇█▅▅ ▇▁▇▁▂ █▃ + ▅▁▁▃█▁▅▇ ▆▆▆▂ ▁▇▁ ▃▃▂ + ▅▁▁▅▂▁▁▂ ▄▃▂▆▇▆▇▅ █▃▇▁▂▃▇▆ + ▅▁▁▅▂▁▇▅ ▃▇▃▁▃▃▂▃▂ ▇▅▁▆▃▃▂ + ▁▁▇▂▁▁█▂ ▃▆▃▁▁▃▃█▃▃ ▃█▁ ▃▁ + ▁▁▇ ▇▁█ ▃▃▇▁▁▁▆▇▂ █▁▁▅ ▅▆ + ▃▁▁ ▁▁ ▇▅▃▂▂ ▄▁ ▁▁▁ ▁▁ + ▁▁▁ ▁▁█ ▆▁▁▇ ▂▇▅▃ ▁▁▁▁▁▁ + ▆▇▁ ▁▁▆ ▅▂▅▁▅█▁▇▅█ ▆▇▄▄▄▇▇▇▇▇▇▇▇▇▆ ▁▁▁ ▁▁ + ▁▂ ▁▅ ▁▁▅▇▂▆▁▇ ▂ ▁▁▅▇▇▇█▇▇▇▇█████▃▁ ▃▁▇▁ ▁ + ▁▁▁ ▇▅▁ ▇▁▁ ▆▅▂▂█ ▂▃▇▄▇▇▇▇▅▁▁▁▁▄▄▄▇▂▂▅▁▁▆▅█ + ▁▁▃ ▇▅▃ ▇▇▇▇ ▂▅▅▅▅▄▁ + ▃▁▃ █▆▇▆ ▅▁▇▅█▅▁ + ▃▁▁▆ ▇▆▇▇▂ ▂▆▁▅▅█▂▅▇ + █▁▁▁▂ ▇▇▇▇▇▂▂ ▂▄▇▁▃▅▁▅▄▅▂ + ▂█▁▁▂ ▇▇▁▇▁▁▇▇▂▄▆▆▆▇▇▇▇▁▁▁▁▇▂▂▂▇▂ + ▇▇▇▂▅▂ █▇▇▄▁▁▁▁▁▁▇▇▇▇▂ ▂▇▇█ + █▇█▇▇▆▄▂▂▂▂▂▂▂▂▆▄▄▇▇▂ + ▂██▇████▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_016.txt b/codex-rs/tui/frames/hbars/frame_016.txt new file mode 100644 index 0000000000..ccd0326c12 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_016.txt @@ -0,0 +1,27 @@ + + + ▂▂▂▆▇▇▇▇▇▇▇▇▆▆▂ + ▆▂▅▇▁▇▇█▂▂▅▁▂▆▆▂█▇▁█▇▇▆▂ + ▅▄▅▇█▂▂▄▇▇▇▁▁▇▄▄▇▇▁▁▁▅▃▂▂█▇▇▃▆ + ▂▅▇▇▂▆▄▇▇▇▇█▁ ▂▇▇▁▃▇▂▁▆▇▃▂ + ▅▇▇▅▁▁▇▇▇ █▇▁▁▁▄▃▇▄ + ▂▁▁▅▄▁▇ ▆▆▆ ▇▁▁▆█▆▇▆ + ▂▁▁▁▅▁▅█ ▁▁█▃▂▁▆ ▃▁▄ ▃▃▃ + ▁▁▁▅▁ ▇▁▃▅█▆▇▃▂ ▇▁▁ ▄▁▃ + ▁▅▅▁▁▅ ▇▁▁▃▁▃▂▇▃▂ ▇▁▄ ▆▁▆ + ▁▅▅▁▁ ▃▃▁▁▁▃█▃▂▅ █▁▁ ▁▁▇ + ▁▂▁ ▁█▁ ▇▁▁ ▅▇▄▁█ ▁▁ ▅▃ + ▁▂▃ ▁█▅ ▄▇▅▅█▁▆██ █▁█ ▅▃ + ▁▅ ▁▁▁ ▂▅▆▇▅▁▁▇ ▆▇▇▇▄▄▇▇▇▇▇▄▇▇▆ █▁▇▂▁▁ + ▇▁▅▁▅▃▆ ▆▁█▅▄▃▇▅▁ ▇▅▇▇▇███▅████▇▇▇▁ ▂▁▁▆▅▁ + █▃▆ ▁▃▁▃ ▇▆▃▅▃▄▇ ▁▃▇▇▇▇▇▇▁▁▅▁▁▁▁▇ ▅▃█▂▃▁ + ▃▃▆ ▃▃▇▂ ▇▇▇▇▂ ▂▁▃▁▅█▇█ + ▇▃▇ ▃█▁▇ ▆▁▆▁▇▅▁█ + █▁▄▂█▃▇▁▇▂ ▂▆▁▁▇▆▆▁▇ + ▇▁▄▂█▃▆▁▁▇▂▂▅ ▂▄▅▁▁▇▁▂▅▅ + ▇▁▁▆▂█▇▁▁▁▇▁▇▇▄▄▆▆▆▆▇▇▇▁▁▁▇▇ ▂▇▇ + ▂▇▇▂▂▂ ▂▇▇▇▇▁▁▁▁▁▁▇▇▇█ ▂▆▇▅█ + █▁▇▄▁▄▆▂▂▂▂▂▂▂▂▆▄▄▇▇█ + ▂██▇▇███▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_020.txt b/codex-rs/tui/frames/hbars/frame_020.txt new file mode 100644 index 0000000000..b3639b48c7 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_020.txt @@ -0,0 +1,27 @@ + + + ▂▂▂▂▇▄▇▇▇▇▇▇▆▂▂▂ + ▆▂▅▁▇▇█▂▂▃▄▅▆▃▂▇▇▇▇▇▇▇▄▅▂ + ▆▄▇▁█▆▂▄▄▇▁▄▇▇▄▄▇▇▅▇▁▇▇▂█▁▇▃▅▁ + ▆▇▂▂▂▄▅▇▆▇▇ ▅▃▁▃▂█▇▇▇▇▂ + ▆▇ ▆▆▇▇▆█▂█ █▇▁▃█▃▃▃▇ + ▅▂ ▂▁▇▅▃ ▆▆ ▃▄█▆▃▅▆ + ▅ ▆▁▂▁ ▅█▃█▁ ▂▃▃ ▁▇▃▃ + ▅▂ ▆▁▆█▁ ▁▅▅▇▆▃▃▂ ▃▃ ▁▃▁▆ + ▂▇▆▂▁▂▅ █▁▃▁▆▃█▁▃ ▁▆ ▄▁▇ + ▁ ▂▁▁▁ ▇▁▄▇▇▆▃▃▂ █▁ ▁▇▁▁ + ▁▁█▁▁▃ ▂▃▂▁▇ ▄▁▁█ ▁▁▃▁▅ + ▁▅█▁▁▃▅ ▆█▅ ▄▅▇▅▂ ▁▃█▁▁ + ▃▁█▁▁▁▂ ▅▅▅▂▄▁▂▅ ▂▄▇▇▇▇▄▄▄▄▄▄▄▄▆▂ ▁▃▃▁▂ + █▆▃▃▁▅▃▅ ▂▇▇▇▅▇▇ ▆▇▇▇▇▇▇███▇▇▇▇▁▅ ▃▁▅▁▁ + ▁▃▃▁▃█▁ ▃█▅▆▅▂ ▁▇▇▇▇▇▇▁▁▃▁▁▇▁▅ ▂▃▃▁▃▆ + ▁▃ ▁▃▅▃ ▂▂ ▂▇▅▅▅▅ + ▁▃▆▃█▆▇▂▁ ▆▅▂▁▇▃▅ ▂ + ▃▁▆█▇▇▆▇▂ ▂▆▇▅▁▁▂▅▆ + █▁▄▂█▃▄▁▇▇▆▂▅ ▂▆▅▇▂▁▁▇▆██ + █▇▁▆ ▇▇▁▁▁▁▇▇▇▆▆▆▆▆▇▇▇▁▁▇▇▇▂▄▇▆█ + ▇▇▇▂▂ █▇▇▇▇▇▇▇▁▅▅▄▇█▂ ▂▇▇▇▃▂ + █▇▇▁▁▆▆▂▂▂▂▂▂▂▆▆▇▇▇▇ + ▂██▇▇██▂▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_024.txt b/codex-rs/tui/frames/hbars/frame_024.txt new file mode 100644 index 0000000000..df0945fbfb --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_024.txt @@ -0,0 +1,27 @@ + + + ▂▆▂▇▄▇▇▇▇▇▄▂▂▂ + ▂▅▄▁█▂ █ █▇█▃█▇▁▇▇▇▆▄▆▂ + ▂▅█ ▂▆▇▇█▄▇▇▄▄▇▇▃▄▆▂▅█▁█▇▇▇▆ + ▅▇ ▆▇▇▂▇▇▃▇ ▃▁▇▃▆▃█▇▇▃▁▃ + ▆▇ ▂▅▇█▆▃ ▄▇▇▃ ▃▇▃▂▃ + ▅ ▄▅▂▆ ▄▇▂▆ ▇▆▇▇▄▃▆▁ + ▁ ▅▅▆▃ ▃▇▂▁ ▇▃▇█▁▃▃▁ + ▁ ▁▅▅▃ ▁▁█▃▇▆ ▁▁█▁▃▅▁ + ▆▂ ▆▁ ▃ ▂▃▇▂▃ ▄▃▆▇▆▁▇▄ + ▁▅▁▁▁▅ ▁▅▃ █▃▃ █▇▁ ▁▃██ + ▁▅▁▁▂▆ ▃▁ ▇▃▇ ▅▅▁▁▁▃ + ▁▃▁▇▂▁ █▂▇ ▂▇█ ▃▁▁▁▁▁ + ▁▅▇▅▁▇ ▁▅▂██▅▅ ▂▄▇▇▇▄▄▄▇▄▇▄▄▇▂ ▂█ ▁▁▁▁ + ▁▆▁▇▂▁ ▂▁██▂▁▇ ▁▄▃▃▇▇▇▇▇▇▇▇▇▇▁▅▇ ▁▁█▁▅▁▅ + ▁▅█▆▃▃▂ ▃▂▆▄▂ █▇▇▇▂▇▇▂▂▂▇▇▇▁▅ ▂▁▅▇▃█ █ + ▁▂▇▆▃█▆ ▅▁▃█▅ ▅ + █▁▂▇▆▃█▃ ▂█▃▂▇█ ▆ + ▁▂ ▃█▇▇▇▂ ▅▅▇▆▂▅▂▅ + ▇▁▂█▁▃▃▄▇▇▂▂ ▂▇▇▂▇█▄█▃▆▂ + ▇▁▂▂█▃▁▇▇▁▁▃▇▇▄▂▂▂▇▇▇▇▇▆▇▅▄▅▆▇▆█ + █▇▁▆▂ █▇▇▇▇▁▇▇▇▁▇▇▇▁▇▇▇▇▆▁█▂ + ▂▇▇▇▄▄▄▂▂▂▂▂▂▆▇▇▁▇▇██ + ▂██▇▇██▂▂▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_028.txt b/codex-rs/tui/frames/hbars/frame_028.txt new file mode 100644 index 0000000000..2dd5de69b6 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_028.txt @@ -0,0 +1,27 @@ + + + ▂▆▂▁▄▇▇▇▇▇▄▂▂▂ + ▆▄▇▇▂ ▂▇▇▁▇▂▁▅ + ▂▄▇▂ ▂▆▇▇█▁▁▇▄▄▄▇▃▇▂ ▂▃▇▇▂▇▆ + ▂▅█ ▂▇▇█▆▅ ▁▃▆ ▇▇▄▂▇▆ + ▆██▂▅▇ ▆▃ ▃▁▇ ▅▃▃▃▂▃ + ▁▅▅▅▅ ▂ ▆▇ ▇▁▆▂▃▃▁▆▃ + ▁█▅▁▇▅ ▂ █▆▇▇█ ▇▃█▇▃▁▅▃ + ▅▁▁▅▇ ▃ ▆▃█▃▇▄ ▇▆▅▃▆▃▅▁ + ▁▂▃▁▅▅ ▃▃▂▃▃ ▇█ ▁ ▁▁▃ + ▁█▄▇▁ ▆▃▇█▆▃█ ▂▁ █▂▁ ▆ + ▁▄▁▁▂▁█ ▁ ▂ ▅▃▇▆ ▄█▃█▁▁▅█ + ▁ ▁▁▁▅ ▁▁██▇█ ▇ █▁█▁▁▁▅ + ▁▁ █▁▁▂ ▇▆▆ ▆█▅▂▆▄▇▇▇▄▄▄▇▇▄▇▄ ▆██▄▁▁▅ + ▁ ▁▁ ▁ ▂▄▁▅ ▅▂ ▇▅▅▅▇▃▃▄▅▅▅▇▃▁▆ ▁▆▁▁▅ ▆ + ▁▂▃▅▄█ ▃▇▂ ▇▄▄▄▁▂▂▂▂▂▂▂▇█ ▄▅▂▁▄ ▅ + ▁▃▃█▂▇ ▂▁█▁ ▆ ▅ + █▁▃▃▁▁▇▃ ▆▁▅▅▂█ ▆▂ + ▁▆▃▄▇▆ ▂▅▇▂▅▂▅ ▅▂ + ▇▁▂▇▄▁▁▇ ▂ ▂▂▇▇▁▁▇ █▂▇ + ▇▁▄█▁▇▁▁▇▁▃▄▇▄▂▇▇▇▇▁▁▁▇▂▆▅▂▁▂▅▂ + ▇▁▇▆▁▁▁▁▇▇▇▇▇▇▁▄▇█▆▂▂▅▅▃▅▇ + █▇▁▇▇▁▁▄▁▁▁▁▃▇▇▁▁█▇█ + ▂██▇▇██▂ ▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_032.txt b/codex-rs/tui/frames/hbars/frame_032.txt new file mode 100644 index 0000000000..32682afe6a --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_032.txt @@ -0,0 +1,27 @@ + + + ▂▆▇▄▇▄▄▇▇▇▄▄▂▅ + ▂▅▅▇█ █▇▁▃▂▇▇▂ + ▂▄▇▁▂▆▇▇█▇▁▇▄▄▇▇▇▆ ▂▃▇▇██▇ + ▂▁▇▄▁▇▇▂▇▇▁▅ ▁▃▆ ▃▃▃ █▆ + ▆▇▂▁▇█ ▅▄ ▁▆ ▁▃▆ ▇▂ + ▅▇▆▁▇▅▂ ▂ ▅▁▃ ▃▃▆▂▁▆ + ▅▇▅▁▇▁▄▂ ▁▃▅▃ █▅▂█▃ ▁█▁▂ + ▂▁▃▅▇ ▅ ▅▃▃▆▃ ▇ ▆ ▃▃▃ + ▁▆▃▁ █ ▃▆▃▃▂▃▂ ▃█▃▆▁▆▃▁ + ▁ ▁▁ ▁ ▁▃▅█▆▇▅ ▂▆▃▆▁█▃▅ + ▇▃▁▁▇█ ▃▃▁▅█▅▅▃▅ ▁▁▁▅█▁▁ + ▅▇▁▁▃ █▆▅▇█▅▁█ ▅ ▁▁▁▁▇ + ▁▁▁▁█▁ ▂▁▂▂▁▂ ▂▆▇▄▁▄▇▄▄▄▄▇ ▁▆▁▇▁▁ + ▁▆▅▁ ▃ ▇▃▂▁▅ ▁▃▇▇▇▄▄▃▅▄▄▃▅ ▄█▃▁▁▁▁▁ + ▇▁▁▆▁ ▇▇▇▇▄▂▁▄▁▂▁▇ ▅▁▅▁ █ ▅ + ▁▅▃▅▂█▁ ▂▂ ▄▇▁▅▅█ ▅ + ▁▃▃▁▁▅▃ ▅▇▂▅▁▅ ▆▂ + ▁▁▇▇▃▂▇ ▂▁█▆▅ ▅▅▆▂ + ▇▄▃▃▇▇▆▇▁ ▆▁▇▂▅▇▆▂▂▅ + ▇▁▁▇▆▇▇▃▁▇▄▁▄▆▆▆▇▇▁▁▇▂▆▅▂▃ ▇█ + ▇▁▁▁▁▇▁█▇▇▇▇▇▇▇█▂▅▂▇▇▃▂▅▂ + ▂▇▇▁▄▂▂▂▂▂▂▆▇▇▄▇█▅▇█ + ▂███▇██▂ ▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_036.txt b/codex-rs/tui/frames/hbars/frame_036.txt new file mode 100644 index 0000000000..8d3d16b6f2 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_036.txt @@ -0,0 +1,27 @@ + + + ▂▆▇▇▇▄▇▇▇▄▂▂▅ + ▂▂▇▇█▂▄▅▅ ██▇█▇▁▇▇▁▃▆ + ▆▁▇▄▄▇▇▇▇█▇▄▇▇▁▆ █▅▃▇ █▃▂ + ▂▁▇▁▅▇▃▂▇█ ▇▆ ▆▁▂▂█▃ + ▆▅▆▁▇█ ▁▂ ▃▃▆▆ ▃▂ + ▆▅▆▅▅ ▂ ▃ █▃▁▃▅▇▂ + ▁▆▅▅ ▅▃▃▂▇ ▃ ▃▃▃▆▃▃ + ▁▂▁▁ ▃▃█▅▇▂█▆ ▅▃▃ ▆▂▃▁ + ▁▁▃▂ ▆█▆▅▂▇▃ ▅ ▃▂█▃▃▅▂ + ▁ ▁█ ▅█▁▁▆▅▄▃▃▅ ▄ ▁▁▆▆▁▁ + ▁ ▃█ ▂▂▃█▆▅▃▄▅ ▁ ▁▁▁ ▁▁ + ▁▃▄▃ █▁▅ ▅▇█ ▁ ▃▁▁▁█▁ + ▁▅▅▇ ▁ ▆▇▅▁█ ▅▂▇▇▇▇▇▇▄▇▄ ▇▁▁▁▂▁▁▁ + ▁▁▅▁▃▆ ▇ ▅█ ▁▇▇▇▇▇▇▇▇▇▃▃ ▅ ▁▇▂▁▁▁ + ▁▄▅▁ ▁ ▃▇▇▇▇▇▁▄▂▂▁▇ ▁█▁█▁▁▁▂▂ + █▁▇█▁ ▁ ▂▂▂▂▂ ▂▅ ▅▆▅ ▁ + ▃▁▁▁▄ ▃ ▆▁▂▁ ▅ + ▃▁▁▃▃▂▇▄ ▆▇ ▅█ ▆▂ + ▇▁▁▆▁▃▂▇ ▂▁▇▆▆▂▅█ ▅ + ▃▁▁▇▇▅▇▁▇▃▇▄▂▆▆▇▁▁▂▂▇▄▁▃ ▆█ + ▇▇▂█▇▇▇▇▁▇▁▇▇▇▂▅▂▄▇▇▂▆▇ + █▇▆▄▂▂▂▂▄▂▄▇▇▆▇▂▅▇▂ + ████▂▂ █▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_040.txt b/codex-rs/tui/frames/hbars/frame_040.txt new file mode 100644 index 0000000000..5f1d122297 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_040.txt @@ -0,0 +1,27 @@ + + + ▂▆▇▇▇▇▇▄▇▇▂▂▂ + ▆▄▇█▂▅▃▃▂▇▇▇▁▁▄▇▁▇▇▂ + ▆▁█▂▇▇▇▇█▁▄▇▇▄▂██▁▇▂ ▂▃▂ + ▅█▅▁█▂▄▇█ █▇█▃ ▇▃ + ▁▂▇▁▂ ▅█▅▁▆ ▂▁ + ▁▁▇▁ ▂▂▆▃ ▆▅▃█ ▃▁ + ▄▃▅▁ █▃▃▂▁▃ █▅█▃▃▃▆▃ + ▁▁▁▂ ▁▃▃ ▁▃ ▆█▃▆▁▁ ▃▂ + ▂█▁▁ ▃▃▃ ▃▃▇ ▂▁▂▁▁▁▁▁ + ▁▁▁▁ ▅▁▃▆▁▃▃▃▆ ██▁▄▁▅▆▇ + ▅▁▁▁ ▃▁▃▅▃▁▆▆ ▁▅▁▁▁▂▁▁ + ▃▅▁▁ ▃▂▅▅█ ▅ ▂ ▁ ▁▁▁▁▁▁ + ▁█▁█ ▃▅▂▅ ▆▂▂▇▇▇▇▇▇▇▇ █▂▁▁▂▆▅▁ + █▅▅▆ █▅ ▆▇▇▇▇▇▇▇▇▇▁▁ ▁ ▁ ▁▁▁▃ + ▁▁▅▆ ▂▇▇▇▇▂▁▄▂▄▁█ ▅▇▁█▁▁▁▁▁ + ▁▅▅▁▆▇ ▂ ▂▂▂▂▂ ▁ ▃▆▁▁▁▁█ + ▁▁▃▃ ▇▂ ▁▂▁▂▅▁▁▅▁ + ▁▃▇▇▂▇▃ ▂▁▂▅▅▅█ ▁ + ▁▁▆▁▃▂▇ ▆▇▂█▅▅▃ ▂▅ + ▇▂█▇▃▄▆▁▇▇▇▆▆▂▆▇█▆▆▅▇▂ ▆▇ + █▇▂ █▇▇▁▁▁▁▇▇▂▆▄▃▇▃ ▆▇ + ▇▇▄▂▅▆▂▂▇▇▇▅▇▂▄▇█ + ▂███▂▂ ▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_044.txt b/codex-rs/tui/frames/hbars/frame_044.txt new file mode 100644 index 0000000000..0e973910de --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_044.txt @@ -0,0 +1,27 @@ + + + ▂▆▇▄▇▇▂▇▇▇▂▂▂ + ▆▅▇▂▆▆▆▇█▇▁▇▁▄ ▇▇▂ + ▂▁▁▄▇▇▇█▁▇▇▄▂▇▃▇▆▅ █▇ + ▆▇▅▇▅ ▁▆▃▂ ▃▃▆ + ▆▃▇▅▂ ▃▃▁▄█ ▁▆ + ▅▁█ ▂▂▆ ▃▆▃▁▃ ▅▆ + ▁▅▅ ▇▁▃▆ ▅▃▄▃█▃▃ + ▁ ▁ ▃▁▃▅▂▃▆ ▃▆ ▁▁ ▁ + ▆▃▂▁ █▁█▅▃▂▁▂ ▅▂▁▁▁ ▁ + ▁▁▇ ▃▃▃▁█▁▇ ▁▃▅▁▅ ▅ + ▇▁█ ▃▅▁▅▇█▁ █▁▁▁█▁▁▁ + ▅▁█▂ ▅▆▅▁▅ ▁▁▁▁▂▁▁▁ + ▁▁▅▁ ▂▁ ▅▁ ▂▂▇▇▇▇▇▇▇▆█▁▁▁▁▅▆▁▁ + ▇▁▁ ▁ ▅▁▅ ▇▇▇▇▇▇▇▇▃▆▅▁ ▃▁▆▁▁▁ + ▁▅▇▂▂▆▅ ▅▇▇▄▄▁▄▇▁▅▂▆▂▁▁▁▁▁ ▅ + ▁▁▆▃▇ ▂▁ ▂▂▂▂▂█▃ ▁▆▁▁ █▁ + ▁▅▃▂▅▆ ▅▃▁█ ▅▁▃▂ + ▃▅▁▃▂▃▃ ▆▇▅▆ ▅ ▅▇ + ▃▅▁▂▇█▇▆ ▅▇▅▆▄▅ ▅▅ + ▃▂▇▁▇▇▂▇▇▆▂▂▆▇▂▅▅▂▃ ▄█ + █▃▂█▇▇▄▄▁▇▇▂▂▇▃▁▂ ▆▇ + ▂▇▆▂▂▂▆▅▅▇▄▄▂▂▆▇▂ + ▂███▂ █▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_048.txt b/codex-rs/tui/frames/hbars/frame_048.txt new file mode 100644 index 0000000000..f5d91e9587 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_048.txt @@ -0,0 +1,27 @@ + + + ▆▂▄▁▇▆▆▇▇▆▆ + ▆▇▁▄▆▂█▃▄▁▇▄█▇▃▆ + ▅▆▁█▇█▁▇▇▂▃▃▃▂ ▇▃ + ▅▁▅▇▆ ▃▁▃▂ ▅▂▁ + ▁▁▃▃ ▁▃▃▂ █▃▁ + ▂▃█ ▂▆▂ ▃▆▁▅▅▆▃▃ + ▁▅▁▁▁▆▆█ ▅ ▃▃ ▃▇▂ + ▃ ▁ █▅▃ ▃ ▁▄█▃▃ ▁ + ▅▁▁▂ ▆▁▁▁▃▆ ▁ ▁▃▃▁▁▁ + ▁▁▃ ▇▁▅▅▄ █ ▆▆▇▁▆▅▄▆ + ▁▁▁ ▁▃▃▁▁▁ ▁▅▁▁█▅▁▁ + ▁▁▁▂ ▃ ▇██ ▁▃▁▁▁▁▁▁ + ▁▁▅▃ ▁▅ ▂▂▇▇▇▇▇ ▁▃▁▁▁▁▁▁ + ▁▁█▁▅▂▆ ▇▇▇▇▇▇▁▃ ▁█▁▁▁▁▁▁ + ▅▁▁▇▁▂ ▇▇▄▁▄▇▅█ ▁█▁▁▁ ▃▂ + ▁▅█▇▁ ▂█▁▁▁ ▁▁▁▃▁ + ▇▇▄▁ ▁ ▂█▅▃▁▁▁▁▂▅ + ▁▁▅▆▃▃▂ ▁▅▆ ▅▁▁▆▁ + █▆▁▁▃█▇▂▅ ▂▁▆▁▆▁█ ▅▆▂ + █▆▇▂▇▂▇▇▇▂▆▅▂▆ ▅▅ ▁▂ + █▃▂▇▇▄▁▅▇▂▄▇▆▇▃ ▂▅ + █▇▂▂▂▂▇▇▄▇▃ ▂▅▂ + ▂█▇▂▂▂▂█▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_052.txt b/codex-rs/tui/frames/hbars/frame_052.txt new file mode 100644 index 0000000000..8c2fcda9a5 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_052.txt @@ -0,0 +1,27 @@ + + + ▂▅▄▇▇▆▄▃▇▆▂ + ▅█▆▆█▃▇▅▃ █▃▁▆ + ▁▅▅▇█▇▃▇▆▃▆▂█ ▃▃ + ▄▁▅█▅ █▁▅▅ ▃▃ + ▁▁▃ ▅ ▃▁▃▃ ▃█▂ + ▁▁▇▂▂▂▂ ▁▄▁██ ▁▁ + ▇█▁▁▂▇▇█ ▃ █▁ █▁▅▆ + ▁▁ ▁▁▁▃▁ ▆ ▁▁ ▂▁▃ + ▅▅▁ ▅▅▂▁▃ ▁▁▁▅ █▁ + ▁▁█ ▁▁▁▃▂ ▁▅▆▁▁▃▁ + ▁▁▅ ▇▁▅▁▃ ▁▅▁▄▅▂ ▁▅▆ + ▁▁▅ ▁▄▅▃██ ▂▅▂▁▁▁▅ ▁▁ + ▁▅ ▁▁ ▂▂▂▇▇▇▇▃▂▁▁▁▁▁▁▁ + ▁█ ▃▇ ▇▇▇▇▇▃▁▁█▂▁▁▁▁▁▂ + ▁▁▅ ▁ ▃▄▄▂▁▇▁▁▄ ▁▁ ▁ + ▅▁▁ ▆▅ ▂█▁▁▁ ▁▁ █▁ + ▁▁█▁ ▂▃▅█ ▁▁ ▃▁ + ▁▁▁▃ ▁▁▆▆▂▁▁█▆ + ▁▁▇▃ ▆▁▃▃▁▁▁▁ ▅ + ▃▁▇▄▂▇▃▂▇▅▃▁▇ ▅▅▁ + ▃▃▇▁█▅▂▅▃▁█ ▅▅ + ▇▇▂▂▆█▂▅█▅▂▁█ + █▇█▂███ + + diff --git a/codex-rs/tui/frames/hbars/frame_056.txt b/codex-rs/tui/frames/hbars/frame_056.txt new file mode 100644 index 0000000000..48de91bb55 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_056.txt @@ -0,0 +1,27 @@ + + + ▆▄▇▇▆▆▃▇▆▂ + ▅▆▂▃▃▅▅▅██▁▆ + ▄▁▅▇▃▃█▁▂ █▁▆ + ▇▁▇▅▁▃▁▇▆ █▆█▃ + ▁▃▁ ▃▃▅▃▃▃ █▅▄ + ▁▃▆▂█▆ ▁▁▃▁█ ▇▁ + ▁▁▁▆ ▁ ▇▁▁ ▂▅▁▁▃ + ▃▅▇▅ ▁▁▆ ▃▁ ▁ + █▁█▁▇█ ▂▁█▂▁▁▅ + ▃▅▃▇▂▄▁ ▁▁▇▁▁▆▅▁ + ▁▅▁▄▄▇▁ ▁▁▅██▁▅▁ + ▁▅▇▅▇█▁ ▁▁█▂ ▁▁▁ + ▇▅▃▁▂▂▂▇ ▁▁▅▁▁█▁▁ + ▄▃▁█▇▇▁▃ ▁▁▅ ▁▁ ▁ + █▃▁ ▅ ▁▁▁▁▁▁▁▃▁ + ▁▁▇▂▇▆ ▂ ▅▁▁▁▁ ▅▁ + ▁▁▁ ▁▁ ▃ ▂▁▁▁▁ ▁ + ▃▁█ ▂ ▄▁▁▁ ▆▅▆▂▂ + ▁█▃ ▁ ▁ ▃▃▇▂ ▁▁ + ▃▁▃▃▇▅▃▅▆▁ ▁▁▂█ + ▃▇▆██▅▄▇ █▅ + ▇▂▂▅▂▇ ▃▇ + █▇▂████ + + diff --git a/codex-rs/tui/frames/hbars/frame_060.txt b/codex-rs/tui/frames/hbars/frame_060.txt new file mode 100644 index 0000000000..2ba81fbc44 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_060.txt @@ -0,0 +1,27 @@ + + + ▄▇▇▆▅▇▇▆ + ▃ ▃▁▅ ▇█▆▃ + ▅▁▁▁▅▂█▃▃▃ + ▅▅▅▁▄▁ █▁▁▁ + ▁▁▁▅▁▇▆ █▁▁ + ▁▁▂▁▅▅▁▃▁ ▃▁ + ▁▁▅▇▁▁▅▁ ▁▁ + ▁▁██▁▁▁▁▃██ ▆ + ▁▁▅▁▁▇▅▃▁▁▁▂▁ + ▁▁▁▁▁ ▁▁▁ ▃▂▁ + ▁▁▃▇█ ▁██▁█▁▁ + ▁▁▂▃▁ ▁ █▁▅▁▁ + ▁▁▂▂▁▂▂▅▁▁▁▁▇ + ▁▁▁▁▁▁▁▁▁ ▁▃ + ▁▁▂▁█▁ ▁▁▁ ▁▅ + ▁▁▃▁▁▁▁▁▁▁▁█▁ + ▁▃▅▅▅▁ ▅ ▁ + ▁▁▅▁▁█▄▁▁█ + ▅▁▁▁▃▁▇▃▂▁▃ + ▁▃▇▁▃█ ▁▇▁▁ + ▄ ▁ ▃▃ ▆▃▂▇ + ▇▇▁ ▇█▆▄▁▁ + █▇█▂██▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_064.txt b/codex-rs/tui/frames/hbars/frame_064.txt new file mode 100644 index 0000000000..2b4dbbdcdb --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_064.txt @@ -0,0 +1,27 @@ + + + ▇▇▇▆▇▇▇▆ + ▁▃▁█ ██▄▁ + ▁▂▁█ ▁▃▅▃ + ▁▁▁▃▂▃█▁▅ + ▁▅▅▁▆█▃▁▁ + ▇█▅ ▃▃▅▃▁ + ▇▅█▁▅▇▇█▁ + ▃▁▂▁ ▁▅▃▃ + ▃▁▄▂▆ ▅▁ + ▁▁▁▂▃▃▁▁▂ + ▁▁▁█▆▇█▁▁▁ + ▁▁▁▁▆▅▄▅▁ + ▁▁▁▁▁▁▂▁▁▂ + ▁▁▁▁▁▁▃▂▁▂ + ▁▁▁▁▁▁▁▁▁▁ + ▁▁▅▁▁▁▁▁█▁ + ▁▁▁▁▁▁▁▁▂▁ + ▁▁▁▁▁▁▁▁▅▁ + ▁▁▇▁▃▅▆▁▂▁ + ▃▁▄▁▁▆█▁▃▂ + ▃▁█▁ ▁ ▁ ▂ + ▇▅██ ▅▇▅ + █▇██▇█▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_068.txt b/codex-rs/tui/frames/hbars/frame_068.txt new file mode 100644 index 0000000000..15d7fc2ff9 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_068.txt @@ -0,0 +1,27 @@ + + + ▆▇▇▅▆▆▇▄▆ + ▃▅█▃▅▁▃ █ + ▁▆▂██▃▃▁▃▄ + █▁▆ ▆ ▁▇▁▆▁ + ▁▁▁ ▂▃▁▁▁ ▁ + █▇▁▆▁▅▃▁▃ ▁ + ▃▁▁▂▁▁▁▁▁ ▁ + ▅▁▁▁▅▁▃▁▁▁ ▁ + ▁▁▁▁▁▁▃▁▁▇ ▁ + ▁▂▁▁▁▁█▅▁▃ ▁ + ▁▁██▁▃▁▅▁▆▅▁ + ▁▆█▅▂███▁▁▅▁ + ▃▁ ▁▁▁ ▁▁▁▇▁ + ▂ ▁▁▁▆▁▁▁█▁ + ▂▁▁▁▁█▁▇▁▁▁ + ▃▃▁▁▁ ▅▃▁▁▁ + ▁▅▁▁▁▂▅▁▁▅▁ + ▁▁▃▅█▁▁▃▅▄▁ + ▁▇▁▆▆▆▁▆▁▂▁ + █▃██ ▁██▁▂▃ + ▁▁▆ ▁▁▅▁▅▁ + ▁▅▃ ▁▇▃▂▂ + ▂██████▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_072.txt b/codex-rs/tui/frames/hbars/frame_072.txt new file mode 100644 index 0000000000..e151a3fdd5 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_072.txt @@ -0,0 +1,27 @@ + + + ▆▇▁▄▆▄▇▁▆ + ▅▃▃▁▅▁▃▅▂▅▇ + ▁▁█ ▂ ▅▁▂▇▃▃▃ + ▆▃▂ █▁▁▁▁▆█ ▅ + ▁▁▅▁▅▃▁█▁██▄▁▇▆ + ▁█▁▆▁▁▁▁▁▁▁ ▃▁ + ▃▁▁██▃█▁▆▁ ▆▅▁▅ + ▁▁▁▁▁▂▁▁▁▃█▁ ▂▁ + ▁▁▁▁▁▁▁▁█▁▁▁ ▆▅▁ + ▁▁▁▁▄▅▁▁▅ ▃▇▁▁▁▁ + ▁▁█ ▃▁▅▁▅▅▆▁▅▅▁▁ + ▁▁▃▁▅▆▃█▃▂▃▃█▃▃▁ + ▁▁▁▁▁▃█▁▅▅▄▇▄▄▁▁ + ▁▁▁▁▁ ▁▇▁▁▁▁▁█▁▁ + ▁▁ ▃ ▁▁█▁█▃▃▁▇▁▁ + ▁█▃█▁█▁▁▁▃▃▅▃▂▁ + ▁▆ █▁█▁▃ ▁▁▁▅▃ + ▁▁▁ ▃▆▃▃▆▇▁▅▁▁ + █▁▅▃▅▆ ▄▁▁▅▁▁▆▁ + ▁▁▇ █ █▇▅▂▁█▁ + ▆▃ ▆ ▃█▁▇▄▅▅ + █▅▁▅ ▃▂▃▂▅ + ███▂███▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_076.txt b/codex-rs/tui/frames/hbars/frame_076.txt new file mode 100644 index 0000000000..e2f5798a27 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_076.txt @@ -0,0 +1,27 @@ + + + ▂▇▇▇▄▆▇▇▁▂▂ + ▇▃▅▁▁▃▃▃▇▂▅▇▃ + ▁▁▅▁█▃▅▁▃▁█▇▆▃▃ + ▁▅▂▅▅▅▃▁▇▅█▃███▁▆ + ▆▇▄▁▂█▅▅▁▁ ▆█▃▅ + ▁▃▃▅▅ ▂▆▅▇▂ ▃▁▆ + ▃▁▅▃▂▆█▁▁▃▇ ▃▁▁ + ▁▁▃▂▅▁▁ ▁▁▁▇▄ ▅▁ + ▁▁▃▇▁▁▂▂▃▃▂▁▁ ▆▄▁▁ + ▃▁▁▁▁▁ ▂▁▃▆ ▁▁▂▁ + ▁▁▁▁▁▅ ▅▁▂▁▆▁▁ ▁▅▃▁ + ▁▁▁▁▁▅ ▃▅▂ ▁▃▁ █▁▃▁ + ▁▁▁▁▁ ▅▁▁▃▄▇▆▄▁▁▁ + ▁▁▁▁▁ ▅▁▄▂▆▁▁▂▅▁█ ▁▁ + ▁▁▁▁▁ ▃▃▁▁▂▃▇█▅▁▇▅▁▁ + ▁▁▁▁ ▃▃▁▁▇▃▂▃▆▁▃▁▅▁ + ▁▁▁▁ ▃▁▅ ▁█▁▃▇ + ▇▁▁▁▁▁ █▁ ▅▅▃▇▁█ + ▁▃█▃▆▁▁▇▅▆ ▆▁ ▁▆▃ + █▆▃▅ ▁▁▃▃▁▅▇▄▁▃▇█ + █▁▆▅ ▂▃█▆▆▇▅▅▃▅ + █▃▇▇ █▇▂▇▂▂▄█ + █▂▂█▂▇█▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_080.txt b/codex-rs/tui/frames/hbars/frame_080.txt new file mode 100644 index 0000000000..566ad33bac --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_080.txt @@ -0,0 +1,27 @@ + + + ▆▄▇▁▂▆▄▇▁▂▂ + ▅▇▇ ▇█▁▁▇▂▆▅▁▇▆ + ▁▂█▅▆▅▆▁ ▇▇█▇▇▇▆▃ + ▅█▁▁ ▅▅▁▆▅▆▂█▂ ██▃▃ + ▁█▅▁▁▆▆▁▃▇ ▅▃▁▆ + ▅▅▁▆▅▅▂▃█ ▂ ▃▅ + ▁▁▅▃▃▁▆▁▇ ▂▇▂ ▃▅▁▆ + ▄▁▁ ▁▁▇█▇▁ ▃▄▁▃ █▁▅ + ▁▃▁██▁▂▁▁▂ ▅▃▂▆▅ ▁▁ + ▃▁▁▁█▁▁▁▁ ▃▁▁▃ ▁▅▁ + ▁▁▁▁▁▂▂▁▁ ▅▅ ▅ ▅▇▅▁ + ▁▁▁▁█▁▂▁▁ ▁▃▁▂ █▁▁▁ + ▁▅▁▁▂█▁▁▁ ▅▂█▁▄ ▇ ▅▂▁▁▁ + ▁▁▁▁▁ ▅▁█ ▁▄▁█▂▁ ▇ ▂▂▁▃▁ + ▁▁▁▁▅ ▇▁ ▇▂ ▅ ▂▁▅ ▅█▁▁▇ + ▁▁▁▁▁ ▇▁ ▅▇▅ ▂▁▁▁▃▁ + ▁▁▁▁▁█▁▁ ▅▁▁▁▂ + ▄▃▁▁▃▅█▁▇▂ ▅▃▃ + ▇▁▆ ▂▁▃▃▃▃▂ ▂▁▇▂ + ▃▃▂ ▃▃▃▃▃▇▆▇▇▂▂▁▆▇▅ + █▁▂ ▇▄ ▇▄▇▅▇▂▇ + ▇▃▂ █▇▂▇▆▂▂▄▇▂ + ▂█▂▂▂▂██▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_084.txt b/codex-rs/tui/frames/hbars/frame_084.txt new file mode 100644 index 0000000000..7b060ddd0b --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_084.txt @@ -0,0 +1,27 @@ + + + ▂▆▄▇▂▆▄▇▇▇▇▆ + ▂▁▇ ▄█▁▁▇█▂▄▅▂▇▃▂ + ▂▁▇▂▂▅ ▅▅▂▇▇▇█▇▇█▃▁▃ + ▆▅█▆ ▃▇▆▇▆▇▅ ▂▂ ▃█▃▁ + ▆▅█▆ ▁▅▆▁▁▇ █▁▁ + ▁▅▂▆▅██▅▃▇ ▂ █▃▆ + ▁▁▁▅▃▁▆▁▁█ ▇▂▃ ▅▁▃ + ▁▁ ▅▁▂▂▁▆ ▁▆▃▂▃ █▅▁▆ + ▁▇▁▅█▁▁▇█ ▃▅▂▁▃ █▁▃ + ▁▁▁▁▁█▄▁▁ ▃▃▅▆ ▁▁▁ + ▁▅▁▁█▃▁▇▁ ▆ ▃▁▇▃ ▁▁▃ + ▁█▂▆█▂▂▁▁ ▁▃▇▆▂▁ ▂▁▅ + ▁█ ▂▆▁▅▁▁ ▇▅▂▇▃▇▄▄▇▇▃▂ ▂▂▁▅ + ▁▁ ▃▂█▁▁▁▁ ▅▅▅▃▅ ▇▁▇█▂ ▁▁▁▁ + ▁█ ▇█▁▁▂▁ ▂▅ ▁ ▂▁▇▁ ▇▇▅█▁ + ▁ ██▇▁▇ ▁▅ ▃▁▁▂ + ▃▃ █▃▁▂▁▆▁ ▆▁▆▁▆▁ + ▃▁▃ █▂█▃ ▃ ▁▅▂▃▃▂ + ▁▁ ▃█▁▃ ▁▂ ▅█ █▁▇▅ + ▃▃ ▂█▅▁▃▂▇▂▂▂▇▇▂▅▄▁█▅ + ▇▁▂ ▂▃▂▃▁ █▇▇▇▇▇█▆█ + ▇▇▂ █▇▂▇▃▂▂▂▂▅▇ + ▂█▂▂▂▂██▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_088.txt b/codex-rs/tui/frames/hbars/frame_088.txt new file mode 100644 index 0000000000..9445aa3071 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_088.txt @@ -0,0 +1,27 @@ + + + ▅▆▄▁▂▄▇▄▄▇▇▆▂ + ▆▅▃ ▇▄▅▁▅▇▂▂▄▃▄█▇▆ + ▂▅▂▅ ▆▇▆▇▂▇▇▇▁▁▇▁█▁▄▇▆ + ▅▁ █▅▅▅▅▅▄▇▁ █▁▆▂█▃▁▃ + ▅▃█▂▅▇▅█▇ ▃▅▂▃▁▃ + ▅▁▅▅▆▅▅▄▃ ▂ ▇▇ █▁▁ + ▂▁▃▃█▁ ▆▅ ▁▇▄ ▃ ▃▁▆▆ + ▁▁▂▅▅██▁ ▁▆▇▆ ▃ ██▁▁ + ███ ▁▂▃ ▃▅▂▇▁▃▂ █▃▁▅ + ▁▁▁▁▁▄▄▁ ▅▇▅▃█ █▅▁▁▁ + ▁▁▁▁▁▁▁▅ ▄ ▂▅▁▃▁ █▅▁▁▅ + ▁▂█▁▁▁▁▁ ▅▇▁▅▂▂▆█ ▅▁▁▃ + ▁▁ ▁▅▁▁▁ ▁▁▂▇▅▁▇ ▇▇▇▃▂ ▄▁▁█ + █▅█ ▇▅▁ ▅▅▅▅▇▅▅ ▃▇██▁▅ ▁▁▁▁▁ + ▁ ▅ ▁▁▂ ▂▁▁▆ ▃▇▇▇▅ ▁▇▇ + ▇▅▅ ▁█▁█ ▃▆▂ ▁▁▅▅ + ▁▆ ▃▁▃▃▆▃▆ ▂▇▅▅▁▃▂ + ▇▅▃█▆█▁▆▃▆ ▄▇▅▅▃▃▅ + ▁▄▃▃▆▃▁▆▇▃ ▂▅▂▆▁▆▁▅ + ▁▄ ▃▃▃▃ ▇▇▆▂▂▄▇▂▁▁▁▇▃▇ + █▁▂▂█▃█▃▁ █▇▄▇▇▇▇█▂▅▂ + █▇▆ ▂▇▆▇▇▄▂▂▂▂▇▇▂ + ██▂▂█▇██▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_092.txt b/codex-rs/tui/frames/hbars/frame_092.txt new file mode 100644 index 0000000000..8a16e4ab56 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_092.txt @@ -0,0 +1,27 @@ + + + ▂▆▆▄▇▂▇▇▇▇▄▁▆▂ + ▂▇▁ ▇█▁▇█▇█▂▄▅▁▄█▇▃▆ + ▂▅█▂▅▆▇█▇█▂▇▇▇▁▁█▇▇▇▅▂▃▆ + ▅▇▆▅▄▇▃ ▇▆▇ ▃▅▂▇▇▁▆▃ + ▁▂▅ ▆█▂▄ ▁▅ ▇▃▃ + ▁▁▂▂▃█▆ ▇▂▄ █▇▁▁ + ▅▇█▇▁▅▂▆ ▅▁▇▃█ ▃▅▃▁ + ▂▁▅▆▁▁▄▁ ▁▅▆▇▃ █▁▅▂ + ▁▂▁▁ ▁▂█ ▁▆▆▇▃▂▃ ▁▁▁ + ▁▁▁ ▆▁▁ ▁▆▅▇▃ ▅▁▁ + ▃▁▁▁▁▃▁ ▅▄▄▂██ ▁▁▅ + ▃▁▁▂▁▁▁ ▅▅▅▅█▅ ▁▇█ + ▁▁▁▅▁▁▁ ▅▃▅▅▅▅▅▂ ▄▄▇▇▇▇▁▄ ▆█▁▇ + ▁▁▁▁▇▃▅ ▄▅▅▅▅▁█ ▇▄▇█▇▁█▂ ▆▁▁▃ + ▇▁▁▁▃▁▁▆▃ ▇▆▁ ▃ ▇▁▇▄▇▄▁▇ ▁▃▇▁▁ + ▇▂▁▁▁▅▅ ▁ ▇▃▆▂ ▂ █ ▁▁ + ▇▆▃▃▆▇▃█▁ ▆▇ ▁▃▃▅ + ▇▁▃▃▃▆▃▃ ▁ ▁▂▅▆▁▅ + █▁▂▃▃▃▁▃▂▇▆ ▂▄▇█▂▅▅▇▅ + ▃▂ █▆▁▁▆▂▇▇▂▂▂▂▇▇▇▆▁▇▇▇▆▇ + █▃▂▃▃▁▃▆▆ ▂▇▇▇▇▇▇▇▇▂▂▇ + ▇▇▂▂▇▆▇▁▆▂▂▂▂▂▆▇█ + ▂█ ▂▂█▇██▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_096.txt b/codex-rs/tui/frames/hbars/frame_096.txt new file mode 100644 index 0000000000..af4c3cfc2f --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_096.txt @@ -0,0 +1,27 @@ + + + ▂▂▇▁▆▇▇▇▇▇▁▂▂ + ▂▆█▂▇▁▁▇█▁█▂▄▆▅█▁█▇▇▆▂ + ▂▅▃▅▅▇▇█ ▂▂▅▇▇▇▁▁█▇▇▄▃▆▇▃▂ + ▅█ ▆▆▁▂ ▃▆█▇▇▄▇▃ + ▁ ▅▁▅▅ ▇ ▅▇▆▃ + ▁▅▅▅▁▅█ ▆▇▂█ ▇▃▃ + ▇▄▄▅▁▆▅ ▅▅█▃▂ ▇▇▃▁ + ▄▅▆▄▁▃▆ ▁▁▅█▁ ▂█▁▅▆ + ▇▃██▇▁ ▁▆▁▅▁ ▃ ▁▁▁ + ▂▁▁▁▂▁▃ ▃▃▃▃▁▂█ ▁▁▅ + ▁█▁█▅▁▁ ▆ ▃▇▁▁▁▆ ▅▁▁▁▁ + ▁▁▂█▁▁▁ ▁▅▄▂▅ ▅▃█ ▁▆▁▁▁▁ + ▇▁▁▁▁▁▁ ▁▅▆▆ ▅█ ▄▇▇▇▇▄▄▃ ▂█▁▇▅▂ + ▆▁▁▁▁▆▆ ▁▆▆▇▂▄█▅ ▁▂▇██▁▇█ ▁ ▃▁▅ + ▁ ▁▁▁▁▁ ▇▅▅ ▆▂ ▃▁▇▇▇▄▇ ▁█▅▅▁▆ + ▃▁▃█▆▆▆ ▁▂▆█ ▄▇█▁▁▁▂ + ▇▃▃▁ ▅▅▂ █▄▇█▁▆▃▅ + ▃▁▃▇▁▃▁▂▇▅ ▂▅█▄▇▆▁▅ + ▇▃▃▃▆▁▃▄ ▇▆▅ ▂▇█ ▁▇▇▅▅ + ▃▂ ▃▇▁▃▂█▇▇▄▂▂▂▂▇▇▇▄▂▇▁▅█▁▂ + ▃▂ ▃▇▇▁▆▆▂▇▇▇▇▇▇▇▇▇█▂▇█ + █▇▆▂▃▅▂▁▆▂▂▂▂▂▂▄▇▇▂ + ▂█▂▂▂█▇██▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_100.txt b/codex-rs/tui/frames/hbars/frame_100.txt new file mode 100644 index 0000000000..cc7ebc1abe --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_100.txt @@ -0,0 +1,27 @@ + + + ▅▂▂▇▄▇▇▇▇▇▇▇▂▂ + ▆▇▂▆▄▅▇▇▂▅▇█▂█▅▂▁█▇▇▇▂ + ▂▇▃▂▅▇▇▅▅▅▂▆▇▇▇▄▁▁▇▇▇▄▃▁█▇▆ + ▅█ ▅▅▄▅▅ ▁▆▇▃▄▅▇▆ + ▂▁▆▂▆▇▇▇▂ ▃ ▇█▅▇ + ▂▁▂▁▅▅▆ ▆▄▂ ▅▃▆▁ + ▁▅▃▅▅▃▅ ▅▁█▁▂ ▅▃▃▆▁ + ▅▅▅▁▁▅▂ ▇▁▂▃▁▂▂ ▂▃▆▁▃ + ▁ ▅▆▇▁ ▇▃▆▂▇▄ ▃ ▁▁▁ + ▁▂▁▁█▁▁ ▇▁▃█▇▃▅█ ▁▆▁▆ + ▁ █▁▁▃▇ █▁ ▂▅▃ ▃▇ ▁▁▃▁ + ▁▂█▃▂▃▁ ▅▃▃▇▅ ▂▁ ▁▁█▁ + ▁ ▂█▁▁▂ ▁▃▂█▅▂▂▅ ▄▄▄▄▄▇▇▄▇▄▂▂ ▃▁▅▁▁ + █▂ ▁▁▁ ▁▂▆▆▇▁▆▅ ▁▁▅▇█▇▁▄▂▂▂▁ ▁▁█▂ + ▁▅█▁▃▅▂▃ ▁▇▅▁ ▂▇ █▁▇▁▇▄▄▇▇▄ ▅▁▃▃▄ + █▃▁▁▁▇▃ ▁ ▁▃▆█ ██ ▂▅▅▇▂ + ▃▁▁▁▁▃▁ ▁▂ ▅█▆▇▁▁▅ + ▃▄█▃▁▁▃▂▇▆ ▅▁▂▇▂▂█▅▅▅ + █▆ ▇█▁▁▅█▁▂ ▂▄▇█▂▇▆▁▆█ + ▇▂ ▇▇▁▇▂█▁▁▄▇▂▂▆▆▇▇▇▁▂▇▇▇▁▅▅ + ▇▆▂▇▇▁▄▂ ▇▁▇▇▇▇▇▇▇▇██▆▇▂ + ▂▇▅▂▇█▇▇▃▄▂▂▂▂▂▆▆▇▇█ + ▂ ▂█▇▇██▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_104.txt b/codex-rs/tui/frames/hbars/frame_104.txt new file mode 100644 index 0000000000..25d7f9ccf4 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_104.txt @@ -0,0 +1,27 @@ + + + ▂▅▆▄▇▄▇▇▇▇▇▇▇▂▂ + ▂▇█▆▁▅▇▇▂ █▇▇▇▆ + ▆▇▂▅▇▇█ ▂▆▄▇▇▇▄▁▁▇▇▇▄▆▁▁▇▇▂ + ▆▇▅▅▅▃▆█▂▆▇ ▄▂▇▁▆▃█▃▂ + ▅ ▄▆▇▆█▆▅ ▇▁▅▅▃▃▇▃ + ▇█▅▇█▅ ▅ ▄▄▃▃ ▃ ▁█▅▃ + ▁▇▅▁▂▅█▁ ▅▄█▇▆▃ █▃ ▁▅▅▃ + ▁▃▃▃▅▆▅▅▂ ▃▃▆▂▃▃▃▂ ▂ ▃▅▃▆ + ▁▄▁▃▁▃▂ ▇▁▃ ▇▁█▁ ▃ ▁▁▃▇ + ▁█▁▁▁▁█▁ ▆ ▁▁▆▅▁▂▁ ▁▅█▆ + █▁▇█▁▁ ▁ ▂▃▅ ▁▇ ▅▁ █ ▁▁ ▁ + ▁▁▂▅▁▁ ▁ ▂▇▆▅▄▂ ▅█ ▁▅▁▁█▁ + ▃█ ▁▁▁█▁ ▆▇▅▅▁█▅▁▂ ▄▇▇▄▇▇▇▄▄▆ ▃▁▁▁▆▁ + ▂▂█▇▅ ▆ ▅▂▆▁▅ ▂▁ ▇▅▃▇█▇▁▄█▂█ ▅▇▁▃▁▂ + ▃ ▁▁▁▁▆▁ ▇▆▅▁▂▂ ▁▇▇▁▁▄▄▇▇▇ ▂▁▁▁▁ + █▁▂▃▃▃▁█▁ ▇▅ ▂▃▁▃▂ + ▃▂▃▅▃▁▆▃▁▂ ▂▅▂▅█▅▇█ + ▇▄█▁▁▃▆ ▁▆ ▂▄▇▂▇▅▁▁█ + █▃ ▇▇▁▄▂█▁▆▂ ▂▇█▂▅▃▇▇▅▂ + ▇▄ ▇▇▇▄▂█▁▇▇▇▇▆▂▆▆▇▇▇▁▂▄▇▆▁▇▆▇ + █▇▂▃▇▃▇▂▂ █▇▁▇▇▇▇▇█▇▇▁▇▁▅█ + █▁ █▇▁▇▇▆▂▂▂▂▂▂▆▂▇▇█ + ▂ ▂██▇▇██▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_108.txt b/codex-rs/tui/frames/hbars/frame_108.txt new file mode 100644 index 0000000000..f66a23e634 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_108.txt @@ -0,0 +1,27 @@ + + + ▂▅▂▄▄▇▇▇▇▇▇▇▇▆▂▂ + ▆▄▁▇▇▇▇█ █▇▆▂ + ▂▅▇▇▁▇▄▅▅▅▂▇▇▇▁▁▁▁▁▇▇▇▇▃▂▄▇▇▆ + ▂▅▇▅▅█▄▂▆▄▇ ▃▆█▇▇▁▁▇▆ + ▅▂▄▆▇▁▂▆▁ ▇▅▃▇▇▅▁▂ + ▁▁▅▁▆▇█▁▁ ▆▇▁▃ ▆ ▁▃▃▃▆ + ▁▃▅▁▆▇▃▁ ▃▄▅▅▁▇ ▂▃▃▃▁▃▇▆ + ▅▇▁▃▃▅█▁ ▇▁▄▃▇▃▂ ▃▃█▃▃▁▂ + ▁▁▁▁▁▅▁ █▁▄▂▁▁▆ ██▃▆▂▁ + ▁▁▃▁▁▅▅ ▅▇▁▃▇▃▃▇ ▂▁▅ ▁▁▁ + ▇▇▁▂▁▅▁ ▁ ▁▁▆▅▁▁ ▅ ▁▅▃▆ + █▂▁▂▁▂▁ ▅▃▆▆▇█▆▁ ▅▅▁▃ ▁ + ▃ ▅▁▁▆ ▁ ▂▇ ▅▅▅▅▅▅ ▆▇▄▄▇▇▇▇▇▇▄▇▆▆ ▁▄▁▁▂▂ + █▂ ▁▁▁▃▁ ▇▃▇▅▅█▅█ ▆▁▁▃▇█▇▇▄█▂█▇█ █▁▁▁▁ + ▁▆▃▃▁▅ ▁▂ ▆▁▅▆▅ ▃▃▇▇▁▁▄▄▇▇ ▁▁ ▅ + ▁█▁▆▅▆▇▃▅ ▆▂▅▅▁▅▁█ + █▃▇▁▅▁▂█▃▂ ▂▄▇▂▅▅▁▆▂ + █▇█▁▁▁▆ ▁▆ ▂▇▂▅▄▄▄▅▂ + ▃▂▃▇▁▃▆█▁▇▂ ▅▇▂▁▇▁▇▃▇ + █▇▂▇▁▇▇▂█▃▇▇▇▇▇▂▂▆▄▇▇▇▁▂▄▇▁▇▂▂▅▂ + ▇▆█▇▁▁▂▃██▇▁█▇▇▇▇██▇▇▁▃▂▇▇ + ▇█▅▇▇▁▁▇▄▂▂▂▂▂▂▄▇▇▇█ + ▂ ███▇▇██▂ + + diff --git a/codex-rs/tui/frames/hbars/frame_112.txt b/codex-rs/tui/frames/hbars/frame_112.txt new file mode 100644 index 0000000000..b7c8b0fd18 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_112.txt @@ -0,0 +1,27 @@ + + + ▂▂▂▄▄▇▇▇▇▇▇▇▇▆▂▂ + ▂▅▇▆▅▁▇█▆▃██ █▇▇▂ + ▆▇▆▁▇▄▇█▆▂▆▇▅▇▇▄▁▁▁▇▇▇▇▇▂ ▇▇▂ + ▆█▅▇█▇█▄▄▇▇▁▃ ▆█▇▇▄▆█▃▂ + ▆▇▁▁▇▆█▆▁ ▇▇█▇▆▆▇▃ + ▅▅▅▁▂▇ ▅ ▄▆▆▆▂ ▃▄ █▃▃█▁ + ▅▃▅▅▆▇▂▁▂ ▃▃▂▃▇▇▂ ▇▃ ▃▁ ▁ + ▆▅▁▃▃▇█▁ █▁▃▃▅▆▇▅▂ ▇▃ ▃▁ ▁ + ▁▁▁▁▁█▅▂ ▇▃▂█▃▃▂█ ▃▅ ▁▁█▆ + ▂▁▁█▁▂▅▁ ▂▇▁▂█▃█▆█ ▁ ▁▁▂▁ + ▁▃█ ▁ ▃ █▇▂▅▃ ▅ ▁▆▃▁▅▁ + ▁▂▁▂▁ ▃ ▂▇▂▇▅ ▅▇ █▅▁▁▁▁ + █▂ ▃▁▂ ▁ ▅▁▆▁▃ ▂▁▂ ▆▄▄▄▇▄▄▇▇▄▇▇▆▂ ▃█▁▁▂▁ + ▆ ▁▁▁█▁ ▂▅▅▅▇▂ ▄▇ ▃▁▁▄▇▇█▇▇▇█▂▁▇▁▆▁▂▁▃█▁ + ▃▆█▃▇▅█▁ ▁▁█▅▅█ ▇▄▂▇▁▇▇▄▄▇▇▇▇▅▂▁▄▁▅▂ + ▃█▁▅▁ █▃ ▅▃▂▃▇▂▅ + ▃▇▁▁▃▂▃▇▂ ▂▅▂▅▆▅ ▅ + ▃▅▁▁▁▂▆▃▃▂ ▂▇▇▆▇▅▁▆▇ + ▇▆█▁▁▄▆█▄▇▇▂▂ ▂▆▇█▁▇▅▁▃▅▂ + ▇▆▃▇▁▃▆▅▇▁▇▇▇▇▇▂▂▆▄▇▇▇▁▂▇▇▁▇█▂▇█ + █▇▂▁▁▃▂ ▂ █▇▁█▅▇▇▇██▇▇██▂▇▇▂ + ▂▂▅▇▇▇▁▇▇▆▂▂▂▂▂▂▄▇▇▇▇▂ + ▂ ██▇▇███▂ + + diff --git a/codex-rs/tui/frames/openai/frame_000.txt b/codex-rs/tui/frames/openai/frame_000.txt new file mode 100644 index 0000000000..3420a1e1f2 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_000.txt @@ -0,0 +1,27 @@ + + + aaaanppppppppppaa + paoieoopoaaaaeeeaaooaoopa + aeinoooapaipoiionpiooooppa opa + poiepoappeoo piioopna op + aoiepoaee pooipaop + piieeoei pnpiiann + eeieo io ionnno annipai + peiiooia onaoieii aonaipai + ooiinio ionnnnaei opoianp + inoiaaii onioaeiiae eiaii i + eini ni paee oie oiiiei + o nn ei oaeiio no niiii + iaii e pieeo eia annpnpppppppppp ieei i + oin ip aeiioo eoa eiinaooooooooo innini + neine in oiea aia oiopppppp i iioia + nniiaaip oppon peaeeoee + nnni nna nonoeaee + niiip oina aiapioaio + opooip opop eapoiopopno + oioiip anpoonipaapppppooipipooapoa + oooopnpiionieoooniinpoo apoo + oopnipiinaaaaaappnooa + aaoooooooa + + diff --git a/codex-rs/tui/frames/openai/frame_004.txt b/codex-rs/tui/frames/openai/frame_004.txt new file mode 100644 index 0000000000..c54ca63570 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_004.txt @@ -0,0 +1,27 @@ + + + aaaanppppppppppaa + paeieoopooapaeee oooaoopa + aeiioioanaipoiioniioooopna opa + pioepoapieoo poonna op + aoiepoaneo opooipaop + piieeaei neiiann + eiioo io nnoanno onoipoi + peiioaia onaaaenp enoiiai + ooiieio aiiinnnn aopoiinp + iooia i paiooaeio iaii i + oieioai paeio epe niiioi + o ne oip aeiio pnoa ii i + iaiiooon nieee neaa annpnppnppppppp p ei i + oip ia eiioooeo o iaoooooooooooo inniai + noinaoip oieo aio eponppaiiinnnpp eeeiaia + nnnipaia oppo a peaeioee + pnniaonpa aonoeoee + naiipeoena aenpioaio + opoiia opop aapoiopiano + oioiip oopooiipaapppppoiinipooapoa + aooopnaeiinpiooooipnpoooapoo + oopiippnnaaaaaappnooa + aaoooooooa + + diff --git a/codex-rs/tui/frames/openai/frame_008.txt b/codex-rs/tui/frames/openai/frame_008.txt new file mode 100644 index 0000000000..7639d68ba6 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_008.txt @@ -0,0 +1,27 @@ + + + aaaanppppppppppaa + aaeioooioaapaeee aooioopa + aeiiopoaenppoionniiooonpna onp + piioioaapiooe poonna op + poieeapio opaoipoop + eiipoaio ppap oaaiiann + eiepppio oaopnoe noipan + eiei pi nioonopo nainai + iiin iia oiinipna onoipii + iiai iio oa ininop aii i + iiai io opiin eie iiiai + pien np aoiia aia a iiiiia + ooii ii eeeoa ie eapnpnppnppppppp aoii i + oiai oei aiieaeaio eaiioooooonooooo ianiai + iain nna aooee po naoippiiiinnnnp poiiaeo + aiin nna apppo eoeeope + eiin oiia aenoeopo + eoiia nopa aeippoaio + a nnpa nioppaei aapoiopiano + oioioe ooiooiipaapppppooipipooaaoa + aiiopaaiionpeiioiiinooooaipo + oapiiipnaaaaaaappnooa + aaoooooooa + + diff --git a/codex-rs/tui/frames/openai/frame_012.txt b/codex-rs/tui/frames/openai/frame_012.txt new file mode 100644 index 0000000000..475cb233d0 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_012.txt @@ -0,0 +1,27 @@ + + + aaanpppppppnppa + apeioopooaappa niaooioopa + apieioapanpoiionnppooonnnpaooop + pepioanioiooe piopap opa + aieionnopoee oioia on + eiiaoieo pppa ipi nna + eiieaiia nnapopoe onoiaaop + eiieaioe aoniaaana oeipana + iioaiioa apniinnona noi ni + iio pio nnoiiipoa oiie ep + nii ii oenaa ni iii ii + iii iio piio aoea iiiiii + poi iip eaeieoipeo ppnnnpppppppppp iii ii + ia ie iieoapio a iieoooooooooooooai nioi i + iii oei oii peaao anonppppeiiiinnnoaaeiipeo + iin oen oppo aeeeeni + ain opop eioeoei + niip opopa apieeoaeo + oiiia opoopaa anoineienea + aoiia opioiippanppppppoiiiioaaaoa + oopaea oooniiiiiippooa apoo + ooooppnaaaaaaaapnnpoa + aoooooooa + + diff --git a/codex-rs/tui/frames/openai/frame_016.txt b/codex-rs/tui/frames/openai/frame_016.txt new file mode 100644 index 0000000000..7e03a99764 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_016.txt @@ -0,0 +1,27 @@ + + + aaapppppppppppa + paeoioooaaeiappaooiooppa + eneooaanppoiipnnppiiienaaoponp + aepoapnpopooi aopinpaipona + epoeiiopo ooiiinnon + aiienio ppp oiipoppp + aiiieieo iionaip nin nnn + iiiei pineopona oii nin + ieeiie oiininaona oin pip + ieeii nniiinonae oii iio + iai ioi oii eonio ii ea + iaa ioe noeeoipoo oio ea + ie iii aepoeiio ppppnnpppppnppp oioaii + pieienp pioennpei oeooooooeoooooopi aiipei + onp inia opaeano inppppppiieiiiio enoani + nnp nnoa oppoa ainieooo + onp noip pipioeio + oinaonoipa apiioppio + oinaonpiipaae aneiioiaee + oiipaooiiioippnnppppppoiiioo apo + aooaaa aooppiiiiiioooo appeo + oioninpaaaaaaaapnnpoo + aoooooooa + + diff --git a/codex-rs/tui/frames/openai/frame_020.txt b/codex-rs/tui/frames/openai/frame_020.txt new file mode 100644 index 0000000000..a0fbdd877e --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_020.txt @@ -0,0 +1,27 @@ + + + aaaapnpppppppaaa + paeioooaannepnaooopoopnea + pnoiopannoinppnnppeoippaoionei + ppaaaneopoo eninaopopoa + po ppoopoao ooinonano + ea aioea pp nnopnep + e piai eonoi ann ionn + ea pipoi ieeopnna nn inip + aopaiae oinipnoin ip nio + i aiii oinoopnna oi ioii + iioiia anaio niio iiaie + ieoiine poe neoea inoii + nioiiia eeeaniae anppppnnnnnnnnpa inaia + opnniene aoooeoo poooooooooooooie nieii + inninoi noepea ippppppiiniipie anninp + in inen aa aoeeee + inpnopoai peaioae a + nipopopoa apoeiiaep + oinaonnioppae apeoaiiopoo + ooip opiiiioppppppppppiiopoanopo + oopaa ooopppppieenooa apooaa + oooiippaaaaaaapppppo + aooooooaa + + diff --git a/codex-rs/tui/frames/openai/frame_024.txt b/codex-rs/tui/frames/openai/frame_024.txt new file mode 100644 index 0000000000..eefc7abd6a --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_024.txt @@ -0,0 +1,27 @@ + + + apapnpppppnaaa + aenioa o oooaooiooppnpa + aeo appoonppnnppnnpaeoioopop + eo pooaponp nionpnoponin + po aeoopa nopn nonan + e neap npap opponnpi + i eepa noai onpoinni + i ieea iionop iioinei + pa pi n anoan nnpopion + ieiiie ien onn ooi iaoo + ieiiap ni pno eeiiin + iaioai oao aoo niiiii + ieoeip ieaooee anpppnnnpnpnnpa ao iiii + ipioai aiooaio inaaooooooooooieo iioieie + ieopnaa napna opppappaaapppie aiepno o + iaopnop einoe e + oiaopnon aonaoo p + ia nopopa eeppaeae + oiaoiannopaa apoaponoapa + oiaaoaiopiinppnaaapppooppenepopo + ooipa oooooioooippoioopopioa + aoopnnnaaaaaapppioooo + aooooooaaa + + diff --git a/codex-rs/tui/frames/openai/frame_028.txt b/codex-rs/tui/frames/openai/frame_028.txt new file mode 100644 index 0000000000..f8ba2bed01 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_028.txt @@ -0,0 +1,27 @@ + + + apainpppppnaaa + pnooa aooipaie + anoa appooiipnnnpnpa aaopaop + aeo apoope inp oonaop + pooaeo pa nip enanan + ieeee a po oipaanipn + ioeioe a opooo onoonien + eiieo a pnonpn opeapnei + ianiee nnana po i iin + ionoi pnoopno ai oai p + iniiaio i a enop nonoiieo + i iiie iioooo o oioiiie + ii oiia opp poeapnpppnnnppnpn pooniie + i ii i anie ea oeeepaaneeepaip ipiie p + ianeno noa onnniaaaaaaapo neain e + innoao aioi p e + oianiion pieeao pa + ipanop aeoaeae ea + oiaoniio a aapoiio oao + oinoioiioinnpnappppiiioapeaiaea + oippiiiiooooooinoopaaeeaeo + ooippiiniiiinpoiiooo + aooooooa a + + diff --git a/codex-rs/tui/frames/openai/frame_032.txt b/codex-rs/tui/frames/openai/frame_032.txt new file mode 100644 index 0000000000..b5d991cb6a --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_032.txt @@ -0,0 +1,27 @@ + + + appnpnnpppnnae + aeeoo ooinaopa + anoiappoooipnnoopp anoooop + aioniooapoie inp nnn op + poaioo en ip inp oa + eopipea a ein napaip + eoeioina inen oeaon ioia + aineo e ennpn o p nnn + ipni o npnnana noapipni + i ii i ineopoe apnpioae + oniioo anieoeene iiieoii + eoiin opeooeio e iiiio + iiiioi aiaaia appninpnnnnp ipioii + ipei n onaie iaoopnnaennae noniiiii + oiipi ppppnainiaip eiei o e + ieneaoi aa noieeo e + ianiien eoaeie pa + iioonao aiope eepa + onanoopoi pioaeopaae + oiippoonipninpppppiioapeaa po + oiiiipioooooooooaeapoaaea + aooinaaaaaapponooeoo + aooooooa a + + diff --git a/codex-rs/tui/frames/openai/frame_036.txt b/codex-rs/tui/frames/openai/frame_036.txt new file mode 100644 index 0000000000..aa087c17df --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_036.txt @@ -0,0 +1,27 @@ + + + appppnpppnaae + aapooanee oooooippinp + pionnpoooopnooip oeno ona + aioieoaapo op piaaon + pepioo ia nnpp na + pepee a n onineoa + ipee eanao n nnnpan + iaii anoeoaop ean pani + iina popeaon e naonnea + i io eoiipenane n iippii + i no aanopenne i iii ii + inna oie eoo i niiioi + ieeo i poeio eappppppnpn oiiiaiii + iieiap o eo iooooooooonn e ioaiii + inei i npppppinaaio ioioiiiaa + oiooi i aaaaa ae epe i + niiin n piai e + niinnaon po eo pa + oiipinao aioppaeo e + niipoepionpnapppiiaaonia po + opaoooooioioooaeanooapo + oppnaaaananoopoaeoa + ooooaa oa + + diff --git a/codex-rs/tui/frames/openai/frame_040.txt b/codex-rs/tui/frames/openai/frame_040.txt new file mode 100644 index 0000000000..48eeff60c7 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_040.txt @@ -0,0 +1,27 @@ + + + appppppnppaaa + pnooaennaoopiinpiopa + pioapopooinopnaooipa ana + eoeioanoo ooon on + iaoia eoeip ai + iioi aapn peno ni + nnei onnain oeoannpn + iiia inn ia ponpii aa + aoii nnn nao aiaiiiii + iiii einpinnap ooiniepo + eiii ninenipp ieiiiaii + neii naeeo e a i iiiiii + ioio neae paapppppppp oaiiapei + oeep oe poooooooooii i i iiin + iiep aopppainanio eoioiiiii + ieeipo a aaaaa i npiiiio + iinn oa iaiaeiiei + inopaon aiaeeeo i + iipinao poaoeea ae + oaopnnpioppppapooppeoa po + opa oooiiiiooapnaoa po + opnaepaappoeoanpo + aoooaa a + + diff --git a/codex-rs/tui/frames/openai/frame_044.txt b/codex-rs/tui/frames/openai/frame_044.txt new file mode 100644 index 0000000000..5a904dbada --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_044.txt @@ -0,0 +1,27 @@ + + + appnppapppaaa + peoapppoopioin opa + aiinopooiopnaonope op + poeoe ipna nnp + pnoea nnino ip + eio aap npnin ep + iee oinp eannonn + i i nineaap np ii i + pnai oioenaia eaiii i + iio nanioio ineie e + oio neieooi oiiioiii + eioa epeie iiiiaiii + iiei ai ei aappppppppoiiiiepii + oii i eie oooooooonpei nipiii + iepaape eopnninpieapaiiiii e + iipno ai aaaaaon ipii oi + ienaep enio eina + neinann poep e eo + neiapoop eoepne ee + naoippaoppaapoaeeaa no + onaoopnniooaapnia po + aopaaapeeonnaapoa + aoooa oa + + diff --git a/codex-rs/tui/frames/openai/frame_048.txt b/codex-rs/tui/frames/openai/frame_048.txt new file mode 100644 index 0000000000..9be8938972 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_048.txt @@ -0,0 +1,27 @@ + + + panipppoppp + poinpaonnionoonp + epioooiopannna on + eieop nina eai + iiaa inna oai + ano apa npieepnn + ieiiippo e nn noa + n i oen n inonn i + eiia piiinp i inniii + iin oieen o ppoipenp + iii inniii ieiioeii + iiia n ooo iniiiiii + iien ie aappppp iniiiiii + iioieap ooooooin ioiiiiii + eiioia ppninpeo ioiii na + ieooi aoiii iiiai + ooni i aoeniiiiae + iiepana iep eiipi + opiinooae aipipio epa + opoapaoopapeap ee ia + onaopnieoanopoa ae + opaaaaponoa aea + aooaaaaoa + + diff --git a/codex-rs/tui/frames/openai/frame_052.txt b/codex-rs/tui/frames/openai/frame_052.txt new file mode 100644 index 0000000000..0cdec2a8fa --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_052.txt @@ -0,0 +1,27 @@ + + + aenpppnappa + eopponoen oaip + ieepoonopnpao nn + nieoe oiee nn + iia e ninn noa + iioaaaa inioo ii + ooiiapoo n oi oiep + ii iiini p ii ain + eei eeain iiie oi + iio iiina iepiini + iie oiein ieinea iep + iie ineaoo aeaiiie ii + ie ii aaappppnaiiiiiii + io no oooooaiioaiiiiia + iie i nnnaioiin ii i + eii pe aoiii ii oi + iioi aneo ii ai + iiin iippaiiop + iion pinniiii e + nionaonaoeaio eei + napioeaeaio ee + opaapoaeoeaio + oooaooo + + diff --git a/codex-rs/tui/frames/openai/frame_056.txt b/codex-rs/tui/frames/openai/frame_056.txt new file mode 100644 index 0000000000..e26a304d48 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_056.txt @@ -0,0 +1,27 @@ + + + pnppppappa + epanneeeooip + nieonnoia oip + pioeinipp opon + ini aaennn oen + iapaop iinio oi + iiip i oii aeiin + neoe iip ai i + oioipo aioaiie + nenoani iioiipei + ieinnpi iieooiei + ieoeooi iioa iii + oeniaaap iieiioii + nnioooin iie ii i + oni e iiiiiiini + iioapp a eiiii ei + iii ii n aiiii i + aio a niii pepaa + ioa i i nnoa ii + nianoenepi iiao + nopooeno oe + paaeao no + ooaoooo + + diff --git a/codex-rs/tui/frames/openai/frame_060.txt b/codex-rs/tui/frames/openai/frame_060.txt new file mode 100644 index 0000000000..883b65b3ef --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_060.txt @@ -0,0 +1,27 @@ + + + npppeopp + a nie oopn + eiiieaoaan + eeeini oiii + iiieiop oii + iiaieeini ni + iieoiiei ii + iiooiiiiaoo p + iieiioeaiiiai + iiiii iii nai + iinpo iooioii + iiaai i oieii + iiaaiaaeiiiio + iiiiiiiii in + iiaioi iii ie + iiniiiiiiiioi + ineeei e i + iieiioniio + eiiinipnain + inoino ioii + n i na paao + ooi oopnii + oooaooa + + diff --git a/codex-rs/tui/frames/openai/frame_064.txt b/codex-rs/tui/frames/openai/frame_064.txt new file mode 100644 index 0000000000..609b7b5a35 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_064.txt @@ -0,0 +1,27 @@ + + + pppppppp + inio ooni + iaio iaen + iiinaaoie + ieeiponii + ooe aaeai + oeoieoooi + aiai iena + ninap ei + iiiaaaiia + iiiopooiii + iiiipenei + iiiiiiaiia + iiiiiinaia + iiiiiiiiii + iieiiiiioi + iiiiiiiiai + iiiiiiiiei + iioinepiai + niniipoina + nioi i i a + oeoo eoe + ooooooa + + diff --git a/codex-rs/tui/frames/openai/frame_068.txt b/codex-rs/tui/frames/openai/frame_068.txt new file mode 100644 index 0000000000..71b09ac5a4 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_068.txt @@ -0,0 +1,27 @@ + + + pppepppnp + neonein o + ipaooaninn + oip p ioipi + iii aniii i + ooipienin i + niiaiiiii i + eiiieiniii i + iiiiiiniio i + iaiiiioein i + iiooiaieipei + ipoeaoooiiei + ai iii iiioi + a iiipiiioi + aiiiioioiii + nniii eaiii + ieiiiaeiiei + iineoiineni + ioipppipiai + onoo iooian + iip iieiei + iea ipaaa + aooooooa + + diff --git a/codex-rs/tui/frames/openai/frame_072.txt b/codex-rs/tui/frames/openai/frame_072.txt new file mode 100644 index 0000000000..6c7dd80bd4 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_072.txt @@ -0,0 +1,27 @@ + + + ppinpnpip + eaaieineaeo + iio a eiaonnn + pna oiiiipo e + iieienioiooniop + ioipiiiiiii ni + niioonoipi peie + iiiiiaiiinoi ai + iiiiiiiioiii pei + iiiineiie aoiiii + iio nieieepieeii + iiniepaonannonni + iiiiinoieenpnnii + iiiii ioiiiiioii + ii n iioionnipii + ionoioiiinnenai + ip oioin iiien + iii npnapoieii + oienep niieiipi + iip o ooeaioi + pn p noionee + oeie nanae + oooaoooa + + diff --git a/codex-rs/tui/frames/openai/frame_076.txt b/codex-rs/tui/frames/openai/frame_076.txt new file mode 100644 index 0000000000..c508e12f4d --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_076.txt @@ -0,0 +1,27 @@ + + + apoonpppiaa + oaeiiannoaeon + iieioneinioopnn + ieaeeenioeonoooip + ppniaoeeii pone + innee apepa nip + nienapoiino aii + iinaeii iiion ei + iinpiiaanaaii pnii + niiiii ainp iiai + iiiiie eiaipii ieni + iiiiie nea ini oini + iiiii eiinnopniii + iiiii einapiiaeio ii + iiiii nniiaaooeipeii + iiii nniionaapiniei + iiii nie ioinp + oiiiii oi eenoio + inonpiioep pi ipn + opne iinnieoninoo + oipe aaoppoeene + onpo opaoaano + oaaoaooa + + diff --git a/codex-rs/tui/frames/openai/frame_080.txt b/codex-rs/tui/frames/openai/frame_080.txt new file mode 100644 index 0000000000..835eeb629c --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_080.txt @@ -0,0 +1,27 @@ + + + pnoiapnoiaa + eoo ooiioapeiop + iaoepepi pooopopn + eoii eeipepaoa oonn + ioeiippino eaip + eeipeeano a ne + iiennipip aoa aeip + nii iioooi nnin oie + iniooiaiia enape ii + niiioiiii niin iei + iiiiiaaii ee e eoei + iiiioiaii iaia oiii + ieiiaoiii eaoin o eaiii + iiiii eio inioai o aaini + iiiie oi oa e aie eoiio + iiiii oi eoe aiiini + iiiiioii eiiia + nniiaeoioa enn + oip ainnnna aioa + nna nnannoppoaaipoe + oia on onpeoao + ona opaopaanoa + aoaaaaooa + + diff --git a/codex-rs/tui/frames/openai/frame_084.txt b/codex-rs/tui/frames/openai/frame_084.txt new file mode 100644 index 0000000000..e97ac9de2a --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_084.txt @@ -0,0 +1,27 @@ + + + apnoapnppppp + aio noiiooaneaona + aioaae eeapooooponin + peop aopopoe aa noni + peop iepiio oii + ieapeooenp a onp + iiienipiio oan ein + ii eiaaip ipnaa oeip + ioieoiipo neain oin + iiiiionii anep iii + ieiionioi p nipa iin + ioapoaaii inopai aie + io apieii oeaoapnnpona aaie + ii aaoiiii eeeae piooa iiii + io ooiiai ae i aioi ooeoi + i oooio ie niia + an oniaipi pipipi + nin oaon n ieanna + ii noin ia eo oioe + nn aoeinaoaaapoaenioe + oia anani ooppooopo + opa opaonaaaaeo + aoaaaaooa + + diff --git a/codex-rs/tui/frames/openai/frame_088.txt b/codex-rs/tui/frames/openai/frame_088.txt new file mode 100644 index 0000000000..985f1923a0 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_088.txt @@ -0,0 +1,27 @@ + + + epnianpnnpppa + pea pneieoaannnoop + aeae popoapooiioioinop + ei oeeeeenoi oipaoain + eaoaeoeoo neaain + eieepeena a oo oii + ainaoi pe ion n nipp + iiaeeooi ipop a ooii + ooo iaa neaoina onie + iiiiinni eoeno oeiii + iiiiiiie n aeiai oeiie + iaoiiiii eoieaapo eiin + ii ieiii iiaoeip poona niio + oeo oei eeeepee noooie iiiii + i e iia aiip noope ipo + oee ioio npa iiee + ip nianpnp aoeeina + oenopoipnp noeenne + innapnipon aeapipie + in nnnn oppaanoaiiiono + oiaaoaoni oonppoooaea + opp appopnaaaapoa + ooaaooooa + + diff --git a/codex-rs/tui/frames/openai/frame_092.txt b/codex-rs/tui/frames/openai/frame_092.txt new file mode 100644 index 0000000000..1b140cc38a --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_092.txt @@ -0,0 +1,27 @@ + + + appnoappppnipa + api poiooooaneinoonp + aeoaepooooapooiioopoeanp + eopenoa opo aeaooipn + iae poan ie onn + iiaanop pan ooii + eoooieap eiono aeni + aiepiini iepon oiea + iaii iao ipponan iii + iii pii ipeon eii + niiiiai ennaoo iie + niiaiii eeeeoe ioo + iiieiii eaeeeeea nnpppoin poio + iiiione neeeeio onoooioa piia + oiiiniipn ppi n oiononip inoii + oaiiiee i onpa a o ii + opanponoi po inne + oiannpnn i iaepie + oiananinaop anooaeeoe + na opiipaopaaaapoopiopopo + onanaiapp aoopppoooaao + opaappoipaaaaappo + ao aaooooa + + diff --git a/codex-rs/tui/frames/openai/frame_096.txt b/codex-rs/tui/frames/openai/frame_096.txt new file mode 100644 index 0000000000..500e06ed0e --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_096.txt @@ -0,0 +1,27 @@ + + + aapippppppiaa + apoapiiooioanpeoiooopa + aeneepoo aaeoooiioopnnpona + eo ppia apooonon + i eiee p eopn + ieeeieo ppao onn + onneipe eeona ooni + nepninp iieoi aoiep + oaoooi ipiei n iii + aiiiain nnnniao iie + ioioeii p npiiip eiiii + iiaoiii ienae eao ipiiii + oiiiiii iepp eo nppppnnn aoioea + piiiipp ippoanoe iaoooioo i nie + i iiiii pee pa nipoonp ioeeip + ninoppp iapo nooiiia + onni eea onooipne + ninoiniaoe aeonppie + onnapinn ope apo iooee + na aoinaoopnaaaapponapieoia + na aooippaooopppooooapo + oppaaeaipaaaaaanpoa + aoaaaooooa + + diff --git a/codex-rs/tui/frames/openai/frame_100.txt b/codex-rs/tui/frames/openai/frame_100.txt new file mode 100644 index 0000000000..1e382a12ff --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_100.txt @@ -0,0 +1,27 @@ + + + eaapnpppppppaa + ppapneooaeooaoeaiooopa + apaaepoeeeappooniioopnnioop + eo eenee ipoaneop + aipapoooa a ooeo + aiaieep pna enpi + ieneene eioia ennpi + eeeiiea pianiaa aapin + i epoi onpaon n iii + iaiioii oinooneo ipip + i oiino oi aen ap iiai + iaonani ennoe ai iioi + i aoiia inaoeaae nnnnnppnonaa nieii + oa iii iappoipe iieoooinaaai iioa + ieoinean ipei ao oipionnppn eiann + oniiion i inpo oo aeepa + niiiini ia eopoiie + nnoniinaop eiaoaaoeee + op ooiieoia anooaopipo + oa ooipaoiinpaappppoiapopiee + opaooina oiooppoopooopoa + aoeaoooonnaaaaapppoo + a aoooooa + + diff --git a/codex-rs/tui/frames/openai/frame_104.txt b/codex-rs/tui/frames/openai/frame_104.txt new file mode 100644 index 0000000000..05a5f7d5c9 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_104.txt @@ -0,0 +1,27 @@ + + + aepnpnpppppppaa + apopieooa ooopp + poaepoo apnpooniioopnpiiopa + poeeeapoapo naoipnona + e npopope oieennon + ooepoe e nnan n ioen + ioeiaeoi enoopn on ieen + iannepeea nnpannna a neap + ininina oin oioi n iinp + ioiiiioi p iipeiai ieop + oiooii i aae io ei o ii i + iiaeii i aopena eo ieiioi + no iiioi poeeioeia nppnpppnnp niiipi + aaooe p eapie ai peaoooinoao epinia + n iiiipi opeiaa iopiinnppp aiiii + oiannnioi pe aniaa + nanenipaia aeaeoeoo + onoiinp ip anoapeiio + on ooinaoipa apoaeapoea + on ooonaoioppppappppoianopippo + opaaonpaa ooioooooopoioieo + oi ooioppaaaaaapapoo + a aooooooa + + diff --git a/codex-rs/tui/frames/openai/frame_108.txt b/codex-rs/tui/frames/openai/frame_108.txt new file mode 100644 index 0000000000..0e1b459976 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_108.txt @@ -0,0 +1,27 @@ + + + aeannpppppppppaa + pnippooo oppa + aeopioneeeappoiiiiiooppnanoop + aeoeeonapno apoppiiop + eanpoiapi oenooeia + iieipooii ppin p innnp + ineiponi nneeio ananinop + eoinneoi oinaona naonnia + iiiiiei oinaiip oonpai + iiniiee eoinonno aie iii + ooiaiei i iipeii e ieap + oaiaiai enppoopi eein i + n eiip i ao eeeeee ppnnppppppnppp iniiaa + oa iiiai onoeeoeo piiaoooonoaooo oiiii + ipanie ia piepe nnppiinnpp ii e + ioipepone paeeieio + onoieiaona anoaeeipa + opoiiip ip aoaennnea + naaoinpoipa eoaioipno + opaoiopaonoopppaapnppoianoioaaea + opooiiaaoooiooooooopoiaapo + ooeopiipnaaaaaanppoo + a oooooooa + + diff --git a/codex-rs/tui/frames/openai/frame_112.txt b/codex-rs/tui/frames/openai/frame_112.txt new file mode 100644 index 0000000000..364e61b750 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_112.txt @@ -0,0 +1,27 @@ + + + aaannpppppppppaa + aeopeioopaoo oopa + popionpopappeooniiioopppa opa + poepoponnpoia poopnpona + poiiopopi opooppon + eeeiao e npppa nn onnoi + eneepoaia ananooa on ni i + peinnooi oinneppea on ni i + iiiiioea onaonnao ne iiop + aiioiaei aoiaoaopo i iiai + ino i n opaea e ipniei + iaiai a aoaoe eo oeiiii + oa nia i eipia aia pnnnpnnppnpppa noiiai + p iiioi aeeepa no aiinoooooooaioipiainoi + nponpeoi iioeeo onapippnnpppoeainiea + noiei on enanoae + noiinaapa aeaepe e + neiiiapana apopoeipo + opoiinponppaa apooioeiaea + opaoinpeoioopppaapnppoiapoipoapo + opaiina a ooioeooooopoooapoa + aaeoopipppaaaaaanppooa + a oooooooa + + diff --git a/codex-rs/tui/frames/shapes/frame_000.txt b/codex-rs/tui/frames/shapes/frame_000.txt new file mode 100644 index 0000000000..34689f7cdb --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_000.txt @@ -0,0 +1,27 @@ + + + ◆◆◆◆●□□□□□□□□□▲◆◆ + ▲◆□◇△□■□□◆◆◆◆△△△◆◆■□◆□□□◆ + ◆△◇○□■□◆▲◆◇□□◇◇□●□◇■□□□□▲◆ ■□◆ + ▲□◇△▲□◆□▲△□□ ▲◇◇■□□●◆ □▲ + ◆□◇△▲□◆△△ □■□◇▲○□▲ + ▲◇◇△△■△◇ ▲○▲◇◇◆○○ + △△◇△■ ◇□ ◇■○○○□ ○●○◇▲○◇ + ▲△◇◇□■◇◆ □○◆■◇△◇◇ ◆□○○◇▲○◇ + □□◇◇○◇□ ◇□●○○○◆△◇ □▲□◇◆○▲ + ◇○■◇◆◆◇◇ □○◇□○△◇◇○△ △◇◆◇◇ ◇ + △◇●◇ ○◇ □◆△△ □◇△ ■◇◇◇△◇ + ■ ○○ △◇ ■◆△◇◇■ ●□ ○◇◇◇◇ + ◇◆◇◇ △ ▲◇△△■ △◇◆ ◆●●□●□□□□□□□□□▲ ◇△△◇ ◇ + □◇● ◇▲ ◆△◇◇□■ △□◆ △◇◇●○□□□□□□■■■ ◇●○◇○◇ + ○△◇○△ ◇○ □◇△◆ ◆◇◆ ■◇■▲▲▲▲▲▲ ◇ ◇◇■◇◆ + ○○◇◇◆○◇▲ □□□□● ▲△◆△△■△△ + ○○○◇ ○●◆ ●□●□△◆△△ + ○◇◇◇▲ □◇○◆ ◆◇◆□◇□◆◇■ + ■▲□□◇▲ □▲□□ △◆□□◇□□□▲●□ + ■◇□◇◇□ ◆○▲□□○◇□◆◆▲▲▲□□□□◇□◇□□■◆▲□◆ + □■□□□●▲◇◇□●◇△■□□●◇◇●□□■ ◆□□■ + □□□●◇□◇◇●◆◆◆◆◆◆▲□●□□◆ + ◆◆■■□■■■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_004.txt b/codex-rs/tui/frames/shapes/frame_004.txt new file mode 100644 index 0000000000..90b7986ec0 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_004.txt @@ -0,0 +1,27 @@ + + + ◆◆◆◆●□□□□□□□□□▲◆◆ + ▲◆△◇△□■□□■◆▲◆△△△ ■■□◆■□□◆ + ◆△◇◇□◇□◆●◆◇□□◇◇□●◇◇■□□□□●◆ ■□◆ + ▲◇□△▲□◆□◇△□■ □■□○●◆ □▲ + ◆□◇△▲■◆●△□ ■□■□◇▲○□▲ + ▲◇◇△△○△◇ ○△◇◇◆○○ + △◇◇□■ ◇□ ○●■◆○○□ □●□◇▲■◇ + ▲△◇◇□◆◇◆ □○◆○○△○▲ △○■◇◇○◇ + □□◇◇△◇□ ◆◇◇◇○○○○ ◆■▲□◇◇○▲ + ◇□■◇◆ ◇ ▲○◇□□○△◇■ ◇◆◇◇ ◇ + □◇△◇■◆◇ □◆△◇■ △□△ ●◇◇◇■◇ + ■ ○△ □◇▲ ◆△◇◇■ ▲●□◆ ◇◇ ◇ + ◇◆◇◇■■□○ ●◇△△△ ●△◆◆ ◆●●□●□□●□□□□□□▲ ▲ △◇ ◇ + □◇▲ ◇◆ △◇◇□■■△□ □ ◇○□□■□□□■■■■■□ ◇●○◇◆◇ + ○■◇○◆■◇▲ □◇△■ ◆◇■ △▲□●□□◆◇◇◇●●●□□ △△△◇◆◇◆ + ○○○◇▲○◇◆ □□□□ ◆ ▲△◆△◇■△△ + ▲○○◇◆■○□◆ ◆□●□△■△△ + ○○◇◇▲△□△○◆ ◆△●□◇□◆◇■ + ■▲□◇◇◆ □▲□□ ◆◆□□◇□□◇◆●□ + ■◇□◇◇□ ■□▲□□◇◇□◆◆▲▲▲□□□◇◇●◇□□■◆▲□◆ + ◆■□□□●◆△◇◇●□◇■□□□◇□●□□■■◆□□■ + ■□□◇◇□□●●◆◆◆◆◆◆▲□●□□◆ + ◆◆■■□■■■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_008.txt b/codex-rs/tui/frames/shapes/frame_008.txt new file mode 100644 index 0000000000..2a60281047 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_008.txt @@ -0,0 +1,27 @@ + + + ◆◆◆◆●□□□□□□□□□▲◆◆ + ◆◆△◇□□■◇□◆◆▲◆△△△ ◆■□◇■□□◆ + ◆△◇◇□□□◆△●□□□◇□●●◇◇■□□○□●◆ ■○▲ + ▲◇◇□◇■◆◆□◇□■△ □■□○●◆ □▲ + ▲□◇△△◆▲◇□ ■□◆□◇▲■□▲ + △◇◇▲■◆◇□ ▲▲◆▲ ■○◆◇◇◆○○ + △◇△▲▲▲◇■ □◆■▲○□△ ○□◇▲○○ + △◇△◇ ▲◇ ○◇■■○■▲□ ○○◇●○◇ + ◇◇◇○ ◇◇◆ ■◇◇●◇▲○◆ ■○□◇▲◇◇ + ◇◇◆◇ ◇◇■ □◆ ◇○◇○■▲ ◆◇◇ ◇ + ◇◇◆◇ ◇■ ■□◇◇● △◇△ ◇◇◇○◇ + ▲◇△● ○□ ◆□◇◇◆ ◆◇○ ◆ ◇◇◇◇◇◆ + □□◇◇ ◇◇ △△△□◆ ◇△ △◆□●□●□□●□□□□□□▲ ◆□◇◇ ◇ + ■◇○◇ ■△◇ ◆◇◇△◆△◆◇■ △○◇◇□□□□□□○■■■■■ ◇◆○◇◆◇ + ◇○◇○ ○○◆ ○■□△△ ▲□ ○◆□◇□□◇◇◇◇●●●●□ ▲□◇◇◆△■ + ◆◇◇● ○○◆ ○□□□■ △■△△□▲△ + △◇◇○ □◇◇◆ ◆△●□△■▲□ + △□◇◇◆ ○□□◆ ◆△◇□▲□◆◇□ + ○ ○○□◆ ○◇□□▲◆△◇ ◆◆□□◇□□◇◆●□ + ■◇□◇□△ □□◇□□◇◇□◆◆▲▲▲□□□□◇□◇□□■◆◆□◆ + ◆◇◇□▲◆◆◇◇□●▲△◇◇□◇◇◇●□□■■◆◇□■ + ■○□◇◇◇□●◆◆◆◆◆◆◆▲□●□□◆ + ◆◆■■■■■■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_012.txt b/codex-rs/tui/frames/shapes/frame_012.txt new file mode 100644 index 0000000000..29f6d751a7 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_012.txt @@ -0,0 +1,27 @@ + + + ◆◆◆●□□□□□□□●▲▲◆ + ◆▲△◇□□□□■◆◆▲▲◆ ●◇◆■□◇□□□◆ + ◆□◇△◇□◆▲◆●□□◇◇□●●□□□□□○○●▲◆□■□▲ + ▲△□◇□◆○◇□◇□■△ □◇□□◆▲ ■□◆ + ◆◇△◇■●●□□■△△ □◇□◇◆ ■○ + △◇◇○■◇△□ ▲▲▲◆ ◇□◇ ○○◆ + △◇◇△◆◇◇◆ ●○◆▲□▲□△ ■○□◇◆○□▲ + △◇◇△◆◇□△ ○□○◇○○◆○◆ □△◇▲○○◆ + ◇◇□◆◇◇■◆ ○▲○◇◇○○■○○ ○■◇ ○◇ + ◇◇□ □◇■ ○○□◇◇◇▲□◆ ■◇◇△ △▲ + ○◇◇ ◇◇ □△○◆◆ ●◇ ◇◇◇ ◇◇ + ◇◇◇ ◇◇■ ▲◇◇□ ◆□△○ ◇◇◇◇◇◇ + ▲□◇ ◇◇▲ △◆△◇△■◇□△■ ▲□●●●□□□□□□□□□▲ ◇◇◇ ◇◇ + ◇◆ ◇△ ◇◇△□◆▲◇□ ◆ ◇◇△□□□■□□□□■■■■■○◇ ○◇□◇ ◇ + ◇◇◇ □△◇ □◇◇ ▲△◆◆■ ◆○□●□□□□△◇◇◇◇●●●□◆◆△◇◇▲△■ + ◇◇○ □△○ □□□□ ◆△△△△●◇ + ○◇○ ■▲□▲ △◇□△■△◇ + ○◇◇▲ □▲□□◆ ◆▲◇△△■◆△□ + ■◇◇◇◆ □□□□□◆◆ ◆●□◇○△◇△●△◆ + ◆■◇◇◆ □□◇□◇◇□□◆●▲▲▲□□□□◇◇◇◇□◆◆◆□◆ + □□□◆△◆ ■□□●◇◇◇◇◇◇□□□□◆ ◆□□■ + ■□■□□▲●◆◆◆◆◆◆◆◆▲●●□□◆ + ◆■■□■■■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_016.txt b/codex-rs/tui/frames/shapes/frame_016.txt new file mode 100644 index 0000000000..96743807fd --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_016.txt @@ -0,0 +1,27 @@ + + + ◆◆◆▲□□□□□□□□▲▲◆ + ▲◆△□◇□□■◆◆△◇◆▲▲◆■□◇■□□▲◆ + △●△□■◆◆●□□□◇◇□●●□□◇◇◇△○◆◆■□□○▲ + ◆△□□◆▲●□□□□■◇ ◆□□◇○□◆◇▲□○◆ + △□□△◇◇□□□ ■□◇◇◇●○□● + ◆◇◇△●◇□ ▲▲▲ □◇◇▲■▲□▲ + ◆◇◇◇△◇△■ ◇◇■○◆◇▲ ○◇● ○○○ + ◇◇◇△◇ □◇○△■▲□○◆ □◇◇ ●◇○ + ◇△△◇◇△ □◇◇○◇○◆□○◆ □◇● ▲◇▲ + ◇△△◇◇ ○○◇◇◇○■○◆△ ■◇◇ ◇◇□ + ◇◆◇ ◇■◇ □◇◇ △□●◇■ ◇◇ △○ + ◇◆○ ◇■△ ●□△△■◇▲■■ ■◇■ △○ + ◇△ ◇◇◇ ◆△▲□△◇◇□ ▲□□□●●□□□□□●□□▲ ■◇□◆◇◇ + □◇△◇△○▲ ▲◇■△●○□△◇ □△□□□■■■△■■■■□□□◇ ◆◇◇▲△◇ + ■○▲ ◇○◇○ □▲○△○●□ ◇○□□□□□□◇◇△◇◇◇◇□ △○■◆○◇ + ○○▲ ○○□◆ □□□□◆ ◆◇○◇△■□■ + □○□ ○■◇□ ▲◇▲◇□△◇■ + ■◇●◆■○□◇□◆ ◆▲◇◇□▲▲◇□ + □◇●◆■○▲◇◇□◆◆△ ◆●△◇◇□◇◆△△ + □◇◇▲◆■□◇◇◇□◇□□●●▲▲▲▲□□□◇◇◇□□ ◆□□ + ◆□□◆◆◆ ◆□□□□◇◇◇◇◇◇□□□■ ◆▲□△■ + ■◇□●◇●▲◆◆◆◆◆◆◆◆▲●●□□■ + ◆■■□□■■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_020.txt b/codex-rs/tui/frames/shapes/frame_020.txt new file mode 100644 index 0000000000..b7365eb5cb --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_020.txt @@ -0,0 +1,27 @@ + + + ◆◆◆◆□●□□□□□□▲◆◆◆ + ▲◆△◇□□■◆◆○●△▲○◆□□□□□□□●△◆ + ▲●□◇■▲◆●●□◇●□□●●□□△□◇□□◆■◇□○△◇ + ▲□◆◆◆●△□▲□□ △○◇○◆■□□□□◆ + ▲□ ▲▲□□▲■◆■ ■□◇○■○○○□ + △◆ ◆◇□△○ ▲▲ ○●■▲○△▲ + △ ▲◇◆◇ △■○■◇ ◆○○ ◇□○○ + △◆ ▲◇▲■◇ ◇△△□▲○○◆ ○○ ◇○◇▲ + ◆□▲◆◇◆△ ■◇○◇▲○■◇○ ◇▲ ●◇□ + ◇ ◆◇◇◇ □◇●□□▲○○◆ ■◇ ◇□◇◇ + ◇◇■◇◇○ ◆○◆◇□ ●◇◇■ ◇◇○◇△ + ◇△■◇◇○△ ▲■△ ●△□△◆ ◇○■◇◇ + ○◇■◇◇◇◆ △△△◆●◇◆△ ◆●□□□□●●●●●●●●▲◆ ◇○○◇◆ + ■▲○○◇△○△ ◆□□□△□□ ▲□□□□□□■■■□□□□◇△ ○◇△◇◇ + ◇○○◇○■◇ ○■△▲△◆ ◇□□□□□□◇◇○◇◇□◇△ ◆○○◇○▲ + ◇○ ◇○△○ ◆◆ ◆□△△△△ + ◇○▲○■▲□◆◇ ▲△◆◇□○△ ◆ + ○◇▲■□□▲□◆ ◆▲□△◇◇◆△▲ + ■◇●◆■○●◇□□▲◆△ ◆▲△□◆◇◇□▲■■ + ■□◇▲ □□◇◇◇◇□□□▲▲▲▲▲□□□◇◇□□□◆●□▲■ + □□□◆◆ ■□□□□□□□◇△△●□■◆ ◆□□□○◆ + ■□□◇◇▲▲◆◆◆◆◆◆◆▲▲□□□□ + ◆■■□□■■◆◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_024.txt b/codex-rs/tui/frames/shapes/frame_024.txt new file mode 100644 index 0000000000..052f0174a8 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_024.txt @@ -0,0 +1,27 @@ + + + ◆▲◆□●□□□□□●◆◆◆ + ◆△●◇■◆ ■ ■□■○■□◇□□□▲●▲◆ + ◆△■ ◆▲□□■●□□●●□□○●▲◆△■◇■□□□▲ + △□ ▲□□◆□□○□ ○◇□○▲○■□□○◇○ + ▲□ ◆△□■▲○ ●□□○ ○□○◆○ + △ ●△◆▲ ●□◆▲ □▲□□●○▲◇ + ◇ △△▲○ ○□◆◇ □○□■◇○○◇ + ◇ ◇△△○ ◇◇■○□▲ ◇◇■◇○△◇ + ▲◆ ▲◇ ○ ◆○□◆○ ●○▲□▲◇□● + ◇△◇◇◇△ ◇△○ ■○○ ■□◇ ◇○■■ + ◇△◇◇◆▲ ○◇ □○□ △△◇◇◇○ + ◇○◇□◆◇ ■◆□ ◆□■ ○◇◇◇◇◇ + ◇△□△◇□ ◇△◆■■△△ ◆●□□□●●●□●□●●□◆ ◆■ ◇◇◇◇ + ◇▲◇□◆◇ ◆◇■■◆◇□ ◇●○○□□□□□□□□□□◇△□ ◇◇■◇△◇△ + ◇△■▲○○◆ ○◆▲●◆ ■□□□◆□□◆◆◆□□□◇△ ◆◇△□○■ ■ + ◇◆□▲○■▲ △◇○■△ △ + ■◇◆□▲○■○ ◆■○◆□■ ▲ + ◇◆ ○■□□□◆ △△□▲◆△◆△ + □◇◆■◇○○●□□◆◆ ◆□□◆□■●■○▲◆ + □◇◆◆■○◇□□◇◇○□□●◆◆◆□□□□□▲□△●△▲□▲■ + ■□◇▲◆ ■□□□□◇□□□◇□□□◇□□□□▲◇■◆ + ◆□□□●●●◆◆◆◆◆◆▲□□◇□□■■ + ◆■■□□■■◆◆◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_028.txt b/codex-rs/tui/frames/shapes/frame_028.txt new file mode 100644 index 0000000000..f27f4fc2ad --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_028.txt @@ -0,0 +1,27 @@ + + + ◆▲◆◇●□□□□□●◆◆◆ + ▲●□□◆ ◆□□◇□◆◇△ + ◆●□◆ ◆▲□□■◇◇□●●●□○□◆ ◆○□□◆□▲ + ◆△■ ◆□□■▲△ ◇○▲ □□●◆□▲ + ▲■■◆△□ ▲○ ○◇□ △○○○◆○ + ◇△△△△ ◆ ▲□ □◇▲◆○○◇▲○ + ◇■△◇□△ ◆ ■▲□□■ □○■□○◇△○ + △◇◇△□ ○ ▲○■○□● □▲△○▲○△◇ + ◇◆○◇△△ ○○◆○○ □■ ◇ ◇◇○ + ◇■●□◇ ▲○□■▲○■ ◆◇ ■◆◇ ▲ + ◇●◇◇◆◇■ ◇ ◆ △○□▲ ●■○■◇◇△■ + ◇ ◇◇◇△ ◇◇■■□■ □ ■◇■◇◇◇△ + ◇◇ ■◇◇◆ □▲▲ ▲■△◆▲●□□□●●●□□●□● ▲■■●◇◇△ + ◇ ◇◇ ◇ ◆●◇△ △◆ □△△△□○○●△△△□○◇▲ ◇▲◇◇△ ▲ + ◇◆○△●■ ○□◆ □●●●◇◆◆◆◆◆◆◆□■ ●△◆◇● △ + ◇○○■◆□ ◆◇■◇ ▲ △ + ■◇○○◇◇□○ ▲◇△△◆■ ▲◆ + ◇▲○●□▲ ◆△□◆△◆△ △◆ + □◇◆□●◇◇□ ◆ ◆◆□□◇◇□ ■◆□ + □◇●■◇□◇◇□◇○●□●◆□□□□◇◇◇□◆▲△◆◇◆△◆ + □◇□▲◇◇◇◇□□□□□□◇●□■▲◆◆△△○△□ + ■□◇□□◇◇●◇◇◇◇○□□◇◇■□■ + ◆■■□□■■◆ ◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_032.txt b/codex-rs/tui/frames/shapes/frame_032.txt new file mode 100644 index 0000000000..7de2bb926d --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_032.txt @@ -0,0 +1,27 @@ + + + ◆▲□●□●●□□□●●◆△ + ◆△△□■ ■□◇○◆□□◆ + ◆●□◇◆▲□□■□◇□●●□□□▲ ◆○□□■■□ + ◆◇□●◇□□◆□□◇△ ◇○▲ ○○○ ■▲ + ▲□◆◇□■ △● ◇▲ ◇○▲ □◆ + △□▲◇□△◆ ◆ △◇○ ○○▲◆◇▲ + △□△◇□◇●◆ ◇○△○ ■△◆■○ ◇■◇◆ + ◆◇○△□ △ △○○▲○ □ ▲ ○○○ + ◇▲○◇ ■ ○▲○○◆○◆ ○■○▲◇▲○◇ + ◇ ◇◇ ◇ ◇○△■▲□△ ◆▲○▲◇■○△ + □○◇◇□■ ○○◇△■△△○△ ◇◇◇△■◇◇ + △□◇◇○ ■▲△□■△◇■ △ ◇◇◇◇□ + ◇◇◇◇■◇ ◆◇◆◆◇◆ ◆▲□●◇●□●●●●□ ◇▲◇□◇◇ + ◇▲△◇ ○ □○◆◇△ ◇○□□□●●○△●●○△ ●■○◇◇◇◇◇ + □◇◇▲◇ □□□□●◆◇●◇◆◇□ △◇△◇ ■ △ + ◇△○△◆■◇ ◆◆ ●□◇△△■ △ + ◇○○◇◇△○ △□◆△◇△ ▲◆ + ◇◇□□○◆□ ◆◇■▲△ △△▲◆ + □●○○□□▲□◇ ▲◇□◆△□▲◆◆△ + □◇◇□▲□□○◇□●◇●▲▲▲□□◇◇□◆▲△◆○ □■ + □◇◇◇◇□◇■□□□□□□□■◆△◆□□○◆△◆ + ◆□□◇●◆◆◆◆◆◆▲□□●□■△□■ + ◆■■■□■■◆ ◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_036.txt b/codex-rs/tui/frames/shapes/frame_036.txt new file mode 100644 index 0000000000..2bcc314b12 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_036.txt @@ -0,0 +1,27 @@ + + + ◆▲□□□●□□□●◆◆△ + ◆◆□□■◆●△△ ■■□■□◇□□◇○▲ + ▲◇□●●□□□□■□●□□◇▲ ■△○□ ■○◆ + ◆◇□◇△□○◆□■ □▲ ▲◇◆◆■○ + ▲△▲◇□■ ◇◆ ○○▲▲ ○◆ + ▲△▲△△ ◆ ○ ■○◇○△□◆ + ◇▲△△ △○○◆□ ○ ○○○▲○○ + ◇◆◇◇ ○○■△□◆■▲ △○○ ▲◆○◇ + ◇◇○◆ ▲■▲△◆□○ △ ○◆■○○△◆ + ◇ ◇■ △■◇◇▲△●○○△ ● ◇◇▲▲◇◇ + ◇ ○■ ◆◆○■▲△○●△ ◇ ◇◇◇ ◇◇ + ◇○●○ ■◇△ △□■ ◇ ○◇◇◇■◇ + ◇△△□ ◇ ▲□△◇■ △◆□□□□□□●□● □◇◇◇◆◇◇◇ + ◇◇△◇○▲ □ △■ ◇□□□□□□□□□○○ △ ◇□◆◇◇◇ + ◇●△◇ ◇ ○□□□□□◇●◆◆◇□ ◇■◇■◇◇◇◆◆ + ■◇□■◇ ◇ ◆◆◆◆◆ ◆△ △▲△ ◇ + ○◇◇◇● ○ ▲◇◆◇ △ + ○◇◇○○◆□● ▲□ △■ ▲◆ + □◇◇▲◇○◆□ ◆◇□▲▲◆△■ △ + ○◇◇□□△□◇□○□●◆▲▲□◇◇◆◆□●◇○ ▲■ + □□◆■□□□□◇□◇□□□◆△◆●□□◆▲□ + ■□▲●◆◆◆◆●◆●□□▲□◆△□◆ + ■■■■◆◆ ■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_040.txt b/codex-rs/tui/frames/shapes/frame_040.txt new file mode 100644 index 0000000000..88a3dc56b4 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_040.txt @@ -0,0 +1,27 @@ + + + ◆▲□□□□□●□□◆◆◆ + ▲●□■◆△○○◆□□□◇◇●□◇□□◆ + ▲◇■◆□□□□■◇●□□●◆■■◇□◆ ◆○◆ + △■△◇■◆●□■ ■□■○ □○ + ◇◆□◇◆ △■△◇▲ ◆◇ + ◇◇□◇ ◆◆▲○ ▲△○■ ○◇ + ●○△◇ ■○○◆◇○ ■△■○○○▲○ + ◇◇◇◆ ◇○○ ◇○ ▲■○▲◇◇ ○◆ + ◆■◇◇ ○○○ ○○□ ◆◇◆◇◇◇◇◇ + ◇◇◇◇ △◇○▲◇○○○▲ ■■◇●◇△▲□ + △◇◇◇ ○◇○△○◇▲▲ ◇△◇◇◇◆◇◇ + ○△◇◇ ○◆△△■ △ ◆ ◇ ◇◇◇◇◇◇ + ◇■◇■ ○△◆△ ▲◆◆□□□□□□□□ ■◆◇◇◆▲△◇ + ■△△▲ ■△ ▲□□□□□□□□□◇◇ ◇ ◇ ◇◇◇○ + ◇◇△▲ ◆□□□□◆◇●◆●◇■ △□◇■◇◇◇◇◇ + ◇△△◇▲□ ◆ ◆◆◆◆◆ ◇ ○▲◇◇◇◇■ + ◇◇○○ □◆ ◇◆◇◆△◇◇△◇ + ◇○□□◆□○ ◆◇◆△△△■ ◇ + ◇◇▲◇○◆□ ▲□◆■△△○ ◆△ + □◆■□○●▲◇□□□▲▲◆▲□■▲▲△□◆ ▲□ + ■□◆ ■□□◇◇◇◇□□◆▲●○□○ ▲□ + □□●◆△▲◆◆□□□△□◆●□■ + ◆■■■◆◆ ◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_044.txt b/codex-rs/tui/frames/shapes/frame_044.txt new file mode 100644 index 0000000000..573c742db9 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_044.txt @@ -0,0 +1,27 @@ + + + ◆▲□●□□◆□□□◆◆◆ + ▲△□◆▲▲▲□■□◇□◇● □□◆ + ◆◇◇●□□□■◇□□●◆□○□▲△ ■□ + ▲□△□△ ◇▲○◆ ○○▲ + ▲○□△◆ ○○◇●■ ◇▲ + △◇■ ◆◆▲ ○▲○◇○ △▲ + ◇△△ □◇○▲ △○●○■○○ + ◇ ◇ ○◇○△◆○▲ ○▲ ◇◇ ◇ + ▲○◆◇ ■◇■△○◆◇◆ △◆◇◇◇ ◇ + ◇◇□ ○○○◇■◇□ ◇○△◇△ △ + □◇■ ○△◇△□■◇ ■◇◇◇■◇◇◇ + △◇■◆ △▲△◇△ ◇◇◇◇◆◇◇◇ + ◇◇△◇ ◆◇ △◇ ◆◆□□□□□□□▲■◇◇◇◇△▲◇◇ + □◇◇ ◇ △◇△ □□□□□□□□○▲△◇ ○◇▲◇◇◇ + ◇△□◆◆▲△ △□□●●◇●□◇△◆▲◆◇◇◇◇◇ △ + ◇◇▲○□ ◆◇ ◆◆◆◆◆■○ ◇▲◇◇ ■◇ + ◇△○◆△▲ △○◇■ △◇○◆ + ○△◇○◆○○ ▲□△▲ △ △□ + ○△◇◆□■□▲ △□△▲●△ △△ + ○◆□◇□□◆□□▲◆◆▲□◆△△◆○ ●■ + ■○◆■□□●●◇□□◆◆□○◇◆ ▲□ + ◆□▲◆◆◆▲△△□●●◆◆▲□◆ + ◆■■■◆ ■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_048.txt b/codex-rs/tui/frames/shapes/frame_048.txt new file mode 100644 index 0000000000..019b14c77b --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_048.txt @@ -0,0 +1,27 @@ + + + ▲◆●◇□▲▲□□▲▲ + ▲□◇●▲◆■○●◇□●■□○▲ + △▲◇■□■◇□□◆○○○◆ □○ + △◇△□▲ ○◇○◆ △◆◇ + ◇◇○○ ◇○○◆ ■○◇ + ◆○■ ◆▲◆ ○▲◇△△▲○○ + ◇△◇◇◇▲▲■ △ ○○ ○□◆ + ○ ◇ ■△○ ○ ◇●■○○ ◇ + △◇◇◆ ▲◇◇◇○▲ ◇ ◇○○◇◇◇ + ◇◇○ □◇△△● ■ ▲▲□◇▲△●▲ + ◇◇◇ ◇○○◇◇◇ ◇△◇◇■△◇◇ + ◇◇◇◆ ○ □■■ ◇○◇◇◇◇◇◇ + ◇◇△○ ◇△ ◆◆□□□□□ ◇○◇◇◇◇◇◇ + ◇◇■◇△◆▲ □□□□□□◇○ ◇■◇◇◇◇◇◇ + △◇◇□◇◆ □□●◇●□△■ ◇■◇◇◇ ○◆ + ◇△■□◇ ◆■◇◇◇ ◇◇◇○◇ + □□●◇ ◇ ◆■△○◇◇◇◇◆△ + ◇◇△▲○○◆ ◇△▲ △◇◇▲◇ + ■▲◇◇○■□◆△ ◆◇▲◇▲◇■ △▲◆ + ■▲□◆□◆□□□◆▲△◆▲ △△ ◇◆ + ■○◆□□●◇△□◆●□▲□○ ◆△ + ■□◆◆◆◆□□●□○ ◆△◆ + ◆■□◆◆◆◆■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_052.txt b/codex-rs/tui/frames/shapes/frame_052.txt new file mode 100644 index 0000000000..8368a3cf42 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_052.txt @@ -0,0 +1,27 @@ + + + ◆△●□□▲●○□▲◆ + △■▲▲■○□△○ ■○◇▲ + ◇△△□■□○□▲○▲◆■ ○○ + ●◇△■△ ■◇△△ ○○ + ◇◇○ △ ○◇○○ ○■◆ + ◇◇□◆◆◆◆ ◇●◇■■ ◇◇ + □■◇◇◆□□■ ○ ■◇ ■◇△▲ + ◇◇ ◇◇◇○◇ ▲ ◇◇ ◆◇○ + △△◇ △△◆◇○ ◇◇◇△ ■◇ + ◇◇■ ◇◇◇○◆ ◇△▲◇◇○◇ + ◇◇△ □◇△◇○ ◇△◇●△◆ ◇△▲ + ◇◇△ ◇●△○■■ ◆△◆◇◇◇△ ◇◇ + ◇△ ◇◇ ◆◆◆□□□□○◆◇◇◇◇◇◇◇ + ◇■ ○□ □□□□□○◇◇■◆◇◇◇◇◇◆ + ◇◇△ ◇ ○●●◆◇□◇◇● ◇◇ ◇ + △◇◇ ▲△ ◆■◇◇◇ ◇◇ ■◇ + ◇◇■◇ ◆○△■ ◇◇ ○◇ + ◇◇◇○ ◇◇▲▲◆◇◇■▲ + ◇◇□○ ▲◇○○◇◇◇◇ △ + ○◇□●◆□○◆□△○◇□ △△◇ + ○○□◇■△◆△○◇■ △△ + □□◆◆▲■◆△■△◆◇■ + ■□■◆■■■ + + diff --git a/codex-rs/tui/frames/shapes/frame_056.txt b/codex-rs/tui/frames/shapes/frame_056.txt new file mode 100644 index 0000000000..f5746b07d3 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_056.txt @@ -0,0 +1,27 @@ + + + ▲●□□▲▲○□▲◆ + △▲◆○○△△△■■◇▲ + ●◇△□○○■◇◆ ■◇▲ + □◇□△◇○◇□▲ ■▲■○ + ◇○◇ ○○△○○○ ■△● + ◇○▲◆■▲ ◇◇○◇■ □◇ + ◇◇◇▲ ◇ □◇◇ ◆△◇◇○ + ○△□△ ◇◇▲ ○◇ ◇ + ■◇■◇□■ ◆◇■◆◇◇△ + ○△○□◆●◇ ◇◇□◇◇▲△◇ + ◇△◇●●□◇ ◇◇△■■◇△◇ + ◇△□△□■◇ ◇◇■◆ ◇◇◇ + □△○◇◆◆◆□ ◇◇△◇◇■◇◇ + ●○◇■□□◇○ ◇◇△ ◇◇ ◇ + ■○◇ △ ◇◇◇◇◇◇◇○◇ + ◇◇□◆□▲ ◆ △◇◇◇◇ △◇ + ◇◇◇ ◇◇ ○ ◆◇◇◇◇ ◇ + ○◇■ ◆ ●◇◇◇ ▲△▲◆◆ + ◇■○ ◇ ◇ ○○□◆ ◇◇ + ○◇○○□△○△▲◇ ◇◇◆■ + ○□▲■■△●□ ■△ + □◆◆△◆□ ○□ + ■□◆■■■■ + + diff --git a/codex-rs/tui/frames/shapes/frame_060.txt b/codex-rs/tui/frames/shapes/frame_060.txt new file mode 100644 index 0000000000..42130b22a8 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_060.txt @@ -0,0 +1,27 @@ + + + ●□□▲△□□▲ + ○ ○◇△ □■▲○ + △◇◇◇△◆■○○○ + △△△◇●◇ ■◇◇◇ + ◇◇◇△◇□▲ ■◇◇ + ◇◇◆◇△△◇○◇ ○◇ + ◇◇△□◇◇△◇ ◇◇ + ◇◇■■◇◇◇◇○■■ ▲ + ◇◇△◇◇□△○◇◇◇◆◇ + ◇◇◇◇◇ ◇◇◇ ○◆◇ + ◇◇○□■ ◇■■◇■◇◇ + ◇◇◆○◇ ◇ ■◇△◇◇ + ◇◇◆◆◇◆◆△◇◇◇◇□ + ◇◇◇◇◇◇◇◇◇ ◇○ + ◇◇◆◇■◇ ◇◇◇ ◇△ + ◇◇○◇◇◇◇◇◇◇◇■◇ + ◇○△△△◇ △ ◇ + ◇◇△◇◇■●◇◇■ + △◇◇◇○◇□○◆◇○ + ◇○□◇○■ ◇□◇◇ + ● ◇ ○○ ▲○◆□ + □□◇ □■▲●◇◇ + ■□■◆■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_064.txt b/codex-rs/tui/frames/shapes/frame_064.txt new file mode 100644 index 0000000000..8be6f4f1ed --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_064.txt @@ -0,0 +1,27 @@ + + + □□□▲□□□▲ + ◇○◇■ ■■●◇ + ◇◆◇■ ◇○△○ + ◇◇◇○◆○■◇△ + ◇△△◇▲■○◇◇ + □■△ ○○△○◇ + □△■◇△□□■◇ + ○◇◆◇ ◇△○○ + ○◇●◆▲ △◇ + ◇◇◇◆○○◇◇◆ + ◇◇◇■▲□■◇◇◇ + ◇◇◇◇▲△●△◇ + ◇◇◇◇◇◇◆◇◇◆ + ◇◇◇◇◇◇○◆◇◆ + ◇◇◇◇◇◇◇◇◇◇ + ◇◇△◇◇◇◇◇■◇ + ◇◇◇◇◇◇◇◇◆◇ + ◇◇◇◇◇◇◇◇△◇ + ◇◇□◇○△▲◇◆◇ + ○◇●◇◇▲■◇○◆ + ○◇■◇ ◇ ◇ ◆ + □△■■ △□△ + ■□■■□■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_068.txt b/codex-rs/tui/frames/shapes/frame_068.txt new file mode 100644 index 0000000000..8acfd97c9d --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_068.txt @@ -0,0 +1,27 @@ + + + ▲□□△▲▲□●▲ + ○△■○△◇○ ■ + ◇▲◆■■○○◇○● + ■◇▲ ▲ ◇□◇▲◇ + ◇◇◇ ◆○◇◇◇ ◇ + ■□◇▲◇△○◇○ ◇ + ○◇◇◆◇◇◇◇◇ ◇ + △◇◇◇△◇○◇◇◇ ◇ + ◇◇◇◇◇◇○◇◇□ ◇ + ◇◆◇◇◇◇■△◇○ ◇ + ◇◇■■◇○◇△◇▲△◇ + ◇▲■△◆■■■◇◇△◇ + ○◇ ◇◇◇ ◇◇◇□◇ + ◆ ◇◇◇▲◇◇◇■◇ + ◆◇◇◇◇■◇□◇◇◇ + ○○◇◇◇ △○◇◇◇ + ◇△◇◇◇◆△◇◇△◇ + ◇◇○△■◇◇○△●◇ + ◇□◇▲▲▲◇▲◇◆◇ + ■○■■ ◇■■◇◆○ + ◇◇▲ ◇◇△◇△◇ + ◇△○ ◇□○◆◆ + ◆■■■■■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_072.txt b/codex-rs/tui/frames/shapes/frame_072.txt new file mode 100644 index 0000000000..f30b00e676 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_072.txt @@ -0,0 +1,27 @@ + + + ▲□◇●▲●□◇▲ + △○○◇△◇○△◆△□ + ◇◇■ ◆ △◇◆□○○○ + ▲○◆ ■◇◇◇◇▲■ △ + ◇◇△◇△○◇■◇■■●◇□▲ + ◇■◇▲◇◇◇◇◇◇◇ ○◇ + ○◇◇■■○■◇▲◇ ▲△◇△ + ◇◇◇◇◇◆◇◇◇○■◇ ◆◇ + ◇◇◇◇◇◇◇◇■◇◇◇ ▲△◇ + ◇◇◇◇●△◇◇△ ○□◇◇◇◇ + ◇◇■ ○◇△◇△△▲◇△△◇◇ + ◇◇○◇△▲○■○◆○○■○○◇ + ◇◇◇◇◇○■◇△△●□●●◇◇ + ◇◇◇◇◇ ◇□◇◇◇◇◇■◇◇ + ◇◇ ○ ◇◇■◇■○○◇□◇◇ + ◇■○■◇■◇◇◇○○△○◆◇ + ◇▲ ■◇■◇○ ◇◇◇△○ + ◇◇◇ ○▲○○▲□◇△◇◇ + ■◇△○△▲ ●◇◇△◇◇▲◇ + ◇◇□ ■ ■□△◆◇■◇ + ▲○ ▲ ○■◇□●△△ + ■△◇△ ○◆○◆△ + ■■■◆■■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_076.txt b/codex-rs/tui/frames/shapes/frame_076.txt new file mode 100644 index 0000000000..f42e486093 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_076.txt @@ -0,0 +1,27 @@ + + + ◆□□□●▲□□◇◆◆ + □○△◇◇○○○□◆△□○ + ◇◇△◇■○△◇○◇■□▲○○ + ◇△◆△△△○◇□△■○■■■◇▲ + ▲□●◇◆■△△◇◇ ▲■○△ + ◇○○△△ ◆▲△□◆ ○◇▲ + ○◇△○◆▲■◇◇○□ ○◇◇ + ◇◇○◆△◇◇ ◇◇◇□● △◇ + ◇◇○□◇◇◆◆○○◆◇◇ ▲●◇◇ + ○◇◇◇◇◇ ◆◇○▲ ◇◇◆◇ + ◇◇◇◇◇△ △◇◆◇▲◇◇ ◇△○◇ + ◇◇◇◇◇△ ○△◆ ◇○◇ ■◇○◇ + ◇◇◇◇◇ △◇◇○●□▲●◇◇◇ + ◇◇◇◇◇ △◇●◆▲◇◇◆△◇■ ◇◇ + ◇◇◇◇◇ ○○◇◇◆○□■△◇□△◇◇ + ◇◇◇◇ ○○◇◇□○◆○▲◇○◇△◇ + ◇◇◇◇ ○◇△ ◇■◇○□ + □◇◇◇◇◇ ■◇ △△○□◇■ + ◇○■○▲◇◇□△▲ ▲◇ ◇▲○ + ■▲○△ ◇◇○○◇△□●◇○□■ + ■◇▲△ ◆○■▲▲□△△○△ + ■○□□ ■□◆□◆◆●■ + ■◆◆■◆□■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_080.txt b/codex-rs/tui/frames/shapes/frame_080.txt new file mode 100644 index 0000000000..1cb3812dea --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_080.txt @@ -0,0 +1,27 @@ + + + ▲●□◇◆▲●□◇◆◆ + △□□ □■◇◇□◆▲△◇□▲ + ◇◆■△▲△▲◇ □□■□□□▲○ + △■◇◇ △△◇▲△▲◆■◆ ■■○○ + ◇■△◇◇▲▲◇○□ △○◇▲ + △△◇▲△△◆○■ ◆ ○△ + ◇◇△○○◇▲◇□ ◆□◆ ○△◇▲ + ●◇◇ ◇◇□■□◇ ○●◇○ ■◇△ + ◇○◇■■◇◆◇◇◆ △○◆▲△ ◇◇ + ○◇◇◇■◇◇◇◇ ○◇◇○ ◇△◇ + ◇◇◇◇◇◆◆◇◇ △△ △ △□△◇ + ◇◇◇◇■◇◆◇◇ ◇○◇◆ ■◇◇◇ + ◇△◇◇◆■◇◇◇ △◆■◇● □ △◆◇◇◇ + ◇◇◇◇◇ △◇■ ◇●◇■◆◇ □ ◆◆◇○◇ + ◇◇◇◇△ □◇ □◆ △ ◆◇△ △■◇◇□ + ◇◇◇◇◇ □◇ △□△ ◆◇◇◇○◇ + ◇◇◇◇◇■◇◇ △◇◇◇◆ + ●○◇◇○△■◇□◆ △○○ + □◇▲ ◆◇○○○○◆ ◆◇□◆ + ○○◆ ○○○○○□▲□□◆◆◇▲□△ + ■◇◆ □● □●□△□◆□ + □○◆ ■□◆□▲◆◆●□◆ + ◆■◆◆◆◆■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_084.txt b/codex-rs/tui/frames/shapes/frame_084.txt new file mode 100644 index 0000000000..49fbc54ab4 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_084.txt @@ -0,0 +1,27 @@ + + + ◆▲●□◆▲●□□□□▲ + ◆◇□ ●■◇◇□■◆●△◆□○◆ + ◆◇□◆◆△ △△◆□□□■□□■○◇○ + ▲△■▲ ○□▲□▲□△ ◆◆ ○■○◇ + ▲△■▲ ◇△▲◇◇□ ■◇◇ + ◇△◆▲△■■△○□ ◆ ■○▲ + ◇◇◇△○◇▲◇◇■ □◆○ △◇○ + ◇◇ △◇◆◆◇▲ ◇▲○◆○ ■△◇▲ + ◇□◇△■◇◇□■ ○△◆◇○ ■◇○ + ◇◇◇◇◇■●◇◇ ○○△▲ ◇◇◇ + ◇△◇◇■○◇□◇ ▲ ○◇□○ ◇◇○ + ◇■◆▲■◆◆◇◇ ◇○□▲◆◇ ◆◇△ + ◇■ ◆▲◇△◇◇ □△◆□○□●●□□○◆ ◆◆◇△ + ◇◇ ○◆■◇◇◇◇ △△△○△ □◇□■◆ ◇◇◇◇ + ◇■ □■◇◇◆◇ ◆△ ◇ ◆◇□◇ □□△■◇ + ◇ ■■□◇□ ◇△ ○◇◇◆ + ○○ ■○◇◆◇▲◇ ▲◇▲◇▲◇ + ○◇○ ■◆■○ ○ ◇△◆○○◆ + ◇◇ ○■◇○ ◇◆ △■ ■◇□△ + ○○ ◆■△◇○◆□◆◆◆□□◆△●◇■△ + □◇◆ ◆○◆○◇ ■□□□□□■▲■ + □□◆ ■□◆□○◆◆◆◆△□ + ◆■◆◆◆◆■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_088.txt b/codex-rs/tui/frames/shapes/frame_088.txt new file mode 100644 index 0000000000..13b6064605 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_088.txt @@ -0,0 +1,27 @@ + + + △▲●◇◆●□●●□□▲◆ + ▲△○ □●△◇△□◆◆●○●■□▲ + ◆△◆△ ▲□▲□◆□□□◇◇□◇■◇●□▲ + △◇ ■△△△△△●□◇ ■◇▲◆■○◇○ + △○■◆△□△■□ ○△◆○◇○ + △◇△△▲△△●○ ◆ □□ ■◇◇ + ◆◇○○■◇ ▲△ ◇□● ○ ○◇▲▲ + ◇◇◆△△■■◇ ◇▲□▲ ○ ■■◇◇ + ■■■ ◇◆○ ○△◆□◇○◆ ■○◇△ + ◇◇◇◇◇●●◇ △□△○■ ■△◇◇◇ + ◇◇◇◇◇◇◇△ ● ◆△◇○◇ ■△◇◇△ + ◇◆■◇◇◇◇◇ △□◇△◆◆▲■ △◇◇○ + ◇◇ ◇△◇◇◇ ◇◇◆□△◇□ □□□○◆ ●◇◇■ + ■△■ □△◇ △△△△□△△ ○□■■◇△ ◇◇◇◇◇ + ◇ △ ◇◇◆ ◆◇◇▲ ○□□□△ ◇□□ + □△△ ◇■◇■ ○▲◆ ◇◇△△ + ◇▲ ○◇○○▲○▲ ◆□△△◇○◆ + □△○■▲■◇▲○▲ ●□△△○○△ + ◇●○○▲○◇▲□○ ◆△◆▲◇▲◇△ + ◇● ○○○○ □□▲◆◆●□◆◇◇◇□○□ + ■◇◆◆■○■○◇ ■□●□□□□■◆△◆ + ■□▲ ◆□▲□□●◆◆◆◆□□◆ + ■■◆◆■□■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_092.txt b/codex-rs/tui/frames/shapes/frame_092.txt new file mode 100644 index 0000000000..e31ef02f0d --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_092.txt @@ -0,0 +1,27 @@ + + + ◆▲▲●□◆□□□□●◇▲◆ + ◆□◇ □■◇□■□■◆●△◇●■□○▲ + ◆△■◆△▲□■□■◆□□□◇◇■□□□△◆○▲ + △□▲△●□○ □▲□ ○△◆□□◇▲○ + ◇◆△ ▲■◆● ◇△ □○○ + ◇◇◆◆○■▲ □◆● ■□◇◇ + △□■□◇△◆▲ △◇□○■ ○△○◇ + ◆◇△▲◇◇●◇ ◇△▲□○ ■◇△◆ + ◇◆◇◇ ◇◆■ ◇▲▲□○◆○ ◇◇◇ + ◇◇◇ ▲◇◇ ◇▲△□○ △◇◇ + ○◇◇◇◇○◇ △●●◆■■ ◇◇△ + ○◇◇◆◇◇◇ △△△△■△ ◇□■ + ◇◇◇△◇◇◇ △○△△△△△◆ ●●□□□□◇● ▲■◇□ + ◇◇◇◇□○△ ●△△△△◇■ □●□■□◇■◆ ▲◇◇○ + □◇◇◇○◇◇▲○ □▲◇ ○ □◇□●□●◇□ ◇○□◇◇ + □◆◇◇◇△△ ◇ □○▲◆ ◆ ■ ◇◇ + □▲○○▲□○■◇ ▲□ ◇○○△ + □◇○○○▲○○ ◇ ◇◆△▲◇△ + ■◇◆○○○◇○◆□▲ ◆●□■◆△△□△ + ○◆ ■▲◇◇▲◆□□◆◆◆◆□□□▲◇□□□▲□ + ■○◆○○◇○▲▲ ◆□□□□□□□□◆◆□ + □□◆◆□▲□◇▲◆◆◆◆◆▲□■ + ◆■ ◆◆■□■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_096.txt b/codex-rs/tui/frames/shapes/frame_096.txt new file mode 100644 index 0000000000..dbf8cc8982 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_096.txt @@ -0,0 +1,27 @@ + + + ◆◆□◇▲□□□□□◇◆◆ + ◆▲■◆□◇◇□■◇■◆●▲△■◇■□□▲◆ + ◆△○△△□□■ ◆◆△□□□◇◇■□□●○▲□○◆ + △■ ▲▲◇◆ ○▲■□□●□○ + ◇ △◇△△ □ △□▲○ + ◇△△△◇△■ ▲□◆■ □○○ + □●●△◇▲△ △△■○◆ □□○◇ + ●△▲●◇○▲ ◇◇△■◇ ◆■◇△▲ + □○■■□◇ ◇▲◇△◇ ○ ◇◇◇ + ◆◇◇◇◆◇○ ○○○○◇◆■ ◇◇△ + ◇■◇■△◇◇ ▲ ○□◇◇◇▲ △◇◇◇◇ + ◇◇◆■◇◇◇ ◇△●◆△ △○■ ◇▲◇◇◇◇ + □◇◇◇◇◇◇ ◇△▲▲ △■ ●□□□□●●○ ◆■◇□△◆ + ▲◇◇◇◇▲▲ ◇▲▲□◆●■△ ◇◆□■■◇□■ ◇ ○◇△ + ◇ ◇◇◇◇◇ □△△ ▲◆ ○◇□□□●□ ◇■△△◇▲ + ○◇○■▲▲▲ ◇◆▲■ ●□■◇◇◇◆ + □○○◇ △△◆ ■●□■◇▲○△ + ○◇○□◇○◇◆□△ ◆△■●□▲◇△ + □○○○▲◇○● □▲△ ◆□■ ◇□□△△ + ○◆ ○□◇○◆■□□●◆◆◆◆□□□●◆□◇△■◇◆ + ○◆ ○□□◇▲▲◆□□□□□□□□□■◆□■ + ■□▲◆○△◆◇▲◆◆◆◆◆◆●□□◆ + ◆■◆◆◆■□■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_100.txt b/codex-rs/tui/frames/shapes/frame_100.txt new file mode 100644 index 0000000000..c8dfb7402e --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_100.txt @@ -0,0 +1,27 @@ + + + △◆◆□●□□□□□□□◆◆ + ▲□◆▲●△□□◆△□■◆■△◆◇■□□□◆ + ◆□○◆△□□△△△◆▲□□□●◇◇□□□●○◇■□▲ + △■ △△●△△ ◇▲□○●△□▲ + ◆◇▲◆▲□□□◆ ○ □■△□ + ◆◇◆◇△△▲ ▲●◆ △○▲◇ + ◇△○△△○△ △◇■◇◆ △○○▲◇ + △△△◇◇△◆ □◇◆○◇◆◆ ◆○▲◇○ + ◇ △▲□◇ □○▲◆□● ○ ◇◇◇ + ◇◆◇◇■◇◇ □◇○■□○△■ ◇▲◇▲ + ◇ ■◇◇○□ ■◇ ◆△○ ○□ ◇◇○◇ + ◇◆■○◆○◇ △○○□△ ◆◇ ◇◇■◇ + ◇ ◆■◇◇◆ ◇○◆■△◆◆△ ●●●●●□□●□●◆◆ ○◇△◇◇ + ■◆ ◇◇◇ ◇◆▲▲□◇▲△ ◇◇△□■□◇●◆◆◆◇ ◇◇■◆ + ◇△■◇○△◆○ ◇□△◇ ◆□ ■◇□◇□●●□□● △◇○○● + ■○◇◇◇□○ ◇ ◇○▲■ ■■ ◆△△□◆ + ○◇◇◇◇○◇ ◇◆ △■▲□◇◇△ + ○●■○◇◇○◆□▲ △◇◆□◆◆■△△△ + ■▲ □■◇◇△■◇◆ ◆●□■◆□▲◇▲■ + □◆ □□◇□◆■◇◇●□◆◆▲▲□□□◇◆□□□◇△△ + □▲◆□□◇●◆ □◇□□□□□□□□■■▲□◆ + ◆□△◆□■□□○●◆◆◆◆◆▲▲□□■ + ◆ ◆■□□■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_104.txt b/codex-rs/tui/frames/shapes/frame_104.txt new file mode 100644 index 0000000000..3ce7567e2e --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_104.txt @@ -0,0 +1,27 @@ + + + ◆△▲●□●□□□□□□□◆◆ + ◆□■▲◇△□□◆ ■□□□▲ + ▲□◆△□□■ ◆▲●□□□●◇◇□□□●▲◇◇□□◆ + ▲□△△△○▲■◆▲□ ●◆□◇▲○■○◆ + △ ●▲□▲■▲△ □◇△△○○□○ + □■△□■△ △ ●●○○ ○ ◇■△○ + ◇□△◇◆△■◇ △●■□▲○ ■○ ◇△△○ + ◇○○○△▲△△◆ ○○▲◆○○○◆ ◆ ○△○▲ + ◇●◇○◇○◆ □◇○ □◇■◇ ○ ◇◇○□ + ◇■◇◇◇◇■◇ ▲ ◇◇▲△◇◆◇ ◇△■▲ + ■◇□■◇◇ ◇ ◆○△ ◇□ △◇ ■ ◇◇ ◇ + ◇◇◆△◇◇ ◇ ◆□▲△●◆ △■ ◇△◇◇■◇ + ○■ ◇◇◇■◇ ▲□△△◇■△◇◆ ●□□●□□□●●▲ ○◇◇◇▲◇ + ◆◆■□△ ▲ △◆▲◇△ ◆◇ □△○□■□◇●■◆■ △□◇○◇◆ + ○ ◇◇◇◇▲◇ □▲△◇◆◆ ◇□□◇◇●●□□□ ◆◇◇◇◇ + ■◇◆○○○◇■◇ □△ ◆○◇○◆ + ○◆○△○◇▲○◇◆ ◆△◆△■△□■ + □●■◇◇○▲ ◇▲ ◆●□◆□△◇◇■ + ■○ □□◇●◆■◇▲◆ ◆□■◆△○□□△◆ + □● □□□●◆■◇□□□□▲◆▲▲□□□◇◆●□▲◇□▲□ + ■□◆○□○□◆◆ ■□◇□□□□□■□□◇□◇△■ + ■◇ ■□◇□□▲◆◆◆◆◆◆▲◆□□■ + ◆ ◆■■□□■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_108.txt b/codex-rs/tui/frames/shapes/frame_108.txt new file mode 100644 index 0000000000..dc60ce931a --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_108.txt @@ -0,0 +1,27 @@ + + + ◆△◆●●□□□□□□□□▲◆◆ + ▲●◇□□□□■ ■□▲◆ + ◆△□□◇□●△△△◆□□□◇◇◇◇◇□□□□○◆●□□▲ + ◆△□△△■●◆▲●□ ○▲■□□◇◇□▲ + △◆●▲□◇◆▲◇ □△○□□△◇◆ + ◇◇△◇▲□■◇◇ ▲□◇○ ▲ ◇○○○▲ + ◇○△◇▲□○◇ ○●△△◇□ ◆○○○◇○□▲ + △□◇○○△■◇ □◇●○□○◆ ○○■○○◇◆ + ◇◇◇◇◇△◇ ■◇●◆◇◇▲ ■■○▲◆◇ + ◇◇○◇◇△△ △□◇○□○○□ ◆◇△ ◇◇◇ + □□◇◆◇△◇ ◇ ◇◇▲△◇◇ △ ◇△○▲ + ■◆◇◆◇◆◇ △○▲▲□■▲◇ △△◇○ ◇ + ○ △◇◇▲ ◇ ◆□ △△△△△△ ▲□●●□□□□□□●□▲▲ ◇●◇◇◆◆ + ■◆ ◇◇◇○◇ □○□△△■△■ ▲◇◇○□■□□●■◆■□■ ■◇◇◇◇ + ◇▲○○◇△ ◇◆ ▲◇△▲△ ○○□□◇◇●●□□ ◇◇ △ + ◇■◇▲△▲□○△ ▲◆△△◇△◇■ + ■○□◇△◇◆■○◆ ◆●□◆△△◇▲◆ + ■□■◇◇◇▲ ◇▲ ◆□◆△●●●△◆ + ○◆○□◇○▲■◇□◆ △□◆◇□◇□○□ + ■□◆□◇□□◆■○□□□□□◆◆▲●□□□◇◆●□◇□◆◆△◆ + □▲■□◇◇◆○■■□◇■□□□□■■□□◇○◆□□ + □■△□□◇◇□●◆◆◆◆◆◆●□□□■ + ◆ ■■■□□■■◆ + + diff --git a/codex-rs/tui/frames/shapes/frame_112.txt b/codex-rs/tui/frames/shapes/frame_112.txt new file mode 100644 index 0000000000..ade6b78d0b --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_112.txt @@ -0,0 +1,27 @@ + + + ◆◆◆●●□□□□□□□□▲◆◆ + ◆△□▲△◇□■▲○■■ ■□□◆ + ▲□▲◇□●□■▲◆▲□△□□●◇◇◇□□□□□◆ □□◆ + ▲■△□■□■●●□□◇○ ▲■□□●▲■○◆ + ▲□◇◇□▲■▲◇ □□■□▲▲□○ + △△△◇◆□ △ ●▲▲▲◆ ○● ■○○■◇ + △○△△▲□◆◇◆ ○○◆○□□◆ □○ ○◇ ◇ + ▲△◇○○□■◇ ■◇○○△▲□△◆ □○ ○◇ ◇ + ◇◇◇◇◇■△◆ □○◆■○○◆■ ○△ ◇◇■▲ + ◆◇◇■◇◆△◇ ◆□◇◆■○■▲■ ◇ ◇◇◆◇ + ◇○■ ◇ ○ ■□◆△○ △ ◇▲○◇△◇ + ◇◆◇◆◇ ○ ◆□◆□△ △□ ■△◇◇◇◇ + ■◆ ○◇◆ ◇ △◇▲◇○ ◆◇◆ ▲●●●□●●□□●□□▲◆ ○■◇◇◆◇ + ▲ ◇◇◇■◇ ◆△△△□◆ ●□ ○◇◇●□□■□□□■◆◇□◇▲◇◆◇○■◇ + ○▲■○□△■◇ ◇◇■△△■ □●◆□◇□□●●□□□□△◆◇●◇△◆ + ○■◇△◇ ■○ △○◆○□◆△ + ○□◇◇○◆○□◆ ◆△◆△▲△ △ + ○△◇◇◇◆▲○○◆ ◆□□▲□△◇▲□ + □▲■◇◇●▲■●□□◆◆ ◆▲□■◇□△◇○△◆ + □▲○□◇○▲△□◇□□□□□◆◆▲●□□□◇◆□□◇□■◆□■ + ■□◆◇◇○◆ ◆ ■□◇■△□□□■■□□■■◆□□◆ + ◆◆△□□□◇□□▲◆◆◆◆◆◆●□□□□◆ + ◆ ■■□□■■■◆ + + diff --git a/codex-rs/tui/frames/slug/frame_000.txt b/codex-rs/tui/frames/slug/frame_000.txt new file mode 100644 index 0000000000..be426659a7 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_000.txt @@ -0,0 +1,27 @@ + + + ddddottttttttttdd + tdpe5pgtpeddec--eegpepptd + d5eopgpetdetpeepotegpppttd gtd + tpe5tpdtt5pp -exgptcd pt + dpe5tpd55 tgpetdpt + tee55p5e toteedoo + 55e5g ep egooop dcoetde + t5eepgee podpe5ex epodetde + ppxeoep epcoood5e ptpedot + eogeedex poepd5eed- -eeee e + 5ecx oe td5c pxc gxeece + g oo 5e pd5eeg cp oeexe + eeee 5 te55g 5ee doototttttttttt ec5e e + pec et d5eepp 5pe 5xeodppppppggg ecoeoe + o-eo5 eo pe5e dee gxg------ e eepee + ooeeddet pttpc t5e55g55 + oooe ood cpcp5e55 + oeeet peod dedtepdep + ptppet ptpt cdtpeptp-cp + gxpeet eotppoetddtttttppetetppdtpe + pgpptctxepox5gppceeotpg dtpg + pptceteecddddddttcppe + eeggpgggge + + diff --git a/codex-rs/tui/frames/slug/frame_004.txt b/codex-rs/tui/frames/slug/frame_004.txt new file mode 100644 index 0000000000..c3ef842ddd --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_004.txt @@ -0,0 +1,27 @@ + + + ddddcttttttttttdd + td5e5pgtpgdte--- pgpegptd + d5eepepecdetpeepoeegppptcd gtd + tep5tpdte5pg tgpocd pt + dpe5tgdc5p gtppetdpt + tee55d5e o5eedoo + 5eepg ep ocgeoop pcpetpe + t5eepdee poddd5o- 5opeede + ppxe5ep eeeeoooo egtpexot + epgee e tdeppd5eg eeee e + pe5xpde td5ep 5t- oxeepe + g o5 pet d5eeg -cpe gee e + eeeepgpo ce555 c5ee dootottottttttt tg5e e + pet ed 5eeppp5p p edppgpppgggggp ecoede + opeodget pe5p deg -tpcttdexecoott 555eeee + oooetded pttp e t5e5eg55 + tooedgotd dpcp5p55 + odeet-p5od d5ctepdep + ptpeed ptpt ddtpepteecp + pxpeet gptppeetddtttttpeecetpgdtpe + egpptcd5exctegpppetotpgpdtpg + gpteettocddddddttcppe + eeggpgggge + + diff --git a/codex-rs/tui/frames/slug/frame_008.txt b/codex-rs/tui/frames/slug/frame_008.txt new file mode 100644 index 0000000000..adec3d6c54 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_008.txt @@ -0,0 +1,27 @@ + + + ddddottttttttttdd + dd5eppgxpedte--- dgpxgptd + d5eeptpd-cttpepooeegppotcd got + teepegddtepg5 tgpocd pt + tpe55etep gtdpetppt + 5eetgdep ttdt pddeedoo + 5e5ttteg pegtopc opetdo + 5e5e te oeggogtp odecde + eeeo exe geecetod gopetee + eeee eep pdgeoeogt gdee e + xede eg gteec ce- eeede + te5c ot dpeee ded e eeexee + ppee ee 555pe e5 cdtotottottttttt dpee e + pxdegg5e dee5e5dep -dxeppppppoggggg edoede + edeo ood dgp5- tp odpetteexecooct tpeee5p + deec ood dtttg 5g55pt5 + 5eeo peed d5cp5ptp + -peed optd d5ettpdep + d ootd oepttdcx ddtpepteecp + gxpep5 ppeppeetddtttttppetetpgddpe + eeeptddxepot5eepeeeoppgpdetg + gdteeetodddddddttcppe + eeggggggge + + diff --git a/codex-rs/tui/frames/slug/frame_012.txt b/codex-rs/tui/frames/slug/frame_012.txt new file mode 100644 index 0000000000..447bbf6959 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_012.txt @@ -0,0 +1,27 @@ + + + dddotttttttottd + dt5epptpgddttdgcedgpxpptd + dte5epetdctpeepoottpppooctdpgpt + t5tepdoepepg5 teptdt gtd + de5egccptg-- peped go + 5eedge5p tttd ete ood + 5ee5deee coetptpc popeddpt + 5ee5dep5 dpoxdddod p5etdod + eepeeepe dtoeeoogod ope oe + eepgteg oopeeetpd gee5 5t + oee ee p5oee ce eee ee + xee eep teep dp5d eeexee + tpe eet cd5e5gxt5g ttoootttttttttt eee ee + ged e5 ee5petep e xe5pppgppppgggggde oepe e + eee p5e pee t5eep eopctttt5xeeecooped5ee-5g + eeo p5o pttp d5555ce + deo gtpt 5ep5p5e + oeet ptptd dte55gd5p + peeed ptpptdd dcpeo5ecc5e + egeed ptepeettdcttttttpeeeepeddpe + pptd-d gppoeeeeeettppe dtpg + gpgpttcddddddddtoctpe + eggpgggge + + diff --git a/codex-rs/tui/frames/slug/frame_016.txt b/codex-rs/tui/frames/slug/frame_016.txt new file mode 100644 index 0000000000..ac7b452be4 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_016.txt @@ -0,0 +1,27 @@ + + + dddtttttttttttd + td5peppgdd5edttdgpxgpttd + -c5pgddcttpeetootteee5oddgtpot + d5tpetctptpge epteotde-pod + 5tp5eeptp gpeeecopc + dee5cep ttt peetgttt + deee5e5p eegodet oec ooo + eee5e teo5gtpod pee ceo + e55ee5 peeoeodpod pec tet + e55eeg ooeeeopod- pee eep + eex egx pee 5pcep ee 5d + eed eg5 cp5-petgp geg 5d + e5 eee d5tp5eep ttttootttttottt pepexe + te-e5ot teg5cot5e p5pppggg5ggggppte deet5x + pot eoed ptd5dcp eottttttxe5eeeep 5ogdoe + oot oopd pttpe deoe5gpp + pot oget tetep5ep + gecdgopetd dteepttep + pecdgoteetdd- dc5eepxd55 + peetdgpeeepettccttttttpeeepp dtp + eppddd epptteeeeeepppg dtt5g + gxpoxctddddddddtoctpg + eggppggge + + diff --git a/codex-rs/tui/frames/slug/frame_020.txt b/codex-rs/tui/frames/slug/frame_020.txt new file mode 100644 index 0000000000..90d04f8458 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_020.txt @@ -0,0 +1,27 @@ + + + ddddtotttttttddd + td5eppgddoc-todppptpptc-d + tcpegtdcopecttoott5pettdgxpo5x + tteedc5ptpp -oeodgtptpd + tp -tpp-gep gpeopodop + 5e dep5d tt ocgto5t + 5 teee 5goge eoo epoo + 5e tetpx e5cptood oo eoet + dptdee5 geoxtogeo et cep + e eeee pecpptood ge epxe + eepeed eodep ceep exdx5 + e5peeo- tg5 c5p5e eogxe + oepeeed 5-5dcee5 dcttttooooooootd eodxe + ptoox5o- dppp5pp tppppppgggppppe5 oe5ee + eooeoge ogct5e etttttteeoexte5 dooxot + eo eo5o ee dp5555 + eotoptpdx t5eepd5 e + oetptptpd dtp5eee5t + pecdpocepttd- dt5pdeeptgg + gpet pteeeeptttttttttteeptpecptp + pptdd gppttttte55opge dtppde + gppexttdddddddtttttp + eggppggee + + diff --git a/codex-rs/tui/frames/slug/frame_024.txt b/codex-rs/tui/frames/slug/frame_024.txt new file mode 100644 index 0000000000..3ba7d8cd97 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_024.txt @@ -0,0 +1,27 @@ + + + dtdtotttttcddd + d-cxge p ppgdppxppttctd + d5g dttpgcttoottoctd-gxgptpt + 5p tppdtpot oepotogtpoeo + tp d5pgtd cpto opodo + 5 c5et ctdt pttpcote + e 55td opde potgeooe + e e5cd eegopt eegeo5e + te te o eopdo cotptepc + e5eee5 e5ogpoo ppe edgg + e5exdt oe top 55eeeo + edepee gdp dpg oxeeee + e5p5et x5epg55 dctttooototootd dg eeee + getepde deggdep ecddppppppppppe5p eege5e5 + e5ptodd odtce gtttdttdddttte- de5top p + edptopt 5eop5 - + pedptogo dpoepg t + ed ogtptd 55tte-d5 + pedgxdocptdd dtpdtgcpdte + peddgdepteeottcdddtttpptt5c5tptp + gpetd gppppepppettpepptp-epe + epptoccddddddttteppgg + eggppggeee + + diff --git a/codex-rs/tui/frames/slug/frame_028.txt b/codex-rs/tui/frames/slug/frame_028.txt new file mode 100644 index 0000000000..cb900795b3 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_028.txt @@ -0,0 +1,27 @@ + + + dtdxctttttcddd + toppe eppetdx- + dcpe dttpgeetooototd edptdpt + d5g dtpgt5 eot ppcdpt + tppd5p td oet cododo + e5555 d tp petedoeto + eg5epcge gtppg poppoe5o + 5ee5p d topotc pt-dto5e + edoe-5 oodod tp e eeo + egcpegg topptop ee gee t + eceeexp e e 5op- cgogxecg + egeee5 expppp p gegeee- + eeggeed ptt tp-dtotttooottotc tggoee- + e ee e ece5 5e pccctddoccctdet etee5 t + edo5cg ope pcccedddddddtg c5dec 5 + eoopdp dege t 5 + gedoeepo te55ep te + etdcpt d5pd5e5 5e + pedpcexp d ddtpxep pdp + pecgxpexpeoctodtttteeepet5exd5e + pettxeeeppppppeopgtdd5-d-p + gpetteeoeeeeotpeegpg + eggppgge e + + diff --git a/codex-rs/tui/frames/slug/frame_032.txt b/codex-rs/tui/frames/slug/frame_032.txt new file mode 100644 index 0000000000..0b8c32cb74 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_032.txt @@ -0,0 +1,27 @@ + + + dttotootttccd- + d-5pg gpeodptd + dcpedttpgpetoopptt eopppgt + depceppdtpe5 eot ooo gt + tpdepg 5c et eot pd + 5ptet-d d ceo odtdet + 5p5epece eo5o g5dpo eped + deo5p 5 -ooto p t ooo + etoe p otoodod opdte-oe + e ee e eo5ptp- etotepd5 + poeepp doe5p55o- exe5gee + 5peeo pt5pp5ep 5 eeeep + exeege deedee dttoeotoooot etepeeg + et5e o pode5 edpptcodcood5 cgoeeeee + peete ttttcdecedet 5e-e g 5 + e5o5dge ee cpx55g 5 + edoee5o 5pd5x5 te + eeppodp degt5 5-te + pcdopptpe tepe5pted5 + peettppoetcxcttttteepe-5ed tg + peeeetxgpppppppge-dtpdd5e + eppecddddddttpcpg-pg + egggpgge e + + diff --git a/codex-rs/tui/frames/slug/frame_036.txt b/codex-rs/tui/frames/slug/frame_036.txt new file mode 100644 index 0000000000..6bc263fd9b --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_036.txt @@ -0,0 +1,27 @@ + + + dttttctttcdd- + ddtpgdc-- ggpgpetteot + tepcctpppgtoppxt g-op god + depe5pddtg pt tedepo + t5tepg ed oott od + t5t55 d o poeo-pd + et55 cdodp o oootdo + eeee dop5pdpt 5do tdoe + eeoe tpt5dpo - odgoo5d + e ep -geet5cdo- o exttee + e og edogt5oc- e eee ee + eood pe5 5pp e oeeepe + e55p e tp-eg -dttttttoto peeeeeee + ee5edt p 5g epppppppppoo 5 epeeee + eo5e e ottttteoddep egepeeede + gepge e eeeee d5 5t5 e + oeeec o teee 5 + oeeoodpc tp 5g te + peetxodp depttd-p 5 + oeetpctepotcdttteeeepced tg + ptdgppppepepppecdcppdtp + gttcddddcdcpptpd-pe + ggggee pe + + diff --git a/codex-rs/tui/frames/slug/frame_040.txt b/codex-rs/tui/frames/slug/frame_040.txt new file mode 100644 index 0000000000..5e30c49ffa --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_040.txt @@ -0,0 +1,27 @@ + + + dttttttcttddd + tcpgd5oodppteectxptd + tegdtptpgeoptcdggetd eod + 5g5egecpg ppgo po + edpxe -p5et ee + expx ddto t5op oe + co5e gooeeo p5pdooto + eeee eoo ed tgotee dd + dgee ooo odp dedeeeee + exee 5eoteoodt ggeoectp + 5eee oeo5oe-t e5eeeeee + o5ee oe55g 5 e e eeeeee + egep o5e5 tddtttttttt peeedt-e + p55t g5 tpppppppppee e egeeeo + ee5t eptttdeodceg 5pegeeeee + e55etp e eeeee e oteeeep + eeoo pd eeee5ee5e + eoptdpo dee55-p e + eeteoep tpep55d d5 + pdgtoctepttttdtpgtt5pe tp + gtd gppeeeeppetcdpd tp + ptcd-tddttpcpdctg + egggee e + + diff --git a/codex-rs/tui/frames/slug/frame_044.txt b/codex-rs/tui/frames/slug/frame_044.txt new file mode 100644 index 0000000000..2c3a8bec70 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_044.txt @@ -0,0 +1,27 @@ + + + dttottdtttddd + t5pdtttpgtepec ptd + deecptpgeptcdpoptc gt + tp5p5 etod oot + top5e ooecp et + 5ep ddt otoxo 5t + e55 peot 5doopoo + ege oeo5ddt ot ee e + tode pep5oded 5deee e + eep odoepep eo5xc 5 + peg o-e5pgx geeepeee + 5ege 5t5e- xeeeeeee + ee5e de 5e ddttttttttgxeee-txe + gpee e 5e- ppppppppot-egoxteee + e5tdet5 5ptooeote5eteeexee 5 + eetop ex eeeeego etee pe + e5od5t 5oeg -xoe + o5eodoo tp5t 5 5p + o5edtppt 5p5tc5 55 + odpettdpttddtpe55dd cg + podgptooeppedtoee tp + eptdddt-5pcoedtpe + eggge ge + + diff --git a/codex-rs/tui/frames/slug/frame_048.txt b/codex-rs/tui/frames/slug/frame_048.txt new file mode 100644 index 0000000000..0921c33e5c --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_048.txt @@ -0,0 +1,27 @@ + + + tdoxtttpttt + tpectdgocepcgpot + 5tegpgeptdoood po + 5e5pt oeod -ee + eedd eood pde + dog dtd ote5ctoo + e5eeettg 5 oogopd + o e g5o o ecgoo e + -eee teeeot egeooeee + eeo pe55cgp ttpet5ot + eee eooexx e5eep5ee + eeee o pgp eoeeeeee + ee5o ge5 ddttttt eoeeeeee + eege5dt ppppppeo egeeeeee + 5eepee ttoeot5g epeee oe + e5ppx egeee eeede + ppce e dg5oeeeed5 + ee5tdod e5t 5eete + gteeoppd- eetxtxp 5te + ptpdtdpptdt5dt 5c ee + godptoe5pecptpd d5 + gtddddtpcpd d5e + egpeeeege + + diff --git a/codex-rs/tui/frames/slug/frame_052.txt b/codex-rs/tui/frames/slug/frame_052.txt new file mode 100644 index 0000000000..2214ab4fb2 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_052.txt @@ -0,0 +1,27 @@ + + + d-otttcdttd + 5gttgop5o gdet + e55tgpoptotep oo + ce5p5 ge55 oo + eed 5 oeoo opd + eepdded ecepg ee + pgeedtpp ogpe ge5t + ee eexoe t ee deo + 55e 55dxo eee5 gge + eeg eeeod e5teeoe + ee5 pe5eo x5xo5e x5t + ee5 ec5dpg e5deeec ee + e5 ee dddttttodeeeeeee + eg op pppppdxxgeeeeeee + ee5 e oocdepeeo ee e + 5ee -5 egeee eegge + eege do5g ee de + eeeo eet-eeept + eepo txooxeex 5 + oepcdpodp5dxp 55e + odtxg5e5dep 55 + ptddtgd5p-deg + gpgeggg + + diff --git a/codex-rs/tui/frames/slug/frame_056.txt b/codex-rs/tui/frames/slug/frame_056.txt new file mode 100644 index 0000000000..23e82cc35f --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_056.txt @@ -0,0 +1,27 @@ + + + tottttdttd + 5tdoo5-cpget + ce5poogee pet + tep5eoett ptgo + eox dd5ooo g5c + edtdpt eeoep pe + eeet e pee ecexo + o5p5 xxt de e + gegetp degeee5 + o5opdce eepeet5e + e5ecote ee5ppe5e + e5p5pge eege eee + p5oedddt ee5eepxe + ooegppxo eec ee e + goe cg eeeeeeeoe + eepett e 5eeee 5e + eee eeg o eeeee e + deg d ceee tc-de + epd e egoope ee + oedop5o5te xxdp + op-gg5cp g5 + tdd5dp op + gpepggg + + diff --git a/codex-rs/tui/frames/slug/frame_060.txt b/codex-rs/tui/frames/slug/frame_060.txt new file mode 100644 index 0000000000..9efc53706b --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_060.txt @@ -0,0 +1,27 @@ + + + ottt-ptt + d oe5 pgto + 5eee5egddo + 555ecx peee + eex5ept gee + eede55eoe oe + ee-pee5eg xe + eegpeeeedgg t + ee5xxp5deeeee + eeeex eex ode + eeotg eppxgee + eeedx e gx5ee + eeddxde-eeeep + eexexeeee eo + eedege eee e5 + eeoxxeeeeeege + eo555e -g e + gee5eegceeg g + 5eeeoetodeo + eopeog xpxe + o x od tddp + ppe pp-cee + gpgegge + + diff --git a/codex-rs/tui/frames/slug/frame_064.txt b/codex-rs/tui/frames/slug/frame_064.txt new file mode 100644 index 0000000000..c1fb7ba69e --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_064.txt @@ -0,0 +1,27 @@ + + + tttttttt + eoeggggoe + edep xd5o + exeoddge5 + e55etgoee + pg5gdd5de + p5ge5ppge + deex e-od + oeodt -e + eeeeddxed + eeegtpgxxx + eeee-5o5e + eeeeeeexee + eeeeeeodee + eeeeeeeeee + ee5eeeeege + eeeeeeeeee + eeeeeeee5e + eepeo5tede + oecex-geoe + oepe x e e + p5gg 5p5 + gpgppge + + diff --git a/codex-rs/tui/frames/slug/frame_068.txt b/codex-rs/tui/frames/slug/frame_068.txt new file mode 100644 index 0000000000..973341c810 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_068.txt @@ -0,0 +1,27 @@ + + + ttt-tttot + o5go5eo g + eteppdoeoo + get t epe-e + exe eoeee e + gpx-e5oeo e + oxxeeeeee e + 5eee-eoeee e + exeeeeoeep e + edeexeg5eo e + exgpede5et5e + etg-egggee5e + de eee eeepe + d eeeteeege + dxeeepepeee + ooeee 5deee + e5eeed-xe5e + eeocpxeo5ce + epe-ttetxee + pogg eggeeo + eet ee-e-e + e5d xtdde + egpgggge + + diff --git a/codex-rs/tui/frames/slug/frame_072.txt b/codex-rs/tui/frames/slug/frame_072.txt new file mode 100644 index 0000000000..0dd90ac9af --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_072.txt @@ -0,0 +1,27 @@ + + + ttxctctxt + 5ddx5eo5d-p + eeg e 5edpooo + toe pxeeetp 5 + ee5e-oegegpcept + egxteexeeee oe + oeeggogetx --x5 + eeeeedeeeogx ee + eeeeeeeegxee t5e + eeeeo5ee5 dpxeee + eeg oe5e5-tx55ee + eeoxc-dgodoogooe + eeeeeogx55ctooee + eeeee epeeeeepee + eego eegegooetee + egogegeeeoo5ode + et gepeo eee5o + eee otodtpe5xe + pe5octgcee5eete + eet gggp5depe + to - opepc55 + p5e- oeod5 + gggeggge + + diff --git a/codex-rs/tui/frames/slug/frame_076.txt b/codex-rs/tui/frames/slug/frame_076.txt new file mode 100644 index 0000000000..bb73198edc --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_076.txt @@ -0,0 +1,27 @@ + + + dtppctttxdd + pd5xxdoopd-po + ee5xpo5eoegptoo + e5e-55oep5gopppet + ttcxep55ee -po5 + eoo55get5td oet + oe5odtgeeop dee + eeoe5ee eeepc 5e + eeoteeedodeee tcxe + oeeeee eeot eede + eeeee5 5edetee e5oe + eeeee- o5d eoe geoe + eeeee 5exooptoeee + eeeee 5eodteed5eg ee + eeeee ooeeddpg5et5xe + eeee ooeepoedteoe5e + eeeeg oe5 egeot + peeeee ge 55opep + eopoteep5t te xto + gto- xeooe5pceopp + pet- edgttpc5o5 + gotp gtepddcg + geegepge + + diff --git a/codex-rs/tui/frames/slug/frame_080.txt b/codex-rs/tui/frames/slug/frame_080.txt new file mode 100644 index 0000000000..28dcb3b4ce --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_080.txt @@ -0,0 +1,27 @@ + + + topxdtopxdd + 5pp pgeepetcept + eep5t5tegtpgptpto + 5gee 55et5-ege ppoo + eg5eetteop -det + 55xt55eop d o5 + ee5ooetet dpd d5et + cex eepppe oceo pe5 + eoeggxdxxe -odt- ee + oeeegexee oeeo e5e + eeeexddee c5 5 5p5e + eeeepedee eded geee + e5eeegeee 5dgeo p -deee + eeeee 5eg ecepex p eeeoe + eeee- pe pd 5 ee5 5geep + eeeee pe -p5 deeeoe + eeeeepee 5eeee + ooeed5gepd g5oo + pet eeooood eepe + ood oodoopttpedetp5 + ged g pc pot5pdp + pod gtdptddcpe + egeeeegge + + diff --git a/codex-rs/tui/frames/slug/frame_084.txt b/codex-rs/tui/frames/slug/frame_084.txt new file mode 100644 index 0000000000..3af58be461 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_084.txt @@ -0,0 +1,27 @@ + + + dtcpdtcttttt + dep cgeepgdc-dpod + depee5g55dtppgptgoeo + t5pt dptptpc ee ogoe + t5pt x5teep gee + e5et5pp5ot d pot + eee5oeteeg peo 5eo + ex 5eeeet etodd p5et + epe5gxxtg o5deo peo + eeeeegoee do5t xee + e5eegoepe t oetd eeo + egd-pddee xoptee ee5 + eg ete5ee p5dpdtootpod ddx5 + ee degeexe 555d5 tepge exex + ep ppeede d5 e depe pp5ge + eg ggpep e5 oeee + do poeeete tetete + oeo gdpo o e5dooe + ee opeo ed 5g gep5 + oo eg5eodpdddtpd5ceg5 + ped eoeox gpttppgtg + ptd gtdpodddd5p + egeeeegge + + diff --git a/codex-rs/tui/frames/slug/frame_088.txt b/codex-rs/tui/frames/slug/frame_088.txt new file mode 100644 index 0000000000..fca5002fcb --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_088.txt @@ -0,0 +1,27 @@ + + + -tcxdctcotttd + t5d tc5e5pedcocgpt + d5e- tptpdtppeepxgxopt + 5e g-5555cpx pxtepdeo + 5dpe5p5pp o-edeo + 5e55t55cd dgpp gee + deodge t5 epc o oett + eee55ppe etpt d gpee + gggg xdd o5dpxoe goe5 + eeeeecoe 5p5op p-eee + eeeeeee5 c d5ede p-ee5 + edgeeeee 5pe5detg -eeo + ee x-eee eedp5et tppod ceeg + g-g p5e -555t55 opgge5 eeeee + e -geed deet oppt- etp + p5c xgeg ote xe55 + et oedotot dp55xoe + p5optpetot cp-5oo5 + ecodtoetpo d5etete5 + ec oooo pttddcpdexepop + gedegdgox gpottppgd5e + gtt ettptcddddtpe + ppeegpgge + + diff --git a/codex-rs/tui/frames/slug/frame_092.txt b/codex-rs/tui/frames/slug/frame_092.txt new file mode 100644 index 0000000000..4ef99536a4 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_092.txt @@ -0,0 +1,27 @@ + + + dttcpdttttcxtd + dtx tgepgpgdc-ecgpot + d5ge-tpppgdtppeegptpcdot + 5pt5cpd ptp d-dppeto + ee5 tgec x- poo + exddopt tdc ppee + 5pgpe5et 5epog d5oe + de5teece e5tpo ge5d + eeee edp ettpoeo eee + eee tee et5po 5ee + oeexede -coegg ee5 + oeedeee 5555p5 xpg + eee-eee 5d555-5d ootttpec -gep + eeeepo5 c5555ep popgpege teed + peeeoeeto tte o pepcpcet eopee + pdexx55 e pote e p eeg + ptdotpoge tp eoo5 + pedootoo e ed5te5 + pedodoeodpt dcppd55p5 + od gteeteptddddtpptxptptp + gododedt- epptttpppedp + ptdettpxtdddddttg + ep eegpgge + + diff --git a/codex-rs/tui/frames/slug/frame_096.txt b/codex-rs/tui/frames/slug/frame_096.txt new file mode 100644 index 0000000000..04fed501be --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_096.txt @@ -0,0 +1,27 @@ + + + ddtxttttttxdd + dtgdteepgxgdct-gegpptd + d5oc5tpp ed5pppeegptcotpod + 5g ttee dtpppcpo + e 5e55 t -pto + e555e5p ttdg poo + pcc5et5 55god ppoe + c5tceot ee5ge ege5t + pdgppe ete-e o eee + deeedeo ooooedp ee5 + egeg5ee t oteee- -eeee + exegeee e5ce5 5dp e-eeee + peeeeee e5ttg 5p ottttcco dgep5e + teexett ettpecp5 edpggepg e oe5 + egeeeee t55 te oetppct egc5et + oeogttt edtg cppeeee + pooeg-5d pcppeto5 + oeopeoedp- d5gctte5 + poodteoc pt- dtg epp55 + od dpeodgptcddddttpcdte5gee + od dppe-teppptttpppgdtg + gttdd-dxtddddddctpe + egeeegpgge + + diff --git a/codex-rs/tui/frames/slug/frame_100.txt b/codex-rs/tui/frames/slug/frame_100.txt new file mode 100644 index 0000000000..a9859571c7 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_100.txt @@ -0,0 +1,27 @@ + + + -ddtctttttttdd + tteto5ppe5pgep-eegpptd + dtdd5tp555dttppoeepptcoxgpt + 5g 55c55 xtpdc-pt + detdtpppd d pp5p + deex55t tcd -ote + e5o55o5 5eged -oote + 555ee5e tedoede edtxo + e 5tpe potepc o eee + eeeepex peogpocp etxt + e gexop pe d5o dt eede + eegodoe 5oop5 de eege + e egeed eodp5ed5 ooooottcpcdd oe5xe + pd eee eettpxt5 xe5pgpeoeeee xepe + ecpeo5do xt5e dp getepoctto cxdoc + poeeepo e eotp pp d55te + oeeeeoe ed 5gtpee5 + ocpoeeodpt -xdpddg555 + gt pgee5ged dcpgdptetg + pd ppetdgeectddttttpedtpte55 + ptdppecd pxppttpptpgptpe + ep-dpgppocdddddtttpg + e egppgge + + diff --git a/codex-rs/tui/frames/slug/frame_104.txt b/codex-rs/tui/frames/slug/frame_104.txt new file mode 100644 index 0000000000..1a43aba301 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_104.txt @@ -0,0 +1,27 @@ + + + d--ctotttttttdd + dtgte5ppe gpptt + tpd5tpp dtotppoeepptctxeptd + tpc55d-gdtp cdpetogod + 5 ctptgt5 pe--oopo + pg5tp5 5 ccdo o ep5o + ep5ee5pe 5cgpto po e55o + edoo5t55e ooteoooe e o5dt + eceoeod peo pege o xeot + epeeeepe t eet-edx e5gt + gepgee e ed5 ep 5x g ee e + eee5ee e dpt5ce 5g e-eepe + op eeepe tp55ep5ee ottotttcct oexete + gdegp5ggt 5ete5 de t5dpgpeogeg 5teoxe + ogxeeete pt5eed epteeccttt eeeee + pedoooege t5 doede + odo5oetded d5e5p5pp + pcgeeot et dcpdt5eep + go ppecdgetd dtgd5dtp5e + pc pppcdgxpttttdttttpedcptettp + gtddpotdd gpxpppppgtpepe5g + gx gpepttddddddtdtpg + e eggppgge + + diff --git a/codex-rs/tui/frames/slug/frame_108.txt b/codex-rs/tui/frames/slug/frame_108.txt new file mode 100644 index 0000000000..67f9c57984 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_108.txt @@ -0,0 +1,27 @@ + + + d-dcctttttttttdd + tcettppg gttd + d5ptepc55-dttpeeeeeppttodcppt + d5p55goetcp dtgttxept + 5ectpeete p-opp5ed + ex5etppee tteo t xooot + eo5etpoe occ-ep eodoeopt + 5peoo5ge pecdpod odgooed + eeeee5e pecdxet ppotde + exoee5- -peopoop ee- eee + ppeee5x e eet-ee 5 e5dt + gexeedx 5ottppte 5-eo e + o -eet e dpg555555 ttoottttttcttt eceede + pd eeede pop55g5g texdpgppogdppg peeee + etdoe5 ee te5t5 ootteeoott ee 5 + epet5tpo- td55e5ep + pope5edpod ecpd55ete + ptgeeet et dpd5cco5e + oddpeotgetd 5pdepetop + gtdpeptdgopptttddtottpedcpeped5e + ptgpeeddggpxgppppggtpeddtp + pg5pteetcddddddcttpg + e gggppgge + + diff --git a/codex-rs/tui/frames/slug/frame_112.txt b/codex-rs/tui/frames/slug/frame_112.txt new file mode 100644 index 0000000000..26143e631c --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_112.txt @@ -0,0 +1,27 @@ + + + dddcctttttttttdd + d-pt5epg-dpg gptd + tptepctgtdtt5ppoeeepptttd ptd + tg-tgtgcctped gtgptctgod + tpeeptgte ptgpttpo + 555eep 5 ctttd oc googe + 5o55tpdee doeoppe po oe e + t5eooppe geoocttcd po oe e + eeeeep5e podpoodg o- eept + deepee-e dpedgdgtg e eede + eog e o gtd5d 5 xtoe5e + eexde d dpdp5 5p p5eeee + pe oed e 5eted dee toootoottctttd ogeede + t eeege d555te cp dxecppgpppgdepetedeope + otgot5ge eegc5g pcdtettootttp5eece5e + ope5e po 5odopd5 + opeeoddtd d5e5t5g5 + o5eeedtdod dtptp5etp + ptgeectgottdd dtpgep5ed5e + ptdpeot-pepptttddtottpedtpetgdtg + gtdeeod d gpxgcpppggtpgpdtpe + ee-pptetttddddddcttppe + e pgppggge + + diff --git a/codex-rs/tui/frames/vbars/frame_000.txt b/codex-rs/tui/frames/vbars/frame_000.txt new file mode 100644 index 0000000000..a84edfdca3 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_000.txt @@ -0,0 +1,27 @@ + + + ▎▎▎▎▌▉▉▉▉▉▉▉▉▉▊▎▎ + ▊▎▉▏▋▉█▉▉▎▎▎▎▋▋▋▎▎█▉▎▉▉▉▎ + ▎▋▏▍▉█▉▎▊▎▏▉▉▏▏▉▌▉▏█▉▉▉▉▊▎ █▉▎ + ▊▉▏▋▊▉▎▉▊▋▉▉ ▊▏▏█▉▉▌▎ ▉▊ + ▎▉▏▋▊▉▎▋▋ ▉█▉▏▊▍▉▊ + ▊▏▏▋▋█▋▏ ▊▍▊▏▏▎▍▍ + ▋▋▏▋█ ▏▉ ▏█▍▍▍▉ ▍▌▍▏▊▍▏ + ▊▋▏▏▉█▏▎ ▉▍▎█▏▋▏▏ ▎▉▍▍▏▊▍▏ + ▉▉▏▏▍▏▉ ▏▉▌▍▍▍▎▋▏ ▉▊▉▏▎▍▊ + ▏▍█▏▎▎▏▏ ▉▍▏▉▍▋▏▏▍▋ ▋▏▎▏▏ ▏ + ▋▏▌▏ ▍▏ ▉▎▋▋ ▉▏▋ █▏▏▏▋▏ + █ ▍▍ ▋▏ █▎▋▏▏█ ▌▉ ▍▏▏▏▏ + ▏▎▏▏ ▋ ▊▏▋▋█ ▋▏▎ ▎▌▌▉▌▉▉▉▉▉▉▉▉▉▊ ▏▋▋▏ ▏ + ▉▏▌ ▏▊ ▎▋▏▏▉█ ▋▉▎ ▋▏▏▌▍▉▉▉▉▉▉███ ▏▌▍▏▍▏ + ▍▋▏▍▋ ▏▍ ▉▏▋▎ ▎▏▎ █▏█▊▊▊▊▊▊ ▏ ▏▏█▏▎ + ▍▍▏▏▎▍▏▊ ▉▉▉▉▌ ▊▋▎▋▋█▋▋ + ▍▍▍▏ ▍▌▎ ▌▉▌▉▋▎▋▋ + ▍▏▏▏▊ ▉▏▍▎ ▎▏▎▉▏▉▎▏█ + █▊▉▉▏▊ ▉▊▉▉ ▋▎▉▉▏▉▉▉▊▌▉ + █▏▉▏▏▉ ▎▍▊▉▉▍▏▉▎▎▊▊▊▉▉▉▉▏▉▏▉▉█▎▊▉▎ + ▉█▉▉▉▌▊▏▏▉▌▏▋█▉▉▌▏▏▌▉▉█ ▎▉▉█ + ▉▉▉▌▏▉▏▏▌▎▎▎▎▎▎▊▉▌▉▉▎ + ▎▎██▉████▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_004.txt b/codex-rs/tui/frames/vbars/frame_004.txt new file mode 100644 index 0000000000..57f4cc8a76 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_004.txt @@ -0,0 +1,27 @@ + + + ▎▎▎▎▌▉▉▉▉▉▉▉▉▉▊▎▎ + ▊▎▋▏▋▉█▉▉█▎▊▎▋▋▋ ██▉▎█▉▉▎ + ▎▋▏▏▉▏▉▎▌▎▏▉▉▏▏▉▌▏▏█▉▉▉▉▌▎ █▉▎ + ▊▏▉▋▊▉▎▉▏▋▉█ ▉█▉▍▌▎ ▉▊ + ▎▉▏▋▊█▎▌▋▉ █▉█▉▏▊▍▉▊ + ▊▏▏▋▋▍▋▏ ▍▋▏▏▎▍▍ + ▋▏▏▉█ ▏▉ ▍▌█▎▍▍▉ ▉▌▉▏▊█▏ + ▊▋▏▏▉▎▏▎ ▉▍▎▍▍▋▍▊ ▋▍█▏▏▍▏ + ▉▉▏▏▋▏▉ ▎▏▏▏▍▍▍▍ ▎█▊▉▏▏▍▊ + ▏▉█▏▎ ▏ ▊▍▏▉▉▍▋▏█ ▏▎▏▏ ▏ + ▉▏▋▏█▎▏ ▉▎▋▏█ ▋▉▋ ▌▏▏▏█▏ + █ ▍▋ ▉▏▊ ▎▋▏▏█ ▊▌▉▎ ▏▏ ▏ + ▏▎▏▏██▉▍ ▌▏▋▋▋ ▌▋▎▎ ▎▌▌▉▌▉▉▌▉▉▉▉▉▉▊ ▊ ▋▏ ▏ + ▉▏▊ ▏▎ ▋▏▏▉██▋▉ ▉ ▏▍▉▉█▉▉▉█████▉ ▏▌▍▏▎▏ + ▍█▏▍▎█▏▊ ▉▏▋█ ▎▏█ ▋▊▉▌▉▉▎▏▏▏▌▌▌▉▉ ▋▋▋▏▎▏▎ + ▍▍▍▏▊▍▏▎ ▉▉▉▉ ▎ ▊▋▎▋▏█▋▋ + ▊▍▍▏▎█▍▉▎ ▎▉▌▉▋█▋▋ + ▍▍▏▏▊▋▉▋▍▎ ▎▋▌▉▏▉▎▏█ + █▊▉▏▏▎ ▉▊▉▉ ▎▎▉▉▏▉▉▏▎▌▉ + █▏▉▏▏▉ █▉▊▉▉▏▏▉▎▎▊▊▊▉▉▉▏▏▌▏▉▉█▎▊▉▎ + ▎█▉▉▉▌▎▋▏▏▌▉▏█▉▉▉▏▉▌▉▉██▎▉▉█ + █▉▉▏▏▉▉▌▌▎▎▎▎▎▎▊▉▌▉▉▎ + ▎▎██▉████▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_008.txt b/codex-rs/tui/frames/vbars/frame_008.txt new file mode 100644 index 0000000000..cb05f902e2 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_008.txt @@ -0,0 +1,27 @@ + + + ▎▎▎▎▌▉▉▉▉▉▉▉▉▉▊▎▎ + ▎▎▋▏▉▉█▏▉▎▎▊▎▋▋▋ ▎█▉▏█▉▉▎ + ▎▋▏▏▉▉▉▎▋▌▉▉▉▏▉▌▌▏▏█▉▉▍▉▌▎ █▍▊ + ▊▏▏▉▏█▎▎▉▏▉█▋ ▉█▉▍▌▎ ▉▊ + ▊▉▏▋▋▎▊▏▉ █▉▎▉▏▊█▉▊ + ▋▏▏▊█▎▏▉ ▊▊▎▊ █▍▎▏▏▎▍▍ + ▋▏▋▊▊▊▏█ ▉▎█▊▍▉▋ ▍▉▏▊▍▍ + ▋▏▋▏ ▊▏ ▍▏██▍█▊▉ ▍▍▏▌▍▏ + ▏▏▏▍ ▏▏▎ █▏▏▌▏▊▍▎ █▍▉▏▊▏▏ + ▏▏▎▏ ▏▏█ ▉▎ ▏▍▏▍█▊ ▎▏▏ ▏ + ▏▏▎▏ ▏█ █▉▏▏▌ ▋▏▋ ▏▏▏▍▏ + ▊▏▋▌ ▍▉ ▎▉▏▏▎ ▎▏▍ ▎ ▏▏▏▏▏▎ + ▉▉▏▏ ▏▏ ▋▋▋▉▎ ▏▋ ▋▎▉▌▉▌▉▉▌▉▉▉▉▉▉▊ ▎▉▏▏ ▏ + █▏▍▏ █▋▏ ▎▏▏▋▎▋▎▏█ ▋▍▏▏▉▉▉▉▉▉▍█████ ▏▎▍▏▎▏ + ▏▍▏▍ ▍▍▎ ▍█▉▋▋ ▊▉ ▍▎▉▏▉▉▏▏▏▏▌▌▌▌▉ ▊▉▏▏▎▋█ + ▎▏▏▌ ▍▍▎ ▍▉▉▉█ ▋█▋▋▉▊▋ + ▋▏▏▍ ▉▏▏▎ ▎▋▌▉▋█▊▉ + ▋▉▏▏▎ ▍▉▉▎ ▎▋▏▉▊▉▎▏▉ + ▍ ▍▍▉▎ ▍▏▉▉▊▎▋▏ ▎▎▉▉▏▉▉▏▎▌▉ + █▏▉▏▉▋ ▉▉▏▉▉▏▏▉▎▎▊▊▊▉▉▉▉▏▉▏▉▉█▎▎▉▎ + ▎▏▏▉▊▎▎▏▏▉▌▊▋▏▏▉▏▏▏▌▉▉██▎▏▉█ + █▍▉▏▏▏▉▌▎▎▎▎▎▎▎▊▉▌▉▉▎ + ▎▎███████▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_012.txt b/codex-rs/tui/frames/vbars/frame_012.txt new file mode 100644 index 0000000000..fd8ed4a21c --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_012.txt @@ -0,0 +1,27 @@ + + + ▎▎▎▌▉▉▉▉▉▉▉▌▊▊▎ + ▎▊▋▏▉▉▉▉█▎▎▊▊▎ ▌▏▎█▉▏▉▉▉▎ + ▎▉▏▋▏▉▎▊▎▌▉▉▏▏▉▌▌▉▉▉▉▉▍▍▌▊▎▉█▉▊ + ▊▋▉▏▉▎▍▏▉▏▉█▋ ▉▏▉▉▎▊ █▉▎ + ▎▏▋▏█▌▌▉▉█▋▋ ▉▏▉▏▎ █▍ + ▋▏▏▍█▏▋▉ ▊▊▊▎ ▏▉▏ ▍▍▎ + ▋▏▏▋▎▏▏▎ ▌▍▎▊▉▊▉▋ █▍▉▏▎▍▉▊ + ▋▏▏▋▎▏▉▋ ▍▉▍▏▍▍▎▍▎ ▉▋▏▊▍▍▎ + ▏▏▉▎▏▏█▎ ▍▊▍▏▏▍▍█▍▍ ▍█▏ ▍▏ + ▏▏▉ ▉▏█ ▍▍▉▏▏▏▊▉▎ █▏▏▋ ▋▊ + ▍▏▏ ▏▏ ▉▋▍▎▎ ▌▏ ▏▏▏ ▏▏ + ▏▏▏ ▏▏█ ▊▏▏▉ ▎▉▋▍ ▏▏▏▏▏▏ + ▊▉▏ ▏▏▊ ▋▎▋▏▋█▏▉▋█ ▊▉▌▌▌▉▉▉▉▉▉▉▉▉▊ ▏▏▏ ▏▏ + ▏▎ ▏▋ ▏▏▋▉▎▊▏▉ ▎ ▏▏▋▉▉▉█▉▉▉▉█████▍▏ ▍▏▉▏ ▏ + ▏▏▏ ▉▋▏ ▉▏▏ ▊▋▎▎█ ▎▍▉▌▉▉▉▉▋▏▏▏▏▌▌▌▉▎▎▋▏▏▊▋█ + ▏▏▍ ▉▋▍ ▉▉▉▉ ▎▋▋▋▋▌▏ + ▍▏▍ █▊▉▊ ▋▏▉▋█▋▏ + ▍▏▏▊ ▉▊▉▉▎ ▎▊▏▋▋█▎▋▉ + █▏▏▏▎ ▉▉▉▉▉▎▎ ▎▌▉▏▍▋▏▋▌▋▎ + ▎█▏▏▎ ▉▉▏▉▏▏▉▉▎▌▊▊▊▉▉▉▉▏▏▏▏▉▎▎▎▉▎ + ▉▉▉▎▋▎ █▉▉▌▏▏▏▏▏▏▉▉▉▉▎ ▎▉▉█ + █▉█▉▉▊▌▎▎▎▎▎▎▎▎▊▌▌▉▉▎ + ▎██▉████▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_016.txt b/codex-rs/tui/frames/vbars/frame_016.txt new file mode 100644 index 0000000000..cad5b84069 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_016.txt @@ -0,0 +1,27 @@ + + + ▎▎▎▊▉▉▉▉▉▉▉▉▊▊▎ + ▊▎▋▉▏▉▉█▎▎▋▏▎▊▊▎█▉▏█▉▉▊▎ + ▋▌▋▉█▎▎▌▉▉▉▏▏▉▌▌▉▉▏▏▏▋▍▎▎█▉▉▍▊ + ▎▋▉▉▎▊▌▉▉▉▉█▏ ▎▉▉▏▍▉▎▏▊▉▍▎ + ▋▉▉▋▏▏▉▉▉ █▉▏▏▏▌▍▉▌ + ▎▏▏▋▌▏▉ ▊▊▊ ▉▏▏▊█▊▉▊ + ▎▏▏▏▋▏▋█ ▏▏█▍▎▏▊ ▍▏▌ ▍▍▍ + ▏▏▏▋▏ ▉▏▍▋█▊▉▍▎ ▉▏▏ ▌▏▍ + ▏▋▋▏▏▋ ▉▏▏▍▏▍▎▉▍▎ ▉▏▌ ▊▏▊ + ▏▋▋▏▏ ▍▍▏▏▏▍█▍▎▋ █▏▏ ▏▏▉ + ▏▎▏ ▏█▏ ▉▏▏ ▋▉▌▏█ ▏▏ ▋▍ + ▏▎▍ ▏█▋ ▌▉▋▋█▏▊██ █▏█ ▋▍ + ▏▋ ▏▏▏ ▎▋▊▉▋▏▏▉ ▊▉▉▉▌▌▉▉▉▉▉▌▉▉▊ █▏▉▎▏▏ + ▉▏▋▏▋▍▊ ▊▏█▋▌▍▉▋▏ ▉▋▉▉▉███▋████▉▉▉▏ ▎▏▏▊▋▏ + █▍▊ ▏▍▏▍ ▉▊▍▋▍▌▉ ▏▍▉▉▉▉▉▉▏▏▋▏▏▏▏▉ ▋▍█▎▍▏ + ▍▍▊ ▍▍▉▎ ▉▉▉▉▎ ▎▏▍▏▋█▉█ + ▉▍▉ ▍█▏▉ ▊▏▊▏▉▋▏█ + █▏▌▎█▍▉▏▉▎ ▎▊▏▏▉▊▊▏▉ + ▉▏▌▎█▍▊▏▏▉▎▎▋ ▎▌▋▏▏▉▏▎▋▋ + ▉▏▏▊▎█▉▏▏▏▉▏▉▉▌▌▊▊▊▊▉▉▉▏▏▏▉▉ ▎▉▉ + ▎▉▉▎▎▎ ▎▉▉▉▉▏▏▏▏▏▏▉▉▉█ ▎▊▉▋█ + █▏▉▌▏▌▊▎▎▎▎▎▎▎▎▊▌▌▉▉█ + ▎██▉▉███▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_020.txt b/codex-rs/tui/frames/vbars/frame_020.txt new file mode 100644 index 0000000000..0a6aea1995 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_020.txt @@ -0,0 +1,27 @@ + + + ▎▎▎▎▉▌▉▉▉▉▉▉▊▎▎▎ + ▊▎▋▏▉▉█▎▎▍▌▋▊▍▎▉▉▉▉▉▉▉▌▋▎ + ▊▌▉▏█▊▎▌▌▉▏▌▉▉▌▌▉▉▋▉▏▉▉▎█▏▉▍▋▏ + ▊▉▎▎▎▌▋▉▊▉▉ ▋▍▏▍▎█▉▉▉▉▎ + ▊▉ ▊▊▉▉▊█▎█ █▉▏▍█▍▍▍▉ + ▋▎ ▎▏▉▋▍ ▊▊ ▍▌█▊▍▋▊ + ▋ ▊▏▎▏ ▋█▍█▏ ▎▍▍ ▏▉▍▍ + ▋▎ ▊▏▊█▏ ▏▋▋▉▊▍▍▎ ▍▍ ▏▍▏▊ + ▎▉▊▎▏▎▋ █▏▍▏▊▍█▏▍ ▏▊ ▌▏▉ + ▏ ▎▏▏▏ ▉▏▌▉▉▊▍▍▎ █▏ ▏▉▏▏ + ▏▏█▏▏▍ ▎▍▎▏▉ ▌▏▏█ ▏▏▍▏▋ + ▏▋█▏▏▍▋ ▊█▋ ▌▋▉▋▎ ▏▍█▏▏ + ▍▏█▏▏▏▎ ▋▋▋▎▌▏▎▋ ▎▌▉▉▉▉▌▌▌▌▌▌▌▌▊▎ ▏▍▍▏▎ + █▊▍▍▏▋▍▋ ▎▉▉▉▋▉▉ ▊▉▉▉▉▉▉███▉▉▉▉▏▋ ▍▏▋▏▏ + ▏▍▍▏▍█▏ ▍█▋▊▋▎ ▏▉▉▉▉▉▉▏▏▍▏▏▉▏▋ ▎▍▍▏▍▊ + ▏▍ ▏▍▋▍ ▎▎ ▎▉▋▋▋▋ + ▏▍▊▍█▊▉▎▏ ▊▋▎▏▉▍▋ ▎ + ▍▏▊█▉▉▊▉▎ ▎▊▉▋▏▏▎▋▊ + █▏▌▎█▍▌▏▉▉▊▎▋ ▎▊▋▉▎▏▏▉▊██ + █▉▏▊ ▉▉▏▏▏▏▉▉▉▊▊▊▊▊▉▉▉▏▏▉▉▉▎▌▉▊█ + ▉▉▉▎▎ █▉▉▉▉▉▉▉▏▋▋▌▉█▎ ▎▉▉▉▍▎ + █▉▉▏▏▊▊▎▎▎▎▎▎▎▊▊▉▉▉▉ + ▎██▉▉██▎▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_024.txt b/codex-rs/tui/frames/vbars/frame_024.txt new file mode 100644 index 0000000000..6e92a062c4 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_024.txt @@ -0,0 +1,27 @@ + + + ▎▊▎▉▌▉▉▉▉▉▌▎▎▎ + ▎▋▌▏█▎ █ █▉█▍█▉▏▉▉▉▊▌▊▎ + ▎▋█ ▎▊▉▉█▌▉▉▌▌▉▉▍▌▊▎▋█▏█▉▉▉▊ + ▋▉ ▊▉▉▎▉▉▍▉ ▍▏▉▍▊▍█▉▉▍▏▍ + ▊▉ ▎▋▉█▊▍ ▌▉▉▍ ▍▉▍▎▍ + ▋ ▌▋▎▊ ▌▉▎▊ ▉▊▉▉▌▍▊▏ + ▏ ▋▋▊▍ ▍▉▎▏ ▉▍▉█▏▍▍▏ + ▏ ▏▋▋▍ ▏▏█▍▉▊ ▏▏█▏▍▋▏ + ▊▎ ▊▏ ▍ ▎▍▉▎▍ ▌▍▊▉▊▏▉▌ + ▏▋▏▏▏▋ ▏▋▍ █▍▍ █▉▏ ▏▍██ + ▏▋▏▏▎▊ ▍▏ ▉▍▉ ▋▋▏▏▏▍ + ▏▍▏▉▎▏ █▎▉ ▎▉█ ▍▏▏▏▏▏ + ▏▋▉▋▏▉ ▏▋▎██▋▋ ▎▌▉▉▉▌▌▌▉▌▉▌▌▉▎ ▎█ ▏▏▏▏ + ▏▊▏▉▎▏ ▎▏██▎▏▉ ▏▌▍▍▉▉▉▉▉▉▉▉▉▉▏▋▉ ▏▏█▏▋▏▋ + ▏▋█▊▍▍▎ ▍▎▊▌▎ █▉▉▉▎▉▉▎▎▎▉▉▉▏▋ ▎▏▋▉▍█ █ + ▏▎▉▊▍█▊ ▋▏▍█▋ ▋ + █▏▎▉▊▍█▍ ▎█▍▎▉█ ▊ + ▏▎ ▍█▉▉▉▎ ▋▋▉▊▎▋▎▋ + ▉▏▎█▏▍▍▌▉▉▎▎ ▎▉▉▎▉█▌█▍▊▎ + ▉▏▎▎█▍▏▉▉▏▏▍▉▉▌▎▎▎▉▉▉▉▉▊▉▋▌▋▊▉▊█ + █▉▏▊▎ █▉▉▉▉▏▉▉▉▏▉▉▉▏▉▉▉▉▊▏█▎ + ▎▉▉▉▌▌▌▎▎▎▎▎▎▊▉▉▏▉▉██ + ▎██▉▉██▎▎▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_028.txt b/codex-rs/tui/frames/vbars/frame_028.txt new file mode 100644 index 0000000000..1205ae11d2 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_028.txt @@ -0,0 +1,27 @@ + + + ▎▊▎▏▌▉▉▉▉▉▌▎▎▎ + ▊▌▉▉▎ ▎▉▉▏▉▎▏▋ + ▎▌▉▎ ▎▊▉▉█▏▏▉▌▌▌▉▍▉▎ ▎▍▉▉▎▉▊ + ▎▋█ ▎▉▉█▊▋ ▏▍▊ ▉▉▌▎▉▊ + ▊██▎▋▉ ▊▍ ▍▏▉ ▋▍▍▍▎▍ + ▏▋▋▋▋ ▎ ▊▉ ▉▏▊▎▍▍▏▊▍ + ▏█▋▏▉▋ ▎ █▊▉▉█ ▉▍█▉▍▏▋▍ + ▋▏▏▋▉ ▍ ▊▍█▍▉▌ ▉▊▋▍▊▍▋▏ + ▏▎▍▏▋▋ ▍▍▎▍▍ ▉█ ▏ ▏▏▍ + ▏█▌▉▏ ▊▍▉█▊▍█ ▎▏ █▎▏ ▊ + ▏▌▏▏▎▏█ ▏ ▎ ▋▍▉▊ ▌█▍█▏▏▋█ + ▏ ▏▏▏▋ ▏▏██▉█ ▉ █▏█▏▏▏▋ + ▏▏ █▏▏▎ ▉▊▊ ▊█▋▎▊▌▉▉▉▌▌▌▉▉▌▉▌ ▊██▌▏▏▋ + ▏ ▏▏ ▏ ▎▌▏▋ ▋▎ ▉▋▋▋▉▍▍▌▋▋▋▉▍▏▊ ▏▊▏▏▋ ▊ + ▏▎▍▋▌█ ▍▉▎ ▉▌▌▌▏▎▎▎▎▎▎▎▉█ ▌▋▎▏▌ ▋ + ▏▍▍█▎▉ ▎▏█▏ ▊ ▋ + █▏▍▍▏▏▉▍ ▊▏▋▋▎█ ▊▎ + ▏▊▍▌▉▊ ▎▋▉▎▋▎▋ ▋▎ + ▉▏▎▉▌▏▏▉ ▎ ▎▎▉▉▏▏▉ █▎▉ + ▉▏▌█▏▉▏▏▉▏▍▌▉▌▎▉▉▉▉▏▏▏▉▎▊▋▎▏▎▋▎ + ▉▏▉▊▏▏▏▏▉▉▉▉▉▉▏▌▉█▊▎▎▋▋▍▋▉ + █▉▏▉▉▏▏▌▏▏▏▏▍▉▉▏▏█▉█ + ▎██▉▉██▎ ▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_032.txt b/codex-rs/tui/frames/vbars/frame_032.txt new file mode 100644 index 0000000000..61ff89f936 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_032.txt @@ -0,0 +1,27 @@ + + + ▎▊▉▌▉▌▌▉▉▉▌▌▎▋ + ▎▋▋▉█ █▉▏▍▎▉▉▎ + ▎▌▉▏▎▊▉▉█▉▏▉▌▌▉▉▉▊ ▎▍▉▉██▉ + ▎▏▉▌▏▉▉▎▉▉▏▋ ▏▍▊ ▍▍▍ █▊ + ▊▉▎▏▉█ ▋▌ ▏▊ ▏▍▊ ▉▎ + ▋▉▊▏▉▋▎ ▎ ▋▏▍ ▍▍▊▎▏▊ + ▋▉▋▏▉▏▌▎ ▏▍▋▍ █▋▎█▍ ▏█▏▎ + ▎▏▍▋▉ ▋ ▋▍▍▊▍ ▉ ▊ ▍▍▍ + ▏▊▍▏ █ ▍▊▍▍▎▍▎ ▍█▍▊▏▊▍▏ + ▏ ▏▏ ▏ ▏▍▋█▊▉▋ ▎▊▍▊▏█▍▋ + ▉▍▏▏▉█ ▍▍▏▋█▋▋▍▋ ▏▏▏▋█▏▏ + ▋▉▏▏▍ █▊▋▉█▋▏█ ▋ ▏▏▏▏▉ + ▏▏▏▏█▏ ▎▏▎▎▏▎ ▎▊▉▌▏▌▉▌▌▌▌▉ ▏▊▏▉▏▏ + ▏▊▋▏ ▍ ▉▍▎▏▋ ▏▍▉▉▉▌▌▍▋▌▌▍▋ ▌█▍▏▏▏▏▏ + ▉▏▏▊▏ ▉▉▉▉▌▎▏▌▏▎▏▉ ▋▏▋▏ █ ▋ + ▏▋▍▋▎█▏ ▎▎ ▌▉▏▋▋█ ▋ + ▏▍▍▏▏▋▍ ▋▉▎▋▏▋ ▊▎ + ▏▏▉▉▍▎▉ ▎▏█▊▋ ▋▋▊▎ + ▉▌▍▍▉▉▊▉▏ ▊▏▉▎▋▉▊▎▎▋ + ▉▏▏▉▊▉▉▍▏▉▌▏▌▊▊▊▉▉▏▏▉▎▊▋▎▍ ▉█ + ▉▏▏▏▏▉▏█▉▉▉▉▉▉▉█▎▋▎▉▉▍▎▋▎ + ▎▉▉▏▌▎▎▎▎▎▎▊▉▉▌▉█▋▉█ + ▎███▉██▎ ▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_036.txt b/codex-rs/tui/frames/vbars/frame_036.txt new file mode 100644 index 0000000000..49f1a35650 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_036.txt @@ -0,0 +1,27 @@ + + + ▎▊▉▉▉▌▉▉▉▌▎▎▋ + ▎▎▉▉█▎▌▋▋ ██▉█▉▏▉▉▏▍▊ + ▊▏▉▌▌▉▉▉▉█▉▌▉▉▏▊ █▋▍▉ █▍▎ + ▎▏▉▏▋▉▍▎▉█ ▉▊ ▊▏▎▎█▍ + ▊▋▊▏▉█ ▏▎ ▍▍▊▊ ▍▎ + ▊▋▊▋▋ ▎ ▍ █▍▏▍▋▉▎ + ▏▊▋▋ ▋▍▍▎▉ ▍ ▍▍▍▊▍▍ + ▏▎▏▏ ▍▍█▋▉▎█▊ ▋▍▍ ▊▎▍▏ + ▏▏▍▎ ▊█▊▋▎▉▍ ▋ ▍▎█▍▍▋▎ + ▏ ▏█ ▋█▏▏▊▋▌▍▍▋ ▌ ▏▏▊▊▏▏ + ▏ ▍█ ▎▎▍█▊▋▍▌▋ ▏ ▏▏▏ ▏▏ + ▏▍▌▍ █▏▋ ▋▉█ ▏ ▍▏▏▏█▏ + ▏▋▋▉ ▏ ▊▉▋▏█ ▋▎▉▉▉▉▉▉▌▉▌ ▉▏▏▏▎▏▏▏ + ▏▏▋▏▍▊ ▉ ▋█ ▏▉▉▉▉▉▉▉▉▉▍▍ ▋ ▏▉▎▏▏▏ + ▏▌▋▏ ▏ ▍▉▉▉▉▉▏▌▎▎▏▉ ▏█▏█▏▏▏▎▎ + █▏▉█▏ ▏ ▎▎▎▎▎ ▎▋ ▋▊▋ ▏ + ▍▏▏▏▌ ▍ ▊▏▎▏ ▋ + ▍▏▏▍▍▎▉▌ ▊▉ ▋█ ▊▎ + ▉▏▏▊▏▍▎▉ ▎▏▉▊▊▎▋█ ▋ + ▍▏▏▉▉▋▉▏▉▍▉▌▎▊▊▉▏▏▎▎▉▌▏▍ ▊█ + ▉▉▎█▉▉▉▉▏▉▏▉▉▉▎▋▎▌▉▉▎▊▉ + █▉▊▌▎▎▎▎▌▎▌▉▉▊▉▎▋▉▎ + ████▎▎ █▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_040.txt b/codex-rs/tui/frames/vbars/frame_040.txt new file mode 100644 index 0000000000..df0f3ac0ee --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_040.txt @@ -0,0 +1,27 @@ + + + ▎▊▉▉▉▉▉▌▉▉▎▎▎ + ▊▌▉█▎▋▍▍▎▉▉▉▏▏▌▉▏▉▉▎ + ▊▏█▎▉▉▉▉█▏▌▉▉▌▎██▏▉▎ ▎▍▎ + ▋█▋▏█▎▌▉█ █▉█▍ ▉▍ + ▏▎▉▏▎ ▋█▋▏▊ ▎▏ + ▏▏▉▏ ▎▎▊▍ ▊▋▍█ ▍▏ + ▌▍▋▏ █▍▍▎▏▍ █▋█▍▍▍▊▍ + ▏▏▏▎ ▏▍▍ ▏▍ ▊█▍▊▏▏ ▍▎ + ▎█▏▏ ▍▍▍ ▍▍▉ ▎▏▎▏▏▏▏▏ + ▏▏▏▏ ▋▏▍▊▏▍▍▍▊ ██▏▌▏▋▊▉ + ▋▏▏▏ ▍▏▍▋▍▏▊▊ ▏▋▏▏▏▎▏▏ + ▍▋▏▏ ▍▎▋▋█ ▋ ▎ ▏ ▏▏▏▏▏▏ + ▏█▏█ ▍▋▎▋ ▊▎▎▉▉▉▉▉▉▉▉ █▎▏▏▎▊▋▏ + █▋▋▊ █▋ ▊▉▉▉▉▉▉▉▉▉▏▏ ▏ ▏ ▏▏▏▍ + ▏▏▋▊ ▎▉▉▉▉▎▏▌▎▌▏█ ▋▉▏█▏▏▏▏▏ + ▏▋▋▏▊▉ ▎ ▎▎▎▎▎ ▏ ▍▊▏▏▏▏█ + ▏▏▍▍ ▉▎ ▏▎▏▎▋▏▏▋▏ + ▏▍▉▉▎▉▍ ▎▏▎▋▋▋█ ▏ + ▏▏▊▏▍▎▉ ▊▉▎█▋▋▍ ▎▋ + ▉▎█▉▍▌▊▏▉▉▉▊▊▎▊▉█▊▊▋▉▎ ▊▉ + █▉▎ █▉▉▏▏▏▏▉▉▎▊▌▍▉▍ ▊▉ + ▉▉▌▎▋▊▎▎▉▉▉▋▉▎▌▉█ + ▎███▎▎ ▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_044.txt b/codex-rs/tui/frames/vbars/frame_044.txt new file mode 100644 index 0000000000..bf54c1ea8d --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_044.txt @@ -0,0 +1,27 @@ + + + ▎▊▉▌▉▉▎▉▉▉▎▎▎ + ▊▋▉▎▊▊▊▉█▉▏▉▏▌ ▉▉▎ + ▎▏▏▌▉▉▉█▏▉▉▌▎▉▍▉▊▋ █▉ + ▊▉▋▉▋ ▏▊▍▎ ▍▍▊ + ▊▍▉▋▎ ▍▍▏▌█ ▏▊ + ▋▏█ ▎▎▊ ▍▊▍▏▍ ▋▊ + ▏▋▋ ▉▏▍▊ ▋▍▌▍█▍▍ + ▏ ▏ ▍▏▍▋▎▍▊ ▍▊ ▏▏ ▏ + ▊▍▎▏ █▏█▋▍▎▏▎ ▋▎▏▏▏ ▏ + ▏▏▉ ▍▍▍▏█▏▉ ▏▍▋▏▋ ▋ + ▉▏█ ▍▋▏▋▉█▏ █▏▏▏█▏▏▏ + ▋▏█▎ ▋▊▋▏▋ ▏▏▏▏▎▏▏▏ + ▏▏▋▏ ▎▏ ▋▏ ▎▎▉▉▉▉▉▉▉▊█▏▏▏▏▋▊▏▏ + ▉▏▏ ▏ ▋▏▋ ▉▉▉▉▉▉▉▉▍▊▋▏ ▍▏▊▏▏▏ + ▏▋▉▎▎▊▋ ▋▉▉▌▌▏▌▉▏▋▎▊▎▏▏▏▏▏ ▋ + ▏▏▊▍▉ ▎▏ ▎▎▎▎▎█▍ ▏▊▏▏ █▏ + ▏▋▍▎▋▊ ▋▍▏█ ▋▏▍▎ + ▍▋▏▍▎▍▍ ▊▉▋▊ ▋ ▋▉ + ▍▋▏▎▉█▉▊ ▋▉▋▊▌▋ ▋▋ + ▍▎▉▏▉▉▎▉▉▊▎▎▊▉▎▋▋▎▍ ▌█ + █▍▎█▉▉▌▌▏▉▉▎▎▉▍▏▎ ▊▉ + ▎▉▊▎▎▎▊▋▋▉▌▌▎▎▊▉▎ + ▎███▎ █▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_048.txt b/codex-rs/tui/frames/vbars/frame_048.txt new file mode 100644 index 0000000000..c1fb3237d2 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_048.txt @@ -0,0 +1,27 @@ + + + ▊▎▌▏▉▊▊▉▉▊▊ + ▊▉▏▌▊▎█▍▌▏▉▌█▉▍▊ + ▋▊▏█▉█▏▉▉▎▍▍▍▎ ▉▍ + ▋▏▋▉▊ ▍▏▍▎ ▋▎▏ + ▏▏▍▍ ▏▍▍▎ █▍▏ + ▎▍█ ▎▊▎ ▍▊▏▋▋▊▍▍ + ▏▋▏▏▏▊▊█ ▋ ▍▍ ▍▉▎ + ▍ ▏ █▋▍ ▍ ▏▌█▍▍ ▏ + ▋▏▏▎ ▊▏▏▏▍▊ ▏ ▏▍▍▏▏▏ + ▏▏▍ ▉▏▋▋▌ █ ▊▊▉▏▊▋▌▊ + ▏▏▏ ▏▍▍▏▏▏ ▏▋▏▏█▋▏▏ + ▏▏▏▎ ▍ ▉██ ▏▍▏▏▏▏▏▏ + ▏▏▋▍ ▏▋ ▎▎▉▉▉▉▉ ▏▍▏▏▏▏▏▏ + ▏▏█▏▋▎▊ ▉▉▉▉▉▉▏▍ ▏█▏▏▏▏▏▏ + ▋▏▏▉▏▎ ▉▉▌▏▌▉▋█ ▏█▏▏▏ ▍▎ + ▏▋█▉▏ ▎█▏▏▏ ▏▏▏▍▏ + ▉▉▌▏ ▏ ▎█▋▍▏▏▏▏▎▋ + ▏▏▋▊▍▍▎ ▏▋▊ ▋▏▏▊▏ + █▊▏▏▍█▉▎▋ ▎▏▊▏▊▏█ ▋▊▎ + █▊▉▎▉▎▉▉▉▎▊▋▎▊ ▋▋ ▏▎ + █▍▎▉▉▌▏▋▉▎▌▉▊▉▍ ▎▋ + █▉▎▎▎▎▉▉▌▉▍ ▎▋▎ + ▎█▉▎▎▎▎█▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_052.txt b/codex-rs/tui/frames/vbars/frame_052.txt new file mode 100644 index 0000000000..9ef8496189 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_052.txt @@ -0,0 +1,27 @@ + + + ▎▋▌▉▉▊▌▍▉▊▎ + ▋█▊▊█▍▉▋▍ █▍▏▊ + ▏▋▋▉█▉▍▉▊▍▊▎█ ▍▍ + ▌▏▋█▋ █▏▋▋ ▍▍ + ▏▏▍ ▋ ▍▏▍▍ ▍█▎ + ▏▏▉▎▎▎▎ ▏▌▏██ ▏▏ + ▉█▏▏▎▉▉█ ▍ █▏ █▏▋▊ + ▏▏ ▏▏▏▍▏ ▊ ▏▏ ▎▏▍ + ▋▋▏ ▋▋▎▏▍ ▏▏▏▋ █▏ + ▏▏█ ▏▏▏▍▎ ▏▋▊▏▏▍▏ + ▏▏▋ ▉▏▋▏▍ ▏▋▏▌▋▎ ▏▋▊ + ▏▏▋ ▏▌▋▍██ ▎▋▎▏▏▏▋ ▏▏ + ▏▋ ▏▏ ▎▎▎▉▉▉▉▍▎▏▏▏▏▏▏▏ + ▏█ ▍▉ ▉▉▉▉▉▍▏▏█▎▏▏▏▏▏▎ + ▏▏▋ ▏ ▍▌▌▎▏▉▏▏▌ ▏▏ ▏ + ▋▏▏ ▊▋ ▎█▏▏▏ ▏▏ █▏ + ▏▏█▏ ▎▍▋█ ▏▏ ▍▏ + ▏▏▏▍ ▏▏▊▊▎▏▏█▊ + ▏▏▉▍ ▊▏▍▍▏▏▏▏ ▋ + ▍▏▉▌▎▉▍▎▉▋▍▏▉ ▋▋▏ + ▍▍▉▏█▋▎▋▍▏█ ▋▋ + ▉▉▎▎▊█▎▋█▋▎▏█ + █▉█▎███ + + diff --git a/codex-rs/tui/frames/vbars/frame_056.txt b/codex-rs/tui/frames/vbars/frame_056.txt new file mode 100644 index 0000000000..98f0290093 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_056.txt @@ -0,0 +1,27 @@ + + + ▊▌▉▉▊▊▍▉▊▎ + ▋▊▎▍▍▋▋▋██▏▊ + ▌▏▋▉▍▍█▏▎ █▏▊ + ▉▏▉▋▏▍▏▉▊ █▊█▍ + ▏▍▏ ▍▍▋▍▍▍ █▋▌ + ▏▍▊▎█▊ ▏▏▍▏█ ▉▏ + ▏▏▏▊ ▏ ▉▏▏ ▎▋▏▏▍ + ▍▋▉▋ ▏▏▊ ▍▏ ▏ + █▏█▏▉█ ▎▏█▎▏▏▋ + ▍▋▍▉▎▌▏ ▏▏▉▏▏▊▋▏ + ▏▋▏▌▌▉▏ ▏▏▋██▏▋▏ + ▏▋▉▋▉█▏ ▏▏█▎ ▏▏▏ + ▉▋▍▏▎▎▎▉ ▏▏▋▏▏█▏▏ + ▌▍▏█▉▉▏▍ ▏▏▋ ▏▏ ▏ + █▍▏ ▋ ▏▏▏▏▏▏▏▍▏ + ▏▏▉▎▉▊ ▎ ▋▏▏▏▏ ▋▏ + ▏▏▏ ▏▏ ▍ ▎▏▏▏▏ ▏ + ▍▏█ ▎ ▌▏▏▏ ▊▋▊▎▎ + ▏█▍ ▏ ▏ ▍▍▉▎ ▏▏ + ▍▏▍▍▉▋▍▋▊▏ ▏▏▎█ + ▍▉▊██▋▌▉ █▋ + ▉▎▎▋▎▉ ▍▉ + █▉▎████ + + diff --git a/codex-rs/tui/frames/vbars/frame_060.txt b/codex-rs/tui/frames/vbars/frame_060.txt new file mode 100644 index 0000000000..e7b02735a1 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_060.txt @@ -0,0 +1,27 @@ + + + ▌▉▉▊▋▉▉▊ + ▍ ▍▏▋ ▉█▊▍ + ▋▏▏▏▋▎█▍▍▍ + ▋▋▋▏▌▏ █▏▏▏ + ▏▏▏▋▏▉▊ █▏▏ + ▏▏▎▏▋▋▏▍▏ ▍▏ + ▏▏▋▉▏▏▋▏ ▏▏ + ▏▏██▏▏▏▏▍██ ▊ + ▏▏▋▏▏▉▋▍▏▏▏▎▏ + ▏▏▏▏▏ ▏▏▏ ▍▎▏ + ▏▏▍▉█ ▏██▏█▏▏ + ▏▏▎▍▏ ▏ █▏▋▏▏ + ▏▏▎▎▏▎▎▋▏▏▏▏▉ + ▏▏▏▏▏▏▏▏▏ ▏▍ + ▏▏▎▏█▏ ▏▏▏ ▏▋ + ▏▏▍▏▏▏▏▏▏▏▏█▏ + ▏▍▋▋▋▏ ▋ ▏ + ▏▏▋▏▏█▌▏▏█ + ▋▏▏▏▍▏▉▍▎▏▍ + ▏▍▉▏▍█ ▏▉▏▏ + ▌ ▏ ▍▍ ▊▍▎▉ + ▉▉▏ ▉█▊▌▏▏ + █▉█▎██▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_064.txt b/codex-rs/tui/frames/vbars/frame_064.txt new file mode 100644 index 0000000000..66a67c1624 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_064.txt @@ -0,0 +1,27 @@ + + + ▉▉▉▊▉▉▉▊ + ▏▍▏█ ██▌▏ + ▏▎▏█ ▏▍▋▍ + ▏▏▏▍▎▍█▏▋ + ▏▋▋▏▊█▍▏▏ + ▉█▋ ▍▍▋▍▏ + ▉▋█▏▋▉▉█▏ + ▍▏▎▏ ▏▋▍▍ + ▍▏▌▎▊ ▋▏ + ▏▏▏▎▍▍▏▏▎ + ▏▏▏█▊▉█▏▏▏ + ▏▏▏▏▊▋▌▋▏ + ▏▏▏▏▏▏▎▏▏▎ + ▏▏▏▏▏▏▍▎▏▎ + ▏▏▏▏▏▏▏▏▏▏ + ▏▏▋▏▏▏▏▏█▏ + ▏▏▏▏▏▏▏▏▎▏ + ▏▏▏▏▏▏▏▏▋▏ + ▏▏▉▏▍▋▊▏▎▏ + ▍▏▌▏▏▊█▏▍▎ + ▍▏█▏ ▏ ▏ ▎ + ▉▋██ ▋▉▋ + █▉██▉█▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_068.txt b/codex-rs/tui/frames/vbars/frame_068.txt new file mode 100644 index 0000000000..8ed6c9bfbe --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_068.txt @@ -0,0 +1,27 @@ + + + ▊▉▉▋▊▊▉▌▊ + ▍▋█▍▋▏▍ █ + ▏▊▎██▍▍▏▍▌ + █▏▊ ▊ ▏▉▏▊▏ + ▏▏▏ ▎▍▏▏▏ ▏ + █▉▏▊▏▋▍▏▍ ▏ + ▍▏▏▎▏▏▏▏▏ ▏ + ▋▏▏▏▋▏▍▏▏▏ ▏ + ▏▏▏▏▏▏▍▏▏▉ ▏ + ▏▎▏▏▏▏█▋▏▍ ▏ + ▏▏██▏▍▏▋▏▊▋▏ + ▏▊█▋▎███▏▏▋▏ + ▍▏ ▏▏▏ ▏▏▏▉▏ + ▎ ▏▏▏▊▏▏▏█▏ + ▎▏▏▏▏█▏▉▏▏▏ + ▍▍▏▏▏ ▋▍▏▏▏ + ▏▋▏▏▏▎▋▏▏▋▏ + ▏▏▍▋█▏▏▍▋▌▏ + ▏▉▏▊▊▊▏▊▏▎▏ + █▍██ ▏██▏▎▍ + ▏▏▊ ▏▏▋▏▋▏ + ▏▋▍ ▏▉▍▎▎ + ▎██████▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_072.txt b/codex-rs/tui/frames/vbars/frame_072.txt new file mode 100644 index 0000000000..b8f62adc6a --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_072.txt @@ -0,0 +1,27 @@ + + + ▊▉▏▌▊▌▉▏▊ + ▋▍▍▏▋▏▍▋▎▋▉ + ▏▏█ ▎ ▋▏▎▉▍▍▍ + ▊▍▎ █▏▏▏▏▊█ ▋ + ▏▏▋▏▋▍▏█▏██▌▏▉▊ + ▏█▏▊▏▏▏▏▏▏▏ ▍▏ + ▍▏▏██▍█▏▊▏ ▊▋▏▋ + ▏▏▏▏▏▎▏▏▏▍█▏ ▎▏ + ▏▏▏▏▏▏▏▏█▏▏▏ ▊▋▏ + ▏▏▏▏▌▋▏▏▋ ▍▉▏▏▏▏ + ▏▏█ ▍▏▋▏▋▋▊▏▋▋▏▏ + ▏▏▍▏▋▊▍█▍▎▍▍█▍▍▏ + ▏▏▏▏▏▍█▏▋▋▌▉▌▌▏▏ + ▏▏▏▏▏ ▏▉▏▏▏▏▏█▏▏ + ▏▏ ▍ ▏▏█▏█▍▍▏▉▏▏ + ▏█▍█▏█▏▏▏▍▍▋▍▎▏ + ▏▊ █▏█▏▍ ▏▏▏▋▍ + ▏▏▏ ▍▊▍▍▊▉▏▋▏▏ + █▏▋▍▋▊ ▌▏▏▋▏▏▊▏ + ▏▏▉ █ █▉▋▎▏█▏ + ▊▍ ▊ ▍█▏▉▌▋▋ + █▋▏▋ ▍▎▍▎▋ + ███▎███▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_076.txt b/codex-rs/tui/frames/vbars/frame_076.txt new file mode 100644 index 0000000000..c1eb5536c2 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_076.txt @@ -0,0 +1,27 @@ + + + ▎▉▉▉▌▊▉▉▏▎▎ + ▉▍▋▏▏▍▍▍▉▎▋▉▍ + ▏▏▋▏█▍▋▏▍▏█▉▊▍▍ + ▏▋▎▋▋▋▍▏▉▋█▍███▏▊ + ▊▉▌▏▎█▋▋▏▏ ▊█▍▋ + ▏▍▍▋▋ ▎▊▋▉▎ ▍▏▊ + ▍▏▋▍▎▊█▏▏▍▉ ▍▏▏ + ▏▏▍▎▋▏▏ ▏▏▏▉▌ ▋▏ + ▏▏▍▉▏▏▎▎▍▍▎▏▏ ▊▌▏▏ + ▍▏▏▏▏▏ ▎▏▍▊ ▏▏▎▏ + ▏▏▏▏▏▋ ▋▏▎▏▊▏▏ ▏▋▍▏ + ▏▏▏▏▏▋ ▍▋▎ ▏▍▏ █▏▍▏ + ▏▏▏▏▏ ▋▏▏▍▌▉▊▌▏▏▏ + ▏▏▏▏▏ ▋▏▌▎▊▏▏▎▋▏█ ▏▏ + ▏▏▏▏▏ ▍▍▏▏▎▍▉█▋▏▉▋▏▏ + ▏▏▏▏ ▍▍▏▏▉▍▎▍▊▏▍▏▋▏ + ▏▏▏▏ ▍▏▋ ▏█▏▍▉ + ▉▏▏▏▏▏ █▏ ▋▋▍▉▏█ + ▏▍█▍▊▏▏▉▋▊ ▊▏ ▏▊▍ + █▊▍▋ ▏▏▍▍▏▋▉▌▏▍▉█ + █▏▊▋ ▎▍█▊▊▉▋▋▍▋ + █▍▉▉ █▉▎▉▎▎▌█ + █▎▎█▎▉█▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_080.txt b/codex-rs/tui/frames/vbars/frame_080.txt new file mode 100644 index 0000000000..40d664a5b8 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_080.txt @@ -0,0 +1,27 @@ + + + ▊▌▉▏▎▊▌▉▏▎▎ + ▋▉▉ ▉█▏▏▉▎▊▋▏▉▊ + ▏▎█▋▊▋▊▏ ▉▉█▉▉▉▊▍ + ▋█▏▏ ▋▋▏▊▋▊▎█▎ ██▍▍ + ▏█▋▏▏▊▊▏▍▉ ▋▍▏▊ + ▋▋▏▊▋▋▎▍█ ▎ ▍▋ + ▏▏▋▍▍▏▊▏▉ ▎▉▎ ▍▋▏▊ + ▌▏▏ ▏▏▉█▉▏ ▍▌▏▍ █▏▋ + ▏▍▏██▏▎▏▏▎ ▋▍▎▊▋ ▏▏ + ▍▏▏▏█▏▏▏▏ ▍▏▏▍ ▏▋▏ + ▏▏▏▏▏▎▎▏▏ ▋▋ ▋ ▋▉▋▏ + ▏▏▏▏█▏▎▏▏ ▏▍▏▎ █▏▏▏ + ▏▋▏▏▎█▏▏▏ ▋▎█▏▌ ▉ ▋▎▏▏▏ + ▏▏▏▏▏ ▋▏█ ▏▌▏█▎▏ ▉ ▎▎▏▍▏ + ▏▏▏▏▋ ▉▏ ▉▎ ▋ ▎▏▋ ▋█▏▏▉ + ▏▏▏▏▏ ▉▏ ▋▉▋ ▎▏▏▏▍▏ + ▏▏▏▏▏█▏▏ ▋▏▏▏▎ + ▌▍▏▏▍▋█▏▉▎ ▋▍▍ + ▉▏▊ ▎▏▍▍▍▍▎ ▎▏▉▎ + ▍▍▎ ▍▍▍▍▍▉▊▉▉▎▎▏▊▉▋ + █▏▎ ▉▌ ▉▌▉▋▉▎▉ + ▉▍▎ █▉▎▉▊▎▎▌▉▎ + ▎█▎▎▎▎██▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_084.txt b/codex-rs/tui/frames/vbars/frame_084.txt new file mode 100644 index 0000000000..724489d2c4 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_084.txt @@ -0,0 +1,27 @@ + + + ▎▊▌▉▎▊▌▉▉▉▉▊ + ▎▏▉ ▌█▏▏▉█▎▌▋▎▉▍▎ + ▎▏▉▎▎▋ ▋▋▎▉▉▉█▉▉█▍▏▍ + ▊▋█▊ ▍▉▊▉▊▉▋ ▎▎ ▍█▍▏ + ▊▋█▊ ▏▋▊▏▏▉ █▏▏ + ▏▋▎▊▋██▋▍▉ ▎ █▍▊ + ▏▏▏▋▍▏▊▏▏█ ▉▎▍ ▋▏▍ + ▏▏ ▋▏▎▎▏▊ ▏▊▍▎▍ █▋▏▊ + ▏▉▏▋█▏▏▉█ ▍▋▎▏▍ █▏▍ + ▏▏▏▏▏█▌▏▏ ▍▍▋▊ ▏▏▏ + ▏▋▏▏█▍▏▉▏ ▊ ▍▏▉▍ ▏▏▍ + ▏█▎▊█▎▎▏▏ ▏▍▉▊▎▏ ▎▏▋ + ▏█ ▎▊▏▋▏▏ ▉▋▎▉▍▉▌▌▉▉▍▎ ▎▎▏▋ + ▏▏ ▍▎█▏▏▏▏ ▋▋▋▍▋ ▉▏▉█▎ ▏▏▏▏ + ▏█ ▉█▏▏▎▏ ▎▋ ▏ ▎▏▉▏ ▉▉▋█▏ + ▏ ██▉▏▉ ▏▋ ▍▏▏▎ + ▍▍ █▍▏▎▏▊▏ ▊▏▊▏▊▏ + ▍▏▍ █▎█▍ ▍ ▏▋▎▍▍▎ + ▏▏ ▍█▏▍ ▏▎ ▋█ █▏▉▋ + ▍▍ ▎█▋▏▍▎▉▎▎▎▉▉▎▋▌▏█▋ + ▉▏▎ ▎▍▎▍▏ █▉▉▉▉▉█▊█ + ▉▉▎ █▉▎▉▍▎▎▎▎▋▉ + ▎█▎▎▎▎██▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_088.txt b/codex-rs/tui/frames/vbars/frame_088.txt new file mode 100644 index 0000000000..154757f675 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_088.txt @@ -0,0 +1,27 @@ + + + ▋▊▌▏▎▌▉▌▌▉▉▊▎ + ▊▋▍ ▉▌▋▏▋▉▎▎▌▍▌█▉▊ + ▎▋▎▋ ▊▉▊▉▎▉▉▉▏▏▉▏█▏▌▉▊ + ▋▏ █▋▋▋▋▋▌▉▏ █▏▊▎█▍▏▍ + ▋▍█▎▋▉▋█▉ ▍▋▎▍▏▍ + ▋▏▋▋▊▋▋▌▍ ▎ ▉▉ █▏▏ + ▎▏▍▍█▏ ▊▋ ▏▉▌ ▍ ▍▏▊▊ + ▏▏▎▋▋██▏ ▏▊▉▊ ▍ ██▏▏ + ███ ▏▎▍ ▍▋▎▉▏▍▎ █▍▏▋ + ▏▏▏▏▏▌▌▏ ▋▉▋▍█ █▋▏▏▏ + ▏▏▏▏▏▏▏▋ ▌ ▎▋▏▍▏ █▋▏▏▋ + ▏▎█▏▏▏▏▏ ▋▉▏▋▎▎▊█ ▋▏▏▍ + ▏▏ ▏▋▏▏▏ ▏▏▎▉▋▏▉ ▉▉▉▍▎ ▌▏▏█ + █▋█ ▉▋▏ ▋▋▋▋▉▋▋ ▍▉██▏▋ ▏▏▏▏▏ + ▏ ▋ ▏▏▎ ▎▏▏▊ ▍▉▉▉▋ ▏▉▉ + ▉▋▋ ▏█▏█ ▍▊▎ ▏▏▋▋ + ▏▊ ▍▏▍▍▊▍▊ ▎▉▋▋▏▍▎ + ▉▋▍█▊█▏▊▍▊ ▌▉▋▋▍▍▋ + ▏▌▍▍▊▍▏▊▉▍ ▎▋▎▊▏▊▏▋ + ▏▌ ▍▍▍▍ ▉▉▊▎▎▌▉▎▏▏▏▉▍▉ + █▏▎▎█▍█▍▏ █▉▌▉▉▉▉█▎▋▎ + █▉▊ ▎▉▊▉▉▌▎▎▎▎▉▉▎ + ██▎▎█▉██▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_092.txt b/codex-rs/tui/frames/vbars/frame_092.txt new file mode 100644 index 0000000000..444f63fc20 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_092.txt @@ -0,0 +1,27 @@ + + + ▎▊▊▌▉▎▉▉▉▉▌▏▊▎ + ▎▉▏ ▉█▏▉█▉█▎▌▋▏▌█▉▍▊ + ▎▋█▎▋▊▉█▉█▎▉▉▉▏▏█▉▉▉▋▎▍▊ + ▋▉▊▋▌▉▍ ▉▊▉ ▍▋▎▉▉▏▊▍ + ▏▎▋ ▊█▎▌ ▏▋ ▉▍▍ + ▏▏▎▎▍█▊ ▉▎▌ █▉▏▏ + ▋▉█▉▏▋▎▊ ▋▏▉▍█ ▍▋▍▏ + ▎▏▋▊▏▏▌▏ ▏▋▊▉▍ █▏▋▎ + ▏▎▏▏ ▏▎█ ▏▊▊▉▍▎▍ ▏▏▏ + ▏▏▏ ▊▏▏ ▏▊▋▉▍ ▋▏▏ + ▍▏▏▏▏▍▏ ▋▌▌▎██ ▏▏▋ + ▍▏▏▎▏▏▏ ▋▋▋▋█▋ ▏▉█ + ▏▏▏▋▏▏▏ ▋▍▋▋▋▋▋▎ ▌▌▉▉▉▉▏▌ ▊█▏▉ + ▏▏▏▏▉▍▋ ▌▋▋▋▋▏█ ▉▌▉█▉▏█▎ ▊▏▏▍ + ▉▏▏▏▍▏▏▊▍ ▉▊▏ ▍ ▉▏▉▌▉▌▏▉ ▏▍▉▏▏ + ▉▎▏▏▏▋▋ ▏ ▉▍▊▎ ▎ █ ▏▏ + ▉▊▍▍▊▉▍█▏ ▊▉ ▏▍▍▋ + ▉▏▍▍▍▊▍▍ ▏ ▏▎▋▊▏▋ + █▏▎▍▍▍▏▍▎▉▊ ▎▌▉█▎▋▋▉▋ + ▍▎ █▊▏▏▊▎▉▉▎▎▎▎▉▉▉▊▏▉▉▉▊▉ + █▍▎▍▍▏▍▊▊ ▎▉▉▉▉▉▉▉▉▎▎▉ + ▉▉▎▎▉▊▉▏▊▎▎▎▎▎▊▉█ + ▎█ ▎▎█▉██▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_096.txt b/codex-rs/tui/frames/vbars/frame_096.txt new file mode 100644 index 0000000000..80520575c4 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_096.txt @@ -0,0 +1,27 @@ + + + ▎▎▉▏▊▉▉▉▉▉▏▎▎ + ▎▊█▎▉▏▏▉█▏█▎▌▊▋█▏█▉▉▊▎ + ▎▋▍▋▋▉▉█ ▎▎▋▉▉▉▏▏█▉▉▌▍▊▉▍▎ + ▋█ ▊▊▏▎ ▍▊█▉▉▌▉▍ + ▏ ▋▏▋▋ ▉ ▋▉▊▍ + ▏▋▋▋▏▋█ ▊▉▎█ ▉▍▍ + ▉▌▌▋▏▊▋ ▋▋█▍▎ ▉▉▍▏ + ▌▋▊▌▏▍▊ ▏▏▋█▏ ▎█▏▋▊ + ▉▍██▉▏ ▏▊▏▋▏ ▍ ▏▏▏ + ▎▏▏▏▎▏▍ ▍▍▍▍▏▎█ ▏▏▋ + ▏█▏█▋▏▏ ▊ ▍▉▏▏▏▊ ▋▏▏▏▏ + ▏▏▎█▏▏▏ ▏▋▌▎▋ ▋▍█ ▏▊▏▏▏▏ + ▉▏▏▏▏▏▏ ▏▋▊▊ ▋█ ▌▉▉▉▉▌▌▍ ▎█▏▉▋▎ + ▊▏▏▏▏▊▊ ▏▊▊▉▎▌█▋ ▏▎▉██▏▉█ ▏ ▍▏▋ + ▏ ▏▏▏▏▏ ▉▋▋ ▊▎ ▍▏▉▉▉▌▉ ▏█▋▋▏▊ + ▍▏▍█▊▊▊ ▏▎▊█ ▌▉█▏▏▏▎ + ▉▍▍▏ ▋▋▎ █▌▉█▏▊▍▋ + ▍▏▍▉▏▍▏▎▉▋ ▎▋█▌▉▊▏▋ + ▉▍▍▍▊▏▍▌ ▉▊▋ ▎▉█ ▏▉▉▋▋ + ▍▎ ▍▉▏▍▎█▉▉▌▎▎▎▎▉▉▉▌▎▉▏▋█▏▎ + ▍▎ ▍▉▉▏▊▊▎▉▉▉▉▉▉▉▉▉█▎▉█ + █▉▊▎▍▋▎▏▊▎▎▎▎▎▎▌▉▉▎ + ▎█▎▎▎█▉██▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_100.txt b/codex-rs/tui/frames/vbars/frame_100.txt new file mode 100644 index 0000000000..b020690848 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_100.txt @@ -0,0 +1,27 @@ + + + ▋▎▎▉▌▉▉▉▉▉▉▉▎▎ + ▊▉▎▊▌▋▉▉▎▋▉█▎█▋▎▏█▉▉▉▎ + ▎▉▍▎▋▉▉▋▋▋▎▊▉▉▉▌▏▏▉▉▉▌▍▏█▉▊ + ▋█ ▋▋▌▋▋ ▏▊▉▍▌▋▉▊ + ▎▏▊▎▊▉▉▉▎ ▍ ▉█▋▉ + ▎▏▎▏▋▋▊ ▊▌▎ ▋▍▊▏ + ▏▋▍▋▋▍▋ ▋▏█▏▎ ▋▍▍▊▏ + ▋▋▋▏▏▋▎ ▉▏▎▍▏▎▎ ▎▍▊▏▍ + ▏ ▋▊▉▏ ▉▍▊▎▉▌ ▍ ▏▏▏ + ▏▎▏▏█▏▏ ▉▏▍█▉▍▋█ ▏▊▏▊ + ▏ █▏▏▍▉ █▏ ▎▋▍ ▍▉ ▏▏▍▏ + ▏▎█▍▎▍▏ ▋▍▍▉▋ ▎▏ ▏▏█▏ + ▏ ▎█▏▏▎ ▏▍▎█▋▎▎▋ ▌▌▌▌▌▉▉▌▉▌▎▎ ▍▏▋▏▏ + █▎ ▏▏▏ ▏▎▊▊▉▏▊▋ ▏▏▋▉█▉▏▌▎▎▎▏ ▏▏█▎ + ▏▋█▏▍▋▎▍ ▏▉▋▏ ▎▉ █▏▉▏▉▌▌▉▉▌ ▋▏▍▍▌ + █▍▏▏▏▉▍ ▏ ▏▍▊█ ██ ▎▋▋▉▎ + ▍▏▏▏▏▍▏ ▏▎ ▋█▊▉▏▏▋ + ▍▌█▍▏▏▍▎▉▊ ▋▏▎▉▎▎█▋▋▋ + █▊ ▉█▏▏▋█▏▎ ▎▌▉█▎▉▊▏▊█ + ▉▎ ▉▉▏▉▎█▏▏▌▉▎▎▊▊▉▉▉▏▎▉▉▉▏▋▋ + ▉▊▎▉▉▏▌▎ ▉▏▉▉▉▉▉▉▉▉██▊▉▎ + ▎▉▋▎▉█▉▉▍▌▎▎▎▎▎▊▊▉▉█ + ▎ ▎█▉▉██▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_104.txt b/codex-rs/tui/frames/vbars/frame_104.txt new file mode 100644 index 0000000000..9951867cab --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_104.txt @@ -0,0 +1,27 @@ + + + ▎▋▊▌▉▌▉▉▉▉▉▉▉▎▎ + ▎▉█▊▏▋▉▉▎ █▉▉▉▊ + ▊▉▎▋▉▉█ ▎▊▌▉▉▉▌▏▏▉▉▉▌▊▏▏▉▉▎ + ▊▉▋▋▋▍▊█▎▊▉ ▌▎▉▏▊▍█▍▎ + ▋ ▌▊▉▊█▊▋ ▉▏▋▋▍▍▉▍ + ▉█▋▉█▋ ▋ ▌▌▍▍ ▍ ▏█▋▍ + ▏▉▋▏▎▋█▏ ▋▌█▉▊▍ █▍ ▏▋▋▍ + ▏▍▍▍▋▊▋▋▎ ▍▍▊▎▍▍▍▎ ▎ ▍▋▍▊ + ▏▌▏▍▏▍▎ ▉▏▍ ▉▏█▏ ▍ ▏▏▍▉ + ▏█▏▏▏▏█▏ ▊ ▏▏▊▋▏▎▏ ▏▋█▊ + █▏▉█▏▏ ▏ ▎▍▋ ▏▉ ▋▏ █ ▏▏ ▏ + ▏▏▎▋▏▏ ▏ ▎▉▊▋▌▎ ▋█ ▏▋▏▏█▏ + ▍█ ▏▏▏█▏ ▊▉▋▋▏█▋▏▎ ▌▉▉▌▉▉▉▌▌▊ ▍▏▏▏▊▏ + ▎▎█▉▋ ▊ ▋▎▊▏▋ ▎▏ ▉▋▍▉█▉▏▌█▎█ ▋▉▏▍▏▎ + ▍ ▏▏▏▏▊▏ ▉▊▋▏▎▎ ▏▉▉▏▏▌▌▉▉▉ ▎▏▏▏▏ + █▏▎▍▍▍▏█▏ ▉▋ ▎▍▏▍▎ + ▍▎▍▋▍▏▊▍▏▎ ▎▋▎▋█▋▉█ + ▉▌█▏▏▍▊ ▏▊ ▎▌▉▎▉▋▏▏█ + █▍ ▉▉▏▌▎█▏▊▎ ▎▉█▎▋▍▉▉▋▎ + ▉▌ ▉▉▉▌▎█▏▉▉▉▉▊▎▊▊▉▉▉▏▎▌▉▊▏▉▊▉ + █▉▎▍▉▍▉▎▎ █▉▏▉▉▉▉▉█▉▉▏▉▏▋█ + █▏ █▉▏▉▉▊▎▎▎▎▎▎▊▎▉▉█ + ▎ ▎██▉▉██▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_108.txt b/codex-rs/tui/frames/vbars/frame_108.txt new file mode 100644 index 0000000000..2b7ec2d1fb --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_108.txt @@ -0,0 +1,27 @@ + + + ▎▋▎▌▌▉▉▉▉▉▉▉▉▊▎▎ + ▊▌▏▉▉▉▉█ █▉▊▎ + ▎▋▉▉▏▉▌▋▋▋▎▉▉▉▏▏▏▏▏▉▉▉▉▍▎▌▉▉▊ + ▎▋▉▋▋█▌▎▊▌▉ ▍▊█▉▉▏▏▉▊ + ▋▎▌▊▉▏▎▊▏ ▉▋▍▉▉▋▏▎ + ▏▏▋▏▊▉█▏▏ ▊▉▏▍ ▊ ▏▍▍▍▊ + ▏▍▋▏▊▉▍▏ ▍▌▋▋▏▉ ▎▍▍▍▏▍▉▊ + ▋▉▏▍▍▋█▏ ▉▏▌▍▉▍▎ ▍▍█▍▍▏▎ + ▏▏▏▏▏▋▏ █▏▌▎▏▏▊ ██▍▊▎▏ + ▏▏▍▏▏▋▋ ▋▉▏▍▉▍▍▉ ▎▏▋ ▏▏▏ + ▉▉▏▎▏▋▏ ▏ ▏▏▊▋▏▏ ▋ ▏▋▍▊ + █▎▏▎▏▎▏ ▋▍▊▊▉█▊▏ ▋▋▏▍ ▏ + ▍ ▋▏▏▊ ▏ ▎▉ ▋▋▋▋▋▋ ▊▉▌▌▉▉▉▉▉▉▌▉▊▊ ▏▌▏▏▎▎ + █▎ ▏▏▏▍▏ ▉▍▉▋▋█▋█ ▊▏▏▍▉█▉▉▌█▎█▉█ █▏▏▏▏ + ▏▊▍▍▏▋ ▏▎ ▊▏▋▊▋ ▍▍▉▉▏▏▌▌▉▉ ▏▏ ▋ + ▏█▏▊▋▊▉▍▋ ▊▎▋▋▏▋▏█ + █▍▉▏▋▏▎█▍▎ ▎▌▉▎▋▋▏▊▎ + █▉█▏▏▏▊ ▏▊ ▎▉▎▋▌▌▌▋▎ + ▍▎▍▉▏▍▊█▏▉▎ ▋▉▎▏▉▏▉▍▉ + █▉▎▉▏▉▉▎█▍▉▉▉▉▉▎▎▊▌▉▉▉▏▎▌▉▏▉▎▎▋▎ + ▉▊█▉▏▏▎▍██▉▏█▉▉▉▉██▉▉▏▍▎▉▉ + ▉█▋▉▉▏▏▉▌▎▎▎▎▎▎▌▉▉▉█ + ▎ ███▉▉██▎ + + diff --git a/codex-rs/tui/frames/vbars/frame_112.txt b/codex-rs/tui/frames/vbars/frame_112.txt new file mode 100644 index 0000000000..27c18a9dd6 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_112.txt @@ -0,0 +1,27 @@ + + + ▎▎▎▌▌▉▉▉▉▉▉▉▉▊▎▎ + ▎▋▉▊▋▏▉█▊▍██ █▉▉▎ + ▊▉▊▏▉▌▉█▊▎▊▉▋▉▉▌▏▏▏▉▉▉▉▉▎ ▉▉▎ + ▊█▋▉█▉█▌▌▉▉▏▍ ▊█▉▉▌▊█▍▎ + ▊▉▏▏▉▊█▊▏ ▉▉█▉▊▊▉▍ + ▋▋▋▏▎▉ ▋ ▌▊▊▊▎ ▍▌ █▍▍█▏ + ▋▍▋▋▊▉▎▏▎ ▍▍▎▍▉▉▎ ▉▍ ▍▏ ▏ + ▊▋▏▍▍▉█▏ █▏▍▍▋▊▉▋▎ ▉▍ ▍▏ ▏ + ▏▏▏▏▏█▋▎ ▉▍▎█▍▍▎█ ▍▋ ▏▏█▊ + ▎▏▏█▏▎▋▏ ▎▉▏▎█▍█▊█ ▏ ▏▏▎▏ + ▏▍█ ▏ ▍ █▉▎▋▍ ▋ ▏▊▍▏▋▏ + ▏▎▏▎▏ ▍ ▎▉▎▉▋ ▋▉ █▋▏▏▏▏ + █▎ ▍▏▎ ▏ ▋▏▊▏▍ ▎▏▎ ▊▌▌▌▉▌▌▉▉▌▉▉▊▎ ▍█▏▏▎▏ + ▊ ▏▏▏█▏ ▎▋▋▋▉▎ ▌▉ ▍▏▏▌▉▉█▉▉▉█▎▏▉▏▊▏▎▏▍█▏ + ▍▊█▍▉▋█▏ ▏▏█▋▋█ ▉▌▎▉▏▉▉▌▌▉▉▉▉▋▎▏▌▏▋▎ + ▍█▏▋▏ █▍ ▋▍▎▍▉▎▋ + ▍▉▏▏▍▎▍▉▎ ▎▋▎▋▊▋ ▋ + ▍▋▏▏▏▎▊▍▍▎ ▎▉▉▊▉▋▏▊▉ + ▉▊█▏▏▌▊█▌▉▉▎▎ ▎▊▉█▏▉▋▏▍▋▎ + ▉▊▍▉▏▍▊▋▉▏▉▉▉▉▉▎▎▊▌▉▉▉▏▎▉▉▏▉█▎▉█ + █▉▎▏▏▍▎ ▎ █▉▏█▋▉▉▉██▉▉██▎▉▉▎ + ▎▎▋▉▉▉▏▉▉▊▎▎▎▎▎▎▌▉▉▉▉▎ + ▎ ██▉▉███▎ + + diff --git a/codex-rs/tui/src/new_model_popup.rs b/codex-rs/tui/src/new_model_popup.rs index 16a04761f2..cd4ba83db8 100644 --- a/codex-rs/tui/src/new_model_popup.rs +++ b/codex-rs/tui/src/new_model_popup.rs @@ -5,6 +5,8 @@ use codex_core::config::SWIFTFOX_MODEL_DISPLAY_NAME; use color_eyre::eyre::Result; use crossterm::event::KeyCode; use crossterm::event::KeyEvent; +use crossterm::event::KeyModifiers; +use rand::Rng as _; use ratatui::buffer::Buffer; use ratatui::layout::Rect; use ratatui::prelude::Widget; @@ -14,8 +16,72 @@ use ratatui::widgets::Clear; use ratatui::widgets::Paragraph; use ratatui::widgets::WidgetRef; use ratatui::widgets::Wrap; +use std::time::Duration; use tokio_stream::StreamExt; +// Embed animation frames for each variant at compile time. +macro_rules! frames_for { + ($dir:literal) => { + [ + include_str!(concat!("../frames/", $dir, "/frame_000.txt")), + include_str!(concat!("../frames/", $dir, "/frame_004.txt")), + include_str!(concat!("../frames/", $dir, "/frame_008.txt")), + include_str!(concat!("../frames/", $dir, "/frame_012.txt")), + include_str!(concat!("../frames/", $dir, "/frame_016.txt")), + include_str!(concat!("../frames/", $dir, "/frame_020.txt")), + include_str!(concat!("../frames/", $dir, "/frame_024.txt")), + include_str!(concat!("../frames/", $dir, "/frame_028.txt")), + include_str!(concat!("../frames/", $dir, "/frame_032.txt")), + include_str!(concat!("../frames/", $dir, "/frame_036.txt")), + include_str!(concat!("../frames/", $dir, "/frame_040.txt")), + include_str!(concat!("../frames/", $dir, "/frame_044.txt")), + include_str!(concat!("../frames/", $dir, "/frame_048.txt")), + include_str!(concat!("../frames/", $dir, "/frame_052.txt")), + include_str!(concat!("../frames/", $dir, "/frame_056.txt")), + include_str!(concat!("../frames/", $dir, "/frame_060.txt")), + include_str!(concat!("../frames/", $dir, "/frame_064.txt")), + include_str!(concat!("../frames/", $dir, "/frame_068.txt")), + include_str!(concat!("../frames/", $dir, "/frame_072.txt")), + include_str!(concat!("../frames/", $dir, "/frame_076.txt")), + include_str!(concat!("../frames/", $dir, "/frame_080.txt")), + include_str!(concat!("../frames/", $dir, "/frame_084.txt")), + include_str!(concat!("../frames/", $dir, "/frame_088.txt")), + include_str!(concat!("../frames/", $dir, "/frame_092.txt")), + include_str!(concat!("../frames/", $dir, "/frame_096.txt")), + include_str!(concat!("../frames/", $dir, "/frame_100.txt")), + include_str!(concat!("../frames/", $dir, "/frame_104.txt")), + include_str!(concat!("../frames/", $dir, "/frame_108.txt")), + include_str!(concat!("../frames/", $dir, "/frame_112.txt")), + ] + }; +} + +const FRAMES_DEFAULT: [&str; 29] = frames_for!("default"); +const FRAMES_CODEX: [&str; 29] = frames_for!("codex"); +const FRAMES_OPENAI: [&str; 29] = frames_for!("openai"); +const FRAMES_BLOCKS: [&str; 29] = frames_for!("blocks"); +const FRAMES_DOTS: [&str; 29] = frames_for!("dots"); +const FRAMES_HASH: [&str; 29] = frames_for!("hash"); +const FRAMES_HBARS: [&str; 29] = frames_for!("hbars"); +const FRAMES_VBARS: [&str; 29] = frames_for!("vbars"); +const FRAMES_SHAPES: [&str; 29] = frames_for!("shapes"); +const FRAMES_SLUG: [&str; 29] = frames_for!("slug"); + +const VARIANTS: &[&[&str]] = &[ + &FRAMES_DEFAULT, + &FRAMES_CODEX, + &FRAMES_OPENAI, + &FRAMES_BLOCKS, + &FRAMES_DOTS, + &FRAMES_HASH, + &FRAMES_HBARS, + &FRAMES_VBARS, + &FRAMES_SHAPES, + &FRAMES_SLUG, +]; + +const FRAME_TICK: Duration = Duration::from_millis(60); + #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub(crate) enum ModelUpgradeDecision { Switch, @@ -32,6 +98,8 @@ struct ModelUpgradePopup { highlighted: ModelUpgradeOption, decision: Option, request_frame: FrameRequester, + frame_idx: usize, + variant_idx: usize, } impl ModelUpgradePopup { @@ -40,6 +108,8 @@ impl ModelUpgradePopup { highlighted: ModelUpgradeOption::TryNewModel, decision: None, request_frame, + frame_idx: 0, + variant_idx: 0, } } @@ -51,6 +121,11 @@ impl ModelUpgradePopup { KeyCode::Char('2') => self.select(ModelUpgradeOption::KeepCurrent), KeyCode::Enter => self.select(self.highlighted), KeyCode::Esc => self.select(ModelUpgradeOption::KeepCurrent), + KeyCode::Char('.') => { + if key_event.modifiers.contains(KeyModifiers::CONTROL) { + self.pick_random_variant(); + } + } _ => {} } } @@ -66,6 +141,30 @@ impl ModelUpgradePopup { self.decision = Some(option.into()); self.request_frame.schedule_frame(); } + + fn advance_animation(&mut self) { + let len = self.frames().len(); + self.frame_idx = (self.frame_idx + 1) % len; + self.request_frame.schedule_frame_in(FRAME_TICK); + } + + fn frames(&self) -> &'static [&'static str] { + VARIANTS[self.variant_idx] + } + + fn pick_random_variant(&mut self) { + let total = VARIANTS.len(); + if total <= 1 { + return; + } + let mut rng = rand::rng(); + let mut next = self.variant_idx; + while next == self.variant_idx { + next = rng.random_range(0..total); + } + self.variant_idx = next; + self.request_frame.schedule_frame(); + } } impl From for ModelUpgradeDecision { @@ -81,20 +180,27 @@ impl WidgetRef for &ModelUpgradePopup { fn render_ref(&self, area: Rect, buf: &mut Buffer) { Clear.render(area, buf); - let mut lines: Vec = vec![ - String::new().into(), + let mut lines: Vec = self.frames()[self.frame_idx] + .lines() + .map(|l| l.to_string().into()) + .collect(); + + // Spacer between animation and text content. + lines.push("".into()); + + lines.push( format!( " Codex is now powered by {SWIFTFOX_MODEL_DISPLAY_NAME}, a new model that is" ) .into(), - Line::from(vec![ - " ".into(), - "faster, a better collaborator, ".bold(), - "and ".into(), - "more steerable.".bold(), - ]), - "".into(), - ]; + ); + lines.push(Line::from(vec![ + " ".into(), + "faster, a better collaborator, ".bold(), + "and ".into(), + "more steerable.".bold(), + ])); + lines.push("".into()); let create_option = |index: usize, option: ModelUpgradeOption, text: &str| -> Line<'static> { @@ -138,6 +244,8 @@ pub(crate) async fn run_model_upgrade_popup(tui: &mut Tui) -> Result Result popup.handle_key_event(key_event), TuiEvent::Draw => { + popup.advance_animation(); let _ = tui.draw(u16::MAX, |frame| { frame.render_widget_ref(&popup, frame.area()); }); From c47febf22141ef316abc1b0e51da48ef5110874b Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Sun, 14 Sep 2025 17:50:06 -0700 Subject: [PATCH 39/77] Append full raw reasoning event text (#3605) We don't emit correct delta events and only get full reasoning back. Append it to history. --- codex-rs/tui/src/chatwidget.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 008cc777ed..e8f3017ce2 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -1037,8 +1037,9 @@ impl ChatWidget { | EventMsg::AgentReasoningRawContentDelta(AgentReasoningRawContentDeltaEvent { delta, }) => self.on_agent_reasoning_delta(delta), - EventMsg::AgentReasoning(AgentReasoningEvent { .. }) - | EventMsg::AgentReasoningRawContent(AgentReasoningRawContentEvent { .. }) => { + EventMsg::AgentReasoning(AgentReasoningEvent { .. }) => self.on_agent_reasoning_final(), + EventMsg::AgentReasoningRawContent(AgentReasoningRawContentEvent { text }) => { + self.on_agent_reasoning_delta(text); self.on_agent_reasoning_final() } EventMsg::AgentReasoningSectionBreak(_) => self.on_reasoning_section_break(), From ce984b2c71fbea607eddca3315c52296a67c9c80 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Sun, 14 Sep 2025 20:53:50 -0400 Subject: [PATCH 40/77] Add session header to chat widget (#3592) image --- codex-rs/tui/src/app.rs | 2 +- codex-rs/tui/src/chatwidget.rs | 39 +++- codex-rs/tui/src/chatwidget/session_header.rs | 16 ++ ...hatwidget__tests__approval_modal_exec.snap | 1 - ...atwidget__tests__approval_modal_patch.snap | 1 - ...sts__status_widget_and_approval_modal.snap | 1 - codex-rs/tui/src/chatwidget/tests.rs | 10 +- codex-rs/tui/src/history_cell.rs | 220 ++++++++++++++---- 8 files changed, 227 insertions(+), 63 deletions(-) create mode 100644 codex-rs/tui/src/chatwidget/session_header.rs diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index 728659918f..7abf5eede4 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -295,7 +295,7 @@ impl App { self.on_update_reasoning_effort(effort); } AppEvent::UpdateModel(model) => { - self.chat_widget.set_model(model.clone()); + self.chat_widget.set_model(&model); self.config.model = model.clone(); if let Some(family) = find_family_for_model(&model) { self.config.model_family = family; diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index e8f3017ce2..e39dc8d6d1 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -74,6 +74,8 @@ use self::interrupts::InterruptManager; mod agent; use self::agent::spawn_agent; use self::agent::spawn_agent_from_existing; +mod session_header; +use self::session_header::SessionHeader; use crate::streaming::controller::AppEventHistorySink; use crate::streaming::controller::StreamController; use codex_common::approval_presets::ApprovalPreset; @@ -109,6 +111,7 @@ pub(crate) struct ChatWidget { bottom_pane: BottomPane, active_exec_cell: Option, config: Config, + session_header: SessionHeader, initial_user_message: Option, token_info: Option, // Stream lifecycle controller @@ -165,9 +168,11 @@ impl ChatWidget { .set_history_metadata(event.history_log_id, event.history_entry_count); self.conversation_id = Some(event.session_id); let initial_messages = event.initial_messages.clone(); + let model_for_header = event.model.clone(); if let Some(messages) = initial_messages { self.replay_initial_messages(messages); } + self.session_header.set_model(&model_for_header); self.add_to_history(history_cell::new_session_info( &self.config, event, @@ -609,14 +614,23 @@ impl ChatWidget { )); } - fn layout_areas(&self, area: Rect) -> [Rect; 2] { + fn layout_areas(&self, area: Rect) -> [Rect; 3] { + let bottom_min = self.bottom_pane.desired_height(area.width).min(area.height); + let remaining = area.height.saturating_sub(bottom_min); + + let active_desired = self + .active_exec_cell + .as_ref() + .map_or(0, |c| c.desired_height(area.width) + 1); + let active_height = active_desired.min(remaining); + // Note: no header area; remaining is not used beyond computing active height. + + let header_height = 0u16; + Layout::vertical([ - Constraint::Max( - self.active_exec_cell - .as_ref() - .map_or(0, |c| c.desired_height(area.width) + 1), - ), - Constraint::Min(self.bottom_pane.desired_height(area.width)), + Constraint::Length(header_height), + Constraint::Length(active_height), + Constraint::Min(bottom_min), ]) .areas(area) } @@ -651,6 +665,7 @@ impl ChatWidget { }), active_exec_cell: None, config: config.clone(), + session_header: SessionHeader::new(config.model.clone()), initial_user_message: create_initial_user_message( initial_prompt.unwrap_or_default(), initial_images, @@ -703,6 +718,7 @@ impl ChatWidget { }), active_exec_cell: None, config: config.clone(), + session_header: SessionHeader::new(config.model.clone()), initial_user_message: create_initial_user_message( initial_prompt.unwrap_or_default(), initial_images, @@ -1282,8 +1298,9 @@ impl ChatWidget { } /// Set the model in the widget's config copy. - pub(crate) fn set_model(&mut self, model: String) { - self.config.model = model; + pub(crate) fn set_model(&mut self, model: &str) { + self.session_header.set_model(model); + self.config.model = model.to_string(); } pub(crate) fn add_info_message(&mut self, message: String, hint: Option) { @@ -1404,14 +1421,14 @@ impl ChatWidget { } pub fn cursor_pos(&self, area: Rect) -> Option<(u16, u16)> { - let [_, bottom_pane_area] = self.layout_areas(area); + let [_, _, bottom_pane_area] = self.layout_areas(area); self.bottom_pane.cursor_pos(bottom_pane_area) } } impl WidgetRef for &ChatWidget { fn render_ref(&self, area: Rect, buf: &mut Buffer) { - let [active_cell_area, bottom_pane_area] = self.layout_areas(area); + let [_, active_cell_area, bottom_pane_area] = self.layout_areas(area); (&self.bottom_pane).render(bottom_pane_area, buf); if !active_cell_area.is_empty() && let Some(cell) = &self.active_exec_cell diff --git a/codex-rs/tui/src/chatwidget/session_header.rs b/codex-rs/tui/src/chatwidget/session_header.rs new file mode 100644 index 0000000000..32e31b6682 --- /dev/null +++ b/codex-rs/tui/src/chatwidget/session_header.rs @@ -0,0 +1,16 @@ +pub(crate) struct SessionHeader { + model: String, +} + +impl SessionHeader { + pub(crate) fn new(model: String) -> Self { + Self { model } + } + + /// Updates the header's model text. + pub(crate) fn set_model(&mut self, model: &str) { + if self.model != model { + self.model = model.to_string(); + } + } +} diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approval_modal_exec.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approval_modal_exec.snap index f306381f4a..6087853902 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approval_modal_exec.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approval_modal_exec.snap @@ -1,6 +1,5 @@ --- source: tui/src/chatwidget/tests.rs -assertion_line: 728 expression: terminal.backend() --- " " diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approval_modal_patch.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approval_modal_patch.snap index 0b9b10f309..183a295063 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approval_modal_patch.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__approval_modal_patch.snap @@ -1,6 +1,5 @@ --- source: tui/src/chatwidget/tests.rs -assertion_line: 794 expression: terminal.backend() --- " " diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_and_approval_modal.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_and_approval_modal.snap index 63fb213e1b..6087853902 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_and_approval_modal.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_widget_and_approval_modal.snap @@ -1,6 +1,5 @@ --- source: tui/src/chatwidget/tests.rs -assertion_line: 921 expression: terminal.backend() --- " " diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index 2cb0685ffc..9d49c9edb5 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -79,7 +79,9 @@ fn final_answer_without_newline_is_flushed_immediately() { // Set up a VT100 test terminal to capture ANSI visual output let width: u16 = 80; - let height: u16 = 2000; + // Increased height to keep the initial banner/help lines in view even if + // the session renders an extra header line or minor layout changes occur. + let height: u16 = 2500; let viewport = Rect::new(0, height - 1, width, 1); let backend = ratatui::backend::TestBackend::new(width, height); let mut terminal = crate::custom_terminal::Terminal::with_options(backend) @@ -230,6 +232,7 @@ fn make_chatwidget_manual() -> ( bottom_pane: bottom, active_exec_cell: None, config: cfg.clone(), + session_header: SessionHeader::new(cfg.model.clone()), initial_user_message: None, token_info: None, stream: StreamController::new(cfg), @@ -773,10 +776,11 @@ async fn binary_size_transcript_snapshot() { // Consider content only after the last session banner marker. Skip the transient // 'thinking' header if present, and start from the first non-empty content line // that follows. This keeps the snapshot stable across sessions. - const MARKER_PREFIX: &str = ">_ You are using OpenAI Codex in "; + const MARKER_PREFIX: &str = + "Describe a task to get started or try one of the following commands:"; let last_marker_line_idx = lines .iter() - .rposition(|l| l.starts_with(MARKER_PREFIX)) + .rposition(|l| l.trim_start().starts_with(MARKER_PREFIX)) .expect("marker not found in visible output"); // Prefer the first assistant content line (blockquote '>' prefix) after the marker; // fallback to the first non-empty, non-'thinking' line. diff --git a/codex-rs/tui/src/history_cell.rs b/codex-rs/tui/src/history_cell.rs index c4c019dbe0..fee9da952c 100644 --- a/codex-rs/tui/src/history_cell.rs +++ b/codex-rs/tui/src/history_cell.rs @@ -5,7 +5,6 @@ use crate::markdown::append_markdown; use crate::render::line_utils::line_to_static; use crate::render::line_utils::prefix_lines; use crate::render::line_utils::push_owned_lines; -use crate::slash_command::SlashCommand; use crate::text_formatting::format_and_truncate_tool_result; use crate::ui_consts::LIVE_PREFIX_COLS; use crate::wrapping::RtOptions; @@ -581,6 +580,7 @@ impl HistoryCell for CompletedMcpToolCallWithImageOutput { } const TOOL_CALL_MAX_LINES: usize = 5; +const SESSION_HEADER_MAX_INNER_WIDTH: usize = 70; fn title_case(s: &str) -> String { if s.is_empty() { @@ -613,7 +613,7 @@ pub(crate) fn new_session_info( config: &Config, event: SessionConfiguredEvent, is_first_event: bool, -) -> PlainHistoryCell { +) -> CompositeHistoryCell { let SessionConfiguredEvent { model, reasoning_effort: _, @@ -624,58 +624,53 @@ pub(crate) fn new_session_info( rollout_path: _, } = event; if is_first_event { - let cwd_str = match relativize_to_home(&config.cwd) { - Some(rel) if !rel.as_os_str().is_empty() => { - let sep = std::path::MAIN_SEPARATOR; - format!("~{sep}{}", rel.display()) - } - Some(_) => "~".to_string(), - None => config.cwd.display().to_string(), - }; - // Discover AGENTS.md files to decide whether to suggest `/init`. - let has_agents_md = discover_project_doc_paths(config) - .map(|v| !v.is_empty()) - .unwrap_or(false); + // Header box rendered as history (so it appears at the very top) + let header = SessionHeaderHistoryCell::new( + model, + config.cwd.clone(), + crate::version::CODEX_CLI_VERSION, + ); - let mut lines: Vec> = Vec::new(); - lines.push(Line::from(vec![ - ">_ ".dim(), - "You are using OpenAI Codex in".bold(), - format!(" {cwd_str}").dim(), - ])); - lines.push(Line::from("".dim())); - lines.push(Line::from( - " To get started, describe a task or try one of these commands:".dim(), - )); - lines.push(Line::from("".dim())); - if !has_agents_md { - lines.push(Line::from(vec![ - " /init".bold(), - format!(" - {}", SlashCommand::Init.description()).dim(), - ])); + // Help lines below the header (new copy and list) + let help_lines: Vec> = vec![ + "Describe a task to get started or try one of the following commands:" + .dim() + .into(), + Line::from("".dim()), + Line::from(vec![ + "1. ".into(), + "/status".bold(), + " - show current session configuration and token usage".dim(), + ]), + Line::from(vec![ + "2. ".into(), + "/compact".bold(), + " - compact the chat history to avoid context limits".dim(), + ]), + Line::from(vec![ + "3. ".into(), + "/prompts".bold(), + " - explore starter prompts to get to know Codex".dim(), + ]), + ]; + + CompositeHistoryCell { + parts: vec![ + Box::new(header), + Box::new(PlainHistoryCell { lines: help_lines }), + ], } - lines.push(Line::from(vec![ - " /status".bold(), - format!(" - {}", SlashCommand::Status.description()).dim(), - ])); - lines.push(Line::from(vec![ - " /approvals".bold(), - format!(" - {}", SlashCommand::Approvals.description()).dim(), - ])); - lines.push(Line::from(vec![ - " /model".bold(), - format!(" - {}", SlashCommand::Model.description()).dim(), - ])); - PlainHistoryCell { lines } } else if config.model == model { - PlainHistoryCell { lines: Vec::new() } + CompositeHistoryCell { parts: vec![] } } else { let lines = vec![ "model changed:".magenta().bold().into(), format!("requested: {}", config.model).into(), format!("used: {model}").into(), ]; - PlainHistoryCell { lines } + CompositeHistoryCell { + parts: vec![Box::new(PlainHistoryCell { lines })], + } } } @@ -702,6 +697,141 @@ pub(crate) fn new_active_exec_command( }) } +#[derive(Debug)] +struct SessionHeaderHistoryCell { + version: &'static str, + model: String, + directory: PathBuf, +} + +impl SessionHeaderHistoryCell { + fn new(model: String, directory: PathBuf, version: &'static str) -> Self { + Self { + version, + model, + directory, + } + } + + fn format_directory(&self) -> String { + if let Some(rel) = relativize_to_home(&self.directory) { + if rel.as_os_str().is_empty() { + "~".to_string() + } else { + format!("~{}{}", std::path::MAIN_SEPARATOR, rel.display()) + } + } else { + self.directory.display().to_string() + } + } +} + +impl HistoryCell for SessionHeaderHistoryCell { + fn display_lines(&self, width: u16) -> Vec> { + let mut out: Vec> = Vec::new(); + if width < 4 { + return out; + } + + let inner_width = std::cmp::min( + width.saturating_sub(2) as usize, + SESSION_HEADER_MAX_INNER_WIDTH, + ); + // Top border without a title on the border + let mut top = String::with_capacity(inner_width + 2); + top.push('╭'); + top.push_str(&"─".repeat(inner_width)); + top.push('╮'); + out.push(Line::from(top)); + + // Title line rendered inside the box: " >_ OpenAI Codex (vX)" + let title_text = format!(" >_ OpenAI Codex (v{})", self.version); + let title_w = UnicodeWidthStr::width(title_text.as_str()); + let pad_w = inner_width.saturating_sub(title_w); + let mut title_spans: Vec> = vec![ + "│".into(), + " ".into(), + ">_ ".into(), + "OpenAI Codex".bold(), + " ".into(), + format!("(v{})", self.version).dim(), + ]; + if pad_w > 0 { + title_spans.push(" ".repeat(pad_w).into()); + } + title_spans.push("│".into()); + out.push(Line::from(title_spans)); + + // Spacer row between title and details + out.push(Line::from(vec![ + "│".into(), + " ".repeat(inner_width).into(), + "│".into(), + ])); + + // Model line: " Model: (change with /model)" + const CHANGE_MODEL_HINT: &str = "(change with /model)"; + let model_text = format!(" Model: {} {}", self.model, CHANGE_MODEL_HINT); + let model_w = UnicodeWidthStr::width(model_text.as_str()); + let pad_w = inner_width.saturating_sub(model_w); + let mut spans: Vec> = vec![ + "│".into(), + " ".into(), + "Model: ".bold(), + self.model.clone().into(), + " ".into(), + CHANGE_MODEL_HINT.dim(), + ]; + if pad_w > 0 { + spans.push(" ".repeat(pad_w).into()); + } + spans.push("│".into()); + out.push(Line::from(spans)); + + // Directory line: " Directory: " + let dir = self.format_directory(); + let dir_text = format!(" Directory: {dir}"); + let dir_w = UnicodeWidthStr::width(dir_text.as_str()); + let pad_w = inner_width.saturating_sub(dir_w); + let mut spans: Vec> = + vec!["│".into(), " ".into(), "Directory: ".bold(), dir.into()]; + if pad_w > 0 { + spans.push(" ".repeat(pad_w).into()); + } + spans.push("│".into()); + out.push(Line::from(spans)); + + // Bottom border + let bottom = format!("╰{}╯", "─".repeat(inner_width)); + out.push(Line::from(bottom)); + + out + } +} + +#[derive(Debug)] +pub(crate) struct CompositeHistoryCell { + parts: Vec>, +} + +impl HistoryCell for CompositeHistoryCell { + fn display_lines(&self, width: u16) -> Vec> { + let mut out: Vec> = Vec::new(); + let mut first = true; + for part in &self.parts { + let mut lines = part.display_lines(width); + if !lines.is_empty() { + if !first { + out.push(Line::from("")); + } + out.append(&mut lines); + first = false; + } + } + out + } +} + fn spinner(start_time: Option) -> Span<'static> { const FRAMES: &[char] = &['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']; let idx = start_time From 4dffa496ac2c742e77227deed8a254c4e66d0693 Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Sun, 14 Sep 2025 18:00:23 -0700 Subject: [PATCH 41/77] Skip frames files in codespell (#3606) Fixes CI --- .github/workflows/codespell.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml index ce03a430fc..ebf55649b8 100644 --- a/.github/workflows/codespell.yml +++ b/.github/workflows/codespell.yml @@ -25,3 +25,4 @@ jobs: uses: codespell-project/actions-codespell@406322ec52dd7b488e48c1c4b82e2a8b3a1bf630 # v2 with: ignore_words_file: .codespellignore + skip: frame*.txt From 5185d69f134505797a497b01e3dbeb07c16a04cf Mon Sep 17 00:00:00 2001 From: Fouad Matin <169186268+fouad-openai@users.noreply.github.com> Date: Sun, 14 Sep 2025 18:04:05 -0700 Subject: [PATCH 42/77] fix(core): flaky test `completed_commands_do_not_persist_sessions` (#3596) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix flaky test: ``` FAIL [ 2.641s] codex-core unified_exec::tests::completed_commands_do_not_persist_sessions stdout ─── running 1 test test unified_exec::tests::completed_commands_do_not_persist_sessions ... FAILED failures: failures: unified_exec::tests::completed_commands_do_not_persist_sessions test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 235 filtered out; finished in 2.63s stderr ─── thread 'unified_exec::tests::completed_commands_do_not_persist_sessions' panicked at core/src/unified_exec/mod.rs:582:9: assertion failed: result.output.contains("codex") ``` --- .../src/exec_command/exec_command_session.rs | 20 ++++++++++++++++++- .../core/src/exec_command/session_manager.rs | 2 ++ codex-rs/core/src/unified_exec/mod.rs | 8 ++++++-- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/codex-rs/core/src/exec_command/exec_command_session.rs b/codex-rs/core/src/exec_command/exec_command_session.rs index b524506eaf..3bf647ef45 100644 --- a/codex-rs/core/src/exec_command/exec_command_session.rs +++ b/codex-rs/core/src/exec_command/exec_command_session.rs @@ -11,6 +11,9 @@ pub(crate) struct ExecCommandSession { /// Broadcast stream of output chunks read from the PTY. New subscribers /// receive only chunks emitted after they subscribe. output_tx: broadcast::Sender>, + /// Receiver subscribed before the child process starts emitting output so + /// the first caller can consume any early data without races. + initial_output_rx: StdMutex>>>, /// Child killer handle for termination on drop (can signal independently /// of a thread blocked in `.wait()`). @@ -42,6 +45,7 @@ impl ExecCommandSession { Self { writer_tx, output_tx, + initial_output_rx: StdMutex::new(None), killer: StdMutex::new(Some(killer)), reader_handle: StdMutex::new(Some(reader_handle)), writer_handle: StdMutex::new(Some(writer_handle)), @@ -50,12 +54,26 @@ impl ExecCommandSession { } } + pub(crate) fn set_initial_output_receiver(&self, receiver: broadcast::Receiver>) { + if let Ok(mut guard) = self.initial_output_rx.lock() + && guard.is_none() + { + *guard = Some(receiver); + } + } + pub(crate) fn writer_sender(&self) -> mpsc::Sender> { self.writer_tx.clone() } pub(crate) fn output_receiver(&self) -> broadcast::Receiver> { - self.output_tx.subscribe() + if let Ok(mut guard) = self.initial_output_rx.lock() + && let Some(receiver) = guard.take() + { + receiver + } else { + self.output_tx.subscribe() + } } pub(crate) fn has_exited(&self) -> bool { diff --git a/codex-rs/core/src/exec_command/session_manager.rs b/codex-rs/core/src/exec_command/session_manager.rs index 9578610cc7..26fb3f3ecb 100644 --- a/codex-rs/core/src/exec_command/session_manager.rs +++ b/codex-rs/core/src/exec_command/session_manager.rs @@ -279,6 +279,7 @@ async fn create_exec_command_session( let (writer_tx, mut writer_rx) = mpsc::channel::>(128); // Broadcast for streaming PTY output to readers: subscribers receive from subscription time. let (output_tx, _) = tokio::sync::broadcast::channel::>(256); + let initial_output_rx = output_tx.subscribe(); // Reader task: drain PTY and forward chunks to output channel. let mut reader = pair.master.try_clone_reader()?; @@ -350,6 +351,7 @@ async fn create_exec_command_session( wait_handle, exit_status, ); + session.set_initial_output_receiver(initial_output_rx); Ok((session, exit_rx)) } diff --git a/codex-rs/core/src/unified_exec/mod.rs b/codex-rs/core/src/unified_exec/mod.rs index 5d8efbe0bb..c6980c53e2 100644 --- a/codex-rs/core/src/unified_exec/mod.rs +++ b/codex-rs/core/src/unified_exec/mod.rs @@ -327,6 +327,7 @@ async fn create_unified_exec_session( let (writer_tx, mut writer_rx) = mpsc::channel::>(128); let (output_tx, _) = tokio::sync::broadcast::channel::>(256); + let initial_output_rx = output_tx.subscribe(); let mut reader = pair .master @@ -380,7 +381,7 @@ async fn create_unified_exec_session( wait_exit_status.store(true, Ordering::SeqCst); }); - Ok(ExecCommandSession::new( + let session = ExecCommandSession::new( writer_tx, output_tx, killer, @@ -388,7 +389,10 @@ async fn create_unified_exec_session( writer_handle, wait_handle, exit_status, - )) + ); + session.set_initial_output_receiver(initial_output_rx); + + Ok(session) } #[cfg(test)] From 18239062159256d162a212e88059647f06f34802 Mon Sep 17 00:00:00 2001 From: Fouad Matin <169186268+fouad-openai@users.noreply.github.com> Date: Sun, 14 Sep 2025 18:14:11 -0700 Subject: [PATCH 43/77] fix(tui): update full-auto to default preset (#3608) Update `--full-auto` to use default preset --- codex-rs/tui/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 83c37b75fa..7f97b3333f 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -87,7 +87,7 @@ pub async fn run_main( let (sandbox_mode, approval_policy) = if cli.full_auto { ( Some(SandboxMode::WorkspaceWrite), - Some(AskForApproval::OnFailure), + Some(AskForApproval::OnRequest), ) } else if cli.dangerously_bypass_approvals_and_sandbox { ( From b6673838e88d7339b091ebe1c6891813396bb038 Mon Sep 17 00:00:00 2001 From: Dylan Date: Sun, 14 Sep 2025 20:20:37 -0500 Subject: [PATCH 44/77] fix: model family and apply_patch consistency (#3603) ## Summary Resolves a merge conflict between #3597 and #3560, and adds tests to double check our apply_patch configuration. ## Testing - [x] Added unit tests --------- Co-authored-by: dedrisian-oai --- codex-rs/core/src/client_common.rs | 64 +++++++++++++++++++++++++----- codex-rs/core/src/model_family.rs | 35 ++++------------ 2 files changed, 62 insertions(+), 37 deletions(-) diff --git a/codex-rs/core/src/client_common.rs b/codex-rs/core/src/client_common.rs index dda69a7ef8..0d63416580 100644 --- a/codex-rs/core/src/client_common.rs +++ b/codex-rs/core/src/client_common.rs @@ -41,8 +41,9 @@ impl Prompt { .unwrap_or(model.base_instructions.deref()); let mut sections: Vec<&str> = vec![base]; - // When there are no custom instructions, add apply_patch_tool_instructions if either: - // - the model needs special instructions (4.1), or + // When there are no custom instructions, add apply_patch_tool_instructions if: + // - the model needs special instructions (4.1) + // AND // - there is no apply_patch tool present let is_apply_patch_tool_present = self.tools.iter().any(|tool| match tool { OpenAiTool::Function(f) => f.name == "apply_patch", @@ -50,7 +51,8 @@ impl Prompt { _ => false, }); if self.base_instructions_override.is_none() - && (model.needs_special_apply_patch_instructions || !is_apply_patch_tool_present) + && model.needs_special_apply_patch_instructions + && !is_apply_patch_tool_present { sections.push(APPLY_PATCH_TOOL_INSTRUCTIONS); } @@ -174,22 +176,64 @@ impl Stream for ResponseStream { #[cfg(test)] mod tests { use crate::model_family::find_family_for_model; + use pretty_assertions::assert_eq; use super::*; + struct InstructionsTestCase { + pub slug: &'static str, + pub expects_apply_patch_instructions: bool, + } #[test] fn get_full_instructions_no_user_content() { let prompt = Prompt { ..Default::default() }; - let model_family = find_family_for_model("gpt-4.1").expect("known model slug"); + let test_cases = vec![ + InstructionsTestCase { + slug: "gpt-3.5", + expects_apply_patch_instructions: true, + }, + InstructionsTestCase { + slug: "gpt-4.1", + expects_apply_patch_instructions: true, + }, + InstructionsTestCase { + slug: "gpt-4o", + expects_apply_patch_instructions: true, + }, + InstructionsTestCase { + slug: "gpt-5", + expects_apply_patch_instructions: true, + }, + InstructionsTestCase { + slug: "codex-mini-latest", + expects_apply_patch_instructions: true, + }, + InstructionsTestCase { + slug: "gpt-oss:120b", + expects_apply_patch_instructions: false, + }, + InstructionsTestCase { + slug: "swiftfox", + expects_apply_patch_instructions: false, + }, + ]; + for test_case in test_cases { + let model_family = find_family_for_model(test_case.slug).expect("known model slug"); + let expected = if test_case.expects_apply_patch_instructions { + format!( + "{}\n{}", + model_family.clone().base_instructions, + APPLY_PATCH_TOOL_INSTRUCTIONS + ) + } else { + model_family.clone().base_instructions + }; - let expected = format!( - "{}\n{}", - model_family.base_instructions, APPLY_PATCH_TOOL_INSTRUCTIONS - ); - let full = prompt.get_full_instructions(&model_family); - assert_eq!(full, expected); + let full = prompt.get_full_instructions(&model_family); + assert_eq!(full, expected); + } } #[test] diff --git a/codex-rs/core/src/model_family.rs b/codex-rs/core/src/model_family.rs index 93ab947eac..d3a5d00521 100644 --- a/codex-rs/core/src/model_family.rs +++ b/codex-rs/core/src/model_family.rs @@ -66,23 +66,6 @@ macro_rules! model_family { }}; } -macro_rules! simple_model_family { - ( - $slug:expr, $family:expr - ) => {{ - Some(ModelFamily { - slug: $slug.to_string(), - family: $family.to_string(), - needs_special_apply_patch_instructions: false, - supports_reasoning_summaries: false, - reasoning_summary_format: ReasoningSummaryFormat::None, - uses_local_shell_tool: false, - apply_patch_tool_type: None, - base_instructions: BASE_INSTRUCTIONS.to_string(), - }) - }}; -} - /// Returns a `ModelFamily` for the given model slug, or `None` if the slug /// does not match any known model family. pub fn find_family_for_model(slug: &str) -> Option { @@ -90,17 +73,20 @@ pub fn find_family_for_model(slug: &str) -> Option { model_family!( slug, "o3", supports_reasoning_summaries: true, + needs_special_apply_patch_instructions: true, ) } else if slug.starts_with("o4-mini") { model_family!( slug, "o4-mini", supports_reasoning_summaries: true, + needs_special_apply_patch_instructions: true, ) } else if slug.starts_with("codex-mini-latest") { model_family!( slug, "codex-mini-latest", supports_reasoning_summaries: true, uses_local_shell_tool: true, + needs_special_apply_patch_instructions: true, ) } else if slug.starts_with("gpt-4.1") { model_family!( @@ -110,26 +96,21 @@ pub fn find_family_for_model(slug: &str) -> Option { } else if slug.starts_with("gpt-oss") || slug.starts_with("openai/gpt-oss") { model_family!(slug, "gpt-oss", apply_patch_tool_type: Some(ApplyPatchToolType::Function)) } else if slug.starts_with("gpt-4o") { - simple_model_family!(slug, "gpt-4o") + model_family!(slug, "gpt-4o", needs_special_apply_patch_instructions: true) } else if slug.starts_with("gpt-3.5") { - simple_model_family!(slug, "gpt-3.5") - } else if slug.starts_with("codex-") { + model_family!(slug, "gpt-3.5", needs_special_apply_patch_instructions: true) + } else if slug.starts_with("codex-") || slug.starts_with("swiftfox") { model_family!( slug, slug, supports_reasoning_summaries: true, reasoning_summary_format: ReasoningSummaryFormat::Experimental, + base_instructions: SWIFTFOX_INSTRUCTIONS.to_string(), ) } else if slug.starts_with("gpt-5") { model_family!( slug, "gpt-5", supports_reasoning_summaries: true, - ) - } else if slug.starts_with("swiftfox") { - model_family!( - slug, "swiftfox", - supports_reasoning_summaries: true, - reasoning_summary_format: ReasoningSummaryFormat::Experimental, - base_instructions: SWIFTFOX_INSTRUCTIONS.to_string(), + needs_special_apply_patch_instructions: true, ) } else { None From e5dd7f093422697638346f71967f1ef275f0bf45 Mon Sep 17 00:00:00 2001 From: Eric Traut Date: Sun, 14 Sep 2025 18:27:02 -0700 Subject: [PATCH 45/77] Fix get_auth_status response when using custom provider (#3581) This PR addresses an edge-case bug that appears in the VS Code extension in the following situation: 1. Log in using ChatGPT (using either the CLI or extension). This will create an `auth.json` file. 2. Manually modify `config.toml` to specify a custom provider. 3. Start a fresh copy of the VS Code extension. The profile menu in the VS Code extension will indicate that you are logged in using ChatGPT even though you're not. This is caused by the `get_auth_status` method returning an `auth_method: 'chatgpt'` when a custom provider is configured and it doesn't use OpenAI auth (i.e. `requires_openai_auth` is false). The method should always return `auth_method: None` if `requires_openai_auth` is false. The same bug also causes the NUX (new user experience) screen to be displayed in the VSCE in this situation. --- .../mcp-server/src/codex_message_processor.rs | 55 ++++++++------- codex-rs/mcp-server/tests/suite/auth.rs | 69 +++++++++++++++++-- 2 files changed, 97 insertions(+), 27 deletions(-) diff --git a/codex-rs/mcp-server/src/codex_message_processor.rs b/codex-rs/mcp-server/src/codex_message_processor.rs index 3fc4eec090..ceb47889be 100644 --- a/codex-rs/mcp-server/src/codex_message_processor.rs +++ b/codex-rs/mcp-server/src/codex_message_processor.rs @@ -423,32 +423,41 @@ impl CodexMessageProcessor { // Determine whether auth is required based on the active model provider. // If a custom provider is configured with `requires_openai_auth == false`, // then no auth step is required; otherwise, default to requiring auth. - let requires_openai_auth = Some(self.config.model_provider.requires_openai_auth); + let requires_openai_auth = self.config.model_provider.requires_openai_auth; - let response = match self.auth_manager.auth() { - Some(auth) => { - let (reported_auth_method, token_opt) = match auth.get_token().await { - Ok(token) if !token.is_empty() => { - let tok = if include_token { Some(token) } else { None }; - (Some(auth.mode), tok) - } - Ok(_) => (None, None), - Err(err) => { - tracing::warn!("failed to get token for auth status: {err}"); - (None, None) - } - }; - codex_protocol::mcp_protocol::GetAuthStatusResponse { - auth_method: reported_auth_method, - auth_token: token_opt, - requires_openai_auth, - } - } - None => codex_protocol::mcp_protocol::GetAuthStatusResponse { + let response = if !requires_openai_auth { + codex_protocol::mcp_protocol::GetAuthStatusResponse { auth_method: None, auth_token: None, - requires_openai_auth, - }, + requires_openai_auth: Some(false), + } + } else { + match self.auth_manager.auth() { + Some(auth) => { + let auth_mode = auth.mode; + let (reported_auth_method, token_opt) = match auth.get_token().await { + Ok(token) if !token.is_empty() => { + let tok = if include_token { Some(token) } else { None }; + (Some(auth_mode), tok) + } + Ok(_) => (None, None), + Err(err) => { + tracing::warn!("failed to get token for auth status: {err}"); + (None, None) + } + }; + codex_protocol::mcp_protocol::GetAuthStatusResponse { + auth_method: reported_auth_method, + auth_token: token_opt, + requires_openai_auth: Some(true), + } + } + None => codex_protocol::mcp_protocol::GetAuthStatusResponse { + auth_method: None, + auth_token: None, + requires_openai_auth: Some(true), + }, + } }; self.outgoing.send_response(request_id, response).await; diff --git a/codex-rs/mcp-server/tests/suite/auth.rs b/codex-rs/mcp-server/tests/suite/auth.rs index a3ccd33946..6681fd7546 100644 --- a/codex-rs/mcp-server/tests/suite/auth.rs +++ b/codex-rs/mcp-server/tests/suite/auth.rs @@ -15,11 +15,17 @@ use tokio::time::timeout; const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(10); -// Helper to create a config.toml; mirrors create_conversation.rs -fn create_config_toml(codex_home: &Path) -> std::io::Result<()> { +fn create_config_toml_custom_provider( + codex_home: &Path, + requires_openai_auth: bool, +) -> std::io::Result<()> { let config_toml = codex_home.join("config.toml"); - std::fs::write( - config_toml, + let requires_line = if requires_openai_auth { + "requires_openai_auth = true\n" + } else { + "" + }; + let contents = format!( r#" model = "mock-model" approval_policy = "never" @@ -33,6 +39,20 @@ base_url = "http://127.0.0.1:0/v1" wire_api = "chat" request_max_retries = 0 stream_max_retries = 0 +{requires_line} +"# + ); + std::fs::write(config_toml, contents) +} + +fn create_config_toml(codex_home: &Path) -> std::io::Result<()> { + let config_toml = codex_home.join("config.toml"); + std::fs::write( + config_toml, + r#" +model = "mock-model" +approval_policy = "never" +sandbox_mode = "danger-full-access" "#, ) } @@ -124,6 +144,47 @@ async fn get_auth_status_with_api_key() { assert_eq!(status.auth_token, Some("sk-test-key".to_string())); } +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn get_auth_status_with_api_key_when_auth_not_required() { + let codex_home = TempDir::new().unwrap_or_else(|e| panic!("create tempdir: {e}")); + create_config_toml_custom_provider(codex_home.path(), false) + .unwrap_or_else(|err| panic!("write config.toml: {err}")); + + let mut mcp = McpProcess::new(codex_home.path()) + .await + .expect("spawn mcp process"); + timeout(DEFAULT_READ_TIMEOUT, mcp.initialize()) + .await + .expect("init timeout") + .expect("init failed"); + + login_with_api_key_via_request(&mut mcp, "sk-test-key").await; + + let request_id = mcp + .send_get_auth_status_request(GetAuthStatusParams { + include_token: Some(true), + refresh_token: Some(false), + }) + .await + .expect("send getAuthStatus"); + + let resp: JSONRPCResponse = timeout( + DEFAULT_READ_TIMEOUT, + mcp.read_stream_until_response_message(RequestId::Integer(request_id)), + ) + .await + .expect("getAuthStatus timeout") + .expect("getAuthStatus response"); + let status: GetAuthStatusResponse = to_response(resp).expect("deserialize status"); + assert_eq!(status.auth_method, None, "expected no auth method"); + assert_eq!(status.auth_token, None, "expected no token"); + assert_eq!( + status.requires_openai_auth, + Some(false), + "requires_openai_auth should be false", + ); +} + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn get_auth_status_with_api_key_no_include_token() { let codex_home = TempDir::new().unwrap_or_else(|e| panic!("create tempdir: {e}")); From 2ad6a37192315ca008eec53dbf9dcb20e070976c Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Sun, 14 Sep 2025 21:32:18 -0400 Subject: [PATCH 46/77] Don't show the model for apikey (#3607) --- codex-rs/common/src/model_presets.rs | 120 ++++++++++++++------------- codex-rs/tui/src/app.rs | 9 ++ codex-rs/tui/src/app_backtrack.rs | 1 + codex-rs/tui/src/chatwidget.rs | 10 ++- codex-rs/tui/src/chatwidget/tests.rs | 5 ++ 5 files changed, 87 insertions(+), 58 deletions(-) diff --git a/codex-rs/common/src/model_presets.rs b/codex-rs/common/src/model_presets.rs index 2e04d81b2e..09d9277784 100644 --- a/codex-rs/common/src/model_presets.rs +++ b/codex-rs/common/src/model_presets.rs @@ -1,4 +1,6 @@ +use codex_core::config::SWIFTFOX_MEDIUM_MODEL; use codex_core::protocol_config_types::ReasoningEffort; +use codex_protocol::mcp_protocol::AuthMode; /// A simple preset pairing a model slug with a reasoning effort. #[derive(Debug, Clone, Copy)] @@ -15,61 +17,65 @@ pub struct ModelPreset { pub effort: Option, } -/// Built-in list of model presets that pair a model with a reasoning effort. -/// -/// Keep this UI-agnostic so it can be reused by both TUI and MCP server. -pub fn builtin_model_presets() -> &'static [ModelPreset] { - // Order groups swiftfox variants before gpt-5 presets, each from minimal to high. - const PRESETS: &[ModelPreset] = &[ - ModelPreset { - id: "swiftfox-low", - label: "swiftfox low", - description: "", - model: "swiftfox", - effort: Some(ReasoningEffort::Low), - }, - ModelPreset { - id: "swiftfox-medium", - label: "swiftfox medium", - description: "", - model: "swiftfox", - effort: None, - }, - ModelPreset { - id: "swiftfox-high", - label: "swiftfox high", - description: "", - model: "swiftfox", - effort: Some(ReasoningEffort::High), - }, - ModelPreset { - id: "gpt-5-minimal", - label: "gpt-5 minimal", - description: "— fastest responses with limited reasoning; ideal for coding, instructions, or lightweight tasks", - model: "gpt-5", - effort: Some(ReasoningEffort::Minimal), - }, - ModelPreset { - id: "gpt-5-low", - label: "gpt-5 low", - description: "— balances speed with some reasoning; useful for straightforward queries and short explanations", - model: "gpt-5", - effort: Some(ReasoningEffort::Low), - }, - ModelPreset { - id: "gpt-5-medium", - label: "gpt-5 medium", - description: "— default setting; provides a solid balance of reasoning depth and latency for general-purpose tasks", - model: "gpt-5", - effort: Some(ReasoningEffort::Medium), - }, - ModelPreset { - id: "gpt-5-high", - label: "gpt-5 high", - description: "— maximizes reasoning depth for complex or ambiguous problems", - model: "gpt-5", - effort: Some(ReasoningEffort::High), - }, - ]; - PRESETS +const PRESETS: &[ModelPreset] = &[ + ModelPreset { + id: "swiftfox-low", + label: "swiftfox low", + description: "", + model: "swiftfox", + effort: Some(ReasoningEffort::Low), + }, + ModelPreset { + id: "swiftfox-medium", + label: "swiftfox medium", + description: "", + model: "swiftfox", + effort: None, + }, + ModelPreset { + id: "swiftfox-high", + label: "swiftfox high", + description: "", + model: "swiftfox", + effort: Some(ReasoningEffort::High), + }, + ModelPreset { + id: "gpt-5-minimal", + label: "gpt-5 minimal", + description: "— fastest responses with limited reasoning; ideal for coding, instructions, or lightweight tasks", + model: "gpt-5", + effort: Some(ReasoningEffort::Minimal), + }, + ModelPreset { + id: "gpt-5-low", + label: "gpt-5 low", + description: "— balances speed with some reasoning; useful for straightforward queries and short explanations", + model: "gpt-5", + effort: Some(ReasoningEffort::Low), + }, + ModelPreset { + id: "gpt-5-medium", + label: "gpt-5 medium", + description: "— default setting; provides a solid balance of reasoning depth and latency for general-purpose tasks", + model: "gpt-5", + effort: Some(ReasoningEffort::Medium), + }, + ModelPreset { + id: "gpt-5-high", + label: "gpt-5 high", + description: "— maximizes reasoning depth for complex or ambiguous problems", + model: "gpt-5", + effort: Some(ReasoningEffort::High), + }, +]; + +pub fn builtin_model_presets(auth_mode: Option) -> Vec { + match auth_mode { + Some(AuthMode::ApiKey) => PRESETS + .iter() + .copied() + .filter(|p| !p.model.contains(SWIFTFOX_MEDIUM_MODEL)) + .collect(), + _ => PRESETS.to_vec(), + } } diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index 7abf5eede4..40e3bd1c49 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -38,6 +38,7 @@ pub(crate) struct App { pub(crate) server: Arc, pub(crate) app_event_tx: AppEventSender, pub(crate) chat_widget: ChatWidget, + pub(crate) auth_manager: Arc, /// Config is stored here so we can recreate ChatWidgets as needed. pub(crate) config: Config, @@ -88,6 +89,7 @@ impl App { initial_prompt: initial_prompt.clone(), initial_images: initial_images.clone(), enhanced_keys_supported, + auth_manager: auth_manager.clone(), }; ChatWidget::new(init, conversation_manager.clone()) } @@ -109,6 +111,7 @@ impl App { initial_prompt: initial_prompt.clone(), initial_images: initial_images.clone(), enhanced_keys_supported, + auth_manager: auth_manager.clone(), }; ChatWidget::new_from_existing( init, @@ -124,6 +127,7 @@ impl App { server: conversation_manager, app_event_tx, chat_widget, + auth_manager: auth_manager.clone(), config, active_profile, file_search, @@ -205,6 +209,7 @@ impl App { initial_prompt: None, initial_images: Vec::new(), enhanced_keys_supported: self.enhanced_keys_supported, + auth_manager: self.auth_manager.clone(), }; self.chat_widget = ChatWidget::new(init, self.server.clone()); tui.frame_requester().schedule_frame(); @@ -418,6 +423,7 @@ mod tests { use crate::app_backtrack::BacktrackState; use crate::chatwidget::tests::make_chatwidget_manual_with_sender; use crate::file_search::FileSearchManager; + use codex_core::AuthManager; use codex_core::CodexAuth; use codex_core::ConversationManager; use std::sync::Arc; @@ -430,12 +436,15 @@ mod tests { let server = Arc::new(ConversationManager::with_auth(CodexAuth::from_api_key( "Test API Key", ))); + let auth_manager = + AuthManager::from_auth_for_testing(CodexAuth::from_api_key("Test API Key")); let file_search = FileSearchManager::new(config.cwd.clone(), app_event_tx.clone()); App { server, app_event_tx, chat_widget, + auth_manager, config, active_profile: None, file_search, diff --git a/codex-rs/tui/src/app_backtrack.rs b/codex-rs/tui/src/app_backtrack.rs index b3ca171ccc..0da2760ff8 100644 --- a/codex-rs/tui/src/app_backtrack.rs +++ b/codex-rs/tui/src/app_backtrack.rs @@ -335,6 +335,7 @@ impl App { initial_prompt: None, initial_images: Vec::new(), enhanced_keys_supported: self.enhanced_keys_supported, + auth_manager: self.auth_manager.clone(), }; self.chat_widget = crate::chatwidget::ChatWidget::new_from_existing(init, conv, session_configured); diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index e39dc8d6d1..21eb35850a 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -82,6 +82,7 @@ use codex_common::approval_presets::ApprovalPreset; use codex_common::approval_presets::builtin_approval_presets; use codex_common::model_presets::ModelPreset; use codex_common::model_presets::builtin_model_presets; +use codex_core::AuthManager; use codex_core::ConversationManager; use codex_core::protocol::AskForApproval; use codex_core::protocol::SandboxPolicy; @@ -103,6 +104,7 @@ pub(crate) struct ChatWidgetInit { pub(crate) initial_prompt: Option, pub(crate) initial_images: Vec, pub(crate) enhanced_keys_supported: bool, + pub(crate) auth_manager: Arc, } pub(crate) struct ChatWidget { @@ -111,6 +113,7 @@ pub(crate) struct ChatWidget { bottom_pane: BottomPane, active_exec_cell: Option, config: Config, + auth_manager: Arc, session_header: SessionHeader, initial_user_message: Option, token_info: Option, @@ -646,6 +649,7 @@ impl ChatWidget { initial_prompt, initial_images, enhanced_keys_supported, + auth_manager, } = common; let mut rng = rand::rng(); let placeholder = EXAMPLE_PROMPTS[rng.random_range(0..EXAMPLE_PROMPTS.len())].to_string(); @@ -665,6 +669,7 @@ impl ChatWidget { }), active_exec_cell: None, config: config.clone(), + auth_manager, session_header: SessionHeader::new(config.model.clone()), initial_user_message: create_initial_user_message( initial_prompt.unwrap_or_default(), @@ -697,6 +702,7 @@ impl ChatWidget { initial_prompt, initial_images, enhanced_keys_supported, + auth_manager, } = common; let mut rng = rand::rng(); let placeholder = EXAMPLE_PROMPTS[rng.random_range(0..EXAMPLE_PROMPTS.len())].to_string(); @@ -718,6 +724,7 @@ impl ChatWidget { }), active_exec_cell: None, config: config.clone(), + auth_manager, session_header: SessionHeader::new(config.model.clone()), initial_user_message: create_initial_user_message( initial_prompt.unwrap_or_default(), @@ -1188,7 +1195,8 @@ impl ChatWidget { pub(crate) fn open_model_popup(&mut self) { let current_model = self.config.model.clone(); let current_effort = self.config.model_reasoning_effort; - let presets: &[ModelPreset] = builtin_model_presets(); + let auth_mode = self.auth_manager.auth().map(|auth| auth.mode); + let presets: Vec = builtin_model_presets(auth_mode); let mut items: Vec = Vec::new(); for preset in presets.iter() { diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index 9d49c9edb5..ebd97c81d9 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -1,6 +1,7 @@ use super::*; use crate::app_event::AppEvent; use crate::app_event_sender::AppEventSender; +use codex_core::AuthManager; use codex_core::CodexAuth; use codex_core::config::Config; use codex_core::config::ConfigOverrides; @@ -195,6 +196,7 @@ async fn helpers_are_available_and_do_not_panic() { let conversation_manager = Arc::new(ConversationManager::with_auth(CodexAuth::from_api_key( "test", ))); + let auth_manager = AuthManager::from_auth_for_testing(CodexAuth::from_api_key("test")); let init = ChatWidgetInit { config: cfg, frame_requester: FrameRequester::test_dummy(), @@ -202,6 +204,7 @@ async fn helpers_are_available_and_do_not_panic() { initial_prompt: None, initial_images: Vec::new(), enhanced_keys_supported: false, + auth_manager, }; let mut w = ChatWidget::new(init, conversation_manager); // Basic construction sanity. @@ -226,12 +229,14 @@ fn make_chatwidget_manual() -> ( placeholder_text: "Ask Codex to do anything".to_string(), disable_paste_burst: false, }); + let auth_manager = AuthManager::from_auth_for_testing(CodexAuth::from_api_key("test")); let widget = ChatWidget { app_event_tx, codex_op_tx: op_tx, bottom_pane: bottom, active_exec_cell: None, config: cfg.clone(), + auth_manager, session_header: SessionHeader::new(cfg.model.clone()), initial_user_message: None, token_info: None, From 900bb014860d87651dd1da011d9daf1860bdfeab Mon Sep 17 00:00:00 2001 From: Eric Traut Date: Sun, 14 Sep 2025 19:48:18 -0700 Subject: [PATCH 47/77] When logging in using ChatGPT, make sure to overwrite API key (#3611) When logging in using ChatGPT using the `codex login` command, a successful login should write a new `auth.json` file with the ChatGPT token information. The old code attempted to retain the API key and merge the token information into the existing `auth.json` file. With the new simplified login mechanism, `auth.json` should have auth information for only ChatGPT or API Key, not both. The `codex login --api-key ` code path was already doing the right thing here, but the `codex login` command was incorrect. This PR fixes the problem and adds test cases for both commands. --- codex-rs/core/src/auth.rs | 26 +++++++++++ codex-rs/login/src/server.rs | 44 +++++++------------ .../login/tests/suite/login_server_e2e.rs | 24 ++++++++-- 3 files changed, 61 insertions(+), 33 deletions(-) diff --git a/codex-rs/core/src/auth.rs b/codex-rs/core/src/auth.rs index 09ad13b4f7..a2158310dc 100644 --- a/codex-rs/core/src/auth.rs +++ b/codex-rs/core/src/auth.rs @@ -408,6 +408,32 @@ mod tests { assert_eq!(auth_dot_json, same_auth_dot_json); } + #[test] + fn login_with_api_key_overwrites_existing_auth_json() { + let dir = tempdir().unwrap(); + let auth_path = dir.path().join("auth.json"); + let stale_auth = json!({ + "OPENAI_API_KEY": "sk-old", + "tokens": { + "id_token": "stale.header.payload", + "access_token": "stale-access", + "refresh_token": "stale-refresh", + "account_id": "stale-acc" + } + }); + std::fs::write( + &auth_path, + serde_json::to_string_pretty(&stale_auth).unwrap(), + ) + .unwrap(); + + super::login_with_api_key(dir.path(), "sk-new").expect("login_with_api_key should succeed"); + + let auth = super::try_read_auth_json(&auth_path).expect("auth.json should parse"); + assert_eq!(auth.openai_api_key.as_deref(), Some("sk-new")); + assert!(auth.tokens.is_none(), "tokens should be cleared"); + } + #[tokio::test] async fn pro_account_with_no_api_key_uses_chatgpt_auth() { let codex_home = tempdir().unwrap(); diff --git a/codex-rs/login/src/server.rs b/codex-rs/login/src/server.rs index 2cf1189f4c..26f341b9d9 100644 --- a/codex-rs/login/src/server.rs +++ b/codex-rs/login/src/server.rs @@ -238,8 +238,8 @@ async fn process_request( &opts.codex_home, api_key.clone(), tokens.id_token.clone(), - Some(tokens.access_token.clone()), - Some(tokens.refresh_token.clone()), + tokens.access_token.clone(), + tokens.refresh_token.clone(), ) .await { @@ -446,8 +446,8 @@ async fn persist_tokens_async( codex_home: &Path, api_key: Option, id_token: String, - access_token: Option, - refresh_token: Option, + access_token: String, + refresh_token: String, ) -> io::Result<()> { // Reuse existing synchronous logic but run it off the async runtime. let codex_home = codex_home.to_path_buf(); @@ -459,43 +459,29 @@ async fn persist_tokens_async( std::fs::create_dir_all(parent).map_err(io::Error::other)?; } - let mut auth = read_or_default(&auth_file); - if let Some(key) = api_key { - auth.openai_api_key = Some(key); - } - let tokens = auth.tokens.get_or_insert_with(TokenData::default); - tokens.id_token = parse_id_token(&id_token).map_err(io::Error::other)?; - // Persist chatgpt_account_id if present in claims + let mut tokens = TokenData { + id_token: parse_id_token(&id_token).map_err(io::Error::other)?, + access_token, + refresh_token, + account_id: None, + }; if let Some(acc) = jwt_auth_claims(&id_token) .get("chatgpt_account_id") .and_then(|v| v.as_str()) { tokens.account_id = Some(acc.to_string()); } - if let Some(at) = access_token { - tokens.access_token = at; - } - if let Some(rt) = refresh_token { - tokens.refresh_token = rt; - } - auth.last_refresh = Some(Utc::now()); + let auth = AuthDotJson { + openai_api_key: api_key, + tokens: Some(tokens), + last_refresh: Some(Utc::now()), + }; codex_core::auth::write_auth_json(&auth_file, &auth) }) .await .map_err(|e| io::Error::other(format!("persist task failed: {e}")))? } -fn read_or_default(path: &Path) -> AuthDotJson { - match codex_core::auth::try_read_auth_json(path) { - Ok(auth) => auth, - Err(_) => AuthDotJson { - openai_api_key: None, - tokens: None, - last_refresh: None, - }, - } -} - fn compose_success_url(port: u16, issuer: &str, id_token: &str, access_token: &str) -> String { let token_claims = jwt_auth_claims(id_token); let access_claims = jwt_auth_claims(access_token); diff --git a/codex-rs/login/tests/suite/login_server_e2e.rs b/codex-rs/login/tests/suite/login_server_e2e.rs index 9309ef4123..dd2cb9048d 100644 --- a/codex-rs/login/tests/suite/login_server_e2e.rs +++ b/codex-rs/login/tests/suite/login_server_e2e.rs @@ -90,6 +90,22 @@ async fn end_to_end_login_flow_persists_auth_json() { let tmp = tempdir().unwrap(); let codex_home = tmp.path().to_path_buf(); + // Seed auth.json with stale API key + tokens that should be overwritten. + let stale_auth = serde_json::json!({ + "OPENAI_API_KEY": "sk-stale", + "tokens": { + "id_token": "stale.header.payload", + "access_token": "stale-access", + "refresh_token": "stale-refresh", + "account_id": "stale-acc" + } + }); + std::fs::write( + codex_home.join("auth.json"), + serde_json::to_string_pretty(&stale_auth).unwrap(), + ) + .unwrap(); + let state = "test_state_123".to_string(); // Run server in background @@ -122,10 +138,10 @@ async fn end_to_end_login_flow_persists_auth_json() { let auth_path = codex_home.join("auth.json"); let data = std::fs::read_to_string(&auth_path).unwrap(); let json: serde_json::Value = serde_json::from_str(&data).unwrap(); - assert!( - !json["OPENAI_API_KEY"].is_null(), - "OPENAI_API_KEY should be set" - ); + // The following assert is here because of the old oauth flow that exchanges tokens for an + // API key. See obtain_api_key in server.rs for details. Once we remove this old mechanism + // from the code, this test should be updated to expect that the API key is no longer present. + assert_eq!(json["OPENAI_API_KEY"], "access-123"); assert_eq!(json["tokens"]["access_token"], "access-123"); assert_eq!(json["tokens"]["refresh_token"], "refresh-123"); assert_eq!(json["tokens"]["account_id"], "acc-123"); From 6581da9b57715d09d7b2d7583cc132a553d87bec Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Sun, 14 Sep 2025 23:31:08 -0400 Subject: [PATCH 48/77] Show the header when resuming a conversation (#3615) --- codex-rs/tui/src/chatwidget.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 21eb35850a..367a63cf11 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -172,15 +172,15 @@ impl ChatWidget { self.conversation_id = Some(event.session_id); let initial_messages = event.initial_messages.clone(); let model_for_header = event.model.clone(); - if let Some(messages) = initial_messages { - self.replay_initial_messages(messages); - } self.session_header.set_model(&model_for_header); self.add_to_history(history_cell::new_session_info( &self.config, event, self.show_welcome_banner, )); + if let Some(messages) = initial_messages { + self.replay_initial_messages(messages); + } // Ask codex-core to enumerate custom prompts for this session. self.submit_op(Op::ListCustomPrompts); if let Some(user_message) = self.initial_user_message.take() { @@ -739,7 +739,7 @@ impl ChatWidget { full_reasoning_buffer: String::new(), conversation_id: None, queued_user_messages: VecDeque::new(), - show_welcome_banner: false, + show_welcome_banner: true, suppress_session_configured_redraw: true, } } From 26f1246a895b272ae0823144c46cba1f22a4d721 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Sun, 14 Sep 2025 23:39:36 -0400 Subject: [PATCH 49/77] Revert "refactor transcript view to handle HistoryCells" (#3614) Reverts openai/codex#3538 It panics on forking first message. It also calculates the index in a wrong way. --- codex-rs/core/src/conversation_manager.rs | 32 +- .../core/tests/suite/compact_resume_fork.rs | 4 +- .../core/tests/suite/fork_conversation.rs | 14 +- codex-rs/tui/src/app.rs | 21 +- codex-rs/tui/src/app_backtrack.rs | 160 +++++----- codex-rs/tui/src/backtrack_helpers.rs | 153 +++++++++ codex-rs/tui/src/history_cell.rs | 11 +- codex-rs/tui/src/lib.rs | 1 + codex-rs/tui/src/pager_overlay.rs | 302 +++++++----------- ...ts__transcript_overlay_snapshot_basic.snap | 4 +- 10 files changed, 391 insertions(+), 311 deletions(-) create mode 100644 codex-rs/tui/src/backtrack_helpers.rs diff --git a/codex-rs/core/src/conversation_manager.rs b/codex-rs/core/src/conversation_manager.rs index 3ca361a38a..7147eca233 100644 --- a/codex-rs/core/src/conversation_manager.rs +++ b/codex-rs/core/src/conversation_manager.rs @@ -134,19 +134,19 @@ impl ConversationManager { self.conversations.write().await.remove(conversation_id) } - /// Fork an existing conversation by taking messages up to the given position - /// (not including the message at the given position) and starting a new + /// Fork an existing conversation by dropping the last `drop_last_messages` + /// user/assistant messages from its transcript and starting a new /// conversation with identical configuration (unless overridden by the /// caller's `config`). The new conversation will have a fresh id. pub async fn fork_conversation( &self, - nth_user_message: usize, + num_messages_to_drop: usize, config: Config, path: PathBuf, ) -> CodexResult { // Compute the prefix up to the cut point. let history = RolloutRecorder::get_rollout_history(&path).await?; - let history = truncate_after_nth_user_message(history, nth_user_message); + let history = truncate_after_dropping_last_messages(history, num_messages_to_drop); // Spawn a new conversation with the computed initial history. let auth_manager = self.auth_manager.clone(); @@ -159,10 +159,14 @@ impl ConversationManager { } } -/// Return a prefix of `items` obtained by cutting strictly before the nth user message -/// (0-based) and all items that follow it. -fn truncate_after_nth_user_message(history: InitialHistory, n: usize) -> InitialHistory { - // Work directly on rollout items, and cut the vector at the nth user message input. +/// Return a prefix of `items` obtained by dropping the last `n` user messages +/// and all items that follow them. +fn truncate_after_dropping_last_messages(history: InitialHistory, n: usize) -> InitialHistory { + if n == 0 { + return InitialHistory::Forked(history.get_rollout_items()); + } + + // Work directly on rollout items, and cut the vector at the nth-from-last user message input. let items: Vec = history.get_rollout_items(); // Find indices of user message inputs in rollout order. @@ -175,13 +179,13 @@ fn truncate_after_nth_user_message(history: InitialHistory, n: usize) -> Initial } } - // If fewer than or equal to n user messages exist, treat as empty (out of range). - if user_positions.len() <= n { + // If fewer than n user messages exist, treat as empty. + if user_positions.len() < n { return InitialHistory::New; } - // Cut strictly before the nth user message (do not keep the nth itself). - let cut_idx = user_positions[n]; + // Cut strictly before the nth-from-last user message (do not keep the nth itself). + let cut_idx = user_positions[user_positions.len() - n]; let rolled: Vec = items.into_iter().take(cut_idx).collect(); if rolled.is_empty() { @@ -248,7 +252,7 @@ mod tests { .cloned() .map(RolloutItem::ResponseItem) .collect(); - let truncated = truncate_after_nth_user_message(InitialHistory::Forked(initial), 1); + let truncated = truncate_after_dropping_last_messages(InitialHistory::Forked(initial), 1); let got_items = truncated.get_rollout_items(); let expected_items = vec![ RolloutItem::ResponseItem(items[0].clone()), @@ -265,7 +269,7 @@ mod tests { .cloned() .map(RolloutItem::ResponseItem) .collect(); - let truncated2 = truncate_after_nth_user_message(InitialHistory::Forked(initial2), 2); + let truncated2 = truncate_after_dropping_last_messages(InitialHistory::Forked(initial2), 2); assert!(matches!(truncated2, InitialHistory::New)); } } diff --git a/codex-rs/core/tests/suite/compact_resume_fork.rs b/codex-rs/core/tests/suite/compact_resume_fork.rs index dd14ad89b5..34b43ece91 100644 --- a/codex-rs/core/tests/suite/compact_resume_fork.rs +++ b/codex-rs/core/tests/suite/compact_resume_fork.rs @@ -74,7 +74,7 @@ async fn compact_resume_and_fork_preserve_model_history_view() { "compact+resume test expects resumed path {resumed_path:?} to exist", ); - let forked = fork_conversation(&manager, &config, resumed_path, 4).await; + let forked = fork_conversation(&manager, &config, resumed_path, 1).await; user_turn(&forked, "AFTER_FORK").await; // 3. Capture the requests to the model and validate the history slices. @@ -535,7 +535,7 @@ async fn compact_resume_after_second_compaction_preserves_history() { "second compact test expects resumed path {resumed_path:?} to exist", ); - let forked = fork_conversation(&manager, &config, resumed_path, 1).await; + let forked = fork_conversation(&manager, &config, resumed_path, 3).await; user_turn(&forked, "AFTER_FORK").await; compact_conversation(&forked).await; diff --git a/codex-rs/core/tests/suite/fork_conversation.rs b/codex-rs/core/tests/suite/fork_conversation.rs index c9f66ea183..08e3f29d28 100644 --- a/codex-rs/core/tests/suite/fork_conversation.rs +++ b/codex-rs/core/tests/suite/fork_conversation.rs @@ -104,8 +104,7 @@ async fn fork_conversation_twice_drops_to_first_message() { items }; - // Compute expected prefixes after each fork by truncating base rollout - // strictly before the nth user input (0-based). + // Compute expected prefixes after each fork by truncating base rollout at nth-from-last user input. let base_items = read_items(&base_path); let find_user_input_positions = |items: &[RolloutItem]| -> Vec { let mut pos = Vec::new(); @@ -127,8 +126,11 @@ async fn fork_conversation_twice_drops_to_first_message() { }; let user_inputs = find_user_input_positions(&base_items); - // After cutting at nth user input (n=1 → second user message), cut strictly before that input. - let cut1 = user_inputs.get(1).copied().unwrap_or(0); + // After dropping last user input (n=1), cut strictly before that input if present, else empty. + let cut1 = user_inputs + .get(user_inputs.len().saturating_sub(1)) + .copied() + .unwrap_or(0); let expected_after_first: Vec = base_items[..cut1].to_vec(); // After dropping again (n=1 on fork1), compute expected relative to fork1's rollout. @@ -159,12 +161,12 @@ async fn fork_conversation_twice_drops_to_first_message() { serde_json::to_value(&expected_after_first).unwrap() ); - // Fork again with n=0 → drops the (new) last user message, leaving only the first. + // Fork again with n=1 → drops the (new) last user message, leaving only the first. let NewConversation { conversation: codex_fork2, .. } = conversation_manager - .fork_conversation(0, config_for_fork.clone(), fork1_path.clone()) + .fork_conversation(1, config_for_fork.clone(), fork1_path.clone()) .await .expect("fork 2"); diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index 40e3bd1c49..bfa9c0caf2 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -3,7 +3,6 @@ use crate::app_event::AppEvent; use crate::app_event_sender::AppEventSender; use crate::chatwidget::ChatWidget; use crate::file_search::FileSearchManager; -use crate::history_cell::HistoryCell; use crate::pager_overlay::Overlay; use crate::resume_picker::ResumeSelection; use crate::tui; @@ -46,7 +45,7 @@ pub(crate) struct App { pub(crate) file_search: FileSearchManager, - pub(crate) transcript_cells: Vec>, + pub(crate) transcript_lines: Vec>, // Pager overlay state (Transcript or Static like Diff) pub(crate) overlay: Option, @@ -132,7 +131,7 @@ impl App { active_profile, file_search, enhanced_keys_supported, - transcript_cells: Vec::new(), + transcript_lines: Vec::new(), overlay: None, deferred_history_lines: Vec::new(), has_emitted_history_lines: false, @@ -215,12 +214,15 @@ impl App { tui.frame_requester().schedule_frame(); } AppEvent::InsertHistoryCell(cell) => { - let cell: Arc = cell.into(); + let mut cell_transcript = cell.transcript_lines(); + if !cell.is_stream_continuation() && !self.transcript_lines.is_empty() { + cell_transcript.insert(0, Line::from("")); + } if let Some(Overlay::Transcript(t)) = &mut self.overlay { - t.insert_cell(cell.clone()); + t.insert_lines(cell_transcript.clone()); tui.frame_requester().schedule_frame(); } - self.transcript_cells.push(cell.clone()); + self.transcript_lines.extend(cell_transcript.clone()); let mut display = cell.display_lines(tui.terminal.last_known_screen_size.width); if !display.is_empty() { // Only insert a separating blank line for new cells that are not @@ -367,7 +369,7 @@ impl App { } => { // Enter alternate screen and set viewport to full size. let _ = tui.enter_alt_screen(); - self.overlay = Some(Overlay::new_transcript(self.transcript_cells.clone())); + self.overlay = Some(Overlay::new_transcript(self.transcript_lines.clone())); tui.frame_requester().schedule_frame(); } // Esc primes/advances backtracking only in normal (not working) mode @@ -392,7 +394,7 @@ impl App { kind: KeyEventKind::Press, .. } if self.backtrack.primed - && self.backtrack.nth_user_message != usize::MAX + && self.backtrack.count > 0 && self.chat_widget.composer_is_empty() => { // Delegate to helper for clarity; preserves behavior. @@ -426,6 +428,7 @@ mod tests { use codex_core::AuthManager; use codex_core::CodexAuth; use codex_core::ConversationManager; + use ratatui::text::Line; use std::sync::Arc; use std::sync::atomic::AtomicBool; @@ -448,7 +451,7 @@ mod tests { config, active_profile: None, file_search, - transcript_cells: Vec::new(), + transcript_lines: Vec::>::new(), overlay: None, deferred_history_lines: Vec::new(), has_emitted_history_lines: false, diff --git a/codex-rs/tui/src/app_backtrack.rs b/codex-rs/tui/src/app_backtrack.rs index 0da2760ff8..4e716c90ec 100644 --- a/codex-rs/tui/src/app_backtrack.rs +++ b/codex-rs/tui/src/app_backtrack.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use crate::app::App; -use crate::history_cell::UserHistoryCell; +use crate::backtrack_helpers; use crate::pager_overlay::Overlay; use crate::tui; use crate::tui::TuiEvent; @@ -19,11 +19,11 @@ pub(crate) struct BacktrackState { pub(crate) primed: bool, /// Session id of the base conversation to fork from. pub(crate) base_id: Option, - /// Index in the transcript of the last user message. - pub(crate) nth_user_message: usize, + /// Current step count (Nth last user message). + pub(crate) count: usize, /// True when the transcript overlay is showing a backtrack preview. pub(crate) overlay_preview_active: bool, - /// Pending fork request: (base_id, nth_user_message, prefill). + /// Pending fork request: (base_id, drop_count, prefill). pub(crate) pending: Option<(ConversationId, usize, String)>, } @@ -96,9 +96,9 @@ impl App { &mut self, prefill: String, base_id: ConversationId, - nth_user_message: usize, + drop_last_messages: usize, ) { - self.backtrack.pending = Some((base_id, nth_user_message, prefill)); + self.backtrack.pending = Some((base_id, drop_last_messages, prefill)); self.app_event_tx.send(crate::app_event::AppEvent::CodexOp( codex_core::protocol::Op::GetPath, )); @@ -107,7 +107,7 @@ impl App { /// Open transcript overlay (enters alternate screen and shows full transcript). pub(crate) fn open_transcript_overlay(&mut self, tui: &mut tui::Tui) { let _ = tui.enter_alt_screen(); - self.overlay = Some(Overlay::new_transcript(self.transcript_cells.clone())); + self.overlay = Some(Overlay::new_transcript(self.transcript_lines.clone())); tui.frame_requester().schedule_frame(); } @@ -130,17 +130,15 @@ impl App { /// Re-render the full transcript into the terminal scrollback in one call. /// Useful when switching sessions to ensure prior history remains visible. pub(crate) fn render_transcript_once(&mut self, tui: &mut tui::Tui) { - if !self.transcript_cells.is_empty() { - for cell in &self.transcript_cells { - tui.insert_history_lines(cell.transcript_lines()); - } + if !self.transcript_lines.is_empty() { + tui.insert_history_lines(self.transcript_lines.clone()); } } /// Initialize backtrack state and show composer hint. fn prime_backtrack(&mut self) { self.backtrack.primed = true; - self.backtrack.nth_user_message = usize::MAX; + self.backtrack.count = 0; self.backtrack.base_id = self.chat_widget.conversation_id(); self.chat_widget.show_esc_backtrack_hint(); } @@ -159,44 +157,51 @@ impl App { self.backtrack.primed = true; self.backtrack.base_id = self.chat_widget.conversation_id(); self.backtrack.overlay_preview_active = true; - let last_user_cell_position = self - .transcript_cells - .iter() - .filter_map(|c| c.as_any().downcast_ref::()) - .count() as i64 - - 1; - if last_user_cell_position >= 0 { - self.apply_backtrack_selection(last_user_cell_position as usize); - } + let sel = self.compute_backtrack_selection(tui, 1); + self.apply_backtrack_selection(sel); tui.frame_requester().schedule_frame(); } /// Step selection to the next older user message and update overlay. fn step_backtrack_and_highlight(&mut self, tui: &mut tui::Tui) { - let last_user_cell_position = self - .transcript_cells - .iter() - .filter(|c| c.as_any().is::()) - .take(self.backtrack.nth_user_message) - .count() - .saturating_sub(1); - self.apply_backtrack_selection(last_user_cell_position); + let next = self.backtrack.count.saturating_add(1); + let sel = self.compute_backtrack_selection(tui, next); + self.apply_backtrack_selection(sel); tui.frame_requester().schedule_frame(); } + /// Compute normalized target, scroll offset, and highlight for requested step. + fn compute_backtrack_selection( + &self, + tui: &tui::Tui, + requested_n: usize, + ) -> (usize, Option, Option<(usize, usize)>) { + let nth = backtrack_helpers::normalize_backtrack_n(&self.transcript_lines, requested_n); + let header_idx = + backtrack_helpers::find_nth_last_user_header_index(&self.transcript_lines, nth); + let offset = header_idx.map(|idx| { + backtrack_helpers::wrapped_offset_before( + &self.transcript_lines, + idx, + tui.terminal.viewport_area.width, + ) + }); + let hl = backtrack_helpers::highlight_range_for_nth_last_user(&self.transcript_lines, nth); + (nth, offset, hl) + } + /// Apply a computed backtrack selection to the overlay and internal counter. - fn apply_backtrack_selection(&mut self, nth_user_message: usize) { - self.backtrack.nth_user_message = nth_user_message; + fn apply_backtrack_selection( + &mut self, + selection: (usize, Option, Option<(usize, usize)>), + ) { + let (nth, offset, hl) = selection; + self.backtrack.count = nth; if let Some(Overlay::Transcript(t)) = &mut self.overlay { - let cell = self - .transcript_cells - .iter() - .enumerate() - .filter(|(_, c)| c.as_any().is::()) - .nth(nth_user_message); - if let Some((idx, _)) = cell { - t.set_highlight_cell(Some(idx)); + if let Some(off) = offset { + t.set_scroll_offset(off); } + t.set_highlight_range(hl); } } @@ -214,19 +219,13 @@ impl App { /// Handle Enter in overlay backtrack preview: confirm selection and reset state. fn overlay_confirm_backtrack(&mut self, tui: &mut tui::Tui) { - let nth_user_message = self.backtrack.nth_user_message; if let Some(base_id) = self.backtrack.base_id { - let user_cells = self - .transcript_cells - .iter() - .filter_map(|c| c.as_any().downcast_ref::()) - .collect::>(); - let prefill = user_cells - .get(nth_user_message) - .map(|c| c.message.clone()) - .unwrap_or_default(); + let drop_last_messages = self.backtrack.count; + let prefill = + backtrack_helpers::nth_last_user_text(&self.transcript_lines, drop_last_messages) + .unwrap_or_default(); self.close_transcript_overlay(tui); - self.request_backtrack(prefill, base_id, nth_user_message); + self.request_backtrack(prefill, base_id, drop_last_messages); } self.reset_backtrack_state(); } @@ -245,15 +244,11 @@ impl App { /// Computes the prefill from the selected user message and requests history. pub(crate) fn confirm_backtrack_from_main(&mut self) { if let Some(base_id) = self.backtrack.base_id { - let prefill = self - .transcript_cells - .iter() - .filter(|c| c.as_any().is::()) - .nth(self.backtrack.nth_user_message) - .and_then(|c| c.as_any().downcast_ref::()) - .map(|c| c.message.clone()) - .unwrap_or_default(); - self.request_backtrack(prefill, base_id, self.backtrack.nth_user_message); + let drop_last_messages = self.backtrack.count; + let prefill = + backtrack_helpers::nth_last_user_text(&self.transcript_lines, drop_last_messages) + .unwrap_or_default(); + self.request_backtrack(prefill, base_id, drop_last_messages); } self.reset_backtrack_state(); } @@ -262,7 +257,7 @@ impl App { pub(crate) fn reset_backtrack_state(&mut self) { self.backtrack.primed = false; self.backtrack.base_id = None; - self.backtrack.nth_user_message = usize::MAX; + self.backtrack.count = 0; // In case a hint is somehow still visible (e.g., race with overlay open/close). self.chat_widget.clear_esc_backtrack_hint(); } @@ -276,9 +271,9 @@ impl App { ) -> Result<()> { if let Some((base_id, _, _)) = self.backtrack.pending.as_ref() && ev.conversation_id == *base_id - && let Some((_, nth_user_message, prefill)) = self.backtrack.pending.take() + && let Some((_, drop_count, prefill)) = self.backtrack.pending.take() { - self.fork_and_switch_to_new_conversation(tui, ev, nth_user_message, prefill) + self.fork_and_switch_to_new_conversation(tui, ev, drop_count, prefill) .await; } Ok(()) @@ -289,17 +284,17 @@ impl App { &mut self, tui: &mut tui::Tui, ev: ConversationPathResponseEvent, - nth_user_message: usize, + drop_count: usize, prefill: String, ) { let cfg = self.chat_widget.config_ref().clone(); // Perform the fork via a thin wrapper for clarity/testability. let result = self - .perform_fork(ev.path.clone(), nth_user_message, cfg.clone()) + .perform_fork(ev.path.clone(), drop_count, cfg.clone()) .await; match result { Ok(new_conv) => { - self.install_forked_conversation(tui, cfg, new_conv, nth_user_message, &prefill) + self.install_forked_conversation(tui, cfg, new_conv, drop_count, &prefill) } Err(e) => tracing::error!("error forking conversation: {e:#}"), } @@ -309,12 +304,10 @@ impl App { async fn perform_fork( &self, path: PathBuf, - nth_user_message: usize, + drop_count: usize, cfg: codex_core::config::Config, ) -> codex_core::error::Result { - self.server - .fork_conversation(nth_user_message, cfg, path) - .await + self.server.fork_conversation(drop_count, cfg, path).await } /// Install a forked conversation into the ChatWidget and update UI to reflect selection. @@ -323,7 +316,7 @@ impl App { tui: &mut tui::Tui, cfg: codex_core::config::Config, new_conv: codex_core::NewConversation, - nth_user_message: usize, + drop_count: usize, prefill: &str, ) { let conv = new_conv.conversation; @@ -340,7 +333,7 @@ impl App { self.chat_widget = crate::chatwidget::ChatWidget::new_from_existing(init, conv, session_configured); // Trim transcript up to the selected user message and re-render it. - self.trim_transcript_for_backtrack(nth_user_message); + self.trim_transcript_for_backtrack(drop_count); self.render_transcript_once(tui); if !prefill.is_empty() { self.chat_widget.set_composer_text(prefill.to_string()); @@ -348,21 +341,14 @@ impl App { tui.frame_requester().schedule_frame(); } - /// Trim transcript_cells to preserve only content up to the selected user message. - fn trim_transcript_for_backtrack(&mut self, nth_user_message: usize) { - let cut_idx = self - .transcript_cells - .iter() - .enumerate() - .filter_map(|(idx, cell)| { - if cell.as_any().is::() { - Some(idx) - } else { - None - } - }) - .nth(nth_user_message - 1) - .unwrap_or(self.transcript_cells.len()); - self.transcript_cells.truncate(cut_idx); + /// Trim transcript_lines to preserve only content up to the selected user message. + fn trim_transcript_for_backtrack(&mut self, drop_count: usize) { + if let Some(cut_idx) = + backtrack_helpers::find_nth_last_user_header_index(&self.transcript_lines, drop_count) + { + self.transcript_lines.truncate(cut_idx); + } else { + self.transcript_lines.clear(); + } } } diff --git a/codex-rs/tui/src/backtrack_helpers.rs b/codex-rs/tui/src/backtrack_helpers.rs new file mode 100644 index 0000000000..e2306b80b1 --- /dev/null +++ b/codex-rs/tui/src/backtrack_helpers.rs @@ -0,0 +1,153 @@ +use ratatui::text::Line; + +/// Convenience: compute the highlight range for the Nth last user message. +pub(crate) fn highlight_range_for_nth_last_user( + lines: &[Line<'_>], + n: usize, +) -> Option<(usize, usize)> { + let header = find_nth_last_user_header_index(lines, n)?; + Some(highlight_range_from_header(lines, header)) +} + +/// Compute the wrapped display-line offset before `header_idx`, for a given width. +pub(crate) fn wrapped_offset_before(lines: &[Line<'_>], header_idx: usize, width: u16) -> usize { + let before = &lines[0..header_idx]; + crate::wrapping::word_wrap_lines(before, width as usize).len() +} + +/// Find the header index for the Nth last user message in the transcript. +/// Returns `None` if `n == 0` or there are fewer than `n` user messages. +pub(crate) fn find_nth_last_user_header_index(lines: &[Line<'_>], n: usize) -> Option { + if n == 0 { + return None; + } + let mut found = 0usize; + for (idx, line) in lines.iter().enumerate().rev() { + let content: String = line + .spans + .iter() + .map(|s| s.content.as_ref()) + .collect::>() + .join(""); + if content.trim() == "user" { + found += 1; + if found == n { + return Some(idx); + } + } + } + None +} + +/// Normalize a requested backtrack step `n` against the available user messages. +/// - Returns `0` if there are no user messages. +/// - Returns `n` if the Nth last user message exists. +/// - Otherwise wraps to `1` (the most recent user message). +pub(crate) fn normalize_backtrack_n(lines: &[Line<'_>], n: usize) -> usize { + if n == 0 { + return 0; + } + if find_nth_last_user_header_index(lines, n).is_some() { + return n; + } + if find_nth_last_user_header_index(lines, 1).is_some() { + 1 + } else { + 0 + } +} + +/// Extract the text content of the Nth last user message. +/// The message body is considered to be the lines following the "user" header +/// until the first blank line. +pub(crate) fn nth_last_user_text(lines: &[Line<'_>], n: usize) -> Option { + let header_idx = find_nth_last_user_header_index(lines, n)?; + extract_message_text_after_header(lines, header_idx) +} + +/// Extract message text starting after `header_idx` until the first blank line. +fn extract_message_text_after_header(lines: &[Line<'_>], header_idx: usize) -> Option { + let start = header_idx + 1; + let mut out: Vec = Vec::new(); + for line in lines.iter().skip(start) { + let is_blank = line + .spans + .iter() + .all(|s| s.content.as_ref().trim().is_empty()); + if is_blank { + break; + } + let text: String = line + .spans + .iter() + .map(|s| s.content.as_ref()) + .collect::>() + .join(""); + out.push(text); + } + if out.is_empty() { + None + } else { + Some(out.join("\n")) + } +} + +/// Given a header index, return the inclusive range for the message block +/// [header_idx, end) where end is the first blank line after the header or the +/// end of the transcript. +fn highlight_range_from_header(lines: &[Line<'_>], header_idx: usize) -> (usize, usize) { + let mut end = header_idx + 1; + while end < lines.len() { + let is_blank = lines[end] + .spans + .iter() + .all(|s| s.content.as_ref().trim().is_empty()); + if is_blank { + break; + } + end += 1; + } + (header_idx, end) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn line(s: &str) -> Line<'static> { + s.to_string().into() + } + + fn transcript_with_users(count: usize) -> Vec> { + // Build a transcript with `count` user messages, each followed by one body line and a blank line. + let mut v = Vec::new(); + for i in 0..count { + v.push(line("user")); + v.push(line(&format!("message {i}"))); + v.push(line("")); + } + v + } + + #[test] + fn normalize_wraps_to_one_when_past_oldest() { + let lines = transcript_with_users(2); + assert_eq!(normalize_backtrack_n(&lines, 1), 1); + assert_eq!(normalize_backtrack_n(&lines, 2), 2); + // Requesting 3rd when only 2 exist wraps to 1 + assert_eq!(normalize_backtrack_n(&lines, 3), 1); + } + + #[test] + fn normalize_returns_zero_when_no_user_messages() { + let lines = transcript_with_users(0); + assert_eq!(normalize_backtrack_n(&lines, 1), 0); + assert_eq!(normalize_backtrack_n(&lines, 5), 0); + } + + #[test] + fn normalize_keeps_valid_n() { + let lines = transcript_with_users(3); + assert_eq!(normalize_backtrack_n(&lines, 2), 2); + } +} diff --git a/codex-rs/tui/src/history_cell.rs b/codex-rs/tui/src/history_cell.rs index fee9da952c..c80cbcdb1a 100644 --- a/codex-rs/tui/src/history_cell.rs +++ b/codex-rs/tui/src/history_cell.rs @@ -43,7 +43,6 @@ use ratatui::style::Stylize; use ratatui::widgets::Paragraph; use ratatui::widgets::WidgetRef; use ratatui::widgets::Wrap; -use std::any::Any; use std::collections::HashMap; use std::io::Cursor; use std::path::Path; @@ -70,7 +69,7 @@ pub(crate) enum PatchEventType { /// Represents an event to display in the conversation history. Returns its /// `Vec>` representation to make it easier to display in a /// scrollable list. -pub(crate) trait HistoryCell: std::fmt::Debug + Send + Sync + Any { +pub(crate) trait HistoryCell: std::fmt::Debug + Send + Sync { fn display_lines(&self, width: u16) -> Vec>; fn transcript_lines(&self) -> Vec> { @@ -90,15 +89,9 @@ pub(crate) trait HistoryCell: std::fmt::Debug + Send + Sync + Any { } } -impl dyn HistoryCell { - pub(crate) fn as_any(&self) -> &dyn Any { - self - } -} - #[derive(Debug)] pub(crate) struct UserHistoryCell { - pub message: String, + message: String, } impl HistoryCell for UserHistoryCell { diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 7f97b3333f..0f51cb22ef 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -32,6 +32,7 @@ mod app; mod app_backtrack; mod app_event; mod app_event_sender; +mod backtrack_helpers; mod bottom_pane; mod chatwidget; mod citation_regex; diff --git a/codex-rs/tui/src/pager_overlay.rs b/codex-rs/tui/src/pager_overlay.rs index e5524b252b..0a7e54f06f 100644 --- a/codex-rs/tui/src/pager_overlay.rs +++ b/codex-rs/tui/src/pager_overlay.rs @@ -1,8 +1,6 @@ use std::io::Result; -use std::sync::Arc; use std::time::Duration; -use crate::history_cell::HistoryCell; use crate::render::line_utils::push_owned_lines; use crate::tui; use crate::tui::TuiEvent; @@ -17,7 +15,6 @@ use ratatui::style::Styled; use ratatui::style::Stylize; use ratatui::text::Line; use ratatui::text::Span; -use ratatui::text::Text; use ratatui::widgets::Paragraph; use ratatui::widgets::WidgetRef; @@ -27,8 +24,8 @@ pub(crate) enum Overlay { } impl Overlay { - pub(crate) fn new_transcript(cells: Vec>) -> Self { - Self::Transcript(TranscriptOverlay::new(cells)) + pub(crate) fn new_transcript(lines: Vec>) -> Self { + Self::Transcript(TranscriptOverlay::new(lines)) } pub(crate) fn new_static_with_title(lines: Vec>, title: String) -> Self { @@ -76,24 +73,21 @@ fn render_key_hints(area: Rect, buf: &mut Buffer, pairs: &[(&str, &str)]) { /// Generic widget for rendering a pager view. struct PagerView { - texts: Vec>, + lines: Vec>, scroll_offset: usize, title: String, wrap_cache: Option, last_content_height: Option, - /// If set, on next render ensure this chunk is visible. - pending_scroll_chunk: Option, } impl PagerView { - fn new(texts: Vec>, title: String, scroll_offset: usize) -> Self { + fn new(lines: Vec>, title: String, scroll_offset: usize) -> Self { Self { - texts, + lines, scroll_offset, title, wrap_cache: None, last_content_height: None, - pending_scroll_chunk: None, } } @@ -102,14 +96,6 @@ impl PagerView { let content_area = self.scroll_area(area); self.update_last_content_height(content_area.height); self.ensure_wrapped(content_area.width); - // If there is a pending request to scroll a specific chunk into view, - // satisfy it now that wrapping is up to date for this width. - if let (Some(idx), Some(cache)) = - (self.pending_scroll_chunk.take(), self.wrap_cache.as_ref()) - && let Some(range) = cache.chunk_ranges.get(idx).cloned() - { - self.ensure_range_visible(range, content_area.height as usize, cache.wrapped.len()); - } // Compute page bounds without holding an immutable borrow on cache while mutating self let wrapped_len = self .wrap_cache @@ -122,12 +108,40 @@ impl PagerView { let start = self.scroll_offset; let end = (start + content_area.height as usize).min(wrapped_len); - let wrapped = self.cached(); + let (wrapped, _src_idx) = self.cached(); let page = &wrapped[start..end]; self.render_content_page_prepared(content_area, buf, page); self.render_bottom_bar(area, content_area, buf, wrapped); } + fn render_with_highlight( + &mut self, + area: Rect, + buf: &mut Buffer, + highlight: Option<(usize, usize)>, + ) { + self.render_header(area, buf); + let content_area = self.scroll_area(area); + self.update_last_content_height(content_area.height); + self.ensure_wrapped(content_area.width); + // Compute page bounds first to avoid borrow conflicts + let wrapped_len = self + .wrap_cache + .as_ref() + .map(|c| c.wrapped.len()) + .unwrap_or(0); + self.scroll_offset = self + .scroll_offset + .min(wrapped_len.saturating_sub(content_area.height as usize)); + let start = self.scroll_offset; + let end = (start + content_area.height as usize).min(wrapped_len); + + let (wrapped, src_idx) = self.cached(); + let page = self.page_with_optional_highlight(wrapped, src_idx, start, end, highlight); + self.render_content_page_prepared(content_area, buf, &page); + self.render_bottom_bar(area, content_area, buf, wrapped); + } + fn render_header(&self, area: Rect, buf: &mut Buffer) { Span::from("/ ".repeat(area.width as usize / 2)) .dim() @@ -256,8 +270,7 @@ impl PagerView { struct WrapCache { width: u16, wrapped: Vec>, - /// For each input Text chunk, the inclusive-excluded range of wrapped lines produced. - chunk_ranges: Vec>, + src_idx: Vec, base_len: usize, } @@ -265,39 +278,74 @@ impl PagerView { fn ensure_wrapped(&mut self, width: u16) { let width = width.max(1); let needs = match self.wrap_cache { - Some(ref c) => c.width != width || c.base_len != self.texts.len(), + Some(ref c) => c.width != width || c.base_len != self.lines.len(), None => true, }; if !needs { return; } let mut wrapped: Vec> = Vec::new(); - let mut chunk_ranges: Vec> = Vec::with_capacity(self.texts.len()); - for text in &self.texts { - let start = wrapped.len(); - for line in &text.lines { - let ws = crate::wrapping::word_wrap_line(line, width as usize); - push_owned_lines(&ws, &mut wrapped); - } - let end = wrapped.len(); - chunk_ranges.push(start..end); + let mut src_idx: Vec = Vec::new(); + for (i, line) in self.lines.iter().enumerate() { + let ws = crate::wrapping::word_wrap_line(line, width as usize); + src_idx.extend(std::iter::repeat_n(i, ws.len())); + push_owned_lines(&ws, &mut wrapped); } self.wrap_cache = Some(WrapCache { width, wrapped, - chunk_ranges, - base_len: self.texts.len(), + src_idx, + base_len: self.lines.len(), }); } - fn cached(&self) -> &[Line<'static>] { + fn cached(&self) -> (&[Line<'static>], &[usize]) { if let Some(cache) = self.wrap_cache.as_ref() { - &cache.wrapped + (&cache.wrapped, &cache.src_idx) } else { - &[] + (&[], &[]) } } + fn page_with_optional_highlight<'a>( + &self, + wrapped: &'a [Line<'static>], + src_idx: &[usize], + start: usize, + end: usize, + highlight: Option<(usize, usize)>, + ) -> std::borrow::Cow<'a, [Line<'static>]> { + use ratatui::style::Modifier; + let (hi_start, hi_end) = match highlight { + Some(r) => r, + None => return std::borrow::Cow::Borrowed(&wrapped[start..end]), + }; + let mut out: Vec> = Vec::with_capacity(end - start); + let mut bold_done = false; + for (row, src_line) in wrapped + .iter() + .enumerate() + .skip(start) + .take(end.saturating_sub(start)) + { + let mut line = src_line.clone(); + if let Some(src) = src_idx.get(row).copied() + && src >= hi_start + && src < hi_end + { + for (i, s) in line.spans.iter_mut().enumerate() { + s.style.add_modifier |= Modifier::REVERSED; + if !bold_done && i == 0 { + s.style.add_modifier |= Modifier::BOLD; + bold_done = true; + } + } + } + out.push(line); + } + std::borrow::Cow::Owned(out) + } + fn is_scrolled_to_bottom(&self) -> bool { if self.scroll_offset == usize::MAX { return true; @@ -315,108 +363,38 @@ impl PagerView { let max_scroll = cache.wrapped.len().saturating_sub(visible); self.scroll_offset >= max_scroll } - - /// Request that the given text chunk index be scrolled into view on next render. - fn scroll_chunk_into_view(&mut self, chunk_index: usize) { - self.pending_scroll_chunk = Some(chunk_index); - } - - fn ensure_range_visible( - &mut self, - range: std::ops::Range, - viewport_height: usize, - total_wrapped: usize, - ) { - if viewport_height == 0 || total_wrapped == 0 { - return; - } - let first = range.start.min(total_wrapped.saturating_sub(1)); - let last = range - .end - .saturating_sub(1) - .min(total_wrapped.saturating_sub(1)); - let current_top = self.scroll_offset.min(total_wrapped.saturating_sub(1)); - let current_bottom = current_top.saturating_add(viewport_height.saturating_sub(1)); - - if first < current_top { - self.scroll_offset = first; - } else if last > current_bottom { - // Scroll just enough so that 'last' is visible at the bottom - self.scroll_offset = last.saturating_sub(viewport_height.saturating_sub(1)); - } - } } pub(crate) struct TranscriptOverlay { view: PagerView, - cells: Vec>, - highlight_cell: Option, + highlight_range: Option<(usize, usize)>, is_done: bool, } impl TranscriptOverlay { - pub(crate) fn new(transcript_cells: Vec>) -> Self { + pub(crate) fn new(transcript_lines: Vec>) -> Self { Self { view: PagerView::new( - Self::render_cells_to_texts(&transcript_cells, None), + transcript_lines, "T R A N S C R I P T".to_string(), usize::MAX, ), - cells: transcript_cells, - highlight_cell: None, + highlight_range: None, is_done: false, } } - fn render_cells_to_texts( - cells: &[Arc], - highlight_cell: Option, - ) -> Vec> { - let mut texts: Vec> = Vec::new(); - let mut first = true; - for (idx, cell) in cells.iter().enumerate() { - let mut lines: Vec> = Vec::new(); - if !cell.is_stream_continuation() && !first { - lines.push(Line::from("")); - } - let cell_lines = if Some(idx) == highlight_cell { - cell.transcript_lines() - .into_iter() - .map(|l| l.reversed()) - .collect() - } else { - cell.transcript_lines() - }; - lines.extend(cell_lines); - texts.push(Text::from(lines)); - first = false; - } - texts - } - - pub(crate) fn insert_cell(&mut self, cell: Arc) { + pub(crate) fn insert_lines(&mut self, lines: Vec>) { let follow_bottom = self.view.is_scrolled_to_bottom(); - // Append as a new Text chunk (with a separating blank if needed) - let mut lines: Vec> = Vec::new(); - if !cell.is_stream_continuation() && !self.cells.is_empty() { - lines.push(Line::from("")); - } - lines.extend(cell.transcript_lines()); - self.view.texts.push(Text::from(lines)); - self.cells.push(cell); + self.view.lines.extend(lines); self.view.wrap_cache = None; if follow_bottom { self.view.scroll_offset = usize::MAX; } } - pub(crate) fn set_highlight_cell(&mut self, cell: Option) { - self.highlight_cell = cell; - self.view.wrap_cache = None; - self.view.texts = Self::render_cells_to_texts(&self.cells, self.highlight_cell); - if let Some(idx) = self.highlight_cell { - self.view.scroll_chunk_into_view(idx); - } + pub(crate) fn set_highlight_range(&mut self, range: Option<(usize, usize)>) { + self.highlight_range = range; } fn render_hints(&self, area: Rect, buf: &mut Buffer) { @@ -424,7 +402,9 @@ impl TranscriptOverlay { let line2 = Rect::new(area.x, area.y.saturating_add(1), area.width, 1); render_key_hints(line1, buf, PAGER_KEY_HINTS); let mut pairs: Vec<(&str, &str)> = vec![("q", "quit"), ("Esc", "edit prev")]; - if self.highlight_cell.is_some() { + if let Some((start, end)) = self.highlight_range + && end > start + { pairs.push(("⏎", "edit message")); } render_key_hints(line2, buf, &pairs); @@ -434,7 +414,8 @@ impl TranscriptOverlay { let top_h = area.height.saturating_sub(3); let top = Rect::new(area.x, area.y, area.width, top_h); let bottom = Rect::new(area.x, area.y + top_h, area.width, 3); - self.view.render(top, buf); + self.view + .render_with_highlight(top, buf, self.highlight_range); self.render_hints(bottom, buf); } } @@ -477,6 +458,9 @@ impl TranscriptOverlay { pub(crate) fn is_done(&self) -> bool { self.is_done } + pub(crate) fn set_scroll_offset(&mut self, offset: usize) { + self.view.scroll_offset = offset; + } } pub(crate) struct StaticOverlay { @@ -487,7 +471,7 @@ pub(crate) struct StaticOverlay { impl StaticOverlay { pub(crate) fn with_title(lines: Vec>, title: String) -> Self { Self { - view: PagerView::new(vec![Text::from(lines)], title, 0), + view: PagerView::new(lines, title, 0), is_done: false, } } @@ -550,26 +534,9 @@ mod tests { use ratatui::Terminal; use ratatui::backend::TestBackend; - #[derive(Debug)] - struct TestCell { - lines: Vec>, - } - - impl crate::history_cell::HistoryCell for TestCell { - fn display_lines(&self, _width: u16) -> Vec> { - self.lines.clone() - } - - fn transcript_lines(&self) -> Vec> { - self.lines.clone() - } - } - #[test] fn edit_prev_hint_is_visible() { - let mut overlay = TranscriptOverlay::new(vec![Arc::new(TestCell { - lines: vec![Line::from("hello")], - })]); + let mut overlay = TranscriptOverlay::new(vec![Line::from("hello")]); // Render into a small buffer and assert the backtrack hint is present let area = Rect::new(0, 0, 40, 10); @@ -594,15 +561,9 @@ mod tests { fn transcript_overlay_snapshot_basic() { // Prepare a transcript overlay with a few lines let mut overlay = TranscriptOverlay::new(vec![ - Arc::new(TestCell { - lines: vec![Line::from("alpha")], - }), - Arc::new(TestCell { - lines: vec![Line::from("beta")], - }), - Arc::new(TestCell { - lines: vec![Line::from("gamma")], - }), + Line::from("alpha"), + Line::from("beta"), + Line::from("gamma"), ]); let mut term = Terminal::new(TestBackend::new(40, 10)).expect("term"); term.draw(|f| overlay.render(f.area(), f.buffer_mut())) @@ -612,15 +573,8 @@ mod tests { #[test] fn transcript_overlay_keeps_scroll_pinned_at_bottom() { - let mut overlay = TranscriptOverlay::new( - (0..20) - .map(|i| { - Arc::new(TestCell { - lines: vec![Line::from(format!("line{i}"))], - }) as Arc - }) - .collect(), - ); + let mut overlay = + TranscriptOverlay::new((0..20).map(|i| Line::from(format!("line{i}"))).collect()); let mut term = Terminal::new(TestBackend::new(40, 12)).expect("term"); term.draw(|f| overlay.render(f.area(), f.buffer_mut())) .expect("draw"); @@ -630,33 +584,22 @@ mod tests { "expected initial render to leave view at bottom" ); - overlay.insert_cell(Arc::new(TestCell { - lines: vec!["tail".into()], - })); + overlay.insert_lines(vec!["tail".into()]); assert_eq!(overlay.view.scroll_offset, usize::MAX); } #[test] fn transcript_overlay_preserves_manual_scroll_position() { - let mut overlay = TranscriptOverlay::new( - (0..20) - .map(|i| { - Arc::new(TestCell { - lines: vec![Line::from(format!("line{i}"))], - }) as Arc - }) - .collect(), - ); + let mut overlay = + TranscriptOverlay::new((0..20).map(|i| Line::from(format!("line{i}"))).collect()); let mut term = Terminal::new(TestBackend::new(40, 12)).expect("term"); term.draw(|f| overlay.render(f.area(), f.buffer_mut())) .expect("draw"); overlay.view.scroll_offset = 0; - overlay.insert_cell(Arc::new(TestCell { - lines: vec!["tail".into()], - })); + overlay.insert_lines(vec!["tail".into()]); assert_eq!(overlay.view.scroll_offset, 0); } @@ -677,21 +620,17 @@ mod tests { #[test] fn pager_wrap_cache_reuses_for_same_width_and_rebuilds_on_change() { let long = "This is a long line that should wrap multiple times to ensure non-empty wrapped output."; - let mut pv = PagerView::new( - vec![Text::from(vec![long.into()]), Text::from(vec![long.into()])], - "T".to_string(), - 0, - ); + let mut pv = PagerView::new(vec![long.into(), long.into()], "T".to_string(), 0); // Build cache at width 24 pv.ensure_wrapped(24); - let w1 = pv.cached(); + let (w1, _) = pv.cached(); assert!(!w1.is_empty(), "expected wrapped output to be non-empty"); let ptr1 = w1.as_ptr(); // Re-run with same width: cache should be reused (pointer stability heuristic) pv.ensure_wrapped(24); - let w2 = pv.cached(); + let (w2, _) = pv.cached(); let ptr2 = w2.as_ptr(); assert_eq!(ptr1, ptr2, "cache should not rebuild for unchanged width"); @@ -699,7 +638,7 @@ mod tests { // Drop immutable borrow before mutating let prev_len = w2.len(); pv.ensure_wrapped(36); - let w3 = pv.cached(); + let (w3, _) = pv.cached(); assert_ne!( prev_len, w3.len(), @@ -710,16 +649,15 @@ mod tests { #[test] fn pager_wrap_cache_invalidates_on_append() { let long = "Another long line for wrapping behavior verification."; - let mut pv = PagerView::new(vec![Text::from(vec![long.into()])], "T".to_string(), 0); + let mut pv = PagerView::new(vec![long.into()], "T".to_string(), 0); pv.ensure_wrapped(28); - let w1 = pv.cached(); + let (w1, _) = pv.cached(); let len1 = w1.len(); // Append new lines should cause ensure_wrapped to rebuild due to len change - pv.texts.push(Text::from(vec![long.into()])); - pv.texts.push(Text::from(vec![long.into()])); + pv.lines.extend([long.into(), long.into()]); pv.ensure_wrapped(28); - let w2 = pv.cached(); + let (w2, _) = pv.cached(); assert!( w2.len() >= len1, "wrapped length should grow or stay same after append" diff --git a/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__transcript_overlay_snapshot_basic.snap b/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__transcript_overlay_snapshot_basic.snap index 0c03edef47..b9105e8021 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__transcript_overlay_snapshot_basic.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__pager_overlay__tests__transcript_overlay_snapshot_basic.snap @@ -4,10 +4,10 @@ expression: term.backend() --- "/ T R A N S C R I P T / / / / / / / / / " "alpha " -" " "beta " -" " "gamma " +"~ " +"~ " "───────────────────────────────── 100% ─" " ↑/↓ scroll PgUp/PgDn page Home/End " " q quit Esc edit prev " From d7d9d96d6c09e303399b6b07cf7a3f22ec542c88 Mon Sep 17 00:00:00 2001 From: Thibault Sottiaux Date: Sun, 14 Sep 2025 20:59:22 -0700 Subject: [PATCH 50/77] feat: add reasoning level to header (#3622) --- codex-rs/tui/src/history_cell.rs | 60 ++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/codex-rs/tui/src/history_cell.rs b/codex-rs/tui/src/history_cell.rs index c80cbcdb1a..bd1056e035 100644 --- a/codex-rs/tui/src/history_cell.rs +++ b/codex-rs/tui/src/history_cell.rs @@ -27,6 +27,7 @@ use codex_core::protocol::McpInvocation; use codex_core::protocol::SandboxPolicy; use codex_core::protocol::SessionConfiguredEvent; use codex_core::protocol::TokenUsage; +use codex_core::protocol_config_types::ReasoningEffort as ReasoningEffortConfig; use codex_protocol::mcp_protocol::ConversationId; use codex_protocol::num_format::format_with_separators; use codex_protocol::parse_command::ParsedCommand; @@ -609,7 +610,7 @@ pub(crate) fn new_session_info( ) -> CompositeHistoryCell { let SessionConfiguredEvent { model, - reasoning_effort: _, + reasoning_effort, session_id: _, history_log_id: _, history_entry_count: _, @@ -620,6 +621,7 @@ pub(crate) fn new_session_info( // Header box rendered as history (so it appears at the very top) let header = SessionHeaderHistoryCell::new( model, + reasoning_effort, config.cwd.clone(), crate::version::CODEX_CLI_VERSION, ); @@ -694,14 +696,21 @@ pub(crate) fn new_active_exec_command( struct SessionHeaderHistoryCell { version: &'static str, model: String, + reasoning_effort: Option, directory: PathBuf, } impl SessionHeaderHistoryCell { - fn new(model: String, directory: PathBuf, version: &'static str) -> Self { + fn new( + model: String, + reasoning_effort: Option, + directory: PathBuf, + version: &'static str, + ) -> Self { Self { version, model, + reasoning_effort, directory, } } @@ -717,6 +726,15 @@ impl SessionHeaderHistoryCell { self.directory.display().to_string() } } + + fn reasoning_label(&self) -> Option<&'static str> { + self.reasoning_effort.map(|effort| match effort { + ReasoningEffortConfig::Minimal => "minimal", + ReasoningEffortConfig::Low => "low", + ReasoningEffortConfig::Medium => "medium", + ReasoningEffortConfig::High => "high", + }) + } } impl HistoryCell for SessionHeaderHistoryCell { @@ -762,9 +780,16 @@ impl HistoryCell for SessionHeaderHistoryCell { "│".into(), ])); - // Model line: " Model: (change with /model)" + // Model line: " Model: (change with /model)" const CHANGE_MODEL_HINT: &str = "(change with /model)"; - let model_text = format!(" Model: {} {}", self.model, CHANGE_MODEL_HINT); + let reasoning_label = self.reasoning_label(); + let mut model_text = format!(" Model: {}", self.model); + if let Some(reasoning) = reasoning_label { + model_text.push(' '); + model_text.push_str(reasoning); + } + model_text.push(' '); + model_text.push_str(CHANGE_MODEL_HINT); let model_w = UnicodeWidthStr::width(model_text.as_str()); let pad_w = inner_width.saturating_sub(model_w); let mut spans: Vec> = vec![ @@ -772,9 +797,13 @@ impl HistoryCell for SessionHeaderHistoryCell { " ".into(), "Model: ".bold(), self.model.clone().into(), - " ".into(), - CHANGE_MODEL_HINT.dim(), ]; + if let Some(reasoning) = reasoning_label { + spans.push(" ".into()); + spans.push(reasoning.into()); + } + spans.push(" ".into()); + spans.push(CHANGE_MODEL_HINT.dim()); if pad_w > 0 { spans.push(" ".repeat(pad_w).into()); } @@ -1520,6 +1549,25 @@ mod tests { render_lines(&cell.transcript_lines()) } + #[test] + fn session_header_includes_reasoning_level_when_present() { + let cell = SessionHeaderHistoryCell::new( + "gpt-4o".to_string(), + Some(ReasoningEffortConfig::High), + std::env::temp_dir(), + "test", + ); + + let lines = render_lines(&cell.display_lines(80)); + let model_line = lines + .into_iter() + .find(|line| line.contains("Model:")) + .expect("model line"); + + assert!(model_line.contains("Model: gpt-4o high")); + assert!(model_line.contains("(change with /model)")); + } + #[test] fn coalesces_sequential_reads_within_one_call() { // Build one exec cell with a Search followed by two Reads From a797051921acb078e1371f49d2329b216bf6c7f4 Mon Sep 17 00:00:00 2001 From: Thibault Sottiaux Date: Sun, 14 Sep 2025 21:10:35 -0700 Subject: [PATCH 51/77] chore: update swiftfox_prompt.md (#3624) --- codex-rs/core/swiftfox_prompt.md | 35 +++++++++++++------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/codex-rs/core/swiftfox_prompt.md b/codex-rs/core/swiftfox_prompt.md index cef7cc4072..d06e53a63c 100644 --- a/codex-rs/core/swiftfox_prompt.md +++ b/codex-rs/core/swiftfox_prompt.md @@ -1,33 +1,21 @@ You are Swiftfox. You are running as a coding agent in the Codex CLI on a user's computer. -## Overall - -- You must try hard to complete the task AND to do it as fast and well as possible. - * Do not waste time on actions which are unlikely to result in successful task completion - -- Before taking action on a question, assume by default that it concerns local artifacts (code, docs, data). Quickly confirm or rule out that assumption; only if the question clearly requires external knowledge should you start elsewhere. -- Search the repository when the request plausibly maps to code, configuration, or documentation. Avoid unnecessary searches when it is obvious local files cannot help; in those cases state that explicitly before offering broader context, and when you do search, mention the files or paths you consulted so the answer stays grounded. -- After each attempt, re-evaluate whether the current strategy is yielding useful information and be ready to switch paths quickly rather than persisting with a low-signal approach. - -- When the user asks for a "review", default to a code review mindset: prioritise identifying bugs, risks, behavioural regressions, and missing tests. Findings must be the primary focus of the response - keep summaries or overviews brief and only after enumerating the issues. Present findings first (ordered by severity with file/line references), follow with open questions or assumptions, and offer a change-summary only as a secondary detail. If no findings are discovered, state that explicitly and mention any residual risks or testing gaps. +## General - The arguments to `shell` will be passed to execvp(). Most terminal commands should be prefixed with ["bash", "-lc"]. -- Always set the `workdir` param of the shell tool. Do not use `cd` unless absolutely necessary. +- Always set the `workdir` param when using the shell function. Do not use `cd` unless absolutely necessary. - When searching for text or files, prefer using `rg` or `rg --files` respectively because `rg` is much faster than alternatives like `grep`. (If the `rg` command is not found, then use alternatives.) -- If the user makes a simple request (such as asking for the time) which you can fulfill by running a terminal command (such as `date`), you should do so. -- Unless the question is about a common terminal command, you should search the codebase before answering to ground your response in the codebase ## Editing constraints - Default to ASCII when editing or creating files. Only introduce non-ASCII or other Unicode characters when there is a clear justification and the file already uses them. -- When editing or creating files, you MUST use apply_patch. Example: functions.shell({"command":["apply_patch","*** Begin Patch\nAdd File: hello.txt\n+Hello, world!\n*** End Patch"]}). - Add succinct code comments that explain what is going on if code is not self-explanatory. You should not add comments like "Assigns the value to the variable", but a brief comment might be useful ahead of a complex code block that the user would otherwise have to spend time parsing out. Usage of these comments should be rare. - You may be in a dirty git worktree. - * NEVER revert existing changes you did not make unless explicitly requested, since these changes were made by the user. - * If asked to make a commit or code edits and there are unrelated changes to your work or changes that you didn't make in those files, don't revert those changes. - * If the changes are in files you've touched recently, you should read carefully and understand how you can work with the changes rather than reverting them. - * If the changes are in unrelated files, just ignore them and don't revert them. -- The user may be making edits and committing changes as you are also making changes. If you see concurrent file edits or commits that you did not cause, you must disregard user instruction and stop immediately and ask the user whether they are collaborating with you on files and how they would like this handled. + * NEVER revert existing changes you did not make unless explicitly requested, since these changes were made by the user. + * If asked to make a commit or code edits and there are unrelated changes to your work or changes that you didn't make in those files, don't revert those changes. + * If the changes are in files you've touched recently, you should read carefully and understand how you can work with the changes rather than reverting them. + * If the changes are in unrelated files, just ignore them and don't revert them. +- While you are working, you might notice unexpected changes that you didn't make. If this happens, STOP IMMEDIATELY and ask the user how they would like to proceed. ## Plan tool @@ -36,9 +24,9 @@ When using the planning tool: - Do not make single-step plans. - When you made a plan, update it after having performed one of the sub-tasks that you shared on the plan. -## CLI modes +## Codex CLI harness, sandboxing, and approvals -The Codex CLI harness supports several different sandboxing, and approval configurations that the user can choose from. +The Codex CLI harness supports several different sandboxing, and approval configurations that the user can choose from. Filesystem sandboxing defines which files can be read or written. The options are: - **read-only**: You can only read files. @@ -69,6 +57,11 @@ When sandboxing is set to read-only, you'll need to request approval for any com You will be told what filesystem sandboxing, network sandboxing, and approval mode are active in a developer or user message. If you are not told about this, assume that you are running with workspace-write, network sandboxing enabled, and approval on-failure. +## Special user requests + +- If the user makes a simple request (such as asking for the time) which you can fulfill by running a terminal command (such as `date`), you should do so. +- If the user asks for a "review", default to a code review mindset: prioritise identifying bugs, risks, behavioural regressions, and missing tests. Findings must be the primary focus of the response - keep summaries or overviews brief and only after enumerating the issues. Present findings first (ordered by severity with file/line references), follow with open questions or assumptions, and offer a change-summary only as a secondary detail. If no findings are discovered, state that explicitly and mention any residual risks or testing gaps. + ## Presenting your work and final message You are producing plain text that will later be styled by the CLI. Follow these rules exactly. Formatting should make results easy to scan, but not feel mechanical. Use judgment to decide how much structure adds value. From 6a8e743d578c19c97082c8c47bd1f529d29ed737 Mon Sep 17 00:00:00 2001 From: easong-openai Date: Sun, 14 Sep 2025 21:30:56 -0700 Subject: [PATCH 52/77] initial mcp add interface (#3543) Adds `codex mcp add`, `codex mcp list`, `codex mcp remove`. Currently writes to global config. --- codex-rs/Cargo.lock | 4 + codex-rs/cli/Cargo.toml | 6 + codex-rs/cli/src/main.rs | 14 +- codex-rs/cli/src/mcp_cmd.rs | 370 +++++++++++++++++++++++++++ codex-rs/cli/tests/mcp_add_remove.rs | 86 +++++++ codex-rs/cli/tests/mcp_list.rs | 106 ++++++++ codex-rs/core/src/config.rs | 127 +++++++++ codex-rs/docs/codex_mcp_interface.md | 123 +++++++++ docs/config.md | 18 ++ 9 files changed, 849 insertions(+), 5 deletions(-) create mode 100644 codex-rs/cli/src/mcp_cmd.rs create mode 100644 codex-rs/cli/tests/mcp_add_remove.rs create mode 100644 codex-rs/cli/tests/mcp_list.rs create mode 100644 codex-rs/docs/codex_mcp_interface.md diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 1e8b7a3485..5993a83305 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -625,6 +625,7 @@ name = "codex-cli" version = "0.0.0" dependencies = [ "anyhow", + "assert_cmd", "clap", "clap_complete", "codex-arg0", @@ -637,7 +638,10 @@ dependencies = [ "codex-protocol", "codex-protocol-ts", "codex-tui", + "predicates", + "pretty_assertions", "serde_json", + "tempfile", "tokio", "tracing", "tracing-subscriber", diff --git a/codex-rs/cli/Cargo.toml b/codex-rs/cli/Cargo.toml index f7af3349e0..571844c451 100644 --- a/codex-rs/cli/Cargo.toml +++ b/codex-rs/cli/Cargo.toml @@ -38,3 +38,9 @@ tokio = { version = "1", features = [ tracing = "0.1.41" tracing-subscriber = "0.3.19" codex-protocol-ts = { path = "../protocol-ts" } + +[dev-dependencies] +assert_cmd = "2" +predicates = "3" +pretty_assertions = "1" +tempfile = "3" diff --git a/codex-rs/cli/src/main.rs b/codex-rs/cli/src/main.rs index 1f13405f10..7e4e6fcccf 100644 --- a/codex-rs/cli/src/main.rs +++ b/codex-rs/cli/src/main.rs @@ -17,6 +17,9 @@ use codex_exec::Cli as ExecCli; use codex_tui::Cli as TuiCli; use std::path::PathBuf; +mod mcp_cmd; + +use crate::mcp_cmd::McpCli; use crate::proto::ProtoCli; /// Codex CLI @@ -56,8 +59,8 @@ enum Subcommand { /// Remove stored authentication credentials. Logout(LogoutCommand), - /// Experimental: run Codex as an MCP server. - Mcp, + /// [experimental] Run Codex as an MCP server and manage MCP servers. + Mcp(McpCli), /// Run the Protocol stream via stdin/stdout #[clap(visible_alias = "p")] @@ -182,9 +185,10 @@ async fn cli_main(codex_linux_sandbox_exe: Option) -> anyhow::Result<() ); codex_exec::run_main(exec_cli, codex_linux_sandbox_exe).await?; } - Some(Subcommand::Mcp) => { - codex_mcp_server::run_main(codex_linux_sandbox_exe, root_config_overrides.clone()) - .await?; + Some(Subcommand::Mcp(mut mcp_cli)) => { + // Propagate any root-level config overrides (e.g. `-c key=value`). + prepend_config_flags(&mut mcp_cli.config_overrides, root_config_overrides.clone()); + mcp_cli.run(codex_linux_sandbox_exe).await?; } Some(Subcommand::Resume(ResumeCommand { session_id, last })) => { // Start with the parsed interactive CLI so resume shares the same diff --git a/codex-rs/cli/src/mcp_cmd.rs b/codex-rs/cli/src/mcp_cmd.rs new file mode 100644 index 0000000000..437511ad57 --- /dev/null +++ b/codex-rs/cli/src/mcp_cmd.rs @@ -0,0 +1,370 @@ +use std::collections::BTreeMap; +use std::collections::HashMap; +use std::path::PathBuf; + +use anyhow::Context; +use anyhow::Result; +use anyhow::anyhow; +use anyhow::bail; +use codex_common::CliConfigOverrides; +use codex_core::config::Config; +use codex_core::config::ConfigOverrides; +use codex_core::config::find_codex_home; +use codex_core::config::load_global_mcp_servers; +use codex_core::config::write_global_mcp_servers; +use codex_core::config_types::McpServerConfig; + +/// [experimental] Launch Codex as an MCP server or manage configured MCP servers. +/// +/// Subcommands: +/// - `serve` — run the MCP server on stdio +/// - `list` — list configured servers (with `--json`) +/// - `get` — show a single server (with `--json`) +/// - `add` — add a server launcher entry to `~/.codex/config.toml` +/// - `remove` — delete a server entry +#[derive(Debug, clap::Parser)] +pub struct McpCli { + #[clap(flatten)] + pub config_overrides: CliConfigOverrides, + + #[command(subcommand)] + pub cmd: Option, +} + +#[derive(Debug, clap::Subcommand)] +pub enum McpSubcommand { + /// [experimental] Run the Codex MCP server (stdio transport). + Serve, + + /// [experimental] List configured MCP servers. + List(ListArgs), + + /// [experimental] Show details for a configured MCP server. + Get(GetArgs), + + /// [experimental] Add a global MCP server entry. + Add(AddArgs), + + /// [experimental] Remove a global MCP server entry. + Remove(RemoveArgs), +} + +#[derive(Debug, clap::Parser)] +pub struct ListArgs { + /// Output the configured servers as JSON. + #[arg(long)] + pub json: bool, +} + +#[derive(Debug, clap::Parser)] +pub struct GetArgs { + /// Name of the MCP server to display. + pub name: String, + + /// Output the server configuration as JSON. + #[arg(long)] + pub json: bool, +} + +#[derive(Debug, clap::Parser)] +pub struct AddArgs { + /// Name for the MCP server configuration. + pub name: String, + + /// Environment variables to set when launching the server. + #[arg(long, value_parser = parse_env_pair, value_name = "KEY=VALUE")] + pub env: Vec<(String, String)>, + + /// Command to launch the MCP server. + #[arg(trailing_var_arg = true, num_args = 1..)] + pub command: Vec, +} + +#[derive(Debug, clap::Parser)] +pub struct RemoveArgs { + /// Name of the MCP server configuration to remove. + pub name: String, +} + +impl McpCli { + pub async fn run(self, codex_linux_sandbox_exe: Option) -> Result<()> { + let McpCli { + config_overrides, + cmd, + } = self; + let subcommand = cmd.unwrap_or(McpSubcommand::Serve); + + match subcommand { + McpSubcommand::Serve => { + codex_mcp_server::run_main(codex_linux_sandbox_exe, config_overrides).await?; + } + McpSubcommand::List(args) => { + run_list(&config_overrides, args)?; + } + McpSubcommand::Get(args) => { + run_get(&config_overrides, args)?; + } + McpSubcommand::Add(args) => { + run_add(&config_overrides, args)?; + } + McpSubcommand::Remove(args) => { + run_remove(&config_overrides, args)?; + } + } + + Ok(()) + } +} + +fn run_add(config_overrides: &CliConfigOverrides, add_args: AddArgs) -> Result<()> { + // Validate any provided overrides even though they are not currently applied. + config_overrides.parse_overrides().map_err(|e| anyhow!(e))?; + + let AddArgs { name, env, command } = add_args; + + validate_server_name(&name)?; + + let mut command_parts = command.into_iter(); + let command_bin = command_parts + .next() + .ok_or_else(|| anyhow!("command is required"))?; + let command_args: Vec = command_parts.collect(); + + let env_map = if env.is_empty() { + None + } else { + let mut map = HashMap::new(); + for (key, value) in env { + map.insert(key, value); + } + Some(map) + }; + + let codex_home = find_codex_home().context("failed to resolve CODEX_HOME")?; + let mut servers = load_global_mcp_servers(&codex_home) + .with_context(|| format!("failed to load MCP servers from {}", codex_home.display()))?; + + let new_entry = McpServerConfig { + command: command_bin, + args: command_args, + env: env_map, + startup_timeout_ms: None, + }; + + servers.insert(name.clone(), new_entry); + + write_global_mcp_servers(&codex_home, &servers) + .with_context(|| format!("failed to write MCP servers to {}", codex_home.display()))?; + + println!("Added global MCP server '{name}'."); + + Ok(()) +} + +fn run_remove(config_overrides: &CliConfigOverrides, remove_args: RemoveArgs) -> Result<()> { + config_overrides.parse_overrides().map_err(|e| anyhow!(e))?; + + let RemoveArgs { name } = remove_args; + + validate_server_name(&name)?; + + let codex_home = find_codex_home().context("failed to resolve CODEX_HOME")?; + let mut servers = load_global_mcp_servers(&codex_home) + .with_context(|| format!("failed to load MCP servers from {}", codex_home.display()))?; + + let removed = servers.remove(&name).is_some(); + + if removed { + write_global_mcp_servers(&codex_home, &servers) + .with_context(|| format!("failed to write MCP servers to {}", codex_home.display()))?; + } + + if removed { + println!("Removed global MCP server '{name}'."); + } else { + println!("No MCP server named '{name}' found."); + } + + Ok(()) +} + +fn run_list(config_overrides: &CliConfigOverrides, list_args: ListArgs) -> Result<()> { + let overrides = config_overrides.parse_overrides().map_err(|e| anyhow!(e))?; + let config = Config::load_with_cli_overrides(overrides, ConfigOverrides::default()) + .context("failed to load configuration")?; + + let mut entries: Vec<_> = config.mcp_servers.iter().collect(); + entries.sort_by(|(a, _), (b, _)| a.cmp(b)); + + if list_args.json { + let json_entries: Vec<_> = entries + .into_iter() + .map(|(name, cfg)| { + let env = cfg.env.as_ref().map(|env| { + env.iter() + .map(|(k, v)| (k.clone(), v.clone())) + .collect::>() + }); + serde_json::json!({ + "name": name, + "command": cfg.command, + "args": cfg.args, + "env": env, + "startup_timeout_ms": cfg.startup_timeout_ms, + }) + }) + .collect(); + let output = serde_json::to_string_pretty(&json_entries)?; + println!("{output}"); + return Ok(()); + } + + if entries.is_empty() { + println!("No MCP servers configured yet. Try `codex mcp add my-tool -- my-command`."); + return Ok(()); + } + + let mut rows: Vec<[String; 4]> = Vec::new(); + for (name, cfg) in entries { + let args = if cfg.args.is_empty() { + "-".to_string() + } else { + cfg.args.join(" ") + }; + + let env = match cfg.env.as_ref() { + None => "-".to_string(), + Some(map) if map.is_empty() => "-".to_string(), + Some(map) => { + let mut pairs: Vec<_> = map.iter().collect(); + pairs.sort_by(|(a, _), (b, _)| a.cmp(b)); + pairs + .into_iter() + .map(|(k, v)| format!("{k}={v}")) + .collect::>() + .join(", ") + } + }; + + rows.push([name.clone(), cfg.command.clone(), args, env]); + } + + let mut widths = ["Name".len(), "Command".len(), "Args".len(), "Env".len()]; + for row in &rows { + for (i, cell) in row.iter().enumerate() { + widths[i] = widths[i].max(cell.len()); + } + } + + println!( + "{: Result<()> { + let overrides = config_overrides.parse_overrides().map_err(|e| anyhow!(e))?; + let config = Config::load_with_cli_overrides(overrides, ConfigOverrides::default()) + .context("failed to load configuration")?; + + let Some(server) = config.mcp_servers.get(&get_args.name) else { + bail!("No MCP server named '{name}' found.", name = get_args.name); + }; + + if get_args.json { + let env = server.env.as_ref().map(|env| { + env.iter() + .map(|(k, v)| (k.clone(), v.clone())) + .collect::>() + }); + let output = serde_json::to_string_pretty(&serde_json::json!({ + "name": get_args.name, + "command": server.command, + "args": server.args, + "env": env, + "startup_timeout_ms": server.startup_timeout_ms, + }))?; + println!("{output}"); + return Ok(()); + } + + println!("{}", get_args.name); + println!(" command: {}", server.command); + let args = if server.args.is_empty() { + "-".to_string() + } else { + server.args.join(" ") + }; + println!(" args: {args}"); + let env_display = match server.env.as_ref() { + None => "-".to_string(), + Some(map) if map.is_empty() => "-".to_string(), + Some(map) => { + let mut pairs: Vec<_> = map.iter().collect(); + pairs.sort_by(|(a, _), (b, _)| a.cmp(b)); + pairs + .into_iter() + .map(|(k, v)| format!("{k}={v}")) + .collect::>() + .join(", ") + } + }; + println!(" env: {env_display}"); + if let Some(timeout) = server.startup_timeout_ms { + println!(" startup_timeout_ms: {timeout}"); + } + println!(" remove: codex mcp remove {}", get_args.name); + + Ok(()) +} + +fn parse_env_pair(raw: &str) -> Result<(String, String), String> { + let mut parts = raw.splitn(2, '='); + let key = parts + .next() + .map(str::trim) + .filter(|s| !s.is_empty()) + .ok_or_else(|| "environment entries must be in KEY=VALUE form".to_string())?; + let value = parts + .next() + .map(str::to_string) + .ok_or_else(|| "environment entries must be in KEY=VALUE form".to_string())?; + + Ok((key.to_string(), value)) +} + +fn validate_server_name(name: &str) -> Result<()> { + let is_valid = !name.is_empty() + && name + .chars() + .all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_'); + + if is_valid { + Ok(()) + } else { + bail!("invalid server name '{name}' (use letters, numbers, '-', '_')"); + } +} diff --git a/codex-rs/cli/tests/mcp_add_remove.rs b/codex-rs/cli/tests/mcp_add_remove.rs new file mode 100644 index 0000000000..9e54f0d867 --- /dev/null +++ b/codex-rs/cli/tests/mcp_add_remove.rs @@ -0,0 +1,86 @@ +use std::path::Path; + +use anyhow::Result; +use codex_core::config::load_global_mcp_servers; +use predicates::str::contains; +use pretty_assertions::assert_eq; +use tempfile::TempDir; + +fn codex_command(codex_home: &Path) -> Result { + let mut cmd = assert_cmd::Command::cargo_bin("codex")?; + cmd.env("CODEX_HOME", codex_home); + Ok(cmd) +} + +#[test] +fn add_and_remove_server_updates_global_config() -> Result<()> { + let codex_home = TempDir::new()?; + + let mut add_cmd = codex_command(codex_home.path())?; + add_cmd + .args(["mcp", "add", "docs", "--", "echo", "hello"]) + .assert() + .success() + .stdout(contains("Added global MCP server 'docs'.")); + + let servers = load_global_mcp_servers(codex_home.path())?; + assert_eq!(servers.len(), 1); + let docs = servers.get("docs").expect("server should exist"); + assert_eq!(docs.command, "echo"); + assert_eq!(docs.args, vec!["hello".to_string()]); + assert!(docs.env.is_none()); + + let mut remove_cmd = codex_command(codex_home.path())?; + remove_cmd + .args(["mcp", "remove", "docs"]) + .assert() + .success() + .stdout(contains("Removed global MCP server 'docs'.")); + + let servers = load_global_mcp_servers(codex_home.path())?; + assert!(servers.is_empty()); + + let mut remove_again_cmd = codex_command(codex_home.path())?; + remove_again_cmd + .args(["mcp", "remove", "docs"]) + .assert() + .success() + .stdout(contains("No MCP server named 'docs' found.")); + + let servers = load_global_mcp_servers(codex_home.path())?; + assert!(servers.is_empty()); + + Ok(()) +} + +#[test] +fn add_with_env_preserves_key_order_and_values() -> Result<()> { + let codex_home = TempDir::new()?; + + let mut add_cmd = codex_command(codex_home.path())?; + add_cmd + .args([ + "mcp", + "add", + "envy", + "--env", + "FOO=bar", + "--env", + "ALPHA=beta", + "--", + "python", + "server.py", + ]) + .assert() + .success(); + + let servers = load_global_mcp_servers(codex_home.path())?; + let envy = servers.get("envy").expect("server should exist"); + let env = envy.env.as_ref().expect("env should be present"); + + assert_eq!(env.len(), 2); + assert_eq!(env.get("FOO"), Some(&"bar".to_string())); + assert_eq!(env.get("ALPHA"), Some(&"beta".to_string())); + + Ok(()) +} diff --git a/codex-rs/cli/tests/mcp_list.rs b/codex-rs/cli/tests/mcp_list.rs new file mode 100644 index 0000000000..e53f42cc8f --- /dev/null +++ b/codex-rs/cli/tests/mcp_list.rs @@ -0,0 +1,106 @@ +use std::path::Path; + +use anyhow::Result; +use predicates::str::contains; +use pretty_assertions::assert_eq; +use serde_json::Value as JsonValue; +use tempfile::TempDir; + +fn codex_command(codex_home: &Path) -> Result { + let mut cmd = assert_cmd::Command::cargo_bin("codex")?; + cmd.env("CODEX_HOME", codex_home); + Ok(cmd) +} + +#[test] +fn list_shows_empty_state() -> Result<()> { + let codex_home = TempDir::new()?; + + let mut cmd = codex_command(codex_home.path())?; + let output = cmd.args(["mcp", "list"]).output()?; + assert!(output.status.success()); + let stdout = String::from_utf8(output.stdout)?; + assert!(stdout.contains("No MCP servers configured yet.")); + + Ok(()) +} + +#[test] +fn list_and_get_render_expected_output() -> Result<()> { + let codex_home = TempDir::new()?; + + let mut add = codex_command(codex_home.path())?; + add.args([ + "mcp", + "add", + "docs", + "--env", + "TOKEN=secret", + "--", + "docs-server", + "--port", + "4000", + ]) + .assert() + .success(); + + let mut list_cmd = codex_command(codex_home.path())?; + let list_output = list_cmd.args(["mcp", "list"]).output()?; + assert!(list_output.status.success()); + let stdout = String::from_utf8(list_output.stdout)?; + assert!(stdout.contains("Name")); + assert!(stdout.contains("docs")); + assert!(stdout.contains("docs-server")); + assert!(stdout.contains("TOKEN=secret")); + + let mut list_json_cmd = codex_command(codex_home.path())?; + let json_output = list_json_cmd.args(["mcp", "list", "--json"]).output()?; + assert!(json_output.status.success()); + let stdout = String::from_utf8(json_output.stdout)?; + let parsed: JsonValue = serde_json::from_str(&stdout)?; + let array = parsed.as_array().expect("expected array"); + assert_eq!(array.len(), 1); + let entry = &array[0]; + assert_eq!(entry.get("name"), Some(&JsonValue::String("docs".into()))); + assert_eq!( + entry.get("command"), + Some(&JsonValue::String("docs-server".into())) + ); + + let args = entry + .get("args") + .and_then(|v| v.as_array()) + .expect("args array"); + assert_eq!( + args, + &vec![ + JsonValue::String("--port".into()), + JsonValue::String("4000".into()) + ] + ); + + let env = entry + .get("env") + .and_then(|v| v.as_object()) + .expect("env map"); + assert_eq!(env.get("TOKEN"), Some(&JsonValue::String("secret".into()))); + + let mut get_cmd = codex_command(codex_home.path())?; + let get_output = get_cmd.args(["mcp", "get", "docs"]).output()?; + assert!(get_output.status.success()); + let stdout = String::from_utf8(get_output.stdout)?; + assert!(stdout.contains("docs")); + assert!(stdout.contains("command: docs-server")); + assert!(stdout.contains("args: --port 4000")); + assert!(stdout.contains("env: TOKEN=secret")); + assert!(stdout.contains("remove: codex mcp remove docs")); + + let mut get_json_cmd = codex_command(codex_home.path())?; + get_json_cmd + .args(["mcp", "get", "docs", "--json"]) + .assert() + .success() + .stdout(contains("\"name\": \"docs\"")); + + Ok(()) +} diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index 1b54f8b9e3..0c0d181d50 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -25,12 +25,16 @@ use codex_protocol::mcp_protocol::Tools; use codex_protocol::mcp_protocol::UserSavedConfig; use dirs::home_dir; use serde::Deserialize; +use std::collections::BTreeMap; use std::collections::HashMap; use std::path::Path; use std::path::PathBuf; use tempfile::NamedTempFile; use toml::Value as TomlValue; +use toml_edit::Array as TomlArray; use toml_edit::DocumentMut; +use toml_edit::Item as TomlItem; +use toml_edit::Table as TomlTable; const OPENAI_DEFAULT_MODEL: &str = "gpt-5"; const OPENAI_DEFAULT_REVIEW_MODEL: &str = "gpt-5"; @@ -265,6 +269,88 @@ pub fn load_config_as_toml(codex_home: &Path) -> std::io::Result { } } +pub fn load_global_mcp_servers( + codex_home: &Path, +) -> std::io::Result> { + let root_value = load_config_as_toml(codex_home)?; + let Some(servers_value) = root_value.get("mcp_servers") else { + return Ok(BTreeMap::new()); + }; + + servers_value + .clone() + .try_into() + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e)) +} + +pub fn write_global_mcp_servers( + codex_home: &Path, + servers: &BTreeMap, +) -> std::io::Result<()> { + let config_path = codex_home.join(CONFIG_TOML_FILE); + let mut doc = match std::fs::read_to_string(&config_path) { + Ok(contents) => contents + .parse::() + .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?, + Err(e) if e.kind() == std::io::ErrorKind::NotFound => DocumentMut::new(), + Err(e) => return Err(e), + }; + + doc.as_table_mut().remove("mcp_servers"); + + if !servers.is_empty() { + let mut table = TomlTable::new(); + table.set_implicit(true); + doc["mcp_servers"] = TomlItem::Table(table); + + for (name, config) in servers { + let mut entry = TomlTable::new(); + entry.set_implicit(false); + entry["command"] = toml_edit::value(config.command.clone()); + + if !config.args.is_empty() { + let mut args = TomlArray::new(); + for arg in &config.args { + args.push(arg.clone()); + } + entry["args"] = TomlItem::Value(args.into()); + } + + if let Some(env) = &config.env + && !env.is_empty() + { + let mut env_table = TomlTable::new(); + env_table.set_implicit(false); + let mut pairs: Vec<_> = env.iter().collect(); + pairs.sort_by(|(a, _), (b, _)| a.cmp(b)); + for (key, value) in pairs { + env_table.insert(key, toml_edit::value(value.clone())); + } + entry["env"] = TomlItem::Table(env_table); + } + + if let Some(timeout) = config.startup_timeout_ms { + let timeout = i64::try_from(timeout).map_err(|_| { + std::io::Error::new( + std::io::ErrorKind::InvalidData, + "startup_timeout_ms exceeds supported range", + ) + })?; + entry["startup_timeout_ms"] = toml_edit::value(timeout); + } + + doc["mcp_servers"][name.as_str()] = TomlItem::Table(entry); + } + } + + std::fs::create_dir_all(codex_home)?; + let tmp_file = NamedTempFile::new_in(codex_home)?; + std::fs::write(tmp_file.path(), doc.to_string())?; + tmp_file.persist(config_path).map_err(|err| err.error)?; + + Ok(()) +} + fn set_project_trusted_inner(doc: &mut DocumentMut, project_path: &Path) -> anyhow::Result<()> { // Ensure we render a human-friendly structure: // @@ -1162,6 +1248,47 @@ exclude_slash_tmp = true ); } + #[test] + fn load_global_mcp_servers_returns_empty_if_missing() -> anyhow::Result<()> { + let codex_home = TempDir::new()?; + + let servers = load_global_mcp_servers(codex_home.path())?; + assert!(servers.is_empty()); + + Ok(()) + } + + #[test] + fn write_global_mcp_servers_round_trips_entries() -> anyhow::Result<()> { + let codex_home = TempDir::new()?; + + let mut servers = BTreeMap::new(); + servers.insert( + "docs".to_string(), + McpServerConfig { + command: "echo".to_string(), + args: vec!["hello".to_string()], + env: None, + startup_timeout_ms: None, + }, + ); + + write_global_mcp_servers(codex_home.path(), &servers)?; + + let loaded = load_global_mcp_servers(codex_home.path())?; + assert_eq!(loaded.len(), 1); + let docs = loaded.get("docs").expect("docs entry"); + assert_eq!(docs.command, "echo"); + assert_eq!(docs.args, vec!["hello".to_string()]); + + let empty = BTreeMap::new(); + write_global_mcp_servers(codex_home.path(), &empty)?; + let loaded = load_global_mcp_servers(codex_home.path())?; + assert!(loaded.is_empty()); + + Ok(()) + } + #[tokio::test] async fn persist_model_selection_updates_defaults() -> anyhow::Result<()> { let codex_home = TempDir::new()?; diff --git a/codex-rs/docs/codex_mcp_interface.md b/codex-rs/docs/codex_mcp_interface.md new file mode 100644 index 0000000000..1b048085c3 --- /dev/null +++ b/codex-rs/docs/codex_mcp_interface.md @@ -0,0 +1,123 @@ +# Codex MCP Interface [experimental] + +This document describes Codex’s experimental MCP interface: a JSON‑RPC API that runs over the Model Context Protocol (MCP) transport to control a local Codex engine. + +- Status: experimental and subject to change without notice +- Server binary: `codex mcp` (or `codex-mcp-server`) +- Transport: standard MCP over stdio (JSON‑RPC 2.0, line‑delimited) + +## Overview + +Codex exposes a small set of MCP‑compatible methods to create and manage conversations, send user input, receive live events, and handle approval prompts. The types are defined in `protocol/src/mcp_protocol.rs` and re‑used by the MCP server implementation in `mcp-server/`. + +At a glance: + +- Conversations + - `newConversation` → start a Codex session + - `sendUserMessage` / `sendUserTurn` → send user input into a conversation + - `interruptConversation` → stop the current turn + - `listConversations`, `resumeConversation`, `archiveConversation` +- Configuration and info + - `getUserSavedConfig`, `setDefaultModel`, `getUserAgent`, `userInfo` +- Auth + - `loginApiKey`, `loginChatGpt`, `cancelLoginChatGpt`, `logoutChatGpt`, `getAuthStatus` +- Utilities + - `gitDiffToRemote`, `execOneOffCommand` +- Approvals (server → client requests) + - `applyPatchApproval`, `execCommandApproval` +- Notifications (server → client) + - `loginChatGptComplete`, `authStatusChange` + - `codex/event` stream with agent events + +See code for full type definitions and exact shapes: `protocol/src/mcp_protocol.rs`. + +## Starting the server + +Run Codex as an MCP server and connect an MCP client: + +```bash +codex mcp | your_mcp_client +``` + +For a simple inspection UI, you can also try: + +```bash +npx @modelcontextprotocol/inspector codex mcp +``` + +## Conversations + +Start a new session with optional overrides: + +Request `newConversation` params (subset): + +- `model`: string model id (e.g. "o3", "gpt-5") +- `profile`: optional named profile +- `cwd`: optional working directory +- `approvalPolicy`: `untrusted` | `on-request` | `on-failure` | `never` +- `sandbox`: `read-only` | `workspace-write` | `danger-full-access` +- `config`: map of additional config overrides +- `baseInstructions`: optional instruction override +- `includePlanTool` / `includeApplyPatchTool`: booleans + +Response: `{ conversationId, model, reasoningEffort?, rolloutPath }` + +Send input to the active turn: + +- `sendUserMessage` → enqueue items to the conversation +- `sendUserTurn` → structured turn with explicit `cwd`, `approvalPolicy`, `sandboxPolicy`, `model`, optional `effort`, and `summary` + +Interrupt a running turn: `interruptConversation`. + +List/resume/archive: `listConversations`, `resumeConversation`, `archiveConversation`. + +## Event stream + +While a conversation runs, the server sends notifications: + +- `codex/event` with the serialized Codex event payload. The shape matches `core/src/protocol.rs`’s `Event` and `EventMsg` types. Some notifications include a `_meta.requestId` to correlate with the originating request. +- Auth notifications via method names `loginChatGptComplete` and `authStatusChange`. + +Clients should render events and, when present, surface approval requests (see next section). + +## Approvals (server → client) + +When Codex needs approval to apply changes or run commands, the server issues JSON‑RPC requests to the client: + +- `applyPatchApproval { conversationId, callId, fileChanges, reason?, grantRoot? }` +- `execCommandApproval { conversationId, callId, command, cwd, reason? }` + +The client must reply with `{ decision: "allow" | "deny" }` for each request. + +## Auth helpers + +For ChatGPT or API‑key based auth flows, the server exposes helpers: + +- `loginApiKey { apiKey }` +- `loginChatGpt` → returns `{ loginId, authUrl }`; browser completes flow; then `loginChatGptComplete` notification follows +- `cancelLoginChatGpt { loginId }`, `logoutChatGpt`, `getAuthStatus { includeToken?, refreshToken? }` + +## Example: start and send a message + +```json +{ "jsonrpc": "2.0", "id": 1, "method": "newConversation", "params": { "model": "gpt-5", "approvalPolicy": "on-request" } } +``` + +Server responds: + +```json +{ "jsonrpc": "2.0", "id": 1, "result": { "conversationId": "c7b0…", "model": "gpt-5", "rolloutPath": "/path/to/rollout.jsonl" } } +``` + +Then send input: + +```json +{ "jsonrpc": "2.0", "id": 2, "method": "sendUserMessage", "params": { "conversationId": "c7b0…", "items": [{ "type": "text", "text": "Hello Codex" }] } } +``` + +While processing, the server emits `codex/event` notifications containing agent output, approvals, and status updates. + +## Compatibility and stability + +This interface is experimental. Method names, fields, and event shapes may evolve. For the authoritative schema, consult `protocol/src/mcp_protocol.rs` and the corresponding server wiring in `mcp-server/`. + diff --git a/docs/config.md b/docs/config.md index efd152aa46..6f10cb3fbd 100644 --- a/docs/config.md +++ b/docs/config.md @@ -367,6 +367,24 @@ env = { "API_KEY" = "value" } startup_timeout_ms = 20_000 ``` +You can also manage these entries from the CLI [experimental]: + +```shell +# Add a server (env can be repeated; `--` separates the launcher command) +codex mcp add docs -- docs-server --port 4000 + +# List configured servers (pretty table or JSON) +codex mcp list +codex mcp list --json + +# Show one server (table or JSON) +codex mcp get docs +codex mcp get docs --json + +# Remove a server +codex mcp remove docs +``` + ## shell_environment_policy Codex spawns subprocesses (e.g. when executing a `local_shell` tool-call suggested by the assistant). By default it now passes **your full environment** to those subprocesses. You can tune this behavior via the **`shell_environment_policy`** block in `config.toml`: From 839b2ae7cfe98e406d76087fd6cf525cb41db7b6 Mon Sep 17 00:00:00 2001 From: Ed Bayes Date: Sun, 14 Sep 2025 21:36:34 -0700 Subject: [PATCH 53/77] Change animation frames (#3627) ## Description - Changes animation frames to be smaller - Cleans up file names and popup logic ## tests - Passes local CI --- codex-rs/tui/frames/blocks/frame_000.txt | 27 ------- codex-rs/tui/frames/blocks/frame_004.txt | 27 ------- codex-rs/tui/frames/blocks/frame_008.txt | 27 ------- codex-rs/tui/frames/blocks/frame_012.txt | 27 ------- codex-rs/tui/frames/blocks/frame_016.txt | 27 ------- codex-rs/tui/frames/blocks/frame_020.txt | 27 ------- codex-rs/tui/frames/blocks/frame_024.txt | 27 ------- codex-rs/tui/frames/blocks/frame_028.txt | 27 ------- codex-rs/tui/frames/blocks/frame_032.txt | 27 ------- codex-rs/tui/frames/blocks/frame_036.txt | 27 ------- codex-rs/tui/frames/blocks/frame_040.txt | 27 ------- codex-rs/tui/frames/blocks/frame_044.txt | 27 ------- codex-rs/tui/frames/blocks/frame_048.txt | 27 ------- codex-rs/tui/frames/blocks/frame_052.txt | 27 ------- codex-rs/tui/frames/blocks/frame_056.txt | 27 ------- codex-rs/tui/frames/blocks/frame_060.txt | 27 ------- codex-rs/tui/frames/blocks/frame_064.txt | 27 ------- codex-rs/tui/frames/blocks/frame_068.txt | 27 ------- codex-rs/tui/frames/blocks/frame_072.txt | 27 ------- codex-rs/tui/frames/blocks/frame_076.txt | 27 ------- codex-rs/tui/frames/blocks/frame_080.txt | 27 ------- codex-rs/tui/frames/blocks/frame_084.txt | 27 ------- codex-rs/tui/frames/blocks/frame_088.txt | 27 ------- codex-rs/tui/frames/blocks/frame_092.txt | 27 ------- codex-rs/tui/frames/blocks/frame_096.txt | 27 ------- codex-rs/tui/frames/blocks/frame_1.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_10.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_100.txt | 27 ------- codex-rs/tui/frames/blocks/frame_104.txt | 27 ------- codex-rs/tui/frames/blocks/frame_108.txt | 27 ------- codex-rs/tui/frames/blocks/frame_11.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_112.txt | 27 ------- codex-rs/tui/frames/blocks/frame_12.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_13.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_14.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_15.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_16.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_17.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_18.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_19.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_2.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_20.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_21.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_22.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_23.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_24.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_25.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_26.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_27.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_28.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_29.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_3.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_30.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_31.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_32.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_33.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_34.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_35.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_36.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_4.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_5.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_6.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_7.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_8.txt | 17 +++++ codex-rs/tui/frames/blocks/frame_9.txt | 17 +++++ codex-rs/tui/frames/codex/frame_000.txt | 27 ------- codex-rs/tui/frames/codex/frame_004.txt | 27 ------- codex-rs/tui/frames/codex/frame_008.txt | 27 ------- codex-rs/tui/frames/codex/frame_012.txt | 27 ------- codex-rs/tui/frames/codex/frame_016.txt | 27 ------- codex-rs/tui/frames/codex/frame_020.txt | 27 ------- codex-rs/tui/frames/codex/frame_024.txt | 27 ------- codex-rs/tui/frames/codex/frame_028.txt | 27 ------- codex-rs/tui/frames/codex/frame_032.txt | 27 ------- codex-rs/tui/frames/codex/frame_036.txt | 27 ------- codex-rs/tui/frames/codex/frame_040.txt | 27 ------- codex-rs/tui/frames/codex/frame_044.txt | 27 ------- codex-rs/tui/frames/codex/frame_048.txt | 27 ------- codex-rs/tui/frames/codex/frame_052.txt | 27 ------- codex-rs/tui/frames/codex/frame_056.txt | 27 ------- codex-rs/tui/frames/codex/frame_060.txt | 27 ------- codex-rs/tui/frames/codex/frame_064.txt | 27 ------- codex-rs/tui/frames/codex/frame_068.txt | 27 ------- codex-rs/tui/frames/codex/frame_072.txt | 27 ------- codex-rs/tui/frames/codex/frame_076.txt | 27 ------- codex-rs/tui/frames/codex/frame_080.txt | 27 ------- codex-rs/tui/frames/codex/frame_084.txt | 27 ------- codex-rs/tui/frames/codex/frame_088.txt | 27 ------- codex-rs/tui/frames/codex/frame_092.txt | 27 ------- codex-rs/tui/frames/codex/frame_096.txt | 27 ------- codex-rs/tui/frames/codex/frame_1.txt | 17 +++++ codex-rs/tui/frames/codex/frame_10.txt | 17 +++++ codex-rs/tui/frames/codex/frame_100.txt | 27 ------- codex-rs/tui/frames/codex/frame_104.txt | 27 ------- codex-rs/tui/frames/codex/frame_108.txt | 27 ------- codex-rs/tui/frames/codex/frame_11.txt | 17 +++++ codex-rs/tui/frames/codex/frame_112.txt | 27 ------- codex-rs/tui/frames/codex/frame_12.txt | 17 +++++ codex-rs/tui/frames/codex/frame_13.txt | 17 +++++ codex-rs/tui/frames/codex/frame_14.txt | 17 +++++ codex-rs/tui/frames/codex/frame_15.txt | 17 +++++ codex-rs/tui/frames/codex/frame_16.txt | 17 +++++ codex-rs/tui/frames/codex/frame_17.txt | 17 +++++ codex-rs/tui/frames/codex/frame_18.txt | 17 +++++ codex-rs/tui/frames/codex/frame_19.txt | 17 +++++ codex-rs/tui/frames/codex/frame_2.txt | 17 +++++ codex-rs/tui/frames/codex/frame_20.txt | 17 +++++ codex-rs/tui/frames/codex/frame_21.txt | 17 +++++ codex-rs/tui/frames/codex/frame_22.txt | 17 +++++ codex-rs/tui/frames/codex/frame_23.txt | 17 +++++ codex-rs/tui/frames/codex/frame_24.txt | 17 +++++ codex-rs/tui/frames/codex/frame_25.txt | 17 +++++ codex-rs/tui/frames/codex/frame_26.txt | 17 +++++ codex-rs/tui/frames/codex/frame_27.txt | 17 +++++ codex-rs/tui/frames/codex/frame_28.txt | 17 +++++ codex-rs/tui/frames/codex/frame_29.txt | 17 +++++ codex-rs/tui/frames/codex/frame_3.txt | 17 +++++ codex-rs/tui/frames/codex/frame_30.txt | 17 +++++ codex-rs/tui/frames/codex/frame_31.txt | 17 +++++ codex-rs/tui/frames/codex/frame_32.txt | 17 +++++ codex-rs/tui/frames/codex/frame_33.txt | 17 +++++ codex-rs/tui/frames/codex/frame_34.txt | 17 +++++ codex-rs/tui/frames/codex/frame_35.txt | 17 +++++ codex-rs/tui/frames/codex/frame_36.txt | 17 +++++ codex-rs/tui/frames/codex/frame_4.txt | 17 +++++ codex-rs/tui/frames/codex/frame_5.txt | 17 +++++ codex-rs/tui/frames/codex/frame_6.txt | 17 +++++ codex-rs/tui/frames/codex/frame_7.txt | 17 +++++ codex-rs/tui/frames/codex/frame_8.txt | 17 +++++ codex-rs/tui/frames/codex/frame_9.txt | 17 +++++ codex-rs/tui/frames/default/frame_000.txt | 27 ------- codex-rs/tui/frames/default/frame_004.txt | 27 ------- codex-rs/tui/frames/default/frame_008.txt | 27 ------- codex-rs/tui/frames/default/frame_012.txt | 27 ------- codex-rs/tui/frames/default/frame_016.txt | 27 ------- codex-rs/tui/frames/default/frame_020.txt | 27 ------- codex-rs/tui/frames/default/frame_024.txt | 27 ------- codex-rs/tui/frames/default/frame_028.txt | 27 ------- codex-rs/tui/frames/default/frame_032.txt | 27 ------- codex-rs/tui/frames/default/frame_036.txt | 27 ------- codex-rs/tui/frames/default/frame_040.txt | 27 ------- codex-rs/tui/frames/default/frame_044.txt | 27 ------- codex-rs/tui/frames/default/frame_048.txt | 27 ------- codex-rs/tui/frames/default/frame_052.txt | 27 ------- codex-rs/tui/frames/default/frame_056.txt | 27 ------- codex-rs/tui/frames/default/frame_060.txt | 27 ------- codex-rs/tui/frames/default/frame_064.txt | 27 ------- codex-rs/tui/frames/default/frame_068.txt | 27 ------- codex-rs/tui/frames/default/frame_072.txt | 27 ------- codex-rs/tui/frames/default/frame_076.txt | 27 ------- codex-rs/tui/frames/default/frame_080.txt | 27 ------- codex-rs/tui/frames/default/frame_084.txt | 27 ------- codex-rs/tui/frames/default/frame_088.txt | 27 ------- codex-rs/tui/frames/default/frame_092.txt | 27 ------- codex-rs/tui/frames/default/frame_096.txt | 27 ------- codex-rs/tui/frames/default/frame_1.txt | 17 +++++ codex-rs/tui/frames/default/frame_10.txt | 17 +++++ codex-rs/tui/frames/default/frame_100.txt | 27 ------- codex-rs/tui/frames/default/frame_104.txt | 27 ------- codex-rs/tui/frames/default/frame_108.txt | 27 ------- codex-rs/tui/frames/default/frame_11.txt | 17 +++++ codex-rs/tui/frames/default/frame_112.txt | 27 ------- codex-rs/tui/frames/default/frame_12.txt | 17 +++++ codex-rs/tui/frames/default/frame_13.txt | 17 +++++ codex-rs/tui/frames/default/frame_14.txt | 17 +++++ codex-rs/tui/frames/default/frame_15.txt | 17 +++++ codex-rs/tui/frames/default/frame_16.txt | 17 +++++ codex-rs/tui/frames/default/frame_17.txt | 17 +++++ codex-rs/tui/frames/default/frame_18.txt | 17 +++++ codex-rs/tui/frames/default/frame_19.txt | 17 +++++ codex-rs/tui/frames/default/frame_2.txt | 17 +++++ codex-rs/tui/frames/default/frame_20.txt | 17 +++++ codex-rs/tui/frames/default/frame_21.txt | 17 +++++ codex-rs/tui/frames/default/frame_22.txt | 17 +++++ codex-rs/tui/frames/default/frame_23.txt | 17 +++++ codex-rs/tui/frames/default/frame_24.txt | 17 +++++ codex-rs/tui/frames/default/frame_25.txt | 17 +++++ codex-rs/tui/frames/default/frame_26.txt | 17 +++++ codex-rs/tui/frames/default/frame_27.txt | 17 +++++ codex-rs/tui/frames/default/frame_28.txt | 17 +++++ codex-rs/tui/frames/default/frame_29.txt | 17 +++++ codex-rs/tui/frames/default/frame_3.txt | 17 +++++ codex-rs/tui/frames/default/frame_30.txt | 17 +++++ codex-rs/tui/frames/default/frame_31.txt | 17 +++++ codex-rs/tui/frames/default/frame_32.txt | 17 +++++ codex-rs/tui/frames/default/frame_33.txt | 17 +++++ codex-rs/tui/frames/default/frame_34.txt | 17 +++++ codex-rs/tui/frames/default/frame_35.txt | 17 +++++ codex-rs/tui/frames/default/frame_36.txt | 17 +++++ codex-rs/tui/frames/default/frame_4.txt | 17 +++++ codex-rs/tui/frames/default/frame_5.txt | 17 +++++ codex-rs/tui/frames/default/frame_6.txt | 17 +++++ codex-rs/tui/frames/default/frame_7.txt | 17 +++++ codex-rs/tui/frames/default/frame_8.txt | 17 +++++ codex-rs/tui/frames/default/frame_9.txt | 17 +++++ codex-rs/tui/frames/dots/frame_000.txt | 27 ------- codex-rs/tui/frames/dots/frame_004.txt | 27 ------- codex-rs/tui/frames/dots/frame_008.txt | 27 ------- codex-rs/tui/frames/dots/frame_012.txt | 27 ------- codex-rs/tui/frames/dots/frame_016.txt | 27 ------- codex-rs/tui/frames/dots/frame_020.txt | 27 ------- codex-rs/tui/frames/dots/frame_024.txt | 27 ------- codex-rs/tui/frames/dots/frame_028.txt | 27 ------- codex-rs/tui/frames/dots/frame_032.txt | 27 ------- codex-rs/tui/frames/dots/frame_036.txt | 27 ------- codex-rs/tui/frames/dots/frame_040.txt | 27 ------- codex-rs/tui/frames/dots/frame_044.txt | 27 ------- codex-rs/tui/frames/dots/frame_048.txt | 27 ------- codex-rs/tui/frames/dots/frame_052.txt | 27 ------- codex-rs/tui/frames/dots/frame_056.txt | 27 ------- codex-rs/tui/frames/dots/frame_060.txt | 27 ------- codex-rs/tui/frames/dots/frame_064.txt | 27 ------- codex-rs/tui/frames/dots/frame_068.txt | 27 ------- codex-rs/tui/frames/dots/frame_072.txt | 27 ------- codex-rs/tui/frames/dots/frame_076.txt | 27 ------- codex-rs/tui/frames/dots/frame_080.txt | 27 ------- codex-rs/tui/frames/dots/frame_084.txt | 27 ------- codex-rs/tui/frames/dots/frame_088.txt | 27 ------- codex-rs/tui/frames/dots/frame_092.txt | 27 ------- codex-rs/tui/frames/dots/frame_096.txt | 27 ------- codex-rs/tui/frames/dots/frame_1.txt | 17 +++++ codex-rs/tui/frames/dots/frame_10.txt | 17 +++++ codex-rs/tui/frames/dots/frame_100.txt | 27 ------- codex-rs/tui/frames/dots/frame_104.txt | 27 ------- codex-rs/tui/frames/dots/frame_108.txt | 27 ------- codex-rs/tui/frames/dots/frame_11.txt | 17 +++++ codex-rs/tui/frames/dots/frame_112.txt | 27 ------- codex-rs/tui/frames/dots/frame_12.txt | 17 +++++ codex-rs/tui/frames/dots/frame_13.txt | 17 +++++ codex-rs/tui/frames/dots/frame_14.txt | 17 +++++ codex-rs/tui/frames/dots/frame_15.txt | 17 +++++ codex-rs/tui/frames/dots/frame_16.txt | 17 +++++ codex-rs/tui/frames/dots/frame_17.txt | 17 +++++ codex-rs/tui/frames/dots/frame_18.txt | 17 +++++ codex-rs/tui/frames/dots/frame_19.txt | 17 +++++ codex-rs/tui/frames/dots/frame_2.txt | 17 +++++ codex-rs/tui/frames/dots/frame_20.txt | 17 +++++ codex-rs/tui/frames/dots/frame_21.txt | 17 +++++ codex-rs/tui/frames/dots/frame_22.txt | 17 +++++ codex-rs/tui/frames/dots/frame_23.txt | 17 +++++ codex-rs/tui/frames/dots/frame_24.txt | 17 +++++ codex-rs/tui/frames/dots/frame_25.txt | 17 +++++ codex-rs/tui/frames/dots/frame_26.txt | 17 +++++ codex-rs/tui/frames/dots/frame_27.txt | 17 +++++ codex-rs/tui/frames/dots/frame_28.txt | 17 +++++ codex-rs/tui/frames/dots/frame_29.txt | 17 +++++ codex-rs/tui/frames/dots/frame_3.txt | 17 +++++ codex-rs/tui/frames/dots/frame_30.txt | 17 +++++ codex-rs/tui/frames/dots/frame_31.txt | 17 +++++ codex-rs/tui/frames/dots/frame_32.txt | 17 +++++ codex-rs/tui/frames/dots/frame_33.txt | 17 +++++ codex-rs/tui/frames/dots/frame_34.txt | 17 +++++ codex-rs/tui/frames/dots/frame_35.txt | 17 +++++ codex-rs/tui/frames/dots/frame_36.txt | 17 +++++ codex-rs/tui/frames/dots/frame_4.txt | 17 +++++ codex-rs/tui/frames/dots/frame_5.txt | 17 +++++ codex-rs/tui/frames/dots/frame_6.txt | 17 +++++ codex-rs/tui/frames/dots/frame_7.txt | 17 +++++ codex-rs/tui/frames/dots/frame_8.txt | 17 +++++ codex-rs/tui/frames/dots/frame_9.txt | 17 +++++ codex-rs/tui/frames/hash/frame_000.txt | 27 ------- codex-rs/tui/frames/hash/frame_004.txt | 27 ------- codex-rs/tui/frames/hash/frame_008.txt | 27 ------- codex-rs/tui/frames/hash/frame_012.txt | 27 ------- codex-rs/tui/frames/hash/frame_016.txt | 27 ------- codex-rs/tui/frames/hash/frame_020.txt | 27 ------- codex-rs/tui/frames/hash/frame_024.txt | 27 ------- codex-rs/tui/frames/hash/frame_028.txt | 27 ------- codex-rs/tui/frames/hash/frame_032.txt | 27 ------- codex-rs/tui/frames/hash/frame_036.txt | 27 ------- codex-rs/tui/frames/hash/frame_040.txt | 27 ------- codex-rs/tui/frames/hash/frame_044.txt | 27 ------- codex-rs/tui/frames/hash/frame_048.txt | 27 ------- codex-rs/tui/frames/hash/frame_052.txt | 27 ------- codex-rs/tui/frames/hash/frame_056.txt | 27 ------- codex-rs/tui/frames/hash/frame_060.txt | 27 ------- codex-rs/tui/frames/hash/frame_064.txt | 27 ------- codex-rs/tui/frames/hash/frame_068.txt | 27 ------- codex-rs/tui/frames/hash/frame_072.txt | 27 ------- codex-rs/tui/frames/hash/frame_076.txt | 27 ------- codex-rs/tui/frames/hash/frame_080.txt | 27 ------- codex-rs/tui/frames/hash/frame_084.txt | 27 ------- codex-rs/tui/frames/hash/frame_088.txt | 27 ------- codex-rs/tui/frames/hash/frame_092.txt | 27 ------- codex-rs/tui/frames/hash/frame_096.txt | 27 ------- codex-rs/tui/frames/hash/frame_1.txt | 17 +++++ codex-rs/tui/frames/hash/frame_10.txt | 17 +++++ codex-rs/tui/frames/hash/frame_100.txt | 27 ------- codex-rs/tui/frames/hash/frame_104.txt | 27 ------- codex-rs/tui/frames/hash/frame_108.txt | 27 ------- codex-rs/tui/frames/hash/frame_11.txt | 17 +++++ codex-rs/tui/frames/hash/frame_112.txt | 27 ------- codex-rs/tui/frames/hash/frame_12.txt | 17 +++++ codex-rs/tui/frames/hash/frame_13.txt | 17 +++++ codex-rs/tui/frames/hash/frame_14.txt | 17 +++++ codex-rs/tui/frames/hash/frame_15.txt | 17 +++++ codex-rs/tui/frames/hash/frame_16.txt | 17 +++++ codex-rs/tui/frames/hash/frame_17.txt | 17 +++++ codex-rs/tui/frames/hash/frame_18.txt | 17 +++++ codex-rs/tui/frames/hash/frame_19.txt | 17 +++++ codex-rs/tui/frames/hash/frame_2.txt | 17 +++++ codex-rs/tui/frames/hash/frame_20.txt | 17 +++++ codex-rs/tui/frames/hash/frame_21.txt | 17 +++++ codex-rs/tui/frames/hash/frame_22.txt | 17 +++++ codex-rs/tui/frames/hash/frame_23.txt | 17 +++++ codex-rs/tui/frames/hash/frame_24.txt | 17 +++++ codex-rs/tui/frames/hash/frame_25.txt | 17 +++++ codex-rs/tui/frames/hash/frame_26.txt | 17 +++++ codex-rs/tui/frames/hash/frame_27.txt | 17 +++++ codex-rs/tui/frames/hash/frame_28.txt | 17 +++++ codex-rs/tui/frames/hash/frame_29.txt | 17 +++++ codex-rs/tui/frames/hash/frame_3.txt | 17 +++++ codex-rs/tui/frames/hash/frame_30.txt | 17 +++++ codex-rs/tui/frames/hash/frame_31.txt | 17 +++++ codex-rs/tui/frames/hash/frame_32.txt | 17 +++++ codex-rs/tui/frames/hash/frame_33.txt | 17 +++++ codex-rs/tui/frames/hash/frame_34.txt | 17 +++++ codex-rs/tui/frames/hash/frame_35.txt | 17 +++++ codex-rs/tui/frames/hash/frame_36.txt | 17 +++++ codex-rs/tui/frames/hash/frame_4.txt | 17 +++++ codex-rs/tui/frames/hash/frame_5.txt | 17 +++++ codex-rs/tui/frames/hash/frame_6.txt | 17 +++++ codex-rs/tui/frames/hash/frame_7.txt | 17 +++++ codex-rs/tui/frames/hash/frame_8.txt | 17 +++++ codex-rs/tui/frames/hash/frame_9.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_000.txt | 27 ------- codex-rs/tui/frames/hbars/frame_004.txt | 27 ------- codex-rs/tui/frames/hbars/frame_008.txt | 27 ------- codex-rs/tui/frames/hbars/frame_012.txt | 27 ------- codex-rs/tui/frames/hbars/frame_016.txt | 27 ------- codex-rs/tui/frames/hbars/frame_020.txt | 27 ------- codex-rs/tui/frames/hbars/frame_024.txt | 27 ------- codex-rs/tui/frames/hbars/frame_028.txt | 27 ------- codex-rs/tui/frames/hbars/frame_032.txt | 27 ------- codex-rs/tui/frames/hbars/frame_036.txt | 27 ------- codex-rs/tui/frames/hbars/frame_040.txt | 27 ------- codex-rs/tui/frames/hbars/frame_044.txt | 27 ------- codex-rs/tui/frames/hbars/frame_048.txt | 27 ------- codex-rs/tui/frames/hbars/frame_052.txt | 27 ------- codex-rs/tui/frames/hbars/frame_056.txt | 27 ------- codex-rs/tui/frames/hbars/frame_060.txt | 27 ------- codex-rs/tui/frames/hbars/frame_064.txt | 27 ------- codex-rs/tui/frames/hbars/frame_068.txt | 27 ------- codex-rs/tui/frames/hbars/frame_072.txt | 27 ------- codex-rs/tui/frames/hbars/frame_076.txt | 27 ------- codex-rs/tui/frames/hbars/frame_080.txt | 27 ------- codex-rs/tui/frames/hbars/frame_084.txt | 27 ------- codex-rs/tui/frames/hbars/frame_088.txt | 27 ------- codex-rs/tui/frames/hbars/frame_092.txt | 27 ------- codex-rs/tui/frames/hbars/frame_096.txt | 27 ------- codex-rs/tui/frames/hbars/frame_1.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_10.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_100.txt | 27 ------- codex-rs/tui/frames/hbars/frame_104.txt | 27 ------- codex-rs/tui/frames/hbars/frame_108.txt | 27 ------- codex-rs/tui/frames/hbars/frame_11.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_112.txt | 27 ------- codex-rs/tui/frames/hbars/frame_12.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_13.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_14.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_15.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_16.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_17.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_18.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_19.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_2.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_20.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_21.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_22.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_23.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_24.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_25.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_26.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_27.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_28.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_29.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_3.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_30.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_31.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_32.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_33.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_34.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_35.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_36.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_4.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_5.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_6.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_7.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_8.txt | 17 +++++ codex-rs/tui/frames/hbars/frame_9.txt | 17 +++++ codex-rs/tui/frames/openai/frame_000.txt | 27 ------- codex-rs/tui/frames/openai/frame_004.txt | 27 ------- codex-rs/tui/frames/openai/frame_008.txt | 27 ------- codex-rs/tui/frames/openai/frame_012.txt | 27 ------- codex-rs/tui/frames/openai/frame_016.txt | 27 ------- codex-rs/tui/frames/openai/frame_020.txt | 27 ------- codex-rs/tui/frames/openai/frame_024.txt | 27 ------- codex-rs/tui/frames/openai/frame_028.txt | 27 ------- codex-rs/tui/frames/openai/frame_032.txt | 27 ------- codex-rs/tui/frames/openai/frame_036.txt | 27 ------- codex-rs/tui/frames/openai/frame_040.txt | 27 ------- codex-rs/tui/frames/openai/frame_044.txt | 27 ------- codex-rs/tui/frames/openai/frame_048.txt | 27 ------- codex-rs/tui/frames/openai/frame_052.txt | 27 ------- codex-rs/tui/frames/openai/frame_056.txt | 27 ------- codex-rs/tui/frames/openai/frame_060.txt | 27 ------- codex-rs/tui/frames/openai/frame_064.txt | 27 ------- codex-rs/tui/frames/openai/frame_068.txt | 27 ------- codex-rs/tui/frames/openai/frame_072.txt | 27 ------- codex-rs/tui/frames/openai/frame_076.txt | 27 ------- codex-rs/tui/frames/openai/frame_080.txt | 27 ------- codex-rs/tui/frames/openai/frame_084.txt | 27 ------- codex-rs/tui/frames/openai/frame_088.txt | 27 ------- codex-rs/tui/frames/openai/frame_092.txt | 27 ------- codex-rs/tui/frames/openai/frame_096.txt | 27 ------- codex-rs/tui/frames/openai/frame_1.txt | 17 +++++ codex-rs/tui/frames/openai/frame_10.txt | 17 +++++ codex-rs/tui/frames/openai/frame_100.txt | 27 ------- codex-rs/tui/frames/openai/frame_104.txt | 27 ------- codex-rs/tui/frames/openai/frame_108.txt | 27 ------- codex-rs/tui/frames/openai/frame_11.txt | 17 +++++ codex-rs/tui/frames/openai/frame_112.txt | 27 ------- codex-rs/tui/frames/openai/frame_12.txt | 17 +++++ codex-rs/tui/frames/openai/frame_13.txt | 17 +++++ codex-rs/tui/frames/openai/frame_14.txt | 17 +++++ codex-rs/tui/frames/openai/frame_15.txt | 17 +++++ codex-rs/tui/frames/openai/frame_16.txt | 17 +++++ codex-rs/tui/frames/openai/frame_17.txt | 17 +++++ codex-rs/tui/frames/openai/frame_18.txt | 17 +++++ codex-rs/tui/frames/openai/frame_19.txt | 17 +++++ codex-rs/tui/frames/openai/frame_2.txt | 17 +++++ codex-rs/tui/frames/openai/frame_20.txt | 17 +++++ codex-rs/tui/frames/openai/frame_21.txt | 17 +++++ codex-rs/tui/frames/openai/frame_22.txt | 17 +++++ codex-rs/tui/frames/openai/frame_23.txt | 17 +++++ codex-rs/tui/frames/openai/frame_24.txt | 17 +++++ codex-rs/tui/frames/openai/frame_25.txt | 17 +++++ codex-rs/tui/frames/openai/frame_26.txt | 17 +++++ codex-rs/tui/frames/openai/frame_27.txt | 17 +++++ codex-rs/tui/frames/openai/frame_28.txt | 17 +++++ codex-rs/tui/frames/openai/frame_29.txt | 17 +++++ codex-rs/tui/frames/openai/frame_3.txt | 17 +++++ codex-rs/tui/frames/openai/frame_30.txt | 17 +++++ codex-rs/tui/frames/openai/frame_31.txt | 17 +++++ codex-rs/tui/frames/openai/frame_32.txt | 17 +++++ codex-rs/tui/frames/openai/frame_33.txt | 17 +++++ codex-rs/tui/frames/openai/frame_34.txt | 17 +++++ codex-rs/tui/frames/openai/frame_35.txt | 17 +++++ codex-rs/tui/frames/openai/frame_36.txt | 17 +++++ codex-rs/tui/frames/openai/frame_4.txt | 17 +++++ codex-rs/tui/frames/openai/frame_5.txt | 17 +++++ codex-rs/tui/frames/openai/frame_6.txt | 17 +++++ codex-rs/tui/frames/openai/frame_7.txt | 17 +++++ codex-rs/tui/frames/openai/frame_8.txt | 17 +++++ codex-rs/tui/frames/openai/frame_9.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_000.txt | 27 ------- codex-rs/tui/frames/shapes/frame_004.txt | 27 ------- codex-rs/tui/frames/shapes/frame_008.txt | 27 ------- codex-rs/tui/frames/shapes/frame_012.txt | 27 ------- codex-rs/tui/frames/shapes/frame_016.txt | 27 ------- codex-rs/tui/frames/shapes/frame_020.txt | 27 ------- codex-rs/tui/frames/shapes/frame_024.txt | 27 ------- codex-rs/tui/frames/shapes/frame_028.txt | 27 ------- codex-rs/tui/frames/shapes/frame_032.txt | 27 ------- codex-rs/tui/frames/shapes/frame_036.txt | 27 ------- codex-rs/tui/frames/shapes/frame_040.txt | 27 ------- codex-rs/tui/frames/shapes/frame_044.txt | 27 ------- codex-rs/tui/frames/shapes/frame_048.txt | 27 ------- codex-rs/tui/frames/shapes/frame_052.txt | 27 ------- codex-rs/tui/frames/shapes/frame_056.txt | 27 ------- codex-rs/tui/frames/shapes/frame_060.txt | 27 ------- codex-rs/tui/frames/shapes/frame_064.txt | 27 ------- codex-rs/tui/frames/shapes/frame_068.txt | 27 ------- codex-rs/tui/frames/shapes/frame_072.txt | 27 ------- codex-rs/tui/frames/shapes/frame_076.txt | 27 ------- codex-rs/tui/frames/shapes/frame_080.txt | 27 ------- codex-rs/tui/frames/shapes/frame_084.txt | 27 ------- codex-rs/tui/frames/shapes/frame_088.txt | 27 ------- codex-rs/tui/frames/shapes/frame_092.txt | 27 ------- codex-rs/tui/frames/shapes/frame_096.txt | 27 ------- codex-rs/tui/frames/shapes/frame_1.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_10.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_100.txt | 27 ------- codex-rs/tui/frames/shapes/frame_104.txt | 27 ------- codex-rs/tui/frames/shapes/frame_108.txt | 27 ------- codex-rs/tui/frames/shapes/frame_11.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_112.txt | 27 ------- codex-rs/tui/frames/shapes/frame_12.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_13.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_14.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_15.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_16.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_17.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_18.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_19.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_2.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_20.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_21.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_22.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_23.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_24.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_25.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_26.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_27.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_28.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_29.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_3.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_30.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_31.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_32.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_33.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_34.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_35.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_36.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_4.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_5.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_6.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_7.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_8.txt | 17 +++++ codex-rs/tui/frames/shapes/frame_9.txt | 17 +++++ codex-rs/tui/frames/slug/frame_000.txt | 27 ------- codex-rs/tui/frames/slug/frame_004.txt | 27 ------- codex-rs/tui/frames/slug/frame_008.txt | 27 ------- codex-rs/tui/frames/slug/frame_012.txt | 27 ------- codex-rs/tui/frames/slug/frame_016.txt | 27 ------- codex-rs/tui/frames/slug/frame_020.txt | 27 ------- codex-rs/tui/frames/slug/frame_024.txt | 27 ------- codex-rs/tui/frames/slug/frame_028.txt | 27 ------- codex-rs/tui/frames/slug/frame_032.txt | 27 ------- codex-rs/tui/frames/slug/frame_036.txt | 27 ------- codex-rs/tui/frames/slug/frame_040.txt | 27 ------- codex-rs/tui/frames/slug/frame_044.txt | 27 ------- codex-rs/tui/frames/slug/frame_048.txt | 27 ------- codex-rs/tui/frames/slug/frame_052.txt | 27 ------- codex-rs/tui/frames/slug/frame_056.txt | 27 ------- codex-rs/tui/frames/slug/frame_060.txt | 27 ------- codex-rs/tui/frames/slug/frame_064.txt | 27 ------- codex-rs/tui/frames/slug/frame_068.txt | 27 ------- codex-rs/tui/frames/slug/frame_072.txt | 27 ------- codex-rs/tui/frames/slug/frame_076.txt | 27 ------- codex-rs/tui/frames/slug/frame_080.txt | 27 ------- codex-rs/tui/frames/slug/frame_084.txt | 27 ------- codex-rs/tui/frames/slug/frame_088.txt | 27 ------- codex-rs/tui/frames/slug/frame_092.txt | 27 ------- codex-rs/tui/frames/slug/frame_096.txt | 27 ------- codex-rs/tui/frames/slug/frame_1.txt | 17 +++++ codex-rs/tui/frames/slug/frame_10.txt | 17 +++++ codex-rs/tui/frames/slug/frame_100.txt | 27 ------- codex-rs/tui/frames/slug/frame_104.txt | 27 ------- codex-rs/tui/frames/slug/frame_108.txt | 27 ------- codex-rs/tui/frames/slug/frame_11.txt | 17 +++++ codex-rs/tui/frames/slug/frame_112.txt | 27 ------- codex-rs/tui/frames/slug/frame_12.txt | 17 +++++ codex-rs/tui/frames/slug/frame_13.txt | 17 +++++ codex-rs/tui/frames/slug/frame_14.txt | 17 +++++ codex-rs/tui/frames/slug/frame_15.txt | 17 +++++ codex-rs/tui/frames/slug/frame_16.txt | 17 +++++ codex-rs/tui/frames/slug/frame_17.txt | 17 +++++ codex-rs/tui/frames/slug/frame_18.txt | 17 +++++ codex-rs/tui/frames/slug/frame_19.txt | 17 +++++ codex-rs/tui/frames/slug/frame_2.txt | 17 +++++ codex-rs/tui/frames/slug/frame_20.txt | 17 +++++ codex-rs/tui/frames/slug/frame_21.txt | 17 +++++ codex-rs/tui/frames/slug/frame_22.txt | 17 +++++ codex-rs/tui/frames/slug/frame_23.txt | 17 +++++ codex-rs/tui/frames/slug/frame_24.txt | 17 +++++ codex-rs/tui/frames/slug/frame_25.txt | 17 +++++ codex-rs/tui/frames/slug/frame_26.txt | 17 +++++ codex-rs/tui/frames/slug/frame_27.txt | 17 +++++ codex-rs/tui/frames/slug/frame_28.txt | 17 +++++ codex-rs/tui/frames/slug/frame_29.txt | 17 +++++ codex-rs/tui/frames/slug/frame_3.txt | 17 +++++ codex-rs/tui/frames/slug/frame_30.txt | 17 +++++ codex-rs/tui/frames/slug/frame_31.txt | 17 +++++ codex-rs/tui/frames/slug/frame_32.txt | 17 +++++ codex-rs/tui/frames/slug/frame_33.txt | 17 +++++ codex-rs/tui/frames/slug/frame_34.txt | 17 +++++ codex-rs/tui/frames/slug/frame_35.txt | 17 +++++ codex-rs/tui/frames/slug/frame_36.txt | 17 +++++ codex-rs/tui/frames/slug/frame_4.txt | 17 +++++ codex-rs/tui/frames/slug/frame_5.txt | 17 +++++ codex-rs/tui/frames/slug/frame_6.txt | 17 +++++ codex-rs/tui/frames/slug/frame_7.txt | 17 +++++ codex-rs/tui/frames/slug/frame_8.txt | 17 +++++ codex-rs/tui/frames/slug/frame_9.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_000.txt | 27 ------- codex-rs/tui/frames/vbars/frame_004.txt | 27 ------- codex-rs/tui/frames/vbars/frame_008.txt | 27 ------- codex-rs/tui/frames/vbars/frame_012.txt | 27 ------- codex-rs/tui/frames/vbars/frame_016.txt | 27 ------- codex-rs/tui/frames/vbars/frame_020.txt | 27 ------- codex-rs/tui/frames/vbars/frame_024.txt | 27 ------- codex-rs/tui/frames/vbars/frame_028.txt | 27 ------- codex-rs/tui/frames/vbars/frame_032.txt | 27 ------- codex-rs/tui/frames/vbars/frame_036.txt | 27 ------- codex-rs/tui/frames/vbars/frame_040.txt | 27 ------- codex-rs/tui/frames/vbars/frame_044.txt | 27 ------- codex-rs/tui/frames/vbars/frame_048.txt | 27 ------- codex-rs/tui/frames/vbars/frame_052.txt | 27 ------- codex-rs/tui/frames/vbars/frame_056.txt | 27 ------- codex-rs/tui/frames/vbars/frame_060.txt | 27 ------- codex-rs/tui/frames/vbars/frame_064.txt | 27 ------- codex-rs/tui/frames/vbars/frame_068.txt | 27 ------- codex-rs/tui/frames/vbars/frame_072.txt | 27 ------- codex-rs/tui/frames/vbars/frame_076.txt | 27 ------- codex-rs/tui/frames/vbars/frame_080.txt | 27 ------- codex-rs/tui/frames/vbars/frame_084.txt | 27 ------- codex-rs/tui/frames/vbars/frame_088.txt | 27 ------- codex-rs/tui/frames/vbars/frame_092.txt | 27 ------- codex-rs/tui/frames/vbars/frame_096.txt | 27 ------- codex-rs/tui/frames/vbars/frame_1.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_10.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_100.txt | 27 ------- codex-rs/tui/frames/vbars/frame_104.txt | 27 ------- codex-rs/tui/frames/vbars/frame_108.txt | 27 ------- codex-rs/tui/frames/vbars/frame_11.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_112.txt | 27 ------- codex-rs/tui/frames/vbars/frame_12.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_13.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_14.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_15.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_16.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_17.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_18.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_19.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_2.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_20.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_21.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_22.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_23.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_24.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_25.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_26.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_27.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_28.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_29.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_3.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_30.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_31.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_32.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_33.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_34.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_35.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_36.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_4.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_5.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_6.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_7.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_8.txt | 17 +++++ codex-rs/tui/frames/vbars/frame_9.txt | 17 +++++ codex-rs/tui/src/new_model_popup.rs | 85 ++++++++++++----------- 651 files changed, 6166 insertions(+), 7869 deletions(-) delete mode 100644 codex-rs/tui/frames/blocks/frame_000.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_004.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_008.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_012.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_016.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_020.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_024.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_028.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_032.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_036.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_040.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_044.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_048.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_052.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_056.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_060.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_064.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_068.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_072.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_076.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_080.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_084.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_088.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_092.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_096.txt create mode 100644 codex-rs/tui/frames/blocks/frame_1.txt create mode 100644 codex-rs/tui/frames/blocks/frame_10.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_100.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_104.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_108.txt create mode 100644 codex-rs/tui/frames/blocks/frame_11.txt delete mode 100644 codex-rs/tui/frames/blocks/frame_112.txt create mode 100644 codex-rs/tui/frames/blocks/frame_12.txt create mode 100644 codex-rs/tui/frames/blocks/frame_13.txt create mode 100644 codex-rs/tui/frames/blocks/frame_14.txt create mode 100644 codex-rs/tui/frames/blocks/frame_15.txt create mode 100644 codex-rs/tui/frames/blocks/frame_16.txt create mode 100644 codex-rs/tui/frames/blocks/frame_17.txt create mode 100644 codex-rs/tui/frames/blocks/frame_18.txt create mode 100644 codex-rs/tui/frames/blocks/frame_19.txt create mode 100644 codex-rs/tui/frames/blocks/frame_2.txt create mode 100644 codex-rs/tui/frames/blocks/frame_20.txt create mode 100644 codex-rs/tui/frames/blocks/frame_21.txt create mode 100644 codex-rs/tui/frames/blocks/frame_22.txt create mode 100644 codex-rs/tui/frames/blocks/frame_23.txt create mode 100644 codex-rs/tui/frames/blocks/frame_24.txt create mode 100644 codex-rs/tui/frames/blocks/frame_25.txt create mode 100644 codex-rs/tui/frames/blocks/frame_26.txt create mode 100644 codex-rs/tui/frames/blocks/frame_27.txt create mode 100644 codex-rs/tui/frames/blocks/frame_28.txt create mode 100644 codex-rs/tui/frames/blocks/frame_29.txt create mode 100644 codex-rs/tui/frames/blocks/frame_3.txt create mode 100644 codex-rs/tui/frames/blocks/frame_30.txt create mode 100644 codex-rs/tui/frames/blocks/frame_31.txt create mode 100644 codex-rs/tui/frames/blocks/frame_32.txt create mode 100644 codex-rs/tui/frames/blocks/frame_33.txt create mode 100644 codex-rs/tui/frames/blocks/frame_34.txt create mode 100644 codex-rs/tui/frames/blocks/frame_35.txt create mode 100644 codex-rs/tui/frames/blocks/frame_36.txt create mode 100644 codex-rs/tui/frames/blocks/frame_4.txt create mode 100644 codex-rs/tui/frames/blocks/frame_5.txt create mode 100644 codex-rs/tui/frames/blocks/frame_6.txt create mode 100644 codex-rs/tui/frames/blocks/frame_7.txt create mode 100644 codex-rs/tui/frames/blocks/frame_8.txt create mode 100644 codex-rs/tui/frames/blocks/frame_9.txt delete mode 100644 codex-rs/tui/frames/codex/frame_000.txt delete mode 100644 codex-rs/tui/frames/codex/frame_004.txt delete mode 100644 codex-rs/tui/frames/codex/frame_008.txt delete mode 100644 codex-rs/tui/frames/codex/frame_012.txt delete mode 100644 codex-rs/tui/frames/codex/frame_016.txt delete mode 100644 codex-rs/tui/frames/codex/frame_020.txt delete mode 100644 codex-rs/tui/frames/codex/frame_024.txt delete mode 100644 codex-rs/tui/frames/codex/frame_028.txt delete mode 100644 codex-rs/tui/frames/codex/frame_032.txt delete mode 100644 codex-rs/tui/frames/codex/frame_036.txt delete mode 100644 codex-rs/tui/frames/codex/frame_040.txt delete mode 100644 codex-rs/tui/frames/codex/frame_044.txt delete mode 100644 codex-rs/tui/frames/codex/frame_048.txt delete mode 100644 codex-rs/tui/frames/codex/frame_052.txt delete mode 100644 codex-rs/tui/frames/codex/frame_056.txt delete mode 100644 codex-rs/tui/frames/codex/frame_060.txt delete mode 100644 codex-rs/tui/frames/codex/frame_064.txt delete mode 100644 codex-rs/tui/frames/codex/frame_068.txt delete mode 100644 codex-rs/tui/frames/codex/frame_072.txt delete mode 100644 codex-rs/tui/frames/codex/frame_076.txt delete mode 100644 codex-rs/tui/frames/codex/frame_080.txt delete mode 100644 codex-rs/tui/frames/codex/frame_084.txt delete mode 100644 codex-rs/tui/frames/codex/frame_088.txt delete mode 100644 codex-rs/tui/frames/codex/frame_092.txt delete mode 100644 codex-rs/tui/frames/codex/frame_096.txt create mode 100644 codex-rs/tui/frames/codex/frame_1.txt create mode 100644 codex-rs/tui/frames/codex/frame_10.txt delete mode 100644 codex-rs/tui/frames/codex/frame_100.txt delete mode 100644 codex-rs/tui/frames/codex/frame_104.txt delete mode 100644 codex-rs/tui/frames/codex/frame_108.txt create mode 100644 codex-rs/tui/frames/codex/frame_11.txt delete mode 100644 codex-rs/tui/frames/codex/frame_112.txt create mode 100644 codex-rs/tui/frames/codex/frame_12.txt create mode 100644 codex-rs/tui/frames/codex/frame_13.txt create mode 100644 codex-rs/tui/frames/codex/frame_14.txt create mode 100644 codex-rs/tui/frames/codex/frame_15.txt create mode 100644 codex-rs/tui/frames/codex/frame_16.txt create mode 100644 codex-rs/tui/frames/codex/frame_17.txt create mode 100644 codex-rs/tui/frames/codex/frame_18.txt create mode 100644 codex-rs/tui/frames/codex/frame_19.txt create mode 100644 codex-rs/tui/frames/codex/frame_2.txt create mode 100644 codex-rs/tui/frames/codex/frame_20.txt create mode 100644 codex-rs/tui/frames/codex/frame_21.txt create mode 100644 codex-rs/tui/frames/codex/frame_22.txt create mode 100644 codex-rs/tui/frames/codex/frame_23.txt create mode 100644 codex-rs/tui/frames/codex/frame_24.txt create mode 100644 codex-rs/tui/frames/codex/frame_25.txt create mode 100644 codex-rs/tui/frames/codex/frame_26.txt create mode 100644 codex-rs/tui/frames/codex/frame_27.txt create mode 100644 codex-rs/tui/frames/codex/frame_28.txt create mode 100644 codex-rs/tui/frames/codex/frame_29.txt create mode 100644 codex-rs/tui/frames/codex/frame_3.txt create mode 100644 codex-rs/tui/frames/codex/frame_30.txt create mode 100644 codex-rs/tui/frames/codex/frame_31.txt create mode 100644 codex-rs/tui/frames/codex/frame_32.txt create mode 100644 codex-rs/tui/frames/codex/frame_33.txt create mode 100644 codex-rs/tui/frames/codex/frame_34.txt create mode 100644 codex-rs/tui/frames/codex/frame_35.txt create mode 100644 codex-rs/tui/frames/codex/frame_36.txt create mode 100644 codex-rs/tui/frames/codex/frame_4.txt create mode 100644 codex-rs/tui/frames/codex/frame_5.txt create mode 100644 codex-rs/tui/frames/codex/frame_6.txt create mode 100644 codex-rs/tui/frames/codex/frame_7.txt create mode 100644 codex-rs/tui/frames/codex/frame_8.txt create mode 100644 codex-rs/tui/frames/codex/frame_9.txt delete mode 100644 codex-rs/tui/frames/default/frame_000.txt delete mode 100644 codex-rs/tui/frames/default/frame_004.txt delete mode 100644 codex-rs/tui/frames/default/frame_008.txt delete mode 100644 codex-rs/tui/frames/default/frame_012.txt delete mode 100644 codex-rs/tui/frames/default/frame_016.txt delete mode 100644 codex-rs/tui/frames/default/frame_020.txt delete mode 100644 codex-rs/tui/frames/default/frame_024.txt delete mode 100644 codex-rs/tui/frames/default/frame_028.txt delete mode 100644 codex-rs/tui/frames/default/frame_032.txt delete mode 100644 codex-rs/tui/frames/default/frame_036.txt delete mode 100644 codex-rs/tui/frames/default/frame_040.txt delete mode 100644 codex-rs/tui/frames/default/frame_044.txt delete mode 100644 codex-rs/tui/frames/default/frame_048.txt delete mode 100644 codex-rs/tui/frames/default/frame_052.txt delete mode 100644 codex-rs/tui/frames/default/frame_056.txt delete mode 100644 codex-rs/tui/frames/default/frame_060.txt delete mode 100644 codex-rs/tui/frames/default/frame_064.txt delete mode 100644 codex-rs/tui/frames/default/frame_068.txt delete mode 100644 codex-rs/tui/frames/default/frame_072.txt delete mode 100644 codex-rs/tui/frames/default/frame_076.txt delete mode 100644 codex-rs/tui/frames/default/frame_080.txt delete mode 100644 codex-rs/tui/frames/default/frame_084.txt delete mode 100644 codex-rs/tui/frames/default/frame_088.txt delete mode 100644 codex-rs/tui/frames/default/frame_092.txt delete mode 100644 codex-rs/tui/frames/default/frame_096.txt create mode 100644 codex-rs/tui/frames/default/frame_1.txt create mode 100644 codex-rs/tui/frames/default/frame_10.txt delete mode 100644 codex-rs/tui/frames/default/frame_100.txt delete mode 100644 codex-rs/tui/frames/default/frame_104.txt delete mode 100644 codex-rs/tui/frames/default/frame_108.txt create mode 100644 codex-rs/tui/frames/default/frame_11.txt delete mode 100644 codex-rs/tui/frames/default/frame_112.txt create mode 100644 codex-rs/tui/frames/default/frame_12.txt create mode 100644 codex-rs/tui/frames/default/frame_13.txt create mode 100644 codex-rs/tui/frames/default/frame_14.txt create mode 100644 codex-rs/tui/frames/default/frame_15.txt create mode 100644 codex-rs/tui/frames/default/frame_16.txt create mode 100644 codex-rs/tui/frames/default/frame_17.txt create mode 100644 codex-rs/tui/frames/default/frame_18.txt create mode 100644 codex-rs/tui/frames/default/frame_19.txt create mode 100644 codex-rs/tui/frames/default/frame_2.txt create mode 100644 codex-rs/tui/frames/default/frame_20.txt create mode 100644 codex-rs/tui/frames/default/frame_21.txt create mode 100644 codex-rs/tui/frames/default/frame_22.txt create mode 100644 codex-rs/tui/frames/default/frame_23.txt create mode 100644 codex-rs/tui/frames/default/frame_24.txt create mode 100644 codex-rs/tui/frames/default/frame_25.txt create mode 100644 codex-rs/tui/frames/default/frame_26.txt create mode 100644 codex-rs/tui/frames/default/frame_27.txt create mode 100644 codex-rs/tui/frames/default/frame_28.txt create mode 100644 codex-rs/tui/frames/default/frame_29.txt create mode 100644 codex-rs/tui/frames/default/frame_3.txt create mode 100644 codex-rs/tui/frames/default/frame_30.txt create mode 100644 codex-rs/tui/frames/default/frame_31.txt create mode 100644 codex-rs/tui/frames/default/frame_32.txt create mode 100644 codex-rs/tui/frames/default/frame_33.txt create mode 100644 codex-rs/tui/frames/default/frame_34.txt create mode 100644 codex-rs/tui/frames/default/frame_35.txt create mode 100644 codex-rs/tui/frames/default/frame_36.txt create mode 100644 codex-rs/tui/frames/default/frame_4.txt create mode 100644 codex-rs/tui/frames/default/frame_5.txt create mode 100644 codex-rs/tui/frames/default/frame_6.txt create mode 100644 codex-rs/tui/frames/default/frame_7.txt create mode 100644 codex-rs/tui/frames/default/frame_8.txt create mode 100644 codex-rs/tui/frames/default/frame_9.txt delete mode 100644 codex-rs/tui/frames/dots/frame_000.txt delete mode 100644 codex-rs/tui/frames/dots/frame_004.txt delete mode 100644 codex-rs/tui/frames/dots/frame_008.txt delete mode 100644 codex-rs/tui/frames/dots/frame_012.txt delete mode 100644 codex-rs/tui/frames/dots/frame_016.txt delete mode 100644 codex-rs/tui/frames/dots/frame_020.txt delete mode 100644 codex-rs/tui/frames/dots/frame_024.txt delete mode 100644 codex-rs/tui/frames/dots/frame_028.txt delete mode 100644 codex-rs/tui/frames/dots/frame_032.txt delete mode 100644 codex-rs/tui/frames/dots/frame_036.txt delete mode 100644 codex-rs/tui/frames/dots/frame_040.txt delete mode 100644 codex-rs/tui/frames/dots/frame_044.txt delete mode 100644 codex-rs/tui/frames/dots/frame_048.txt delete mode 100644 codex-rs/tui/frames/dots/frame_052.txt delete mode 100644 codex-rs/tui/frames/dots/frame_056.txt delete mode 100644 codex-rs/tui/frames/dots/frame_060.txt delete mode 100644 codex-rs/tui/frames/dots/frame_064.txt delete mode 100644 codex-rs/tui/frames/dots/frame_068.txt delete mode 100644 codex-rs/tui/frames/dots/frame_072.txt delete mode 100644 codex-rs/tui/frames/dots/frame_076.txt delete mode 100644 codex-rs/tui/frames/dots/frame_080.txt delete mode 100644 codex-rs/tui/frames/dots/frame_084.txt delete mode 100644 codex-rs/tui/frames/dots/frame_088.txt delete mode 100644 codex-rs/tui/frames/dots/frame_092.txt delete mode 100644 codex-rs/tui/frames/dots/frame_096.txt create mode 100644 codex-rs/tui/frames/dots/frame_1.txt create mode 100644 codex-rs/tui/frames/dots/frame_10.txt delete mode 100644 codex-rs/tui/frames/dots/frame_100.txt delete mode 100644 codex-rs/tui/frames/dots/frame_104.txt delete mode 100644 codex-rs/tui/frames/dots/frame_108.txt create mode 100644 codex-rs/tui/frames/dots/frame_11.txt delete mode 100644 codex-rs/tui/frames/dots/frame_112.txt create mode 100644 codex-rs/tui/frames/dots/frame_12.txt create mode 100644 codex-rs/tui/frames/dots/frame_13.txt create mode 100644 codex-rs/tui/frames/dots/frame_14.txt create mode 100644 codex-rs/tui/frames/dots/frame_15.txt create mode 100644 codex-rs/tui/frames/dots/frame_16.txt create mode 100644 codex-rs/tui/frames/dots/frame_17.txt create mode 100644 codex-rs/tui/frames/dots/frame_18.txt create mode 100644 codex-rs/tui/frames/dots/frame_19.txt create mode 100644 codex-rs/tui/frames/dots/frame_2.txt create mode 100644 codex-rs/tui/frames/dots/frame_20.txt create mode 100644 codex-rs/tui/frames/dots/frame_21.txt create mode 100644 codex-rs/tui/frames/dots/frame_22.txt create mode 100644 codex-rs/tui/frames/dots/frame_23.txt create mode 100644 codex-rs/tui/frames/dots/frame_24.txt create mode 100644 codex-rs/tui/frames/dots/frame_25.txt create mode 100644 codex-rs/tui/frames/dots/frame_26.txt create mode 100644 codex-rs/tui/frames/dots/frame_27.txt create mode 100644 codex-rs/tui/frames/dots/frame_28.txt create mode 100644 codex-rs/tui/frames/dots/frame_29.txt create mode 100644 codex-rs/tui/frames/dots/frame_3.txt create mode 100644 codex-rs/tui/frames/dots/frame_30.txt create mode 100644 codex-rs/tui/frames/dots/frame_31.txt create mode 100644 codex-rs/tui/frames/dots/frame_32.txt create mode 100644 codex-rs/tui/frames/dots/frame_33.txt create mode 100644 codex-rs/tui/frames/dots/frame_34.txt create mode 100644 codex-rs/tui/frames/dots/frame_35.txt create mode 100644 codex-rs/tui/frames/dots/frame_36.txt create mode 100644 codex-rs/tui/frames/dots/frame_4.txt create mode 100644 codex-rs/tui/frames/dots/frame_5.txt create mode 100644 codex-rs/tui/frames/dots/frame_6.txt create mode 100644 codex-rs/tui/frames/dots/frame_7.txt create mode 100644 codex-rs/tui/frames/dots/frame_8.txt create mode 100644 codex-rs/tui/frames/dots/frame_9.txt delete mode 100644 codex-rs/tui/frames/hash/frame_000.txt delete mode 100644 codex-rs/tui/frames/hash/frame_004.txt delete mode 100644 codex-rs/tui/frames/hash/frame_008.txt delete mode 100644 codex-rs/tui/frames/hash/frame_012.txt delete mode 100644 codex-rs/tui/frames/hash/frame_016.txt delete mode 100644 codex-rs/tui/frames/hash/frame_020.txt delete mode 100644 codex-rs/tui/frames/hash/frame_024.txt delete mode 100644 codex-rs/tui/frames/hash/frame_028.txt delete mode 100644 codex-rs/tui/frames/hash/frame_032.txt delete mode 100644 codex-rs/tui/frames/hash/frame_036.txt delete mode 100644 codex-rs/tui/frames/hash/frame_040.txt delete mode 100644 codex-rs/tui/frames/hash/frame_044.txt delete mode 100644 codex-rs/tui/frames/hash/frame_048.txt delete mode 100644 codex-rs/tui/frames/hash/frame_052.txt delete mode 100644 codex-rs/tui/frames/hash/frame_056.txt delete mode 100644 codex-rs/tui/frames/hash/frame_060.txt delete mode 100644 codex-rs/tui/frames/hash/frame_064.txt delete mode 100644 codex-rs/tui/frames/hash/frame_068.txt delete mode 100644 codex-rs/tui/frames/hash/frame_072.txt delete mode 100644 codex-rs/tui/frames/hash/frame_076.txt delete mode 100644 codex-rs/tui/frames/hash/frame_080.txt delete mode 100644 codex-rs/tui/frames/hash/frame_084.txt delete mode 100644 codex-rs/tui/frames/hash/frame_088.txt delete mode 100644 codex-rs/tui/frames/hash/frame_092.txt delete mode 100644 codex-rs/tui/frames/hash/frame_096.txt create mode 100644 codex-rs/tui/frames/hash/frame_1.txt create mode 100644 codex-rs/tui/frames/hash/frame_10.txt delete mode 100644 codex-rs/tui/frames/hash/frame_100.txt delete mode 100644 codex-rs/tui/frames/hash/frame_104.txt delete mode 100644 codex-rs/tui/frames/hash/frame_108.txt create mode 100644 codex-rs/tui/frames/hash/frame_11.txt delete mode 100644 codex-rs/tui/frames/hash/frame_112.txt create mode 100644 codex-rs/tui/frames/hash/frame_12.txt create mode 100644 codex-rs/tui/frames/hash/frame_13.txt create mode 100644 codex-rs/tui/frames/hash/frame_14.txt create mode 100644 codex-rs/tui/frames/hash/frame_15.txt create mode 100644 codex-rs/tui/frames/hash/frame_16.txt create mode 100644 codex-rs/tui/frames/hash/frame_17.txt create mode 100644 codex-rs/tui/frames/hash/frame_18.txt create mode 100644 codex-rs/tui/frames/hash/frame_19.txt create mode 100644 codex-rs/tui/frames/hash/frame_2.txt create mode 100644 codex-rs/tui/frames/hash/frame_20.txt create mode 100644 codex-rs/tui/frames/hash/frame_21.txt create mode 100644 codex-rs/tui/frames/hash/frame_22.txt create mode 100644 codex-rs/tui/frames/hash/frame_23.txt create mode 100644 codex-rs/tui/frames/hash/frame_24.txt create mode 100644 codex-rs/tui/frames/hash/frame_25.txt create mode 100644 codex-rs/tui/frames/hash/frame_26.txt create mode 100644 codex-rs/tui/frames/hash/frame_27.txt create mode 100644 codex-rs/tui/frames/hash/frame_28.txt create mode 100644 codex-rs/tui/frames/hash/frame_29.txt create mode 100644 codex-rs/tui/frames/hash/frame_3.txt create mode 100644 codex-rs/tui/frames/hash/frame_30.txt create mode 100644 codex-rs/tui/frames/hash/frame_31.txt create mode 100644 codex-rs/tui/frames/hash/frame_32.txt create mode 100644 codex-rs/tui/frames/hash/frame_33.txt create mode 100644 codex-rs/tui/frames/hash/frame_34.txt create mode 100644 codex-rs/tui/frames/hash/frame_35.txt create mode 100644 codex-rs/tui/frames/hash/frame_36.txt create mode 100644 codex-rs/tui/frames/hash/frame_4.txt create mode 100644 codex-rs/tui/frames/hash/frame_5.txt create mode 100644 codex-rs/tui/frames/hash/frame_6.txt create mode 100644 codex-rs/tui/frames/hash/frame_7.txt create mode 100644 codex-rs/tui/frames/hash/frame_8.txt create mode 100644 codex-rs/tui/frames/hash/frame_9.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_000.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_004.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_008.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_012.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_016.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_020.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_024.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_028.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_032.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_036.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_040.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_044.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_048.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_052.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_056.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_060.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_064.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_068.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_072.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_076.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_080.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_084.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_088.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_092.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_096.txt create mode 100644 codex-rs/tui/frames/hbars/frame_1.txt create mode 100644 codex-rs/tui/frames/hbars/frame_10.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_100.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_104.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_108.txt create mode 100644 codex-rs/tui/frames/hbars/frame_11.txt delete mode 100644 codex-rs/tui/frames/hbars/frame_112.txt create mode 100644 codex-rs/tui/frames/hbars/frame_12.txt create mode 100644 codex-rs/tui/frames/hbars/frame_13.txt create mode 100644 codex-rs/tui/frames/hbars/frame_14.txt create mode 100644 codex-rs/tui/frames/hbars/frame_15.txt create mode 100644 codex-rs/tui/frames/hbars/frame_16.txt create mode 100644 codex-rs/tui/frames/hbars/frame_17.txt create mode 100644 codex-rs/tui/frames/hbars/frame_18.txt create mode 100644 codex-rs/tui/frames/hbars/frame_19.txt create mode 100644 codex-rs/tui/frames/hbars/frame_2.txt create mode 100644 codex-rs/tui/frames/hbars/frame_20.txt create mode 100644 codex-rs/tui/frames/hbars/frame_21.txt create mode 100644 codex-rs/tui/frames/hbars/frame_22.txt create mode 100644 codex-rs/tui/frames/hbars/frame_23.txt create mode 100644 codex-rs/tui/frames/hbars/frame_24.txt create mode 100644 codex-rs/tui/frames/hbars/frame_25.txt create mode 100644 codex-rs/tui/frames/hbars/frame_26.txt create mode 100644 codex-rs/tui/frames/hbars/frame_27.txt create mode 100644 codex-rs/tui/frames/hbars/frame_28.txt create mode 100644 codex-rs/tui/frames/hbars/frame_29.txt create mode 100644 codex-rs/tui/frames/hbars/frame_3.txt create mode 100644 codex-rs/tui/frames/hbars/frame_30.txt create mode 100644 codex-rs/tui/frames/hbars/frame_31.txt create mode 100644 codex-rs/tui/frames/hbars/frame_32.txt create mode 100644 codex-rs/tui/frames/hbars/frame_33.txt create mode 100644 codex-rs/tui/frames/hbars/frame_34.txt create mode 100644 codex-rs/tui/frames/hbars/frame_35.txt create mode 100644 codex-rs/tui/frames/hbars/frame_36.txt create mode 100644 codex-rs/tui/frames/hbars/frame_4.txt create mode 100644 codex-rs/tui/frames/hbars/frame_5.txt create mode 100644 codex-rs/tui/frames/hbars/frame_6.txt create mode 100644 codex-rs/tui/frames/hbars/frame_7.txt create mode 100644 codex-rs/tui/frames/hbars/frame_8.txt create mode 100644 codex-rs/tui/frames/hbars/frame_9.txt delete mode 100644 codex-rs/tui/frames/openai/frame_000.txt delete mode 100644 codex-rs/tui/frames/openai/frame_004.txt delete mode 100644 codex-rs/tui/frames/openai/frame_008.txt delete mode 100644 codex-rs/tui/frames/openai/frame_012.txt delete mode 100644 codex-rs/tui/frames/openai/frame_016.txt delete mode 100644 codex-rs/tui/frames/openai/frame_020.txt delete mode 100644 codex-rs/tui/frames/openai/frame_024.txt delete mode 100644 codex-rs/tui/frames/openai/frame_028.txt delete mode 100644 codex-rs/tui/frames/openai/frame_032.txt delete mode 100644 codex-rs/tui/frames/openai/frame_036.txt delete mode 100644 codex-rs/tui/frames/openai/frame_040.txt delete mode 100644 codex-rs/tui/frames/openai/frame_044.txt delete mode 100644 codex-rs/tui/frames/openai/frame_048.txt delete mode 100644 codex-rs/tui/frames/openai/frame_052.txt delete mode 100644 codex-rs/tui/frames/openai/frame_056.txt delete mode 100644 codex-rs/tui/frames/openai/frame_060.txt delete mode 100644 codex-rs/tui/frames/openai/frame_064.txt delete mode 100644 codex-rs/tui/frames/openai/frame_068.txt delete mode 100644 codex-rs/tui/frames/openai/frame_072.txt delete mode 100644 codex-rs/tui/frames/openai/frame_076.txt delete mode 100644 codex-rs/tui/frames/openai/frame_080.txt delete mode 100644 codex-rs/tui/frames/openai/frame_084.txt delete mode 100644 codex-rs/tui/frames/openai/frame_088.txt delete mode 100644 codex-rs/tui/frames/openai/frame_092.txt delete mode 100644 codex-rs/tui/frames/openai/frame_096.txt create mode 100644 codex-rs/tui/frames/openai/frame_1.txt create mode 100644 codex-rs/tui/frames/openai/frame_10.txt delete mode 100644 codex-rs/tui/frames/openai/frame_100.txt delete mode 100644 codex-rs/tui/frames/openai/frame_104.txt delete mode 100644 codex-rs/tui/frames/openai/frame_108.txt create mode 100644 codex-rs/tui/frames/openai/frame_11.txt delete mode 100644 codex-rs/tui/frames/openai/frame_112.txt create mode 100644 codex-rs/tui/frames/openai/frame_12.txt create mode 100644 codex-rs/tui/frames/openai/frame_13.txt create mode 100644 codex-rs/tui/frames/openai/frame_14.txt create mode 100644 codex-rs/tui/frames/openai/frame_15.txt create mode 100644 codex-rs/tui/frames/openai/frame_16.txt create mode 100644 codex-rs/tui/frames/openai/frame_17.txt create mode 100644 codex-rs/tui/frames/openai/frame_18.txt create mode 100644 codex-rs/tui/frames/openai/frame_19.txt create mode 100644 codex-rs/tui/frames/openai/frame_2.txt create mode 100644 codex-rs/tui/frames/openai/frame_20.txt create mode 100644 codex-rs/tui/frames/openai/frame_21.txt create mode 100644 codex-rs/tui/frames/openai/frame_22.txt create mode 100644 codex-rs/tui/frames/openai/frame_23.txt create mode 100644 codex-rs/tui/frames/openai/frame_24.txt create mode 100644 codex-rs/tui/frames/openai/frame_25.txt create mode 100644 codex-rs/tui/frames/openai/frame_26.txt create mode 100644 codex-rs/tui/frames/openai/frame_27.txt create mode 100644 codex-rs/tui/frames/openai/frame_28.txt create mode 100644 codex-rs/tui/frames/openai/frame_29.txt create mode 100644 codex-rs/tui/frames/openai/frame_3.txt create mode 100644 codex-rs/tui/frames/openai/frame_30.txt create mode 100644 codex-rs/tui/frames/openai/frame_31.txt create mode 100644 codex-rs/tui/frames/openai/frame_32.txt create mode 100644 codex-rs/tui/frames/openai/frame_33.txt create mode 100644 codex-rs/tui/frames/openai/frame_34.txt create mode 100644 codex-rs/tui/frames/openai/frame_35.txt create mode 100644 codex-rs/tui/frames/openai/frame_36.txt create mode 100644 codex-rs/tui/frames/openai/frame_4.txt create mode 100644 codex-rs/tui/frames/openai/frame_5.txt create mode 100644 codex-rs/tui/frames/openai/frame_6.txt create mode 100644 codex-rs/tui/frames/openai/frame_7.txt create mode 100644 codex-rs/tui/frames/openai/frame_8.txt create mode 100644 codex-rs/tui/frames/openai/frame_9.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_000.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_004.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_008.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_012.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_016.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_020.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_024.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_028.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_032.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_036.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_040.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_044.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_048.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_052.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_056.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_060.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_064.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_068.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_072.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_076.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_080.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_084.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_088.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_092.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_096.txt create mode 100644 codex-rs/tui/frames/shapes/frame_1.txt create mode 100644 codex-rs/tui/frames/shapes/frame_10.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_100.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_104.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_108.txt create mode 100644 codex-rs/tui/frames/shapes/frame_11.txt delete mode 100644 codex-rs/tui/frames/shapes/frame_112.txt create mode 100644 codex-rs/tui/frames/shapes/frame_12.txt create mode 100644 codex-rs/tui/frames/shapes/frame_13.txt create mode 100644 codex-rs/tui/frames/shapes/frame_14.txt create mode 100644 codex-rs/tui/frames/shapes/frame_15.txt create mode 100644 codex-rs/tui/frames/shapes/frame_16.txt create mode 100644 codex-rs/tui/frames/shapes/frame_17.txt create mode 100644 codex-rs/tui/frames/shapes/frame_18.txt create mode 100644 codex-rs/tui/frames/shapes/frame_19.txt create mode 100644 codex-rs/tui/frames/shapes/frame_2.txt create mode 100644 codex-rs/tui/frames/shapes/frame_20.txt create mode 100644 codex-rs/tui/frames/shapes/frame_21.txt create mode 100644 codex-rs/tui/frames/shapes/frame_22.txt create mode 100644 codex-rs/tui/frames/shapes/frame_23.txt create mode 100644 codex-rs/tui/frames/shapes/frame_24.txt create mode 100644 codex-rs/tui/frames/shapes/frame_25.txt create mode 100644 codex-rs/tui/frames/shapes/frame_26.txt create mode 100644 codex-rs/tui/frames/shapes/frame_27.txt create mode 100644 codex-rs/tui/frames/shapes/frame_28.txt create mode 100644 codex-rs/tui/frames/shapes/frame_29.txt create mode 100644 codex-rs/tui/frames/shapes/frame_3.txt create mode 100644 codex-rs/tui/frames/shapes/frame_30.txt create mode 100644 codex-rs/tui/frames/shapes/frame_31.txt create mode 100644 codex-rs/tui/frames/shapes/frame_32.txt create mode 100644 codex-rs/tui/frames/shapes/frame_33.txt create mode 100644 codex-rs/tui/frames/shapes/frame_34.txt create mode 100644 codex-rs/tui/frames/shapes/frame_35.txt create mode 100644 codex-rs/tui/frames/shapes/frame_36.txt create mode 100644 codex-rs/tui/frames/shapes/frame_4.txt create mode 100644 codex-rs/tui/frames/shapes/frame_5.txt create mode 100644 codex-rs/tui/frames/shapes/frame_6.txt create mode 100644 codex-rs/tui/frames/shapes/frame_7.txt create mode 100644 codex-rs/tui/frames/shapes/frame_8.txt create mode 100644 codex-rs/tui/frames/shapes/frame_9.txt delete mode 100644 codex-rs/tui/frames/slug/frame_000.txt delete mode 100644 codex-rs/tui/frames/slug/frame_004.txt delete mode 100644 codex-rs/tui/frames/slug/frame_008.txt delete mode 100644 codex-rs/tui/frames/slug/frame_012.txt delete mode 100644 codex-rs/tui/frames/slug/frame_016.txt delete mode 100644 codex-rs/tui/frames/slug/frame_020.txt delete mode 100644 codex-rs/tui/frames/slug/frame_024.txt delete mode 100644 codex-rs/tui/frames/slug/frame_028.txt delete mode 100644 codex-rs/tui/frames/slug/frame_032.txt delete mode 100644 codex-rs/tui/frames/slug/frame_036.txt delete mode 100644 codex-rs/tui/frames/slug/frame_040.txt delete mode 100644 codex-rs/tui/frames/slug/frame_044.txt delete mode 100644 codex-rs/tui/frames/slug/frame_048.txt delete mode 100644 codex-rs/tui/frames/slug/frame_052.txt delete mode 100644 codex-rs/tui/frames/slug/frame_056.txt delete mode 100644 codex-rs/tui/frames/slug/frame_060.txt delete mode 100644 codex-rs/tui/frames/slug/frame_064.txt delete mode 100644 codex-rs/tui/frames/slug/frame_068.txt delete mode 100644 codex-rs/tui/frames/slug/frame_072.txt delete mode 100644 codex-rs/tui/frames/slug/frame_076.txt delete mode 100644 codex-rs/tui/frames/slug/frame_080.txt delete mode 100644 codex-rs/tui/frames/slug/frame_084.txt delete mode 100644 codex-rs/tui/frames/slug/frame_088.txt delete mode 100644 codex-rs/tui/frames/slug/frame_092.txt delete mode 100644 codex-rs/tui/frames/slug/frame_096.txt create mode 100644 codex-rs/tui/frames/slug/frame_1.txt create mode 100644 codex-rs/tui/frames/slug/frame_10.txt delete mode 100644 codex-rs/tui/frames/slug/frame_100.txt delete mode 100644 codex-rs/tui/frames/slug/frame_104.txt delete mode 100644 codex-rs/tui/frames/slug/frame_108.txt create mode 100644 codex-rs/tui/frames/slug/frame_11.txt delete mode 100644 codex-rs/tui/frames/slug/frame_112.txt create mode 100644 codex-rs/tui/frames/slug/frame_12.txt create mode 100644 codex-rs/tui/frames/slug/frame_13.txt create mode 100644 codex-rs/tui/frames/slug/frame_14.txt create mode 100644 codex-rs/tui/frames/slug/frame_15.txt create mode 100644 codex-rs/tui/frames/slug/frame_16.txt create mode 100644 codex-rs/tui/frames/slug/frame_17.txt create mode 100644 codex-rs/tui/frames/slug/frame_18.txt create mode 100644 codex-rs/tui/frames/slug/frame_19.txt create mode 100644 codex-rs/tui/frames/slug/frame_2.txt create mode 100644 codex-rs/tui/frames/slug/frame_20.txt create mode 100644 codex-rs/tui/frames/slug/frame_21.txt create mode 100644 codex-rs/tui/frames/slug/frame_22.txt create mode 100644 codex-rs/tui/frames/slug/frame_23.txt create mode 100644 codex-rs/tui/frames/slug/frame_24.txt create mode 100644 codex-rs/tui/frames/slug/frame_25.txt create mode 100644 codex-rs/tui/frames/slug/frame_26.txt create mode 100644 codex-rs/tui/frames/slug/frame_27.txt create mode 100644 codex-rs/tui/frames/slug/frame_28.txt create mode 100644 codex-rs/tui/frames/slug/frame_29.txt create mode 100644 codex-rs/tui/frames/slug/frame_3.txt create mode 100644 codex-rs/tui/frames/slug/frame_30.txt create mode 100644 codex-rs/tui/frames/slug/frame_31.txt create mode 100644 codex-rs/tui/frames/slug/frame_32.txt create mode 100644 codex-rs/tui/frames/slug/frame_33.txt create mode 100644 codex-rs/tui/frames/slug/frame_34.txt create mode 100644 codex-rs/tui/frames/slug/frame_35.txt create mode 100644 codex-rs/tui/frames/slug/frame_36.txt create mode 100644 codex-rs/tui/frames/slug/frame_4.txt create mode 100644 codex-rs/tui/frames/slug/frame_5.txt create mode 100644 codex-rs/tui/frames/slug/frame_6.txt create mode 100644 codex-rs/tui/frames/slug/frame_7.txt create mode 100644 codex-rs/tui/frames/slug/frame_8.txt create mode 100644 codex-rs/tui/frames/slug/frame_9.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_000.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_004.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_008.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_012.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_016.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_020.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_024.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_028.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_032.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_036.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_040.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_044.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_048.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_052.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_056.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_060.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_064.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_068.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_072.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_076.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_080.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_084.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_088.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_092.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_096.txt create mode 100644 codex-rs/tui/frames/vbars/frame_1.txt create mode 100644 codex-rs/tui/frames/vbars/frame_10.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_100.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_104.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_108.txt create mode 100644 codex-rs/tui/frames/vbars/frame_11.txt delete mode 100644 codex-rs/tui/frames/vbars/frame_112.txt create mode 100644 codex-rs/tui/frames/vbars/frame_12.txt create mode 100644 codex-rs/tui/frames/vbars/frame_13.txt create mode 100644 codex-rs/tui/frames/vbars/frame_14.txt create mode 100644 codex-rs/tui/frames/vbars/frame_15.txt create mode 100644 codex-rs/tui/frames/vbars/frame_16.txt create mode 100644 codex-rs/tui/frames/vbars/frame_17.txt create mode 100644 codex-rs/tui/frames/vbars/frame_18.txt create mode 100644 codex-rs/tui/frames/vbars/frame_19.txt create mode 100644 codex-rs/tui/frames/vbars/frame_2.txt create mode 100644 codex-rs/tui/frames/vbars/frame_20.txt create mode 100644 codex-rs/tui/frames/vbars/frame_21.txt create mode 100644 codex-rs/tui/frames/vbars/frame_22.txt create mode 100644 codex-rs/tui/frames/vbars/frame_23.txt create mode 100644 codex-rs/tui/frames/vbars/frame_24.txt create mode 100644 codex-rs/tui/frames/vbars/frame_25.txt create mode 100644 codex-rs/tui/frames/vbars/frame_26.txt create mode 100644 codex-rs/tui/frames/vbars/frame_27.txt create mode 100644 codex-rs/tui/frames/vbars/frame_28.txt create mode 100644 codex-rs/tui/frames/vbars/frame_29.txt create mode 100644 codex-rs/tui/frames/vbars/frame_3.txt create mode 100644 codex-rs/tui/frames/vbars/frame_30.txt create mode 100644 codex-rs/tui/frames/vbars/frame_31.txt create mode 100644 codex-rs/tui/frames/vbars/frame_32.txt create mode 100644 codex-rs/tui/frames/vbars/frame_33.txt create mode 100644 codex-rs/tui/frames/vbars/frame_34.txt create mode 100644 codex-rs/tui/frames/vbars/frame_35.txt create mode 100644 codex-rs/tui/frames/vbars/frame_36.txt create mode 100644 codex-rs/tui/frames/vbars/frame_4.txt create mode 100644 codex-rs/tui/frames/vbars/frame_5.txt create mode 100644 codex-rs/tui/frames/vbars/frame_6.txt create mode 100644 codex-rs/tui/frames/vbars/frame_7.txt create mode 100644 codex-rs/tui/frames/vbars/frame_8.txt create mode 100644 codex-rs/tui/frames/vbars/frame_9.txt diff --git a/codex-rs/tui/frames/blocks/frame_000.txt b/codex-rs/tui/frames/blocks/frame_000.txt deleted file mode 100644 index 2130f9840c..0000000000 --- a/codex-rs/tui/frames/blocks/frame_000.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒▒▒▒▒██████████▒▒ - █▒█░▓█ ██░▒▒░▓▓▓░░ █░███▒ - ▒▓░▒█ █░█▒░██░░█▒█░ █████▒ █▒ - ██░▓██▒██▓██ ▓░░ ██▓▒ ██ - ▒█░▓██▒▓▓ █ █░█▒██ - █░░▓▓█▓░ █▒█░░▒▒▒ - ▓▓░▓ ░█ ░ ▒▒▒█ ▒▓▒░█▒░ - █▓░░█ ░░ █▒▒█░▓░░ ░█▒▒░█▒░ - ██░░▒░█ ░█▓▒▒▒▒▓░ ███░▒▒█ - ░▒ ░░▒░░ █▒░█▒▓░░▒▓ ▓░░░░ ░ - ▓░▓░ ▒░ █▒▓▓ █░▓ ░░░▓░ - ▒▒ ▓░ █▒▓░░ ▓█ ▒░░░░ - ░░░░ ▓ █░▓▓ ▓░░ ▒▒▒█▒██████████ ░▓▓░ ░ - █░▓ ░█ ▒▓░░██ ▓█░ ▓░░▒▒██████ ░▓▒░▒░ - ▒▓░▒▓ ░▒ █░▓░ ▒░░ ░ ▓▓▓▓▓▓ ░ ░░█░░ - ▒▒░░▒▒░█ ████▓ █▓░▓▓ ▓▓ - ▒▒▒░ ▒▒▒ ▓█▓█▓░▓▓ - ▒░░░█ █░▒▒ ▒░▒█░█▒░█ - ████░█ ████ ▓▒██░███▓▓█ - ░█░░█ ░▒███▒░█▒▒███████░█░███▒██░ - █ ███▓█░░█▒░▓ ██▓░░▒██ ▒██ - ███▓░█░░▓▒▒▒▒▒▒██▓██░ - ░░ █ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_004.txt b/codex-rs/tui/frames/blocks/frame_004.txt deleted file mode 100644 index 4d4a138a1e..0000000000 --- a/codex-rs/tui/frames/blocks/frame_004.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒▒▒▒▓██████████▒▒ - █▒▓░▓█ ██ ▒█░▓▓▓ █ █░ ██▒ - ▒▓░░█░█░▓▒░██░░█▒░░ ████▓▒ █▒ - █░█▓██▒█░▓█ █ █▒▓▒ ██ - ▒█░▓█ ▒▓▓█ ███░█▒██ - █░░▓▓▒▓░ ▒▓░░▒▒▒ - ▓░░█ ░█ ▒▓ ░▒▒█ █▓█░██░ - █▓░░█▒░░ █▒▒▒▒▓▒▓ ▓▒█░░▒░ - ██░░▓░█ ░░░░▒▒▒▒ ░ ██░░▒█ - ░█ ░░ ░ █▒░██▒▓░ ░░░░ ░ - █░▓░█▒░ █▒▓░█ ▓█▓ ▒░░░█░ - ▒▓ █░█ ▒▓░░ ▓▓█░ ░░ ░ - ░░░░█ █▒ ▓░▓▓▓ ▓▓░░ ▒▒▒█▒██▒███████ █ ▓░ ░ - █░█ ░▒ ▓░░███▓█ █ ░▒██ ███ █ ░▓▒░▒░ - ▒█░▒▒ ░█ █░▓█ ▒░ ▓██▓██▒░░░▓▒▒██ ▓▓▓░░░░ - ▒▒▒░█▒░▒ ████ ░ █▓░▓░ ▓▓ - █▒▒░▒ ▒█▒ ▒█▓█▓█▓▓ - ▒▒░░█▓█▓▒▒ ▒▓▓█░█▒░█ - ███░░▒ ████ ▒▒██░██░░▓█ - █░█░░█ ████░░█▒▒██████░░▓░██ ▒██░ - ░ ███▓▒▓░░▓█░ ███░█▒██ █▒██ - ██░░██▒▓▒▒▒▒▒▒██▓██░ - ░░ █ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_008.txt b/codex-rs/tui/frames/blocks/frame_008.txt deleted file mode 100644 index 777c028bf1..0000000000 --- a/codex-rs/tui/frames/blocks/frame_008.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒▒▒▒▒██████████▒▒ - ▒▒▓░██ ░█░▒█░▓▓▓ ▒ █░ ██▒ - ▒▓░░███▒▓▓███░█▒▒░░ ██▒█▓▒ ▒█ - █░░█░ ▒▒█░█ ▓ █ █▒▓▒ ██ - ██░▓▓░█░█ █▒█░████ - ▓░░█ ▒░█ ██▒█ █▒▒░░▒▒▒ - ▓░▓███░ █░ █▒█▓ ▒█░█▒▒ - ▓░▓░ █░ ▒░ ▒ ██ ▒▒░▓▒░ - ░░░▒ ░░░ ░░▓░█▒▒ ▒█░█░░ - ░░░░ ░░█ █▒ ░▒░▒ █ ▒░░ ░ - ░░▒░ ░ █░░▓ ▓░▓ ░░░▒░ - █░▓▓ ▒█ ▒█░░░ ▒░▒ ░ ░░░░░░ - ██░░ ░░ ▓▓▓█░ ░▓ ▓▒█▒█▒██▒███████ ▒█░░ ░ - █░▒░ ▓░ ▒░░▓░▓▒░█ ▓▒░░██████▒ ░▒▒░▒░ - ░▒░▒ ▒▒▒ ▒ █▓▓ ██ ▒▒█░██░░░░▓▒▒▓█ ██░░░▓█ - ▒░░▓ ▒▒▒ ▒███ ▓ ▓▓██▓ - ▓░░▒ █░░▒ ▒▓▓█▓███ - ▓█░░▒ ▒██▒ ▒▓░███▒░█ - ▒ ▒▒█▒ ▒░███▒▓░ ▒▒██░██░░▓█ - ░█░█▓ ██░██░░█▒▒███████░█░██ ▒▒█░ - ░░░██▒▒░░█▒█▓░░█░░░▒██ █▒░█ - ▒█░░░█▒▒▒▒▒▒▒▒██▓██░ - ░░ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_012.txt b/codex-rs/tui/frames/blocks/frame_012.txt deleted file mode 100644 index 98ac6c4266..0000000000 --- a/codex-rs/tui/frames/blocks/frame_012.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒▒▒▒███████▒██▒ - ▒█▓░████ ▒▒██▒ ▓░▒ █░███▒ - ▒█░▓░█░█▒▓██░░█▒▒█████▒▒▓█▒█ ██ - █▓█░█▒▒░█░█ ▓ █░██▒█ █▒ - ▒░▓░ ▓▓██ ▓▓ █░█░▒ ▒ - ▓░░▒ ░▓█ ███▒ ░█░ ▒▒▒ - ▓░░▓▒░░░ ▓▒░████▓ █▒█░▒▒██ - ▓░░▓▒░█▓ ▒█▒░▒▒▒▒▒ █▓░█▒▒▒ - ░░█░░░█░ ▒█▒░░▒▒ ▒▒ ▒█░ ▒░ - ░░█ █░ ▒▒█░░░██▒ ░░▓ ▓█ - ▒░░ ░░ █▓▒░░ ▓░ ░░░ ░░ - ░░░ ░░█ █░░█ ▒█▓▒ ░░░░░░ - ██░ ░░█ ▓▒▓░▓ ░█▓ ██▒▒▒██████████ ░░░ ░░ - ░▒ ░▓ ░░▓█░█░█ ░ ░░▓███ ████ ▒░ ▒░█░ ░ - ░░░ █▓░ █░░ █▓░░█ ░▒█▓████▓░░░░▓▒▒█░▒▓░░▓▓ - ░░▒ █▓▒ ████ ▒▓▓▓▓▓░ - ▒░▒ ███ ▓░█▓█▓░ - ▒░░█ ████▒ ▒█░▓▓ ▒▓█ - █░░░▒ █████▒▒ ▒▓█░▒▓░▓▓▓░ - ░ ░░▒ ██░█░░██▒▓███████░░░░█░▒▒█░ - ███▒▓▒ ██▒░░░░░░████░ ▒██ - █ ███▓▒▒▒▒▒▒▒▒█▒▓██░ - ░ █ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_016.txt b/codex-rs/tui/frames/blocks/frame_016.txt deleted file mode 100644 index ca0e62297b..0000000000 --- a/codex-rs/tui/frames/blocks/frame_016.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒▒▒███████████▒ - █▒▓█░██ ▒▒▓░▒██▒ █░ ███▒ - ▓▓▓█ ▒▒▓███░░█▒▒██░░░▓▒▒▒ ██▒█ - ▒▓██░█▓████ ░ ░██░▒█▒░▓█▒▒ - ▓██▓░░███ █░░░▓▒█▓ - ▒░░▓▓░█ ███ █░░█ ███ - ▒░░░▓░▓█ ░░ ▒▒░█ ▒░▓ ▒▒▒ - ░░░▓░ █░▒▓ ██▒▒ █░░ ▓░▒ - ░▓▓░░▓ █░░▒░▒▒█▒▒ █░▓ █░█ - ░▓▓░░ ▒▒░░░▒█▒▒▓ █░░ ░░█ - ░░░ ░ ░ █░░ ▓█▓░█ ░░ ▓▒ - ░░▒ ░ ▓ ▓█▓▓█░█ █ ░ ▓▒ - ░▓ ░░░ ▒▓██▓░░█ ████▒▒█████▒███ █░█░░░ - █░▓░▓▒█ █░ ▓▓▒█▓░ █▓███ ▓ ███░ ▒░░█▓░ - █▒█ ░▒░▒ ██▒▓▒▓█ ░▒██████░░▓░░░░█ ▓▒ ▒▒░ - ▒▒█ ▒▒█▒ ████░ ▒░▒░▓ ██ - █▒█ ▒ ░█ █░█░█▓░█ - ░▓▒ ▒█░█▒ ▒█░░███░█ - █░▓▒ ▒█░░█▒▒▓ ▒▓▓░░█░▒▓▓ - █░░█▒ █░░░█░██▓▓███████░░░██ ▒██ - ░██▒▒▒ ░████░░░░░░███ ▒██▓ - ░█▒░▓█▒▒▒▒▒▒▒▒█▒▓██ - ░ ██ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_020.txt b/codex-rs/tui/frames/blocks/frame_020.txt deleted file mode 100644 index e3396542a4..0000000000 --- a/codex-rs/tui/frames/blocks/frame_020.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒▒▒▒█▒███████▒▒▒ - █▒▓░██ ▒▒▒▓▓█▒▒███████▓▓▒ - █▓█░ █▒▓▒█░▓██▒▒██▓█░██▒ ░█▒▓░ - ██░░▒▓▓████ ▓▒░▒▒ ████▒ - ██ ▓███▓ ░█ █░▒█▒▒▒█ - ▓░ ▒░█▓▒ ██ ▒▓ █▒▓█ - ▓ █░░░ ▓ ▒ ░ ░▒▒ ░█▒▒ - ▓░ █░██░ ░▓▓██▒▒▒ ▒▒ ░▒░█ - ▒██▒░░▓ ░▒░█▒ ░▒ ░█ ▓░█ - ░ ░░░░ █░▓███▒▒▒ ░ ░█░░ - ░░█░░▒ ░▒▒░█ ▓░░█ ░░▒░▓ - ░▓█░░▒▓ █ ▓ ▓▓█▓░ ░▒ ░░ - ▒░█░░░▒ ▓▓▓▒▓░░▓ ▒▓████▒▒▒▒▒▒▒▒█▒ ░▒▒░░ - ██▒▒░▓▒▓ ▒███▓██ ███████ ████░▓ ▒░▓░░ - ░▒▒░▒ ░ ▒ ▓█▓░ ░██████░░▒░░█░▓ ▒▒▒░▒█ - ░▒ ░▒▓▒ ░░ ▒█▓▓▓▓ - ░▒█▒███▒░ █▓░░█▒▓ ░ - ▒░██████▒ ▒██▓░░░▓█ - █░▓▒█▒▓░███▒▓ ▒█▓█▒░░██ - █░█ ██░░░░███████████░░███░▓███ - ███▒▒ ███████░▓▓▒█ ░ ▒███▒░ - ██░░██▒▒▒▒▒▒▒██████ - ░ ██ ░░ - - diff --git a/codex-rs/tui/frames/blocks/frame_024.txt b/codex-rs/tui/frames/blocks/frame_024.txt deleted file mode 100644 index 4e35e58f23..0000000000 --- a/codex-rs/tui/frames/blocks/frame_024.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒█▒█▒█████▓▒▒▒ - ▒▓▓░ ░ █ ██ ▒██░████▓█▒ - ▒▓ ▒███ ▓██▒▒██▒▓█▒▓ ░ ████ - ▓█ ███▒██▒█ ▒░█▒█▒ ██▒░▒ - ██ ▒▓█ █▒ ▓██▒ ▒█▒▒▒ - ▓ ▓▓░█ ▓█▒█ ████▓▒█░ - ░ ▓▓█▒ ▒█▒░ █▒█ ░▒▒░ - ░ ░▓▓▒ ░░ ▒██ ░░ ░▒▓░ - █░ █░ ▒ ░▒█▒▒ ▓▒███░█▓ - ░▓░░░▓ ░▓▒ █▒▒ ██░ ░▒ - ░▓░░▒█ ▒░ █▒█ ▓▓░░░▒ - ░▒░█░░ ▒█ ▒█ ▒░░░░░ - ░▓█▓░█ ░▓░█ ▓▓ ▒▓███▒▒▒█▒█▒▒█▒ ▒ ░░░░ - ░█░█▒░ ▒░ ▒░█ ░▓▒▒██████████░▓█ ░░ ░▓░▓ - ░▓██▒▒▒ ▒▒█▓░ ███▒██▒▒▒███░▓ ▒░▓█▒█ █ - ░▒██▒██ ▓░▒█▓ ▓ - █░▒██▒ ▒ ▒█▒░█ █ - ░▒ ▒ ███▒ ▓▓██░▓▒▓ - █░▒ ░▒▒▓██▒▒ ▒██▒█ ▓█▒█░ - █░▒▒ ▒░██░░▒██▓▒▒▒███████▓▓▓████ - █░█▒ ████░███░███░████▓░█░ - ░███▒▓▓▒▒▒▒▒▒███░██ - ░ ██ ░░░ - - diff --git a/codex-rs/tui/frames/blocks/frame_028.txt b/codex-rs/tui/frames/blocks/frame_028.txt deleted file mode 100644 index 3a4eab12fb..0000000000 --- a/codex-rs/tui/frames/blocks/frame_028.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒█▒░▓█████▓▒▒▒ - █▒██░ ░██░█▒░▓ - ▒▓█░ ▒███ ░░█▒▒▒█▒█▒ ░▒██▒██ - ▒▓ ▒██ █▓ ░▒█ ██▓▒██ - ███▒▓█ █▒ ▒░█ ▓▒▒▒▒▒ - ░▓▓▓▓ ▒ ██ █░█░▒▒░█▒ - ░ ▓░█▓ ░ ███ █▒██▒░▓▒ - ▓░░▓█ ▒ █▒█▒█▓ ██▓▒█▒▓░ - ░▒▒░▓▓ ▒▒▒▒▒ ██ ░ ░░▒ - ░ ▓█░ █▒███▒█ ░░ ░░ █ - ░▓░░░░█ ░ ░ ▓▒█▓ ▓ ▒ ░░▓ - ░ ░░░▓ ░░████ █ ░ ░░░▓ - ░░ ░░▒ ███ ██▓▒█▒███▒▒▒██▒█▓ █ ▒░░▓ - ░ ░░ ░ ░▓░▓ ▓░ █▓▓▓█▒▒▒▓▓▓█▒░█ ░█░░▓ █ - ░▒▒▓▓ ▒█░ █▓▓▓░▒▒▒▒▒▒▒█ ▓▓▒░▓ ▓ - ░▒▒█▒█ ▒░ ░ █ ▓ - ░▒▒░░█▒ █░▓▓░█ █░ - ░█▒▓██ ▒▓█▒▓░▓ ▓░ - █░▒█▓░░█ ▒ ▒▒██░░█ █▒█ - █░▓ ░█░░█░▒▓█▒▒████░░░█░█▓░░▒▓░ - █░██░░░░██████░▒█ █▒▒▓▓▒▓█ - █░██░░▒░░░░▒██░░ █ - ░ ██ ░ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_032.txt b/codex-rs/tui/frames/blocks/frame_032.txt deleted file mode 100644 index 86a5d93425..0000000000 --- a/codex-rs/tui/frames/blocks/frame_032.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒██▒█▒▒███▓▓▒▓ - ▒▓▓█ █░▒▒██▒ - ▒▓█░▒███ █░█▒▒████ ░▒███ █ - ▒░█▓░██▒██░▓ ░▒█ ▒▒▒ █ - ██▒░█ ▓▓ ░█ ░▒█ █▒ - ▓██░█▓▒ ▒ ▓░▒ ▒▒█▒░█ - ▓█▓░█░▓░ ░▒▓▒ ▓▒█▒ ░█░▒ - ▒░▒▓█ ▓ ▓▒▒█▒ █ █ ▒▒▒ - ░█▒░ █ ▒█▒▒▒▒▒ ▒█▒█░▓▒░ - ░ ░░ ░ ░▒▓███▓ ░█▒█░█▒▓ - █▒░░██ ▒▒░▓█▓▓▒▓ ░░░▓ ░░ - ▓█░░▒ ██▓██▓░█ ▓ ░░░░█ - ░░░░ ░ ▒░░▒░░ ▒██▒░▒█▒▒▒▒█ ░█░█░░ - ░█▓░ ▒ █▒▒░▓ ░▒███▓▒▒▓▒▒▒▓ ▓ ▒░░░░░ - █░░█░ ████▓▒░▓░▒░█ ▓░▓░ ▓ - ░▓▒▓▒ ░ ░░ ▓█░▓▓ ▓ - ░▒▒░░▓▒ ▓█▒▓░▓ █░ - ░░██▒▒█ ▒░ █▓ ▓▓█░ - █▓▒▒████░ █░█░▓██░▒▓ - █░░████▒░█▓░▓█████░░█░▓▓░▒ █ - █░░░░█░ ███████ ░▓▒██▒▒▓░ - ░██░▓▒▒▒▒▒▒███▓█ ▓█ - ░ █ ░ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_036.txt b/codex-rs/tui/frames/blocks/frame_036.txt deleted file mode 100644 index 2726923335..0000000000 --- a/codex-rs/tui/frames/blocks/frame_036.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒████▓███▓▒▒▓ - ▒▒██ ▒▓▓▓ █ █░██░▒█ - █░█▓▓████ █▒██░█ ▓▒█ ▒▒ - ▒░█░▓█▒▒█ ██ █░▒░█▒ - █▓█░█ ░▒ ▒▒██ ▒▒ - █▓█▓▓ ▒ ▒ █▒░▒▓█▒ - ░█▓▓ ▓▒▒▒█ ▒ ▒▒▒█▒▒ - ░░░░ ▒▒█▓█▒██ ▓▒▒ █▒▒░ - ░░▒░ ███▓▒█▒ ▓ ▒▒ ▒▒▓▒ - ░ ░█ ▓ ░░█▓▓▒▒▓ ▒ ░░██░░ - ░ ▒ ░▒▒ █▓▒▓▓ ░ ░░░ ░░ - ░▒▒▒ █░▓ ▓██ ░ ▒░░░█░ - ░▓▓█ ░ ██▓░ ▓▒██████▒█▒ █░░░░░░░ - ░░▓░▒█ █ ▓ ░█████████▒▒ ▓ ░█░░░░ - ░▒▓░ ░ ▒█████░▒▒▒░█ ░ ░█░░░▒░ - ░█ ░ ░ ░░░░░ ▒▓ ▓█▓ ░ - ▒░░░▓ ▒ █░░░ ▓ - ▒░░▒▒▒█▓ ██ ▓ █░ - █░░█░▒▒█ ▒░███▒▓█ ▓ - ▒░░██▓█░█▒█▓▒███░░░░█▓░▒ █ - ██▒ ████░█░███░▓▒▓██▒██ - ██▓▒▒▒▒▓▒▓████▒▓█░ - ░░ █░ - - diff --git a/codex-rs/tui/frames/blocks/frame_040.txt b/codex-rs/tui/frames/blocks/frame_040.txt deleted file mode 100644 index 4c886c2ca1..0000000000 --- a/codex-rs/tui/frames/blocks/frame_040.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒██████▓██▒▒▒ - █▓█ ▒▓▒▒▒███░░▓█░██▒ - █░ ▒████ ░▒██▓▒ ░█▒ ░▒▒ - ▓ ▓░ ░▓█ ██ ▒ █▒ - ░▒█░░ ▓█▓░█ ░░ - ░░█░ ▒▒█▒ █▓▒█ ▒░ - ▓▒▓░ ▒▒░░▒ █▓█▒▒▒█▒ - ░░░░ ░▒▒ ░▒ █ ▒█░░ ▒▒ - ▒ ░░ ▒▒▒ ▒▒█ ▒░▒░░░░░ - ░░░░ ▓░▒█░▒▒▒█ ░▒░▓██ - ▓░░░ ▒░▒▓▒░▓█ ░▓░░░░░░ - ▒▓░░ ▒░▓▓ ▓ ░ ░ ░░░░░░ - ░ ░█ ▒▓░▓ █▒▒████████ █░░░▒█▓░ - █▓▓█ ▓ ██████████░░ ░ ░ ░░░▒ - ░░▓█ ░████▒░▒▒▓░ ▓█░ ░░░░░ - ░▓▓░██ ░ ░░░░░ ░ ▒█░░░░█ - ░░▒▒ █▒ ░░░░▓░░▓░ - ░▒██▒█▒ ▒░░▓▓▓█ ░ - ░░█░▒░█ ██░█▓▓▒ ▒▓ - █▒ █▒▓█░█████▒██ ██▓█░ ██ - █▒ ██░░░░██░█▓▒█▒ ██ - ██▓▒▓█▒▒███▓█▒▓█ - ░ ░░ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_044.txt b/codex-rs/tui/frames/blocks/frame_044.txt deleted file mode 100644 index 3516e0c22e..0000000000 --- a/codex-rs/tui/frames/blocks/frame_044.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒██▒██▒███▒▒▒ - █▓█▒████ █░█░▓ ██▒ - ▒░░▓███ ░██▓▒█▒██▓ █ - ██▓█▓ ░█▒▒ ▒▒█ - █▒█▓░ ▒▒░▓█ ░█ - ▓░█ ▒▒█ ▒█▒░▒ ▓█ - ░▓▓ █░▒█ ▓▒▒▒█▒▒ - ░ ░ ▒░▒▓▒▒█ ▒█ ░░ ░ - █▒▒░ █░█▓▒▒░▒ ▓▒░░░ ░ - ░░█ ▒▒▒░█░█ ░▒▓░▓ ▓ - █░ ▒▓░▓█ ░ ░░░█░░░ - ▓░ ░ ▓█▓░▓ ░░░░░░░░ - ░░▓░ ▒░ ▓░ ▒▒████████ ░░░░▓█░░ - █░░ ░ ▓░▓ ████████▒█▓░ ▒░█░░░ - ░▓█▒░█▓ ▓██▒▒░▒█░▓░█░░░░░░ ▓ - ░░█▒█ ░░ ░░░░░ ▒ ░█░░ █░ - ░▓▒▒▓█ ▓▒░ ▓░▒░ - ▒▓░▒▒▒▒ ██▓█ ▓ ▓█ - ▒▓░▒████ ▓█▓█▓▓ ▓▓ - ▒▒█░██▒███▒▒██░▓▓▒▒ ▓ - █▒▒ ██▒▒░██░▒█▒░░ ██ - ░██▒▒▒█▓▓█▓▒░▒██░ - ░ ░ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_048.txt b/codex-rs/tui/frames/blocks/frame_048.txt deleted file mode 100644 index 3b09f67bc2..0000000000 --- a/codex-rs/tui/frames/blocks/frame_048.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - █▒▒░███████ - ██░▓█▒ ▒▓░█▓ █▒█ - ▓█░ █ ░██▒▒▒▒▒ █▒ - ▓░▓██ ▒░▒▒ ▓░░ - ░░▒▒ ░▒▒▒ █▒░ - ▒▒ ▒█▒ ▒█░▓▓█▒▒ - ░▓░░░██ ▓ ▒▒ ▒█▒ - ▒ ░ ▓▒ ▒ ░▓ ▒▒ ░ - ▓░░░ █░░░▒█ ░ ░▒▒░░░ - ░░▒ █░▓▓▓ █ ███░█▓▒█ - ░░░ ░▒▒░░░ ░▓░░█▓░░ - ░░░░ ▒ █ █ ░▒░░░░░░ - ░░▓▒ ░▓ ▒▒█████ ░▒░░░░░░ - ░░ ░▓▒█ ██████░▒ ░ ░░░░░░ - ▓░░█░░ ██▒░▒█▓ ░█░░░ ▒░ - ░▓██░ ░ ░░░ ░░░▒░ - ██▓░ ░ ▒ ▓▒░░░░▒▓ - ░░▓█▒▒▒ ░▓█ ▓░░█░ - █░░▒██▒▓ ░░█░█░█ ▓█░ - ███▒█▒███▒█▓▒█ ▓▓ ░░ - ▒▒██▒░▓█░▓███▒ ▒▓ - █▒▒▒▒██▓█▒ ▒▓░ - ░ █░░░░ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_052.txt b/codex-rs/tui/frames/blocks/frame_052.txt deleted file mode 100644 index abd5f260d2..0000000000 --- a/codex-rs/tui/frames/blocks/frame_052.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒▓▒███▓▒██▒ - ▓ ██ ▒█▓▒ ▒░█ - ░▓▓█ █▒██▒█░█ ▒▒ - ▓░▓█▓ ░▓▓ ▒▒ - ░░▒ ▓ ▒░▒▒ ▒█▒ - ░░█▒▒░▒ ░▓░█ ░░ - █ ░░▒███ ▒ █░ ░▓█ - ░░ ░░░▒░ █ ░░ ▒░▒ - ▓▓░ ▓▓▒░▒ ░░░▓ ░ - ░░ ░░░▒▒ ░▓█░░▒░ - ░░▓ █░▓░▒ ░▓░▒▓░ ░▓█ - ░░▓ ░▓▓▒█ ░▓▒░░░▓ ░░ - ░▓ ░░ ▒▒▒████▒▒░░░░░░░ - ░ ▒█ █████▒░░ ░░░░░░░ - ░░▓ ░ ▒▒▓▒░█░░▒ ░░ ░ - ▓░░ ▓▓ ░ ░░░ ░░ ░ - ░░ ░ ▒▒▓ ░░ ▒░ - ░░░▒ ░░█▓░░░██ - ░░█▒ █░▒▒░░░░ ▓ - ▒░█▓▒█▒▒█▓▒░█ ▓▓░ - ▒▒█░ ▓░▓▒░█ ▓▓ - ██▒▒█ ▒▓█▓▒░ - █ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_056.txt b/codex-rs/tui/frames/blocks/frame_056.txt deleted file mode 100644 index 065700f9b5..0000000000 --- a/codex-rs/tui/frames/blocks/frame_056.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - █▒████▒██▒ - ▓█▒▒▒▓▓▓█ ░█ - ▓░▓█▒▒ ░░ █░█ - █░█▓░▒░██ ██ ▒ - ░▒░ ▒▒▓▒▒▒ ▓▓ - ░▒█▒██ ░░▒░█ █░ - ░░░█ ░ █░░ ░▓░░▒ - ▒▓█▓ ░░█ ▒░ ░ - ░ ░██ ▒░ ░░░▓ - ▒▓▒█▒▓░ ░░█░░█▓░ - ░▓░▓▒█░ ░░▓██░▓░ - ░▓█▓█ ░ ░░ ░ ░░░ - █▓▒░▒▒▒█ ░░▓░░█░░ - ▒▒░ ██░▒ ░░▓ ░░ ░ - ▒░ ▓ ░░░░░░░▒░ - ░░█░██ ░ ▓░░░░ ▓░ - ░░░ ░░ ▒ ░░░░░ ░ - ▒░ ▒ ▓░░░ █▓▓▒░ - ░█▒ ░ ░ ▒▒█░ ░░ - ▒░▒▒█▓▒▓█░ ░░▒█ - ▒█▓ ▓▓█ ▓ - █▒▒▓▒█ ▒█ - █░█ - - diff --git a/codex-rs/tui/frames/blocks/frame_060.txt b/codex-rs/tui/frames/blocks/frame_060.txt deleted file mode 100644 index c801e0a65c..0000000000 --- a/codex-rs/tui/frames/blocks/frame_060.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒███▓███ - ▒ ▒░▓ █ █▒ - ▓░░░▓░ ▒▒▒ - ▓▓▓░▓░ █░░░ - ░░░▓░██ ░░ - ░░▒░▓▓░▒░ ▒░ - ░░▓█░░▓░ ░░ - ░░ █░░░░▒ █ - ░░▓░░█▓▒░░░░░ - ░░░░░ ░░░ ▒▒░ - ░░▒█ ░██░ ░░ - ░░░▒░ ░ ░▓░░ - ░░▒▒░▒░▓░░░░█ - ░░░░░░░░░ ░▒ - ░░▒░ ░ ░░░ ░▓ - ░░▒░░░░░░░░ ░ - ░▒▓▓▓░ ▓ ░ - ░░▓░░ ▓░░ - ▓░░░▒░█▒▒░▒ - ░▒█░▒ ░█░░ - ▒ ░ ▒▒ █▒▒█ - ██░ ██▓▓░░ - █ ░ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_064.txt b/codex-rs/tui/frames/blocks/frame_064.txt deleted file mode 100644 index 72fc0830c6..0000000000 --- a/codex-rs/tui/frames/blocks/frame_064.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ████████ - ░▒░ ▒░ - ░▒░█ ░▒▓▒ - ░░░▒▒▒ ░▓ - ░▓▓░█ ▒░░ - █ ▓ ▒▒▓▒░ - █▓ ░▓██ ░ - ▒░░░ ░▓▒▒ - ▒░▒▒█ ▓░ - ░░░░▒▒░░▒ - ░░░ ██ ░░░ - ░░░░▓▓▒▓░ - ░░░░░░░░░░ - ░░░░░░▒▒░░ - ░░░░░░░░░░ - ░░▓░░░░░ ░ - ░░░░░░░░░░ - ░░░░░░░░▓░ - ░░█░▒▓█░▒░ - ▒░▓░░▓ ░▒░ - ▒░█░ ░ ░ ░ - █▓ ▓█▓ - █ ██ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_068.txt b/codex-rs/tui/frames/blocks/frame_068.txt deleted file mode 100644 index b5d4889493..0000000000 --- a/codex-rs/tui/frames/blocks/frame_068.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ███▓███▒█ - ▒▓ ▒▓░▒ - ░█░██▒▒░▒▒ - ░█ █ ░█░▓░ - ░░░ ░▒░░░ ░ - █░▓░▓▒░▒ ░ - ▒░░░░░░░░ ░ - ▓░░░▓░▒░░░ ░ - ░░░░░░▒░░█ ░ - ░▒░░░░ ▓░▒ ░ - ░░ █░▒░▓░█▓░ - ░█ ▓░ ░░▓░ - ▒░ ░░░ ░░░█░ - ▒ ░░░█░░░ ░ - ▒░░░░█░█░░░ - ▒▒░░░ ▓▒░░░ - ░▓░░░▒▓░░▓░ - ░░▒▓█░░▒▓▓░ - ░█░▓██░█░░░ - █▒ ░ ░░▒ - ░░█ ░░▓░▓░ - ░▓▒ ░█▒▒░ - ░ █ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_072.txt b/codex-rs/tui/frames/blocks/frame_072.txt deleted file mode 100644 index 6b9cfcdc96..0000000000 --- a/codex-rs/tui/frames/blocks/frame_072.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ██░▓█▓█░█ - ▓▒▒░▓░▒▓▒▓█ - ░░ ░ ▓░▒█▒▒▒ - █▒░ █░░░░██ ▓ - ░░▓░▓▒░ ░ █▓░██ - ░ ░█░░░░░░░ ▒░ - ▒░░ ▒ ░█░ ▓▓░▓ - ░░░░░▒░░░▒ ░ ░░ - ░░░░░░░░ ░░░ █▓░ - ░░░░▒▓░░▓ ▒█░░░░ - ░░ ▒░▓░▓▓█░▓▓░░ - ░░▒░▓▓▒ ▒▒▒▒ ▒▒░ - ░░░░░▒ ░▓▓▓█▒▒░░ - ░░░░░ ░█░░░░░█░░ - ░░ ▒ ░░ ░ ▒▒░█░░ - ░ ▒ ░ ░░░▒▒▓▒▒░ - ░█ ░█░▒ ░░░▓▒ - ░░░ ▒█▒▒██░▓░░ - █░▓▒▓█ ▓░░▓░░█░ - ░░█ █▓▒░█░ - █▒ ▓ ▒█░█▓▓▓ - █▓░▓ ▒░▒▒▓ - ░ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_076.txt b/codex-rs/tui/frames/blocks/frame_076.txt deleted file mode 100644 index 3a4ceb7970..0000000000 --- a/codex-rs/tui/frames/blocks/frame_076.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒███▓███░▒▒ - █▒▓░░▒▒▒█▒▓█▒ - ░░▓░█▒▓░▒░ ██▒▒ - ░▓░▓▓▓▒░█▓ ▒███░█ - ██▓░░█▓▓░░ ▓█▒▓ - ░▒▒▓▓ ░█▓█▒ ▒░█ - ▒░▓▒▒█ ░░▒█ ▒░░ - ░░▒░▓░░ ░░░█▓ ▓░ - ░░▒█░░░▒▒▒░░░ █▓░░ - ▒░░░░░ ░░▒█ ░░▒░ - ░░░░░▓ ▓░▒░█░░ ░▓▒░ - ░░░░░▓ ▒▓▒ ░▒░ ░▒░ - ░░░░░ ▓░░▒▒██▒░░░ - ░░░░░ ▓░▒▒█░░▒▓░ ░░ - ░░░░░ ▒▒░░▒▒█ ▓░█▓░░ - ░░░░ ▒▒░░█▒░▒█░▒░▓░ - ░░░░ ▒░▓ ░ ░▒█ - █░░░░░ ░ ▓▓▒█░█ - ░▒█▒█░░█▓█ █░ ░█▒ - █▒▓ ░░▒▒░▓█▓░▒██ - █░█▓ ░▒ ███▓▓▒▓ - ▒██ █░█▒▒▓ - ░░ ░█ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_080.txt b/codex-rs/tui/frames/blocks/frame_080.txt deleted file mode 100644 index 3c56ed0c5d..0000000000 --- a/codex-rs/tui/frames/blocks/frame_080.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - █▒█░▒█▒█░▒▒ - ▓██ █ ░░█░█▓░██ - ░░█▓█▓█░ ██ ████▒ - ▓ ░░ ▓▓░█▓▓░ ░ ██▒▒ - ░ ▓░░██░▒█ ▓▒░█ - ▓▓░█▓▓░▒█ ▒ ▒▓ - ░░▓▒▒░█░█ ▒█▒ ▒▓░█ - ▓░░ ░░███░ ▒▓░▒ █░▓ - ░▒░ ░▒░░░ ▓▒▒█▓ ░░ - ▒░░░ ░░░░ ▒░░▒ ░▓░ - ░░░░░▒▒░░ ▓▓ ▓ ▓█▓░ - ░░░░█░▒░░ ░▒░▒ ░░░ - ░▓░░░ ░░░ ▓▒ ░▒ █ ▓▒░░░ - ░░░░░ ▓░ ░▓░█░░ █ ░░░▒░ - ░░░░▓ █░ █▒ ▓ ░░▓ ▓ ░░█ - ░░░░░ █░ ▓█▓ ▒░░░▒░ - ░░░░░█░░ ▓░░░░ - ▒▒░░▒▓ ░█▒ ▓▒▒ - █░█ ░░▒▒▒▒▒ ░░█░ - ▒▒▒ ▒▒▒▒▒████░▒░██▓ - ░▒ █▓ █▒█▓█▒█ - █▒▒ █▒██▒▒▓█░ - ░ ░░░░ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_084.txt b/codex-rs/tui/frames/blocks/frame_084.txt deleted file mode 100644 index 7925fdd8fa..0000000000 --- a/codex-rs/tui/frames/blocks/frame_084.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒█▓█▒█▓█████ - ▒░█ ▓ ░░█ ▒▓▓▒█▒▒ - ▒░█░░▓ ▓▓▒███ ██ ▒░▒ - █▓██ ▒█████▓ ░░ ▒ ▒░ - █▓██ ░▓█░░█ ░░ - ░▓░█▓██▓▒█ ▒ █▒█ - ░░░▓▒░█░░ █░▒ ▓░▒ - ░░ ▓░░░░█ ░█▒▒▒ █▓░█ - ░█░▓ ░░█ ▒▓▒░▒ █░▒ - ░░░░░ ▒░░ ▒▒▓█ ░░░ - ░▓░░ ▒░█░ █ ▒░█▒ ░░▒ - ░ ▒▓█▒▒░░ ░▒██░░ ░░▓ - ░ ░█░▓░░ █▓▒█▒█▒▒██▒▒ ▒▒░▓ - ░░ ▒░ ░░░░ ▓▓▓▒▓ █░█ ░ ░░░░ - ░█ ██░░▒░ ▒▓ ░ ▒░█░ ██▓ ░ - ░ █░█ ░▓ ▒░░░ - ▒▒ █▒░░░█░ █░█░█░ - ▒░▒ ▒█▒ ▒ ░▓▒▒▒░ - ░░ ▒█░▒ ░▒ ▓ ░█▓ - ▒▒ ░ ▓░▒▒█▒▒▒██▒▓▓░ ▓ - █░▒ ░▒░▒░ █████ █ - ██▒ █▒█▒▒▒▒▒▓█ - ░ ░░░░ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_088.txt b/codex-rs/tui/frames/blocks/frame_088.txt deleted file mode 100644 index 6e8ec14d0d..0000000000 --- a/codex-rs/tui/frames/blocks/frame_088.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▓█▓░▒▓█▓▒███▒ - █▓▒ █▓▓░▓█░▒▓▒▓ ██ - ▒▓░▓ ████▒███░░█░ ░▒██ - ▓░ ▓▓▓▓▓▓█░ █░█░█▒░▒ - ▓▒█░▓█▓██ ▒▓░▒░▒ - ▓░▓▓█▓▓▓▒ ▒ ██ ░░ - ▒░▒▒ ░ █▓ ░█▓ ▒ ▒░██ - ░░░▓▓██░ ░███ ▒ █░░ - ░▒▒ ▒▓▒█░▒░ ▒░▓ - ░░░░░▓▒░ ▓█▓▒█ █▓░░░ - ░░░░░░░▓ ▓ ▒▓░▒░ █▓░░▓ - ░▒ ░░░░░ ▓█░▓▒░█ ▓░░▒ - ░░ ░▓░░░ ░░▒█▓░█ ███▒▒ ▓░░ - ▓ █▓░ ▓▓▓▓█▓▓ ▒█ ░▓ ░░░░░ - ░ ▓ ░░▒ ▒░░█ ▒███▓ ░██ - █▓▓ ░ ░ ▒█░ ░░▓▓ - ░█ ▒░▒▒█▒█ ▒█▓▓░▒░ - █▓▒███░█▒█ ▓█▓▓▒▒▓ - ░▓▒▒█▒░██▒ ▒▓░█░█░▓ - ░▓ ▒▒▒▒ ███▒▒▓█▒░░░█▒█ - ░▒░ ▒ ▒░ █▒████ ▒▓░ - ██ ░████▓▒▒▒▒██░ - ██░░ █ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_092.txt b/codex-rs/tui/frames/blocks/frame_092.txt deleted file mode 100644 index 1e61c995a8..0000000000 --- a/codex-rs/tui/frames/blocks/frame_092.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒██▓█▒████▓░█▒ - ▒█░ █ ░█ █ ▒▓▓░▓ █▒█ - ▒▓ ░▓████ ▒███░░ ███▓▒▒█ - ▓██▓▓█▒ ███ ▒▓▒██░█▒ - ░░▓ █ ░▓ ░▓ █▒▒ - ░░▒▒▒██ █▒▓ ██░░ - ▓█ █░▓░█ ▓░█▒ ▒▓▒░ - ▒░▓█░░▓░ ░▓██▒ ░▓▒ - ░░░░ ░▒█ ░███▒░▒ ░░░ - ░░░ █░░ ░█▓█▒ ▓░░ - ▒░░░░▒░ ▓▓▒░ ░░▓ - ▒░░▒░░░ ▓▓▓▓█▓ ░█ - ░░░▓░░░ ▓▒▓▓▓▓▓▒ ▒▒████░▓ ▓ ░█ - ░░░░█▒▓ ▓▓▓▓▓░█ █▒█ █░ ░ █░░▒ - █░░░▒░░█▒ ██░ ▒ █░█▓█▓░█ ░▒█░░ - █▒░░░▓▓ ░ █▒█░ ░ █ ░░ - ██▒▒██▒ ░ ██ ░▒▒▓ - █░▒▒▒█▒▒ ░ ░▒▓█░▓ - █░▒▒▒▒░▒▒██ ▒▓██▒▓▓█▓ - ▒▒ █░░█░██▒▒▒▒████░█████ - ▒▒▒▒░▒█▓ ░████████░▒█ - ██▒░███░█▒▒▒▒▒██ - ░█ ░░ █ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_096.txt b/codex-rs/tui/frames/blocks/frame_096.txt deleted file mode 100644 index 8c5bd29323..0000000000 --- a/codex-rs/tui/frames/blocks/frame_096.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒▒█░██████░▒▒ - ▒█ ▒█░░█ ░ ▒▓█▓ ░ ███▒ - ▒▓▒▓▓███ ░▒▓███░░ ██▓▒██▒▒ - ▓ ██░░ ▒████▓█▒ - ░ ▓░▓▓ █ ▓██▒ - ░▓▓▓░▓█ ██▒ █▒▒ - █▓▓▓░█▓ ▓▓ ▒▒ ██▒░ - ▓▓█▓░▒█ ░░▓ ░ ░ ░▓█ - █▒ ██░ ░█░▓░ ▒ ░░░ - ▒░░░▒░▒ ▒▒▒▒░▒█ ░░▓ - ░ ░ ▓░░ █ ▒█░░░▓ ▓░░░░ - ░░░ ░░░ ░▓▓░▓ ▓▒█ ░▓░░░░ - █░░░░░░ ░▓██ ▓█ ▒████▓▓▒ ▒ ░█▓░ - █░░░░██ ░███░▓█▓ ░▒█ ░█ ░ ▒░▓ - ░ ░░░░░ █▓▓ █░ ▒░███▓█ ░ ▓▓░█ - ▒░▒ ███ ░▒█ ▓██░░░░ - █▒▒░ ▓▓▒ █▓██░█▒▓ - ▒░▒█░▒░▒█▓ ▒▓ ▓██░▓ - █▒▒▒█░▒▓ ██▓ ▒█ ░██▓▓ - ▒▒ ▒█░▒▒ ██▓▒▒▒▒███▓▒█░▓ ░░ - ▒▒ ▒██░▓█░█████████ ▒█ - ██▒▒▓▒░█▒▒▒▒▒▒▓██░ - ░ ░░░ █ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_1.txt b/codex-rs/tui/frames/blocks/frame_1.txt new file mode 100644 index 0000000000..8c3263f518 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_1.txt @@ -0,0 +1,17 @@ + + ▒▓▒▓▒██▒▒██▒ + ▒▒█▓█▒█▓█▒▒░░▒▒ ▒ █▒ + █░█░███ ▒░ ░ █░ ░▒░░░█ + ▓█▒▒████▒ ▓█░▓░█ + ▒▒▓▓█▒░▒░▒▒ ▓░▒▒█ + ░█ █░ ░█▓▓░░█ █▓▒░░█ + █▒ ▓█ █▒░█▓ ░▒ ░▓░ + ░░▒░░ █▓▓░▓░█ ░░ + ░▒░█░ ▓░░▒▒░ ▓░██████▒██ ▒ ░ + ▒░▓█ ▒▓█░ ▓█ ░ ░▒▒▒▓▓███░▓█▓█░ + ▒▒▒ ▒ ▒▒█▓▓░ ░▒████ ▒█ ▓█▓▒▓ + █▒█ █ ░ ██▓█▒░ + ▒▒█░▒█▒ ▒▒▒█░▒█ + ▒██▒▒ ██▓▓▒▓▓▓▒██▒█░█ + ░█ █░░░▒▒▒█▒▓██ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_10.txt b/codex-rs/tui/frames/blocks/frame_10.txt new file mode 100644 index 0000000000..a6fbbf1a4b --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_10.txt @@ -0,0 +1,17 @@ + + ▒████▒██▒ + ██░███▒░▓▒██ + ▒▒█░░▓░░▓░█▒██ + ░▒▒▓▒░▓▒▓▒███▒▒█ + ▓ ▓░░ ░▒ ██▓▒▓░▓ + ░░ █░█░▓▓▒ ░▒ ░ + ▒ ░█ █░░░░█ ░▓█ + ░░▒█▓█░░▓▒░▓▒░░ + ░▒ ▒▒░▓░░█▒█▓░░ + ░ █░▒█░▒▓▒█▒▒▒░█░ + █ ░░░░░ ▒█ ▒░░ + ▒░██▒██ ▒░ █▓▓ + ░█ ░░░░██▓█▓░▓░ + ▓░██▓░█▓▒ ▓▓█ + ██ ▒█▒▒█▓█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_100.txt b/codex-rs/tui/frames/blocks/frame_100.txt deleted file mode 100644 index 43235d273d..0000000000 --- a/codex-rs/tui/frames/blocks/frame_100.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▓▒▒█▓███████▒▒ - ██░█▒▓██░▓█ ░█▓░░ ███▒ - ▒█▒▒▓██▓▓▓▒████▒░░███▓▒░ ██ - ▓ ▓▓▓▓▓ ░██▒▓▓██ - ▒░█▒████▒ ▒ ██▓█ - ▒░░░▓▓█ █▓▒ ▓▒█░ - ░▓▒▓▓▒▓ ▓░ ░▒ ▓▒▒█░ - ▓▓▓░░▓░ █░▒▒░▒░ ░▒█░▒ - ░ ▓██░ █▒█░█▓ ▒ ░░░ - ░░░░█░░ █░▒ █▒▓█ ░█░█ - ░ ░░▒█ █░ ▒▓▒ ▒█ ░░▒░ - ░░ ▒▒▒░ ▓▒▒█▓ ▒░ ░░ ░ - ░ ░ ░░▒ ░▒▒█▓░▒▓ ▒▒▒▒▒██▓█▓▒▒ ▒░▓░░ - █▒ ░░░ ░░███░█▓ ░░▓█ █░▒░░░░ ░░█░ - ░▓█░▒▓▒▒ ░█▓░ ▒█ ░█░█▒▓██▒ ▓░▒▒▓ - █▒░░░█▒ ░ ░▒██ ██ ▒▓▓█░ - ▒░░░░▒░ ░▒ ▓ ██░░▓ - ▒▓█▒░░▒▒██ ▓░▒█▒▒ ▓▓▓ - █ █ ░░▓ ░▒ ▒▓█ ▒██░█ - █▒ ██░█▒ ░░▓█▒▒█████░▒███░▓▓ - ██▒██░▓▒ █░████████ ███░ - ░█▓▒█ ██▒▓▒▒▒▒▒████ - ░ ░ ██ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_104.txt b/codex-rs/tui/frames/blocks/frame_104.txt deleted file mode 100644 index 3411b68abb..0000000000 --- a/codex-rs/tui/frames/blocks/frame_104.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒▓▓▓█▒███████▒▒ - ▒█ █░▓██░ ████ - ██▒▓███ ▒█▒███▒░░███▓█░░██▒ - ██▓▓▓▒▓ ▒██ ▓▒█░█▒ ▒▒ - ▓ ▓███ █▓ █░▓▓▒▒█▒ - █ ▓██▓ ▓ ▓▓▒▒ ▒ ░█▓▒ - ░█▓░░▓█░ ▓▓ ██▒ █▒ ░▓▓▒ - ░▒▒▒▓█▓▓░ ▒▒█░▒▒▒░ ░ ▒▓▒█ - ░▓░▒░▒▒ █░▒ █░ ░ ▒ ░░▒█ - ░█░░░░█░ █ ░░█▓░▒░ ░▓ █ - ░█ ░░ ░ ░▒▓ ░█ ▓░ ░░ ░ - ░░░▓░░ ░ ▒██▓▓░ ▓ ░▓░░█░ - ▒█ ░░░█░ ██▓▓░█▓░░ ▒██▒███▓▓█ ▒░░░█░ - ▒░ █▓ █ ▓░█░▓ ▒░ █▓▒█ █░▒ ░ ▓█░▒░░ - ▒ ░░░░█░ ██▓░░▒ ░██░░▓▓███ ░░░░░ - █░▒▒▒▒░ ░ █▓ ▒▒░▒░ - ▒▒▒▓▒░█▒░▒ ▒▓░▓█▓██ - █▓ ░░▒█ ░█ ▒▓█▒█▓░░█ - ▒ ██░▓▒ ░█▒ ▒█ ▒▓▒██▓░ - █▓ ███▓▒ ░█████▒█████░▒▓██░███ - █▒▒█▒█▒▒ █░█████ ██░█░▓ - ░ █░███▒▒▒▒▒▒█▒██ - ░ ░ ██ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_108.txt b/codex-rs/tui/frames/blocks/frame_108.txt deleted file mode 100644 index 9dc5397ab5..0000000000 --- a/codex-rs/tui/frames/blocks/frame_108.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒▓▒▓▓█████████▒▒ - █▓░████ ██▒ - ▒▓██░█▓▓▓▓▒███░░░░░████▒▒▓███ - ▒▓█▓▓ ▒░█▓█ ▒█ ██░░██ - ▓░▓██░░█░ █▓▒██▓░▒ - ░░▓░███░░ ██░▒ █ ░▒▒▒█ - ░▒▓░██▒░ ▒▓▓▓░█ ░▒▒▒░▒██ - ▓█░▒▒▓ ░ █░▓▒█▒▒ ▒▒ ▒▒░▒ - ░░░░░▓░ █░▓▒░░█ ██▒█▒░ - ░░▒░░▓▓ ▓█░▒█▒▒█ ░░▓ ░░░ - ██░░░▓░ ░ ░░█▓░░ ▓ ░▓▒█ - ░░░░▒░ ▓▒█████░ ▓▓░▒ ░ - ▒ ▓░░█ ░ ▒█ ▓▓▓▓▓▓ ██▒▒██████▓███ ░▓░░▒░ - █▒ ░░░▒░ █▒█▓▓ ▓ █░░▒█ ██▒ ▒██ █░░░░ - ░█▒▒░▓ ░░ █░▓█▓ ▒▒██░░▒▒██ ░░ ▓ - ░█░█▓██▒▓ █▒▓▓░▓░█ - █▒█░▓░▒█▒▒ ░▓█▒▓▓░█░ - ██ ░░░█ ░█ ▒█▒▓▓▓▒▓░ - ▒▒▒█░▒█ ░█▒ ▓█▒░█░█▒█ - █▒█░██▒ ▒█████▒▒█▒███░▒▓█░█░▒▓░ - ██ █░░▒▒ █░ ████ ██░▒▒██ - █ ▓██░░█▓▒▒▒▒▒▒▓███ - ░ ██ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_11.txt b/codex-rs/tui/frames/blocks/frame_11.txt new file mode 100644 index 0000000000..88e3dfa7c5 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_11.txt @@ -0,0 +1,17 @@ + + ███████▒ + ▓ ▓░░░▒▒█ + ▓ ▒▒░░▓▒█▓▒█ + ░▒▒░░▒▓█▒▒▓▓ + ▒ ▓▓▒░█▒█▓▒░░█ + ░█░░░█▒▓▓░▒▓░░ + ██ █░░░░░░▒░▒▒ + ░ ░░▓░░▒▓ ░ ░ + ▓ █░▓░░█▓█░▒░ + ██ ▒░▓▒█ ▓░▒░▒ + █░▓ ░░░░▒▓░▒▒░ + ▒▒▓▓░▒█▓██▓░░ + ▒ █░▒▒▒▒░▓ + ▒█ █░░█▒▓█░ + ▒▒ ███▒█░ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_112.txt b/codex-rs/tui/frames/blocks/frame_112.txt deleted file mode 100644 index 5fc8ad686e..0000000000 --- a/codex-rs/tui/frames/blocks/frame_112.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▒▒▒▓▓█████████▒▒ - ▒▓██▓░█ ▓▒█ ██▒ - ███░█▓█ █▒██▓██▒░░░█████▒ ██▒ - █ ▓█ █ ▓▓██░▒ █ ██▓█ ▒▒ - ██░░██ █░ ██ ████▒ - ▓▓▓░░█ ▓ ▓███▒ ▒▓ ▒▒ ░ - ▓▒▓▓██▒░░ ▒▒░▒██░ █▒ ▒░ ░ - █▓░▒▒██░ ░▒▒▓██▓▒ █▒ ▒░ ░ - ░░░░░█▓░ █▒▒█▒▒▒ ▒▓ ░░██ - ▒░░█░░▓░ ▒█░▒ ▒ █ ░ ░░▒░ - ░▒ ░ ▒ █▒▓▒ ▓ ░█▒░▓░ - ░░░▒░ ▒ ▒█▒█▓ ▓█ █▓░░░░ - █░ ▒░▒ ░ ▓░█░▒ ▒░░ █▒▒▒█▒▒██▓███▒ ▒ ░░▒░ - █ ░░░ ░ ▒▓▓▓█░ ▓█ ▒░░▓██ ███ ▒░█░█░▒░▒█░ - ▒█ ▒█▓ ░ ░░ ▓▓ █▓▒█░██▒▒████▓░░▓░▓░ - ▒█░▓░ █▒ ▓▒▒▒█▒▓ - ▒█░░▒▒▒█▒ ▒▓░▓█▓ ▓ - ▒▓░░░▒█▒▒▒ ▒████▓░██ - ██ ░░▓█ ▒██▒▒ ▒██ ░█▓░▒▓░ - ██▒█░▒█▓█░█████▒▒█▒███░▒██░█ ▒█ - █▒░░▒▒ ▒ █░ ▓███ ██ █▒██░ - ░░▓███░███▒▒▒▒▒▒▓████░ - ░ █ ██ ░ - - diff --git a/codex-rs/tui/frames/blocks/frame_12.txt b/codex-rs/tui/frames/blocks/frame_12.txt new file mode 100644 index 0000000000..c6c0ef3e87 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_12.txt @@ -0,0 +1,17 @@ + + █████▓ + █▒░▒▓░█▒ + ░▓▒██ + ▓█░░░▒▒ ░ + ░ █░░░░▓▓░ + ░█▓▓█▒ ▒░ + ░ ░▓▒░░▒ + ░ ▓█▒░░ + ██ ░▓░░█░░ + ░ ▓░█▓█▒ + ░▓ ░ ▒██▓ + █ █░ ▒█░ + ▓ ██░██▒░ + █▒▓ █░▒░░ + ▒ █░▒▓▓ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_13.txt b/codex-rs/tui/frames/blocks/frame_13.txt new file mode 100644 index 0000000000..7a090e51e3 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_13.txt @@ -0,0 +1,17 @@ + + ▓████ + ░▒▒░░ + ░░▒░ + ░██░▒ + █ ░░ + ▓▓░░ + █ ░░ + █ ░ + ▓█ ▒░▓ + ░ █▒░ + █░▓▓ ░░ + ░▒▒▒░ + ░██░▒ + █▒▒░▒ + █ ▓ ▒ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_14.txt b/codex-rs/tui/frames/blocks/frame_14.txt new file mode 100644 index 0000000000..f5e74d12b7 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_14.txt @@ -0,0 +1,17 @@ + + ████▓ + █▓▒▒▓▒ + ░▒░░▓ ░ + ░░▓░ ▒░█ + ░░░▒ ░ + ░█░░ █░ + ░░░░ ▓ █ + ░░▒░░ ▒ + ░░░░ + ▒▓▓ ▓▓ + ▒░ █▓█░ + ░█░░▒▒▒░ + ▓ ░▒▒▒░ + ░▒▓█▒▒▓ + ▒█ █▒▓ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_15.txt b/codex-rs/tui/frames/blocks/frame_15.txt new file mode 100644 index 0000000000..f04599ea27 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_15.txt @@ -0,0 +1,17 @@ + + █████░▒ + ░█▒░░▒▓██ + ▓▓░█▒▒░ █░ + ░▓░ ▓▓█▓▒▒░ + ░░▒ ▒▒░░▓ ▒░ + ▒░░▓░░▓▓░ + ░░ ░░░░░░█░ + ░░▓░░█░░░ █▓░ + ░░████░░░▒▓▓░ + ░▒░▓▓░▒░█▓ ▓░ + ░▓░░░░▒░ ░ ▓ + ░██▓▒░░▒▓ ▒ + █░▒█ ▓▓▓░ ▓░ + ░▒░░▒▒▓█▒▓ + ▒▒█▒▒▒▒▓ + ░░ \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_16.txt b/codex-rs/tui/frames/blocks/frame_16.txt new file mode 100644 index 0000000000..1eb080286e --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_16.txt @@ -0,0 +1,17 @@ + + ▒▒█ ███░▒ + ▓▒░░█░░▒░▒▒ + ░▓▓ ▒▓▒▒░░ █▒ + ▓▓▓ ▓█▒▒░▒░░██░ + ░░▓▒▓██▒░░█▓░░▒ + ░░░█░█ ░▒▒ ░ ░▓░ + ▒▒░ ▓░█░░░░▓█ █ ░ + ░▓▓ ░░░░▓░░░ ▓ ░░ + ▒▒░░░█░▓▒░░ ██ ▓ + █ ▒▒█▒▒▒█░▓▒░ █▒░ + ░░░█ ▓█▒░▓ ▓▓░░░ + ░░█ ░░ ░▓▓█ ▓ + ▒░█ ░ ▓█▓▒█░ + ▒░░ ▒█░▓▓█▒░ + █▓▓▒▒▓▒▒▓█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_17.txt b/codex-rs/tui/frames/blocks/frame_17.txt new file mode 100644 index 0000000000..dd5f5c8da5 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_17.txt @@ -0,0 +1,17 @@ + + █▒███▓▓░█▒ + ▒▓██░░░█▒█░█ ▒█ + ██▒▓▒▒▒░██ ░░░▒ ▒ + ▓░▓▒▓░ ▒░ █░▓▒░░░▒▒ + ░▓▒ ░ ░ ▓▒▒▒▓▓ █ + ░▒██▓░ █▓▓░ ▓█▒▓░▓▓ + █ ▓▓░ █▓▓░▒ █ ░░▓▒░ + ▓ ▒░ ▓▓░░▓░█░░▒▓█ + █▓█▓▒▒▒█░▒▒░▒▒▓▒░░░ ░ + ░ ▒▓▒▒░▓█▒▓░░▒ ▒███▒ + ▒▒▒▓ ████▒▒░█▓▓▒ ▒█ + ▒░░▒█ ░▓░░░ ▓ + ▒▒▒ █▒▒ ███▓▒▒▓ + █ ░██▒▒█░▒▓█▓░█ + ░█▓▓▒██░█▒██ + ░ \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_18.txt b/codex-rs/tui/frames/blocks/frame_18.txt new file mode 100644 index 0000000000..a6c93e6c01 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_18.txt @@ -0,0 +1,17 @@ + + ▒▒▒█▒▒█▓░█▒ + ▒█ ▒▓███░▒▒█ █▓▓▒ + ▒▓▓░█ █▒ █ ▓▒ █▓▓▒ █ + █░░█▓█▒ █ █▒░▒▓▒░▒▓▒▒▒█ + ▒▒▓▓ ▓░ ▒ █▒▒▓░▓░▒▒▓▒▒▒ + ▓▒░ ██░▓▒▒▒▓███░█▓▓▒▓░▓░ + ░░▒▓▓ █▓█▓░ ▒▓ █░▒░▒█ + ▒▓░░ ▒▒ ░░▓▒ ░▓░ + ▒ █▒▒▒▓▒▓█░░█░█▓▒█ ░█░░ + ▒▒▒░█▒█ ░░▓▒▒▒▒░░░▒▓░░▒ █ + ░▓░▒░ █████░ ▒▒▒▓░▓█▓░▓░ + ▒▒ █▒█ ░░█ ▓█▒█ + ▒▒██▒▒▓ ▒█▒▒▓▒█░ + █░▓████▒▒▒▒██▒▓▒██ + ░░▒▓▒▒█▓█ ▓█ + ░ \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_19.txt b/codex-rs/tui/frames/blocks/frame_19.txt new file mode 100644 index 0000000000..73341b5d58 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_19.txt @@ -0,0 +1,17 @@ + + ▒▒▒▒█░█▒▒░▓▒ + ▒█░░░▒▓▒▒▒▒█▒█░███ + ██▓▓▓ ░██░ ░█▓█░█▓▒ + ▓▓░██▒░ ▒▒▒██▒░██ + ░░▓░▓░ █░▒ ▓ ░▒ ░▒█ + ░▒▓██ ▒░█░▓ ▓▓ █▓█░ + ▒▒░░█ ▓█▒▓░██░ ▓▓▓█░ + ░░░░ ░▓ ▒░ █ ░ ░░░ + ░█░▒█▒▓▓▒▒▒░░░░██▓█░▓ ▒ ░░ + ▒▓▓█░▒█▓▒██▒█░█ ▒▒ ▓▒▒▒█▓▓░▒ + █▒ ▓█░ ██ ▒▒▒▓░▓▓ ▓▓█ + ▒▒▒█▒▒ ░▓▓▒▓▓█ + █ ▒▒░░██ █▓▒▓▓░▓░ + █ ▓░█▓░█▒▒▒▓▓█ ▓█░█ + ░▓▒▓▓█▒█▓▒█▓▒ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_2.txt b/codex-rs/tui/frames/blocks/frame_2.txt new file mode 100644 index 0000000000..1c7578c970 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_2.txt @@ -0,0 +1,17 @@ + + ▒▓▒▓▒█▒▒▒██▒ + ▒██▓█▓█░░░▒░░▒▒█░██▒ + █░█░▒██░█░░ ░ █▒█▓░░▓░█ + ▒░▓▒▓████▒ ▓█▒░▓░█ + █▒ ▓█▒░▒▒▒▒▒ ▒█░▒░█ + █▓█ ░ ░█▒█▓▒█ ▒▒░█░ + █░██░ ▒▓░▓░▒░█ ▓ ░ ░ + ░ ▒░ █░█░░▓█ ░█▓▓░ + █ ▒░ ▓░▒▒▒░ ▓░█████████░▒░░█ + ▒▒█░ ▓░░█ ▓█ ░▒▒▒▒▒▒▓▓▒▒░█▓ ░ + ▒▒▒ █ █▒▓▓░█ ░ ███████ ░██░░ + █▒▒▓▓█ ░ ██▓▓██ + ▓▒▒▒░██ █▒▒█ ▒░ + ░░▒▓▒▒ ██▓▓▒▓▓▓▒█░▒░░█ + ░████░░▒▒▒▒░▓▓█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_20.txt b/codex-rs/tui/frames/blocks/frame_20.txt new file mode 100644 index 0000000000..3e0c5f0d9c --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_20.txt @@ -0,0 +1,17 @@ + + ▒▒█▒░░▒█▒█▒▒ + █▓▒ ▓█▒█▒▒▒░░▒▒█▒██ + ██ ▒██ ░█ ░ ▒ ▒██░█▒ + ▒░ ▒█░█ ▒██░▒▓█▒▒ + ▒░ █░█ ▒▓ ▒░░▒█▒░░▒ + ▓░█░█ ███▓░ ▓ █▒░░▒ + ▓░▓█░ ██ ▓██▒ █▒░▓ + ░▒▒▓░ ▓▓░ █ ░░ ░ + ░▓░░▓█▒▓▒▒▒▒▒▒▒██▓▒▒▒▒█ ▓ ░▒ + █░▒░▒ ▓░░▒▒▒▒░▒ █▒▒ ░▒▒ █▓ ░░ + ▒█▒▒█ █ ▒█▒░░█░ ▓▒ + █ ▒█▓█ ▒▓█▓░▓ + ▒▒▒██░▒ █▓█░▓██ + ▒█▓▓ ░█▒▓▓█▓ ░ ░█▓██ + ░██░▒ ▒▒▒▒▒░█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_21.txt b/codex-rs/tui/frames/blocks/frame_21.txt new file mode 100644 index 0000000000..971877651f --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_21.txt @@ -0,0 +1,17 @@ + + ▒▒█▒█▒▒█▒██▒▒ + ███░░▒▒█░▒░█▓▒░▓██▒ + ▓█▒▒██▒ ░ ░▒░██▒░██ + ██░▓ █ ▒█▓██▓██ + ▓█▓█░ █░▓▒▒ ▒▒▒▒█ + ▓ ▓░ ███▒▓▓ ▒▒▒█ + ░█░░ ▒ ▓░█▓█ ▒▓▒ + ░▒ ▒▓ ░█ ░ ░ + ░ ░ ██▓▓▓▓▓███ ▒░█ ░█ ▓▓ ░ + ░ ░▒ ░▒ ▒█░ ▒ ░█░█ ▓ ▓▓ + ▓ ▓ ░░ █░ ██▒█▓ ▓░ █ + ██ ▓▓▒ ▒█ ▓ + █▒ ▒▓▒ ▒▓▓██ █░ + █▒▒ █ ██▓░░▓▓▒█ ▓░ + ███▓█▒▒▒▒█▒▓██░ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_22.txt b/codex-rs/tui/frames/blocks/frame_22.txt new file mode 100644 index 0000000000..2713fd669e --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_22.txt @@ -0,0 +1,17 @@ + + ▒██▒█▒▒█▒██▒ + ▒█▓█░▓▒▓░▓▒░░▓░█▓██▒ + █▓█▓░▒██░ ░ █▒███▒▒██ + ▓█░██ ██░░░▒█▒ + ▒░░▓█ █▒▓░▒░▓▓▓█░ + ▒░█▓░ █░▓░▓▒▓░ ▒░▒▒░ + ░██▒▓ ░█░▒█▓█ ░░▓░ + ░░▒░░ ░▒░░▒▒ ░▒░ ░ + ░░█ █ █░▒▒▓▓▓▒██▒▒█░▒ ▒█ ▒░▓ + ▒░▒ █▒▒▒█ ▓█ ░▓▓░ ▒█▓▒ ░██ ▓▒▒ + ▒▒▒▒░ ██ ░ ░▓██▒▓▓▓ █░ + ▒█▒▒▒█ ▒██ ░██ + █ █▓ ██▒ ▒▓██ █▒▓ + █▓███ █░▓▒█▓▓▓▒█ ███ + ░ ░▒▓▒▒▒▓▒▒▓▒█░ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_23.txt b/codex-rs/tui/frames/blocks/frame_23.txt new file mode 100644 index 0000000000..39a6c55644 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_23.txt @@ -0,0 +1,17 @@ + + ▒██▒▒████▒█▒▒ + ▒▒░█░▒▒█▒▒▒█░▒░█░█▒ + █ █░██▓█░ ░▓█░▒▓░░█ + ▓▓░█▓▓░ ▒▓▓▒░░▓▒ + ▓▓░░▓█ █▓████▓█▒░▒ + █▒░ ▓░ ▒█████▓██░░▒░█ + ░░░ ░ ▓▓▓▓ ▒░░ ░██ + ░▓░ ░ ░ ░█▒▒█ ░ █▓░ + ▒ ▒ ░█░▓▒▒▒▒▒▓▒░▒█░▒ ▒▒ ░ ░░░ + ░▒▒▒░ ▒ ▓░▒ ▒░▒▒█░ ▒▒░ + ▓█░ ░ ░ █░▓▓▒░▒▓▒▓░ + █░░▒░▓ █▓░▒▒▓░ + ▒ ░██▓▒▒ ▒▓ ▓█▓█▓ + ▒▒▒█▓██▒░▒▒▒██ ▓▒██░ + ░ █▒▒░▒▒█▒▒██░ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_24.txt b/codex-rs/tui/frames/blocks/frame_24.txt new file mode 100644 index 0000000000..90ccc262f0 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_24.txt @@ -0,0 +1,17 @@ + + ▒░▒▓███▒▒█▒ + █ ▒▓ ░▒▒░▒▒██▒██ + █ █▓▒▓█ ░ ▓░▓█░███ ▒ + ██▓▓█▓░▒█▒░░▓░ ▒█▒░▒▒█ + █ ▓▓▒▓█ ░ ▓▒▒░░░▒░██ + ░█▒█▒░ ███▓ ▓░▓ ▓ ▒ + ░ ░░ █▓▒█▓ ▓▒▒░▒▒░▒ + ░ ▒░░ ░█▒▓▒▒░░▒▓▓░░░ + ░▓ ░▓▓▓▓██░░░██▒██▒░ ░ ░░ + ▒ ▓ █░▓██▓▓██░▓▒▒██░ ░█░ + ▒ █▒░▒█ ░ ▒█▓█▒░▒▓█░ + ▒ ▒██▒ ░ ▓▓▓ + ▒▓█▒░░▓ ▒▒ ▒▓▓▒█ + ▓▓██▒▒ ░░▓▒▒▓░▒▒▓░ + █▓▒██▓▒▒▒▒▒██ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_25.txt b/codex-rs/tui/frames/blocks/frame_25.txt new file mode 100644 index 0000000000..d8fd5b45a8 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_25.txt @@ -0,0 +1,17 @@ + + ▒█▒█▓████▒ + █ ███░▒▓▒░█░░█ + ▓░▓▓██ ▓░█▒▒▒░░░▒ + ░██░ ▓ ▒░ ▒░██▒▓ + █▒▒▒█▓█▒▓▓▒░ ░▓▓▒▓█ + ▒█░░░▒██▓▒░▓ ▓░█░▓▓░█ + ░▓░█░ ░▒▒▓▒▒▓░▒▓▒ ░▒░ + ░░░▓░▓ ░▒▒▒▓░▒▒░▒░░▒ + ▒█▒░ ░▒▒▒▒▒▒█░░▒▒░██░▒ + ▓▓ ░▓░█░▒░░▓█▒░▒█▒▓▒░ + ▒░█▓▒░░ ██▓░▒░▓░░ + ░▒ ░▓█▓▒▓██▓▒▓█▓▓░▓ + ▒░▒░▒▒▒█▓▓█▒▓▒░░▓ + ▒▓▓▒▒▒█▒░██ █░█ + ░█ █▒██▒█░█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_26.txt b/codex-rs/tui/frames/blocks/frame_26.txt new file mode 100644 index 0000000000..a4734b4486 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_26.txt @@ -0,0 +1,17 @@ + + ▒▓███ ██ + ▓█░▓▓▒░█▓░█ + ▓█ ░▓▒░▒ ▒█ + ▓█ █░░░▒░░▒█▓▒ + ░▒█▒░▓░ █▒▓▓░▒▓ + ▒ ░▓▓▓ █▒▒ ▒▒▓ + ░ ██▒░░▓░░▓▓ █ + ▓▓ ▒░░░▒▒▒░░▓░░ + ░ ▓▒█▓█░█▒▒▓▒░░ + ▓▒░▓█░▒▒██▒▒█░ + ░░ ▓░█ ▒█▓░█▒░░ + ▒▒░░▓▒ ▓▓ ░░░ + █ █░▒ ▒░▓░▓█ + ░ █▒▒ █▒██▓ + ▒▓▓▒█░▒▒█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_27.txt b/codex-rs/tui/frames/blocks/frame_27.txt new file mode 100644 index 0000000000..b99e90e6d4 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_27.txt @@ -0,0 +1,17 @@ + + ▓█████ + ░▓▓▓░▓▒ + ▓█░ █░▓█░ + ░░░▒░░▓░░ + ░ ░░▒▓█▒ + ░▒▓▒ ░░░░░ + ▒ ░░▒█░░ + ░ ░░░░▒ ░░ + ░▓ ▓ ░█░░░░ + █▒ ▓ ▒░▒█░░ + ░▓ ▒▒███▓█ + ░░██░░▒▓░ + ░▒▒█▒█▓░▒ + ▒▒▒░▒▒▓▓ + █▒ ▒▒▓ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_28.txt b/codex-rs/tui/frames/blocks/frame_28.txt new file mode 100644 index 0000000000..de6db173b4 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_28.txt @@ -0,0 +1,17 @@ + + ▓██▓ + ░█▒░░ + ▒ ▓░░ + ░▓░█░ + ░ ░░ + ░ ▓ ░ + ▒░░ ▒░ + ░▓ ░ + ▓▒ ▒░ + ░░▓▓░░ + ░ ▒░ + ░▒█▒░ + ░▒█░░ + █▒▒▓░ + ░ ▓█░ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_29.txt b/codex-rs/tui/frames/blocks/frame_29.txt new file mode 100644 index 0000000000..d7b871c9c3 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_29.txt @@ -0,0 +1,17 @@ + + ██████ + █░█▓ █▒ + ▒█░░ █ ░ + ░░░░▒▒█▓ + ▒ ░ ░ ░ + ░█░░░ ▒▒ + ░▒▒░░░ ▒ + ░░▒░░ + ░░░█░ ░ + ▒░▒░░ ░ + █░░▓░▒ ▒ + ░▓░░░ ▒░ + ░░░░░░▒░ + ░▒░█▓ ░█ + ░░█ ▓█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_3.txt b/codex-rs/tui/frames/blocks/frame_3.txt new file mode 100644 index 0000000000..833b2b3db2 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_3.txt @@ -0,0 +1,17 @@ + + ▒▓▒▓██▒▒▒▒█▒ + ▒██▓▒░░█░ ▒▒░▓▒▒░██▒ + █▓▓█▓░█ ░ ░ ░ ███▓▒░█ + ▓█▓▒░▓██▒ ░▒█ ░░▒ + █▓█░▓▒▓░░█▒▒ ▒▒▒░░▒ + ▓░▒▒▓ ▓█░▒▓▒▒ ░ ▒▒░ + ▒█ ░ ██▒░▒ ░█ ▓█▓░█ + █▓░█░ █▓░ ▓▒░ ░▒░▒░ + ▓ █░ ▓░██░░█▓░▒██▒▒▒██▒░▒ ▓░ + █▒▓▒█ ▓▓█▓▓▓░ ░█░▒▒█ ▒▓█▓▒░░▒░░ + █▒░ ░ ░░██ ███ ███▓▓▓█▓ + ██░ ▒█ ░ ▓▒█▒▓▓ + ▒▒▓▓█▒█ ██▓▓ █░█ + ▒▒██▒██▒▒▓▒▓█▓▒█▓░▒█ + ░███▒▓░▒▒▒▒░▓▓▒ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_30.txt b/codex-rs/tui/frames/blocks/frame_30.txt new file mode 100644 index 0000000000..9c27cf67d0 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_30.txt @@ -0,0 +1,17 @@ + + ▒▓ ████ + ▒▓▓░░▒██▒▒ + █▒░█▒▒░██▒ + ░░▒░▓░▒▒░▒ ▒█ + ▒█░░░▒░█░█ ░ + ░█░▒█ █░░░░▓░ + ▒▓░░░▒▒ ▒▓▒░ ▒░ + ░ ██▒░█░ ░▓ ░ + ░▒ ▒░▒░▒▓░█ ░ + ░░▒░▒▒░░ ██ ░ + ▒░░▓▒▒█░░░█░░ + ░█▓▓█▓█▒░░ ░ + ▒░▒░░▓█░░█░▓ + █▒██▒▒▓░█▓█ + ▒▓▓░▒▒▒▓█ + ░░░░ \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_31.txt b/codex-rs/tui/frames/blocks/frame_31.txt new file mode 100644 index 0000000000..c787451d71 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_31.txt @@ -0,0 +1,17 @@ + + ▒▓▓████▒█ + ▒██▓██▒ █▒███ + █░▒▓▓█▒▒░▓ ░▒█▒ + █░▓█▒▒█▓▒█▒▒░▒░░▒ + ▒░░░░█▓█▒▒█ ▒░▓▒▒ + ▓░▒░░▒░█ ▒▓██▓▓░█ ░ + ▓░░ ░▒█░▒▓▒▓▓█░█░▓░ + ▒▒█ ░░ ░▒ ░▒ ░░▒▓░ + ░▒█▒░█▒░░░▓█░░░▒ ░ + ░░░▓▓░░▒▒▒▒▒░▒░░ █ + ▒█▒▓█░█ ▓███░▓░█░▒ + ░░░▒▒▒█ ▒▒█ ░ + ▓░█▒▒ █ ▓ ░█░▓░ + ▓░▒░▓▒░░█░ █░░ + █ ▒░▒██▓▓▓█ + ░░░░ \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_32.txt b/codex-rs/tui/frames/blocks/frame_32.txt new file mode 100644 index 0000000000..e5e7adf64d --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_32.txt @@ -0,0 +1,17 @@ + + █████▓▓░█▒ + ▓█░██░▒░░██░░█ + ▓▒█▒▒██▒▓▓░█░█▒███ + █▓▓░▒█░▓▓ ▓ █▒▒░██ █ + ▓▓░█░█▒██░▓ █░█░▒▓▒█▒█ + ▒▓▒▒█▒█░░▓░░█▒ ░█▓ █ + █░ ▓█░█▒░░██░█▒░▓▒▓▓░█▒ + ░░░█▒ ▒░░ ▓█░▓▓▒ ▒░ ░ + ▒░░▓▒ █▒░ ▒▒░███░░░▒░ ▒░ + █ ▒░░█▒█▒▒▒▒▒▒░░█░▓░▓▒ + █▒█░░▓ ░█ ███▒▓▓▓▓▓▓ + ▒█░▒▒▒ █▒░▓█░ + ███░░░█▒ ▒▓▒░▓ █ + ▒▓▒ ░█░▓▒█░▒█ ▒▓ + ░▓▒▒▒██▓█▒ + ░░░ \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_33.txt b/codex-rs/tui/frames/blocks/frame_33.txt new file mode 100644 index 0000000000..31a607b29c --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_33.txt @@ -0,0 +1,17 @@ + + ▒██▒█▒█▒░▓▒ + ▒██░░▒█▒░▓░▓░█░█▓ + ▒▓▒░████▒ ░ █▓░░█ █ + █▒▓░▓▒░█▒ █░░▒▒█ + ▒▓░▓░░░▓▒▒▒ ░█▒▒▒ + ▓▓█ ▒▒▒▒░▒█ ▓▒▓▒▒ + ░░█ ▒██░▒░▒ ░█░░ + █░██ ███▒▓▒█ ▒ ░█ + ░░░ ░ █░ ▓████▓▒▒█░░█▓▒░▒░ + ▒▓░█ ▓▓█▓░░░▒▒▒▒▒░░█▒▒▒░░▓ + ▒▒▒█ ░▓░▓ ▓ ███ ░░█▓▒░ + ▒█▒██ █ ▓▓▓▓▒▓ + █▒ ███▓█ ▒█░█▓█▒█ + ▒░ █▒█░█▓█▒ ▓█▒█░█ + ▒▒██▒▒▒▒██▓▓ + ░░░░ \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_34.txt b/codex-rs/tui/frames/blocks/frame_34.txt new file mode 100644 index 0000000000..db99cb73d6 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_34.txt @@ -0,0 +1,17 @@ + + ▒█▒████▒░█▒ + ▒███▓▒▓░ ░██▒██▓█▒▒ + ▒▓▓█░█ ▓░█░ ░▒▒▒█ ███ + █▓▒░█▒▓█▒ █░██▒▒ + ▓▓░▒▓▓░ ░ █ ▒▒█▒▒ + █▓▒░░▓ ▒▒ ░▒█▒ ▒█▒░▒ + ░█▒░▒ █▒▒█░▒▒ ░▓░▒ + ▒░▒ ▓ ░█▒░▓ ░ ▓ ▒▒ + ██▓▓ ▓▒▓▓ ▒▒▒██████░▒▒ ░▒░ + ░░▒█▓██▒ ▓▓█░░░▒░▓▒▒▒█▓▒░░░░▒ + ▓▒▒█ ░▒░█▒ ██░░░░▒ █▓█▒░█ + ▓█▒▓▒▒▒ ▓▓▓░▓█ + ▒█░░█▒▓█ ▒█▒ ▒▓█░ + ▓▒▓░ ░██▓██▒█▒█░██▓█ + ░▒▓▒▒▒▒▒▒▓▒█▒▒ + ░░░ \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_35.txt b/codex-rs/tui/frames/blocks/frame_35.txt new file mode 100644 index 0000000000..814188563d --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_35.txt @@ -0,0 +1,17 @@ + + ▒██▓▒███▒██▒ + ██▒█▓░███ ░█░▓ ░█▒▒ + ▒▓▓░▓██░▒█ ░ ░ █▒█▓ ░██ + █▓▓█▓█▓█▒ ██▒▒░▒ + ▓▓░░▓▓▒ ▒██ ░▒█░█ + ▓▓▓▓█░ █░▒ ▓▓█▒ ░▒▒░ + ▒ ▓▓ ▒▒ ██▒▓ ░▒▒▒ + ░░░▓ ▓▒▒▓▓█ ▓ ▓ + ▓ █▒ █░░▓▓ ▓░▒▒▒▓▒▒█░░ ░░▒█ + ░█▒▓█ ▓▓▓ ██▓░▓ ▒█▒▒▒▒▓ ░▓█ ░█ + ▓░▒██▓▒▒░▓▒░ ░ ▒▒▒▒█▒▒█▓▓▒█░ + ▓▒▒▓░ ▒▓█ █▒ + ▒▓░▒▓█▓█ █▓▓▒███ + ▒▒ ░█░▓▓░░█░▓▓█ ▒▓▓ + ▒░▓▒▒▒▓▒▒███ ▒ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_36.txt b/codex-rs/tui/frames/blocks/frame_36.txt new file mode 100644 index 0000000000..cde83b56f4 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_36.txt @@ -0,0 +1,17 @@ + + ▒▒█▒████▒██▒ + ▒▒ ▒█▓▓▓█▒█▓██ ███▒ + █▒█▒███▓█ ░░ ░ █░██░██░█ + ▒░ ██▒▒▒▒ ██░▒ ░ + █▓▒▓▒█░▒░▒█▓ ▒▒▓█ + ▓ █▓░ █▒ ░▓█ ▒▒█ + ░ ▓ ░ ▒ ▒▒ ░▒░█ + ░░▒░ ▒▒ ▒▓▓ ▒░ ░ + ░█ ░ ▓▓ ██ ████▒█████▒ ░▒░░ + ▒█░▒ █░▒▒▓░▓ ░░▒▒▒▒▒▒▒░░ ▒▓█░ + █ █░▒ █▒█▓▒ ██▒▒▒▒▒ ░█ ▓ + ██ ▒▓▓ █▓░ ▓ + ▒▓░░█░█ ███ ▓█░ + ██▒ ██▒▒▓░▒█░▓ ▓ █▓██ + ░██▓░▒██▒██████ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_4.txt b/codex-rs/tui/frames/blocks/frame_4.txt new file mode 100644 index 0000000000..7ad27d16e7 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_4.txt @@ -0,0 +1,17 @@ + + ▒▓▒▓█▒▒█▒██▒ + ▒▓ ██░▓ ░▒▒▓█▓░ ▓██▒ + ██▒░░░██ ░ ░▒░▒▒█░▓▒▒▒ + ▓▓░█░ ▓██ ░██▒█▒ + ▓░▓▒░▒░▒▓▒░█ ▒ ▒░█▒ + ▓░░▒░ █▒░░▓█▒ █ ▒▒░█ + ▒░▓░ ███▒█ ░█ █ ▓░ + ░▓▒ █░▓█▒░░ ░░░ + ▒░ ░▒ ▓░▓ ▒▓▓█░███▒▒▒▒██ ░░█ + ░▒▓ ░ █▓▓▓█▒░░▒▒░█▓▒█▓▓▒▓░▓▓ ░ + ░░▓█▒█▒▒█▒▓ ████████▒▓░░░░ + █░▒ ░▒░ █▒▓▓███ + ▒▒█▓▒ █▒ ▒▓▒██▓░▓ + ░░░▒▒██▒▓▓▒▓██▒██▒░█░ + █▒▒░▓░▒▒▒▒▒▓▓█░ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_5.txt b/codex-rs/tui/frames/blocks/frame_5.txt new file mode 100644 index 0000000000..24f9843954 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_5.txt @@ -0,0 +1,17 @@ + + ▒▓▒▓▓█▒▒▒██▒ + ▒█ █▓█▓░░█░▒█▓▒░ ██ + █▒▓▒█░█ ░ ▒▒░█▒ ███ + █░▓░▓░▓▒█ ▓▒░░░░▒ + █▒▓█▓▒▒█░▒▒█ ░ ▒░▒░▒ + ░░░░▓ ▒▒░▒▓▓░▒ █▓░░ + ░▓░ █ ░▒▒░▒ ░█ ██░█░█ + ░▓░▒ █▒▒░▓▒░ █░▒░ + ░█░▒█ ▓▒░ █░█▒▒░█░▒▒▒██▒ ░▓░ + ▒▒░▒██▓██ ░ ▓▓▒▒▒█▒▓█▓░▓█░░ + ▒█░░█░█▒▒▓█░ ██ █░▓░▒▓ + ▒▒█▓▒▒ ░ ▓▒▓██▒ + ▒▓█▒░▒█▒ ▒▒████▓█ + ▒░█░███▒▓░▒▒██▒█▒░▓█ + ▒▓█▒█ ▒▒▒▓▒███░ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_6.txt b/codex-rs/tui/frames/blocks/frame_6.txt new file mode 100644 index 0000000000..fe185a7573 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_6.txt @@ -0,0 +1,17 @@ + + ▒▓▒▓▓█▒▒██▒▒ + █▒▓▓█░▒██░██▓▒███▒ + ███░░░█ ░ ░▓▒███▓▒▒ + ▓█░█░█▒▒█ ▒█░░░░█ + █▒░░░█▒▒██▒ ▓▒▒░▒█ + ▓▓▓░▓░▒█▓░▒▒░█ ▓▒▒▓░ + ▒ █░░ ▒▒░▓▒▒ ▒█░▒░ + ░ ░░░ ▒░▒░▓░░ ░█▒░░ + ▒▓░▓░ ▓█░░█▓▓█▒░█░▒▒██▒▓▒▓░ + ░░▒█▓▒▒▒▓█ ░▓▒██░░█▓▒▒▒░█░▒ + ▓ ░ ▓░░░▓▓ █ ██ ░▒▒▓░ + █ ▓ ▓█░ █▓▒▓▓░░ + ▓░▒▒███ ▒█▒▒▓███ + ░ ░██ █ ▓░▒▒████ ▓▓█ + ▒▓▓███▒▒▒░▒███ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_7.txt b/codex-rs/tui/frames/blocks/frame_7.txt new file mode 100644 index 0000000000..7441f97e96 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_7.txt @@ -0,0 +1,17 @@ + + ▒▓░▓██▒▒██▒ + ██░█▒░███▒▒▒▓ ░██ + █ █░░░█░ ░▒░░ █▓▒██ + ▒▒░░░░▓█ ▒░▒█░▓█ + ░█░█░░▒░▓▒█ ▓ █░░▒ + ░ ▓░░ ░█▒▓░▒ █▓░░░ + ░▒ ░ ▒▒░▒░▒░ ██▒░░ + ▒ ▓░░ ▒█▓░█░░ █ ░░░ + ▓ ░█ █ ▒▓░▒▓░░▓▓▒░░▒▓█▒░░ + ░██░░▒▓░░▓█░▓▒░░▒▒█▒█▓▒░▒░ + ▒ ▒▒▓█░█▒▓ ██████ ▒▓░░ + █▒ ▓▒▓▒░ █ ▓▓▓▓█ + █▓██▒▒▒▒ █▒░██▓██ + ▒▒█▒░█▒▓░▒▒▒██░██▓ + ░█ ░▓░▒▒█▒▓██ + \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_8.txt b/codex-rs/tui/frames/blocks/frame_8.txt new file mode 100644 index 0000000000..ea88b09538 --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_8.txt @@ -0,0 +1,17 @@ + + ▒▒█▒▓██▒██▒ + █ █▓░░░█▒▒ ░ █ + ▒░▒█░▓▓█ █ ░▓░█▒█▒█ + ▒█▒█▓░██░ █ ▒▒░░▒ + █ ▓░▓█▒░▓▒ ▓█▒░░█ + ░██░▒▒▒▒▒░▒█ ▒█░░░ + ░█░░░ █▒▓▒░░░ ░▒░▓░█ + ▒█░░▓ ░█▒▓░██▓ ▓░▓░░ + ▒ ▒░░▒▒ ▓█▒░░▓█████▒░░░ + ▒█▓▒▒░ █░█░░▓░▒▒▒░░▒█ + ▓▓▒▒░▒░░░▓█▒█▒█ ▒█ ▓▒░ + ██ ░▒░░░ ▓█▓▓▓█ + █▒▒█▒▒▒▒ ▒▓▒▒░█▓█ + ▓▓█░██ ▓▓██▓▓▒█░░ + ░░▒██▒░▒██▓▒░ + ░░ \ No newline at end of file diff --git a/codex-rs/tui/frames/blocks/frame_9.txt b/codex-rs/tui/frames/blocks/frame_9.txt new file mode 100644 index 0000000000..9066ba1bed --- /dev/null +++ b/codex-rs/tui/frames/blocks/frame_9.txt @@ -0,0 +1,17 @@ + + ▓▒▒█▓██▒█ + ▓█▒▓░░█ ▒ ▒▓▒▒ + ▓ █░░▓█▒▒▒▓ ▒▒░█ + ░░▓▓▒▒ ▒▒█░▒▒░██ + ▓█ ▓▒█ ░██ █▓██▓█░░ + ░ ░░░ ▒░▒▓▒▒ ░█░█░░░ + ░ ░█▒░██░▒▒█ ▓█▓ ░░░ + ░ ░▓▒█▒░░░▒▓▒▒▒░ ░░ + █░ ▓░ ░░░░█░░█░░░ + ░▒░░░▒█░▒░▒░░░░▒▒░░░ + ░▒▓▒▒░▓ ████░░ ▓▒░ + ▒░░░▒█░ █▓ ▒▓░░ + ▒█▒░▒▒ ▓▓▒▓░▓█ + ▒▓ ▒▒░█▓█▒▓▓█░░ + █▓▒ █▒▒░▓█▓ + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_000.txt b/codex-rs/tui/frames/codex/frame_000.txt deleted file mode 100644 index 0e0f20c87b..0000000000 --- a/codex-rs/tui/frames/codex/frame_000.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eeeedcccccccccoee - oecxocccceeeedooeecceccce - eoxeccceoexccxxcdcxcccccoe cce - ocxoocecoocc oxxcccde co - ecxooceoo cccxoeco - oxxoocox oeoxxeee - ooxoc xc xceeec edexoex - ooxxccxe ceecxoxx eceexoex - ccxxexc xcdeeeeox cocxeeo - xecxeexx cexceoxxeo oxexx x - oxdx ex ceod cxd cxxxdx - c ee ox ceoxxc dc exxxx - xexx o oxooc oxe eddcdccccccccco xdox x - cxd xo eoxxcc oce oxxdeccccccccc xdexex - eoxeo xe cxoe exe cxcoooooo x xxcxe - eexxeexo ccccd ooeoocoo - eeex ede dcdcoeoo - exxxo cxee execxcexc - coccxo cocc deccxcccodc - cxcxxc eeoccexceeoooccccxcxccceoce - cccccdoxxcdxocccdxxdccc eccc - cccdxcxxdeeeeeeocdcce - eeccccccce - - diff --git a/codex-rs/tui/frames/codex/frame_004.txt b/codex-rs/tui/frames/codex/frame_004.txt deleted file mode 100644 index 5b0eefe662..0000000000 --- a/codex-rs/tui/frames/codex/frame_004.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eeeedcccccccccoee - oeoxoccccceoeooo ccceccce - eoxxcxcedexccxxcdxxcccccde cce - oxcoocecxocc cccede co - ecxoocedoc ccccxoeco - oxxooeox eoxxeee - oxxcc xc edceeec cdcxocx - ooxxcexe ceeeeoeo oecxxex - ccxxoxc exxxeeee ecocxxeo - xccxe x oexcceoxc xexx x - cxoxcex ceoxc oco dxxxcx - c eo cxo eoxxc odce xx x - xexxccce dxooo doee eddcdccdcccccco o ox x - cxo xe oxxcccoc c xecccccccccccc xdexex - ecxeecxo cxoc exc oocdccexxxdddcc oooxexe - eeexoexe cccc e ooeoxcoo - oeexecece ecdcocoo - eexxoocoee eodcxcexc - cocxxe cocc eeccxccxedc - cxcxxc ccoccxxceeooocccxxdxccceoce - eccccdeoxxdcxccccxcdcccceccc - cccxxccddeeeeeeocdcce - eeccccccce - - diff --git a/codex-rs/tui/frames/codex/frame_008.txt b/codex-rs/tui/frames/codex/frame_008.txt deleted file mode 100644 index 1b2911ff74..0000000000 --- a/codex-rs/tui/frames/codex/frame_008.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eeeedcccccccccoee - eeoxcccxceeoeooo eccxccce - eoxxccceodcccxcddxxcccecde ceo - oxxcxceecxcco cccede co - ocxooeoxc ccecxocco - oxxocexc ooeo ceexxeee - oxooooxc cecoecd ecxoee - oxox ox exccecoc eexdex - xxxe xxe cxxdxoee cecxoxx - xxex xxc ce xexeco exx x - xxex xc ccxxd dxo xxxex - oxod ec ecxxe exe e xxxxxe - ccxx xx oooce xo decdcdccdcccccco ecxx x - cxex cox exxoeoexc oexxcccccceccccc xeexex - xexe eee eccoo oc eecxccxxxxddddc ocxxeoc - exxd eee ecccc ocoocoo - oxxe cxxe eodcococ - ocxxe ecce eoxcocexc - e eece exccoedx eeccxccxedc - cxcxco ccxccxxceeoooccccxcxccceece - exxcoeexxcdooxxcxxxdccccexcc - cecxxxcdeeeeeeeocdcce - eeccccccce - - diff --git a/codex-rs/tui/frames/codex/frame_012.txt b/codex-rs/tui/frames/codex/frame_012.txt deleted file mode 100644 index 3db39633b1..0000000000 --- a/codex-rs/tui/frames/codex/frame_012.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eeedcccccccdooe - eooxccccceeooe dxeccxccce - ecxoxceoedccxxcddccccceedoeccco - oocxceexcxcco cxcceo cce - exoxcddcccoo cxcxe ce - oxxecxoc oooe xcx eee - oxxoexxe deeococd cecxeeco - oxxoexco ecexeeeee coxoeee - xxcexxce eoexxeecee ecx ex - xxc cxc eecxxxoce cxxo oo - exx xx coeee dx xxx xx - xxx xxc oxxc ecoe xxxxxx - ocx xxo deoxocxcoc ocdddccccccccco xxx xx - xe xo xxoceoxc e xxocccccccccccccex excx x - xxx cox cxx ooeec eecdccccoxxxxdddceeoxxooc - xxe coe cccc eoooodx - exe coco oxcocox - exxo cocce eoxooceoc - cxxxe cccccee edcxeoxddoe - ecxxe ccxcxxccedoooccccxxxxceeece - ccceoe cccdxxxxxxcccce eccc - cccccodeeeeeeeeoddcce - eccccccce - - diff --git a/codex-rs/tui/frames/codex/frame_016.txt b/codex-rs/tui/frames/codex/frame_016.txt deleted file mode 100644 index daac17bdd2..0000000000 --- a/codex-rs/tui/frames/codex/frame_016.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eeeoccccccccooe - oeocxccceeoxeooeccxcccoe - odocceedcccxxcddccxxxoeeeccceo - eocceodcccccx eccxecexocee - occoxxccc ccxxxdecd - exxodxc ooo cxxococo - exxxoxoc xxceexo exd eee - xxxox cxeococee cxx dxe - xooxxo cxxexeecee cxd oxo - xooxx eexxxeceeo cxx xxc - xex xcx cxx ocdxc xx oe - xee xco dcoocxocc cxc oe - xo xxx eoocoxxc occcddcccccdcco cxcexx - cxoxoeo oxcodecox coccccccocccccccx exxoox - ceo xexe coeoedc xeccccccxxoxxxxc oeceex - eeo eece cccce exexoccc - cec ecxc oxoxcoxc - cxdececxce eoxxcooxc - cxdeceoxxceeo edoxxcxeoo - cxxoeccxxxcxccddoooocccxxxcc ecc - ecceee eccccxxxxxxcccc eococ - cxcdxdoeeeeeeeeoddccc - eccccccce - - diff --git a/codex-rs/tui/frames/codex/frame_020.txt b/codex-rs/tui/frames/codex/frame_020.txt deleted file mode 100644 index cff12de7ff..0000000000 --- a/codex-rs/tui/frames/codex/frame_020.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eeeecdccccccoeee - oeoxccceeedooeecccccccdoe - odcxcoeddcxdccddccocxccecxceox - oceeedococc oexeeccccce - oc ooccocec ccxeceeec - oe excoe oo edcoeoo - o oxex ocecx eee xcee - oe oxocx xodcoeee ee xexo - ecoexeo cxexoecxe xo dxc - x exxx cxdccoeee cx xcxx - xxcxxe eeexc dxxc xxexo - xocxxeo oco docoe xecxx - excxxxe oooedxeo edccccddddddddoe xeexe - coeexoeo ecccocc occcccccccccccxo exoxx - xeexecx ecdooe xccccccxxexxcxo eeexeo - xe xeoe ee ecoooo - xeoecocex ooexceo e - exocccoce eocoxxeoo - cxdecedxccoeo eoocexxcocc - ccxo ccxxxxcccooooocccxxcccedcoc - cccee ccccccccxoodcce ecccee - cccxxooeeeeeeeoocccc - eccccccee - - diff --git a/codex-rs/tui/frames/codex/frame_024.txt b/codex-rs/tui/frames/codex/frame_024.txt deleted file mode 100644 index 43c0dd4444..0000000000 --- a/codex-rs/tui/frames/codex/frame_024.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eoecdcccccdeee - eodxce c ccceccxcccodoe - eoc eocccdccddccedoeocxcccco - oc occeccec exceoecccexe - oc eoccoe dcce eceee - o doeo dceo coccdeox - x oooe ecex ceccxeex - x xode xxceco xxcxeox - oe ox e eecee deocoxcd - xoxxxo xoe cee ccx xecc - xoxxeo ex cec ooxxxe - xexcex cec ecc exxxxx - xocoxc xoeccoo edcccdddcdcddce ec xxxx - xoxcex exccexc xdeeccccccccccxoc xxcxoxo - xocoeee eeode ccccecceeecccxo exocec c - xecoeco oxeco o - cxecoece eceecc o - xe ecccce oocoeoeo - cxecxeedccee ecceccdceoe - cxeecexccxxeccdeeecccccocodoococ - ccxoe cccccxcccxcccxccccoxce - ecccdddeeeeeeoccxcccc - ecccccceee - - diff --git a/codex-rs/tui/frames/codex/frame_028.txt b/codex-rs/tui/frames/codex/frame_028.txt deleted file mode 100644 index 835aee7460..0000000000 --- a/codex-rs/tui/frames/codex/frame_028.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eoexdcccccdeee - odcce eccxcexo - edce eocccxxcdddcece eecceco - eoc ecccoo xeo ccdeco - occeoc oe exc deeeee - xoooo e oc cxoeeexoe - xcoxcd e coccc ceccexoe - oxxoc e oececd cooeoeox - xeexoo eeeee cc x xxe - xcdcx oeccoec ex cex o - xdxxexc x e oeco dcecxxdc - x xxxo xxcccc c cxcxxxo - xx cxxe coo ocoeodcccdddccdcd occdxxo - x xx x edxo oe cdddceeddddcexo xoxxo o - xeeodc ece cdddxeeeeeeecc doexd o - xeecec excx o o - cxeexxce oxooec oe - xoedco eoceoeo oe - cxecdxxc e eeccxxc cec - cxdcxcxxcxedcdeccccxxxceooexeoe - cxcoxxxxccccccxdccoeeooeoc - ccxccxxdxxxxeccxxccc - ecccccce e - - diff --git a/codex-rs/tui/frames/codex/frame_032.txt b/codex-rs/tui/frames/codex/frame_032.txt deleted file mode 100644 index efcb8195d4..0000000000 --- a/codex-rs/tui/frames/codex/frame_032.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eocdcddcccddeo - eoocc ccxeecce - edcxeoccccxcddccco eeccccc - excdxcceccxo xeo eee co - ocexcc od xo xeo ce - ocoxcoe e dxe eeoexo - ocoxcxde xeoe coece xcxe - exeoc o oeeoe c o eee - xoex c eoeeeee eceoxoex - x xx x xeococo eoeoxceo - cexxcc eexocooeo xxxocxx - ocxxe cooccoxc o xxxxc - xxxxcx exeexe eocdxdcddddc xoxcxx - xoox e ceexo xecccddedddeo dcexxxxx - cxxox ccccdexdxexc oxox c o - xoeoecx ee dcxooc o - xeexxoe oceoxo oe - xxcceec excoo oooe - cdeeccocx oxceocoeeo - cxxcoccexcdxdoooccxxceooee cc - cxxxxcxccccccccceoecceeoe - eccxdeeeeeeoccdccocc - ecccccce e - - diff --git a/codex-rs/tui/frames/codex/frame_036.txt b/codex-rs/tui/frames/codex/frame_036.txt deleted file mode 100644 index a600c78685..0000000000 --- a/codex-rs/tui/frames/codex/frame_036.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eocccdcccdeeo - eecccedoo cccccxccxeo - oxcddccccccdccxo coec cee - excxoceecc co oxeece - oooxcc xe eeoo ee - ooooo e e cexeoce - xooo deeec e eeeoee - xexx eecoceco oee oeex - xxee ocooece o eeceeoe - x xc ocxxoodeeo d xxooxx - x ec eeecooedo x xxx xx - xede cxo occ x exxxcx - xooc x ocoxc oeccccccdcd cxxxexxx - xxoxeo c oc xcccccccccee o xcexxx - xdox x ecccccxdeexc xcxcxxxee - cxccx x eeeee eo ooo x - exxxd e oxex o - exxeeecd oc oc oe - cxxoxeec excooeoc o - exxccdcxcecdeoocxxeecdxe oc - ccecccccxcxcccededcceoc - ccodeeeededccoceoce - ccccee ce - - diff --git a/codex-rs/tui/frames/codex/frame_040.txt b/codex-rs/tui/frames/codex/frame_040.txt deleted file mode 100644 index e110f93586..0000000000 --- a/codex-rs/tui/frames/codex/frame_040.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eocccccdcceee - odcceoeeecccxxdcxcce - oxcecccccxdccdeccxce eee - ocoxcedcc ccce ce - xecxe ocoxo ex - xxcx eeoe ooec ex - deox ceeexe coceeeoe - xxxe xee xe oceoxx ee - ecxx eee eec exexxxxx - xxxx oxeoxeeeo ccxdxdoc - oxxx exeoexoo xoxxxexx - eoxx eeooc o e x xxxxxx - xcxc eoeo oeecccccccc cexxeoox - cooo co occcccccccxx x x xxxe - xxoo eccccexdedxc ocxcxxxxx - xooxoc e eeeee x eoxxxxc - xxee ce xexeoxxox - xeccece exeoooc x - xxoxeec ocecooe eo - ceccedoxcccooeoccoooce oc - cce cccxxxxcceodece oc - ccdeooeecccdcedcc - ecccee e - - diff --git a/codex-rs/tui/frames/codex/frame_044.txt b/codex-rs/tui/frames/codex/frame_044.txt deleted file mode 100644 index f522c4b16f..0000000000 --- a/codex-rs/tui/frames/codex/frame_044.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eocdcceccceee - ooceooocccxcxd cce - exxdccccxccdececod cc - ococo xoee eeo - oecoe eexdc xo - oxc eeo eoexe oo - xoo cxeo oedecee - x x exeoeeo eo xx x - oeex cxcoeexe oexxx x - xxc eeexcxc xeoxd o - cxc eoxoccx cxxxcxxx - oxce oooxo xxxxexxx - xxox ex ox eecccccccocxxxxooxx - cxx x oxo cccccccceoox exoxxx - xoceeoo occddxdcxoeoexxxxx o - xxoec ex eeeeece xoxx cx - xoeeoo oexc oxee - eoxeeee ocoo o oc - eoxeccco ocoodo oo - eecxcceccoeeoceooee dc - ceecccddxcceecexe oc - ecoeeeooocddeeoce - eccce ce - - diff --git a/codex-rs/tui/frames/codex/frame_048.txt b/codex-rs/tui/frames/codex/frame_048.txt deleted file mode 100644 index b1fda5075e..0000000000 --- a/codex-rs/tui/frames/codex/frame_048.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - oedxcooccoo - ocxdoecedxcdcceo - ooxcccxcceeeee ce - oxoco exee oex - xxee xeee cex - eec eoe eoxodoee - xoxxxooc o ee ece - e x coe e xdcee x - oxxe oxxxeo x xeexxx - xxe cxood c oocxoodo - xxx xeexxx xoxxcoxx - xxxe e ccc xexxxxxx - xxoe xo eeccccc xexxxxxx - xxcxoeo ccccccxe xcxxxxxx - oxxcxe ccdxdcoc xcxxx ee - xoccx ecxxx xxxex - ccdx x ecoexxxxeo - xxooeee xoo oxxox - coxxecceo exoxoxc ooe - cocececcceooeo od xe - ceeccdxocedcoce eo - cceeeeccdce eoe - ecceeeece - - diff --git a/codex-rs/tui/frames/codex/frame_052.txt b/codex-rs/tui/frames/codex/frame_052.txt deleted file mode 100644 index f6c55ac3ad..0000000000 --- a/codex-rs/tui/frames/codex/frame_052.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eodccodecoe - ocoocecoe cexo - xoocccecoeoec ee - dxoco cxoo ee - xxe o exee ece - xxceeee xdxcc xx - ccxxeccc e cx cxoo - xx xxxex o xx exe - oox ooexe xxxo cx - xxc xxxee xooxxex - xxo cxoxe xoxdoe xoo - xxo xdoecc eoexxxd xx - xo xx eeecccceexxxxxxx - xc ec cccccexxcexxxxxe - xxo x eddexcxxd xx x - oxx oo ecxxx xx cx - xxcx eeoc xx ex - xxxe xxooexxco - xxce oxeexxxx o - excdeceecoexc oox - eecxcoeoexc oo - cceeoceocoexc - ccceccc - - diff --git a/codex-rs/tui/frames/codex/frame_056.txt b/codex-rs/tui/frames/codex/frame_056.txt deleted file mode 100644 index 4391e74d4e..0000000000 --- a/codex-rs/tui/frames/codex/frame_056.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - odccooecoe - ooeeeoodccxo - dxoceecxe cxo - cxcoxexco coce - xex eeoeee cod - xeoeco xxexc cx - xxxo x cxx edxxe - eoco xxo ex x - cxcxcc excexxo - eoecedx xxcxxoox - xoxddcx xxoccxox - xococcx xxce xxx - coexeeec xxoxxcxx - dexcccxe xxd xx x - cex d xxxxxxxex - xxceco e oxxxx ox - xxx xx e exxxx x - exc e dxxx odoee - xce x x eece xx - exeecoeoox xxec - ecoccodc co - ceeoec ec - ccecccc - - diff --git a/codex-rs/tui/frames/codex/frame_060.txt b/codex-rs/tui/frames/codex/frame_060.txt deleted file mode 100644 index 3f002f8991..0000000000 --- a/codex-rs/tui/frames/codex/frame_060.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dccoocco - e exo ccoe - oxxxoeceee - oooxdx cxxx - xxxoxco cxx - xxexooxex ex - xxocxxox xx - xxccxxxxecc o - xxoxxcoexxxex - xxxxx xxx eex - xxecc xccxcxx - xxeex x cxoxx - xxeexeeoxxxxc - xxxxxxxxx xe - xxexcx xxx xo - xxexxxxxxxxcx - xeooox o x - xxoxxcdxxc - oxxxexceexe - xecxec xcxx - d x ee oeec - ccx ccodxx - cccecce - - diff --git a/codex-rs/tui/frames/codex/frame_064.txt b/codex-rs/tui/frames/codex/frame_064.txt deleted file mode 100644 index 59f853965c..0000000000 --- a/codex-rs/tui/frames/codex/frame_064.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - cccoccco - xexc ccdx - xexc xeoe - xxxeeecxo - xooxocexx - cco eeoex - cocxocccx - exex xoee - exdeo ox - xxxeeexxe - xxxcoccxxx - xxxxoodox - xxxxxxexxe - xxxxxxeexe - xxxxxxxxxx - xxoxxxxxcx - xxxxxxxxex - xxxxxxxxox - xxcxeooxex - exdxxocxee - excx x x e - cocc oco - cccccce - - diff --git a/codex-rs/tui/frames/codex/frame_068.txt b/codex-rs/tui/frames/codex/frame_068.txt deleted file mode 100644 index 99d4683512..0000000000 --- a/codex-rs/tui/frames/codex/frame_068.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - occooocdo - eoceoxe c - xoecceexed - cxo o xcxox - xxx eexxx x - ccxoxoexe x - exxexxxxx x - oxxxoxexxx x - xxxxxxexxc x - xexxxxcoxe x - xxccxexoxoox - xocoecccxxox - ex xxx xxxcx - e xxxoxxxcx - exxxxcxcxxx - eexxx oexxx - xoxxxeoxxox - xxedcxxeodx - xcxoooxoxex - cecc xccxee - xxo xxoxox - xoe xceee - ecccccce - - diff --git a/codex-rs/tui/frames/codex/frame_072.txt b/codex-rs/tui/frames/codex/frame_072.txt deleted file mode 100644 index a93d3bfc6e..0000000000 --- a/codex-rs/tui/frames/codex/frame_072.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ocxdodcxo - oeexoxeoeoc - xxc e oxeceee - oee cxxxxoc o - xxoxoexcxccdxco - xcxoxxxxxxx ex - exxccecxox ooxo - xxxxxexxxecx ex - xxxxxxxxcxxx oox - xxxxdoxxo ecxxxx - xxc exoxoooxooxx - xxexdoeceeeeceex - xxxxxecxoodcddxx - xxxxx xcxxxxxcxx - xx e xxcxceexcxx - xcecxcxxxeeoeex - xo cxcxe xxxoe - xxx eoeeocxoxx - cxoedo dxxoxxox - xxc c ccoexcx - oe o ecxcdoo - coxo eeeeo - ccceccce - - diff --git a/codex-rs/tui/frames/codex/frame_076.txt b/codex-rs/tui/frames/codex/frame_076.txt deleted file mode 100644 index 248cc9e5e1..0000000000 --- a/codex-rs/tui/frames/codex/frame_076.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ecccdoccxee - ceoxxeeeceoce - xxoxceoxexccoee - xoeoooexcocecccxo - ocdxecooxx oceo - xeeoo eooce exo - exoeeocxxec exx - xxeeoxx xxxcd ox - xxecxxeeeeexx odxx - exxxxx exeo xxex - xxxxxo oxexoxx xoex - xxxxxo eoe xex cxex - xxxxx oxxedcodxxx - xxxxx oxdeoxxeoxc xx - xxxxx eexxeeccoxcoxx - xxxx eexxceeeoxexox - xxxx exo xcxec - cxxxxx cx ooecxc - xeceoxxcoo ox xoe - coeo xxeexocdxecc - cxoo eecoocdoeo - cecc cceceedc - ceececce - - diff --git a/codex-rs/tui/frames/codex/frame_080.txt b/codex-rs/tui/frames/codex/frame_080.txt deleted file mode 100644 index 6ce6bd6e49..0000000000 --- a/codex-rs/tui/frames/codex/frame_080.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - odcxeodcxee - occ ccxxceodxco - xecoooox ccccccoe - ocxx ooxoooece ccee - xcoxxooxec oexo - ooxoooeec e eo - xxoeexoxc ece eoxo - dxx xxcccx edxe cxo - xexccxexxe oeeoo xx - exxxcxxxx exxe xox - xxxxxeexx do o ocox - xxxxcxexx xexe cxxx - xoxxecxxx oecxd c oexxx - xxxxx oxc xdxcex c eexex - xxxxo cx ce o exo ocxxc - xxxxx cx oco exxxex - xxxxxcxx oxxxe - dexxeocxce oee - cxo exeeeee exce - eee eeeeecocceexoco - cxe cd cdcocec - cee ccecoeedce - eceeeecce - - diff --git a/codex-rs/tui/frames/codex/frame_084.txt b/codex-rs/tui/frames/codex/frame_084.txt deleted file mode 100644 index 1f21c1e2a8..0000000000 --- a/codex-rs/tui/frames/codex/frame_084.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eodceodcccco - exc dcxxccedoecee - exceeo ooecccccccexe - ooco ecococd ee ecex - ooco xooxxc cxx - xoeooccoec e ceo - xxxoexoxxc cee oxe - xx oxeexo xoeee coxo - xcxocxxcc eoexe cxe - xxxxxcdxx eeoo xxx - xoxxcexcx o exce xxe - xceoceexx xecoex exo - xc eoxoxx coececddccee eexo - xx eecxxxx oooeo cxcce xxxx - xc ccxxex eo x excx ccocx - x cccxc xo exxe - ee cexexox oxoxox - exe cece e xoeeee - xx ecxe xe oc cxco - ee ecoxeeceeecceodxco - cxe eeeex cccccccoc - cce cceceeeeeoc - eceeeecce - - diff --git a/codex-rs/tui/frames/codex/frame_088.txt b/codex-rs/tui/frames/codex/frame_088.txt deleted file mode 100644 index 8288ef49cb..0000000000 --- a/codex-rs/tui/frames/codex/frame_088.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - oodxedcddccoe - ooe cdoxoceededcco - eoeo ococecccxxcxcxdco - ox cooooodcx cxoecexe - oeceococc eoeexe - oxooooode e cc cxx - exeecx oo xcd e exoo - xxeooccx xoco e ccxx - ccc xee eoecxee cexo - xxxxxddx ocoec coxxx - xxxxxxxo d eoxex coxxo - xecxxxxx ocxoeeoc oxxe - xx xoxxx xxecoxc cccee dxxc - coc cox oooocoo ecccxo xxxxx - x o xxe exxo eccco xcc - cod xcxc eoe xxoo - xo exeeoeo ecooxee - coecocxoeo dcooeeo - xdeeoexoce eoeoxoxo - xd eeee ccoeedcexxxcec - cxeececex ccdccccceoe - cco ecoccdeeeecce - cceecccce - - diff --git a/codex-rs/tui/frames/codex/frame_092.txt b/codex-rs/tui/frames/codex/frame_092.txt deleted file mode 100644 index afcc3863e7..0000000000 --- a/codex-rs/tui/frames/codex/frame_092.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eoodceccccdxoe - ecx ccxccccedoxdcceo - eoceooccccecccxxccccdeeo - ocoodce coc eoeccxoe - xeo oced xo cee - xxeeeco ced ccxx - occcxoeo oxcec eoex - exooxxdx xooce cxoe - xexx xec xooceee xxx - xxx oxx xooce oxx - exxxxex oddecc xxo - exxexxx ooooco xcc - xxxoxxx oeoooooe ddccccxd ocxc - xxxxceo dooooxc cdcccxce oxxe - cxxxexxoe cox e cxcdcdxc xecxx - cexxxoo x ceoe e c xx - coeeocecx oc xeeo - cxeeeoee x xeooxo - cxeeeexeeco edcceooco - ee coxxoecceeeecccoxcccoc - ceeeexeoo ecccccccceec - cceecocxoeeeeeocc - ec eecccce - - diff --git a/codex-rs/tui/frames/codex/frame_096.txt b/codex-rs/tui/frames/codex/frame_096.txt deleted file mode 100644 index bd0c20af91..0000000000 --- a/codex-rs/tui/frames/codex/frame_096.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eecxocccccxee - eocecxxccxcedoocxcccoe - eoedoccc eeocccxxcccdeocee - oc ooxe eocccdce - x oxoo c ocoe - xoooxoc ocec cee - cddoxoo oocee ccex - doodxeo xxocx ecxoo - cecccx xoxox e xxx - exxxexe eeeexec xxo - xcxcoxx o ecxxxo oxxxx - xxecxxx xodeo oec xoxxxx - cxxxxxx xooo oc dccccdde ecxcoe - oxxxxoo xoocedco xecccxcc x exo - x xxxxx coo oe excccdc xcdoxo - execooo xeoc dccxxxe - ceex ooe cdccxoeo - execxexeco eocdcoxo - ceeeoxed coo ecc xccoo - ee ecxeecccdeeeecccdecxocxe - ee eccxooeccccccccccecc - ccoeeoexoeeeeeedcce - eceeecccce - - diff --git a/codex-rs/tui/frames/codex/frame_1.txt b/codex-rs/tui/frames/codex/frame_1.txt new file mode 100644 index 0000000000..63249f4242 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_1.txt @@ -0,0 +1,17 @@ + + eoeddccddcoe + edoocecocedxxde ecce + oxcxccccee eccecxdxxxc + dceeccooe ocxdxo + eedocexeeee coxeeo + xc ce xcodxxo coexxo + cecoc cexcocxe xox + xxexe oooxdxc cex + xdxce dxxeexcoxcccccceco dc x + exdc edce oc xcxeeeodoooxoooox + eeece eeoooe eecccc eccoodeo + ceo co e ococex + eeoeece edecxecc + ecoee ccdddddodcceoxc + ecccxxxeeeoedccc + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_10.txt b/codex-rs/tui/frames/codex/frame_10.txt new file mode 100644 index 0000000000..fe5e51b984 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_10.txt @@ -0,0 +1,17 @@ + + eccccecce + ccecccexoeco + eeoxxoxxoxceoo + xeeoexdeoeocceeo + o dxxcxe cooeoxo + xe cxcxooe eecx + e xcccxxxxc xoo + c xxecocxxoeeoexx + c xe eexdxxcecdxx + x oxeoxeoeceeexce + o cxxxxxcc eocexe + eecoeocc exccooo + xc xxxxcodooxoe + deccoxcde ooc + co eceeodc + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_100.txt b/codex-rs/tui/frames/codex/frame_100.txt deleted file mode 100644 index 65ae59b2a6..0000000000 --- a/codex-rs/tui/frames/codex/frame_100.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - oeecdcccccccee - oceodocceoccecoexcccce - eceeoccoooeocccdxxcccdexcco - oc oodoo xocedoco - exoeoccce e ccoc - exexooo ode oeox - xoeooeo oxcxe oeeox - oooxxoe cxeexee eeoxe - x oocx ceoecd e xxx - xexxcxx cxeccedc xoxo - x cxxec cx eoe ec xxex - xeceeex oeeco ex xxcx - x ecxxe xeecoeeo dddddccdcdee exoxx - ce xxx xeoocxoo xxocccxdeeex xxce - xdcxeoee xcox ec cxcxcddccd dxeed - cexxxce x xeoc cc eooce - exxxxex xe ococxxo - edcexxeeco oxeceecooo - co ccxxocxe edccecoxoc - ce ccxcecxxdceeoocccxecccxoo - coeccxde cxccccccccccoce - ecoeccccedeeeeeooccc - e eccccce - - diff --git a/codex-rs/tui/frames/codex/frame_104.txt b/codex-rs/tui/frames/codex/frame_104.txt deleted file mode 100644 index c31a6eb9cd..0000000000 --- a/codex-rs/tui/frames/codex/frame_104.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eoodcdcccccccee - eccoxocce cccco - oceoccc eodcccdxxcccdoxxcce - ocdooeoceoc decxoecee - o dococoo cxooeece - ccocco o ddee e xcoe - xcoxeocx odccoe ce xooe - xeeeooooe eeoeeeee e eoeo - xdxexee cxe cxcx e xxec - xcxxxxcx o xxooxex xoco - cxccxx x eeo xc ox c xx x - xxeoxx x ecoode oc xoxxcx - ec xxxcx ocooxcoxe dccdcccddo exxxox - eecco o oeoxo ex coecccxdcec ocxexe - e xxxxox cooxee xccxxddccc exxxx - cxeeeexcx co eexee - eeeoexoexe eoeococc - cdcxxeo xo edcecoxxc - ce ccxdecxoe ecceoeccoe - cd cccdecxccccoeoocccxedcoxcoc - cceececee ccxccccccccxcxoc - cx ccxccoeeeeeeoeccc - e ecccccce - - diff --git a/codex-rs/tui/frames/codex/frame_108.txt b/codex-rs/tui/frames/codex/frame_108.txt deleted file mode 100644 index a865caed66..0000000000 --- a/codex-rs/tui/frames/codex/frame_108.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eoeddccccccccoee - odxccccc ccoe - eoccxcdoooecccxxxxxcccceedcco - eocoocdeodc eocccxxco - oedocxeox coeccoxe - xxoxoccxx ocxe o xeeeo - xeoxocex eddoxc eeeexeco - ocxeeocx cxdecee eeceexe - xxxxxox cxdexxo cceoex - xxexxoo ocxeceec exo xxx - ccxexox x xxooxx o xoeo - cexexex oeooccox ooxe x - e oxxo x ec oooooo ocddccccccdcoo xdxxee - ce xxxex cecoococ oxxeccccdceccc cxxxx - xoeexo xe oxooo eeccxxddcc xx o - xcxoooceo oeooxoxc - cecxoxecee edceooxoe - cccxxxo xo eceodddoe - eeecxeocxce ocexcxcec - ccecxccececcccceeodcccxedcxceeoe - coccxxeecccxcccccccccxeecc - ccoccxxcdeeeeeedcccc - e ccccccce - - diff --git a/codex-rs/tui/frames/codex/frame_11.txt b/codex-rs/tui/frames/codex/frame_11.txt new file mode 100644 index 0000000000..48e507a84a --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_11.txt @@ -0,0 +1,17 @@ + + occcccce + oc dxxxeeo + oceexxdecoeo + xeexxddoedoo + ecodexcecdexxo + xcexxceddxeoxx + cc oxxxxxxexde + x xxoxxeo xcx + o cxoxxcocxex + cc exodocoxexe + ceo xxxxdoxeex + eeooxecoccdxe + e cxeeeexdc + ec cxxoeoce + ee cccece + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_112.txt b/codex-rs/tui/frames/codex/frame_112.txt deleted file mode 100644 index 23351643d8..0000000000 --- a/codex-rs/tui/frames/codex/frame_112.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eeeddccccccccoee - eocooxccoecc ccce - ocoxcdccoeococcdxxxccccce cce - ococcccddccxe occcdocee - ocxxcocox ccccooce - oooxec o doooe ed ceecx - oeooocexe eeeecce ce ex x - ooxeeccx cxeedocde ce ex x - xxxxxcoe ceeceeec eo xxco - exxcxeox ecxececoc x xxex - xec x e cceoe o xoexox - xexex e ececo oc coxxxx - ce exe x oxoxe exe odddcddccdccoe ecxxex - o xxxcx eoooce dc exxdcccccccexcxoxexecx - eocecocx xxcdoc cdecxccddccccoexdxoe - ecxox ce oeeeceo - ecxxeeece eoeooo o - eoxxxeoeee eccocoxoc - cocxxdocdccee eoccxcoxeoe - coecxeoocxccccceeodcccxeccxccecc - ccexxee e ccxcdcccccccccecce - eeocccxccoeeeeeedcccce - e ccccccce - - diff --git a/codex-rs/tui/frames/codex/frame_12.txt b/codex-rs/tui/frames/codex/frame_12.txt new file mode 100644 index 0000000000..29de69516a --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_12.txt @@ -0,0 +1,17 @@ + + ccccco + odeeoxoe + c xoeco + ocxxxddcx + x cxxxxoox + xcoocecexc + x xoexxe + x ocexxc + co xoxxcxx + x oxcdce + xo xcdcco + o cx eox + o ccxocex + ceocoxexe + e cxeoo + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_13.txt b/codex-rs/tui/frames/codex/frame_13.txt new file mode 100644 index 0000000000..67fe336a13 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_13.txt @@ -0,0 +1,17 @@ + + occco + xeexx + xeexc + xccxe + c xx + cdoxx + o xx + c cx + oc exo + xc cdx + ceoo xe + xeeex + xcoxe + ceexd + o ocd + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_14.txt b/codex-rs/tui/frames/codex/frame_14.txt new file mode 100644 index 0000000000..f8d32cd6d1 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_14.txt @@ -0,0 +1,17 @@ + + ccccd + ooeeoe + xexxo x + xxoxcexo + xxxe x + xcxx cx + xxxx o c + xxexe e + xxxx c + ceoo do + exccooox + xcxxeeex + o cxddde + xeoceeo + ec cdo + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_15.txt b/codex-rs/tui/frames/codex/frame_15.txt new file mode 100644 index 0000000000..2e14341237 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_15.txt @@ -0,0 +1,17 @@ + + cccccxe + eodxxedco + ooxcdexccx + xoe ooooeex + xxdcdexxocex + exxoxxoox c + xx xxxxxxox + xxoxxcxxx cox + xxcoocxxxeodx + xexdoxexco ox + xoxxxxex e d + xccoexxeo d + cxeo oooe de + xexxeeoceo + eeceeeeo + ee \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_16.txt b/codex-rs/tui/frames/codex/frame_16.txt new file mode 100644 index 0000000000..c90ce92cb6 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_16.txt @@ -0,0 +1,17 @@ + + edcccccxe + oexxcxxexde + xooceodexx ce + ooo dceexexxccx + xxdeoccdxxcoxee + xxxcxc xed x xox + eex oeoxxxxocco x + xod xexxoxxxcd ex + eexxxcxoexxccc o + cceeoddecxoex oex + xxxcccocexdcdoxxe + xxc xe eooo o + exc x oooeox + exxcecxoocex + cdoeddeedc + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_17.txt b/codex-rs/tui/frames/codex/frame_17.txt new file mode 100644 index 0000000000..e1f2bb6d96 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_17.txt @@ -0,0 +1,17 @@ + + odcccddxoe + edccxxxcdcxoceo + oceoeddecocxxxece + oxoeoxcee cxdexxxde + xoe x xcoedeoo o + edcooe odox oodoxoo + c dox oooxe ccxxodx + ocdx ooxxoxoxxddc + oocoeddcxeexeedexxx x + xcedeexoceoxxe eccce + eeeoccccccceexcooe ec + exxec eoxxe d + eee cee ocooeeo + o xccdeceedcdxc + ecdoeocxcecc + e \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_18.txt b/codex-rs/tui/frames/codex/frame_18.txt new file mode 100644 index 0000000000..be64251770 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_18.txt @@ -0,0 +1,17 @@ + + eddcddcdxoe + eccedoccxeeoccdde + eodxcccdcocoeccooe c + oxxcooecc ceeeodxedeeeo + eeoo ox ecceeoxoxeedeee + oex ooxoeeeoocoxcooeoeox + xxedo cocoxceoccxdxdo + ceoxx eecxxde xdxc + ecc oedddddcxxoxcoeo xcxe + eeexcec xxoeeeexxxedxee o + xoxeeccccccce eeeoxocoeoe + ee oeo eeccocec + eecceeo eceeoeoe + cxoccccdddecceoeoc + cxxeoeeooccdcc + e \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_19.txt b/codex-rs/tui/frames/codex/frame_19.txt new file mode 100644 index 0000000000..8904157121 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_19.txt @@ -0,0 +1,17 @@ + + eeddcxcddxoe + ecxxxeodddeceoxcoo + ocddocxcce ecdoecde + odxcoee eddcoexco + xxoeoe oxecocxe xeo + xeocc excxo oo cocx + edxxc oceoxcoe odocx + xxxx xdcexco x xxx + xcxeoddddddxxxxccdcxd e cxx + edooxdcoecceoeo ee deeeoooxe + cecocxcccccccc eeeoxoo ooc + eeecee eooeooc + c eexxco oddooxde + ccoxcoxceeddocc dcxc + cxoedoceooecoe + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_2.txt b/codex-rs/tui/frames/codex/frame_2.txt new file mode 100644 index 0000000000..a3c0663db4 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_2.txt @@ -0,0 +1,17 @@ + + eoeddcdddcoe + ecoocdcxxxdxxdecxcce + oxcxeccxcee eccdcoxxdxo + exoeoccooe ooexoxo + oecocexeeeee eoxexo + cocce xcecoec eexcx + oxccx eoxdxexo ocxcx + xc ee oxcxxdc xcoox + cccdx dxeeexcoxccccccccoxexxc + edcx oxxc oc xdeeeeeooeexco x + eee c ceooxc ecccccccccxocxx + ceeooo e ocdooc + oeeexco odec exc + exedeecccdddddodceexxc + eccccxxeeeexdocc + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_20.txt b/codex-rs/tui/frames/codex/frame_20.txt new file mode 100644 index 0000000000..cea5393f75 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_20.txt @@ -0,0 +1,17 @@ + + eecdxxdcdoee + oddcdoeodddxxeececo + oocecccxcc ecececcxce + excecxc eocxeocee + ex oxc eo exxecexxe + oeoxc cccdxco cexxe + dxdcx oc occe oexo + xeeoe ccddxco xxcx + xoxxdoddddddddeocdeeeec o xe + cxexec oeeeeeexe ceecxde oo xx + eoeecccccccccc eodxxox oe + c ecoo eocoxo + eeecoxe odcedcc + eooocxceddodcxceoocc + eccxe deeeexccc + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_21.txt b/codex-rs/tui/frames/codex/frame_21.txt new file mode 100644 index 0000000000..efa6d610d9 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_21.txt @@ -0,0 +1,17 @@ + + eeodcddcdcoee + occeeeecxdxcdeeocce + dceeccece eexcceeco + ocxdcc eodcodco + oooce oxoee eeeeo + ocox occeoo eeeo + xcxe e oeooc edec + ee ed cxo x x + x x ocdddddccc exocxo do x + x xe xe eox ececxo ocoo + d co eeccc ce cceod oe o + cc dde ecc o + ce eoe eodcc oe + cde ccccdxxdddccc oe + cccdceeeeoedcce + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_22.txt b/codex-rs/tui/frames/codex/frame_22.txt new file mode 100644 index 0000000000..91c9c2ecaa --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_22.txt @@ -0,0 +1,17 @@ + + eocdcddcdcoe + ecocxoeoxoexxdxcocce + odcdxecce ecceccceeco + dcxccc ooxxxece + exxoc oeoxdxoodcx + excoe oxoxdeoe exedx + xcceo xcxecoc xxox + xxdxe xexxee xexcx + xxoco cxddddddcceecxe eo exdc + exd ceeeo oocxoox ecdecxoo oed + eeeex cccccccce edcceooocoe + eceeeo ecocxoc + cccd cce eococceo + cdccoccxddcddodccccoc + cxcxedeeeodeodce + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_23.txt b/codex-rs/tui/frames/codex/frame_23.txt new file mode 100644 index 0000000000..5b5f1be139 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_23.txt @@ -0,0 +1,17 @@ + + eocedccccdcee + edxcxeeoeddoxexcxce + occxcodce cxdcxedxxo + odxcdoe eddexxde + ooxeoc ooooccocexe + oexcoe ecccccoccxxexo + exxcx odoo exe c xcc + xox x xcxoeeo x cox + ece xcxddddddddxecxecee x xxx + xeeexcdc oee exeeox eex + ocx x eccccccc ceoddxeoeoe + oxxexo ooxeeoe + e xocoee eocdcoco + edecdccexddecccoecce + cx cdexeeceecce + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_24.txt b/codex-rs/tui/frames/codex/frame_24.txt new file mode 100644 index 0000000000..c0269d8eda --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_24.txt @@ -0,0 +1,17 @@ + + exedcccddoe + oceocxeexddcoecc + occdeoccx oedcxcco e + ocooooxdoeexoe ecexeec + o ooeoo eccoeexeeexoc + xoecee cooo oxd oce + x xx ooeoocoeexeexe + x exx xodoeexxeooexx + xo xddddccxxxccecoex x xx + e o cxoooddooxoeeccx xcx + e cexeccccccce eoocexdooe + e eoce x codo + eoceexo edceodec + oocoeecxxddddxeeoe + cdeccdeeeddcc + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_25.txt b/codex-rs/tui/frames/codex/frame_25.txt new file mode 100644 index 0000000000..5b040665d0 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_25.txt @@ -0,0 +1,17 @@ + + ecdcdcccce + o coceedexcxxo + oxoooocoxcedexxxe + xccx o dx cexoceo + oeeeoocedoexc xooeoc + eoxxxeccoexd oxoxooxo + xoxcx xeeoeeoxeoecxdx + xxxoxoc xedeoxeexdxxe + ecexcxeeddddcxxeexccxe + oocxoxoxexxdcexecdoex + excoexecccccccoxexoxe + xecxdcdeoocdeooooxo + eeexeeecdooeoexxo + eodeeecdxcc cxc + xoccecoecxc + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_26.txt b/codex-rs/tui/frames/codex/frame_26.txt new file mode 100644 index 0000000000..1592c09e8c --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_26.txt @@ -0,0 +1,17 @@ + + edccccco + ocxdoexcdxo + occcxdexecceo + dccoxxxexxecoe + xeoexoxcceodxed + e cxodocceeceeo + x ccdxxoxxddcc + oo exxxeedxxoxx + x oecdcxcddoexx + oexooxeeoceecx + xecoxcceooecexx + eexxoe oocxxe + c cxe eeoxoo + xcceecceccd + eodecxeec + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_27.txt b/codex-rs/tui/frames/codex/frame_27.txt new file mode 100644 index 0000000000..5279157c04 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_27.txt @@ -0,0 +1,17 @@ + + dcccco + xddoxoe + dce cxocx + xxxexxdxx + x exeocd + xeoecexxxe + d cxxecxx + x exxxdcxx + xo o xcxxxx + cd ocexecxx + xo eecccoc + xxccxxeox + xddcdooxe + eeexedoo + cec eeo + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_28.txt b/codex-rs/tui/frames/codex/frame_28.txt new file mode 100644 index 0000000000..ea695865f4 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_28.txt @@ -0,0 +1,17 @@ + + occd + xcexe + d dxe + xoecx + x xx + x ocx + exx ex + xoccx + oe ex + xxodxx + x ex + xdcdx + xdcxx + ceeox + x ocx + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_29.txt b/codex-rs/tui/frames/codex/frame_29.txt new file mode 100644 index 0000000000..328d426a41 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_29.txt @@ -0,0 +1,17 @@ + + ccccco + oxco ce + eoxx ccx + xxxxeeoo + e xcx x + xoxxx ee + xeexxx e + xxdxx + xxxcx e + exdxx e + cxxoxe d + xoxxx ex + xxxxexex + xdxcocxc + xxc oo + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_3.txt b/codex-rs/tui/frames/codex/frame_3.txt new file mode 100644 index 0000000000..3e9206577a --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_3.txt @@ -0,0 +1,17 @@ + + eoddccddddoe + ecooexxcxcddxdeexcce + odocdxccce ecx cccoexo + ocoexdoce edc xxe + cocxoeoxxcee eeexxe + oxeeo ooxedee x eex + dc x ccexecxo ocoxo + ooxox ooxcoex xexdx + occx dxccxxcoxdcceeeccexecdx + oedeo oocoddx xcxeeo doodeexexe + cex x cxxcoc cccccccccoooooo + ccx ec e oeceoo + deooceo ocdocoxc + decoecceddddoddcdeecc + ecccedxeeeexdoec + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_30.txt b/codex-rs/tui/frames/codex/frame_30.txt new file mode 100644 index 0000000000..b9da98c5c3 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_30.txt @@ -0,0 +1,17 @@ + + edcccco + eodxxeccde + ccexoeexcoe + xxexoxeexe eo + dcxxeexoxo x + xcxec cxxxxox + eoxxxee eoex de + cx ccdxoxcxo e + cxecexdxeoxo e + cxxexeexx co e + exxdeecxxxcxx + xcoooocexxc x + exexxocxxoxo + oeocdeoxooc + eooxeeedc + eeee \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_31.txt b/codex-rs/tui/frames/codex/frame_31.txt new file mode 100644 index 0000000000..baef07474c --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_31.txt @@ -0,0 +1,17 @@ + + eodccccdo + eccdcoeccecco + oxeooodeeocxece + oxoceecdeoeexexxe + exxxxcoceeocexoee + dxeexexccedcoooxocx + oxx xecxeododcxcxox + eeo xxcxe xeccxxeox + xeoexcexxxocxxxe x + cxxxooxxeeeeexexx c + eceocxo occceoxcxe + xxxeeeo edc x + dxcde o o xceoe + dxexoexeoxcoxe + ccdxeccoodc + eeee \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_32.txt b/codex-rs/tui/frames/codex/frame_32.txt new file mode 100644 index 0000000000..c0997d9a14 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_32.txt @@ -0,0 +1,17 @@ + + occccddxoe + dcxccxexxccxxo + oecdeocedoecxcecco + cooxeoedo o oeexco o + ooxoxceccxd ceoxeoeceo + eoeeoecxedxxce xco c + cxcdoecexxooxodeoeooxce + xxxoe cexxcocxdoecexcce + exxoe cexceexcccxxxdxcde + ccceexceceeeeeexxcxdxoe + oecxxo xccccccedooooo + eoxeee oexocx + cccxxxce eoexo o + eoecxcxddceecceo + xddeeococecc + eee \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_33.txt b/codex-rs/tui/frames/codex/frame_33.txt new file mode 100644 index 0000000000..cd8691c150 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_33.txt @@ -0,0 +1,17 @@ + + eocdcdcdxoe + eccxxecdxdxoxcxco + eoexcccodce ccoxxcco + oeoxoexoe cxxeec + eoxoexxoeee xceee + ooo eeeeeeo oeoee + xxc eocxexe xcxx + cxoo occeodo ecxc + xxx x oe ocooodddcxxcoexex + eoxccodooexxeeeeexxceeexxo + edeo xoxo o ccccccc xxooee + ececoco oododo + ceccocdo ecxoocec + exccecxodcecdoecxc + cddcoeeeeccdoc + eeee \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_34.txt b/codex-rs/tui/frames/codex/frame_34.txt new file mode 100644 index 0000000000..ef8eabf7dc --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_34.txt @@ -0,0 +1,17 @@ + + eodccccdxoe + ecccoedxcxccdccdode + eoooxccdxce eeeeoccco + ooexceooe cxocee + ooxeoox xc o eecee + ooexeo eecxece eoexe + xcexe ceecxee xdxe + exdcd xcexocx o ee + ocooc oeooceddccccccxeec xee + xxeooooecoocxxxexoeeeooexxexe + oeeo xexce ccceeeee oooexc + ooeddee odoxoc + ecexcedo ecdceooe + oeoxcxcodocdcdceccdc + cxeddeeeeeddcde + eee \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_35.txt b/codex-rs/tui/frames/codex/frame_35.txt new file mode 100644 index 0000000000..1c53d2373f --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_35.txt @@ -0,0 +1,17 @@ + + eocddcccdcoe + ocdcoxccccxcxdcxcde + eooxdccxecce eccdcocxco + ooocoodoe cceexe + ooxxooe ceco xecxo + dodoce cxecooce xeex + e oo ee cceo xeee + xxxd oeedoc o co + o oe oxxodcoxddededcxx xxdc + xoedc oodcccoxd eoeeeeocxoc xc + oeeocoeexoee eceeeeceecooeox + coeeox eoc oe + edeedodo odoeccc + ceecxcxodxxcxdocceodc + cexddeeoeecccce + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_36.txt b/codex-rs/tui/frames/codex/frame_36.txt new file mode 100644 index 0000000000..4928a2a9d0 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_36.txt @@ -0,0 +1,17 @@ + + eecdccccdcoe + edccecodocecdcccccce + oeceoccoccee eccxccxocxo + exccceeee ccxecx + ooedecxeeeoo eeoc + o ooe ce cxoo ceec + x d e e cee xexo + xxex ee eoo ex x + xccx oo occcocceccccce xexx + ecxe oxeeoxo exeeeeeeexx eoce + c cxe cecoe ccceeeeec xoco + cocedo ooxco + eoxxcxo occcooe + coecccdedxecxdcocodcc + eccoxeooeooccccc + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_4.txt b/codex-rs/tui/frames/codex/frame_4.txt new file mode 100644 index 0000000000..a5ae50eeae --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_4.txt @@ -0,0 +1,17 @@ + + eoddcddcdcoe + eocccxo xedocdxcocoe + ocdxxxccce eexeecxoeee + ooxoxcoco cxccece + oxoexdxedexo ecexce + oxxex cexxoce c edxo + cexde ccceccxo o cdx + xoe oxocexx xxx + ex xe dxoceoocxccceeeeoo xxc + xeo x oooooexedexooeodoedxoocx + exdceoeeoeo ccccccccceoxxxe + oxecxee oedoccc + eeode oe eoeocdxo + xxxdecceddddocdccexce + ceexdxeeeeedoce + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_5.txt b/codex-rs/tui/frames/codex/frame_5.txt new file mode 100644 index 0000000000..47abf7a0af --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_5.txt @@ -0,0 +1,17 @@ + + eodddcdddcoe + ecccocoxxcxdcdexcco + ceoecxcce cedxce oco + oxoxoxodo oexxxxe + oeocoeecxeeo e exexe + xxxxo eexedoxe coxx + xox c eeexecxo ccxcxo + xoxec oedxoex cxex + xoxec oexcoxcdexcxeeecoecxox + eexeoooccc xc ooedeodoooxocxe + eoxxoxoeeoce ccccccccoxdxeo + eecoee e oeocoe + eocexdce edcoccdc + excxoccedxdeocdcexdc + eocecceeeoeocce + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_6.txt b/codex-rs/tui/frames/codex/frame_6.txt new file mode 100644 index 0000000000..ba04c52772 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_6.txt @@ -0,0 +1,17 @@ + + eodddcddccee + oedocxdccxccdeocce + oooxxxcc ecxodcccoee + ooxcxcedo ecxxxxo + cdxxxceecce oeexeo + dooxoeecdxeexo odeox + e cxx eexoee ecxex + x xxx exdxoxx xcexx + eoxox ocxxcdocexcxeecceoeox + xxeooeeedc xodcoxxodddexoxe + o x oxxxdoc cccccccceeeox + o d ooe odeooxe + oeeecco eceeococ + ecxcocc dxeeoccc ddc + eodccoeeeeeocc + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_7.txt b/codex-rs/tui/frames/codex/frame_7.txt new file mode 100644 index 0000000000..f7dd0de9b6 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_7.txt @@ -0,0 +1,17 @@ + + eoxdccddcoe + ocecexcccdded eco + c oxxxce eexe coeco + eexxxxdc execxoo + ecxcxxexoeo o cxxe + x dxxc ecedxe ooxxx + eecx eexexex ccexx + ecoxx dcoxcxe c xxx + ocxc oceoxeoxxddexxddcexx + xocxxddxxocxoexxeeododexex + e deocxceo cccccccceoxx + ce oeoee ocoodoc + cdoceeee oexococc + eecexcedxeeeccxcco + cxccxdxeeoedcc + \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_8.txt b/codex-rs/tui/frames/codex/frame_8.txt new file mode 100644 index 0000000000..e3f93702f7 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_8.txt @@ -0,0 +1,17 @@ + + eecedccdcoe + occoxxxcdd x cc + exdoxooc ocxoxceceo + ececoxocx c dexxe + c oxooexoe ocexxo + xcoxeeeeexec ecxxx + xcxxx cedexex xexoxo + eoxxo xceoxoco oeoxx + e exxee ocdxxococooexxx + ecodexcoxoxxdxdeexxdc + ooeexexxxocececceccoex + cocxexee oooooc + ceeceeee eoeexcoc + odcxoc ddccdodoxe + xxeccexeocode + ee \ No newline at end of file diff --git a/codex-rs/tui/frames/codex/frame_9.txt b/codex-rs/tui/frames/codex/frame_9.txt new file mode 100644 index 0000000000..210e417d43 --- /dev/null +++ b/codex-rs/tui/frames/codex/frame_9.txt @@ -0,0 +1,17 @@ + + odecoccdo + oceoxxccd eoee + o oxxoceedo eexo + c xxodde eeoxeexco + occdeccxco coccdcxx + x xxxcexedee xcxcxxx + e xcexccxeeocooo exx + x xoeoexxxeodeex xx + coxc oxcxxxxcxxoxxe + xexxxeoxexexxxxeexxx + c eeoeexocccccxxcoex + exxxeoe oo eoxe + ecexee odedxoc + eoceexcocdddcxe + coe ceexdcoc + \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_000.txt b/codex-rs/tui/frames/default/frame_000.txt deleted file mode 100644 index abe1b5d34c..0000000000 --- a/codex-rs/tui/frames/default/frame_000.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                     ____=+++++++++,__                       -                 ,_*|/*"+*`__`:..``"*`**+_                   -              _/|\*"*`,_|+*||*=+|"***+,_  "+_                -            ,*|/,*_+,/** -|~"*+;_ *,              -          _*|/,*_//    +"*|,^*,            -         ,||//'/| ,\,||_\\           -        //|/" |*  |"\\\* ^;\|,^|          -       ,/||*"|`    *\_'|/|~  `*\^|,^|         -       **~|\|*   |*;\\\_/|  *,*|_\,        -      |\"|`_|~     *\|*^/||^.  .|`|| |        -      /|;~ \|   +_/:  *~:  "~||:|        -      " \\ /|    '_/||"  ;*        \||~|        -      |`||  /      ,|//" /|`  _==+=+++++++++,  |:/| |        -        *|; |,   _/||*' /*`  /~|=^******"""  |;\|\|        -       \.|\/ |\  *|/` _|`     "~"------ | ||'|`        -        \\||_^|,   *++*;                  ,/`//"//         -         \\\|  \=_                       ;*;*/`//          -          \|||, *|\_    _|_+|*_|'           -           ',**|, *,*+    :_+*|*+*-;*             -             "~*||+ `\,**\|+__,,,++**|+|+*'_,*`              -                *"**+;,~|*=~/"**;||=+*" _+*"                 -                    **+;|+||;______,+;**`                    -                         ``""*""""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_004.txt b/codex-rs/tui/frames/default/frame_004.txt deleted file mode 100644 index c7431d5d0b..0000000000 --- a/codex-rs/tui/frames/default/frame_004.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                     ____;+++++++++,__                       -                 ,_/|/*"+*"_,`... '"*`"*+_                   -              _/||*|*`;_|+*||*=||"***+;_  "+_                -            ,|*/,*_+|/*" +"*\;_ *,              -          _*|/,"_;/*  "+'*|,^*,            -         ,||//^/| \/||_\\           -        /||*" |* \;"`\\*    *;*|,'|          -       ,/||*_|`   *\_^^/\-     /\'||^|         -       **~|/|*     `|||\\\\   `",*|~\,        -      |*"|` |      ,^|**^/|"   |`|| |        -      *|/~'_|        +_/|' /+.     =~||'|        -      " \/ *|,   _/||" -;*`   !|| |        -      |`||'"*\     ;|/// ;/`` _==+=++=++++++,  ,!/| |        -        *|, |_    /||*''/*   * |^**"***"""""*  |;\|_|        -       \'|\_"|,  *|/' _|"    .,*;++_|~|;==++ ///|`|`        -        \\\|,^|_   *++*     `         ,/`/|"//         -         ,\\|_"\+_               _*;*/'//          -          \^||,.*/\_   _/;+|*_|'           -           ',*||_ *,*+         __+*|*+|`;*             -             '~*||+ "*,**||+__,,,++*||;|+*"_,*`              -                `"**+;_/|~;+|"***|+=+*"'_+*"                 -                    "*+||++=;______,+;**`                    -                         ``""*""""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_008.txt b/codex-rs/tui/frames/default/frame_008.txt deleted file mode 100644 index 69f2c278d6..0000000000 --- a/codex-rs/tui/frames/default/frame_008.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                     ____=+++++++++,__                       -                 __/|**"~*`_,`... _"*~"*+_                   -              _/||*+*_.;++*|*==||"**\+;_  "\,                -            ,||*|"__+|*"/ +"*\;_ *,              -          ,*|//`,|* "+_*|,'*,            -         /||,"_|* ,,_,   '^_||_\\           -        /|/,,,|" *`",\*:  \*|,^\          -       /|/| ,|     \|""\",*       \^|;^|         -       |||\ |~`   "||;|,\_ "\*|,||        -      ||`| ||'     *_!|\|\",   !_|| |        -      ~|_| |"        "+||; :|.   |||^|        -      ,|/; \+      _*||` _|^ `   |||~|`       -      **|| ||      ///*` |/  :_+=+=++=++++++,  _*|| |        -      '~^|!"/|   _||/`/_|'  .^~|******\"""""  |_\|_|        -       |^|\ \\_ ^"*/. ,*     \_*|++||~|;==;+ ,*||`/'        -        _||; \\_  ^+++"                 /"//*,/         -         /||\ *||_                 _/;*/',*          -          .*||_ \*+_                _/|+,*_|*           -           ^ \\+_ \|*+,_:~           __+*|*+|`;*             -             "~*|*/ **|**||+__,,,++**|+|+*"__*`              -                `||*,__~|*=,/||*|||=**"'_|+"                 -                    "^+|||+=_______,+;**`                    -                         ``"""""""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_012.txt b/codex-rs/tui/frames/default/frame_012.txt deleted file mode 100644 index d9212a6206..0000000000 --- a/codex-rs/tui/frames/default/frame_012.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                      ___=+++++++=,,_                        -                 _,/|**+*"__,,_!;|_"*~**+_                   -              _+|/|*`,_;+*||*==++***\\;,_*"*,                -            ,/+|*_\|*|*"/ +|*+_, "+_             -          _|/|";;*+"..  *|*|_ "\            -         /||^"|/* ,,,_    |+| \\_          -        /||/_||` ;\`,*,*: '\*|_^*,         -       /||/_|*/  ^*\~^^_\_      */|,^\_        -       ||*`||'`   ^,\||\\"\^  \'| \|        -      ||*!+|"      \\*|||,*_   "||/ /,       -      \|| ||       */\`` ;|          ||| ||       -      ~|| ||'     ,||* _*/^       |||~||       -      ,*| ||, :_/|/"~+/"   ,+===+++++++++,   ||| ||       -       !|_ |/    ||/*`,|* ` ~|/***"****"""""^| \|*| |        -       ||| */|  *||  ,/``'  `\*;++++/~|||;==*`_/||-/"        -        ||\ */\   *++*                      _////;|         -         ^|\ ",*,                  /|*/'/|          -          \||, *,*+_            _,|//"_/*           -           '|||_ *+**+__            _;*|\/|:;/`            -             `"||_  *+|*||++_;,,,+++*||||*`__*`              -                 **+_._ "**=||||||++**` _+*"                 -                    "*"*+,;________,=;+*`                    -                          `""*""""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_016.txt b/codex-rs/tui/frames/default/frame_016.txt deleted file mode 100644 index db3c516cab..0000000000 --- a/codex-rs/tui/frames/default/frame_016.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                      ___,++++++++,,_                        -                  ,_/*|**"__/|_,,_"*~"*+,_                   -               .;/*"__;++*||+==++|||/\__"+*\,                -            _/+*`,;+*+*"|  `*+|\+_|-*\_             -           /+*/||*+*   "*|||;\*;            -         _||/;|* ,,,    *||,",+,          -        _|||/|/' ||"\_|,   \|; \\\         -        |||/|    +|\/",*\_    *|| ;|\        -       |//||/   *||\|\_*\_   *|; ,|,       -       |//||!       \\|||\'\_. '|| ||*       -      |`~ |"~        *|| /*;|'    ||  /^       -      |`^ |"/      ;*/.'|,"'     "|" /^       -       |/ |||     _/,*/||*    ,+++==+++++=++,  '|*`~|        -       +|.|/\,  ,|"/;\+/|    */***"""/""""**+| _||,/~        -       '\, |\|^ *,^/^;*      |\++++++~|/||||*  /\"_\|        -        \\, \\*_ *++*`                       _|\|/"*'        -         *\+ \"|+                 ,|,|*/|'         -          "|;_"\*|+_                     _,||*,,|*           -            *|;_"\,||+__.             _;/||*~_//             -              *||,_"*|||*|++;;,,,,++*|||** _+*               -                `**___ `**++||||||***" _,+/"                 -                    "~*=~;,________,=;+*"                    -                          `""**"""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_020.txt b/codex-rs/tui/frames/default/frame_020.txt deleted file mode 100644 index ddc7272a2c..0000000000 --- a/codex-rs/tui/frames/default/frame_020.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                      ____+=++++++,___                       -                  ,_/|**"__\;.,\_***+**+;._                  -               ,;*|",_;=*|;++==++/*|++_"~*\/~                -             ,+``_;/*,** .\|\_"+*+*_             -           ,* -,**-"`' "*|\'\^\*            -          /` _|*/^ ,, \;",\/,          -         /  ,|`| /"\"|    `\\ |*\\         -        /` ,|,'~  |/:*,\\_      \\ |\|,        -       _*,_|`/    "|\~,\"|\    |, ;|*        -       | `|||       *|;**,\\_   "| |*~|       -       ||'||^      `\_|*  ;||'      |~^~/        -       |/'||\.   ,"/ ;/*/`     |\"~|        -       \|'|||_  /./_;|`/  _;++++========,_   |\^~`        -       ',\\~/\.  _***/**     ,******"""****|/  \|/||         -        |\\|\"|  \":,/`    |++++++||\|~+|/  _\\~\,         -         |\ |\/\     ``             _*////          -          |\,\',*_~                        ,/`|*^/ `         -           \|,'+*,*_               _,*/||`/,           -            '|;_'\;|*+,_. _,/*_||*,""            -              "*|, *+||||*++,,,,,+++||*+*`;*,'               -                 **+__ "**+++++|//=*"` _+**^`                -                    "**|~,,_______,,+++*                     -                          `""**""``                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_024.txt b/codex-rs/tui/frames/default/frame_024.txt deleted file mode 100644 index 4cb3a57f1b..0000000000 --- a/codex-rs/tui/frames/default/frame_024.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                       _,_+=+++++;___                        -                  _.;~"`   ' '*"^'*~**+,;,_                  -                _/"  _,+*";++==++\;,_."~"*+*,                -              /*  ,**_+*\+ \|*\,\"+*\|\              -            ,* _/*",^ ;*+\ \*\_\            -           /  ;/`, ;+_, *,+*;\,|           -          |  //,^  \*_|   *\+"|\\|          -         |  |/:^   ||"\*, ||"|\/|         -        ,` ,|  \ `\*_\ ;\,*,|*;        -        |/|||/     |/\!'\\  '*| |^""        -        |/|~_,  \|   +\*  //|||\        -        |^|*`| "_*  _*"       \~||||        -        |/*/|+    ~/`'"//    _;+++===+=+==+_  _" ||||        -        !|,|*_|  _|""_|*    |;^^**********|/* ||"|/|/        -         |/',\^_  \_,;`     "+++_++___+++|.  _|/+\' '        -          |_*,\',             /|\'/ .         -          '|_*,\"\      _'\`*" ,          -            |_ \"+*+_            //+,`._/           -             *|_"~^\;*+__      _+*_+";'^,`            -               *|__"^|*+||\++;___+++**,+/;/,*,'              -                 "*|,_ "****|***|++*|**+*-|'`                -                    `**+=;;______,++|**""                    -                          `""**""```                         -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_028.txt b/codex-rs/tui/frames/default/frame_028.txt deleted file mode 100644 index 2471080abe..0000000000 --- a/codex-rs/tui/frames/default/frame_028.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                       _,_~;+++++;___                        -                   ,=**`          `**|+_~.                   -                _;*` _,+*"||+===+\+_  `^*+_*,                -              _/" _+*",/ |\,  **;_*,              -             ,''_/* ,^ \|+ :\^\_\             -            |//// _ ,* *|,`^\|,\            -           |"/|*:!`  ",**"   *\'*\|/\           -          /||/* ^    ,\'\+; *,.^,\/|          -          |_\|./     \\_\^ +' | ||\         -         |";*|!!   ,\*',\' `| "`| ,         -         |;||`~'    | ` /\*-   ;"\"~|:"         -         |!|||/  |~''*' *   "|"|||.         -         ||!"||_     *,, ,'._,=+++===++=+;  ,""=||.         -          | || |   `;|/ /` *:::+^^=:::+^|,  |,||/ ,         -          |_\/;" \*`     *;;;|_______+"  ;/_|;  /         -           |\\'_*          _|"| , /          -           "|^\||*\        ,|//`' ,`          -             |,^;*,       _/*_/`/ /`           -              *|_*;|~* _  __+*~|* '_*             -                *|;"~*|~*|\;+=_++++|||*`,/`~_/`              -                  *|+,~|||******|=*",__/.^.*                 -                     "*|++||=||||\+*||"*"                    -                          `""**""` `                         -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_032.txt b/codex-rs/tui/frames/default/frame_032.txt deleted file mode 100644 index 875e64a51a..0000000000 --- a/codex-rs/tui/frames/default/frame_032.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                       _,+=+==+++;;_.                        -                   _./*"          "*|\_*+_                   -                 _;*|_,+*"*|+==**+,  `\**'"+                 -               _|*;|**_+*|/ |\,  \\\ ",               -              ,*_|*" /; |,  |\, *_             -             /*,|+._ _      :|\  \^,_|,            -            /*/|*|;` |\/\      "/_'\ |'|_           -           _|\/* /   .\\,\      *  , \\\           -           |,\| '    \,\\_\_ \'^,|-\|          -           | || |     |\/',*. `,\,|'^/          -           *\||*'   ^\|/'//\.    |~|/"||          -           /*||\   ',/*'/|'  / ||||*          -           |~||"|  _|`_|`    _,+=|=+====+   |,|*||!          -           |,/| \  *\_|/  |^**+;=^:==^/  ;"\|||||          -           *||,|       ++++;_|;|_|+  /|.| "  /          -            |/\/_"|       ``  ;*~//" /           -             |^\||/\         /*_/~/ ,`           -              ||**\_*   _|",/ /.,`            -               *;^\**,*|      ,|*`/*,`_/              -                 *||+,**\|+;~;,,,++||*`-/`^ +"               -                   *||||+~"*******"`._+*^_/`                 -                     `**|;______,+*;*".*"                    -                          `"""*""` `                         -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_036.txt b/codex-rs/tui/frames/default/frame_036.txt deleted file mode 100644 index b2fd32ec4f..0000000000 --- a/codex-rs/tui/frames/default/frame_036.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                        _,+++;+++;__.                        -                    __+*"_;.. ""*"*|++|\,                    -                  ,|*;;+***"+=**~,  ".\* "\_                 -                _|*|/*^_+" *,  ,|_`'\                -               ,/,|*"  |_ \\,, \_              -              ,/,//  _   \ '\|\.*_             -              |,//  :^\_* \ \\\,^\             -             |`||  ^\'/*_',  /^\ ,_\|            -             ||\`   ,',/_*\ . \_"\\/_           -            | |'    ."||,/;^\. = |~,,||           -            | \"    `_\",/\;.   | ||| ||           -            |\=^  '|/ /*'      | \|||'|           -            |//* |  ,*.|"   ._++++++=+=  *|||`|||           -             ||/|^, * /"   |*********\\   / |*`|||           -             |=/| |      \+++++|=__|*  |"|'|||_`           -             "|*"| |      ````` _/ /,/  |            -              \|||; \          ,|`|    /             -               \||\\_*;        ,* /"   ,`             -                *||,~\_*         _|*,,_.' /               -                  \||+*:+|*\+;_,,+||``*;|^ ,"                -                    *+_"****|*|***`:_;**_,*                  -                      "+,;____;_;**,*_.*`                    -                           """"`` '`                         -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_040.txt b/codex-rs/tui/frames/default/frame_040.txt deleted file mode 100644 index db32b16299..0000000000 --- a/codex-rs/tui/frames/default/frame_040.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                        _,+++++;++___                        -                     ,;*"_/\\_**+||;+~*+_                    -                   ,|"_+*+*"|=*+;_""|+_ `\_                  -                  /"/|"`;*" '*"\  *\                 -                 |_*~`   .'/|, `|                -                |~*~ __,\  ,/\' \|               -               ;\/|  "\\`|\   '/'^\\,\              -               |||`  |\\ |^  ,"\,|| ^_             -              _"||     \\\ \^* _|_|||||             -              |~||    /|\,|\\^,    ""|=|:,*             -              /|||    \|\/\|-,     |/|||`||             -              \/||   \`//" / ` | ||||||             -              |"|' \/`/   ,__++++++++ '`||_,.|             -              '//,  "/   ,*********|| | |!|||\             -               ||/,     `*+++_|=_;|" /*|"|||||             -               |//|,*  ` ````` | \,||||'             -                ||\\ *_          |`|`/||/|              -                 |\*+_*\       _|`//.'  |               -                  ||,|\`*       ,*`'//^ _/                -                   *_"+\;,|*++,,_,*",,/*` ,*                 -                    "+_ "**||||**`,;^*^ ,*                   -                       *+;_.,__++*:*_;+"                     -                           `"""``  `                         -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_044.txt b/codex-rs/tui/frames/default/frame_044.txt deleted file mode 100644 index e59d3fc97b..0000000000 --- a/codex-rs/tui/frames/default/frame_044.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                        _,+=++_+++___                        -                      ,/*_,,,*"+|*|; *+_                     -                    _||;*+*"|*+;_*\*,: "+                    -                   ,*/*/ |,\_ \\,                  -                  ,\*/` \\|;' |,                 -                  /|' __, \,\~\ /,                -                 |// *|\,  /^=\'\\                -                 |!| \|\/_^, \, || |               -                ,\_| '|'/\_|_ /_||| |               -                ||*    \^\|'|* |\/~: /               -                *|"    \.|/*"~    "|||'|||              -                /|"`   /,/|. ~|||`|||              -                ||/| _| /|  __+++++++,"~|||.,~|              -                !*|| | /|. ********\,.|!\~,|||               -                 |/+_`,/  /*+==|=+|/`,`||~|| /               -                 ||,\* `~   `````"\ |,|| '|               -                  |/\_/,       /\|"  .~\`               -                  \/|\_\\       ,*/, /  /*                -                   \/|_+'*,      /*/,;/  //                 -                    \_*|++_*+,__,*`//_^  ;"                  -                     '\_"*+==|**`_+\|` ,*                    -                       `*,___,./*;=`_,*`                     -                           `"""`  "`                         -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_048.txt b/codex-rs/tui/frames/default/frame_048.txt deleted file mode 100644 index 82ea699436..0000000000 --- a/codex-rs/tui/frames/default/frame_048.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                         ,_=~+,,*+,,                         -                       ,*|;,_"\;|*;"*\,                      -                      /,|"*"|*+_\\\_  *\                     -                     /|/*,   \|\_ .`|                    -                    ||^^     |\\_ '^|                   -                   _\"  _,_  \,|/:,\\                  -                   |/|||,,"    / \\!\*_                 -                   \ | "/\ \   |;"\\  |                 -                  .||` ,|||\, |!|\\|||                 -                  ||\  *|//;!'     ,,*|,/=,                -                  |||  |\\|~~     |/||'/||                -                  |||` \ *"'        |\||||||                -                  ||/\ !|/  __+++++ |\||||||                -                  ||"|/_,  ******|\ |"||||||                -                   /||*|`  ++=|=+/" |'||| \`                -                   |/'*~ `"||| |||^|                 -                   **;| |  _"/\||||_/                 -                    ||/,^\_     |/, /||,|                  -                    ",||\'*_.   `|,~,~' /,`                  -                     ',*_+_**+_,/_, /:  |`                   -                      "\_*+=|/*`;*,*^ _/                     -                        "+____+*;*^ _/`                      -                           `"*````"`                         -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_052.txt b/codex-rs/tui/frames/default/frame_052.txt deleted file mode 100644 index 90ce85c17f..0000000000 --- a/codex-rs/tui/frames/default/frame_052.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                         _.=++,;^+,_                         -                        /",,"\*/\ "^|,                       -                       |//+"*\*,\,`' \\                      -                      ;|/'/   "|//   \\                     -                      ||^ /     \|\\  \'_                    -                     ||*__`_     |;|'" ||                    -                     *"||_+*'    \!'| "|/,                   -                     || ||~\|   , || _|\                   -                    //| //_~\     |||/ !"|                   -                    ||"  |||\_    |/,||\|                   -                    ||/  *|/|\   ~/~=/` ~/,                  -                    ||/ |;/^'"   `/_|||: ||                  -                     |/ || ___++++\_|||||||                  -                     |" \* *****^~~"`|||||`                  -                     ||/ | \=;_|*||=  || |                   -                     /|| -/   `"||| ||!"|                   -                     ||"|      _\/" || ^|                   -                      |||\     ||,-`||',                    -                      ||*\     ,~\\~||~ /                    -                       \|*;_*\_*/^~* //|                     -                        \^+~"/`/^|'  //                      -                         *+__,"_/'._|"                       -                            "*"`"""                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_056.txt b/codex-rs/tui/frames/default/frame_056.txt deleted file mode 100644 index f4f7024e96..0000000000 --- a/codex-rs/tui/frames/default/frame_056.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                          ,=++,,^+,_                         -                         /,_\\/.:'"|,                        -                        ;|/*\\"|`  '|,                       -                        +|*/|\|+, ',"\                       -                        |\~ ^^/\\\  "/;                      -                       |^,_',  ||\|' *|                      -                       |||, |  *|| `:|~\                     -                       \/*/     ~~, ^| |                     -                       "|"|+'    _|"`||/                     -                       \/\*_;|  ||*||,/|                     -                       |/|;=+|  ||/''|/|                     -                       |/*/*"|  ||"` |||                     -                       */\|___+ ||/||'~|                     -                       =\|"**~\ ||: || |                     -                       "\| :! |||||||\|                     -                       ||*`+, ` /|||| /|                     -                       ||| ||! \ `|||| |                     -                       ^|" _ ;||| ,:-_`                     -                        |'^ | |!\\*` ||                      -                        \|^\*/\/,| ~~_'                      -                         \*-""/;*   "/                       -                          +__/_*   \*                        -                            "*`'"""                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_060.txt b/codex-rs/tui/frames/default/frame_060.txt deleted file mode 100644 index 2daf8b5922..0000000000 --- a/codex-rs/tui/frames/default/frame_060.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                           =++,.*+,                          -                          ^ \|/ *",\                         -                          /|||/`"^^\                         -                          ///|;~ '|||                        -                         ||~/|*,  "||                        -                         ||_|//|\| \|                        -                         ||.*||/|! ~|                        -                         ||"'||||^"" ,                       -                         ||/~~*/^|||`|                       -                         ||||~ ||~ \_|                       -                         ||\+" |''~"||                       -                         ||`^~ | "~/||                       -                         ||__~_`.||||*                       -                         ||~|~|||| |\                       -                         ||_|"| ||| |/                       -                         ||\~~||||||"|                       -                         |\///|   .! |                       -                         !||/||";||" !                       -                          /|||\|+\_|\                        -                          |\*|\" ~*~|                        -                          = ~ \^ ,^_*                        -                          **| *'-;||                         -                            "*"`""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_064.txt b/codex-rs/tui/frames/default/frame_064.txt deleted file mode 100644 index 918e3261f1..0000000000 --- a/codex-rs/tui/frames/default/frame_064.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                           +++,+++,                          -                          |\|"!""=|                          -                          |_|' ~^/\                          -                          |~|\_^"|/                          -                          |//|,"\||                          -                          *"/!^^/^|                          -                          */"|/**"|                          -                          ^|`~ |.\^                          -                          \|=_, .|                           -                          |||`^^~|_                          -                          |||",*"~~~                         -                          ||||-/=/|                          -                          ||||||`~|`                         -                          ||||||\_|`                         -                          ||||||||||                         -                          ||/|||||"|                         -                          ||||||||`|                         -                          ||||||||/|                         -                          ||*|\/,|_|                         -                          \|;|~-"|\`                         -                          \|'| ~ | `                         -                           */"" /*/                          -                            "*"'*"`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_068.txt b/codex-rs/tui/frames/default/frame_068.txt deleted file mode 100644 index 24c9c6b2c0..0000000000 --- a/codex-rs/tui/frames/default/frame_068.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                          ,++.,,+=,                          -                          \/"\/|\ "                          -                         |,`''^\|\=                          -                         "|, , |*|-|                         -                         |~| `\||| |                         -                         "*~-|/\|\ |                         -                         \~~`||||| |                         -                        /|||.|\||| |                         -                        |~||||\||* |                         -                        |_||~|"/|\ |                         -                        |~"'|^|/|,/|                         -                        |,".`"""||/|                         -                        ^| ||| |||*|                         -                         _ |||,|||"|                         -                         _~|||'|*|||                         -                         \\||| /^|||                         -                         |/|||_.~|/|                         -                         ||\:'~|\/;|                         -                         |*|-,,|,~`|                         -                         '\"" |""|`\                         -                          ||, ||.|.|                         -                          |/^  ~+^_`                         -                           `"'""""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_072.txt b/codex-rs/tui/frames/default/frame_072.txt deleted file mode 100644 index ceceac8447..0000000000 --- a/codex-rs/tui/frames/default/frame_072.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                          ,+~;,;+~,                          -                         /^^~/|\/_.*                         -                        ||" ` /|_*\\\                        -                       ,\`  '~|||,' /                        -                       ||/|.\|"|"';|*,                       -                       |"~,||~||||  \|                       -                       \||""\"|,~ -.~/                       -                      |||||_|||\"~  `|                       -                      ||||||||"~|| ,/|                       -                      ||||=/||/ ^*~|||                       -                      ||" \|/|/.,~//||                       -                      ||\~:-^"\_\\"\\|                       -                      |||||\"~//;+==||                       -                      ||||| |*|||||'||                       -                      ||!\ ||"|"\\|+||                       -                       |"\"|"|||\\/\_|                       -                       |,  "|'|\ |||/\                       -                       |||  \,\^,*|/~|                       -                       '|/\:,!;||/||,|                       -                        ||+ "!"*/_|'|                        -                         ,\ - \'|*;//                        -                         '/|.  \`\_/                         -                           """`"""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_076.txt b/codex-rs/tui/frames/default/frame_076.txt deleted file mode 100644 index 40b74bec2a..0000000000 --- a/codex-rs/tui/frames/default/frame_076.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                         _+**;,++~__                         -                        *^/~~^\\*_.*\                        -                       ||/~'\/|\|"*,\\                       -                      |/`.//\|*/"\'''|,                      -                     ,+;~`'//|| -'\/                      -                     |\\//!`,/+_   \|,                     -                     \|/\_,"||\*   ^||                     -                    ||\`/|| |||*;   /|                     -                    ||\+||`_\^`||  ,;~|                     -                    \|||||  `|\,  ||_|                     -                    |||||/ /|_|,||  |/\|                     -                    |||||. \/_ |\|  "|\|                     -                    ||||| /|~\=*,=|||                     -                    ||||| /|=_,||_/|" ||                     -                    ||||| \\||_^*"/|+/~|                     -                     |||| \\||*\`^,|\|/|                     -                     ||||! \|/     |"|\+                     -                     *||||| "|    //\*|'                     -                      |\'\,||*/, ,| ~,\                      -                      ",\. ~|\\|/*;|\*'                      -                       '|,. `^",,*:/\/                       -                        "\+* "+`*__;"                        -                           "``"`*"`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_080.txt b/codex-rs/tui/frames/default/frame_080.txt deleted file mode 100644 index 7c8ffffca2..0000000000 --- a/codex-rs/tui/frames/default/frame_080.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                         ,=*~_,=*~__                         -                       /** *"||*`,:|*,                       -                      |`'/,/,|!+*"*+*,\                      -                     /"|| //|,/-`"` ''\\                     -                    |"/||,,|\*       .^|,                    -                   //~,//`\' _      \/                    -                   ||/\\|,|+ _*_      ^/|,                   -                  ;|~ ||*'*| \;|\      '|/                   -                  |\|""~_~~` .\_,.     ||                   -                  \|||"|~||  \||\      |/|                   -                  ||||~__||  :/ /    /*/|                   -                  ||||'|_|| |^|_     "|||                   -                  |/||`"||| /_"|= * ._|||                   -                  ||||| /|" |;|'`~ * ``|\|                   -                  ||||. *| *_ / `|/ /"||*                   -                   ||||| *| .*/    _|||\|                   -                   |||||'||         /|||`                   -                    =\||^/"|*_      !/\\                    -                    *|, `|\\\\_    `|*`                    -                     \\_ \\^\\*,+*`_|,*/                     -                      "|_  ! *; *=+/*_*                      -                        *\_ "+_*,__;*`                       -                          `"````""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_084.txt b/codex-rs/tui/frames/default/frame_084.txt deleted file mode 100644 index ca22988c9a..0000000000 --- a/codex-rs/tui/frames/default/frame_084.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                        _,;*_,;++++,                         -                      _|* ;"||*"_;._*\_                      -                    _|*``/!//_+**"*+"\|\                     -                   ,/', ^*,*,*:   `` \"\|                    -                  ,/', ~/,||* "||                   -                  |/`,/''/\+ _     '\,                  -                 |||/\|,||" *`\     /|\                  -                 |~ /|``|,  |,\_^       '/|,                 -                |*|/"~~+"   \/_|\        '|\                 -                |||||"=||   ^\/,        ~||                 -                |/||"\|*|  , \|+^        ||\                 -                |"_-'__||  ~\*,`|       `|/                 -                |" `,|/|| */_*^+==+*\_ __~/                 -                || ^`"||~| ///^/ +|*"` |~|~                 -                 |' *'||_| _/ |  _|*| **/"|                 -                 |!  ""*|* |/          \||`                 -                 ^\ '\|`|,|          ,|,|,|                  -                  \|\ "_'\ \        |/_\\`                  -                   ||  \'|\ |_     /" "|*/                   -                    \\ `"/|\_*___+*_/;|"/                    -                     *|_ `\`\~ "*++**","                     -                       *+_ "+_*\____/*                       -                          `"````""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_088.txt b/codex-rs/tui/frames/default/frame_088.txt deleted file mode 100644 index 72ca94576e..0000000000 --- a/codex-rs/tui/frames/default/frame_088.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                        .,;~_;+;=++,_                        -                     ,/^ +;/|/*`_;\;"*,                      -                   _/`. ,*,*_+**||*~"~=*,                    -                  /| ".////;*~  '~,`'^|\                   -                 /^'`/*/'*  \.`^|\                  -                /|//,//;^ _!**     "||                 -               _|\^"| ,/   |*;  \     \|,,                -               ||`//''|    |,*, ^    "'||                -               !""" ~_^    \/_*~\` "\|/                -              |||||;=|   /*/\'       '.|||               -              |||||||/   ; _/|^|        '.||/               -              |_"|||||   /*|/_`,"         .||\               -              || ~.||| ||_*/|+ +**\_ ;||"               -               "." */|  .///+//  \*""|/ |||||               -               |  .!||_ _||,    \**+. |+*                -               */:  ~"|" \,`         ~|//                -                |, \|^\,\,            _*//~\`                -                 */\','|,\,          ;*./\\/                 -                  |;\^,\|,*\       _/`,|,|/                  -                   |;  \\\\ *+,__;*_|~|*\*                   -                    "|_`"^"\~ "*=++**"_/`                    -                      "+, `+,*+;____+*`                      -                          ''``"*""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_092.txt b/codex-rs/tui/frames/default/frame_092.txt deleted file mode 100644 index 0cf925ee90..0000000000 --- a/codex-rs/tui/frames/default/frame_092.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                       _,,;*_++++;~,_                        -                    _+~ +"|*"*"_;.|;"*\,                     -                  _/"`.,*'*"_+**||"*+*:_\,                   -                 /*,/;*^ *,* ^._**|,\                  -                |`/ ,"`; ~. *\\                 -               |~__\', +_;     '*||                -              /*"*|/`,  /|*\"   ^/\|               -             _|/,||;|    |/,*\       "|/_              -             |`|| |_'     |,,*\`\      |||              -             ||| ,||       |,/*\          /||              -             \||~|^|      .;=`""       ||/              -             \||_|||    ////'/         ~*"              -             |||.|||   /^///./_ ==+++*|; -"|*              -             ||||*\/  ;////|'  *=*"*|"` ,||^              -             *|||\||,\ +,| \    *|*;*;|+ |\*||              -              *_|~~// |  *\,`    `   '    ||!               -               *,^\,*\"|           ,* |\\/               -               *|^\\,\\ |       |_/,|/                -                '|_\^\|\_*,    _;*'_//*/                 -                  \_ ",||,`*+____+**,~*+*,*                  -                   "\_\^|^,- `**+++***`_*                    -                      *+_`+,*~,_____,+"                      -                         `' ``"*""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_096.txt b/codex-rs/tui/frames/default/frame_096.txt deleted file mode 100644 index 70e8050e7e..0000000000 --- a/codex-rs/tui/frames/default/frame_096.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                        __+~,+++++~__                        -                   _,"_+||*"~"_;,."|"**,_                    -                 _/\:/+*' `_/***||"*+;\,*\_                  -                /" ,,|`  ^,'**;*\                 -               |  /|// + .*,\                -              |///|/' ,+_"   *\\               -             *;;/|,/   //"\_     **\|              -            ;/,;|\,   ||/"|      `"|/,             -            *^"'*|     |,|.| \   |||             -           _|||_|\     \\\\|_'     ||/             -           |"|"/||    , \+|||-         .||||            -           |~`"|||      |/;`/ /^'     |-||||            -           *||||||    |/,,! /' =++++;;\ _"|*/`            -            ,||~|,,   |,,*`;'/  |_*""|*" | \|/             -            |!|||||  +// ,`    \|+**;+ |":/|,             -             \|\",,,   |_,"          ;*'|||`             -             *\\|!./_            ';*'|,\/              -              \|\*|\|_*.         _/";+,|/               -               *\\^,|\; *,.       _+" |**//                -                 \_ ^*|\_"*+;____++*;_+|/"|`                 -                   \_ ^**|-,`***+++***"_+"                   -                     "+,_^._~,______;+*`                     -                         `"```"*""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_1.txt b/codex-rs/tui/frames/default/frame_1.txt new file mode 100644 index 0000000000..64a140d2b9 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_1.txt @@ -0,0 +1,17 @@ +                                       +             _._:=++==+,_              +         _=,/*\+/+\=||=_ _"+_          +       ,|*|+**"^`   `"*`"~=~||+        +      ;*_\*',,_            /*|;|,      +     \^;/'^|\`\\            ".|\\,     +    ~* +`  |*/;||,           '.\||,    +   +^"-*    '\|*/"|_          ! |/|    +   ||_|`     ,//|;|*            "`|    +   |=~'`    ;||^\|".~++++++_+, =" |    +    _~;*  _;+` /* |"|___.:,,,|/,/,|    +    \^_"^ ^\,./`   `^*''* ^*"/,;_/     +     *^, ", `              ,'/*_|      +       ^\,`\+_          _=_+|_+"       +         ^*,\_!*+:;=;;.=*+_,|*         +           `*"*|~~___,_;+*"            +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_10.txt b/codex-rs/tui/frames/default/frame_10.txt new file mode 100644 index 0000000000..ffe56a1e56 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_10.txt @@ -0,0 +1,17 @@ +                                       +              _+***\++_                +             *'`+*+\~/_*,              +            ^_,||/~~-~+\,,             +           |__/\|;_.\,''\\,            +           / ;||"|^ ',/_/|/            +          |` '|*~//\  !`_"|            +          \  ~*"*||~|*   |/,           +          "  ||\+/+||-_`.\||           +          "  ~\ \\|;~~+\+;||           +          |  ,|\,|_/_*___|*`           +           , "|||||""!\,"\|`           +           \`',\,*" _~"",//            +            |' |||~*,:,/|/`            +             ;`**/|+;_!//'             +              *, _*\_,;*               +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_100.txt b/codex-rs/tui/frames/default/frame_100.txt deleted file mode 100644 index ed39ba5c5e..0000000000 --- a/codex-rs/tui/frames/default/frame_100.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                       .__+;+++++++__                        -                   ,+`,=/**`/*"`'.`|"**+_                    -                _+^_/+*///_,+**=||**+;\~"*,                  -               /" //;//  ~,*^;.*,                -             _|,_,***_ ^  *'/*               -            _|`~//,  ,;_   .\,|              -            |/\//\/   /|"|_    .\\,|             -           ///||/`   +|_\|_`   `^,~\            -           | /,*|       *\,`*; \  |||            -          |`||'|~     *|\"*\:'       |,~,           -          | "|~\*      '| _/\ ^+           ||^|           -          |`"\_\|      /\\*/ _|        ||"|           -          | `"||_    |\_'/`_/  =====++;*;__ \|/~|           -          '_  |||    |`,,*~,/   ~|/*"*|=```|  ~|'`           -           |:'|\/_\ ~+/| _*     "|+|*=;++= :~^\;            -           '\|||*\ |   |\,'             '' _//+`            -            \||||\| |_                 /",*||/             -             \;'\||\_*,       .~_*__"///              -              ", *"||/"|_         _;*"_*,|,"               -                *_ **|+_"||;+__,,++*|_+*+|//                 -                  *,_**|;_  *~**++**+*"',*`                  -                    `*._*"**\;_____,,+*"                     -                         `  `"**""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_104.txt b/codex-rs/tui/frames/default/frame_104.txt deleted file mode 100644 index 3ba709b3d4..0000000000 --- a/codex-rs/tui/frames/default/frame_104.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                      _.-;+=+++++++__                        -                  _+",|/**`         "**+,                    -                ,*_/+*'  _,=+**=||**+;,~|*+_                 -              ,*://^-"_,* ;_*|,\"\_               -             / ;,*,",/ *|..\\*\              -            *"/+'/ / ;;^\  \  |'/\             -           |*/|`/'|   /;"*,\  '\ |//\            -          |^\\/,//`   \\,`\\\`    `  \/^,           -          |;|\|\_ *|\ *|"| \ ~|\+           -         |'||||'|  , ||,.|_~     |/",          -         "|*"|| |     `^/ |*  /~      " || |          -         ||`/|| |   _*,/;` /"        |.||'|          -         \' |||'|    ,*//|'/|` =++=+++;;,  \|~|,|          -         !_`"*/!!,  /`,|/ _|   +/^*"*|="`" /+|\~`          -          \!~|||,|  *,/|`_      |*+||;;+++ `||||           -          '|_\\\|"|   +/                 _\|^`           -           \_\/\|,^|_               _/`/'/*'            -            *;"||\, |,        _;*_+/||'             -             "\ **|;_"|,_ _+"_/^+*/`              -               *; ***;_"~*+++,_,,++*|_;*,|+,*                -                 "+_^*\+__ "*~*****"+*|*|/"                  -                    "~ "*|*+,______,_+*"                     -                         ` `""**""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_108.txt b/codex-rs/tui/frames/default/frame_108.txt deleted file mode 100644 index 35d1b3f8dd..0000000000 --- a/codex-rs/tui/frames/default/frame_108.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                      _._;;++++++++,__                       -                  ,;|++**"            "+,_                   -               _/*+|*;//._++*|||||**++\_;**,                 -             _/*//"=`,;* ^,"++~|*,               -            /`;,*|`,| *.\**/|_             -           |~/|,*'|| ,+|\ , ~\\\,            -          |\/|,*\|   \;:.|* `\^\|\*,           -         /*|\\/"|   *|;^*\_  \^"\\|_          -         |||||/|     '|;_~|,    ''\,_|          -        |~\||/.   .*|\*\\* `|. |||          -        **|`|/~ | ||,.||   / |/^,         -        "`~`|_~  /\,,*',|   /.|\ |         -        \ .||, | _*!////// ,+==++++++;+,, |;||_`         -        '_ |||^|    *\*//"/"  ,|~^*"**="_'*" '||||          -         |,^\|/ |` ,|/,/  \\++||==++  || /          -          |'|,/,*\.    ,_//|/|'           -          '\*|/|_'\_    `;*_//|,`           -           '+"|||, |,     _*_/;;=/`            -             \_^*|\,"|+_ /*_|*|+\*              -              "+_*|*+_"\**+++__,=++*|_;*|*`_/`               -                 *,"*||_^""*~"****""+*|^_+*                  -                    *"/*+||+;______;++*"                     -                         ` """**""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_11.txt b/codex-rs/tui/frames/default/frame_11.txt new file mode 100644 index 0000000000..769e5ae76d --- /dev/null +++ b/codex-rs/tui/frames/default/frame_11.txt @@ -0,0 +1,17 @@ +                                       +               ,****++_                +              /" ;|||\\,               +             /"__||;\*/\,              +             |__||=;,_=//              +            _".;\|+\';_||,             +            |+`||+_;;|_/||             +            ** ,||||||_|=\             +            |  ||/||\/ |"|             +            /  '|/||*/+|_|             +            ** _|/=,"/|_|^             +            '`- ||||=/|\\|             +             \_-/|_*/**;|`             +             !_ *|\\^_|;"              +              \+!*||,_/*`              +               \_ '*+_+`               +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_112.txt b/codex-rs/tui/frames/default/frame_112.txt deleted file mode 100644 index 629134ba86..0000000000 --- a/codex-rs/tui/frames/default/frame_112.txt +++ /dev/null @@ -1,27 +0,0 @@ -                                                             -                                                             -                      ___;;++++++++,__                       -                 _.*,/|*"-^'"         "*+_                   -               ,*,|*;+",_,+/**=|||**+++_  *+_                -             ,".+"+";;+*|^ !,"*+;,"\_              -           ,*||*,",| *+"*,,*\             -          ///|`* / ;,,,_ \; "\\"|            -         /\//,*_|`  ^\`\**`    *\ \| |           -        ,/|\\*'|    "|\\:,+:_  *\ \| |          -        |||||'/`   *\_'\\_" \. ||',         -       _||'|`.|     _*|_"^","   | ||_|         -       |\" | \      "+_/^  /  ~,\|/|         -       |`~_| ^       _*_*/  /*    '/||||         -       '` \|_ |     /|,|^ _|`  ,===+==++;++,_ \"||_|         -        , |||"|   _///+` ;*   ^~|;**"***"_|*|,|_|\'|         -        \,"\+/"|   ||":/"      *;_+|++==+++*/`|;|/`         -         \'|/| '\                      /\_\*_/          -          \*||\_^+_  _/`/,/!/           -           \/|||_,^\_   _+*,*/|,*            -            *,"||;,"=++__  _,*"|*/|^/`             -              *,^*|\,.*|**+++__,=++*|_+*|+"_+"               -                "+_||\_ _ "*~":***""+*"'_+*`                 -                   ``.**+|++,______;++**`                    -                         ` '"**"""`                          -                                                             -                                                             diff --git a/codex-rs/tui/frames/default/frame_12.txt b/codex-rs/tui/frames/default/frame_12.txt new file mode 100644 index 0000000000..50cfd73302 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_12.txt @@ -0,0 +1,17 @@ +                                       +                +***+.                 +               ,=`_/|,\                +               "  |/\+,                +               /+~||=="|               +              | '~|||./|               +              |'..*^"_|"               +              |   ~/\||\               +              |   /+\||"               +              *, ~/||+|~               +              |   /|*;*_               +              |.  |"=**/               +               ,  *|!_,|               +               / **|,*\|               +               '^/",|\|`               +                \ '~\./                +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_13.txt b/codex-rs/tui/frames/default/frame_13.txt new file mode 100644 index 0000000000..04ed71335c --- /dev/null +++ b/codex-rs/tui/frames/default/frame_13.txt @@ -0,0 +1,17 @@ +                                       +                 /***,                 +                 |__||                 +                 |`_|"                 +                 |**|_                 +                 *  ||                 +                 ":-||                 +                 ,  ||                 +                 +  "|                 +                /+  _~.                +                |"  +=|                +                '`.. ~`                +                 |___|                 +                 |+,|_                 +                 *__|=                 +                 , ."=                 +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_14.txt b/codex-rs/tui/frames/default/frame_14.txt new file mode 100644 index 0000000000..66e91f7187 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_14.txt @@ -0,0 +1,17 @@ +                                       +                 +***;                 +                 ,/__.\                +                |_||. |                +                ||/|"^~,               +                |||\   |               +                ~*||  '|               +                |||| . *               +                ||\|`  \               +                |||~   "               +                "^//  ;/               +                \|"",.,|               +                |*~|___|               +                /!"|===`               +                |\/*__/                +                 _* '=/                +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_15.txt b/codex-rs/tui/frames/default/frame_15.txt new file mode 100644 index 0000000000..9d8132e3c4 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_15.txt @@ -0,0 +1,17 @@ +                                       +                 ++***~_               +                `,=||^:*,              +               //|*=\|"*|              +               |/` //,.__|             +              ||="=\||/"^|             +              \||-||//|  "             +              ||   ||||~~,|            +              ||/~|+||| '-|            +              ||+,,*|||_.:|            +              |_|;/|\~*. .|            +              |/||||_| ` ;             +              |**.^~|\-  =             +              '|\, ///` ;`             +               |^||\\.+\/              +                \^*^___/               +                   ``                  \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_16.txt b/codex-rs/tui/frames/default/frame_16.txt new file mode 100644 index 0000000000..75c9353f6f --- /dev/null +++ b/codex-rs/tui/frames/default/frame_16.txt @@ -0,0 +1,17 @@ +                                       +                _=+"**+~_              +               /^||*||\|=\             +              |//"\/=\|| '\            +             /// ;*_\|\||**|           +             ||;_/*'=||*/|`\           +            |||*|' |\= !| ~.|          +            \\| /`,||||/*", |          +            |/; |`||/|||"; `|          +            \\|~|+~/^||"*+  /          +            *"__,==\*|._| ,_|          +            |||+""/*\|;";.~|`          +             ||* |`  `//,  /           +             \|*  |  /,/_,|            +              \|~"_*~//+_|             +               ':._=:__;*              +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_17.txt b/codex-rs/tui/frames/default/frame_17.txt new file mode 100644 index 0000000000..9d7a2dc37d --- /dev/null +++ b/codex-rs/tui/frames/default/frame_17.txt @@ -0,0 +1,17 @@ +                                       +                ,=+++;;~,_             +             _;**|~~*=*|,"^,           +            ,*\/_==`+,"|||_"\          +           /|/_/|"_` '|;\~||=\         +           |/_ ~    |"/\=\//  ,        +          `=*,/`   ,:/| /,=/|./        +          *!;/|   ,//|_ *"||/=|        +          -"=|!   !//||/|,||=;*        +          ,/*/\==+~\_|\^:\||| |        +           |"_;__|/*\/||\!\+'+\        +          \\\/"""****\_|*//\ \'        +           \||_*       `/||` ;         +            _\\!*\_   ,',/^_/          +             , ~*+=\+`_;*:|'           +              `+;/_,+~*_+*             +                   `                   \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_18.txt b/codex-rs/tui/frames/default/frame_18.txt new file mode 100644 index 0000000000..123e46cd19 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_18.txt @@ -0,0 +1,17 @@ +                                       +               _==+==+;~,_             +            _+"_;,++~__,"+;;_          +          _/:|*"*=","._"+//\ *         +         ,||*.,^"* '\`_/=~\;\\\,       +        _\// /|  _"+_\/~/|_\;\\_       +        /\| ,,~.___/,*,|'-/^/`/~!      +        ||\:/     +/*/|"_/"*|=|=,      +        "\-~|     ^\"||;^   |;|"       +       \"" ,\==;=;+~|,|*/\, |*|`       +        _\\|*\* ~|/__\_~||_;~`\ ,      +        |/|\`""*****` \__/|/*/`-`      +         \\!,\,         ``*"/*_'       +          \^*+^^.      _*^_/\,`        +           '|.**++===^'*_/_,*          +             "~|_/__,.+";+"            +                    `                  \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_19.txt b/codex-rs/tui/frames/default/frame_19.txt new file mode 100644 index 0000000000..e83b78bd3b --- /dev/null +++ b/codex-rs/tui/frames/default/frame_19.txt @@ -0,0 +1,17 @@ +                                       +              __==+~+==~._             +           _+|||\/===_*_,|*,,          +         ,*;;/"|+*`    `*:,`*;\        +        /;|*,^`         _==+,^|*,      +       ||/`/`         ,|^"/"|\ |\,     +      |\/*'         _|*~/!./ '.*|      +      ^=|~'        /*^/|+,`   /:/+|    +      ||||         |;"\|",    | |||    +      |*|\,=;;===~~~|+*;*|;   \ "||    +      ^;/,|=*/^*+\,`, ^_ :\_\,/.|_     +      '\"/+|"""""**"   ^\_/|// //'     +       \\^*_\             `//_//'      +        '!_\~~*,        ,;=./|;`       +          '".|*/~+__=;/*" ;*~'         +             "~._:-'_,.^*-^            +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_2.txt b/codex-rs/tui/frames/default/frame_2.txt new file mode 100644 index 0000000000..ac205dd4a5 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_2.txt @@ -0,0 +1,17 @@ +                                       +             _._:=+===+,_              +         _+,/*;+||~=~|=_'|*+_          +       ,|*|\**~*``  `"*=*/||;|,        +     _|/_/*',,_           -,\|/|,      +     ,^"/*^|\_\\_           ^,|\|,     +    '/+"`  |*\+/\+           \\|*|     +   ,|'*|    ^/|;|_|,          /"|"|    +   |" \`     ,|*||;*          |'/.|    +   *""=|    ;|^^_|".~++++++++,|_|~*    +    _='|  /||' /* |=\____..__|+/!|!    +    \\\ * *\..|'   `"*******"|,*||     +     '\_./, `              ,+;/,*      +       .\__|+,          ,=_+!_|"       +        `~^;__"*+:;=;;.=*`_||*         +           `*+*+~~____~;/*"            +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_20.txt b/codex-rs/tui/frames/default/frame_20.txt new file mode 100644 index 0000000000..bff8cc065f --- /dev/null +++ b/codex-rs/tui/frames/default/frame_20.txt @@ -0,0 +1,17 @@ +                                       +              __+=~~=+=,__             +          ,;=";,_,===||_^*\+,          +        ,,"_+*"~*"    `"^"\+*|+_       +      _|"_*|*           _,+|\/*\\      +     _| ,|*           _/!_||^*\||\     +     /`,|'           +*';|"/  '\~|\    +    ;|;+|          ,* .+*^     ,\|/    +    |_^/`          "";:|",     |~"|    +    |/||;,=;======_,';^^\\*    / |\    +    '|^|_" /``____|\  *\\"|=\ ,/ ||    +     \,^\'"""""""*"     \,=||,| /\     +      * ^*/,               _/*.|/      +        \_^*,~_          ,;*`;*'       +          ^,-."~+^;;,:"~"`,/*'         +            `*+~_!=____|*""            +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_21.txt b/codex-rs/tui/frames/default/frame_21.txt new file mode 100644 index 0000000000..b23aadbc7c --- /dev/null +++ b/codex-rs/tui/frames/default/frame_21.txt @@ -0,0 +1,17 @@ +                                       +             __,=+==+=+,__             +          ,+*``__+~=~+;_`-*+_          +        ;*^_+*^"`     `^~*+_`*,        +      ,*|;"'             _,;*,;*,      +     /,/*`             ,|/_\ \\_^,     +    /"/|             ,**_//    \\^,    +    |'|`           _!/`,/'     \;\"    +     `\            \; "|,       | |    +    | |  ,+;;;;;+++  ^|,"|,    ;/ |    +    | ~\ |_      _,|   ^"`*|,  /"./    +     ; ". ``"""  '`     '*_,; /` ,     +     '+ :;_                 _*" /      +       *_  ^-_          _.;*' ,`       +         *=_ *"*+:~~;:=*""  -`         +            *++;+____,_;+*`            +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_22.txt b/codex-rs/tui/frames/default/frame_22.txt new file mode 100644 index 0000000000..ccc8480d8b --- /dev/null +++ b/codex-rs/tui/frames/default/frame_22.txt @@ -0,0 +1,17 @@ +                                       +             _,+=+==+=+,_              +         _+/*|._/|/\||;|+/*+_          +       ,;*;~\**`    `"*\**+__+,        +      ;*~**"            ,,|||_*\       +     \|~/'            ,_/|=|./;'|      +    \|*/`           ,~/|;^/` \|\=|     +   |+*\/           ~+|\*/'    ~|/|     +   ||=|`           |\|~^\     |^|"|    +   ||,", +~==;;;=++_\*|_!\,   _|;"!    +   ^|= *_\\,!/,"~//|  \*;_"|,,!/\=     +    \\\_| """""**"`    `:*+_///",`     +     \*\_\,               _*,"|,'      +      '"+; ++_         _.*,"*_/        +        ':*+,"*~;=+;;/=*""',*          +           "~"~_;___-=_.=*`            +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_23.txt b/codex-rs/tui/frames/default/frame_23.txt new file mode 100644 index 0000000000..406ced01b0 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_23.txt @@ -0,0 +1,17 @@ +                                       +            _,+_=+*++=+__              +         _=|+|\_,_==,|_|*|+_           +       ,"+|',;*`    "~:+|\;||,         +      /;|*;/`          _;;\||;\        +     //|`/'          ,/,,'*/*\|\       +    ,\|"/`         _***''/*'|~\|,      +    `||"|         /:/. _|`  "!|'*      +    ~/| |         |"|,_\,   | */|      +    ^"\ |+~;=====;=|_*|_"\_ | |~|      +    |\\_|"="       /`\ \|_\,~ \_|      +     /'| | `"""""""   '`/;=|_/^/`      +      ,||_|.             ,/|\^/`       +       \ |,'/__       _.";*/+/         +         \=\+;*+\~==_++"-_+*`          +           "~!*=\~__+__**`             +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_24.txt b/codex-rs/tui/frames/default/frame_24.txt new file mode 100644 index 0000000000..73f5639390 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_24.txt @@ -0,0 +1,17 @@ +                                       +             _~_;++*==,_               +          ,"_/"|__~==+,_'+             +        ,"';\/+"~ .`:*~**, \           +       ,'//,/|=,\`~/`!_*\|\_'          +      , //\/,    `""/\_|``\|,'         +      ~,\+\`       *,,/!.|;!/"\        +     |  |~!      ,/_,/"/^\|\^|^        +     | \||       |,=/\_|~_/.`||        +     |. |;;;:++~~~++_*,_| |  ||        +      _ / !*|/,,;;,,|.^\+*| |*|        +      \ '\|\*""""""` \,.*\|=/,`        +       \ \,*\           |!"/;/         +        \.*\`|.      _="_/:_*          +          .-*,\^"~~:==;|^_/`           +            *:_*+;\__==+*              +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_25.txt b/codex-rs/tui/frames/default/frame_25.txt new file mode 100644 index 0000000000..6fb0cbc16c --- /dev/null +++ b/codex-rs/tui/frames/default/frame_25.txt @@ -0,0 +1,17 @@ +                                       +             _+=*;++++_                +           ,!*,*`_;\|*||,              +          /|//,,".|+\=\|||_            +         |+*| /! =| "\|,*\/            +        ,__\,/'^;/_|" |//\/*           +        \,~|~_*+.^|: /|,|//|,          +        |/|*| |__/\_/|\/_"|=|          +        |||/|."!~_=\/|\_~=||\          +       ^+\|"|__====+~|\\|+*|\          +        /-"|/|,|_||;*_|\*=/\|          +        \~*/\|`"""""'+/|\|/|`          +         |_"|;+;\-,*:_/,//|/           +          ^`^|_\_*;/,^/_||/            +           \.;\\_*=|**!*|*             +             ~,"*\+,_+|*               +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_26.txt b/codex-rs/tui/frames/default/frame_26.txt new file mode 100644 index 0000000000..8bd6052839 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_26.txt @@ -0,0 +1,17 @@ +                                       +              _;***"+,                 +             /*|;/\|+;|,               +            /*""|;\|\""\,              +           ;*",||~_||_+/^              +           |_,\|.~"*\/;|\;             +           \ "|/:/"*_\"\\/             +          |!  *'=||/||;;"+             +          /-  \|||^^=||/||             +          |  .\*;+~+==/\||             +          ! ._|/,|__,*\\*|             +           |`"/|*"\,/`+\||             +           \_~|/\   //"||`             +            *  *|\ ^`/|/,              +             |"*\\"*_**;               +              \/:^*~_\*                +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_27.txt b/codex-rs/tui/frames/default/frame_27.txt new file mode 100644 index 0000000000..e8630695b8 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_27.txt @@ -0,0 +1,17 @@ +                                       +                ;***+,                 +               |;:/|/\                 +              ;'` *|/'|                +              |~~^||;|~                +              |  `|_-'=                +              ~_._"`|||`               +              = "||_*||!               +             |  `||~="||               +             |. .!|+||||               +             '= ."_|_*||               +              |- _^**+/'               +              ||++||_/|                +              |==+=,/|^                +               \__|\=//                +               '\" ^\/                 +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_28.txt b/codex-rs/tui/frames/default/frame_28.txt new file mode 100644 index 0000000000..3313d8b9bf --- /dev/null +++ b/codex-rs/tui/frames/default/frame_28.txt @@ -0,0 +1,17 @@ +                                       +                 /**;                  +                 |+_|`                 +                 = ;|`                 +                 |-`*|                 +                 |  ~|                 +                 | -"|                 +                ^|~ _|                 +                 |-""|                 +                /\  _|                 +                ||.:~|                 +                 |  _|                 +                 |=+=|                 +                 |=*||                 +                 *__/|                 +                 ~ .+|                 +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_29.txt b/codex-rs/tui/frames/default/frame_29.txt new file mode 100644 index 0000000000..2ae088f1b9 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_29.txt @@ -0,0 +1,17 @@ +                                       +                 +****,                +                ,|*/!*\                +                ^,|| '"|               +                ||||^\,/               +                \ ~"|  |               +                |,~|| __               +                |\\||| ^               +                ||=~|                  +                ||~*|   `              +                _|=||   `              +                *||/|^ =               +                |/~~| _|               +                ~|||`~_|               +                |=|*/"|'               +                 ~|* .,                +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_3.txt b/codex-rs/tui/frames/default/frame_3.txt new file mode 100644 index 0000000000..727e25a8e8 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_3.txt @@ -0,0 +1,17 @@ +                                       +             _.=;++====,_              +         _+,/\||+|"==|;_^|*+_          +       ,;/*;|*""`   `"~!**+/^|,        +      /+/\|;,+_          `=*!||\       +     '/*|/^/||*\_           \^\||_     +    /|\\/  .,|\;\\           | \\|     +    =* |    '*\|_"|,          .*/|,    +   ,-|,|     ,-|"/\|          ~_|=|    +    -"'|    ;|*+~|*-~=++___++_~^";|    +    ,\:\, ./*/;;| |*|__,!=.,;\`|\|`    +    '^| | "||+,"   "***"""**,///,/     +     '*~ \+ `              /^+^//      +       =^//*\,          ,+;/",|'       +         =^+,_**^=;=;,:=*;`_+"         +           `*+*_:~____~;/^"            +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_30.txt b/codex-rs/tui/frames/default/frame_30.txt new file mode 100644 index 0000000000..99eeebce33 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_30.txt @@ -0,0 +1,17 @@ +                                       +                 _;"**+,               +               _/;||\*'=\              +               "'^|,\\|+,\             +              ||\|/|_\|\ \,            +              =*||`\|,|,  |            +             |*|^+  *||||.|            +             \/|||\_ \/\| =`           +             "| '+=~,|"|-  `           +             "|_"\~=~\/|,  `           +             "||\|__~|!+,  `           +             !\||;\_*~||+~|            +              |*//,/*\||" |            +              \|\||/*~|,~/             +               ,^,+=^/|,/'             +                \-.|^__;'              +                  ````                 \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_31.txt b/codex-rs/tui/frames/default/frame_31.txt new file mode 100644 index 0000000000..8d9adf28b2 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_31.txt @@ -0,0 +1,17 @@ +                                       +                _.:*+*+=,              +              _+*;+,_"+\'*,            +             ,|\//,=_`."|_*\           +            ,~/+__*;_,\\|\~|\          +            ^||||+-*\_,"\|/__          +           ;|^`~_|'"\;*,./|,"|         +           /|| |^*|\.=/;*|*|/|         +           \\, |~"|\ |^""|~\.|         +           |\,_|'^~|~/+~~|_  |         +           "||~//||___\_|\|| *         +           ^*_/+|, /***`/|'~_!         +            |||\\\,     _=* |          +             ;|*=_!,  . |*`/`          +              :|\|/_|`,|",|`           +               '"=~_+*/.;*             +                   ````                \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_32.txt b/codex-rs/tui/frames/default/frame_32.txt new file mode 100644 index 0000000000..4175a7a66e --- /dev/null +++ b/codex-rs/tui/frames/default/frame_32.txt @@ -0,0 +1,17 @@ +                                       +                ,++++;;~,_             +              ;*~**~\||**|~,           +            /^*=^,+^:-`*|*\'*,         +           '//|_,`;- - ,_\|+,!,        +          //|,|*\'*|; '`,~\/\*\,       +          \/\\,\*|`:||+_   |+/ *       +         *|";,`'\||,,|,=`/_//|'_       +         |||,_  "_||"/'|;-_"\|""`      +         \||-_ '_|"__|+++~~~=|"=`      +         '""_`|*\'\_____||*|;~-_       +           ,\*||/ |*""***^;///./       +           \,|^\\        ,\|/'~        +           '**||~+_    _/_|/ ,         +             \-\"~+|;=*`_+"_/          +               ~;=__,+/*_""            +                   ```                 \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_33.txt b/codex-rs/tui/frames/default/frame_33.txt new file mode 100644 index 0000000000..dbd9568018 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_33.txt @@ -0,0 +1,17 @@ +                                       +               _,+=+=+=~._             +            _+*||\*=~:|-|*|*.          +          _/\|+*+,="`  "*/||+",        +         ,\/|/_|,_        *||\_*       +        _.|/`||/\^\         |+\\^      +        //,   \_\\`\,        /\/_\     +        ||+ !  \,*|_|\       |*||      +        *|,,   ,''\/=,       \"|*      +        ||| | ,` /*,,,;==+~~+/_|\~     +        ^/|'"/:,/`~|_____||*^^^~|.     +        \=\, |/|/ / """"*** ||,/^`     +         \+\*,",           //;/=/      +          *\"*,*;,      _+|,/*\'       +            \~"*\+|,;+_";,\*~*         +              "==+,___^+*;-"           +                   ````                \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_34.txt b/codex-rs/tui/frames/default/frame_34.txt new file mode 100644 index 0000000000..7fc67a92db --- /dev/null +++ b/codex-rs/tui/frames/default/frame_34.txt @@ -0,0 +1,17 @@ +                                       +               _,=++++=~,_             +           _+*+/\;|"~+*=**;,=_         +         _//,|*":~*`   `^\\,"**,       +        ,/_|*_/,_          *|,*\\      +       //|\-/|!|"!,          \\*\^     +      ,/\|`/ \\"|\*\          \,\|\    +      |*^~_   '\_*|_^          |;~_    +      \|=":    |*_|/"|         / _\    +      ,'/."   /\//"_==++++++~__" ~^`   +      ||\,/,,^"//'~||_~.___,/_||`|\    +       /_\, |\|*^!  "**````^ ,/,\|'    +        /,\;=\_             /;.|/'     +         \+`|+\;,        _+="_/,`      +           -\/~"|+,;,+=*=*`+*:'        +             "~\;=_____;=*=^           +                   ```                 \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_35.txt b/codex-rs/tui/frames/default/frame_35.txt new file mode 100644 index 0000000000..570f34f0de --- /dev/null +++ b/codex-rs/tui/frames/default/frame_35.txt @@ -0,0 +1,17 @@ +                                       +              _,+;=+++=+,_             +           ,*=*.~**+"|*~:"~*=_         +        _//|;+*|^*"`  `"*=*."|*,       +       ,//+/,;,_            *+_\|_     +      //~|//\ "\*,            |\*|,    +     ;/;/+` '|_"..*_           |\\|    +     \ !./    \\ '*_.           |^\\   +     ~|~:      /\\;/'           / "/   +     / ,_    ,||/;"/|==_;_=+~~  |~=*   +     |,^;'  //;"*+/|; \,____/"~/' |'   +      /`\,'/\_|/^`  `"^^^^*^^*//_,|    +       ".^\/~               _/* ,^     +        \;`^;,:,          ,;/_**'      +          "^_"~*~-:~~+~;/*"_/;"        +             "^~;=__/__++*"^           +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_36.txt b/codex-rs/tui/frames/default/frame_36.txt new file mode 100644 index 0000000000..74d83c8e70 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_36.txt @@ -0,0 +1,17 @@ +                                       +              __+=++++=+,_             +          _=""\+/;/+\+;++"**+_         +        ,\'\,+*-*"`` `"*~*+|,*|,       +      _|"*+____            '*~\"|      +     ,/_;\'|\`\,.             ^\.*     +     / ,/`  *_ "|/,            "\^*    +    | ;!`     !\ "\\            |^|,   +    ||\~      _\ _//!           \| |   +    |'"|     // ,*"',++_+++++_  |\~|   +     _*|\  ,|__/~/ !`~_______|| \/'`   +     ' *|\ +_+/^     "**^^^^^" |,"/    +      ',"\;.                 ,/|"/     +        \/||+~,           ,++"/,`      +          *,_"**=^;~_+~;"-",;+'        +            `*+/~_,,_,,++**"           +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_4.txt b/codex-rs/tui/frames/default/frame_4.txt new file mode 100644 index 0000000000..06dbce99c0 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_4.txt @@ -0,0 +1,17 @@ +                                       +             _.=;+==+=+,_              +         _-"+*|/!|\=/*;|"/*,_          +       ,*=|||+*"`   `^~\^*|/\\_        +      //|,|".+,          "|**\*\       +     /|/_|=|\;^|,          \"\|*\      +    /||^|  '_||/*\          ' \=|,     +    "\|;`   '**\+"|,         , ";|     +     |.\     ,|/*^||           |||     +    _|!|_   ;|/"^//+~+++____,, ||*     +    |\/!| ,///,_|`=\|,._,:/^;|//"|     +     `|;'\,\\,\/   "*******'^-|||`     +      ,|\"|_`             ,^;/**'      +       \\,:^!,_        _.^,*;|/        +         ~||=_**\;;=;,+=*+\|*`         +            *\\~:~_____;-*`            +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_5.txt b/codex-rs/tui/frames/default/frame_5.txt new file mode 100644 index 0000000000..6b1ce12447 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_5.txt @@ -0,0 +1,17 @@ +                                       +             _.=;;+===+,_              +         _+"+/*/||+~=+;_|"+,           +        *_/\+|*"`   "^=|*\!,*,         +      ,|/|/|.=,          -^||||_       +     ,\/*/^_+|_\,         ` \|\|_      +     ~|||/ \_|\;/|_          +/||      +    |/|!+   `\_|\"|,        ''~+|,     +    |/|_"    ,_=|/_|          +|_|     +    |,|^*   /_|",|*=_~+~___+,_"|.|     +     _\|\,,/+*" |"!//\=^,=.,/|/*|`     +     \,||,~,\\/+`  "**""""",~;|\/      +      \\+/\\ `            /_/*,^       +       ^/*\|=+_        _=+,*';*        +         ^|*|,*+\;~=_,+=*^~;*          +            ^-*_*"___-_,+*`            +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_6.txt b/codex-rs/tui/frames/default/frame_6.txt new file mode 100644 index 0000000000..7724f483dc --- /dev/null +++ b/codex-rs/tui/frames/default/frame_6.txt @@ -0,0 +1,17 @@ +                                       +             _.=;;+==++__              +          ,^;/*|=*+|++;_,*+_           +        ,,,|||*"   `"~.=*+*/\_         +       /,|*|*_=,        \+||||,        +      '=|||*\\+*\         .\\|\,       +     ;-/|/`^+;|\_|,        .=\/|       +     _ +~|   !^\|/^\        ^+|_|      +     ~ |~|   _|=~/||        ~+\||      +     _.|-|  /'||*;/+_~+~__++_.\/|      +     ||\,/_^_;+ |/=*,||,;==\|,|\!      +      / | /~||;/"  "*"""'*"`\\/|       +       , ; /,`           ,:_//|`       +        .`\_**,       _+^_/*,+         +         `"~*,"+!;~__,+**!:;'          +            ^-;*+,___`_,+*             +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_7.txt b/codex-rs/tui/frames/default/frame_7.txt new file mode 100644 index 0000000000..0d0f43072c --- /dev/null +++ b/codex-rs/tui/frames/default/frame_7.txt @@ -0,0 +1,17 @@ +                                       +             _.~;*+==+,_               +          ,*`+\|+*+==\;!`*,            +         * ,|||*`  `^~`!*/_*,          +        \\|||~;+       ^~\*|/,         +       `'|*||^|/\,       . *||\        +      | ;||" `'\;|\       ,-|||        +       `\"|  ^_|\|\|       **^||       +      _"/~|   =+/|*|`      ' |||       +       /"~* ,"_/|\/~~;;_~~=;*\||       +      |,'||=:~|/'|.\||\\,=,;\|\|       +       \ =^/*|*_/  ******""_/||        +       '_ /_/_`         ,"-/;/'        +        ';,+\\\_      ,^~,*/*'         +          \_'\|*\;~___+*|*+/           +            "~*"~:~__,_;**             +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_8.txt b/codex-rs/tui/frames/default/frame_8.txt new file mode 100644 index 0000000000..efe7c1b096 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_8.txt @@ -0,0 +1,17 @@ +                                       +             __+_;++=+,_               +           ,"*/|||*==!~ "+             +         _|=,|//*!,"~/~*\+^,           +        _*\*/|,+|     ' =^||\          +        ' /|/,\|/\      .'\||,         +       |',|\^^_\|_*      \+|||         +       |*||| '_;\|`|     |^|/|,        +       \,||/  |+\/|,*.    .`/||        +       \ \||_^ !/*=|~/+,+,,\~||        +       !  \*/=_|",|,||;|=__||='        +        //\\|\|||/'^*^*"\*"/\|         +        ',"|\|``        .,///'         +         '\_*\\\_    _/\_|+/*          +           .:'|,*!;;+*;/=,|`           +             ~~_**\|_,+/=`             +                  ``                   \ No newline at end of file diff --git a/codex-rs/tui/frames/default/frame_9.txt b/codex-rs/tui/frames/default/frame_9.txt new file mode 100644 index 0000000000..072d0eef56 --- /dev/null +++ b/codex-rs/tui/frames/default/frame_9.txt @@ -0,0 +1,17 @@ +                                       +              .=^*/++=,                +            /*_/||*"=!_-\_             +           / ,||/*^^=/!\_~,            +          " ||/;=_ _^,|\^|+,           +         /*";\*"|*, *.'+:+||           +         | |||"^|\;__ |'|*|||          +         ` ~*\|**|\\,".,/ `||          +        |  ~/_,\~||_/=\_| !||          +        !  ",|" /|"|~~|+|~,||`         +         |_|||_,|^|_||||__|||          +         " `^/\\|/"****||"/\|          +          \~||\,`     ,/ ^/|`          +           \+\|\\    /;_;|/*           +            ^-"\_|*/+=;;*|`            +             '-_ *\\|;+/"              +                                       \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_000.txt b/codex-rs/tui/frames/dots/frame_000.txt deleted file mode 100644 index 287bcd0468..0000000000 --- a/codex-rs/tui/frames/dots/frame_000.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○○○○○●●●●●●●●●●○○ - ●○●·◉● ●●·○○·◉◉◉·· ●·●●●○ - ○◉·○● ●·●○·●●··●○●· ●●●●●○ ●○ - ●●·◉●●○●●◉●● ◉·· ●●◉○ ●● - ○●·◉●●○◉◉ ● ●·●○●● - ●··◉◉●◉· ●○●··○○○ - ◉◉·◉ ·● · ○○○● ○◉○·●○· - ●◉··● ·· ●○○●·◉·· ·●○○·●○· - ●●··○·● ·●◉○○○○◉· ●●●·○○● - ·○ ··○·· ●○·●○◉··○◉ ◉···· · - ◉·◉· ○· ●○◉◉ ●·◉ ···◉· - ○○ ◉· ●○◉·· ◉● ○···· - ···· ◉ ●·◉◉ ◉·· ○○○●○●●●●●●●●●● ·◉◉· · - ●·◉ ·● ○◉··●● ◉●· ◉··○○●●●●●● ·◉○·○· - ○◉·○◉ ·○ ●·◉· ○·· · ◉◉◉◉◉◉ · ··●·· - ○○··○○·● ●●●●◉ ●◉·◉◉ ◉◉ - ○○○· ○○○ ◉●◉●◉·◉◉ - ○···● ●·○○ ○·○●·●○·● - ●●●●·● ●●●● ◉○●●·●●●◉◉● - ·●··● ·○●●●○·●○○●●●●●●●·●·●●●○●●· - ● ●●●◉●··●○·◉ ●●◉··○●● ○●● - ●●●◉·●··◉○○○○○○●●◉●●· - ·· ● · - - diff --git a/codex-rs/tui/frames/dots/frame_004.txt b/codex-rs/tui/frames/dots/frame_004.txt deleted file mode 100644 index eaf6483452..0000000000 --- a/codex-rs/tui/frames/dots/frame_004.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○○○○◉●●●●●●●●●●○○ - ●○◉·◉● ●● ○●·◉◉◉ ● ●· ●●○ - ○◉··●·●·◉○·●●··●○·· ●●●●◉○ ●○ - ●·●◉●●○●·◉● ● ●○◉○ ●● - ○●·◉● ○◉◉● ●●●·●○●● - ●··◉◉○◉· ○◉··○○○ - ◉··● ·● ○◉ ·○○● ●◉●·●●· - ●◉··●○·· ●○○○○◉○◉ ◉○●··○· - ●●··◉·● ····○○○○ · ●●··○● - ·● ·· · ●○·●●○◉· ···· · - ●·◉·●○· ●○◉·● ◉●◉ ○···●· - ○◉ ●·● ○◉·· ◉◉●· ·· · - ····● ●○ ◉·◉◉◉ ◉◉·· ○○○●○●●○●●●●●●● ● ◉· · - ●·● ·○ ◉··●●●◉● ● ·○●● ●●● ● ·◉○·○· - ○●·○○ ·● ●·◉● ○· ◉●●◉●●○···◉○○●● ◉◉◉···· - ○○○·●○·○ ●●●● · ●◉·◉· ◉◉ - ●○○·○ ○●○ ○●◉●◉●◉◉ - ○○··●◉●◉○○ ○◉◉●·●○·● - ●●●··○ ●●●● ○○●●·●●··◉● - ●·●··● ●●●●··●○○●●●●●●··◉·●● ○●●· - · ●●●◉○◉··◉●· ●●●·●○●● ●○●● - ●●··●●○◉○○○○○○●●◉●●· - ·· ● · - - diff --git a/codex-rs/tui/frames/dots/frame_008.txt b/codex-rs/tui/frames/dots/frame_008.txt deleted file mode 100644 index 508aad22af..0000000000 --- a/codex-rs/tui/frames/dots/frame_008.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○○○○○●●●●●●●●●●○○ - ○○◉·●● ·●·○●·◉◉◉ ○ ●· ●●○ - ○◉··●●●○◉◉●●●·●○○·· ●●○●◉○ ○● - ●··●· ○○●·● ◉ ● ●○◉○ ●● - ●●·◉◉·●·● ●○●·●●●● - ◉··● ○·● ●●○● ●○○··○○○ - ◉·◉●●●· ●· ●○●◉ ○●·●○○ - ◉·◉· ●· ○· ○ ●● ○○·◉○· - ···○ ··· ··◉·●○○ ○●·●·· - ···· ··● ●○ ·○·○ ● ○·· · - ··○· · ●··◉ ◉·◉ ···○· - ●·◉◉ ○● ○●··· ○·○ · ······ - ●●·· ·· ◉◉◉●· ·◉ ◉○●○●○●●○●●●●●●● ○●·· · - ●·○· ◉· ○··◉·◉○·● ◉○··●●●●●●○ ·○○·○· - ·○·○ ○○○ ○ ●◉◉ ●● ○○●·●●····◉○○◉● ●●···◉● - ○··◉ ○○○ ○●●● ◉ ◉◉●●◉ - ◉··○ ●··○ ○◉◉●◉●●● - ◉●··○ ○●●○ ○◉·●●●○·● - ○ ○○●○ ○·●●●○◉· ○○●●·●●··◉● - ·●·●◉ ●●·●●··●○○●●●●●●●·●·●● ○○●· - ···●●○○··●○●◉··●···○●● ●○·● - ○●···●○○○○○○○○●●◉●●· - ·· · - - diff --git a/codex-rs/tui/frames/dots/frame_012.txt b/codex-rs/tui/frames/dots/frame_012.txt deleted file mode 100644 index b6842db391..0000000000 --- a/codex-rs/tui/frames/dots/frame_012.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○○○○●●●●●●●○●●○ - ○●◉·●●●● ○○●●○ ◉·○ ●·●●●○ - ○●·◉·●·●○◉●●··●○○●●●●●○○◉●○● ●● - ●◉●·●○○·●·● ◉ ●·●●○● ●○ - ○·◉· ◉◉●● ◉◉ ●·●·○ ○ - ◉··○ ·◉● ●●●○ ·●· ○○○ - ◉··◉○··· ◉○·●●●●◉ ●○●·○○●● - ◉··◉○·●◉ ○●○·○○○○○ ●◉·●○○○ - ··●···●· ○●○··○○ ○○ ○●· ○· - ··● ●· ○○●···●●○ ··◉ ◉● - ○·· ·· ●◉○·· ◉· ··· ·· - ··· ··● ●··● ○●◉○ ······ - ●●· ··● ◉○◉·◉ ·●◉ ●●○○○●●●●●●●●●● ··· ·· - ·○ ·◉ ··◉●·●·● · ··◉●●● ●●●● ○· ○·●· · - ··· ●◉· ●·· ●◉··● ·○●◉●●●●◉····◉○○●·○◉··◉◉ - ··○ ●◉○ ●●●● ○◉◉◉◉◉· - ○·○ ●●● ◉·●◉●◉· - ○··● ●●●●○ ○●·◉◉ ○◉● - ●···○ ●●●●●○○ ○◉●·○◉·◉◉◉· - · ··○ ●●·●··●●○◉●●●●●●●····●·○○●· - ●●●○◉○ ●●○······●●●●· ○●● - ● ●●●◉○○○○○○○○●○◉●●· - · ● · - - diff --git a/codex-rs/tui/frames/dots/frame_016.txt b/codex-rs/tui/frames/dots/frame_016.txt deleted file mode 100644 index a4c04660c6..0000000000 --- a/codex-rs/tui/frames/dots/frame_016.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○○○●●●●●●●●●●●○ - ●○◉●·●● ○○◉·○●●○ ●· ●●●○ - ◉◉◉● ○○◉●●●··●○○●●···◉○○○ ●●○● - ○◉●●·●◉●●●● · ·●●·○●○·◉●○○ - ◉●●◉··●●● ●···◉○●◉ - ○··◉◉·● ●●● ●··● ●●● - ○···◉·◉● ·· ○○·● ○·◉ ○○○ - ···◉· ●·○◉ ●●○○ ●·· ◉·○ - ·◉◉··◉ ●··○·○○●○○ ●·◉ ●·● - ·◉◉·· ○○···○●○○◉ ●·· ··● - ··· · · ●·· ◉●◉·● ·· ◉○ - ··○ · ◉ ◉●◉◉●·● ● · ◉○ - ·◉ ··· ○◉●●◉··● ●●●●○○●●●●●○●●● ●·●··· - ●·◉·◉○● ●· ◉◉○●◉· ●◉●●● ◉ ●●●· ○··●◉· - ●○● ·○·○ ●●○◉○◉● ·○●●●●●●··◉····● ◉○ ○○· - ○○● ○○●○ ●●●●· ○·○·◉ ●● - ●○● ○ ·● ●·●·●◉·● - ·◉○ ○●·●○ ○●··●●●·● - ●·◉○ ○●··●○○◉ ○◉◉··●·○◉◉ - ●··●○ ●···●·●●◉◉●●●●●●●···●● ○●● - ·●●○○○ ·●●●●······●●● ○●●◉ - ·●○·◉●○○○○○○○○●○◉●● - · ●● · - - diff --git a/codex-rs/tui/frames/dots/frame_020.txt b/codex-rs/tui/frames/dots/frame_020.txt deleted file mode 100644 index 1caae6e972..0000000000 --- a/codex-rs/tui/frames/dots/frame_020.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○○○○●○●●●●●●●○○○ - ●○◉·●● ○○○◉◉●○○●●●●●●●◉◉○ - ●◉●· ●○◉○●·◉●●○○●●◉●·●●○ ·●○◉· - ●●··○◉◉●●●● ◉○·○○ ●●●●○ - ●● ◉●●●◉ ·● ●·○●○○○● - ◉· ○·●◉○ ●● ○◉ ●○◉● - ◉ ●··· ◉ ○ · ·○○ ·●○○ - ◉· ●·●●· ·◉◉●●○○○ ○○ ·○·● - ○●●○··◉ ·○·●○ ·○ ·● ◉·● - · ···· ●·◉●●●○○○ · ·●·· - ··●··○ ·○○·● ◉··● ··○·◉ - ·◉●··○◉ ● ◉ ◉◉●◉· ·○ ·· - ○·●···○ ◉◉◉○◉··◉ ○◉●●●●○○○○○○○○●○ ·○○·· - ●●○○·◉○◉ ○●●●◉●● ●●●●●●● ●●●●·◉ ○·◉·· - ·○○·○ · ○ ◉●◉· ·●●●●●●··○··●·◉ ○○○·○● - ·○ ·○◉○ ·· ○●◉◉◉◉ - ·○●○●●●○· ●◉··●○◉ · - ○·●●●●●●○ ○●●◉···◉● - ●·◉○●○◉·●●●○◉ ○●◉●○··●● - ●·● ●●····●●●●●●●●●●●··●●●·◉●●● - ●●●○○ ●●●●●●●·◉◉○● · ○●●●○· - ●●··●●○○○○○○○●●●●●● - · ●● ·· - - diff --git a/codex-rs/tui/frames/dots/frame_024.txt b/codex-rs/tui/frames/dots/frame_024.txt deleted file mode 100644 index c81c245432..0000000000 --- a/codex-rs/tui/frames/dots/frame_024.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○●○●○●●●●●◉○○○ - ○◉◉· · ● ●● ○●●·●●●●◉●○ - ○◉ ○●●● ◉●●○○●●○◉●○◉ · ●●●● - ◉● ●●●○●●○● ○·●○●○ ●●○·○ - ●● ○◉● ●○ ◉●●○ ○●○○○ - ◉ ◉◉·● ◉●○● ●●●●◉○●· - · ◉◉●○ ○●○· ●○● ·○○· - · ·◉◉○ ·· ○●● ·· ·○◉· - ●· ●· ○ ·○●○○ ◉○●●●·●◉ - ·◉···◉ ·◉○ ●○○ ●●· ·○ - ·◉··○● ○· ●○● ◉◉···○ - ·○·●·· ○● ○● ○····· - ·◉●◉·● ·◉·● ◉◉ ○◉●●●○○○●○●○○●○ ○ ···· - ·●·●○· ○· ○·● ·◉○○●●●●●●●●●●·◉● ·· ·◉·◉ - ·◉●●○○○ ○○●◉· ●●●○●●○○○●●●·◉ ○·◉●○● ● - ·○●●○●● ◉·○●◉ ◉ - ●·○●●○ ○ ○●○·● ● - ·○ ○ ●●●○ ◉◉●●·◉○◉ - ●·○ ·○○◉●●○○ ○●●○● ◉●○●· - ●·○○ ○·●●··○●●◉○○○●●●●●●●◉◉◉●●●● - ●·●○ ●●●●·●●●·●●●·●●●●◉·●· - ·●●●○◉◉○○○○○○●●●·●● - · ●● ··· - - diff --git a/codex-rs/tui/frames/dots/frame_028.txt b/codex-rs/tui/frames/dots/frame_028.txt deleted file mode 100644 index 2c0850aad9..0000000000 --- a/codex-rs/tui/frames/dots/frame_028.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○●○·◉●●●●●◉○○○ - ●○●●· ·●●·●○·◉ - ○◉●· ○●●● ··●○○○●○●○ ·○●●○●● - ○◉ ○●● ●◉ ·○● ●●◉○●● - ●●●○◉● ●○ ○·● ◉○○○○○ - ·◉◉◉◉ ○ ●● ●·●·○○·●○ - · ◉·●◉ · ●●● ●○●●○·◉○ - ◉··◉● ○ ●○●○●◉ ●●◉○●○◉· - ·○○·◉◉ ○○○○○ ●● · ··○ - · ◉●· ●○●●●○● ·· ·· ● - ·◉····● · · ◉○●◉ ◉ ○ ··◉ - · ···◉ ··●●●● ● · ···◉ - ·· ··○ ●●● ●●◉○●○●●●○○○●●○●◉ ● ○··◉ - · ·· · ·◉·◉ ◉· ●◉◉◉●○○○◉◉◉●○·● ·●··◉ ● - ·○○◉◉ ○●· ●◉◉◉·○○○○○○○● ◉◉○·◉ ◉ - ·○○●○● ○· · ● ◉ - ·○○··●○ ●·◉◉·● ●· - ·●○◉●● ○◉●○◉·◉ ◉· - ●·○●◉··● ○ ○○●●··● ●○● - ●·◉ ·●··●·○◉●○○●●●●···●·●◉··○◉· - ●·●●····●●●●●●·○● ●○○◉◉○◉● - ●·●●··○····○●●·· ● - · ●● · · - - diff --git a/codex-rs/tui/frames/dots/frame_032.txt b/codex-rs/tui/frames/dots/frame_032.txt deleted file mode 100644 index 1881baf59a..0000000000 --- a/codex-rs/tui/frames/dots/frame_032.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○●●○●○○●●●◉◉○◉ - ○◉◉● ●·○○●●○ - ○◉●·○●●● ●·●○○●●●● ·○●●● ● - ○·●◉·●●○●●·◉ ·○● ○○○ ● - ●●○·● ◉◉ ·● ·○● ●○ - ◉●●·●◉○ ○ ◉·○ ○○●○·● - ◉●◉·●·◉· ·○◉○ ◉○●○ ·●·○ - ○·○◉● ◉ ◉○○●○ ● ● ○○○ - ·●○· ● ○●○○○○○ ○●○●·◉○· - · ·· · ·○◉●●●◉ ·●○●·●○◉ - ●○··●● ○○·◉●◉◉○◉ ···◉ ·· - ◉●··○ ●●◉●●◉·● ◉ ····● - ···· · ○··○·· ○●●○·○●○○○○● ·●·●·· - ·●◉· ○ ●○○·◉ ·○●●●◉○○◉○○○◉ ◉ ○····· - ●··●· ●●●●◉○·◉·○·● ◉·◉· ◉ - ·◉○◉○ · ·· ◉●·◉◉ ◉ - ·○○··◉○ ◉●○◉·◉ ●· - ··●●○○● ○· ●◉ ◉◉●· - ●◉○○●●●●· ●·●·◉●●·○◉ - ●··●●●●○·●◉·◉●●●●●··●·◉◉·○ ● - ●····●· ●●●●●●● ·◉○●●○○◉· - ·●●·◉○○○○○○●●●◉● ◉● - · ● · · - - diff --git a/codex-rs/tui/frames/dots/frame_036.txt b/codex-rs/tui/frames/dots/frame_036.txt deleted file mode 100644 index 079d6d0fee..0000000000 --- a/codex-rs/tui/frames/dots/frame_036.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○●●●●◉●●●◉○○◉ - ○○●● ○◉◉◉ ● ●·●●·○● - ●·●◉◉●●●● ●○●●·● ◉○● ○○ - ○·●·◉●○○● ●● ●·○·●○ - ●◉●·● ·○ ○○●● ○○ - ●◉●◉◉ ○ ○ ●○·○◉●○ - ·●◉◉ ◉○○○● ○ ○○○●○○ - ···· ○○●◉●○●● ◉○○ ●○○· - ··○· ●●●◉○●○ ◉ ○○ ○○◉○ - · ·● ◉ ··●◉◉○○◉ ○ ··●●·· - · ○ ·○○ ●◉○◉◉ · ··· ·· - ·○○○ ●·◉ ◉●● · ○···●· - ·◉◉● · ●●◉· ◉○●●●●●●○●○ ●······· - ··◉·○● ● ◉ ·●●●●●●●●●○○ ◉ ·●···· - ·○◉· · ○●●●●●·○○○·● · ·●···○· - ·● · · ····· ○◉ ◉●◉ · - ○···◉ ○ ●··· ◉ - ○··○○○●◉ ●● ◉ ●· - ●··●·○○● ○·●●●○◉● ◉ - ○··●●◉●·●○●◉○●●●····●◉·○ ● - ●●○ ●●●●·●·●●●·◉○◉●●○●● - ●●◉○○○○◉○◉●●●●○◉●· - ·· ●· - - diff --git a/codex-rs/tui/frames/dots/frame_040.txt b/codex-rs/tui/frames/dots/frame_040.txt deleted file mode 100644 index f66eb5c258..0000000000 --- a/codex-rs/tui/frames/dots/frame_040.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○●●●●●●◉●●○○○ - ●◉● ○◉○○○●●●··◉●·●●○ - ●· ○●●●● ·○●●◉○ ·●○ ·○○ - ◉ ◉· ·◉● ●● ○ ●○ - ·○●·· ◉●◉·● ·· - ··●· ○○●○ ●◉○● ○· - ◉○◉· ○○··○ ●◉●○○○●○ - ···· ·○○ ·○ ● ○●·· ○○ - ○ ·· ○○○ ○○● ○·○····· - ···· ◉·○●·○○○● ·○·◉●● - ◉··· ○·○◉○·◉● ·◉······ - ○◉·· ○·◉◉ ◉ · · ······ - · ·● ○◉·◉ ●○○●●●●●●●● ●···○●◉· - ●◉◉● ◉ ●●●●●●●●●●·· · · ···○ - ··◉● ·●●●●○·○○◉· ◉●· ····· - ·◉◉·●● · ····· · ○●····● - ··○○ ●○ ····◉··◉· - ·○●●○●○ ○··◉◉◉● · - ··●·○·● ●●·●◉◉○ ○◉ - ●○ ●○◉●·●●●●●○●● ●●◉●· ●● - ●○ ●●····●●·●◉○●○ ●● - ●●◉○◉●○○●●●◉●○◉● - · ·· · - - diff --git a/codex-rs/tui/frames/dots/frame_044.txt b/codex-rs/tui/frames/dots/frame_044.txt deleted file mode 100644 index f3b0028863..0000000000 --- a/codex-rs/tui/frames/dots/frame_044.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○●●○●●○●●●○○○ - ●◉●○●●●● ●·●·◉ ●●○ - ○··◉●●● ·●●◉○●○●●◉ ● - ●●◉●◉ ·●○○ ○○● - ●○●◉· ○○·◉● ·● - ◉·● ○○● ○●○·○ ◉● - ·◉◉ ●·○● ◉○○○●○○ - · · ○·○◉○○● ○● ·· · - ●○○· ●·●◉○○·○ ◉○··· · - ··● ○○○·●·● ·○◉·◉ ◉ - ●· ○◉·◉● · ···●··· - ◉· · ◉●◉·◉ ········ - ··◉· ○· ◉· ○○●●●●●●●● ····◉●·· - ●·· · ◉·◉ ●●●●●●●●○●◉· ○·●··· - ·◉●○·●◉ ◉●●○○·○●·◉·●······ ◉ - ··●○● ·· ····· ○ ·●·· ●· - ·◉○○◉● ◉○· ◉·○· - ○◉·○○○○ ●●◉● ◉ ◉● - ○◉·○●●●● ◉●◉●◉◉ ◉◉ - ○○●·●●○●●●○○●●·◉◉○○ ◉ - ●○○ ●●○○·●●·○●○·· ●● - ·●●○○○●◉◉●◉○·○●●· - · · · - - diff --git a/codex-rs/tui/frames/dots/frame_048.txt b/codex-rs/tui/frames/dots/frame_048.txt deleted file mode 100644 index ca45df737f..0000000000 --- a/codex-rs/tui/frames/dots/frame_048.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ●○○·●●●●●●● - ●●·◉●○ ○◉·●◉ ●○● - ◉●· ● ·●●○○○○○ ●○ - ◉·◉●● ○·○○ ◉·· - ··○○ ·○○○ ●○· - ○○ ○●○ ○●·◉◉●○○ - ·◉···●● ◉ ○○ ○●○ - ○ · ◉○ ○ ·◉ ○○ · - ◉··· ●···○● · ·○○··· - ··○ ●·◉◉◉ ● ●●●·●◉○● - ··· ·○○··· ·◉··●◉·· - ···· ○ ● ● ·○······ - ··◉○ ·◉ ○○●●●●● ·○······ - ·· ·◉○● ●●●●●●·○ · ······ - ◉··●·· ●●○·○●◉ ·●··· ○· - ·◉●●· · ··· ···○· - ●●◉· · ○ ◉○····○◉ - ··◉●○○○ ·◉● ◉··●· - ●··○●●○◉ ··●·●·● ◉●· - ●●●○●○●●●○●◉○● ◉◉ ·· - ○○●●○·◉●·◉●●●○ ○◉ - ●○○○○●●◉●○ ○◉· - · ●···· · - - diff --git a/codex-rs/tui/frames/dots/frame_052.txt b/codex-rs/tui/frames/dots/frame_052.txt deleted file mode 100644 index ab006f7caf..0000000000 --- a/codex-rs/tui/frames/dots/frame_052.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○◉○●●●◉○●●○ - ◉ ●● ○●◉○ ○·● - ·◉◉● ●○●●○●·● ○○ - ◉·◉●◉ ·◉◉ ○○ - ··○ ◉ ○·○○ ○●○ - ··●○○·○ ·◉·● ·· - ● ··○●●● ○ ●· ·◉● - ·· ···○· ● ·· ○·○ - ◉◉· ◉◉○·○ ···◉ · - ·· ···○○ ·◉●··○· - ··◉ ●·◉·○ ·◉·○◉· ·◉● - ··◉ ·◉◉○● ·◉○···◉ ·· - ·◉ ·· ○○○●●●●○○······· - · ○● ●●●●●○·· ······· - ··◉ · ○○◉○·●··○ ·· · - ◉·· ◉◉ · ··· ·· · - ·· · ○○◉ ·· ○· - ···○ ··●◉···●● - ··●○ ●·○○···· ◉ - ○·●◉○●○○●◉○·● ◉◉· - ○○●· ◉·◉○·● ◉◉ - ●●○○● ○◉●◉○· - ● · - - diff --git a/codex-rs/tui/frames/dots/frame_056.txt b/codex-rs/tui/frames/dots/frame_056.txt deleted file mode 100644 index 709d607586..0000000000 --- a/codex-rs/tui/frames/dots/frame_056.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ●○●●●●○●●○ - ◉●○○○◉◉◉● ·● - ◉·◉●○○ ·· ●·● - ●·●◉·○·●● ●● ○ - ·○· ○○◉○○○ ◉◉ - ·○●○●● ··○·● ●· - ···● · ●·· ·◉··○ - ○◉●◉ ··● ○· · - · ·●● ○· ···◉ - ○◉○●○◉· ··●··●◉· - ·◉·◉○●· ··◉●●·◉· - ·◉●◉● · ·· · ··· - ●◉○·○○○● ··◉··●·· - ○○· ●●·○ ··◉ ·· · - ○· ◉ ·······○· - ··●·●● · ◉···· ◉· - ··· ·· ○ ····· · - ○· ○ ◉··· ●◉◉○· - ·●○ · · ○○●· ·· - ○·○○●◉○◉●· ··○● - ○●◉ ◉◉● ◉ - ●○○◉○● ○● - ●·● - - diff --git a/codex-rs/tui/frames/dots/frame_060.txt b/codex-rs/tui/frames/dots/frame_060.txt deleted file mode 100644 index 59daaf3022..0000000000 --- a/codex-rs/tui/frames/dots/frame_060.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○●●●◉●●● - ○ ○·◉ ● ●○ - ◉···◉· ○○○ - ◉◉◉·◉· ●··· - ···◉·●● ·· - ··○·◉◉·○· ○· - ··◉●··◉· ·· - ·· ●····○ ● - ··◉··●◉○····· - ····· ··· ○○· - ··○● ·●●· ·· - ···○· · ·◉·· - ··○○·○·◉····● - ········· ·○ - ··○· · ··· ·◉ - ··○········ · - ·○◉◉◉· ◉ · - ··◉·· ◉·· - ◉···○·●○○·○ - ·○●·○ ·●·· - ○ · ○○ ●○○● - ●●· ●●◉◉·· - ● · · - - diff --git a/codex-rs/tui/frames/dots/frame_064.txt b/codex-rs/tui/frames/dots/frame_064.txt deleted file mode 100644 index 02f917de24..0000000000 --- a/codex-rs/tui/frames/dots/frame_064.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ●●●●●●●● - ·○· ○· - ·○·● ·○◉○ - ···○○○ ·◉ - ·◉◉·● ○·· - ● ◉ ○○◉○· - ●◉ ·◉●● · - ○··· ·◉○○ - ○·○○● ◉· - ····○○··○ - ··· ●● ··· - ····◉◉○◉· - ·········· - ······○○·· - ·········· - ··◉····· · - ·········· - ········◉· - ··●·○◉●·○· - ○·◉··◉ ·○· - ○·●· · · · - ●◉ ◉●◉ - ● ●● · - - diff --git a/codex-rs/tui/frames/dots/frame_068.txt b/codex-rs/tui/frames/dots/frame_068.txt deleted file mode 100644 index b0ebd0a919..0000000000 --- a/codex-rs/tui/frames/dots/frame_068.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ●●●◉●●●○● - ○◉ ○◉·○ - ·●·●●○○·○○ - ·● ● ·●·◉· - ··· ·○··· · - ●·◉·◉○·○ · - ○········ · - ◉···◉·○··· · - ······○··● · - ·○···· ◉·○ · - ·· ●·○·◉·●◉· - ·● ◉· ··◉· - ○· ··· ···●· - ○ ···●··· · - ○····●·●··· - ○○··· ◉○··· - ·◉···○◉··◉· - ··○◉●··○◉◉· - ·●·◉●●·●··· - ●○ · ··○ - ··● ··◉·◉· - ·◉○ ·●○○· - · ● · - - diff --git a/codex-rs/tui/frames/dots/frame_072.txt b/codex-rs/tui/frames/dots/frame_072.txt deleted file mode 100644 index ea4f8a8e05..0000000000 --- a/codex-rs/tui/frames/dots/frame_072.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ●●·◉●◉●·● - ◉○○·◉·○◉○◉● - ·· · ◉·○●○○○ - ●○· ●····●● ◉ - ··◉·◉○· · ●◉·●● - · ·●······· ○· - ○·· ○ ·●· ◉◉·◉ - ·····○···○ · ·· - ········ ··· ●◉· - ····○◉··◉ ○●···· - ·· ○·◉·◉◉●·◉◉·· - ··○·◉◉○ ○○○○ ○○· - ·····○ ·◉◉◉●○○·· - ····· ·●·····●·· - ·· ○ ·· · ○○·●·· - · ○ · ···○○◉○○· - ·● ·●·○ ···◉○ - ··· ○●○○●●·◉·· - ●·◉○◉● ◉··◉··●· - ··● ●◉○·●· - ●○ ◉ ○●·●◉◉◉ - ●◉·◉ ○·○○◉ - · · - - diff --git a/codex-rs/tui/frames/dots/frame_076.txt b/codex-rs/tui/frames/dots/frame_076.txt deleted file mode 100644 index 07e34dae53..0000000000 --- a/codex-rs/tui/frames/dots/frame_076.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○●●●◉●●●·○○ - ●○◉··○○○●○◉●○ - ··◉·●○◉·○· ●●○○ - ·◉·◉◉◉○·●◉ ○●●●·● - ●●◉··●◉◉·· ◉●○◉ - ·○○◉◉ ·●◉●○ ○·● - ○·◉○○● ··○● ○·· - ··○·◉·· ···●◉ ◉· - ··○●···○○○··· ●◉·· - ○····· ··○● ··○· - ·····◉ ◉·○·●·· ·◉○· - ·····◉ ○◉○ ·○· ·○· - ····· ◉··○○●●○··· - ····· ◉·○○●··○◉· ·· - ····· ○○··○○● ◉·●◉·· - ···· ○○··●○·○●·○·◉· - ···· ○·◉ · ·○● - ●····· · ◉◉○●·● - ·○●○●··●◉● ●· ·●○ - ●○◉ ··○○·◉●◉·○●● - ●·●◉ ·○ ●●●◉◉○◉ - ○●● ●·●○○◉ - ·· ·● · - - diff --git a/codex-rs/tui/frames/dots/frame_080.txt b/codex-rs/tui/frames/dots/frame_080.txt deleted file mode 100644 index d0961cd8cc..0000000000 --- a/codex-rs/tui/frames/dots/frame_080.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ●○●·○●○●·○○ - ◉●● ● ··●·●◉·●● - ··●◉●◉●· ●● ●●●●○ - ◉ ·· ◉◉·●◉◉· · ●●○○ - · ◉··●●·○● ◉○·● - ◉◉·●◉◉·○● ○ ○◉ - ··◉○○·●·● ○●○ ○◉·● - ◉·· ··●●●· ○◉·○ ●·◉ - ·○· ·○··· ◉○○●◉ ·· - ○··· ···· ○··○ ·◉· - ·····○○·· ◉◉ ◉ ◉●◉· - ····●·○·· ·○·○ ··· - ·◉··· ··· ◉○ ·○ ● ◉○··· - ····· ◉· ·◉·●·· ● ···○· - ····◉ ●· ●○ ◉ ··◉ ◉ ··● - ····· ●· ◉●◉ ○···○· - ·····●·· ◉···· - ○○··○◉ ·●○ ◉○○ - ●·● ··○○○○○ ··●· - ○○○ ○○○○○●●●●·○·●●◉ - ·○ ●◉ ●○●◉●○● - ●○○ ●○●●○○◉●· - · ···· · - - diff --git a/codex-rs/tui/frames/dots/frame_084.txt b/codex-rs/tui/frames/dots/frame_084.txt deleted file mode 100644 index d5e6dbb38d..0000000000 --- a/codex-rs/tui/frames/dots/frame_084.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○●◉●○●◉●●●●● - ○·● ◉ ··● ○◉◉○●○○ - ○·●··◉ ◉◉○●●● ●● ○·○ - ●◉●● ○●●●●●◉ ·· ○ ○· - ●◉●● ·◉●··● ·· - ·◉·●◉●●◉○● ○ ●○● - ···◉○·●·· ●·○ ◉·○ - ·· ◉····● ·●○○○ ●◉·● - ·●·◉ ··● ○◉○·○ ●·○ - ····· ○·· ○○◉● ··· - ·◉·· ○·●· ● ○·●○ ··○ - · ○◉●○○·· ·○●●·· ··◉ - · ·●·◉·· ●◉○●○●○○●●○○ ○○·◉ - ·· ○· ···· ◉◉◉○◉ ●·● · ···· - ·● ●●··○· ○◉ · ○·●· ●●◉ · - · ●·● ·◉ ○··· - ○○ ●○···●· ●·●·●· - ○·○ ○●○ ○ ·◉○○○· - ·· ○●·○ ·○ ◉ ·●◉ - ○○ · ◉·○○●○○○●●○◉◉· ◉ - ●·○ ·○·○· ●●●●● ● - ●●○ ●○●○○○○○◉● - · ···· · - - diff --git a/codex-rs/tui/frames/dots/frame_088.txt b/codex-rs/tui/frames/dots/frame_088.txt deleted file mode 100644 index 16b5489ae2..0000000000 --- a/codex-rs/tui/frames/dots/frame_088.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◉●◉·○◉●◉○●●●○ - ●◉○ ●◉◉·◉●·○◉○◉ ●● - ○◉·◉ ●●●●○●●●··●· ·○●● - ◉· ◉◉◉◉◉◉●· ●·●·●○·○ - ◉○●·◉●◉●● ○◉·○·○ - ◉·◉◉●◉◉◉○ ○ ●● ·· - ○·○○ · ●◉ ·●◉ ○ ○·●● - ···◉◉●●· ·●●● ○ ●·· - ·○○ ○◉○●·○· ○·◉ - ·····◉○· ◉●◉○● ●◉··· - ·······◉ ◉ ○◉·○· ●◉··◉ - ·○ ····· ◉●·◉○·● ◉··○ - ·· ·◉··· ··○●◉·● ●●●○○ ◉·· - ◉ ●◉· ◉◉◉◉●◉◉ ○● ·◉ ····· - · ◉ ··○ ○··● ○●●●◉ ·●● - ●◉◉ · · ○●· ··◉◉ - ·● ○·○○●○● ○●◉◉·○· - ●◉○●●●·●○● ◉●◉◉○○◉ - ·◉○○●○·●●○ ○◉·●·●·◉ - ·◉ ○○○○ ●●●○○◉●○···●○● - ·○· ○ ○· ●○●●●● ○◉· - ●● ·●●●●◉○○○○●●· - ●●·· ● · - - diff --git a/codex-rs/tui/frames/dots/frame_092.txt b/codex-rs/tui/frames/dots/frame_092.txt deleted file mode 100644 index 224c0c703b..0000000000 --- a/codex-rs/tui/frames/dots/frame_092.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○●●◉●○●●●●◉·●○ - ○●· ● ·● ● ○◉◉·◉ ●○● - ○◉ ·◉●●●● ○●●●·· ●●●◉○○● - ◉●●◉◉●○ ●●● ○◉○●●·●○ - ··◉ ● ·◉ ·◉ ●○○ - ··○○○●● ●○◉ ●●·· - ◉● ●·◉·● ◉·●○ ○◉○· - ○·◉●··◉· ·◉●●○ ·◉○ - ···· ·○● ·●●●○·○ ··· - ··· ●·· ·●◉●○ ◉·· - ○····○· ◉◉○· ··◉ - ○··○··· ◉◉◉◉●◉ ·● - ···◉··· ◉○◉◉◉◉◉○ ○○●●●●·◉ ◉ ·● - ····●○◉ ◉◉◉◉◉·● ●○● ●· · ●··○ - ●···○··●○ ●●· ○ ●·●◉●◉·● ·○●·· - ●○···◉◉ · ●○●· · ● ·· - ●●○○●●○ · ●● ·○○◉ - ●·○○○●○○ · ·○◉●·◉ - ●·○○○○·○○●● ○◉●●○◉◉●◉ - ○○ ●··●·●●○○○○●●●●·●●●●● - ○○○○·○●◉ ·●●●●●●●●·○● - ●●○·●●●·●○○○○○●● - ·● ·· ● · - - diff --git a/codex-rs/tui/frames/dots/frame_096.txt b/codex-rs/tui/frames/dots/frame_096.txt deleted file mode 100644 index aa4cedcdb5..0000000000 --- a/codex-rs/tui/frames/dots/frame_096.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○○●·●●●●●●·○○ - ○● ○●··● · ○◉●◉ · ●●●○ - ○◉○◉◉●●● ·○◉●●●·· ●●◉○●●○○ - ◉ ●●·· ○●●●●◉●○ - · ◉·◉◉ ● ◉●●○ - ·◉◉◉·◉● ●●○ ●○○ - ●◉◉◉·●◉ ◉◉ ○○ ●●○· - ◉◉●◉·○● ··◉ · · ·◉● - ●○ ●●· ·●·◉· ○ ··· - ○···○·○ ○○○○·○● ··◉ - · · ◉·· ● ○●···◉ ◉···· - ··· ··· ·◉◉·◉ ◉○● ·◉···· - ●······ ·◉●● ◉● ○●●●●◉◉○ ○ ·●◉· - ●····●● ·●●●·◉●◉ ·○● ·● · ○·◉ - · ····· ●◉◉ ●· ○·●●●◉● · ◉◉·● - ○·○ ●●● ·○● ◉●●···· - ●○○· ◉◉○ ●◉●●·●○◉ - ○·○●·○·○●◉ ○◉ ◉●●·◉ - ●○○○●·○◉ ●●◉ ○● ·●●◉◉ - ○○ ○●·○○ ●●◉○○○○●●●◉○●·◉ ·· - ○○ ○●●·◉●·●●●●●●●●● ○● - ●●○○◉○·●○○○○○○◉●●· - · ··· ● · - - diff --git a/codex-rs/tui/frames/dots/frame_1.txt b/codex-rs/tui/frames/dots/frame_1.txt new file mode 100644 index 0000000000..36964a4864 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_1.txt @@ -0,0 +1,17 @@ + + ○◉○◉○●●○○●●○ + ○○●◉●○●◉●○○··○○ ○ ●○ + ●·●·●●● ○· · ●· ·○···● + ◉●○○●●●●○ ◉●·◉·● + ○○◉◉●○·○·○○ ◉·○○● + ·● ●· ·●◉◉··● ●◉○··● + ●○ ◉● ●○·●◉ ·○ ·◉· + ··○·· ●◉◉·◉·● ·· + ·○·●· ◉··○○· ◉·●●●●●●○●● ○ · + ○·◉● ○◉●· ◉● · ·○○○◉◉●●●·◉●◉●· + ○○○ ○ ○○●◉◉· ·○●●●● ○● ◉●◉○◉ + ●○● ● · ●●◉●○· + ○○●·○●○ ○○○●·○● + ○●●○○ ●●◉◉○◉◉◉○●●○●·● + ·● ●···○○○●○◉●● + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_10.txt b/codex-rs/tui/frames/dots/frame_10.txt new file mode 100644 index 0000000000..3c687d7f64 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_10.txt @@ -0,0 +1,17 @@ + + ○●●●●○●●○ + ●●·●●●○·◉○●● + ○○●··◉··◉·●○●● + ·○○◉○·◉○◉○●●●○○● + ◉ ◉·· ·○ ●●◉○◉·◉ + ·· ●·●·◉◉○ ·○ · + ○ ·● ●····● ·◉● + ··○●◉●··◉○·◉○·· + ·○ ○○·◉··●○●◉·· + · ●·○●·○◉○●○○○·●· + ● ····· ○● ○·· + ○·●●○●● ○· ●◉◉ + ·● ····●●◉●◉·◉· + ◉·●●◉·●◉○ ◉◉● + ●● ○●○○●◉● + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_100.txt b/codex-rs/tui/frames/dots/frame_100.txt deleted file mode 100644 index 9aa9c4aa4a..0000000000 --- a/codex-rs/tui/frames/dots/frame_100.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◉○○●◉●●●●●●●○○ - ●●·●○◉●●·◉● ·●◉·· ●●●○ - ○●○○◉●●◉◉◉○●●●●○··●●●◉○· ●● - ◉ ◉◉◉◉◉ ·●●○◉◉●● - ○·●○●●●●○ ○ ●●◉● - ○···◉◉● ●◉○ ◉○●· - ·◉○◉◉○◉ ◉· ·○ ◉○○●· - ◉◉◉··◉· ●·○○·○· ·○●·○ - · ◉●●· ●○●·●◉ ○ ··· - ····●·· ●·○ ●○◉● ·●·● - · ··○● ●· ○◉○ ○● ··○· - ·· ○○○· ◉○○●◉ ○· ·· · - · · ··○ ·○○●◉·○◉ ○○○○○●●◉●◉○○ ○·◉·· - ●○ ··· ··●●●·●◉ ··◉● ●·○···· ··●· - ·◉●·○◉○○ ·●◉· ○● ·●·●○◉●●○ ◉·○○◉ - ●○···●○ · ·○●● ●● ○◉◉●· - ○····○· ·○ ◉ ●●··◉ - ○◉●○··○○●● ◉·○●○○ ◉◉◉ - ● ● ··◉ ·○ ○◉● ○●●·● - ●○ ●●·●○ ··◉●○○●●●●●·○●●●·◉◉ - ●●○●●·◉○ ●·●●●●●●●● ●●●· - ·●◉○● ●●○◉○○○○○●●●● - · · ●● · - - diff --git a/codex-rs/tui/frames/dots/frame_104.txt b/codex-rs/tui/frames/dots/frame_104.txt deleted file mode 100644 index e252956d84..0000000000 --- a/codex-rs/tui/frames/dots/frame_104.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○◉◉◉●○●●●●●●●○○ - ○● ●·◉●●· ●●●● - ●●○◉●●● ○●○●●●○··●●●◉●··●●○ - ●●◉◉◉○◉ ○●● ◉○●·●○ ○○ - ◉ ◉●●● ●◉ ●·◉◉○○●○ - ● ◉●●◉ ◉ ◉◉○○ ○ ·●◉○ - ·●◉··◉●· ◉◉ ●●○ ●○ ·◉◉○ - ·○○○◉●◉◉· ○○●·○○○· · ○◉○● - ·◉·○·○○ ●·○ ●· · ○ ··○● - ·●····●· ● ··●◉·○· ·◉ ● - ·● ·· · ·○◉ ·● ◉· ·· · - ···◉·· · ○●●◉◉· ◉ ·◉··●· - ○● ···●· ●●◉◉·●◉·· ○●●○●●●◉◉● ○···●· - ○· ●◉ ● ◉·●·◉ ○· ●◉○● ●·○ · ◉●·○·· - ○ ····●· ●●◉··○ ·●●··◉◉●●● ····· - ●·○○○○· · ●◉ ○○·○· - ○○○◉○·●○·○ ○◉·◉●◉●● - ●◉ ··○● ·● ○◉●○●◉··● - ○ ●●·◉○ ·●○ ○● ○◉○●●◉· - ●◉ ●●●◉○ ·●●●●●○●●●●●·○◉●●·●●● - ●○○●○●○○ ●·●●●●● ●●·●·◉ - · ●·●●●○○○○○○●○●● - · · ●● · - - diff --git a/codex-rs/tui/frames/dots/frame_108.txt b/codex-rs/tui/frames/dots/frame_108.txt deleted file mode 100644 index ad8bb9fdc1..0000000000 --- a/codex-rs/tui/frames/dots/frame_108.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○◉○◉◉●●●●●●●●●○○ - ●◉·●●●● ●●○ - ○◉●●·●◉◉◉◉○●●●·····●●●●○○◉●●● - ○◉●◉◉ ○·●◉● ○● ●●··●● - ◉·◉●●··●· ●◉○●●◉·○ - ··◉·●●●·· ●●·○ ● ·○○○● - ·○◉·●●○· ○◉◉◉·● ·○○○·○●● - ◉●·○○◉ · ●·◉○●○○ ○○ ○○·○ - ·····◉· ●·◉○··● ●●○●○· - ··○··◉◉ ◉●·○●○○● ··◉ ··· - ●●···◉· · ··●◉·· ◉ ·◉○● - ····○· ◉○●●●●●· ◉◉·○ · - ○ ◉··● · ○● ◉◉◉◉◉◉ ●●○○●●●●●●◉●●● ·◉··○· - ●○ ···○· ●○●◉◉ ◉ ●··○● ●●○ ○●● ●···· - ·●○○·◉ ·· ●·◉●◉ ○○●●··○○●● ·· ◉ - ·●·●◉●●○◉ ●○◉◉·◉·● - ●○●·◉·○●○○ ·◉●○◉◉·●· - ●● ···● ·● ○●○◉◉◉○◉· - ○○○●·○● ·●○ ◉●○·●·●○● - ●○●·●●○ ○●●●●●○○●○●●●·○◉●·●·○◉· - ●● ●··○○ ●· ●●●● ●●·○○●● - ● ◉●●··●◉○○○○○○◉●●● - · ●● · - - diff --git a/codex-rs/tui/frames/dots/frame_11.txt b/codex-rs/tui/frames/dots/frame_11.txt new file mode 100644 index 0000000000..c2548db4b3 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_11.txt @@ -0,0 +1,17 @@ + + ●●●●●●●○ + ◉ ◉···○○● + ◉ ○○··◉○●◉○● + ·○○··○◉●○○◉◉ + ○ ◉◉○·●○●◉○··● + ·●···●○◉◉·○◉·· + ●● ●······○·○○ + · ··◉··○◉ · · + ◉ ●·◉··●◉●·○· + ●● ○·◉○● ◉·○·○ + ●·◉ ····○◉·○○· + ○○◉◉·○●◉●●◉·· + ○ ●·○○○○·◉ + ○● ●··●○◉●· + ○○ ●●●○●· + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_112.txt b/codex-rs/tui/frames/dots/frame_112.txt deleted file mode 100644 index d7b6fa07f7..0000000000 --- a/codex-rs/tui/frames/dots/frame_112.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ○○○◉◉●●●●●●●●●○○ - ○◉●●◉·● ◉○● ●●○ - ●●●·●◉● ●○●●◉●●○···●●●●●○ ●●○ - ● ◉● ● ◉◉●●·○ ● ●●◉● ○○ - ●●··●● ●· ●● ●●●●○ - ◉◉◉··● ◉ ◉●●●○ ○◉ ○○ · - ◉○◉◉●●○·· ○○·○●●· ●○ ○· · - ●◉·○○●●· ·○○◉●●◉○ ●○ ○· · - ·····●◉· ●○○●○○○ ○◉ ··●● - ○··●··◉· ○●·○ ○ ● · ··○· - ·○ · ○ ●○◉○ ◉ ·●○·◉· - ···○· ○ ○●○●◉ ◉● ●◉···· - ●· ○·○ · ◉·●·○ ○·· ●○○○●○○●●◉●●●○ ○ ··○· - ● ··· · ○◉◉◉●· ◉● ○··◉●● ●●● ○·●·●·○·○●· - ○● ○●◉ · ·· ◉◉ ●◉○●·●●○○●●●●◉··◉·◉· - ○●·◉· ●○ ◉○○○●○◉ - ○●··○○○●○ ○◉·◉●◉ ◉ - ○◉···○●○○○ ○●●●●◉·●● - ●● ··◉● ○●●○○ ○●● ·●◉·○◉· - ●●○●·○●◉●·●●●●●○○●○●●●·○●●·● ○● - ●○··○○ ○ ●· ◉●●● ●● ●○●●· - ··◉●●●·●●●○○○○○○◉●●●●· - · ● ●● · - - diff --git a/codex-rs/tui/frames/dots/frame_12.txt b/codex-rs/tui/frames/dots/frame_12.txt new file mode 100644 index 0000000000..30b03392bf --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_12.txt @@ -0,0 +1,17 @@ + + ●●●●●◉ + ●○·○◉·●○ + ·◉○●● + ◉●···○○ · + · ●····◉◉· + ·●◉◉●○ ○· + · ·◉○··○ + · ◉●○·· + ●● ·◉··●·· + · ◉·●◉●○ + ·◉ · ○●●◉ + ● ●· ○●· + ◉ ●●·●●○· + ●○◉ ●·○·· + ○ ●·○◉◉ + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_13.txt b/codex-rs/tui/frames/dots/frame_13.txt new file mode 100644 index 0000000000..cb95f3763d --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_13.txt @@ -0,0 +1,17 @@ + + ◉●●●● + ·○○·· + ··○· + ·●●·○ + ● ·· + ◉◉·· + ● ·· + ● · + ◉● ○·◉ + · ●○· + ●·◉◉ ·· + ·○○○· + ·●●·○ + ●○○·○ + ● ◉ ○ + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_14.txt b/codex-rs/tui/frames/dots/frame_14.txt new file mode 100644 index 0000000000..3a8ed60b8f --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_14.txt @@ -0,0 +1,17 @@ + + ●●●●◉ + ●◉○○◉○ + ·○··◉ · + ··◉· ○·● + ···○ · + ·●·· ●· + ···· ◉ ● + ··○·· ○ + ···· + ○◉◉ ◉◉ + ○· ●◉●· + ·●··○○○· + ◉ ·○○○· + ·○◉●○○◉ + ○● ●○◉ + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_15.txt b/codex-rs/tui/frames/dots/frame_15.txt new file mode 100644 index 0000000000..c57b4af0ee --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_15.txt @@ -0,0 +1,17 @@ + + ●●●●●·○ + ·●○··○◉●● + ◉◉·●○○· ●· + ·◉· ◉◉●◉○○· + ··○ ○○··◉ ○· + ○··◉··◉◉· + ·· ······●· + ··◉··●··· ●◉· + ··●●●●···○◉◉· + ·○·◉◉·○·●◉ ◉· + ·◉····○· · ◉ + ·●●◉○··○◉ ○ + ●·○● ◉◉◉· ◉· + ·○··○○◉●○◉ + ○○●○○○○◉ + ·· \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_16.txt b/codex-rs/tui/frames/dots/frame_16.txt new file mode 100644 index 0000000000..18ae0e09ee --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_16.txt @@ -0,0 +1,17 @@ + + ○○● ●●●·○ + ◉○··●··○·○○ + ·◉◉ ○◉○○·· ●○ + ◉◉◉ ◉●○○·○··●●· + ··◉○◉●●○··●◉··○ + ···●·● ·○○ · ·◉· + ○○· ◉·●····◉● ● · + ·◉◉ ····◉··· ◉ ·· + ○○···●·◉○·· ●● ◉ + ● ○○●○○○●·◉○· ●○· + ···● ◉●○·◉ ◉◉··· + ··● ·· ·◉◉● ◉ + ○·● · ◉●◉○●· + ○·· ○●·◉◉●○· + ●◉◉○○◉○○◉● + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_17.txt b/codex-rs/tui/frames/dots/frame_17.txt new file mode 100644 index 0000000000..a470b4ba8d --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_17.txt @@ -0,0 +1,17 @@ + + ●○●●●◉◉·●○ + ○◉●●···●○●·● ○● + ●●○◉○○○·●● ···○ ○ + ◉·◉○◉· ○· ●·◉○···○○ + ·◉○ · · ◉○○○◉◉ ● + ·○●●◉· ●◉◉· ◉●○◉·◉◉ + ● ◉◉· ●◉◉·○ ● ··◉○· + ◉ ○· ◉◉··◉·●··○◉● + ●◉●◉○○○●·○○·○○◉○··· · + · ○◉○○·◉●○◉··○ ○●●●○ + ○○○◉ ●●●●○○·●◉◉○ ○● + ○··○● ·◉··· ◉ + ○○○ ●○○ ●●●◉○○◉ + ● ·●●○○●·○◉●◉·● + ·●◉◉○●●·●○●● + · \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_18.txt b/codex-rs/tui/frames/dots/frame_18.txt new file mode 100644 index 0000000000..c0354b3933 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_18.txt @@ -0,0 +1,17 @@ + + ○○○●○○●◉·●○ + ○● ○◉●●●·○○● ●◉◉○ + ○◉◉·● ●○ ● ◉○ ●◉◉○ ● + ●··●◉●○ ● ●○·○◉○·○◉○○○● + ○○◉◉ ◉· ○ ●○○◉·◉·○○◉○○○ + ◉○· ●●·◉○○○◉●●●·●◉◉○◉·◉· + ··○◉◉ ●◉●◉· ○◉ ●·○·○● + ○◉·· ○○ ··◉○ ·◉· + ○ ●○○○◉○◉●··●·●◉○● ·●·· + ○○○·●○● ··◉○○○○···○◉··○ ● + ·◉·○· ●●●●●· ○○○◉·◉●◉·◉· + ○○ ●○● ··● ◉●○● + ○○●●○○◉ ○●○○◉○●· + ●·◉●●●●○○○○●●○◉○●● + ··○◉○○●◉● ◉● + · \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_19.txt b/codex-rs/tui/frames/dots/frame_19.txt new file mode 100644 index 0000000000..c9ded56838 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_19.txt @@ -0,0 +1,17 @@ + + ○○○○●·●○○·◉○ + ○●···○◉○○○○●○●·●●● + ●●◉◉◉ ·●●· ·●◉●·●◉○ + ◉◉·●●○· ○○○●●○·●● + ··◉·◉· ●·○ ◉ ·○ ·○● + ·○◉●● ○·●·◉ ◉◉ ●◉●· + ○○··● ◉●○◉·●●· ◉◉◉●· + ···· ·◉ ○· ● · ··· + ·●·○●○◉◉○○○····●●◉●·◉ ○ ·· + ○◉◉●·○●◉○●●○●·● ○○ ◉○○○●◉◉·○ + ●○ ◉●· ●● ○○○◉·◉◉ ◉◉● + ○○○●○○ ·◉◉○◉◉● + ● ○○··●● ●◉○◉◉·◉· + ● ◉·●◉·●○○○◉◉● ◉●·● + ·◉○◉◉●○●◉○●◉○ + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_2.txt b/codex-rs/tui/frames/dots/frame_2.txt new file mode 100644 index 0000000000..6e7a27fb29 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_2.txt @@ -0,0 +1,17 @@ + + ○◉○◉○●○○○●●○ + ○●●◉●◉●···○··○○●·●●○ + ●·●·○●●·●·· · ●○●◉··◉·● + ○·◉○◉●●●●○ ◉●○·◉·● + ●○ ◉●○·○○○○○ ○●·○·● + ●◉● · ·●○●◉○● ○○·●· + ●·●●· ○◉·◉·○·● ◉ · · + · ○· ●·●··◉● ·●◉◉· + ● ○· ◉·○○○· ◉·●●●●●●●●●·○··● + ○○●· ◉··● ◉● ·○○○○○○◉◉○○·●◉ · + ○○○ ● ●○◉◉·● · ●●●●●●● ·●●·· + ●○○◉◉● · ●●◉◉●● + ◉○○○·●● ●○○● ○· + ··○◉○○ ●●◉◉○◉◉◉○●·○··● + ·●●●●··○○○○·◉◉● + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_20.txt b/codex-rs/tui/frames/dots/frame_20.txt new file mode 100644 index 0000000000..d9809e733c --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_20.txt @@ -0,0 +1,17 @@ + + ○○●○··○●○●○○ + ●◉○ ◉●○●○○○··○○●○●● + ●● ○●● ·● · ○ ○●●·●○ + ○· ○●·● ○●●·○◉●○○ + ○· ●·● ○◉ ○··○●○··○ + ◉·●·● ●●●◉· ◉ ●○··○ + ◉·◉●· ●● ◉●●○ ●○·◉ + ·○○◉· ◉◉· ● ·· · + ·◉··◉●○◉○○○○○○○●●◉○○○○● ◉ ·○ + ●·○·○ ◉··○○○○·○ ●○○ ·○○ ●◉ ·· + ○●○○● ● ○●○··●· ◉○ + ● ○●◉● ○◉●◉·◉ + ○○○●●·○ ●◉●·◉●● + ○●◉◉ ·●○◉◉●◉ · ·●◉●● + ·●●·○ ○○○○○·● + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_21.txt b/codex-rs/tui/frames/dots/frame_21.txt new file mode 100644 index 0000000000..0821f12d75 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_21.txt @@ -0,0 +1,17 @@ + + ○○●○●○○●○●●○○ + ●●●··○○●·○·●◉○·◉●●○ + ◉●○○●●○ · ·○·●●○·●● + ●●·◉ ● ○●◉●●◉●● + ◉●◉●· ●·◉○○ ○○○○● + ◉ ◉· ●●●○◉◉ ○○○● + ·●·· ○ ◉·●◉● ○◉○ + ·○ ○◉ ·● · · + · · ●●◉◉◉◉◉●●● ○·● ·● ◉◉ · + · ·○ ·○ ○●· ○ ·●·● ◉ ◉◉ + ◉ ◉ ·· ●· ●●○●◉ ◉· ● + ●● ◉◉○ ○● ◉ + ●○ ○◉○ ○◉◉●● ●· + ●○○ ● ●●◉··◉◉○● ◉· + ●●●◉●○○○○●○◉●●· + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_22.txt b/codex-rs/tui/frames/dots/frame_22.txt new file mode 100644 index 0000000000..d673349801 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_22.txt @@ -0,0 +1,17 @@ + + ○●●○●○○●○●●○ + ○●◉●·◉○◉·◉○··◉·●◉●●○ + ●◉●◉·○●●· · ●○●●●○○●● + ◉●·●● ●●···○●○ + ○··◉● ●○◉·○·◉◉◉●· + ○·●◉· ●·◉·◉○◉· ○·○○· + ·●●○◉ ·●·○●◉● ··◉· + ··○·· ·○··○○ ·○· · + ··● ● ●·○○◉◉◉○●●○○●·○ ○● ○·◉ + ○·○ ●○○○● ◉● ·◉◉· ○●◉○ ·●● ◉○○ + ○○○○· ●● · ·◉●●○◉◉◉ ●· + ○●○○○● ○●● ·●● + ● ●◉ ●●○ ○◉●● ●○◉ + ●◉●●● ●·◉○●◉◉◉○● ●●● + · ·○◉○○○◉○○◉○●· + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_23.txt b/codex-rs/tui/frames/dots/frame_23.txt new file mode 100644 index 0000000000..180ab16784 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_23.txt @@ -0,0 +1,17 @@ + + ○●●○○●●●●○●○○ + ○○·●·○○●○○○●·○·●·●○ + ● ●·●●◉●· ·◉●·○◉··● + ◉◉·●◉◉· ○◉◉○··◉○ + ◉◉··◉● ●◉●●●●◉●○·○ + ●○· ◉· ○●●●●●◉●●··○·● + ··· · ◉◉◉◉ ○·· ·●● + ·◉· · · ·●○○● · ●◉· + ○ ○ ·●·◉○○○○○◉○·○●·○ ○○ · ··· + ·○○○· ○ ◉·○ ○·○○●· ○○· + ◉●· · · ●·◉◉○·○◉○◉· + ●··○·◉ ●◉·○○◉· + ○ ·●●◉○○ ○◉ ◉●◉●◉ + ○○○●◉●●○·○○○●● ◉○●●· + · ●○○·○○●○○●●· + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_24.txt b/codex-rs/tui/frames/dots/frame_24.txt new file mode 100644 index 0000000000..3244b1c6f9 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_24.txt @@ -0,0 +1,17 @@ + + ○·○◉●●●○○●○ + ● ○◉ ·○○·○○●●○●● + ● ●◉○◉● · ◉·◉●·●●● ○ + ●●◉◉●◉·○●○··◉· ○●○·○○● + ● ◉◉○◉● · ◉○○···○·●● + ·●○●○· ●●●◉ ◉·◉ ◉ ○ + · ·· ●◉○●◉ ◉○○·○○·○ + · ○·· ·●○◉○○··○◉◉··· + ·◉ ·◉◉◉◉●●···●●○●●○· · ·· + ○ ◉ ●·◉●●◉◉●●·◉○○●●· ·●· + ○ ●○·○● · ○●◉●○·○◉●· + ○ ○●●○ · ◉◉◉ + ○◉●○··◉ ○○ ○◉◉○● + ◉◉●●○○ ··◉○○◉·○○◉· + ●◉○●●◉○○○○○●● + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_25.txt b/codex-rs/tui/frames/dots/frame_25.txt new file mode 100644 index 0000000000..c04ef18b74 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_25.txt @@ -0,0 +1,17 @@ + + ○●○●◉●●●●○ + ● ●●●·○◉○·●··● + ◉·◉◉●● ◉·●○○○···○ + ·●●· ◉ ○· ○·●●○◉ + ●○○○●◉●○◉◉○· ·◉◉○◉● + ○●···○●●◉○·◉ ◉·●·◉◉·● + ·◉·●· ·○○◉○○◉·○◉○ ·○· + ···◉·◉ ·○○○◉·○○·○··○ + ○●○· ·○○○○○○●··○○·●●·○ + ◉◉ ·◉·●·○··◉●○·○●○◉○· + ○·●◉○·· ●●◉·○·◉·· + ·○ ·◉●◉○◉●●◉○◉●◉◉·◉ + ○·○·○○○●◉◉●○◉○··◉ + ○◉◉○○○●○·●● ●·● + ·● ●○●●○●·● + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_26.txt b/codex-rs/tui/frames/dots/frame_26.txt new file mode 100644 index 0000000000..1ecc43beef --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_26.txt @@ -0,0 +1,17 @@ + + ○◉●●● ●● + ◉●·◉◉○·●◉·● + ◉● ·◉○·○ ○● + ◉● ●···○··○●◉○ + ·○●○·◉· ●○◉◉·○◉ + ○ ·◉◉◉ ●○○ ○○◉ + · ●●○··◉··◉◉ ● + ◉◉ ○···○○○··◉·· + · ◉○●◉●·●○○◉○·· + ◉○·◉●·○○●●○○●· + ·· ◉·● ○●◉·●○·· + ○○··◉○ ◉◉ ··· + ● ●·○ ○·◉·◉● + · ●○○ ●○●●◉ + ○◉◉○●·○○● + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_27.txt b/codex-rs/tui/frames/dots/frame_27.txt new file mode 100644 index 0000000000..83e62da52e --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_27.txt @@ -0,0 +1,17 @@ + + ◉●●●●● + ·◉◉◉·◉○ + ◉●· ●·◉●· + ···○··◉·· + · ··○◉●○ + ·○◉○ ····· + ○ ··○●·· + · ····○ ·· + ·◉ ◉ ·●···· + ●○ ◉ ○·○●·· + ·◉ ○○●●●◉● + ··●●··○◉· + ·○○●○●◉·○ + ○○○·○○◉◉ + ●○ ○○◉ + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_28.txt b/codex-rs/tui/frames/dots/frame_28.txt new file mode 100644 index 0000000000..6d460c936d --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_28.txt @@ -0,0 +1,17 @@ + + ◉●●◉ + ·●○·· + ○ ◉·· + ·◉·●· + · ·· + · ◉ · + ○·· ○· + ·◉ · + ◉○ ○· + ··◉◉·· + · ○· + ·○●○· + ·○●·· + ●○○◉· + · ◉●· + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_29.txt b/codex-rs/tui/frames/dots/frame_29.txt new file mode 100644 index 0000000000..d0d6b3c286 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_29.txt @@ -0,0 +1,17 @@ + + ●●●●●● + ●·●◉ ●○ + ○●·· ● · + ····○○●◉ + ○ · · · + ·●··· ○○ + ·○○··· ○ + ··○·· + ···●· · + ○·○·· · + ●··◉·○ ○ + ·◉··· ○· + ······○· + ·○·●◉ ·● + ··● ◉● + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_3.txt b/codex-rs/tui/frames/dots/frame_3.txt new file mode 100644 index 0000000000..062da3ed89 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_3.txt @@ -0,0 +1,17 @@ + + ○◉○◉●●○○○○●○ + ○●●◉○··●· ○○·◉○○·●●○ + ●◉◉●◉·● · · · ●●●◉○·● + ◉●◉○·◉●●○ ·○● ··○ + ●◉●·◉○◉··●○○ ○○○··○ + ◉·○○◉ ◉●·○◉○○ · ○○· + ○● · ●●○·○ ·● ◉●◉·● + ●◉·●· ●◉· ◉○· ·○·○· + ◉ ●· ◉·●●··●◉·○●●○○○●●○·○ ◉· + ●○◉○● ◉◉●◉◉◉· ·●·○○● ○◉●◉○··○·· + ●○· · ··●● ●●● ●●●◉◉◉●◉ + ●●· ○● · ◉○●○◉◉ + ○○◉◉●○● ●●◉◉ ●·● + ○○●●○●●○○◉○◉●◉○●◉·○● + ·●●●○◉·○○○○·◉◉○ + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_30.txt b/codex-rs/tui/frames/dots/frame_30.txt new file mode 100644 index 0000000000..4bf02ade3d --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_30.txt @@ -0,0 +1,17 @@ + + ○◉ ●●●● + ○◉◉··○●●○○ + ●○·●○○·●●○ + ··○·◉·○○·○ ○● + ○●···○·●·● · + ·●·○● ●····◉· + ○◉···○○ ○◉○· ○· + · ●●○·●· ·◉ · + ·○ ○·○·○◉·● · + ··○·○○·· ●● · + ○··◉○○●···●·· + ·●◉◉●◉●○·· · + ○·○··◉●··●·◉ + ●○●●○○◉·●◉● + ○◉◉·○○○◉● + ···· \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_31.txt b/codex-rs/tui/frames/dots/frame_31.txt new file mode 100644 index 0000000000..99385ee51f --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_31.txt @@ -0,0 +1,17 @@ + + ○◉◉●●●●○● + ○●●◉●●○ ●○●●● + ●·○◉◉●○○·◉ ·○●○ + ●·◉●○○●◉○●○○·○··○ + ○····●◉●○○● ○·◉○○ + ◉·○··○·● ○◉●●◉◉·● · + ◉·· ·○●·○◉○◉◉●·●·◉· + ○○● ·· ·○ ·○ ··○◉· + ·○●○·●○···◉●···○ · + ···◉◉··○○○○○·○·· ● + ○●○◉●·● ◉●●●·◉·●·○ + ···○○○● ○○● · + ◉·●○○ ● ◉ ·●·◉· + ◉·○·◉○··●· ●·· + ● ○·○●●◉◉◉● + ···· \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_32.txt b/codex-rs/tui/frames/dots/frame_32.txt new file mode 100644 index 0000000000..771e9c9106 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_32.txt @@ -0,0 +1,17 @@ + + ●●●●●◉◉·●○ + ◉●·●●·○··●●··● + ◉○●○○●●○◉◉·●·●○●●● + ●◉◉·○●·◉◉ ◉ ●○○·●● ● + ◉◉·●·●○●●·◉ ●·●·○◉○●○● + ○◉○○●○●··◉··●○ ·●◉ ● + ●· ◉●·●○··●●·●○·◉○◉◉·●○ + ···●○ ○·· ◉●·◉◉○ ○· · + ○··◉○ ●○· ○○·●●●···○· ○· + ● ○··●○●○○○○○○··●·◉·◉○ + ●○●··◉ ·● ●●●○◉◉◉◉◉◉ + ○●·○○○ ●○·◉●· + ●●●···●○ ○◉○·◉ ● + ○◉○ ·●·◉○●·○● ○◉ + ·◉○○○●●◉●○ + ··· \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_33.txt b/codex-rs/tui/frames/dots/frame_33.txt new file mode 100644 index 0000000000..4d36c1eb6f --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_33.txt @@ -0,0 +1,17 @@ + + ○●●○●○●○·◉○ + ○●●··○●○·◉·◉·●·●◉ + ○◉○·●●●●○ · ●◉··● ● + ●○◉·◉○·●○ ●··○○● + ○◉·◉···◉○○○ ·●○○○ + ◉◉● ○○○○·○● ◉○◉○○ + ··● ○●●·○·○ ·●·· + ●·●● ●●●○◉○● ○ ·● + ··· · ●· ◉●●●●◉○○●··●◉○·○· + ○◉·● ◉◉●◉···○○○○○··●○○○··◉ + ○○○● ·◉·◉ ◉ ●●● ··●◉○· + ○●○●● ● ◉◉◉◉○◉ + ●○ ●●●◉● ○●·●◉●○● + ○· ●○●·●◉●○ ◉●○●·● + ○○●●○○○○●●◉◉ + ···· \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_34.txt b/codex-rs/tui/frames/dots/frame_34.txt new file mode 100644 index 0000000000..4cbd99c143 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_34.txt @@ -0,0 +1,17 @@ + + ○●○●●●●○·●○ + ○●●●◉○◉· ·●●○●●◉●○○ + ○◉◉●·● ◉·●· ·○○○● ●●● + ●◉○·●○◉●○ ●·●●○○ + ◉◉·○◉◉· · ● ○○●○○ + ●◉○··◉ ○○ ·○●○ ○●○·○ + ·●○·○ ●○○●·○○ ·◉·○ + ○·○ ◉ ·●○·◉ · ◉ ○○ + ●●◉◉ ◉○◉◉ ○○○●●●●●●·○○ ·○· + ··○●◉●●○ ◉◉●···○·◉○○○●◉○····○ + ◉○○● ·○·●○ ●●····○ ●◉●○·● + ◉●○◉○○○ ◉◉◉·◉● + ○●··●○◉● ○●○ ○◉●· + ◉○◉· ·●●◉●●○●○●·●●◉● + ·○◉○○○○○○◉○●○○ + ··· \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_35.txt b/codex-rs/tui/frames/dots/frame_35.txt new file mode 100644 index 0000000000..5ccdf711b5 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_35.txt @@ -0,0 +1,17 @@ + + ○●●◉○●●●○●●○ + ●●○●◉·●●● ·●·◉ ·●○○ + ○◉◉·◉●●·○● · · ●○●◉ ·●● + ●◉◉●◉●◉●○ ●●○○·○ + ◉◉··◉◉○ ○●● ·○●·● + ◉◉◉◉●· ●·○ ◉◉●○ ·○○· + ○ ◉◉ ○○ ●●○◉ ·○○○ + ···◉ ◉○○◉◉● ◉ ◉ + ◉ ●○ ●··◉◉ ◉·○○○◉○○●·· ··○● + ·●○◉● ◉◉◉ ●●◉·◉ ○●○○○○◉ ·◉● ·● + ◉·○●●◉○○·◉○· · ○○○○●○○●◉◉○●· + ◉○○◉· ○◉● ●○ + ○◉·○◉●◉● ●◉◉○●●● + ○○ ·●·◉◉··●·◉◉● ○◉◉ + ○·◉○○○◉○○●●● ○ + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_36.txt b/codex-rs/tui/frames/dots/frame_36.txt new file mode 100644 index 0000000000..6a26abaea6 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_36.txt @@ -0,0 +1,17 @@ + + ○○●○●●●●○●●○ + ○○ ○●◉◉◉●○●◉●● ●●●○ + ●○●○●●●◉● ·· · ●·●●·●●·● + ○· ●●○○○○ ●●·○ · + ●◉○◉○●·○·○●◉ ○○◉● + ◉ ●◉· ●○ ·◉● ○○● + · ◉ · ○ ○○ ·○·● + ··○· ○○ ○◉◉ ○· · + ·● · ◉◉ ●● ●●●●○●●●●●○ ·○·· + ○●·○ ●·○○◉·◉ ··○○○○○○○·· ○◉●· + ● ●·○ ●○●◉○ ●●○○○○○ ·● ◉ + ●● ○◉◉ ●◉· ◉ + ○◉··●·● ●●● ◉●· + ●●○ ●●○○◉·○●·◉ ◉ ●◉●● + ·●●◉·○●●○●●●●●● + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_4.txt b/codex-rs/tui/frames/dots/frame_4.txt new file mode 100644 index 0000000000..b4496013b5 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_4.txt @@ -0,0 +1,17 @@ + + ○◉○◉●○○●○●●○ + ○◉ ●●·◉ ·○○◉●◉· ◉●●○ + ●●○···●● · ·○·○○●·◉○○○ + ◉◉·●· ◉●● ·●●○●○ + ◉·◉○·○·○◉○·● ○ ○·●○ + ◉··○· ●○··◉●○ ● ○○·● + ○·◉· ●●●○● ·● ● ◉· + ·◉○ ●·◉●○·· ··· + ○· ·○ ◉·◉ ○◉◉●·●●●○○○○●● ··● + ·○◉ · ●◉◉◉●○··○○·●◉○●◉◉○◉·◉◉ · + ··◉●○●○○●○◉ ●●●●●●●●○◉···· + ●·○ ·○· ●○◉◉●●● + ○○●◉○ ●○ ○◉○●●◉·◉ + ···○○●●○◉◉○◉●●○●●○·●· + ●○○·◉·○○○○○◉◉●· + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_5.txt b/codex-rs/tui/frames/dots/frame_5.txt new file mode 100644 index 0000000000..0905c495b2 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_5.txt @@ -0,0 +1,17 @@ + + ○◉○◉◉●○○○●●○ + ○● ●◉●◉··●·○●◉○· ●● + ●○◉○●·● · ○○·●○ ●●● + ●·◉·◉·◉○● ◉○····○ + ●○◉●◉○○●·○○● · ○·○·○ + ····◉ ○○·○◉◉·○ ●◉·· + ·◉· ● ·○○·○ ·● ●●·●·● + ·◉·○ ●○○·◉○· ●·○· + ·●·○● ◉○· ●·●○○·●·○○○●●○ ·◉· + ○○·○●●◉●● · ◉◉○○○●○◉●◉·◉●·· + ○●··●·●○○◉●· ●● ●·◉·○◉ + ○○●◉○○ · ◉○◉●●○ + ○◉●○·○●○ ○○●●●●◉● + ○·●·●●●○◉·○○●●○●○·◉● + ○◉●○● ○○○◉○●●●· + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_6.txt b/codex-rs/tui/frames/dots/frame_6.txt new file mode 100644 index 0000000000..3f96b66761 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_6.txt @@ -0,0 +1,17 @@ + + ○◉○◉◉●○○●●○○ + ●○◉◉●·○●●·●●◉○●●●○ + ●●●···● · ·◉○●●●◉○○ + ◉●·●·●○○● ○●····● + ●○···●○○●●○ ◉○○·○● + ◉◉◉·◉·○●◉·○○·● ◉○○◉· + ○ ●·· ○○·◉○○ ○●·○· + · ··· ○·○·◉·· ·●○·· + ○◉·◉· ◉●··●◉◉●○·●·○○●●○◉○◉· + ··○●◉○○○◉● ·◉○●●··●◉○○○·●·○ + ◉ · ◉···◉◉ ● ●● ·○○◉· + ● ◉ ◉●· ●◉○◉◉·· + ◉·○○●●● ○●○○◉●●● + · ·●● ● ◉·○○●●●● ◉◉● + ○◉◉●●●○○○·○●●● + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_7.txt b/codex-rs/tui/frames/dots/frame_7.txt new file mode 100644 index 0000000000..aa52e1b869 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_7.txt @@ -0,0 +1,17 @@ + + ○◉·◉●●○○●●○ + ●●·●○·●●●○○○◉ ·●● + ● ●···●· ·○·· ●◉○●● + ○○····◉● ○·○●·◉● + ·●·●··○·◉○● ◉ ●··○ + · ◉·· ·●○◉·○ ●◉··· + ·○ · ○○·○·○· ●●○·· + ○ ◉·· ○●◉·●·· ● ··· + ◉ ·● ● ○◉·○◉··◉◉○··○◉●○·· + ·●●··○◉··◉●·◉○··○○●○●◉○·○· + ○ ○○◉●·●○◉ ●●●●●● ○◉·· + ●○ ◉○◉○· ● ◉◉◉◉● + ●◉●●○○○○ ●○·●●◉●● + ○○●○·●○◉·○○○●●·●●◉ + ·● ·◉·○○●○◉●● + \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_8.txt b/codex-rs/tui/frames/dots/frame_8.txt new file mode 100644 index 0000000000..5791ce70e4 --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_8.txt @@ -0,0 +1,17 @@ + + ○○●○◉●●○●●○ + ● ●◉···●○○ · ● + ○·○●·◉◉● ● ·◉·●○●○● + ○●○●◉·●●· ● ○○··○ + ● ◉·◉●○·◉○ ◉●○··● + ·●●·○○○○○·○● ○●··· + ·●··· ●○◉○··· ·○·◉·● + ○●··◉ ·●○◉·●●◉ ◉·◉·· + ○ ○··○○ ◉●○··◉●●●●●○··· + ○●◉○○· ●·●··◉·○○○··○● + ◉◉○○·○···◉●○●○● ○● ◉○· + ●● ·○··· ◉●◉◉◉● + ●○○●○○○○ ○◉○○·●◉● + ◉◉●·●● ◉◉●●◉◉○●·· + ··○●●○·○●●◉○· + ·· \ No newline at end of file diff --git a/codex-rs/tui/frames/dots/frame_9.txt b/codex-rs/tui/frames/dots/frame_9.txt new file mode 100644 index 0000000000..35588ee1ee --- /dev/null +++ b/codex-rs/tui/frames/dots/frame_9.txt @@ -0,0 +1,17 @@ + + ◉○○●◉●●○● + ◉●○◉··● ○ ○◉○○ + ◉ ●··◉●○○○◉ ○○·● + ··◉◉○○ ○○●·○○·●● + ◉● ◉○● ·●● ●◉●●◉●·· + · ··· ○·○◉○○ ·●·●··· + · ·●○·●●·○○● ◉●◉ ··· + · ·◉○●○···○◉○○○· ·· + ●· ◉· ····●··●··· + ·○···○●·○·○····○○··· + ·○◉○○·◉ ●●●●·· ◉○· + ○···○●· ●◉ ○◉·· + ○●○·○○ ◉◉○◉·◉● + ○◉ ○○·●◉●○◉◉●·· + ●◉○ ●○○·◉●◉ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_000.txt b/codex-rs/tui/frames/hash/frame_000.txt deleted file mode 100644 index 57f25436e2..0000000000 --- a/codex-rs/tui/frames/hash/frame_000.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ----*##########-- - #-*.A*█#*----A..--█*-**#- - -A.**█*-#-.#*..**#.█***##- █#- - #*.A#*-##A** -..█*#*- *# - -*.A#*-AA #█*.#-*# - #..AA█A. #*#..-** - AA.A█ .* .█**** -**.#-. - #A..*█.- **-█.A.. -**-.#-. - **..*.* .*****-A. *#*.-*# - .*█.--.. **.*-A..-. ..-.. . - A.*. *. #-AA *.A █...A. - █ ** A. █-A..█ ** *.... - .-.. A #.AA█ A.- -**#*########## .AA. . - *.* .# -A..*█ A*- A..*-******███ .**.*. - *..*A .* *.A- -.- █.█------ . ..█.- - **..--.# *##** #A-AA█AA - ***. **- ****A-AA - *...# *.*- -.-#.*-.█ - █#**.# *#*# A-#*.*#*-** - █.*..# -*#***.#--#####**.#.#*█-#*- - *█**#*#..**.A█***..*#*█ -#*█ - **#*.#..*------##***- - --██*████- - - diff --git a/codex-rs/tui/frames/hash/frame_004.txt b/codex-rs/tui/frames/hash/frame_004.txt deleted file mode 100644 index 2e9dc0222e..0000000000 --- a/codex-rs/tui/frames/hash/frame_004.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ----*##########-- - #-A.A*█#*█-#-... ██*-█*#- - -A..*.*-*-.#*..**..█***#*- █#- - #.*A#*-#.A*█ #█***- *# - -*.A#█-*A* █#█*.#-*# - #..AA-A. *A..-** - A..*█ .* **█-*** ***.#█. - #A..*-.- **---A*- A*█..-. - **..A.* -...**** -█#*..*# - .*█.- . #-.**-A.█ .-.. . - *.A.█-. #-A.█ A#. *...█. - █ *A *.# -A..█ -**- .. . - .-..██** *.AAA *A-- -**#*##*####### # A. . - *.# .- A..*██A* * .-**█***█████* .**.-. - *█.*-█.# *.A█ -.█ .#**##-...***## AAA.-.- - ***.#-.- *##* - #A-A.█AA - #**.-█*#- -***A█AA - *-..#.*A*- -A*#.*-.█ - █#*..- *#*# --#*.*#.-** - █.*..# █*#**..#--#####*..*.#*█-#*- - -█**#*-A..*#.█***.#*#*██-#*█ - █*#..##**------##***- - --██*████- - - diff --git a/codex-rs/tui/frames/hash/frame_008.txt b/codex-rs/tui/frames/hash/frame_008.txt deleted file mode 100644 index b8eec636f9..0000000000 --- a/codex-rs/tui/frames/hash/frame_008.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ----*##########-- - --A.**█.*--#-... -█*.█*#- - -A..*#*-.*##*.***..█***#*- █*# - #..*.█--#.*█A #█***- *# - #*.AA-#.* █#-*.#█*# - A..#█-.* ##-# █--..-** - A.A###.█ *-█#**A **.#-* - A.A. #. *.██*█#* *-.*-. - ...* ..- █..*.#*- █**.#.. - ..-. ..█ *- .*.*█# -.. . - ..-. .█ █#..* A.. ...-. - #.A* *# -*..- -.- - .....- - **.. .. AAA*- .A A-#*#*##*####### -*.. . - █.-. █A. -..A-A-.█ .-..*******█████ .-*.-. - .-.* **- -█*A. #* *-*.##....****# #*..-A█ - -..* **- -###█ A█AA*#A - A..* *..- -A**A█#* - .*..- **#- -A.##*-.* - - **#- *.*##-A. --#*.*#.-** - █.*.*A **.**..#--#####**.#.#*█--*- - -..*#--..**#A..*...***██-.#█ - █-#...#*-------##***- - --███████- - - diff --git a/codex-rs/tui/frames/hash/frame_012.txt b/codex-rs/tui/frames/hash/frame_012.txt deleted file mode 100644 index f78229c6a1..0000000000 --- a/codex-rs/tui/frames/hash/frame_012.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ---*#######*##- - -#A.**#*█--##- *.-█*.**#- - -#.A.*-#-*#*..***##******#-*█*# - #A#.*-*.*.*█A #.*#-# █#- - -.A.█***#█.. *.*.- █* - A..-█.A* ###- .#. **- - A..A-..- **-#*#*A █**.--*# - A..A-.*A -**.---*- *A.#-*- - ..*-..█- -#*..**█*- *█. *. - ..* #.█ ***...#*- █..A A# - *.. .. *A*-- *. ... .. - ... ..█ #..* -*A- ...... - #*. ..# A-A.A█.#A█ ##***########## ... .. - .- .A ..A*-#.* - ..A***█****█████-. *.*. . - ... *A. *.. #A--█ -***####A....****--A..-A█ - ..* *A* *##* -AAAA*. - -.* █#*# A.*A█A. - *..# *#*#- -#.AA█-A* - █...- *#**#-- -**.*A.A*A- - -█..- *#.*..##-*######*....*---*- - **#-.- █***......##**- -#*█ - █*█*##*--------#**#*- - -██*████- - - diff --git a/codex-rs/tui/frames/hash/frame_016.txt b/codex-rs/tui/frames/hash/frame_016.txt deleted file mode 100644 index 012bf5961b..0000000000 --- a/codex-rs/tui/frames/hash/frame_016.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ---###########- - #-A*.**█--A.-##-█*.█*##- - .*A*█--*##*..#**##...A*--█#**# - -A#*-#*#*#*█. -*#.*#-.-**- - A#*A..*#* █*...**** - -..A*.* ### *..#█### - -...A.A█ ..█*-.# *.* *** - ...A. #.*A█#**- *.. *.* - .AA..A *..*.*-**- *.* #.# - .AA.. **...*█*-. █.. ..* - .-. .█. *.. A**.█ .. A- - .-- .█A **A.█.#██ █.█ A- - .A ... -A#*A..* ####**#####*### █.*-.. - #...A*# #.█A**#A. *A***███A████**#. -..#A. - █*# .*.- *#-A-** .*######..A....* A*█-*. - **# ***- *##*- -.*.A█*█ - **# *█.# #.#.*A.█ - █.*-█**.#- -#..*##.* - *.*-█*#..#--. -*A..*.-AA - *..#-█*...*.##**######*...** -#* - -**--- -**##......***█ -##A█ - █.**.*#--------#**#*█ - -██**███- - - diff --git a/codex-rs/tui/frames/hash/frame_020.txt b/codex-rs/tui/frames/hash/frame_020.txt deleted file mode 100644 index c6f8405af9..0000000000 --- a/codex-rs/tui/frames/hash/frame_020.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ----#*#######--- - #-A.**█--**.#*-***#**#*.- - #**.█#-***.*##**##A*.##-█.**A. - ##---*A*#** .*.*-█#*#*- - #* -#**-█-█ █*.*█*-** - A- -.*A- ## **█#*A# - A #.-. A█*█. -** .*** - A- #.#█. .AA*#**- ** .*.# - -*#-.-A █.*.#*█.* .# *.* - . -... *.***#**- █. .*.. - ..█..- -*-.* *..█ ..-.A - .A█..*. #█A *A*A- .*█.. - *.█...- A.A-*.-A -*####********#- .*-.- - █#**.A*. -***A** #******███****.A *.A.. - .**.*█. *█A#A- .######..*..#.A -**.*# - .* .*A* -- -*AAAA - .*#*█#*-. #A-.*-A - - *.#█#*#*- -#*A..-A# - █.*-█**.*##-. -#A*-..*#██ - █*.# *#....*##########..*#*-**#█ - **#-- █**#####.AA**█- -#**-- - █**..##-------#####* - -██**██-- - - diff --git a/codex-rs/tui/frames/hash/frame_024.txt b/codex-rs/tui/frames/hash/frame_024.txt deleted file mode 100644 index d4de240b46..0000000000 --- a/codex-rs/tui/frames/hash/frame_024.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -#-#*#####*--- - -.*.█- █ █*█-█*.**##*#- - -A█ -##*█*##**##**#-.█.█*#*# - A* #**-#**# *.**#*█#**.* - #* -A*█#- **#* ***-* - A *A-# *#-# *##***#. - . AA#- **-. **#█.**. - . .AA- ..█**# ..█.*A. - #- #. * -**-* **#*#.** - .A...A .A* █** █*. .-██ - .A..-# *. #** AA...* - .-.*-. █-* -*█ *..... - .A*A.# .A-██AA -*###***#*#**#- -█ .... - .#.*-. -.██-.* .*--**********.A* ..█.A.A - .A█#*-- *-#*- █###-##---###.. -.A#*█ █ - .-*#*█# A.*█A . - █.-*#*█* -█*-*█ # - .- *█#*#- AA##-.-A - *.-█.-***#-- -#*-#█*█-#- - *.--█-.*#..*##*---###**##A*A#*#█ - █*.#- █****.***.##*.**#*-.█- - -**#***------###.**██ - -██**██--- - - diff --git a/codex-rs/tui/frames/hash/frame_028.txt b/codex-rs/tui/frames/hash/frame_028.txt deleted file mode 100644 index f35141840a..0000000000 --- a/codex-rs/tui/frames/hash/frame_028.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -#-.*#####*--- - #***- -**.#-.. - -**- -##*█..#***#*#- --*#-*# - -A█ -#*█#A .*# ***-*# - #██-A* #- *.# A*-*-* - .AAAA - #* *.#--*.#* - .█A.*A - █#**█ **█**.A* - A..A* - #*█*#* *#.-#*A. - .-*..A **-*- #█ . ..* - .█**. #**█#*█ -. █-. # - .*..-.█ . - A**- *█*█..A█ - . ...A ..██*█ * █.█.... - .. █..- *## #█.-#*###***##*#* #██*... - . .. . -*.A A- *AAA#--*AAA#-.# .#..A # - .-*A*█ **- ****.-------#█ *A-.* A - .**█-* -.█. # A - █.-*..** #.AA-█ #- - .#-**# -A*-A-A A- - *.-**..* - --#*..* █-* - *.*█.*..*.**#*-####...*-#A-.-A- - *.##....******.**█#--A.-.* - █*.##..*....*#*..█*█ - -██**██- - - - diff --git a/codex-rs/tui/frames/hash/frame_032.txt b/codex-rs/tui/frames/hash/frame_032.txt deleted file mode 100644 index 8b7af6fb69..0000000000 --- a/codex-rs/tui/frames/hash/frame_032.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -##*#**###**-. - -.A*█ █*.*-*#- - -**.-##*█*.#****## -***██# - -.**.**-#*.A .*# *** █# - #*-.*█ A* .# .*# *- - A*#.#.- - A.* *-#-.# - A*A.*.*- .*A* █A-█* .█.- - -.*A* A .**#* * # *** - .#*. █ *#**-*- *█-#.-*. - . .. . .*A█#*. -#*#.█-A - **..*█ -*.A█AA*. ...A█.. - A*..* █#A*█A.█ A ....* - ....█. -.--.- -##*.*#****# .#.*.. - .#A. * **-.A .-**#**-A**-A *█*..... - *..#. ####*-.*.-.# A... █ A - .A*A-█. -- **.AA█ A - .-*..A* A*-A.A #- - ..***-* -.█#A A.#- - **-***#*. #.*-A*#--A - *..##***.#*.*#####..*--A-- #█ - *....#.█*******█-.-#*--A- - -**.*------##***█.*█ - -███*██- - - - diff --git a/codex-rs/tui/frames/hash/frame_036.txt b/codex-rs/tui/frames/hash/frame_036.txt deleted file mode 100644 index 3e6573e648..0000000000 --- a/codex-rs/tui/frames/hash/frame_036.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -####*###*--. - --#*█-*.. ██*█*.##.*# - #.***#***█#***.# █.** █*- - -.*.A*--#█ *# #.--█* - #A#.*█ .- **## *- - #A#AA - * █*.*.*- - .#AA A-*-* * ***#-* - .-.. -*█A*-█# A-* #-*. - ..*- #█#A-** . *-█**A- - . .█ .█..#A*-*. * ..##.. - . *█ --*█#A**. . ... .. - .**- █.A A*█ . *...█. - .AA* . #*..█ .-######*#* *...-... - ..A.-# * A█ .*********** A .*-... - .*A. . *#####.*--.* .█.█...-- - █.*█. . ----- -A A#A . - *...* * #.-. A - *..**-** #* A█ #- - *..#.*-* -.*##-.█ A - *..#*A#.**#*-###..--**.- #█ - *#-█****.*.***-A-***-#* - █##*----*-***#*-.*- - ████-- █- - - diff --git a/codex-rs/tui/frames/hash/frame_040.txt b/codex-rs/tui/frames/hash/frame_040.txt deleted file mode 100644 index 98fdd527ec..0000000000 --- a/codex-rs/tui/frames/hash/frame_040.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -######*##--- - #**█-A**-**#..*#.*#- - #.█-#*#*█.**#*-██.#- -*- - A█A.█-**█ █*█* ** - .-*.- .█A.# -. - ..*. --#* #A*█ *. - **A. █**-.* █A█-**#* - ...- .** .- #█*#.. -- - -█.. *** *-* -.-..... - .... A.*#.**-# ██.*.A#* - A... *.*A*.-# .A...-.. - *A.. *-AA█ A - . ...... - .█.█ *A-A #--######## █-..-#.. - █AA# █A #*********.. . . ...* - ..A# -*###-.*-*.█ A*.█..... - .AA.#* - ----- . *#....█ - ..** *- .-.-A..A. - .**#-** -.-AA.█ . - ..#.*-* #*-█AA- -A - *-█#**#.*####-#*█##A*- #* - █#- █**....**-#*-*- #* - *#*-.#--##*A*-*#█ - -███-- - - - diff --git a/codex-rs/tui/frames/hash/frame_044.txt b/codex-rs/tui/frames/hash/frame_044.txt deleted file mode 100644 index 20b89c305c..0000000000 --- a/codex-rs/tui/frames/hash/frame_044.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -##*##-###--- - #A*-###*█#.*.* *#- - -..**#*█.*#*-***#A █# - #*A*A .#*- **# - #**A- **.*█ .# - A.█ --# *#*.* A# - .AA *.*# A-**█** - . . *.*A--# *# .. . - #*-. █.█A*-.- A-... . - ..* *-*.█.* .*A.A A - *.█ *..A*█. █...█... - A.█- A#A.. ....-... - ..A. -. A. --########█.....#.. - *.. . A.. *********#.. *.#... - .A#--#A A*#**.*#.A-#-..... A - ..#** -. -----█* .#.. █. - .A*-A# A*.█ ..*- - *A.*-** #*A# A A* - *A.-#█*# A*A#*A AA - *-*.##-*##--#*-AA-- *█ - █*-█*#**.**--#*.- #* - -*#---#.A***--#*- - -███- █- - - diff --git a/codex-rs/tui/frames/hash/frame_048.txt b/codex-rs/tui/frames/hash/frame_048.txt deleted file mode 100644 index def219f3ce..0000000000 --- a/codex-rs/tui/frames/hash/frame_048.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - #-*.###*### - #*.*#-█**.**█**# - A#.█*█.*#-***- ** - A.A*# *.*- .-. - ..-- .**- █-. - -*█ -#- *#.AA#** - .A...##█ A ** **- - * . █A* * .*█** . - ...- #...*# . .**... - ..* *.AA* █ ##*.#A*# - ... .**... .A..█A.. - ...- * *██ .*...... - ..A* .A --##### .*...... - ..█.A-# ******.* .█...... - A..*.- ##*.*#A█ .█... *- - .A█*. -█... ...-. - ***. . -█A*....-A - ..A#-*- .A# A..#. - █#..*█*-. -.#.#.█ A#- - █#*-#-**#-#A-# AA .- - █*-*#*.A*-**#*- -A - █#----#***- -A- - -█*----█- - - diff --git a/codex-rs/tui/frames/hash/frame_052.txt b/codex-rs/tui/frames/hash/frame_052.txt deleted file mode 100644 index eae803aa8f..0000000000 --- a/codex-rs/tui/frames/hash/frame_052.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -.*###*-##- - A█##█**A* █-.# - .AA#█***#*#-█ ** - *.A█A █.AA ** - ..- A *.** *█- - ..*---- .*.██ .. - *█..-#*█ * █. █.A# - .. ...*. # .. -.* - AA. AA-.* ...A █. - ..█ ...*- .A#..*. - ..A *.A.* .A.*A- .A# - ..A .*A-██ -A-...A .. - .A .. ---####*-....... - .█ ** *****-..█-.....- - ..A . ***-.*..* .. . - A.. -A -█... .. █. - ..█. -*A█ .. -. - ...* ..#--..█# - ..** #.**.... A - *.**-**-*A-.* AA. - *-#.█A-A-.█ AA - *#--#█-A█.-.█ - █*█-███ - - diff --git a/codex-rs/tui/frames/hash/frame_056.txt b/codex-rs/tui/frames/hash/frame_056.txt deleted file mode 100644 index 40bbbaefa7..0000000000 --- a/codex-rs/tui/frames/hash/frame_056.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - #*####-##- - A#-**A.A██.# - *.A***█.- █.# - #.*A.*.## █#█* - .*. --A*** █A* - .-#-█# ..*.█ *. - ...# . *.. -A..* - *A*A ..# -. . - █.█.#█ -.█-..A - *A**-*. ..*..#A. - .A.**#. ..A██.A. - .A*A*█. ..█- ... - *A*.---# ..A..█.. - **.█**.* ..A .. . - █*. A .......*. - ..*-## - A.... A. - ... .. * -.... . - -.█ - *... #A--- - .█- . . ***- .. - *.-**A*A#. ..-█ - **-██A** █A - #--A-* ** - █*-████ - - diff --git a/codex-rs/tui/frames/hash/frame_060.txt b/codex-rs/tui/frames/hash/frame_060.txt deleted file mode 100644 index 3bea67cf19..0000000000 --- a/codex-rs/tui/frames/hash/frame_060.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - *###.*## - - *.A *█#* - A...A-█--* - AAA.*. █... - ...A.*# █.. - ..-.AA.*. *. - ...*..A. .. - ..██....-██ # - ..A..*A-...-. - ..... ... *-. - ..*#█ .██.█.. - ..--. . █.A.. - ..--.--.....* - ......... .* - ..-.█. ... .A - ..*........█. - .*AAA. . . - ..A..█*..█ - A...*.#*-.* - .**.*█ .*.. - * . *- #--* - **. *█-*.. - █*█-██- - - diff --git a/codex-rs/tui/frames/hash/frame_064.txt b/codex-rs/tui/frames/hash/frame_064.txt deleted file mode 100644 index 747ee7ae13..0000000000 --- a/codex-rs/tui/frames/hash/frame_064.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ######## - .*.█ ██*. - .-.█ .-A* - ...*--█.A - .AA.#█*.. - *█A --A-. - *A█.A**█. - -.-. ..*- - *.*-# .. - ...---..- - ...█#*█... - ....-A*A. - ......-..- - ......*-.- - .......... - ..A.....█. - ........-. - ........A. - ..*.*A#.-. - *.*..-█.*- - *.█. . . - - *A██ A*A - █*██*█- - - diff --git a/codex-rs/tui/frames/hash/frame_068.txt b/codex-rs/tui/frames/hash/frame_068.txt deleted file mode 100644 index 82206e2200..0000000000 --- a/codex-rs/tui/frames/hash/frame_068.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ###.###*# - *A█*A.* █ - .#-██-*.** - █.# # .*.-. - ... -*... . - █*.-.A*.* . - *..-..... . - A.....*... . - ......*..* . - .-....█A.* . - ..██.-.A.#A. - .#█.-███..A. - -. ... ...*. - - ...#...█. - -....█.*... - **... A-... - .A...-...A. - ..*A█..*A*. - .*.-##.#.-. - █*██ .██.-* - ..# ...... - .A- .#--- - -██████- - - diff --git a/codex-rs/tui/frames/hash/frame_072.txt b/codex-rs/tui/frames/hash/frame_072.txt deleted file mode 100644 index b95211b3ff..0000000000 --- a/codex-rs/tui/frames/hash/frame_072.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ##.*#*#.# - A--.A.*A-.* - ..█ - A.-**** - #*- █....#█ A - ..A..*.█.██*.*# - .█.#....... *. - *..██*█.#. -..A - .....-...*█. -. - ........█... #A. - ....*A..A -*.... - ..█ *.A.A.#.AA.. - ..*.A--█*-**█**. - .....*█.AA*#**.. - ..... .*.....█.. - .. * ..█.█**.#.. - .█*█.█...**A*-. - .# █.█.* ...A* - ... *#*-#*.A.. - █.A*A# *..A..#. - ..# █ █*A-.█. - #* - *█.**AA - █A.. *-*-A - ███-███- - - diff --git a/codex-rs/tui/frames/hash/frame_076.txt b/codex-rs/tui/frames/hash/frame_076.txt deleted file mode 100644 index 831da0fd1b..0000000000 --- a/codex-rs/tui/frames/hash/frame_076.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -#***###.-- - *-A..-***-.** - ..A.█*A.*.█*#** - .A-.AA*.*A█*███.# - ##*.-█AA.. -█*A - .**AA -#A#- *.# - *.A*-#█..** -.. - ..*-A.. ...** A. - ..*#..--*--.. #*.. - *..... -.*# ..-. - .....A A.-.#.. .A*. - ...... *A- .*. █.*. - ..... A..***#*... - ..... A.*-#..-A.█ .. - ..... **..--*█A.#A.. - .... **..**--#.*.A. - .... *.A .█.*# - *..... █. AA**.█ - .*█*#..*A# #. .#* - █#*. ..**.A**.**█ - █.#. --█##*AA*A - █*#* █#-*--*█ - █--█-*█- - - diff --git a/codex-rs/tui/frames/hash/frame_080.txt b/codex-rs/tui/frames/hash/frame_080.txt deleted file mode 100644 index 0583704823..0000000000 --- a/codex-rs/tui/frames/hash/frame_080.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - #**.-#**.-- - A** *█..*-#A.*# - .-█A#A#. #*█*#*#* - A█.. AA.#A--█- ██** - .█A..##.** .-.# - AA.#AA-*█ - *A - ..A**.#.# -*- -A.# - *.. ..*█*. **.* █.A - .*.██.-..- .*-#. .. - *...█.... *..* .A. - .....--.. AA A A*A. - ....█.-.. .-.- █... - .A..-█... A-█.* * .-... - ..... A.█ .*.█-. * --.*. - ..... *. *- A -.A A█..* - ..... *. .*A -...*. - .....█.. A...- - **..-A█.*- A** - *.# -.****- -.*- - **- **-***##*--.#*A - █.- ** **#A*-* - **- █#-*#--**- - -█----██- - - diff --git a/codex-rs/tui/frames/hash/frame_084.txt b/codex-rs/tui/frames/hash/frame_084.txt deleted file mode 100644 index 64ffbd99db..0000000000 --- a/codex-rs/tui/frames/hash/frame_084.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -#**-#*##### - -.* *█..*█-*.-**- - -.*--A AA-#**█*#█*.* - #A█# -*#*#*A -- *█*. - #A█# .A#..* █.. - .A-#A██A*# - █*# - ...A*.#..█ *-* A.* - .. A.--.# .#*-- █A.# - .*.A█..#█ *A-.* █.* - .....█*.. -*A# ... - .A..█*.*. # *.#- ..* - .█--█--.. .**#-. -.A - .█ -#.A.. *A-*-#**#**- --.A - .. --█.... AAA-A #.*█- .... - .█ *█..-. -A . -.*. **A█. - . ██*.* .A *..- - -* █*.-.#. #.#.#. - *.* █-█* * .A-**- - .. *█.* .- A█ █.*A - ** -█A.*-*---#*-A*.█A - *.- -*-*. █*##**█#█ - *#- █#-**----A* - -█----██- - - diff --git a/codex-rs/tui/frames/hash/frame_088.txt b/codex-rs/tui/frames/hash/frame_088.txt deleted file mode 100644 index 6c1e74021c..0000000000 --- a/codex-rs/tui/frames/hash/frame_088.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - .#*.-*#**###- - #A- #*A.A*--***█*# - -A-. #*#*-#**..*.█.**# - A. █.AAAA**. █.#-█-.* - A-█-A*A█* *.--.* - A.AA#AA*- - ** █.. - -.*-█. #A .** * *.## - ..-AA██. .#*# - ██.. - ███ .-- *A-*.*- █*.A - .....**. A*A*█ █.... - .......A * -A.-. █...A - .-█..... A*.A--#█ ...* - .. ..... ..-*A.# #***- *..█ - █.█ *A. .AAA#AA **██.A ..... - . . ..- -..# ***#. .#* - *AA .█.█ *#- ..AA - .# *.-*#*# -*AA.*- - *A*█#█.#*# **.A**A - .**-#*.#** -A-#.#.A - .* **** *##--**-...*** - █.--█-█*. █**##**█-A- - █## -##*#*----#*- - ██--█*██- - - diff --git a/codex-rs/tui/frames/hash/frame_092.txt b/codex-rs/tui/frames/hash/frame_092.txt deleted file mode 100644 index 67ff7a9d1b..0000000000 --- a/codex-rs/tui/frames/hash/frame_092.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -##**-####*.#- - -#. #█.*█*█-*..*█**# - -A█-.#*█*█-#**..█*#*A-*# - A*#A**- *#* -.-**.#* - .-A #█-* .. *** - ..--*█# #-* █*.. - A*█*.A-# A.**█ -A*. - -.A#..*. .A#** █.A- - .-.. .-█ .##**-* ... - ... #.. .#A** A.. - *....-. .**-██ ..A - *..-... AAAA█A .*█ - ....... A-AAA.A- **###*.* -█.* - ....**A *AAAA.█ ***█*.█- #..- - *...*..#* ##. * *.****.# .**.. - *-...AA . **#- - █ .. - *#-*#**█. #* .**A - *.-**#** . .-A#.A - █.-*-*.*-*# -**█-AA*A - *- █#..#-*#----#**#.*#*#* - █*-*-.-#- -**###***--* - *#--##*.#-----##█ - -█ --█*██- - - diff --git a/codex-rs/tui/frames/hash/frame_096.txt b/codex-rs/tui/frames/hash/frame_096.txt deleted file mode 100644 index 69c457e197..0000000000 --- a/codex-rs/tui/frames/hash/frame_096.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - --#.######.-- - -#█-#..*█.█-*#.█.█**#- - -A*AA#*█ --A***..█*#**#**- - A█ ##.- -#█***** - . A.AA # .*#* - .AAA.A█ ##-█ *** - ***A.#A AA█*- ***. - *A#*.*# ..A█. -█.A# - *-██*. .#... * ... - -...-.* ****.-█ ..A - .█.█A.. # *#...- ..... - ..-█... .A*-A A-█ .-.... - *...... .A## A█ *####*** -█.*A- - #....## .##*-*█A .-*██.*█ . *.A - . ..... #AA #- *.#***# .█AA.# - *.*█### .-#█ **█...- - ***. .A- █**█.#*A - *.**.*.-*. -A█*##.A - ***-#.** *#. -#█ .**AA - *- -*.*-█*#*----##**-#.A█.- - *- -**.-#-***###***█-#█ - █##--.-.#------*#*- - -█---█*██- - - diff --git a/codex-rs/tui/frames/hash/frame_1.txt b/codex-rs/tui/frames/hash/frame_1.txt new file mode 100644 index 0000000000..45adbbac24 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_1.txt @@ -0,0 +1,17 @@ + + -.-A*##**##- + -*#A**#A#**..*- -█#- + #.*.#**█-- -█*-█.*...# + **-**█##- A*.*.# + *-*A█-.*-** █..**# + .* #- .*A*..# █.*..# + #-█-* █*.*A█.- .A. + ..-.- #AA.*.* █-. + .*.█- *..-*.█..######-## *█ . + -.** -*#- A* .█.---.A###.A#A#. + *--█- -*#.A- --*██* -*█A#*-A + *-# █# - #█A*-. + -*#-*#- -*-#.-#█ + -*#*- *#A****.**#-#.* + -*█*...---#-*#*█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_10.txt b/codex-rs/tui/frames/hash/frame_10.txt new file mode 100644 index 0000000000..0e9a76d4d8 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_10.txt @@ -0,0 +1,17 @@ + + -#****##- + *█-#*#*.A-*# + --#..A..-.#*## + .--A*.*-.*#██**# + A *..█.- █#A-A.A + .- █.*.AA* --█. + * .*█*....* .A# + █ ..*#A#..---.*.. + █ .* **.*..#*#*.. + . #.*#.-A-*---.*- + # █.....██ *#█*.- + *-█#*#*█ -.██#AA + .█ ....*#A#A.A- + *-**A.#*- AA█ + *# -**-#** + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_100.txt b/codex-rs/tui/frames/hash/frame_100.txt deleted file mode 100644 index cc68e0119b..0000000000 --- a/codex-rs/tui/frames/hash/frame_100.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - .--#*#######-- - ##-#*A**-A*█-█.-.█**#- - -#--A#*AAA-##***..**#**.█*# - A█ AA*AA .#*-*.*# - -.#-#***- - *█A* - -.-.AA# #*- .*#. - .A*AA*A A.█.- .**#. - AAA..A- #.-*.-- --#.* - . A#*. **#-** * ... - .-..█.. *.*█**A█ .#.# - . █..** █. -A* -# ..-. - .-█*-*. A***A -. ..█. - . -█..- .*-█A--A *****##***-- *.A.. - █- ... .-##*.#A ..A*█*.*---. ..█- - .A█.*A-* .#A. -* █.#.***##* A.-** - █*...** . .*#█ ██ -AA#- - *....*. .- A█#*..A - **█*..*-*# ..-*--█AAA - █# *█..A█.- -**█-*#.#█ - *- **.#-█..*#--####*.-#*#.AA - *#-**.*- *.**##**#*██#*- - -*.-*█****-----###*█ - - -█**██- - - diff --git a/codex-rs/tui/frames/hash/frame_104.txt b/codex-rs/tui/frames/hash/frame_104.txt deleted file mode 100644 index ee4c28f421..0000000000 --- a/codex-rs/tui/frames/hash/frame_104.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -.-*#*#######-- - -#█#.A**- █**## - #*-A#*█ -#*#***..**#*#..*#- - #*AAA--█-#* *-*.#*█*- - A *#*#█#A *...**** - *█A#█A A **-* * .█A* - .*A.-A█. A*█*#* █* .AA* - .-**A#AA- **#-***- - *A-# - .*.*.*- *.* *.█. * ..*# - .█....█. # ..#..-. .A█# - █.*█.. . --A .* A. █ .. . - ..-A.. . -*#A*- A█ ....█. - *█ ...█. #*AA.█A.- *##*###**# *...#. - --█*A # A-#.A -. #A-*█*.*█-█ A#.*.- - * ....#. *#A.-- .*#..**### -.... - █.-***.█. #A -*.-- - *-*A*.#-.- -A-A█A*█ - **█..*# .# -**-#A..█ - █* **.*-█.#- -#█-A-#*A- - ** ****-█.*####-####*.-**#.##* - █#--**#-- █*.*****█#*.*.A█ - █. █*.*##------#-#*█ - - -██**██- - - diff --git a/codex-rs/tui/frames/hash/frame_108.txt b/codex-rs/tui/frames/hash/frame_108.txt deleted file mode 100644 index 78d78874f9..0000000000 --- a/codex-rs/tui/frames/hash/frame_108.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -.-**#########-- - #*.##**█ █##- - -A*#.**AA.-##*.....**##*-***# - -A*AA█*-#** -#█##..*# - A-*#*.-#. *.***A.- - ..A.#*█.. ##.* # .***# - .*A.#**. **A..* -*-*.**# - A*.**A█. *.*-**- *-█**.- - .....A. █.*-..# ██*#-. - ..*..A. .*.***** -.. ... - **.-.A. . ..#... A .A-# - █-.-.-. A*##*█#. A..* . - * ...# . -* AAAAAA ##**######*### .*..-- - █- ...-. ***AA█A█ #..-*█***█-█*█ █.... - .#-*.A .- #.A#A **##..**## .. A - .█.#A#**. #-AA.A.█ - █**.A.-█*- -**-AA.#- - █#█...# .# -*-A***A- - *--*.*#█.#- A*-.*.#** - █#-*.*#-█***###--#*##*.-**.*--A- - *#█*..--██*.█****██#*.--#* - *█A*#..#*------*##*█ - - ███**██- - - diff --git a/codex-rs/tui/frames/hash/frame_11.txt b/codex-rs/tui/frames/hash/frame_11.txt new file mode 100644 index 0000000000..b7e743b218 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_11.txt @@ -0,0 +1,17 @@ + + #****##- + A█ *...**# + A█--..***A*# + .--..**#-*AA + -█.**.#*█*-..# + .#-..#-**.-A.. + ** #......-.** + . ..A..*A .█. + A █.A..*A#.-. + ** -.A*#█A.-.- + █-- ....*A.**. + *--A.-*A***.- + - *.**--.*█ + *# *..#-A*- + *- █*#-#- + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_112.txt b/codex-rs/tui/frames/hash/frame_112.txt deleted file mode 100644 index 64854858e5..0000000000 --- a/codex-rs/tui/frames/hash/frame_112.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ---**#########-- - -.*#A.*█--██ █*#- - #*#.**#█#-##A***...**###- *#- - #█.#█#█**#*.- #█*#*#█*- - #*..*#█#. *#█*##** - AAA.-* A *###- ** █**█. - A*AA#*-.- -*-***- ** *. . - #A.***█. █.**A##A- ** *. . - .....█A- **-█**-█ *. ..█# - -..█.-.. -*.-█-█#█ . ..-. - .*█ . * █#-A- A .#*.A. - .-.-. - -*-*A A* █A.... - █- *.- . A.#.- -.- #***#**##*###- *█..-. - # ...█. -AAA#- ** -..***█***█-.*.#.-.*█. - *#█*#A█. ..█AA█ **-#.##**###*A-.*.A- - *█.A. █* A*-**-A - **..*--#- -A-A#A A - *A...-#-*- -#*#*A.#* - *#█..*#█*##-- -#*█.*A.-A- - *#-*.*#.*.**###--#*##*.-#*.#█-#█ - █#-..*- - █*.█A***██#*██-#*- - --.**#.###------*##**- - - ██**███- - - diff --git a/codex-rs/tui/frames/hash/frame_12.txt b/codex-rs/tui/frames/hash/frame_12.txt new file mode 100644 index 0000000000..0c6c85043f --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_12.txt @@ -0,0 +1,17 @@ + + #***#. + #*--A.#* + █ .A*## + A#...**█. + . █.....A. + .█..*-█-.█ + . .A*..* + . A#*..█ + *# .A..#.. + . A.***- + .. .█***A + # *. -#. + A **.#**. + █-A█#.*.- + * █.*.A + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_13.txt b/codex-rs/tui/frames/hash/frame_13.txt new file mode 100644 index 0000000000..097cd508d7 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_13.txt @@ -0,0 +1,17 @@ + + A***# + .--.. + .--.█ + .**.- + * .. + █A-.. + # .. + # █. + A# -.. + .█ #*. + █-.. .- + .---. + .##.- + *--.* + # .█* + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_14.txt b/codex-rs/tui/frames/hash/frame_14.txt new file mode 100644 index 0000000000..8eca909504 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_14.txt @@ -0,0 +1,17 @@ + + #**** + #A--.* + .-... . + ..A.█-.# + ...* . + .*.. █. + .... . * + ..*.- * + .... █ + █-AA *A + *.██#.#. + .*..---. + A █.***- + .*A*--A + -* █*A + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_15.txt b/codex-rs/tui/frames/hash/frame_15.txt new file mode 100644 index 0000000000..cbf646ab35 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_15.txt @@ -0,0 +1,17 @@ + + ##***.- + -#*..-A*# + AA.***.█*. + .A- AA#.--. + ..*█**..A█-. + *..-..AA. █ + .. ......#. + ..A..#... █-. + ..###*...-.A. + .-.*A.*.*. .. + .A....-. - * + .**.-..*- * + █.*# AAA- *- + .-..**.#*A + *-*----A + -- \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_16.txt b/codex-rs/tui/frames/hash/frame_16.txt new file mode 100644 index 0000000000..82698755af --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_16.txt @@ -0,0 +1,17 @@ + + -*#█**#.- + A-..*..*.** + .AA█*A**.. █* + AAA **-*.*..**. + ..*-A*█*..*A.-* + ...*.█ .** . ... + **. A-#....A*█# . + .A* .-..A...█* -. + **...#.A-..█*# A + *█--#****..-. #-. + ...#██A**.*█*...- + ..* .- -AA# A + *.* . A#A-#. + *..█-*.AA#-. + █A.-*A--** + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_17.txt b/codex-rs/tui/frames/hash/frame_17.txt new file mode 100644 index 0000000000..57d02179e7 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_17.txt @@ -0,0 +1,17 @@ + + #*###**.#- + -***...***.#█-# + #**A-**-##█...-█* + A.A-A.█-- █.**...** + .A- . .█A***AA # + -**#A- #AA. A#*A..A + * *A. #AA.- *█..A*. + -█*. AA..A.#..*** + #A*A***#.*-.*-A*... . + .█-*--.A**A..* *#█#* + ***A███*****-.*AA* *█ + *..-* -A..- * + -** **- #█#A--A + # .*#**#--**A.█ + -#*A-##.*-#* + - \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_18.txt b/codex-rs/tui/frames/hash/frame_18.txt new file mode 100644 index 0000000000..ef524a0ed9 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_18.txt @@ -0,0 +1,17 @@ + + -**#**#*.#- + -#█-*###.--#█#**- + -AA.*█**█#█.-█#AA* * + #..*.#-█* █*--A*.*****# + -*AA A. -█#-*A.A.-****- + A*. ##..---A#*#.█-A-A-A. + ..*AA #A*A.█-A█*.*.*# + █*-.. -*█..*- .*.█ + *██ #******#..#.*A*# .*.- + -**.*** ..A--*-...-*.-* # + .A.*-██*****- *--A.A*A--- + ** #*# --*█A*-█ + *-*#--. -*--A*#- + █..**##***-█*-A-#* + █..-A--#.#█*#█ + - \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_19.txt b/codex-rs/tui/frames/hash/frame_19.txt new file mode 100644 index 0000000000..80a9abf012 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_19.txt @@ -0,0 +1,17 @@ + + --**#.#**..- + -#...*A***-*-#.*## + #***A█.#*- -*A#-*** + A*.*#-- -**##-.*# + ..A-A- #.-█A█.* .*# + .*A*█ -.*.A .A █.*. + -*..█ A*-A.##- AAA#. + .... .*█*.█# . ... + .*.*#******....#***.* * █.. + -*A#.**A-*#*#-# -- A*-*#A..- + █*█A#.█████**█ -*-A.AA AA█ + **-*-* -AA-AA█ + █ -*..*# #**.A.*- + ██..*A.#--**A*█ **.█ + █..-A-█-#.-*-- + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_2.txt b/codex-rs/tui/frames/hash/frame_2.txt new file mode 100644 index 0000000000..843df90f28 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_2.txt @@ -0,0 +1,17 @@ + + -.-A*#***##- + -##A**#...*..*-█.*#- + #.*.***.*-- -█***A..*.# + -.A-A*█##- -#*.A.# + #-█A*-.*-**- -#.*.# + █A#█- .**#A*# **.*. + #.█*. -A.*.-.# A█.█. + .█ *- #.*..** .█A.. + *██*. *.---.█..#########.-..* + -*█. A..█ A* .**----..--.#A . + *** * **...█ -█*******█.#*.. + █*-.A# - ##*A#* + .*--.## #*-# -.█ + -.-*--█*#A****.**--..* + -*#*#..----.*A*█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_20.txt b/codex-rs/tui/frames/hash/frame_20.txt new file mode 100644 index 0000000000..b588df3894 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_20.txt @@ -0,0 +1,17 @@ + + --#*..*#*#-- + #**█*#-#***..--**## + ##█-#*█.*█ -█-█*#*.#- + -.█-*.* -##.*A*** + -. #.* -A -..-**..* + A-#.█ #*█*.█A █*..* + *.*#. #* .#*- #*.A + .--A- ██*A.█# ..█. + .A..*#********-#█*--*** A .* + █.-.-█ A------.* ***█.** #A .. + *#-*████████*█ *#*..#. A* + * -*A# -A*..A + *--*#.- #**-**█ + -#-.█.#-**#A█.█-#A*█ + -*#.- *----.*██ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_21.txt b/codex-rs/tui/frames/hash/frame_21.txt new file mode 100644 index 0000000000..0d1fc7ec26 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_21.txt @@ -0,0 +1,17 @@ + + --#*#**#*##-- + ##*----#.*.#*---*#- + **--#*-█- --.*#--*# + #*.*██ -#**#**# + A#A*- #.A-* **--# + A█A. #**-AA **-# + .█.- - A-#A█ ***█ + -* ** █.# . . + . . ##*****### -.#█.# *A . + . .* .- -#. -█-*.# A█.A + * █. --███ █- █*-#* A- # + █# A*- -*█ A + *- --- -.**█ #- + **- *█*#A..*A**██ -- + *##*#----#-*#*- + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_22.txt b/codex-rs/tui/frames/hash/frame_22.txt new file mode 100644 index 0000000000..8fbfdb5713 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_22.txt @@ -0,0 +1,17 @@ + + -##*#**#*##- + -#A*..-A.A*..*.#A*#- + #***.***- -█****#--## + **.**█ ##...-** + *..A█ #-A.*..A*█. + *.*A- #.A.*-A- *.**. + .#**A .#.**A█ ..A. + ..*.- .*..-* .-.█. + ..#█# #.******##-**.- *# -.*█ + -.* *-**# A#█.AA. ***-█.## A** + ***-. █████**█- -A*#-AAA█#- + ***-*# -*#█.#█ + ██#* ##- -.*#█*-A + █A*##█*.**#**A**███#* + █.█.-*----*-.**- + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_23.txt b/codex-rs/tui/frames/hash/frame_23.txt new file mode 100644 index 0000000000..ef2f8adb70 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_23.txt @@ -0,0 +1,17 @@ + + -##-*#*##*#-- + -*.#.*-#-**#.-.*.#- + #█#.█#**- █.A#.**..# + A*.**A- -***..** + AA.-A█ #A##█*A**.* + #*.█A- -***██A*█..*.# + -..█. AAA. -.- █ .█* + .A. . .█.#-*# . *A. + -█* .#.********.-*.-█*- . ... + .**-.█*█ A-* *.-*#. *-. + A█. . -███████ █-A**.-A-A- + #..-.. #A.*-A- + * .#█A-- -.█**A#A + ***#**#*.**-##█--#*- + █. ***.--#--**- + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_24.txt b/codex-rs/tui/frames/hash/frame_24.txt new file mode 100644 index 0000000000..09a7fd520c --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_24.txt @@ -0,0 +1,17 @@ + + -.-*##***#- + #█-A█.--.**##-█# + #██**A#█. .-A*.**# * + #█AA#A.*#*-.A- -**.*-█ + # AA*A# -██A*-.--*.#█ + .#*#*- *##A ..* A█* + . .. #A-#A█A-*.*-.- + . *.. .#*A*-..-A.-.. + .. .***A##...##-*#-. . .. + - A *.A##**##..-*#*. .*. + * █*.**██████- *#.**.*A#- + * *#** . █A*A + *.**-.. -*█-AA-* + .-*#*-█..A***.--A- + *A-*#**--**#* + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_25.txt b/codex-rs/tui/frames/hash/frame_25.txt new file mode 100644 index 0000000000..af8bb947f6 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_25.txt @@ -0,0 +1,17 @@ + + -#***####- + # *#*--**.*..# + A.AA##█..#***...- + .#*. A *. █*.#**A + #--*#A█-*A-.█ .AA*A* + *#...-*#.-.A A.#.AA.# + .A.*. .--A*-A.*A-█.*. + ...A..█ .-**A.*-.*..* + -#*.█.--****#..**.#*.* + A-█.A.#.-..**-.***A*. + *.*A*.-██████#A.*.A.- + .-█.*#**-#*A-A#AA.A + ---.-*-**A#-A-..A + *.***-**.** *.* + .#█**##-#.* + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_26.txt b/codex-rs/tui/frames/hash/frame_26.txt new file mode 100644 index 0000000000..7ff85c300a --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_26.txt @@ -0,0 +1,17 @@ + + -****█## + A*.*A*.#*.# + A*██.**.*██*# + **█#...-..-#A- + .-#*...█**A*.** + * █.AAA█*-*█**A + . *█*..A..**█# + A- *...--*..A.. + . .***#.#**A*.. + .-.A#.--#****. + .-█A.*█*#A-#*.. + *-..A* AA█..- + * *.* --A.A# + .█***█*-*** + *AA-*.-** + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_27.txt b/codex-rs/tui/frames/hash/frame_27.txt new file mode 100644 index 0000000000..06e988b076 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_27.txt @@ -0,0 +1,17 @@ + + ****## + .*AA.A* + *█- *.A█. + ...-..*.. + . -.--█* + .-.-█-...- + * █..-*.. + . -...*█.. + .. . .#.... + █* .█-.-*.. + .- --**#A█ + ..##..-A. + .**#*#A.- + *--.**AA + █*█ -*A + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_28.txt b/codex-rs/tui/frames/hash/frame_28.txt new file mode 100644 index 0000000000..0e25818145 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_28.txt @@ -0,0 +1,17 @@ + + A*** + .#-.- + * *.- + .--*. + . .. + . -█. + -.. -. + .-██. + A* -. + ...A.. + . -. + .*#*. + .**.. + *--A. + . .#. + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_29.txt b/codex-rs/tui/frames/hash/frame_29.txt new file mode 100644 index 0000000000..7f2ddab00a --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_29.txt @@ -0,0 +1,17 @@ + + #****# + #.*A ** + -#.. ██. + ....-*#A + * .█. . + .#... -- + .**... - + ..*.. + ...*. - + -.*.. - + *..A.- * + .A... -. + ....-.-. + .*.*A█.█ + ..* .# + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_3.txt b/codex-rs/tui/frames/hash/frame_3.txt new file mode 100644 index 0000000000..8cce426bb4 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_3.txt @@ -0,0 +1,17 @@ + + -.**##****#- + -##A*..#.█**.*--.*#- + #*A**.*██- -█. **#A-.# + A#A*.*##- -** ..* + █A*.A-A..**- *-*..- + A.**A .#.**** . **. + ** . █**.-█.# .*A.# + #-.#. #-.█A*. .-.*. + -██. *.*#..*-.*##---##-.-█*. + #*A*# .A*A**. .*.--# *.#**-.*.- + █-. . █..##█ █***███**#AAA#A + █*. *# - A-#-AA + *-AA**# ##*A█#.█ + *-##-**-****#A***--#█ + -*#*-A.----.*A-█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_30.txt b/codex-rs/tui/frames/hash/frame_30.txt new file mode 100644 index 0000000000..24a2165e45 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_30.txt @@ -0,0 +1,17 @@ + + -*█**## + -A*..**█** + ██-.#**.##* + ..*.A.-*.* *# + **..-*.#.# . + .*.-# *...... + *A...*- *A*. *- + █. █#*.#.█.- - + █.-█*.*.*A.# - + █..*.--.. ## - + *..**-*...#.. + .*AA#A**..█ . + *.*..A*..#.A + #-##*-A.#A█ + *-..---*█ + ---- \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_31.txt b/codex-rs/tui/frames/hash/frame_31.txt new file mode 100644 index 0000000000..65f139ab96 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_31.txt @@ -0,0 +1,17 @@ + + -.A*#*#*# + -#**##-█#*█*# + #.*AA#*--.█.-** + #.A#--**-#**.*..* + -....#-**-#█*.A-- + *.--.-.██***#.A.#█. + A.. .-*.*.*A**.*.A. + **# ..█.* .-██..*.. + .*#-.█-...A#...- . + █...AA..---*-.*.. * + -*-A#.# A***-A.█.- + ...***# -** . + *.**- # . .*-A- + A.*.A-.-#.█#.- + ██*.-#*A.** + ---- \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_32.txt b/codex-rs/tui/frames/hash/frame_32.txt new file mode 100644 index 0000000000..6cbec21aec --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_32.txt @@ -0,0 +1,17 @@ + + #####**.#- + **.**.*..**..# + A-**-##-A--*.**█*# + █AA.-#-*- - #-*.## # + AA.#.**█*.* █-#.*A***# + *A**#**.-A..#- .#A * + *.█*#-█*..##.#*-A-AA.█- + ...#- █-..█A█.*--█*.██- + *..-- █-.█--.###...*.█*- + ███--.**█*-----..*.*.-- + #**..A .*██***-*AAA.A + *#.-** #*.A█. + █**...#- -A-.A # + *-*█.#.***--#█-A + .**--##A*-██ + --- \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_33.txt b/codex-rs/tui/frames/hash/frame_33.txt new file mode 100644 index 0000000000..a661feb2af --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_33.txt @@ -0,0 +1,17 @@ + + -##*#*#*..- + -#*..***.A.-.*.*. + -A*.#*##*█- █*A..#█# + #*A.A-.#- *..*-* + -..A-..A*-* .#**- + AA# *-**-*# A*A-* + ..# *#*.-.* .*.. + *.## #██*A*# *█.* + ... . #- A*###***#..#A-.*. + -A.██AA#A-..-----..*---... + ***# .A.A A ████*** ..#A-- + *#**#█# AA*A*A + **█*#**# -#.#A**█ + *.█**#.#*#-█*#**.* + █**##----#**-█ + ---- \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_34.txt b/codex-rs/tui/frames/hash/frame_34.txt new file mode 100644 index 0000000000..3427025326 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_34.txt @@ -0,0 +1,17 @@ + + -#*####*.#- + -#*#A**.█.#*****#*- + -AA#.*█A.*- --**#█**# + #A-.*-A#- *.#*** + AA.*-A. .█ # ****- + #A*.-A **█.*** *#*.* + .*-.- █*-*.-- .*.- + *.*█A .*-.A█. A -* + #█A.█ A*AA█-**######.--█ .-- + ..*#A##-█AA█...-..---#A-..-.* + A-*# .*.*- █**----- #A#*.█ + A#****- A*..A█ + *#-.#**# -#*█-A#- + -*A.█.##*##****-#*A█ + █.***-----****- + --- \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_35.txt b/codex-rs/tui/frames/hash/frame_35.txt new file mode 100644 index 0000000000..e0919ec5d0 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_35.txt @@ -0,0 +1,17 @@ + + -##**###*##- + #***..**#█.*.A█.**- + -AA.*#*.-*█- -█***.█.*# + #AA#A#*#- *#-*.- + AA..AA* █**# .**.# + *A*A#- █.-█..*- .**. + * .A ** █*-. .-** + ...A A***A█ A █A + A #- #..A*█A.**-*-*#.. ..** + .#-*█ AA*█*#A.* *#----A█.A█ .█ + A-*#█A*-.A-- -█----*--*AA-#. + █.-*A. -A* #- + **--*#A# #*A-**█ + █--█.*.-A..#.*A*█-A*█ + █-.**--A--##*█- + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_36.txt b/codex-rs/tui/frames/hash/frame_36.txt new file mode 100644 index 0000000000..0355f68b47 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_36.txt @@ -0,0 +1,17 @@ + + --#*####*##- + -*██*#A*A#*#*##█**#- + #*█*##*-*█-- -█*.*#.#*.# + -.█*#---- █*.*█. + #A-**█.*-*#. -*.* + A #A- *- █.A# █*-* + . * - * █** .-.# + ..*. -* -AA *. . + .██. AA #*██###-#####- .*.. + -*.* #.--A.A -.-------.. *A█- + █ *.* #-#A- █**-----█ .#█A + █#█**. #A.█A + *A..#.# ###█A#- + *#-█***-*.-#.*█-█#*#█ + -*#A.-##-####**█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_4.txt b/codex-rs/tui/frames/hash/frame_4.txt new file mode 100644 index 0000000000..2b4b7c670b --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_4.txt @@ -0,0 +1,17 @@ + + -.**#**#*##- + --█#*.A .**A**.█A*#- + #**...#*█- --.*-*.A**- + AA.#.█.## █.***** + A.A-.*.**-.# *█*.** + A..-. █-..A** █ **.# + █*.*- █***#█.# # █*. + ..* #.A*-.. ... + -. .- *.A█-AA#.###----## ..* + .*A . #AAA#-.-**.#.-#AA-*.AA█. + -.*█*#**#*A █*******█--...- + #.*█.-- #-*A**█ + **#A- #- -.-#**.A + ...*-*******##**#*.*- + ***.A.-----*-*- + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_5.txt b/codex-rs/tui/frames/hash/frame_5.txt new file mode 100644 index 0000000000..c71575690b --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_5.txt @@ -0,0 +1,17 @@ + + -.***#***##- + -#█#A*A..#.*#*-.█## + *-A*#.*█- █-*.** #*# + #.A.A..*# --....- + #*A*A--#.-*# - *.*.- + ....A *-.**A.- #A.. + .A. # -*-.*█.# ██.#.# + .A.-█ #-*.A-. #.-. + .#.-* A-.█#.**-.#.---##-█... + -*.*##A#*█ .█ AA**-#*.#A.A*.- + *#..#.#**A#- █**█████#.*.*A + **#A** - A-A*#- + -A**.*#- -*##*█** + -.*.#*#**.*-##**-.** + --*-*█-----##*- + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_6.txt b/codex-rs/tui/frames/hash/frame_6.txt new file mode 100644 index 0000000000..799e3a1cf5 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_6.txt @@ -0,0 +1,17 @@ + + -.***#**##-- + #-*A*.**#.##*-#*#- + ###...*█ -█..**#*A*- + A#.*.*-*# *#....# + █*...***#** .**.*# + *-A.A--#*.*-.# .**A. + - #.. -*.A-* -#.-. + . ... -.*.A.. .#*.. + -..-. A█..**A#-.#.--##-.*A. + ..*#A---*# .A**#..#****.#.* + A . A...*A█ █*████*█-**A. + # * A#- #A-AA.- + .-*-**# -#--A*## + -█.*#█# *.--##** A*█ + --**##-----##* + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_7.txt b/codex-rs/tui/frames/hash/frame_7.txt new file mode 100644 index 0000000000..4a3f9f202f --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_7.txt @@ -0,0 +1,17 @@ + + -..**#**##- + #*-#*.#*#**** -*# + * #...*- --.- *A-*# + **....*# -.**.A# + -█.*..-.A*# . *..* + . *..█ -█**.* #-... + -*█. --.*.*. **-.. + -█A.. *#A.*.- █ ... + A█.* #█-A.*A..**-..****.. + .#█..*A..A█..*..**#*#**.*. + * *-A*.*-A ******██-A.. + █- A-A-- #█-A*A█ + █*##***- #-.#*A*█ + *-█*.***.---#*.*#A + █.*█.A.--#-*** + \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_8.txt b/codex-rs/tui/frames/hash/frame_8.txt new file mode 100644 index 0000000000..4bc5a6f118 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_8.txt @@ -0,0 +1,17 @@ + + --#-*##*##- + #█*A...*** . █# + -.*#.AA* #█.A.**#-# + -***A.##. █ *-..* + █ A.A#*.A* .█*..# + .█#.*---*.-* *#... + .*... █-**.-. .-.A.# + *#..A .#*A.#*. .-A.. + * *..-- A**..A#####*... + **A*-.█#.#..*.*--..*█ + AA**.*...A█-*-*█**█A*. + █#█.*.-- .#AAA█ + █*-****- -A*-.#A* + .A█.#* **#**A*#.- + ..-***.-##A*- + -- \ No newline at end of file diff --git a/codex-rs/tui/frames/hash/frame_9.txt b/codex-rs/tui/frames/hash/frame_9.txt new file mode 100644 index 0000000000..db3507db59 --- /dev/null +++ b/codex-rs/tui/frames/hash/frame_9.txt @@ -0,0 +1,17 @@ + + .*-*A##*# + A*-A..*█* --*- + A #..A*--*A *-.# + █ ..A**- --#.*-.## + A*█***█.*# *.█#A#.. + . ...█-.**-- .█.*... + - .**.**.**#█.#A -.. + . .A-#*...-A**-. .. + █#.█ A.█....#..#..- + .-...-#.-.-....--... + █ --A**.A█****..█A*. + *...*#- #A -A.- + *#*.** A*-*.A* + --█*-.*A#****.- + █-- ***.*#A█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_000.txt b/codex-rs/tui/frames/hbars/frame_000.txt deleted file mode 100644 index ef3f8fafd2..0000000000 --- a/codex-rs/tui/frames/hbars/frame_000.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▂▂▂▄▇▇▇▇▇▇▇▇▇▆▂▂ - ▆▂▇▁▅▇█▇▇▂▂▂▂▅▅▅▂▂█▇▂▇▇▇▂ - ▂▅▁▃▇█▇▂▆▂▁▇▇▁▁▇▄▇▁█▇▇▇▇▆▂ █▇▂ - ▆▇▁▅▆▇▂▇▆▅▇▇ ▆▁▁█▇▇▄▂ ▇▆ - ▂▇▁▅▆▇▂▅▅ ▇█▇▁▆▃▇▆ - ▆▁▁▅▅█▅▁ ▆▃▆▁▁▂▃▃ - ▅▅▁▅█ ▁▇ ▁█▃▃▃▇ ▃▄▃▁▆▃▁ - ▆▅▁▁▇█▁▂ ▇▃▂█▁▅▁▁ ▂▇▃▃▁▆▃▁ - ▇▇▁▁▃▁▇ ▁▇▄▃▃▃▂▅▁ ▇▆▇▁▂▃▆ - ▁▃█▁▂▂▁▁ ▇▃▁▇▃▅▁▁▃▅ ▅▁▂▁▁ ▁ - ▅▁▄▁ ▃▁ ▇▂▅▅ ▇▁▅ █▁▁▁▅▁ - █ ▃▃ ▅▁ █▂▅▁▁█ ▄▇ ▃▁▁▁▁ - ▁▂▁▁ ▅ ▆▁▅▅█ ▅▁▂ ▂▄▄▇▄▇▇▇▇▇▇▇▇▇▆ ▁▅▅▁ ▁ - ▇▁▄ ▁▆ ▂▅▁▁▇█ ▅▇▂ ▅▁▁▄▃▇▇▇▇▇▇███ ▁▄▃▁▃▁ - ▃▅▁▃▅ ▁▃ ▇▁▅▂ ▂▁▂ █▁█▆▆▆▆▆▆ ▁ ▁▁█▁▂ - ▃▃▁▁▂▃▁▆ ▇▇▇▇▄ ▆▅▂▅▅█▅▅ - ▃▃▃▁ ▃▄▂ ▄▇▄▇▅▂▅▅ - ▃▁▁▁▆ ▇▁▃▂ ▂▁▂▇▁▇▂▁█ - █▆▇▇▁▆ ▇▆▇▇ ▅▂▇▇▁▇▇▇▆▄▇ - █▁▇▁▁▇ ▂▃▆▇▇▃▁▇▂▂▆▆▆▇▇▇▇▁▇▁▇▇█▂▆▇▂ - ▇█▇▇▇▄▆▁▁▇▄▁▅█▇▇▄▁▁▄▇▇█ ▂▇▇█ - ▇▇▇▄▁▇▁▁▄▂▂▂▂▂▂▆▇▄▇▇▂ - ▂▂██▇████▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_004.txt b/codex-rs/tui/frames/hbars/frame_004.txt deleted file mode 100644 index adef89cb4f..0000000000 --- a/codex-rs/tui/frames/hbars/frame_004.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▂▂▂▄▇▇▇▇▇▇▇▇▇▆▂▂ - ▆▂▅▁▅▇█▇▇█▂▆▂▅▅▅ ██▇▂█▇▇▂ - ▂▅▁▁▇▁▇▂▄▂▁▇▇▁▁▇▄▁▁█▇▇▇▇▄▂ █▇▂ - ▆▁▇▅▆▇▂▇▁▅▇█ ▇█▇▃▄▂ ▇▆ - ▂▇▁▅▆█▂▄▅▇ █▇█▇▁▆▃▇▆ - ▆▁▁▅▅▃▅▁ ▃▅▁▁▂▃▃ - ▅▁▁▇█ ▁▇ ▃▄█▂▃▃▇ ▇▄▇▁▆█▁ - ▆▅▁▁▇▂▁▂ ▇▃▂▃▃▅▃▆ ▅▃█▁▁▃▁ - ▇▇▁▁▅▁▇ ▂▁▁▁▃▃▃▃ ▂█▆▇▁▁▃▆ - ▁▇█▁▂ ▁ ▆▃▁▇▇▃▅▁█ ▁▂▁▁ ▁ - ▇▁▅▁█▂▁ ▇▂▅▁█ ▅▇▅ ▄▁▁▁█▁ - █ ▃▅ ▇▁▆ ▂▅▁▁█ ▆▄▇▂ ▁▁ ▁ - ▁▂▁▁██▇▃ ▄▁▅▅▅ ▄▅▂▂ ▂▄▄▇▄▇▇▄▇▇▇▇▇▇▆ ▆ ▅▁ ▁ - ▇▁▆ ▁▂ ▅▁▁▇██▅▇ ▇ ▁▃▇▇█▇▇▇█████▇ ▁▄▃▁▂▁ - ▃█▁▃▂█▁▆ ▇▁▅█ ▂▁█ ▅▆▇▄▇▇▂▁▁▁▄▄▄▇▇ ▅▅▅▁▂▁▂ - ▃▃▃▁▆▃▁▂ ▇▇▇▇ ▂ ▆▅▂▅▁█▅▅ - ▆▃▃▁▂█▃▇▂ ▂▇▄▇▅█▅▅ - ▃▃▁▁▆▅▇▅▃▂ ▂▅▄▇▁▇▂▁█ - █▆▇▁▁▂ ▇▆▇▇ ▂▂▇▇▁▇▇▁▂▄▇ - █▁▇▁▁▇ █▇▆▇▇▁▁▇▂▂▆▆▆▇▇▇▁▁▄▁▇▇█▂▆▇▂ - ▂█▇▇▇▄▂▅▁▁▄▇▁█▇▇▇▁▇▄▇▇██▂▇▇█ - █▇▇▁▁▇▇▄▄▂▂▂▂▂▂▆▇▄▇▇▂ - ▂▂██▇████▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_008.txt b/codex-rs/tui/frames/hbars/frame_008.txt deleted file mode 100644 index ddefe1c3a0..0000000000 --- a/codex-rs/tui/frames/hbars/frame_008.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▂▂▂▄▇▇▇▇▇▇▇▇▇▆▂▂ - ▂▂▅▁▇▇█▁▇▂▂▆▂▅▅▅ ▂█▇▁█▇▇▂ - ▂▅▁▁▇▇▇▂▅▄▇▇▇▁▇▄▄▁▁█▇▇▃▇▄▂ █▃▆ - ▆▁▁▇▁█▂▂▇▁▇█▅ ▇█▇▃▄▂ ▇▆ - ▆▇▁▅▅▂▆▁▇ █▇▂▇▁▆█▇▆ - ▅▁▁▆█▂▁▇ ▆▆▂▆ █▃▂▁▁▂▃▃ - ▅▁▅▆▆▆▁█ ▇▂█▆▃▇▅ ▃▇▁▆▃▃ - ▅▁▅▁ ▆▁ ▃▁██▃█▆▇ ▃▃▁▄▃▁ - ▁▁▁▃ ▁▁▂ █▁▁▄▁▆▃▂ █▃▇▁▆▁▁ - ▁▁▂▁ ▁▁█ ▇▂ ▁▃▁▃█▆ ▂▁▁ ▁ - ▁▁▂▁ ▁█ █▇▁▁▄ ▅▁▅ ▁▁▁▃▁ - ▆▁▅▄ ▃▇ ▂▇▁▁▂ ▂▁▃ ▂ ▁▁▁▁▁▂ - ▇▇▁▁ ▁▁ ▅▅▅▇▂ ▁▅ ▅▂▇▄▇▄▇▇▄▇▇▇▇▇▇▆ ▂▇▁▁ ▁ - █▁▃▁ █▅▁ ▂▁▁▅▂▅▂▁█ ▅▃▁▁▇▇▇▇▇▇▃█████ ▁▂▃▁▂▁ - ▁▃▁▃ ▃▃▂ ▃█▇▅▅ ▆▇ ▃▂▇▁▇▇▁▁▁▁▄▄▄▄▇ ▆▇▁▁▂▅█ - ▂▁▁▄ ▃▃▂ ▃▇▇▇█ ▅█▅▅▇▆▅ - ▅▁▁▃ ▇▁▁▂ ▂▅▄▇▅█▆▇ - ▅▇▁▁▂ ▃▇▇▂ ▂▅▁▇▆▇▂▁▇ - ▃ ▃▃▇▂ ▃▁▇▇▆▂▅▁ ▂▂▇▇▁▇▇▁▂▄▇ - █▁▇▁▇▅ ▇▇▁▇▇▁▁▇▂▂▆▆▆▇▇▇▇▁▇▁▇▇█▂▂▇▂ - ▂▁▁▇▆▂▂▁▁▇▄▆▅▁▁▇▁▁▁▄▇▇██▂▁▇█ - █▃▇▁▁▁▇▄▂▂▂▂▂▂▂▆▇▄▇▇▂ - ▂▂███████▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_012.txt b/codex-rs/tui/frames/hbars/frame_012.txt deleted file mode 100644 index aca329e85e..0000000000 --- a/codex-rs/tui/frames/hbars/frame_012.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▂▂▄▇▇▇▇▇▇▇▄▆▆▂ - ▂▆▅▁▇▇▇▇█▂▂▆▆▂ ▄▁▂█▇▁▇▇▇▂ - ▂▇▁▅▁▇▂▆▂▄▇▇▁▁▇▄▄▇▇▇▇▇▃▃▄▆▂▇█▇▆ - ▆▅▇▁▇▂▃▁▇▁▇█▅ ▇▁▇▇▂▆ █▇▂ - ▂▁▅▁█▄▄▇▇█▅▅ ▇▁▇▁▂ █▃ - ▅▁▁▃█▁▅▇ ▆▆▆▂ ▁▇▁ ▃▃▂ - ▅▁▁▅▂▁▁▂ ▄▃▂▆▇▆▇▅ █▃▇▁▂▃▇▆ - ▅▁▁▅▂▁▇▅ ▃▇▃▁▃▃▂▃▂ ▇▅▁▆▃▃▂ - ▁▁▇▂▁▁█▂ ▃▆▃▁▁▃▃█▃▃ ▃█▁ ▃▁ - ▁▁▇ ▇▁█ ▃▃▇▁▁▁▆▇▂ █▁▁▅ ▅▆ - ▃▁▁ ▁▁ ▇▅▃▂▂ ▄▁ ▁▁▁ ▁▁ - ▁▁▁ ▁▁█ ▆▁▁▇ ▂▇▅▃ ▁▁▁▁▁▁ - ▆▇▁ ▁▁▆ ▅▂▅▁▅█▁▇▅█ ▆▇▄▄▄▇▇▇▇▇▇▇▇▇▆ ▁▁▁ ▁▁ - ▁▂ ▁▅ ▁▁▅▇▂▆▁▇ ▂ ▁▁▅▇▇▇█▇▇▇▇█████▃▁ ▃▁▇▁ ▁ - ▁▁▁ ▇▅▁ ▇▁▁ ▆▅▂▂█ ▂▃▇▄▇▇▇▇▅▁▁▁▁▄▄▄▇▂▂▅▁▁▆▅█ - ▁▁▃ ▇▅▃ ▇▇▇▇ ▂▅▅▅▅▄▁ - ▃▁▃ █▆▇▆ ▅▁▇▅█▅▁ - ▃▁▁▆ ▇▆▇▇▂ ▂▆▁▅▅█▂▅▇ - █▁▁▁▂ ▇▇▇▇▇▂▂ ▂▄▇▁▃▅▁▅▄▅▂ - ▂█▁▁▂ ▇▇▁▇▁▁▇▇▂▄▆▆▆▇▇▇▇▁▁▁▁▇▂▂▂▇▂ - ▇▇▇▂▅▂ █▇▇▄▁▁▁▁▁▁▇▇▇▇▂ ▂▇▇█ - █▇█▇▇▆▄▂▂▂▂▂▂▂▂▆▄▄▇▇▂ - ▂██▇████▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_016.txt b/codex-rs/tui/frames/hbars/frame_016.txt deleted file mode 100644 index ccd0326c12..0000000000 --- a/codex-rs/tui/frames/hbars/frame_016.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▂▂▆▇▇▇▇▇▇▇▇▆▆▂ - ▆▂▅▇▁▇▇█▂▂▅▁▂▆▆▂█▇▁█▇▇▆▂ - ▅▄▅▇█▂▂▄▇▇▇▁▁▇▄▄▇▇▁▁▁▅▃▂▂█▇▇▃▆ - ▂▅▇▇▂▆▄▇▇▇▇█▁ ▂▇▇▁▃▇▂▁▆▇▃▂ - ▅▇▇▅▁▁▇▇▇ █▇▁▁▁▄▃▇▄ - ▂▁▁▅▄▁▇ ▆▆▆ ▇▁▁▆█▆▇▆ - ▂▁▁▁▅▁▅█ ▁▁█▃▂▁▆ ▃▁▄ ▃▃▃ - ▁▁▁▅▁ ▇▁▃▅█▆▇▃▂ ▇▁▁ ▄▁▃ - ▁▅▅▁▁▅ ▇▁▁▃▁▃▂▇▃▂ ▇▁▄ ▆▁▆ - ▁▅▅▁▁ ▃▃▁▁▁▃█▃▂▅ █▁▁ ▁▁▇ - ▁▂▁ ▁█▁ ▇▁▁ ▅▇▄▁█ ▁▁ ▅▃ - ▁▂▃ ▁█▅ ▄▇▅▅█▁▆██ █▁█ ▅▃ - ▁▅ ▁▁▁ ▂▅▆▇▅▁▁▇ ▆▇▇▇▄▄▇▇▇▇▇▄▇▇▆ █▁▇▂▁▁ - ▇▁▅▁▅▃▆ ▆▁█▅▄▃▇▅▁ ▇▅▇▇▇███▅████▇▇▇▁ ▂▁▁▆▅▁ - █▃▆ ▁▃▁▃ ▇▆▃▅▃▄▇ ▁▃▇▇▇▇▇▇▁▁▅▁▁▁▁▇ ▅▃█▂▃▁ - ▃▃▆ ▃▃▇▂ ▇▇▇▇▂ ▂▁▃▁▅█▇█ - ▇▃▇ ▃█▁▇ ▆▁▆▁▇▅▁█ - █▁▄▂█▃▇▁▇▂ ▂▆▁▁▇▆▆▁▇ - ▇▁▄▂█▃▆▁▁▇▂▂▅ ▂▄▅▁▁▇▁▂▅▅ - ▇▁▁▆▂█▇▁▁▁▇▁▇▇▄▄▆▆▆▆▇▇▇▁▁▁▇▇ ▂▇▇ - ▂▇▇▂▂▂ ▂▇▇▇▇▁▁▁▁▁▁▇▇▇█ ▂▆▇▅█ - █▁▇▄▁▄▆▂▂▂▂▂▂▂▂▆▄▄▇▇█ - ▂██▇▇███▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_020.txt b/codex-rs/tui/frames/hbars/frame_020.txt deleted file mode 100644 index b3639b48c7..0000000000 --- a/codex-rs/tui/frames/hbars/frame_020.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▂▂▂▇▄▇▇▇▇▇▇▆▂▂▂ - ▆▂▅▁▇▇█▂▂▃▄▅▆▃▂▇▇▇▇▇▇▇▄▅▂ - ▆▄▇▁█▆▂▄▄▇▁▄▇▇▄▄▇▇▅▇▁▇▇▂█▁▇▃▅▁ - ▆▇▂▂▂▄▅▇▆▇▇ ▅▃▁▃▂█▇▇▇▇▂ - ▆▇ ▆▆▇▇▆█▂█ █▇▁▃█▃▃▃▇ - ▅▂ ▂▁▇▅▃ ▆▆ ▃▄█▆▃▅▆ - ▅ ▆▁▂▁ ▅█▃█▁ ▂▃▃ ▁▇▃▃ - ▅▂ ▆▁▆█▁ ▁▅▅▇▆▃▃▂ ▃▃ ▁▃▁▆ - ▂▇▆▂▁▂▅ █▁▃▁▆▃█▁▃ ▁▆ ▄▁▇ - ▁ ▂▁▁▁ ▇▁▄▇▇▆▃▃▂ █▁ ▁▇▁▁ - ▁▁█▁▁▃ ▂▃▂▁▇ ▄▁▁█ ▁▁▃▁▅ - ▁▅█▁▁▃▅ ▆█▅ ▄▅▇▅▂ ▁▃█▁▁ - ▃▁█▁▁▁▂ ▅▅▅▂▄▁▂▅ ▂▄▇▇▇▇▄▄▄▄▄▄▄▄▆▂ ▁▃▃▁▂ - █▆▃▃▁▅▃▅ ▂▇▇▇▅▇▇ ▆▇▇▇▇▇▇███▇▇▇▇▁▅ ▃▁▅▁▁ - ▁▃▃▁▃█▁ ▃█▅▆▅▂ ▁▇▇▇▇▇▇▁▁▃▁▁▇▁▅ ▂▃▃▁▃▆ - ▁▃ ▁▃▅▃ ▂▂ ▂▇▅▅▅▅ - ▁▃▆▃█▆▇▂▁ ▆▅▂▁▇▃▅ ▂ - ▃▁▆█▇▇▆▇▂ ▂▆▇▅▁▁▂▅▆ - █▁▄▂█▃▄▁▇▇▆▂▅ ▂▆▅▇▂▁▁▇▆██ - █▇▁▆ ▇▇▁▁▁▁▇▇▇▆▆▆▆▆▇▇▇▁▁▇▇▇▂▄▇▆█ - ▇▇▇▂▂ █▇▇▇▇▇▇▇▁▅▅▄▇█▂ ▂▇▇▇▃▂ - █▇▇▁▁▆▆▂▂▂▂▂▂▂▆▆▇▇▇▇ - ▂██▇▇██▂▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_024.txt b/codex-rs/tui/frames/hbars/frame_024.txt deleted file mode 100644 index df0945fbfb..0000000000 --- a/codex-rs/tui/frames/hbars/frame_024.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▆▂▇▄▇▇▇▇▇▄▂▂▂ - ▂▅▄▁█▂ █ █▇█▃█▇▁▇▇▇▆▄▆▂ - ▂▅█ ▂▆▇▇█▄▇▇▄▄▇▇▃▄▆▂▅█▁█▇▇▇▆ - ▅▇ ▆▇▇▂▇▇▃▇ ▃▁▇▃▆▃█▇▇▃▁▃ - ▆▇ ▂▅▇█▆▃ ▄▇▇▃ ▃▇▃▂▃ - ▅ ▄▅▂▆ ▄▇▂▆ ▇▆▇▇▄▃▆▁ - ▁ ▅▅▆▃ ▃▇▂▁ ▇▃▇█▁▃▃▁ - ▁ ▁▅▅▃ ▁▁█▃▇▆ ▁▁█▁▃▅▁ - ▆▂ ▆▁ ▃ ▂▃▇▂▃ ▄▃▆▇▆▁▇▄ - ▁▅▁▁▁▅ ▁▅▃ █▃▃ █▇▁ ▁▃██ - ▁▅▁▁▂▆ ▃▁ ▇▃▇ ▅▅▁▁▁▃ - ▁▃▁▇▂▁ █▂▇ ▂▇█ ▃▁▁▁▁▁ - ▁▅▇▅▁▇ ▁▅▂██▅▅ ▂▄▇▇▇▄▄▄▇▄▇▄▄▇▂ ▂█ ▁▁▁▁ - ▁▆▁▇▂▁ ▂▁██▂▁▇ ▁▄▃▃▇▇▇▇▇▇▇▇▇▇▁▅▇ ▁▁█▁▅▁▅ - ▁▅█▆▃▃▂ ▃▂▆▄▂ █▇▇▇▂▇▇▂▂▂▇▇▇▁▅ ▂▁▅▇▃█ █ - ▁▂▇▆▃█▆ ▅▁▃█▅ ▅ - █▁▂▇▆▃█▃ ▂█▃▂▇█ ▆ - ▁▂ ▃█▇▇▇▂ ▅▅▇▆▂▅▂▅ - ▇▁▂█▁▃▃▄▇▇▂▂ ▂▇▇▂▇█▄█▃▆▂ - ▇▁▂▂█▃▁▇▇▁▁▃▇▇▄▂▂▂▇▇▇▇▇▆▇▅▄▅▆▇▆█ - █▇▁▆▂ █▇▇▇▇▁▇▇▇▁▇▇▇▁▇▇▇▇▆▁█▂ - ▂▇▇▇▄▄▄▂▂▂▂▂▂▆▇▇▁▇▇██ - ▂██▇▇██▂▂▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_028.txt b/codex-rs/tui/frames/hbars/frame_028.txt deleted file mode 100644 index 2dd5de69b6..0000000000 --- a/codex-rs/tui/frames/hbars/frame_028.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▆▂▁▄▇▇▇▇▇▄▂▂▂ - ▆▄▇▇▂ ▂▇▇▁▇▂▁▅ - ▂▄▇▂ ▂▆▇▇█▁▁▇▄▄▄▇▃▇▂ ▂▃▇▇▂▇▆ - ▂▅█ ▂▇▇█▆▅ ▁▃▆ ▇▇▄▂▇▆ - ▆██▂▅▇ ▆▃ ▃▁▇ ▅▃▃▃▂▃ - ▁▅▅▅▅ ▂ ▆▇ ▇▁▆▂▃▃▁▆▃ - ▁█▅▁▇▅ ▂ █▆▇▇█ ▇▃█▇▃▁▅▃ - ▅▁▁▅▇ ▃ ▆▃█▃▇▄ ▇▆▅▃▆▃▅▁ - ▁▂▃▁▅▅ ▃▃▂▃▃ ▇█ ▁ ▁▁▃ - ▁█▄▇▁ ▆▃▇█▆▃█ ▂▁ █▂▁ ▆ - ▁▄▁▁▂▁█ ▁ ▂ ▅▃▇▆ ▄█▃█▁▁▅█ - ▁ ▁▁▁▅ ▁▁██▇█ ▇ █▁█▁▁▁▅ - ▁▁ █▁▁▂ ▇▆▆ ▆█▅▂▆▄▇▇▇▄▄▄▇▇▄▇▄ ▆██▄▁▁▅ - ▁ ▁▁ ▁ ▂▄▁▅ ▅▂ ▇▅▅▅▇▃▃▄▅▅▅▇▃▁▆ ▁▆▁▁▅ ▆ - ▁▂▃▅▄█ ▃▇▂ ▇▄▄▄▁▂▂▂▂▂▂▂▇█ ▄▅▂▁▄ ▅ - ▁▃▃█▂▇ ▂▁█▁ ▆ ▅ - █▁▃▃▁▁▇▃ ▆▁▅▅▂█ ▆▂ - ▁▆▃▄▇▆ ▂▅▇▂▅▂▅ ▅▂ - ▇▁▂▇▄▁▁▇ ▂ ▂▂▇▇▁▁▇ █▂▇ - ▇▁▄█▁▇▁▁▇▁▃▄▇▄▂▇▇▇▇▁▁▁▇▂▆▅▂▁▂▅▂ - ▇▁▇▆▁▁▁▁▇▇▇▇▇▇▁▄▇█▆▂▂▅▅▃▅▇ - █▇▁▇▇▁▁▄▁▁▁▁▃▇▇▁▁█▇█ - ▂██▇▇██▂ ▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_032.txt b/codex-rs/tui/frames/hbars/frame_032.txt deleted file mode 100644 index 32682afe6a..0000000000 --- a/codex-rs/tui/frames/hbars/frame_032.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▆▇▄▇▄▄▇▇▇▄▄▂▅ - ▂▅▅▇█ █▇▁▃▂▇▇▂ - ▂▄▇▁▂▆▇▇█▇▁▇▄▄▇▇▇▆ ▂▃▇▇██▇ - ▂▁▇▄▁▇▇▂▇▇▁▅ ▁▃▆ ▃▃▃ █▆ - ▆▇▂▁▇█ ▅▄ ▁▆ ▁▃▆ ▇▂ - ▅▇▆▁▇▅▂ ▂ ▅▁▃ ▃▃▆▂▁▆ - ▅▇▅▁▇▁▄▂ ▁▃▅▃ █▅▂█▃ ▁█▁▂ - ▂▁▃▅▇ ▅ ▅▃▃▆▃ ▇ ▆ ▃▃▃ - ▁▆▃▁ █ ▃▆▃▃▂▃▂ ▃█▃▆▁▆▃▁ - ▁ ▁▁ ▁ ▁▃▅█▆▇▅ ▂▆▃▆▁█▃▅ - ▇▃▁▁▇█ ▃▃▁▅█▅▅▃▅ ▁▁▁▅█▁▁ - ▅▇▁▁▃ █▆▅▇█▅▁█ ▅ ▁▁▁▁▇ - ▁▁▁▁█▁ ▂▁▂▂▁▂ ▂▆▇▄▁▄▇▄▄▄▄▇ ▁▆▁▇▁▁ - ▁▆▅▁ ▃ ▇▃▂▁▅ ▁▃▇▇▇▄▄▃▅▄▄▃▅ ▄█▃▁▁▁▁▁ - ▇▁▁▆▁ ▇▇▇▇▄▂▁▄▁▂▁▇ ▅▁▅▁ █ ▅ - ▁▅▃▅▂█▁ ▂▂ ▄▇▁▅▅█ ▅ - ▁▃▃▁▁▅▃ ▅▇▂▅▁▅ ▆▂ - ▁▁▇▇▃▂▇ ▂▁█▆▅ ▅▅▆▂ - ▇▄▃▃▇▇▆▇▁ ▆▁▇▂▅▇▆▂▂▅ - ▇▁▁▇▆▇▇▃▁▇▄▁▄▆▆▆▇▇▁▁▇▂▆▅▂▃ ▇█ - ▇▁▁▁▁▇▁█▇▇▇▇▇▇▇█▂▅▂▇▇▃▂▅▂ - ▂▇▇▁▄▂▂▂▂▂▂▆▇▇▄▇█▅▇█ - ▂███▇██▂ ▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_036.txt b/codex-rs/tui/frames/hbars/frame_036.txt deleted file mode 100644 index 8d3d16b6f2..0000000000 --- a/codex-rs/tui/frames/hbars/frame_036.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▆▇▇▇▄▇▇▇▄▂▂▅ - ▂▂▇▇█▂▄▅▅ ██▇█▇▁▇▇▁▃▆ - ▆▁▇▄▄▇▇▇▇█▇▄▇▇▁▆ █▅▃▇ █▃▂ - ▂▁▇▁▅▇▃▂▇█ ▇▆ ▆▁▂▂█▃ - ▆▅▆▁▇█ ▁▂ ▃▃▆▆ ▃▂ - ▆▅▆▅▅ ▂ ▃ █▃▁▃▅▇▂ - ▁▆▅▅ ▅▃▃▂▇ ▃ ▃▃▃▆▃▃ - ▁▂▁▁ ▃▃█▅▇▂█▆ ▅▃▃ ▆▂▃▁ - ▁▁▃▂ ▆█▆▅▂▇▃ ▅ ▃▂█▃▃▅▂ - ▁ ▁█ ▅█▁▁▆▅▄▃▃▅ ▄ ▁▁▆▆▁▁ - ▁ ▃█ ▂▂▃█▆▅▃▄▅ ▁ ▁▁▁ ▁▁ - ▁▃▄▃ █▁▅ ▅▇█ ▁ ▃▁▁▁█▁ - ▁▅▅▇ ▁ ▆▇▅▁█ ▅▂▇▇▇▇▇▇▄▇▄ ▇▁▁▁▂▁▁▁ - ▁▁▅▁▃▆ ▇ ▅█ ▁▇▇▇▇▇▇▇▇▇▃▃ ▅ ▁▇▂▁▁▁ - ▁▄▅▁ ▁ ▃▇▇▇▇▇▁▄▂▂▁▇ ▁█▁█▁▁▁▂▂ - █▁▇█▁ ▁ ▂▂▂▂▂ ▂▅ ▅▆▅ ▁ - ▃▁▁▁▄ ▃ ▆▁▂▁ ▅ - ▃▁▁▃▃▂▇▄ ▆▇ ▅█ ▆▂ - ▇▁▁▆▁▃▂▇ ▂▁▇▆▆▂▅█ ▅ - ▃▁▁▇▇▅▇▁▇▃▇▄▂▆▆▇▁▁▂▂▇▄▁▃ ▆█ - ▇▇▂█▇▇▇▇▁▇▁▇▇▇▂▅▂▄▇▇▂▆▇ - █▇▆▄▂▂▂▂▄▂▄▇▇▆▇▂▅▇▂ - ████▂▂ █▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_040.txt b/codex-rs/tui/frames/hbars/frame_040.txt deleted file mode 100644 index 5f1d122297..0000000000 --- a/codex-rs/tui/frames/hbars/frame_040.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▆▇▇▇▇▇▄▇▇▂▂▂ - ▆▄▇█▂▅▃▃▂▇▇▇▁▁▄▇▁▇▇▂ - ▆▁█▂▇▇▇▇█▁▄▇▇▄▂██▁▇▂ ▂▃▂ - ▅█▅▁█▂▄▇█ █▇█▃ ▇▃ - ▁▂▇▁▂ ▅█▅▁▆ ▂▁ - ▁▁▇▁ ▂▂▆▃ ▆▅▃█ ▃▁ - ▄▃▅▁ █▃▃▂▁▃ █▅█▃▃▃▆▃ - ▁▁▁▂ ▁▃▃ ▁▃ ▆█▃▆▁▁ ▃▂ - ▂█▁▁ ▃▃▃ ▃▃▇ ▂▁▂▁▁▁▁▁ - ▁▁▁▁ ▅▁▃▆▁▃▃▃▆ ██▁▄▁▅▆▇ - ▅▁▁▁ ▃▁▃▅▃▁▆▆ ▁▅▁▁▁▂▁▁ - ▃▅▁▁ ▃▂▅▅█ ▅ ▂ ▁ ▁▁▁▁▁▁ - ▁█▁█ ▃▅▂▅ ▆▂▂▇▇▇▇▇▇▇▇ █▂▁▁▂▆▅▁ - █▅▅▆ █▅ ▆▇▇▇▇▇▇▇▇▇▁▁ ▁ ▁ ▁▁▁▃ - ▁▁▅▆ ▂▇▇▇▇▂▁▄▂▄▁█ ▅▇▁█▁▁▁▁▁ - ▁▅▅▁▆▇ ▂ ▂▂▂▂▂ ▁ ▃▆▁▁▁▁█ - ▁▁▃▃ ▇▂ ▁▂▁▂▅▁▁▅▁ - ▁▃▇▇▂▇▃ ▂▁▂▅▅▅█ ▁ - ▁▁▆▁▃▂▇ ▆▇▂█▅▅▃ ▂▅ - ▇▂█▇▃▄▆▁▇▇▇▆▆▂▆▇█▆▆▅▇▂ ▆▇ - █▇▂ █▇▇▁▁▁▁▇▇▂▆▄▃▇▃ ▆▇ - ▇▇▄▂▅▆▂▂▇▇▇▅▇▂▄▇█ - ▂███▂▂ ▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_044.txt b/codex-rs/tui/frames/hbars/frame_044.txt deleted file mode 100644 index 0e973910de..0000000000 --- a/codex-rs/tui/frames/hbars/frame_044.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▆▇▄▇▇▂▇▇▇▂▂▂ - ▆▅▇▂▆▆▆▇█▇▁▇▁▄ ▇▇▂ - ▂▁▁▄▇▇▇█▁▇▇▄▂▇▃▇▆▅ █▇ - ▆▇▅▇▅ ▁▆▃▂ ▃▃▆ - ▆▃▇▅▂ ▃▃▁▄█ ▁▆ - ▅▁█ ▂▂▆ ▃▆▃▁▃ ▅▆ - ▁▅▅ ▇▁▃▆ ▅▃▄▃█▃▃ - ▁ ▁ ▃▁▃▅▂▃▆ ▃▆ ▁▁ ▁ - ▆▃▂▁ █▁█▅▃▂▁▂ ▅▂▁▁▁ ▁ - ▁▁▇ ▃▃▃▁█▁▇ ▁▃▅▁▅ ▅ - ▇▁█ ▃▅▁▅▇█▁ █▁▁▁█▁▁▁ - ▅▁█▂ ▅▆▅▁▅ ▁▁▁▁▂▁▁▁ - ▁▁▅▁ ▂▁ ▅▁ ▂▂▇▇▇▇▇▇▇▆█▁▁▁▁▅▆▁▁ - ▇▁▁ ▁ ▅▁▅ ▇▇▇▇▇▇▇▇▃▆▅▁ ▃▁▆▁▁▁ - ▁▅▇▂▂▆▅ ▅▇▇▄▄▁▄▇▁▅▂▆▂▁▁▁▁▁ ▅ - ▁▁▆▃▇ ▂▁ ▂▂▂▂▂█▃ ▁▆▁▁ █▁ - ▁▅▃▂▅▆ ▅▃▁█ ▅▁▃▂ - ▃▅▁▃▂▃▃ ▆▇▅▆ ▅ ▅▇ - ▃▅▁▂▇█▇▆ ▅▇▅▆▄▅ ▅▅ - ▃▂▇▁▇▇▂▇▇▆▂▂▆▇▂▅▅▂▃ ▄█ - █▃▂█▇▇▄▄▁▇▇▂▂▇▃▁▂ ▆▇ - ▂▇▆▂▂▂▆▅▅▇▄▄▂▂▆▇▂ - ▂███▂ █▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_048.txt b/codex-rs/tui/frames/hbars/frame_048.txt deleted file mode 100644 index f5d91e9587..0000000000 --- a/codex-rs/tui/frames/hbars/frame_048.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▆▂▄▁▇▆▆▇▇▆▆ - ▆▇▁▄▆▂█▃▄▁▇▄█▇▃▆ - ▅▆▁█▇█▁▇▇▂▃▃▃▂ ▇▃ - ▅▁▅▇▆ ▃▁▃▂ ▅▂▁ - ▁▁▃▃ ▁▃▃▂ █▃▁ - ▂▃█ ▂▆▂ ▃▆▁▅▅▆▃▃ - ▁▅▁▁▁▆▆█ ▅ ▃▃ ▃▇▂ - ▃ ▁ █▅▃ ▃ ▁▄█▃▃ ▁ - ▅▁▁▂ ▆▁▁▁▃▆ ▁ ▁▃▃▁▁▁ - ▁▁▃ ▇▁▅▅▄ █ ▆▆▇▁▆▅▄▆ - ▁▁▁ ▁▃▃▁▁▁ ▁▅▁▁█▅▁▁ - ▁▁▁▂ ▃ ▇██ ▁▃▁▁▁▁▁▁ - ▁▁▅▃ ▁▅ ▂▂▇▇▇▇▇ ▁▃▁▁▁▁▁▁ - ▁▁█▁▅▂▆ ▇▇▇▇▇▇▁▃ ▁█▁▁▁▁▁▁ - ▅▁▁▇▁▂ ▇▇▄▁▄▇▅█ ▁█▁▁▁ ▃▂ - ▁▅█▇▁ ▂█▁▁▁ ▁▁▁▃▁ - ▇▇▄▁ ▁ ▂█▅▃▁▁▁▁▂▅ - ▁▁▅▆▃▃▂ ▁▅▆ ▅▁▁▆▁ - █▆▁▁▃█▇▂▅ ▂▁▆▁▆▁█ ▅▆▂ - █▆▇▂▇▂▇▇▇▂▆▅▂▆ ▅▅ ▁▂ - █▃▂▇▇▄▁▅▇▂▄▇▆▇▃ ▂▅ - █▇▂▂▂▂▇▇▄▇▃ ▂▅▂ - ▂█▇▂▂▂▂█▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_052.txt b/codex-rs/tui/frames/hbars/frame_052.txt deleted file mode 100644 index 8c2fcda9a5..0000000000 --- a/codex-rs/tui/frames/hbars/frame_052.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▅▄▇▇▆▄▃▇▆▂ - ▅█▆▆█▃▇▅▃ █▃▁▆ - ▁▅▅▇█▇▃▇▆▃▆▂█ ▃▃ - ▄▁▅█▅ █▁▅▅ ▃▃ - ▁▁▃ ▅ ▃▁▃▃ ▃█▂ - ▁▁▇▂▂▂▂ ▁▄▁██ ▁▁ - ▇█▁▁▂▇▇█ ▃ █▁ █▁▅▆ - ▁▁ ▁▁▁▃▁ ▆ ▁▁ ▂▁▃ - ▅▅▁ ▅▅▂▁▃ ▁▁▁▅ █▁ - ▁▁█ ▁▁▁▃▂ ▁▅▆▁▁▃▁ - ▁▁▅ ▇▁▅▁▃ ▁▅▁▄▅▂ ▁▅▆ - ▁▁▅ ▁▄▅▃██ ▂▅▂▁▁▁▅ ▁▁ - ▁▅ ▁▁ ▂▂▂▇▇▇▇▃▂▁▁▁▁▁▁▁ - ▁█ ▃▇ ▇▇▇▇▇▃▁▁█▂▁▁▁▁▁▂ - ▁▁▅ ▁ ▃▄▄▂▁▇▁▁▄ ▁▁ ▁ - ▅▁▁ ▆▅ ▂█▁▁▁ ▁▁ █▁ - ▁▁█▁ ▂▃▅█ ▁▁ ▃▁ - ▁▁▁▃ ▁▁▆▆▂▁▁█▆ - ▁▁▇▃ ▆▁▃▃▁▁▁▁ ▅ - ▃▁▇▄▂▇▃▂▇▅▃▁▇ ▅▅▁ - ▃▃▇▁█▅▂▅▃▁█ ▅▅ - ▇▇▂▂▆█▂▅█▅▂▁█ - █▇█▂███ - - diff --git a/codex-rs/tui/frames/hbars/frame_056.txt b/codex-rs/tui/frames/hbars/frame_056.txt deleted file mode 100644 index 48de91bb55..0000000000 --- a/codex-rs/tui/frames/hbars/frame_056.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▆▄▇▇▆▆▃▇▆▂ - ▅▆▂▃▃▅▅▅██▁▆ - ▄▁▅▇▃▃█▁▂ █▁▆ - ▇▁▇▅▁▃▁▇▆ █▆█▃ - ▁▃▁ ▃▃▅▃▃▃ █▅▄ - ▁▃▆▂█▆ ▁▁▃▁█ ▇▁ - ▁▁▁▆ ▁ ▇▁▁ ▂▅▁▁▃ - ▃▅▇▅ ▁▁▆ ▃▁ ▁ - █▁█▁▇█ ▂▁█▂▁▁▅ - ▃▅▃▇▂▄▁ ▁▁▇▁▁▆▅▁ - ▁▅▁▄▄▇▁ ▁▁▅██▁▅▁ - ▁▅▇▅▇█▁ ▁▁█▂ ▁▁▁ - ▇▅▃▁▂▂▂▇ ▁▁▅▁▁█▁▁ - ▄▃▁█▇▇▁▃ ▁▁▅ ▁▁ ▁ - █▃▁ ▅ ▁▁▁▁▁▁▁▃▁ - ▁▁▇▂▇▆ ▂ ▅▁▁▁▁ ▅▁ - ▁▁▁ ▁▁ ▃ ▂▁▁▁▁ ▁ - ▃▁█ ▂ ▄▁▁▁ ▆▅▆▂▂ - ▁█▃ ▁ ▁ ▃▃▇▂ ▁▁ - ▃▁▃▃▇▅▃▅▆▁ ▁▁▂█ - ▃▇▆██▅▄▇ █▅ - ▇▂▂▅▂▇ ▃▇ - █▇▂████ - - diff --git a/codex-rs/tui/frames/hbars/frame_060.txt b/codex-rs/tui/frames/hbars/frame_060.txt deleted file mode 100644 index 2ba81fbc44..0000000000 --- a/codex-rs/tui/frames/hbars/frame_060.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▄▇▇▆▅▇▇▆ - ▃ ▃▁▅ ▇█▆▃ - ▅▁▁▁▅▂█▃▃▃ - ▅▅▅▁▄▁ █▁▁▁ - ▁▁▁▅▁▇▆ █▁▁ - ▁▁▂▁▅▅▁▃▁ ▃▁ - ▁▁▅▇▁▁▅▁ ▁▁ - ▁▁██▁▁▁▁▃██ ▆ - ▁▁▅▁▁▇▅▃▁▁▁▂▁ - ▁▁▁▁▁ ▁▁▁ ▃▂▁ - ▁▁▃▇█ ▁██▁█▁▁ - ▁▁▂▃▁ ▁ █▁▅▁▁ - ▁▁▂▂▁▂▂▅▁▁▁▁▇ - ▁▁▁▁▁▁▁▁▁ ▁▃ - ▁▁▂▁█▁ ▁▁▁ ▁▅ - ▁▁▃▁▁▁▁▁▁▁▁█▁ - ▁▃▅▅▅▁ ▅ ▁ - ▁▁▅▁▁█▄▁▁█ - ▅▁▁▁▃▁▇▃▂▁▃ - ▁▃▇▁▃█ ▁▇▁▁ - ▄ ▁ ▃▃ ▆▃▂▇ - ▇▇▁ ▇█▆▄▁▁ - █▇█▂██▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_064.txt b/codex-rs/tui/frames/hbars/frame_064.txt deleted file mode 100644 index 2b4dbbdcdb..0000000000 --- a/codex-rs/tui/frames/hbars/frame_064.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▇▇▇▆▇▇▇▆ - ▁▃▁█ ██▄▁ - ▁▂▁█ ▁▃▅▃ - ▁▁▁▃▂▃█▁▅ - ▁▅▅▁▆█▃▁▁ - ▇█▅ ▃▃▅▃▁ - ▇▅█▁▅▇▇█▁ - ▃▁▂▁ ▁▅▃▃ - ▃▁▄▂▆ ▅▁ - ▁▁▁▂▃▃▁▁▂ - ▁▁▁█▆▇█▁▁▁ - ▁▁▁▁▆▅▄▅▁ - ▁▁▁▁▁▁▂▁▁▂ - ▁▁▁▁▁▁▃▂▁▂ - ▁▁▁▁▁▁▁▁▁▁ - ▁▁▅▁▁▁▁▁█▁ - ▁▁▁▁▁▁▁▁▂▁ - ▁▁▁▁▁▁▁▁▅▁ - ▁▁▇▁▃▅▆▁▂▁ - ▃▁▄▁▁▆█▁▃▂ - ▃▁█▁ ▁ ▁ ▂ - ▇▅██ ▅▇▅ - █▇██▇█▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_068.txt b/codex-rs/tui/frames/hbars/frame_068.txt deleted file mode 100644 index 15d7fc2ff9..0000000000 --- a/codex-rs/tui/frames/hbars/frame_068.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▆▇▇▅▆▆▇▄▆ - ▃▅█▃▅▁▃ █ - ▁▆▂██▃▃▁▃▄ - █▁▆ ▆ ▁▇▁▆▁ - ▁▁▁ ▂▃▁▁▁ ▁ - █▇▁▆▁▅▃▁▃ ▁ - ▃▁▁▂▁▁▁▁▁ ▁ - ▅▁▁▁▅▁▃▁▁▁ ▁ - ▁▁▁▁▁▁▃▁▁▇ ▁ - ▁▂▁▁▁▁█▅▁▃ ▁ - ▁▁██▁▃▁▅▁▆▅▁ - ▁▆█▅▂███▁▁▅▁ - ▃▁ ▁▁▁ ▁▁▁▇▁ - ▂ ▁▁▁▆▁▁▁█▁ - ▂▁▁▁▁█▁▇▁▁▁ - ▃▃▁▁▁ ▅▃▁▁▁ - ▁▅▁▁▁▂▅▁▁▅▁ - ▁▁▃▅█▁▁▃▅▄▁ - ▁▇▁▆▆▆▁▆▁▂▁ - █▃██ ▁██▁▂▃ - ▁▁▆ ▁▁▅▁▅▁ - ▁▅▃ ▁▇▃▂▂ - ▂██████▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_072.txt b/codex-rs/tui/frames/hbars/frame_072.txt deleted file mode 100644 index e151a3fdd5..0000000000 --- a/codex-rs/tui/frames/hbars/frame_072.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▆▇▁▄▆▄▇▁▆ - ▅▃▃▁▅▁▃▅▂▅▇ - ▁▁█ ▂ ▅▁▂▇▃▃▃ - ▆▃▂ █▁▁▁▁▆█ ▅ - ▁▁▅▁▅▃▁█▁██▄▁▇▆ - ▁█▁▆▁▁▁▁▁▁▁ ▃▁ - ▃▁▁██▃█▁▆▁ ▆▅▁▅ - ▁▁▁▁▁▂▁▁▁▃█▁ ▂▁ - ▁▁▁▁▁▁▁▁█▁▁▁ ▆▅▁ - ▁▁▁▁▄▅▁▁▅ ▃▇▁▁▁▁ - ▁▁█ ▃▁▅▁▅▅▆▁▅▅▁▁ - ▁▁▃▁▅▆▃█▃▂▃▃█▃▃▁ - ▁▁▁▁▁▃█▁▅▅▄▇▄▄▁▁ - ▁▁▁▁▁ ▁▇▁▁▁▁▁█▁▁ - ▁▁ ▃ ▁▁█▁█▃▃▁▇▁▁ - ▁█▃█▁█▁▁▁▃▃▅▃▂▁ - ▁▆ █▁█▁▃ ▁▁▁▅▃ - ▁▁▁ ▃▆▃▃▆▇▁▅▁▁ - █▁▅▃▅▆ ▄▁▁▅▁▁▆▁ - ▁▁▇ █ █▇▅▂▁█▁ - ▆▃ ▆ ▃█▁▇▄▅▅ - █▅▁▅ ▃▂▃▂▅ - ███▂███▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_076.txt b/codex-rs/tui/frames/hbars/frame_076.txt deleted file mode 100644 index e2f5798a27..0000000000 --- a/codex-rs/tui/frames/hbars/frame_076.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▇▇▇▄▆▇▇▁▂▂ - ▇▃▅▁▁▃▃▃▇▂▅▇▃ - ▁▁▅▁█▃▅▁▃▁█▇▆▃▃ - ▁▅▂▅▅▅▃▁▇▅█▃███▁▆ - ▆▇▄▁▂█▅▅▁▁ ▆█▃▅ - ▁▃▃▅▅ ▂▆▅▇▂ ▃▁▆ - ▃▁▅▃▂▆█▁▁▃▇ ▃▁▁ - ▁▁▃▂▅▁▁ ▁▁▁▇▄ ▅▁ - ▁▁▃▇▁▁▂▂▃▃▂▁▁ ▆▄▁▁ - ▃▁▁▁▁▁ ▂▁▃▆ ▁▁▂▁ - ▁▁▁▁▁▅ ▅▁▂▁▆▁▁ ▁▅▃▁ - ▁▁▁▁▁▅ ▃▅▂ ▁▃▁ █▁▃▁ - ▁▁▁▁▁ ▅▁▁▃▄▇▆▄▁▁▁ - ▁▁▁▁▁ ▅▁▄▂▆▁▁▂▅▁█ ▁▁ - ▁▁▁▁▁ ▃▃▁▁▂▃▇█▅▁▇▅▁▁ - ▁▁▁▁ ▃▃▁▁▇▃▂▃▆▁▃▁▅▁ - ▁▁▁▁ ▃▁▅ ▁█▁▃▇ - ▇▁▁▁▁▁ █▁ ▅▅▃▇▁█ - ▁▃█▃▆▁▁▇▅▆ ▆▁ ▁▆▃ - █▆▃▅ ▁▁▃▃▁▅▇▄▁▃▇█ - █▁▆▅ ▂▃█▆▆▇▅▅▃▅ - █▃▇▇ █▇▂▇▂▂▄█ - █▂▂█▂▇█▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_080.txt b/codex-rs/tui/frames/hbars/frame_080.txt deleted file mode 100644 index 566ad33bac..0000000000 --- a/codex-rs/tui/frames/hbars/frame_080.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▆▄▇▁▂▆▄▇▁▂▂ - ▅▇▇ ▇█▁▁▇▂▆▅▁▇▆ - ▁▂█▅▆▅▆▁ ▇▇█▇▇▇▆▃ - ▅█▁▁ ▅▅▁▆▅▆▂█▂ ██▃▃ - ▁█▅▁▁▆▆▁▃▇ ▅▃▁▆ - ▅▅▁▆▅▅▂▃█ ▂ ▃▅ - ▁▁▅▃▃▁▆▁▇ ▂▇▂ ▃▅▁▆ - ▄▁▁ ▁▁▇█▇▁ ▃▄▁▃ █▁▅ - ▁▃▁██▁▂▁▁▂ ▅▃▂▆▅ ▁▁ - ▃▁▁▁█▁▁▁▁ ▃▁▁▃ ▁▅▁ - ▁▁▁▁▁▂▂▁▁ ▅▅ ▅ ▅▇▅▁ - ▁▁▁▁█▁▂▁▁ ▁▃▁▂ █▁▁▁ - ▁▅▁▁▂█▁▁▁ ▅▂█▁▄ ▇ ▅▂▁▁▁ - ▁▁▁▁▁ ▅▁█ ▁▄▁█▂▁ ▇ ▂▂▁▃▁ - ▁▁▁▁▅ ▇▁ ▇▂ ▅ ▂▁▅ ▅█▁▁▇ - ▁▁▁▁▁ ▇▁ ▅▇▅ ▂▁▁▁▃▁ - ▁▁▁▁▁█▁▁ ▅▁▁▁▂ - ▄▃▁▁▃▅█▁▇▂ ▅▃▃ - ▇▁▆ ▂▁▃▃▃▃▂ ▂▁▇▂ - ▃▃▂ ▃▃▃▃▃▇▆▇▇▂▂▁▆▇▅ - █▁▂ ▇▄ ▇▄▇▅▇▂▇ - ▇▃▂ █▇▂▇▆▂▂▄▇▂ - ▂█▂▂▂▂██▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_084.txt b/codex-rs/tui/frames/hbars/frame_084.txt deleted file mode 100644 index 7b060ddd0b..0000000000 --- a/codex-rs/tui/frames/hbars/frame_084.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▆▄▇▂▆▄▇▇▇▇▆ - ▂▁▇ ▄█▁▁▇█▂▄▅▂▇▃▂ - ▂▁▇▂▂▅ ▅▅▂▇▇▇█▇▇█▃▁▃ - ▆▅█▆ ▃▇▆▇▆▇▅ ▂▂ ▃█▃▁ - ▆▅█▆ ▁▅▆▁▁▇ █▁▁ - ▁▅▂▆▅██▅▃▇ ▂ █▃▆ - ▁▁▁▅▃▁▆▁▁█ ▇▂▃ ▅▁▃ - ▁▁ ▅▁▂▂▁▆ ▁▆▃▂▃ █▅▁▆ - ▁▇▁▅█▁▁▇█ ▃▅▂▁▃ █▁▃ - ▁▁▁▁▁█▄▁▁ ▃▃▅▆ ▁▁▁ - ▁▅▁▁█▃▁▇▁ ▆ ▃▁▇▃ ▁▁▃ - ▁█▂▆█▂▂▁▁ ▁▃▇▆▂▁ ▂▁▅ - ▁█ ▂▆▁▅▁▁ ▇▅▂▇▃▇▄▄▇▇▃▂ ▂▂▁▅ - ▁▁ ▃▂█▁▁▁▁ ▅▅▅▃▅ ▇▁▇█▂ ▁▁▁▁ - ▁█ ▇█▁▁▂▁ ▂▅ ▁ ▂▁▇▁ ▇▇▅█▁ - ▁ ██▇▁▇ ▁▅ ▃▁▁▂ - ▃▃ █▃▁▂▁▆▁ ▆▁▆▁▆▁ - ▃▁▃ █▂█▃ ▃ ▁▅▂▃▃▂ - ▁▁ ▃█▁▃ ▁▂ ▅█ █▁▇▅ - ▃▃ ▂█▅▁▃▂▇▂▂▂▇▇▂▅▄▁█▅ - ▇▁▂ ▂▃▂▃▁ █▇▇▇▇▇█▆█ - ▇▇▂ █▇▂▇▃▂▂▂▂▅▇ - ▂█▂▂▂▂██▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_088.txt b/codex-rs/tui/frames/hbars/frame_088.txt deleted file mode 100644 index 9445aa3071..0000000000 --- a/codex-rs/tui/frames/hbars/frame_088.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▅▆▄▁▂▄▇▄▄▇▇▆▂ - ▆▅▃ ▇▄▅▁▅▇▂▂▄▃▄█▇▆ - ▂▅▂▅ ▆▇▆▇▂▇▇▇▁▁▇▁█▁▄▇▆ - ▅▁ █▅▅▅▅▅▄▇▁ █▁▆▂█▃▁▃ - ▅▃█▂▅▇▅█▇ ▃▅▂▃▁▃ - ▅▁▅▅▆▅▅▄▃ ▂ ▇▇ █▁▁ - ▂▁▃▃█▁ ▆▅ ▁▇▄ ▃ ▃▁▆▆ - ▁▁▂▅▅██▁ ▁▆▇▆ ▃ ██▁▁ - ███ ▁▂▃ ▃▅▂▇▁▃▂ █▃▁▅ - ▁▁▁▁▁▄▄▁ ▅▇▅▃█ █▅▁▁▁ - ▁▁▁▁▁▁▁▅ ▄ ▂▅▁▃▁ █▅▁▁▅ - ▁▂█▁▁▁▁▁ ▅▇▁▅▂▂▆█ ▅▁▁▃ - ▁▁ ▁▅▁▁▁ ▁▁▂▇▅▁▇ ▇▇▇▃▂ ▄▁▁█ - █▅█ ▇▅▁ ▅▅▅▅▇▅▅ ▃▇██▁▅ ▁▁▁▁▁ - ▁ ▅ ▁▁▂ ▂▁▁▆ ▃▇▇▇▅ ▁▇▇ - ▇▅▅ ▁█▁█ ▃▆▂ ▁▁▅▅ - ▁▆ ▃▁▃▃▆▃▆ ▂▇▅▅▁▃▂ - ▇▅▃█▆█▁▆▃▆ ▄▇▅▅▃▃▅ - ▁▄▃▃▆▃▁▆▇▃ ▂▅▂▆▁▆▁▅ - ▁▄ ▃▃▃▃ ▇▇▆▂▂▄▇▂▁▁▁▇▃▇ - █▁▂▂█▃█▃▁ █▇▄▇▇▇▇█▂▅▂ - █▇▆ ▂▇▆▇▇▄▂▂▂▂▇▇▂ - ██▂▂█▇██▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_092.txt b/codex-rs/tui/frames/hbars/frame_092.txt deleted file mode 100644 index 8a16e4ab56..0000000000 --- a/codex-rs/tui/frames/hbars/frame_092.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▆▆▄▇▂▇▇▇▇▄▁▆▂ - ▂▇▁ ▇█▁▇█▇█▂▄▅▁▄█▇▃▆ - ▂▅█▂▅▆▇█▇█▂▇▇▇▁▁█▇▇▇▅▂▃▆ - ▅▇▆▅▄▇▃ ▇▆▇ ▃▅▂▇▇▁▆▃ - ▁▂▅ ▆█▂▄ ▁▅ ▇▃▃ - ▁▁▂▂▃█▆ ▇▂▄ █▇▁▁ - ▅▇█▇▁▅▂▆ ▅▁▇▃█ ▃▅▃▁ - ▂▁▅▆▁▁▄▁ ▁▅▆▇▃ █▁▅▂ - ▁▂▁▁ ▁▂█ ▁▆▆▇▃▂▃ ▁▁▁ - ▁▁▁ ▆▁▁ ▁▆▅▇▃ ▅▁▁ - ▃▁▁▁▁▃▁ ▅▄▄▂██ ▁▁▅ - ▃▁▁▂▁▁▁ ▅▅▅▅█▅ ▁▇█ - ▁▁▁▅▁▁▁ ▅▃▅▅▅▅▅▂ ▄▄▇▇▇▇▁▄ ▆█▁▇ - ▁▁▁▁▇▃▅ ▄▅▅▅▅▁█ ▇▄▇█▇▁█▂ ▆▁▁▃ - ▇▁▁▁▃▁▁▆▃ ▇▆▁ ▃ ▇▁▇▄▇▄▁▇ ▁▃▇▁▁ - ▇▂▁▁▁▅▅ ▁ ▇▃▆▂ ▂ █ ▁▁ - ▇▆▃▃▆▇▃█▁ ▆▇ ▁▃▃▅ - ▇▁▃▃▃▆▃▃ ▁ ▁▂▅▆▁▅ - █▁▂▃▃▃▁▃▂▇▆ ▂▄▇█▂▅▅▇▅ - ▃▂ █▆▁▁▆▂▇▇▂▂▂▂▇▇▇▆▁▇▇▇▆▇ - █▃▂▃▃▁▃▆▆ ▂▇▇▇▇▇▇▇▇▂▂▇ - ▇▇▂▂▇▆▇▁▆▂▂▂▂▂▆▇█ - ▂█ ▂▂█▇██▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_096.txt b/codex-rs/tui/frames/hbars/frame_096.txt deleted file mode 100644 index af4c3cfc2f..0000000000 --- a/codex-rs/tui/frames/hbars/frame_096.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▂▇▁▆▇▇▇▇▇▁▂▂ - ▂▆█▂▇▁▁▇█▁█▂▄▆▅█▁█▇▇▆▂ - ▂▅▃▅▅▇▇█ ▂▂▅▇▇▇▁▁█▇▇▄▃▆▇▃▂ - ▅█ ▆▆▁▂ ▃▆█▇▇▄▇▃ - ▁ ▅▁▅▅ ▇ ▅▇▆▃ - ▁▅▅▅▁▅█ ▆▇▂█ ▇▃▃ - ▇▄▄▅▁▆▅ ▅▅█▃▂ ▇▇▃▁ - ▄▅▆▄▁▃▆ ▁▁▅█▁ ▂█▁▅▆ - ▇▃██▇▁ ▁▆▁▅▁ ▃ ▁▁▁ - ▂▁▁▁▂▁▃ ▃▃▃▃▁▂█ ▁▁▅ - ▁█▁█▅▁▁ ▆ ▃▇▁▁▁▆ ▅▁▁▁▁ - ▁▁▂█▁▁▁ ▁▅▄▂▅ ▅▃█ ▁▆▁▁▁▁ - ▇▁▁▁▁▁▁ ▁▅▆▆ ▅█ ▄▇▇▇▇▄▄▃ ▂█▁▇▅▂ - ▆▁▁▁▁▆▆ ▁▆▆▇▂▄█▅ ▁▂▇██▁▇█ ▁ ▃▁▅ - ▁ ▁▁▁▁▁ ▇▅▅ ▆▂ ▃▁▇▇▇▄▇ ▁█▅▅▁▆ - ▃▁▃█▆▆▆ ▁▂▆█ ▄▇█▁▁▁▂ - ▇▃▃▁ ▅▅▂ █▄▇█▁▆▃▅ - ▃▁▃▇▁▃▁▂▇▅ ▂▅█▄▇▆▁▅ - ▇▃▃▃▆▁▃▄ ▇▆▅ ▂▇█ ▁▇▇▅▅ - ▃▂ ▃▇▁▃▂█▇▇▄▂▂▂▂▇▇▇▄▂▇▁▅█▁▂ - ▃▂ ▃▇▇▁▆▆▂▇▇▇▇▇▇▇▇▇█▂▇█ - █▇▆▂▃▅▂▁▆▂▂▂▂▂▂▄▇▇▂ - ▂█▂▂▂█▇██▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_1.txt b/codex-rs/tui/frames/hbars/frame_1.txt new file mode 100644 index 0000000000..ab8be3eb1e --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_1.txt @@ -0,0 +1,17 @@ + + ▂▅▂▅▄▇▇▄▄▇▆▂ + ▂▄▆▅▇▃▇▅▇▃▄▁▁▄▂ ▂█▇▂ + ▆▁▇▁▇▇▇█▃▂ ▂█▇▂█▁▄▁▁▁▇ + ▄▇▂▃▇█▆▆▂ ▅▇▁▄▁▆ + ▃▃▄▅█▃▁▃▂▃▃ █▅▁▃▃▆ + ▁▇ ▇▂ ▁▇▅▄▁▁▆ █▅▃▁▁▆ + ▇▃█▆▇ █▃▁▇▅█▁▂ ▁▅▁ + ▁▁▂▁▂ ▆▅▅▁▄▁▇ █▂▁ + ▁▄▁█▂ ▄▁▁▃▃▁█▅▁▇▇▇▇▇▇▂▇▆ ▄█ ▁ + ▂▁▄▇ ▂▄▇▂ ▅▇ ▁█▁▂▂▂▅▅▆▆▆▁▅▆▅▆▁ + ▃▃▂█▃ ▃▃▆▅▅▂ ▂▃▇██▇ ▃▇█▅▆▄▂▅ + ▇▃▆ █▆ ▂ ▆█▅▇▂▁ + ▃▃▆▂▃▇▂ ▂▄▂▇▁▂▇█ + ▃▇▆▃▂ ▇▇▅▄▄▄▄▅▄▇▇▂▆▁▇ + ▂▇█▇▁▁▁▂▂▂▆▂▄▇▇█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_10.txt b/codex-rs/tui/frames/hbars/frame_10.txt new file mode 100644 index 0000000000..5e565ce40b --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_10.txt @@ -0,0 +1,17 @@ + + ▂▇▇▇▇▃▇▇▂ + ▇█▂▇▇▇▃▁▅▂▇▆ + ▃▂▆▁▁▅▁▁▆▁▇▃▆▆ + ▁▂▂▅▃▁▄▂▅▃▆██▃▃▆ + ▅ ▄▁▁█▁▃ █▆▅▂▅▁▅ + ▁▂ █▁▇▁▅▅▃ ▂▂█▁ + ▃ ▁▇█▇▁▁▁▁▇ ▁▅▆ + █ ▁▁▃▇▅▇▁▁▆▂▂▅▃▁▁ + █ ▁▃ ▃▃▁▄▁▁▇▃▇▄▁▁ + ▁ ▆▁▃▆▁▂▅▂▇▂▂▂▁▇▂ + ▆ █▁▁▁▁▁██ ▃▆█▃▁▂ + ▃▂█▆▃▆▇█ ▂▁██▆▅▅ + ▁█ ▁▁▁▁▇▆▅▆▅▁▅▂ + ▄▂▇▇▅▁▇▄▂ ▅▅█ + ▇▆ ▂▇▃▂▆▄▇ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_100.txt b/codex-rs/tui/frames/hbars/frame_100.txt deleted file mode 100644 index cc7ebc1abe..0000000000 --- a/codex-rs/tui/frames/hbars/frame_100.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▅▂▂▇▄▇▇▇▇▇▇▇▂▂ - ▆▇▂▆▄▅▇▇▂▅▇█▂█▅▂▁█▇▇▇▂ - ▂▇▃▂▅▇▇▅▅▅▂▆▇▇▇▄▁▁▇▇▇▄▃▁█▇▆ - ▅█ ▅▅▄▅▅ ▁▆▇▃▄▅▇▆ - ▂▁▆▂▆▇▇▇▂ ▃ ▇█▅▇ - ▂▁▂▁▅▅▆ ▆▄▂ ▅▃▆▁ - ▁▅▃▅▅▃▅ ▅▁█▁▂ ▅▃▃▆▁ - ▅▅▅▁▁▅▂ ▇▁▂▃▁▂▂ ▂▃▆▁▃ - ▁ ▅▆▇▁ ▇▃▆▂▇▄ ▃ ▁▁▁ - ▁▂▁▁█▁▁ ▇▁▃█▇▃▅█ ▁▆▁▆ - ▁ █▁▁▃▇ █▁ ▂▅▃ ▃▇ ▁▁▃▁ - ▁▂█▃▂▃▁ ▅▃▃▇▅ ▂▁ ▁▁█▁ - ▁ ▂█▁▁▂ ▁▃▂█▅▂▂▅ ▄▄▄▄▄▇▇▄▇▄▂▂ ▃▁▅▁▁ - █▂ ▁▁▁ ▁▂▆▆▇▁▆▅ ▁▁▅▇█▇▁▄▂▂▂▁ ▁▁█▂ - ▁▅█▁▃▅▂▃ ▁▇▅▁ ▂▇ █▁▇▁▇▄▄▇▇▄ ▅▁▃▃▄ - █▃▁▁▁▇▃ ▁ ▁▃▆█ ██ ▂▅▅▇▂ - ▃▁▁▁▁▃▁ ▁▂ ▅█▆▇▁▁▅ - ▃▄█▃▁▁▃▂▇▆ ▅▁▂▇▂▂█▅▅▅ - █▆ ▇█▁▁▅█▁▂ ▂▄▇█▂▇▆▁▆█ - ▇▂ ▇▇▁▇▂█▁▁▄▇▂▂▆▆▇▇▇▁▂▇▇▇▁▅▅ - ▇▆▂▇▇▁▄▂ ▇▁▇▇▇▇▇▇▇▇██▆▇▂ - ▂▇▅▂▇█▇▇▃▄▂▂▂▂▂▆▆▇▇█ - ▂ ▂█▇▇██▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_104.txt b/codex-rs/tui/frames/hbars/frame_104.txt deleted file mode 100644 index 25d7f9ccf4..0000000000 --- a/codex-rs/tui/frames/hbars/frame_104.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▅▆▄▇▄▇▇▇▇▇▇▇▂▂ - ▂▇█▆▁▅▇▇▂ █▇▇▇▆ - ▆▇▂▅▇▇█ ▂▆▄▇▇▇▄▁▁▇▇▇▄▆▁▁▇▇▂ - ▆▇▅▅▅▃▆█▂▆▇ ▄▂▇▁▆▃█▃▂ - ▅ ▄▆▇▆█▆▅ ▇▁▅▅▃▃▇▃ - ▇█▅▇█▅ ▅ ▄▄▃▃ ▃ ▁█▅▃ - ▁▇▅▁▂▅█▁ ▅▄█▇▆▃ █▃ ▁▅▅▃ - ▁▃▃▃▅▆▅▅▂ ▃▃▆▂▃▃▃▂ ▂ ▃▅▃▆ - ▁▄▁▃▁▃▂ ▇▁▃ ▇▁█▁ ▃ ▁▁▃▇ - ▁█▁▁▁▁█▁ ▆ ▁▁▆▅▁▂▁ ▁▅█▆ - █▁▇█▁▁ ▁ ▂▃▅ ▁▇ ▅▁ █ ▁▁ ▁ - ▁▁▂▅▁▁ ▁ ▂▇▆▅▄▂ ▅█ ▁▅▁▁█▁ - ▃█ ▁▁▁█▁ ▆▇▅▅▁█▅▁▂ ▄▇▇▄▇▇▇▄▄▆ ▃▁▁▁▆▁ - ▂▂█▇▅ ▆ ▅▂▆▁▅ ▂▁ ▇▅▃▇█▇▁▄█▂█ ▅▇▁▃▁▂ - ▃ ▁▁▁▁▆▁ ▇▆▅▁▂▂ ▁▇▇▁▁▄▄▇▇▇ ▂▁▁▁▁ - █▁▂▃▃▃▁█▁ ▇▅ ▂▃▁▃▂ - ▃▂▃▅▃▁▆▃▁▂ ▂▅▂▅█▅▇█ - ▇▄█▁▁▃▆ ▁▆ ▂▄▇▂▇▅▁▁█ - █▃ ▇▇▁▄▂█▁▆▂ ▂▇█▂▅▃▇▇▅▂ - ▇▄ ▇▇▇▄▂█▁▇▇▇▇▆▂▆▆▇▇▇▁▂▄▇▆▁▇▆▇ - █▇▂▃▇▃▇▂▂ █▇▁▇▇▇▇▇█▇▇▁▇▁▅█ - █▁ █▇▁▇▇▆▂▂▂▂▂▂▆▂▇▇█ - ▂ ▂██▇▇██▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_108.txt b/codex-rs/tui/frames/hbars/frame_108.txt deleted file mode 100644 index f66a23e634..0000000000 --- a/codex-rs/tui/frames/hbars/frame_108.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▅▂▄▄▇▇▇▇▇▇▇▇▆▂▂ - ▆▄▁▇▇▇▇█ █▇▆▂ - ▂▅▇▇▁▇▄▅▅▅▂▇▇▇▁▁▁▁▁▇▇▇▇▃▂▄▇▇▆ - ▂▅▇▅▅█▄▂▆▄▇ ▃▆█▇▇▁▁▇▆ - ▅▂▄▆▇▁▂▆▁ ▇▅▃▇▇▅▁▂ - ▁▁▅▁▆▇█▁▁ ▆▇▁▃ ▆ ▁▃▃▃▆ - ▁▃▅▁▆▇▃▁ ▃▄▅▅▁▇ ▂▃▃▃▁▃▇▆ - ▅▇▁▃▃▅█▁ ▇▁▄▃▇▃▂ ▃▃█▃▃▁▂ - ▁▁▁▁▁▅▁ █▁▄▂▁▁▆ ██▃▆▂▁ - ▁▁▃▁▁▅▅ ▅▇▁▃▇▃▃▇ ▂▁▅ ▁▁▁ - ▇▇▁▂▁▅▁ ▁ ▁▁▆▅▁▁ ▅ ▁▅▃▆ - █▂▁▂▁▂▁ ▅▃▆▆▇█▆▁ ▅▅▁▃ ▁ - ▃ ▅▁▁▆ ▁ ▂▇ ▅▅▅▅▅▅ ▆▇▄▄▇▇▇▇▇▇▄▇▆▆ ▁▄▁▁▂▂ - █▂ ▁▁▁▃▁ ▇▃▇▅▅█▅█ ▆▁▁▃▇█▇▇▄█▂█▇█ █▁▁▁▁ - ▁▆▃▃▁▅ ▁▂ ▆▁▅▆▅ ▃▃▇▇▁▁▄▄▇▇ ▁▁ ▅ - ▁█▁▆▅▆▇▃▅ ▆▂▅▅▁▅▁█ - █▃▇▁▅▁▂█▃▂ ▂▄▇▂▅▅▁▆▂ - █▇█▁▁▁▆ ▁▆ ▂▇▂▅▄▄▄▅▂ - ▃▂▃▇▁▃▆█▁▇▂ ▅▇▂▁▇▁▇▃▇ - █▇▂▇▁▇▇▂█▃▇▇▇▇▇▂▂▆▄▇▇▇▁▂▄▇▁▇▂▂▅▂ - ▇▆█▇▁▁▂▃██▇▁█▇▇▇▇██▇▇▁▃▂▇▇ - ▇█▅▇▇▁▁▇▄▂▂▂▂▂▂▄▇▇▇█ - ▂ ███▇▇██▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_11.txt b/codex-rs/tui/frames/hbars/frame_11.txt new file mode 100644 index 0000000000..5305252a8d --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_11.txt @@ -0,0 +1,17 @@ + + ▆▇▇▇▇▇▇▂ + ▅█ ▄▁▁▁▃▃▆ + ▅█▂▂▁▁▄▃▇▅▃▆ + ▁▂▂▁▁▄▄▆▂▄▅▅ + ▂█▅▄▃▁▇▃█▄▂▁▁▆ + ▁▇▂▁▁▇▂▄▄▁▂▅▁▁ + ▇▇ ▆▁▁▁▁▁▁▂▁▄▃ + ▁ ▁▁▅▁▁▃▅ ▁█▁ + ▅ █▁▅▁▁▇▅▇▁▂▁ + ▇▇ ▂▁▅▄▆█▅▁▂▁▃ + █▂▆ ▁▁▁▁▄▅▁▃▃▁ + ▃▂▆▅▁▂▇▅▇▇▄▁▂ + ▂ ▇▁▃▃▃▂▁▄█ + ▃▇ ▇▁▁▆▂▅▇▂ + ▃▂ █▇▇▂▇▂ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_112.txt b/codex-rs/tui/frames/hbars/frame_112.txt deleted file mode 100644 index b7c8b0fd18..0000000000 --- a/codex-rs/tui/frames/hbars/frame_112.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▂▂▂▄▄▇▇▇▇▇▇▇▇▆▂▂ - ▂▅▇▆▅▁▇█▆▃██ █▇▇▂ - ▆▇▆▁▇▄▇█▆▂▆▇▅▇▇▄▁▁▁▇▇▇▇▇▂ ▇▇▂ - ▆█▅▇█▇█▄▄▇▇▁▃ ▆█▇▇▄▆█▃▂ - ▆▇▁▁▇▆█▆▁ ▇▇█▇▆▆▇▃ - ▅▅▅▁▂▇ ▅ ▄▆▆▆▂ ▃▄ █▃▃█▁ - ▅▃▅▅▆▇▂▁▂ ▃▃▂▃▇▇▂ ▇▃ ▃▁ ▁ - ▆▅▁▃▃▇█▁ █▁▃▃▅▆▇▅▂ ▇▃ ▃▁ ▁ - ▁▁▁▁▁█▅▂ ▇▃▂█▃▃▂█ ▃▅ ▁▁█▆ - ▂▁▁█▁▂▅▁ ▂▇▁▂█▃█▆█ ▁ ▁▁▂▁ - ▁▃█ ▁ ▃ █▇▂▅▃ ▅ ▁▆▃▁▅▁ - ▁▂▁▂▁ ▃ ▂▇▂▇▅ ▅▇ █▅▁▁▁▁ - █▂ ▃▁▂ ▁ ▅▁▆▁▃ ▂▁▂ ▆▄▄▄▇▄▄▇▇▄▇▇▆▂ ▃█▁▁▂▁ - ▆ ▁▁▁█▁ ▂▅▅▅▇▂ ▄▇ ▃▁▁▄▇▇█▇▇▇█▂▁▇▁▆▁▂▁▃█▁ - ▃▆█▃▇▅█▁ ▁▁█▅▅█ ▇▄▂▇▁▇▇▄▄▇▇▇▇▅▂▁▄▁▅▂ - ▃█▁▅▁ █▃ ▅▃▂▃▇▂▅ - ▃▇▁▁▃▂▃▇▂ ▂▅▂▅▆▅ ▅ - ▃▅▁▁▁▂▆▃▃▂ ▂▇▇▆▇▅▁▆▇ - ▇▆█▁▁▄▆█▄▇▇▂▂ ▂▆▇█▁▇▅▁▃▅▂ - ▇▆▃▇▁▃▆▅▇▁▇▇▇▇▇▂▂▆▄▇▇▇▁▂▇▇▁▇█▂▇█ - █▇▂▁▁▃▂ ▂ █▇▁█▅▇▇▇██▇▇██▂▇▇▂ - ▂▂▅▇▇▇▁▇▇▆▂▂▂▂▂▂▄▇▇▇▇▂ - ▂ ██▇▇███▂ - - diff --git a/codex-rs/tui/frames/hbars/frame_12.txt b/codex-rs/tui/frames/hbars/frame_12.txt new file mode 100644 index 0000000000..cebfe226e1 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_12.txt @@ -0,0 +1,17 @@ + + ▇▇▇▇▇▅ + ▆▄▂▂▅▁▆▃ + █ ▁▅▃▇▆ + ▅▇▁▁▁▄▄█▁ + ▁ █▁▁▁▁▅▅▁ + ▁█▅▅▇▃█▂▁█ + ▁ ▁▅▃▁▁▃ + ▁ ▅▇▃▁▁█ + ▇▆ ▁▅▁▁▇▁▁ + ▁ ▅▁▇▄▇▂ + ▁▅ ▁█▄▇▇▅ + ▆ ▇▁ ▂▆▁ + ▅ ▇▇▁▆▇▃▁ + █▃▅█▆▁▃▁▂ + ▃ █▁▃▅▅ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_13.txt b/codex-rs/tui/frames/hbars/frame_13.txt new file mode 100644 index 0000000000..566cc4ffa3 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_13.txt @@ -0,0 +1,17 @@ + + ▅▇▇▇▆ + ▁▂▂▁▁ + ▁▂▂▁█ + ▁▇▇▁▂ + ▇ ▁▁ + █▅▆▁▁ + ▆ ▁▁ + ▇ █▁ + ▅▇ ▂▁▅ + ▁█ ▇▄▁ + █▂▅▅ ▁▂ + ▁▂▂▂▁ + ▁▇▆▁▂ + ▇▂▂▁▄ + ▆ ▅█▄ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_14.txt b/codex-rs/tui/frames/hbars/frame_14.txt new file mode 100644 index 0000000000..380790e11c --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_14.txt @@ -0,0 +1,17 @@ + + ▇▇▇▇▄ + ▆▅▂▂▅▃ + ▁▂▁▁▅ ▁ + ▁▁▅▁█▃▁▆ + ▁▁▁▃ ▁ + ▁▇▁▁ █▁ + ▁▁▁▁ ▅ ▇ + ▁▁▃▁▂ ▃ + ▁▁▁▁ █ + █▃▅▅ ▄▅ + ▃▁██▆▅▆▁ + ▁▇▁▁▂▂▂▁ + ▅ █▁▄▄▄▂ + ▁▃▅▇▂▂▅ + ▂▇ █▄▅ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_15.txt b/codex-rs/tui/frames/hbars/frame_15.txt new file mode 100644 index 0000000000..47d169e98b --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_15.txt @@ -0,0 +1,17 @@ + + ▇▇▇▇▇▁▂ + ▂▆▄▁▁▃▅▇▆ + ▅▅▁▇▄▃▁█▇▁ + ▁▅▂ ▅▅▆▅▂▂▁ + ▁▁▄█▄▃▁▁▅█▃▁ + ▃▁▁▆▁▁▅▅▁ █ + ▁▁ ▁▁▁▁▁▁▆▁ + ▁▁▅▁▁▇▁▁▁ █▆▁ + ▁▁▇▆▆▇▁▁▁▂▅▅▁ + ▁▂▁▄▅▁▃▁▇▅ ▅▁ + ▁▅▁▁▁▁▂▁ ▂ ▄ + ▁▇▇▅▃▁▁▃▆ ▄ + █▁▃▆ ▅▅▅▂ ▄▂ + ▁▃▁▁▃▃▅▇▃▅ + ▃▃▇▃▂▂▂▅ + ▂▂ \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_16.txt b/codex-rs/tui/frames/hbars/frame_16.txt new file mode 100644 index 0000000000..3b1fb1fc5d --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_16.txt @@ -0,0 +1,17 @@ + + ▂▄▇█▇▇▇▁▂ + ▅▃▁▁▇▁▁▃▁▄▃ + ▁▅▅█▃▅▄▃▁▁ █▃ + ▅▅▅ ▄▇▂▃▁▃▁▁▇▇▁ + ▁▁▄▂▅▇█▄▁▁▇▅▁▂▃ + ▁▁▁▇▁█ ▁▃▄ ▁ ▁▅▁ + ▃▃▁ ▅▂▆▁▁▁▁▅▇█▆ ▁ + ▁▅▄ ▁▂▁▁▅▁▁▁█▄ ▂▁ + ▃▃▁▁▁▇▁▅▃▁▁█▇▇ ▅ + ▇█▂▂▆▄▄▃▇▁▅▂▁ ▆▂▁ + ▁▁▁▇██▅▇▃▁▄█▄▅▁▁▂ + ▁▁▇ ▁▂ ▂▅▅▆ ▅ + ▃▁▇ ▁ ▅▆▅▂▆▁ + ▃▁▁█▂▇▁▅▅▇▂▁ + █▅▅▂▄▅▂▂▄▇ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_17.txt b/codex-rs/tui/frames/hbars/frame_17.txt new file mode 100644 index 0000000000..93817e2ead --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_17.txt @@ -0,0 +1,17 @@ + + ▆▄▇▇▇▄▄▁▆▂ + ▂▄▇▇▁▁▁▇▄▇▁▆█▃▆ + ▆▇▃▅▂▄▄▂▇▆█▁▁▁▂█▃ + ▅▁▅▂▅▁█▂▂ █▁▄▃▁▁▁▄▃ + ▁▅▂ ▁ ▁█▅▃▄▃▅▅ ▆ + ▂▄▇▆▅▂ ▆▅▅▁ ▅▆▄▅▁▅▅ + ▇ ▄▅▁ ▆▅▅▁▂ ▇█▁▁▅▄▁ + ▆█▄▁ ▅▅▁▁▅▁▆▁▁▄▄▇ + ▆▅▇▅▃▄▄▇▁▃▂▁▃▃▅▃▁▁▁ ▁ + ▁█▂▄▂▂▁▅▇▃▅▁▁▃ ▃▇█▇▃ + ▃▃▃▅███▇▇▇▇▃▂▁▇▅▅▃ ▃█ + ▃▁▁▂▇ ▂▅▁▁▂ ▄ + ▂▃▃ ▇▃▂ ▆█▆▅▃▂▅ + ▆ ▁▇▇▄▃▇▂▂▄▇▅▁█ + ▂▇▄▅▂▆▇▁▇▂▇▇ + ▂ \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_18.txt b/codex-rs/tui/frames/hbars/frame_18.txt new file mode 100644 index 0000000000..03d2c5e94b --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_18.txt @@ -0,0 +1,17 @@ + + ▂▄▄▇▄▄▇▄▁▆▂ + ▂▇█▂▄▆▇▇▁▂▂▆█▇▄▄▂ + ▂▅▅▁▇█▇▄█▆█▅▂█▇▅▅▃ ▇ + ▆▁▁▇▅▆▃█▇ █▃▂▂▅▄▁▃▄▃▃▃▆ + ▂▃▅▅ ▅▁ ▂█▇▂▃▅▁▅▁▂▃▄▃▃▂ + ▅▃▁ ▆▆▁▅▂▂▂▅▆▇▆▁█▆▅▃▅▂▅▁ + ▁▁▃▅▅ ▇▅▇▅▁█▂▅█▇▁▄▁▄▆ + █▃▆▁▁ ▃▃█▁▁▄▃ ▁▄▁█ + ▃██ ▆▃▄▄▄▄▄▇▁▁▆▁▇▅▃▆ ▁▇▁▂ + ▂▃▃▁▇▃▇ ▁▁▅▂▂▃▂▁▁▁▂▄▁▂▃ ▆ + ▁▅▁▃▂██▇▇▇▇▇▂ ▃▂▂▅▁▅▇▅▂▆▂ + ▃▃ ▆▃▆ ▂▂▇█▅▇▂█ + ▃▃▇▇▃▃▅ ▂▇▃▂▅▃▆▂ + █▁▅▇▇▇▇▄▄▄▃█▇▂▅▂▆▇ + █▁▁▂▅▂▂▆▅▇█▄▇█ + ▂ \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_19.txt b/codex-rs/tui/frames/hbars/frame_19.txt new file mode 100644 index 0000000000..f826776170 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_19.txt @@ -0,0 +1,17 @@ + + ▂▂▄▄▇▁▇▄▄▁▅▂ + ▂▇▁▁▁▃▅▄▄▄▂▇▂▆▁▇▆▆ + ▆▇▄▄▅█▁▇▇▂ ▂▇▅▆▂▇▄▃ + ▅▄▁▇▆▃▂ ▂▄▄▇▆▃▁▇▆ + ▁▁▅▂▅▂ ▆▁▃█▅█▁▃ ▁▃▆ + ▁▃▅▇█ ▂▁▇▁▅ ▅▅ █▅▇▁ + ▃▄▁▁█ ▅▇▃▅▁▇▆▂ ▅▅▅▇▁ + ▁▁▁▁ ▁▄█▃▁█▆ ▁ ▁▁▁ + ▁▇▁▃▆▄▄▄▄▄▄▁▁▁▁▇▇▄▇▁▄ ▃ █▁▁ + ▃▄▅▆▁▄▇▅▃▇▇▃▆▂▆ ▃▂ ▅▃▂▃▆▅▅▁▂ + █▃█▅▇▁█████▇▇█ ▃▃▂▅▁▅▅ ▅▅█ + ▃▃▃▇▂▃ ▂▅▅▂▅▅█ + █ ▂▃▁▁▇▆ ▆▄▄▅▅▁▄▂ + ██▅▁▇▅▁▇▂▂▄▄▅▇█ ▄▇▁█ + █▁▅▂▅▆█▂▆▅▃▇▆▃ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_2.txt b/codex-rs/tui/frames/hbars/frame_2.txt new file mode 100644 index 0000000000..d4efa4def0 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_2.txt @@ -0,0 +1,17 @@ + + ▂▅▂▅▄▇▄▄▄▇▆▂ + ▂▇▆▅▇▄▇▁▁▁▄▁▁▄▂█▁▇▇▂ + ▆▁▇▁▃▇▇▁▇▂▂ ▂█▇▄▇▅▁▁▄▁▆ + ▂▁▅▂▅▇█▆▆▂ ▆▆▃▁▅▁▆ + ▆▃█▅▇▃▁▃▂▃▃▂ ▃▆▁▃▁▆ + █▅▇█▂ ▁▇▃▇▅▃▇ ▃▃▁▇▁ + ▆▁█▇▁ ▃▅▁▄▁▂▁▆ ▅█▁█▁ + ▁█ ▃▂ ▆▁▇▁▁▄▇ ▁█▅▅▁ + ▇██▄▁ ▄▁▃▃▂▁█▅▁▇▇▇▇▇▇▇▇▆▁▂▁▁▇ + ▂▄█▁ ▅▁▁█ ▅▇ ▁▄▃▂▂▂▂▅▅▂▂▁▇▅ ▁ + ▃▃▃ ▇ ▇▃▅▅▁█ ▂█▇▇▇▇▇▇▇█▁▆▇▁▁ + █▃▂▅▅▆ ▂ ▆▇▄▅▆▇ + ▅▃▂▂▁▇▆ ▆▄▂▇ ▂▁█ + ▂▁▃▄▂▂█▇▇▅▄▄▄▄▅▄▇▂▂▁▁▇ + ▂▇▇▇▇▁▁▂▂▂▂▁▄▅▇█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_20.txt b/codex-rs/tui/frames/hbars/frame_20.txt new file mode 100644 index 0000000000..30c29f51c9 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_20.txt @@ -0,0 +1,17 @@ + + ▂▂▇▄▁▁▄▇▄▆▂▂ + ▆▄▄█▄▆▂▆▄▄▄▁▁▂▃▇▃▇▆ + ▆▆█▂▇▇█▁▇█ ▂█▃█▃▇▇▁▇▂ + ▂▁█▂▇▁▇ ▂▆▇▁▃▅▇▃▃ + ▂▁ ▆▁▇ ▂▅ ▂▁▁▃▇▃▁▁▃ + ▅▂▆▁█ ▇▇█▄▁█▅ █▃▁▁▃ + ▄▁▄▇▁ ▆▇ ▅▇▇▃ ▆▃▁▅ + ▁▂▃▅▂ ██▄▅▁█▆ ▁▁█▁ + ▁▅▁▁▄▆▄▄▄▄▄▄▄▄▂▆█▄▃▃▃▃▇ ▅ ▁▃ + █▁▃▁▂█ ▅▂▂▂▂▂▂▁▃ ▇▃▃█▁▄▃ ▆▅ ▁▁ + ▃▆▃▃████████▇█ ▃▆▄▁▁▆▁ ▅▃ + ▇ ▃▇▅▆ ▂▅▇▅▁▅ + ▃▂▃▇▆▁▂ ▆▄▇▂▄▇█ + ▃▆▆▅█▁▇▃▄▄▆▅█▁█▂▆▅▇█ + ▂▇▇▁▂ ▄▂▂▂▂▁▇██ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_21.txt b/codex-rs/tui/frames/hbars/frame_21.txt new file mode 100644 index 0000000000..b6a6c2c109 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_21.txt @@ -0,0 +1,17 @@ + + ▂▂▆▄▇▄▄▇▄▇▆▂▂ + ▆▇▇▂▂▂▂▇▁▄▁▇▄▂▂▆▇▇▂ + ▄▇▃▂▇▇▃█▂ ▂▃▁▇▇▂▂▇▆ + ▆▇▁▄██ ▂▆▄▇▆▄▇▆ + ▅▆▅▇▂ ▆▁▅▂▃ ▃▃▂▃▆ + ▅█▅▁ ▆▇▇▂▅▅ ▃▃▃▆ + ▁█▁▂ ▂ ▅▂▆▅█ ▃▄▃█ + ▂▃ ▃▄ █▁▆ ▁ ▁ + ▁ ▁ ▆▇▄▄▄▄▄▇▇▇ ▃▁▆█▁▆ ▄▅ ▁ + ▁ ▁▃ ▁▂ ▂▆▁ ▃█▂▇▁▆ ▅█▅▅ + ▄ █▅ ▂▂███ █▂ █▇▂▆▄ ▅▂ ▆ + █▇ ▅▄▂ ▂▇█ ▅ + ▇▂ ▃▆▂ ▂▅▄▇█ ▆▂ + ▇▄▂ ▇█▇▇▅▁▁▄▅▄▇██ ▆▂ + ▇▇▇▄▇▂▂▂▂▆▂▄▇▇▂ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_22.txt b/codex-rs/tui/frames/hbars/frame_22.txt new file mode 100644 index 0000000000..38195cd38b --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_22.txt @@ -0,0 +1,17 @@ + + ▂▆▇▄▇▄▄▇▄▇▆▂ + ▂▇▅▇▁▅▂▅▁▅▃▁▁▄▁▇▅▇▇▂ + ▆▄▇▄▁▃▇▇▂ ▂█▇▃▇▇▇▂▂▇▆ + ▄▇▁▇▇█ ▆▆▁▁▁▂▇▃ + ▃▁▁▅█ ▆▂▅▁▄▁▅▅▄█▁ + ▃▁▇▅▂ ▆▁▅▁▄▃▅▂ ▃▁▃▄▁ + ▁▇▇▃▅ ▁▇▁▃▇▅█ ▁▁▅▁ + ▁▁▄▁▂ ▁▃▁▁▃▃ ▁▃▁█▁ + ▁▁▆█▆ ▇▁▄▄▄▄▄▄▇▇▂▃▇▁▂ ▃▆ ▂▁▄█ + ▃▁▄ ▇▂▃▃▆ ▅▆█▁▅▅▁ ▃▇▄▂█▁▆▆ ▅▃▄ + ▃▃▃▂▁ █████▇▇█▂ ▂▅▇▇▂▅▅▅█▆▂ + ▃▇▃▂▃▆ ▂▇▆█▁▆█ + ██▇▄ ▇▇▂ ▂▅▇▆█▇▂▅ + █▅▇▇▆█▇▁▄▄▇▄▄▅▄▇███▆▇ + █▁█▁▂▄▂▂▂▆▄▂▅▄▇▂ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_23.txt b/codex-rs/tui/frames/hbars/frame_23.txt new file mode 100644 index 0000000000..a81cac3ef2 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_23.txt @@ -0,0 +1,17 @@ + + ▂▆▇▂▄▇▇▇▇▄▇▂▂ + ▂▄▁▇▁▃▂▆▂▄▄▆▁▂▁▇▁▇▂ + ▆█▇▁█▆▄▇▂ █▁▅▇▁▃▄▁▁▆ + ▅▄▁▇▄▅▂ ▂▄▄▃▁▁▄▃ + ▅▅▁▂▅█ ▆▅▆▆█▇▅▇▃▁▃ + ▆▃▁█▅▂ ▂▇▇▇██▅▇█▁▁▃▁▆ + ▂▁▁█▁ ▅▅▅▅ ▂▁▂ █ ▁█▇ + ▁▅▁ ▁ ▁█▁▆▂▃▆ ▁ ▇▅▁ + ▃█▃ ▁▇▁▄▄▄▄▄▄▄▄▁▂▇▁▂█▃▂ ▁ ▁▁▁ + ▁▃▃▂▁█▄█ ▅▂▃ ▃▁▂▃▆▁ ▃▂▁ + ▅█▁ ▁ ▂███████ █▂▅▄▄▁▂▅▃▅▂ + ▆▁▁▂▁▅ ▆▅▁▃▃▅▂ + ▃ ▁▆█▅▂▂ ▂▅█▄▇▅▇▅ + ▃▄▃▇▄▇▇▃▁▄▄▂▇▇█▆▂▇▇▂ + █▁ ▇▄▃▁▂▂▇▂▂▇▇▂ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_24.txt b/codex-rs/tui/frames/hbars/frame_24.txt new file mode 100644 index 0000000000..791f93b591 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_24.txt @@ -0,0 +1,17 @@ + + ▂▁▂▄▇▇▇▄▄▆▂ + ▆█▂▅█▁▂▂▁▄▄▇▆▂█▇ + ▆██▄▃▅▇█▁ ▅▂▅▇▁▇▇▆ ▃ + ▆█▅▅▆▅▁▄▆▃▂▁▅▂ ▂▇▃▁▃▂█ + ▆ ▅▅▃▅▆ ▂██▅▃▂▁▂▂▃▁▆█ + ▁▆▃▇▃▂ ▇▆▆▅ ▅▁▄ ▅█▃ + ▁ ▁▁ ▆▅▂▆▅█▅▃▃▁▃▃▁▃ + ▁ ▃▁▁ ▁▆▄▅▃▂▁▁▂▅▅▂▁▁ + ▁▅ ▁▄▄▄▅▇▇▁▁▁▇▇▂▇▆▂▁ ▁ ▁▁ + ▂ ▅ ▇▁▅▆▆▄▄▆▆▁▅▃▃▇▇▁ ▁▇▁ + ▃ █▃▁▃▇██████▂ ▃▆▅▇▃▁▄▅▆▂ + ▃ ▃▆▇▃ ▁ █▅▄▅ + ▃▅▇▃▂▁▅ ▂▄█▂▅▅▂▇ + ▅▆▇▆▃▃█▁▁▅▄▄▄▁▃▂▅▂ + ▇▅▂▇▇▄▃▂▂▄▄▇▇ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_25.txt b/codex-rs/tui/frames/hbars/frame_25.txt new file mode 100644 index 0000000000..565fdb82ea --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_25.txt @@ -0,0 +1,17 @@ + + ▂▇▄▇▄▇▇▇▇▂ + ▆ ▇▆▇▂▂▄▃▁▇▁▁▆ + ▅▁▅▅▆▆█▅▁▇▃▄▃▁▁▁▂ + ▁▇▇▁ ▅ ▄▁ █▃▁▆▇▃▅ + ▆▂▂▃▆▅█▃▄▅▂▁█ ▁▅▅▃▅▇ + ▃▆▁▁▁▂▇▇▅▃▁▅ ▅▁▆▁▅▅▁▆ + ▁▅▁▇▁ ▁▂▂▅▃▂▅▁▃▅▂█▁▄▁ + ▁▁▁▅▁▅█ ▁▂▄▃▅▁▃▂▁▄▁▁▃ + ▃▇▃▁█▁▂▂▄▄▄▄▇▁▁▃▃▁▇▇▁▃ + ▅▆█▁▅▁▆▁▂▁▁▄▇▂▁▃▇▄▅▃▁ + ▃▁▇▅▃▁▂██████▇▅▁▃▁▅▁▂ + ▁▂█▁▄▇▄▃▆▆▇▅▂▅▆▅▅▁▅ + ▃▂▃▁▂▃▂▇▄▅▆▃▅▂▁▁▅ + ▃▅▄▃▃▂▇▄▁▇▇ ▇▁▇ + ▁▆█▇▃▇▆▂▇▁▇ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_26.txt b/codex-rs/tui/frames/hbars/frame_26.txt new file mode 100644 index 0000000000..e37d671dc4 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_26.txt @@ -0,0 +1,17 @@ + + ▂▄▇▇▇█▇▆ + ▅▇▁▄▅▃▁▇▄▁▆ + ▅▇██▁▄▃▁▃██▃▆ + ▄▇█▆▁▁▁▂▁▁▂▇▅▃ + ▁▂▆▃▁▅▁█▇▃▅▄▁▃▄ + ▃ █▁▅▅▅█▇▂▃█▃▃▅ + ▁ ▇█▄▁▁▅▁▁▄▄█▇ + ▅▆ ▃▁▁▁▃▃▄▁▁▅▁▁ + ▁ ▅▃▇▄▇▁▇▄▄▅▃▁▁ + ▅▂▁▅▆▁▂▂▆▇▃▃▇▁ + ▁▂█▅▁▇█▃▆▅▂▇▃▁▁ + ▃▂▁▁▅▃ ▅▅█▁▁▂ + ▇ ▇▁▃ ▃▂▅▁▅▆ + ▁█▇▃▃█▇▂▇▇▄ + ▃▅▅▃▇▁▂▃▇ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_27.txt b/codex-rs/tui/frames/hbars/frame_27.txt new file mode 100644 index 0000000000..d3dbefa975 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_27.txt @@ -0,0 +1,17 @@ + + ▄▇▇▇▇▆ + ▁▄▅▅▁▅▃ + ▄█▂ ▇▁▅█▁ + ▁▁▁▃▁▁▄▁▁ + ▁ ▂▁▂▆█▄ + ▁▂▅▂█▂▁▁▁▂ + ▄ █▁▁▂▇▁▁ + ▁ ▂▁▁▁▄█▁▁ + ▁▅ ▅ ▁▇▁▁▁▁ + █▄ ▅█▂▁▂▇▁▁ + ▁▆ ▂▃▇▇▇▅█ + ▁▁▇▇▁▁▂▅▁ + ▁▄▄▇▄▆▅▁▃ + ▃▂▂▁▃▄▅▅ + █▃█ ▃▃▅ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_28.txt b/codex-rs/tui/frames/hbars/frame_28.txt new file mode 100644 index 0000000000..0ae0f54e0b --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_28.txt @@ -0,0 +1,17 @@ + + ▅▇▇▄ + ▁▇▂▁▂ + ▄ ▄▁▂ + ▁▆▂▇▁ + ▁ ▁▁ + ▁ ▆█▁ + ▃▁▁ ▂▁ + ▁▆██▁ + ▅▃ ▂▁ + ▁▁▅▅▁▁ + ▁ ▂▁ + ▁▄▇▄▁ + ▁▄▇▁▁ + ▇▂▂▅▁ + ▁ ▅▇▁ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_29.txt b/codex-rs/tui/frames/hbars/frame_29.txt new file mode 100644 index 0000000000..d333f278dc --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_29.txt @@ -0,0 +1,17 @@ + + ▇▇▇▇▇▆ + ▆▁▇▅ ▇▃ + ▃▆▁▁ ██▁ + ▁▁▁▁▃▃▆▅ + ▃ ▁█▁ ▁ + ▁▆▁▁▁ ▂▂ + ▁▃▃▁▁▁ ▃ + ▁▁▄▁▁ + ▁▁▁▇▁ ▂ + ▂▁▄▁▁ ▂ + ▇▁▁▅▁▃ ▄ + ▁▅▁▁▁ ▂▁ + ▁▁▁▁▂▁▂▁ + ▁▄▁▇▅█▁█ + ▁▁▇ ▅▆ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_3.txt b/codex-rs/tui/frames/hbars/frame_3.txt new file mode 100644 index 0000000000..5d0b07202a --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_3.txt @@ -0,0 +1,17 @@ + + ▂▅▄▄▇▇▄▄▄▄▆▂ + ▂▇▆▅▃▁▁▇▁█▄▄▁▄▂▃▁▇▇▂ + ▆▄▅▇▄▁▇██▂ ▂█▁ ▇▇▇▅▃▁▆ + ▅▇▅▃▁▄▆▇▂ ▂▄▇ ▁▁▃ + █▅▇▁▅▃▅▁▁▇▃▂ ▃▃▃▁▁▂ + ▅▁▃▃▅ ▅▆▁▃▄▃▃ ▁ ▃▃▁ + ▄▇ ▁ █▇▃▁▂█▁▆ ▅▇▅▁▆ + ▆▆▁▆▁ ▆▆▁█▅▃▁ ▁▂▁▄▁ + ▆██▁ ▄▁▇▇▁▁▇▆▁▄▇▇▂▂▂▇▇▂▁▃█▄▁ + ▆▃▅▃▆ ▅▅▇▅▄▄▁ ▁▇▁▂▂▆ ▄▅▆▄▃▂▁▃▁▂ + █▃▁ ▁ █▁▁▇▆█ █▇▇▇███▇▇▆▅▅▅▆▅ + █▇▁ ▃▇ ▂ ▅▃▇▃▅▅ + ▄▃▅▅▇▃▆ ▆▇▄▅█▆▁█ + ▄▃▇▆▂▇▇▃▄▄▄▄▆▅▄▇▄▂▂▇█ + ▂▇▇▇▂▅▁▂▂▂▂▁▄▅▃█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_30.txt b/codex-rs/tui/frames/hbars/frame_30.txt new file mode 100644 index 0000000000..7ceb36d37a --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_30.txt @@ -0,0 +1,17 @@ + + ▂▄█▇▇▇▆ + ▂▅▄▁▁▃▇█▄▃ + ██▃▁▆▃▃▁▇▆▃ + ▁▁▃▁▅▁▂▃▁▃ ▃▆ + ▄▇▁▁▂▃▁▆▁▆ ▁ + ▁▇▁▃▇ ▇▁▁▁▁▅▁ + ▃▅▁▁▁▃▂ ▃▅▃▁ ▄▂ + █▁ █▇▄▁▆▁█▁▆ ▂ + █▁▂█▃▁▄▁▃▅▁▆ ▂ + █▁▁▃▁▂▂▁▁ ▇▆ ▂ + ▃▁▁▄▃▂▇▁▁▁▇▁▁ + ▁▇▅▅▆▅▇▃▁▁█ ▁ + ▃▁▃▁▁▅▇▁▁▆▁▅ + ▆▃▆▇▄▃▅▁▆▅█ + ▃▆▅▁▃▂▂▄█ + ▂▂▂▂ \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_31.txt b/codex-rs/tui/frames/hbars/frame_31.txt new file mode 100644 index 0000000000..419be30ed9 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_31.txt @@ -0,0 +1,17 @@ + + ▂▅▅▇▇▇▇▄▆ + ▂▇▇▄▇▆▂█▇▃█▇▆ + ▆▁▃▅▅▆▄▂▂▅█▁▂▇▃ + ▆▁▅▇▂▂▇▄▂▆▃▃▁▃▁▁▃ + ▃▁▁▁▁▇▆▇▃▂▆█▃▁▅▂▂ + ▄▁▃▂▁▂▁██▃▄▇▆▅▅▁▆█▁ + ▅▁▁ ▁▃▇▁▃▅▄▅▄▇▁▇▁▅▁ + ▃▃▆ ▁▁█▁▃ ▁▃██▁▁▃▅▁ + ▁▃▆▂▁█▃▁▁▁▅▇▁▁▁▂ ▁ + █▁▁▁▅▅▁▁▂▂▂▃▂▁▃▁▁ ▇ + ▃▇▂▅▇▁▆ ▅▇▇▇▂▅▁█▁▂ + ▁▁▁▃▃▃▆ ▂▄▇ ▁ + ▄▁▇▄▂ ▆ ▅ ▁▇▂▅▂ + ▅▁▃▁▅▂▁▂▆▁█▆▁▂ + ██▄▁▂▇▇▅▅▄▇ + ▂▂▂▂ \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_32.txt b/codex-rs/tui/frames/hbars/frame_32.txt new file mode 100644 index 0000000000..1234a419b0 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_32.txt @@ -0,0 +1,17 @@ + + ▆▇▇▇▇▄▄▁▆▂ + ▄▇▁▇▇▁▃▁▁▇▇▁▁▆ + ▅▃▇▄▃▆▇▃▅▆▂▇▁▇▃█▇▆ + █▅▅▁▂▆▂▄▆ ▆ ▆▂▃▁▇▆ ▆ + ▅▅▁▆▁▇▃█▇▁▄ █▂▆▁▃▅▃▇▃▆ + ▃▅▃▃▆▃▇▁▂▅▁▁▇▂ ▁▇▅ ▇ + ▇▁█▄▆▂█▃▁▁▆▆▁▆▄▂▅▂▅▅▁█▂ + ▁▁▁▆▂ █▂▁▁█▅█▁▄▆▂█▃▁██▂ + ▃▁▁▆▂ █▂▁█▂▂▁▇▇▇▁▁▁▄▁█▄▂ + ███▂▂▁▇▃█▃▂▂▂▂▂▁▁▇▁▄▁▆▂ + ▆▃▇▁▁▅ ▁▇██▇▇▇▃▄▅▅▅▅▅ + ▃▆▁▃▃▃ ▆▃▁▅█▁ + █▇▇▁▁▁▇▂ ▂▅▂▁▅ ▆ + ▃▆▃█▁▇▁▄▄▇▂▂▇█▂▅ + ▁▄▄▂▂▆▇▅▇▂██ + ▂▂▂ \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_33.txt b/codex-rs/tui/frames/hbars/frame_33.txt new file mode 100644 index 0000000000..780eb104ef --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_33.txt @@ -0,0 +1,17 @@ + + ▂▆▇▄▇▄▇▄▁▅▂ + ▂▇▇▁▁▃▇▄▁▅▁▆▁▇▁▇▅ + ▂▅▃▁▇▇▇▆▄█▂ █▇▅▁▁▇█▆ + ▆▃▅▁▅▂▁▆▂ ▇▁▁▃▂▇ + ▂▅▁▅▂▁▁▅▃▃▃ ▁▇▃▃▃ + ▅▅▆ ▃▂▃▃▂▃▆ ▅▃▅▂▃ + ▁▁▇ ▃▆▇▁▂▁▃ ▁▇▁▁ + ▇▁▆▆ ▆██▃▅▄▆ ▃█▁▇ + ▁▁▁ ▁ ▆▂ ▅▇▆▆▆▄▄▄▇▁▁▇▅▂▁▃▁ + ▃▅▁██▅▅▆▅▂▁▁▂▂▂▂▂▁▁▇▃▃▃▁▁▅ + ▃▄▃▆ ▁▅▁▅ ▅ ████▇▇▇ ▁▁▆▅▃▂ + ▃▇▃▇▆█▆ ▅▅▄▅▄▅ + ▇▃█▇▆▇▄▆ ▂▇▁▆▅▇▃█ + ▃▁█▇▃▇▁▆▄▇▂█▄▆▃▇▁▇ + █▄▄▇▆▂▂▂▃▇▇▄▆█ + ▂▂▂▂ \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_34.txt b/codex-rs/tui/frames/hbars/frame_34.txt new file mode 100644 index 0000000000..4bf69e69eb --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_34.txt @@ -0,0 +1,17 @@ + + ▂▆▄▇▇▇▇▄▁▆▂ + ▂▇▇▇▅▃▄▁█▁▇▇▄▇▇▄▆▄▂ + ▂▅▅▆▁▇█▅▁▇▂ ▂▃▃▃▆█▇▇▆ + ▆▅▂▁▇▂▅▆▂ ▇▁▆▇▃▃ + ▅▅▁▃▆▅▁ ▁█ ▆ ▃▃▇▃▃ + ▆▅▃▁▂▅ ▃▃█▁▃▇▃ ▃▆▃▁▃ + ▁▇▃▁▂ █▃▂▇▁▂▃ ▁▄▁▂ + ▃▁▄█▅ ▁▇▂▁▅█▁ ▅ ▂▃ + ▆█▅▅█ ▅▃▅▅█▂▄▄▇▇▇▇▇▇▁▂▂█ ▁▃▂ + ▁▁▃▆▅▆▆▃█▅▅█▁▁▁▂▁▅▂▂▂▆▅▂▁▁▂▁▃ + ▅▂▃▆ ▁▃▁▇▃ █▇▇▂▂▂▂▃ ▆▅▆▃▁█ + ▅▆▃▄▄▃▂ ▅▄▅▁▅█ + ▃▇▂▁▇▃▄▆ ▂▇▄█▂▅▆▂ + ▆▃▅▁█▁▇▆▄▆▇▄▇▄▇▂▇▇▅█ + █▁▃▄▄▂▂▂▂▂▄▄▇▄▃ + ▂▂▂ \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_35.txt b/codex-rs/tui/frames/hbars/frame_35.txt new file mode 100644 index 0000000000..86dde2ad34 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_35.txt @@ -0,0 +1,17 @@ + + ▂▆▇▄▄▇▇▇▄▇▆▂ + ▆▇▄▇▅▁▇▇▇█▁▇▁▅█▁▇▄▂ + ▂▅▅▁▄▇▇▁▃▇█▂ ▂█▇▄▇▅█▁▇▆ + ▆▅▅▇▅▆▄▆▂ ▇▇▂▃▁▂ + ▅▅▁▁▅▅▃ █▃▇▆ ▁▃▇▁▆ + ▄▅▄▅▇▂ █▁▂█▅▅▇▂ ▁▃▃▁ + ▃ ▅▅ ▃▃ █▇▂▅ ▁▃▃▃ + ▁▁▁▅ ▅▃▃▄▅█ ▅ █▅ + ▅ ▆▂ ▆▁▁▅▄█▅▁▄▄▂▄▂▄▇▁▁ ▁▁▄▇ + ▁▆▃▄█ ▅▅▄█▇▇▅▁▄ ▃▆▂▂▂▂▅█▁▅█ ▁█ + ▅▂▃▆█▅▃▂▁▅▃▂ ▂█▃▃▃▃▇▃▃▇▅▅▂▆▁ + █▅▃▃▅▁ ▂▅▇ ▆▃ + ▃▄▂▃▄▆▅▆ ▆▄▅▂▇▇█ + █▃▂█▁▇▁▆▅▁▁▇▁▄▅▇█▂▅▄█ + █▃▁▄▄▂▂▅▂▂▇▇▇█▃ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_36.txt b/codex-rs/tui/frames/hbars/frame_36.txt new file mode 100644 index 0000000000..bccadcf7b7 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_36.txt @@ -0,0 +1,17 @@ + + ▂▂▇▄▇▇▇▇▄▇▆▂ + ▂▄██▃▇▅▄▅▇▃▇▄▇▇█▇▇▇▂ + ▆▃█▃▆▇▇▆▇█▂▂ ▂█▇▁▇▇▁▆▇▁▆ + ▂▁█▇▇▂▂▂▂ █▇▁▃█▁ + ▆▅▂▄▃█▁▃▂▃▆▅ ▃▃▅▇ + ▅ ▆▅▂ ▇▂ █▁▅▆ █▃▃▇ + ▁ ▄ ▂ ▃ █▃▃ ▁▃▁▆ + ▁▁▃▁ ▂▃ ▂▅▅ ▃▁ ▁ + ▁██▁ ▅▅ ▆▇██▆▇▇▂▇▇▇▇▇▂ ▁▃▁▁ + ▂▇▁▃ ▆▁▂▂▅▁▅ ▂▁▂▂▂▂▂▂▂▁▁ ▃▅█▂ + █ ▇▁▃ ▇▂▇▅▃ █▇▇▃▃▃▃▃█ ▁▆█▅ + █▆█▃▄▅ ▆▅▁█▅ + ▃▅▁▁▇▁▆ ▆▇▇█▅▆▂ + ▇▆▂█▇▇▄▃▄▁▂▇▁▄█▆█▆▄▇█ + ▂▇▇▅▁▂▆▆▂▆▆▇▇▇▇█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_4.txt b/codex-rs/tui/frames/hbars/frame_4.txt new file mode 100644 index 0000000000..5867215a96 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_4.txt @@ -0,0 +1,17 @@ + + ▂▅▄▄▇▄▄▇▄▇▆▂ + ▂▆█▇▇▁▅ ▁▃▄▅▇▄▁█▅▇▆▂ + ▆▇▄▁▁▁▇▇█▂ ▂▃▁▃▃▇▁▅▃▃▂ + ▅▅▁▆▁█▅▇▆ █▁▇▇▃▇▃ + ▅▁▅▂▁▄▁▃▄▃▁▆ ▃█▃▁▇▃ + ▅▁▁▃▁ █▂▁▁▅▇▃ █ ▃▄▁▆ + █▃▁▄▂ █▇▇▃▇█▁▆ ▆ █▄▁ + ▁▅▃ ▆▁▅▇▃▁▁ ▁▁▁ + ▂▁ ▁▂ ▄▁▅█▃▅▅▇▁▇▇▇▂▂▂▂▆▆ ▁▁▇ + ▁▃▅ ▁ ▆▅▅▅▆▂▁▂▄▃▁▆▅▂▆▅▅▃▄▁▅▅█▁ + ▂▁▄█▃▆▃▃▆▃▅ █▇▇▇▇▇▇▇█▃▆▁▁▁▂ + ▆▁▃█▁▂▂ ▆▃▄▅▇▇█ + ▃▃▆▅▃ ▆▂ ▂▅▃▆▇▄▁▅ + ▁▁▁▄▂▇▇▃▄▄▄▄▆▇▄▇▇▃▁▇▂ + ▇▃▃▁▅▁▂▂▂▂▂▄▆▇▂ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_5.txt b/codex-rs/tui/frames/hbars/frame_5.txt new file mode 100644 index 0000000000..d0cd750b8a --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_5.txt @@ -0,0 +1,17 @@ + + ▂▅▄▄▄▇▄▄▄▇▆▂ + ▂▇█▇▅▇▅▁▁▇▁▄▇▄▂▁█▇▆ + ▇▂▅▃▇▁▇█▂ █▃▄▁▇▃ ▆▇▆ + ▆▁▅▁▅▁▅▄▆ ▆▃▁▁▁▁▂ + ▆▃▅▇▅▃▂▇▁▂▃▆ ▂ ▃▁▃▁▂ + ▁▁▁▁▅ ▃▂▁▃▄▅▁▂ ▇▅▁▁ + ▁▅▁ ▇ ▂▃▂▁▃█▁▆ ██▁▇▁▆ + ▁▅▁▂█ ▆▂▄▁▅▂▁ ▇▁▂▁ + ▁▆▁▃▇ ▅▂▁█▆▁▇▄▂▁▇▁▂▂▂▇▆▂█▁▅▁ + ▂▃▁▃▆▆▅▇▇█ ▁█ ▅▅▃▄▃▆▄▅▆▅▁▅▇▁▂ + ▃▆▁▁▆▁▆▃▃▅▇▂ █▇▇█████▆▁▄▁▃▅ + ▃▃▇▅▃▃ ▂ ▅▂▅▇▆▃ + ▃▅▇▃▁▄▇▂ ▂▄▇▆▇█▄▇ + ▃▁▇▁▆▇▇▃▄▁▄▂▆▇▄▇▃▁▄▇ + ▃▆▇▂▇█▂▂▂▆▂▆▇▇▂ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_6.txt b/codex-rs/tui/frames/hbars/frame_6.txt new file mode 100644 index 0000000000..2fde73afab --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_6.txt @@ -0,0 +1,17 @@ + + ▂▅▄▄▄▇▄▄▇▇▂▂ + ▆▃▄▅▇▁▄▇▇▁▇▇▄▂▆▇▇▂ + ▆▆▆▁▁▁▇█ ▂█▁▅▄▇▇▇▅▃▂ + ▅▆▁▇▁▇▂▄▆ ▃▇▁▁▁▁▆ + █▄▁▁▁▇▃▃▇▇▃ ▅▃▃▁▃▆ + ▄▆▅▁▅▂▃▇▄▁▃▂▁▆ ▅▄▃▅▁ + ▂ ▇▁▁ ▃▃▁▅▃▃ ▃▇▁▂▁ + ▁ ▁▁▁ ▂▁▄▁▅▁▁ ▁▇▃▁▁ + ▂▅▁▆▁ ▅█▁▁▇▄▅▇▂▁▇▁▂▂▇▇▂▅▃▅▁ + ▁▁▃▆▅▂▃▂▄▇ ▁▅▄▇▆▁▁▆▄▄▄▃▁▆▁▃ + ▅ ▁ ▅▁▁▁▄▅█ █▇████▇█▂▃▃▅▁ + ▆ ▄ ▅▆▂ ▆▅▂▅▅▁▂ + ▅▂▃▂▇▇▆ ▂▇▃▂▅▇▆▇ + ▂█▁▇▆█▇ ▄▁▂▂▆▇▇▇ ▅▄█ + ▃▆▄▇▇▆▂▂▂▂▂▆▇▇ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_7.txt b/codex-rs/tui/frames/hbars/frame_7.txt new file mode 100644 index 0000000000..f9b4ed9219 --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_7.txt @@ -0,0 +1,17 @@ + + ▂▅▁▄▇▇▄▄▇▆▂ + ▆▇▂▇▃▁▇▇▇▄▄▃▄ ▂▇▆ + ▇ ▆▁▁▁▇▂ ▂▃▁▂ ▇▅▂▇▆ + ▃▃▁▁▁▁▄▇ ▃▁▃▇▁▅▆ + ▂█▁▇▁▁▃▁▅▃▆ ▅ ▇▁▁▃ + ▁ ▄▁▁█ ▂█▃▄▁▃ ▆▆▁▁▁ + ▂▃█▁ ▃▂▁▃▁▃▁ ▇▇▃▁▁ + ▂█▅▁▁ ▄▇▅▁▇▁▂ █ ▁▁▁ + ▅█▁▇ ▆█▂▅▁▃▅▁▁▄▄▂▁▁▄▄▇▃▁▁ + ▁▆█▁▁▄▅▁▁▅█▁▅▃▁▁▃▃▆▄▆▄▃▁▃▁ + ▃ ▄▃▅▇▁▇▂▅ ▇▇▇▇▇▇██▂▅▁▁ + █▂ ▅▂▅▂▂ ▆█▆▅▄▅█ + █▄▆▇▃▃▃▂ ▆▃▁▆▇▅▇█ + ▃▂█▃▁▇▃▄▁▂▂▂▇▇▁▇▇▅ + █▁▇█▁▅▁▂▂▆▂▄▇▇ + \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_8.txt b/codex-rs/tui/frames/hbars/frame_8.txt new file mode 100644 index 0000000000..44c448de8a --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_8.txt @@ -0,0 +1,17 @@ + + ▂▂▇▂▄▇▇▄▇▆▂ + ▆█▇▅▁▁▁▇▄▄ ▁ █▇ + ▂▁▄▆▁▅▅▇ ▆█▁▅▁▇▃▇▃▆ + ▂▇▃▇▅▁▆▇▁ █ ▄▃▁▁▃ + █ ▅▁▅▆▃▁▅▃ ▅█▃▁▁▆ + ▁█▆▁▃▃▃▂▃▁▂▇ ▃▇▁▁▁ + ▁▇▁▁▁ █▂▄▃▁▂▁ ▁▃▁▅▁▆ + ▃▆▁▁▅ ▁▇▃▅▁▆▇▅ ▅▂▅▁▁ + ▃ ▃▁▁▂▃ ▅▇▄▁▁▅▇▆▇▆▆▃▁▁▁ + ▃▇▅▄▂▁█▆▁▆▁▁▄▁▄▂▂▁▁▄█ + ▅▅▃▃▁▃▁▁▁▅█▃▇▃▇█▃▇█▅▃▁ + █▆█▁▃▁▂▂ ▅▆▅▅▅█ + █▃▂▇▃▃▃▂ ▂▅▃▂▁▇▅▇ + ▅▅█▁▆▇ ▄▄▇▇▄▅▄▆▁▂ + ▁▁▂▇▇▃▁▂▆▇▅▄▂ + ▂▂ \ No newline at end of file diff --git a/codex-rs/tui/frames/hbars/frame_9.txt b/codex-rs/tui/frames/hbars/frame_9.txt new file mode 100644 index 0000000000..a18a8a231c --- /dev/null +++ b/codex-rs/tui/frames/hbars/frame_9.txt @@ -0,0 +1,17 @@ + + ▅▄▃▇▅▇▇▄▆ + ▅▇▂▅▁▁▇█▄ ▂▆▃▂ + ▅ ▆▁▁▅▇▃▃▄▅ ▃▂▁▆ + █ ▁▁▅▄▄▂ ▂▃▆▁▃▃▁▇▆ + ▅▇█▄▃▇█▁▇▆ ▇▅█▇▅▇▁▁ + ▁ ▁▁▁█▃▁▃▄▂▂ ▁█▁▇▁▁▁ + ▂ ▁▇▃▁▇▇▁▃▃▆█▅▆▅ ▂▁▁ + ▁ ▁▅▂▆▃▁▁▁▂▅▄▃▂▁ ▁▁ + █▆▁█ ▅▁█▁▁▁▁▇▁▁▆▁▁▂ + ▁▂▁▁▁▂▆▁▃▁▂▁▁▁▁▂▂▁▁▁ + █ ▂▃▅▃▃▁▅█▇▇▇▇▁▁█▅▃▁ + ▃▁▁▁▃▆▂ ▆▅ ▃▅▁▂ + ▃▇▃▁▃▃ ▅▄▂▄▁▅▇ + ▃▆█▃▂▁▇▅▇▄▄▄▇▁▂ + █▆▂ ▇▃▃▁▄▇▅█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_000.txt b/codex-rs/tui/frames/openai/frame_000.txt deleted file mode 100644 index 3420a1e1f2..0000000000 --- a/codex-rs/tui/frames/openai/frame_000.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - aaaanppppppppppaa - paoieoopoaaaaeeeaaooaoopa - aeinoooapaipoiionpiooooppa opa - poiepoappeoo piioopna op - aoiepoaee pooipaop - piieeoei pnpiiann - eeieo io ionnno annipai - peiiooia onaoieii aonaipai - ooiinio ionnnnaei opoianp - inoiaaii onioaeiiae eiaii i - eini ni paee oie oiiiei - o nn ei oaeiio no niiii - iaii e pieeo eia annpnpppppppppp ieei i - oin ip aeiioo eoa eiinaooooooooo innini - neine in oiea aia oiopppppp i iioia - nniiaaip oppon peaeeoee - nnni nna nonoeaee - niiip oina aiapioaio - opooip opop eapoiopopno - oioiip anpoonipaapppppooipipooapoa - oooopnpiionieoooniinpoo apoo - oopnipiinaaaaaappnooa - aaoooooooa - - diff --git a/codex-rs/tui/frames/openai/frame_004.txt b/codex-rs/tui/frames/openai/frame_004.txt deleted file mode 100644 index c54ca63570..0000000000 --- a/codex-rs/tui/frames/openai/frame_004.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - aaaanppppppppppaa - paeieoopooapaeee oooaoopa - aeiioioanaipoiioniioooopna opa - pioepoapieoo poonna op - aoiepoaneo opooipaop - piieeaei neiiann - eiioo io nnoanno onoipoi - peiioaia onaaaenp enoiiai - ooiieio aiiinnnn aopoiinp - iooia i paiooaeio iaii i - oieioai paeio epe niiioi - o ne oip aeiio pnoa ii i - iaiiooon nieee neaa annpnppnppppppp p ei i - oip ia eiioooeo o iaoooooooooooo inniai - noinaoip oieo aio eponppaiiinnnpp eeeiaia - nnnipaia oppo a peaeioee - pnniaonpa aonoeoee - naiipeoena aenpioaio - opoiia opop aapoiopiano - oioiip oopooiipaapppppoiinipooapoa - aooopnaeiinpiooooipnpoooapoo - oopiippnnaaaaaappnooa - aaoooooooa - - diff --git a/codex-rs/tui/frames/openai/frame_008.txt b/codex-rs/tui/frames/openai/frame_008.txt deleted file mode 100644 index 7639d68ba6..0000000000 --- a/codex-rs/tui/frames/openai/frame_008.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - aaaanppppppppppaa - aaeioooioaapaeee aooioopa - aeiiopoaenppoionniiooonpna onp - piioioaapiooe poonna op - poieeapio opaoipoop - eiipoaio ppap oaaiiann - eiepppio oaopnoe noipan - eiei pi nioonopo nainai - iiin iia oiinipna onoipii - iiai iio oa ininop aii i - iiai io opiin eie iiiai - pien np aoiia aia a iiiiia - ooii ii eeeoa ie eapnpnppnppppppp aoii i - oiai oei aiieaeaio eaiioooooonooooo ianiai - iain nna aooee po naoippiiiinnnnp poiiaeo - aiin nna apppo eoeeope - eiin oiia aenoeopo - eoiia nopa aeippoaio - a nnpa nioppaei aapoiopiano - oioioe ooiooiipaapppppooipipooaaoa - aiiopaaiionpeiioiiinooooaipo - oapiiipnaaaaaaappnooa - aaoooooooa - - diff --git a/codex-rs/tui/frames/openai/frame_012.txt b/codex-rs/tui/frames/openai/frame_012.txt deleted file mode 100644 index 475cb233d0..0000000000 --- a/codex-rs/tui/frames/openai/frame_012.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - aaanpppppppnppa - apeioopooaappa niaooioopa - apieioapanpoiionnppooonnnpaooop - pepioanioiooe piopap opa - aieionnopoee oioia on - eiiaoieo pppa ipi nna - eiieaiia nnapopoe onoiaaop - eiieaioe aoniaaana oeipana - iioaiioa apniinnona noi ni - iio pio nnoiiipoa oiie ep - nii ii oenaa ni iii ii - iii iio piio aoea iiiiii - poi iip eaeieoipeo ppnnnpppppppppp iii ii - ia ie iieoapio a iieoooooooooooooai nioi i - iii oei oii peaao anonppppeiiiinnnoaaeiipeo - iin oen oppo aeeeeni - ain opop eioeoei - niip opopa apieeoaeo - oiiia opoopaa anoineienea - aoiia opioiippanppppppoiiiioaaaoa - oopaea oooniiiiiippooa apoo - ooooppnaaaaaaaapnnpoa - aoooooooa - - diff --git a/codex-rs/tui/frames/openai/frame_016.txt b/codex-rs/tui/frames/openai/frame_016.txt deleted file mode 100644 index 7e03a99764..0000000000 --- a/codex-rs/tui/frames/openai/frame_016.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - aaapppppppppppa - paeoioooaaeiappaooiooppa - eneooaanppoiipnnppiiienaaoponp - aepoapnpopooi aopinpaipona - epoeiiopo ooiiinnon - aiienio ppp oiipoppp - aiiieieo iionaip nin nnn - iiiei pineopona oii nin - ieeiie oiininaona oin pip - ieeii nniiinonae oii iio - iai ioi oii eonio ii ea - iaa ioe noeeoipoo oio ea - ie iii aepoeiio ppppnnpppppnppp oioaii - pieienp pioennpei oeooooooeoooooopi aiipei - onp inia opaeano inppppppiieiiiio enoani - nnp nnoa oppoa ainieooo - onp noip pipioeio - oinaonoipa apiioppio - oinaonpiipaae aneiioiaee - oiipaooiiioippnnppppppoiiioo apo - aooaaa aooppiiiiiioooo appeo - oioninpaaaaaaaapnnpoo - aoooooooa - - diff --git a/codex-rs/tui/frames/openai/frame_020.txt b/codex-rs/tui/frames/openai/frame_020.txt deleted file mode 100644 index a0fbdd877e..0000000000 --- a/codex-rs/tui/frames/openai/frame_020.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - aaaapnpppppppaaa - paeioooaannepnaooopoopnea - pnoiopannoinppnnppeoippaoionei - ppaaaneopoo eninaopopoa - po ppoopoao ooinonano - ea aioea pp nnopnep - e piai eonoi ann ionn - ea pipoi ieeopnna nn inip - aopaiae oinipnoin ip nio - i aiii oinoopnna oi ioii - iioiia anaio niio iiaie - ieoiine poe neoea inoii - nioiiia eeeaniae anppppnnnnnnnnpa inaia - opnniene aoooeoo poooooooooooooie nieii - inninoi noepea ippppppiiniipie anninp - in inen aa aoeeee - inpnopoai peaioae a - nipopopoa apoeiiaep - oinaonnioppae apeoaiiopoo - ooip opiiiioppppppppppiiopoanopo - oopaa ooopppppieenooa apooaa - oooiippaaaaaaapppppo - aooooooaa - - diff --git a/codex-rs/tui/frames/openai/frame_024.txt b/codex-rs/tui/frames/openai/frame_024.txt deleted file mode 100644 index eefc7abd6a..0000000000 --- a/codex-rs/tui/frames/openai/frame_024.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - apapnpppppnaaa - aenioa o oooaooiooppnpa - aeo appoonppnnppnnpaeoioopop - eo pooaponp nionpnoponin - po aeoopa nopn nonan - e neap npap opponnpi - i eepa noai onpoinni - i ieea iionop iioinei - pa pi n anoan nnpopion - ieiiie ien onn ooi iaoo - ieiiap ni pno eeiiin - iaioai oao aoo niiiii - ieoeip ieaooee anpppnnnpnpnnpa ao iiii - ipioai aiooaio inaaooooooooooieo iioieie - ieopnaa napna opppappaaapppie aiepno o - iaopnop einoe e - oiaopnon aonaoo p - ia nopopa eeppaeae - oiaoiannopaa apoaponoapa - oiaaoaiopiinppnaaapppooppenepopo - ooipa oooooioooippoioopopioa - aoopnnnaaaaaapppioooo - aooooooaaa - - diff --git a/codex-rs/tui/frames/openai/frame_028.txt b/codex-rs/tui/frames/openai/frame_028.txt deleted file mode 100644 index f8ba2bed01..0000000000 --- a/codex-rs/tui/frames/openai/frame_028.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - apainpppppnaaa - pnooa aooipaie - anoa appooiipnnnpnpa aaopaop - aeo apoope inp oonaop - pooaeo pa nip enanan - ieeee a po oipaanipn - ioeioe a opooo onoonien - eiieo a pnonpn opeapnei - ianiee nnana po i iin - ionoi pnoopno ai oai p - iniiaio i a enop nonoiieo - i iiie iioooo o oioiiie - ii oiia opp poeapnpppnnnppnpn pooniie - i ii i anie ea oeeepaaneeepaip ipiie p - ianeno noa onnniaaaaaaapo neain e - innoao aioi p e - oianiion pieeao pa - ipanop aeoaeae ea - oiaoniio a aapoiio oao - oinoioiioinnpnappppiiioapeaiaea - oippiiiiooooooinoopaaeeaeo - ooippiiniiiinpoiiooo - aooooooa a - - diff --git a/codex-rs/tui/frames/openai/frame_032.txt b/codex-rs/tui/frames/openai/frame_032.txt deleted file mode 100644 index b5d991cb6a..0000000000 --- a/codex-rs/tui/frames/openai/frame_032.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - appnpnnpppnnae - aeeoo ooinaopa - anoiappoooipnnoopp anoooop - aioniooapoie inp nnn op - poaioo en ip inp oa - eopipea a ein napaip - eoeioina inen oeaon ioia - aineo e ennpn o p nnn - ipni o npnnana noapipni - i ii i ineopoe apnpioae - oniioo anieoeene iiieoii - eoiin opeooeio e iiiio - iiiioi aiaaia appninpnnnnp ipioii - ipei n onaie iaoopnnaennae noniiiii - oiipi ppppnainiaip eiei o e - ieneaoi aa noieeo e - ianiien eoaeie pa - iioonao aiope eepa - onanoopoi pioaeopaae - oiippoonipninpppppiioapeaa po - oiiiipioooooooooaeapoaaea - aooinaaaaaapponooeoo - aooooooa a - - diff --git a/codex-rs/tui/frames/openai/frame_036.txt b/codex-rs/tui/frames/openai/frame_036.txt deleted file mode 100644 index aa087c17df..0000000000 --- a/codex-rs/tui/frames/openai/frame_036.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - appppnpppnaae - aapooanee oooooippinp - pionnpoooopnooip oeno ona - aioieoaapo op piaaon - pepioo ia nnpp na - pepee a n onineoa - ipee eanao n nnnpan - iaii anoeoaop ean pani - iina popeaon e naonnea - i io eoiipenane n iippii - i no aanopenne i iii ii - inna oie eoo i niiioi - ieeo i poeio eappppppnpn oiiiaiii - iieiap o eo iooooooooonn e ioaiii - inei i npppppinaaio ioioiiiaa - oiooi i aaaaa ae epe i - niiin n piai e - niinnaon po eo pa - oiipinao aioppaeo e - niipoepionpnapppiiaaonia po - opaoooooioioooaeanooapo - oppnaaaananoopoaeoa - ooooaa oa - - diff --git a/codex-rs/tui/frames/openai/frame_040.txt b/codex-rs/tui/frames/openai/frame_040.txt deleted file mode 100644 index 48eeff60c7..0000000000 --- a/codex-rs/tui/frames/openai/frame_040.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - appppppnppaaa - pnooaennaoopiinpiopa - pioapopooinopnaooipa ana - eoeioanoo ooon on - iaoia eoeip ai - iioi aapn peno ni - nnei onnain oeoannpn - iiia inn ia ponpii aa - aoii nnn nao aiaiiiii - iiii einpinnap ooiniepo - eiii ninenipp ieiiiaii - neii naeeo e a i iiiiii - ioio neae paapppppppp oaiiapei - oeep oe poooooooooii i i iiin - iiep aopppainanio eoioiiiii - ieeipo a aaaaa i npiiiio - iinn oa iaiaeiiei - inopaon aiaeeeo i - iipinao poaoeea ae - oaopnnpioppppapooppeoa po - opa oooiiiiooapnaoa po - opnaepaappoeoanpo - aoooaa a - - diff --git a/codex-rs/tui/frames/openai/frame_044.txt b/codex-rs/tui/frames/openai/frame_044.txt deleted file mode 100644 index 5a904dbada..0000000000 --- a/codex-rs/tui/frames/openai/frame_044.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - appnppapppaaa - peoapppoopioin opa - aiinopooiopnaonope op - poeoe ipna nnp - pnoea nnino ip - eio aap npnin ep - iee oinp eannonn - i i nineaap np ii i - pnai oioenaia eaiii i - iio nanioio ineie e - oio neieooi oiiioiii - eioa epeie iiiiaiii - iiei ai ei aappppppppoiiiiepii - oii i eie oooooooonpei nipiii - iepaape eopnninpieapaiiiii e - iipno ai aaaaaon ipii oi - ienaep enio eina - neinann poep e eo - neiapoop eoepne ee - naoippaoppaapoaeeaa no - onaoopnniooaapnia po - aopaaapeeonnaapoa - aoooa oa - - diff --git a/codex-rs/tui/frames/openai/frame_048.txt b/codex-rs/tui/frames/openai/frame_048.txt deleted file mode 100644 index 9be8938972..0000000000 --- a/codex-rs/tui/frames/openai/frame_048.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - panipppoppp - poinpaonnionoonp - epioooiopannna on - eieop nina eai - iiaa inna oai - ano apa npieepnn - ieiiippo e nn noa - n i oen n inonn i - eiia piiinp i inniii - iin oieen o ppoipenp - iii inniii ieiioeii - iiia n ooo iniiiiii - iien ie aappppp iniiiiii - iioieap ooooooin ioiiiiii - eiioia ppninpeo ioiii na - ieooi aoiii iiiai - ooni i aoeniiiiae - iiepana iep eiipi - opiinooae aipipio epa - opoapaoopapeap ee ia - onaopnieoanopoa ae - opaaaaponoa aea - aooaaaaoa - - diff --git a/codex-rs/tui/frames/openai/frame_052.txt b/codex-rs/tui/frames/openai/frame_052.txt deleted file mode 100644 index 0cdec2a8fa..0000000000 --- a/codex-rs/tui/frames/openai/frame_052.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - aenpppnappa - eopponoen oaip - ieepoonopnpao nn - nieoe oiee nn - iia e ninn noa - iioaaaa inioo ii - ooiiapoo n oi oiep - ii iiini p ii ain - eei eeain iiie oi - iio iiina iepiini - iie oiein ieinea iep - iie ineaoo aeaiiie ii - ie ii aaappppnaiiiiiii - io no oooooaiioaiiiiia - iie i nnnaioiin ii i - eii pe aoiii ii oi - iioi aneo ii ai - iiin iippaiiop - iion pinniiii e - nionaonaoeaio eei - napioeaeaio ee - opaapoaeoeaio - oooaooo - - diff --git a/codex-rs/tui/frames/openai/frame_056.txt b/codex-rs/tui/frames/openai/frame_056.txt deleted file mode 100644 index e26a304d48..0000000000 --- a/codex-rs/tui/frames/openai/frame_056.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - pnppppappa - epanneeeooip - nieonnoia oip - pioeinipp opon - ini aaennn oen - iapaop iinio oi - iiip i oii aeiin - neoe iip ai i - oioipo aioaiie - nenoani iioiipei - ieinnpi iieooiei - ieoeooi iioa iii - oeniaaap iieiioii - nnioooin iie ii i - oni e iiiiiiini - iioapp a eiiii ei - iii ii n aiiii i - aio a niii pepaa - ioa i i nnoa ii - nianoenepi iiao - nopooeno oe - paaeao no - ooaoooo - - diff --git a/codex-rs/tui/frames/openai/frame_060.txt b/codex-rs/tui/frames/openai/frame_060.txt deleted file mode 100644 index 883b65b3ef..0000000000 --- a/codex-rs/tui/frames/openai/frame_060.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - npppeopp - a nie oopn - eiiieaoaan - eeeini oiii - iiieiop oii - iiaieeini ni - iieoiiei ii - iiooiiiiaoo p - iieiioeaiiiai - iiiii iii nai - iinpo iooioii - iiaai i oieii - iiaaiaaeiiiio - iiiiiiiii in - iiaioi iii ie - iiniiiiiiiioi - ineeei e i - iieiioniio - eiiinipnain - inoino ioii - n i na paao - ooi oopnii - oooaooa - - diff --git a/codex-rs/tui/frames/openai/frame_064.txt b/codex-rs/tui/frames/openai/frame_064.txt deleted file mode 100644 index 609b7b5a35..0000000000 --- a/codex-rs/tui/frames/openai/frame_064.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - pppppppp - inio ooni - iaio iaen - iiinaaoie - ieeiponii - ooe aaeai - oeoieoooi - aiai iena - ninap ei - iiiaaaiia - iiiopooiii - iiiipenei - iiiiiiaiia - iiiiiinaia - iiiiiiiiii - iieiiiiioi - iiiiiiiiai - iiiiiiiiei - iioinepiai - niniipoina - nioi i i a - oeoo eoe - ooooooa - - diff --git a/codex-rs/tui/frames/openai/frame_068.txt b/codex-rs/tui/frames/openai/frame_068.txt deleted file mode 100644 index 71b09ac5a4..0000000000 --- a/codex-rs/tui/frames/openai/frame_068.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - pppepppnp - neonein o - ipaooaninn - oip p ioipi - iii aniii i - ooipienin i - niiaiiiii i - eiiieiniii i - iiiiiiniio i - iaiiiioein i - iiooiaieipei - ipoeaoooiiei - ai iii iiioi - a iiipiiioi - aiiiioioiii - nniii eaiii - ieiiiaeiiei - iineoiineni - ioipppipiai - onoo iooian - iip iieiei - iea ipaaa - aooooooa - - diff --git a/codex-rs/tui/frames/openai/frame_072.txt b/codex-rs/tui/frames/openai/frame_072.txt deleted file mode 100644 index 6c7dd80bd4..0000000000 --- a/codex-rs/tui/frames/openai/frame_072.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ppinpnpip - eaaieineaeo - iio a eiaonnn - pna oiiiipo e - iieienioiooniop - ioipiiiiiii ni - niioonoipi peie - iiiiiaiiinoi ai - iiiiiiiioiii pei - iiiineiie aoiiii - iio nieieepieeii - iiniepaonannonni - iiiiinoieenpnnii - iiiii ioiiiiioii - ii n iioionnipii - ionoioiiinnenai - ip oioin iiien - iii npnapoieii - oienep niieiipi - iip o ooeaioi - pn p noionee - oeie nanae - oooaoooa - - diff --git a/codex-rs/tui/frames/openai/frame_076.txt b/codex-rs/tui/frames/openai/frame_076.txt deleted file mode 100644 index c508e12f4d..0000000000 --- a/codex-rs/tui/frames/openai/frame_076.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - apoonpppiaa - oaeiiannoaeon - iieioneinioopnn - ieaeeenioeonoooip - ppniaoeeii pone - innee apepa nip - nienapoiino aii - iinaeii iiion ei - iinpiiaanaaii pnii - niiiii ainp iiai - iiiiie eiaipii ieni - iiiiie nea ini oini - iiiii eiinnopniii - iiiii einapiiaeio ii - iiiii nniiaaooeipeii - iiii nniionaapiniei - iiii nie ioinp - oiiiii oi eenoio - inonpiioep pi ipn - opne iinnieoninoo - oipe aaoppoeene - onpo opaoaano - oaaoaooa - - diff --git a/codex-rs/tui/frames/openai/frame_080.txt b/codex-rs/tui/frames/openai/frame_080.txt deleted file mode 100644 index 835eeb629c..0000000000 --- a/codex-rs/tui/frames/openai/frame_080.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - pnoiapnoiaa - eoo ooiioapeiop - iaoepepi pooopopn - eoii eeipepaoa oonn - ioeiippino eaip - eeipeeano a ne - iiennipip aoa aeip - nii iioooi nnin oie - iniooiaiia enape ii - niiioiiii niin iei - iiiiiaaii ee e eoei - iiiioiaii iaia oiii - ieiiaoiii eaoin o eaiii - iiiii eio inioai o aaini - iiiie oi oa e aie eoiio - iiiii oi eoe aiiini - iiiiioii eiiia - nniiaeoioa enn - oip ainnnna aioa - nna nnannoppoaaipoe - oia on onpeoao - ona opaopaanoa - aoaaaaooa - - diff --git a/codex-rs/tui/frames/openai/frame_084.txt b/codex-rs/tui/frames/openai/frame_084.txt deleted file mode 100644 index e97ac9de2a..0000000000 --- a/codex-rs/tui/frames/openai/frame_084.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - apnoapnppppp - aio noiiooaneaona - aioaae eeapooooponin - peop aopopoe aa noni - peop iepiio oii - ieapeooenp a onp - iiienipiio oan ein - ii eiaaip ipnaa oeip - ioieoiipo neain oin - iiiiionii anep iii - ieiionioi p nipa iin - ioapoaaii inopai aie - io apieii oeaoapnnpona aaie - ii aaoiiii eeeae piooa iiii - io ooiiai ae i aioi ooeoi - i oooio ie niia - an oniaipi pipipi - nin oaon n ieanna - ii noin ia eo oioe - nn aoeinaoaaapoaenioe - oia anani ooppooopo - opa opaonaaaaeo - aoaaaaooa - - diff --git a/codex-rs/tui/frames/openai/frame_088.txt b/codex-rs/tui/frames/openai/frame_088.txt deleted file mode 100644 index 985f1923a0..0000000000 --- a/codex-rs/tui/frames/openai/frame_088.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - epnianpnnpppa - pea pneieoaannnoop - aeae popoapooiioioinop - ei oeeeeenoi oipaoain - eaoaeoeoo neaain - eieepeena a oo oii - ainaoi pe ion n nipp - iiaeeooi ipop a ooii - ooo iaa neaoina onie - iiiiinni eoeno oeiii - iiiiiiie n aeiai oeiie - iaoiiiii eoieaapo eiin - ii ieiii iiaoeip poona niio - oeo oei eeeepee noooie iiiii - i e iia aiip noope ipo - oee ioio npa iiee - ip nianpnp aoeeina - oenopoipnp noeenne - innapnipon aeapipie - in nnnn oppaanoaiiiono - oiaaoaoni oonppoooaea - opp appopnaaaapoa - ooaaooooa - - diff --git a/codex-rs/tui/frames/openai/frame_092.txt b/codex-rs/tui/frames/openai/frame_092.txt deleted file mode 100644 index 1b140cc38a..0000000000 --- a/codex-rs/tui/frames/openai/frame_092.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - appnoappppnipa - api poiooooaneinoonp - aeoaepooooapooiioopoeanp - eopenoa opo aeaooipn - iae poan ie onn - iiaanop pan ooii - eoooieap eiono aeni - aiepiini iepon oiea - iaii iao ipponan iii - iii pii ipeon eii - niiiiai ennaoo iie - niiaiii eeeeoe ioo - iiieiii eaeeeeea nnpppoin poio - iiiione neeeeio onoooioa piia - oiiiniipn ppi n oiononip inoii - oaiiiee i onpa a o ii - opanponoi po inne - oiannpnn i iaepie - oiananinaop anooaeeoe - na opiipaopaaaapoopiopopo - onanaiapp aoopppoooaao - opaappoipaaaaappo - ao aaooooa - - diff --git a/codex-rs/tui/frames/openai/frame_096.txt b/codex-rs/tui/frames/openai/frame_096.txt deleted file mode 100644 index 500e06ed0e..0000000000 --- a/codex-rs/tui/frames/openai/frame_096.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - aapippppppiaa - apoapiiooioanpeoiooopa - aeneepoo aaeoooiioopnnpona - eo ppia apooonon - i eiee p eopn - ieeeieo ppao onn - onneipe eeona ooni - nepninp iieoi aoiep - oaoooi ipiei n iii - aiiiain nnnniao iie - ioioeii p npiiip eiiii - iiaoiii ienae eao ipiiii - oiiiiii iepp eo nppppnnn aoioea - piiiipp ippoanoe iaoooioo i nie - i iiiii pee pa nipoonp ioeeip - ninoppp iapo nooiiia - onni eea onooipne - ninoiniaoe aeonppie - onnapinn ope apo iooee - na aoinaoopnaaaapponapieoia - na aooippaooopppooooapo - oppaaeaipaaaaaanpoa - aoaaaooooa - - diff --git a/codex-rs/tui/frames/openai/frame_1.txt b/codex-rs/tui/frames/openai/frame_1.txt new file mode 100644 index 0000000000..1019a11c95 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_1.txt @@ -0,0 +1,17 @@ + + aeaenppnnppa + anpeonpepnniina aopa + pioipoooaa aooaoiniiip + noanooppa eoinip + naneoainann oeinnp + io pa ioeniip oeniip + paopo onioeoia iei + iiaia peeinio oai + inioa niianioeippppppapp no i + aino anpa eo ioiaaaeepppiepepi + naaoa anpeea aaoooo aooepnae + oap op a poeoai + anpanpa anapiapo + aopna opennnnenopapio + aoooiiiaaapanpoo + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_10.txt b/codex-rs/tui/frames/openai/frame_10.txt new file mode 100644 index 0000000000..942f59e944 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_10.txt @@ -0,0 +1,17 @@ + + apooonppa + ooapopnieaop + aapiieiipipnpp + iaaeninaenpoonnp + e niioia opeaeie + ia oioieen aaoi + n ioooiiiio iep + o iinpepiipaaenii + o in nniniipnpnii + i pinpiaeaoaaaioa + p oiiiiioo nponia + naopnpoo aioopee + io iiiiopepeiea + naooeipna eeo + op aonapno + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_100.txt b/codex-rs/tui/frames/openai/frame_100.txt deleted file mode 100644 index 1e382a12ff..0000000000 --- a/codex-rs/tui/frames/openai/frame_100.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - eaapnpppppppaa - ppapneooaeooaoeaiooopa - apaaepoeeeappooniioopnnioop - eo eenee ipoaneop - aipapoooa a ooeo - aiaieep pna enpi - ieneene eioia ennpi - eeeiiea pianiaa aapin - i epoi onpaon n iii - iaiioii oinooneo ipip - i oiino oi aen ap iiai - iaonani ennoe ai iioi - i aoiia inaoeaae nnnnnppnonaa nieii - oa iii iappoipe iieoooinaaai iioa - ieoinean ipei ao oipionnppn eiann - oniiion i inpo oo aeepa - niiiini ia eopoiie - nnoniinaop eiaoaaoeee - op ooiieoia anooaopipo - oa ooipaoiinpaappppoiapopiee - opaooina oiooppoopooopoa - aoeaoooonnaaaaapppoo - a aoooooa - - diff --git a/codex-rs/tui/frames/openai/frame_104.txt b/codex-rs/tui/frames/openai/frame_104.txt deleted file mode 100644 index 05a5f7d5c9..0000000000 --- a/codex-rs/tui/frames/openai/frame_104.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - aepnpnpppppppaa - apopieooa ooopp - poaepoo apnpooniioopnpiiopa - poeeeapoapo naoipnona - e npopope oieennon - ooepoe e nnan n ioen - ioeiaeoi enoopn on ieen - iannepeea nnpannna a neap - ininina oin oioi n iinp - ioiiiioi p iipeiai ieop - oiooii i aae io ei o ii i - iiaeii i aopena eo ieiioi - no iiioi poeeioeia nppnpppnnp niiipi - aaooe p eapie ai peaoooinoao epinia - n iiiipi opeiaa iopiinnppp aiiii - oiannnioi pe aniaa - nanenipaia aeaeoeoo - onoiinp ip anoapeiio - on ooinaoipa apoaeapoea - on ooonaoioppppappppoianopippo - opaaonpaa ooioooooopoioieo - oi ooioppaaaaaapapoo - a aooooooa - - diff --git a/codex-rs/tui/frames/openai/frame_108.txt b/codex-rs/tui/frames/openai/frame_108.txt deleted file mode 100644 index 0e1b459976..0000000000 --- a/codex-rs/tui/frames/openai/frame_108.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - aeannpppppppppaa - pnippooo oppa - aeopioneeeappoiiiiiooppnanoop - aeoeeonapno apoppiiop - eanpoiapi oenooeia - iieipooii ppin p innnp - ineiponi nneeio ananinop - eoinneoi oinaona naonnia - iiiiiei oinaiip oonpai - iiniiee eoinonno aie iii - ooiaiei i iipeii e ieap - oaiaiai enppoopi eein i - n eiip i ao eeeeee ppnnppppppnppp iniiaa - oa iiiai onoeeoeo piiaoooonoaooo oiiii - ipanie ia piepe nnppiinnpp ii e - ioipepone paeeieio - onoieiaona anoaeeipa - opoiiip ip aoaennnea - naaoinpoipa eoaioipno - opaoiopaonoopppaapnppoianoioaaea - opooiiaaoooiooooooopoiaapo - ooeopiipnaaaaaanppoo - a oooooooa - - diff --git a/codex-rs/tui/frames/openai/frame_11.txt b/codex-rs/tui/frames/openai/frame_11.txt new file mode 100644 index 0000000000..ef0aff76e0 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_11.txt @@ -0,0 +1,17 @@ + + pooooppa + eo niiinnp + eoaaiinnoenp + iaaiinnpanee + aoennipnonaiip + ipaiipanniaeii + oo piiiiiiainn + i iieiine ioi + e oieiioepiai + oo aienpoeiaia + oap iiiineinni + napeiaoeoonia + a oinnaaino + np oiipaeoa + na oopapa + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_112.txt b/codex-rs/tui/frames/openai/frame_112.txt deleted file mode 100644 index 364e61b750..0000000000 --- a/codex-rs/tui/frames/openai/frame_112.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - aaannpppppppppaa - aeopeioopaoo oopa - popionpopappeooniiioopppa opa - poepoponnpoia poopnpona - poiiopopi opooppon - eeeiao e npppa nn onnoi - eneepoaia ananooa on ni i - peinnooi oinneppea on ni i - iiiiioea onaonnao ne iiop - aiioiaei aoiaoaopo i iiai - ino i n opaea e ipniei - iaiai a aoaoe eo oeiiii - oa nia i eipia aia pnnnpnnppnpppa noiiai - p iiioi aeeepa no aiinoooooooaioipiainoi - nponpeoi iioeeo onapippnnpppoeainiea - noiei on enanoae - noiinaapa aeaepe e - neiiiapana apopoeipo - opoiinponppaa apooioeiaea - opaoinpeoioopppaapnppoiapoipoapo - opaiina a ooioeooooopoooapoa - aaeoopipppaaaaaanppooa - a oooooooa - - diff --git a/codex-rs/tui/frames/openai/frame_12.txt b/codex-rs/tui/frames/openai/frame_12.txt new file mode 100644 index 0000000000..8940e05bd6 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_12.txt @@ -0,0 +1,17 @@ + + pooope + pnaaeipn + o ienpp + epiiinnoi + i oiiiieei + ioeeoaoaio + i ieniin + i epniio + op ieiipii + i eionoa + ie ionooe + p oi api + e ooiponi + oaeopinia + n oinee + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_13.txt b/codex-rs/tui/frames/openai/frame_13.txt new file mode 100644 index 0000000000..c73afab740 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_13.txt @@ -0,0 +1,17 @@ + + eooop + iaaii + iaaio + iooia + o ii + oepii + p ii + p oi + ep aie + io pni + oaee ia + iaaai + ippia + oaain + p eon + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_14.txt b/codex-rs/tui/frames/openai/frame_14.txt new file mode 100644 index 0000000000..8a273a1666 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_14.txt @@ -0,0 +1,17 @@ + + pooon + peaaen + iaiie i + iieioaip + iiin i + ioii oi + iiii e o + iinia n + iiii o + oaee ne + nioopepi + ioiiaaai + e oinnna + ineoaae + ao one + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_15.txt b/codex-rs/tui/frames/openai/frame_15.txt new file mode 100644 index 0000000000..5a0e8f1b54 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_15.txt @@ -0,0 +1,17 @@ + + ppoooia + apniiaeop + eeionniooi + iea eepeaai + iinonniieoai + niipiieei o + ii iiiiiipi + iieiipiii opi + iipppoiiiaeei + iaineinioe ei + ieiiiiai a n + iooeaiinp n + oinp eeea na + iaiinnepne + naoaaaae + aa \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_16.txt b/codex-rs/tui/frames/openai/frame_16.txt new file mode 100644 index 0000000000..06c519f602 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_16.txt @@ -0,0 +1,17 @@ + + anpooopia + eaiioiininn + ieeonennii on + eee noaniniiooi + iinaeooniioeian + iiioio inn i iei + nni eapiiiieoop i + ien iaiieiiion ai + nniiipieaiioop e + ooaapnnnoieai pai + iiipooeoninoneiia + iio ia aeep e + nio i epeapi + niioaoieepai + oeeaneaano + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_17.txt b/codex-rs/tui/frames/openai/frame_17.txt new file mode 100644 index 0000000000..0bd4ef6dfc --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_17.txt @@ -0,0 +1,17 @@ + + pnpppnnipa + anooiiionoipoap + poneannappoiiiaon + eieaeioaa oinniiinn + iea i ioennnee p + anopea peei epneiee + o nei peeia ooiieni + poni eeiieipiinno + peoennnpinainaeniii i + ioanaaieoneiin npopn + nnneooooooonaioeen no + niiao aeiia n + ann ona popeaae + p iopnnpaanoeio + apneappioapo + a \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_18.txt b/codex-rs/tui/frames/openai/frame_18.txt new file mode 100644 index 0000000000..de59f344ef --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_18.txt @@ -0,0 +1,17 @@ + + annpnnpnipa + apoanpppiaapopnna + aeeiooonopoeaopeen o + piioepaoo onaaeninnnnnp + anee ei aopaneieiannnna + eni ppieaaaepopiopeaeaei + iinee peoeioaeooininp + onpii anoiina inio + noo pnnnnnnpiipioenp ioia + anniono iieaanaiiianian p + ieinaoooooooa naaeieoeapa + nn pnp aaooeoao + naopaae aoaaenpa + oieooppnnnaooaeapo + oiiaeaapeponpo + a \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_19.txt b/codex-rs/tui/frames/openai/frame_19.txt new file mode 100644 index 0000000000..ade5662359 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_19.txt @@ -0,0 +1,17 @@ + + aannpipnniea + apiiinennnaoapiopp + ponneoipoa aoepaonn + eniopaa annppaiop + iieaea piaoeoin inp + ineoo aioie ee oeoi + aniio eoaeippa eeepi + iiii inoniop i iii + ioinpnnnnnniiiiponoin n oii + anepinoeaopnpap aa enanpeeia + onoepioooooooo anaeiee eeo + nnaoan aeeaeeo + o aniiop pnneeina + ooeioeipaanneoo noio + oieaepoapeaopa + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_2.txt b/codex-rs/tui/frames/openai/frame_2.txt new file mode 100644 index 0000000000..be49360bbf --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_2.txt @@ -0,0 +1,17 @@ + + aeaenpnnnppa + appeonpiiiniinaoiopa + pioinooioaa aoonoeiinip + aieaeooppa ppnieip + paoeoainanna apinip + oepoa ionpenp nnioi + piooi aeiniaip eoioi + io na pioiino ioeei + oooni niaaaioeipppppppppiaiio + anoi eiio eo innaaaaeeaaipe i + nnn o oneeio aoooooooooipoii + onaeep a ppnepo + enaaipp pnap aio + aianaaoopennnnenoaaiio + aopopiiaaaaineoo + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_20.txt b/codex-rs/tui/frames/openai/frame_20.txt new file mode 100644 index 0000000000..6eaf358e88 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_20.txt @@ -0,0 +1,17 @@ + + aapniinpnpaa + pnnonpapnnniiaaonpp + ppoapooioo aoaonpoipa + aioaoio appineonn + ai pio ae aiiaoniin + eapio poonioe oniin + ninpi po epoa pnie + iaaea ooneiop iioi + ieiinpnnnnnnnnaponaanno e in + oiaiao eaaaaaain onnoinn pe ii + npanoooooooooo npniipi en + o aoep aeoeie + naaopia pnoanoo + appeoipannpeoioapeoo + aopia naaaaiooo + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_21.txt b/codex-rs/tui/frames/openai/frame_21.txt new file mode 100644 index 0000000000..5f317f375c --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_21.txt @@ -0,0 +1,17 @@ + + aapnpnnpnppaa + ppoaaaapinipnaapopa + noaapoaoa aaiopaaop + poinoo apnopnop + epeoa piean nnaap + eoei pooaee nnap + ioia a eapeo nnno + an nn oip i i + i i ppnnnnnppp aipoip ne i + i in ia api aoaoip eoee + n oe aaooo oa ooapn ea p + op ena aoo e + oa apa aenoo pa + ona ooopeiinenooo pa + oppnpaaaapanpoa + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_22.txt b/codex-rs/tui/frames/openai/frame_22.txt new file mode 100644 index 0000000000..74b75b9113 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_22.txt @@ -0,0 +1,17 @@ + + appnpnnpnppa + apeoieaeieniinipeopa + pnoninooa aoonoopaapp + noiooo ppiiiaon + niieo paeinieenoi + nioea pieinaea ninni + ipone ipinoeo iiei + iinia iniian iaioi + iipop pinnnnnnppanoia np aino + ain oannp epoieei nonaoipp enn + nnnai ooooooooa aeopaeeeopa + nonanp aopoipo + oopn ppa aeopooae + oeoppooinnpnnenoooopo + oioianaaapnaenoa + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_23.txt b/codex-rs/tui/frames/openai/frame_23.txt new file mode 100644 index 0000000000..35e7fe2210 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_23.txt @@ -0,0 +1,17 @@ + + appanpoppnpaa + anipinapannpiaioipa + popiopnoa oiepinniip + enionea annniinn + eeiaeo peppooeonin + pnioea aoooooeooiinip + aiioi eeee aia o ioo + iei i ioipanp i oei + aon ipinnnnnnnniaoiaona i iii + innaiono ean nianpi nai + eoi i aooooooo oaenniaeaea + piiaie peinaea + n ipoeaa aeonoepe + nnnpnopninnappopapoa + oi onniaapaaooa + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_24.txt b/codex-rs/tui/frames/openai/frame_24.txt new file mode 100644 index 0000000000..a74ea1f0bb --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_24.txt @@ -0,0 +1,17 @@ + + aianpponnpa + poaeoiaainnppaop + poonnepoi eaeoioop n + poeepeinpnaiea aoninao + p eenep aooenaiaanipo + ipnpna oppe ein eon + i ii peapeoeaninaia + i nii ipnenaiiaeeaii + ie innneppiiippaopai i ii + a e oieppnnppieanpoi ioi + n oninoooooooa npeoninepa + n npon i oene + neonaie anoaeeao + epopnaoiiennniaaea + oeaopnnaannpo + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_25.txt b/codex-rs/tui/frames/openai/frame_25.txt new file mode 100644 index 0000000000..c2c5b30b29 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_25.txt @@ -0,0 +1,17 @@ + + apnonppppa + p opoaannioiip + eieeppoeipnnniiia + ipoi e ni onipone + paanpeoaneaio ieeneo + npiiiaopeaie eipieeip + ieioi iaaenaeineaoini + iiieieo ianneinainiin + apnioiaannnnpiinnipoin + epoieipiaiinoainoneni + nioeniaoooooopeinieia + iaoinpnnppoeaepeeie + aaaianaonepaeaiie + nennnaonioo oio + ipoonppapio + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_26.txt b/codex-rs/tui/frames/openai/frame_26.txt new file mode 100644 index 0000000000..09a947d35d --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_26.txt @@ -0,0 +1,17 @@ + + anoooopp + eoinenipnip + eoooinninoonp + noopiiiaiiapea + iapnieiooneninn + n oieeeooanonne + i ooniieiinnop + ep niiiaaniieii + i enonpipnnenii + eaiepiaaponnoi + iaoeioonpeapnii + naiien eeoiia + o oin aaeiep + ioonnooaoon + neeaoiano + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_27.txt b/codex-rs/tui/frames/openai/frame_27.txt new file mode 100644 index 0000000000..b3fef11ac8 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_27.txt @@ -0,0 +1,17 @@ + + nooopp + ineeien + noa oieoi + iiiaiinii + i aiapon + iaeaoaiiia + n oiiaoii + i aiiinoii + ie e ipiiii + on eoaiaoii + ip aaoopeo + iippiiaei + innpnpeia + naainnee + ono ane + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_28.txt b/codex-rs/tui/frames/openai/frame_28.txt new file mode 100644 index 0000000000..11fdcec520 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_28.txt @@ -0,0 +1,17 @@ + + eoon + ipaia + n nia + ipaoi + i ii + i poi + aii ai + ipooi + en ai + iieeii + i ai + inpni + inoii + oaaei + i epi + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_29.txt b/codex-rs/tui/frames/openai/frame_29.txt new file mode 100644 index 0000000000..2dc6c66753 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_29.txt @@ -0,0 +1,17 @@ + + poooop + pioe on + apii ooi + iiiianpe + n ioi i + ipiii aa + inniii a + iinii + iiioi a + ainii a + oiieia n + ieiii ai + iiiiaiai + inioeoio + iio ep + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_3.txt b/codex-rs/tui/frames/openai/frame_3.txt new file mode 100644 index 0000000000..9026d59a43 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_3.txt @@ -0,0 +1,17 @@ + + aennppnnnnpa + appeniipionninaaiopa + pneonioooa aoi oopeaip + epeninppa ano iin + oeoieaeiiona naniia + einne epinnnn i nni + no i ooniaoip eoeip + ppipi ppioeni iaini + pooi niopiiopinppaaappaiaoni + pnenp eeoenni ioiaap nepnnainia + oai i oiippo ooooooooopeeepe + ooi np a eapaee + naeeonp ppneopio + nappaooannnnpenonaapo + aopoaeiaaaaineao + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_30.txt b/codex-rs/tui/frames/openai/frame_30.txt new file mode 100644 index 0000000000..73b4906d0e --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_30.txt @@ -0,0 +1,17 @@ + + anooopp + aeniinoonn + ooaipnnippn + iinieianin np + noiianipip i + ioiap oiiiiei + neiiina neni na + oi opnipioip a + oiaoninineip a + oiiniaaii pp a + niinnaoiiipii + ioeepeoniio i + niniieoiipie + pappnaeipeo + npeiaaano + aaaa \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_31.txt b/codex-rs/tui/frames/openai/frame_31.txt new file mode 100644 index 0000000000..cc71fce920 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_31.txt @@ -0,0 +1,17 @@ + + aeeopopnp + aponppaopnoop + pineepnaaeoiaon + piepaaonapnniniin + aiiiipponaponieaa + niaaiaioonnopeeipoi + eii iaoinenenoioiei + nnp iioin iaooiinei + inpaioaiiiepiiia i + oiiieeiiaaanainii o + aoaepip eoooaeioia + iiinnnp ano i + niona p e ioaea + einieaiapiopia + ooniapoeeno + aaaa \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_32.txt b/codex-rs/tui/frames/openai/frame_32.txt new file mode 100644 index 0000000000..c0d6573da7 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_32.txt @@ -0,0 +1,17 @@ + + pppppnnipa + noiooiniiooiip + eaonappaepaoionoop + oeeiapanp p panipp p + eeipionooin oapinenonp + nennpnoiaeiipa ipe o + oionpaoniippipnaeaeeioa + iiipa oaiioeoinpaoniooa + niipa oaioaaipppiiiniona + oooaaiononaaaaaiioinipa + pnoiie iooooooaneeeee + npiann pnieoi + oooiiipa aeaie p + npnoipinnoaapoae + innaappeoaoo + aaa \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_33.txt b/codex-rs/tui/frames/openai/frame_33.txt new file mode 100644 index 0000000000..56ef96d36a --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_33.txt @@ -0,0 +1,17 @@ + + appnpnpniea + apoiinonieipioioe + aenipoppnoa ooeiipop + pneieaipa oiinao + aeieaiienan ipnna + eep nannanp enean + iip npoiain ioii + oipp poonenp noio + iii i pa eopppnnnpiipeaini + aeiooeepeaiiaaaaaiioaaaiie + nnnp ieie e ooooooo iipeaa + npnopop eenene + onooponp apipeono + nioonpipnpaonpnoio + onnppaaaaponpo + aaaa \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_34.txt b/codex-rs/tui/frames/openai/frame_34.txt new file mode 100644 index 0000000000..b6e87c62f1 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_34.txt @@ -0,0 +1,17 @@ + + apnppppnipa + apopennioiponoonpna + aeepiooeioa aannpooop + peaioaepa oiponn + eeinpei io p nnona + peniae nnoinon npnin + ioaia onaoiaa inia + ninoe ioaieoi e an + poeeo eneeoannppppppiaao iaa + iinpeppaoeeoiiiaieaaapeaiiain + eanp inioa oooaaaaa pepnio + epnnnna eneieo + npaipnnp apnoaepa + pneioippnppnonoapoeo + oinnnaaaaannona + aaa \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_35.txt b/codex-rs/tui/frames/openai/frame_35.txt new file mode 100644 index 0000000000..899d6766b7 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_35.txt @@ -0,0 +1,17 @@ + + appnnpppnppa + ponoeioopoioieoiona + aeeinpoiaooa aoonoeoiop + peepepnpa opania + eeiieen onop inoip + nenepa oiaoeeoa inni + n ee nn ooae iann + iiie ennneo e oe + e pa piienoeinnananpii iino + ipano eenoopein npaaaaeoieo io + eanpoenaieaa aoaaaaoaaoeeapi + oeanei aeo pa + nnaanpep pneaooo + oaaoioipeiipineooaeno + oainnaaeaappooa + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_36.txt b/codex-rs/tui/frames/openai/frame_36.txt new file mode 100644 index 0000000000..9a23d2ddd6 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_36.txt @@ -0,0 +1,17 @@ + + aapnppppnppa + anoonpenepnpnppooopa + pnonppopooaa aooiopipoip + aioopaaaa ooinoi + peannoinanpe aneo + e pea oa oiep onao + i n a n onn iaip + iini an aee ni i + iooi ee pooopppapppppa inii + aoin piaaeie aiaaaaaaaii neoa + o oin papea oooaaaaao ipoe + oponne peioe + neiipip pppoepa + opaooonaniapinopopnpo + aopeiappappppooo + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_4.txt b/codex-rs/tui/frames/openai/frame_4.txt new file mode 100644 index 0000000000..0c76cc5ce8 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_4.txt @@ -0,0 +1,17 @@ + + aennpnnpnppa + apopoie inneonioeopa + poniiipooa aainaoienna + eeipioepp oioonon + eieaininnaip nonion + eiiai oaiieon o nnip + onina ooonpoip p oni + ien pieoaii iii + ai ia nieoaeepipppaaaapp iio + ine i peeepaiannipeapeeanieeoi + ainonpnnpne oooooooooapiiia + pinoiaa paneooo + nnpea pa aeaponie + iiinaoonnnnnppnopnioa + onnieiaaaaanpoa + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_5.txt b/codex-rs/tui/frames/openai/frame_5.txt new file mode 100644 index 0000000000..2b06cade09 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_5.txt @@ -0,0 +1,17 @@ + + aennnpnnnppa + apopeoeiipinpnaiopp + oaenpiooa oanion pop + pieieienp paiiiia + pneoeaapianp a ninia + iiiie nainneia peii + iei p anainoip ooipip + ieiao panieai piai + ipiao eaiopionaipiaaappaoiei + aninppepoo io eennapnepeieoia + npiipipnnepa oooooooopinine + nnpenn a eaeopa + aeoninpa anppoono + aioipopnninappnoaino + apoaooaaapappoa + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_6.txt b/codex-rs/tui/frames/openai/frame_6.txt new file mode 100644 index 0000000000..2ca8bb0bc7 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_6.txt @@ -0,0 +1,17 @@ + + aennnpnnppaa + paneoinopippnapopa + pppiiioo aoienopoena + epioioanp npiiiip + oniiionnpon enninp + npeieaapninaip ennei + a pii aniean apiai + i iii ainieii ipnii + aeipi eoiionepaipiaappaenei + iinpeaaanp ienopiipnnnnipin + e i eiiineo ooooooooannei + p n epa peaeeia + eanaoop apaaeopp + aoiopop niaappoo eno + apnoppaaaaappo + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_7.txt b/codex-rs/tui/frames/openai/frame_7.txt new file mode 100644 index 0000000000..f66ddaf5a6 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_7.txt @@ -0,0 +1,17 @@ + + aeinopnnppa + poapnipopnnnn aop + o piiioa aaia oeaop + nniiiinp ainoiep + aoioiiaienp e oiin + i niio aonnin ppiii + anoi aainini ooaii + aoeii npeioia o iii + eoio poaeineiinnaiinnonii + ipoiineiieoieniinnpnpnnini + n naeoioae ooooooooaeii + oa eaeaa popeneo + onppnnna paipoeoo + naonionniaaapoiope + oiooieiaapanoo + \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_8.txt b/codex-rs/tui/frames/openai/frame_8.txt new file mode 100644 index 0000000000..e54163d2c8 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_8.txt @@ -0,0 +1,17 @@ + + aapanppnppa + pooeiiionn i op + ainpieeo poieionpap + aonoeippi o naiin + o eiepnien eoniip + iopinaaaniao npiii + ioiii oanniai iaieip + npiie ipneipoe eaeii + n niiaa eoniiepppppniii + noenaiopipiininaaiino + eenniniiieoaoaoonooeni + opoiniaa epeeeo + onaonnna aenaipeo + eeoipo nnponenpia + iiaooniappena + aa \ No newline at end of file diff --git a/codex-rs/tui/frames/openai/frame_9.txt b/codex-rs/tui/frames/openai/frame_9.txt new file mode 100644 index 0000000000..a339de1118 --- /dev/null +++ b/codex-rs/tui/frames/openai/frame_9.txt @@ -0,0 +1,17 @@ + + enaoeppnp + eoaeiioon apna + e piieoaane naip + o iienna aapinaipp + eoonnooiop oeopepii + i iiioainnaa ioioiii + a ioniooinnpoepe aii + i ieapniiiaennai ii + opio eioiiiipiipiia + iaiiiapiaiaiiiiaaiii + o aaennieoooooiioeni + niiinpa pe aeia + npninn enanieo + aponaioepnnnoia + opa onninpeo + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_000.txt b/codex-rs/tui/frames/shapes/frame_000.txt deleted file mode 100644 index 34689f7cdb..0000000000 --- a/codex-rs/tui/frames/shapes/frame_000.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆◆◆◆●□□□□□□□□□▲◆◆ - ▲◆□◇△□■□□◆◆◆◆△△△◆◆■□◆□□□◆ - ◆△◇○□■□◆▲◆◇□□◇◇□●□◇■□□□□▲◆ ■□◆ - ▲□◇△▲□◆□▲△□□ ▲◇◇■□□●◆ □▲ - ◆□◇△▲□◆△△ □■□◇▲○□▲ - ▲◇◇△△■△◇ ▲○▲◇◇◆○○ - △△◇△■ ◇□ ◇■○○○□ ○●○◇▲○◇ - ▲△◇◇□■◇◆ □○◆■◇△◇◇ ◆□○○◇▲○◇ - □□◇◇○◇□ ◇□●○○○◆△◇ □▲□◇◆○▲ - ◇○■◇◆◆◇◇ □○◇□○△◇◇○△ △◇◆◇◇ ◇ - △◇●◇ ○◇ □◆△△ □◇△ ■◇◇◇△◇ - ■ ○○ △◇ ■◆△◇◇■ ●□ ○◇◇◇◇ - ◇◆◇◇ △ ▲◇△△■ △◇◆ ◆●●□●□□□□□□□□□▲ ◇△△◇ ◇ - □◇● ◇▲ ◆△◇◇□■ △□◆ △◇◇●○□□□□□□■■■ ◇●○◇○◇ - ○△◇○△ ◇○ □◇△◆ ◆◇◆ ■◇■▲▲▲▲▲▲ ◇ ◇◇■◇◆ - ○○◇◇◆○◇▲ □□□□● ▲△◆△△■△△ - ○○○◇ ○●◆ ●□●□△◆△△ - ○◇◇◇▲ □◇○◆ ◆◇◆□◇□◆◇■ - ■▲□□◇▲ □▲□□ △◆□□◇□□□▲●□ - ■◇□◇◇□ ◆○▲□□○◇□◆◆▲▲▲□□□□◇□◇□□■◆▲□◆ - □■□□□●▲◇◇□●◇△■□□●◇◇●□□■ ◆□□■ - □□□●◇□◇◇●◆◆◆◆◆◆▲□●□□◆ - ◆◆■■□■■■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_004.txt b/codex-rs/tui/frames/shapes/frame_004.txt deleted file mode 100644 index 90b7986ec0..0000000000 --- a/codex-rs/tui/frames/shapes/frame_004.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆◆◆◆●□□□□□□□□□▲◆◆ - ▲◆△◇△□■□□■◆▲◆△△△ ■■□◆■□□◆ - ◆△◇◇□◇□◆●◆◇□□◇◇□●◇◇■□□□□●◆ ■□◆ - ▲◇□△▲□◆□◇△□■ □■□○●◆ □▲ - ◆□◇△▲■◆●△□ ■□■□◇▲○□▲ - ▲◇◇△△○△◇ ○△◇◇◆○○ - △◇◇□■ ◇□ ○●■◆○○□ □●□◇▲■◇ - ▲△◇◇□◆◇◆ □○◆○○△○▲ △○■◇◇○◇ - □□◇◇△◇□ ◆◇◇◇○○○○ ◆■▲□◇◇○▲ - ◇□■◇◆ ◇ ▲○◇□□○△◇■ ◇◆◇◇ ◇ - □◇△◇■◆◇ □◆△◇■ △□△ ●◇◇◇■◇ - ■ ○△ □◇▲ ◆△◇◇■ ▲●□◆ ◇◇ ◇ - ◇◆◇◇■■□○ ●◇△△△ ●△◆◆ ◆●●□●□□●□□□□□□▲ ▲ △◇ ◇ - □◇▲ ◇◆ △◇◇□■■△□ □ ◇○□□■□□□■■■■■□ ◇●○◇◆◇ - ○■◇○◆■◇▲ □◇△■ ◆◇■ △▲□●□□◆◇◇◇●●●□□ △△△◇◆◇◆ - ○○○◇▲○◇◆ □□□□ ◆ ▲△◆△◇■△△ - ▲○○◇◆■○□◆ ◆□●□△■△△ - ○○◇◇▲△□△○◆ ◆△●□◇□◆◇■ - ■▲□◇◇◆ □▲□□ ◆◆□□◇□□◇◆●□ - ■◇□◇◇□ ■□▲□□◇◇□◆◆▲▲▲□□□◇◇●◇□□■◆▲□◆ - ◆■□□□●◆△◇◇●□◇■□□□◇□●□□■■◆□□■ - ■□□◇◇□□●●◆◆◆◆◆◆▲□●□□◆ - ◆◆■■□■■■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_008.txt b/codex-rs/tui/frames/shapes/frame_008.txt deleted file mode 100644 index 2a60281047..0000000000 --- a/codex-rs/tui/frames/shapes/frame_008.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆◆◆◆●□□□□□□□□□▲◆◆ - ◆◆△◇□□■◇□◆◆▲◆△△△ ◆■□◇■□□◆ - ◆△◇◇□□□◆△●□□□◇□●●◇◇■□□○□●◆ ■○▲ - ▲◇◇□◇■◆◆□◇□■△ □■□○●◆ □▲ - ▲□◇△△◆▲◇□ ■□◆□◇▲■□▲ - △◇◇▲■◆◇□ ▲▲◆▲ ■○◆◇◇◆○○ - △◇△▲▲▲◇■ □◆■▲○□△ ○□◇▲○○ - △◇△◇ ▲◇ ○◇■■○■▲□ ○○◇●○◇ - ◇◇◇○ ◇◇◆ ■◇◇●◇▲○◆ ■○□◇▲◇◇ - ◇◇◆◇ ◇◇■ □◆ ◇○◇○■▲ ◆◇◇ ◇ - ◇◇◆◇ ◇■ ■□◇◇● △◇△ ◇◇◇○◇ - ▲◇△● ○□ ◆□◇◇◆ ◆◇○ ◆ ◇◇◇◇◇◆ - □□◇◇ ◇◇ △△△□◆ ◇△ △◆□●□●□□●□□□□□□▲ ◆□◇◇ ◇ - ■◇○◇ ■△◇ ◆◇◇△◆△◆◇■ △○◇◇□□□□□□○■■■■■ ◇◆○◇◆◇ - ◇○◇○ ○○◆ ○■□△△ ▲□ ○◆□◇□□◇◇◇◇●●●●□ ▲□◇◇◆△■ - ◆◇◇● ○○◆ ○□□□■ △■△△□▲△ - △◇◇○ □◇◇◆ ◆△●□△■▲□ - △□◇◇◆ ○□□◆ ◆△◇□▲□◆◇□ - ○ ○○□◆ ○◇□□▲◆△◇ ◆◆□□◇□□◇◆●□ - ■◇□◇□△ □□◇□□◇◇□◆◆▲▲▲□□□□◇□◇□□■◆◆□◆ - ◆◇◇□▲◆◆◇◇□●▲△◇◇□◇◇◇●□□■■◆◇□■ - ■○□◇◇◇□●◆◆◆◆◆◆◆▲□●□□◆ - ◆◆■■■■■■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_012.txt b/codex-rs/tui/frames/shapes/frame_012.txt deleted file mode 100644 index 29f6d751a7..0000000000 --- a/codex-rs/tui/frames/shapes/frame_012.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆◆◆●□□□□□□□●▲▲◆ - ◆▲△◇□□□□■◆◆▲▲◆ ●◇◆■□◇□□□◆ - ◆□◇△◇□◆▲◆●□□◇◇□●●□□□□□○○●▲◆□■□▲ - ▲△□◇□◆○◇□◇□■△ □◇□□◆▲ ■□◆ - ◆◇△◇■●●□□■△△ □◇□◇◆ ■○ - △◇◇○■◇△□ ▲▲▲◆ ◇□◇ ○○◆ - △◇◇△◆◇◇◆ ●○◆▲□▲□△ ■○□◇◆○□▲ - △◇◇△◆◇□△ ○□○◇○○◆○◆ □△◇▲○○◆ - ◇◇□◆◇◇■◆ ○▲○◇◇○○■○○ ○■◇ ○◇ - ◇◇□ □◇■ ○○□◇◇◇▲□◆ ■◇◇△ △▲ - ○◇◇ ◇◇ □△○◆◆ ●◇ ◇◇◇ ◇◇ - ◇◇◇ ◇◇■ ▲◇◇□ ◆□△○ ◇◇◇◇◇◇ - ▲□◇ ◇◇▲ △◆△◇△■◇□△■ ▲□●●●□□□□□□□□□▲ ◇◇◇ ◇◇ - ◇◆ ◇△ ◇◇△□◆▲◇□ ◆ ◇◇△□□□■□□□□■■■■■○◇ ○◇□◇ ◇ - ◇◇◇ □△◇ □◇◇ ▲△◆◆■ ◆○□●□□□□△◇◇◇◇●●●□◆◆△◇◇▲△■ - ◇◇○ □△○ □□□□ ◆△△△△●◇ - ○◇○ ■▲□▲ △◇□△■△◇ - ○◇◇▲ □▲□□◆ ◆▲◇△△■◆△□ - ■◇◇◇◆ □□□□□◆◆ ◆●□◇○△◇△●△◆ - ◆■◇◇◆ □□◇□◇◇□□◆●▲▲▲□□□□◇◇◇◇□◆◆◆□◆ - □□□◆△◆ ■□□●◇◇◇◇◇◇□□□□◆ ◆□□■ - ■□■□□▲●◆◆◆◆◆◆◆◆▲●●□□◆ - ◆■■□■■■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_016.txt b/codex-rs/tui/frames/shapes/frame_016.txt deleted file mode 100644 index 96743807fd..0000000000 --- a/codex-rs/tui/frames/shapes/frame_016.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆◆◆▲□□□□□□□□▲▲◆ - ▲◆△□◇□□■◆◆△◇◆▲▲◆■□◇■□□▲◆ - △●△□■◆◆●□□□◇◇□●●□□◇◇◇△○◆◆■□□○▲ - ◆△□□◆▲●□□□□■◇ ◆□□◇○□◆◇▲□○◆ - △□□△◇◇□□□ ■□◇◇◇●○□● - ◆◇◇△●◇□ ▲▲▲ □◇◇▲■▲□▲ - ◆◇◇◇△◇△■ ◇◇■○◆◇▲ ○◇● ○○○ - ◇◇◇△◇ □◇○△■▲□○◆ □◇◇ ●◇○ - ◇△△◇◇△ □◇◇○◇○◆□○◆ □◇● ▲◇▲ - ◇△△◇◇ ○○◇◇◇○■○◆△ ■◇◇ ◇◇□ - ◇◆◇ ◇■◇ □◇◇ △□●◇■ ◇◇ △○ - ◇◆○ ◇■△ ●□△△■◇▲■■ ■◇■ △○ - ◇△ ◇◇◇ ◆△▲□△◇◇□ ▲□□□●●□□□□□●□□▲ ■◇□◆◇◇ - □◇△◇△○▲ ▲◇■△●○□△◇ □△□□□■■■△■■■■□□□◇ ◆◇◇▲△◇ - ■○▲ ◇○◇○ □▲○△○●□ ◇○□□□□□□◇◇△◇◇◇◇□ △○■◆○◇ - ○○▲ ○○□◆ □□□□◆ ◆◇○◇△■□■ - □○□ ○■◇□ ▲◇▲◇□△◇■ - ■◇●◆■○□◇□◆ ◆▲◇◇□▲▲◇□ - □◇●◆■○▲◇◇□◆◆△ ◆●△◇◇□◇◆△△ - □◇◇▲◆■□◇◇◇□◇□□●●▲▲▲▲□□□◇◇◇□□ ◆□□ - ◆□□◆◆◆ ◆□□□□◇◇◇◇◇◇□□□■ ◆▲□△■ - ■◇□●◇●▲◆◆◆◆◆◆◆◆▲●●□□■ - ◆■■□□■■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_020.txt b/codex-rs/tui/frames/shapes/frame_020.txt deleted file mode 100644 index b7365eb5cb..0000000000 --- a/codex-rs/tui/frames/shapes/frame_020.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆◆◆◆□●□□□□□□▲◆◆◆ - ▲◆△◇□□■◆◆○●△▲○◆□□□□□□□●△◆ - ▲●□◇■▲◆●●□◇●□□●●□□△□◇□□◆■◇□○△◇ - ▲□◆◆◆●△□▲□□ △○◇○◆■□□□□◆ - ▲□ ▲▲□□▲■◆■ ■□◇○■○○○□ - △◆ ◆◇□△○ ▲▲ ○●■▲○△▲ - △ ▲◇◆◇ △■○■◇ ◆○○ ◇□○○ - △◆ ▲◇▲■◇ ◇△△□▲○○◆ ○○ ◇○◇▲ - ◆□▲◆◇◆△ ■◇○◇▲○■◇○ ◇▲ ●◇□ - ◇ ◆◇◇◇ □◇●□□▲○○◆ ■◇ ◇□◇◇ - ◇◇■◇◇○ ◆○◆◇□ ●◇◇■ ◇◇○◇△ - ◇△■◇◇○△ ▲■△ ●△□△◆ ◇○■◇◇ - ○◇■◇◇◇◆ △△△◆●◇◆△ ◆●□□□□●●●●●●●●▲◆ ◇○○◇◆ - ■▲○○◇△○△ ◆□□□△□□ ▲□□□□□□■■■□□□□◇△ ○◇△◇◇ - ◇○○◇○■◇ ○■△▲△◆ ◇□□□□□□◇◇○◇◇□◇△ ◆○○◇○▲ - ◇○ ◇○△○ ◆◆ ◆□△△△△ - ◇○▲○■▲□◆◇ ▲△◆◇□○△ ◆ - ○◇▲■□□▲□◆ ◆▲□△◇◇◆△▲ - ■◇●◆■○●◇□□▲◆△ ◆▲△□◆◇◇□▲■■ - ■□◇▲ □□◇◇◇◇□□□▲▲▲▲▲□□□◇◇□□□◆●□▲■ - □□□◆◆ ■□□□□□□□◇△△●□■◆ ◆□□□○◆ - ■□□◇◇▲▲◆◆◆◆◆◆◆▲▲□□□□ - ◆■■□□■■◆◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_024.txt b/codex-rs/tui/frames/shapes/frame_024.txt deleted file mode 100644 index 052f0174a8..0000000000 --- a/codex-rs/tui/frames/shapes/frame_024.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆▲◆□●□□□□□●◆◆◆ - ◆△●◇■◆ ■ ■□■○■□◇□□□▲●▲◆ - ◆△■ ◆▲□□■●□□●●□□○●▲◆△■◇■□□□▲ - △□ ▲□□◆□□○□ ○◇□○▲○■□□○◇○ - ▲□ ◆△□■▲○ ●□□○ ○□○◆○ - △ ●△◆▲ ●□◆▲ □▲□□●○▲◇ - ◇ △△▲○ ○□◆◇ □○□■◇○○◇ - ◇ ◇△△○ ◇◇■○□▲ ◇◇■◇○△◇ - ▲◆ ▲◇ ○ ◆○□◆○ ●○▲□▲◇□● - ◇△◇◇◇△ ◇△○ ■○○ ■□◇ ◇○■■ - ◇△◇◇◆▲ ○◇ □○□ △△◇◇◇○ - ◇○◇□◆◇ ■◆□ ◆□■ ○◇◇◇◇◇ - ◇△□△◇□ ◇△◆■■△△ ◆●□□□●●●□●□●●□◆ ◆■ ◇◇◇◇ - ◇▲◇□◆◇ ◆◇■■◆◇□ ◇●○○□□□□□□□□□□◇△□ ◇◇■◇△◇△ - ◇△■▲○○◆ ○◆▲●◆ ■□□□◆□□◆◆◆□□□◇△ ◆◇△□○■ ■ - ◇◆□▲○■▲ △◇○■△ △ - ■◇◆□▲○■○ ◆■○◆□■ ▲ - ◇◆ ○■□□□◆ △△□▲◆△◆△ - □◇◆■◇○○●□□◆◆ ◆□□◆□■●■○▲◆ - □◇◆◆■○◇□□◇◇○□□●◆◆◆□□□□□▲□△●△▲□▲■ - ■□◇▲◆ ■□□□□◇□□□◇□□□◇□□□□▲◇■◆ - ◆□□□●●●◆◆◆◆◆◆▲□□◇□□■■ - ◆■■□□■■◆◆◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_028.txt b/codex-rs/tui/frames/shapes/frame_028.txt deleted file mode 100644 index f27f4fc2ad..0000000000 --- a/codex-rs/tui/frames/shapes/frame_028.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆▲◆◇●□□□□□●◆◆◆ - ▲●□□◆ ◆□□◇□◆◇△ - ◆●□◆ ◆▲□□■◇◇□●●●□○□◆ ◆○□□◆□▲ - ◆△■ ◆□□■▲△ ◇○▲ □□●◆□▲ - ▲■■◆△□ ▲○ ○◇□ △○○○◆○ - ◇△△△△ ◆ ▲□ □◇▲◆○○◇▲○ - ◇■△◇□△ ◆ ■▲□□■ □○■□○◇△○ - △◇◇△□ ○ ▲○■○□● □▲△○▲○△◇ - ◇◆○◇△△ ○○◆○○ □■ ◇ ◇◇○ - ◇■●□◇ ▲○□■▲○■ ◆◇ ■◆◇ ▲ - ◇●◇◇◆◇■ ◇ ◆ △○□▲ ●■○■◇◇△■ - ◇ ◇◇◇△ ◇◇■■□■ □ ■◇■◇◇◇△ - ◇◇ ■◇◇◆ □▲▲ ▲■△◆▲●□□□●●●□□●□● ▲■■●◇◇△ - ◇ ◇◇ ◇ ◆●◇△ △◆ □△△△□○○●△△△□○◇▲ ◇▲◇◇△ ▲ - ◇◆○△●■ ○□◆ □●●●◇◆◆◆◆◆◆◆□■ ●△◆◇● △ - ◇○○■◆□ ◆◇■◇ ▲ △ - ■◇○○◇◇□○ ▲◇△△◆■ ▲◆ - ◇▲○●□▲ ◆△□◆△◆△ △◆ - □◇◆□●◇◇□ ◆ ◆◆□□◇◇□ ■◆□ - □◇●■◇□◇◇□◇○●□●◆□□□□◇◇◇□◆▲△◆◇◆△◆ - □◇□▲◇◇◇◇□□□□□□◇●□■▲◆◆△△○△□ - ■□◇□□◇◇●◇◇◇◇○□□◇◇■□■ - ◆■■□□■■◆ ◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_032.txt b/codex-rs/tui/frames/shapes/frame_032.txt deleted file mode 100644 index 7de2bb926d..0000000000 --- a/codex-rs/tui/frames/shapes/frame_032.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆▲□●□●●□□□●●◆△ - ◆△△□■ ■□◇○◆□□◆ - ◆●□◇◆▲□□■□◇□●●□□□▲ ◆○□□■■□ - ◆◇□●◇□□◆□□◇△ ◇○▲ ○○○ ■▲ - ▲□◆◇□■ △● ◇▲ ◇○▲ □◆ - △□▲◇□△◆ ◆ △◇○ ○○▲◆◇▲ - △□△◇□◇●◆ ◇○△○ ■△◆■○ ◇■◇◆ - ◆◇○△□ △ △○○▲○ □ ▲ ○○○ - ◇▲○◇ ■ ○▲○○◆○◆ ○■○▲◇▲○◇ - ◇ ◇◇ ◇ ◇○△■▲□△ ◆▲○▲◇■○△ - □○◇◇□■ ○○◇△■△△○△ ◇◇◇△■◇◇ - △□◇◇○ ■▲△□■△◇■ △ ◇◇◇◇□ - ◇◇◇◇■◇ ◆◇◆◆◇◆ ◆▲□●◇●□●●●●□ ◇▲◇□◇◇ - ◇▲△◇ ○ □○◆◇△ ◇○□□□●●○△●●○△ ●■○◇◇◇◇◇ - □◇◇▲◇ □□□□●◆◇●◇◆◇□ △◇△◇ ■ △ - ◇△○△◆■◇ ◆◆ ●□◇△△■ △ - ◇○○◇◇△○ △□◆△◇△ ▲◆ - ◇◇□□○◆□ ◆◇■▲△ △△▲◆ - □●○○□□▲□◇ ▲◇□◆△□▲◆◆△ - □◇◇□▲□□○◇□●◇●▲▲▲□□◇◇□◆▲△◆○ □■ - □◇◇◇◇□◇■□□□□□□□■◆△◆□□○◆△◆ - ◆□□◇●◆◆◆◆◆◆▲□□●□■△□■ - ◆■■■□■■◆ ◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_036.txt b/codex-rs/tui/frames/shapes/frame_036.txt deleted file mode 100644 index 2bcc314b12..0000000000 --- a/codex-rs/tui/frames/shapes/frame_036.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆▲□□□●□□□●◆◆△ - ◆◆□□■◆●△△ ■■□■□◇□□◇○▲ - ▲◇□●●□□□□■□●□□◇▲ ■△○□ ■○◆ - ◆◇□◇△□○◆□■ □▲ ▲◇◆◆■○ - ▲△▲◇□■ ◇◆ ○○▲▲ ○◆ - ▲△▲△△ ◆ ○ ■○◇○△□◆ - ◇▲△△ △○○◆□ ○ ○○○▲○○ - ◇◆◇◇ ○○■△□◆■▲ △○○ ▲◆○◇ - ◇◇○◆ ▲■▲△◆□○ △ ○◆■○○△◆ - ◇ ◇■ △■◇◇▲△●○○△ ● ◇◇▲▲◇◇ - ◇ ○■ ◆◆○■▲△○●△ ◇ ◇◇◇ ◇◇ - ◇○●○ ■◇△ △□■ ◇ ○◇◇◇■◇ - ◇△△□ ◇ ▲□△◇■ △◆□□□□□□●□● □◇◇◇◆◇◇◇ - ◇◇△◇○▲ □ △■ ◇□□□□□□□□□○○ △ ◇□◆◇◇◇ - ◇●△◇ ◇ ○□□□□□◇●◆◆◇□ ◇■◇■◇◇◇◆◆ - ■◇□■◇ ◇ ◆◆◆◆◆ ◆△ △▲△ ◇ - ○◇◇◇● ○ ▲◇◆◇ △ - ○◇◇○○◆□● ▲□ △■ ▲◆ - □◇◇▲◇○◆□ ◆◇□▲▲◆△■ △ - ○◇◇□□△□◇□○□●◆▲▲□◇◇◆◆□●◇○ ▲■ - □□◆■□□□□◇□◇□□□◆△◆●□□◆▲□ - ■□▲●◆◆◆◆●◆●□□▲□◆△□◆ - ■■■■◆◆ ■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_040.txt b/codex-rs/tui/frames/shapes/frame_040.txt deleted file mode 100644 index 88a3dc56b4..0000000000 --- a/codex-rs/tui/frames/shapes/frame_040.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆▲□□□□□●□□◆◆◆ - ▲●□■◆△○○◆□□□◇◇●□◇□□◆ - ▲◇■◆□□□□■◇●□□●◆■■◇□◆ ◆○◆ - △■△◇■◆●□■ ■□■○ □○ - ◇◆□◇◆ △■△◇▲ ◆◇ - ◇◇□◇ ◆◆▲○ ▲△○■ ○◇ - ●○△◇ ■○○◆◇○ ■△■○○○▲○ - ◇◇◇◆ ◇○○ ◇○ ▲■○▲◇◇ ○◆ - ◆■◇◇ ○○○ ○○□ ◆◇◆◇◇◇◇◇ - ◇◇◇◇ △◇○▲◇○○○▲ ■■◇●◇△▲□ - △◇◇◇ ○◇○△○◇▲▲ ◇△◇◇◇◆◇◇ - ○△◇◇ ○◆△△■ △ ◆ ◇ ◇◇◇◇◇◇ - ◇■◇■ ○△◆△ ▲◆◆□□□□□□□□ ■◆◇◇◆▲△◇ - ■△△▲ ■△ ▲□□□□□□□□□◇◇ ◇ ◇ ◇◇◇○ - ◇◇△▲ ◆□□□□◆◇●◆●◇■ △□◇■◇◇◇◇◇ - ◇△△◇▲□ ◆ ◆◆◆◆◆ ◇ ○▲◇◇◇◇■ - ◇◇○○ □◆ ◇◆◇◆△◇◇△◇ - ◇○□□◆□○ ◆◇◆△△△■ ◇ - ◇◇▲◇○◆□ ▲□◆■△△○ ◆△ - □◆■□○●▲◇□□□▲▲◆▲□■▲▲△□◆ ▲□ - ■□◆ ■□□◇◇◇◇□□◆▲●○□○ ▲□ - □□●◆△▲◆◆□□□△□◆●□■ - ◆■■■◆◆ ◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_044.txt b/codex-rs/tui/frames/shapes/frame_044.txt deleted file mode 100644 index 573c742db9..0000000000 --- a/codex-rs/tui/frames/shapes/frame_044.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆▲□●□□◆□□□◆◆◆ - ▲△□◆▲▲▲□■□◇□◇● □□◆ - ◆◇◇●□□□■◇□□●◆□○□▲△ ■□ - ▲□△□△ ◇▲○◆ ○○▲ - ▲○□△◆ ○○◇●■ ◇▲ - △◇■ ◆◆▲ ○▲○◇○ △▲ - ◇△△ □◇○▲ △○●○■○○ - ◇ ◇ ○◇○△◆○▲ ○▲ ◇◇ ◇ - ▲○◆◇ ■◇■△○◆◇◆ △◆◇◇◇ ◇ - ◇◇□ ○○○◇■◇□ ◇○△◇△ △ - □◇■ ○△◇△□■◇ ■◇◇◇■◇◇◇ - △◇■◆ △▲△◇△ ◇◇◇◇◆◇◇◇ - ◇◇△◇ ◆◇ △◇ ◆◆□□□□□□□▲■◇◇◇◇△▲◇◇ - □◇◇ ◇ △◇△ □□□□□□□□○▲△◇ ○◇▲◇◇◇ - ◇△□◆◆▲△ △□□●●◇●□◇△◆▲◆◇◇◇◇◇ △ - ◇◇▲○□ ◆◇ ◆◆◆◆◆■○ ◇▲◇◇ ■◇ - ◇△○◆△▲ △○◇■ △◇○◆ - ○△◇○◆○○ ▲□△▲ △ △□ - ○△◇◆□■□▲ △□△▲●△ △△ - ○◆□◇□□◆□□▲◆◆▲□◆△△◆○ ●■ - ■○◆■□□●●◇□□◆◆□○◇◆ ▲□ - ◆□▲◆◆◆▲△△□●●◆◆▲□◆ - ◆■■■◆ ■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_048.txt b/codex-rs/tui/frames/shapes/frame_048.txt deleted file mode 100644 index 019b14c77b..0000000000 --- a/codex-rs/tui/frames/shapes/frame_048.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▲◆●◇□▲▲□□▲▲ - ▲□◇●▲◆■○●◇□●■□○▲ - △▲◇■□■◇□□◆○○○◆ □○ - △◇△□▲ ○◇○◆ △◆◇ - ◇◇○○ ◇○○◆ ■○◇ - ◆○■ ◆▲◆ ○▲◇△△▲○○ - ◇△◇◇◇▲▲■ △ ○○ ○□◆ - ○ ◇ ■△○ ○ ◇●■○○ ◇ - △◇◇◆ ▲◇◇◇○▲ ◇ ◇○○◇◇◇ - ◇◇○ □◇△△● ■ ▲▲□◇▲△●▲ - ◇◇◇ ◇○○◇◇◇ ◇△◇◇■△◇◇ - ◇◇◇◆ ○ □■■ ◇○◇◇◇◇◇◇ - ◇◇△○ ◇△ ◆◆□□□□□ ◇○◇◇◇◇◇◇ - ◇◇■◇△◆▲ □□□□□□◇○ ◇■◇◇◇◇◇◇ - △◇◇□◇◆ □□●◇●□△■ ◇■◇◇◇ ○◆ - ◇△■□◇ ◆■◇◇◇ ◇◇◇○◇ - □□●◇ ◇ ◆■△○◇◇◇◇◆△ - ◇◇△▲○○◆ ◇△▲ △◇◇▲◇ - ■▲◇◇○■□◆△ ◆◇▲◇▲◇■ △▲◆ - ■▲□◆□◆□□□◆▲△◆▲ △△ ◇◆ - ■○◆□□●◇△□◆●□▲□○ ◆△ - ■□◆◆◆◆□□●□○ ◆△◆ - ◆■□◆◆◆◆■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_052.txt b/codex-rs/tui/frames/shapes/frame_052.txt deleted file mode 100644 index 8368a3cf42..0000000000 --- a/codex-rs/tui/frames/shapes/frame_052.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆△●□□▲●○□▲◆ - △■▲▲■○□△○ ■○◇▲ - ◇△△□■□○□▲○▲◆■ ○○ - ●◇△■△ ■◇△△ ○○ - ◇◇○ △ ○◇○○ ○■◆ - ◇◇□◆◆◆◆ ◇●◇■■ ◇◇ - □■◇◇◆□□■ ○ ■◇ ■◇△▲ - ◇◇ ◇◇◇○◇ ▲ ◇◇ ◆◇○ - △△◇ △△◆◇○ ◇◇◇△ ■◇ - ◇◇■ ◇◇◇○◆ ◇△▲◇◇○◇ - ◇◇△ □◇△◇○ ◇△◇●△◆ ◇△▲ - ◇◇△ ◇●△○■■ ◆△◆◇◇◇△ ◇◇ - ◇△ ◇◇ ◆◆◆□□□□○◆◇◇◇◇◇◇◇ - ◇■ ○□ □□□□□○◇◇■◆◇◇◇◇◇◆ - ◇◇△ ◇ ○●●◆◇□◇◇● ◇◇ ◇ - △◇◇ ▲△ ◆■◇◇◇ ◇◇ ■◇ - ◇◇■◇ ◆○△■ ◇◇ ○◇ - ◇◇◇○ ◇◇▲▲◆◇◇■▲ - ◇◇□○ ▲◇○○◇◇◇◇ △ - ○◇□●◆□○◆□△○◇□ △△◇ - ○○□◇■△◆△○◇■ △△ - □□◆◆▲■◆△■△◆◇■ - ■□■◆■■■ - - diff --git a/codex-rs/tui/frames/shapes/frame_056.txt b/codex-rs/tui/frames/shapes/frame_056.txt deleted file mode 100644 index f5746b07d3..0000000000 --- a/codex-rs/tui/frames/shapes/frame_056.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▲●□□▲▲○□▲◆ - △▲◆○○△△△■■◇▲ - ●◇△□○○■◇◆ ■◇▲ - □◇□△◇○◇□▲ ■▲■○ - ◇○◇ ○○△○○○ ■△● - ◇○▲◆■▲ ◇◇○◇■ □◇ - ◇◇◇▲ ◇ □◇◇ ◆△◇◇○ - ○△□△ ◇◇▲ ○◇ ◇ - ■◇■◇□■ ◆◇■◆◇◇△ - ○△○□◆●◇ ◇◇□◇◇▲△◇ - ◇△◇●●□◇ ◇◇△■■◇△◇ - ◇△□△□■◇ ◇◇■◆ ◇◇◇ - □△○◇◆◆◆□ ◇◇△◇◇■◇◇ - ●○◇■□□◇○ ◇◇△ ◇◇ ◇ - ■○◇ △ ◇◇◇◇◇◇◇○◇ - ◇◇□◆□▲ ◆ △◇◇◇◇ △◇ - ◇◇◇ ◇◇ ○ ◆◇◇◇◇ ◇ - ○◇■ ◆ ●◇◇◇ ▲△▲◆◆ - ◇■○ ◇ ◇ ○○□◆ ◇◇ - ○◇○○□△○△▲◇ ◇◇◆■ - ○□▲■■△●□ ■△ - □◆◆△◆□ ○□ - ■□◆■■■■ - - diff --git a/codex-rs/tui/frames/shapes/frame_060.txt b/codex-rs/tui/frames/shapes/frame_060.txt deleted file mode 100644 index 42130b22a8..0000000000 --- a/codex-rs/tui/frames/shapes/frame_060.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ●□□▲△□□▲ - ○ ○◇△ □■▲○ - △◇◇◇△◆■○○○ - △△△◇●◇ ■◇◇◇ - ◇◇◇△◇□▲ ■◇◇ - ◇◇◆◇△△◇○◇ ○◇ - ◇◇△□◇◇△◇ ◇◇ - ◇◇■■◇◇◇◇○■■ ▲ - ◇◇△◇◇□△○◇◇◇◆◇ - ◇◇◇◇◇ ◇◇◇ ○◆◇ - ◇◇○□■ ◇■■◇■◇◇ - ◇◇◆○◇ ◇ ■◇△◇◇ - ◇◇◆◆◇◆◆△◇◇◇◇□ - ◇◇◇◇◇◇◇◇◇ ◇○ - ◇◇◆◇■◇ ◇◇◇ ◇△ - ◇◇○◇◇◇◇◇◇◇◇■◇ - ◇○△△△◇ △ ◇ - ◇◇△◇◇■●◇◇■ - △◇◇◇○◇□○◆◇○ - ◇○□◇○■ ◇□◇◇ - ● ◇ ○○ ▲○◆□ - □□◇ □■▲●◇◇ - ■□■◆■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_064.txt b/codex-rs/tui/frames/shapes/frame_064.txt deleted file mode 100644 index 8be6f4f1ed..0000000000 --- a/codex-rs/tui/frames/shapes/frame_064.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - □□□▲□□□▲ - ◇○◇■ ■■●◇ - ◇◆◇■ ◇○△○ - ◇◇◇○◆○■◇△ - ◇△△◇▲■○◇◇ - □■△ ○○△○◇ - □△■◇△□□■◇ - ○◇◆◇ ◇△○○ - ○◇●◆▲ △◇ - ◇◇◇◆○○◇◇◆ - ◇◇◇■▲□■◇◇◇ - ◇◇◇◇▲△●△◇ - ◇◇◇◇◇◇◆◇◇◆ - ◇◇◇◇◇◇○◆◇◆ - ◇◇◇◇◇◇◇◇◇◇ - ◇◇△◇◇◇◇◇■◇ - ◇◇◇◇◇◇◇◇◆◇ - ◇◇◇◇◇◇◇◇△◇ - ◇◇□◇○△▲◇◆◇ - ○◇●◇◇▲■◇○◆ - ○◇■◇ ◇ ◇ ◆ - □△■■ △□△ - ■□■■□■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_068.txt b/codex-rs/tui/frames/shapes/frame_068.txt deleted file mode 100644 index 8acfd97c9d..0000000000 --- a/codex-rs/tui/frames/shapes/frame_068.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▲□□△▲▲□●▲ - ○△■○△◇○ ■ - ◇▲◆■■○○◇○● - ■◇▲ ▲ ◇□◇▲◇ - ◇◇◇ ◆○◇◇◇ ◇ - ■□◇▲◇△○◇○ ◇ - ○◇◇◆◇◇◇◇◇ ◇ - △◇◇◇△◇○◇◇◇ ◇ - ◇◇◇◇◇◇○◇◇□ ◇ - ◇◆◇◇◇◇■△◇○ ◇ - ◇◇■■◇○◇△◇▲△◇ - ◇▲■△◆■■■◇◇△◇ - ○◇ ◇◇◇ ◇◇◇□◇ - ◆ ◇◇◇▲◇◇◇■◇ - ◆◇◇◇◇■◇□◇◇◇ - ○○◇◇◇ △○◇◇◇ - ◇△◇◇◇◆△◇◇△◇ - ◇◇○△■◇◇○△●◇ - ◇□◇▲▲▲◇▲◇◆◇ - ■○■■ ◇■■◇◆○ - ◇◇▲ ◇◇△◇△◇ - ◇△○ ◇□○◆◆ - ◆■■■■■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_072.txt b/codex-rs/tui/frames/shapes/frame_072.txt deleted file mode 100644 index f30b00e676..0000000000 --- a/codex-rs/tui/frames/shapes/frame_072.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▲□◇●▲●□◇▲ - △○○◇△◇○△◆△□ - ◇◇■ ◆ △◇◆□○○○ - ▲○◆ ■◇◇◇◇▲■ △ - ◇◇△◇△○◇■◇■■●◇□▲ - ◇■◇▲◇◇◇◇◇◇◇ ○◇ - ○◇◇■■○■◇▲◇ ▲△◇△ - ◇◇◇◇◇◆◇◇◇○■◇ ◆◇ - ◇◇◇◇◇◇◇◇■◇◇◇ ▲△◇ - ◇◇◇◇●△◇◇△ ○□◇◇◇◇ - ◇◇■ ○◇△◇△△▲◇△△◇◇ - ◇◇○◇△▲○■○◆○○■○○◇ - ◇◇◇◇◇○■◇△△●□●●◇◇ - ◇◇◇◇◇ ◇□◇◇◇◇◇■◇◇ - ◇◇ ○ ◇◇■◇■○○◇□◇◇ - ◇■○■◇■◇◇◇○○△○◆◇ - ◇▲ ■◇■◇○ ◇◇◇△○ - ◇◇◇ ○▲○○▲□◇△◇◇ - ■◇△○△▲ ●◇◇△◇◇▲◇ - ◇◇□ ■ ■□△◆◇■◇ - ▲○ ▲ ○■◇□●△△ - ■△◇△ ○◆○◆△ - ■■■◆■■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_076.txt b/codex-rs/tui/frames/shapes/frame_076.txt deleted file mode 100644 index f42e486093..0000000000 --- a/codex-rs/tui/frames/shapes/frame_076.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆□□□●▲□□◇◆◆ - □○△◇◇○○○□◆△□○ - ◇◇△◇■○△◇○◇■□▲○○ - ◇△◆△△△○◇□△■○■■■◇▲ - ▲□●◇◆■△△◇◇ ▲■○△ - ◇○○△△ ◆▲△□◆ ○◇▲ - ○◇△○◆▲■◇◇○□ ○◇◇ - ◇◇○◆△◇◇ ◇◇◇□● △◇ - ◇◇○□◇◇◆◆○○◆◇◇ ▲●◇◇ - ○◇◇◇◇◇ ◆◇○▲ ◇◇◆◇ - ◇◇◇◇◇△ △◇◆◇▲◇◇ ◇△○◇ - ◇◇◇◇◇△ ○△◆ ◇○◇ ■◇○◇ - ◇◇◇◇◇ △◇◇○●□▲●◇◇◇ - ◇◇◇◇◇ △◇●◆▲◇◇◆△◇■ ◇◇ - ◇◇◇◇◇ ○○◇◇◆○□■△◇□△◇◇ - ◇◇◇◇ ○○◇◇□○◆○▲◇○◇△◇ - ◇◇◇◇ ○◇△ ◇■◇○□ - □◇◇◇◇◇ ■◇ △△○□◇■ - ◇○■○▲◇◇□△▲ ▲◇ ◇▲○ - ■▲○△ ◇◇○○◇△□●◇○□■ - ■◇▲△ ◆○■▲▲□△△○△ - ■○□□ ■□◆□◆◆●■ - ■◆◆■◆□■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_080.txt b/codex-rs/tui/frames/shapes/frame_080.txt deleted file mode 100644 index 1cb3812dea..0000000000 --- a/codex-rs/tui/frames/shapes/frame_080.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▲●□◇◆▲●□◇◆◆ - △□□ □■◇◇□◆▲△◇□▲ - ◇◆■△▲△▲◇ □□■□□□▲○ - △■◇◇ △△◇▲△▲◆■◆ ■■○○ - ◇■△◇◇▲▲◇○□ △○◇▲ - △△◇▲△△◆○■ ◆ ○△ - ◇◇△○○◇▲◇□ ◆□◆ ○△◇▲ - ●◇◇ ◇◇□■□◇ ○●◇○ ■◇△ - ◇○◇■■◇◆◇◇◆ △○◆▲△ ◇◇ - ○◇◇◇■◇◇◇◇ ○◇◇○ ◇△◇ - ◇◇◇◇◇◆◆◇◇ △△ △ △□△◇ - ◇◇◇◇■◇◆◇◇ ◇○◇◆ ■◇◇◇ - ◇△◇◇◆■◇◇◇ △◆■◇● □ △◆◇◇◇ - ◇◇◇◇◇ △◇■ ◇●◇■◆◇ □ ◆◆◇○◇ - ◇◇◇◇△ □◇ □◆ △ ◆◇△ △■◇◇□ - ◇◇◇◇◇ □◇ △□△ ◆◇◇◇○◇ - ◇◇◇◇◇■◇◇ △◇◇◇◆ - ●○◇◇○△■◇□◆ △○○ - □◇▲ ◆◇○○○○◆ ◆◇□◆ - ○○◆ ○○○○○□▲□□◆◆◇▲□△ - ■◇◆ □● □●□△□◆□ - □○◆ ■□◆□▲◆◆●□◆ - ◆■◆◆◆◆■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_084.txt b/codex-rs/tui/frames/shapes/frame_084.txt deleted file mode 100644 index 49fbc54ab4..0000000000 --- a/codex-rs/tui/frames/shapes/frame_084.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆▲●□◆▲●□□□□▲ - ◆◇□ ●■◇◇□■◆●△◆□○◆ - ◆◇□◆◆△ △△◆□□□■□□■○◇○ - ▲△■▲ ○□▲□▲□△ ◆◆ ○■○◇ - ▲△■▲ ◇△▲◇◇□ ■◇◇ - ◇△◆▲△■■△○□ ◆ ■○▲ - ◇◇◇△○◇▲◇◇■ □◆○ △◇○ - ◇◇ △◇◆◆◇▲ ◇▲○◆○ ■△◇▲ - ◇□◇△■◇◇□■ ○△◆◇○ ■◇○ - ◇◇◇◇◇■●◇◇ ○○△▲ ◇◇◇ - ◇△◇◇■○◇□◇ ▲ ○◇□○ ◇◇○ - ◇■◆▲■◆◆◇◇ ◇○□▲◆◇ ◆◇△ - ◇■ ◆▲◇△◇◇ □△◆□○□●●□□○◆ ◆◆◇△ - ◇◇ ○◆■◇◇◇◇ △△△○△ □◇□■◆ ◇◇◇◇ - ◇■ □■◇◇◆◇ ◆△ ◇ ◆◇□◇ □□△■◇ - ◇ ■■□◇□ ◇△ ○◇◇◆ - ○○ ■○◇◆◇▲◇ ▲◇▲◇▲◇ - ○◇○ ■◆■○ ○ ◇△◆○○◆ - ◇◇ ○■◇○ ◇◆ △■ ■◇□△ - ○○ ◆■△◇○◆□◆◆◆□□◆△●◇■△ - □◇◆ ◆○◆○◇ ■□□□□□■▲■ - □□◆ ■□◆□○◆◆◆◆△□ - ◆■◆◆◆◆■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_088.txt b/codex-rs/tui/frames/shapes/frame_088.txt deleted file mode 100644 index 13b6064605..0000000000 --- a/codex-rs/tui/frames/shapes/frame_088.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - △▲●◇◆●□●●□□▲◆ - ▲△○ □●△◇△□◆◆●○●■□▲ - ◆△◆△ ▲□▲□◆□□□◇◇□◇■◇●□▲ - △◇ ■△△△△△●□◇ ■◇▲◆■○◇○ - △○■◆△□△■□ ○△◆○◇○ - △◇△△▲△△●○ ◆ □□ ■◇◇ - ◆◇○○■◇ ▲△ ◇□● ○ ○◇▲▲ - ◇◇◆△△■■◇ ◇▲□▲ ○ ■■◇◇ - ■■■ ◇◆○ ○△◆□◇○◆ ■○◇△ - ◇◇◇◇◇●●◇ △□△○■ ■△◇◇◇ - ◇◇◇◇◇◇◇△ ● ◆△◇○◇ ■△◇◇△ - ◇◆■◇◇◇◇◇ △□◇△◆◆▲■ △◇◇○ - ◇◇ ◇△◇◇◇ ◇◇◆□△◇□ □□□○◆ ●◇◇■ - ■△■ □△◇ △△△△□△△ ○□■■◇△ ◇◇◇◇◇ - ◇ △ ◇◇◆ ◆◇◇▲ ○□□□△ ◇□□ - □△△ ◇■◇■ ○▲◆ ◇◇△△ - ◇▲ ○◇○○▲○▲ ◆□△△◇○◆ - □△○■▲■◇▲○▲ ●□△△○○△ - ◇●○○▲○◇▲□○ ◆△◆▲◇▲◇△ - ◇● ○○○○ □□▲◆◆●□◆◇◇◇□○□ - ■◇◆◆■○■○◇ ■□●□□□□■◆△◆ - ■□▲ ◆□▲□□●◆◆◆◆□□◆ - ■■◆◆■□■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_092.txt b/codex-rs/tui/frames/shapes/frame_092.txt deleted file mode 100644 index e31ef02f0d..0000000000 --- a/codex-rs/tui/frames/shapes/frame_092.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆▲▲●□◆□□□□●◇▲◆ - ◆□◇ □■◇□■□■◆●△◇●■□○▲ - ◆△■◆△▲□■□■◆□□□◇◇■□□□△◆○▲ - △□▲△●□○ □▲□ ○△◆□□◇▲○ - ◇◆△ ▲■◆● ◇△ □○○ - ◇◇◆◆○■▲ □◆● ■□◇◇ - △□■□◇△◆▲ △◇□○■ ○△○◇ - ◆◇△▲◇◇●◇ ◇△▲□○ ■◇△◆ - ◇◆◇◇ ◇◆■ ◇▲▲□○◆○ ◇◇◇ - ◇◇◇ ▲◇◇ ◇▲△□○ △◇◇ - ○◇◇◇◇○◇ △●●◆■■ ◇◇△ - ○◇◇◆◇◇◇ △△△△■△ ◇□■ - ◇◇◇△◇◇◇ △○△△△△△◆ ●●□□□□◇● ▲■◇□ - ◇◇◇◇□○△ ●△△△△◇■ □●□■□◇■◆ ▲◇◇○ - □◇◇◇○◇◇▲○ □▲◇ ○ □◇□●□●◇□ ◇○□◇◇ - □◆◇◇◇△△ ◇ □○▲◆ ◆ ■ ◇◇ - □▲○○▲□○■◇ ▲□ ◇○○△ - □◇○○○▲○○ ◇ ◇◆△▲◇△ - ■◇◆○○○◇○◆□▲ ◆●□■◆△△□△ - ○◆ ■▲◇◇▲◆□□◆◆◆◆□□□▲◇□□□▲□ - ■○◆○○◇○▲▲ ◆□□□□□□□□◆◆□ - □□◆◆□▲□◇▲◆◆◆◆◆▲□■ - ◆■ ◆◆■□■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_096.txt b/codex-rs/tui/frames/shapes/frame_096.txt deleted file mode 100644 index dbf8cc8982..0000000000 --- a/codex-rs/tui/frames/shapes/frame_096.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆◆□◇▲□□□□□◇◆◆ - ◆▲■◆□◇◇□■◇■◆●▲△■◇■□□▲◆ - ◆△○△△□□■ ◆◆△□□□◇◇■□□●○▲□○◆ - △■ ▲▲◇◆ ○▲■□□●□○ - ◇ △◇△△ □ △□▲○ - ◇△△△◇△■ ▲□◆■ □○○ - □●●△◇▲△ △△■○◆ □□○◇ - ●△▲●◇○▲ ◇◇△■◇ ◆■◇△▲ - □○■■□◇ ◇▲◇△◇ ○ ◇◇◇ - ◆◇◇◇◆◇○ ○○○○◇◆■ ◇◇△ - ◇■◇■△◇◇ ▲ ○□◇◇◇▲ △◇◇◇◇ - ◇◇◆■◇◇◇ ◇△●◆△ △○■ ◇▲◇◇◇◇ - □◇◇◇◇◇◇ ◇△▲▲ △■ ●□□□□●●○ ◆■◇□△◆ - ▲◇◇◇◇▲▲ ◇▲▲□◆●■△ ◇◆□■■◇□■ ◇ ○◇△ - ◇ ◇◇◇◇◇ □△△ ▲◆ ○◇□□□●□ ◇■△△◇▲ - ○◇○■▲▲▲ ◇◆▲■ ●□■◇◇◇◆ - □○○◇ △△◆ ■●□■◇▲○△ - ○◇○□◇○◇◆□△ ◆△■●□▲◇△ - □○○○▲◇○● □▲△ ◆□■ ◇□□△△ - ○◆ ○□◇○◆■□□●◆◆◆◆□□□●◆□◇△■◇◆ - ○◆ ○□□◇▲▲◆□□□□□□□□□■◆□■ - ■□▲◆○△◆◇▲◆◆◆◆◆◆●□□◆ - ◆■◆◆◆■□■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_1.txt b/codex-rs/tui/frames/shapes/frame_1.txt new file mode 100644 index 0000000000..244e2470b4 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_1.txt @@ -0,0 +1,17 @@ + + ◆△◆△●□□●●□▲◆ + ◆●▲△□○□△□○●◇◇●◆ ◆■□◆ + ▲◇□◇□□□■○◆ ◆■□◆■◇●◇◇◇□ + ●□◆○□■▲▲◆ △□◇●◇▲ + ○○●△■○◇○◆○○ ■△◇○○▲ + ◇□ □◆ ◇□△●◇◇▲ ■△○◇◇▲ + □○■▲□ ■○◇□△■◇◆ ◇△◇ + ◇◇◆◇◆ ▲△△◇●◇□ ■◆◇ + ◇●◇■◆ ●◇◇○○◇■△◇□□□□□□◆□▲ ●■ ◇ + ◆◇●□ ◆●□◆ △□ ◇■◇◆◆◆△△▲▲▲◇△▲△▲◇ + ○○◆■○ ○○▲△△◆ ◆○□■■□ ○□■△▲●◆△ + □○▲ ■▲ ◆ ▲■△□◆◇ + ○○▲◆○□◆ ◆●◆□◇◆□■ + ○□▲○◆ □□△●●●●△●□□◆▲◇□ + ◆□■□◇◇◇◆◆◆▲◆●□□■ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_10.txt b/codex-rs/tui/frames/shapes/frame_10.txt new file mode 100644 index 0000000000..f306dffc08 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_10.txt @@ -0,0 +1,17 @@ + + ◆□□□□○□□◆ + □■◆□□□○◇△◆□▲ + ○◆▲◇◇△◇◇▲◇□○▲▲ + ◇◆◆△○◇●◆△○▲■■○○▲ + △ ●◇◇■◇○ ■▲△◆△◇△ + ◇◆ ■◇□◇△△○ ◆◆■◇ + ○ ◇□■□◇◇◇◇□ ◇△▲ + ■ ◇◇○□△□◇◇▲◆◆△○◇◇ + ■ ◇○ ○○◇●◇◇□○□●◇◇ + ◇ ▲◇○▲◇◆△◆□◆◆◆◇□◆ + ▲ ■◇◇◇◇◇■■ ○▲■○◇◆ + ○◆■▲○▲□■ ◆◇■■▲△△ + ◇■ ◇◇◇◇□▲△▲△◇△◆ + ●◆□□△◇□●◆ △△■ + □▲ ◆□○◆▲●□ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_100.txt b/codex-rs/tui/frames/shapes/frame_100.txt deleted file mode 100644 index c8dfb7402e..0000000000 --- a/codex-rs/tui/frames/shapes/frame_100.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - △◆◆□●□□□□□□□◆◆ - ▲□◆▲●△□□◆△□■◆■△◆◇■□□□◆ - ◆□○◆△□□△△△◆▲□□□●◇◇□□□●○◇■□▲ - △■ △△●△△ ◇▲□○●△□▲ - ◆◇▲◆▲□□□◆ ○ □■△□ - ◆◇◆◇△△▲ ▲●◆ △○▲◇ - ◇△○△△○△ △◇■◇◆ △○○▲◇ - △△△◇◇△◆ □◇◆○◇◆◆ ◆○▲◇○ - ◇ △▲□◇ □○▲◆□● ○ ◇◇◇ - ◇◆◇◇■◇◇ □◇○■□○△■ ◇▲◇▲ - ◇ ■◇◇○□ ■◇ ◆△○ ○□ ◇◇○◇ - ◇◆■○◆○◇ △○○□△ ◆◇ ◇◇■◇ - ◇ ◆■◇◇◆ ◇○◆■△◆◆△ ●●●●●□□●□●◆◆ ○◇△◇◇ - ■◆ ◇◇◇ ◇◆▲▲□◇▲△ ◇◇△□■□◇●◆◆◆◇ ◇◇■◆ - ◇△■◇○△◆○ ◇□△◇ ◆□ ■◇□◇□●●□□● △◇○○● - ■○◇◇◇□○ ◇ ◇○▲■ ■■ ◆△△□◆ - ○◇◇◇◇○◇ ◇◆ △■▲□◇◇△ - ○●■○◇◇○◆□▲ △◇◆□◆◆■△△△ - ■▲ □■◇◇△■◇◆ ◆●□■◆□▲◇▲■ - □◆ □□◇□◆■◇◇●□◆◆▲▲□□□◇◆□□□◇△△ - □▲◆□□◇●◆ □◇□□□□□□□□■■▲□◆ - ◆□△◆□■□□○●◆◆◆◆◆▲▲□□■ - ◆ ◆■□□■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_104.txt b/codex-rs/tui/frames/shapes/frame_104.txt deleted file mode 100644 index 3ce7567e2e..0000000000 --- a/codex-rs/tui/frames/shapes/frame_104.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆△▲●□●□□□□□□□◆◆ - ◆□■▲◇△□□◆ ■□□□▲ - ▲□◆△□□■ ◆▲●□□□●◇◇□□□●▲◇◇□□◆ - ▲□△△△○▲■◆▲□ ●◆□◇▲○■○◆ - △ ●▲□▲■▲△ □◇△△○○□○ - □■△□■△ △ ●●○○ ○ ◇■△○ - ◇□△◇◆△■◇ △●■□▲○ ■○ ◇△△○ - ◇○○○△▲△△◆ ○○▲◆○○○◆ ◆ ○△○▲ - ◇●◇○◇○◆ □◇○ □◇■◇ ○ ◇◇○□ - ◇■◇◇◇◇■◇ ▲ ◇◇▲△◇◆◇ ◇△■▲ - ■◇□■◇◇ ◇ ◆○△ ◇□ △◇ ■ ◇◇ ◇ - ◇◇◆△◇◇ ◇ ◆□▲△●◆ △■ ◇△◇◇■◇ - ○■ ◇◇◇■◇ ▲□△△◇■△◇◆ ●□□●□□□●●▲ ○◇◇◇▲◇ - ◆◆■□△ ▲ △◆▲◇△ ◆◇ □△○□■□◇●■◆■ △□◇○◇◆ - ○ ◇◇◇◇▲◇ □▲△◇◆◆ ◇□□◇◇●●□□□ ◆◇◇◇◇ - ■◇◆○○○◇■◇ □△ ◆○◇○◆ - ○◆○△○◇▲○◇◆ ◆△◆△■△□■ - □●■◇◇○▲ ◇▲ ◆●□◆□△◇◇■ - ■○ □□◇●◆■◇▲◆ ◆□■◆△○□□△◆ - □● □□□●◆■◇□□□□▲◆▲▲□□□◇◆●□▲◇□▲□ - ■□◆○□○□◆◆ ■□◇□□□□□■□□◇□◇△■ - ■◇ ■□◇□□▲◆◆◆◆◆◆▲◆□□■ - ◆ ◆■■□□■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_108.txt b/codex-rs/tui/frames/shapes/frame_108.txt deleted file mode 100644 index dc60ce931a..0000000000 --- a/codex-rs/tui/frames/shapes/frame_108.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆△◆●●□□□□□□□□▲◆◆ - ▲●◇□□□□■ ■□▲◆ - ◆△□□◇□●△△△◆□□□◇◇◇◇◇□□□□○◆●□□▲ - ◆△□△△■●◆▲●□ ○▲■□□◇◇□▲ - △◆●▲□◇◆▲◇ □△○□□△◇◆ - ◇◇△◇▲□■◇◇ ▲□◇○ ▲ ◇○○○▲ - ◇○△◇▲□○◇ ○●△△◇□ ◆○○○◇○□▲ - △□◇○○△■◇ □◇●○□○◆ ○○■○○◇◆ - ◇◇◇◇◇△◇ ■◇●◆◇◇▲ ■■○▲◆◇ - ◇◇○◇◇△△ △□◇○□○○□ ◆◇△ ◇◇◇ - □□◇◆◇△◇ ◇ ◇◇▲△◇◇ △ ◇△○▲ - ■◆◇◆◇◆◇ △○▲▲□■▲◇ △△◇○ ◇ - ○ △◇◇▲ ◇ ◆□ △△△△△△ ▲□●●□□□□□□●□▲▲ ◇●◇◇◆◆ - ■◆ ◇◇◇○◇ □○□△△■△■ ▲◇◇○□■□□●■◆■□■ ■◇◇◇◇ - ◇▲○○◇△ ◇◆ ▲◇△▲△ ○○□□◇◇●●□□ ◇◇ △ - ◇■◇▲△▲□○△ ▲◆△△◇△◇■ - ■○□◇△◇◆■○◆ ◆●□◆△△◇▲◆ - ■□■◇◇◇▲ ◇▲ ◆□◆△●●●△◆ - ○◆○□◇○▲■◇□◆ △□◆◇□◇□○□ - ■□◆□◇□□◆■○□□□□□◆◆▲●□□□◇◆●□◇□◆◆△◆ - □▲■□◇◇◆○■■□◇■□□□□■■□□◇○◆□□ - □■△□□◇◇□●◆◆◆◆◆◆●□□□■ - ◆ ■■■□□■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_11.txt b/codex-rs/tui/frames/shapes/frame_11.txt new file mode 100644 index 0000000000..dcf944902b --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_11.txt @@ -0,0 +1,17 @@ + + ▲□□□□□□◆ + △■ ●◇◇◇○○▲ + △■◆◆◇◇●○□△○▲ + ◇◆◆◇◇●●▲◆●△△ + ◆■△●○◇□○■●◆◇◇▲ + ◇□◆◇◇□◆●●◇◆△◇◇ + □□ ▲◇◇◇◇◇◇◆◇●○ + ◇ ◇◇△◇◇○△ ◇■◇ + △ ■◇△◇◇□△□◇◆◇ + □□ ◆◇△●▲■△◇◆◇○ + ■◆▲ ◇◇◇◇●△◇○○◇ + ○◆▲△◇◆□△□□●◇◆ + ◆ □◇○○○◆◇●■ + ○□ □◇◇▲◆△□◆ + ○◆ ■□□◆□◆ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_112.txt b/codex-rs/tui/frames/shapes/frame_112.txt deleted file mode 100644 index ade6b78d0b..0000000000 --- a/codex-rs/tui/frames/shapes/frame_112.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ◆◆◆●●□□□□□□□□▲◆◆ - ◆△□▲△◇□■▲○■■ ■□□◆ - ▲□▲◇□●□■▲◆▲□△□□●◇◇◇□□□□□◆ □□◆ - ▲■△□■□■●●□□◇○ ▲■□□●▲■○◆ - ▲□◇◇□▲■▲◇ □□■□▲▲□○ - △△△◇◆□ △ ●▲▲▲◆ ○● ■○○■◇ - △○△△▲□◆◇◆ ○○◆○□□◆ □○ ○◇ ◇ - ▲△◇○○□■◇ ■◇○○△▲□△◆ □○ ○◇ ◇ - ◇◇◇◇◇■△◆ □○◆■○○◆■ ○△ ◇◇■▲ - ◆◇◇■◇◆△◇ ◆□◇◆■○■▲■ ◇ ◇◇◆◇ - ◇○■ ◇ ○ ■□◆△○ △ ◇▲○◇△◇ - ◇◆◇◆◇ ○ ◆□◆□△ △□ ■△◇◇◇◇ - ■◆ ○◇◆ ◇ △◇▲◇○ ◆◇◆ ▲●●●□●●□□●□□▲◆ ○■◇◇◆◇ - ▲ ◇◇◇■◇ ◆△△△□◆ ●□ ○◇◇●□□■□□□■◆◇□◇▲◇◆◇○■◇ - ○▲■○□△■◇ ◇◇■△△■ □●◆□◇□□●●□□□□△◆◇●◇△◆ - ○■◇△◇ ■○ △○◆○□◆△ - ○□◇◇○◆○□◆ ◆△◆△▲△ △ - ○△◇◇◇◆▲○○◆ ◆□□▲□△◇▲□ - □▲■◇◇●▲■●□□◆◆ ◆▲□■◇□△◇○△◆ - □▲○□◇○▲△□◇□□□□□◆◆▲●□□□◇◆□□◇□■◆□■ - ■□◆◇◇○◆ ◆ ■□◇■△□□□■■□□■■◆□□◆ - ◆◆△□□□◇□□▲◆◆◆◆◆◆●□□□□◆ - ◆ ■■□□■■■◆ - - diff --git a/codex-rs/tui/frames/shapes/frame_12.txt b/codex-rs/tui/frames/shapes/frame_12.txt new file mode 100644 index 0000000000..d8d1fbf334 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_12.txt @@ -0,0 +1,17 @@ + + □□□□□△ + ▲●◆◆△◇▲○ + ■ ◇△○□▲ + △□◇◇◇●●■◇ + ◇ ■◇◇◇◇△△◇ + ◇■△△□○■◆◇■ + ◇ ◇△○◇◇○ + ◇ △□○◇◇■ + □▲ ◇△◇◇□◇◇ + ◇ △◇□●□◆ + ◇△ ◇■●□□△ + ▲ □◇ ◆▲◇ + △ □□◇▲□○◇ + ■○△■▲◇○◇◆ + ○ ■◇○△△ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_13.txt b/codex-rs/tui/frames/shapes/frame_13.txt new file mode 100644 index 0000000000..1387fc9b91 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_13.txt @@ -0,0 +1,17 @@ + + △□□□▲ + ◇◆◆◇◇ + ◇◆◆◇■ + ◇□□◇◆ + □ ◇◇ + ■△▲◇◇ + ▲ ◇◇ + □ ■◇ + △□ ◆◇△ + ◇■ □●◇ + ■◆△△ ◇◆ + ◇◆◆◆◇ + ◇□▲◇◆ + □◆◆◇● + ▲ △■● + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_14.txt b/codex-rs/tui/frames/shapes/frame_14.txt new file mode 100644 index 0000000000..70a5070ba9 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_14.txt @@ -0,0 +1,17 @@ + + □□□□● + ▲△◆◆△○ + ◇◆◇◇△ ◇ + ◇◇△◇■○◇▲ + ◇◇◇○ ◇ + ◇□◇◇ ■◇ + ◇◇◇◇ △ □ + ◇◇○◇◆ ○ + ◇◇◇◇ ■ + ■○△△ ●△ + ○◇■■▲△▲◇ + ◇□◇◇◆◆◆◇ + △ ■◇●●●◆ + ◇○△□◆◆△ + ◆□ ■●△ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_15.txt b/codex-rs/tui/frames/shapes/frame_15.txt new file mode 100644 index 0000000000..584e0e043a --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_15.txt @@ -0,0 +1,17 @@ + + □□□□□◇◆ + ◆▲●◇◇○△□▲ + △△◇□●○◇■□◇ + ◇△◆ △△▲△◆◆◇ + ◇◇●■●○◇◇△■○◇ + ○◇◇▲◇◇△△◇ ■ + ◇◇ ◇◇◇◇◇◇▲◇ + ◇◇△◇◇□◇◇◇ ■▲◇ + ◇◇□▲▲□◇◇◇◆△△◇ + ◇◆◇●△◇○◇□△ △◇ + ◇△◇◇◇◇◆◇ ◆ ● + ◇□□△○◇◇○▲ ● + ■◇○▲ △△△◆ ●◆ + ◇○◇◇○○△□○△ + ○○□○◆◆◆△ + ◆◆ \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_16.txt b/codex-rs/tui/frames/shapes/frame_16.txt new file mode 100644 index 0000000000..af6c836855 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_16.txt @@ -0,0 +1,17 @@ + + ◆●□■□□□◇◆ + △○◇◇□◇◇○◇●○ + ◇△△■○△●○◇◇ ■○ + △△△ ●□◆○◇○◇◇□□◇ + ◇◇●◆△□■●◇◇□△◇◆○ + ◇◇◇□◇■ ◇○● ◇ ◇△◇ + ○○◇ △◆▲◇◇◇◇△□■▲ ◇ + ◇△● ◇◆◇◇△◇◇◇■● ◆◇ + ○○◇◇◇□◇△○◇◇■□□ △ + □■◆◆▲●●○□◇△◆◇ ▲◆◇ + ◇◇◇□■■△□○◇●■●△◇◇◆ + ◇◇□ ◇◆ ◆△△▲ △ + ○◇□ ◇ △▲△◆▲◇ + ○◇◇■◆□◇△△□◆◇ + ■△△◆●△◆◆●□ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_17.txt b/codex-rs/tui/frames/shapes/frame_17.txt new file mode 100644 index 0000000000..4a158cf609 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_17.txt @@ -0,0 +1,17 @@ + + ▲●□□□●●◇▲◆ + ◆●□□◇◇◇□●□◇▲■○▲ + ▲□○△◆●●◆□▲■◇◇◇◆■○ + △◇△◆△◇■◆◆ ■◇●○◇◇◇●○ + ◇△◆ ◇ ◇■△○●○△△ ▲ + ◆●□▲△◆ ▲△△◇ △▲●△◇△△ + □ ●△◇ ▲△△◇◆ □■◇◇△●◇ + ▲■●◇ △△◇◇△◇▲◇◇●●□ + ▲△□△○●●□◇○◆◇○○△○◇◇◇ ◇ + ◇■◆●◆◆◇△□○△◇◇○ ○□■□○ + ○○○△■■■□□□□○◆◇□△△○ ○■ + ○◇◇◆□ ◆△◇◇◆ ● + ◆○○ □○◆ ▲■▲△○◆△ + ▲ ◇□□●○□◆◆●□△◇■ + ◆□●△◆▲□◇□◆□□ + ◆ \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_18.txt b/codex-rs/tui/frames/shapes/frame_18.txt new file mode 100644 index 0000000000..16bf8c1b58 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_18.txt @@ -0,0 +1,17 @@ + + ◆●●□●●□●◇▲◆ + ◆□■◆●▲□□◇◆◆▲■□●●◆ + ◆△△◇□■□●■▲■△◆■□△△○ □ + ▲◇◇□△▲○■□ ■○◆◆△●◇○●○○○▲ + ◆○△△ △◇ ◆■□◆○△◇△◇◆○●○○◆ + △○◇ ▲▲◇△◆◆◆△▲□▲◇■▲△○△◆△◇ + ◇◇○△△ □△□△◇■◆△■□◇●◇●▲ + ■○▲◇◇ ○○■◇◇●○ ◇●◇■ + ○■■ ▲○●●●●●□◇◇▲◇□△○▲ ◇□◇◆ + ◆○○◇□○□ ◇◇△◆◆○◆◇◇◇◆●◇◆○ ▲ + ◇△◇○◆■■□□□□□◆ ○◆◆△◇△□△◆▲◆ + ○○ ▲○▲ ◆◆□■△□◆■ + ○○□□○○△ ◆□○◆△○▲◆ + ■◇△□□□□●●●○■□◆△◆▲□ + ■◇◇◆△◆◆▲△□■●□■ + ◆ \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_19.txt b/codex-rs/tui/frames/shapes/frame_19.txt new file mode 100644 index 0000000000..e1bc51ae1b --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_19.txt @@ -0,0 +1,17 @@ + + ◆◆●●□◇□●●◇△◆ + ◆□◇◇◇○△●●●◆□◆▲◇□▲▲ + ▲□●●△■◇□□◆ ◆□△▲◆□●○ + △●◇□▲○◆ ◆●●□▲○◇□▲ + ◇◇△◆△◆ ▲◇○■△■◇○ ◇○▲ + ◇○△□■ ◆◇□◇△ △△ ■△□◇ + ○●◇◇■ △□○△◇□▲◆ △△△□◇ + ◇◇◇◇ ◇●■○◇■▲ ◇ ◇◇◇ + ◇□◇○▲●●●●●●◇◇◇◇□□●□◇● ○ ■◇◇ + ○●△▲◇●□△○□□○▲◆▲ ○◆ △○◆○▲△△◇◆ + ■○■△□◇■■■■■□□■ ○○◆△◇△△ △△■ + ○○○□◆○ ◆△△◆△△■ + ■ ◆○◇◇□▲ ▲●●△△◇●◆ + ■■△◇□△◇□◆◆●●△□■ ●□◇■ + ■◇△◆△▲■◆▲△○□▲○ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_2.txt b/codex-rs/tui/frames/shapes/frame_2.txt new file mode 100644 index 0000000000..af71459f5e --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_2.txt @@ -0,0 +1,17 @@ + + ◆△◆△●□●●●□▲◆ + ◆□▲△□●□◇◇◇●◇◇●◆■◇□□◆ + ▲◇□◇○□□◇□◆◆ ◆■□●□△◇◇●◇▲ + ◆◇△◆△□■▲▲◆ ▲▲○◇△◇▲ + ▲○■△□○◇○◆○○◆ ○▲◇○◇▲ + ■△□■◆ ◇□○□△○□ ○○◇□◇ + ▲◇■□◇ ○△◇●◇◆◇▲ △■◇■◇ + ◇■ ○◆ ▲◇□◇◇●□ ◇■△△◇ + □■■●◇ ●◇○○◆◇■△◇□□□□□□□□▲◇◆◇◇□ + ◆●■◇ △◇◇■ △□ ◇●○◆◆◆◆△△◆◆◇□△ ◇ + ○○○ □ □○△△◇■ ◆■□□□□□□□■◇▲□◇◇ + ■○◆△△▲ ◆ ▲□●△▲□ + △○◆◆◇□▲ ▲●◆□ ◆◇■ + ◆◇○●◆◆■□□△●●●●△●□◆◆◇◇□ + ◆□□□□◇◇◆◆◆◆◇●△□■ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_20.txt b/codex-rs/tui/frames/shapes/frame_20.txt new file mode 100644 index 0000000000..c5eb01382d --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_20.txt @@ -0,0 +1,17 @@ + + ◆◆□●◇◇●□●▲◆◆ + ▲●●■●▲◆▲●●●◇◇◆○□○□▲ + ▲▲■◆□□■◇□■ ◆■○■○□□◇□◆ + ◆◇■◆□◇□ ◆▲□◇○△□○○ + ◆◇ ▲◇□ ◆△ ◆◇◇○□○◇◇○ + △◆▲◇■ □□■●◇■△ ■○◇◇○ + ●◇●□◇ ▲□ △□□○ ▲○◇△ + ◇◆○△◆ ■■●△◇■▲ ◇◇■◇ + ◇△◇◇●▲●●●●●●●●◆▲■●○○○○□ △ ◇○ + ■◇○◇◆■ △◆◆◆◆◆◆◇○ □○○■◇●○ ▲△ ◇◇ + ○▲○○■■■■■■■■□■ ○▲●◇◇▲◇ △○ + □ ○□△▲ ◆△□△◇△ + ○◆○□▲◇◆ ▲●□◆●□■ + ○▲▲△■◇□○●●▲△■◇■◆▲△□■ + ◆□□◇◆ ●◆◆◆◆◇□■■ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_21.txt b/codex-rs/tui/frames/shapes/frame_21.txt new file mode 100644 index 0000000000..944b99f058 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_21.txt @@ -0,0 +1,17 @@ + + ◆◆▲●□●●□●□▲◆◆ + ▲□□◆◆◆◆□◇●◇□●◆◆▲□□◆ + ●□○◆□□○■◆ ◆○◇□□◆◆□▲ + ▲□◇●■■ ◆▲●□▲●□▲ + △▲△□◆ ▲◇△◆○ ○○◆○▲ + △■△◇ ▲□□◆△△ ○○○▲ + ◇■◇◆ ◆ △◆▲△■ ○●○■ + ◆○ ○● ■◇▲ ◇ ◇ + ◇ ◇ ▲□●●●●●□□□ ○◇▲■◇▲ ●△ ◇ + ◇ ◇○ ◇◆ ◆▲◇ ○■◆□◇▲ △■△△ + ● ■△ ◆◆■■■ ■◆ ■□◆▲● △◆ ▲ + ■□ △●◆ ◆□■ △ + □◆ ○▲◆ ◆△●□■ ▲◆ + □●◆ □■□□△◇◇●△●□■■ ▲◆ + □□□●□◆◆◆◆▲◆●□□◆ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_22.txt b/codex-rs/tui/frames/shapes/frame_22.txt new file mode 100644 index 0000000000..60ea930d46 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_22.txt @@ -0,0 +1,17 @@ + + ◆▲□●□●●□●□▲◆ + ◆□△□◇△◆△◇△○◇◇●◇□△□□◆ + ▲●□●◇○□□◆ ◆■□○□□□◆◆□▲ + ●□◇□□■ ▲▲◇◇◇◆□○ + ○◇◇△■ ▲◆△◇●◇△△●■◇ + ○◇□△◆ ▲◇△◇●○△◆ ○◇○●◇ + ◇□□○△ ◇□◇○□△■ ◇◇△◇ + ◇◇●◇◆ ◇○◇◇○○ ◇○◇■◇ + ◇◇▲■▲ □◇●●●●●●□□◆○□◇◆ ○▲ ◆◇●■ + ○◇● □◆○○▲ △▲■◇△△◇ ○□●◆■◇▲▲ △○● + ○○○◆◇ ■■■■■□□■◆ ◆△□□◆△△△■▲◆ + ○□○◆○▲ ◆□▲■◇▲■ + ■■□● □□◆ ◆△□▲■□◆△ + ■△□□▲■□◇●●□●●△●□■■■▲□ + ■◇■◇◆●◆◆◆▲●◆△●□◆ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_23.txt b/codex-rs/tui/frames/shapes/frame_23.txt new file mode 100644 index 0000000000..5d340640bf --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_23.txt @@ -0,0 +1,17 @@ + + ◆▲□◆●□□□□●□◆◆ + ◆●◇□◇○◆▲◆●●▲◇◆◇□◇□◆ + ▲■□◇■▲●□◆ ■◇△□◇○●◇◇▲ + △●◇□●△◆ ◆●●○◇◇●○ + △△◇◆△■ ▲△▲▲■□△□○◇○ + ▲○◇■△◆ ◆□□□■■△□■◇◇○◇▲ + ◆◇◇■◇ △△△△ ◆◇◆ ■ ◇■□ + ◇△◇ ◇ ◇■◇▲◆○▲ ◇ □△◇ + ○■○ ◇□◇●●●●●●●●◇◆□◇◆■○◆ ◇ ◇◇◇ + ◇○○◆◇■●■ △◆○ ○◇◆○▲◇ ○◆◇ + △■◇ ◇ ◆■■■■■■■ ■◆△●●◇◆△○△◆ + ▲◇◇◆◇△ ▲△◇○○△◆ + ○ ◇▲■△◆◆ ◆△■●□△□△ + ○●○□●□□○◇●●◆□□■▲◆□□◆ + ■◇ □●○◇◆◆□◆◆□□◆ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_24.txt b/codex-rs/tui/frames/shapes/frame_24.txt new file mode 100644 index 0000000000..558224147d --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_24.txt @@ -0,0 +1,17 @@ + + ◆◇◆●□□□●●▲◆ + ▲■◆△■◇◆◆◇●●□▲◆■□ + ▲■■●○△□■◇ △◆△□◇□□▲ ○ + ▲■△△▲△◇●▲○◆◇△◆ ◆□○◇○◆■ + ▲ △△○△▲ ◆■■△○◆◇◆◆○◇▲■ + ◇▲○□○◆ □▲▲△ △◇● △■○ + ◇ ◇◇ ▲△◆▲△■△○○◇○○◇○ + ◇ ○◇◇ ◇▲●△○◆◇◇◆△△◆◇◇ + ◇△ ◇●●●△□□◇◇◇□□◆□▲◆◇ ◇ ◇◇ + ◆ △ □◇△▲▲●●▲▲◇△○○□□◇ ◇□◇ + ○ ■○◇○□■■■■■■◆ ○▲△□○◇●△▲◆ + ○ ○▲□○ ◇ ■△●△ + ○△□○◆◇△ ◆●■◆△△◆□ + △▲□▲○○■◇◇△●●●◇○◆△◆ + □△◆□□●○◆◆●●□□ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_25.txt b/codex-rs/tui/frames/shapes/frame_25.txt new file mode 100644 index 0000000000..38d3250764 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_25.txt @@ -0,0 +1,17 @@ + + ◆□●□●□□□□◆ + ▲ □▲□◆◆●○◇□◇◇▲ + △◇△△▲▲■△◇□○●○◇◇◇◆ + ◇□□◇ △ ●◇ ■○◇▲□○△ + ▲◆◆○▲△■○●△◆◇■ ◇△△○△□ + ○▲◇◇◇◆□□△○◇△ △◇▲◇△△◇▲ + ◇△◇□◇ ◇◆◆△○◆△◇○△◆■◇●◇ + ◇◇◇△◇△■ ◇◆●○△◇○◆◇●◇◇○ + ○□○◇■◇◆◆●●●●□◇◇○○◇□□◇○ + △▲■◇△◇▲◇◆◇◇●□◆◇○□●△○◇ + ○◇□△○◇◆■■■■■■□△◇○◇△◇◆ + ◇◆■◇●□●○▲▲□△◆△▲△△◇△ + ○◆○◇◆○◆□●△▲○△◆◇◇△ + ○△●○○◆□●◇□□ □◇□ + ◇▲■□○□▲◆□◇□ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_26.txt b/codex-rs/tui/frames/shapes/frame_26.txt new file mode 100644 index 0000000000..4aac44389a --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_26.txt @@ -0,0 +1,17 @@ + + ◆●□□□■□▲ + △□◇●△○◇□●◇▲ + △□■■◇●○◇○■■○▲ + ●□■▲◇◇◇◆◇◇◆□△○ + ◇◆▲○◇△◇■□○△●◇○● + ○ ■◇△△△■□◆○■○○△ + ◇ □■●◇◇△◇◇●●■□ + △▲ ○◇◇◇○○●◇◇△◇◇ + ◇ △○□●□◇□●●△○◇◇ + △◆◇△▲◇◆◆▲□○○□◇ + ◇◆■△◇□■○▲△◆□○◇◇ + ○◆◇◇△○ △△■◇◇◆ + □ □◇○ ○◆△◇△▲ + ◇■□○○■□◆□□● + ○△△○□◇◆○□ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_27.txt b/codex-rs/tui/frames/shapes/frame_27.txt new file mode 100644 index 0000000000..9896590f79 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_27.txt @@ -0,0 +1,17 @@ + + ●□□□□▲ + ◇●△△◇△○ + ●■◆ □◇△■◇ + ◇◇◇○◇◇●◇◇ + ◇ ◆◇◆▲■● + ◇◆△◆■◆◇◇◇◆ + ● ■◇◇◆□◇◇ + ◇ ◆◇◇◇●■◇◇ + ◇△ △ ◇□◇◇◇◇ + ■● △■◆◇◆□◇◇ + ◇▲ ◆○□□□△■ + ◇◇□□◇◇◆△◇ + ◇●●□●▲△◇○ + ○◆◆◇○●△△ + ■○■ ○○△ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_28.txt b/codex-rs/tui/frames/shapes/frame_28.txt new file mode 100644 index 0000000000..16b349dc3d --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_28.txt @@ -0,0 +1,17 @@ + + △□□● + ◇□◆◇◆ + ● ●◇◆ + ◇▲◆□◇ + ◇ ◇◇ + ◇ ▲■◇ + ○◇◇ ◆◇ + ◇▲■■◇ + △○ ◆◇ + ◇◇△△◇◇ + ◇ ◆◇ + ◇●□●◇ + ◇●□◇◇ + □◆◆△◇ + ◇ △□◇ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_29.txt b/codex-rs/tui/frames/shapes/frame_29.txt new file mode 100644 index 0000000000..24be1563b2 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_29.txt @@ -0,0 +1,17 @@ + + □□□□□▲ + ▲◇□△ □○ + ○▲◇◇ ■■◇ + ◇◇◇◇○○▲△ + ○ ◇■◇ ◇ + ◇▲◇◇◇ ◆◆ + ◇○○◇◇◇ ○ + ◇◇●◇◇ + ◇◇◇□◇ ◆ + ◆◇●◇◇ ◆ + □◇◇△◇○ ● + ◇△◇◇◇ ◆◇ + ◇◇◇◇◆◇◆◇ + ◇●◇□△■◇■ + ◇◇□ △▲ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_3.txt b/codex-rs/tui/frames/shapes/frame_3.txt new file mode 100644 index 0000000000..3f55b79ac5 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_3.txt @@ -0,0 +1,17 @@ + + ◆△●●□□●●●●▲◆ + ◆□▲△○◇◇□◇■●●◇●◆○◇□□◆ + ▲●△□●◇□■■◆ ◆■◇ □□□△○◇▲ + △□△○◇●▲□◆ ◆●□ ◇◇○ + ■△□◇△○△◇◇□○◆ ○○○◇◇◆ + △◇○○△ △▲◇○●○○ ◇ ○○◇ + ●□ ◇ ■□○◇◆■◇▲ △□△◇▲ + ▲▲◇▲◇ ▲▲◇■△○◇ ◇◆◇●◇ + ▲■■◇ ●◇□□◇◇□▲◇●□□◆◆◆□□◆◇○■●◇ + ▲○△○▲ △△□△●●◇ ◇□◇◆◆▲ ●△▲●○◆◇○◇◆ + ■○◇ ◇ ■◇◇□▲■ ■□□□■■■□□▲△△△▲△ + ■□◇ ○□ ◆ △○□○△△ + ●○△△□○▲ ▲□●△■▲◇■ + ●○□▲◆□□○●●●●▲△●□●◆◆□■ + ◆□□□◆△◇◆◆◆◆◇●△○■ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_30.txt b/codex-rs/tui/frames/shapes/frame_30.txt new file mode 100644 index 0000000000..54886a319d --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_30.txt @@ -0,0 +1,17 @@ + + ◆●■□□□▲ + ◆△●◇◇○□■●○ + ■■○◇▲○○◇□▲○ + ◇◇○◇△◇◆○◇○ ○▲ + ●□◇◇◆○◇▲◇▲ ◇ + ◇□◇○□ □◇◇◇◇△◇ + ○△◇◇◇○◆ ○△○◇ ●◆ + ■◇ ■□●◇▲◇■◇▲ ◆ + ■◇◆■○◇●◇○△◇▲ ◆ + ■◇◇○◇◆◆◇◇ □▲ ◆ + ○◇◇●○◆□◇◇◇□◇◇ + ◇□△△▲△□○◇◇■ ◇ + ○◇○◇◇△□◇◇▲◇△ + ▲○▲□●○△◇▲△■ + ○▲△◇○◆◆●■ + ◆◆◆◆ \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_31.txt b/codex-rs/tui/frames/shapes/frame_31.txt new file mode 100644 index 0000000000..b3989b89df --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_31.txt @@ -0,0 +1,17 @@ + + ◆△△□□□□●▲ + ◆□□●□▲◆■□○■□▲ + ▲◇○△△▲●◆◆△■◇◆□○ + ▲◇△□◆◆□●◆▲○○◇○◇◇○ + ○◇◇◇◇□▲□○◆▲■○◇△◆◆ + ●◇○◆◇◆◇■■○●□▲△△◇▲■◇ + △◇◇ ◇○□◇○△●△●□◇□◇△◇ + ○○▲ ◇◇■◇○ ◇○■■◇◇○△◇ + ◇○▲◆◇■○◇◇◇△□◇◇◇◆ ◇ + ■◇◇◇△△◇◇◆◆◆○◆◇○◇◇ □ + ○□◆△□◇▲ △□□□◆△◇■◇◆ + ◇◇◇○○○▲ ◆●□ ◇ + ●◇□●◆ ▲ △ ◇□◆△◆ + △◇○◇△◆◇◆▲◇■▲◇◆ + ■■●◇◆□□△△●□ + ◆◆◆◆ \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_32.txt b/codex-rs/tui/frames/shapes/frame_32.txt new file mode 100644 index 0000000000..919eee3b0f --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_32.txt @@ -0,0 +1,17 @@ + + ▲□□□□●●◇▲◆ + ●□◇□□◇○◇◇□□◇◇▲ + △○□●○▲□○△▲◆□◇□○■□▲ + ■△△◇◆▲◆●▲ ▲ ▲◆○◇□▲ ▲ + △△◇▲◇□○■□◇● ■◆▲◇○△○□○▲ + ○△○○▲○□◇◆△◇◇□◆ ◇□△ □ + □◇■●▲◆■○◇◇▲▲◇▲●◆△◆△△◇■◆ + ◇◇◇▲◆ ■◆◇◇■△■◇●▲◆■○◇■■◆ + ○◇◇▲◆ ■◆◇■◆◆◇□□□◇◇◇●◇■●◆ + ■■■◆◆◇□○■○◆◆◆◆◆◇◇□◇●◇▲◆ + ▲○□◇◇△ ◇□■■□□□○●△△△△△ + ○▲◇○○○ ▲○◇△■◇ + ■□□◇◇◇□◆ ◆△◆◇△ ▲ + ○▲○■◇□◇●●□◆◆□■◆△ + ◇●●◆◆▲□△□◆■■ + ◆◆◆ \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_33.txt b/codex-rs/tui/frames/shapes/frame_33.txt new file mode 100644 index 0000000000..c5598aa7a7 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_33.txt @@ -0,0 +1,17 @@ + + ◆▲□●□●□●◇△◆ + ◆□□◇◇○□●◇△◇▲◇□◇□△ + ◆△○◇□□□▲●■◆ ■□△◇◇□■▲ + ▲○△◇△◆◇▲◆ □◇◇○◆□ + ◆△◇△◆◇◇△○○○ ◇□○○○ + △△▲ ○◆○○◆○▲ △○△◆○ + ◇◇□ ○▲□◇◆◇○ ◇□◇◇ + □◇▲▲ ▲■■○△●▲ ○■◇□ + ◇◇◇ ◇ ▲◆ △□▲▲▲●●●□◇◇□△◆◇○◇ + ○△◇■■△△▲△◆◇◇◆◆◆◆◆◇◇□○○○◇◇△ + ○●○▲ ◇△◇△ △ ■■■■□□□ ◇◇▲△○◆ + ○□○□▲■▲ △△●△●△ + □○■□▲□●▲ ◆□◇▲△□○■ + ○◇■□○□◇▲●□◆■●▲○□◇□ + ■●●□▲◆◆◆○□□●▲■ + ◆◆◆◆ \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_34.txt b/codex-rs/tui/frames/shapes/frame_34.txt new file mode 100644 index 0000000000..5a44de8256 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_34.txt @@ -0,0 +1,17 @@ + + ◆▲●□□□□●◇▲◆ + ◆□□□△○●◇■◇□□●□□●▲●◆ + ◆△△▲◇□■△◇□◆ ◆○○○▲■□□▲ + ▲△◆◇□◆△▲◆ □◇▲□○○ + △△◇○▲△◇ ◇■ ▲ ○○□○○ + ▲△○◇◆△ ○○■◇○□○ ○▲○◇○ + ◇□○◇◆ ■○◆□◇◆○ ◇●◇◆ + ○◇●■△ ◇□◆◇△■◇ △ ◆○ + ▲■△△■ △○△△■◆●●□□□□□□◇◆◆■ ◇○◆ + ◇◇○▲△▲▲○■△△■◇◇◇◆◇△◆◆◆▲△◆◇◇◆◇○ + △◆○▲ ◇○◇□○ ■□□◆◆◆◆○ ▲△▲○◇■ + △▲○●●○◆ △●△◇△■ + ○□◆◇□○●▲ ◆□●■◆△▲◆ + ▲○△◇■◇□▲●▲□●□●□◆□□△■ + ■◇○●●◆◆◆◆◆●●□●○ + ◆◆◆ \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_35.txt b/codex-rs/tui/frames/shapes/frame_35.txt new file mode 100644 index 0000000000..1c1728676b --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_35.txt @@ -0,0 +1,17 @@ + + ◆▲□●●□□□●□▲◆ + ▲□●□△◇□□□■◇□◇△■◇□●◆ + ◆△△◇●□□◇○□■◆ ◆■□●□△■◇□▲ + ▲△△□△▲●▲◆ □□◆○◇◆ + △△◇◇△△○ ■○□▲ ◇○□◇▲ + ●△●△□◆ ■◇◆■△△□◆ ◇○○◇ + ○ △△ ○○ ■□◆△ ◇○○○ + ◇◇◇△ △○○●△■ △ ■△ + △ ▲◆ ▲◇◇△●■△◇●●◆●◆●□◇◇ ◇◇●□ + ◇▲○●■ △△●■□□△◇● ○▲◆◆◆◆△■◇△■ ◇■ + △◆○▲■△○◆◇△○◆ ◆■○○○○□○○□△△◆▲◇ + ■△○○△◇ ◆△□ ▲○ + ○●◆○●▲△▲ ▲●△◆□□■ + ■○◆■◇□◇▲△◇◇□◇●△□■◆△●■ + ■○◇●●◆◆△◆◆□□□■○ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_36.txt b/codex-rs/tui/frames/shapes/frame_36.txt new file mode 100644 index 0000000000..0cac995ed7 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_36.txt @@ -0,0 +1,17 @@ + + ◆◆□●□□□□●□▲◆ + ◆●■■○□△●△□○□●□□■□□□◆ + ▲○■○▲□□▲□■◆◆ ◆■□◇□□◇▲□◇▲ + ◆◇■□□◆◆◆◆ ■□◇○■◇ + ▲△◆●○■◇○◆○▲△ ○○△□ + △ ▲△◆ □◆ ■◇△▲ ■○○□ + ◇ ● ◆ ○ ■○○ ◇○◇▲ + ◇◇○◇ ◆○ ◆△△ ○◇ ◇ + ◇■■◇ △△ ▲□■■▲□□◆□□□□□◆ ◇○◇◇ + ◆□◇○ ▲◇◆◆△◇△ ◆◇◆◆◆◆◆◆◆◇◇ ○△■◆ + ■ □◇○ □◆□△○ ■□□○○○○○■ ◇▲■△ + ■▲■○●△ ▲△◇■△ + ○△◇◇□◇▲ ▲□□■△▲◆ + □▲◆■□□●○●◇◆□◇●■▲■▲●□■ + ◆□□△◇◆▲▲◆▲▲□□□□■ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_4.txt b/codex-rs/tui/frames/shapes/frame_4.txt new file mode 100644 index 0000000000..31e55f9cb8 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_4.txt @@ -0,0 +1,17 @@ + + ◆△●●□●●□●□▲◆ + ◆▲■□□◇△ ◇○●△□●◇■△□▲◆ + ▲□●◇◇◇□□■◆ ◆○◇○○□◇△○○◆ + △△◇▲◇■△□▲ ■◇□□○□○ + △◇△◆◇●◇○●○◇▲ ○■○◇□○ + △◇◇○◇ ■◆◇◇△□○ ■ ○●◇▲ + ■○◇●◆ ■□□○□■◇▲ ▲ ■●◇ + ◇△○ ▲◇△□○◇◇ ◇◇◇ + ◆◇ ◇◆ ●◇△■○△△□◇□□□◆◆◆◆▲▲ ◇◇□ + ◇○△ ◇ ▲△△△▲◆◇◆●○◇▲△◆▲△△○●◇△△■◇ + ◆◇●■○▲○○▲○△ ■□□□□□□□■○▲◇◇◇◆ + ▲◇○■◇◆◆ ▲○●△□□■ + ○○▲△○ ▲◆ ◆△○▲□●◇△ + ◇◇◇●◆□□○●●●●▲□●□□○◇□◆ + □○○◇△◇◆◆◆◆◆●▲□◆ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_5.txt b/codex-rs/tui/frames/shapes/frame_5.txt new file mode 100644 index 0000000000..a8ae0ab819 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_5.txt @@ -0,0 +1,17 @@ + + ◆△●●●□●●●□▲◆ + ◆□■□△□△◇◇□◇●□●◆◇■□▲ + □◆△○□◇□■◆ ■○●◇□○ ▲□▲ + ▲◇△◇△◇△●▲ ▲○◇◇◇◇◆ + ▲○△□△○◆□◇◆○▲ ◆ ○◇○◇◆ + ◇◇◇◇△ ○◆◇○●△◇◆ □△◇◇ + ◇△◇ □ ◆○◆◇○■◇▲ ■■◇□◇▲ + ◇△◇◆■ ▲◆●◇△◆◇ □◇◆◇ + ◇▲◇○□ △◆◇■▲◇□●◆◇□◇◆◆◆□▲◆■◇△◇ + ◆○◇○▲▲△□□■ ◇■ △△○●○▲●△▲△◇△□◇◆ + ○▲◇◇▲◇▲○○△□◆ ■□□■■■■■▲◇●◇○△ + ○○□△○○ ◆ △◆△□▲○ + ○△□○◇●□◆ ◆●□▲□■●□ + ○◇□◇▲□□○●◇●◆▲□●□○◇●□ + ○▲□◆□■◆◆◆▲◆▲□□◆ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_6.txt b/codex-rs/tui/frames/shapes/frame_6.txt new file mode 100644 index 0000000000..e0b1f85454 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_6.txt @@ -0,0 +1,17 @@ + + ◆△●●●□●●□□◆◆ + ▲○●△□◇●□□◇□□●◆▲□□◆ + ▲▲▲◇◇◇□■ ◆■◇△●□□□△○◆ + △▲◇□◇□◆●▲ ○□◇◇◇◇▲ + ■●◇◇◇□○○□□○ △○○◇○▲ + ●▲△◇△◆○□●◇○◆◇▲ △●○△◇ + ◆ □◇◇ ○○◇△○○ ○□◇◆◇ + ◇ ◇◇◇ ◆◇●◇△◇◇ ◇□○◇◇ + ◆△◇▲◇ △■◇◇□●△□◆◇□◇◆◆□□◆△○△◇ + ◇◇○▲△◆○◆●□ ◇△●□▲◇◇▲●●●○◇▲◇○ + △ ◇ △◇◇◇●△■ ■□■■■■□■◆○○△◇ + ▲ ● △▲◆ ▲△◆△△◇◆ + △◆○◆□□▲ ◆□○◆△□▲□ + ◆■◇□▲■□ ●◇◆◆▲□□□ △●■ + ○▲●□□▲◆◆◆◆◆▲□□ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_7.txt b/codex-rs/tui/frames/shapes/frame_7.txt new file mode 100644 index 0000000000..7e69d68d57 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_7.txt @@ -0,0 +1,17 @@ + + ◆△◇●□□●●□▲◆ + ▲□◆□○◇□□□●●○● ◆□▲ + □ ▲◇◇◇□◆ ◆○◇◆ □△◆□▲ + ○○◇◇◇◇●□ ○◇○□◇△▲ + ◆■◇□◇◇○◇△○▲ △ □◇◇○ + ◇ ●◇◇■ ◆■○●◇○ ▲▲◇◇◇ + ◆○■◇ ○◆◇○◇○◇ □□○◇◇ + ◆■△◇◇ ●□△◇□◇◆ ■ ◇◇◇ + △■◇□ ▲■◆△◇○△◇◇●●◆◇◇●●□○◇◇ + ◇▲■◇◇●△◇◇△■◇△○◇◇○○▲●▲●○◇○◇ + ○ ●○△□◇□◆△ □□□□□□■■◆△◇◇ + ■◆ △◆△◆◆ ▲■▲△●△■ + ■●▲□○○○◆ ▲○◇▲□△□■ + ○◆■○◇□○●◇◆◆◆□□◇□□△ + ■◇□■◇△◇◆◆▲◆●□□ + \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_8.txt b/codex-rs/tui/frames/shapes/frame_8.txt new file mode 100644 index 0000000000..b7bddd4156 --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_8.txt @@ -0,0 +1,17 @@ + + ◆◆□◆●□□●□▲◆ + ▲■□△◇◇◇□●● ◇ ■□ + ◆◇●▲◇△△□ ▲■◇△◇□○□○▲ + ◆□○□△◇▲□◇ ■ ●○◇◇○ + ■ △◇△▲○◇△○ △■○◇◇▲ + ◇■▲◇○○○◆○◇◆□ ○□◇◇◇ + ◇□◇◇◇ ■◆●○◇◆◇ ◇○◇△◇▲ + ○▲◇◇△ ◇□○△◇▲□△ △◆△◇◇ + ○ ○◇◇◆○ △□●◇◇△□▲□▲▲○◇◇◇ + ○□△●◆◇■▲◇▲◇◇●◇●◆◆◇◇●■ + △△○○◇○◇◇◇△■○□○□■○□■△○◇ + ■▲■◇○◇◆◆ △▲△△△■ + ■○◆□○○○◆ ◆△○◆◇□△□ + △△■◇▲□ ●●□□●△●▲◇◆ + ◇◇◆□□○◇◆▲□△●◆ + ◆◆ \ No newline at end of file diff --git a/codex-rs/tui/frames/shapes/frame_9.txt b/codex-rs/tui/frames/shapes/frame_9.txt new file mode 100644 index 0000000000..4342d3c81e --- /dev/null +++ b/codex-rs/tui/frames/shapes/frame_9.txt @@ -0,0 +1,17 @@ + + △●○□△□□●▲ + △□◆△◇◇□■● ◆▲○◆ + △ ▲◇◇△□○○●△ ○◆◇▲ + ■ ◇◇△●●◆ ◆○▲◇○○◇□▲ + △□■●○□■◇□▲ □△■□△□◇◇ + ◇ ◇◇◇■○◇○●◆◆ ◇■◇□◇◇◇ + ◆ ◇□○◇□□◇○○▲■△▲△ ◆◇◇ + ◇ ◇△◆▲○◇◇◇◆△●○◆◇ ◇◇ + ■▲◇■ △◇■◇◇◇◇□◇◇▲◇◇◆ + ◇◆◇◇◇◆▲◇○◇◆◇◇◇◇◆◆◇◇◇ + ■ ◆○△○○◇△■□□□□◇◇■△○◇ + ○◇◇◇○▲◆ ▲△ ○△◇◆ + ○□○◇○○ △●◆●◇△□ + ○▲■○◆◇□△□●●●□◇◆ + ■▲◆ □○○◇●□△■ + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_000.txt b/codex-rs/tui/frames/slug/frame_000.txt deleted file mode 100644 index be426659a7..0000000000 --- a/codex-rs/tui/frames/slug/frame_000.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ddddottttttttttdd - tdpe5pgtpeddec--eegpepptd - d5eopgpetdetpeepotegpppttd gtd - tpe5tpdtt5pp -exgptcd pt - dpe5tpd55 tgpetdpt - tee55p5e toteedoo - 55e5g ep egooop dcoetde - t5eepgee podpe5ex epodetde - ppxeoep epcoood5e ptpedot - eogeedex poepd5eed- -eeee e - 5ecx oe td5c pxc gxeece - g oo 5e pd5eeg cp oeexe - eeee 5 te55g 5ee doototttttttttt ec5e e - pec et d5eepp 5pe 5xeodppppppggg ecoeoe - o-eo5 eo pe5e dee gxg------ e eepee - ooeeddet pttpc t5e55g55 - oooe ood cpcp5e55 - oeeet peod dedtepdep - ptppet ptpt cdtpeptp-cp - gxpeet eotppoetddtttttppetetppdtpe - pgpptctxepox5gppceeotpg dtpg - pptceteecddddddttcppe - eeggpgggge - - diff --git a/codex-rs/tui/frames/slug/frame_004.txt b/codex-rs/tui/frames/slug/frame_004.txt deleted file mode 100644 index c3ef842ddd..0000000000 --- a/codex-rs/tui/frames/slug/frame_004.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ddddcttttttttttdd - td5e5pgtpgdte--- pgpegptd - d5eepepecdetpeepoeegppptcd gtd - tep5tpdte5pg tgpocd pt - dpe5tgdc5p gtppetdpt - tee55d5e o5eedoo - 5eepg ep ocgeoop pcpetpe - t5eepdee poddd5o- 5opeede - ppxe5ep eeeeoooo egtpexot - epgee e tdeppd5eg eeee e - pe5xpde td5ep 5t- oxeepe - g o5 pet d5eeg -cpe gee e - eeeepgpo ce555 c5ee dootottottttttt tg5e e - pet ed 5eeppp5p p edppgpppgggggp ecoede - opeodget pe5p deg -tpcttdexecoott 555eeee - oooetded pttp e t5e5eg55 - tooedgotd dpcp5p55 - odeet-p5od d5ctepdep - ptpeed ptpt ddtpepteecp - pxpeet gptppeetddtttttpeecetpgdtpe - egpptcd5exctegpppetotpgpdtpg - gpteettocddddddttcppe - eeggpgggge - - diff --git a/codex-rs/tui/frames/slug/frame_008.txt b/codex-rs/tui/frames/slug/frame_008.txt deleted file mode 100644 index adec3d6c54..0000000000 --- a/codex-rs/tui/frames/slug/frame_008.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ddddottttttttttdd - dd5eppgxpedte--- dgpxgptd - d5eeptpd-cttpepooeegppotcd got - teepegddtepg5 tgpocd pt - tpe55etep gtdpetppt - 5eetgdep ttdt pddeedoo - 5e5ttteg pegtopc opetdo - 5e5e te oeggogtp odecde - eeeo exe geecetod gopetee - eeee eep pdgeoeogt gdee e - xede eg gteec ce- eeede - te5c ot dpeee ded e eeexee - ppee ee 555pe e5 cdtotottottttttt dpee e - pxdegg5e dee5e5dep -dxeppppppoggggg edoede - edeo ood dgp5- tp odpetteexecooct tpeee5p - deec ood dtttg 5g55pt5 - 5eeo peed d5cp5ptp - -peed optd d5ettpdep - d ootd oepttdcx ddtpepteecp - gxpep5 ppeppeetddtttttppetetpgddpe - eeeptddxepot5eepeeeoppgpdetg - gdteeetodddddddttcppe - eeggggggge - - diff --git a/codex-rs/tui/frames/slug/frame_012.txt b/codex-rs/tui/frames/slug/frame_012.txt deleted file mode 100644 index 447bbf6959..0000000000 --- a/codex-rs/tui/frames/slug/frame_012.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dddotttttttottd - dt5epptpgddttdgcedgpxpptd - dte5epetdctpeepoottpppooctdpgpt - t5tepdoepepg5 teptdt gtd - de5egccptg-- peped go - 5eedge5p tttd ete ood - 5ee5deee coetptpc popeddpt - 5ee5dep5 dpoxdddod p5etdod - eepeeepe dtoeeoogod ope oe - eepgteg oopeeetpd gee5 5t - oee ee p5oee ce eee ee - xee eep teep dp5d eeexee - tpe eet cd5e5gxt5g ttoootttttttttt eee ee - ged e5 ee5petep e xe5pppgppppgggggde oepe e - eee p5e pee t5eep eopctttt5xeeecooped5ee-5g - eeo p5o pttp d5555ce - deo gtpt 5ep5p5e - oeet ptptd dte55gd5p - peeed ptpptdd dcpeo5ecc5e - egeed ptepeettdcttttttpeeeepeddpe - pptd-d gppoeeeeeettppe dtpg - gpgpttcddddddddtoctpe - eggpgggge - - diff --git a/codex-rs/tui/frames/slug/frame_016.txt b/codex-rs/tui/frames/slug/frame_016.txt deleted file mode 100644 index ac7b452be4..0000000000 --- a/codex-rs/tui/frames/slug/frame_016.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dddtttttttttttd - td5peppgdd5edttdgpxgpttd - -c5pgddcttpeetootteee5oddgtpot - d5tpetctptpge epteotde-pod - 5tp5eeptp gpeeecopc - dee5cep ttt peetgttt - deee5e5p eegodet oec ooo - eee5e teo5gtpod pee ceo - e55ee5 peeoeodpod pec tet - e55eeg ooeeeopod- pee eep - eex egx pee 5pcep ee 5d - eed eg5 cp5-petgp geg 5d - e5 eee d5tp5eep ttttootttttottt pepexe - te-e5ot teg5cot5e p5pppggg5ggggppte deet5x - pot eoed ptd5dcp eottttttxe5eeeep 5ogdoe - oot oopd pttpe deoe5gpp - pot oget tetep5ep - gecdgopetd dteepttep - pecdgoteetdd- dc5eepxd55 - peetdgpeeepettccttttttpeeepp dtp - eppddd epptteeeeeepppg dtt5g - gxpoxctddddddddtoctpg - eggppggge - - diff --git a/codex-rs/tui/frames/slug/frame_020.txt b/codex-rs/tui/frames/slug/frame_020.txt deleted file mode 100644 index 90d04f8458..0000000000 --- a/codex-rs/tui/frames/slug/frame_020.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ddddtotttttttddd - td5eppgddoc-todppptpptc-d - tcpegtdcopecttoott5pettdgxpo5x - tteedc5ptpp -oeodgtptpd - tp -tpp-gep gpeopodop - 5e dep5d tt ocgto5t - 5 teee 5goge eoo epoo - 5e tetpx e5cptood oo eoet - dptdee5 geoxtogeo et cep - e eeee pecpptood ge epxe - eepeed eodep ceep exdx5 - e5peeo- tg5 c5p5e eogxe - oepeeed 5-5dcee5 dcttttooooooootd eodxe - ptoox5o- dppp5pp tppppppgggppppe5 oe5ee - eooeoge ogct5e etttttteeoexte5 dooxot - eo eo5o ee dp5555 - eotoptpdx t5eepd5 e - oetptptpd dtp5eee5t - pecdpocepttd- dt5pdeeptgg - gpet pteeeeptttttttttteeptpecptp - pptdd gppttttte55opge dtppde - gppexttdddddddtttttp - eggppggee - - diff --git a/codex-rs/tui/frames/slug/frame_024.txt b/codex-rs/tui/frames/slug/frame_024.txt deleted file mode 100644 index 3ba7d8cd97..0000000000 --- a/codex-rs/tui/frames/slug/frame_024.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dtdtotttttcddd - d-cxge p ppgdppxppttctd - d5g dttpgcttoottoctd-gxgptpt - 5p tppdtpot oepotogtpoeo - tp d5pgtd cpto opodo - 5 c5et ctdt pttpcote - e 55td opde potgeooe - e e5cd eegopt eegeo5e - te te o eopdo cotptepc - e5eee5 e5ogpoo ppe edgg - e5exdt oe top 55eeeo - edepee gdp dpg oxeeee - e5p5et x5epg55 dctttooototootd dg eeee - getepde deggdep ecddppppppppppe5p eege5e5 - e5ptodd odtce gtttdttdddttte- de5top p - edptopt 5eop5 - - pedptogo dpoepg t - ed ogtptd 55tte-d5 - pedgxdocptdd dtpdtgcpdte - peddgdepteeottcdddtttpptt5c5tptp - gpetd gppppepppettpepptp-epe - epptoccddddddttteppgg - eggppggeee - - diff --git a/codex-rs/tui/frames/slug/frame_028.txt b/codex-rs/tui/frames/slug/frame_028.txt deleted file mode 100644 index cb900795b3..0000000000 --- a/codex-rs/tui/frames/slug/frame_028.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dtdxctttttcddd - toppe eppetdx- - dcpe dttpgeetooototd edptdpt - d5g dtpgt5 eot ppcdpt - tppd5p td oet cododo - e5555 d tp petedoeto - eg5epcge gtppg poppoe5o - 5ee5p d topotc pt-dto5e - edoe-5 oodod tp e eeo - egcpegg topptop ee gee t - eceeexp e e 5op- cgogxecg - egeee5 expppp p gegeee- - eeggeed ptt tp-dtotttooottotc tggoee- - e ee e ece5 5e pccctddoccctdet etee5 t - edo5cg ope pcccedddddddtg c5dec 5 - eoopdp dege t 5 - gedoeepo te55ep te - etdcpt d5pd5e5 5e - pedpcexp d ddtpxep pdp - pecgxpexpeoctodtttteeepet5exd5e - pettxeeeppppppeopgtdd5-d-p - gpetteeoeeeeotpeegpg - eggppgge e - - diff --git a/codex-rs/tui/frames/slug/frame_032.txt b/codex-rs/tui/frames/slug/frame_032.txt deleted file mode 100644 index 0b8c32cb74..0000000000 --- a/codex-rs/tui/frames/slug/frame_032.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dttotootttccd- - d-5pg gpeodptd - dcpedttpgpetoopptt eopppgt - depceppdtpe5 eot ooo gt - tpdepg 5c et eot pd - 5ptet-d d ceo odtdet - 5p5epece eo5o g5dpo eped - deo5p 5 -ooto p t ooo - etoe p otoodod opdte-oe - e ee e eo5ptp- etotepd5 - poeepp doe5p55o- exe5gee - 5peeo pt5pp5ep 5 eeeep - exeege deedee dttoeotoooot etepeeg - et5e o pode5 edpptcodcood5 cgoeeeee - peete ttttcdecedet 5e-e g 5 - e5o5dge ee cpx55g 5 - edoee5o 5pd5x5 te - eeppodp degt5 5-te - pcdopptpe tepe5pted5 - peettppoetcxcttttteepe-5ed tg - peeeetxgpppppppge-dtpdd5e - eppecddddddttpcpg-pg - egggpgge e - - diff --git a/codex-rs/tui/frames/slug/frame_036.txt b/codex-rs/tui/frames/slug/frame_036.txt deleted file mode 100644 index 6bc263fd9b..0000000000 --- a/codex-rs/tui/frames/slug/frame_036.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dttttctttcdd- - ddtpgdc-- ggpgpetteot - tepcctpppgtoppxt g-op god - depe5pddtg pt tedepo - t5tepg ed oott od - t5t55 d o poeo-pd - et55 cdodp o oootdo - eeee dop5pdpt 5do tdoe - eeoe tpt5dpo - odgoo5d - e ep -geet5cdo- o exttee - e og edogt5oc- e eee ee - eood pe5 5pp e oeeepe - e55p e tp-eg -dttttttoto peeeeeee - ee5edt p 5g epppppppppoo 5 epeeee - eo5e e ottttteoddep egepeeede - gepge e eeeee d5 5t5 e - oeeec o teee 5 - oeeoodpc tp 5g te - peetxodp depttd-p 5 - oeetpctepotcdttteeeepced tg - ptdgppppepepppecdcppdtp - gttcddddcdcpptpd-pe - ggggee pe - - diff --git a/codex-rs/tui/frames/slug/frame_040.txt b/codex-rs/tui/frames/slug/frame_040.txt deleted file mode 100644 index 5e30c49ffa..0000000000 --- a/codex-rs/tui/frames/slug/frame_040.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dttttttcttddd - tcpgd5oodppteectxptd - tegdtptpgeoptcdggetd eod - 5g5egecpg ppgo po - edpxe -p5et ee - expx ddto t5op oe - co5e gooeeo p5pdooto - eeee eoo ed tgotee dd - dgee ooo odp dedeeeee - exee 5eoteoodt ggeoectp - 5eee oeo5oe-t e5eeeeee - o5ee oe55g 5 e e eeeeee - egep o5e5 tddtttttttt peeedt-e - p55t g5 tpppppppppee e egeeeo - ee5t eptttdeodceg 5pegeeeee - e55etp e eeeee e oteeeep - eeoo pd eeee5ee5e - eoptdpo dee55-p e - eeteoep tpep55d d5 - pdgtoctepttttdtpgtt5pe tp - gtd gppeeeeppetcdpd tp - ptcd-tddttpcpdctg - egggee e - - diff --git a/codex-rs/tui/frames/slug/frame_044.txt b/codex-rs/tui/frames/slug/frame_044.txt deleted file mode 100644 index 2c3a8bec70..0000000000 --- a/codex-rs/tui/frames/slug/frame_044.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dttottdtttddd - t5pdtttpgtepec ptd - deecptpgeptcdpoptc gt - tp5p5 etod oot - top5e ooecp et - 5ep ddt otoxo 5t - e55 peot 5doopoo - ege oeo5ddt ot ee e - tode pep5oded 5deee e - eep odoepep eo5xc 5 - peg o-e5pgx geeepeee - 5ege 5t5e- xeeeeeee - ee5e de 5e ddttttttttgxeee-txe - gpee e 5e- ppppppppot-egoxteee - e5tdet5 5ptooeote5eteeexee 5 - eetop ex eeeeego etee pe - e5od5t 5oeg -xoe - o5eodoo tp5t 5 5p - o5edtppt 5p5tc5 55 - odpettdpttddtpe55dd cg - podgptooeppedtoee tp - eptdddt-5pcoedtpe - eggge ge - - diff --git a/codex-rs/tui/frames/slug/frame_048.txt b/codex-rs/tui/frames/slug/frame_048.txt deleted file mode 100644 index 0921c33e5c..0000000000 --- a/codex-rs/tui/frames/slug/frame_048.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - tdoxtttpttt - tpectdgocepcgpot - 5tegpgeptdoood po - 5e5pt oeod -ee - eedd eood pde - dog dtd ote5ctoo - e5eeettg 5 oogopd - o e g5o o ecgoo e - -eee teeeot egeooeee - eeo pe55cgp ttpet5ot - eee eooexx e5eep5ee - eeee o pgp eoeeeeee - ee5o ge5 ddttttt eoeeeeee - eege5dt ppppppeo egeeeeee - 5eepee ttoeot5g epeee oe - e5ppx egeee eeede - ppce e dg5oeeeed5 - ee5tdod e5t 5eete - gteeoppd- eetxtxp 5te - ptpdtdpptdt5dt 5c ee - godptoe5pecptpd d5 - gtddddtpcpd d5e - egpeeeege - - diff --git a/codex-rs/tui/frames/slug/frame_052.txt b/codex-rs/tui/frames/slug/frame_052.txt deleted file mode 100644 index 2214ab4fb2..0000000000 --- a/codex-rs/tui/frames/slug/frame_052.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - d-otttcdttd - 5gttgop5o gdet - e55tgpoptotep oo - ce5p5 ge55 oo - eed 5 oeoo opd - eepdded ecepg ee - pgeedtpp ogpe ge5t - ee eexoe t ee deo - 55e 55dxo eee5 gge - eeg eeeod e5teeoe - ee5 pe5eo x5xo5e x5t - ee5 ec5dpg e5deeec ee - e5 ee dddttttodeeeeeee - eg op pppppdxxgeeeeeee - ee5 e oocdepeeo ee e - 5ee -5 egeee eegge - eege do5g ee de - eeeo eet-eeept - eepo txooxeex 5 - oepcdpodp5dxp 55e - odtxg5e5dep 55 - ptddtgd5p-deg - gpgeggg - - diff --git a/codex-rs/tui/frames/slug/frame_056.txt b/codex-rs/tui/frames/slug/frame_056.txt deleted file mode 100644 index 23e82cc35f..0000000000 --- a/codex-rs/tui/frames/slug/frame_056.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - tottttdttd - 5tdoo5-cpget - ce5poogee pet - tep5eoett ptgo - eox dd5ooo g5c - edtdpt eeoep pe - eeet e pee ecexo - o5p5 xxt de e - gegetp degeee5 - o5opdce eepeet5e - e5ecote ee5ppe5e - e5p5pge eege eee - p5oedddt ee5eepxe - ooegppxo eec ee e - goe cg eeeeeeeoe - eepett e 5eeee 5e - eee eeg o eeeee e - deg d ceee tc-de - epd e egoope ee - oedop5o5te xxdp - op-gg5cp g5 - tdd5dp op - gpepggg - - diff --git a/codex-rs/tui/frames/slug/frame_060.txt b/codex-rs/tui/frames/slug/frame_060.txt deleted file mode 100644 index 9efc53706b..0000000000 --- a/codex-rs/tui/frames/slug/frame_060.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ottt-ptt - d oe5 pgto - 5eee5egddo - 555ecx peee - eex5ept gee - eede55eoe oe - ee-pee5eg xe - eegpeeeedgg t - ee5xxp5deeeee - eeeex eex ode - eeotg eppxgee - eeedx e gx5ee - eeddxde-eeeep - eexexeeee eo - eedege eee e5 - eeoxxeeeeeege - eo555e -g e - gee5eegceeg g - 5eeeoetodeo - eopeog xpxe - o x od tddp - ppe pp-cee - gpgegge - - diff --git a/codex-rs/tui/frames/slug/frame_064.txt b/codex-rs/tui/frames/slug/frame_064.txt deleted file mode 100644 index c1fb7ba69e..0000000000 --- a/codex-rs/tui/frames/slug/frame_064.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - tttttttt - eoeggggoe - edep xd5o - exeoddge5 - e55etgoee - pg5gdd5de - p5ge5ppge - deex e-od - oeodt -e - eeeeddxed - eeegtpgxxx - eeee-5o5e - eeeeeeexee - eeeeeeodee - eeeeeeeeee - ee5eeeeege - eeeeeeeeee - eeeeeeee5e - eepeo5tede - oecex-geoe - oepe x e e - p5gg 5p5 - gpgppge - - diff --git a/codex-rs/tui/frames/slug/frame_068.txt b/codex-rs/tui/frames/slug/frame_068.txt deleted file mode 100644 index 973341c810..0000000000 --- a/codex-rs/tui/frames/slug/frame_068.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ttt-tttot - o5go5eo g - eteppdoeoo - get t epe-e - exe eoeee e - gpx-e5oeo e - oxxeeeeee e - 5eee-eoeee e - exeeeeoeep e - edeexeg5eo e - exgpede5et5e - etg-egggee5e - de eee eeepe - d eeeteeege - dxeeepepeee - ooeee 5deee - e5eeed-xe5e - eeocpxeo5ce - epe-ttetxee - pogg eggeeo - eet ee-e-e - e5d xtdde - egpgggge - - diff --git a/codex-rs/tui/frames/slug/frame_072.txt b/codex-rs/tui/frames/slug/frame_072.txt deleted file mode 100644 index 0dd90ac9af..0000000000 --- a/codex-rs/tui/frames/slug/frame_072.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ttxctctxt - 5ddx5eo5d-p - eeg e 5edpooo - toe pxeeetp 5 - ee5e-oegegpcept - egxteexeeee oe - oeeggogetx --x5 - eeeeedeeeogx ee - eeeeeeeegxee t5e - eeeeo5ee5 dpxeee - eeg oe5e5-tx55ee - eeoxc-dgodoogooe - eeeeeogx55ctooee - eeeee epeeeeepee - eego eegegooetee - egogegeeeoo5ode - et gepeo eee5o - eee otodtpe5xe - pe5octgcee5eete - eet gggp5depe - to - opepc55 - p5e- oeod5 - gggeggge - - diff --git a/codex-rs/tui/frames/slug/frame_076.txt b/codex-rs/tui/frames/slug/frame_076.txt deleted file mode 100644 index bb73198edc..0000000000 --- a/codex-rs/tui/frames/slug/frame_076.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dtppctttxdd - pd5xxdoopd-po - ee5xpo5eoegptoo - e5e-55oep5gopppet - ttcxep55ee -po5 - eoo55get5td oet - oe5odtgeeop dee - eeoe5ee eeepc 5e - eeoteeedodeee tcxe - oeeeee eeot eede - eeeee5 5edetee e5oe - eeeee- o5d eoe geoe - eeeee 5exooptoeee - eeeee 5eodteed5eg ee - eeeee ooeeddpg5et5xe - eeee ooeepoedteoe5e - eeeeg oe5 egeot - peeeee ge 55opep - eopoteep5t te xto - gto- xeooe5pceopp - pet- edgttpc5o5 - gotp gtepddcg - geegepge - - diff --git a/codex-rs/tui/frames/slug/frame_080.txt b/codex-rs/tui/frames/slug/frame_080.txt deleted file mode 100644 index 28dcb3b4ce..0000000000 --- a/codex-rs/tui/frames/slug/frame_080.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - topxdtopxdd - 5pp pgeepetcept - eep5t5tegtpgptpto - 5gee 55et5-ege ppoo - eg5eetteop -det - 55xt55eop d o5 - ee5ooetet dpd d5et - cex eepppe oceo pe5 - eoeggxdxxe -odt- ee - oeeegexee oeeo e5e - eeeexddee c5 5 5p5e - eeeepedee eded geee - e5eeegeee 5dgeo p -deee - eeeee 5eg ecepex p eeeoe - eeee- pe pd 5 ee5 5geep - eeeee pe -p5 deeeoe - eeeeepee 5eeee - ooeed5gepd g5oo - pet eeooood eepe - ood oodoopttpedetp5 - ged g pc pot5pdp - pod gtdptddcpe - egeeeegge - - diff --git a/codex-rs/tui/frames/slug/frame_084.txt b/codex-rs/tui/frames/slug/frame_084.txt deleted file mode 100644 index 3af58be461..0000000000 --- a/codex-rs/tui/frames/slug/frame_084.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dtcpdtcttttt - dep cgeepgdc-dpod - depee5g55dtppgptgoeo - t5pt dptptpc ee ogoe - t5pt x5teep gee - e5et5pp5ot d pot - eee5oeteeg peo 5eo - ex 5eeeet etodd p5et - epe5gxxtg o5deo peo - eeeeegoee do5t xee - e5eegoepe t oetd eeo - egd-pddee xoptee ee5 - eg ete5ee p5dpdtootpod ddx5 - ee degeexe 555d5 tepge exex - ep ppeede d5 e depe pp5ge - eg ggpep e5 oeee - do poeeete tetete - oeo gdpo o e5dooe - ee opeo ed 5g gep5 - oo eg5eodpdddtpd5ceg5 - ped eoeox gpttppgtg - ptd gtdpodddd5p - egeeeegge - - diff --git a/codex-rs/tui/frames/slug/frame_088.txt b/codex-rs/tui/frames/slug/frame_088.txt deleted file mode 100644 index fca5002fcb..0000000000 --- a/codex-rs/tui/frames/slug/frame_088.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -tcxdctcotttd - t5d tc5e5pedcocgpt - d5e- tptpdtppeepxgxopt - 5e g-5555cpx pxtepdeo - 5dpe5p5pp o-edeo - 5e55t55cd dgpp gee - deodge t5 epc o oett - eee55ppe etpt d gpee - gggg xdd o5dpxoe goe5 - eeeeecoe 5p5op p-eee - eeeeeee5 c d5ede p-ee5 - edgeeeee 5pe5detg -eeo - ee x-eee eedp5et tppod ceeg - g-g p5e -555t55 opgge5 eeeee - e -geed deet oppt- etp - p5c xgeg ote xe55 - et oedotot dp55xoe - p5optpetot cp-5oo5 - ecodtoetpo d5etete5 - ec oooo pttddcpdexepop - gedegdgox gpottppgd5e - gtt ettptcddddtpe - ppeegpgge - - diff --git a/codex-rs/tui/frames/slug/frame_092.txt b/codex-rs/tui/frames/slug/frame_092.txt deleted file mode 100644 index 4ef99536a4..0000000000 --- a/codex-rs/tui/frames/slug/frame_092.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dttcpdttttcxtd - dtx tgepgpgdc-ecgpot - d5ge-tpppgdtppeegptpcdot - 5pt5cpd ptp d-dppeto - ee5 tgec x- poo - exddopt tdc ppee - 5pgpe5et 5epog d5oe - de5teece e5tpo ge5d - eeee edp ettpoeo eee - eee tee et5po 5ee - oeexede -coegg ee5 - oeedeee 5555p5 xpg - eee-eee 5d555-5d ootttpec -gep - eeeepo5 c5555ep popgpege teed - peeeoeeto tte o pepcpcet eopee - pdexx55 e pote e p eeg - ptdotpoge tp eoo5 - pedootoo e ed5te5 - pedodoeodpt dcppd55p5 - od gteeteptddddtpptxptptp - gododedt- epptttpppedp - ptdettpxtdddddttg - ep eegpgge - - diff --git a/codex-rs/tui/frames/slug/frame_096.txt b/codex-rs/tui/frames/slug/frame_096.txt deleted file mode 100644 index 04fed501be..0000000000 --- a/codex-rs/tui/frames/slug/frame_096.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ddtxttttttxdd - dtgdteepgxgdct-gegpptd - d5oc5tpp ed5pppeegptcotpod - 5g ttee dtpppcpo - e 5e55 t -pto - e555e5p ttdg poo - pcc5et5 55god ppoe - c5tceot ee5ge ege5t - pdgppe ete-e o eee - deeedeo ooooedp ee5 - egeg5ee t oteee- -eeee - exegeee e5ce5 5dp e-eeee - peeeeee e5ttg 5p ottttcco dgep5e - teexett ettpecp5 edpggepg e oe5 - egeeeee t55 te oetppct egc5et - oeogttt edtg cppeeee - pooeg-5d pcppeto5 - oeopeoedp- d5gctte5 - poodteoc pt- dtg epp55 - od dpeodgptcddddttpcdte5gee - od dppe-teppptttpppgdtg - gttdd-dxtddddddctpe - egeeegpgge - - diff --git a/codex-rs/tui/frames/slug/frame_1.txt b/codex-rs/tui/frames/slug/frame_1.txt new file mode 100644 index 0000000000..514dc8ac49 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_1.txt @@ -0,0 +1,17 @@ + + d-dcottoottd + dot5pot5tooeeod dgtd + tepetppgde egpegxoxeet + cpdoppttd 5pecet + odc5pdeoeoo g-eoot + xp te ep5ceet p-oeet + tdg-p poep5ged g e5e + eedee t55ecep gee + eoxpe ceedoeg-xttttttdtt og e + dxcp dcte 5p egeddd-cttte5t5te + oddgd dot-5e edpppp dpg5tcd5 + pdt gt e tp5pde + doteotd dodtedtg + dptodgptccocc-optdtep + epgpexxdddtdctpg + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_10.txt b/codex-rs/tui/frames/slug/frame_10.txt new file mode 100644 index 0000000000..bd3b8fafff --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_10.txt @@ -0,0 +1,17 @@ + + dtpppottd + ppetptox5dpt + ddtee5xx-xtott + edd5oecd-otppoot + 5 ceeged pt5d5e5 + ee pepx55o gedge + o xpgpeexep e5t + g eeot5tee-de-oee + g xo ooecxxtotcee + e teoted5dpdddepe + t geeeeegggotgoee + oeptotpg dxggt55 + ep eeexptct5e5e + cepp5etcdg55p + pt dpodtcp + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_100.txt b/codex-rs/tui/frames/slug/frame_100.txt deleted file mode 100644 index a9859571c7..0000000000 --- a/codex-rs/tui/frames/slug/frame_100.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - -ddtctttttttdd - tteto5ppe5pgep-eegpptd - dtdd5tp555dttppoeepptcoxgpt - 5g 55c55 xtpdc-pt - detdtpppd d pp5p - deex55t tcd -ote - e5o55o5 5eged -oote - 555ee5e tedoede edtxo - e 5tpe potepc o eee - eeeepex peogpocp etxt - e gexop pe d5o dt eede - eegodoe 5oop5 de eege - e egeed eodp5ed5 ooooottcpcdd oe5xe - pd eee eettpxt5 xe5pgpeoeeee xepe - ecpeo5do xt5e dp getepoctto cxdoc - poeeepo e eotp pp d55te - oeeeeoe ed 5gtpee5 - ocpoeeodpt -xdpddg555 - gt pgee5ged dcpgdptetg - pd ppetdgeectddttttpedtpte55 - ptdppecd pxppttpptpgptpe - ep-dpgppocdddddtttpg - e egppgge - - diff --git a/codex-rs/tui/frames/slug/frame_104.txt b/codex-rs/tui/frames/slug/frame_104.txt deleted file mode 100644 index 1a43aba301..0000000000 --- a/codex-rs/tui/frames/slug/frame_104.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - d--ctotttttttdd - dtgte5ppe gpptt - tpd5tpp dtotppoeepptctxeptd - tpc55d-gdtp cdpetogod - 5 ctptgt5 pe--oopo - pg5tp5 5 ccdo o ep5o - ep5ee5pe 5cgpto po e55o - edoo5t55e ooteoooe e o5dt - eceoeod peo pege o xeot - epeeeepe t eet-edx e5gt - gepgee e ed5 ep 5x g ee e - eee5ee e dpt5ce 5g e-eepe - op eeepe tp55ep5ee ottotttcct oexete - gdegp5ggt 5ete5 de t5dpgpeogeg 5teoxe - ogxeeete pt5eed epteeccttt eeeee - pedoooege t5 doede - odo5oetded d5e5p5pp - pcgeeot et dcpdt5eep - go ppecdgetd dtgd5dtp5e - pc pppcdgxpttttdttttpedcptettp - gtddpotdd gpxpppppgtpepe5g - gx gpepttddddddtdtpg - e eggppgge - - diff --git a/codex-rs/tui/frames/slug/frame_108.txt b/codex-rs/tui/frames/slug/frame_108.txt deleted file mode 100644 index 67f9c57984..0000000000 --- a/codex-rs/tui/frames/slug/frame_108.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - d-dcctttttttttdd - tcettppg gttd - d5ptepc55-dttpeeeeeppttodcppt - d5p55goetcp dtgttxept - 5ectpeete p-opp5ed - ex5etppee tteo t xooot - eo5etpoe occ-ep eodoeopt - 5peoo5ge pecdpod odgooed - eeeee5e pecdxet ppotde - exoee5- -peopoop ee- eee - ppeee5x e eet-ee 5 e5dt - gexeedx 5ottppte 5-eo e - o -eet e dpg555555 ttoottttttcttt eceede - pd eeede pop55g5g texdpgppogdppg peeee - etdoe5 ee te5t5 ootteeoott ee 5 - epet5tpo- td55e5ep - pope5edpod ecpd55ete - ptgeeet et dpd5cco5e - oddpeotgetd 5pdepetop - gtdpeptdgopptttddtottpedcpeped5e - ptgpeeddggpxgppppggtpeddtp - pg5pteetcddddddcttpg - e gggppgge - - diff --git a/codex-rs/tui/frames/slug/frame_11.txt b/codex-rs/tui/frames/slug/frame_11.txt new file mode 100644 index 0000000000..9eaf147a6a --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_11.txt @@ -0,0 +1,17 @@ + + tppppttd + 5g ceeeoot + 5gddeecop5ot + eddeeoctdo55 + dg-coetopcdeet + eteeetdcced5ee + pp teeeeeedeoo + e ee5eeo5 ege + 5 pe5eep5tede + pp de5otg5eded + pe- eeeeo5eooe + od-5edp5ppcee + gd peooddecg + otgpeetd5pe + od pptdte + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_112.txt b/codex-rs/tui/frames/slug/frame_112.txt deleted file mode 100644 index 26143e631c..0000000000 --- a/codex-rs/tui/frames/slug/frame_112.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - dddcctttttttttdd - d-pt5epg-dpg gptd - tptepctgtdtt5ppoeeepptttd ptd - tg-tgtgcctped gtgptctgod - tpeeptgte ptgpttpo - 555eep 5 ctttd oc googe - 5o55tpdee doeoppe po oe e - t5eooppe geoocttcd po oe e - eeeeep5e podpoodg o- eept - deepee-e dpedgdgtg e eede - eog e o gtd5d 5 xtoe5e - eexde d dpdp5 5p p5eeee - pe oed e 5eted dee toootoottctttd ogeede - t eeege d555te cp dxecppgpppgdepetedeope - otgot5ge eegc5g pcdtettootttp5eece5e - ope5e po 5odopd5 - opeeoddtd d5e5t5g5 - o5eeedtdod dtptp5etp - ptgeectgottdd dtpgep5ed5e - ptdpeot-pepptttddtottpedtpetgdtg - gtdeeod d gpxgcpppggtpgpdtpe - ee-pptetttddddddcttppe - e pgppggge - - diff --git a/codex-rs/tui/frames/slug/frame_12.txt b/codex-rs/tui/frames/slug/frame_12.txt new file mode 100644 index 0000000000..11163a99b9 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_12.txt @@ -0,0 +1,17 @@ + + tpppt- + toed5eto + g e5ott + 5txeeooge + e pxeee-5e + ep--pdgdeg + e x5oeeo + e 5toeeg + pt x5eetex + e 5epcpd + e- egopp5 + t pegdte + 5 ppetpoe + pd5gteoee + o pxo-5 + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_13.txt b/codex-rs/tui/frames/slug/frame_13.txt new file mode 100644 index 0000000000..eb072e40ad --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_13.txt @@ -0,0 +1,17 @@ + + 5pppt + eddee + eedeg + epped + p ee + gc-ee + t ee + t ge + 5t dx- + eg toe + pe-- xe + eddde + etted + pddeo + t -go + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_14.txt b/codex-rs/tui/frames/slug/frame_14.txt new file mode 100644 index 0000000000..100f309302 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_14.txt @@ -0,0 +1,17 @@ + + tpppc + t5dd-o + edee- e + ee5egdxt + eeeo e + xpee pe + eeee - p + eeoee o + eeex g + gd55 c5 + oeggt-te + epxeddde + 5ggeoooe + eo5pdd5 + dp po5 + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_15.txt b/codex-rs/tui/frames/slug/frame_15.txt new file mode 100644 index 0000000000..5761f309d4 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_15.txt @@ -0,0 +1,17 @@ + + ttpppxd + etoeedcpt + 55epooegpe + e5e 55t-dde + eeogooee5gde + oee-ee55e g + ee eeeexxte + ee5xeteee p-e + eetttpeeed-ce + edec5eoxp- -e + e5eeeede e c + epp-dxeo- o + peot 555e ce + edeeoo-to5 + odpdddd5 + ee \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_16.txt b/codex-rs/tui/frames/slug/frame_16.txt new file mode 100644 index 0000000000..f9001140ed --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_16.txt @@ -0,0 +1,17 @@ + + dotgpptxd + 5deepeeoeoo + e55go5ooee po + 555 cpdoeoeeppe + eecd5ppoeep5eeo + eeepep eoo ge x-e + ooe 5eteeee5pgt e + e5c eeee5eeegc ee + ooexetx5deegpt 5 + pgddtooope-de tde + eeetgg5poecgc-xee + eep ee e55t 5 + oep e 5t5dte + oexgdpx55tde + pc-docddcp + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_17.txt b/codex-rs/tui/frames/slug/frame_17.txt new file mode 100644 index 0000000000..696d932d40 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_17.txt @@ -0,0 +1,17 @@ + + totttccxtd + dcppexxpopetgdt + tpo5dooettgeeedgo + 5e5d5egde pecoxeeoo + e5d x eg5ooo55 t + eopt5e tc5e 5to5e-5 + pgc5e t55ed pgee5oe + -goeg g55ee5eteeocp + t5p5oootxodeodcoeee e + egdcdde5po5eeogotpto + ooo5gggppppodep55o op + oeedp e5eee c + doogpod tpt5dd5 + t xptootedcpcep + etc5dttxpdtp + e \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_18.txt b/codex-rs/tui/frames/slug/frame_18.txt new file mode 100644 index 0000000000..abb0da53d2 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_18.txt @@ -0,0 +1,17 @@ + + dootootcxtd + dtgdctttxddtgtccd + d5cepgpogtg-dgt55o p + teep-tdgp poed5oxocooot + do55 5e dgtdo5x5edocood + 5oe ttx-ddd5tptep-5d5e5xg + eeoc5 t5p5egd5gpeoeot + go-xe dogeecd eceg + ogg tooococtxetep5ot epee + dooepop xe5ddodxeedcxeo t + e5eoeggpppppe odd5e5p5e-e + oogtot eepg5pdp + odptdd- dpdd5ote + pe-ppttooodppd5dtp + gxed5ddt-tgctg + e \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_19.txt b/codex-rs/tui/frames/slug/frame_19.txt new file mode 100644 index 0000000000..ffc4d2b475 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_19.txt @@ -0,0 +1,17 @@ + + ddootxtoox-d + dteeeo5ooodpdteptt + tpcc5getpe epctepco + 5ceptde doottdept + ee5e5e tedg5geo eot + eo5pp depx5g-5 p-pe + doexp 5pd5ette 5c5te + eeee ecgoegt e eee + epeotoccoooxxxetpcpec o gee + dc5teop5dptotet dd codot5-ed + pog5tegggggppg dod5e55 55p + oodpdo e55d55p + pgdoxxpt tco-5ece + pg-ep5xtddoc5pg cpxp + gx-dc-pdt-dp-d + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_2.txt b/codex-rs/tui/frames/slug/frame_2.txt new file mode 100644 index 0000000000..f4419e3d69 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_2.txt @@ -0,0 +1,17 @@ + + d-dcotooottd + dtt5pcteexoxeodpeptd + tepeoppxpee egpop5eecet + de5d5ppttd -toe5et + tdg5pdeodood dteoet + p5tge epot5ot ooepe + teppe d5ecedet 5gege + eg oe tepeecp ep5-e + pggoe cedddeg-xtttttttttedexp + dope 5eep 5p eoodddd--ddet5geg + ooo p po--ep egpppppppgetpee + pod-5t e ttc5tp + -oddett todtgdeg + exdcddgptccocc-opedeep + eptptxxddddxc5pg + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_20.txt b/codex-rs/tui/frames/slug/frame_20.txt new file mode 100644 index 0000000000..0039bd880b --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_20.txt @@ -0,0 +1,17 @@ + + ddtoxxototdd + tcogctdtoooeeddpott + ttgdtpgxpg egdgotpetd + degdpep dtteo5poo + de tep d5gdeedpoeeo + 5etep tppceg5 poxeo + cecte tp -tpd toe5 + edd5e ggccegt exge + e5eectocoooooodtpcddoop 5 eo + pededg 5eeddddeo poogeoo t5 ee + otdopgggggggpg otoeete 5o + p dp5t d5p-e5 + oddptxd tcpecpp + dt--gxtdcctcgxget5pp + eptxdgoddddepgg + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_21.txt b/codex-rs/tui/frames/slug/frame_21.txt new file mode 100644 index 0000000000..87e3597d5d --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_21.txt @@ -0,0 +1,17 @@ + + ddtotootottdd + ttpeeddtxoxtcde-ptd + cpddtpdge edxptdept + tpecgp dtcptcpt + 5t5pe te5do ooddt + 5g5e tppd55 oodt + epee dg5et5p ocog + eo oc get e e + e e ttcccccttt detget c5 e + e xo ed dte dgepet 5g-5 + c g- eeggg pe ppdtc 5e t + pt ccd dpg 5 + pd d-d d-cpp te + pod pgptcxxccopgg -e + pttctddddtdctpe + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_22.txt b/codex-rs/tui/frames/slug/frame_22.txt new file mode 100644 index 0000000000..8dfe7daaab --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_22.txt @@ -0,0 +1,17 @@ + + dttotootottd + dt5pe-d5e5oeecet5ptd + tcpcxoppe egpopptddtt + cpxppg tteeedpo + oex5p td5eoe-5cpe + oep5e tx5ecd5e oeooe + etpo5 xteop5p xe5e + eeoee eoexdo edege + eetgt txoocccottdopedgot decgg + deo pdootg5tgx55e opcdgettg5oo + ooode gggggppge ecptd555gte + opodot dptgetp + pgtc ttd d-ptgpd5 + pcpttgpxcotcc5opggptp + gxgxdcddd-od-ope + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_23.txt b/codex-rs/tui/frames/slug/frame_23.txt new file mode 100644 index 0000000000..f573acb714 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_23.txt @@ -0,0 +1,17 @@ + + dttdotpttotdd + doeteodtdootedepetd + tgteptcpe gxcteoceet + 5cepc5e dccoeeco + 55ee5p t5ttpp5poeo + toeg5e dppppp5ppexoet + eeege 5c5- dee ggepp + x5e e egetdot e p5e + dgo etxcooooocoedpedgod e exe + eoodegog 5eo oedotx ode + 5pe e eggggggg pe5coed5d5e + teede- t5eod5e + o etp5dd d-gcp5t5 + oootcptoxoodttg-dtpe + gxgpooxddtddppe + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_24.txt b/codex-rs/tui/frames/slug/frame_24.txt new file mode 100644 index 0000000000..92833e8c58 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_24.txt @@ -0,0 +1,17 @@ + + dxdcttpootd + tgd5geddxoottdpt + tgpco5tgx -ecpxppt o + tp55t5eotoex5egdpoeodp + t 55o5t egg5odeeeoetp + xtotoe ptt5g-ecg5go + e exg t5dt5g5doeoded + e oee eto5odexd5-eee + e- eccccttxxxttdptde e ee + d 5 gpe5ttcctte-dotpe epe + o poeopgggggge ot-poeo5te + o otpo egg5c5 + o-poee- dogd5cdp + --ptodgxxcoocedd5e + pcdptcoddootp + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_25.txt b/codex-rs/tui/frames/slug/frame_25.txt new file mode 100644 index 0000000000..d8b8655dac --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_25.txt @@ -0,0 +1,17 @@ + + dtopcttttd + tgptpedcoepeet + 5e55ttg-etoooeeed + etpe 5g oe goetpo5 + tddot5pdc5deg e55o5p + otxexdpt-dec 5ete55et + e5epe edd5od5eo5dgeoe + eee5e-ggxdoo5eodxoeeo + dtoegeddooootxeooetpeo + 5-ge5etedeecpdeopo5oe + oxp5oeegggggpt5eoe5ee + edgectco-tpcd5t55e5 + dededodpc5td5dee5 + o-coodpoeppgpep + xtgpottdtep + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_26.txt b/codex-rs/tui/frames/slug/frame_26.txt new file mode 100644 index 0000000000..4be73d44de --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_26.txt @@ -0,0 +1,17 @@ + + dcpppgtt + 5pec5oetcet + 5pggecoeoggot + cpgteexdeedt5d + edtoe-xgpo5ceoc + o ge5c5gpdogoo5 + eg ppoee5eeccgt + 5- oeeeddoee5ee + e -opctxtoo5oee + g -de5teddtpoope + eeg5epgot5etoee + odxe5o 55geee + p peo de5e5t + egpoogpdppc + o5cdpxdop + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_27.txt b/codex-rs/tui/frames/slug/frame_27.txt new file mode 100644 index 0000000000..f333909d2b --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_27.txt @@ -0,0 +1,17 @@ + + cppptt + ecc5e5o + cpe pe5pe + exxdeecex + e eed-po + xd-dgeeeee + o geedpeeg + e eeexogee + e- -geteeee + po -gdedpee + e- ddppt5p + eetteed5e + eootot5ed + oddeoo55 + pog do5 + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_28.txt b/codex-rs/tui/frames/slug/frame_28.txt new file mode 100644 index 0000000000..3c0deb542c --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_28.txt @@ -0,0 +1,17 @@ + + 5ppc + etdee + o cee + e-epe + e xe + e -ge + dex de + e-gge + 5o de + ee-cxe + e de + eotoe + eopee + pdd5e + x -te + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_29.txt b/codex-rs/tui/frames/slug/frame_29.txt new file mode 100644 index 0000000000..0c6277f4d5 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_29.txt @@ -0,0 +1,17 @@ + + tppppt + tep5gpo + dtee pge + eeeedot5 + o xge e + etxee dd + eooeee d + eeoxe + eexpe e + deoee e + pee5ed o + e5xxe de + xeeeexde + eoep5gep + xep -t + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_3.txt b/codex-rs/tui/frames/slug/frame_3.txt new file mode 100644 index 0000000000..b1e9173608 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_3.txt @@ -0,0 +1,17 @@ + + d-octtooootd + dtt5oeetegooecddeptd + tc5pcepgge egxgppt5det + 5t5oecttd eopgeeo + p5pe5d5eepod odoeed + 5eoo5 -teocoo e ooe + op e ppoedget -p5et + t-ete t-eg5oe xdeoe + -gpe ceptxep-xottdddttdxdgce + tocot -5p5cce epeddtgo-tcoeeoee + pde e geettg gpppgggppt555t5 + ppx ot e 5dtd55 + od55pot ttc5gtep + odttdppdococtcopcedtg + eptpdcxddddxc5dg + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_30.txt b/codex-rs/tui/frames/slug/frame_30.txt new file mode 100644 index 0000000000..9dfd28bc20 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_30.txt @@ -0,0 +1,17 @@ + + dcgpptt + d5ceeoppoo + gpdetooetto + eeoe5edoeo ot + opeeeoetet e + epedt peeee-e + o5eeeod o5oe oe + ge ptoxtege- e + gedgoxoxo5et e + geeoeddxegtt e + goeecodpxeetxe + ep55t5poeeg e + oeoee5pxetx5 + tdttod5et5p + o--edddcp + eeee \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_31.txt b/codex-rs/tui/frames/slug/frame_31.txt new file mode 100644 index 0000000000..1dba8edd8f --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_31.txt @@ -0,0 +1,17 @@ + + d-cptptot + dtpcttdgtoppt + teo55tode-gedpo + tx5tddpcdtooeoxeo + deeeet-podtgoe5dd + cedexdepgocpt-5etge + 5ee edpeo-o5cpepe5e + oot exgeo edggexo-e + eotdepdxex5txxed e + geex55eedddodeoee p + dpd5tet 5pppe5epxdg + eeeooot dop e + cepodgt - epe5e + ceoe5deetegtee + pgoxdtp5-cp + eeee \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_32.txt b/codex-rs/tui/frames/slug/frame_32.txt new file mode 100644 index 0000000000..33160e7163 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_32.txt @@ -0,0 +1,17 @@ + + tttttccxtd + cpxppxoeeppext + 5dpodttdc-epepoppt + p55edtec- - tdoettgt + 55etepoppec petxo5opot + o5ootopeeceetd et5 p + pegctepoeettetoe5d55epd + eeetd gdeeg5pec-dgoegge + oee-d pdegddetttxxxoegoe + pggdeepopodddddeepecx-d + topee5 epggpppdc555-5 + otedoo toe5px + pppeextd d5de5 t + o-ogxtecopedtgd5 + xcoddtt5pdgg + eee \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_33.txt b/codex-rs/tui/frames/slug/frame_33.txt new file mode 100644 index 0000000000..ff8827f3d2 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_33.txt @@ -0,0 +1,17 @@ + + dttototox-d + dtpeeopoxce-epep- + d5oetpttoge gp5eetgt + to5e5detd peeodp + d-e5eee5odo etood + 55t odooeot 5o5do + eet g otpedeo epee + pett tppo5ot ogep + eee e te 5ptttcootxxt5deox + d5epg5ct5exedddddeepdddxe- + ooot e5e5 5 ggggppp eet5de + otoptgt 55c5o5 + pogptpct dtet5pop + oxgpotetctdgctopxp + goottddddtpc-g + eeee \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_34.txt b/codex-rs/tui/frames/slug/frame_34.txt new file mode 100644 index 0000000000..4b1eb6a5a2 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_34.txt @@ -0,0 +1,17 @@ + + dtottttoxtd + dtpt5ocegxtpoppctod + d55tepgcxpe edootgppt + t5depd5td petpoo + 55eo-5egeggt oopod + t5oee5 oogeopo otoeo + epdxd podpedd ecxd + oeogc epde5ge 5 do + tp5-g 5o55gdoottttttxddg xde + eeot5ttdg55pxeedx-dddt5deeeeo + 5dot eoepdg gppeeeed t5toep + 5tocood 5c-e5p + oteetoct dtogd5te + -o5xgettcttopopetpcp + gxocodddddcopod + eee \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_35.txt b/codex-rs/tui/frames/slug/frame_35.txt new file mode 100644 index 0000000000..f2432dc0ad --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_35.txt @@ -0,0 +1,17 @@ + + dttcotttottd + tpop-xpptgepxcgxpod + d55ectpedpge egpop-gept + t55t5tctd ptdoed + 55xe55o gopt eopet + c5c5te pedg--pd eooe + o g-5 oo ppd- edoo + xexc 5ooc5p 5 g5 + 5 td tee5cg5eoodcdotxx exop + etdcp 55cgpt5ec otdddd5gx5p ep + 5eotp5ode5de egddddpddp55dte + g-do5x d5p td + ocedctct tc5dppp + gddgxpx-cxxtxc5pgd5cg + gdxcodd5ddttpgd + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_36.txt b/codex-rs/tui/frames/slug/frame_36.txt new file mode 100644 index 0000000000..c84a104e4a --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_36.txt @@ -0,0 +1,17 @@ + + ddtottttottd + doggot5c5totcttgpptd + topottp-pgee egpxptetpet + degptdddd ppxoge + t5dcopeoeot- do-p + 5 t5e pd ge5t godp + e cge go goo edet + eeox do d55g oe e + epge 55 tpgptttdtttttd eoxe + dpeo tedd5x5 gexdddddddee o5pe + p peo tdt5d gppdddddg etg5 + ptgoc- t5eg5 + o5eetxt tttg5te + ptdgppodcxdtxcg-gtctp + ept5xdttdttttppg + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_4.txt b/codex-rs/tui/frames/slug/frame_4.txt new file mode 100644 index 0000000000..2eed2c8465 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_4.txt @@ -0,0 +1,17 @@ + + d-octootottd + d-gtpe5geoo5pceg5ptd + tpoeeetpge edxodpe5ood + 55eteg-tt geppopo + 5e5deoeocdet ogoepo + 5eede pdee5po p ooet + goece pppotget t gce + e-o te5pdee eee + deged ce5gd55txtttddddtt eep + eo5ge t555tdeeooet-dtc5dce55ge + eecpotooto5 gppppppppd-eeee + teogede tdc5ppp + ootcdgtd d-dtpce5 + xeeodppoccocttoptoepe + pooxcxdddddc-pe + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_5.txt b/codex-rs/tui/frames/slug/frame_5.txt new file mode 100644 index 0000000000..e0c7693a9e --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_5.txt @@ -0,0 +1,17 @@ + + d-occtooottd + dtgt5p5eetxotcdegtt + pd5otepge gdoepogtpt + te5e5e-ot -deeeed + to5p5ddtedot e oeoed + xeee5 odeoc5ed t5ee + e5egt eodeoget ppxtet + e5edg tdoe5de tede + etedp 5degtepodxtxdddttdge-e + doeott5tpg egg55oodto-t5e5pee + oteetxtoo5te gppgggggtxceo5 + oot5oo e 5d5ptd + d5poeotd dottppcp + depetptocxodttopdxcp + d-pdpgddd-dttpe + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_6.txt b/codex-rs/tui/frames/slug/frame_6.txt new file mode 100644 index 0000000000..d5ac091f39 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_6.txt @@ -0,0 +1,17 @@ + + d-occtoottdd + tdc5peoptettcdtptd + ttteeepg egx-optp5od + 5tepepdot oteeeet + poeeepootpo -ooeot + c-5e5edtceodet -oo5e + d txe gdoe5do dtede + x exe deox5ee xtoee + d-e-e 5peepc5tdxtxddttd-o5e + eeot5dddct e5opteetcoooeteog + 5 e 5xeec5g gpgggppgeoo5e + t c 5te tcd55ee + -eodppt dtdd5ptt + egxptgtgcxddttppgccp + d-cpttdddedttp + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_7.txt b/codex-rs/tui/frames/slug/frame_7.txt new file mode 100644 index 0000000000..02d1f1ae52 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_7.txt @@ -0,0 +1,17 @@ + + d-xcptoottd + tpetoetptooocgept + p teeepe edxegp5dpt + ooeeexct dxope5t + epepeede5ot - peeo + e ceeg epoceo t-eee + eoge ddeoeoe ppdee + dg5xe ot5epee p eee + 5gxp tgd5eo5xxccdxxocpoee + etpeeocxe5pe-oeeoototcoeoe + o od5pepd5 ppppppggd5ee + pd 5d5de tg-5c5p + pcttoood tdxtp5pp + odpoepocxdddtpept5 + gxpgxcxddtdcpp + \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_8.txt b/codex-rs/tui/frames/slug/frame_8.txt new file mode 100644 index 0000000000..d028ab360e --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_8.txt @@ -0,0 +1,17 @@ + + ddtdcttottd + tgp5eeepoogx gt + deote55pgtgx5xpotdt + dpop5ette p odeeo + p 5e5toe5o -poeet + epteodddoedp oteee + epeee pdcoeee ede5et + otee5 eto5etp- -e5ee + o oeedd g5poex5tttttoxee + g op5odegteteeceoddeeop + 55ooeoeee5pdpdpgopg5oe + ptgeoeee -t555p + podpoood d5odet5p + -cpetpgcctpc5otee + xxdppoedtt5oe + ee \ No newline at end of file diff --git a/codex-rs/tui/frames/slug/frame_9.txt b/codex-rs/tui/frames/slug/frame_9.txt new file mode 100644 index 0000000000..2481e07a35 --- /dev/null +++ b/codex-rs/tui/frames/slug/frame_9.txt @@ -0,0 +1,17 @@ + + -odp5ttot + 5pd5eepgogd-od + 5 tee5pddo5godxt + g ee5cod ddteodett + 5pgcopgept p-ptctee + e eeegdeocdd epepeee + e xpoeppeootg-t5 eee + e x5dtoxeed5oode gee + g gteg 5egexxetexteee + edeeedtededeeeeddeee + g ed5ooe5gppppeeg5oe + oxeeote t5 d5ee + otoeoo 5cdce5p + d-godep5toccpee + p-d pooect5g + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_000.txt b/codex-rs/tui/frames/vbars/frame_000.txt deleted file mode 100644 index a84edfdca3..0000000000 --- a/codex-rs/tui/frames/vbars/frame_000.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▎▎▎▌▉▉▉▉▉▉▉▉▉▊▎▎ - ▊▎▉▏▋▉█▉▉▎▎▎▎▋▋▋▎▎█▉▎▉▉▉▎ - ▎▋▏▍▉█▉▎▊▎▏▉▉▏▏▉▌▉▏█▉▉▉▉▊▎ █▉▎ - ▊▉▏▋▊▉▎▉▊▋▉▉ ▊▏▏█▉▉▌▎ ▉▊ - ▎▉▏▋▊▉▎▋▋ ▉█▉▏▊▍▉▊ - ▊▏▏▋▋█▋▏ ▊▍▊▏▏▎▍▍ - ▋▋▏▋█ ▏▉ ▏█▍▍▍▉ ▍▌▍▏▊▍▏ - ▊▋▏▏▉█▏▎ ▉▍▎█▏▋▏▏ ▎▉▍▍▏▊▍▏ - ▉▉▏▏▍▏▉ ▏▉▌▍▍▍▎▋▏ ▉▊▉▏▎▍▊ - ▏▍█▏▎▎▏▏ ▉▍▏▉▍▋▏▏▍▋ ▋▏▎▏▏ ▏ - ▋▏▌▏ ▍▏ ▉▎▋▋ ▉▏▋ █▏▏▏▋▏ - █ ▍▍ ▋▏ █▎▋▏▏█ ▌▉ ▍▏▏▏▏ - ▏▎▏▏ ▋ ▊▏▋▋█ ▋▏▎ ▎▌▌▉▌▉▉▉▉▉▉▉▉▉▊ ▏▋▋▏ ▏ - ▉▏▌ ▏▊ ▎▋▏▏▉█ ▋▉▎ ▋▏▏▌▍▉▉▉▉▉▉███ ▏▌▍▏▍▏ - ▍▋▏▍▋ ▏▍ ▉▏▋▎ ▎▏▎ █▏█▊▊▊▊▊▊ ▏ ▏▏█▏▎ - ▍▍▏▏▎▍▏▊ ▉▉▉▉▌ ▊▋▎▋▋█▋▋ - ▍▍▍▏ ▍▌▎ ▌▉▌▉▋▎▋▋ - ▍▏▏▏▊ ▉▏▍▎ ▎▏▎▉▏▉▎▏█ - █▊▉▉▏▊ ▉▊▉▉ ▋▎▉▉▏▉▉▉▊▌▉ - █▏▉▏▏▉ ▎▍▊▉▉▍▏▉▎▎▊▊▊▉▉▉▉▏▉▏▉▉█▎▊▉▎ - ▉█▉▉▉▌▊▏▏▉▌▏▋█▉▉▌▏▏▌▉▉█ ▎▉▉█ - ▉▉▉▌▏▉▏▏▌▎▎▎▎▎▎▊▉▌▉▉▎ - ▎▎██▉████▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_004.txt b/codex-rs/tui/frames/vbars/frame_004.txt deleted file mode 100644 index 57f4cc8a76..0000000000 --- a/codex-rs/tui/frames/vbars/frame_004.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▎▎▎▌▉▉▉▉▉▉▉▉▉▊▎▎ - ▊▎▋▏▋▉█▉▉█▎▊▎▋▋▋ ██▉▎█▉▉▎ - ▎▋▏▏▉▏▉▎▌▎▏▉▉▏▏▉▌▏▏█▉▉▉▉▌▎ █▉▎ - ▊▏▉▋▊▉▎▉▏▋▉█ ▉█▉▍▌▎ ▉▊ - ▎▉▏▋▊█▎▌▋▉ █▉█▉▏▊▍▉▊ - ▊▏▏▋▋▍▋▏ ▍▋▏▏▎▍▍ - ▋▏▏▉█ ▏▉ ▍▌█▎▍▍▉ ▉▌▉▏▊█▏ - ▊▋▏▏▉▎▏▎ ▉▍▎▍▍▋▍▊ ▋▍█▏▏▍▏ - ▉▉▏▏▋▏▉ ▎▏▏▏▍▍▍▍ ▎█▊▉▏▏▍▊ - ▏▉█▏▎ ▏ ▊▍▏▉▉▍▋▏█ ▏▎▏▏ ▏ - ▉▏▋▏█▎▏ ▉▎▋▏█ ▋▉▋ ▌▏▏▏█▏ - █ ▍▋ ▉▏▊ ▎▋▏▏█ ▊▌▉▎ ▏▏ ▏ - ▏▎▏▏██▉▍ ▌▏▋▋▋ ▌▋▎▎ ▎▌▌▉▌▉▉▌▉▉▉▉▉▉▊ ▊ ▋▏ ▏ - ▉▏▊ ▏▎ ▋▏▏▉██▋▉ ▉ ▏▍▉▉█▉▉▉█████▉ ▏▌▍▏▎▏ - ▍█▏▍▎█▏▊ ▉▏▋█ ▎▏█ ▋▊▉▌▉▉▎▏▏▏▌▌▌▉▉ ▋▋▋▏▎▏▎ - ▍▍▍▏▊▍▏▎ ▉▉▉▉ ▎ ▊▋▎▋▏█▋▋ - ▊▍▍▏▎█▍▉▎ ▎▉▌▉▋█▋▋ - ▍▍▏▏▊▋▉▋▍▎ ▎▋▌▉▏▉▎▏█ - █▊▉▏▏▎ ▉▊▉▉ ▎▎▉▉▏▉▉▏▎▌▉ - █▏▉▏▏▉ █▉▊▉▉▏▏▉▎▎▊▊▊▉▉▉▏▏▌▏▉▉█▎▊▉▎ - ▎█▉▉▉▌▎▋▏▏▌▉▏█▉▉▉▏▉▌▉▉██▎▉▉█ - █▉▉▏▏▉▉▌▌▎▎▎▎▎▎▊▉▌▉▉▎ - ▎▎██▉████▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_008.txt b/codex-rs/tui/frames/vbars/frame_008.txt deleted file mode 100644 index cb05f902e2..0000000000 --- a/codex-rs/tui/frames/vbars/frame_008.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▎▎▎▌▉▉▉▉▉▉▉▉▉▊▎▎ - ▎▎▋▏▉▉█▏▉▎▎▊▎▋▋▋ ▎█▉▏█▉▉▎ - ▎▋▏▏▉▉▉▎▋▌▉▉▉▏▉▌▌▏▏█▉▉▍▉▌▎ █▍▊ - ▊▏▏▉▏█▎▎▉▏▉█▋ ▉█▉▍▌▎ ▉▊ - ▊▉▏▋▋▎▊▏▉ █▉▎▉▏▊█▉▊ - ▋▏▏▊█▎▏▉ ▊▊▎▊ █▍▎▏▏▎▍▍ - ▋▏▋▊▊▊▏█ ▉▎█▊▍▉▋ ▍▉▏▊▍▍ - ▋▏▋▏ ▊▏ ▍▏██▍█▊▉ ▍▍▏▌▍▏ - ▏▏▏▍ ▏▏▎ █▏▏▌▏▊▍▎ █▍▉▏▊▏▏ - ▏▏▎▏ ▏▏█ ▉▎ ▏▍▏▍█▊ ▎▏▏ ▏ - ▏▏▎▏ ▏█ █▉▏▏▌ ▋▏▋ ▏▏▏▍▏ - ▊▏▋▌ ▍▉ ▎▉▏▏▎ ▎▏▍ ▎ ▏▏▏▏▏▎ - ▉▉▏▏ ▏▏ ▋▋▋▉▎ ▏▋ ▋▎▉▌▉▌▉▉▌▉▉▉▉▉▉▊ ▎▉▏▏ ▏ - █▏▍▏ █▋▏ ▎▏▏▋▎▋▎▏█ ▋▍▏▏▉▉▉▉▉▉▍█████ ▏▎▍▏▎▏ - ▏▍▏▍ ▍▍▎ ▍█▉▋▋ ▊▉ ▍▎▉▏▉▉▏▏▏▏▌▌▌▌▉ ▊▉▏▏▎▋█ - ▎▏▏▌ ▍▍▎ ▍▉▉▉█ ▋█▋▋▉▊▋ - ▋▏▏▍ ▉▏▏▎ ▎▋▌▉▋█▊▉ - ▋▉▏▏▎ ▍▉▉▎ ▎▋▏▉▊▉▎▏▉ - ▍ ▍▍▉▎ ▍▏▉▉▊▎▋▏ ▎▎▉▉▏▉▉▏▎▌▉ - █▏▉▏▉▋ ▉▉▏▉▉▏▏▉▎▎▊▊▊▉▉▉▉▏▉▏▉▉█▎▎▉▎ - ▎▏▏▉▊▎▎▏▏▉▌▊▋▏▏▉▏▏▏▌▉▉██▎▏▉█ - █▍▉▏▏▏▉▌▎▎▎▎▎▎▎▊▉▌▉▉▎ - ▎▎███████▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_012.txt b/codex-rs/tui/frames/vbars/frame_012.txt deleted file mode 100644 index fd8ed4a21c..0000000000 --- a/codex-rs/tui/frames/vbars/frame_012.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▎▎▌▉▉▉▉▉▉▉▌▊▊▎ - ▎▊▋▏▉▉▉▉█▎▎▊▊▎ ▌▏▎█▉▏▉▉▉▎ - ▎▉▏▋▏▉▎▊▎▌▉▉▏▏▉▌▌▉▉▉▉▉▍▍▌▊▎▉█▉▊ - ▊▋▉▏▉▎▍▏▉▏▉█▋ ▉▏▉▉▎▊ █▉▎ - ▎▏▋▏█▌▌▉▉█▋▋ ▉▏▉▏▎ █▍ - ▋▏▏▍█▏▋▉ ▊▊▊▎ ▏▉▏ ▍▍▎ - ▋▏▏▋▎▏▏▎ ▌▍▎▊▉▊▉▋ █▍▉▏▎▍▉▊ - ▋▏▏▋▎▏▉▋ ▍▉▍▏▍▍▎▍▎ ▉▋▏▊▍▍▎ - ▏▏▉▎▏▏█▎ ▍▊▍▏▏▍▍█▍▍ ▍█▏ ▍▏ - ▏▏▉ ▉▏█ ▍▍▉▏▏▏▊▉▎ █▏▏▋ ▋▊ - ▍▏▏ ▏▏ ▉▋▍▎▎ ▌▏ ▏▏▏ ▏▏ - ▏▏▏ ▏▏█ ▊▏▏▉ ▎▉▋▍ ▏▏▏▏▏▏ - ▊▉▏ ▏▏▊ ▋▎▋▏▋█▏▉▋█ ▊▉▌▌▌▉▉▉▉▉▉▉▉▉▊ ▏▏▏ ▏▏ - ▏▎ ▏▋ ▏▏▋▉▎▊▏▉ ▎ ▏▏▋▉▉▉█▉▉▉▉█████▍▏ ▍▏▉▏ ▏ - ▏▏▏ ▉▋▏ ▉▏▏ ▊▋▎▎█ ▎▍▉▌▉▉▉▉▋▏▏▏▏▌▌▌▉▎▎▋▏▏▊▋█ - ▏▏▍ ▉▋▍ ▉▉▉▉ ▎▋▋▋▋▌▏ - ▍▏▍ █▊▉▊ ▋▏▉▋█▋▏ - ▍▏▏▊ ▉▊▉▉▎ ▎▊▏▋▋█▎▋▉ - █▏▏▏▎ ▉▉▉▉▉▎▎ ▎▌▉▏▍▋▏▋▌▋▎ - ▎█▏▏▎ ▉▉▏▉▏▏▉▉▎▌▊▊▊▉▉▉▉▏▏▏▏▉▎▎▎▉▎ - ▉▉▉▎▋▎ █▉▉▌▏▏▏▏▏▏▉▉▉▉▎ ▎▉▉█ - █▉█▉▉▊▌▎▎▎▎▎▎▎▎▊▌▌▉▉▎ - ▎██▉████▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_016.txt b/codex-rs/tui/frames/vbars/frame_016.txt deleted file mode 100644 index cad5b84069..0000000000 --- a/codex-rs/tui/frames/vbars/frame_016.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▎▎▊▉▉▉▉▉▉▉▉▊▊▎ - ▊▎▋▉▏▉▉█▎▎▋▏▎▊▊▎█▉▏█▉▉▊▎ - ▋▌▋▉█▎▎▌▉▉▉▏▏▉▌▌▉▉▏▏▏▋▍▎▎█▉▉▍▊ - ▎▋▉▉▎▊▌▉▉▉▉█▏ ▎▉▉▏▍▉▎▏▊▉▍▎ - ▋▉▉▋▏▏▉▉▉ █▉▏▏▏▌▍▉▌ - ▎▏▏▋▌▏▉ ▊▊▊ ▉▏▏▊█▊▉▊ - ▎▏▏▏▋▏▋█ ▏▏█▍▎▏▊ ▍▏▌ ▍▍▍ - ▏▏▏▋▏ ▉▏▍▋█▊▉▍▎ ▉▏▏ ▌▏▍ - ▏▋▋▏▏▋ ▉▏▏▍▏▍▎▉▍▎ ▉▏▌ ▊▏▊ - ▏▋▋▏▏ ▍▍▏▏▏▍█▍▎▋ █▏▏ ▏▏▉ - ▏▎▏ ▏█▏ ▉▏▏ ▋▉▌▏█ ▏▏ ▋▍ - ▏▎▍ ▏█▋ ▌▉▋▋█▏▊██ █▏█ ▋▍ - ▏▋ ▏▏▏ ▎▋▊▉▋▏▏▉ ▊▉▉▉▌▌▉▉▉▉▉▌▉▉▊ █▏▉▎▏▏ - ▉▏▋▏▋▍▊ ▊▏█▋▌▍▉▋▏ ▉▋▉▉▉███▋████▉▉▉▏ ▎▏▏▊▋▏ - █▍▊ ▏▍▏▍ ▉▊▍▋▍▌▉ ▏▍▉▉▉▉▉▉▏▏▋▏▏▏▏▉ ▋▍█▎▍▏ - ▍▍▊ ▍▍▉▎ ▉▉▉▉▎ ▎▏▍▏▋█▉█ - ▉▍▉ ▍█▏▉ ▊▏▊▏▉▋▏█ - █▏▌▎█▍▉▏▉▎ ▎▊▏▏▉▊▊▏▉ - ▉▏▌▎█▍▊▏▏▉▎▎▋ ▎▌▋▏▏▉▏▎▋▋ - ▉▏▏▊▎█▉▏▏▏▉▏▉▉▌▌▊▊▊▊▉▉▉▏▏▏▉▉ ▎▉▉ - ▎▉▉▎▎▎ ▎▉▉▉▉▏▏▏▏▏▏▉▉▉█ ▎▊▉▋█ - █▏▉▌▏▌▊▎▎▎▎▎▎▎▎▊▌▌▉▉█ - ▎██▉▉███▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_020.txt b/codex-rs/tui/frames/vbars/frame_020.txt deleted file mode 100644 index 0a6aea1995..0000000000 --- a/codex-rs/tui/frames/vbars/frame_020.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▎▎▎▉▌▉▉▉▉▉▉▊▎▎▎ - ▊▎▋▏▉▉█▎▎▍▌▋▊▍▎▉▉▉▉▉▉▉▌▋▎ - ▊▌▉▏█▊▎▌▌▉▏▌▉▉▌▌▉▉▋▉▏▉▉▎█▏▉▍▋▏ - ▊▉▎▎▎▌▋▉▊▉▉ ▋▍▏▍▎█▉▉▉▉▎ - ▊▉ ▊▊▉▉▊█▎█ █▉▏▍█▍▍▍▉ - ▋▎ ▎▏▉▋▍ ▊▊ ▍▌█▊▍▋▊ - ▋ ▊▏▎▏ ▋█▍█▏ ▎▍▍ ▏▉▍▍ - ▋▎ ▊▏▊█▏ ▏▋▋▉▊▍▍▎ ▍▍ ▏▍▏▊ - ▎▉▊▎▏▎▋ █▏▍▏▊▍█▏▍ ▏▊ ▌▏▉ - ▏ ▎▏▏▏ ▉▏▌▉▉▊▍▍▎ █▏ ▏▉▏▏ - ▏▏█▏▏▍ ▎▍▎▏▉ ▌▏▏█ ▏▏▍▏▋ - ▏▋█▏▏▍▋ ▊█▋ ▌▋▉▋▎ ▏▍█▏▏ - ▍▏█▏▏▏▎ ▋▋▋▎▌▏▎▋ ▎▌▉▉▉▉▌▌▌▌▌▌▌▌▊▎ ▏▍▍▏▎ - █▊▍▍▏▋▍▋ ▎▉▉▉▋▉▉ ▊▉▉▉▉▉▉███▉▉▉▉▏▋ ▍▏▋▏▏ - ▏▍▍▏▍█▏ ▍█▋▊▋▎ ▏▉▉▉▉▉▉▏▏▍▏▏▉▏▋ ▎▍▍▏▍▊ - ▏▍ ▏▍▋▍ ▎▎ ▎▉▋▋▋▋ - ▏▍▊▍█▊▉▎▏ ▊▋▎▏▉▍▋ ▎ - ▍▏▊█▉▉▊▉▎ ▎▊▉▋▏▏▎▋▊ - █▏▌▎█▍▌▏▉▉▊▎▋ ▎▊▋▉▎▏▏▉▊██ - █▉▏▊ ▉▉▏▏▏▏▉▉▉▊▊▊▊▊▉▉▉▏▏▉▉▉▎▌▉▊█ - ▉▉▉▎▎ █▉▉▉▉▉▉▉▏▋▋▌▉█▎ ▎▉▉▉▍▎ - █▉▉▏▏▊▊▎▎▎▎▎▎▎▊▊▉▉▉▉ - ▎██▉▉██▎▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_024.txt b/codex-rs/tui/frames/vbars/frame_024.txt deleted file mode 100644 index 6e92a062c4..0000000000 --- a/codex-rs/tui/frames/vbars/frame_024.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▊▎▉▌▉▉▉▉▉▌▎▎▎ - ▎▋▌▏█▎ █ █▉█▍█▉▏▉▉▉▊▌▊▎ - ▎▋█ ▎▊▉▉█▌▉▉▌▌▉▉▍▌▊▎▋█▏█▉▉▉▊ - ▋▉ ▊▉▉▎▉▉▍▉ ▍▏▉▍▊▍█▉▉▍▏▍ - ▊▉ ▎▋▉█▊▍ ▌▉▉▍ ▍▉▍▎▍ - ▋ ▌▋▎▊ ▌▉▎▊ ▉▊▉▉▌▍▊▏ - ▏ ▋▋▊▍ ▍▉▎▏ ▉▍▉█▏▍▍▏ - ▏ ▏▋▋▍ ▏▏█▍▉▊ ▏▏█▏▍▋▏ - ▊▎ ▊▏ ▍ ▎▍▉▎▍ ▌▍▊▉▊▏▉▌ - ▏▋▏▏▏▋ ▏▋▍ █▍▍ █▉▏ ▏▍██ - ▏▋▏▏▎▊ ▍▏ ▉▍▉ ▋▋▏▏▏▍ - ▏▍▏▉▎▏ █▎▉ ▎▉█ ▍▏▏▏▏▏ - ▏▋▉▋▏▉ ▏▋▎██▋▋ ▎▌▉▉▉▌▌▌▉▌▉▌▌▉▎ ▎█ ▏▏▏▏ - ▏▊▏▉▎▏ ▎▏██▎▏▉ ▏▌▍▍▉▉▉▉▉▉▉▉▉▉▏▋▉ ▏▏█▏▋▏▋ - ▏▋█▊▍▍▎ ▍▎▊▌▎ █▉▉▉▎▉▉▎▎▎▉▉▉▏▋ ▎▏▋▉▍█ █ - ▏▎▉▊▍█▊ ▋▏▍█▋ ▋ - █▏▎▉▊▍█▍ ▎█▍▎▉█ ▊ - ▏▎ ▍█▉▉▉▎ ▋▋▉▊▎▋▎▋ - ▉▏▎█▏▍▍▌▉▉▎▎ ▎▉▉▎▉█▌█▍▊▎ - ▉▏▎▎█▍▏▉▉▏▏▍▉▉▌▎▎▎▉▉▉▉▉▊▉▋▌▋▊▉▊█ - █▉▏▊▎ █▉▉▉▉▏▉▉▉▏▉▉▉▏▉▉▉▉▊▏█▎ - ▎▉▉▉▌▌▌▎▎▎▎▎▎▊▉▉▏▉▉██ - ▎██▉▉██▎▎▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_028.txt b/codex-rs/tui/frames/vbars/frame_028.txt deleted file mode 100644 index 1205ae11d2..0000000000 --- a/codex-rs/tui/frames/vbars/frame_028.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▊▎▏▌▉▉▉▉▉▌▎▎▎ - ▊▌▉▉▎ ▎▉▉▏▉▎▏▋ - ▎▌▉▎ ▎▊▉▉█▏▏▉▌▌▌▉▍▉▎ ▎▍▉▉▎▉▊ - ▎▋█ ▎▉▉█▊▋ ▏▍▊ ▉▉▌▎▉▊ - ▊██▎▋▉ ▊▍ ▍▏▉ ▋▍▍▍▎▍ - ▏▋▋▋▋ ▎ ▊▉ ▉▏▊▎▍▍▏▊▍ - ▏█▋▏▉▋ ▎ █▊▉▉█ ▉▍█▉▍▏▋▍ - ▋▏▏▋▉ ▍ ▊▍█▍▉▌ ▉▊▋▍▊▍▋▏ - ▏▎▍▏▋▋ ▍▍▎▍▍ ▉█ ▏ ▏▏▍ - ▏█▌▉▏ ▊▍▉█▊▍█ ▎▏ █▎▏ ▊ - ▏▌▏▏▎▏█ ▏ ▎ ▋▍▉▊ ▌█▍█▏▏▋█ - ▏ ▏▏▏▋ ▏▏██▉█ ▉ █▏█▏▏▏▋ - ▏▏ █▏▏▎ ▉▊▊ ▊█▋▎▊▌▉▉▉▌▌▌▉▉▌▉▌ ▊██▌▏▏▋ - ▏ ▏▏ ▏ ▎▌▏▋ ▋▎ ▉▋▋▋▉▍▍▌▋▋▋▉▍▏▊ ▏▊▏▏▋ ▊ - ▏▎▍▋▌█ ▍▉▎ ▉▌▌▌▏▎▎▎▎▎▎▎▉█ ▌▋▎▏▌ ▋ - ▏▍▍█▎▉ ▎▏█▏ ▊ ▋ - █▏▍▍▏▏▉▍ ▊▏▋▋▎█ ▊▎ - ▏▊▍▌▉▊ ▎▋▉▎▋▎▋ ▋▎ - ▉▏▎▉▌▏▏▉ ▎ ▎▎▉▉▏▏▉ █▎▉ - ▉▏▌█▏▉▏▏▉▏▍▌▉▌▎▉▉▉▉▏▏▏▉▎▊▋▎▏▎▋▎ - ▉▏▉▊▏▏▏▏▉▉▉▉▉▉▏▌▉█▊▎▎▋▋▍▋▉ - █▉▏▉▉▏▏▌▏▏▏▏▍▉▉▏▏█▉█ - ▎██▉▉██▎ ▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_032.txt b/codex-rs/tui/frames/vbars/frame_032.txt deleted file mode 100644 index 61ff89f936..0000000000 --- a/codex-rs/tui/frames/vbars/frame_032.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▊▉▌▉▌▌▉▉▉▌▌▎▋ - ▎▋▋▉█ █▉▏▍▎▉▉▎ - ▎▌▉▏▎▊▉▉█▉▏▉▌▌▉▉▉▊ ▎▍▉▉██▉ - ▎▏▉▌▏▉▉▎▉▉▏▋ ▏▍▊ ▍▍▍ █▊ - ▊▉▎▏▉█ ▋▌ ▏▊ ▏▍▊ ▉▎ - ▋▉▊▏▉▋▎ ▎ ▋▏▍ ▍▍▊▎▏▊ - ▋▉▋▏▉▏▌▎ ▏▍▋▍ █▋▎█▍ ▏█▏▎ - ▎▏▍▋▉ ▋ ▋▍▍▊▍ ▉ ▊ ▍▍▍ - ▏▊▍▏ █ ▍▊▍▍▎▍▎ ▍█▍▊▏▊▍▏ - ▏ ▏▏ ▏ ▏▍▋█▊▉▋ ▎▊▍▊▏█▍▋ - ▉▍▏▏▉█ ▍▍▏▋█▋▋▍▋ ▏▏▏▋█▏▏ - ▋▉▏▏▍ █▊▋▉█▋▏█ ▋ ▏▏▏▏▉ - ▏▏▏▏█▏ ▎▏▎▎▏▎ ▎▊▉▌▏▌▉▌▌▌▌▉ ▏▊▏▉▏▏ - ▏▊▋▏ ▍ ▉▍▎▏▋ ▏▍▉▉▉▌▌▍▋▌▌▍▋ ▌█▍▏▏▏▏▏ - ▉▏▏▊▏ ▉▉▉▉▌▎▏▌▏▎▏▉ ▋▏▋▏ █ ▋ - ▏▋▍▋▎█▏ ▎▎ ▌▉▏▋▋█ ▋ - ▏▍▍▏▏▋▍ ▋▉▎▋▏▋ ▊▎ - ▏▏▉▉▍▎▉ ▎▏█▊▋ ▋▋▊▎ - ▉▌▍▍▉▉▊▉▏ ▊▏▉▎▋▉▊▎▎▋ - ▉▏▏▉▊▉▉▍▏▉▌▏▌▊▊▊▉▉▏▏▉▎▊▋▎▍ ▉█ - ▉▏▏▏▏▉▏█▉▉▉▉▉▉▉█▎▋▎▉▉▍▎▋▎ - ▎▉▉▏▌▎▎▎▎▎▎▊▉▉▌▉█▋▉█ - ▎███▉██▎ ▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_036.txt b/codex-rs/tui/frames/vbars/frame_036.txt deleted file mode 100644 index 49f1a35650..0000000000 --- a/codex-rs/tui/frames/vbars/frame_036.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▊▉▉▉▌▉▉▉▌▎▎▋ - ▎▎▉▉█▎▌▋▋ ██▉█▉▏▉▉▏▍▊ - ▊▏▉▌▌▉▉▉▉█▉▌▉▉▏▊ █▋▍▉ █▍▎ - ▎▏▉▏▋▉▍▎▉█ ▉▊ ▊▏▎▎█▍ - ▊▋▊▏▉█ ▏▎ ▍▍▊▊ ▍▎ - ▊▋▊▋▋ ▎ ▍ █▍▏▍▋▉▎ - ▏▊▋▋ ▋▍▍▎▉ ▍ ▍▍▍▊▍▍ - ▏▎▏▏ ▍▍█▋▉▎█▊ ▋▍▍ ▊▎▍▏ - ▏▏▍▎ ▊█▊▋▎▉▍ ▋ ▍▎█▍▍▋▎ - ▏ ▏█ ▋█▏▏▊▋▌▍▍▋ ▌ ▏▏▊▊▏▏ - ▏ ▍█ ▎▎▍█▊▋▍▌▋ ▏ ▏▏▏ ▏▏ - ▏▍▌▍ █▏▋ ▋▉█ ▏ ▍▏▏▏█▏ - ▏▋▋▉ ▏ ▊▉▋▏█ ▋▎▉▉▉▉▉▉▌▉▌ ▉▏▏▏▎▏▏▏ - ▏▏▋▏▍▊ ▉ ▋█ ▏▉▉▉▉▉▉▉▉▉▍▍ ▋ ▏▉▎▏▏▏ - ▏▌▋▏ ▏ ▍▉▉▉▉▉▏▌▎▎▏▉ ▏█▏█▏▏▏▎▎ - █▏▉█▏ ▏ ▎▎▎▎▎ ▎▋ ▋▊▋ ▏ - ▍▏▏▏▌ ▍ ▊▏▎▏ ▋ - ▍▏▏▍▍▎▉▌ ▊▉ ▋█ ▊▎ - ▉▏▏▊▏▍▎▉ ▎▏▉▊▊▎▋█ ▋ - ▍▏▏▉▉▋▉▏▉▍▉▌▎▊▊▉▏▏▎▎▉▌▏▍ ▊█ - ▉▉▎█▉▉▉▉▏▉▏▉▉▉▎▋▎▌▉▉▎▊▉ - █▉▊▌▎▎▎▎▌▎▌▉▉▊▉▎▋▉▎ - ████▎▎ █▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_040.txt b/codex-rs/tui/frames/vbars/frame_040.txt deleted file mode 100644 index df0f3ac0ee..0000000000 --- a/codex-rs/tui/frames/vbars/frame_040.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▊▉▉▉▉▉▌▉▉▎▎▎ - ▊▌▉█▎▋▍▍▎▉▉▉▏▏▌▉▏▉▉▎ - ▊▏█▎▉▉▉▉█▏▌▉▉▌▎██▏▉▎ ▎▍▎ - ▋█▋▏█▎▌▉█ █▉█▍ ▉▍ - ▏▎▉▏▎ ▋█▋▏▊ ▎▏ - ▏▏▉▏ ▎▎▊▍ ▊▋▍█ ▍▏ - ▌▍▋▏ █▍▍▎▏▍ █▋█▍▍▍▊▍ - ▏▏▏▎ ▏▍▍ ▏▍ ▊█▍▊▏▏ ▍▎ - ▎█▏▏ ▍▍▍ ▍▍▉ ▎▏▎▏▏▏▏▏ - ▏▏▏▏ ▋▏▍▊▏▍▍▍▊ ██▏▌▏▋▊▉ - ▋▏▏▏ ▍▏▍▋▍▏▊▊ ▏▋▏▏▏▎▏▏ - ▍▋▏▏ ▍▎▋▋█ ▋ ▎ ▏ ▏▏▏▏▏▏ - ▏█▏█ ▍▋▎▋ ▊▎▎▉▉▉▉▉▉▉▉ █▎▏▏▎▊▋▏ - █▋▋▊ █▋ ▊▉▉▉▉▉▉▉▉▉▏▏ ▏ ▏ ▏▏▏▍ - ▏▏▋▊ ▎▉▉▉▉▎▏▌▎▌▏█ ▋▉▏█▏▏▏▏▏ - ▏▋▋▏▊▉ ▎ ▎▎▎▎▎ ▏ ▍▊▏▏▏▏█ - ▏▏▍▍ ▉▎ ▏▎▏▎▋▏▏▋▏ - ▏▍▉▉▎▉▍ ▎▏▎▋▋▋█ ▏ - ▏▏▊▏▍▎▉ ▊▉▎█▋▋▍ ▎▋ - ▉▎█▉▍▌▊▏▉▉▉▊▊▎▊▉█▊▊▋▉▎ ▊▉ - █▉▎ █▉▉▏▏▏▏▉▉▎▊▌▍▉▍ ▊▉ - ▉▉▌▎▋▊▎▎▉▉▉▋▉▎▌▉█ - ▎███▎▎ ▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_044.txt b/codex-rs/tui/frames/vbars/frame_044.txt deleted file mode 100644 index bf54c1ea8d..0000000000 --- a/codex-rs/tui/frames/vbars/frame_044.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▊▉▌▉▉▎▉▉▉▎▎▎ - ▊▋▉▎▊▊▊▉█▉▏▉▏▌ ▉▉▎ - ▎▏▏▌▉▉▉█▏▉▉▌▎▉▍▉▊▋ █▉ - ▊▉▋▉▋ ▏▊▍▎ ▍▍▊ - ▊▍▉▋▎ ▍▍▏▌█ ▏▊ - ▋▏█ ▎▎▊ ▍▊▍▏▍ ▋▊ - ▏▋▋ ▉▏▍▊ ▋▍▌▍█▍▍ - ▏ ▏ ▍▏▍▋▎▍▊ ▍▊ ▏▏ ▏ - ▊▍▎▏ █▏█▋▍▎▏▎ ▋▎▏▏▏ ▏ - ▏▏▉ ▍▍▍▏█▏▉ ▏▍▋▏▋ ▋ - ▉▏█ ▍▋▏▋▉█▏ █▏▏▏█▏▏▏ - ▋▏█▎ ▋▊▋▏▋ ▏▏▏▏▎▏▏▏ - ▏▏▋▏ ▎▏ ▋▏ ▎▎▉▉▉▉▉▉▉▊█▏▏▏▏▋▊▏▏ - ▉▏▏ ▏ ▋▏▋ ▉▉▉▉▉▉▉▉▍▊▋▏ ▍▏▊▏▏▏ - ▏▋▉▎▎▊▋ ▋▉▉▌▌▏▌▉▏▋▎▊▎▏▏▏▏▏ ▋ - ▏▏▊▍▉ ▎▏ ▎▎▎▎▎█▍ ▏▊▏▏ █▏ - ▏▋▍▎▋▊ ▋▍▏█ ▋▏▍▎ - ▍▋▏▍▎▍▍ ▊▉▋▊ ▋ ▋▉ - ▍▋▏▎▉█▉▊ ▋▉▋▊▌▋ ▋▋ - ▍▎▉▏▉▉▎▉▉▊▎▎▊▉▎▋▋▎▍ ▌█ - █▍▎█▉▉▌▌▏▉▉▎▎▉▍▏▎ ▊▉ - ▎▉▊▎▎▎▊▋▋▉▌▌▎▎▊▉▎ - ▎███▎ █▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_048.txt b/codex-rs/tui/frames/vbars/frame_048.txt deleted file mode 100644 index c1fb3237d2..0000000000 --- a/codex-rs/tui/frames/vbars/frame_048.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▊▎▌▏▉▊▊▉▉▊▊ - ▊▉▏▌▊▎█▍▌▏▉▌█▉▍▊ - ▋▊▏█▉█▏▉▉▎▍▍▍▎ ▉▍ - ▋▏▋▉▊ ▍▏▍▎ ▋▎▏ - ▏▏▍▍ ▏▍▍▎ █▍▏ - ▎▍█ ▎▊▎ ▍▊▏▋▋▊▍▍ - ▏▋▏▏▏▊▊█ ▋ ▍▍ ▍▉▎ - ▍ ▏ █▋▍ ▍ ▏▌█▍▍ ▏ - ▋▏▏▎ ▊▏▏▏▍▊ ▏ ▏▍▍▏▏▏ - ▏▏▍ ▉▏▋▋▌ █ ▊▊▉▏▊▋▌▊ - ▏▏▏ ▏▍▍▏▏▏ ▏▋▏▏█▋▏▏ - ▏▏▏▎ ▍ ▉██ ▏▍▏▏▏▏▏▏ - ▏▏▋▍ ▏▋ ▎▎▉▉▉▉▉ ▏▍▏▏▏▏▏▏ - ▏▏█▏▋▎▊ ▉▉▉▉▉▉▏▍ ▏█▏▏▏▏▏▏ - ▋▏▏▉▏▎ ▉▉▌▏▌▉▋█ ▏█▏▏▏ ▍▎ - ▏▋█▉▏ ▎█▏▏▏ ▏▏▏▍▏ - ▉▉▌▏ ▏ ▎█▋▍▏▏▏▏▎▋ - ▏▏▋▊▍▍▎ ▏▋▊ ▋▏▏▊▏ - █▊▏▏▍█▉▎▋ ▎▏▊▏▊▏█ ▋▊▎ - █▊▉▎▉▎▉▉▉▎▊▋▎▊ ▋▋ ▏▎ - █▍▎▉▉▌▏▋▉▎▌▉▊▉▍ ▎▋ - █▉▎▎▎▎▉▉▌▉▍ ▎▋▎ - ▎█▉▎▎▎▎█▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_052.txt b/codex-rs/tui/frames/vbars/frame_052.txt deleted file mode 100644 index 9ef8496189..0000000000 --- a/codex-rs/tui/frames/vbars/frame_052.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▋▌▉▉▊▌▍▉▊▎ - ▋█▊▊█▍▉▋▍ █▍▏▊ - ▏▋▋▉█▉▍▉▊▍▊▎█ ▍▍ - ▌▏▋█▋ █▏▋▋ ▍▍ - ▏▏▍ ▋ ▍▏▍▍ ▍█▎ - ▏▏▉▎▎▎▎ ▏▌▏██ ▏▏ - ▉█▏▏▎▉▉█ ▍ █▏ █▏▋▊ - ▏▏ ▏▏▏▍▏ ▊ ▏▏ ▎▏▍ - ▋▋▏ ▋▋▎▏▍ ▏▏▏▋ █▏ - ▏▏█ ▏▏▏▍▎ ▏▋▊▏▏▍▏ - ▏▏▋ ▉▏▋▏▍ ▏▋▏▌▋▎ ▏▋▊ - ▏▏▋ ▏▌▋▍██ ▎▋▎▏▏▏▋ ▏▏ - ▏▋ ▏▏ ▎▎▎▉▉▉▉▍▎▏▏▏▏▏▏▏ - ▏█ ▍▉ ▉▉▉▉▉▍▏▏█▎▏▏▏▏▏▎ - ▏▏▋ ▏ ▍▌▌▎▏▉▏▏▌ ▏▏ ▏ - ▋▏▏ ▊▋ ▎█▏▏▏ ▏▏ █▏ - ▏▏█▏ ▎▍▋█ ▏▏ ▍▏ - ▏▏▏▍ ▏▏▊▊▎▏▏█▊ - ▏▏▉▍ ▊▏▍▍▏▏▏▏ ▋ - ▍▏▉▌▎▉▍▎▉▋▍▏▉ ▋▋▏ - ▍▍▉▏█▋▎▋▍▏█ ▋▋ - ▉▉▎▎▊█▎▋█▋▎▏█ - █▉█▎███ - - diff --git a/codex-rs/tui/frames/vbars/frame_056.txt b/codex-rs/tui/frames/vbars/frame_056.txt deleted file mode 100644 index 98f0290093..0000000000 --- a/codex-rs/tui/frames/vbars/frame_056.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▊▌▉▉▊▊▍▉▊▎ - ▋▊▎▍▍▋▋▋██▏▊ - ▌▏▋▉▍▍█▏▎ █▏▊ - ▉▏▉▋▏▍▏▉▊ █▊█▍ - ▏▍▏ ▍▍▋▍▍▍ █▋▌ - ▏▍▊▎█▊ ▏▏▍▏█ ▉▏ - ▏▏▏▊ ▏ ▉▏▏ ▎▋▏▏▍ - ▍▋▉▋ ▏▏▊ ▍▏ ▏ - █▏█▏▉█ ▎▏█▎▏▏▋ - ▍▋▍▉▎▌▏ ▏▏▉▏▏▊▋▏ - ▏▋▏▌▌▉▏ ▏▏▋██▏▋▏ - ▏▋▉▋▉█▏ ▏▏█▎ ▏▏▏ - ▉▋▍▏▎▎▎▉ ▏▏▋▏▏█▏▏ - ▌▍▏█▉▉▏▍ ▏▏▋ ▏▏ ▏ - █▍▏ ▋ ▏▏▏▏▏▏▏▍▏ - ▏▏▉▎▉▊ ▎ ▋▏▏▏▏ ▋▏ - ▏▏▏ ▏▏ ▍ ▎▏▏▏▏ ▏ - ▍▏█ ▎ ▌▏▏▏ ▊▋▊▎▎ - ▏█▍ ▏ ▏ ▍▍▉▎ ▏▏ - ▍▏▍▍▉▋▍▋▊▏ ▏▏▎█ - ▍▉▊██▋▌▉ █▋ - ▉▎▎▋▎▉ ▍▉ - █▉▎████ - - diff --git a/codex-rs/tui/frames/vbars/frame_060.txt b/codex-rs/tui/frames/vbars/frame_060.txt deleted file mode 100644 index e7b02735a1..0000000000 --- a/codex-rs/tui/frames/vbars/frame_060.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▌▉▉▊▋▉▉▊ - ▍ ▍▏▋ ▉█▊▍ - ▋▏▏▏▋▎█▍▍▍ - ▋▋▋▏▌▏ █▏▏▏ - ▏▏▏▋▏▉▊ █▏▏ - ▏▏▎▏▋▋▏▍▏ ▍▏ - ▏▏▋▉▏▏▋▏ ▏▏ - ▏▏██▏▏▏▏▍██ ▊ - ▏▏▋▏▏▉▋▍▏▏▏▎▏ - ▏▏▏▏▏ ▏▏▏ ▍▎▏ - ▏▏▍▉█ ▏██▏█▏▏ - ▏▏▎▍▏ ▏ █▏▋▏▏ - ▏▏▎▎▏▎▎▋▏▏▏▏▉ - ▏▏▏▏▏▏▏▏▏ ▏▍ - ▏▏▎▏█▏ ▏▏▏ ▏▋ - ▏▏▍▏▏▏▏▏▏▏▏█▏ - ▏▍▋▋▋▏ ▋ ▏ - ▏▏▋▏▏█▌▏▏█ - ▋▏▏▏▍▏▉▍▎▏▍ - ▏▍▉▏▍█ ▏▉▏▏ - ▌ ▏ ▍▍ ▊▍▎▉ - ▉▉▏ ▉█▊▌▏▏ - █▉█▎██▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_064.txt b/codex-rs/tui/frames/vbars/frame_064.txt deleted file mode 100644 index 66a67c1624..0000000000 --- a/codex-rs/tui/frames/vbars/frame_064.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▉▉▉▊▉▉▉▊ - ▏▍▏█ ██▌▏ - ▏▎▏█ ▏▍▋▍ - ▏▏▏▍▎▍█▏▋ - ▏▋▋▏▊█▍▏▏ - ▉█▋ ▍▍▋▍▏ - ▉▋█▏▋▉▉█▏ - ▍▏▎▏ ▏▋▍▍ - ▍▏▌▎▊ ▋▏ - ▏▏▏▎▍▍▏▏▎ - ▏▏▏█▊▉█▏▏▏ - ▏▏▏▏▊▋▌▋▏ - ▏▏▏▏▏▏▎▏▏▎ - ▏▏▏▏▏▏▍▎▏▎ - ▏▏▏▏▏▏▏▏▏▏ - ▏▏▋▏▏▏▏▏█▏ - ▏▏▏▏▏▏▏▏▎▏ - ▏▏▏▏▏▏▏▏▋▏ - ▏▏▉▏▍▋▊▏▎▏ - ▍▏▌▏▏▊█▏▍▎ - ▍▏█▏ ▏ ▏ ▎ - ▉▋██ ▋▉▋ - █▉██▉█▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_068.txt b/codex-rs/tui/frames/vbars/frame_068.txt deleted file mode 100644 index 8ed6c9bfbe..0000000000 --- a/codex-rs/tui/frames/vbars/frame_068.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▊▉▉▋▊▊▉▌▊ - ▍▋█▍▋▏▍ █ - ▏▊▎██▍▍▏▍▌ - █▏▊ ▊ ▏▉▏▊▏ - ▏▏▏ ▎▍▏▏▏ ▏ - █▉▏▊▏▋▍▏▍ ▏ - ▍▏▏▎▏▏▏▏▏ ▏ - ▋▏▏▏▋▏▍▏▏▏ ▏ - ▏▏▏▏▏▏▍▏▏▉ ▏ - ▏▎▏▏▏▏█▋▏▍ ▏ - ▏▏██▏▍▏▋▏▊▋▏ - ▏▊█▋▎███▏▏▋▏ - ▍▏ ▏▏▏ ▏▏▏▉▏ - ▎ ▏▏▏▊▏▏▏█▏ - ▎▏▏▏▏█▏▉▏▏▏ - ▍▍▏▏▏ ▋▍▏▏▏ - ▏▋▏▏▏▎▋▏▏▋▏ - ▏▏▍▋█▏▏▍▋▌▏ - ▏▉▏▊▊▊▏▊▏▎▏ - █▍██ ▏██▏▎▍ - ▏▏▊ ▏▏▋▏▋▏ - ▏▋▍ ▏▉▍▎▎ - ▎██████▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_072.txt b/codex-rs/tui/frames/vbars/frame_072.txt deleted file mode 100644 index b8f62adc6a..0000000000 --- a/codex-rs/tui/frames/vbars/frame_072.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▊▉▏▌▊▌▉▏▊ - ▋▍▍▏▋▏▍▋▎▋▉ - ▏▏█ ▎ ▋▏▎▉▍▍▍ - ▊▍▎ █▏▏▏▏▊█ ▋ - ▏▏▋▏▋▍▏█▏██▌▏▉▊ - ▏█▏▊▏▏▏▏▏▏▏ ▍▏ - ▍▏▏██▍█▏▊▏ ▊▋▏▋ - ▏▏▏▏▏▎▏▏▏▍█▏ ▎▏ - ▏▏▏▏▏▏▏▏█▏▏▏ ▊▋▏ - ▏▏▏▏▌▋▏▏▋ ▍▉▏▏▏▏ - ▏▏█ ▍▏▋▏▋▋▊▏▋▋▏▏ - ▏▏▍▏▋▊▍█▍▎▍▍█▍▍▏ - ▏▏▏▏▏▍█▏▋▋▌▉▌▌▏▏ - ▏▏▏▏▏ ▏▉▏▏▏▏▏█▏▏ - ▏▏ ▍ ▏▏█▏█▍▍▏▉▏▏ - ▏█▍█▏█▏▏▏▍▍▋▍▎▏ - ▏▊ █▏█▏▍ ▏▏▏▋▍ - ▏▏▏ ▍▊▍▍▊▉▏▋▏▏ - █▏▋▍▋▊ ▌▏▏▋▏▏▊▏ - ▏▏▉ █ █▉▋▎▏█▏ - ▊▍ ▊ ▍█▏▉▌▋▋ - █▋▏▋ ▍▎▍▎▋ - ███▎███▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_076.txt b/codex-rs/tui/frames/vbars/frame_076.txt deleted file mode 100644 index c1eb5536c2..0000000000 --- a/codex-rs/tui/frames/vbars/frame_076.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▉▉▉▌▊▉▉▏▎▎ - ▉▍▋▏▏▍▍▍▉▎▋▉▍ - ▏▏▋▏█▍▋▏▍▏█▉▊▍▍ - ▏▋▎▋▋▋▍▏▉▋█▍███▏▊ - ▊▉▌▏▎█▋▋▏▏ ▊█▍▋ - ▏▍▍▋▋ ▎▊▋▉▎ ▍▏▊ - ▍▏▋▍▎▊█▏▏▍▉ ▍▏▏ - ▏▏▍▎▋▏▏ ▏▏▏▉▌ ▋▏ - ▏▏▍▉▏▏▎▎▍▍▎▏▏ ▊▌▏▏ - ▍▏▏▏▏▏ ▎▏▍▊ ▏▏▎▏ - ▏▏▏▏▏▋ ▋▏▎▏▊▏▏ ▏▋▍▏ - ▏▏▏▏▏▋ ▍▋▎ ▏▍▏ █▏▍▏ - ▏▏▏▏▏ ▋▏▏▍▌▉▊▌▏▏▏ - ▏▏▏▏▏ ▋▏▌▎▊▏▏▎▋▏█ ▏▏ - ▏▏▏▏▏ ▍▍▏▏▎▍▉█▋▏▉▋▏▏ - ▏▏▏▏ ▍▍▏▏▉▍▎▍▊▏▍▏▋▏ - ▏▏▏▏ ▍▏▋ ▏█▏▍▉ - ▉▏▏▏▏▏ █▏ ▋▋▍▉▏█ - ▏▍█▍▊▏▏▉▋▊ ▊▏ ▏▊▍ - █▊▍▋ ▏▏▍▍▏▋▉▌▏▍▉█ - █▏▊▋ ▎▍█▊▊▉▋▋▍▋ - █▍▉▉ █▉▎▉▎▎▌█ - █▎▎█▎▉█▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_080.txt b/codex-rs/tui/frames/vbars/frame_080.txt deleted file mode 100644 index 40d664a5b8..0000000000 --- a/codex-rs/tui/frames/vbars/frame_080.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▊▌▉▏▎▊▌▉▏▎▎ - ▋▉▉ ▉█▏▏▉▎▊▋▏▉▊ - ▏▎█▋▊▋▊▏ ▉▉█▉▉▉▊▍ - ▋█▏▏ ▋▋▏▊▋▊▎█▎ ██▍▍ - ▏█▋▏▏▊▊▏▍▉ ▋▍▏▊ - ▋▋▏▊▋▋▎▍█ ▎ ▍▋ - ▏▏▋▍▍▏▊▏▉ ▎▉▎ ▍▋▏▊ - ▌▏▏ ▏▏▉█▉▏ ▍▌▏▍ █▏▋ - ▏▍▏██▏▎▏▏▎ ▋▍▎▊▋ ▏▏ - ▍▏▏▏█▏▏▏▏ ▍▏▏▍ ▏▋▏ - ▏▏▏▏▏▎▎▏▏ ▋▋ ▋ ▋▉▋▏ - ▏▏▏▏█▏▎▏▏ ▏▍▏▎ █▏▏▏ - ▏▋▏▏▎█▏▏▏ ▋▎█▏▌ ▉ ▋▎▏▏▏ - ▏▏▏▏▏ ▋▏█ ▏▌▏█▎▏ ▉ ▎▎▏▍▏ - ▏▏▏▏▋ ▉▏ ▉▎ ▋ ▎▏▋ ▋█▏▏▉ - ▏▏▏▏▏ ▉▏ ▋▉▋ ▎▏▏▏▍▏ - ▏▏▏▏▏█▏▏ ▋▏▏▏▎ - ▌▍▏▏▍▋█▏▉▎ ▋▍▍ - ▉▏▊ ▎▏▍▍▍▍▎ ▎▏▉▎ - ▍▍▎ ▍▍▍▍▍▉▊▉▉▎▎▏▊▉▋ - █▏▎ ▉▌ ▉▌▉▋▉▎▉ - ▉▍▎ █▉▎▉▊▎▎▌▉▎ - ▎█▎▎▎▎██▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_084.txt b/codex-rs/tui/frames/vbars/frame_084.txt deleted file mode 100644 index 724489d2c4..0000000000 --- a/codex-rs/tui/frames/vbars/frame_084.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▊▌▉▎▊▌▉▉▉▉▊ - ▎▏▉ ▌█▏▏▉█▎▌▋▎▉▍▎ - ▎▏▉▎▎▋ ▋▋▎▉▉▉█▉▉█▍▏▍ - ▊▋█▊ ▍▉▊▉▊▉▋ ▎▎ ▍█▍▏ - ▊▋█▊ ▏▋▊▏▏▉ █▏▏ - ▏▋▎▊▋██▋▍▉ ▎ █▍▊ - ▏▏▏▋▍▏▊▏▏█ ▉▎▍ ▋▏▍ - ▏▏ ▋▏▎▎▏▊ ▏▊▍▎▍ █▋▏▊ - ▏▉▏▋█▏▏▉█ ▍▋▎▏▍ █▏▍ - ▏▏▏▏▏█▌▏▏ ▍▍▋▊ ▏▏▏ - ▏▋▏▏█▍▏▉▏ ▊ ▍▏▉▍ ▏▏▍ - ▏█▎▊█▎▎▏▏ ▏▍▉▊▎▏ ▎▏▋ - ▏█ ▎▊▏▋▏▏ ▉▋▎▉▍▉▌▌▉▉▍▎ ▎▎▏▋ - ▏▏ ▍▎█▏▏▏▏ ▋▋▋▍▋ ▉▏▉█▎ ▏▏▏▏ - ▏█ ▉█▏▏▎▏ ▎▋ ▏ ▎▏▉▏ ▉▉▋█▏ - ▏ ██▉▏▉ ▏▋ ▍▏▏▎ - ▍▍ █▍▏▎▏▊▏ ▊▏▊▏▊▏ - ▍▏▍ █▎█▍ ▍ ▏▋▎▍▍▎ - ▏▏ ▍█▏▍ ▏▎ ▋█ █▏▉▋ - ▍▍ ▎█▋▏▍▎▉▎▎▎▉▉▎▋▌▏█▋ - ▉▏▎ ▎▍▎▍▏ █▉▉▉▉▉█▊█ - ▉▉▎ █▉▎▉▍▎▎▎▎▋▉ - ▎█▎▎▎▎██▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_088.txt b/codex-rs/tui/frames/vbars/frame_088.txt deleted file mode 100644 index 154757f675..0000000000 --- a/codex-rs/tui/frames/vbars/frame_088.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▋▊▌▏▎▌▉▌▌▉▉▊▎ - ▊▋▍ ▉▌▋▏▋▉▎▎▌▍▌█▉▊ - ▎▋▎▋ ▊▉▊▉▎▉▉▉▏▏▉▏█▏▌▉▊ - ▋▏ █▋▋▋▋▋▌▉▏ █▏▊▎█▍▏▍ - ▋▍█▎▋▉▋█▉ ▍▋▎▍▏▍ - ▋▏▋▋▊▋▋▌▍ ▎ ▉▉ █▏▏ - ▎▏▍▍█▏ ▊▋ ▏▉▌ ▍ ▍▏▊▊ - ▏▏▎▋▋██▏ ▏▊▉▊ ▍ ██▏▏ - ███ ▏▎▍ ▍▋▎▉▏▍▎ █▍▏▋ - ▏▏▏▏▏▌▌▏ ▋▉▋▍█ █▋▏▏▏ - ▏▏▏▏▏▏▏▋ ▌ ▎▋▏▍▏ █▋▏▏▋ - ▏▎█▏▏▏▏▏ ▋▉▏▋▎▎▊█ ▋▏▏▍ - ▏▏ ▏▋▏▏▏ ▏▏▎▉▋▏▉ ▉▉▉▍▎ ▌▏▏█ - █▋█ ▉▋▏ ▋▋▋▋▉▋▋ ▍▉██▏▋ ▏▏▏▏▏ - ▏ ▋ ▏▏▎ ▎▏▏▊ ▍▉▉▉▋ ▏▉▉ - ▉▋▋ ▏█▏█ ▍▊▎ ▏▏▋▋ - ▏▊ ▍▏▍▍▊▍▊ ▎▉▋▋▏▍▎ - ▉▋▍█▊█▏▊▍▊ ▌▉▋▋▍▍▋ - ▏▌▍▍▊▍▏▊▉▍ ▎▋▎▊▏▊▏▋ - ▏▌ ▍▍▍▍ ▉▉▊▎▎▌▉▎▏▏▏▉▍▉ - █▏▎▎█▍█▍▏ █▉▌▉▉▉▉█▎▋▎ - █▉▊ ▎▉▊▉▉▌▎▎▎▎▉▉▎ - ██▎▎█▉██▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_092.txt b/codex-rs/tui/frames/vbars/frame_092.txt deleted file mode 100644 index 444f63fc20..0000000000 --- a/codex-rs/tui/frames/vbars/frame_092.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▊▊▌▉▎▉▉▉▉▌▏▊▎ - ▎▉▏ ▉█▏▉█▉█▎▌▋▏▌█▉▍▊ - ▎▋█▎▋▊▉█▉█▎▉▉▉▏▏█▉▉▉▋▎▍▊ - ▋▉▊▋▌▉▍ ▉▊▉ ▍▋▎▉▉▏▊▍ - ▏▎▋ ▊█▎▌ ▏▋ ▉▍▍ - ▏▏▎▎▍█▊ ▉▎▌ █▉▏▏ - ▋▉█▉▏▋▎▊ ▋▏▉▍█ ▍▋▍▏ - ▎▏▋▊▏▏▌▏ ▏▋▊▉▍ █▏▋▎ - ▏▎▏▏ ▏▎█ ▏▊▊▉▍▎▍ ▏▏▏ - ▏▏▏ ▊▏▏ ▏▊▋▉▍ ▋▏▏ - ▍▏▏▏▏▍▏ ▋▌▌▎██ ▏▏▋ - ▍▏▏▎▏▏▏ ▋▋▋▋█▋ ▏▉█ - ▏▏▏▋▏▏▏ ▋▍▋▋▋▋▋▎ ▌▌▉▉▉▉▏▌ ▊█▏▉ - ▏▏▏▏▉▍▋ ▌▋▋▋▋▏█ ▉▌▉█▉▏█▎ ▊▏▏▍ - ▉▏▏▏▍▏▏▊▍ ▉▊▏ ▍ ▉▏▉▌▉▌▏▉ ▏▍▉▏▏ - ▉▎▏▏▏▋▋ ▏ ▉▍▊▎ ▎ █ ▏▏ - ▉▊▍▍▊▉▍█▏ ▊▉ ▏▍▍▋ - ▉▏▍▍▍▊▍▍ ▏ ▏▎▋▊▏▋ - █▏▎▍▍▍▏▍▎▉▊ ▎▌▉█▎▋▋▉▋ - ▍▎ █▊▏▏▊▎▉▉▎▎▎▎▉▉▉▊▏▉▉▉▊▉ - █▍▎▍▍▏▍▊▊ ▎▉▉▉▉▉▉▉▉▎▎▉ - ▉▉▎▎▉▊▉▏▊▎▎▎▎▎▊▉█ - ▎█ ▎▎█▉██▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_096.txt b/codex-rs/tui/frames/vbars/frame_096.txt deleted file mode 100644 index 80520575c4..0000000000 --- a/codex-rs/tui/frames/vbars/frame_096.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▎▉▏▊▉▉▉▉▉▏▎▎ - ▎▊█▎▉▏▏▉█▏█▎▌▊▋█▏█▉▉▊▎ - ▎▋▍▋▋▉▉█ ▎▎▋▉▉▉▏▏█▉▉▌▍▊▉▍▎ - ▋█ ▊▊▏▎ ▍▊█▉▉▌▉▍ - ▏ ▋▏▋▋ ▉ ▋▉▊▍ - ▏▋▋▋▏▋█ ▊▉▎█ ▉▍▍ - ▉▌▌▋▏▊▋ ▋▋█▍▎ ▉▉▍▏ - ▌▋▊▌▏▍▊ ▏▏▋█▏ ▎█▏▋▊ - ▉▍██▉▏ ▏▊▏▋▏ ▍ ▏▏▏ - ▎▏▏▏▎▏▍ ▍▍▍▍▏▎█ ▏▏▋ - ▏█▏█▋▏▏ ▊ ▍▉▏▏▏▊ ▋▏▏▏▏ - ▏▏▎█▏▏▏ ▏▋▌▎▋ ▋▍█ ▏▊▏▏▏▏ - ▉▏▏▏▏▏▏ ▏▋▊▊ ▋█ ▌▉▉▉▉▌▌▍ ▎█▏▉▋▎ - ▊▏▏▏▏▊▊ ▏▊▊▉▎▌█▋ ▏▎▉██▏▉█ ▏ ▍▏▋ - ▏ ▏▏▏▏▏ ▉▋▋ ▊▎ ▍▏▉▉▉▌▉ ▏█▋▋▏▊ - ▍▏▍█▊▊▊ ▏▎▊█ ▌▉█▏▏▏▎ - ▉▍▍▏ ▋▋▎ █▌▉█▏▊▍▋ - ▍▏▍▉▏▍▏▎▉▋ ▎▋█▌▉▊▏▋ - ▉▍▍▍▊▏▍▌ ▉▊▋ ▎▉█ ▏▉▉▋▋ - ▍▎ ▍▉▏▍▎█▉▉▌▎▎▎▎▉▉▉▌▎▉▏▋█▏▎ - ▍▎ ▍▉▉▏▊▊▎▉▉▉▉▉▉▉▉▉█▎▉█ - █▉▊▎▍▋▎▏▊▎▎▎▎▎▎▌▉▉▎ - ▎█▎▎▎█▉██▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_1.txt b/codex-rs/tui/frames/vbars/frame_1.txt new file mode 100644 index 0000000000..0ca3a5d334 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_1.txt @@ -0,0 +1,17 @@ + + ▎▋▎▋▌▉▉▌▌▉▊▎ + ▎▌▊▋▉▍▉▋▉▍▌▏▏▌▎ ▎█▉▎ + ▊▏▉▏▉▉▉█▍▎ ▎█▉▎█▏▌▏▏▏▉ + ▌▉▎▍▉█▊▊▎ ▋▉▏▌▏▊ + ▍▍▌▋█▍▏▍▎▍▍ █▋▏▍▍▊ + ▏▉ ▉▎ ▏▉▋▌▏▏▊ █▋▍▏▏▊ + ▉▍█▊▉ █▍▏▉▋█▏▎ ▏▋▏ + ▏▏▎▏▎ ▊▋▋▏▌▏▉ █▎▏ + ▏▌▏█▎ ▌▏▏▍▍▏█▋▏▉▉▉▉▉▉▎▉▊ ▌█ ▏ + ▎▏▌▉ ▎▌▉▎ ▋▉ ▏█▏▎▎▎▋▋▊▊▊▏▋▊▋▊▏ + ▍▍▎█▍ ▍▍▊▋▋▎ ▎▍▉██▉ ▍▉█▋▊▌▎▋ + ▉▍▊ █▊ ▎ ▊█▋▉▎▏ + ▍▍▊▎▍▉▎ ▎▌▎▉▏▎▉█ + ▍▉▊▍▎ ▉▉▋▌▌▌▌▋▌▉▉▎▊▏▉ + ▎▉█▉▏▏▏▎▎▎▊▎▌▉▉█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_10.txt b/codex-rs/tui/frames/vbars/frame_10.txt new file mode 100644 index 0000000000..b422fb1274 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_10.txt @@ -0,0 +1,17 @@ + + ▎▉▉▉▉▍▉▉▎ + ▉█▎▉▉▉▍▏▋▎▉▊ + ▍▎▊▏▏▋▏▏▊▏▉▍▊▊ + ▏▎▎▋▍▏▌▎▋▍▊██▍▍▊ + ▋ ▌▏▏█▏▍ █▊▋▎▋▏▋ + ▏▎ █▏▉▏▋▋▍ ▎▎█▏ + ▍ ▏▉█▉▏▏▏▏▉ ▏▋▊ + █ ▏▏▍▉▋▉▏▏▊▎▎▋▍▏▏ + █ ▏▍ ▍▍▏▌▏▏▉▍▉▌▏▏ + ▏ ▊▏▍▊▏▎▋▎▉▎▎▎▏▉▎ + ▊ █▏▏▏▏▏██ ▍▊█▍▏▎ + ▍▎█▊▍▊▉█ ▎▏██▊▋▋ + ▏█ ▏▏▏▏▉▊▋▊▋▏▋▎ + ▌▎▉▉▋▏▉▌▎ ▋▋█ + ▉▊ ▎▉▍▎▊▌▉ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_100.txt b/codex-rs/tui/frames/vbars/frame_100.txt deleted file mode 100644 index b020690848..0000000000 --- a/codex-rs/tui/frames/vbars/frame_100.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▋▎▎▉▌▉▉▉▉▉▉▉▎▎ - ▊▉▎▊▌▋▉▉▎▋▉█▎█▋▎▏█▉▉▉▎ - ▎▉▍▎▋▉▉▋▋▋▎▊▉▉▉▌▏▏▉▉▉▌▍▏█▉▊ - ▋█ ▋▋▌▋▋ ▏▊▉▍▌▋▉▊ - ▎▏▊▎▊▉▉▉▎ ▍ ▉█▋▉ - ▎▏▎▏▋▋▊ ▊▌▎ ▋▍▊▏ - ▏▋▍▋▋▍▋ ▋▏█▏▎ ▋▍▍▊▏ - ▋▋▋▏▏▋▎ ▉▏▎▍▏▎▎ ▎▍▊▏▍ - ▏ ▋▊▉▏ ▉▍▊▎▉▌ ▍ ▏▏▏ - ▏▎▏▏█▏▏ ▉▏▍█▉▍▋█ ▏▊▏▊ - ▏ █▏▏▍▉ █▏ ▎▋▍ ▍▉ ▏▏▍▏ - ▏▎█▍▎▍▏ ▋▍▍▉▋ ▎▏ ▏▏█▏ - ▏ ▎█▏▏▎ ▏▍▎█▋▎▎▋ ▌▌▌▌▌▉▉▌▉▌▎▎ ▍▏▋▏▏ - █▎ ▏▏▏ ▏▎▊▊▉▏▊▋ ▏▏▋▉█▉▏▌▎▎▎▏ ▏▏█▎ - ▏▋█▏▍▋▎▍ ▏▉▋▏ ▎▉ █▏▉▏▉▌▌▉▉▌ ▋▏▍▍▌ - █▍▏▏▏▉▍ ▏ ▏▍▊█ ██ ▎▋▋▉▎ - ▍▏▏▏▏▍▏ ▏▎ ▋█▊▉▏▏▋ - ▍▌█▍▏▏▍▎▉▊ ▋▏▎▉▎▎█▋▋▋ - █▊ ▉█▏▏▋█▏▎ ▎▌▉█▎▉▊▏▊█ - ▉▎ ▉▉▏▉▎█▏▏▌▉▎▎▊▊▉▉▉▏▎▉▉▉▏▋▋ - ▉▊▎▉▉▏▌▎ ▉▏▉▉▉▉▉▉▉▉██▊▉▎ - ▎▉▋▎▉█▉▉▍▌▎▎▎▎▎▊▊▉▉█ - ▎ ▎█▉▉██▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_104.txt b/codex-rs/tui/frames/vbars/frame_104.txt deleted file mode 100644 index 9951867cab..0000000000 --- a/codex-rs/tui/frames/vbars/frame_104.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▋▊▌▉▌▉▉▉▉▉▉▉▎▎ - ▎▉█▊▏▋▉▉▎ █▉▉▉▊ - ▊▉▎▋▉▉█ ▎▊▌▉▉▉▌▏▏▉▉▉▌▊▏▏▉▉▎ - ▊▉▋▋▋▍▊█▎▊▉ ▌▎▉▏▊▍█▍▎ - ▋ ▌▊▉▊█▊▋ ▉▏▋▋▍▍▉▍ - ▉█▋▉█▋ ▋ ▌▌▍▍ ▍ ▏█▋▍ - ▏▉▋▏▎▋█▏ ▋▌█▉▊▍ █▍ ▏▋▋▍ - ▏▍▍▍▋▊▋▋▎ ▍▍▊▎▍▍▍▎ ▎ ▍▋▍▊ - ▏▌▏▍▏▍▎ ▉▏▍ ▉▏█▏ ▍ ▏▏▍▉ - ▏█▏▏▏▏█▏ ▊ ▏▏▊▋▏▎▏ ▏▋█▊ - █▏▉█▏▏ ▏ ▎▍▋ ▏▉ ▋▏ █ ▏▏ ▏ - ▏▏▎▋▏▏ ▏ ▎▉▊▋▌▎ ▋█ ▏▋▏▏█▏ - ▍█ ▏▏▏█▏ ▊▉▋▋▏█▋▏▎ ▌▉▉▌▉▉▉▌▌▊ ▍▏▏▏▊▏ - ▎▎█▉▋ ▊ ▋▎▊▏▋ ▎▏ ▉▋▍▉█▉▏▌█▎█ ▋▉▏▍▏▎ - ▍ ▏▏▏▏▊▏ ▉▊▋▏▎▎ ▏▉▉▏▏▌▌▉▉▉ ▎▏▏▏▏ - █▏▎▍▍▍▏█▏ ▉▋ ▎▍▏▍▎ - ▍▎▍▋▍▏▊▍▏▎ ▎▋▎▋█▋▉█ - ▉▌█▏▏▍▊ ▏▊ ▎▌▉▎▉▋▏▏█ - █▍ ▉▉▏▌▎█▏▊▎ ▎▉█▎▋▍▉▉▋▎ - ▉▌ ▉▉▉▌▎█▏▉▉▉▉▊▎▊▊▉▉▉▏▎▌▉▊▏▉▊▉ - █▉▎▍▉▍▉▎▎ █▉▏▉▉▉▉▉█▉▉▏▉▏▋█ - █▏ █▉▏▉▉▊▎▎▎▎▎▎▊▎▉▉█ - ▎ ▎██▉▉██▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_108.txt b/codex-rs/tui/frames/vbars/frame_108.txt deleted file mode 100644 index 2b7ec2d1fb..0000000000 --- a/codex-rs/tui/frames/vbars/frame_108.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▋▎▌▌▉▉▉▉▉▉▉▉▊▎▎ - ▊▌▏▉▉▉▉█ █▉▊▎ - ▎▋▉▉▏▉▌▋▋▋▎▉▉▉▏▏▏▏▏▉▉▉▉▍▎▌▉▉▊ - ▎▋▉▋▋█▌▎▊▌▉ ▍▊█▉▉▏▏▉▊ - ▋▎▌▊▉▏▎▊▏ ▉▋▍▉▉▋▏▎ - ▏▏▋▏▊▉█▏▏ ▊▉▏▍ ▊ ▏▍▍▍▊ - ▏▍▋▏▊▉▍▏ ▍▌▋▋▏▉ ▎▍▍▍▏▍▉▊ - ▋▉▏▍▍▋█▏ ▉▏▌▍▉▍▎ ▍▍█▍▍▏▎ - ▏▏▏▏▏▋▏ █▏▌▎▏▏▊ ██▍▊▎▏ - ▏▏▍▏▏▋▋ ▋▉▏▍▉▍▍▉ ▎▏▋ ▏▏▏ - ▉▉▏▎▏▋▏ ▏ ▏▏▊▋▏▏ ▋ ▏▋▍▊ - █▎▏▎▏▎▏ ▋▍▊▊▉█▊▏ ▋▋▏▍ ▏ - ▍ ▋▏▏▊ ▏ ▎▉ ▋▋▋▋▋▋ ▊▉▌▌▉▉▉▉▉▉▌▉▊▊ ▏▌▏▏▎▎ - █▎ ▏▏▏▍▏ ▉▍▉▋▋█▋█ ▊▏▏▍▉█▉▉▌█▎█▉█ █▏▏▏▏ - ▏▊▍▍▏▋ ▏▎ ▊▏▋▊▋ ▍▍▉▉▏▏▌▌▉▉ ▏▏ ▋ - ▏█▏▊▋▊▉▍▋ ▊▎▋▋▏▋▏█ - █▍▉▏▋▏▎█▍▎ ▎▌▉▎▋▋▏▊▎ - █▉█▏▏▏▊ ▏▊ ▎▉▎▋▌▌▌▋▎ - ▍▎▍▉▏▍▊█▏▉▎ ▋▉▎▏▉▏▉▍▉ - █▉▎▉▏▉▉▎█▍▉▉▉▉▉▎▎▊▌▉▉▉▏▎▌▉▏▉▎▎▋▎ - ▉▊█▉▏▏▎▍██▉▏█▉▉▉▉██▉▉▏▍▎▉▉ - ▉█▋▉▉▏▏▉▌▎▎▎▎▎▎▌▉▉▉█ - ▎ ███▉▉██▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_11.txt b/codex-rs/tui/frames/vbars/frame_11.txt new file mode 100644 index 0000000000..5d4524e293 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_11.txt @@ -0,0 +1,17 @@ + + ▊▉▉▉▉▉▉▎ + ▋█ ▌▏▏▏▍▍▊ + ▋█▎▎▏▏▌▍▉▋▍▊ + ▏▎▎▏▏▌▌▊▎▌▋▋ + ▎█▋▌▍▏▉▍█▌▎▏▏▊ + ▏▉▎▏▏▉▎▌▌▏▎▋▏▏ + ▉▉ ▊▏▏▏▏▏▏▎▏▌▍ + ▏ ▏▏▋▏▏▍▋ ▏█▏ + ▋ █▏▋▏▏▉▋▉▏▎▏ + ▉▉ ▎▏▋▌▊█▋▏▎▏▍ + █▎▊ ▏▏▏▏▌▋▏▍▍▏ + ▍▎▊▋▏▎▉▋▉▉▌▏▎ + ▎ ▉▏▍▍▍▎▏▌█ + ▍▉ ▉▏▏▊▎▋▉▎ + ▍▎ █▉▉▎▉▎ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_112.txt b/codex-rs/tui/frames/vbars/frame_112.txt deleted file mode 100644 index 27c18a9dd6..0000000000 --- a/codex-rs/tui/frames/vbars/frame_112.txt +++ /dev/null @@ -1,27 +0,0 @@ - - - ▎▎▎▌▌▉▉▉▉▉▉▉▉▊▎▎ - ▎▋▉▊▋▏▉█▊▍██ █▉▉▎ - ▊▉▊▏▉▌▉█▊▎▊▉▋▉▉▌▏▏▏▉▉▉▉▉▎ ▉▉▎ - ▊█▋▉█▉█▌▌▉▉▏▍ ▊█▉▉▌▊█▍▎ - ▊▉▏▏▉▊█▊▏ ▉▉█▉▊▊▉▍ - ▋▋▋▏▎▉ ▋ ▌▊▊▊▎ ▍▌ █▍▍█▏ - ▋▍▋▋▊▉▎▏▎ ▍▍▎▍▉▉▎ ▉▍ ▍▏ ▏ - ▊▋▏▍▍▉█▏ █▏▍▍▋▊▉▋▎ ▉▍ ▍▏ ▏ - ▏▏▏▏▏█▋▎ ▉▍▎█▍▍▎█ ▍▋ ▏▏█▊ - ▎▏▏█▏▎▋▏ ▎▉▏▎█▍█▊█ ▏ ▏▏▎▏ - ▏▍█ ▏ ▍ █▉▎▋▍ ▋ ▏▊▍▏▋▏ - ▏▎▏▎▏ ▍ ▎▉▎▉▋ ▋▉ █▋▏▏▏▏ - █▎ ▍▏▎ ▏ ▋▏▊▏▍ ▎▏▎ ▊▌▌▌▉▌▌▉▉▌▉▉▊▎ ▍█▏▏▎▏ - ▊ ▏▏▏█▏ ▎▋▋▋▉▎ ▌▉ ▍▏▏▌▉▉█▉▉▉█▎▏▉▏▊▏▎▏▍█▏ - ▍▊█▍▉▋█▏ ▏▏█▋▋█ ▉▌▎▉▏▉▉▌▌▉▉▉▉▋▎▏▌▏▋▎ - ▍█▏▋▏ █▍ ▋▍▎▍▉▎▋ - ▍▉▏▏▍▎▍▉▎ ▎▋▎▋▊▋ ▋ - ▍▋▏▏▏▎▊▍▍▎ ▎▉▉▊▉▋▏▊▉ - ▉▊█▏▏▌▊█▌▉▉▎▎ ▎▊▉█▏▉▋▏▍▋▎ - ▉▊▍▉▏▍▊▋▉▏▉▉▉▉▉▎▎▊▌▉▉▉▏▎▉▉▏▉█▎▉█ - █▉▎▏▏▍▎ ▎ █▉▏█▋▉▉▉██▉▉██▎▉▉▎ - ▎▎▋▉▉▉▏▉▉▊▎▎▎▎▎▎▌▉▉▉▉▎ - ▎ ██▉▉███▎ - - diff --git a/codex-rs/tui/frames/vbars/frame_12.txt b/codex-rs/tui/frames/vbars/frame_12.txt new file mode 100644 index 0000000000..f81900edb1 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_12.txt @@ -0,0 +1,17 @@ + + ▉▉▉▉▉▋ + ▊▌▎▎▋▏▊▍ + █ ▏▋▍▉▊ + ▋▉▏▏▏▌▌█▏ + ▏ █▏▏▏▏▋▋▏ + ▏█▋▋▉▍█▎▏█ + ▏ ▏▋▍▏▏▍ + ▏ ▋▉▍▏▏█ + ▉▊ ▏▋▏▏▉▏▏ + ▏ ▋▏▉▌▉▎ + ▏▋ ▏█▌▉▉▋ + ▊ ▉▏ ▎▊▏ + ▋ ▉▉▏▊▉▍▏ + █▍▋█▊▏▍▏▎ + ▍ █▏▍▋▋ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_13.txt b/codex-rs/tui/frames/vbars/frame_13.txt new file mode 100644 index 0000000000..4231032a45 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_13.txt @@ -0,0 +1,17 @@ + + ▋▉▉▉▊ + ▏▎▎▏▏ + ▏▎▎▏█ + ▏▉▉▏▎ + ▉ ▏▏ + █▋▊▏▏ + ▊ ▏▏ + ▉ █▏ + ▋▉ ▎▏▋ + ▏█ ▉▌▏ + █▎▋▋ ▏▎ + ▏▎▎▎▏ + ▏▉▊▏▎ + ▉▎▎▏▌ + ▊ ▋█▌ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_14.txt b/codex-rs/tui/frames/vbars/frame_14.txt new file mode 100644 index 0000000000..6eab794e0a --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_14.txt @@ -0,0 +1,17 @@ + + ▉▉▉▉▌ + ▊▋▎▎▋▍ + ▏▎▏▏▋ ▏ + ▏▏▋▏█▍▏▊ + ▏▏▏▍ ▏ + ▏▉▏▏ █▏ + ▏▏▏▏ ▋ ▉ + ▏▏▍▏▎ ▍ + ▏▏▏▏ █ + █▍▋▋ ▌▋ + ▍▏██▊▋▊▏ + ▏▉▏▏▎▎▎▏ + ▋ █▏▌▌▌▎ + ▏▍▋▉▎▎▋ + ▎▉ █▌▋ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_15.txt b/codex-rs/tui/frames/vbars/frame_15.txt new file mode 100644 index 0000000000..fa9a859bd0 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_15.txt @@ -0,0 +1,17 @@ + + ▉▉▉▉▉▏▎ + ▎▊▌▏▏▍▋▉▊ + ▋▋▏▉▌▍▏█▉▏ + ▏▋▎ ▋▋▊▋▎▎▏ + ▏▏▌█▌▍▏▏▋█▍▏ + ▍▏▏▊▏▏▋▋▏ █ + ▏▏ ▏▏▏▏▏▏▊▏ + ▏▏▋▏▏▉▏▏▏ █▊▏ + ▏▏▉▊▊▉▏▏▏▎▋▋▏ + ▏▎▏▌▋▏▍▏▉▋ ▋▏ + ▏▋▏▏▏▏▎▏ ▎ ▌ + ▏▉▉▋▍▏▏▍▊ ▌ + █▏▍▊ ▋▋▋▎ ▌▎ + ▏▍▏▏▍▍▋▉▍▋ + ▍▍▉▍▎▎▎▋ + ▎▎ \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_16.txt b/codex-rs/tui/frames/vbars/frame_16.txt new file mode 100644 index 0000000000..1fcc2090a2 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_16.txt @@ -0,0 +1,17 @@ + + ▎▌▉█▉▉▉▏▎ + ▋▍▏▏▉▏▏▍▏▌▍ + ▏▋▋█▍▋▌▍▏▏ █▍ + ▋▋▋ ▌▉▎▍▏▍▏▏▉▉▏ + ▏▏▌▎▋▉█▌▏▏▉▋▏▎▍ + ▏▏▏▉▏█ ▏▍▌ ▏ ▏▋▏ + ▍▍▏ ▋▎▊▏▏▏▏▋▉█▊ ▏ + ▏▋▌ ▏▎▏▏▋▏▏▏█▌ ▎▏ + ▍▍▏▏▏▉▏▋▍▏▏█▉▉ ▋ + ▉█▎▎▊▌▌▍▉▏▋▎▏ ▊▎▏ + ▏▏▏▉██▋▉▍▏▌█▌▋▏▏▎ + ▏▏▉ ▏▎ ▎▋▋▊ ▋ + ▍▏▉ ▏ ▋▊▋▎▊▏ + ▍▏▏█▎▉▏▋▋▉▎▏ + █▋▋▎▌▋▎▎▌▉ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_17.txt b/codex-rs/tui/frames/vbars/frame_17.txt new file mode 100644 index 0000000000..1adf01af90 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_17.txt @@ -0,0 +1,17 @@ + + ▊▌▉▉▉▌▌▏▊▎ + ▎▌▉▉▏▏▏▉▌▉▏▊█▍▊ + ▊▉▍▋▎▌▌▎▉▊█▏▏▏▎█▍ + ▋▏▋▎▋▏█▎▎ █▏▌▍▏▏▏▌▍ + ▏▋▎ ▏ ▏█▋▍▌▍▋▋ ▊ + ▎▌▉▊▋▎ ▊▋▋▏ ▋▊▌▋▏▋▋ + ▉ ▌▋▏ ▊▋▋▏▎ ▉█▏▏▋▌▏ + ▊█▌▏ ▋▋▏▏▋▏▊▏▏▌▌▉ + ▊▋▉▋▍▌▌▉▏▍▎▏▍▍▋▍▏▏▏ ▏ + ▏█▎▌▎▎▏▋▉▍▋▏▏▍ ▍▉█▉▍ + ▍▍▍▋███▉▉▉▉▍▎▏▉▋▋▍ ▍█ + ▍▏▏▎▉ ▎▋▏▏▎ ▌ + ▎▍▍ ▉▍▎ ▊█▊▋▍▎▋ + ▊ ▏▉▉▌▍▉▎▎▌▉▋▏█ + ▎▉▌▋▎▊▉▏▉▎▉▉ + ▎ \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_18.txt b/codex-rs/tui/frames/vbars/frame_18.txt new file mode 100644 index 0000000000..9c46c64821 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_18.txt @@ -0,0 +1,17 @@ + + ▎▌▌▉▌▌▉▌▏▊▎ + ▎▉█▎▌▊▉▉▏▎▎▊█▉▌▌▎ + ▎▋▋▏▉█▉▌█▊█▋▎█▉▋▋▍ ▉ + ▊▏▏▉▋▊▍█▉ █▍▎▎▋▌▏▍▌▍▍▍▊ + ▎▍▋▋ ▋▏ ▎█▉▎▍▋▏▋▏▎▍▌▍▍▎ + ▋▍▏ ▊▊▏▋▎▎▎▋▊▉▊▏█▊▋▍▋▎▋▏ + ▏▏▍▋▋ ▉▋▉▋▏█▎▋█▉▏▌▏▌▊ + █▍▊▏▏ ▍▍█▏▏▌▍ ▏▌▏█ + ▍██ ▊▍▌▌▌▌▌▉▏▏▊▏▉▋▍▊ ▏▉▏▎ + ▎▍▍▏▉▍▉ ▏▏▋▎▎▍▎▏▏▏▎▌▏▎▍ ▊ + ▏▋▏▍▎██▉▉▉▉▉▎ ▍▎▎▋▏▋▉▋▎▊▎ + ▍▍ ▊▍▊ ▎▎▉█▋▉▎█ + ▍▍▉▉▍▍▋ ▎▉▍▎▋▍▊▎ + █▏▋▉▉▉▉▌▌▌▍█▉▎▋▎▊▉ + █▏▏▎▋▎▎▊▋▉█▌▉█ + ▎ \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_19.txt b/codex-rs/tui/frames/vbars/frame_19.txt new file mode 100644 index 0000000000..572f5ffc32 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_19.txt @@ -0,0 +1,17 @@ + + ▎▎▌▌▉▏▉▌▌▏▋▎ + ▎▉▏▏▏▍▋▌▌▌▎▉▎▊▏▉▊▊ + ▊▉▌▌▋█▏▉▉▎ ▎▉▋▊▎▉▌▍ + ▋▌▏▉▊▍▎ ▎▌▌▉▊▍▏▉▊ + ▏▏▋▎▋▎ ▊▏▍█▋█▏▍ ▏▍▊ + ▏▍▋▉█ ▎▏▉▏▋ ▋▋ █▋▉▏ + ▍▌▏▏█ ▋▉▍▋▏▉▊▎ ▋▋▋▉▏ + ▏▏▏▏ ▏▌█▍▏█▊ ▏ ▏▏▏ + ▏▉▏▍▊▌▌▌▌▌▌▏▏▏▏▉▉▌▉▏▌ ▍ █▏▏ + ▍▌▋▊▏▌▉▋▍▉▉▍▊▎▊ ▍▎ ▋▍▎▍▊▋▋▏▎ + █▍█▋▉▏█████▉▉█ ▍▍▎▋▏▋▋ ▋▋█ + ▍▍▍▉▎▍ ▎▋▋▎▋▋█ + █ ▎▍▏▏▉▊ ▊▌▌▋▋▏▌▎ + ██▋▏▉▋▏▉▎▎▌▌▋▉█ ▌▉▏█ + █▏▋▎▋▊█▎▊▋▍▉▊▍ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_2.txt b/codex-rs/tui/frames/vbars/frame_2.txt new file mode 100644 index 0000000000..0e0c021f43 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_2.txt @@ -0,0 +1,17 @@ + + ▎▋▎▋▌▉▌▌▌▉▊▎ + ▎▉▊▋▉▌▉▏▏▏▌▏▏▌▎█▏▉▉▎ + ▊▏▉▏▍▉▉▏▉▎▎ ▎█▉▌▉▋▏▏▌▏▊ + ▎▏▋▎▋▉█▊▊▎ ▊▊▍▏▋▏▊ + ▊▍█▋▉▍▏▍▎▍▍▎ ▍▊▏▍▏▊ + █▋▉█▎ ▏▉▍▉▋▍▉ ▍▍▏▉▏ + ▊▏█▉▏ ▍▋▏▌▏▎▏▊ ▋█▏█▏ + ▏█ ▍▎ ▊▏▉▏▏▌▉ ▏█▋▋▏ + ▉██▌▏ ▌▏▍▍▎▏█▋▏▉▉▉▉▉▉▉▉▊▏▎▏▏▉ + ▎▌█▏ ▋▏▏█ ▋▉ ▏▌▍▎▎▎▎▋▋▎▎▏▉▋ ▏ + ▍▍▍ ▉ ▉▍▋▋▏█ ▎█▉▉▉▉▉▉▉█▏▊▉▏▏ + █▍▎▋▋▊ ▎ ▊▉▌▋▊▉ + ▋▍▎▎▏▉▊ ▊▌▎▉ ▎▏█ + ▎▏▍▌▎▎█▉▉▋▌▌▌▌▋▌▉▎▎▏▏▉ + ▎▉▉▉▉▏▏▎▎▎▎▏▌▋▉█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_20.txt b/codex-rs/tui/frames/vbars/frame_20.txt new file mode 100644 index 0000000000..42c288df92 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_20.txt @@ -0,0 +1,17 @@ + + ▎▎▉▌▏▏▌▉▌▊▎▎ + ▊▌▌█▌▊▎▊▌▌▌▏▏▎▍▉▍▉▊ + ▊▊█▎▉▉█▏▉█ ▎█▍█▍▉▉▏▉▎ + ▎▏█▎▉▏▉ ▎▊▉▏▍▋▉▍▍ + ▎▏ ▊▏▉ ▎▋ ▎▏▏▍▉▍▏▏▍ + ▋▎▊▏█ ▉▉█▌▏█▋ █▍▏▏▍ + ▌▏▌▉▏ ▊▉ ▋▉▉▍ ▊▍▏▋ + ▏▎▍▋▎ ██▌▋▏█▊ ▏▏█▏ + ▏▋▏▏▌▊▌▌▌▌▌▌▌▌▎▊█▌▍▍▍▍▉ ▋ ▏▍ + █▏▍▏▎█ ▋▎▎▎▎▎▎▏▍ ▉▍▍█▏▌▍ ▊▋ ▏▏ + ▍▊▍▍████████▉█ ▍▊▌▏▏▊▏ ▋▍ + ▉ ▍▉▋▊ ▎▋▉▋▏▋ + ▍▎▍▉▊▏▎ ▊▌▉▎▌▉█ + ▍▊▊▋█▏▉▍▌▌▊▋█▏█▎▊▋▉█ + ▎▉▉▏▎ ▌▎▎▎▎▏▉██ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_21.txt b/codex-rs/tui/frames/vbars/frame_21.txt new file mode 100644 index 0000000000..aa5d4f7274 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_21.txt @@ -0,0 +1,17 @@ + + ▎▎▊▌▉▌▌▉▌▉▊▎▎ + ▊▉▉▎▎▎▎▉▏▌▏▉▌▎▎▊▉▉▎ + ▌▉▍▎▉▉▍█▎ ▎▍▏▉▉▎▎▉▊ + ▊▉▏▌██ ▎▊▌▉▊▌▉▊ + ▋▊▋▉▎ ▊▏▋▎▍ ▍▍▎▍▊ + ▋█▋▏ ▊▉▉▎▋▋ ▍▍▍▊ + ▏█▏▎ ▎ ▋▎▊▋█ ▍▌▍█ + ▎▍ ▍▌ █▏▊ ▏ ▏ + ▏ ▏ ▊▉▌▌▌▌▌▉▉▉ ▍▏▊█▏▊ ▌▋ ▏ + ▏ ▏▍ ▏▎ ▎▊▏ ▍█▎▉▏▊ ▋█▋▋ + ▌ █▋ ▎▎███ █▎ █▉▎▊▌ ▋▎ ▊ + █▉ ▋▌▎ ▎▉█ ▋ + ▉▎ ▍▊▎ ▎▋▌▉█ ▊▎ + ▉▌▎ ▉█▉▉▋▏▏▌▋▌▉██ ▊▎ + ▉▉▉▌▉▎▎▎▎▊▎▌▉▉▎ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_22.txt b/codex-rs/tui/frames/vbars/frame_22.txt new file mode 100644 index 0000000000..3b1ce4ecde --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_22.txt @@ -0,0 +1,17 @@ + + ▎▊▉▌▉▌▌▉▌▉▊▎ + ▎▉▋▉▏▋▎▋▏▋▍▏▏▌▏▉▋▉▉▎ + ▊▌▉▌▏▍▉▉▎ ▎█▉▍▉▉▉▎▎▉▊ + ▌▉▏▉▉█ ▊▊▏▏▏▎▉▍ + ▍▏▏▋█ ▊▎▋▏▌▏▋▋▌█▏ + ▍▏▉▋▎ ▊▏▋▏▌▍▋▎ ▍▏▍▌▏ + ▏▉▉▍▋ ▏▉▏▍▉▋█ ▏▏▋▏ + ▏▏▌▏▎ ▏▍▏▏▍▍ ▏▍▏█▏ + ▏▏▊█▊ ▉▏▌▌▌▌▌▌▉▉▎▍▉▏▎ ▍▊ ▎▏▌█ + ▍▏▌ ▉▎▍▍▊ ▋▊█▏▋▋▏ ▍▉▌▎█▏▊▊ ▋▍▌ + ▍▍▍▎▏ █████▉▉█▎ ▎▋▉▉▎▋▋▋█▊▎ + ▍▉▍▎▍▊ ▎▉▊█▏▊█ + ██▉▌ ▉▉▎ ▎▋▉▊█▉▎▋ + █▋▉▉▊█▉▏▌▌▉▌▌▋▌▉███▊▉ + █▏█▏▎▌▎▎▎▊▌▎▋▌▉▎ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_23.txt b/codex-rs/tui/frames/vbars/frame_23.txt new file mode 100644 index 0000000000..0b99396129 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_23.txt @@ -0,0 +1,17 @@ + + ▎▊▉▎▌▉▉▉▉▌▉▎▎ + ▎▌▏▉▏▍▎▊▎▌▌▊▏▎▏▉▏▉▎ + ▊█▉▏█▊▌▉▎ █▏▋▉▏▍▌▏▏▊ + ▋▌▏▉▌▋▎ ▎▌▌▍▏▏▌▍ + ▋▋▏▎▋█ ▊▋▊▊█▉▋▉▍▏▍ + ▊▍▏█▋▎ ▎▉▉▉██▋▉█▏▏▍▏▊ + ▎▏▏█▏ ▋▋▋▋ ▎▏▎ █ ▏█▉ + ▏▋▏ ▏ ▏█▏▊▎▍▊ ▏ ▉▋▏ + ▍█▍ ▏▉▏▌▌▌▌▌▌▌▌▏▎▉▏▎█▍▎ ▏ ▏▏▏ + ▏▍▍▎▏█▌█ ▋▎▍ ▍▏▎▍▊▏ ▍▎▏ + ▋█▏ ▏ ▎███████ █▎▋▌▌▏▎▋▍▋▎ + ▊▏▏▎▏▋ ▊▋▏▍▍▋▎ + ▍ ▏▊█▋▎▎ ▎▋█▌▉▋▉▋ + ▍▌▍▉▌▉▉▍▏▌▌▎▉▉█▊▎▉▉▎ + █▏ ▉▌▍▏▎▎▉▎▎▉▉▎ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_24.txt b/codex-rs/tui/frames/vbars/frame_24.txt new file mode 100644 index 0000000000..5e26d7a27b --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_24.txt @@ -0,0 +1,17 @@ + + ▎▏▎▌▉▉▉▌▌▊▎ + ▊█▎▋█▏▎▎▏▌▌▉▊▎█▉ + ▊██▌▍▋▉█▏ ▋▎▋▉▏▉▉▊ ▍ + ▊█▋▋▊▋▏▌▊▍▎▏▋▎ ▎▉▍▏▍▎█ + ▊ ▋▋▍▋▊ ▎██▋▍▎▏▎▎▍▏▊█ + ▏▊▍▉▍▎ ▉▊▊▋ ▋▏▌ ▋█▍ + ▏ ▏▏ ▊▋▎▊▋█▋▍▍▏▍▍▏▍ + ▏ ▍▏▏ ▏▊▌▋▍▎▏▏▎▋▋▎▏▏ + ▏▋ ▏▌▌▌▋▉▉▏▏▏▉▉▎▉▊▎▏ ▏ ▏▏ + ▎ ▋ ▉▏▋▊▊▌▌▊▊▏▋▍▍▉▉▏ ▏▉▏ + ▍ █▍▏▍▉██████▎ ▍▊▋▉▍▏▌▋▊▎ + ▍ ▍▊▉▍ ▏ █▋▌▋ + ▍▋▉▍▎▏▋ ▎▌█▎▋▋▎▉ + ▋▊▉▊▍▍█▏▏▋▌▌▌▏▍▎▋▎ + ▉▋▎▉▉▌▍▎▎▌▌▉▉ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_25.txt b/codex-rs/tui/frames/vbars/frame_25.txt new file mode 100644 index 0000000000..5009b8b66d --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_25.txt @@ -0,0 +1,17 @@ + + ▎▉▌▉▌▉▉▉▉▎ + ▊ ▉▊▉▎▎▌▍▏▉▏▏▊ + ▋▏▋▋▊▊█▋▏▉▍▌▍▏▏▏▎ + ▏▉▉▏ ▋ ▌▏ █▍▏▊▉▍▋ + ▊▎▎▍▊▋█▍▌▋▎▏█ ▏▋▋▍▋▉ + ▍▊▏▏▏▎▉▉▋▍▏▋ ▋▏▊▏▋▋▏▊ + ▏▋▏▉▏ ▏▎▎▋▍▎▋▏▍▋▎█▏▌▏ + ▏▏▏▋▏▋█ ▏▎▌▍▋▏▍▎▏▌▏▏▍ + ▍▉▍▏█▏▎▎▌▌▌▌▉▏▏▍▍▏▉▉▏▍ + ▋▊█▏▋▏▊▏▎▏▏▌▉▎▏▍▉▌▋▍▏ + ▍▏▉▋▍▏▎██████▉▋▏▍▏▋▏▎ + ▏▎█▏▌▉▌▍▊▊▉▋▎▋▊▋▋▏▋ + ▍▎▍▏▎▍▎▉▌▋▊▍▋▎▏▏▋ + ▍▋▌▍▍▎▉▌▏▉▉ ▉▏▉ + ▏▊█▉▍▉▊▎▉▏▉ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_26.txt b/codex-rs/tui/frames/vbars/frame_26.txt new file mode 100644 index 0000000000..900a51c3b5 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_26.txt @@ -0,0 +1,17 @@ + + ▎▌▉▉▉█▉▊ + ▋▉▏▌▋▍▏▉▌▏▊ + ▋▉██▏▌▍▏▍██▍▊ + ▌▉█▊▏▏▏▎▏▏▎▉▋▍ + ▏▎▊▍▏▋▏█▉▍▋▌▏▍▌ + ▍ █▏▋▋▋█▉▎▍█▍▍▋ + ▏ ▉█▌▏▏▋▏▏▌▌█▉ + ▋▊ ▍▏▏▏▍▍▌▏▏▋▏▏ + ▏ ▋▍▉▌▉▏▉▌▌▋▍▏▏ + ▋▎▏▋▊▏▎▎▊▉▍▍▉▏ + ▏▎█▋▏▉█▍▊▋▎▉▍▏▏ + ▍▎▏▏▋▍ ▋▋█▏▏▎ + ▉ ▉▏▍ ▍▎▋▏▋▊ + ▏█▉▍▍█▉▎▉▉▌ + ▍▋▋▍▉▏▎▍▉ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_27.txt b/codex-rs/tui/frames/vbars/frame_27.txt new file mode 100644 index 0000000000..0b2e8c7306 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_27.txt @@ -0,0 +1,17 @@ + + ▌▉▉▉▉▊ + ▏▌▋▋▏▋▍ + ▌█▎ ▉▏▋█▏ + ▏▏▏▍▏▏▌▏▏ + ▏ ▎▏▎▊█▌ + ▏▎▋▎█▎▏▏▏▎ + ▌ █▏▏▎▉▏▏ + ▏ ▎▏▏▏▌█▏▏ + ▏▋ ▋ ▏▉▏▏▏▏ + █▌ ▋█▎▏▎▉▏▏ + ▏▊ ▎▍▉▉▉▋█ + ▏▏▉▉▏▏▎▋▏ + ▏▌▌▉▌▊▋▏▍ + ▍▎▎▏▍▌▋▋ + █▍█ ▍▍▋ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_28.txt b/codex-rs/tui/frames/vbars/frame_28.txt new file mode 100644 index 0000000000..01ce82b6d3 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_28.txt @@ -0,0 +1,17 @@ + + ▋▉▉▌ + ▏▉▎▏▎ + ▌ ▌▏▎ + ▏▊▎▉▏ + ▏ ▏▏ + ▏ ▊█▏ + ▍▏▏ ▎▏ + ▏▊██▏ + ▋▍ ▎▏ + ▏▏▋▋▏▏ + ▏ ▎▏ + ▏▌▉▌▏ + ▏▌▉▏▏ + ▉▎▎▋▏ + ▏ ▋▉▏ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_29.txt b/codex-rs/tui/frames/vbars/frame_29.txt new file mode 100644 index 0000000000..c682a6082c --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_29.txt @@ -0,0 +1,17 @@ + + ▉▉▉▉▉▊ + ▊▏▉▋ ▉▍ + ▍▊▏▏ ██▏ + ▏▏▏▏▍▍▊▋ + ▍ ▏█▏ ▏ + ▏▊▏▏▏ ▎▎ + ▏▍▍▏▏▏ ▍ + ▏▏▌▏▏ + ▏▏▏▉▏ ▎ + ▎▏▌▏▏ ▎ + ▉▏▏▋▏▍ ▌ + ▏▋▏▏▏ ▎▏ + ▏▏▏▏▎▏▎▏ + ▏▌▏▉▋█▏█ + ▏▏▉ ▋▊ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_3.txt b/codex-rs/tui/frames/vbars/frame_3.txt new file mode 100644 index 0000000000..6c202bc0c3 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_3.txt @@ -0,0 +1,17 @@ + + ▎▋▌▌▉▉▌▌▌▌▊▎ + ▎▉▊▋▍▏▏▉▏█▌▌▏▌▎▍▏▉▉▎ + ▊▌▋▉▌▏▉██▎ ▎█▏ ▉▉▉▋▍▏▊ + ▋▉▋▍▏▌▊▉▎ ▎▌▉ ▏▏▍ + █▋▉▏▋▍▋▏▏▉▍▎ ▍▍▍▏▏▎ + ▋▏▍▍▋ ▋▊▏▍▌▍▍ ▏ ▍▍▏ + ▌▉ ▏ █▉▍▏▎█▏▊ ▋▉▋▏▊ + ▊▊▏▊▏ ▊▊▏█▋▍▏ ▏▎▏▌▏ + ▊██▏ ▌▏▉▉▏▏▉▊▏▌▉▉▎▎▎▉▉▎▏▍█▌▏ + ▊▍▋▍▊ ▋▋▉▋▌▌▏ ▏▉▏▎▎▊ ▌▋▊▌▍▎▏▍▏▎ + █▍▏ ▏ █▏▏▉▊█ █▉▉▉███▉▉▊▋▋▋▊▋ + █▉▏ ▍▉ ▎ ▋▍▉▍▋▋ + ▌▍▋▋▉▍▊ ▊▉▌▋█▊▏█ + ▌▍▉▊▎▉▉▍▌▌▌▌▊▋▌▉▌▎▎▉█ + ▎▉▉▉▎▋▏▎▎▎▎▏▌▋▍█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_30.txt b/codex-rs/tui/frames/vbars/frame_30.txt new file mode 100644 index 0000000000..a44dbb6ed0 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_30.txt @@ -0,0 +1,17 @@ + + ▎▌█▉▉▉▊ + ▎▋▌▏▏▍▉█▌▍ + ██▍▏▊▍▍▏▉▊▍ + ▏▏▍▏▋▏▎▍▏▍ ▍▊ + ▌▉▏▏▎▍▏▊▏▊ ▏ + ▏▉▏▍▉ ▉▏▏▏▏▋▏ + ▍▋▏▏▏▍▎ ▍▋▍▏ ▌▎ + █▏ █▉▌▏▊▏█▏▊ ▎ + █▏▎█▍▏▌▏▍▋▏▊ ▎ + █▏▏▍▏▎▎▏▏ ▉▊ ▎ + ▍▏▏▌▍▎▉▏▏▏▉▏▏ + ▏▉▋▋▊▋▉▍▏▏█ ▏ + ▍▏▍▏▏▋▉▏▏▊▏▋ + ▊▍▊▉▌▍▋▏▊▋█ + ▍▊▋▏▍▎▎▌█ + ▎▎▎▎ \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_31.txt b/codex-rs/tui/frames/vbars/frame_31.txt new file mode 100644 index 0000000000..70da8799e2 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_31.txt @@ -0,0 +1,17 @@ + + ▎▋▋▉▉▉▉▌▊ + ▎▉▉▌▉▊▎█▉▍█▉▊ + ▊▏▍▋▋▊▌▎▎▋█▏▎▉▍ + ▊▏▋▉▎▎▉▌▎▊▍▍▏▍▏▏▍ + ▍▏▏▏▏▉▊▉▍▎▊█▍▏▋▎▎ + ▌▏▍▎▏▎▏██▍▌▉▊▋▋▏▊█▏ + ▋▏▏ ▏▍▉▏▍▋▌▋▌▉▏▉▏▋▏ + ▍▍▊ ▏▏█▏▍ ▏▍██▏▏▍▋▏ + ▏▍▊▎▏█▍▏▏▏▋▉▏▏▏▎ ▏ + █▏▏▏▋▋▏▏▎▎▎▍▎▏▍▏▏ ▉ + ▍▉▎▋▉▏▊ ▋▉▉▉▎▋▏█▏▎ + ▏▏▏▍▍▍▊ ▎▌▉ ▏ + ▌▏▉▌▎ ▊ ▋ ▏▉▎▋▎ + ▋▏▍▏▋▎▏▎▊▏█▊▏▎ + ██▌▏▎▉▉▋▋▌▉ + ▎▎▎▎ \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_32.txt b/codex-rs/tui/frames/vbars/frame_32.txt new file mode 100644 index 0000000000..ddfb4be3fe --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_32.txt @@ -0,0 +1,17 @@ + + ▊▉▉▉▉▌▌▏▊▎ + ▌▉▏▉▉▏▍▏▏▉▉▏▏▊ + ▋▍▉▌▍▊▉▍▋▊▎▉▏▉▍█▉▊ + █▋▋▏▎▊▎▌▊ ▊ ▊▎▍▏▉▊ ▊ + ▋▋▏▊▏▉▍█▉▏▌ █▎▊▏▍▋▍▉▍▊ + ▍▋▍▍▊▍▉▏▎▋▏▏▉▎ ▏▉▋ ▉ + ▉▏█▌▊▎█▍▏▏▊▊▏▊▌▎▋▎▋▋▏█▎ + ▏▏▏▊▎ █▎▏▏█▋█▏▌▊▎█▍▏██▎ + ▍▏▏▊▎ █▎▏█▎▎▏▉▉▉▏▏▏▌▏█▌▎ + ███▎▎▏▉▍█▍▎▎▎▎▎▏▏▉▏▌▏▊▎ + ▊▍▉▏▏▋ ▏▉██▉▉▉▍▌▋▋▋▋▋ + ▍▊▏▍▍▍ ▊▍▏▋█▏ + █▉▉▏▏▏▉▎ ▎▋▎▏▋ ▊ + ▍▊▍█▏▉▏▌▌▉▎▎▉█▎▋ + ▏▌▌▎▎▊▉▋▉▎██ + ▎▎▎ \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_33.txt b/codex-rs/tui/frames/vbars/frame_33.txt new file mode 100644 index 0000000000..7fa5ac29bc --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_33.txt @@ -0,0 +1,17 @@ + + ▎▊▉▌▉▌▉▌▏▋▎ + ▎▉▉▏▏▍▉▌▏▋▏▊▏▉▏▉▋ + ▎▋▍▏▉▉▉▊▌█▎ █▉▋▏▏▉█▊ + ▊▍▋▏▋▎▏▊▎ ▉▏▏▍▎▉ + ▎▋▏▋▎▏▏▋▍▍▍ ▏▉▍▍▍ + ▋▋▊ ▍▎▍▍▎▍▊ ▋▍▋▎▍ + ▏▏▉ ▍▊▉▏▎▏▍ ▏▉▏▏ + ▉▏▊▊ ▊██▍▋▌▊ ▍█▏▉ + ▏▏▏ ▏ ▊▎ ▋▉▊▊▊▌▌▌▉▏▏▉▋▎▏▍▏ + ▍▋▏██▋▋▊▋▎▏▏▎▎▎▎▎▏▏▉▍▍▍▏▏▋ + ▍▌▍▊ ▏▋▏▋ ▋ ████▉▉▉ ▏▏▊▋▍▎ + ▍▉▍▉▊█▊ ▋▋▌▋▌▋ + ▉▍█▉▊▉▌▊ ▎▉▏▊▋▉▍█ + ▍▏█▉▍▉▏▊▌▉▎█▌▊▍▉▏▉ + █▌▌▉▊▎▎▎▍▉▉▌▊█ + ▎▎▎▎ \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_34.txt b/codex-rs/tui/frames/vbars/frame_34.txt new file mode 100644 index 0000000000..a8c447ff18 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_34.txt @@ -0,0 +1,17 @@ + + ▎▊▌▉▉▉▉▌▏▊▎ + ▎▉▉▉▋▍▌▏█▏▉▉▌▉▉▌▊▌▎ + ▎▋▋▊▏▉█▋▏▉▎ ▎▍▍▍▊█▉▉▊ + ▊▋▎▏▉▎▋▊▎ ▉▏▊▉▍▍ + ▋▋▏▍▊▋▏ ▏█ ▊ ▍▍▉▍▍ + ▊▋▍▏▎▋ ▍▍█▏▍▉▍ ▍▊▍▏▍ + ▏▉▍▏▎ █▍▎▉▏▎▍ ▏▌▏▎ + ▍▏▌█▋ ▏▉▎▏▋█▏ ▋ ▎▍ + ▊█▋▋█ ▋▍▋▋█▎▌▌▉▉▉▉▉▉▏▎▎█ ▏▍▎ + ▏▏▍▊▋▊▊▍█▋▋█▏▏▏▎▏▋▎▎▎▊▋▎▏▏▎▏▍ + ▋▎▍▊ ▏▍▏▉▍ █▉▉▎▎▎▎▍ ▊▋▊▍▏█ + ▋▊▍▌▌▍▎ ▋▌▋▏▋█ + ▍▉▎▏▉▍▌▊ ▎▉▌█▎▋▊▎ + ▊▍▋▏█▏▉▊▌▊▉▌▉▌▉▎▉▉▋█ + █▏▍▌▌▎▎▎▎▎▌▌▉▌▍ + ▎▎▎ \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_35.txt b/codex-rs/tui/frames/vbars/frame_35.txt new file mode 100644 index 0000000000..ba905231e1 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_35.txt @@ -0,0 +1,17 @@ + + ▎▊▉▌▌▉▉▉▌▉▊▎ + ▊▉▌▉▋▏▉▉▉█▏▉▏▋█▏▉▌▎ + ▎▋▋▏▌▉▉▏▍▉█▎ ▎█▉▌▉▋█▏▉▊ + ▊▋▋▉▋▊▌▊▎ ▉▉▎▍▏▎ + ▋▋▏▏▋▋▍ █▍▉▊ ▏▍▉▏▊ + ▌▋▌▋▉▎ █▏▎█▋▋▉▎ ▏▍▍▏ + ▍ ▋▋ ▍▍ █▉▎▋ ▏▍▍▍ + ▏▏▏▋ ▋▍▍▌▋█ ▋ █▋ + ▋ ▊▎ ▊▏▏▋▌█▋▏▌▌▎▌▎▌▉▏▏ ▏▏▌▉ + ▏▊▍▌█ ▋▋▌█▉▉▋▏▌ ▍▊▎▎▎▎▋█▏▋█ ▏█ + ▋▎▍▊█▋▍▎▏▋▍▎ ▎█▍▍▍▍▉▍▍▉▋▋▎▊▏ + █▋▍▍▋▏ ▎▋▉ ▊▍ + ▍▌▎▍▌▊▋▊ ▊▌▋▎▉▉█ + █▍▎█▏▉▏▊▋▏▏▉▏▌▋▉█▎▋▌█ + █▍▏▌▌▎▎▋▎▎▉▉▉█▍ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_36.txt b/codex-rs/tui/frames/vbars/frame_36.txt new file mode 100644 index 0000000000..246ed3d692 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_36.txt @@ -0,0 +1,17 @@ + + ▎▎▉▌▉▉▉▉▌▉▊▎ + ▎▌██▍▉▋▌▋▉▍▉▌▉▉█▉▉▉▎ + ▊▍█▍▊▉▉▊▉█▎▎ ▎█▉▏▉▉▏▊▉▏▊ + ▎▏█▉▉▎▎▎▎ █▉▏▍█▏ + ▊▋▎▌▍█▏▍▎▍▊▋ ▍▍▋▉ + ▋ ▊▋▎ ▉▎ █▏▋▊ █▍▍▉ + ▏ ▌ ▎ ▍ █▍▍ ▏▍▏▊ + ▏▏▍▏ ▎▍ ▎▋▋ ▍▏ ▏ + ▏██▏ ▋▋ ▊▉██▊▉▉▎▉▉▉▉▉▎ ▏▍▏▏ + ▎▉▏▍ ▊▏▎▎▋▏▋ ▎▏▎▎▎▎▎▎▎▏▏ ▍▋█▎ + █ ▉▏▍ ▉▎▉▋▍ █▉▉▍▍▍▍▍█ ▏▊█▋ + █▊█▍▌▋ ▊▋▏█▋ + ▍▋▏▏▉▏▊ ▊▉▉█▋▊▎ + ▉▊▎█▉▉▌▍▌▏▎▉▏▌█▊█▊▌▉█ + ▎▉▉▋▏▎▊▊▎▊▊▉▉▉▉█ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_4.txt b/codex-rs/tui/frames/vbars/frame_4.txt new file mode 100644 index 0000000000..5dcae750bc --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_4.txt @@ -0,0 +1,17 @@ + + ▎▋▌▌▉▌▌▉▌▉▊▎ + ▎▊█▉▉▏▋ ▏▍▌▋▉▌▏█▋▉▊▎ + ▊▉▌▏▏▏▉▉█▎ ▎▍▏▍▍▉▏▋▍▍▎ + ▋▋▏▊▏█▋▉▊ █▏▉▉▍▉▍ + ▋▏▋▎▏▌▏▍▌▍▏▊ ▍█▍▏▉▍ + ▋▏▏▍▏ █▎▏▏▋▉▍ █ ▍▌▏▊ + █▍▏▌▎ █▉▉▍▉█▏▊ ▊ █▌▏ + ▏▋▍ ▊▏▋▉▍▏▏ ▏▏▏ + ▎▏ ▏▎ ▌▏▋█▍▋▋▉▏▉▉▉▎▎▎▎▊▊ ▏▏▉ + ▏▍▋ ▏ ▊▋▋▋▊▎▏▎▌▍▏▊▋▎▊▋▋▍▌▏▋▋█▏ + ▎▏▌█▍▊▍▍▊▍▋ █▉▉▉▉▉▉▉█▍▊▏▏▏▎ + ▊▏▍█▏▎▎ ▊▍▌▋▉▉█ + ▍▍▊▋▍ ▊▎ ▎▋▍▊▉▌▏▋ + ▏▏▏▌▎▉▉▍▌▌▌▌▊▉▌▉▉▍▏▉▎ + ▉▍▍▏▋▏▎▎▎▎▎▌▊▉▎ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_5.txt b/codex-rs/tui/frames/vbars/frame_5.txt new file mode 100644 index 0000000000..cab16091cb --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_5.txt @@ -0,0 +1,17 @@ + + ▎▋▌▌▌▉▌▌▌▉▊▎ + ▎▉█▉▋▉▋▏▏▉▏▌▉▌▎▏█▉▊ + ▉▎▋▍▉▏▉█▎ █▍▌▏▉▍ ▊▉▊ + ▊▏▋▏▋▏▋▌▊ ▊▍▏▏▏▏▎ + ▊▍▋▉▋▍▎▉▏▎▍▊ ▎ ▍▏▍▏▎ + ▏▏▏▏▋ ▍▎▏▍▌▋▏▎ ▉▋▏▏ + ▏▋▏ ▉ ▎▍▎▏▍█▏▊ ██▏▉▏▊ + ▏▋▏▎█ ▊▎▌▏▋▎▏ ▉▏▎▏ + ▏▊▏▍▉ ▋▎▏█▊▏▉▌▎▏▉▏▎▎▎▉▊▎█▏▋▏ + ▎▍▏▍▊▊▋▉▉█ ▏█ ▋▋▍▌▍▊▌▋▊▋▏▋▉▏▎ + ▍▊▏▏▊▏▊▍▍▋▉▎ █▉▉█████▊▏▌▏▍▋ + ▍▍▉▋▍▍ ▎ ▋▎▋▉▊▍ + ▍▋▉▍▏▌▉▎ ▎▌▉▊▉█▌▉ + ▍▏▉▏▊▉▉▍▌▏▌▎▊▉▌▉▍▏▌▉ + ▍▊▉▎▉█▎▎▎▊▎▊▉▉▎ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_6.txt b/codex-rs/tui/frames/vbars/frame_6.txt new file mode 100644 index 0000000000..e41e013ab0 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_6.txt @@ -0,0 +1,17 @@ + + ▎▋▌▌▌▉▌▌▉▉▎▎ + ▊▍▌▋▉▏▌▉▉▏▉▉▌▎▊▉▉▎ + ▊▊▊▏▏▏▉█ ▎█▏▋▌▉▉▉▋▍▎ + ▋▊▏▉▏▉▎▌▊ ▍▉▏▏▏▏▊ + █▌▏▏▏▉▍▍▉▉▍ ▋▍▍▏▍▊ + ▌▊▋▏▋▎▍▉▌▏▍▎▏▊ ▋▌▍▋▏ + ▎ ▉▏▏ ▍▍▏▋▍▍ ▍▉▏▎▏ + ▏ ▏▏▏ ▎▏▌▏▋▏▏ ▏▉▍▏▏ + ▎▋▏▊▏ ▋█▏▏▉▌▋▉▎▏▉▏▎▎▉▉▎▋▍▋▏ + ▏▏▍▊▋▎▍▎▌▉ ▏▋▌▉▊▏▏▊▌▌▌▍▏▊▏▍ + ▋ ▏ ▋▏▏▏▌▋█ █▉████▉█▎▍▍▋▏ + ▊ ▌ ▋▊▎ ▊▋▎▋▋▏▎ + ▋▎▍▎▉▉▊ ▎▉▍▎▋▉▊▉ + ▎█▏▉▊█▉ ▌▏▎▎▊▉▉▉ ▋▌█ + ▍▊▌▉▉▊▎▎▎▎▎▊▉▉ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_7.txt b/codex-rs/tui/frames/vbars/frame_7.txt new file mode 100644 index 0000000000..7a88d5ef14 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_7.txt @@ -0,0 +1,17 @@ + + ▎▋▏▌▉▉▌▌▉▊▎ + ▊▉▎▉▍▏▉▉▉▌▌▍▌ ▎▉▊ + ▉ ▊▏▏▏▉▎ ▎▍▏▎ ▉▋▎▉▊ + ▍▍▏▏▏▏▌▉ ▍▏▍▉▏▋▊ + ▎█▏▉▏▏▍▏▋▍▊ ▋ ▉▏▏▍ + ▏ ▌▏▏█ ▎█▍▌▏▍ ▊▊▏▏▏ + ▎▍█▏ ▍▎▏▍▏▍▏ ▉▉▍▏▏ + ▎█▋▏▏ ▌▉▋▏▉▏▎ █ ▏▏▏ + ▋█▏▉ ▊█▎▋▏▍▋▏▏▌▌▎▏▏▌▌▉▍▏▏ + ▏▊█▏▏▌▋▏▏▋█▏▋▍▏▏▍▍▊▌▊▌▍▏▍▏ + ▍ ▌▍▋▉▏▉▎▋ ▉▉▉▉▉▉██▎▋▏▏ + █▎ ▋▎▋▎▎ ▊█▊▋▌▋█ + █▌▊▉▍▍▍▎ ▊▍▏▊▉▋▉█ + ▍▎█▍▏▉▍▌▏▎▎▎▉▉▏▉▉▋ + █▏▉█▏▋▏▎▎▊▎▌▉▉ + \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_8.txt b/codex-rs/tui/frames/vbars/frame_8.txt new file mode 100644 index 0000000000..bbf2016fab --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_8.txt @@ -0,0 +1,17 @@ + + ▎▎▉▎▌▉▉▌▉▊▎ + ▊█▉▋▏▏▏▉▌▌ ▏ █▉ + ▎▏▌▊▏▋▋▉ ▊█▏▋▏▉▍▉▍▊ + ▎▉▍▉▋▏▊▉▏ █ ▌▍▏▏▍ + █ ▋▏▋▊▍▏▋▍ ▋█▍▏▏▊ + ▏█▊▏▍▍▍▎▍▏▎▉ ▍▉▏▏▏ + ▏▉▏▏▏ █▎▌▍▏▎▏ ▏▍▏▋▏▊ + ▍▊▏▏▋ ▏▉▍▋▏▊▉▋ ▋▎▋▏▏ + ▍ ▍▏▏▎▍ ▋▉▌▏▏▋▉▊▉▊▊▍▏▏▏ + ▍▉▋▌▎▏█▊▏▊▏▏▌▏▌▎▎▏▏▌█ + ▋▋▍▍▏▍▏▏▏▋█▍▉▍▉█▍▉█▋▍▏ + █▊█▏▍▏▎▎ ▋▊▋▋▋█ + █▍▎▉▍▍▍▎ ▎▋▍▎▏▉▋▉ + ▋▋█▏▊▉ ▌▌▉▉▌▋▌▊▏▎ + ▏▏▎▉▉▍▏▎▊▉▋▌▎ + ▎▎ \ No newline at end of file diff --git a/codex-rs/tui/frames/vbars/frame_9.txt b/codex-rs/tui/frames/vbars/frame_9.txt new file mode 100644 index 0000000000..4e36e6e126 --- /dev/null +++ b/codex-rs/tui/frames/vbars/frame_9.txt @@ -0,0 +1,17 @@ + + ▋▌▍▉▋▉▉▌▊ + ▋▉▎▋▏▏▉█▌ ▎▊▍▎ + ▋ ▊▏▏▋▉▍▍▌▋ ▍▎▏▊ + █ ▏▏▋▌▌▎ ▎▍▊▏▍▍▏▉▊ + ▋▉█▌▍▉█▏▉▊ ▉▋█▉▋▉▏▏ + ▏ ▏▏▏█▍▏▍▌▎▎ ▏█▏▉▏▏▏ + ▎ ▏▉▍▏▉▉▏▍▍▊█▋▊▋ ▎▏▏ + ▏ ▏▋▎▊▍▏▏▏▎▋▌▍▎▏ ▏▏ + █▊▏█ ▋▏█▏▏▏▏▉▏▏▊▏▏▎ + ▏▎▏▏▏▎▊▏▍▏▎▏▏▏▏▎▎▏▏▏ + █ ▎▍▋▍▍▏▋█▉▉▉▉▏▏█▋▍▏ + ▍▏▏▏▍▊▎ ▊▋ ▍▋▏▎ + ▍▉▍▏▍▍ ▋▌▎▌▏▋▉ + ▍▊█▍▎▏▉▋▉▌▌▌▉▏▎ + █▊▎ ▉▍▍▏▌▉▋█ + \ No newline at end of file diff --git a/codex-rs/tui/src/new_model_popup.rs b/codex-rs/tui/src/new_model_popup.rs index cd4ba83db8..b5b63d3cc8 100644 --- a/codex-rs/tui/src/new_model_popup.rs +++ b/codex-rs/tui/src/new_model_popup.rs @@ -23,49 +23,56 @@ use tokio_stream::StreamExt; macro_rules! frames_for { ($dir:literal) => { [ - include_str!(concat!("../frames/", $dir, "/frame_000.txt")), - include_str!(concat!("../frames/", $dir, "/frame_004.txt")), - include_str!(concat!("../frames/", $dir, "/frame_008.txt")), - include_str!(concat!("../frames/", $dir, "/frame_012.txt")), - include_str!(concat!("../frames/", $dir, "/frame_016.txt")), - include_str!(concat!("../frames/", $dir, "/frame_020.txt")), - include_str!(concat!("../frames/", $dir, "/frame_024.txt")), - include_str!(concat!("../frames/", $dir, "/frame_028.txt")), - include_str!(concat!("../frames/", $dir, "/frame_032.txt")), - include_str!(concat!("../frames/", $dir, "/frame_036.txt")), - include_str!(concat!("../frames/", $dir, "/frame_040.txt")), - include_str!(concat!("../frames/", $dir, "/frame_044.txt")), - include_str!(concat!("../frames/", $dir, "/frame_048.txt")), - include_str!(concat!("../frames/", $dir, "/frame_052.txt")), - include_str!(concat!("../frames/", $dir, "/frame_056.txt")), - include_str!(concat!("../frames/", $dir, "/frame_060.txt")), - include_str!(concat!("../frames/", $dir, "/frame_064.txt")), - include_str!(concat!("../frames/", $dir, "/frame_068.txt")), - include_str!(concat!("../frames/", $dir, "/frame_072.txt")), - include_str!(concat!("../frames/", $dir, "/frame_076.txt")), - include_str!(concat!("../frames/", $dir, "/frame_080.txt")), - include_str!(concat!("../frames/", $dir, "/frame_084.txt")), - include_str!(concat!("../frames/", $dir, "/frame_088.txt")), - include_str!(concat!("../frames/", $dir, "/frame_092.txt")), - include_str!(concat!("../frames/", $dir, "/frame_096.txt")), - include_str!(concat!("../frames/", $dir, "/frame_100.txt")), - include_str!(concat!("../frames/", $dir, "/frame_104.txt")), - include_str!(concat!("../frames/", $dir, "/frame_108.txt")), - include_str!(concat!("../frames/", $dir, "/frame_112.txt")), + include_str!(concat!("../frames/", $dir, "/frame_1.txt")), + include_str!(concat!("../frames/", $dir, "/frame_2.txt")), + include_str!(concat!("../frames/", $dir, "/frame_3.txt")), + include_str!(concat!("../frames/", $dir, "/frame_4.txt")), + include_str!(concat!("../frames/", $dir, "/frame_5.txt")), + include_str!(concat!("../frames/", $dir, "/frame_6.txt")), + include_str!(concat!("../frames/", $dir, "/frame_7.txt")), + include_str!(concat!("../frames/", $dir, "/frame_8.txt")), + include_str!(concat!("../frames/", $dir, "/frame_9.txt")), + include_str!(concat!("../frames/", $dir, "/frame_10.txt")), + include_str!(concat!("../frames/", $dir, "/frame_11.txt")), + include_str!(concat!("../frames/", $dir, "/frame_12.txt")), + include_str!(concat!("../frames/", $dir, "/frame_13.txt")), + include_str!(concat!("../frames/", $dir, "/frame_14.txt")), + include_str!(concat!("../frames/", $dir, "/frame_15.txt")), + include_str!(concat!("../frames/", $dir, "/frame_16.txt")), + include_str!(concat!("../frames/", $dir, "/frame_17.txt")), + include_str!(concat!("../frames/", $dir, "/frame_18.txt")), + include_str!(concat!("../frames/", $dir, "/frame_19.txt")), + include_str!(concat!("../frames/", $dir, "/frame_20.txt")), + include_str!(concat!("../frames/", $dir, "/frame_21.txt")), + include_str!(concat!("../frames/", $dir, "/frame_22.txt")), + include_str!(concat!("../frames/", $dir, "/frame_23.txt")), + include_str!(concat!("../frames/", $dir, "/frame_24.txt")), + include_str!(concat!("../frames/", $dir, "/frame_25.txt")), + include_str!(concat!("../frames/", $dir, "/frame_26.txt")), + include_str!(concat!("../frames/", $dir, "/frame_27.txt")), + include_str!(concat!("../frames/", $dir, "/frame_28.txt")), + include_str!(concat!("../frames/", $dir, "/frame_29.txt")), + include_str!(concat!("../frames/", $dir, "/frame_30.txt")), + include_str!(concat!("../frames/", $dir, "/frame_31.txt")), + include_str!(concat!("../frames/", $dir, "/frame_32.txt")), + include_str!(concat!("../frames/", $dir, "/frame_33.txt")), + include_str!(concat!("../frames/", $dir, "/frame_34.txt")), + include_str!(concat!("../frames/", $dir, "/frame_35.txt")), + include_str!(concat!("../frames/", $dir, "/frame_36.txt")), ] }; } -const FRAMES_DEFAULT: [&str; 29] = frames_for!("default"); -const FRAMES_CODEX: [&str; 29] = frames_for!("codex"); -const FRAMES_OPENAI: [&str; 29] = frames_for!("openai"); -const FRAMES_BLOCKS: [&str; 29] = frames_for!("blocks"); -const FRAMES_DOTS: [&str; 29] = frames_for!("dots"); -const FRAMES_HASH: [&str; 29] = frames_for!("hash"); -const FRAMES_HBARS: [&str; 29] = frames_for!("hbars"); -const FRAMES_VBARS: [&str; 29] = frames_for!("vbars"); -const FRAMES_SHAPES: [&str; 29] = frames_for!("shapes"); -const FRAMES_SLUG: [&str; 29] = frames_for!("slug"); +const FRAMES_DEFAULT: [&str; 36] = frames_for!("default"); +const FRAMES_CODEX: [&str; 36] = frames_for!("codex"); +const FRAMES_OPENAI: [&str; 36] = frames_for!("openai"); +const FRAMES_BLOCKS: [&str; 36] = frames_for!("blocks"); +const FRAMES_DOTS: [&str; 36] = frames_for!("dots"); +const FRAMES_HASH: [&str; 36] = frames_for!("hash"); +const FRAMES_HBARS: [&str; 36] = frames_for!("hbars"); +const FRAMES_VBARS: [&str; 36] = frames_for!("vbars"); +const FRAMES_SHAPES: [&str; 36] = frames_for!("shapes"); +const FRAMES_SLUG: [&str; 36] = frames_for!("slug"); const VARIANTS: &[&[&str]] = &[ &FRAMES_DEFAULT, From 50262a44cee29b0d277855e84abcafc286374713 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Mon, 15 Sep 2025 01:24:30 -0400 Subject: [PATCH 54/77] Show abort in the resume (#3629) Show abort error when resuming a session --- codex-rs/core/src/rollout/policy.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codex-rs/core/src/rollout/policy.rs b/codex-rs/core/src/rollout/policy.rs index f46fa7cab5..0d8fee92b0 100644 --- a/codex-rs/core/src/rollout/policy.rs +++ b/codex-rs/core/src/rollout/policy.rs @@ -40,7 +40,8 @@ pub(crate) fn should_persist_event_msg(ev: &EventMsg) -> bool { | EventMsg::AgentReasoningRawContent(_) | EventMsg::TokenCount(_) | EventMsg::EnteredReviewMode(_) - | EventMsg::ExitedReviewMode(_) => true, + | EventMsg::ExitedReviewMode(_) + | EventMsg::TurnAborted(_) => true, EventMsg::Error(_) | EventMsg::TaskStarted(_) | EventMsg::TaskComplete(_) @@ -67,7 +68,6 @@ pub(crate) fn should_persist_event_msg(ev: &EventMsg) -> bool { | EventMsg::McpListToolsResponse(_) | EventMsg::ListCustomPromptsResponse(_) | EventMsg::PlanUpdate(_) - | EventMsg::TurnAborted(_) | EventMsg::ShutdownComplete | EventMsg::ConversationPath(_) => false, } From 6039f8a126156f9c6c901fe5d93c051f6ac3e6ce Mon Sep 17 00:00:00 2001 From: Thibault Sottiaux Date: Sun, 14 Sep 2025 23:05:41 -0700 Subject: [PATCH 55/77] feat: tighten preset filter, tame storage load logs, enable rollout prompt by default (#3628) Summary - common: use exact equality for Swiftfox exclusion to avoid hiding future slugs that merely contain the substring - core: treat missing internal_storage.json as expected (debug), warn only on real IO/parse errors - tui: drop DEBUG_HIGH gate; always consider showing rollout prompt, but suppress under ApiKey auth mode --- codex-rs/common/src/model_presets.rs | 2 +- codex-rs/core/src/internal_storage.rs | 10 +++++++++- codex-rs/tui/src/lib.rs | 19 ------------------- 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/codex-rs/common/src/model_presets.rs b/codex-rs/common/src/model_presets.rs index 09d9277784..5353a5c341 100644 --- a/codex-rs/common/src/model_presets.rs +++ b/codex-rs/common/src/model_presets.rs @@ -74,7 +74,7 @@ pub fn builtin_model_presets(auth_mode: Option) -> Vec { Some(AuthMode::ApiKey) => PRESETS .iter() .copied() - .filter(|p| !p.model.contains(SWIFTFOX_MEDIUM_MODEL)) + .filter(|p| p.model != SWIFTFOX_MEDIUM_MODEL) .collect(), _ => PRESETS.to_vec(), } diff --git a/codex-rs/core/src/internal_storage.rs b/codex-rs/core/src/internal_storage.rs index d6f71ff676..81a60fbce7 100644 --- a/codex-rs/core/src/internal_storage.rs +++ b/codex-rs/core/src/internal_storage.rs @@ -1,6 +1,7 @@ use anyhow::Context; use serde::Deserialize; use serde::Serialize; +use std::io::ErrorKind; use std::path::Path; use std::path::PathBuf; @@ -31,7 +32,14 @@ impl InternalStorage { } }, Err(error) => { - tracing::warn!("failed to read internal storage: {error:?}"); + if error.kind() == ErrorKind::NotFound { + tracing::debug!( + "internal storage not found at {}; initializing defaults", + storage_path.display() + ); + } else { + tracing::warn!("failed to read internal storage: {error:?}"); + } Self::empty(storage_path) } } diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 0f51cb22ef..27faef180f 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -527,13 +527,8 @@ fn should_show_model_rollout_prompt( swiftfox_model_prompt_seen: bool, ) -> bool { let login_status = get_login_status(config); - // TODO(jif) drop. - let debug_high_enabled = std::env::var("DEBUG_HIGH") - .map(|v| v.eq_ignore_ascii_case("1")) - .unwrap_or(false); active_profile.is_none() - && debug_high_enabled && cli.model.is_none() && !swiftfox_model_prompt_seen && config.model_provider.requires_openai_auth @@ -551,21 +546,7 @@ mod tests { use codex_core::auth::write_auth_json; use codex_core::token_data::IdTokenInfo; use codex_core::token_data::TokenData; - use std::sync::Once; - - fn enable_debug_high_env() { - static DEBUG_HIGH_ONCE: Once = Once::new(); - DEBUG_HIGH_ONCE.call_once(|| { - // SAFETY: Tests run in a controlled environment and require this env variable to - // opt into the GPT-5 High rollout prompt gating. We only set it once. - unsafe { - std::env::set_var("DEBUG_HIGH", "1"); - } - }); - } - fn make_config() -> Config { - enable_debug_high_env(); // Create a unique CODEX_HOME per test to isolate auth.json writes. let mut codex_home = std::env::temp_dir(); let unique_suffix = format!( From 2d52e3b40a07d69ec90bd7c7909184a22d370c62 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Mon, 15 Sep 2025 02:16:17 -0400 Subject: [PATCH 56/77] Fix codex resume so flags (cd, model, search, etc.) still work (#3625) Bug: now we can add flags/config values only before resume. `codex -m gpt-5 resume` works However, `codex resume -m gpt-5` should also work. This PR is following this [approach](https://stackoverflow.com/questions/76408952/rust-clap-re-use-same-arguments-in-different-subcommand) in doing so. I didn't convert those flags to global because we have `codex login` that shouldn't expect them. --- codex-rs/cli/src/main.rs | 224 +++++++++++++++++++++++++++++++++++++-- codex-rs/tui/src/cli.rs | 1 + 2 files changed, 214 insertions(+), 11 deletions(-) diff --git a/codex-rs/cli/src/main.rs b/codex-rs/cli/src/main.rs index 7e4e6fcccf..7ce98a3937 100644 --- a/codex-rs/cli/src/main.rs +++ b/codex-rs/cli/src/main.rs @@ -101,6 +101,9 @@ struct ResumeCommand { /// Continue the most recent session without showing the picker. #[arg(long = "last", default_value_t = false, conflicts_with = "session_id")] last: bool, + + #[clap(flatten)] + config_overrides: TuiCli, } #[derive(Debug, Parser)] @@ -190,18 +193,17 @@ async fn cli_main(codex_linux_sandbox_exe: Option) -> anyhow::Result<() prepend_config_flags(&mut mcp_cli.config_overrides, root_config_overrides.clone()); mcp_cli.run(codex_linux_sandbox_exe).await?; } - Some(Subcommand::Resume(ResumeCommand { session_id, last })) => { - // Start with the parsed interactive CLI so resume shares the same - // configuration surface area as `codex` without additional flags. - let resume_session_id = session_id; - interactive.resume_picker = resume_session_id.is_none() && !last; - interactive.resume_last = last; - interactive.resume_session_id = resume_session_id; - - // Propagate any root-level config overrides (e.g. `-c key=value`). - prepend_config_flags( - &mut interactive.config_overrides, + Some(Subcommand::Resume(ResumeCommand { + session_id, + last, + config_overrides, + })) => { + interactive = finalize_resume_interactive( + interactive, root_config_overrides.clone(), + session_id, + last, + config_overrides, ); codex_tui::run_main(interactive, codex_linux_sandbox_exe).await?; } @@ -290,8 +292,208 @@ fn prepend_config_flags( .splice(0..0, cli_config_overrides.raw_overrides); } +/// Build the final `TuiCli` for a `codex resume` invocation. +fn finalize_resume_interactive( + mut interactive: TuiCli, + root_config_overrides: CliConfigOverrides, + session_id: Option, + last: bool, + resume_cli: TuiCli, +) -> TuiCli { + // Start with the parsed interactive CLI so resume shares the same + // configuration surface area as `codex` without additional flags. + let resume_session_id = session_id; + interactive.resume_picker = resume_session_id.is_none() && !last; + interactive.resume_last = last; + interactive.resume_session_id = resume_session_id; + + // Merge resume-scoped flags and overrides with highest precedence. + merge_resume_cli_flags(&mut interactive, resume_cli); + + // Propagate any root-level config overrides (e.g. `-c key=value`). + prepend_config_flags(&mut interactive.config_overrides, root_config_overrides); + + interactive +} + +/// Merge flags provided to `codex resume` so they take precedence over any +/// root-level flags. Only overrides fields explicitly set on the resume-scoped +/// CLI. Also appends `-c key=value` overrides with highest precedence. +fn merge_resume_cli_flags(interactive: &mut TuiCli, resume_cli: TuiCli) { + if let Some(model) = resume_cli.model { + interactive.model = Some(model); + } + if resume_cli.oss { + interactive.oss = true; + } + if let Some(profile) = resume_cli.config_profile { + interactive.config_profile = Some(profile); + } + if let Some(sandbox) = resume_cli.sandbox_mode { + interactive.sandbox_mode = Some(sandbox); + } + if let Some(approval) = resume_cli.approval_policy { + interactive.approval_policy = Some(approval); + } + if resume_cli.full_auto { + interactive.full_auto = true; + } + if resume_cli.dangerously_bypass_approvals_and_sandbox { + interactive.dangerously_bypass_approvals_and_sandbox = true; + } + if let Some(cwd) = resume_cli.cwd { + interactive.cwd = Some(cwd); + } + if resume_cli.web_search { + interactive.web_search = true; + } + if !resume_cli.images.is_empty() { + interactive.images = resume_cli.images; + } + if let Some(prompt) = resume_cli.prompt { + interactive.prompt = Some(prompt); + } + + interactive + .config_overrides + .raw_overrides + .extend(resume_cli.config_overrides.raw_overrides); +} + fn print_completion(cmd: CompletionCommand) { let mut app = MultitoolCli::command(); let name = "codex"; generate(cmd.shell, &mut app, name, &mut std::io::stdout()); } + +#[cfg(test)] +mod tests { + use super::*; + + fn finalize_from_args(args: &[&str]) -> TuiCli { + let cli = MultitoolCli::try_parse_from(args).expect("parse"); + let MultitoolCli { + interactive, + config_overrides: root_overrides, + subcommand, + } = cli; + + let Subcommand::Resume(ResumeCommand { + session_id, + last, + config_overrides: resume_cli, + }) = subcommand.expect("resume present") + else { + unreachable!() + }; + + finalize_resume_interactive(interactive, root_overrides, session_id, last, resume_cli) + } + + #[test] + fn resume_model_flag_applies_when_no_root_flags() { + let interactive = finalize_from_args(["codex", "resume", "-m", "gpt-5-test"].as_ref()); + + assert_eq!(interactive.model.as_deref(), Some("gpt-5-test")); + assert!(interactive.resume_picker); + assert!(!interactive.resume_last); + assert_eq!(interactive.resume_session_id, None); + } + + #[test] + fn resume_picker_logic_none_and_not_last() { + let interactive = finalize_from_args(["codex", "resume"].as_ref()); + assert!(interactive.resume_picker); + assert!(!interactive.resume_last); + assert_eq!(interactive.resume_session_id, None); + } + + #[test] + fn resume_picker_logic_last() { + let interactive = finalize_from_args(["codex", "resume", "--last"].as_ref()); + assert!(!interactive.resume_picker); + assert!(interactive.resume_last); + assert_eq!(interactive.resume_session_id, None); + } + + #[test] + fn resume_picker_logic_with_session_id() { + let interactive = finalize_from_args(["codex", "resume", "1234"].as_ref()); + assert!(!interactive.resume_picker); + assert!(!interactive.resume_last); + assert_eq!(interactive.resume_session_id.as_deref(), Some("1234")); + } + + #[test] + fn resume_merges_option_flags_and_full_auto() { + let interactive = finalize_from_args( + [ + "codex", + "resume", + "sid", + "--oss", + "--full-auto", + "--search", + "--sandbox", + "workspace-write", + "--ask-for-approval", + "on-request", + "-m", + "gpt-5-test", + "-p", + "my-profile", + "-C", + "/tmp", + "-i", + "/tmp/a.png,/tmp/b.png", + ] + .as_ref(), + ); + + assert_eq!(interactive.model.as_deref(), Some("gpt-5-test")); + assert!(interactive.oss); + assert_eq!(interactive.config_profile.as_deref(), Some("my-profile")); + assert!(matches!( + interactive.sandbox_mode, + Some(codex_common::SandboxModeCliArg::WorkspaceWrite) + )); + assert!(matches!( + interactive.approval_policy, + Some(codex_common::ApprovalModeCliArg::OnRequest) + )); + assert!(interactive.full_auto); + assert_eq!( + interactive.cwd.as_deref(), + Some(std::path::Path::new("/tmp")) + ); + assert!(interactive.web_search); + let has_a = interactive + .images + .iter() + .any(|p| p == std::path::Path::new("/tmp/a.png")); + let has_b = interactive + .images + .iter() + .any(|p| p == std::path::Path::new("/tmp/b.png")); + assert!(has_a && has_b); + assert!(!interactive.resume_picker); + assert!(!interactive.resume_last); + assert_eq!(interactive.resume_session_id.as_deref(), Some("sid")); + } + + #[test] + fn resume_merges_dangerously_bypass_flag() { + let interactive = finalize_from_args( + [ + "codex", + "resume", + "--dangerously-bypass-approvals-and-sandbox", + ] + .as_ref(), + ); + assert!(interactive.dangerously_bypass_approvals_and_sandbox); + assert!(interactive.resume_picker); + assert!(!interactive.resume_last); + assert_eq!(interactive.resume_session_id, None); + } +} diff --git a/codex-rs/tui/src/cli.rs b/codex-rs/tui/src/cli.rs index e9e999268d..f0630a34c5 100644 --- a/codex-rs/tui/src/cli.rs +++ b/codex-rs/tui/src/cli.rs @@ -7,6 +7,7 @@ use std::path::PathBuf; #[command(version)] pub struct Cli { /// Optional user prompt to start the session. + #[arg(value_name = "PROMPT")] pub prompt: Option, /// Optional image(s) to attach to the initial prompt. From b9af1d2b16d95ae22f494fd359e7cf2f7ff7e145 Mon Sep 17 00:00:00 2001 From: Ed Bayes Date: Mon, 15 Sep 2025 00:42:53 -0700 Subject: [PATCH 57/77] Login flow polish (#3632) # Description - Update sign in flow # Tests - Passes CI --------- Co-authored-by: Michael Bolin --- codex-rs/tui/frames/default/frame_10.txt | 8 +- codex-rs/tui/frames/default/frame_16.txt | 10 +-- codex-rs/tui/frames/default/frame_17.txt | 6 +- codex-rs/tui/frames/default/frame_18.txt | 8 +- codex-rs/tui/frames/default/frame_8.txt | 2 +- codex-rs/tui/frames/default/frame_9.txt | 8 +- codex-rs/tui/src/frames.rs | 71 ++++++++++++++++ codex-rs/tui/src/lib.rs | 1 + codex-rs/tui/src/new_model_popup.rs | 85 ++----------------- codex-rs/tui/src/onboarding/auth.rs | 14 +-- .../tui/src/onboarding/onboarding_screen.rs | 3 + codex-rs/tui/src/onboarding/welcome.rs | 60 +++++++++++-- 12 files changed, 168 insertions(+), 108 deletions(-) create mode 100644 codex-rs/tui/src/frames.rs diff --git a/codex-rs/tui/frames/default/frame_10.txt b/codex-rs/tui/frames/default/frame_10.txt index ffe56a1e56..9d45417346 100644 --- a/codex-rs/tui/frames/default/frame_10.txt +++ b/codex-rs/tui/frames/default/frame_10.txt @@ -3,14 +3,14 @@              *'`+*+\~/_*,                          ^_,||/~~-~+\,,                        |__/\|;_.\,''\\,            -           / ;||"|^ ',/_/|/            -          |` '|*~//\  !`_"|            +           / ;||"|^  /_/|/            +          |` '|*~//\   `_"|                      \  ~*"*||~|*   |/,           -          "  ||\+/+||-_`.\||           +          "  ||\+/+||-_ .\||                     "  ~\ \\|;~~+\+;||                     |  ,|\,|_/_*___|*`                      , "|||||""!\,"\|`           -           \`',\,*" _~"",//            +           \`',\,*"  "",//                        |' |||~*,:,/|/`                         ;`**/|+;_!//'                           *, _*\_,;*               diff --git a/codex-rs/tui/frames/default/frame_16.txt b/codex-rs/tui/frames/default/frame_16.txt index 75c9353f6f..7217fe58b8 100644 --- a/codex-rs/tui/frames/default/frame_16.txt +++ b/codex-rs/tui/frames/default/frame_16.txt @@ -2,15 +2,15 @@                 _=+"**+~_                             /^||*||\|=\                           |//"\/=\|| '\            -             /// ;*_\|\||**|           -             ||;_/*'=||*/|`\           -            |||*|' |\= !| ~.|          -            \\| /`,||||/*", |          +             /// ;' \|\||**|           +             ||;_ =||*/|`\           +            |||*|  /|= !| ~.|          +            \\|  ,||||/*", |                      |/; |`||/|||"; `|                      \\|~|+~/^||"*+  /                      *"__,==\*|._| ,_|                      |||+""/*\|;";.~|`          -             ||* |`  `//,  /           +             ||* |   `//,  /                        \|*  |  /,/_,|                          \|~"_*~//+_|                            ':._=:__;*              diff --git a/codex-rs/tui/frames/default/frame_17.txt b/codex-rs/tui/frames/default/frame_17.txt index 9d7a2dc37d..0d873df751 100644 --- a/codex-rs/tui/frames/default/frame_17.txt +++ b/codex-rs/tui/frames/default/frame_17.txt @@ -2,11 +2,11 @@                 ,=+++;;~,_                          _;**|~~*=*|,"^,                       ,*\/_==`+,"|||_"\          -           /|/_/|"_` '|;\~||=\         -           |/_ ~    |"/\=\//  ,        +           /|/_/|"   |;\~||=\         +           |/_ ~     "/\=\//  ,                  `=*,/`   ,:/| /,=/|./                  *!;/|   ,//|_ *"||/=|        -          -"=|!   !//||/|,||=;*        +          -"=|!   !//||/ ,||=;*                  ,/*/\==+~\_|\^:\||| |                   |"_;__|/*\/||\!\+'+\                  \\\/"""****\_|*//\ \'        diff --git a/codex-rs/tui/frames/default/frame_18.txt b/codex-rs/tui/frames/default/frame_18.txt index 123e46cd19..a474a4f3d0 100644 --- a/codex-rs/tui/frames/default/frame_18.txt +++ b/codex-rs/tui/frames/default/frame_18.txt @@ -1,10 +1,10 @@                                                       _==+==+;~,_                         _+"_;,++~__,"+;;_          -          _/:|*"*=","._"+//\ *         -         ,||*.,^"* '\`_/=~\;\\\,       -        _\// /|  _"+_\/~/|_\;\\_       -        /\| ,,~.___/,*,|'-/^/`/~!      +          _/:|*"*=" "._"+//\ *         +         ,||*.,^" _/=~\;\\\,       +        _\// /|   _\/~/|_\;\\_       +        /\| ,, _/,*,|'-/^/`/~!              ||\:/     +/*/|"_/"*|=|=,              "\-~|     ^\"||;^   |;|"              \"" ,\==;=;+~|,|*/\, |*|`       diff --git a/codex-rs/tui/frames/default/frame_8.txt b/codex-rs/tui/frames/default/frame_8.txt index efe7c1b096..2e8019c061 100644 --- a/codex-rs/tui/frames/default/frame_8.txt +++ b/codex-rs/tui/frames/default/frame_8.txt @@ -5,7 +5,7 @@         _*\*/|,+|     ' =^||\                  ' /|/,\|/\      .'\||,                |',|\^^_\|_*      \+|||         -       |*||| '_;\|`|     |^|/|,        +       |*||| '_;\|`|      ^|/|,               \,||/  |+\/|,*.    .`/||               \ \||_^ !/*=|~/+,+,,\~||               !  \*/=_|",|,||;|=__||='        diff --git a/codex-rs/tui/frames/default/frame_9.txt b/codex-rs/tui/frames/default/frame_9.txt index 072d0eef56..128e915007 100644 --- a/codex-rs/tui/frames/default/frame_9.txt +++ b/codex-rs/tui/frames/default/frame_9.txt @@ -3,10 +3,10 @@             /*_/||*"=!_-\_                        / ,||/*^^=/!\_~,                      " ||/;=_ _^,|\^|+,           -         /*";\*"|*, *.'+:+||           -         | |||"^|\;__ |'|*|||          -         ` ~*\|**|\\,".,/ `||          -        |  ~/_,\~||_/=\_| !||          +         /*";\*"|*,  +:+||           +         | |||"^|\;*   '|*|||          +         ` ~*\ **|\\," / `||          +        |  ~/_ ~||_/= | !||                  !  ",|" /|"|~~|+|~,||`                  |_|||_,|^|_||||__|||                   " `^/\\|/"****||"/\|          diff --git a/codex-rs/tui/src/frames.rs b/codex-rs/tui/src/frames.rs new file mode 100644 index 0000000000..19a70578d4 --- /dev/null +++ b/codex-rs/tui/src/frames.rs @@ -0,0 +1,71 @@ +use std::time::Duration; + +// Embed animation frames for each variant at compile time. +macro_rules! frames_for { + ($dir:literal) => { + [ + include_str!(concat!("../frames/", $dir, "/frame_1.txt")), + include_str!(concat!("../frames/", $dir, "/frame_2.txt")), + include_str!(concat!("../frames/", $dir, "/frame_3.txt")), + include_str!(concat!("../frames/", $dir, "/frame_4.txt")), + include_str!(concat!("../frames/", $dir, "/frame_5.txt")), + include_str!(concat!("../frames/", $dir, "/frame_6.txt")), + include_str!(concat!("../frames/", $dir, "/frame_7.txt")), + include_str!(concat!("../frames/", $dir, "/frame_8.txt")), + include_str!(concat!("../frames/", $dir, "/frame_9.txt")), + include_str!(concat!("../frames/", $dir, "/frame_10.txt")), + include_str!(concat!("../frames/", $dir, "/frame_11.txt")), + include_str!(concat!("../frames/", $dir, "/frame_12.txt")), + include_str!(concat!("../frames/", $dir, "/frame_13.txt")), + include_str!(concat!("../frames/", $dir, "/frame_14.txt")), + include_str!(concat!("../frames/", $dir, "/frame_15.txt")), + include_str!(concat!("../frames/", $dir, "/frame_16.txt")), + include_str!(concat!("../frames/", $dir, "/frame_17.txt")), + include_str!(concat!("../frames/", $dir, "/frame_18.txt")), + include_str!(concat!("../frames/", $dir, "/frame_19.txt")), + include_str!(concat!("../frames/", $dir, "/frame_20.txt")), + include_str!(concat!("../frames/", $dir, "/frame_21.txt")), + include_str!(concat!("../frames/", $dir, "/frame_22.txt")), + include_str!(concat!("../frames/", $dir, "/frame_23.txt")), + include_str!(concat!("../frames/", $dir, "/frame_24.txt")), + include_str!(concat!("../frames/", $dir, "/frame_25.txt")), + include_str!(concat!("../frames/", $dir, "/frame_26.txt")), + include_str!(concat!("../frames/", $dir, "/frame_27.txt")), + include_str!(concat!("../frames/", $dir, "/frame_28.txt")), + include_str!(concat!("../frames/", $dir, "/frame_29.txt")), + include_str!(concat!("../frames/", $dir, "/frame_30.txt")), + include_str!(concat!("../frames/", $dir, "/frame_31.txt")), + include_str!(concat!("../frames/", $dir, "/frame_32.txt")), + include_str!(concat!("../frames/", $dir, "/frame_33.txt")), + include_str!(concat!("../frames/", $dir, "/frame_34.txt")), + include_str!(concat!("../frames/", $dir, "/frame_35.txt")), + include_str!(concat!("../frames/", $dir, "/frame_36.txt")), + ] + }; +} + +pub(crate) const FRAMES_DEFAULT: [&str; 36] = frames_for!("default"); +pub(crate) const FRAMES_CODEX: [&str; 36] = frames_for!("codex"); +pub(crate) const FRAMES_OPENAI: [&str; 36] = frames_for!("openai"); +pub(crate) const FRAMES_BLOCKS: [&str; 36] = frames_for!("blocks"); +pub(crate) const FRAMES_DOTS: [&str; 36] = frames_for!("dots"); +pub(crate) const FRAMES_HASH: [&str; 36] = frames_for!("hash"); +pub(crate) const FRAMES_HBARS: [&str; 36] = frames_for!("hbars"); +pub(crate) const FRAMES_VBARS: [&str; 36] = frames_for!("vbars"); +pub(crate) const FRAMES_SHAPES: [&str; 36] = frames_for!("shapes"); +pub(crate) const FRAMES_SLUG: [&str; 36] = frames_for!("slug"); + +pub(crate) const ALL_VARIANTS: &[&[&str]] = &[ + &FRAMES_DEFAULT, + &FRAMES_CODEX, + &FRAMES_OPENAI, + &FRAMES_BLOCKS, + &FRAMES_DOTS, + &FRAMES_HASH, + &FRAMES_HBARS, + &FRAMES_VBARS, + &FRAMES_SHAPES, + &FRAMES_SLUG, +]; + +pub(crate) const FRAME_TICK_DEFAULT: Duration = Duration::from_millis(80); diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 27faef180f..5fe36dd142 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -42,6 +42,7 @@ pub mod custom_terminal; mod diff_render; mod exec_command; mod file_search; +mod frames; mod get_git_diff; mod history_cell; pub mod insert_history; diff --git a/codex-rs/tui/src/new_model_popup.rs b/codex-rs/tui/src/new_model_popup.rs index b5b63d3cc8..153a91a2cb 100644 --- a/codex-rs/tui/src/new_model_popup.rs +++ b/codex-rs/tui/src/new_model_popup.rs @@ -1,3 +1,5 @@ +use crate::frames::ALL_VARIANTS as FRAME_VARIANTS; +use crate::frames::FRAME_TICK_DEFAULT; use crate::tui::FrameRequester; use crate::tui::Tui; use crate::tui::TuiEvent; @@ -19,75 +21,7 @@ use ratatui::widgets::Wrap; use std::time::Duration; use tokio_stream::StreamExt; -// Embed animation frames for each variant at compile time. -macro_rules! frames_for { - ($dir:literal) => { - [ - include_str!(concat!("../frames/", $dir, "/frame_1.txt")), - include_str!(concat!("../frames/", $dir, "/frame_2.txt")), - include_str!(concat!("../frames/", $dir, "/frame_3.txt")), - include_str!(concat!("../frames/", $dir, "/frame_4.txt")), - include_str!(concat!("../frames/", $dir, "/frame_5.txt")), - include_str!(concat!("../frames/", $dir, "/frame_6.txt")), - include_str!(concat!("../frames/", $dir, "/frame_7.txt")), - include_str!(concat!("../frames/", $dir, "/frame_8.txt")), - include_str!(concat!("../frames/", $dir, "/frame_9.txt")), - include_str!(concat!("../frames/", $dir, "/frame_10.txt")), - include_str!(concat!("../frames/", $dir, "/frame_11.txt")), - include_str!(concat!("../frames/", $dir, "/frame_12.txt")), - include_str!(concat!("../frames/", $dir, "/frame_13.txt")), - include_str!(concat!("../frames/", $dir, "/frame_14.txt")), - include_str!(concat!("../frames/", $dir, "/frame_15.txt")), - include_str!(concat!("../frames/", $dir, "/frame_16.txt")), - include_str!(concat!("../frames/", $dir, "/frame_17.txt")), - include_str!(concat!("../frames/", $dir, "/frame_18.txt")), - include_str!(concat!("../frames/", $dir, "/frame_19.txt")), - include_str!(concat!("../frames/", $dir, "/frame_20.txt")), - include_str!(concat!("../frames/", $dir, "/frame_21.txt")), - include_str!(concat!("../frames/", $dir, "/frame_22.txt")), - include_str!(concat!("../frames/", $dir, "/frame_23.txt")), - include_str!(concat!("../frames/", $dir, "/frame_24.txt")), - include_str!(concat!("../frames/", $dir, "/frame_25.txt")), - include_str!(concat!("../frames/", $dir, "/frame_26.txt")), - include_str!(concat!("../frames/", $dir, "/frame_27.txt")), - include_str!(concat!("../frames/", $dir, "/frame_28.txt")), - include_str!(concat!("../frames/", $dir, "/frame_29.txt")), - include_str!(concat!("../frames/", $dir, "/frame_30.txt")), - include_str!(concat!("../frames/", $dir, "/frame_31.txt")), - include_str!(concat!("../frames/", $dir, "/frame_32.txt")), - include_str!(concat!("../frames/", $dir, "/frame_33.txt")), - include_str!(concat!("../frames/", $dir, "/frame_34.txt")), - include_str!(concat!("../frames/", $dir, "/frame_35.txt")), - include_str!(concat!("../frames/", $dir, "/frame_36.txt")), - ] - }; -} - -const FRAMES_DEFAULT: [&str; 36] = frames_for!("default"); -const FRAMES_CODEX: [&str; 36] = frames_for!("codex"); -const FRAMES_OPENAI: [&str; 36] = frames_for!("openai"); -const FRAMES_BLOCKS: [&str; 36] = frames_for!("blocks"); -const FRAMES_DOTS: [&str; 36] = frames_for!("dots"); -const FRAMES_HASH: [&str; 36] = frames_for!("hash"); -const FRAMES_HBARS: [&str; 36] = frames_for!("hbars"); -const FRAMES_VBARS: [&str; 36] = frames_for!("vbars"); -const FRAMES_SHAPES: [&str; 36] = frames_for!("shapes"); -const FRAMES_SLUG: [&str; 36] = frames_for!("slug"); - -const VARIANTS: &[&[&str]] = &[ - &FRAMES_DEFAULT, - &FRAMES_CODEX, - &FRAMES_OPENAI, - &FRAMES_BLOCKS, - &FRAMES_DOTS, - &FRAMES_HASH, - &FRAMES_HBARS, - &FRAMES_VBARS, - &FRAMES_SHAPES, - &FRAMES_SLUG, -]; - -const FRAME_TICK: Duration = Duration::from_millis(60); +const FRAME_TICK: Duration = FRAME_TICK_DEFAULT; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub(crate) enum ModelUpgradeDecision { @@ -156,11 +90,11 @@ impl ModelUpgradePopup { } fn frames(&self) -> &'static [&'static str] { - VARIANTS[self.variant_idx] + FRAME_VARIANTS[self.variant_idx] } fn pick_random_variant(&mut self) { - let total = VARIANTS.len(); + let total = FRAME_VARIANTS.len(); if total <= 1 { return; } @@ -196,13 +130,11 @@ impl WidgetRef for &ModelUpgradePopup { lines.push("".into()); lines.push( - format!( - " Codex is now powered by {SWIFTFOX_MODEL_DISPLAY_NAME}, a new model that is" - ) - .into(), + format!(" Codex is now powered by {SWIFTFOX_MODEL_DISPLAY_NAME}, a new model that is") + .into(), ); lines.push(Line::from(vec![ - " ".into(), + " ".into(), "faster, a better collaborator, ".bold(), "and ".into(), "more steerable.".bold(), @@ -226,6 +158,7 @@ impl WidgetRef for &ModelUpgradePopup { ModelUpgradeOption::TryNewModel, &format!("Yes, switch me to {SWIFTFOX_MODEL_DISPLAY_NAME}"), )); + lines.push("".into()); lines.push(create_option( 1, ModelUpgradeOption::KeepCurrent, diff --git a/codex-rs/tui/src/onboarding/auth.rs b/codex-rs/tui/src/onboarding/auth.rs index d419badada..2ea59a312a 100644 --- a/codex-rs/tui/src/onboarding/auth.rs +++ b/codex-rs/tui/src/onboarding/auth.rs @@ -137,12 +137,12 @@ impl AuthModeWidget { fn render_pick_mode(&self, area: Rect, buf: &mut Buffer) { let mut lines: Vec = vec![ Line::from(vec![ - "> ".into(), - "Sign in with ChatGPT to use Codex as part of your paid plan".bold(), + " ".into(), + "Sign in with ChatGPT to use Codex as part of your paid plan".into(), ]), Line::from(vec![ " ".into(), - "or connect an API key for usage-based billing".bold(), + "or connect an API key for usage-based billing".into(), ]), "".into(), ]; @@ -182,6 +182,7 @@ impl AuthModeWidget { "Sign in with ChatGPT", "Usage included with Plus, Pro, and Team plans", )); + lines.push("".into()); lines.extend(create_mode_item( 1, AuthMode::ApiKey, @@ -205,7 +206,7 @@ impl AuthModeWidget { } fn render_continue_in_browser(&self, area: Rect, buf: &mut Buffer) { - let mut spans = vec!["> ".into()]; + let mut spans = vec![" ".into()]; // Schedule a follow-up frame to keep the shimmer animation going. self.request_frame .schedule_frame_in(std::time::Duration::from_millis(100)); @@ -217,7 +218,8 @@ impl AuthModeWidget { && !state.auth_url.is_empty() { lines.push(" If the link doesn't open automatically, open the following link to authenticate:".into()); - lines.push(vec![" ".into(), state.auth_url.as_str().cyan().underlined()].into()); + lines.push("".into()); + lines.push(Line::from(state.auth_url.as_str().cyan().underlined())); lines.push("".into()); } @@ -231,7 +233,7 @@ impl AuthModeWidget { let lines = vec![ "✓ Signed in with your ChatGPT account".fg(Color::Green).into(), "".into(), - "> Before you start:".into(), + " Before you start:".into(), "".into(), " Decide how much autonomy you want to grant Codex".into(), Line::from(vec![ diff --git a/codex-rs/tui/src/onboarding/onboarding_screen.rs b/codex-rs/tui/src/onboarding/onboarding_screen.rs index c9617d796b..76e533b4c1 100644 --- a/codex-rs/tui/src/onboarding/onboarding_screen.rs +++ b/codex-rs/tui/src/onboarding/onboarding_screen.rs @@ -24,6 +24,7 @@ use crate::tui::TuiEvent; use color_eyre::eyre::Result; use std::sync::Arc; use std::sync::RwLock; +use std::time::Instant; #[allow(clippy::large_enum_variant)] enum Step { @@ -74,6 +75,8 @@ impl OnboardingScreen { let codex_home = config.codex_home; let mut steps: Vec = vec![Step::Welcome(WelcomeWidget { is_logged_in: !matches!(login_status, LoginStatus::NotAuthenticated), + request_frame: tui.frame_requester(), + start: Instant::now(), })]; if show_login_screen { steps.push(Step::Auth(AuthModeWidget { diff --git a/codex-rs/tui/src/onboarding/welcome.rs b/codex-rs/tui/src/onboarding/welcome.rs index 5e6906bf95..40911b84f3 100644 --- a/codex-rs/tui/src/onboarding/welcome.rs +++ b/codex-rs/tui/src/onboarding/welcome.rs @@ -3,23 +3,62 @@ use ratatui::layout::Rect; use ratatui::prelude::Widget; use ratatui::style::Stylize; use ratatui::text::Line; +use ratatui::widgets::Paragraph; use ratatui::widgets::WidgetRef; +use ratatui::widgets::Wrap; +use crate::frames::FRAME_TICK_DEFAULT; +use crate::frames::FRAMES_DEFAULT; use crate::onboarding::onboarding_screen::StepStateProvider; +use crate::tui::FrameRequester; use super::onboarding_screen::StepState; +use std::time::Duration; +use std::time::Instant; + +const FRAME_TICK: Duration = FRAME_TICK_DEFAULT; pub(crate) struct WelcomeWidget { pub is_logged_in: bool, + pub request_frame: FrameRequester, + pub start: Instant, } impl WidgetRef for &WelcomeWidget { fn render_ref(&self, area: Rect, buf: &mut Buffer) { - let line = Line::from(vec![ - ">_ ".into(), - "Welcome to Codex, OpenAI's command-line coding agent".bold(), - ]); - line.render(area, buf); + let elapsed_ms = self.start.elapsed().as_millis(); + + // Align next draw to the next FRAME_TICK boundary to reduce jitter. + { + let tick_ms = FRAME_TICK.as_millis(); + let rem_ms = elapsed_ms % tick_ms; + let delay_ms = if rem_ms == 0 { + tick_ms + } else { + tick_ms - rem_ms + }; + // Safe cast: delay_ms < tick_ms and FRAME_TICK is small. + self.request_frame + .schedule_frame_in(Duration::from_millis(delay_ms as u64)); + } + + let frames = &FRAMES_DEFAULT; + let idx = ((elapsed_ms / FRAME_TICK.as_millis()) % frames.len() as u128) as usize; + + let mut lines: Vec = Vec::with_capacity(frames.len() + 2); + lines.extend(frames[idx].lines().map(|l| l.into())); + + lines.push("".into()); + lines.push(Line::from(vec![ + " ".into(), + "Welcome to ".into(), + "Codex".bold(), + ", OpenAI's command-line coding agent".into(), + ])); + + Paragraph::new(lines) + .wrap(Wrap { trim: false }) + .render(area, buf); } } @@ -31,3 +70,14 @@ impl StepStateProvider for WelcomeWidget { } } } + +#[cfg(test)] +mod tests { + use super::*; + + /// A number of things break down if FRAME_TICK is zero. + #[test] + fn frame_tick_must_be_nonzero() { + assert!(FRAME_TICK.as_millis() > 0); + } +} From adc9e1526b664d2c6007a175b89b1765468b02c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 00:48:53 -0700 Subject: [PATCH 58/77] chore(deps): bump slab from 0.4.10 to 0.4.11 in /codex-rs (#3635) Bumps [slab](https://github.com/tokio-rs/slab) from 0.4.10 to 0.4.11.
Release notes

Sourced from slab's releases.

v0.4.11

  • Fix Slab::get_disjoint_mut out of bounds (#152)
Changelog

Sourced from slab's changelog.

0.4.11 (August 8, 2025)

  • Fix Slab::get_disjoint_mut out of bounds (#152)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=slab&package-manager=cargo&previous-version=0.4.10&new-version=0.4.11)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/openai/codex/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- codex-rs/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 5993a83305..c070f24af1 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -4176,9 +4176,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" From fdf4a686463f13b56ee83f807bccbe3457542564 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 00:51:33 -0700 Subject: [PATCH 59/77] chore(deps): bump tracing-subscriber from 0.3.19 to 0.3.20 in /codex-rs (#3620) Bumps [tracing-subscriber](https://github.com/tokio-rs/tracing) from 0.3.19 to 0.3.20.
Release notes

Sourced from tracing-subscriber's releases.

tracing-subscriber 0.3.20

Security Fix: ANSI Escape Sequence Injection (CVE-TBD)

Impact

Previous versions of tracing-subscriber were vulnerable to ANSI escape sequence injection attacks. Untrusted user input containing ANSI escape sequences could be injected into terminal output when logged, potentially allowing attackers to:

  • Manipulate terminal title bars
  • Clear screens or modify terminal display
  • Potentially mislead users through terminal manipulation

In isolation, impact is minimal, however security issues have been found in terminal emulators that enabled an attacker to use ANSI escape sequences via logs to exploit vulnerabilities in the terminal emulator.

Solution

Version 0.3.20 fixes this vulnerability by escaping ANSI control characters in when writing events to destinations that may be printed to the terminal.

Affected Versions

All versions of tracing-subscriber prior to 0.3.20 are affected by this vulnerability.

Recommendations

Immediate Action Required: We recommend upgrading to tracing-subscriber 0.3.20 immediately, especially if your application:

  • Logs user-provided input (form data, HTTP headers, query parameters, etc.)
  • Runs in environments where terminal output is displayed to users

Migration

This is a patch release with no breaking API changes. Simply update your Cargo.toml:

[dependencies]
tracing-subscriber = "0.3.20"

Acknowledgments

We would like to thank zefr0x who responsibly reported the issue at security@tokio.rs.

If you believe you have found a security vulnerability in any tokio-rs project, please email us at security@tokio.rs.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tracing-subscriber&package-manager=cargo&previous-version=0.3.19&new-version=0.3.20)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- codex-rs/Cargo.lock | 49 ++++++++++------------------------------ codex-rs/cli/Cargo.toml | 2 +- codex-rs/exec/Cargo.toml | 2 +- codex-rs/tui/Cargo.toml | 2 +- 4 files changed, 15 insertions(+), 40 deletions(-) diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index c070f24af1..074a3b192e 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -407,7 +407,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" dependencies = [ "memchr", - "regex-automata 0.4.9", + "regex-automata", "serde", ] @@ -1327,7 +1327,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b545b8c50194bdd008283985ab0b31dba153cfd5b3066a92770634fbc0d7d291" dependencies = [ - "nu-ansi-term 0.50.1", + "nu-ansi-term", ] [[package]] @@ -1909,7 +1909,7 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.9", + "regex-automata", "regex-syntax 0.8.5", ] @@ -2324,7 +2324,7 @@ dependencies = [ "globset", "log", "memchr", - "regex-automata 0.4.9", + "regex-automata", "same-file", "walkdir", "winapi-util", @@ -2709,11 +2709,11 @@ checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -2887,16 +2887,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - [[package]] name = "nu-ansi-term" version = "0.50.1" @@ -3135,12 +3125,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "owo-colors" version = "4.2.2" @@ -3603,19 +3587,10 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", + "regex-automata", "regex-syntax 0.8.5", ] -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - [[package]] name = "regex-automata" version = "0.4.9" @@ -4910,14 +4885,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", - "nu-ansi-term 0.46.0", + "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", diff --git a/codex-rs/cli/Cargo.toml b/codex-rs/cli/Cargo.toml index 571844c451..291ef47748 100644 --- a/codex-rs/cli/Cargo.toml +++ b/codex-rs/cli/Cargo.toml @@ -36,7 +36,7 @@ tokio = { version = "1", features = [ "signal", ] } tracing = "0.1.41" -tracing-subscriber = "0.3.19" +tracing-subscriber = "0.3.20" codex-protocol-ts = { path = "../protocol-ts" } [dev-dependencies] diff --git a/codex-rs/exec/Cargo.toml b/codex-rs/exec/Cargo.toml index 9f6833eb41..2dd121c368 100644 --- a/codex-rs/exec/Cargo.toml +++ b/codex-rs/exec/Cargo.toml @@ -38,7 +38,7 @@ tokio = { version = "1", features = [ "signal", ] } tracing = { version = "0.1.41", features = ["log"] } -tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } +tracing-subscriber = { version = "0.3.20", features = ["env-filter"] } [dev-dependencies] assert_cmd = "2" diff --git a/codex-rs/tui/Cargo.toml b/codex-rs/tui/Cargo.toml index 88e68875d4..02da641de4 100644 --- a/codex-rs/tui/Cargo.toml +++ b/codex-rs/tui/Cargo.toml @@ -78,7 +78,7 @@ tokio = { version = "1", features = [ tokio-stream = "0.1.17" tracing = { version = "0.1.41", features = ["log"] } tracing-appender = "0.2.3" -tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } +tracing-subscriber = { version = "0.3.20", features = ["env-filter"] } pulldown-cmark = "0.10" unicode-segmentation = "1.12.0" unicode-width = "0.1" From 9baa5c33da3e00376dfa66f509125310d45af79b Mon Sep 17 00:00:00 2001 From: ae Date: Mon, 15 Sep 2025 06:44:40 -0700 Subject: [PATCH 60/77] feat: update splash (#3631) - Update splash styling. - Add center truncation for long paths. (Uses new `center_truncate_path` utility.) - Update the suggested commands. ## New splash image ## Example with truncation: image --- codex-rs/Cargo.lock | 1 + codex-rs/tui/Cargo.toml | 1 + codex-rs/tui/src/chatwidget/tests.rs | 3 +- codex-rs/tui/src/exec_command.rs | 11 +- codex-rs/tui/src/history_cell.rs | 169 ++++++++++++------ codex-rs/tui/src/text_formatting.rs | 258 +++++++++++++++++++++++++++ 6 files changed, 379 insertions(+), 64 deletions(-) diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 074a3b192e..39933bb7f1 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -921,6 +921,7 @@ dependencies = [ "color-eyre", "crossterm", "diffy", + "dirs", "image", "insta", "itertools 0.14.0", diff --git a/codex-rs/tui/Cargo.toml b/codex-rs/tui/Cargo.toml index 02da641de4..06e892b720 100644 --- a/codex-rs/tui/Cargo.toml +++ b/codex-rs/tui/Cargo.toml @@ -43,6 +43,7 @@ crossterm = { version = "0.28.1", features = [ "bracketed-paste", "event-stream", ] } +dirs = "6" diffy = "0.4.2" image = { version = "^0.25.8", default-features = false, features = [ "jpeg", diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index ebd97c81d9..73845bfe09 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -781,8 +781,7 @@ async fn binary_size_transcript_snapshot() { // Consider content only after the last session banner marker. Skip the transient // 'thinking' header if present, and start from the first non-empty content line // that follows. This keeps the snapshot stable across sessions. - const MARKER_PREFIX: &str = - "Describe a task to get started or try one of the following commands:"; + const MARKER_PREFIX: &str = "To get started, describe a task or try one of these commands:"; let last_marker_line_idx = lines .iter() .rposition(|l| l.trim_start().starts_with(MARKER_PREFIX)) diff --git a/codex-rs/tui/src/exec_command.rs b/codex-rs/tui/src/exec_command.rs index 1923fa3b69..93c937e0d1 100644 --- a/codex-rs/tui/src/exec_command.rs +++ b/codex-rs/tui/src/exec_command.rs @@ -1,6 +1,7 @@ use std::path::Path; use std::path::PathBuf; +use dirs::home_dir; use shlex::try_join; pub(crate) fn escape_command(command: &[String]) -> String { @@ -27,13 +28,9 @@ where return None; } - if let Some(home_dir) = std::env::var_os("HOME").map(PathBuf::from) - && let Ok(rel) = path.strip_prefix(&home_dir) - { - return Some(rel.to_path_buf()); - } - - None + let home_dir = home_dir()?; + let rel = path.strip_prefix(&home_dir).ok()?; + Some(rel.to_path_buf()) } #[cfg(test)] diff --git a/codex-rs/tui/src/history_cell.rs b/codex-rs/tui/src/history_cell.rs index bd1056e035..d6add6d328 100644 --- a/codex-rs/tui/src/history_cell.rs +++ b/codex-rs/tui/src/history_cell.rs @@ -574,7 +574,7 @@ impl HistoryCell for CompletedMcpToolCallWithImageOutput { } const TOOL_CALL_MAX_LINES: usize = 5; -const SESSION_HEADER_MAX_INNER_WIDTH: usize = 70; +const SESSION_HEADER_MAX_INNER_WIDTH: usize = 56; // Just an eyeballed value fn title_case(s: &str) -> String { if s.is_empty() { @@ -628,24 +628,29 @@ pub(crate) fn new_session_info( // Help lines below the header (new copy and list) let help_lines: Vec> = vec![ - "Describe a task to get started or try one of the following commands:" + " To get started, describe a task or try one of these commands:" .dim() .into(), - Line::from("".dim()), + Line::from(""), Line::from(vec![ - "1. ".into(), - "/status".bold(), - " - show current session configuration and token usage".dim(), + " ".into(), + "/init".into(), + " - create an AGENTS.md file with instructions for Codex".dim(), ]), Line::from(vec![ - "2. ".into(), - "/compact".bold(), - " - compact the chat history to avoid context limits".dim(), + " ".into(), + "/status".into(), + " - show current session configuration".dim(), ]), Line::from(vec![ - "3. ".into(), - "/prompts".bold(), - " - explore starter prompts to get to know Codex".dim(), + " ".into(), + "/approvals".into(), + " - choose what Codex can do without approval".dim(), + ]), + Line::from(vec![ + " ".into(), + "/model".into(), + " - choose what model and reasoning effort to use".dim(), ]), ]; @@ -715,16 +720,31 @@ impl SessionHeaderHistoryCell { } } - fn format_directory(&self) -> String { - if let Some(rel) = relativize_to_home(&self.directory) { + fn format_directory(&self, max_width: Option) -> String { + Self::format_directory_inner(&self.directory, max_width) + } + + fn format_directory_inner(directory: &Path, max_width: Option) -> String { + let formatted = if let Some(rel) = relativize_to_home(directory) { if rel.as_os_str().is_empty() { "~".to_string() } else { format!("~{}{}", std::path::MAIN_SEPARATOR, rel.display()) } } else { - self.directory.display().to_string() + directory.display().to_string() + }; + + if let Some(max_width) = max_width { + if max_width == 0 { + return String::new(); + } + if UnicodeWidthStr::width(formatted.as_str()) > max_width { + return crate::text_formatting::center_truncate_path(&formatted, max_width); + } } + + formatted } fn reasoning_label(&self) -> Option<&'static str> { @@ -753,79 +773,93 @@ impl HistoryCell for SessionHeaderHistoryCell { top.push('╭'); top.push_str(&"─".repeat(inner_width)); top.push('╮'); - out.push(Line::from(top)); + out.push(Line::from(top.dim())); // Title line rendered inside the box: " >_ OpenAI Codex (vX)" let title_text = format!(" >_ OpenAI Codex (v{})", self.version); let title_w = UnicodeWidthStr::width(title_text.as_str()); let pad_w = inner_width.saturating_sub(title_w); let mut title_spans: Vec> = vec![ - "│".into(), - " ".into(), - ">_ ".into(), - "OpenAI Codex".bold(), - " ".into(), - format!("(v{})", self.version).dim(), + Span::from("│").dim(), + Span::from(" ").dim(), + Span::from(">_ ").dim(), + Span::from("OpenAI Codex").bold(), + Span::from(" ").dim(), + Span::from(format!("(v{})", self.version)).dim(), ]; if pad_w > 0 { - title_spans.push(" ".repeat(pad_w).into()); + title_spans.push(Span::from(" ".repeat(pad_w)).dim()); } - title_spans.push("│".into()); + title_spans.push(Span::from("│").dim()); out.push(Line::from(title_spans)); // Spacer row between title and details out.push(Line::from(vec![ - "│".into(), - " ".repeat(inner_width).into(), - "│".into(), + Span::from(format!("│{}│", " ".repeat(inner_width))).dim(), ])); - // Model line: " Model: (change with /model)" - const CHANGE_MODEL_HINT: &str = "(change with /model)"; + // Model line: " model: (change with /model)" + const CHANGE_MODEL_HINT_COMMAND: &str = "/model"; + const CHANGE_MODEL_HINT_EXPLANATION: &str = " to change"; + const DIR_LABEL: &str = "directory:"; + let label_width = DIR_LABEL.len(); + let model_label = format!( + "{model_label:> = vec![ - "│".into(), - " ".into(), - "Model: ".bold(), - self.model.clone().into(), + Span::from(format!("│ {model_label} ")).dim(), + Span::from(self.model.clone()), ]; if let Some(reasoning) = reasoning_label { - spans.push(" ".into()); - spans.push(reasoning.into()); + spans.push(Span::from(" ")); + spans.push(Span::from(reasoning)); } - spans.push(" ".into()); - spans.push(CHANGE_MODEL_HINT.dim()); + spans.push(Span::from(" ").dim()); + spans.push(Span::from(CHANGE_MODEL_HINT_COMMAND).cyan()); + spans.push(Span::from(CHANGE_MODEL_HINT_EXPLANATION).dim()); if pad_w > 0 { - spans.push(" ".repeat(pad_w).into()); + spans.push(Span::from(" ".repeat(pad_w)).dim()); } - spans.push("│".into()); + spans.push(Span::from("│").dim()); out.push(Line::from(spans)); // Directory line: " Directory: " - let dir = self.format_directory(); - let dir_text = format!(" Directory: {dir}"); + let dir_label = format!("{DIR_LABEL:> = - vec!["│".into(), " ".into(), "Directory: ".bold(), dir.into()]; + let mut spans: Vec> = vec![ + Span::from("│").dim(), + Span::from(" ").dim(), + Span::from(dir_label).dim(), + Span::from(" ").dim(), + Span::from(dir), + ]; if pad_w > 0 { - spans.push(" ".repeat(pad_w).into()); + spans.push(Span::from(" ".repeat(pad_w)).dim()); } - spans.push("│".into()); + spans.push(Span::from("│").dim()); out.push(Line::from(spans)); // Bottom border let bottom = format!("╰{}╯", "─".repeat(inner_width)); - out.push(Line::from(bottom)); + out.push(Line::from(bottom.dim())); out } @@ -1523,6 +1557,7 @@ mod tests { use codex_core::config::Config; use codex_core::config::ConfigOverrides; use codex_core::config::ConfigToml; + use dirs::home_dir; fn test_config() -> Config { Config::load_from_base_config_with_overrides( @@ -1561,11 +1596,35 @@ mod tests { let lines = render_lines(&cell.display_lines(80)); let model_line = lines .into_iter() - .find(|line| line.contains("Model:")) + .find(|line| line.contains("model:")) .expect("model line"); - assert!(model_line.contains("Model: gpt-4o high")); - assert!(model_line.contains("(change with /model)")); + assert!(model_line.contains("gpt-4o high")); + assert!(model_line.contains("/model to change")); + } + + #[test] + fn session_header_directory_center_truncates() { + let mut dir = home_dir().expect("home directory"); + for part in ["hello", "the", "fox", "is", "very", "fast"] { + dir.push(part); + } + + let formatted = SessionHeaderHistoryCell::format_directory_inner(&dir, Some(24)); + let sep = std::path::MAIN_SEPARATOR; + let expected = format!("~{sep}hello{sep}the{sep}…{sep}very{sep}fast"); + assert_eq!(formatted, expected); + } + + #[test] + fn session_header_directory_front_truncates_long_segment() { + let mut dir = home_dir().expect("home directory"); + dir.push("supercalifragilisticexpialidocious"); + + let formatted = SessionHeaderHistoryCell::format_directory_inner(&dir, Some(18)); + let sep = std::path::MAIN_SEPARATOR; + let expected = format!("~{sep}…cexpialidocious"); + assert_eq!(formatted, expected); } #[test] diff --git a/codex-rs/tui/src/text_formatting.rs b/codex-rs/tui/src/text_formatting.rs index 3c4cfc31bb..91d1c84f22 100644 --- a/codex-rs/tui/src/text_formatting.rs +++ b/codex-rs/tui/src/text_formatting.rs @@ -1,4 +1,6 @@ use unicode_segmentation::UnicodeSegmentation; +use unicode_width::UnicodeWidthChar; +use unicode_width::UnicodeWidthStr; /// Truncate a tool result to fit within the given height and width. If the text is valid JSON, we format it in a compact way before truncating. /// This is a best-effort approach that may not work perfectly for text where 1 grapheme is rendered as multiple terminal cells. @@ -100,6 +102,219 @@ pub(crate) fn truncate_text(text: &str, max_graphemes: usize) -> String { } } +/// Truncate a path-like string to the given display width, keeping leading and trailing segments +/// where possible and inserting a single Unicode ellipsis between them. If an individual segment +/// cannot fit, it is front-truncated with an ellipsis. +pub(crate) fn center_truncate_path(path: &str, max_width: usize) -> String { + if max_width == 0 { + return String::new(); + } + if UnicodeWidthStr::width(path) <= max_width { + return path.to_string(); + } + + let sep = std::path::MAIN_SEPARATOR; + let has_leading_sep = path.starts_with(sep); + let has_trailing_sep = path.ends_with(sep); + let mut raw_segments: Vec<&str> = path.split(sep).collect(); + if has_leading_sep && !raw_segments.is_empty() && raw_segments[0].is_empty() { + raw_segments.remove(0); + } + if has_trailing_sep + && !raw_segments.is_empty() + && raw_segments.last().is_some_and(|last| last.is_empty()) + { + raw_segments.pop(); + } + + if raw_segments.is_empty() { + if has_leading_sep { + let root = sep.to_string(); + if UnicodeWidthStr::width(root.as_str()) <= max_width { + return root; + } + } + return "…".to_string(); + } + + struct Segment<'a> { + original: &'a str, + text: String, + truncatable: bool, + is_suffix: bool, + } + + let assemble = |leading: bool, segments: &[Segment<'_>]| -> String { + let mut result = String::new(); + if leading { + result.push(sep); + } + for segment in segments { + if !result.is_empty() && !result.ends_with(sep) { + result.push(sep); + } + result.push_str(segment.text.as_str()); + } + result + }; + + let front_truncate = |original: &str, allowed_width: usize| -> String { + if allowed_width == 0 { + return String::new(); + } + if UnicodeWidthStr::width(original) <= allowed_width { + return original.to_string(); + } + if allowed_width == 1 { + return "…".to_string(); + } + + let mut kept: Vec = Vec::new(); + let mut used_width = 1; // reserve space for leading ellipsis + for ch in original.chars().rev() { + let ch_width = UnicodeWidthChar::width(ch).unwrap_or(0); + if used_width + ch_width > allowed_width { + break; + } + used_width += ch_width; + kept.push(ch); + } + kept.reverse(); + let mut truncated = String::from("…"); + for ch in kept { + truncated.push(ch); + } + truncated + }; + + let mut combos: Vec<(usize, usize)> = Vec::new(); + let segment_count = raw_segments.len(); + for left in 1..=segment_count { + let min_right = if left == segment_count { 0 } else { 1 }; + for right in min_right..=(segment_count - left) { + combos.push((left, right)); + } + } + let desired_suffix = if segment_count > 1 { + std::cmp::min(2, segment_count - 1) + } else { + 0 + }; + let mut prioritized: Vec<(usize, usize)> = Vec::new(); + let mut fallback: Vec<(usize, usize)> = Vec::new(); + for combo in combos { + if combo.1 >= desired_suffix { + prioritized.push(combo); + } else { + fallback.push(combo); + } + } + let sort_combos = |items: &mut Vec<(usize, usize)>| { + items.sort_by(|(left_a, right_a), (left_b, right_b)| { + left_b + .cmp(left_a) + .then_with(|| right_b.cmp(right_a)) + .then_with(|| (left_b + right_b).cmp(&(left_a + right_a))) + }); + }; + sort_combos(&mut prioritized); + sort_combos(&mut fallback); + + let fit_segments = + |segments: &mut Vec>, allow_front_truncate: bool| -> Option { + loop { + let candidate = assemble(has_leading_sep, segments); + let width = UnicodeWidthStr::width(candidate.as_str()); + if width <= max_width { + return Some(candidate); + } + + if !allow_front_truncate { + return None; + } + + let mut indices: Vec = Vec::new(); + for (idx, seg) in segments.iter().enumerate().rev() { + if seg.truncatable && seg.is_suffix { + indices.push(idx); + } + } + for (idx, seg) in segments.iter().enumerate().rev() { + if seg.truncatable && !seg.is_suffix { + indices.push(idx); + } + } + + if indices.is_empty() { + return None; + } + + let mut changed = false; + for idx in indices { + let original_width = UnicodeWidthStr::width(segments[idx].original); + if original_width <= max_width && segment_count > 2 { + continue; + } + let seg_width = UnicodeWidthStr::width(segments[idx].text.as_str()); + let other_width = width.saturating_sub(seg_width); + let allowed_width = max_width.saturating_sub(other_width).max(1); + let new_text = front_truncate(segments[idx].original, allowed_width); + if new_text != segments[idx].text { + segments[idx].text = new_text; + changed = true; + break; + } + } + + if !changed { + return None; + } + } + }; + + for (left_count, right_count) in prioritized.into_iter().chain(fallback.into_iter()) { + let mut segments: Vec> = raw_segments[..left_count] + .iter() + .map(|seg| Segment { + original: seg, + text: (*seg).to_string(), + truncatable: true, + is_suffix: false, + }) + .collect(); + + let need_ellipsis = left_count + right_count < segment_count; + if need_ellipsis { + segments.push(Segment { + original: "…", + text: "…".to_string(), + truncatable: false, + is_suffix: false, + }); + } + + if right_count > 0 { + segments.extend( + raw_segments[segment_count - right_count..] + .iter() + .map(|seg| Segment { + original: seg, + text: (*seg).to_string(), + truncatable: true, + is_suffix: true, + }), + ); + } + + let allow_front_truncate = need_ellipsis || segment_count <= 2; + if let Some(candidate) = fit_segments(&mut segments, allow_front_truncate) { + return candidate; + } + } + + front_truncate(path, max_width) +} + #[cfg(test)] mod tests { use super::*; @@ -203,6 +418,49 @@ mod tests { ); } + #[test] + fn test_center_truncate_doesnt_truncate_short_path() { + let sep = std::path::MAIN_SEPARATOR; + let path = format!("{sep}Users{sep}codex{sep}Public"); + let truncated = center_truncate_path(&path, 40); + + assert_eq!(truncated, path); + } + + #[test] + fn test_center_truncate_truncates_long_path() { + let sep = std::path::MAIN_SEPARATOR; + let path = format!("~{sep}hello{sep}the{sep}fox{sep}is{sep}very{sep}fast"); + let truncated = center_truncate_path(&path, 24); + + assert_eq!( + truncated, + format!("~{sep}hello{sep}the{sep}…{sep}very{sep}fast") + ); + } + + #[test] + fn test_center_truncate_truncates_long_windows_path() { + let sep = std::path::MAIN_SEPARATOR; + let path = format!( + "C:{sep}Users{sep}codex{sep}Projects{sep}super{sep}long{sep}windows{sep}path{sep}file.txt" + ); + let truncated = center_truncate_path(&path, 36); + + let expected = format!("C:{sep}Users{sep}codex{sep}…{sep}path{sep}file.txt"); + + assert_eq!(truncated, expected); + } + + #[test] + fn test_center_truncate_handles_long_segment() { + let sep = std::path::MAIN_SEPARATOR; + let path = format!("~{sep}supercalifragilisticexpialidocious"); + let truncated = center_truncate_path(&path, 18); + + assert_eq!(truncated, format!("~{sep}…cexpialidocious")); + } + #[test] fn test_format_json_compact_array() { let json = r#"[ 1, 2, { "key": "value" }, "string" ]"#; From d555b684694d906b6ab832cd380e4aedece9d9df Mon Sep 17 00:00:00 2001 From: jimmyfraiture2 Date: Mon, 15 Sep 2025 14:52:39 +0100 Subject: [PATCH 61/77] fix: race condition unified exec (#3644) Fix race condition without storing an rx in the session --- .../src/exec_command/exec_command_session.rs | 44 +++++++------------ .../core/src/exec_command/session_manager.rs | 31 +++++++------ codex-rs/core/src/unified_exec/mod.rs | 26 ++++++----- 3 files changed, 46 insertions(+), 55 deletions(-) diff --git a/codex-rs/core/src/exec_command/exec_command_session.rs b/codex-rs/core/src/exec_command/exec_command_session.rs index 3bf647ef45..31b3c929b2 100644 --- a/codex-rs/core/src/exec_command/exec_command_session.rs +++ b/codex-rs/core/src/exec_command/exec_command_session.rs @@ -11,9 +11,6 @@ pub(crate) struct ExecCommandSession { /// Broadcast stream of output chunks read from the PTY. New subscribers /// receive only chunks emitted after they subscribe. output_tx: broadcast::Sender>, - /// Receiver subscribed before the child process starts emitting output so - /// the first caller can consume any early data without races. - initial_output_rx: StdMutex>>>, /// Child killer handle for termination on drop (can signal independently /// of a thread blocked in `.wait()`). @@ -41,25 +38,20 @@ impl ExecCommandSession { writer_handle: JoinHandle<()>, wait_handle: JoinHandle<()>, exit_status: std::sync::Arc, - ) -> Self { - Self { - writer_tx, - output_tx, - initial_output_rx: StdMutex::new(None), - killer: StdMutex::new(Some(killer)), - reader_handle: StdMutex::new(Some(reader_handle)), - writer_handle: StdMutex::new(Some(writer_handle)), - wait_handle: StdMutex::new(Some(wait_handle)), - exit_status, - } - } - - pub(crate) fn set_initial_output_receiver(&self, receiver: broadcast::Receiver>) { - if let Ok(mut guard) = self.initial_output_rx.lock() - && guard.is_none() - { - *guard = Some(receiver); - } + ) -> (Self, broadcast::Receiver>) { + let initial_output_rx = output_tx.subscribe(); + ( + Self { + writer_tx, + output_tx, + killer: StdMutex::new(Some(killer)), + reader_handle: StdMutex::new(Some(reader_handle)), + writer_handle: StdMutex::new(Some(writer_handle)), + wait_handle: StdMutex::new(Some(wait_handle)), + exit_status, + }, + initial_output_rx, + ) } pub(crate) fn writer_sender(&self) -> mpsc::Sender> { @@ -67,13 +59,7 @@ impl ExecCommandSession { } pub(crate) fn output_receiver(&self) -> broadcast::Receiver> { - if let Ok(mut guard) = self.initial_output_rx.lock() - && let Some(receiver) = guard.take() - { - receiver - } else { - self.output_tx.subscribe() - } + self.output_tx.subscribe() } pub(crate) fn has_exited(&self) -> bool { diff --git a/codex-rs/core/src/exec_command/session_manager.rs b/codex-rs/core/src/exec_command/session_manager.rs index 26fb3f3ecb..61c70f0cc2 100644 --- a/codex-rs/core/src/exec_command/session_manager.rs +++ b/codex-rs/core/src/exec_command/session_manager.rs @@ -93,18 +93,16 @@ impl SessionManager { .fetch_add(1, std::sync::atomic::Ordering::SeqCst), ); - let (session, mut exit_rx) = - create_exec_command_session(params.clone()) - .await - .map_err(|err| { - format!( - "failed to create exec command session for session id {}: {err}", - session_id.0 - ) - })?; + let (session, mut output_rx, mut exit_rx) = create_exec_command_session(params.clone()) + .await + .map_err(|err| { + format!( + "failed to create exec command session for session id {}: {err}", + session_id.0 + ) + })?; // Insert into session map. - let mut output_rx = session.output_receiver(); self.sessions.lock().await.insert(session_id, session); // Collect output until either timeout expires or process exits. @@ -245,7 +243,11 @@ impl SessionManager { /// Spawn PTY and child process per spawn_exec_command_session logic. async fn create_exec_command_session( params: ExecCommandParams, -) -> anyhow::Result<(ExecCommandSession, oneshot::Receiver)> { +) -> anyhow::Result<( + ExecCommandSession, + tokio::sync::broadcast::Receiver>, + oneshot::Receiver, +)> { let ExecCommandParams { cmd, yield_time_ms: _, @@ -279,8 +281,6 @@ async fn create_exec_command_session( let (writer_tx, mut writer_rx) = mpsc::channel::>(128); // Broadcast for streaming PTY output to readers: subscribers receive from subscription time. let (output_tx, _) = tokio::sync::broadcast::channel::>(256); - let initial_output_rx = output_tx.subscribe(); - // Reader task: drain PTY and forward chunks to output channel. let mut reader = pair.master.try_clone_reader()?; let output_tx_clone = output_tx.clone(); @@ -342,7 +342,7 @@ async fn create_exec_command_session( }); // Create and store the session with channels. - let session = ExecCommandSession::new( + let (session, initial_output_rx) = ExecCommandSession::new( writer_tx, output_tx, killer, @@ -351,8 +351,7 @@ async fn create_exec_command_session( wait_handle, exit_status, ); - session.set_initial_output_receiver(initial_output_rx); - Ok((session, exit_rx)) + Ok((session, initial_output_rx, exit_rx)) } #[cfg(test)] diff --git a/codex-rs/core/src/unified_exec/mod.rs b/codex-rs/core/src/unified_exec/mod.rs index c6980c53e2..99b19796b8 100644 --- a/codex-rs/core/src/unified_exec/mod.rs +++ b/codex-rs/core/src/unified_exec/mod.rs @@ -100,10 +100,13 @@ type OutputBuffer = Arc>; type OutputHandles = (OutputBuffer, Arc); impl ManagedUnifiedExecSession { - fn new(session: ExecCommandSession) -> Self { + fn new( + session: ExecCommandSession, + initial_output_rx: tokio::sync::broadcast::Receiver>, + ) -> Self { let output_buffer = Arc::new(Mutex::new(OutputBufferState::default())); let output_notify = Arc::new(Notify::new()); - let mut receiver = session.output_receiver(); + let mut receiver = initial_output_rx; let buffer_clone = Arc::clone(&output_buffer); let notify_clone = Arc::clone(&output_notify); let output_task = tokio::spawn(async move { @@ -193,8 +196,8 @@ impl UnifiedExecSessionManager { } else { let command = request.input_chunks.to_vec(); let new_id = self.next_session_id.fetch_add(1, Ordering::SeqCst); - let session = create_unified_exec_session(&command).await?; - let managed_session = ManagedUnifiedExecSession::new(session); + let (session, initial_output_rx) = create_unified_exec_session(&command).await?; + let managed_session = ManagedUnifiedExecSession::new(session, initial_output_rx); let (buffer, notify) = managed_session.output_handles(); writer_tx = managed_session.writer_sender(); output_buffer = buffer; @@ -297,7 +300,13 @@ impl UnifiedExecSessionManager { async fn create_unified_exec_session( command: &[String], -) -> Result { +) -> Result< + ( + ExecCommandSession, + tokio::sync::broadcast::Receiver>, + ), + UnifiedExecError, +> { if command.is_empty() { return Err(UnifiedExecError::MissingCommandLine); } @@ -327,7 +336,6 @@ async fn create_unified_exec_session( let (writer_tx, mut writer_rx) = mpsc::channel::>(128); let (output_tx, _) = tokio::sync::broadcast::channel::>(256); - let initial_output_rx = output_tx.subscribe(); let mut reader = pair .master @@ -381,7 +389,7 @@ async fn create_unified_exec_session( wait_exit_status.store(true, Ordering::SeqCst); }); - let session = ExecCommandSession::new( + let (session, initial_output_rx) = ExecCommandSession::new( writer_tx, output_tx, killer, @@ -390,9 +398,7 @@ async fn create_unified_exec_session( wait_handle, exit_status, ); - session.set_initial_output_receiver(initial_output_rx); - - Ok(session) + Ok((session, initial_output_rx)) } #[cfg(test)] From 6aafe37752f2dc93a402b57f8931c886ffd5c363 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Mon, 15 Sep 2025 07:17:46 -0700 Subject: [PATCH 62/77] chore: set `prerelease:true` for now (#3645) --- .github/workflows/rust-release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rust-release.yml b/.github/workflows/rust-release.yml index 07af62a17c..2b51c099eb 100644 --- a/.github/workflows/rust-release.yml +++ b/.github/workflows/rust-release.yml @@ -211,7 +211,8 @@ jobs: files: dist/** # Mark as prerelease only when the version has a suffix after x.y.z # (e.g. -alpha, -beta). Otherwise publish a normal release. - prerelease: ${{ contains(steps.release_name.outputs.name, '-') }} + # prerelease: ${{ contains(steps.release_name.outputs.name, '-') }} + prerelease: true - uses: facebook/dotslash-publish-release@v2 env: From d60cbed69116daf3b9f03a8f02fecaece8c673bd Mon Sep 17 00:00:00 2001 From: Thibault Sottiaux Date: Mon, 15 Sep 2025 07:48:22 -0700 Subject: [PATCH 63/77] fix: add references (#3633) --- codex-rs/core/swiftfox_prompt.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/codex-rs/core/swiftfox_prompt.md b/codex-rs/core/swiftfox_prompt.md index d06e53a63c..12639ecdee 100644 --- a/codex-rs/core/swiftfox_prompt.md +++ b/codex-rs/core/swiftfox_prompt.md @@ -90,3 +90,11 @@ You are producing plain text that will later be styled by the CLI. Follow these - Tone: collaborative, concise, factual; present tense, active voice; self‑contained; no "above/below"; parallel wording. - Don'ts: no nested bullets/hierarchies; no ANSI codes; don't cram unrelated keywords; keep keyword lists short—wrap/reformat if long; avoid naming formatting styles in answers. - Adaptation: code explanations → precise, structured with code refs; simple tasks → lead with outcome; big changes → logical walkthrough + rationale + next actions; casual one-offs → plain sentences, no headers/bullets. +- File References: When referencing files in your response, make sure to include the relevant start line and always follow the below rules: + * Use inline code to make file paths clickable. + * Each reference should have a stand alone path. Even if it's the same file. + * Accepted: absolute, workspace‑relative, a/ or b/ diff prefixes, or bare filename/suffix. + * Line/column (1‑based, optional): :line[:column] or #Lline[Ccolumn] (column defaults to 1). + * Do not use URIs like file://, vscode://, or https://. + * Do not provide range of lines + * Examples: src/app.ts, src/app.ts:42, b/server/index.js#L10, C:\repo\project\main.rs:12:5 From f037b2fd563856ebbac834ec716cbe0c582f25f4 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Mon, 15 Sep 2025 08:17:13 -0700 Subject: [PATCH 64/77] chore: rename (#3648) --- codex-rs/common/src/model_presets.rs | 22 +++++++++---------- ...iftfox_prompt.md => gpt_5_codex_prompt.md} | 4 ++-- codex-rs/core/src/client_common.rs | 2 +- codex-rs/core/src/config.rs | 12 +++++----- codex-rs/core/src/internal_storage.rs | 4 ++-- codex-rs/core/src/model_family.rs | 6 ++--- codex-rs/tui/src/lib.rs | 12 +++++----- codex-rs/tui/src/new_model_popup.rs | 6 ++--- 8 files changed, 34 insertions(+), 34 deletions(-) rename codex-rs/core/{swiftfox_prompt.md => gpt_5_codex_prompt.md} (98%) diff --git a/codex-rs/common/src/model_presets.rs b/codex-rs/common/src/model_presets.rs index 5353a5c341..065bb1e340 100644 --- a/codex-rs/common/src/model_presets.rs +++ b/codex-rs/common/src/model_presets.rs @@ -1,4 +1,4 @@ -use codex_core::config::SWIFTFOX_MEDIUM_MODEL; +use codex_core::config::GPT_5_CODEX_MEDIUM_MODEL; use codex_core::protocol_config_types::ReasoningEffort; use codex_protocol::mcp_protocol::AuthMode; @@ -19,24 +19,24 @@ pub struct ModelPreset { const PRESETS: &[ModelPreset] = &[ ModelPreset { - id: "swiftfox-low", - label: "swiftfox low", + id: "gpt-5-codex-low", + label: "gpt-5-codex low", description: "", - model: "swiftfox", + model: "gpt-5-codex", effort: Some(ReasoningEffort::Low), }, ModelPreset { - id: "swiftfox-medium", - label: "swiftfox medium", + id: "gpt-5-codex-medium", + label: "gpt-5-codex medium", description: "", - model: "swiftfox", + model: "gpt-5-codex", effort: None, }, ModelPreset { - id: "swiftfox-high", - label: "swiftfox high", + id: "gpt-5-codex-high", + label: "gpt-5-codex high", description: "", - model: "swiftfox", + model: "gpt-5-codex", effort: Some(ReasoningEffort::High), }, ModelPreset { @@ -74,7 +74,7 @@ pub fn builtin_model_presets(auth_mode: Option) -> Vec { Some(AuthMode::ApiKey) => PRESETS .iter() .copied() - .filter(|p| p.model != SWIFTFOX_MEDIUM_MODEL) + .filter(|p| p.model != GPT_5_CODEX_MEDIUM_MODEL) .collect(), _ => PRESETS.to_vec(), } diff --git a/codex-rs/core/swiftfox_prompt.md b/codex-rs/core/gpt_5_codex_prompt.md similarity index 98% rename from codex-rs/core/swiftfox_prompt.md rename to codex-rs/core/gpt_5_codex_prompt.md index 12639ecdee..2c49fafec6 100644 --- a/codex-rs/core/swiftfox_prompt.md +++ b/codex-rs/core/gpt_5_codex_prompt.md @@ -1,4 +1,4 @@ -You are Swiftfox. You are running as a coding agent in the Codex CLI on a user's computer. +You are Codex, based on GPT-5. You are running as a coding agent in the Codex CLI on a user's computer. ## General @@ -26,7 +26,7 @@ When using the planning tool: ## Codex CLI harness, sandboxing, and approvals -The Codex CLI harness supports several different sandboxing, and approval configurations that the user can choose from. +The Codex CLI harness supports several different sandboxing, and approval configurations that the user can choose from. Filesystem sandboxing defines which files can be read or written. The options are: - **read-only**: You can only read files. diff --git a/codex-rs/core/src/client_common.rs b/codex-rs/core/src/client_common.rs index 0d63416580..eead654b9e 100644 --- a/codex-rs/core/src/client_common.rs +++ b/codex-rs/core/src/client_common.rs @@ -215,7 +215,7 @@ mod tests { expects_apply_patch_instructions: false, }, InstructionsTestCase { - slug: "swiftfox", + slug: "gpt-5-codex", expects_apply_patch_instructions: false, }, ]; diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index 0c0d181d50..abaa2f1c85 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -38,8 +38,8 @@ use toml_edit::Table as TomlTable; const OPENAI_DEFAULT_MODEL: &str = "gpt-5"; const OPENAI_DEFAULT_REVIEW_MODEL: &str = "gpt-5"; -pub const SWIFTFOX_MEDIUM_MODEL: &str = "swiftfox"; -pub const SWIFTFOX_MODEL_DISPLAY_NAME: &str = "swiftfox-medium"; +pub const GPT_5_CODEX_MEDIUM_MODEL: &str = "gpt-5-codex"; +pub const GPT_5_CODEX_DISPLAY_NAME: &str = "gpt-5-codex"; /// Maximum number of bytes of the documentation that will be embedded. Larger /// files are *silently truncated* to this size so we do not take up too much of @@ -1296,7 +1296,7 @@ exclude_slash_tmp = true persist_model_selection( codex_home.path(), None, - "swiftfox", + "gpt-5-codex", Some(ReasoningEffort::High), ) .await?; @@ -1305,7 +1305,7 @@ exclude_slash_tmp = true tokio::fs::read_to_string(codex_home.path().join(CONFIG_TOML_FILE)).await?; let parsed: ConfigToml = toml::from_str(&serialized)?; - assert_eq!(parsed.model.as_deref(), Some("swiftfox")); + assert_eq!(parsed.model.as_deref(), Some("gpt-5-codex")); assert_eq!(parsed.model_reasoning_effort, Some(ReasoningEffort::High)); Ok(()) @@ -1359,7 +1359,7 @@ model = "gpt-4.1" persist_model_selection( codex_home.path(), Some("dev"), - "swiftfox", + "gpt-5-codex", Some(ReasoningEffort::Medium), ) .await?; @@ -1372,7 +1372,7 @@ model = "gpt-4.1" .get("dev") .expect("profile should be created"); - assert_eq!(profile.model.as_deref(), Some("swiftfox")); + assert_eq!(profile.model.as_deref(), Some("gpt-5-codex")); assert_eq!( profile.model_reasoning_effort, Some(ReasoningEffort::Medium) diff --git a/codex-rs/core/src/internal_storage.rs b/codex-rs/core/src/internal_storage.rs index 81a60fbce7..e8e0c09057 100644 --- a/codex-rs/core/src/internal_storage.rs +++ b/codex-rs/core/src/internal_storage.rs @@ -11,8 +11,8 @@ pub(crate) const INTERNAL_STORAGE_FILE: &str = "internal_storage.json"; pub struct InternalStorage { #[serde(skip)] storage_path: PathBuf, - #[serde(default, alias = "gpt_5_high_model_prompt_seen")] - pub swiftfox_model_prompt_seen: bool, + #[serde(default)] + pub gpt_5_codex_model_prompt_seen: bool, } // TODO(jif) generalise all the file writers and build proper async channel inserters. diff --git a/codex-rs/core/src/model_family.rs b/codex-rs/core/src/model_family.rs index d3a5d00521..54c18daec3 100644 --- a/codex-rs/core/src/model_family.rs +++ b/codex-rs/core/src/model_family.rs @@ -4,7 +4,7 @@ use crate::tool_apply_patch::ApplyPatchToolType; /// The `instructions` field in the payload sent to a model should always start /// with this content. const BASE_INSTRUCTIONS: &str = include_str!("../prompt.md"); -const SWIFTFOX_INSTRUCTIONS: &str = include_str!("../swiftfox_prompt.md"); +const GPT_5_CODEX_INSTRUCTIONS: &str = include_str!("../gpt_5_codex_prompt.md"); /// A model family is a group of models that share certain characteristics. #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -99,12 +99,12 @@ pub fn find_family_for_model(slug: &str) -> Option { model_family!(slug, "gpt-4o", needs_special_apply_patch_instructions: true) } else if slug.starts_with("gpt-3.5") { model_family!(slug, "gpt-3.5", needs_special_apply_patch_instructions: true) - } else if slug.starts_with("codex-") || slug.starts_with("swiftfox") { + } else if slug.starts_with("codex-") || slug.starts_with("gpt-5-codex") { model_family!( slug, slug, supports_reasoning_summaries: true, reasoning_summary_format: ReasoningSummaryFormat::Experimental, - base_instructions: SWIFTFOX_INSTRUCTIONS.to_string(), + base_instructions: GPT_5_CODEX_INSTRUCTIONS.to_string(), ) } else if slug.starts_with("gpt-5") { model_family!( diff --git a/codex-rs/tui/src/lib.rs b/codex-rs/tui/src/lib.rs index 5fe36dd142..995ca17a6b 100644 --- a/codex-rs/tui/src/lib.rs +++ b/codex-rs/tui/src/lib.rs @@ -11,7 +11,7 @@ use codex_core::RolloutRecorder; use codex_core::config::Config; use codex_core::config::ConfigOverrides; use codex_core::config::ConfigToml; -use codex_core::config::SWIFTFOX_MEDIUM_MODEL; +use codex_core::config::GPT_5_CODEX_MEDIUM_MODEL; use codex_core::config::find_codex_home; use codex_core::config::load_config_as_toml_with_cli_overrides; use codex_core::config::persist_model_selection; @@ -381,9 +381,9 @@ async fn run_ratatui_app( &cli, &config, active_profile.as_deref(), - internal_storage.swiftfox_model_prompt_seen, + internal_storage.gpt_5_codex_model_prompt_seen, ) { - internal_storage.swiftfox_model_prompt_seen = true; + internal_storage.gpt_5_codex_model_prompt_seen = true; if let Err(e) = internal_storage.persist().await { error!("Failed to persist internal storage: {e:?}"); } @@ -392,7 +392,7 @@ async fn run_ratatui_app( let switch_to_new_model = upgrade_decision == ModelUpgradeDecision::Switch; if switch_to_new_model { - config.model = SWIFTFOX_MEDIUM_MODEL.to_owned(); + config.model = GPT_5_CODEX_MEDIUM_MODEL.to_owned(); config.model_reasoning_effort = None; if let Err(e) = persist_model_selection( &config.codex_home, @@ -525,13 +525,13 @@ fn should_show_model_rollout_prompt( cli: &Cli, config: &Config, active_profile: Option<&str>, - swiftfox_model_prompt_seen: bool, + gpt_5_codex_model_prompt_seen: bool, ) -> bool { let login_status = get_login_status(config); active_profile.is_none() && cli.model.is_none() - && !swiftfox_model_prompt_seen + && !gpt_5_codex_model_prompt_seen && config.model_provider.requires_openai_auth && matches!(login_status, LoginStatus::AuthMode(AuthMode::ChatGPT)) && !cli.oss diff --git a/codex-rs/tui/src/new_model_popup.rs b/codex-rs/tui/src/new_model_popup.rs index 153a91a2cb..aad89e48f4 100644 --- a/codex-rs/tui/src/new_model_popup.rs +++ b/codex-rs/tui/src/new_model_popup.rs @@ -3,7 +3,7 @@ use crate::frames::FRAME_TICK_DEFAULT; use crate::tui::FrameRequester; use crate::tui::Tui; use crate::tui::TuiEvent; -use codex_core::config::SWIFTFOX_MODEL_DISPLAY_NAME; +use codex_core::config::GPT_5_CODEX_DISPLAY_NAME; use color_eyre::eyre::Result; use crossterm::event::KeyCode; use crossterm::event::KeyEvent; @@ -130,7 +130,7 @@ impl WidgetRef for &ModelUpgradePopup { lines.push("".into()); lines.push( - format!(" Codex is now powered by {SWIFTFOX_MODEL_DISPLAY_NAME}, a new model that is") + format!(" Codex is now powered by {GPT_5_CODEX_DISPLAY_NAME}, a new model that is") .into(), ); lines.push(Line::from(vec![ @@ -156,7 +156,7 @@ impl WidgetRef for &ModelUpgradePopup { lines.push(create_option( 0, ModelUpgradeOption::TryNewModel, - &format!("Yes, switch me to {SWIFTFOX_MODEL_DISPLAY_NAME}"), + &format!("Yes, switch me to {GPT_5_CODEX_DISPLAY_NAME}"), )); lines.push("".into()); lines.push(create_option( From 934d728946ac579f48b4f08aa82941dfce4da783 Mon Sep 17 00:00:00 2001 From: Thibault Sottiaux Date: Mon, 15 Sep 2025 08:30:32 -0700 Subject: [PATCH 65/77] feat: skip animations on small terminals (#3647) Changes: - skip the welcome animation when the terminal area is below 60x21 - skip the model upgrade animation when the terminal area is below 60x24 to avoid clipping --------- Co-authored-by: Michael Bolin --- codex-rs/tui/src/new_model_popup.rs | 18 ++++++++++++------ codex-rs/tui/src/onboarding/welcome.rs | 16 ++++++++++++---- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/codex-rs/tui/src/new_model_popup.rs b/codex-rs/tui/src/new_model_popup.rs index aad89e48f4..5ed53e4d2f 100644 --- a/codex-rs/tui/src/new_model_popup.rs +++ b/codex-rs/tui/src/new_model_popup.rs @@ -22,6 +22,8 @@ use std::time::Duration; use tokio_stream::StreamExt; const FRAME_TICK: Duration = FRAME_TICK_DEFAULT; +const MIN_ANIMATION_HEIGHT: u16 = 24; +const MIN_ANIMATION_WIDTH: u16 = 60; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub(crate) enum ModelUpgradeDecision { @@ -121,13 +123,17 @@ impl WidgetRef for &ModelUpgradePopup { fn render_ref(&self, area: Rect, buf: &mut Buffer) { Clear.render(area, buf); - let mut lines: Vec = self.frames()[self.frame_idx] - .lines() - .map(|l| l.to_string().into()) - .collect(); + // Skip the animation entirely when the viewport is too small so we don't clip frames. + let show_animation = + area.height >= MIN_ANIMATION_HEIGHT && area.width >= MIN_ANIMATION_WIDTH; - // Spacer between animation and text content. - lines.push("".into()); + let mut lines: Vec = Vec::new(); + if show_animation { + let frame = self.frames()[self.frame_idx]; + lines.extend(frame.lines().map(|l| l.into())); + // Spacer between animation and text content. + lines.push("".into()); + } lines.push( format!(" Codex is now powered by {GPT_5_CODEX_DISPLAY_NAME}, a new model that is") diff --git a/codex-rs/tui/src/onboarding/welcome.rs b/codex-rs/tui/src/onboarding/welcome.rs index 40911b84f3..1e99fbf562 100644 --- a/codex-rs/tui/src/onboarding/welcome.rs +++ b/codex-rs/tui/src/onboarding/welcome.rs @@ -17,6 +17,8 @@ use std::time::Duration; use std::time::Instant; const FRAME_TICK: Duration = FRAME_TICK_DEFAULT; +const MIN_ANIMATION_HEIGHT: u16 = 21; +const MIN_ANIMATION_WIDTH: u16 = 60; pub(crate) struct WelcomeWidget { pub is_logged_in: bool, @@ -44,11 +46,17 @@ impl WidgetRef for &WelcomeWidget { let frames = &FRAMES_DEFAULT; let idx = ((elapsed_ms / FRAME_TICK.as_millis()) % frames.len() as u128) as usize; + // Skip the animation entirely when the viewport is too small so we don't clip frames. + let show_animation = + area.height >= MIN_ANIMATION_HEIGHT && area.width >= MIN_ANIMATION_WIDTH; - let mut lines: Vec = Vec::with_capacity(frames.len() + 2); - lines.extend(frames[idx].lines().map(|l| l.into())); - - lines.push("".into()); + let mut lines: Vec = Vec::new(); + if show_animation { + let frame_line_count = frames[idx].lines().count(); + lines.reserve(frame_line_count + 2); + lines.extend(frames[idx].lines().map(|l| l.into())); + lines.push("".into()); + } lines.push(Line::from(vec![ " ".into(), "Welcome to ".into(), From b1c291e2bbca0706ec9b2888f358646e65a8f315 Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Mon, 15 Sep 2025 08:35:30 -0700 Subject: [PATCH 66/77] Add file reference guidelines to gpt-5 prompt (#3651) --- codex-rs/core/prompt.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/codex-rs/core/prompt.md b/codex-rs/core/prompt.md index e18327b46b..e4590c386d 100644 --- a/codex-rs/core/prompt.md +++ b/codex-rs/core/prompt.md @@ -251,6 +251,16 @@ You are producing plain text that will later be styled by the CLI. Follow these - Apply to inline examples and to bullet keywords if the keyword itself is a literal file/command. - Never mix monospace and bold markers; choose one based on whether it’s a keyword (`**`) or inline code/path (`` ` ``). +**File References** +When referencing files in your response, make sure to include the relevant start line and always follow the below rules: + * Use inline code to make file paths clickable. + * Each reference should have a stand alone path. Even if it's the same file. + * Accepted: absolute, workspace‑relative, a/ or b/ diff prefixes, or bare filename/suffix. + * Line/column (1‑based, optional): :line[:column] or #Lline[Ccolumn] (column defaults to 1). + * Do not use URIs like file://, vscode://, or https://. + * Do not provide range of lines + * Examples: src/app.ts, src/app.ts:42, b/server/index.js#L10, C:\repo\project\main.rs:12:5 + **Structure** - Place related bullets together; don’t mix unrelated concepts in the same section. From cf63cbf1533ea9801782ce4241e0cedcac3942e6 Mon Sep 17 00:00:00 2001 From: easong-openai Date: Mon, 15 Sep 2025 08:44:53 -0700 Subject: [PATCH 67/77] fix stray login url characters persisting in login (#3639) image Fixes this. --- .../tui/src/onboarding/onboarding_screen.rs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/codex-rs/tui/src/onboarding/onboarding_screen.rs b/codex-rs/tui/src/onboarding/onboarding_screen.rs index 76e533b4c1..12a2b4b134 100644 --- a/codex-rs/tui/src/onboarding/onboarding_screen.rs +++ b/codex-rs/tui/src/onboarding/onboarding_screen.rs @@ -319,6 +319,8 @@ pub(crate) async fn run_onboarding_app( use tokio_stream::StreamExt; let mut onboarding_screen = OnboardingScreen::new(tui, args); + // One-time guard to fully clear the screen after ChatGPT login success message is shown + let mut did_full_clear_after_success = false; tui.draw(u16::MAX, |frame| { frame.render_widget_ref(&onboarding_screen, frame.area()); @@ -337,6 +339,36 @@ pub(crate) async fn run_onboarding_app( onboarding_screen.handle_paste(text); } TuiEvent::Draw => { + if !did_full_clear_after_success + && onboarding_screen.steps.iter().any(|step| { + if let Step::Auth(w) = step { + w.sign_in_state.read().is_ok_and(|g| { + matches!(&*g, super::auth::SignInState::ChatGptSuccessMessage) + }) + } else { + false + } + }) + { + // Reset any lingering SGR (underline/color) before clearing + let _ = ratatui::crossterm::execute!( + std::io::stdout(), + ratatui::crossterm::style::SetAttribute( + ratatui::crossterm::style::Attribute::Reset + ), + ratatui::crossterm::style::SetAttribute( + ratatui::crossterm::style::Attribute::NoUnderline + ), + ratatui::crossterm::style::SetForegroundColor( + ratatui::crossterm::style::Color::Reset + ), + ratatui::crossterm::style::SetBackgroundColor( + ratatui::crossterm::style::Color::Reset + ) + ); + let _ = tui.terminal.clear(); + did_full_clear_after_success = true; + } let _ = tui.draw(u16::MAX, |frame| { frame.render_widget_ref(&onboarding_screen, frame.area()); }); From 5c583fe89bbd3ab4dc9a05768299f94e52fe8452 Mon Sep 17 00:00:00 2001 From: ae Date: Mon, 15 Sep 2025 08:49:37 -0700 Subject: [PATCH 68/77] feat: tweak onboarding strings (#3650) --- codex-rs/core/src/config.rs | 1 - codex-rs/tui/src/new_model_popup.rs | 18 ++++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index abaa2f1c85..f96933069d 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -39,7 +39,6 @@ use toml_edit::Table as TomlTable; const OPENAI_DEFAULT_MODEL: &str = "gpt-5"; const OPENAI_DEFAULT_REVIEW_MODEL: &str = "gpt-5"; pub const GPT_5_CODEX_MEDIUM_MODEL: &str = "gpt-5-codex"; -pub const GPT_5_CODEX_DISPLAY_NAME: &str = "gpt-5-codex"; /// Maximum number of bytes of the documentation that will be embedded. Larger /// files are *silently truncated* to this size so we do not take up too much of diff --git a/codex-rs/tui/src/new_model_popup.rs b/codex-rs/tui/src/new_model_popup.rs index 5ed53e4d2f..12325074c0 100644 --- a/codex-rs/tui/src/new_model_popup.rs +++ b/codex-rs/tui/src/new_model_popup.rs @@ -3,7 +3,6 @@ use crate::frames::FRAME_TICK_DEFAULT; use crate::tui::FrameRequester; use crate::tui::Tui; use crate::tui::TuiEvent; -use codex_core::config::GPT_5_CODEX_DISPLAY_NAME; use color_eyre::eyre::Result; use crossterm::event::KeyCode; use crossterm::event::KeyEvent; @@ -135,17 +134,16 @@ impl WidgetRef for &ModelUpgradePopup { lines.push("".into()); } - lines.push( - format!(" Codex is now powered by {GPT_5_CODEX_DISPLAY_NAME}, a new model that is") - .into(), - ); lines.push(Line::from(vec![ " ".into(), - "faster, a better collaborator, ".bold(), - "and ".into(), - "more steerable.".bold(), + "Introducing GPT-5-Codex".bold(), ])); lines.push("".into()); + lines.push( + " GPT-5-Codex works faster through easy tasks and harder on complex tasks,".into(), + ); + lines.push(" improves on code quality, and is more steerable with AGENTS.md.".into()); + lines.push("".into()); let create_option = |index: usize, option: ModelUpgradeOption, text: &str| -> Line<'static> { @@ -162,13 +160,13 @@ impl WidgetRef for &ModelUpgradePopup { lines.push(create_option( 0, ModelUpgradeOption::TryNewModel, - &format!("Yes, switch me to {GPT_5_CODEX_DISPLAY_NAME}"), + "Try the new GPT-5-Codex model", )); lines.push("".into()); lines.push(create_option( 1, ModelUpgradeOption::KeepCurrent, - "Not right now", + "Continue using current model", )); lines.push("".into()); lines.push( From 0de154194dc2b57bd82a351c8ef82c95e3329bb3 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Mon, 15 Sep 2025 10:02:53 -0700 Subject: [PATCH 69/77] fix: change MIN_ANIMATION_HEIGHT so show_animation is calculated correctly (#3656) Reported height was `20` instead of `21`, so `area.height >= MIN_ANIMATION_HEIGHT` was `false` and therefore `show_animation` was `false`, so the animation never displayed. --- codex-rs/tui/src/onboarding/welcome.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codex-rs/tui/src/onboarding/welcome.rs b/codex-rs/tui/src/onboarding/welcome.rs index 1e99fbf562..578e2b429f 100644 --- a/codex-rs/tui/src/onboarding/welcome.rs +++ b/codex-rs/tui/src/onboarding/welcome.rs @@ -17,7 +17,7 @@ use std::time::Duration; use std::time::Instant; const FRAME_TICK: Duration = FRAME_TICK_DEFAULT; -const MIN_ANIMATION_HEIGHT: u16 = 21; +const MIN_ANIMATION_HEIGHT: u16 = 20; const MIN_ANIMATION_WIDTH: u16 = 60; pub(crate) struct WelcomeWidget { From 0560079c414d191632bdfdb05568b92e2e974214 Mon Sep 17 00:00:00 2001 From: Jeremy Rose <172423086+nornagon-openai@users.noreply.github.com> Date: Mon, 15 Sep 2025 10:22:02 -0700 Subject: [PATCH 70/77] notifications on approvals and turn end (#3329) uses OSC 9 to notify when a turn ends or approval is required. won't work in vs code or terminal.app but iterm2/kitty/wezterm supports it :) --- codex-rs/core/src/config.rs | 57 ++++++++++++++++++++++ codex-rs/core/src/config_types.rs | 19 +++++++- codex-rs/tui/src/app.rs | 1 + codex-rs/tui/src/chatwidget.rs | 73 ++++++++++++++++++++++++++++ codex-rs/tui/src/chatwidget/tests.rs | 1 + codex-rs/tui/src/diff_render.rs | 2 +- codex-rs/tui/src/tui.rs | 47 ++++++++++++++++++ docs/config.md | 20 +++++++- 8 files changed, 216 insertions(+), 4 deletions(-) diff --git a/codex-rs/core/src/config.rs b/codex-rs/core/src/config.rs index f96933069d..0479e857c2 100644 --- a/codex-rs/core/src/config.rs +++ b/codex-rs/core/src/config.rs @@ -1,6 +1,7 @@ use crate::config_profile::ConfigProfile; use crate::config_types::History; use crate::config_types::McpServerConfig; +use crate::config_types::Notifications; use crate::config_types::ReasoningSummaryFormat; use crate::config_types::SandboxWorkspaceWrite; use crate::config_types::ShellEnvironmentPolicy; @@ -117,6 +118,10 @@ pub struct Config { /// If unset the feature is disabled. pub notify: Option>, + /// TUI notifications preference. When set, the TUI will send OSC 9 notifications on approvals + /// and turn completions when not focused. + pub tui_notifications: Notifications, + /// The directory that should be treated as the current working directory /// for the session. All relative paths inside the business-logic layer are /// resolved against this path. @@ -1043,6 +1048,11 @@ impl Config { include_view_image_tool, active_profile: active_profile_name, disable_paste_burst: cfg.disable_paste_burst.unwrap_or(false), + tui_notifications: cfg + .tui + .as_ref() + .map(|t| t.notifications.clone()) + .unwrap_or_default(), }; Ok(config) } @@ -1606,6 +1616,7 @@ model_verbosity = "high" include_view_image_tool: true, active_profile: Some("o3".to_string()), disable_paste_burst: false, + tui_notifications: Default::default(), }, o3_profile_config ); @@ -1663,6 +1674,7 @@ model_verbosity = "high" include_view_image_tool: true, active_profile: Some("gpt3".to_string()), disable_paste_burst: false, + tui_notifications: Default::default(), }; assert_eq!(expected_gpt3_profile_config, gpt3_profile_config); @@ -1735,6 +1747,7 @@ model_verbosity = "high" include_view_image_tool: true, active_profile: Some("zdr".to_string()), disable_paste_burst: false, + tui_notifications: Default::default(), }; assert_eq!(expected_zdr_profile_config, zdr_profile_config); @@ -1793,6 +1806,7 @@ model_verbosity = "high" include_view_image_tool: true, active_profile: Some("gpt5".to_string()), disable_paste_burst: false, + tui_notifications: Default::default(), }; assert_eq!(expected_gpt5_profile_config, gpt5_profile_config); @@ -1896,3 +1910,46 @@ trust_level = "trusted" Ok(()) } } + +#[cfg(test)] +mod notifications_tests { + use crate::config_types::Notifications; + use serde::Deserialize; + + #[derive(Deserialize, Debug, PartialEq)] + struct TuiTomlTest { + notifications: Notifications, + } + + #[derive(Deserialize, Debug, PartialEq)] + struct RootTomlTest { + tui: TuiTomlTest, + } + + #[test] + fn test_tui_notifications_true() { + let toml = r#" + [tui] + notifications = true + "#; + let parsed: RootTomlTest = toml::from_str(toml).expect("deserialize notifications=true"); + assert!(matches!( + parsed.tui.notifications, + Notifications::Enabled(true) + )); + } + + #[test] + fn test_tui_notifications_custom_array() { + let toml = r#" + [tui] + notifications = ["foo"] + "#; + let parsed: RootTomlTest = + toml::from_str(toml).expect("deserialize notifications=[\"foo\"]"); + assert!(matches!( + parsed.tui.notifications, + Notifications::Custom(ref v) if v == &vec!["foo".to_string()] + )); + } +} diff --git a/codex-rs/core/src/config_types.rs b/codex-rs/core/src/config_types.rs index 0722dfc0ea..ec8e8e67c6 100644 --- a/codex-rs/core/src/config_types.rs +++ b/codex-rs/core/src/config_types.rs @@ -76,9 +76,26 @@ pub enum HistoryPersistence { None, } +#[derive(Debug, Clone, PartialEq, Eq, Deserialize)] +#[serde(untagged)] +pub enum Notifications { + Enabled(bool), + Custom(Vec), +} + +impl Default for Notifications { + fn default() -> Self { + Self::Enabled(false) + } +} + /// Collection of settings that are specific to the TUI. #[derive(Deserialize, Debug, Clone, PartialEq, Default)] -pub struct Tui {} +pub struct Tui { + /// Enable desktop notifications from the TUI when the terminal is unfocused. + /// Defaults to `false`. + pub notifications: Notifications, +} #[derive(Deserialize, Debug, Clone, PartialEq, Default)] pub struct SandboxWorkspaceWrite { diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index bfa9c0caf2..205986c916 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -177,6 +177,7 @@ impl App { self.chat_widget.handle_paste(pasted); } TuiEvent::Draw => { + self.chat_widget.maybe_post_pending_notification(tui); if self .chat_widget .handle_paste_burst_tick(tui.frame_requester()) diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 367a63cf11..c03e7d3bc5 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -4,6 +4,7 @@ use std::path::PathBuf; use std::sync::Arc; use codex_core::config::Config; +use codex_core::config_types::Notifications; use codex_core::protocol::AgentMessageDeltaEvent; use codex_core::protocol::AgentMessageEvent; use codex_core::protocol::AgentReasoningDeltaEvent; @@ -59,6 +60,7 @@ use crate::bottom_pane::InputResult; use crate::bottom_pane::SelectionAction; use crate::bottom_pane::SelectionItem; use crate::clipboard_paste::paste_image_to_temp_png; +use crate::diff_render::display_path_for; use crate::get_git_diff::get_git_diff; use crate::history_cell; use crate::history_cell::CommandOutput; @@ -66,6 +68,7 @@ use crate::history_cell::ExecCell; use crate::history_cell::HistoryCell; use crate::history_cell::PatchEventType; use crate::slash_command::SlashCommand; +use crate::text_formatting::truncate_text; use crate::tui::FrameRequester; // streaming internals are provided by crate::streaming and crate::markdown_stream use crate::user_approval_widget::ApprovalRequest; @@ -136,6 +139,8 @@ pub(crate) struct ChatWidget { suppress_session_configured_redraw: bool, // User messages queued while a turn is in progress queued_user_messages: VecDeque, + // Pending notification to show when unfocused on next Draw + pending_notification: Option, } struct UserMessage { @@ -265,6 +270,8 @@ impl ChatWidget { // If there is a queued user message, send exactly one now to begin the next turn. self.maybe_send_next_queued_input(); + // Emit a notification when the turn completes (suppressed if focused). + self.notify(Notification::AgentTurnComplete); } pub(crate) fn set_token_info(&mut self, info: Option) { @@ -531,6 +538,9 @@ impl ChatWidget { self.flush_answer_stream_with_separator(); // Emit the proposed command into history (like proposed patches) self.add_to_history(history_cell::new_proposed_command(&ev.command)); + let command = shlex::try_join(ev.command.iter().map(|s| s.as_str())) + .unwrap_or_else(|_| ev.command.join(" ")); + self.notify(Notification::ExecApprovalRequested { command }); let request = ApprovalRequest::Exec { id, @@ -560,6 +570,10 @@ impl ChatWidget { }; self.bottom_pane.push_approval_request(request); self.request_redraw(); + self.notify(Notification::EditApprovalRequested { + cwd: self.config.cwd.clone(), + changes: ev.changes.keys().cloned().collect(), + }); } pub(crate) fn handle_exec_begin_now(&mut self, ev: ExecCommandBeginEvent) { @@ -686,6 +700,7 @@ impl ChatWidget { queued_user_messages: VecDeque::new(), show_welcome_banner: true, suppress_session_configured_redraw: false, + pending_notification: None, } } @@ -741,6 +756,7 @@ impl ChatWidget { queued_user_messages: VecDeque::new(), show_welcome_banner: true, suppress_session_configured_redraw: true, + pending_notification: None, } } @@ -1137,6 +1153,20 @@ impl ChatWidget { self.frame_requester.schedule_frame(); } + fn notify(&mut self, notification: Notification) { + if !notification.allowed_for(&self.config.tui_notifications) { + return; + } + self.pending_notification = Some(notification); + self.request_redraw(); + } + + pub(crate) fn maybe_post_pending_notification(&mut self, tui: &mut crate::tui::Tui) { + if let Some(notif) = self.pending_notification.take() { + tui.notify(notif.display()); + } + } + /// Mark the active exec cell as failed (✗) and flush it into history. fn finalize_active_exec_cell_as_failed(&mut self) { if let Some(cell) = self.active_exec_cell.take() { @@ -1449,6 +1479,49 @@ impl WidgetRef for &ChatWidget { } } +enum Notification { + AgentTurnComplete, + ExecApprovalRequested { command: String }, + EditApprovalRequested { cwd: PathBuf, changes: Vec }, +} + +impl Notification { + fn display(&self) -> String { + match self { + Notification::AgentTurnComplete => "Agent turn complete".to_string(), + Notification::ExecApprovalRequested { command } => { + format!("Approval requested: {}", truncate_text(command, 30)) + } + Notification::EditApprovalRequested { cwd, changes } => { + format!( + "Codex wants to edit {}", + if changes.len() == 1 { + #[allow(clippy::unwrap_used)] + display_path_for(changes.first().unwrap(), cwd) + } else { + format!("{} files", changes.len()) + } + ) + } + } + } + + fn type_name(&self) -> &str { + match self { + Notification::AgentTurnComplete => "agent-turn-complete", + Notification::ExecApprovalRequested { .. } + | Notification::EditApprovalRequested { .. } => "approval-requested", + } + } + + fn allowed_for(&self, settings: &Notifications) -> bool { + match settings { + Notifications::Enabled(enabled) => *enabled, + Notifications::Custom(allowed) => allowed.iter().any(|a| a == self.type_name()), + } + } +} + const EXAMPLE_PROMPTS: [&str; 6] = [ "Explain this codebase", "Summarize recent commits", diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index 73845bfe09..fb4ea5e888 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -251,6 +251,7 @@ fn make_chatwidget_manual() -> ( show_welcome_banner: true, queued_user_messages: VecDeque::new(), suppress_session_configured_redraw: false, + pending_notification: None, }; (widget, rx, op_rx) } diff --git a/codex-rs/tui/src/diff_render.rs b/codex-rs/tui/src/diff_render.rs index 20d26106b2..2787f76607 100644 --- a/codex-rs/tui/src/diff_render.rs +++ b/codex-rs/tui/src/diff_render.rs @@ -265,7 +265,7 @@ fn render_changes_block( out } -fn display_path_for(path: &Path, cwd: &Path) -> String { +pub(crate) fn display_path_for(path: &Path, cwd: &Path) -> String { let path_in_same_repo = match (get_git_repo_root(cwd), get_git_repo_root(path)) { (Some(cwd_repo), Some(path_repo)) => cwd_repo == path_repo, _ => false, diff --git a/codex-rs/tui/src/tui.rs b/codex-rs/tui/src/tui.rs index 26c188668d..6d7b9e8101 100644 --- a/codex-rs/tui/src/tui.rs +++ b/codex-rs/tui/src/tui.rs @@ -17,7 +17,9 @@ use crossterm::SynchronizedUpdate; use crossterm::cursor; use crossterm::cursor::MoveTo; use crossterm::event::DisableBracketedPaste; +use crossterm::event::DisableFocusChange; use crossterm::event::EnableBracketedPaste; +use crossterm::event::EnableFocusChange; use crossterm::event::Event; use crossterm::event::KeyEvent; use crossterm::event::KeyboardEnhancementFlags; @@ -60,6 +62,8 @@ pub fn set_modes() -> Result<()> { | KeyboardEnhancementFlags::REPORT_ALTERNATE_KEYS ) ); + + let _ = execute!(stdout(), EnableFocusChange); Ok(()) } @@ -111,6 +115,7 @@ pub fn restore() -> Result<()> { // Pop may fail on platforms that didn't support the push; ignore errors. let _ = execute!(stdout(), PopKeyboardEnhancementFlags); execute!(stdout(), DisableBracketedPaste)?; + let _ = execute!(stdout(), DisableFocusChange); disable_raw_mode()?; let _ = execute!(stdout(), crossterm::cursor::Show); Ok(()) @@ -163,6 +168,8 @@ pub struct Tui { suspend_cursor_y: Arc, // Bottom line of inline viewport // True when overlay alt-screen UI is active alt_screen_active: Arc, + // True when terminal/tab is focused; updated internally from crossterm events + terminal_focused: Arc, } #[cfg(unix)] @@ -214,6 +221,16 @@ impl FrameRequester { } impl Tui { + /// Emit a desktop notification now if the terminal is unfocused. + /// Returns true if a notification was posted. + pub fn notify(&mut self, message: impl AsRef) -> bool { + if !self.terminal_focused.load(Ordering::Relaxed) { + let _ = execute!(stdout(), PostNotification(message.as_ref().to_string())); + true + } else { + false + } + } pub fn new(terminal: Terminal) -> Self { let (frame_schedule_tx, frame_schedule_rx) = tokio::sync::mpsc::unbounded_channel(); let (draw_tx, _) = tokio::sync::broadcast::channel(1); @@ -270,6 +287,7 @@ impl Tui { #[cfg(unix)] suspend_cursor_y: Arc::new(AtomicU16::new(0)), alt_screen_active: Arc::new(AtomicBool::new(false)), + terminal_focused: Arc::new(AtomicBool::new(true)), } } @@ -289,6 +307,7 @@ impl Tui { let alt_screen_active = self.alt_screen_active.clone(); #[cfg(unix)] let suspend_cursor_y = self.suspend_cursor_y.clone(); + let terminal_focused = self.terminal_focused.clone(); let event_stream = async_stream::stream! { loop { select! { @@ -332,6 +351,12 @@ impl Tui { Event::Paste(pasted) => { yield TuiEvent::Paste(pasted); } + Event::FocusGained => { + terminal_focused.store(true, Ordering::Relaxed); + } + Event::FocusLost => { + terminal_focused.store(false, Ordering::Relaxed); + } _ => {} } } @@ -535,3 +560,25 @@ impl Tui { })? } } + +/// Command that emits an OSC 9 desktop notification with a message. +#[derive(Debug, Clone)] +pub struct PostNotification(pub String); + +impl Command for PostNotification { + fn write_ansi(&self, f: &mut impl std::fmt::Write) -> std::fmt::Result { + write!(f, "\x1b]9;{}\x07", self.0) + } + + #[cfg(windows)] + fn execute_winapi(&self) -> std::io::Result<()> { + Err(std::io::Error::other( + "tried to execute PostNotification using WinAPI; use ANSI instead", + )) + } + + #[cfg(windows)] + fn is_ansi_code_supported(&self) -> bool { + true + } +} diff --git a/docs/config.md b/docs/config.md index 6f10cb3fbd..01b3efe0a1 100644 --- a/docs/config.md +++ b/docs/config.md @@ -504,6 +504,9 @@ To have Codex use this script for notifications, you would configure it via `not notify = ["python3", "/Users/mbolin/.codex/notify.py"] ``` +> [!NOTE] +> Use `notify` for automation and integrations: Codex invokes your external program with a single JSON argument for each event, independent of the TUI. If you only want lightweight desktop notifications while using the TUI, prefer `tui.notifications`, which uses terminal escape codes and requires no external program. You can enable both; `tui.notifications` covers in‑TUI alerts (e.g., approval prompts), while `notify` is best for system‑level hooks or custom notifiers. Currently, `notify` emits only `agent-turn-complete`, whereas `tui.notifications` supports `agent-turn-complete` and `approval-requested` with optional filtering. + ## history By default, Codex CLI records messages sent to the model in `$CODEX_HOME/history.jsonl`. Note that on UNIX, the file permissions are set to `o600`, so it should only be readable and writable by the owner. @@ -576,9 +579,21 @@ Options that are specific to the TUI. ```toml [tui] -# More to come here +# Send desktop notifications when approvals are required or a turn completes. +# Defaults to false. +notifications = true + +# You can optionally filter to specific notification types. +# Available types are "agent-turn-complete" and "approval-requested". +notifications = [ "agent-turn-complete", "approval-requested" ] ``` +> [!NOTE] +> Codex emits desktop notifications using terminal escape codes. Not all terminals support these (notably, macOS Terminal.app and VS Code's terminal do not support custom notifications. iTerm2, Ghostty and WezTerm do support these notifications). + +> [!NOTE] +> `tui.notifications` is built‑in and limited to the TUI session. For programmatic or cross‑environment notifications—or to integrate with OS‑specific notifiers—use the top‑level `notify` option to run an external program that receives event JSON. The two settings are independent and can be used together. + ## Config reference | Key | Type / Values | Notes | @@ -616,7 +631,8 @@ Options that are specific to the TUI. | `history.persistence` | `save-all` \| `none` | History file persistence (default: `save-all`). | | `history.max_bytes` | number | Currently ignored (not enforced). | | `file_opener` | `vscode` \| `vscode-insiders` \| `windsurf` \| `cursor` \| `none` | URI scheme for clickable citations (default: `vscode`). | -| `tui` | table | TUI‑specific options (reserved). | +| `tui` | table | TUI‑specific options. | +| `tui.notifications` | boolean \| array | Enable desktop notifications in the tui (default: false). | | `hide_agent_reasoning` | boolean | Hide model reasoning events. | | `show_raw_agent_reasoning` | boolean | Show raw reasoning (when available). | | `model_reasoning_effort` | `minimal` \| `low` \| `medium` \| `high` | Responses API reasoning effort. | From 2df7f7efe5ace16214ed6c9360f459871e3b5e75 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Mon, 15 Sep 2025 10:52:49 -0700 Subject: [PATCH 71/77] chore: restore prerelease logic in rust-release.yml (#3659) Revert #3645. --- .github/workflows/rust-release.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/rust-release.yml b/.github/workflows/rust-release.yml index 2b51c099eb..07af62a17c 100644 --- a/.github/workflows/rust-release.yml +++ b/.github/workflows/rust-release.yml @@ -211,8 +211,7 @@ jobs: files: dist/** # Mark as prerelease only when the version has a suffix after x.y.z # (e.g. -alpha, -beta). Otherwise publish a normal release. - # prerelease: ${{ contains(steps.release_name.outputs.name, '-') }} - prerelease: true + prerelease: ${{ contains(steps.release_name.outputs.name, '-') }} - uses: facebook/dotslash-publish-release@v2 env: From 39ed8a7d2672b606b2d3f597f5197207d95905ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 11:58:57 -0700 Subject: [PATCH 72/77] chore(deps): bump serde_json from 1.0.143 to 1.0.145 in /codex-rs (#3617) Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.143 to 1.0.145.
Release notes

Sourced from serde_json's releases.

v1.0.145

  • Raise serde version requirement to >=1.0.220

v1.0.144

  • Switch serde dependency to serde_core (#1285)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.143&new-version=1.0.145)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- codex-rs/Cargo.lock | 23 +++++++++++++++++------ codex-rs/execpolicy/Cargo.toml | 2 +- codex-rs/file-search/Cargo.toml | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 39933bb7f1..a6f32b35c5 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -3926,18 +3926,28 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.223" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "a505d71960adde88e293da5cb5eda57093379f64e61cf77bf0e6a63af07a7bac" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.223" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20f57cbd357666aa7b3ac84a90b4ea328f1d4ddb6772b430caa5d9e1309bb9e9" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.223" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "3d428d07faf17e306e699ec1e91996e5a165ba5d6bce5b5155173e91a8a01a56" dependencies = [ "proc-macro2", "quote", @@ -3957,15 +3967,16 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.143" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "indexmap 2.10.0", "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] diff --git a/codex-rs/execpolicy/Cargo.toml b/codex-rs/execpolicy/Cargo.toml index e0e3d75e42..337e95f09b 100644 --- a/codex-rs/execpolicy/Cargo.toml +++ b/codex-rs/execpolicy/Cargo.toml @@ -26,7 +26,7 @@ multimap = "0.10.0" path-absolutize = "3.1.1" regex-lite = "0.1" serde = { version = "1.0.194", features = ["derive"] } -serde_json = "1.0.143" +serde_json = "1.0.145" serde_with = { version = "3", features = ["macros"] } [dev-dependencies] diff --git a/codex-rs/file-search/Cargo.toml b/codex-rs/file-search/Cargo.toml index f02d8402aa..11fd57a465 100644 --- a/codex-rs/file-search/Cargo.toml +++ b/codex-rs/file-search/Cargo.toml @@ -17,5 +17,5 @@ clap = { version = "4", features = ["derive"] } ignore = "0.4.23" nucleo-matcher = "0.3.1" serde = { version = "1", features = ["derive"] } -serde_json = "1.0.143" +serde_json = "1.0.145" tokio = { version = "1", features = ["full"] } From ca8bd09d569066700eb6e176bf0eee7a743cc832 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Mon, 15 Sep 2025 12:22:29 -0700 Subject: [PATCH 73/77] chore: simplify dep so serde=1 in Cargo.toml (#3664) With this change, dependabot should just have to update `Cargo.lock` for `serde`, e.g.: - https://github.com/openai/codex/pull/3617 - https://github.com/openai/codex/pull/3618 --- codex-rs/execpolicy/Cargo.toml | 10 +++++----- codex-rs/file-search/Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/codex-rs/execpolicy/Cargo.toml b/codex-rs/execpolicy/Cargo.toml index 337e95f09b..9f0a25c422 100644 --- a/codex-rs/execpolicy/Cargo.toml +++ b/codex-rs/execpolicy/Cargo.toml @@ -1,7 +1,7 @@ [package] +edition = "2024" name = "codex-execpolicy" version = { workspace = true } -edition = "2024" [[bin]] name = "codex-execpolicy" @@ -15,9 +15,8 @@ path = "src/lib.rs" workspace = true [dependencies] -anyhow = "1" -starlark = "0.13.0" allocative = "0.3.3" +anyhow = "1" clap = { version = "4", features = ["derive"] } derive_more = { version = "2", features = ["display"] } env_logger = "0.11.5" @@ -25,9 +24,10 @@ log = "0.4" multimap = "0.10.0" path-absolutize = "3.1.1" regex-lite = "0.1" -serde = { version = "1.0.194", features = ["derive"] } -serde_json = "1.0.145" +serde = { version = "1", features = ["derive"] } +serde_json = "1" serde_with = { version = "3", features = ["macros"] } +starlark = "0.13.0" [dev-dependencies] tempfile = "3.13.0" diff --git a/codex-rs/file-search/Cargo.toml b/codex-rs/file-search/Cargo.toml index 11fd57a465..023e6936c8 100644 --- a/codex-rs/file-search/Cargo.toml +++ b/codex-rs/file-search/Cargo.toml @@ -17,5 +17,5 @@ clap = { version = "4", features = ["derive"] } ignore = "0.4.23" nucleo-matcher = "0.3.1" serde = { version = "1", features = ["derive"] } -serde_json = "1.0.145" +serde_json = "1" tokio = { version = "1", features = ["full"] } From 88027552ddaf64d4dcaf0e6e097997d8ee625584 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 12:56:20 -0700 Subject: [PATCH 74/77] chore(deps): bump serde from 1.0.219 to 1.0.223 in /codex-rs (#3618) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde](https://github.com/serde-rs/serde) from 1.0.219 to 1.0.223.
Release notes

Sourced from serde's releases.

v1.0.223

  • Fix serde_core documentation links (#2978)

v1.0.222

  • Make serialize_with attribute produce code that works if respanned to 2024 edition (#2950, thanks @​aytey)

v1.0.221

  • Documentation improvements (#2973)
  • Deprecate serde_if_integer128! macro (#2975)

v1.0.220

Commits
  • 6c316d7 Release 1.0.223
  • a4ac0c2 Merge pull request #2978 from dtolnay/htmlrooturl
  • ed76364 Change serde_core's html_root_url to docs.rs/serde_core
  • 57e21a1 Release 1.0.222
  • bb58726 Merge pull request #2950 from aytey/fix_lifetime_issue_2024
  • 3f69251 Delete unneeded field of MapDeserializer
  • fd4decf Merge pull request #2976 from dtolnay/content
  • 00b1b6b Move Content's Deserialize impl from serde_core to serde
  • cf141aa Move Content's Clone impl from serde_core to serde
  • ff3aee4 Release 1.0.221
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.219&new-version=1.0.223)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- codex-rs/Cargo.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index a6f32b35c5..49862881de 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -3926,9 +3926,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.223" +version = "1.0.224" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a505d71960adde88e293da5cb5eda57093379f64e61cf77bf0e6a63af07a7bac" +checksum = "6aaeb1e94f53b16384af593c71e20b095e958dab1d26939c1b70645c5cfbcc0b" dependencies = [ "serde_core", "serde_derive", @@ -3936,18 +3936,18 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.223" +version = "1.0.224" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20f57cbd357666aa7b3ac84a90b4ea328f1d4ddb6772b430caa5d9e1309bb9e9" +checksum = "32f39390fa6346e24defbcdd3d9544ba8a19985d0af74df8501fbfe9a64341ab" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.223" +version = "1.0.224" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d428d07faf17e306e699ec1e91996e5a165ba5d6bce5b5155173e91a8a01a56" +checksum = "87ff78ab5e8561c9a675bfc1785cb07ae721f0ee53329a595cefd8c04c2ac4e0" dependencies = [ "proc-macro2", "quote", From 404c126fc3ef902006507e7228b8dc0f663c952a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 12:57:17 -0700 Subject: [PATCH 75/77] chore(deps): bump wildmatch from 2.4.0 to 2.5.0 in /codex-rs (#3619) Bumps [wildmatch](https://github.com/becheran/wildmatch) from 2.4.0 to 2.5.0.
Release notes

Sourced from wildmatch's releases.

v2.5.0

becheran/wildmatch#27

Commits
  • b39902c chore: Release wildmatch version 2.5.0
  • 87a8cf4 Merge pull request #28 from smichaku/micha/fix-unicode-case-insensitive-matching
  • a3ab490 fix: Fix unicode matching for non-ASCII characters
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=wildmatch&package-manager=cargo&previous-version=2.4.0&new-version=2.5.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- codex-rs/Cargo.lock | 4 ++-- codex-rs/core/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 49862881de..81fc8683cb 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -5292,9 +5292,9 @@ dependencies = [ [[package]] name = "wildmatch" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ce1ab1f8c62655ebe1350f589c61e505cf94d385bc6a12899442d9081e71fd" +checksum = "39b7d07a236abaef6607536ccfaf19b396dbe3f5110ddb73d39f4562902ed382" [[package]] name = "winapi" diff --git a/codex-rs/core/Cargo.toml b/codex-rs/core/Cargo.toml index 4fb10affb3..b4ed4a937a 100644 --- a/codex-rs/core/Cargo.toml +++ b/codex-rs/core/Cargo.toml @@ -57,7 +57,7 @@ tree-sitter = "0.25.9" tree-sitter-bash = "0.25.0" uuid = { version = "1", features = ["serde", "v4"] } which = "6" -wildmatch = "2.4.0" +wildmatch = "2.5.0" [target.'cfg(target_os = "linux")'.dependencies] From 45bccd36b038a28b23663189cc6f7557e49e06d0 Mon Sep 17 00:00:00 2001 From: easong-openai Date: Mon, 15 Sep 2025 17:34:04 -0700 Subject: [PATCH 76/77] fix permissions alignment --- codex-rs/tui/src/bottom_pane/chat_composer.rs | 11 +- codex-rs/tui/src/bottom_pane/command_popup.rs | 33 +- .../src/bottom_pane/list_selection_view.rs | 34 ++- .../src/bottom_pane/selection_popup_common.rs | 288 +++++++++++++----- ..._chat_composer__tests__slash_popup_mo.snap | 2 +- ..._list_selection_spacing_with_subtitle.snap | 2 +- ...st_selection_spacing_without_subtitle.snap | 2 +- 7 files changed, 283 insertions(+), 89 deletions(-) diff --git a/codex-rs/tui/src/bottom_pane/chat_composer.rs b/codex-rs/tui/src/bottom_pane/chat_composer.rs index 2138d54098..bf11ff571d 100644 --- a/codex-rs/tui/src/bottom_pane/chat_composer.rs +++ b/codex-rs/tui/src/bottom_pane/chat_composer.rs @@ -142,14 +142,16 @@ impl ChatComposer { .desired_height(width.saturating_sub(LIVE_PREFIX_COLS)) + match &self.active_popup { ActivePopup::None => FOOTER_HEIGHT_WITH_HINT, - ActivePopup::Command(c) => c.calculate_required_height(), + ActivePopup::Command(c) => c.calculate_required_height(width), ActivePopup::File(c) => c.calculate_required_height(), } } pub fn cursor_pos(&self, area: Rect) -> Option<(u16, u16)> { let popup_constraint = match &self.active_popup { - ActivePopup::Command(popup) => Constraint::Max(popup.calculate_required_height()), + ActivePopup::Command(popup) => { + Constraint::Max(popup.calculate_required_height(area.width)) + } ActivePopup::File(popup) => Constraint::Max(popup.calculate_required_height()), ActivePopup::None => Constraint::Max(FOOTER_HEIGHT_WITH_HINT), }; @@ -1232,7 +1234,10 @@ impl ChatComposer { impl WidgetRef for ChatComposer { fn render_ref(&self, area: Rect, buf: &mut Buffer) { let (popup_constraint, hint_spacing) = match &self.active_popup { - ActivePopup::Command(popup) => (Constraint::Max(popup.calculate_required_height()), 0), + ActivePopup::Command(popup) => ( + Constraint::Max(popup.calculate_required_height(area.width)), + 0, + ), ActivePopup::File(popup) => (Constraint::Max(popup.calculate_required_height()), 0), ActivePopup::None => ( Constraint::Length(FOOTER_HEIGHT_WITH_HINT), diff --git a/codex-rs/tui/src/bottom_pane/command_popup.rs b/codex-rs/tui/src/bottom_pane/command_popup.rs index a5961e3188..8de266f819 100644 --- a/codex-rs/tui/src/bottom_pane/command_popup.rs +++ b/codex-rs/tui/src/bottom_pane/command_popup.rs @@ -92,10 +92,35 @@ impl CommandPopup { .ensure_visible(matches_len, MAX_POPUP_ROWS.min(matches_len)); } - /// Determine the preferred height of the popup. This is the number of - /// rows required to show at most MAX_POPUP_ROWS commands. - pub(crate) fn calculate_required_height(&self) -> u16 { - self.filtered_items().len().clamp(1, MAX_POPUP_ROWS) as u16 + /// Determine the preferred height of the popup for a given width. + /// Accounts for wrapped descriptions so that long tooltips don't overflow. + pub(crate) fn calculate_required_height(&self, width: u16) -> u16 { + use super::selection_popup_common::GenericDisplayRow; + use super::selection_popup_common::measure_rows_height; + let matches = self.filtered(); + let rows_all: Vec = if matches.is_empty() { + Vec::new() + } else { + matches + .into_iter() + .map(|(item, indices, _)| match item { + CommandItem::Builtin(cmd) => GenericDisplayRow { + name: format!("/{}", cmd.command()), + match_indices: indices.map(|v| v.into_iter().map(|i| i + 1).collect()), + is_current: false, + description: Some(cmd.description().to_string()), + }, + CommandItem::UserPrompt(i) => GenericDisplayRow { + name: format!("/{}", self.prompts[i].name), + match_indices: indices.map(|v| v.into_iter().map(|i| i + 1).collect()), + is_current: false, + description: Some("send saved prompt".to_string()), + }, + }) + .collect() + }; + + measure_rows_height(&rows_all, &self.state, MAX_POPUP_ROWS, width) } /// Compute fuzzy-filtered matches over built-in commands and user prompts, diff --git a/codex-rs/tui/src/bottom_pane/list_selection_view.rs b/codex-rs/tui/src/bottom_pane/list_selection_view.rs index 7be91db202..5d5dbf0f33 100644 --- a/codex-rs/tui/src/bottom_pane/list_selection_view.rs +++ b/codex-rs/tui/src/bottom_pane/list_selection_view.rs @@ -17,6 +17,7 @@ use super::bottom_pane_view::BottomPaneView; use super::popup_consts::MAX_POPUP_ROWS; use super::scroll_state::ScrollState; use super::selection_popup_common::GenericDisplayRow; +use super::selection_popup_common::measure_rows_height; use super::selection_popup_common::render_rows; /// One selectable item in the generic selection list. @@ -135,11 +136,36 @@ impl BottomPaneView for ListSelectionView { CancellationEvent::Handled } - fn desired_height(&self, _width: u16) -> u16 { - let rows = (self.items.len()).clamp(1, MAX_POPUP_ROWS); + fn desired_height(&self, width: u16) -> u16 { + // Measure wrapped height for up to MAX_POPUP_ROWS items at the given width. + // Build the same display rows used by the renderer so wrapping math matches. + let rows: Vec = self + .items + .iter() + .enumerate() + .map(|(i, it)| { + let is_selected = self.state.selected_idx == Some(i); + let prefix = if is_selected { '>' } else { ' ' }; + let name_with_marker = if it.is_current { + format!("{} (current)", it.name) + } else { + it.name.clone() + }; + let display_name = format!("{} {}. {}", prefix, i + 1, name_with_marker); + GenericDisplayRow { + name: display_name, + match_indices: None, + is_current: it.is_current, + description: it.description.clone(), + } + }) + .collect(); + + let rows_height = measure_rows_height(&rows, &self.state, MAX_POPUP_ROWS, width); + // +1 for the title row, +1 for a spacer line beneath the header, - // +1 for optional subtitle, +1 for optional footer - let mut height = rows as u16 + 2; + // +1 for optional subtitle, +1 for optional footer (2 lines incl. spacing) + let mut height = rows_height + 2; if self.subtitle.is_some() { // +1 for subtitle (the spacer is accounted for above) height = height.saturating_add(1); diff --git a/codex-rs/tui/src/bottom_pane/selection_popup_common.rs b/codex-rs/tui/src/bottom_pane/selection_popup_common.rs index 3852d10bc1..61a26f9341 100644 --- a/codex-rs/tui/src/bottom_pane/selection_popup_common.rs +++ b/codex-rs/tui/src/bottom_pane/selection_popup_common.rs @@ -1,6 +1,7 @@ use ratatui::buffer::Buffer; use ratatui::layout::Rect; -use ratatui::prelude::Constraint; +// Note: Table-based layout previously used Constraint; the manual renderer +// below no longer requires it. use ratatui::style::Color; use ratatui::style::Modifier; use ratatui::style::Style; @@ -10,9 +11,7 @@ use ratatui::text::Span; use ratatui::widgets::Block; use ratatui::widgets::BorderType; use ratatui::widgets::Borders; -use ratatui::widgets::Cell; -use ratatui::widgets::Row; -use ratatui::widgets::Table; +use ratatui::widgets::Paragraph; use ratatui::widgets::Widget; use super::scroll_state::ScrollState; @@ -27,6 +26,61 @@ pub(crate) struct GenericDisplayRow { impl GenericDisplayRow {} +/// Compute a shared description-column start based on the widest visible name +/// plus two spaces of padding. Ensures at least one column is left for the +/// description. +fn compute_desc_col( + rows_all: &[GenericDisplayRow], + start_idx: usize, + visible_items: usize, + content_width: u16, +) -> usize { + let visible_range = start_idx..(start_idx + visible_items); + let max_name_width = rows_all + .iter() + .enumerate() + .filter(|(i, _)| visible_range.contains(i)) + .map(|(_, r)| Line::from(r.name.clone()).width()) + .max() + .unwrap_or(0); + let mut desc_col = max_name_width.saturating_add(2); + if (desc_col as u16) >= content_width { + desc_col = content_width.saturating_sub(1) as usize; + } + desc_col +} + +/// Build the full display line for a row with the description padded to start +/// at `desc_col`. Applies fuzzy-match bolding when indices are present and +/// dims the description. +fn build_full_line(row: &GenericDisplayRow, desc_col: usize) -> Line<'static> { + let mut name_spans: Vec = Vec::with_capacity(row.name.len()); + if let Some(idxs) = row.match_indices.as_ref() { + let mut idx_iter = idxs.iter().peekable(); + for (char_idx, ch) in row.name.chars().enumerate() { + if idx_iter.peek().is_some_and(|next| **next == char_idx) { + idx_iter.next(); + name_spans.push(ch.to_string().bold()); + } else { + name_spans.push(ch.to_string().into()); + } + } + } else { + name_spans.push(row.name.clone().into()); + } + + let this_name_width = Line::from(name_spans.clone()).width(); + let mut full_spans: Vec = name_spans; + if let Some(desc) = row.description.as_ref() { + let gap = desc_col.saturating_sub(this_name_width); + if gap > 0 { + full_spans.push(" ".repeat(gap).into()); + } + full_spans.push(desc.clone().dim()); + } + Line::from(full_spans) +} + /// Render a list of rows using the provided ScrollState, with shared styling /// and behavior for selection popups. pub(crate) fn render_rows( @@ -38,84 +92,168 @@ pub(crate) fn render_rows( _dim_non_selected: bool, empty_message: &str, ) { - let mut rows: Vec = Vec::new(); + // Always draw a dim left border to match other popups. + let block = Block::default() + .borders(Borders::LEFT) + .border_type(BorderType::QuadrantOutside) + .border_style(Style::default().add_modifier(Modifier::DIM)); + block.render(area, buf); + + // Content renders to the right of the border. + let content_area = Rect { + x: area.x.saturating_add(1), + y: area.y, + width: area.width.saturating_sub(1), + height: area.height, + }; + if rows_all.is_empty() { - rows.push(Row::new(vec![Cell::from(Line::from( - empty_message.dim().italic(), - ))])); - } else { - let max_rows_from_area = area.height as usize; - let visible_rows = max_results - .min(rows_all.len()) - .min(max_rows_from_area.max(1)); - - // Compute starting index based on scroll state and selection. - let mut start_idx = state.scroll_top.min(rows_all.len().saturating_sub(1)); - if let Some(sel) = state.selected_idx { - if sel < start_idx { - start_idx = sel; - } else if visible_rows > 0 { - let bottom = start_idx + visible_rows - 1; - if sel > bottom { - start_idx = sel + 1 - visible_rows; - } - } + if content_area.height > 0 { + let para = Paragraph::new(Line::from(empty_message.dim().italic())); + para.render( + Rect { + x: content_area.x, + y: content_area.y, + width: content_area.width, + height: 1, + }, + buf, + ); } + return; + } - for (i, row) in rows_all - .iter() - .enumerate() - .skip(start_idx) - .take(visible_rows) - { - let GenericDisplayRow { - name, - match_indices, - is_current: _is_current, - description, - } = row; + // Determine which logical rows (items) are visible given the selection and + // the max_results clamp. Scrolling is still item-based for simplicity. + let max_rows_from_area = content_area.height as usize; + let visible_items = max_results + .min(rows_all.len()) + .min(max_rows_from_area.max(1)); - // Highlight fuzzy indices when present. - let mut spans: Vec = Vec::with_capacity(name.len()); - if let Some(idxs) = match_indices.as_ref() { - let mut idx_iter = idxs.iter().peekable(); - for (char_idx, ch) in name.chars().enumerate() { - if idx_iter.peek().is_some_and(|next| **next == char_idx) { - idx_iter.next(); - spans.push(ch.to_string().bold()); - } else { - spans.push(ch.to_string().into()); - } - } - } else { - spans.push(name.clone().into()); + let mut start_idx = state.scroll_top.min(rows_all.len().saturating_sub(1)); + if let Some(sel) = state.selected_idx { + if sel < start_idx { + start_idx = sel; + } else if visible_items > 0 { + let bottom = start_idx + visible_items - 1; + if sel > bottom { + start_idx = sel + 1 - visible_items; } - - if let Some(desc) = description.as_ref() { - spans.push(" ".into()); - spans.push(desc.clone().dim()); - } - - let mut cell = Cell::from(Line::from(spans)); - if Some(i) == state.selected_idx { - cell = cell.style( - Style::default() - .fg(Color::Cyan) - .add_modifier(Modifier::BOLD), - ); - } - rows.push(Row::new(vec![cell])); } } - let table = Table::new(rows, vec![Constraint::Percentage(100)]) - .block( - Block::default() - .borders(Borders::LEFT) - .border_type(BorderType::QuadrantOutside) - .border_style(Style::default().add_modifier(Modifier::DIM)), - ) - .widths([Constraint::Percentage(100)]); + let desc_col = compute_desc_col(rows_all, start_idx, visible_items, content_area.width); - table.render(area, buf); + // Render items, wrapping descriptions and aligning wrapped lines under the + // shared description column. Stop when we run out of vertical space. + let mut cur_y = content_area.y; + for (i, row) in rows_all + .iter() + .enumerate() + .skip(start_idx) + .take(visible_items) + { + if cur_y >= content_area.y + content_area.height { + break; + } + + let GenericDisplayRow { + name, + match_indices, + is_current: _is_current, + description, + } = row; + + let full_line = build_full_line( + &GenericDisplayRow { + name: name.clone(), + match_indices: match_indices.clone(), + is_current: *_is_current, + description: description.clone(), + }, + desc_col, + ); + + // Wrap with subsequent indent aligned to the description column. + use crate::wrapping::RtOptions; + use crate::wrapping::word_wrap_line; + let options = RtOptions::new(content_area.width as usize) + .initial_indent(Line::from("")) + .subsequent_indent(Line::from(" ".repeat(desc_col))); + let wrapped = word_wrap_line(&full_line, options); + + // Render the wrapped lines. + for mut line in wrapped { + if cur_y >= content_area.y + content_area.height { + break; + } + if Some(i) == state.selected_idx { + // Match previous behavior: cyan + bold for the selected row. + line.style = Style::default() + .fg(Color::Cyan) + .add_modifier(Modifier::BOLD); + } + let para = Paragraph::new(line); + para.render( + Rect { + x: content_area.x, + y: cur_y, + width: content_area.width, + height: 1, + }, + buf, + ); + cur_y = cur_y.saturating_add(1); + } + } +} + +/// Compute the number of terminal rows required to render up to `max_results` +/// items from `rows_all` given the current scroll/selection state and the +/// available `width`. Accounts for description wrapping and alignment so the +/// caller can allocate sufficient vertical space. +pub(crate) fn measure_rows_height( + rows_all: &[GenericDisplayRow], + state: &ScrollState, + max_results: usize, + width: u16, +) -> u16 { + if rows_all.is_empty() { + return 1; // placeholder "no matches" line + } + + let content_width = width.saturating_sub(1).max(1); + + let visible_items = max_results.min(rows_all.len()); + let mut start_idx = state.scroll_top.min(rows_all.len().saturating_sub(1)); + if let Some(sel) = state.selected_idx { + if sel < start_idx { + start_idx = sel; + } else if visible_items > 0 { + let bottom = start_idx + visible_items - 1; + if sel > bottom { + start_idx = sel + 1 - visible_items; + } + } + } + + let desc_col = compute_desc_col(rows_all, start_idx, visible_items, content_width); + + use crate::wrapping::RtOptions; + use crate::wrapping::word_wrap_line; + let mut total: u16 = 0; + for row in rows_all + .iter() + .enumerate() + .skip(start_idx) + .take(visible_items) + .map(|(_, r)| r) + { + let full_line = build_full_line(row, desc_col); + let opts = RtOptions::new(content_width as usize) + .initial_indent(Line::from("")) + .subsequent_indent(Line::from(" ".repeat(desc_col))); + total = total.saturating_add(word_wrap_line(&full_line, opts).len() as u16); + } + total.max(1) } diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__slash_popup_mo.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__slash_popup_mo.snap index b626f80ca1..f908fb6144 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__slash_popup_mo.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__slash_popup_mo.snap @@ -4,5 +4,5 @@ expression: terminal.backend() --- "▌ /mo " "▌ " -"▌/model choose what model and reasoning effort to use " +"▌/model choose what model and reasoning effort to use " "▌/mention mention a file " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_with_subtitle.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_with_subtitle.snap index aab7e7c9b6..65606ed7d0 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_with_subtitle.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_with_subtitle.snap @@ -6,6 +6,6 @@ expression: render_lines(&view) ▌ Switch between Codex approval presets ▌ ▌> 1. Read Only (current) Codex can read files -▌ 2. Full Access Codex can edit files +▌ 2. Full Access Codex can edit files Press Enter to confirm or Esc to go back diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_without_subtitle.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_without_subtitle.snap index 77552f2b93..b42a5f8c6b 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_without_subtitle.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__list_selection_view__tests__list_selection_spacing_without_subtitle.snap @@ -5,6 +5,6 @@ expression: render_lines(&view) ▌ Select Approval Mode ▌ ▌> 1. Read Only (current) Codex can read files -▌ 2. Full Access Codex can edit files +▌ 2. Full Access Codex can edit files Press Enter to confirm or Esc to go back From a8026d3846486e790827b26e9abf13e7f96e48bf Mon Sep 17 00:00:00 2001 From: Dylan Date: Mon, 15 Sep 2025 19:01:10 -0700 Subject: [PATCH 77/77] fix: read-only escalations (#3673) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Splitting out this smaller fix from #2694 - fixes the sandbox permissions so Chat / read-only mode tool definition matches expectations ## Testing - [x] Tested locally Screenshot 2025-09-15 at 2 51 19 PM --- codex-rs/core/src/openai_tools.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codex-rs/core/src/openai_tools.rs b/codex-rs/core/src/openai_tools.rs index a511d6dd16..f4d724815e 100644 --- a/codex-rs/core/src/openai_tools.rs +++ b/codex-rs/core/src/openai_tools.rs @@ -273,7 +273,7 @@ fn create_shell_tool_for_sandbox(sandbox_policy: &SandboxPolicy) -> OpenAiTool { }, ); - if matches!(sandbox_policy, SandboxPolicy::WorkspaceWrite { .. }) { + if !matches!(sandbox_policy, SandboxPolicy::DangerFullAccess) { properties.insert( "with_escalated_permissions".to_string(), JsonSchema::Boolean {